ZGlmZiAtLWdpdCBhL3Zta2l0L0NSRURJVFMuVFhUIGIvdm1raXQvQ1JFRElUUy5UWFQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZmRiMmMuLjAwMDAwMDAKLS0tIGEvdm1raXQvQ1JFRElUUy5UWFQKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi1UaGlzIGZpbGUgaXMgYSBwYXJ0aWFsIGxpc3Qgb2YgcGVvcGxlIHdobyBoYXZlIGNvbnRyaWJ1dGVkIHRvIHRoZSBWTUtpdAotcHJvamVjdC4gIElmIHlvdSBoYXZlIGNvbnRyaWJ1dGVkIGEgcGF0Y2ggb3IgbWFkZSBzb21lIG90aGVyIGNvbnRyaWJ1dGlvbiB0bwotVk1LaXQsIHBsZWFzZSBzdWJtaXQgYSBwYXRjaCB0byB0aGlzIGZpbGUgdG8gYWRkIHlvdXJzZWxmLCBhbmQgaXQgd2lsbCBiZSAKLWRvbmUhCi0KLVRoZSBsaXN0IGlzIHNvcnRlZCBieSBuYW1lIGFuZCBmb3JtYXR0ZWQgdG8gYWxsb3cgZWFzeSBncmVwcGluZyBhbmQKLWJlYXV0aWZpY2F0aW9uIGJ5IHNjcmlwdHMuICBUaGUgZmllbGRzIGFyZTogbmFtZSAoTiksIGVtYWlsIChFKSwgd2ViLWFkZHJlc3MKLShXKSwgUEdQIGtleSBJRCBhbmQgZmluZ2VycHJpbnQgKFApLCBkZXNjcmlwdGlvbiAoRCksIGFuZCBzbmFpbC1tYWlsIGFkZHJlc3MKLShTKS4KLQotTjogQmVydGlsIEZvbGxpb3QKLUU6IGJlcnRpbC5mb2xsaW90QGxpcDYuZnIKLVc6IGh0dHA6Ly93d3ctc3JjLmxpcDYuZnIvaG9tZXBhZ2VzL0JlcnRpbC5Gb2xsaW90LwotRDogUHJvdmlkZXIgb2YgbXVjaCB3aXNkb20KLQotTjogTmljb2xhcyBHZW9mZnJheQotRTogbmljb2xhcy5nZW9mZnJheUBsaXA2LmZyCi1XOiBodHRwOi8vd3d3LXNyYy5saXA2LmZyL2hvbWVwYWdlcy9OaWNvbGFzLkdlb2ZmcmF5LwotRDogQXJjaGl0ZWN0IG9mIEozLCBvcmlnaW5hbGx5IGEgcG9ydCBvZiBKbkpWTSB0byBMTFZNCi1EOiBBcmNoaXRlY3Qgb2YgTjMKLQotTjogU3lsdmFpbiBNYXJlY2hhbAotRTogc3lsdmFpbi5tYXJlY2hhbEBsaXA2LmZyCi1EOiBPcmlnaW5hbCBhdXRvY29uZiBzdXBwb3J0Ci0KLU46IFRpbG1hbm4gU2NoZWxsZXIKLUQ6IEdlbmVyaWNzIHN1cHBvcnQgaW4gTjMuCi0KLU46IEdhZWwgVGhvbWFzCi1FOiBnYWVsLnRob21hc0BsaXA2LmZyCi1XOiBodHRwOi8vd3d3LXNyYy5saXA2LmZyL2hvbWVwYWdlcy9HYWVsLlRob21hcy8KLUQ6IFByaW1hcnkgYXJjaGl0ZWN0IG9mIEpuSlZNCmRpZmYgLS1naXQgYS92bWtpdC9MSUNFTlNFLlRYVCBiL3Zta2l0L0xJQ0VOU0UuVFhUCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmJjM2E5Li4wMDAwMDAwCi0tLSBhL3Zta2l0L0xJQ0VOU0UuVFhUCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1WTUtpdCBSZWxlYXNlIExpY2Vuc2UKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotVW5pdmVyc2l0eSBvZiBJbGxpbm9pcy9OQ1NBCi1PcGVuIFNvdXJjZSBMaWNlbnNlCi0KLUNvcHlyaWdodCAoYykgMjAwMy0yMDEwIFVuaXZlcnNpdHkgb2YgUGllcnJlIGV0IE1hcmllIEN1cmllLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotRGV2ZWxvcGVkIGJ5OgotCi0gICAgVlZNIFRlYW0KLQotICAgIFVuaXZlcnNpdHkgb2YgUGllcnJlIGV0IE1hcmllIEN1cmllLCBQYXJpcwotCi0gICAgaHR0cDovL2xsdm0ub3JnCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKLXRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIHdpdGgKLXRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KLXVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCi1vZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KLXNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAotICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMuCi0KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzIGluIHRoZQotICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotICAgICogTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIExMVk0gVGVhbSwgdGhlIFZWTSBUZWFtLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzIAotICAgICAgYXQgVXJiYW5hLUNoYW1wYWlnbiwgVW5pdmVyc2l0eSBvZiBQaWVycmUgZXQgTWFyaWUgQ3VyaWUsIG5vciB0aGUgbmFtZXMgCi0gICAgICBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIAotICAgICAgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKLUZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCi1DT05UUklCVVRPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIFdJVEggVEhFCi1TT0ZUV0FSRS4KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Db3B5cmlnaHRzIGFuZCBMaWNlbnNlcyBmb3IgVGhpcmQgUGFydHkgU29mdHdhcmUgRGlzdHJpYnV0ZWQgd2l0aCBWTUtpdDoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotVGhlIFZNS2l0IHNvZnR3YXJlIGNvbnRhaW5zIGNvZGUgd3JpdHRlbiBieSB0aGlyZCBwYXJ0aWVzLiAgU3VjaCBzb2Z0d2FyZSB3aWxsCi1oYXZlIGl0cyBvd24gaW5kaXZpZHVhbCBMSUNFTlNFLlRYVCBmaWxlIGluIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggaXQgYXBwZWFycy4KLVRoaXMgZmlsZSB3aWxsIGRlc2NyaWJlIHRoZSBjb3B5cmlnaHRzLCBsaWNlbnNlLCBhbmQgcmVzdHJpY3Rpb25zIHdoaWNoIGFwcGx5Ci10byB0aGF0IGNvZGUuCi0KLVRoZSBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5IGluIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIExpY2Vuc2UKLWFwcGxpZXMgdG8gYWxsIGNvZGUgaW4gdGhlIFZNS2l0IERpc3RyaWJ1dGlvbiwgYW5kIG5vdGhpbmcgaW4gYW55IG9mIHRoZQotb3RoZXIgbGljZW5zZXMgZ2l2ZXMgcGVybWlzc2lvbiB0byB1c2UgdGhlIG5hbWVzIG9mIHRoZSBWVk0gVGVhbSBvciB0aGUKLVVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi1Tb2Z0d2FyZS4KLQotVGhlIGZvbGxvd2luZyBwaWVjZXMgb2Ygc29mdHdhcmUgaGF2ZSBhZGRpdGlvbmFsIG9yIGFsdGVybmF0ZSBjb3B5cmlnaHRzLAotbGljZW5zZXMsIGFuZC9vciByZXN0cmljdGlvbnM6Ci0KLVByb2dyYW0gICAgICAgICAgICAgRGlyZWN0b3J5Ci0tLS0tLS0tICAgICAgICAgICAgIC0tLS0tLS0tLQotTW9ubyBsaWJyYXJpZXMgICAgICB2bWtpdC9saWIvTjMvTW9ubwotUE5ldGxpYiBsaWJyYXJpZXMgICB2bWtpdC9saWIvTjMvUE5ldAotTU1UayAgICAgICAgICAgICAgICB2bWtpdC9tbXRrLwpkaWZmIC0tZ2l0IGEvdm1raXQvTWFrZWZpbGUgYi92bWtpdC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg5ZTAxOC4uMDAwMDAwMAotLS0gYS92bWtpdC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSM9PT0tIC4vTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLS09PT0jCi0jIAotIyAgICAgICAgICAgICAgICAgICAgIFRoZSB2bWtpdCBwcm9qZWN0Ci0jCi0jIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0jIAotIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMKLQotTEVWRUwgOj0gLgotCi1pbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbmZpZwotCi0jIFRvcC1MZXZlbCB2bWtpdCBCdWlsZCBTdGFnZXM6Ci0jCi1ESVJTIDo9IGxpYiB0b29scy92bWpjCi0KLWlmZXEgKCQoR0NfTU1USyksIDEpCi0gIERJUlMgKz0gbW10awotZW5kaWYKLQotRElSUyArPSB0b29scwotCi1FWFRSQV9ESVNUPWluY2x1ZGUKLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBNYWtlIHN1cmUgdGhlIGdlbmVyYXRlZCBoZWFkZXJzIGFyZSB1cC10by1kYXRlLiBUaGlzIG11c3QgYmUga2VwdCBpbgotIyBzeW5jIHdpdGggdGhlIEFDX0NPTkZJR19IRUFERVIgaW52b2NhdGlvbnMgaW4gYXV0b2NvbmYvY29uZmlndXJlLmFjCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1GaWxlc1RvQ29uZmlnIDo9IFwKLSAgaW5jbHVkZS9sbHZtL0NvbmZpZy9jb25maWcuaCBcCi0gIGxpYi9KMy9DbGFzc3BhdGgvQ2xhc3NwYXRoLmggXAotRmlsZXNUb0NvbmZpZ1BBVEggIDo9ICQoYWRkcHJlZml4ICQoTExWTV9PQkpfUk9PVCkvLCQoRmlsZXNUb0NvbmZpZykpCmRpZmYgLS1naXQgYS92bWtpdC9NYWtlZmlsZS5jb21tb24uaW4gYi92bWtpdC9NYWtlZmlsZS5jb21tb24uaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1OWM4ZTguLjAwMDAwMDAKLS0tIGEvdm1raXQvTWFrZWZpbGUuY29tbW9uLmluCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotIyBTZXQgdGhlIG5hbWUgb2YgdGhlIHByb2plY3QgaGVyZQotUFJPSkVDVF9OQU1FIDo9IEBQQUNLQUdFX05BTUVACi1QUk9KX1ZFUlNJT04gOj0gQFBBQ0tBR0VfVkVSU0lPTkAKLSAKLSMgU2V0IHRoaXMgdmFyaWFibGUgdG8gdGhlIHRvcCBvZiB0aGUgTExWTSBzb3VyY2UgdHJlZS4KLUxMVk1fU1JDX1JPT1QgPSBATExWTV9TUkNACi0KLSMgU2V0IHRoaXMgdmFyaWFibGUgdG8gdGhlIHRvcCBsZXZlbCBkaXJlY3Rvcnkgd2hlcmUgTExWTSB3YXMgYnVpbHQKLSMgKHRoaXMgaXMgKm5vdCogdGhlIHNhbWUgYXMgT0JKX1JPT1QgYXMgZGVmaW5lZCBpbiBMTFZNJ3MgTWFrZWZpbGUuY29uZmlnKS4KLUxMVk1fT0JKX1JPT1QgPSBATExWTV9PQkpACi0KLSMgU2V0IHRoZSBkaXJlY3Rvcnkgcm9vdCBvZiB0aGlzIHByb2plY3QncyBzb3VyY2UgZmlsZXMKLVBST0pfU1JDX1JPT1QgOj0gJChzdWJzdCAvLywvLEBhYnNfdG9wX3NyY2RpckApCi0KLSMgU2V0IHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QncyBvYmplY3QgZmlsZXMKLVBST0pfT0JKX1JPT1QgOj0gJChzdWJzdCAvLywvLEBhYnNfdG9wX29iamRpckApCi0KLSMgU2V0IHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QncyBpbnN0YWxsIHByZWZpeAotUFJPSl9JTlNUQUxMX1JPT1QgOj0gQHByZWZpeEAKLQotIyBEZWZpbmUgQllURUNPREVfTElCUkFSWSBiZWZvcmUgaW5jbHVkaW5nIExMVk0ncyBNYWtlZmlsZS5jb21tb24gdG8gZ2V0Ci0jIGRlcGVuZGVuY2llcyByaWdodC4KLWlmZXEgKCQoV0lUSF9MTFZNX0dDQyksIDEpCi0gIEJZVEVDT0RFX0xJQlJBUlkgPSAxCi1lbmRpZgotCi0jIEluY2x1ZGUgTExWTSdzIE1hc3RlciBNYWtlZmlsZS4KLWluY2x1ZGUgJChMTFZNX09CSl9ST09UKS9NYWtlZmlsZS5jb21tb24KLQotQ1hYLkZsYWdzICs9IEBMTFZNX0ZMQUdTQCBAR0NfRkxBR1NAIEBWTV9GTEFHU0AgQEVYQ0VQVElPTl9GTEFHU0AgLVduby12YXJpYWRpYy1tYWNyb3MgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1zdHJpY3QtYWxpYXNpbmcgLVduby1kZXByZWNhdGVkIC1hbnNpIC1ERU5BQkxFX1RIUkVBRFMgLWZuby1ydHRpCi0KLSMgR05VIENsYXNzcGF0aCBmbGFncwotQ0xBU1NQQVRIX0ZMQUdTID0gQGNsYXNzcGF0aGluY2x1ZGVACi1HTElCSiA9IEBjbGFzc3BhdGhnbGliakAKLQotIyBQbmV0IGxvY2F0aW9uCi1QTkVUTElCID0gQHBuZXRsb2NhbHByZWZpeEAKLQotTElCUyArPSAtbHoKLQotIyBHQyBjb25maWd1cmF0aW9uCi1pZmVxICgkKEdDTElCKSwgQm9laG1HQykKLSAgTElCUyArPSAtbGdjCi1lbmRpZgotCi1pbmNsdWRlICQoUFJPSl9TUkNfUk9PVCkvTWFrZWZpbGUucnVsZXMKZGlmZiAtLWdpdCBhL3Zta2l0L01ha2VmaWxlLmNvbmZpZy5pbiBiL3Zta2l0L01ha2VmaWxlLmNvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzdjMDMxZS4uMDAwMDAwMAotLS0gYS92bWtpdC9NYWtlZmlsZS5jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1HQ0xJQiA9IEBHQ19MSUJTQAotV0lUSF9OMyA9IEBXSVRIX04zQAotV0lUSF9OM19QTkVUTElCID0gQFdJVEhfTjNfUE5FVExJQkAKLVdJVEhfTjNfTU9OTyA9IEBXSVRIX04zX01PTk9ACi1XSVRIX0ozID0gQFdJVEhfSjNACi1XSVRIX1AzID0gQFdJVEhfUDNACi1OM19MSUIgPSBATjNfTElCQAotR0NfTVVMVElfTU1BUCA9IEBHQ19NVUxUSV9NTUFQQAotR0NfU0lOR0xFX01NQVAgPSBAR0NfU0lOR0xFX01NQVBACi1HQ19CT0VITSA9IEBHQ19CT0VITUAKLUdDX01NQVAyID0gQEdDX01NQVAyQAotR0NfTU1USyA9IEBHQ19NTVRLQAotTU1US19QTEFOID0gQE1NVEtfUExBTkAKLU1NVEtfUExBTl9IRUFERVIgPSBATU1US19QTEFOX0hFQURFUkAKLVdJVEhfNjQgPSBAV0lUSF82NEAKLVdJVEhfTExWTV9HQ0MgPSBAV0lUSF9MTFZNX0dDQ0AKLQotQU5UID0gQEFOVEAKZGlmZiAtLWdpdCBhL3Zta2l0L01ha2VmaWxlLnJ1bGVzIGIvdm1raXQvTWFrZWZpbGUucnVsZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYTRlYWUuLjAwMDAwMDAKLS0tIGEvdm1raXQvTWFrZWZpbGUucnVsZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotCi1pZmRlZiBWTUtJVF9SVU5USU1FCi0KLQotLlBSRUNJT1VTOiBMTFZNUnVudGltZS5pbmMKLQotIyBBbGwgb2YgdGhlc2UgZmlsZXMgZGVwZW5kIG9uIHRibGdlbiBhbmQgdGhlIC50ZCBmaWxlcy4KLUxMVk1SdW50aW1lLmluYyA6ICQoTExWTUFTKSAkKExMQykgJChWTUtJVF9SVU5USU1FKQotCi1MTFZNUnVudGltZS5nZW4ubGwgOiAkKFZNS0lUX1JVTlRJTUUpCi0JJChWZXJiKSBjYXQgJChWTUtJVF9SVU5USU1FKSA+IExMVk1SdW50aW1lLmdlbi5sbAotCi1MTFZNUnVudGltZS5pbmMgOiBMTFZNUnVudGltZS5nZW4ubGwKLQkkKEVjaG8pICJCdWlsZGluZyBMTFZNIHJ1bnRpbWUgd2l0aCAkKFZNS0lUX1JVTlRJTUUpIgotCSQoVmVyYikgJChMTFZNQVMpIC1mICQoPEYpIC1vIC0gfCAkKExMQykgLW1hcmNoPWNwcCAtY3BwZ2VuPWNvbnRlbnRzIC1vICRACi0KLQotY2xlYW4tbG9jYWw6OgotCSQoVmVyYikgJChSTSkgLWYgTExWTVJ1bnRpbWUuaW5jIExMVk1SdW50aW1lLmdlbi5sbCBMTFZNUnVudGltZS5iYwotCi1lbmRpZgotCi1pZmRlZiBWTUtJVF9BU1NFTUJMWQotCi0uUFJFQ0lPVVM6IExMVk1Bc3NlbWJseS5zCi0KLUxMVk1Bc3NlbWJseS5vIDogJChMTFZNQVMpICQoTExDKSAkKFZNS0lUX0FTU0VNQkxZKQotCi1MTFZNQXNzZW1ibHkuZ2VuLmxsIDogJChWTUtJVF9BU1NFTUJMWSkKLQkkKFZlcmIpIGNhdCAkKFZNS0lUX0FTU0VNQkxZKSA+IExMVk1Bc3NlbWJseS5nZW4ubGwKLQotTExWTUFzc2VtYmx5LnMgOiBMTFZNQXNzZW1ibHkuZ2VuLmxsCi0JJChFY2hvKSAiQnVpbGRpbmcgTExWTSBhc3NlbWJseSB3aXRoICQoVk1LSVRfQVNTRU1CTFkpIgotCSQoVmVyYikgJChMTFZNQVMpIC1mICQoPEYpIC1vIC0gfCAkKExMQykgLW8gJEAKLQotJChPYmpEaXIpLyUubG8gJChPYmpEaXIpLyUubzogJS5zICQoT2JqRGlyKS8uZGlyICQoQlVJTFRfU09VUkNFUykKLQkkKEVjaG8pICJDb21waWxpbmcgJCoucyBmb3IgJChCdWlsZE1vZGUpIGJ1aWxkICIgJChQSUNfRkxBRykKLQkkKFZlcmIpICQoR0FTKSAkPCAtbyAkKE9iakRpcikvJCoubwotCi1jbGVhbi1sb2NhbDo6Ci0JJChWZXJiKSAkKFJNKSAtZiBMTFZNQXNzZW1ibHkucyBMTFZNQXNzZW1ibHkuYmMgTExWTUFzc2VtYmx5Lmdlbi5sbAotCi1lbmRpZgotCi1pZm5kZWYgVk1KQwotVk1KQyAgICAgIDo9ICQoVG9vbERpcikvdm1qYyQoRVhFRVhUKQotZW5kaWYKLQotCi1pZmRlZiBWTUpDX0FTU0VNQkxZCi0KLS5QUkVDSU9VUzogZ2xpYmouemlwLnMKLQotZ2xpYmouemlwLnMgOiAkKExPUFQpICQoTExDKSAkKFZNSkMpCi0KLQotZ2xpYmouemlwLmJjIDoKLQkkKEVjaG8pICJDb21waWxpbmcgZ2xpYmouemlwIHRvIGxsdm0iCi0JJChWZXJiKSBpZiB0ZXN0IC1kICQoR0xJQkopOyB0aGVuIFwKLQkgICQoVk1KQykgLWYgLXN0ZC1jb21waWxlLW9wdHMgJChHTElCSikvZ2xpYmouemlwIC1vIGdsaWJqLnppcC5iYzsgXAotCWVsc2UgXAotCSAgJChWTUpDKSAtZiAtc3RkLWNvbXBpbGUtb3B0cyAkKEdMSUJKKSAtbyBnbGliai56aXAuYmM7IFwKLQlmaQotCQotZ2xpYmotb3B0aW1pemVkLnppcC5iYyA6IGdsaWJqLnppcC5iYwotCSQoRWNobykgIk9wdGltaXppbmcgZ2xpYmouemlwIgotCSQoVmVyYikgJChMT1BUKSAtc3RkLWNvbXBpbGUtb3B0cyAtZiBnbGliai56aXAuYmMgLW8gZ2xpYmotb3B0aW1pemVkLnppcC5iYwotCi1nbGliai56aXAucyA6IGdsaWJqLW9wdGltaXplZC56aXAuYmMKLQkkKEVjaG8pICJDb21waWxpbmcgZ2xpYmouemlwLmJjIHRvIG5hdGl2ZSIKLQkkKFZlcmIpICQoTExDKSAtcmVsb2NhdGlvbi1tb2RlbD1waWMgLWRpc2FibGUtZnAtZWxpbSBnbGliai1vcHRpbWl6ZWQuemlwLmJjIC1vIGdsaWJqLnppcC5zCi0KLSQoT2JqRGlyKS8lLm86ICUucyAkKE9iakRpcikvLmRpciAkKEJVSUxUX1NPVVJDRVMpCi0JJChFY2hvKSAiQ29tcGlsaW5nICQqLnMgZm9yICQoQnVpbGRNb2RlKSBidWlsZCIgJChQSUNfRkxBRykKLQkkKFZlcmIpICQoQ29tcGlsZS5DKSAkPCAtbyAkKE9iakRpcikvJCoubwotCi1jbGVhbi1sb2NhbDo6Ci0JJChWZXJiKSAkKFJNKSAtZiBnbGliai56aXAucyBnbGliai56aXAuYmMgZ2xpYmotb3B0aW1pemVkLnppcC5iYwotZW5kaWYKLQotCi0KLWlmZGVmIFZNS0lUX0JVSUxEX0FSQ0hJVkUKLQotTGliTmFtZS5BIDo9ICQoTGliRGlyKS9saWIkKFZNS0lUX0xJQlJBUllOQU1FKS5hCi0KLWFsbC1sb2NhbDo6ICQoTGliTmFtZS5BKQotCi0kKExpYk5hbWUuQSk6ICQoUHJvakxpYnNQYXRocykgJChMaWJEaXIpLy5kaXIKLQkkKEVjaG8pIEJ1aWxkaW5nICQoQnVpbGRNb2RlKSBBcmNoaXZlIExpYnJhcnkgJChub3RkaXIgJEApCi0JLSQoVmVyYikgJChSTSkgLWYgJEAKLQkkKFZlcmIpICQoQXJjaGl2ZSkgJEAgJChQcm9qTGlic1BhdGhzKQotCSQoVmVyYikgJChSYW5saWIpICRACi0KLWNsZWFuLWxvY2FsOjoKLWlmbmVxICgkKHN0cmlwICQoTGliTmFtZS5BKSksKQotCS0kKFZlcmIpICQoUk0pIC1mICQoTGliTmFtZS5BKQotZW5kaWYKLQotZW5kaWYKLQotCi0KLWlmZGVmIE1PRFVMRVNOQU1FCi1pZmRlZiBVU0VETU9EVUxFUwotCi1Qcm9qTGlic1BhdGhzICAgOj0gJChhZGRwcmVmaXggJChMaWJEaXIpLywkKFVTRURNT0RVTEVTKSkKLQotJChNT0RVTEVTTkFNRSkuYmMgOiAkKFByb2pMaWJzUGF0aHMpCi0JJChFY2hvKSBCdWlsZGluZyAkKEJ1aWxkTW9kZSkgQnl0ZWNvZGUgTW9kdWxlICQobm90ZGlyICRAKQotCSQoVmVyYikgJChMTFZNTEQpIC1saW5rLWFzLWxpYnJhcnkgLW8gJEAgJChQcm9qTGlic1BhdGhzKQotCi0kKE1PRFVMRVNOQU1FKS5zIDogJChNT0RVTEVTTkFNRSkuYmMKLQkkKEVjaG8pIEJ1aWxkaW5nICQoQnVpbGRNb2RlKSBBc3NlbWJseSBmaWxlICQobm90ZGlyICRAKQotCSQoVmVyYikgJChMT1BUKSAtbG9hZD0kKExpYkRpcikvU3RhdGljR0NQYXNzJChTSExJQkVYVCkgLXN0ZC1jb21waWxlLW9wdHMgLVN0YXRpY0dDUGFzcyAtZiAkKE1PRFVMRVNOQU1FKS5iYyAtbyB2bWtpdG9wdGltaXplZC5iYwotCSQoVmVyYikgJChMTEMpIC1kaXNhYmxlLWZwLWVsaW0gdm1raXRvcHRpbWl6ZWQuYmMgLW8gJChNT0RVTEVTTkFNRSkucwotCi0kKE9iakRpcikvJS5vOiAlLnMgJChPYmpEaXIpLy5kaXIgJChCVUlMVF9TT1VSQ0VTKQotCSQoRWNobykgIkNvbXBpbGluZyAkKi5zIGZvciAkKEJ1aWxkTW9kZSkgYnVpbGQiICQoUElDX0ZMQUcpCi0JJChWZXJiKSAkKENvbXBpbGUuQykgJDwgLW8gJChPYmpEaXIpLyQqLm8KLQotY2xlYW4tbG9jYWw6OgotCSQoVmVyYikgJChSTSkgLWYgdm1raXRvcHRpbWl6ZWQuYmMgJChNT0RVTEVTTkFNRSkuYmMgJChNT0RVTEVTTkFNRSkucwotCi1lbmRpZgotZW5kaWYKLQotaWZkZWYgUlVOX0FOVAotaWZkZWYgQU5UCi0KLWlmbmVxICgkKERJU0FCTEVfTU1US19DT01QSUxFKSwgMSkKLSAgQURESVRJT05BTF9BUkdTIDo9IC1sb2FkLWJjPSQoTGliRGlyKS9NTVRLUnVudGltZS5iYyAKLQotYWxsOjogJChMaWJEaXIpL0ZpbmFsTU1Uay5iYwotCi0kKExpYkRpcikvRmluYWxNTVRrLmJjOiAkKEpBUk5BTUUpLmphciAkKFZNSkMpICQoTGliRGlyKS9NTVRLQWxsb2MuYmMgJChMaWJEaXIpL01NVEtNYWdpYyQoU0hMSUJFWFQpICQoTGliRGlyKS9NTVRLUnVudGltZS5iYwotCSQoRWNobykgQnVpbGRpbmcgJChCdWlsZE1vZGUpIEZpbmFsTU1UayAkKG5vdGRpciAkQCkKLQkkKFZlcmIpICQoTE9QVCkgLWxvYWQ9JChMaWJEaXIpL0pJVEdDUGFzcyQoU0hMSUJFWFQpIC1zdGQtY29tcGlsZS1vcHRzIC1KSVRHQ1Bhc3MgLWYgJChMaWJEaXIpL01NVEtBbGxvYy5iYyAtbyAkKExpYkRpcikvTU1US0FsbG9jLmJjCi0JJChWZXJiKSAkKFZNSkMpIC1zdGQtY29tcGlsZS1vcHRzICQoQURESVRJT05BTF9BUkdTKSAtbG9hZD0kKExpYkRpcikvTU1US01hZ2ljJChTSExJQkVYVCkgLUxvd2VyTWFnaWMgJChQUk9KX09CSl9ST09UKS9tbXRrL2phdmEvJChKQVJOQU1FKS5qYXIgLWRpc2FibGUtZXhjZXB0aW9ucyAtZGlzYWJsZS1jb29wZXJhdGl2ZWdjIC13aXRoLWNsaW5pdD1vcmcvbW10ay92bS9WTSxvcmcvbW10ay91dGlsaXR5Lyosb3JnL21tdGsvcG9saWN5Lyosb3JnL2ozL2NvbmZpZy8qIC1EbW10ay5ob3N0anZtPW9yZy5qMy5tbXRrLkZhY3RvcnkgLW8gJChKQVJOQU1FKS5iYyAtRG1tdGsucHJvcGVydGllcz0kKFBST0pfU1JDX1JPT1QpL21tdGsvamF2YS92bWtpdC5wcm9wZXJ0aWVzIC1kaXNhYmxlLXN0dWJzIC1hc3N1bWUtY29tcGlsZWQgLWxsdm0tbGF6eQotCSQoVmVyYikgJChMT1BUKSAtbG9hZD0kKExpYkRpcikvTU1US01hZ2ljJChTSExJQkVYVCkgLXN0ZC1jb21waWxlLW9wdHMgLUxvd2VySmF2YVJUIC1mICQoSkFSTkFNRSkuYmMgLW8gJChKQVJOQU1FKS1vcHRpbWl6ZWQuYmMKLQkkKFZlcmIpICQoTExWTUxEKSAtciAtbyAkKExpYkRpcikvRmluYWxNTVRrLmJjICQoTGliRGlyKS9NTVRLQWxsb2MuYmMgJChKQVJOQU1FKS1vcHRpbWl6ZWQuYmMgJChMaWJEaXIpL01NVEtSdW50aW1lLmJjCi0JJChWZXJiKSAkKExPUFQpIC1zdGQtY29tcGlsZS1vcHRzICQoTGliRGlyKS9GaW5hbE1NVGsuYmMgLW8gJChMaWJEaXIpL0ZpbmFsTU1Uay5iYwotCSQoVmVyYikgJChMTEMpIC1tYXJjaD1jcHAgLWNwcGdlbj1mdW5jdGlvbiAtY3BwZm9yPWdjbWFsbG9jICQoTGliRGlyKS9GaW5hbE1NVGsuYmMgLW8gJChQUk9KX1NSQ19ST09UKS9tbXRrL2lubGluZS9NTVRrSW5saW5lLmluYwotCi0kKEpBUk5BTUUpLmphcjogJChzaGVsbCBmaW5kICQoUFJPSl9TUkNfUk9PVCkvbW10ay9qYXZhL3NyYyAtdHlwZSBmIC1uYW1lICIqLmphdmEiKQotCSQoRWNobykgQnVpbGRpbmcgJChCdWlsZE1vZGUpICQoSkFSTkFNRSkuamFyICQobm90ZGlyICRAKQotCSQoVmVyYikgJChBTlQpIC1idWlsZGZpbGUgJChQUk9KX09CSl9ST09UKS9tbXRrL2phdmEvYnVpbGQueG1sCi0KLWVuZGlmCi0KLWVuZGlmCi1jbGVhbi1sb2NhbDo6Ci0JJChWZXJiKSAkKFJNKSAtcmYgY2xhc3NlcyAkKEpBUk5BTUUpLmphciAkKEpBUk5BTUUpLmJjICQoSkFSTkFNRSktb3B0aW1pemVkLmJjCi1lbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvUkVBRE1FLnR4dCBiL3Zta2l0L1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMWRhZDcuLjAwMDAwMDAKLS0tIGEvdm1raXQvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vIEdlbmVyYWwgbm90ZXMKLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotVk1LaXQgaXMgdGhlIGNvbXBvc2l0aW9uIG9mIHRocmVlIGxpYnJhcmllczoKLTEpIE1WTTogdGhyZWFkcywgR0NzLCBhbmQgSklUIGludGVyZmFjZQotMikgSjM6IGEgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgaW1wbGVtZW50ZWQgd2l0aCBNVk0gYW5kIExMVk0KLTMpIE4zOiBhIENMSSBpbXBsZW1lbnRhdGlvbiB3aXRoIE1WTSBhbmQgTExWTQotCi1UaGVzZSBhcmUgdGhlIG9wdGlvbnMgeW91IHNob3VsZCBwYXNzIHRvIHRoZSAuL2NvbmZpZ3VyZSBzY3JpcHQKLS0td2l0aC1sbHZtc3JjOiB0aGUgc291cmNlIGRpcmVjdG9yeSBvZiBMTFZNCi0tLXdpdGgtbGx2bW9iajogdGhlIG9iamVjdCBkaXJlY3Rvcnkgb2YgTExWTQotLS13aXRoLWdudS1jbGFzc3BhdGgtbGliczogR05VIGNsYXNzcGF0aCBsaWJyYXJpZXMKLS0td2l0aC1nbnUtY2xhc3NwYXRoLWdsaWJqOiBHTlUgY2xhc3NwYXRoIGdsaWJqLnppcAotLS13aXRoLXBuZXQtbG9jYWwtcHJlZml4OiB0aGUgbG9jYWwgYnVpbGQgb2YgUE5FVAotLS13aXRoLXBuZXRsaWI6IFBORVQncyBtc2NvcmxpYi5kbGwKLS0td2l0aC1tb25vOiBNb25vJ3MgbXNjb3JsaWIuZGxsCi0tLXdpdGgtZ2M6IHVzZSBlaXRoZXIgZ2MtbW1hcCBvciBNTVRrIChyZXF1aXJlcyAtLXdpdGgtbGx2bWdjYykKLQotUnVubmluZyBtYWtlIG9uIHRoZSByb290IHRyZWUgd2lsbCBwcm9kdWNlIHRoZSBmb2xsb3dpbmcgInRvb2xzIjoKLTEpIERlYnVnfFJlbGVhc2UvYmluL2ozOiBydW5uaW5nIHRoZSBKMyBsaWtlIGFueSBvdGhlciBKVk0uCi0yKSBEZWJ1Z3xSZWxlYXNlL2Jpbi9uMy1wbmV0bGliOiBydW5uaW5nIE4zIGxpa2UgQ0xSLgotMikgRGVidWd8UmVsZWFzZS9iaW4vdm1raXQ6IHNoZWxsLWxpa2Ugdm0gbGF1bmNoZXIuCi0yKSBEZWJ1Z3xSZWxlYXNlL2Jpbi92bWpjOiBhaGVhZCBvZiB0aW1lIGNvbXBpbGVyIGZvciAuY2xhc3MgZmlsZXMuCi0KLUozIGFsc28gaGFzIGEgUkVBRE1FIG5vdGUuCi0KZGlmZiAtLWdpdCBhL3Zta2l0L2F1dG9jb25mL0F1dG9SZWdlbi5zaCBiL3Zta2l0L2F1dG9jb25mL0F1dG9SZWdlbi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmFiNTNkNC4uMDAwMDAwMAotLS0gYS92bWtpdC9hdXRvY29uZi9BdXRvUmVnZW4uc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0jIS9iaW4vc2gKLWRpZSAoKSB7Ci0JZWNobyAiJEAiIDE+JjIKLQlleGl0IDEKLX0KLXRlc3QgLWQgYXV0b2NvbmYgJiYgdGVzdCAtZiBhdXRvY29uZi9jb25maWd1cmUuYWMgJiYgY2QgYXV0b2NvbmYKLXRlc3QgLWYgY29uZmlndXJlLmFjIHx8IGRpZSAiQ2FuJ3QgZmluZCAnYXV0b2NvbmYnIGRpcjsgcGxlYXNlIGNkIGludG8gaXQgZmlyc3QiCi1hdXRvY29uZiAtLXZlcnNpb24gfCBlZ3JlcCAnMlwuWzUtNl1bMC05XScgPiAvZGV2L251bGwKLWlmIHRlc3QgJD8gLW5lIDAgOyB0aGVuCi0gIGRpZSAiWW91ciBhdXRvY29uZiB3YXMgbm90IGRldGVjdGVkIGFzIGJlaW5nIDIuNXggb3IgMi42eCIKLWZpCi1jd2Q9YHB3ZGAKLWlmIHRlc3QgLWQgLi4vLi4vLi4vYXV0b2NvbmYvbTQgOyB0aGVuCi0gIGNkIC4uLy4uLy4uL2F1dG9jb25mL200Ci0gIGxsdm1fbTQ9YHB3ZGAKLSAgbGx2bV9zcmNfcm9vdD0uLi8uLi8uLgotICBsbHZtX29ial9yb290PS4uLy4uLy4uCi0gIGNkICRjd2QKLWVsaWYgdGVzdCAtZCAuLi8uLi9sbHZtL2F1dG9jb25mL200IDsgdGhlbgotICBjZCAuLi8uLi9sbHZtL2F1dG9jb25mL200Ci0gIGxsdm1fbTQ9YHB3ZGAKLSAgbGx2bV9zcmNfcm9vdD0uLi8uLgotICBsbHZtX29ial9yb290PS4uLy4uCi0gIGNkICRjd2QKLWVsc2UKLSAgd2hpbGUgdHJ1ZSA7IGRvCi0gICAgZWNobyAiTExWTSBzb3VyY2Ugcm9vdCBub3QgZm91bmQuIiAKLSAgICByZWFkIC1wICJFbnRlciBmdWxsIHBhdGggdG8gTExWTSBzb3VyY2U6IgotICAgIGlmIHRlc3QgLWQgIiRSRVBMWS9hdXRvY29uZi9tNCIgOyB0aGVuCi0gICAgICBsbHZtX3NyY19yb290PSIkUkVQTFkiCi0gICAgICBsbHZtX200PSIkUkVQTFkvYXV0b2NvbmYvbTQiCi0gICAgICByZWFkIC1wICJFbnRlciBmdWxsIHBhdGggdG8gTExWTSBvYmplY3RzIChlbXB0eSBmb3Igc2FtZSBhcyBzb3VyY2UpOiIKLSAgICAgIGlmIHRlc3QgLWQgIiRSRVBMWSIgOyB0aGVuCi0gICAgICAgIGxsdm1fb2JqX3Jvb3Q9IiRSRVBMWSIKLSAgICAgIGVsc2UKLSAgICAgICAgbGx2bV9vYmpfcm9vdD0iJGxsdm1fc3JjX3Jvb3QiCi0gICAgICBmaQotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi1maQotIyBQYXRjaCB0aGUgTExWTV9ST09UIGluIGNvbmZpZ3VyZS5hYywgaWYgaXQgbmVlZHMgaXQKLWNwIGNvbmZpZ3VyZS5hYyBjb25maWd1cmUuYmFrCi1zZWQgLWUgInMjXkxMVk1fU1JDX1JPT1Q9LiojTExWTV9TUkNfUk9PVD1cIiRsbHZtX3NyY19yb290XCIjIiBcCi0gICAgLWUgInMjXkxMVk1fT0JKX1JPT1Q9LiojTExWTV9PQkpfUk9PVD1cIiRsbHZtX29ial9yb290XCIjIiBjb25maWd1cmUuYmFrID4gY29uZmlndXJlLmFjCi1lY2hvICJSZWdlbmVyYXRpbmcgYWNsb2NhbC5tNCB3aXRoIGFjbG9jYWwiCi1ybSAtZiBhY2xvY2FsLm00Ci1hY2xvY2FsIC1JICRsbHZtX200IC1JICIkbGx2bV9tNC8uLiIgfHwgZGllICJhY2xvY2FsIGZhaWxlZCIKLWVjaG8gIlJlZ2VuZXJhdGluZyBjb25maWd1cmUgd2l0aCBhdXRvY29uZiAyLjV4IG9yIDIuNngiCi1hdXRvY29uZiAtLXdhcm5pbmdzPWFsbCAtbyAuLi9jb25maWd1cmUgY29uZmlndXJlLmFjIHx8IGRpZSAiYXV0b2NvbmYgZmFpbGVkIgotY2QgLi4KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdm1raXQvYXV0b2NvbmYvY29uZmlnLmd1ZXNzIGIvdm1raXQvYXV0b2NvbmYvY29uZmlnLmd1ZXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZDAxODVlLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2F1dG9jb25mL2NvbmZpZy5ndWVzcworKysgL2Rldi9udWxsCkBAIC0xLDE0NDcgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBBdHRlbXB0IHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lLgotIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKLSMgICAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi10aW1lc3RhbXA9JzIwMDQtMDktMDcnCi0KLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lciA8cGVyQGJvdGhuZXIuY29tPi4KLSMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uICBTdWJtaXQgYSBjb250ZXh0Ci0jIGRpZmYgYW5kIGEgcHJvcGVybHkgZm9ybWF0dGVkIENoYW5nZUxvZyBlbnRyeS4KLSMKLSMgVGhpcyBzY3JpcHQgYXR0ZW1wdHMgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUgc2ltaWxhciB0bwotIyBjb25maWcuc3ViLiAgSWYgaXQgc3VjY2VlZHMsIGl0IHByaW50cyB0aGUgc3lzdGVtIG5hbWUgb24gc3Rkb3V0LCBhbmQKLSMgZXhpdHMgd2l0aCAwLiAgT3RoZXJ3aXNlLCBpdCBleGl0cyB3aXRoIDEuCi0jCi0jIFRoZSBwbGFuIGlzIHRoYXQgdGhpcyBjYW4gYmUgY2FsbGVkIGJ5IGNvbmZpZ3VyZSBzY3JpcHRzIGlmIHlvdQotIyBkb24ndCBzcGVjaWZ5IGFuIGV4cGxpY2l0IGJ1aWxkIHN5c3RlbSB0eXBlLgotCi1tZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKLQotdXNhZ2U9IlwKLVVzYWdlOiAkMCBbT1BUSU9OXQotCi1PdXRwdXQgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSBvZiB0aGUgc3lzdGVtIFxgJG1lJyBpcyBydW4gb24uCi0KLU9wZXJhdGlvbiBtb2RlczoKLSAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0Ci0gIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKLSAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKLQotUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKLQotdmVyc2lvbj0iXAotR05VIGNvbmZpZy5ndWVzcyAoJHRpbWVzdGFtcCkKLQotT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyLgotQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0Ci1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KLXdhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKLQotaGVscD0iCi1UcnkgXGAkbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi0KLSMgUGFyc2UgY29tbWFuZCBsaW5lCi13aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KLSAgY2FzZSAkMSBpbgotICAgIC0tdGltZS1zdGFtcCB8IC0tdGltZSogfCAtdCApCi0gICAgICAgZWNobyAiJHRpbWVzdGFtcCIgOyBleGl0IDAgOzsKLSAgICAtLXZlcnNpb24gfCAtdiApCi0gICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCAwIDs7Ci0gICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKLSAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDAgOzsKLSAgICAtLSApICAgICAjIFN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKLSAgICAgICBzaGlmdDsgYnJlYWsgOzsKLSAgICAtICkJIyBVc2Ugc3RkaW4gYXMgaW5wdXQuCi0gICAgICAgYnJlYWsgOzsKLSAgICAtKiApCi0gICAgICAgZWNobyAiJG1lOiBpbnZhbGlkIG9wdGlvbiAkMSRoZWxwIiA+JjIKLSAgICAgICBleGl0IDEgOzsKLSAgICAqICkKLSAgICAgICBicmVhayA7OwotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgJCMgIT0gMDsgdGhlbgotICBlY2hvICIkbWU6IHRvbyBtYW55IGFyZ3VtZW50cyRoZWxwIiA+JjIKLSAgZXhpdCAxCi1maQotCi10cmFwICdleGl0IDEnIDEgMiAxNQotCi0jIENDX0ZPUl9CVUlMRCAtLSBjb21waWxlciB1c2VkIGJ5IHRoaXMgc2NyaXB0LiBOb3RlIHRoYXQgdGhlIHVzZSBvZiBhCi0jIGNvbXBpbGVyIHRvIGFpZCBpbiBzeXN0ZW0gZGV0ZWN0aW9uIGlzIGRpc2NvdXJhZ2VkIGFzIGl0IHJlcXVpcmVzCi0jIHRlbXBvcmFyeSBmaWxlcyB0byBiZSBjcmVhdGVkIGFuZCwgYXMgeW91IGNhbiBzZWUgYmVsb3csIGl0IGlzIGEKLSMgaGVhZGFjaGUgdG8gZGVhbCB3aXRoIGluIGEgcG9ydGFibGUgZmFzaGlvbi4KLQotIyBIaXN0b3JpY2FsbHksIGBDQ19GT1JfQlVJTEQnIHVzZWQgdG8gYmUgbmFtZWQgYEhPU1RfQ0MnLiBXZSBzdGlsbAotIyB1c2UgYEhPU1RfQ0MnIGlmIGRlZmluZWQsIGJ1dCBpdCBpcyBkZXByZWNhdGVkLgotCi0jIFBvcnRhYmxlIHRtcCBkaXJlY3RvcnkgY3JlYXRpb24gaW5zcGlyZWQgYnkgdGhlIEF1dG9jb25mIHRlYW0uCi0KLXNldF9jY19mb3JfYnVpbGQ9JwotdHJhcCAiZXhpdGNvZGU9XCQ/OyAocm0gLWYgXCR0bXBmaWxlcyAyPi9kZXYvbnVsbDsgcm1kaXIgXCR0bXAgMj4vZGV2L251bGwpICYmIGV4aXQgXCRleGl0Y29kZSIgMCA7Ci10cmFwICJybSAtZiBcJHRtcGZpbGVzIDI+L2Rldi9udWxsOyBybWRpciBcJHRtcCAyPi9kZXYvbnVsbDsgZXhpdCAxIiAxIDIgMTMgMTUgOwotOiAke1RNUERJUj0vdG1wfSA7Ci0geyB0bXA9YCh1bWFzayAwNzcgJiYgbWt0ZW1wIC1kIC1xICIkVE1QRElSL2NnWFhYWFhYIikgMj4vZGV2L251bGxgICYmIHRlc3QgLW4gIiR0bXAiICYmIHRlc3QgLWQgIiR0bXAiIDsgfSB8fAotIHsgdGVzdCAtbiAiJFJBTkRPTSIgJiYgdG1wPSRUTVBESVIvY2ckJC0kUkFORE9NICYmICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkgOyB9IHx8Ci0geyB0bXA9JFRNUERJUi9jZy0kJCAmJiAodW1hc2sgMDc3ICYmIG1rZGlyICR0bXApICYmIGVjaG8gIldhcm5pbmc6IGNyZWF0aW5nIGluc2VjdXJlIHRlbXAgZGlyZWN0b3J5IiA+JjIgOyB9IHx8Ci0geyBlY2hvICIkbWU6IGNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluICRUTVBESVIiID4mMiA7IGV4aXQgMSA7IH0gOwotZHVtbXk9JHRtcC9kdW1teSA7Ci10bXBmaWxlcz0iJGR1bW15LmMgJGR1bW15Lm8gJGR1bW15LnJlbCAkZHVtbXkiIDsKLWNhc2UgJENDX0ZPUl9CVUlMRCwkSE9TVF9DQywkQ0MgaW4KLSAsLCkgICAgZWNobyAiaW50IHg7IiA+ICRkdW1teS5jIDsKLQlmb3IgYyBpbiBjYyBnY2MgYzg5IGM5OSA7IGRvCi0JICBpZiAoJGMgLWMgLW8gJGR1bW15Lm8gJGR1bW15LmMpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KLQkgICAgIENDX0ZPUl9CVUlMRD0iJGMiOyBicmVhayA7Ci0JICBmaSA7Ci0JZG9uZSA7Ci0JaWYgdGVzdCB4IiRDQ19GT1JfQlVJTEQiID0geCA7IHRoZW4KLQkgIENDX0ZPUl9CVUlMRD1ub19jb21waWxlcl9mb3VuZCA7Ci0JZmkKLQk7OwotICwsKikgICBDQ19GT1JfQlVJTEQ9JENDIDs7Ci0gLCosKikgIENDX0ZPUl9CVUlMRD0kSE9TVF9DQyA7OwotZXNhYyA7JwotCi0jIFRoaXMgaXMgbmVlZGVkIHRvIGZpbmQgdW5hbWUgb24gYSBQeXJhbWlkIE9TeCB3aGVuIHJ1biBpbiB0aGUgQlNEIHVuaXZlcnNlLgotIyAoZ2hhemlAbm9jLnJ1dGdlcnMuZWR1IDE5OTQtMDgtMjQpCi1pZiAodGVzdCAtZiAvLmF0dGJpbi91bmFtZSkgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgotCVBBVEg9JFBBVEg6Ly5hdHRiaW4gOyBleHBvcnQgUEFUSAotZmkKLQotVU5BTUVfTUFDSElORT1gKHVuYW1lIC1tKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfTUFDSElORT11bmtub3duCi1VTkFNRV9SRUxFQVNFPWAodW5hbWUgLXIpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9SRUxFQVNFPXVua25vd24KLVVOQU1FX1NZU1RFTT1gKHVuYW1lIC1zKSAyPi9kZXYvbnVsbGAgIHx8IFVOQU1FX1NZU1RFTT11bmtub3duCi1VTkFNRV9WRVJTSU9OPWAodW5hbWUgLXYpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9WRVJTSU9OPXVua25vd24KLQotIyBOb3RlOiBvcmRlciBpcyBzaWduaWZpY2FudCAtIHRoZSBjYXNlIGJyYW5jaGVzIGFyZSBub3QgZXhjbHVzaXZlLgotCi1jYXNlICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIGluCi0gICAgKjpOZXRCU0Q6KjoqKQotCSMgTmV0QlNEIChuYnNkKSB0YXJnZXRzIHNob3VsZCAod2hlcmUgYXBwbGljYWJsZSkgbWF0Y2ggb25lIG9yCi0JIyBtb3JlIG9mIHRoZSB0dXBwbGVzOiAqLSotbmV0YnNkZWxmKiwgKi0qLW5ldGJzZGFvdXQqLAotCSMgKi0qLW5ldGJzZGVjb2ZmKiBhbmQgKi0qLW5ldGJzZCouICBGb3IgdGFyZ2V0cyB0aGF0IHJlY2VudGx5Ci0JIyBzd2l0Y2hlZCB0byBFTEYsICotKi1uZXRic2QqIHdvdWxkIHNlbGVjdCB0aGUgb2xkCi0JIyBvYmplY3QgZmlsZSBmb3JtYXQuICBUaGlzIHByb3ZpZGVzIGJvdGggZm9yd2FyZAotCSMgY29tcGF0aWJpbGl0eSBhbmQgYSBjb25zaXN0ZW50IG1lY2hhbmlzbSBmb3Igc2VsZWN0aW5nIHRoZQotCSMgb2JqZWN0IGZpbGUgZm9ybWF0LgotCSMKLQkjIE5vdGU6IE5ldEJTRCBkb2Vzbid0IHBhcnRpY3VsYXJseSBjYXJlIGFib3V0IHRoZSB2ZW5kb3IKLQkjIHBvcnRpb24gb2YgdGhlIG5hbWUuICBXZSBhbHdheXMgc2V0IGl0IHRvICJ1bmtub3duIi4KLQlzeXNjdGw9InN5c2N0bCAtbiBody5tYWNoaW5lX2FyY2giCi0JVU5BTUVfTUFDSElORV9BUkNIPWAoL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBcCi0JICAgIC91c3Ivc2Jpbi8kc3lzY3RsIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bilgCi0JY2FzZSAiJHtVTkFNRV9NQUNISU5FX0FSQ0h9IiBpbgotCSAgICBhcm1lYikgbWFjaGluZT1hcm1lYi11bmtub3duIDs7Ci0JICAgIGFybSopIG1hY2hpbmU9YXJtLXVua25vd24gOzsKLQkgICAgc2gzZWwpIG1hY2hpbmU9c2hsLXVua25vd24gOzsKLQkgICAgc2gzZWIpIG1hY2hpbmU9c2gtdW5rbm93biA7OwotCSAgICAqKSBtYWNoaW5lPSR7VU5BTUVfTUFDSElORV9BUkNIfS11bmtub3duIDs7Ci0JZXNhYwotCSMgVGhlIE9wZXJhdGluZyBTeXN0ZW0gaW5jbHVkaW5nIG9iamVjdCBmb3JtYXQsIGlmIGl0IGhhcyBzd2l0Y2hlZAotCSMgdG8gRUxGIHJlY2VudGx5LCBvciB3aWxsIGluIHRoZSBmdXR1cmUuCi0JY2FzZSAiJHtVTkFNRV9NQUNISU5FX0FSQ0h9IiBpbgotCSAgICBhcm0qfGkzODZ8bTY4a3xuczMya3xzaDMqfHNwYXJjfHZheCkKLQkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCQlpZiBlY2hvIF9fRUxGX18gfCAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwgXAotCQkJfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbAotCQl0aGVuCi0JCSAgICAjIE9uY2UgYWxsIHV0aWxpdGllcyBjYW4gYmUgRUNPRkYgKG5ldGJzZGVjb2ZmKSBvciBhLm91dCAobmV0YnNkYW91dCkuCi0JCSAgICAjIFJldHVybiBuZXRic2QgZm9yIGVpdGhlci4gIEZJWD8KLQkJICAgIG9zPW5ldGJzZAotCQllbHNlCi0JCSAgICBvcz1uZXRic2RlbGYKLQkJZmkKLQkJOzsKLQkgICAgKikKLQkgICAgICAgIG9zPW5ldGJzZAotCQk7OwotCWVzYWMKLQkjIFRoZSBPUyByZWxlYXNlCi0JIyBEZWJpYW4gR05VL05ldEJTRCBtYWNoaW5lcyBoYXZlIGEgZGlmZmVyZW50IHVzZXJsYW5kLCBhbmQKLQkjIHRodXMsIG5lZWQgYSBkaXN0aW5jdCB0cmlwbGV0LiBIb3dldmVyLCB0aGV5IGRvIG5vdCBuZWVkCi0JIyBrZXJuZWwgdmVyc2lvbiBpbmZvcm1hdGlvbiwgc28gaXQgY2FuIGJlIHJlcGxhY2VkIHdpdGggYQotCSMgc3VpdGFibGUgdGFnLCBpbiB0aGUgc3R5bGUgb2YgbGludXgtZ251LgotCWNhc2UgIiR7VU5BTUVfVkVSU0lPTn0iIGluCi0JICAgIERlYmlhbiopCi0JCXJlbGVhc2U9Jy1nbnUnCi0JCTs7Ci0JICAgICopCi0JCXJlbGVhc2U9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCi0JCTs7Ci0JZXNhYwotCSMgU2luY2UgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNOgotCSMgY29udGFpbnMgcmVkdW5kYW50IGluZm9ybWF0aW9uLCB0aGUgc2hvcnRlciBmb3JtOgotCSMgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0gaXMgdXNlZC4KLQllY2hvICIke21hY2hpbmV9LSR7b3N9JHtyZWxlYXNlfSIKLQlleGl0IDAgOzsKLSAgICBhbWQ2NDpPcGVuQlNEOio6KikKLQllY2hvIHg4Nl82NC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgYW1pZ2E6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBjYXRzOk9wZW5CU0Q6KjoqKQotCWVjaG8gYXJtLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBocDMwMDpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGx1bmE4OGs6T3BlbkJTRDoqOiopCi0gICAgCWVjaG8gbTg4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbWFjNjhrOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbWFjcHBjOk9wZW5CU0Q6KjoqKQotCWVjaG8gcG93ZXJwYy11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbXZtZTY4azpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG12bWU4OGs6T3BlbkJTRDoqOiopCi0JZWNobyBtODhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtdm1lcHBjOk9wZW5CU0Q6KjoqKQotCWVjaG8gcG93ZXJwYy11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgc2dpOk9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwczY0LXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBzdW4zOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpPcGVuQlNEOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICo6ZWtrb0JTRDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZWtrb2JzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtYWNwcGM6TWlyQlNEOio6KikKLQllY2hvIHBvd2VycHBjLXVua25vd24tbWlyYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICo6TWlyQlNEOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1taXJic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgYWxwaGE6T1NGMToqOiopCi0JY2FzZSAkVU5BTUVfUkVMRUFTRSBpbgotCSo0LjApCi0JCVVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQzfSdgCi0JCTs7Ci0JKjUuKikKLQkgICAgICAgIFVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQ0fSdgCi0JCTs7Ci0JZXNhYwotCSMgQWNjb3JkaW5nIHRvIENvbXBhcSwgL3Vzci9zYmluL3BzcmluZm8gaGFzIGJlZW4gYXZhaWxhYmxlIG9uCi0JIyBPU0YvMSBhbmQgVHJ1NjQgc3lzdGVtcyBwcm9kdWNlZCBzaW5jZSAxOTk1LiAgSSBob3BlIHRoYXQKLQkjIGNvdmVycyBtb3N0IHN5c3RlbXMgcnVubmluZyB0b2RheS4gIFRoaXMgY29kZSBwaXBlcyB0aGUgQ1BVCi0JIyB0eXBlcyB0aHJvdWdoIGhlYWQgLW4gMSwgc28gd2Ugb25seSBkZXRlY3QgdGhlIHR5cGUgb2YgQ1BVIDAuCi0JQUxQSEFfQ1BVX1RZUEU9YC91c3Ivc2Jpbi9wc3JpbmZvIC12IHwgc2VkIC1uIC1lICdzL14gIFRoZSBhbHBoYSBcKC4qXCkgcHJvY2Vzc29yLiokL1wxL3AnIHwgaGVhZCAtbiAxYAotCWNhc2UgIiRBTFBIQV9DUFVfVFlQRSIgaW4KLQkgICAgIkVWNCAoMjEwNjQpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7Ci0JICAgICJFVjQuNSAoMjEwNjQpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7Ci0JICAgICJMQ0E0ICgyMTA2Ni8yMTA2OCkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKLQkgICAgIkVWNSAoMjExNjQpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjUiIDs7Ci0JICAgICJFVjUuNiAoMjExNjRBKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1NiIgOzsKLQkgICAgIkVWNS42ICgyMTE2NFBDKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTYiIDs7Ci0JICAgICJFVjUuNyAoMjExNjRQQykiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU3IiA7OwotCSAgICAiRVY2ICgyMTI2NCkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NiIgOzsKLQkgICAgIkVWNi43ICgyMTI2NEEpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY3IiA7OwotCSAgICAiRVY2LjhDQiAoMjEyNjRDKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKLQkgICAgIkVWNi44QUwgKDIxMjY0QikiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7Ci0JICAgICJFVjYuOENYICgyMTI2NEQpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OwotCSAgICAiRVY2LjlBICgyMTI2NC9FVjY5QSkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjkiIDs7Ci0JICAgICJFVjcgKDIxMzY0KSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY3IiA7OwotCSAgICAiRVY3LjkgKDIxMzY0QSkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NzkiIDs7Ci0JZXNhYwotCSMgQSBQbi5uIHZlcnNpb24gaXMgYSBwYXRjaGVkIHZlcnNpb24uCi0JIyBBIFZuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIHZlcnNpb24uCi0JIyBBIFRuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIGZpZWxkIHRlc3QgdmVyc2lvbi4KLQkjIEEgWG4ubiB2ZXJzaW9uIGlzIGFuIHVucmVsZWFzZWQgZXhwZXJpbWVudGFsIGJhc2VsZXZlbC4KLQkjIDEuMiB1c2VzICIxLjIiIGZvciB1bmFtZSAtci4KLQllY2hvICR7VU5BTUVfTUFDSElORX0tZGVjLW9zZmBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXltQVlRYXS8vJyB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKLQlleGl0IDAgOzsKLSAgICBBbHBoYVwgKjpXaW5kb3dzX05UKjoqKQotCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KLQkjIFNob3VsZCB3ZSBjaGFuZ2UgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQKLQkjIG9mIHRoZSBzcGVjaWZpYyBBbHBoYSBtb2RlbD8KLQllY2hvIGFscGhhLXBjLWludGVyaXgKLQlleGl0IDAgOzsKLSAgICAyMTA2NDpXaW5kb3dzX05UOjUwOjMpCi0JZWNobyBhbHBoYS1kZWMtd2lubnQzLjUKLQlleGl0IDAgOzsKLSAgICBBbWlnYSo6VU5JWF9TeXN0ZW1fVjo0LjA6KikKLQllY2hvIG02OGstdW5rbm93bi1zeXN2NAotCWV4aXQgMDs7Ci0gICAgKjpbQWFdbWlnYVtPb11bU3NdOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hbWlnYW9zCi0JZXhpdCAwIDs7Ci0gICAgKjpbTW1db3JwaFtPb11bU3NdOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1tb3JwaG9zCi0JZXhpdCAwIDs7Ci0gICAgKjpPUy8zOTA6KjoqKQotCWVjaG8gaTM3MC1pYm0tb3BlbmVkaXRpb24KLQlleGl0IDAgOzsKLSAgICAqOk9TNDAwOio6KikKLSAgICAgICAgZWNobyBwb3dlcnBjLWlibS1vczQwMAotCWV4aXQgMCA7OwotICAgIGFybTpSSVNDKjoxLlswMTJdKjoqfGFybTpyaXNjaXg6MS5bMDEyXSo6KikKLQllY2hvIGFybS1hY29ybi1yaXNjaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwOzsKLSAgICBTUjI/MDE6SEktVVgvTVBQOio6KiB8IFNSODAwMDpISS1VWC9NUFA6KjoqKQotCWVjaG8gaHBwYTEuMS1oaXRhY2hpLWhpdXhtcHAKLQlleGl0IDA7OwotICAgIFB5cmFtaWQqOk9TeCo6KjoqIHwgTUlTKjpPU3gqOio6KiB8IE1JUyo6U01QX0RDLU9TeCo6KjoqKQotCSMgYWtlZUB3cGRpczAzLndwYWZiLmFmLm1pbCAoRWFybGUgRi4gQWtlKSBjb250cmlidXRlZCBNSVMgYW5kIE5JTEUuCi0JaWYgdGVzdCAiYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAiID0gYXR0IDsgdGhlbgotCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zeXN2MwotCWVsc2UKLQkJZWNobyBweXJhbWlkLXB5cmFtaWQtYnNkCi0JZmkKLQlleGl0IDAgOzsKLSAgICBOSUxFKjoqOio6ZGNvc3gpCi0JZWNobyBweXJhbWlkLXB5cmFtaWQtc3ZyNAotCWV4aXQgMCA7OwotICAgIERSUz82MDAwOnVuaXg6NC4wOjYqKQotCWVjaG8gc3BhcmMtaWNsLW54NgotCWV4aXQgMCA7OwotICAgIERSUz82MDAwOlVOSVhfU1Y6NC4yKjo3KikKLQljYXNlIGAvdXNyL2Jpbi91bmFtZSAtcGAgaW4KLQkgICAgc3BhcmMpIGVjaG8gc3BhcmMtaWNsLW54NyAmJiBleGl0IDAgOzsKLQllc2FjIDs7Ci0gICAgc3VuNEg6U3VuT1M6NS4qOiopCi0JZWNobyBzcGFyYy1oYWwtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBzdW40KjpTdW5PUzo1Lio6KiB8IHRhZHBvbGUqOlN1bk9TOjUuKjoqKQotCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgaTg2cGM6U3VuT1M6NS4qOiopCi0JZWNobyBpMzg2LXBjLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgc3VuNCo6U3VuT1M6Nio6KikKLQkjIEFjY29yZGluZyB0byBjb25maWcuc3ViLCB0aGlzIGlzIHRoZSBwcm9wZXIgd2F5IHRvIGNhbm9uaWNhbGl6ZQotCSMgU3VuT1M2LiAgSGFyZCB0byBndWVzcyBleGFjdGx5IHdoYXQgU3VuT1M2IHdpbGwgYmUgbGlrZSwgYnV0Ci0JIyBpdCdzIGxpa2VseSB0byBiZSBtb3JlIGxpa2UgU29sYXJpcyB0aGFuIFN1bk9TNC4KLQllY2hvIHNwYXJjLXN1bi1zb2xhcmlzM2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgMCA7OwotICAgIHN1bjQqOlN1bk9TOio6KikKLQljYXNlICJgL3Vzci9iaW4vYXJjaCAta2AiIGluCi0JICAgIFNlcmllcyp8UzQqKQotCQlVTkFNRV9SRUxFQVNFPWB1bmFtZSAtdmAKLQkJOzsKLQllc2FjCi0JIyBKYXBhbmVzZSBMYW5ndWFnZSB2ZXJzaW9ucyBoYXZlIGEgdmVyc2lvbiBudW1iZXIgbGlrZSBgNC4xLjMtSkwnLgotCWVjaG8gc3BhcmMtc3VuLXN1bm9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fLydgCi0JZXhpdCAwIDs7Ci0gICAgc3VuMyo6U3VuT1M6KjoqKQotCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgc3VuKjoqOjQuMkJTRDoqKQotCVVOQU1FX1JFTEVBU0U9YChzZWQgMXEgL2V0Yy9tb3RkIHwgYXdrICd7cHJpbnQgc3Vic3RyKCQ1LDEsMyl9JykgMj4vZGV2L251bGxgCi0JdGVzdCAieCR7VU5BTUVfUkVMRUFTRX0iID0gIngiICYmIFVOQU1FX1JFTEVBU0U9MwotCWNhc2UgImAvYmluL2FyY2hgIiBpbgotCSAgICBzdW4zKQotCQllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQotCQk7OwotCSAgICBzdW40KQotCQllY2hvIHNwYXJjLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQkJOzsKLQllc2FjCi0JZXhpdCAwIDs7Ci0gICAgYXVzaHA6U3VuT1M6KjoqKQotCWVjaG8gc3BhcmMtYXVzcGV4LXN1bm9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICMgVGhlIHNpdHVhdGlvbiBmb3IgTWlOVCBpcyBhIGxpdHRsZSBjb25mdXNpbmcuICBUaGUgbWFjaGluZSBuYW1lCi0gICAgIyBjYW4gYmUgdmlydHVhbGx5IGV2ZXJ5dGhpbmcgKGV2ZXJ5dGhpbmcgd2hpY2ggaXMgbm90Ci0gICAgIyAiYXRhcmlzdCIgb3IgImF0YXJpc3RlIiBhdCBsZWFzdCBzaG91bGQgaGF2ZSBhIHByb2Nlc3NvcgotICAgICMgPiBtNjgwMDApLiAgVGhlIHN5c3RlbSBuYW1lIHJhbmdlcyBmcm9tICJNaU5UIiBvdmVyICJGcmVlTWlOVCIKLSAgICAjIHRvIHRoZSBsb3dlcmNhc2UgdmVyc2lvbiAibWludCIgKG9yICJmcmVlbWludCIpLiAgRmluYWxseQotICAgICMgdGhlIHN5c3RlbSBuYW1lICJUT1MiIGRlbm90ZXMgYSBzeXN0ZW0gd2hpY2ggaXMgYWN0dWFsbHkgbm90Ci0gICAgIyBNaU5ULiAgQnV0IE1pTlQgaXMgZG93bndhcmQgY29tcGF0aWJsZSB0byBUT1MsIHNvIHRoaXMgc2hvdWxkCi0gICAgIyBiZSBubyBwcm9ibGVtLgotICAgIGF0YXJpc3RbZV06Kk1pTlQ6KjoqIHwgYXRhcmlzdFtlXToqbWludDoqOiogfCBhdGFyaXN0W2VdOipUT1M6KjoqKQotICAgICAgICBlY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBhdGFyaSo6Kk1pTlQ6KjoqIHwgYXRhcmkqOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCi0JZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0gICAgICAgIGV4aXQgMCA7OwotICAgICpmYWxjb24qOipNaU5UOio6KiB8ICpmYWxjb24qOiptaW50Oio6KiB8ICpmYWxjb24qOipUT1M6KjoqKQotICAgICAgICBlY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtaWxhbio6Kk1pTlQ6KjoqIHwgbWlsYW4qOiptaW50Oio6KiB8ICptaWxhbio6KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay1taWxhbi1taW50JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBleGl0IDAgOzsKLSAgICBoYWRlcyo6Kk1pTlQ6KjoqIHwgaGFkZXMqOiptaW50Oio6KiB8ICpoYWRlcyo6KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay1oYWRlcy1taW50JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBleGl0IDAgOzsKLSAgICAqOipNaU5UOio6KiB8ICo6Km1pbnQ6KjoqIHwgKjoqVE9TOio6KikKLSAgICAgICAgZWNobyBtNjhrLXVua25vd24tbWludCR7VU5BTUVfUkVMRUFTRX0KLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgbTY4azptYWNodGVuOio6KikKLQllY2hvIG02OGstYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBwb3dlcnBjOm1hY2h0ZW46KjoqKQotCWVjaG8gcG93ZXJwYy1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFJJU0MqOk1hY2g6KjoqKQotCWVjaG8gbWlwcy1kZWMtbWFjaF9ic2Q0LjMKLQlleGl0IDAgOzsKLSAgICBSSVNDKjpVTFRSSVg6KjoqKQotCWVjaG8gbWlwcy1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFZBWCo6VUxUUklYKjoqOiopCi0JZWNobyB2YXgtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAyMDIwOkNMSVg6KjoqIHwgMjQzMDpDTElYOio6KikKLQllY2hvIGNsaXBwZXItaW50ZXJncmFwaC1jbGl4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1pcHM6KjoqOlVNSVBTIHwgbWlwczoqOio6UklTQ29zKQotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwotI2lmZGVmIF9fY3BsdXNwbHVzCi0jaW5jbHVkZSA8c3RkaW8uaD4gIC8qIGZvciBwcmludGYoKSBwcm90b3R5cGUgKi8KLQlpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewotI2Vsc2UKLQlpbnQgbWFpbiAoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKmFyZ3ZbXTsgewotI2VuZGlmCi0JI2lmIGRlZmluZWQgKGhvc3RfbWlwcykgJiYgZGVmaW5lZCAoTUlQU0VCKQotCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NZU1YpCi0JICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzeXN2XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7Ci0JI2VuZGlmCi0JI2lmIGRlZmluZWQgKFNZU1RZUEVfU1ZSNCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N2cjRcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKLQkjZW5kaWYKLQkjaWYgZGVmaW5lZCAoU1lTVFlQRV9CU0Q0MykgfHwgZGVmaW5lZChTWVNUWVBFX0JTRCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc2JzZFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOwotCSNlbmRpZgotCSNlbmRpZgotCSAgZXhpdCAoLTEpOwotCX0KLUVPRgotCSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jIFwKLQkgICYmICRkdW1teSBgZWNobyAiJHtVTkFNRV9SRUxFQVNFfSIgfCBzZWQgLW4gJ3MvXChbMC05XSpcKS4qL1wxL3AnYCBcCi0JICAmJiBleGl0IDAKLQllY2hvIG1pcHMtbWlwcy1yaXNjb3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgTW90b3JvbGE6UG93ZXJNQVhfT1M6KjoqKQotCWVjaG8gcG93ZXJwYy1tb3Rvcm9sYS1wb3dlcm1heAotCWV4aXQgMCA7OwotICAgIE1vdG9yb2xhOio6NC4zOlBMOC0qKQotCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKLQlleGl0IDAgOzsKLSAgICBOaWdodF9IYXdrOio6KjpQb3dlck1BWF9PUyB8IFN5bmVyZ3k6UG93ZXJNQVhfT1M6KjoqKQotCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKLQlleGl0IDAgOzsKLSAgICBOaWdodF9IYXdrOlBvd2VyX1VOSVg6KjoqKQotCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJ1bml4Ci0JZXhpdCAwIDs7Ci0gICAgbTg4azpDWC9VWDo3KjoqKQotCWVjaG8gbTg4ay1oYXJyaXMtY3h1eDcKLQlleGl0IDAgOzsKLSAgICBtODhrOio6NCo6UjQqKQotCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2NAotCWV4aXQgMCA7OwotICAgIG04OGs6KjozKjpSMyopCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgQVZpaU9OOmRndXg6KjoqKQotICAgICAgICAjIERHL1VYIHJldHVybnMgQVZpaU9OIGZvciBhbGwgYXJjaGl0ZWN0dXJlcwotICAgICAgICBVTkFNRV9QUk9DRVNTT1I9YC91c3IvYmluL3VuYW1lIC1wYAotCWlmIFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMDAgXSB8fCBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTEwIF0KLQl0aGVuCi0JICAgIGlmIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0gbTg4a2RndXhlbGZ4IF0gfHwgXAotCSAgICAgICBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IHggXQotCSAgICB0aGVuCi0JCWVjaG8gbTg4ay1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQotCSAgICBlbHNlCi0JCWVjaG8gbTg4ay1kZy1kZ3V4YmNzJHtVTkFNRV9SRUxFQVNFfQotCSAgICBmaQotCWVsc2UKLQkgICAgZWNobyBpNTg2LWRnLWRndXgke1VOQU1FX1JFTEVBU0V9Ci0JZmkKLSAJZXhpdCAwIDs7Ci0gICAgTTg4KjpEb2xwaGluT1M6KjoqKQkjIERvbHBoaW5PUyAoU1ZSMykKLQllY2hvIG04OGstZG9scGhpbi1zeXN2MwotCWV4aXQgMCA7OwotICAgIE04OCo6KjpSMyo6KikKLQkjIERlbHRhIDg4ayBzeXN0ZW0gcnVubmluZyBTVlIzCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgWEQ4OCo6KjoqOiopICMgVGVrdHJvbml4IFhEODggc3lzdGVtIHJ1bm5pbmcgVVRla1YgKFNWUjMpCi0JZWNobyBtODhrLXRla3Ryb25peC1zeXN2MwotCWV4aXQgMCA7OwotICAgIFRlazQzWzAtOV1bMC05XTpVVGVrOio6KikgIyBUZWt0cm9uaXggNDMwMCBzeXN0ZW0gcnVubmluZyBVVGVrIChCU0QpCi0JZWNobyBtNjhrLXRla3Ryb25peC1ic2QKLQlleGl0IDAgOzsKLSAgICAqOklSSVgqOio6KikKLQllY2hvIG1pcHMtc2dpLWlyaXhgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vZydgCi0JZXhpdCAwIDs7Ci0gICAgPz8/Pz8/Pz86QUlYPzpbMTJdLjE6MikgICAjIEFJWCAyLjIuMSBvciBBSVggMi4xLjEgaXMgUlQvUEMgQUlYLgotCWVjaG8gcm9tcC1pYm0tYWl4ICAgICAgIyB1bmFtZSAtbSBnaXZlcyBhbiA4IGhleC1jb2RlIENQVSBpZAotCWV4aXQgMCA7OyAgICAgICAgICAgICAgIyBOb3RlIHRoYXQ6IGVjaG8gIidgdW5hbWUgLXNgJyIgZ2l2ZXMgJ0FJWCAnCi0gICAgaSo4NjpBSVg6KjoqKQotCWVjaG8gaTM4Ni1pYm0tYWl4Ci0JZXhpdCAwIDs7Ci0gICAgaWE2NDpBSVg6KjoqKQotCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgotCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAotCWVsc2UKLQkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tYWl4JHtJQk1fUkVWfQotCWV4aXQgMCA7OwotICAgICo6QUlYOjI6MykKLQlpZiBncmVwIGJvczMyNSAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCQlzZWQgJ3MvXgkJLy8nIDw8IEVPRiA+JGR1bW15LmMKLQkJI2luY2x1ZGUgPHN5cy9zeXN0ZW1jZmcuaD4KLQotCQltYWluKCkKLQkJCXsKLQkJCWlmICghX19wb3dlcl9wYygpKQotCQkJCWV4aXQoMSk7Ci0JCQlwdXRzKCJwb3dlcnBjLWlibS1haXgzLjIuNSIpOwotCQkJZXhpdCgwKTsKLQkJCX0KLUVPRgotCQkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiAkZHVtbXkgJiYgZXhpdCAwCi0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNQotCWVsaWYgZ3JlcCBib3MzMjQgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNAotCWVsc2UKLQkJZWNobyByczYwMDAtaWJtLWFpeDMuMgotCWZpCi0JZXhpdCAwIDs7Ci0gICAgKjpBSVg6KjpbNDVdKQotCUlCTV9DUFVfSUQ9YC91c3Ivc2Jpbi9sc2RldiAtQyAtYyBwcm9jZXNzb3IgLVMgYXZhaWxhYmxlIHwgc2VkIDFxIHwgYXdrICd7IHByaW50ICQxIH0nYAotCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVsICR7SUJNX0NQVV9JRH0gfCBncmVwICcgUE9XRVInID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlJQk1fQVJDSD1yczYwMDAKLQllbHNlCi0JCUlCTV9BUkNIPXBvd2VycGMKLQlmaQotCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgotCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAotCWVsc2UKLQkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotCWVjaG8gJHtJQk1fQVJDSH0taWJtLWFpeCR7SUJNX1JFVn0KLQlleGl0IDAgOzsKLSAgICAqOkFJWDoqOiopCi0JZWNobyByczYwMDAtaWJtLWFpeAotCWV4aXQgMCA7OwotICAgIGlibXJ0OjQuNEJTRDoqfHJvbXAtaWJtOkJTRDoqKQotCWVjaG8gcm9tcC1pYm0tYnNkNC40Ci0JZXhpdCAwIDs7Ci0gICAgaWJtcnQ6KkJTRDoqfHJvbXAtaWJtOkJTRDoqKSAgICAgICAgICAgICMgY292ZXJzIFJUL1BDIEJTRCBhbmQKLQllY2hvIHJvbXAtaWJtLWJzZCR7VU5BTUVfUkVMRUFTRX0gICAjIDQuMyB3aXRoIHVuYW1lIGFkZGVkIHRvCi0JZXhpdCAwIDs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBvcnQ6IHJvbXAtaWJtIEJTRCA0LjMKLSAgICAqOkJPU1g6KjoqKQotCWVjaG8gcnM2MDAwLWJ1bGwtYm9zeAotCWV4aXQgMCA7OwotICAgIERQWC8yPzAwOkIuTy5TLjoqOiopCi0JZWNobyBtNjhrLWJ1bGwtc3lzdjMKLQlleGl0IDAgOzsKLSAgICA5MDAwL1szNF0/Pzo0LjNic2Q6MS4qOiopCi0JZWNobyBtNjhrLWhwLWJzZAotCWV4aXQgMCA7OwotICAgIGhwMzAwOjQuNEJTRDoqOiogfCA5MDAwL1szNF0/Pzo0LjNic2Q6Mi4qOiopCi0JZWNobyBtNjhrLWhwLWJzZDQuNAotCWV4aXQgMCA7OwotICAgIDkwMDAvWzM0Njc4XT8/OkhQLVVYOio6KikKLQlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKLQljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgotCSAgICA5MDAwLzMxPyApICAgICAgICAgICAgSFBfQVJDSD1tNjgwMDAgOzsKLQkgICAgOTAwMC9bMzRdPz8gKSAgICAgICAgIEhQX0FSQ0g9bTY4ayA7OwotCSAgICA5MDAwL1s2NzhdWzAtOV1bMC05XSkKLQkJaWYgWyAteCAvdXNyL2Jpbi9nZXRjb25mIF07IHRoZW4KLQkJICAgIHNjX2NwdV92ZXJzaW9uPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0NQVV9WRVJTSU9OIDI+L2Rldi9udWxsYAotICAgICAgICAgICAgICAgICAgICBzY19rZXJuZWxfYml0cz1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19LRVJORUxfQklUUyAyPi9kZXYvbnVsbGAKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtzY19jcHVfdmVyc2lvbn0iIGluCi0gICAgICAgICAgICAgICAgICAgICAgNTIzKSBIUF9BUkNIPSJocHBhMS4wIiA7OyAjIENQVV9QQV9SSVNDMV8wCi0gICAgICAgICAgICAgICAgICAgICAgNTI4KSBIUF9BUkNIPSJocHBhMS4xIiA7OyAjIENQVV9QQV9SSVNDMV8xCi0gICAgICAgICAgICAgICAgICAgICAgNTMyKSAgICAgICAgICAgICAgICAgICAgICAjIENQVV9QQV9SSVNDMl8wCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIke3NjX2tlcm5lbF9iaXRzfSIgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgMzIpIEhQX0FSQ0g9ImhwcGEyLjBuIiA7OwotICAgICAgICAgICAgICAgICAgICAgICAgICA2NCkgSFBfQVJDSD0iaHBwYTIuMHciIDs7Ci0JCQkgICcnKSBIUF9BUkNIPSJocHBhMi4wIiA7OyAgICMgSFAtVVggMTAuMjAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVzYWMgOzsKLSAgICAgICAgICAgICAgICAgICAgZXNhYwotCQlmaQotCQlpZiBbICIke0hQX0FSQ0h9IiA9ICIiIF07IHRoZW4KLQkJICAgIGV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQkJICAgIHNlZCAncy9eICAgICAgICAgICAgICAvLycgPDwgRU9GID4kZHVtbXkuYwotCi0gICAgICAgICAgICAgICNkZWZpbmUgX0hQVVhfU09VUkNFCi0gICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KLSAgICAgICAgICAgICAgI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0gICAgICAgICAgICAgIGludCBtYWluICgpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQotICAgICAgICAgICAgICAgICAgbG9uZyBiaXRzID0gc3lzY29uZihfU0NfS0VSTkVMX0JJVFMpOwotICAgICAgICAgICAgICAjZW5kaWYKLSAgICAgICAgICAgICAgICAgIGxvbmcgY3B1ICA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7Ci0KLSAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY3B1KQotICAgICAgICAgICAgICAJewotICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMSIpOyBicmVhazsKLSAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MyXzA6Ci0gICAgICAgICAgICAgICNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKLSAgICAgICAgICAgICAgCSAgICBzd2l0Y2ggKGJpdHMpCi0gICAgICAgICAgICAgIAkJewotICAgICAgICAgICAgICAJCWNhc2UgNjQ6IHB1dHMgKCJocHBhMi4wdyIpOyBicmVhazsKLSAgICAgICAgICAgICAgCQljYXNlIDMyOiBwdXRzICgiaHBwYTIuMG4iKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJZGVmYXVsdDogcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJfSBicmVhazsKLSAgICAgICAgICAgICAgI2Vsc2UgIC8qICFkZWZpbmVkKF9TQ19LRVJORUxfQklUUykgKi8KLSAgICAgICAgICAgICAgCSAgICBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgI2VuZGlmCi0gICAgICAgICAgICAgIAlkZWZhdWx0OiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICAgIGV4aXQgKDApOwotICAgICAgICAgICAgICB9Ci1FT0YKLQkJICAgIChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jIDI+L2Rldi9udWxsKSAmJiBIUF9BUkNIPWAkZHVtbXlgCi0JCSAgICB0ZXN0IC16ICIkSFBfQVJDSCIgJiYgSFBfQVJDSD1ocHBhCi0JCWZpIDs7Ci0JZXNhYwotCWlmIFsgJHtIUF9BUkNIfSA9ICJocHBhMi4wdyIgXQotCXRoZW4KLQkgICAgIyBhdm9pZCBkb3VibGUgZXZhbHVhdGlvbiBvZiAkc2V0X2NjX2Zvcl9idWlsZAotCSAgICB0ZXN0IC1uICIkQ0NfRk9SX0JVSUxEIiB8fCBldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0JICAgIGlmIGVjaG8gX19MUDY0X18gfCAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0pIHwgZ3JlcCBfX0xQNjRfXyA+L2Rldi9udWxsCi0JICAgIHRoZW4KLQkJSFBfQVJDSD0iaHBwYTIuMHciCi0JICAgIGVsc2UKLQkJSFBfQVJDSD0iaHBwYTY0IgotCSAgICBmaQotCWZpCi0JZWNobyAke0hQX0FSQ0h9LWhwLWhwdXgke0hQVVhfUkVWfQotCWV4aXQgMCA7OwotICAgIGlhNjQ6SFAtVVg6KjoqKQotCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAotCWVjaG8gaWE2NC1ocC1ocHV4JHtIUFVYX1JFVn0KLQlleGl0IDAgOzsKLSAgICAzMDUwKjpISS1VWDoqOiopCi0JZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0JI2luY2x1ZGUgPHVuaXN0ZC5oPgotCWludAotCW1haW4gKCkKLQl7Ci0JICBsb25nIGNwdSA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7Ci0JICAvKiBUaGUgb3JkZXIgbWF0dGVycywgYmVjYXVzZSBDUFVfSVNfSFBfTUM2OEsgZXJyb25lb3VzbHkgcmV0dXJucwotCSAgICAgdHJ1ZSBmb3IgQ1BVX1BBX1JJU0MxXzAuICBDUFVfSVNfUEFfUklTQyByZXR1cm5zIGNvcnJlY3QKLQkgICAgIHJlc3VsdHMsIGhvd2V2ZXIuICAqLwotCSAgaWYgKENQVV9JU19QQV9SSVNDIChjcHUpKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChjcHUpCi0JCXsKLQkJICBjYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCSAgY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQkgIGNhc2UgQ1BVX1BBX1JJU0MyXzA6IHB1dHMgKCJocHBhMi4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJICBkZWZhdWx0OiBwdXRzICgiaHBwYS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoQ1BVX0lTX0hQX01DNjhLIChjcHUpKQotCSAgICBwdXRzICgibTY4ay1oaXRhY2hpLWhpdXh3ZTIiKTsKLQkgIGVsc2UgcHV0cyAoInVua25vd24taGl0YWNoaS1oaXV4d2UyIik7Ci0JICBleGl0ICgwKTsKLQl9Ci1FT0YKLQkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiAkZHVtbXkgJiYgZXhpdCAwCi0JZWNobyB1bmtub3duLWhpdGFjaGktaGl1eHdlMgotCWV4aXQgMCA7OwotICAgIDkwMDAvNz8/OjQuM2JzZDoqOiogfCA5MDAwLzg/Wzc5XTo0LjNic2Q6KjoqICkKLQllY2hvIGhwcGExLjEtaHAtYnNkCi0JZXhpdCAwIDs7Ci0gICAgOTAwMC84Pz86NC4zYnNkOio6KikKLQllY2hvIGhwcGExLjAtaHAtYnNkCi0JZXhpdCAwIDs7Ci0gICAgKjk/Pyo6TVBFL2lYOio6KiB8ICozMDAwKjpNUEUvaVg6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1tcGVpeAotCWV4aXQgMCA7OwotICAgIGhwNz8/Ok9TRjE6KjoqIHwgaHA4P1s3OV06T1NGMToqOiogKQotCWVjaG8gaHBwYTEuMS1ocC1vc2YKLQlleGl0IDAgOzsKLSAgICBocDg/PzpPU0YxOio6KikKLQllY2hvIGhwcGExLjAtaHAtb3NmCi0JZXhpdCAwIDs7Ci0gICAgaSo4NjpPU0YxOio6KikKLQlpZiBbIC14IC91c3Ivc2Jpbi9zeXN2ZXJzaW9uIF0gOyB0aGVuCi0JICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjFtawotCWVsc2UKLQkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMQotCWZpCi0JZXhpdCAwIDs7Ci0gICAgcGFyaXNjKjpMaXRlcyo6KjoqKQotCWVjaG8gaHBwYTEuMS1ocC1saXRlcwotCWV4aXQgMCA7OwotICAgIEMxKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzEqOiopCi0JZWNobyBjMS1jb252ZXgtYnNkCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEMyKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzIqOiopCi0JaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCi0JdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCi0JZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKLQlmaQotICAgICAgICBleGl0IDAgOzsKLSAgICBDMzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzQqOiopCi0JZWNobyBjMzQtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDMzgqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzgqOiopCi0JZWNobyBjMzgtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkM0KjoqKQotCWVjaG8gYzQtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDUkFZKlktTVA6KjoqOiopCi0JZWNobyB5bXAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDAgOzsKLSAgICBDUkFZKltBLVpdOTA6KjoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSBcCi0JfCBzZWQgLWUgJ3MvQ1JBWS4qXChbQS1aXTkwXCkvXDEvJyBcCi0JICAgICAgLWUgeS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8gXAotCSAgICAgIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDAgOzsKLSAgICBDUkFZKlRTOio6KjoqKQotCWVjaG8gdDkwLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCAwIDs7Ci0gICAgQ1JBWSpUM0U6KjoqOiopCi0JZWNobyBhbHBoYWV2NS1jcmF5LXVuaWNvc21rJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCAwIDs7Ci0gICAgQ1JBWSpTVjE6KjoqOiopCi0JZWNobyBzdjEtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDAgOzsKLSAgICAqOlVOSUNPUy9tcDoqOiopCi0JZWNobyBjcmF5bnYtY3JheS11bmljb3NtcCR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJwotCWV4aXQgMCA7OwotICAgIEYzMFswMV06VU5JWF9TeXN0ZW1fVjoqOiogfCBGNzAwOlVOSVhfU3lzdGVtX1Y6KjoqKQotCUZVSklUU1VfUFJPQz1gdW5hbWUgLW0gfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCi0gICAgICAgIEZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy9cLy8vJ2AKLSAgICAgICAgRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy8gL18vJ2AKLSAgICAgICAgZWNobyAiJHtGVUpJVFNVX1BST0N9LWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgNTAwMDpVTklYX1N5c3RlbV9WOjQuKjoqKQotICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCi0gICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvIC9fLydgCi0gICAgICAgIGVjaG8gInNwYXJjLWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKLQlleGl0IDAgOzsKLSAgICBpKjg2OkJTRC8zODY6KjoqIHwgaSo4NjpCU0QvT1M6KjoqIHwgKjpBc2NlbmRcIEVtYmVkZGVkL09TOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYnNkaSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBzcGFyYyo6QlNEL09TOio6KikKLQllY2hvIHNwYXJjLXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOkJTRC9PUzoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOkZyZWVCU0Q6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgCi0JZXhpdCAwIDs7Ci0gICAgaSo6Q1lHV0lOKjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1jeWd3aW4KLQlleGl0IDAgOzsKLSAgICBpKjpNSU5HVyo6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluZ3czMgotCWV4aXQgMCA7OwotICAgIGkqOlBXKjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1wdzMyCi0JZXhpdCAwIDs7Ci0gICAgeDg2OkludGVyaXgqOlszNF0qKQotCWVjaG8gaTU4Ni1wYy1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvXC4uKi8vJwotCWV4aXQgMCA7OwotICAgIFszNDVdODY6V2luZG93c185NToqIHwgWzM0NV04NjpXaW5kb3dzXzk4OiogfCBbMzQ1XTg2OldpbmRvd3NfTlQ6KikKLQllY2hvIGkke1VOQU1FX01BQ0hJTkV9LXBjLW1rcwotCWV4aXQgMCA7OwotICAgIGkqOldpbmRvd3NfTlQqOiogfCBQZW50aXVtKjpXaW5kb3dzX05UKjoqKQotCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KLQkjIEl0IGFsc28gY29uZmxpY3RzIHdpdGggcHJlLTIuMCB2ZXJzaW9ucyBvZiBBVCZUIFVXSU4uIFNob3VsZCB3ZQotCSMgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQgb2YgaTM4Nj8KLQllY2hvIGk1ODYtcGMtaW50ZXJpeAotCWV4aXQgMCA7OwotICAgIGkqOlVXSU4qOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXV3aW4KLQlleGl0IDAgOzsKLSAgICBwKjpDWUdXSU4qOiopCi0JZWNobyBwb3dlcnBjbGUtdW5rbm93bi1jeWd3aW4KLQlleGl0IDAgOzsKLSAgICBwcmVwKjpTdW5PUzo1Lio6KikKLQllY2hvIHBvd2VycGNsZS11bmtub3duLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgKjpHTlU6KjoqKQotCSMgdGhlIEdOVSBzeXN0ZW0KLQllY2hvIGBlY2hvICR7VU5BTUVfTUFDSElORX18c2VkIC1lICdzLFstL10uKiQsLCdgLXVua25vd24tZ251YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MsLy4qJCwsJ2AKLQlleGl0IDAgOzsKLSAgICAqOkdOVS8qOio6KikKLQkjIG90aGVyIHN5c3RlbXMgd2l0aCBHTlUgbGliYyBhbmQgdXNlcmxhbmQKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1gZWNobyAke1VOQU1FX1NZU1RFTX0gfCBzZWQgJ3MsXlteL10qLywsJyB8IHRyICdbQS1aXScgJ1thLXpdJ2BgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgLWdudQotCWV4aXQgMCA7OwotICAgIGkqODY6TWluaXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5peAotCWV4aXQgMCA7OwotICAgIGFybSo6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgMCA7OwotICAgIGNyaXM6TGludXg6KjoqKQotCWVjaG8gY3Jpcy1heGlzLWxpbnV4LWdudQotCWV4aXQgMCA7OwotICAgIGNyaXN2MzI6TGludXg6KjoqKQotCWVjaG8gY3Jpc3YzMi1heGlzLWxpbnV4LWdudQotCWV4aXQgMCA7OwotICAgIGZydjpMaW51eDoqOiopCi0gICAgCWVjaG8gZnJ2LXVua25vd24tbGludXgtZ251Ci0JZXhpdCAwIDs7Ci0gICAgaWE2NDpMaW51eDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251Ci0JZXhpdCAwIDs7Ci0gICAgbTMycio6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgMCA7OwotICAgIG02OCo6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgMCA7OwotICAgIG1pcHM6TGludXg6KjoqKQotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwotCSN1bmRlZiBDUFUKLQkjdW5kZWYgbWlwcwotCSN1bmRlZiBtaXBzZWwKLQkjaWYgZGVmaW5lZChfX01JUFNFTF9fKSB8fCBkZWZpbmVkKF9fTUlQU0VMKSB8fCBkZWZpbmVkKF9NSVBTRUwpIHx8IGRlZmluZWQoTUlQU0VMKQotCUNQVT1taXBzZWwKLQkjZWxzZQotCSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pIHx8IGRlZmluZWQoX19NSVBTRUIpIHx8IGRlZmluZWQoX01JUFNFQikgfHwgZGVmaW5lZChNSVBTRUIpCi0JQ1BVPW1pcHMKLQkjZWxzZQotCUNQVT0KLQkjZW5kaWYKLQkjZW5kaWYKLUVPRgotCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwIF5DUFU9YAotCXRlc3QgeCIke0NQVX0iICE9IHggJiYgZWNobyAiJHtDUFV9LXVua25vd24tbGludXgtZ251IiAmJiBleGl0IDAKLQk7OwotICAgIG1pcHM2NDpMaW51eDoqOiopCi0JZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0JI3VuZGVmIENQVQotCSN1bmRlZiBtaXBzNjQKLQkjdW5kZWYgbWlwczY0ZWwKLQkjaWYgZGVmaW5lZChfX01JUFNFTF9fKSB8fCBkZWZpbmVkKF9fTUlQU0VMKSB8fCBkZWZpbmVkKF9NSVBTRUwpIHx8IGRlZmluZWQoTUlQU0VMKQotCUNQVT1taXBzNjRlbAotCSNlbHNlCi0JI2lmIGRlZmluZWQoX19NSVBTRUJfXykgfHwgZGVmaW5lZChfX01JUFNFQikgfHwgZGVmaW5lZChfTUlQU0VCKSB8fCBkZWZpbmVkKE1JUFNFQikKLQlDUFU9bWlwczY0Ci0JI2Vsc2UKLQlDUFU9Ci0JI2VuZGlmCi0JI2VuZGlmCi1FT0YKLQlldmFsIGAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgZ3JlcCBeQ1BVPWAKLQl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIGVjaG8gIiR7Q1BVfS11bmtub3duLWxpbnV4LWdudSIgJiYgZXhpdCAwCi0JOzsKLSAgICBwcGM6TGludXg6KjoqKQotCWVjaG8gcG93ZXJwYy11bmtub3duLWxpbnV4LWdudQotCWV4aXQgMCA7OwotICAgIHBwYzY0OkxpbnV4Oio6KikKLQllY2hvIHBvd2VycGM2NC11bmtub3duLWxpbnV4LWdudQotCWV4aXQgMCA7OwotICAgIGFscGhhOkxpbnV4Oio6KikKLQljYXNlIGBzZWQgLW4gJy9eY3B1IG1vZGVsL3MvXi4qOiBcKC4qXCkvXDEvcCcgPCAvcHJvYy9jcHVpbmZvYCBpbgotCSAgRVY1KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjUgOzsKLQkgIEVWNTYpICBVTkFNRV9NQUNISU5FPWFscGhhZXY1NiA7OwotCSAgUENBNTYpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OwotCSAgUENBNTcpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OwotCSAgRVY2KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjYgOzsKLQkgIEVWNjcpICBVTkFNRV9NQUNISU5FPWFscGhhZXY2NyA7OwotCSAgRVY2OCopIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY4IDs7Ci0gICAgICAgIGVzYWMKLQlvYmpkdW1wIC0tcHJpdmF0ZS1oZWFkZXJzIC9iaW4vc2ggfCBncmVwIGxkLnNvLjEgPi9kZXYvbnVsbAotCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuIExJQkM9ImxpYmMxIiA7IGVsc2UgTElCQz0iIiA7IGZpCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251JHtMSUJDfQotCWV4aXQgMCA7OwotICAgIHBhcmlzYzpMaW51eDoqOiogfCBocHBhOkxpbnV4Oio6KikKLQkjIExvb2sgZm9yIENQVSBsZXZlbAotCWNhc2UgYGdyZXAgJ15jcHVbXmEtel0qOicgL3Byb2MvY3B1aW5mbyAyPi9kZXYvbnVsbCB8IGN1dCAtZCcgJyAtZjJgIGluCi0JICBQQTcqKSBlY2hvIGhwcGExLjEtdW5rbm93bi1saW51eC1nbnUgOzsKLQkgIFBBOCopIGVjaG8gaHBwYTIuMC11bmtub3duLWxpbnV4LWdudSA7OwotCSAgKikgICAgZWNobyBocHBhLXVua25vd24tbGludXgtZ251IDs7Ci0JZXNhYwotCWV4aXQgMCA7OwotICAgIHBhcmlzYzY0OkxpbnV4Oio6KiB8IGhwcGE2NDpMaW51eDoqOiopCi0JZWNobyBocHBhNjQtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDAgOzsKLSAgICBzMzkwOkxpbnV4Oio6KiB8IHMzOTB4OkxpbnV4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWxpbnV4Ci0JZXhpdCAwIDs7Ci0gICAgc2g2NCo6TGludXg6KjoqKQotICAgIAllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDAgOzsKLSAgICBzaCo6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgMCA7OwotICAgIHNwYXJjOkxpbnV4Oio6KiB8IHNwYXJjNjQ6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgMCA7OwotICAgIHg4Nl82NDpMaW51eDoqOiopCi0JZWNobyB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDAgOzsKLSAgICBpKjg2OkxpbnV4Oio6KikKLQkjIFRoZSBCRkQgbGlua2VyIGtub3dzIHdoYXQgdGhlIGRlZmF1bHQgb2JqZWN0IGZpbGUgZm9ybWF0IGlzLCBzbwotCSMgZmlyc3Qgc2VlIGlmIGl0IHdpbGwgdGVsbCB1cy4gY2QgdG8gdGhlIHJvb3QgZGlyZWN0b3J5IHRvIHByZXZlbnQKLQkjIHByb2JsZW1zIHdpdGggb3RoZXIgcHJvZ3JhbXMgb3IgZGlyZWN0b3JpZXMgY2FsbGVkIGBsZCcgaW4gdGhlIHBhdGguCi0JIyBTZXQgTENfQUxMPUMgdG8gZW5zdXJlIGxkIG91dHB1dHMgbWVzc2FnZXMgaW4gRW5nbGlzaC4KLQlsZF9zdXBwb3J0ZWRfdGFyZ2V0cz1gY2QgLzsgTENfQUxMPUMgbGQgLS1oZWxwIDI+JjEgXAotCQkJIHwgc2VkIC1uZSAnL3N1cHBvcnRlZCB0YXJnZXRzOi8hZAotCQkJCSAgICBzL1sgCV1bIAldKi8gL2cKLQkJCQkgICAgcy8uKnN1cHBvcnRlZCB0YXJnZXRzOiAqLy8KLQkJCQkgICAgcy8gLiovLwotCQkJCSAgICBwJ2AKLSAgICAgICAgY2FzZSAiJGxkX3N1cHBvcnRlZF90YXJnZXRzIiBpbgotCSAgZWxmMzItaTM4NikKLQkJVEVOVEFUSVZFPSIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudSIKLQkJOzsKLQkgIGEub3V0LWkzODYtbGludXgpCi0JCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251YW91dCIKLQkJZXhpdCAwIDs7Ci0JICBjb2ZmLWkzODYpCi0JCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251Y29mZiIKLQkJZXhpdCAwIDs7Ci0JICAiIikKLQkJIyBFaXRoZXIgYSBwcmUtQkZEIGEub3V0IGxpbmtlciAobGludXgtZ251b2xkbGQpIG9yCi0JCSMgb25lIHRoYXQgZG9lcyBub3QgZ2l2ZSB1cyB1c2VmdWwgLS1oZWxwLgotCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudW9sZGxkIgotCQlleGl0IDAgOzsKLQllc2FjCi0JIyBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGVmYXVsdCBjb21waWxlciBpcyBhLm91dCBvciBlbGYKLQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0Jc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKLQkjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KLQkjaWZkZWYgX19FTEZfXwotCSMgaWZkZWYgX19HTElCQ19fCi0JIyAgaWYgX19HTElCQ19fID49IDIKLQlMSUJDPWdudQotCSMgIGVsc2UKLQlMSUJDPWdudWxpYmMxCi0JIyAgZW5kaWYKLQkjIGVsc2UKLQlMSUJDPWdudWxpYmMxCi0JIyBlbmRpZgotCSNlbHNlCi0JI2lmZGVmIF9fSU5URUxfQ09NUElMRVIKLQlMSUJDPWdudQotCSNlbHNlCi0JTElCQz1nbnVhb3V0Ci0JI2VuZGlmCi0JI2VuZGlmCi0JI2lmZGVmIF9fZGlldGxpYmNfXwotCUxJQkM9ZGlldGxpYmMKLQkjZW5kaWYKLUVPRgotCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwIF5MSUJDPWAKLQl0ZXN0IHgiJHtMSUJDfSIgIT0geCAmJiBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LSR7TElCQ30iICYmIGV4aXQgMAotCXRlc3QgeCIke1RFTlRBVElWRX0iICE9IHggJiYgZWNobyAiJHtURU5UQVRJVkV9IiAmJiBleGl0IDAKLQk7OwotICAgIGkqODY6RFlOSVgvcHR4OjQqOiopCi0JIyBwdHggNC4wIGRvZXMgdW5hbWUgLXMgY29ycmVjdGx5LCB3aXRoIERZTklYL3B0eCBpbiB0aGVyZS4KLQkjIGVhcmxpZXIgdmVyc2lvbnMgYXJlIG1lc3NlZCB1cCBhbmQgcHV0IHRoZSBub2RlbmFtZSBpbiBib3RoCi0JIyBzeXNuYW1lIGFuZCBub2RlbmFtZS4KLQllY2hvIGkzODYtc2VxdWVudC1zeXN2NAotCWV4aXQgMCA7OwotICAgIGkqODY6VU5JWF9TVjo0LjJNUDoyLiopCi0gICAgICAgICMgVW5peHdhcmUgaXMgYW4gb2Zmc2hvb3Qgb2YgU1ZSNCwgYnV0IGl0IGhhcyBpdHMgb3duIHZlcnNpb24KLSAgICAgICAgIyBudW1iZXIgc2VyaWVzIHN0YXJ0aW5nIHdpdGggMi4uLgotICAgICAgICAjIEkgYW0gbm90IHBvc2l0aXZlIHRoYXQgb3RoZXIgU1ZSNCBzeXN0ZW1zIHdvbid0IG1hdGNoIHRoaXMsCi0JIyBJIGp1c3QgaGF2ZSB0byBob3BlLiAgLS0gcm1zLgotICAgICAgICAjIFVzZSBzeXN2NC4ydXcuLi4gc28gdGhhdCBzeXN2NCogbWF0Y2hlcyBpdC4KLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjQuMnV3JHtVTkFNRV9WRVJTSU9OfQotCWV4aXQgMCA7OwotICAgIGkqODY6T1MvMjoqOiopCi0JIyBJZiB3ZSB3ZXJlIGFibGUgdG8gZmluZCBgdW5hbWUnLCB0aGVuIEVNWCBVbml4IGNvbXBhdGliaWxpdHkKLQkjIGlzIHByb2JhYmx5IGluc3RhbGxlZC4KLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtb3MyLWVteAotCWV4aXQgMCA7OwotICAgIGkqODY6WFRTLTMwMDoqOlNUT1ApCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3RvcAotCWV4aXQgMCA7OwotICAgIGkqODY6YXRoZW9zOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hdGhlb3MKLQlleGl0IDAgOzsKLQlpKjg2OnN5bGxhYmxlOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lsbGFibGUKLQlleGl0IDAgOzsKLSAgICBpKjg2Okx5bnhPUzoyLio6KiB8IGkqODY6THlueE9TOjMuWzAxXSo6KiB8IGkqODY6THlueE9TOjQuMCo6KikKLQllY2hvIGkzODYtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgaSo4NjoqRE9TOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbXNkb3NkamdwcAotCWV4aXQgMCA7OwotICAgIGkqODY6Kjo0Lio6KiB8IGkqODY6U1lTVEVNX1Y6NC4qOiopCi0JVU5BTUVfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgJ3MvXC9NUCQvLydgCi0JaWYgZ3JlcCBOb3ZlbGwgL3Vzci9pbmNsdWRlL2xpbmsuaCA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bml2ZWwtc3lzdiR7VU5BTUVfUkVMfQotCWVsc2UKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Yke1VOQU1FX1JFTH0KLQlmaQotCWV4aXQgMCA7OwotICAgIGkqODY6Kjo1Ols3OF0qKQotCWNhc2UgYC9iaW4vdW5hbWUgLVggfCBncmVwICJeTWFjaGluZSJgIGluCi0JICAgICo0ODYqKQkgICAgIFVOQU1FX01BQ0hJTkU9aTQ4NiA7OwotCSAgICAqUGVudGl1bSkJICAgICBVTkFNRV9NQUNISU5FPWk1ODYgOzsKLQkgICAgKlBlbnQqfCpDZWxlcm9uKSBVTkFNRV9NQUNISU5FPWk2ODYgOzsKLQllc2FjCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0ke1VOQU1FX1NZU1RFTX0ke1VOQU1FX1ZFUlNJT059Ci0JZXhpdCAwIDs7Ci0gICAgaSo4NjoqOjMuMjoqKQotCWlmIHRlc3QgLWYgL3Vzci9vcHRpb25zL2NiLm5hbWU7IHRoZW4KLQkJVU5BTUVfUkVMPWBzZWQgLW4gJ3MvLipWZXJzaW9uIC8vcCcgPC91c3Ivb3B0aW9ucy9jYi5uYW1lYAotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtaXNjJFVOQU1FX1JFTAotCWVsaWYgL2Jpbi91bmFtZSAtWCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgotCQlVTkFNRV9SRUw9YCgvYmluL3VuYW1lIC1YfGdyZXAgUmVsZWFzZXxzZWQgLWUgJ3MvLio9IC8vJylgCi0JCSgvYmluL3VuYW1lIC1YfGdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgotCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudGl1bScgPi9kZXYvbnVsbCkgXAotCQkJJiYgVU5BTUVfTUFDSElORT1pNTg2Ci0JCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50ICpJSScgPi9kZXYvbnVsbCkgXAotCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2Ci0JCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50aXVtIFBybycgPi9kZXYvbnVsbCkgXAotCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2Ci0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zY28kVU5BTUVfUkVMCi0JZWxzZQotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjMyCi0JZmkKLQlleGl0IDAgOzsKLSAgICBwYzoqOio6KikKLQkjIExlZnQgaGVyZSBmb3IgY29tcGF0aWJpbGl0eToKLSAgICAgICAgIyB1bmFtZSAtbSBwcmludHMgZm9yIERKR1BQIGFsd2F5cyAncGMnLCBidXQgaXQgcHJpbnRzIG5vdGhpbmcgYWJvdXQKLSAgICAgICAgIyB0aGUgcHJvY2Vzc29yLCBzbyB3ZSBwbGF5IHNhZmUgYnkgYXNzdW1pbmcgaTM4Ni4KLQllY2hvIGkzODYtcGMtbXNkb3NkamdwcAotICAgICAgICBleGl0IDAgOzsKLSAgICBJbnRlbDpNYWNoOjMqOiopCi0JZWNobyBpMzg2LXBjLW1hY2gzCi0JZXhpdCAwIDs7Ci0gICAgcGFyYWdvbjoqOio6KikKLQllY2hvIGk4NjAtaW50ZWwtb3NmMQotCWV4aXQgMCA7OwotICAgIGk4NjA6Kjo0Lio6KikgIyBpODYwLVNWUjQKLQlpZiBncmVwIFN0YXJkZW50IC91c3IvaW5jbHVkZS9zeXMvdWFkbWluLmggPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgotCSAgZWNobyBpODYwLXN0YXJkZW50LXN5c3Yke1VOQU1FX1JFTEVBU0V9ICMgU3RhcmRlbnQgVmlzdHJhIGk4NjAtU1ZSNAotCWVsc2UgIyBBZGQgb3RoZXIgaTg2MC1TVlI0IHZlbmRvcnMgYmVsb3cgYXMgdGhleSBhcmUgZGlzY292ZXJlZC4KLQkgIGVjaG8gaTg2MC11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9ICAjIFVua25vd24gaTg2MC1TVlI0Ci0JZmkKLQlleGl0IDAgOzsKLSAgICBtaW5pKjpDVElYOlNZUyo1OiopCi0JIyAibWluaWZyYW1lIgotCWVjaG8gbTY4MDEwLWNvbnZlcmdlbnQtc3lzdgotCWV4aXQgMCA7OwotICAgIG1jNjhrOlVOSVg6U1lTVEVNNTozLjUxbSkKLQllY2hvIG02OGstY29udmVyZ2VudC1zeXN2Ci0JZXhpdCAwIDs7Ci0gICAgTTY4MD8wOkQtTklYOjUuMzoqKQotCWVjaG8gbTY4ay1kaWFiLWRuaXgKLQlleGl0IDAgOzsKLSAgICBNNjgqOio6UjNWWzU2NzhdKjoqKQotCXRlc3QgLXIgL3N5c1Y2OCAmJiBlY2hvICdtNjhrLW1vdG9yb2xhLXN5c3YnICYmIGV4aXQgMCA7OwotICAgIDNbMzQ1XT8/Oio6NC4wOjMuMCB8IDNbMzRdPz9BOio6NC4wOjMuMCB8IDNbMzRdPz8sKjoqOjQuMDozLjAgfCAzWzM0XT8/Lyo6Kjo0LjA6My4wIHwgNDQwMDoqOjQuMDozLjAgfCA0ODUwOio6NC4wOjMuMCB8IFNLQTQwOio6NC4wOjMuMCB8IFNEUzI6Kjo0LjA6My4wIHwgU0hHMjoqOjQuMDozLjAgfCBTNzUwMSo6Kjo0LjA6My4wKQotCU9TX1JFTD0nJwotCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAotCSYmIE9TX1JFTD0uYHNlZCAtbiAncy9bXiBdKiBbXiBdKiBcKFswLTldWzAtOV1cKS4qL1wxL3AnIDwgL2V0Yy8ucmVsaWRgCi0JL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCi0JICAmJiBlY2hvIGk0ODYtbmNyLXN5c3Y0LjMke09TX1JFTH0gJiYgZXhpdCAwCi0JL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IC9iaW4vZ3JlcCBlbnRpdW0gPi9kZXYvbnVsbCBcCi0JICAmJiBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH0gJiYgZXhpdCAwIDs7Ci0gICAgM1szNF0/PzoqOjQuMDoqIHwgM1szNF0/PywqOio6NC4wOiopCi0gICAgICAgIC9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAotICAgICAgICAgICYmIGVjaG8gaTQ4Ni1uY3Itc3lzdjQgJiYgZXhpdCAwIDs7Ci0gICAgbTY4KjpMeW54T1M6Mi4qOiogfCBtNjgqOkx5bnhPUzozLjAqOiopCi0JZWNobyBtNjhrLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1jNjgwMzA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKLQllY2hvIG02OGstYXRhcmktc3lzdjQKLQlleGl0IDAgOzsKLSAgICBUU1VOQU1JOkx5bnhPUzoyLio6KikKLQllY2hvIHNwYXJjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHJzNjAwMDpMeW54T1M6Mi4qOiopCi0JZWNobyByczYwMDAtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgUG93ZXJQQzpMeW54T1M6Mi4qOiogfCBQb3dlclBDOkx5bnhPUzozLlswMV0qOiogfCBQb3dlclBDOkx5bnhPUzo0LjAqOiopCi0JZWNobyBwb3dlcnBjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFNNW0JFXVM6VU5JWF9TVjoqOiopCi0JZWNobyBtaXBzLWRkZS1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFJNKjpSZWxpYW50VU5JWC0qOio6KikKLQllY2hvIG1pcHMtc25pLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgUk0qOlNJTklYLSo6KjoqKQotCWVjaG8gbWlwcy1zbmktc3lzdjQKLQlleGl0IDAgOzsKLSAgICAqOlNJTklYLSo6KjoqKQotCWlmIHVuYW1lIC1wIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCi0JCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zbmktc3lzdjQKLQllbHNlCi0JCWVjaG8gbnMzMmstc25pLXN5c3YKLQlmaQotCWV4aXQgMCA7OwotICAgIFBFTlRJVU06Kjo0LjAqOiopICMgVW5pc3lzIGBDbGVhclBhdGggSE1QIElYIDQwMDAnIFNWUjQvTVAgZWZmb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgIyBzYXlzIDxSaWNoYXJkLk0uQmFydGVsQGNjTWFpbC5DZW5zdXMuR09WPgotICAgICAgICBlY2hvIGk1ODYtdW5pc3lzLXN5c3Y0Ci0gICAgICAgIGV4aXQgMCA7OwotICAgICo6VU5JWF9TeXN0ZW1fVjo0KjpGVFgqKQotCSMgRnJvbSBHZXJhbGQgSGV3ZXMgPGhld2VzQG9wZW5tYXJrZXQuY29tPi4KLQkjIEhvdyBhYm91dCBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBzdHJhdHVzIGFyY2hpdGVjdHVyZXM/IC1kam0KLQllY2hvIGhwcGExLjEtc3RyYXR1cy1zeXN2NAotCWV4aXQgMCA7OwotICAgICo6KjoqOkZUWCopCi0JIyBGcm9tIHNlYW5mQHN3ZGMuc3RyYXR1cy5jb20uCi0JZWNobyBpODYwLXN0cmF0dXMtc3lzdjQKLQlleGl0IDAgOzsKLSAgICAqOlZPUzoqOiopCi0JIyBGcm9tIFBhdWwuR3JlZW5Ac3RyYXR1cy5jb20uCi0JZWNobyBocHBhMS4xLXN0cmF0dXMtdm9zCi0JZXhpdCAwIDs7Ci0gICAgbWM2OCo6QS9VWDoqOiopCi0JZWNobyBtNjhrLWFwcGxlLWF1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBuZXdzKjpORVdTLU9TOjYqOiopCi0JZWNobyBtaXBzLXNvbnktbmV3c29zNgotCWV4aXQgMCA7OwotICAgIFJbMzRdMDAwOipTeXN0ZW1fVio6KjoqIHwgUjQwMDA6VU5JWF9TWVNWOio6KiB8IFIqMDAwOlVOSVhfU1Y6KjoqKQotCWlmIFsgLWQgL3Vzci9uZWMgXTsgdGhlbgotCSAgICAgICAgZWNobyBtaXBzLW5lYy1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWVsc2UKLQkgICAgICAgIGVjaG8gbWlwcy11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9Ci0JZmkKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQmVCb3g6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIGhhcmR3YXJlIG1hZGUgYnkgQmUsIFBQQyBvbmx5LgotCWVjaG8gcG93ZXJwYy1iZS1iZW9zCi0JZXhpdCAwIDs7Ci0gICAgQmVNYWM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIE1hYyBvciBNYWMgY2xvbmUsIFBQQyBvbmx5LgotCWVjaG8gcG93ZXJwYy1hcHBsZS1iZW9zCi0JZXhpdCAwIDs7Ci0gICAgQmVQQzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gSW50ZWwgUEMgY29tcGF0aWJsZS4KLQllY2hvIGk1ODYtcGMtYmVvcwotCWV4aXQgMCA7OwotICAgIFNYLTQ6U1VQRVItVVg6KjoqKQotCWVjaG8gc3g0LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFNYLTU6U1VQRVItVVg6KjoqKQotCWVjaG8gc3g1LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFNYLTY6U1VQRVItVVg6KjoqKQotCWVjaG8gc3g2LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFBvd2VyKjpSaGFwc29keToqOiopCi0JZWNobyBwb3dlcnBjLWFwcGxlLXJoYXBzb2R5JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICo6UmhhcHNvZHk6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOkRhcndpbjoqOiopCi0JVU5BTUVfUFJPQ0VTU09SPWB1bmFtZSAtcGAgfHwgVU5BTUVfUFJPQ0VTU09SPXVua25vd24KLQljYXNlICRVTkFNRV9QUk9DRVNTT1IgaW4KLQkgICAgKjg2KSBVTkFNRV9QUk9DRVNTT1I9aTY4NiA7OwotCSAgICB1bmtub3duKSBVTkFNRV9QUk9DRVNTT1I9cG93ZXJwYyA7OwotCWVzYWMKLQllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS1hcHBsZS1kYXJ3aW4ke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpwcm9jbnRvKjoqOiogfCAqOlFOWDpbMDEyMzQ1Njc4OV0qOiopCi0JVU5BTUVfUFJPQ0VTU09SPWB1bmFtZSAtcGAKLQlpZiB0ZXN0ICIkVU5BTUVfUFJPQ0VTU09SIiA9ICJ4ODYiOyB0aGVuCi0JCVVOQU1FX1BST0NFU1NPUj1pMzg2Ci0JCVVOQU1FX01BQ0hJTkU9cGMKLQlmaQotCWVjaG8gJHtVTkFNRV9QUk9DRVNTT1J9LSR7VU5BTUVfTUFDSElORX0tbnRvLXFueCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOlFOWDoqOjQqKQotCWVjaG8gaTM4Ni1wYy1xbngKLQlleGl0IDAgOzsKLSAgICBOU1ItPzpOT05TVE9QX0tFUk5FTDoqOiopCi0JZWNobyBuc3ItdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOk5vblN0b3AtVVg6KjoqKQotCWVjaG8gbWlwcy1jb21wYXEtbm9uc3RvcHV4Ci0JZXhpdCAwIDs7Ci0gICAgQlMyMDAwOlBPU0lYKjoqOiopCi0JZWNobyBiczIwMDAtc2llbWVucy1zeXN2Ci0JZXhpdCAwIDs7Ci0gICAgRFMvKjpVTklYX1N5c3RlbV9WOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tJHtVTkFNRV9TWVNURU19LSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOlBsYW45Oio6KikKLQkjICJ1bmFtZSAtbSIgaXMgbm90IGNvbnNpc3RlbnQsIHNvIHVzZSAkY3B1dHlwZSBpbnN0ZWFkLiAzODYKLQkjIGlzIGNvbnZlcnRlZCB0byBpMzg2IGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIHg4NgotCSMgb3BlcmF0aW5nIHN5c3RlbXMuCi0JaWYgdGVzdCAiJGNwdXR5cGUiID0gIjM4NiI7IHRoZW4KLQkgICAgVU5BTUVfTUFDSElORT1pMzg2Ci0JZWxzZQotCSAgICBVTkFNRV9NQUNISU5FPSIkY3B1dHlwZSIKLQlmaQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXBsYW45Ci0JZXhpdCAwIDs7Ci0gICAgKjpUT1BTLTEwOio6KikKLQllY2hvIHBkcDEwLXVua25vd24tdG9wczEwCi0JZXhpdCAwIDs7Ci0gICAgKjpURU5FWDoqOiopCi0JZWNobyBwZHAxMC11bmtub3duLXRlbmV4Ci0JZXhpdCAwIDs7Ci0gICAgS1MxMDpUT1BTLTIwOio6KiB8IEtMMTA6VE9QUy0yMDoqOiogfCBUWVBFNDpUT1BTLTIwOio6KikKLQllY2hvIHBkcDEwLWRlYy10b3BzMjAKLQlleGl0IDAgOzsKLSAgICBYS0wtMTpUT1BTLTIwOio6KiB8IFRZUEU1OlRPUFMtMjA6KjoqKQotCWVjaG8gcGRwMTAteGtsLXRvcHMyMAotCWV4aXQgMCA7OwotICAgICo6VE9QUy0yMDoqOiopCi0JZWNobyBwZHAxMC11bmtub3duLXRvcHMyMAotCWV4aXQgMCA7OwotICAgICo6SVRTOio6KikKLQllY2hvIHBkcDEwLXVua25vd24taXRzCi0JZXhpdCAwIDs7Ci0gICAgU0VJOio6KjpTRUlVWCkKLSAgICAgICAgZWNobyBtaXBzLXNlaS1zZWl1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOkRyYWdvbkZseToqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZHJhZ29uZmx5YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYAotCWV4aXQgMCA7OwotICAgICo6KlZNUzoqOiopCi0gICAgCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCi0JY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KLQkgICAgQSopIGVjaG8gYWxwaGEtZGVjLXZtcyAmJiBleGl0IDAgOzsKLQkgICAgSSopIGVjaG8gaWE2NC1kZWMtdm1zICYmIGV4aXQgMCA7OwotCSAgICBWKikgZWNobyB2YXgtZGVjLXZtcyAmJiBleGl0IDAgOzsKLQllc2FjCi1lc2FjCi0KLSNlY2hvICcoTm8gdW5hbWUgY29tbWFuZCBvciB1bmFtZSBvdXRwdXQgbm90IHJlY29nbml6ZWQuKScgMT4mMgotI2VjaG8gIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgMT4mMgotCi1ldmFsICRzZXRfY2NfZm9yX2J1aWxkCi1jYXQgPiRkdW1teS5jIDw8RU9GCi0jaWZkZWYgX1NFUVVFTlRfCi0jIGluY2x1ZGUgPHN5cy90eXBlcy5oPgotIyBpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgotI2VuZGlmCi1tYWluICgpCi17Ci0jaWYgZGVmaW5lZCAoc29ueSkKLSNpZiBkZWZpbmVkIChNSVBTRUIpCi0gIC8qIEJGRCB3YW50cyAiYnNkIiBpbnN0ZWFkIG9mICJuZXdzb3MiLiAgUGVyaGFwcyBCRkQgc2hvdWxkIGJlIGNoYW5nZWQsCi0gICAgIEkgZG9uJ3Qga25vdy4uLi4gICovCi0gIHByaW50ZiAoIm1pcHMtc29ueS1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbHNlCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0gIHByaW50ZiAoIm02OGstc29ueS1uZXdzb3Mlc1xuIiwKLSNpZmRlZiBORVdTT1M0Ci0gICAgICAgICAgIjQiCi0jZWxzZQotCSAgIiIKLSNlbmRpZgotICAgICAgICAgKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX19hcm0pICYmIGRlZmluZWQgKF9fYWNvcm4pICYmIGRlZmluZWQgKF9fdW5peCkKLSAgcHJpbnRmICgiYXJtLWFjb3JuLXJpc2NpeCIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoaHAzMDApICYmICFkZWZpbmVkIChocHV4KQotICBwcmludGYgKCJtNjhrLWhwLWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChOZVhUKQotI2lmICFkZWZpbmVkIChfX0FSQ0hJVEVDVFVSRV9fKQotI2RlZmluZSBfX0FSQ0hJVEVDVFVSRV9fICJtNjhrIgotI2VuZGlmCi0gIGludCB2ZXJzaW9uOwotICB2ZXJzaW9uPWAoaG9zdGluZm8gfCBzZWQgLW4gJ3MvLipOZVhUIE1hY2ggXChbMC05XSpcKS4qL1wxL3AnKSAyPi9kZXYvbnVsbGA7Ci0gIGlmICh2ZXJzaW9uIDwgNCkKLSAgICBwcmludGYgKCIlcy1uZXh0LW5leHRzdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOwotICBlbHNlCi0gICAgcHJpbnRmICgiJXMtbmV4dC1vcGVuc3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKLSAgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKE1VTFRJTUFYKSB8fCBkZWZpbmVkIChuMTYpCi0jaWYgZGVmaW5lZCAoVU1BWFYpCi0gIHByaW50ZiAoIm5zMzJrLWVuY29yZS1zeXN2XG4iKTsgZXhpdCAoMCk7Ci0jZWxzZQotI2lmIGRlZmluZWQgKENNVSkKLSAgcHJpbnRmICgibnMzMmstZW5jb3JlLW1hY2hcbiIpOyBleGl0ICgwKTsKLSNlbHNlCi0gIHByaW50ZiAoIm5zMzJrLWVuY29yZS1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fMzg2QlNEX18pCi0gIHByaW50ZiAoImkzODYtcGMtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKHNlcXVlbnQpCi0jaWYgZGVmaW5lZCAoaTM4NikKLSAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkIChuczMyMDAwKQotICBwcmludGYgKCJuczMyay1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NFUVVFTlRfKQotICAgIHN0cnVjdCB1dHNuYW1lIHVuOwotCi0gICAgdW5hbWUoJnVuKTsKLQotICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMiIsIDIpID09IDApIHsKLQlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MlxuIik7IGV4aXQgKDApOwotICAgIH0KLSAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjEiLCAyKSA9PSAwKSB7IC8qIFhYWCBpcyBWMSBjb3JyZWN0PyAqLwotCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgxXG4iKTsgZXhpdCAoMCk7Ci0gICAgfQotICAgIHByaW50ZiAoImkzODYtc2VxdWVudC1wdHhcbiIpOyBleGl0ICgwKTsKLQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkICh2YXgpCi0jIGlmICFkZWZpbmVkICh1bHRyaXgpCi0jICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgIGlmIGRlZmluZWQgKEJTRCkKLSMgICBpZiBCU0QgPT0gNDMKLSAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zXG4iKTsgZXhpdCAoMCk7Ci0jICAgZWxzZQotIyAgICBpZiBCU0QgPT0gMTk5MDA2Ci0gICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZDQuM3Jlbm9cbiIpOyBleGl0ICgwKTsKLSMgICAgZWxzZQotICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZWxzZQotICAgIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jICBlbmRpZgotIyBlbHNlCi0gICAgcHJpbnRmICgidmF4LWRlYy11bHRyaXhcbiIpOyBleGl0ICgwKTsKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoYWxsaWFudCkgJiYgZGVmaW5lZCAoaTg2MCkKLSAgcHJpbnRmICgiaTg2MC1hbGxpYW50LWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSAgZXhpdCAoMSk7Ci19Ci1FT0YKLQotJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgMj4vZGV2L251bGwgJiYgJGR1bW15ICYmIGV4aXQgMAotCi0jIEFwb2xsb3MgcHV0IHRoZSBzeXN0ZW0gdHlwZSBpbiB0aGUgZW52aXJvbm1lbnQuCi0KLXRlc3QgLWQgL3Vzci9hcG9sbG8gJiYgeyBlY2hvICR7SVNQfS1hcG9sbG8tJHtTWVNUWVBFfTsgZXhpdCAwOyB9Ci0KLSMgQ29udmV4IHZlcnNpb25zIHRoYXQgcHJlZGF0ZSB1bmFtZSBjYW4gdXNlIGdldHN5c2luZm8oMSkKLQotaWYgWyAteCAvdXNyL2NvbnZleC9nZXRzeXNpbmZvIF0KLXRoZW4KLSAgICBjYXNlIGBnZXRzeXNpbmZvIC1mIGNwdV90eXBlYCBpbgotICAgIGMxKikKLQllY2hvIGMxLWNvbnZleC1ic2QKLQlleGl0IDAgOzsKLSAgICBjMiopCi0JaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCi0JdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCi0JZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKLQlmaQotCWV4aXQgMCA7OwotICAgIGMzNCopCi0JZWNobyBjMzQtY29udmV4LWJzZAotCWV4aXQgMCA7OwotICAgIGMzOCopCi0JZWNobyBjMzgtY29udmV4LWJzZAotCWV4aXQgMCA7OwotICAgIGM0KikKLQllY2hvIGM0LWNvbnZleC1ic2QKLQlleGl0IDAgOzsKLSAgICBlc2FjCi1maQotCi1jYXQgPiYyIDw8RU9GCi0kMDogdW5hYmxlIHRvIGd1ZXNzIHN5c3RlbSB0eXBlCi0KLVRoaXMgc2NyaXB0LCBsYXN0IG1vZGlmaWVkICR0aW1lc3RhbXAsIGhhcyBmYWlsZWQgdG8gcmVjb2duaXplCi10aGUgb3BlcmF0aW5nIHN5c3RlbSB5b3UgYXJlIHVzaW5nLiBJdCBpcyBhZHZpc2VkIHRoYXQgeW91Ci1kb3dubG9hZCB0aGUgbW9zdCB1cCB0byBkYXRlIHZlcnNpb24gb2YgdGhlIGNvbmZpZyBzY3JpcHRzIGZyb20KLQotICAgIGZ0cDovL2Z0cC5nbnUub3JnL3B1Yi9nbnUvY29uZmlnLwotCi1JZiB0aGUgdmVyc2lvbiB5b3UgcnVuICgkMCkgaXMgYWxyZWFkeSB1cCB0byBkYXRlLCBwbGVhc2UKLXNlbmQgdGhlIGZvbGxvd2luZyBkYXRhIGFuZCBhbnkgaW5mb3JtYXRpb24geW91IHRoaW5rIG1pZ2h0IGJlCi1wZXJ0aW5lbnQgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+IGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIG5lZWRlZAotaW5mb3JtYXRpb24gdG8gaGFuZGxlIHlvdXIgc3lzdGVtLgotCi1jb25maWcuZ3Vlc3MgdGltZXN0YW1wID0gJHRpbWVzdGFtcAotCi11bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLQotL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbGAKLS9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbGAKLQotaG9zdGluZm8gICAgICAgICAgICAgICA9IGAoaG9zdGluZm8pIDI+L2Rldi9udWxsYAotL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgCi0vdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbGAKLS9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGxgCi0vdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbGAKLS91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsYAotCi1VTkFNRV9NQUNISU5FID0gJHtVTkFNRV9NQUNISU5FfQotVU5BTUVfUkVMRUFTRSA9ICR7VU5BTUVfUkVMRUFTRX0KLVVOQU1FX1NZU1RFTSAgPSAke1VOQU1FX1NZU1RFTX0KLVVOQU1FX1ZFUlNJT04gPSAke1VOQU1FX1ZFUlNJT059Ci1FT0YKLQotZXhpdCAxCi0KLSMgTG9jYWwgdmFyaWFibGVzOgotIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCi0jIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKLSMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgotIyB0aW1lLXN0YW1wLWVuZDogIiciCi0jIEVuZDoKZGlmZiAtLWdpdCBhL3Zta2l0L2F1dG9jb25mL2NvbmZpZy5zdWIgYi92bWtpdC9hdXRvY29uZi9jb25maWcuc3ViCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZGI2YjY2Li4wMDAwMDAwCi0tLSBhL3Zta2l0L2F1dG9jb25mL2NvbmZpZy5zdWIKKysrIC9kZXYvbnVsbApAQCAtMSwxNTU1ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIHN1YnJvdXRpbmUgc2NyaXB0LgotIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKLSMgICAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi10aW1lc3RhbXA9JzIwMDQtMDgtMjknCi0KLSMgVGhpcyBmaWxlIGlzIChpbiBwcmluY2lwbGUpIGNvbW1vbiB0byBBTEwgR05VIHNvZnR3YXJlLgotIyBUaGUgcHJlc2VuY2Ugb2YgYSBtYWNoaW5lIGluIHRoaXMgZmlsZSBzdWdnZXN0cyB0aGF0IFNPTUUgR05VIHNvZnR3YXJlCi0jIGNhbiBoYW5kbGUgdGhhdCBtYWNoaW5lLiAgSXQgZG9lcyBub3QgaW1wbHkgQUxMIEdOVSBzb2Z0d2FyZSBjYW4uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSMgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIFBsZWFzZSBzZW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiAgU3VibWl0IGEgY29udGV4dAotIyBkaWZmIGFuZCBhIHByb3Blcmx5IGZvcm1hdHRlZCBDaGFuZ2VMb2cgZW50cnkuCi0jCi0jIENvbmZpZ3VyYXRpb24gc3Vicm91dGluZSB0byB2YWxpZGF0ZSBhbmQgY2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiB0eXBlLgotIyBTdXBwbHkgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIHR5cGUgYXMgYW4gYXJndW1lbnQuCi0jIElmIGl0IGlzIGludmFsaWQsIHdlIHByaW50IGFuIGVycm9yIG1lc3NhZ2Ugb24gc3RkZXJyIGFuZCBleGl0IHdpdGggY29kZSAxLgotIyBPdGhlcndpc2UsIHdlIHByaW50IHRoZSBjYW5vbmljYWwgY29uZmlnIHR5cGUgb24gc3Rkb3V0IGFuZCBzdWNjZWVkLgotCi0jIFRoaXMgZmlsZSBpcyBzdXBwb3NlZCB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIEdOVSBwYWNrYWdlcwotIyBhbmQgcmVjb2duaXplIGFsbCB0aGUgQ1BVIHR5cGVzLCBzeXN0ZW0gdHlwZXMgYW5kIGFsaWFzZXMKLSMgdGhhdCBhcmUgbWVhbmluZ2Z1bCB3aXRoICphbnkqIEdOVSBzb2Z0d2FyZS4KLSMgRWFjaCBwYWNrYWdlIGlzIHJlc3BvbnNpYmxlIGZvciByZXBvcnRpbmcgd2hpY2ggdmFsaWQgY29uZmlndXJhdGlvbnMKLSMgaXQgZG9lcyBub3Qgc3VwcG9ydC4gIFRoZSB1c2VyIHNob3VsZCBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoCi0jIGEgZmFpbHVyZSB0byBzdXBwb3J0IGEgdmFsaWQgY29uZmlndXJhdGlvbiBmcm9tIGEgbWVhbmluZ2xlc3MKLSMgY29uZmlndXJhdGlvbi4KLQotIyBUaGUgZ29hbCBvZiB0aGlzIGZpbGUgaXMgdG8gbWFwIGFsbCB0aGUgdmFyaW91cyB2YXJpYXRpb25zIG9mIGEgZ2l2ZW4KLSMgbWFjaGluZSBzcGVjaWZpY2F0aW9uIGludG8gYSBzaW5nbGUgc3BlY2lmaWNhdGlvbiBpbiB0aGUgZm9ybToKLSMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0KLSMgb3IgaW4gc29tZSBjYXNlcywgdGhlIG5ld2VyIGZvdXItcGFydCBmb3JtOgotIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU0KLSMgSXQgaXMgd3JvbmcgdG8gZWNobyBhbnkgb3RoZXIgdHlwZSBvZiBzcGVjaWZpY2F0aW9uLgotCi1tZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKLQotdXNhZ2U9IlwKLVVzYWdlOiAkMCBbT1BUSU9OXSBDUFUtTUZSLU9QU1lTCi0gICAgICAgJDAgW09QVElPTl0gQUxJQVMKLQotQ2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiBuYW1lLgotCi1PcGVyYXRpb24gbW9kZXM6Ci0gIC1oLCAtLWhlbHAgICAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAotICAtdCwgLS10aW1lLXN0YW1wICAgcHJpbnQgZGF0ZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiwgdGhlbiBleGl0Ci0gIC12LCAtLXZlcnNpb24gICAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0Ci0KLVJlcG9ydCBidWdzIGFuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4iCi0KLXZlcnNpb249IlwKLUdOVSBjb25maWcuc3ViICgkdGltZXN0YW1wKQotCi1Db3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTwotd2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgotCi1oZWxwPSIKLVRyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKLQotIyBQYXJzZSBjb21tYW5kIGxpbmUKLXdoaWxlIHRlc3QgJCMgLWd0IDAgOyBkbwotICBjYXNlICQxIGluCi0gICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKLSAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgMCA7OwotICAgIC0tdmVyc2lvbiB8IC12ICkKLSAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDAgOzsKLSAgICAtLWhlbHAgfCAtLWgqIHwgLWggKQotICAgICAgIGVjaG8gIiR1c2FnZSI7IGV4aXQgMCA7OwotICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZwotICAgICAgIHNoaWZ0OyBicmVhayA7OwotICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KLSAgICAgICBicmVhayA7OwotICAgIC0qICkKLSAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiCi0gICAgICAgZXhpdCAxIDs7Ci0KLSAgICAqbG9jYWwqKQotICAgICAgICMgRmlyc3QgcGFzcyB0aHJvdWdoIGFueSBsb2NhbCBtYWNoaW5lIHR5cGVzLgotICAgICAgIGVjaG8gJDEKLSAgICAgICBleGl0IDA7OwotCi0gICAgKiApCi0gICAgICAgYnJlYWsgOzsKLSAgZXNhYwotZG9uZQotCi1jYXNlICQjIGluCi0gMCkgZWNobyAiJG1lOiBtaXNzaW5nIGFyZ3VtZW50JGhlbHAiID4mMgotICAgIGV4aXQgMTs7Ci0gMSkgOzsKLSAqKSBlY2hvICIkbWU6IHRvbyBtYW55IGFyZ3VtZW50cyRoZWxwIiA+JjIKLSAgICBleGl0IDE7OwotZXNhYwotCi0jIFNlcGFyYXRlIHdoYXQgdGhlIHVzZXIgZ2F2ZSBpbnRvIENQVS1DT01QQU5ZIGFuZCBPUyBvciBLRVJORUwtT1MgKGlmIGFueSkuCi0jIEhlcmUgd2UgbXVzdCByZWNvZ25pemUgYWxsIHRoZSB2YWxpZCBLRVJORUwtT1MgY29tYmluYXRpb25zLgotbWF5YmVfb3M9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wyLydgCi1jYXNlICRtYXliZV9vcyBpbgotICBudG8tcW54KiB8IGxpbnV4LWdudSogfCBsaW51eC1kaWV0bGliYyB8IGxpbnV4LXVjbGliYyogfCB1Y2xpbnV4LXVjbGliYyogfCB1Y2xpbnV4LWdudSogfCBcCi0gIGtmcmVlYnNkKi1nbnUqIHwga25ldGJzZCotZ251KiB8IG5ldGJzZCotZ251KiB8IHN0b3JtLWNoYW9zKiB8IG9zMi1lbXgqIHwgcnRtay1ub3ZhKikKLSAgICBvcz0tJG1heWJlX29zCi0gICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDEvJ2AKLSAgICA7OwotICAqKQotICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvLVteLV0qJC8vJ2AKLSAgICBpZiBbICRiYXNpY19tYWNoaW5lICE9ICQxIF0KLSAgICB0aGVuIG9zPWBlY2hvICQxIHwgc2VkICdzLy4qLS8tLydgCi0gICAgZWxzZSBvcz07IGZpCi0gICAgOzsKLWVzYWMKLQotIyMjIExldCdzIHJlY29nbml6ZSBjb21tb24gbWFjaGluZXMgYXMgbm90IGJlaW5nIG9wZXJhdGluZyBzeXN0ZW1zIHNvCi0jIyMgdGhhdCB0aGluZ3MgbGlrZSBjb25maWcuc3ViIGRlY3N0YXRpb24tMzEwMCB3b3JrLiAgV2UgYWxzbwotIyMjIHJlY29nbml6ZSBzb21lIG1hbnVmYWN0dXJlcnMgYXMgbm90IGJlaW5nIG9wZXJhdGluZyBzeXN0ZW1zLCBzbyB3ZQotIyMjIGNhbiBwcm92aWRlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgYmVsb3cuCi1jYXNlICRvcyBpbgotCS1zdW4qb3MqKQotCQkjIFByZXZlbnQgZm9sbG93aW5nIGNsYXVzZSBmcm9tIGhhbmRsaW5nIHRoaXMgaW52YWxpZCBpbnB1dC4KLQkJOzsKLQktZGVjKiB8IC1taXBzKiB8IC1zZXF1ZW50KiB8IC1lbmNvcmUqIHwgLXBjNTMyKiB8IC1zZ2kqIHwgLXNvbnkqIHwgXAotCS1hdHQqIHwgLTczMDAqIHwgLTMzMDAqIHwgLWRlbHRhKiB8IC1tb3Rvcm9sYSogfCAtc3VuWzIzNF0qIHwgXAotCS11bmljb20qIHwgLWlibSogfCAtbmV4dCB8IC1ocCB8IC1pc2kqIHwgLWFwb2xsbyB8IC1hbHRvcyogfCBcCi0JLWNvbnZlcmdlbnQqIHwgLW5jciogfCAtbmV3cyB8IC0zMiogfCAtMzYwMCogfCAtMzEwMCogfCAtaGl0YWNoaSogfFwKLQktY1sxMjNdKiB8IC1jb252ZXgqIHwgLXN1biB8IC1jcmRzIHwgLW9tcm9uKiB8IC1kZyB8IC11bHRyYSB8IC10dGkqIHwgXAotCS1oYXJyaXMgfCAtZG9scGhpbiB8IC1oaWdobGV2ZWwgfCAtZ291bGQgfCAtY2JtIHwgLW5zIHwgLW1hc3Njb21wIHwgXAotCS1hcHBsZSB8IC1heGlzIHwgLWtudXRoIHwgLWNyYXkpCi0JCW9zPQotCQliYXNpY19tYWNoaW5lPSQxCi0JCTs7Ci0JLXNpbSB8IC1jaXNjbyB8IC1va2kgfCAtd2VjIHwgLXdpbmJvbmQpCi0JCW9zPQotCQliYXNpY19tYWNoaW5lPSQxCi0JCTs7Ci0JLXNjb3V0KQotCQk7OwotCS13cnMpCi0JCW9zPS12eHdvcmtzCi0JCWJhc2ljX21hY2hpbmU9JDEKLQkJOzsKLQktY2hvcnVzb3MqKQotCQlvcz0tY2hvcnVzb3MKLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotIAktY2hvcnVzcmRiKQotIAkJb3M9LWNob3J1c3JkYgotCQliYXNpY19tYWNoaW5lPSQxCi0gCQk7OwotCS1oaXV4KikKLQkJb3M9LWhpdXh3ZTIKLQkJOzsKLQktc2NvNSkKLQkJb3M9LXNjbzMuMnY1Ci0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvNCkKLQkJb3M9LXNjbzMuMnY0Ci0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvMy4yLls0LTldKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3NjbzMuMi4vc2NvMy4ydi8nYAotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbzMuMnZbNC05XSopCi0JCSMgRG9uJ3QgZm9yZ2V0IHZlcnNpb24gaWYgaXQgaXMgMy4ydjQgb3IgbmV3ZXIuCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvKikKLQkJb3M9LXNjbzMuMnYyCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktdWRrKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1pc2MpCi0JCW9zPS1pc2MyLjIKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1jbGl4KikKLQkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWludGVyZ3JhcGgKLQkJOzsKLQktaXNjKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1seW54KikKLQkJb3M9LWx5bnhvcwotCQk7OwotCS1wdHgqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXNlcXVlbnQvJ2AKLQkJOzsKLQktd2luZG93c250KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3dpbmRvd3NudC93aW5udC8nYAotCQk7OwotCS1wc29zKikKLQkJb3M9LXBzb3MKLQkJOzsKLQktbWludCB8IC1taW50WzAtOV0qKQotCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKLQkJb3M9LW1pbnQKLQkJOzsKLWVzYWMKLQotIyBEZWNvZGUgYWxpYXNlcyBmb3IgY2VydGFpbiBDUFUtQ09NUEFOWSBjb21iaW5hdGlvbnMuCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRob3V0IGNvbXBhbnkgbmFtZS4KLQkjIFNvbWUgYXJlIG9taXR0ZWQgaGVyZSBiZWNhdXNlIHRoZXkgaGF2ZSBzcGVjaWFsIG1lYW5pbmdzIGJlbG93LgotCTE3NTBhIHwgNTgwIFwKLQl8IGEyOWsgXAotCXwgYWxwaGEgfCBhbHBoYWV2WzQtOF0gfCBhbHBoYWV2NTYgfCBhbHBoYWV2Nls3OF0gfCBhbHBoYXBjYTVbNjddIFwKLQl8IGFscGhhNjQgfCBhbHBoYTY0ZXZbNC04XSB8IGFscGhhNjRldjU2IHwgYWxwaGE2NGV2Nls3OF0gfCBhbHBoYTY0cGNhNVs2N10gXAotCXwgYW0zM18yLjAgXAotCXwgYXJjIHwgYXJtIHwgYXJtW2JsXWUgfCBhcm1lW2xiXSB8IGFybXZbMjM0NV0gfCBhcm12WzM0NV1bbGJdIHwgYXZyIFwKLQl8IGM0eCB8IGNsaXBwZXIgXAotCXwgZDEwdiB8IGQzMHYgfCBkbHggfCBkc3AxNnh4IFwKLQl8IGZyMzAgfCBmcnYgXAotCXwgaDgzMDAgfCBoODUwMCB8IGhwcGEgfCBocHBhMS5bMDFdIHwgaHBwYTIuMCB8IGhwcGEyLjBbbnddIHwgaHBwYTY0IFwKLQl8IGkzNzAgfCBpODYwIHwgaTk2MCB8IGlhNjQgXAotCXwgaXAyayB8IGlxMjAwMCBcCi0JfCBtMzJyIHwgbTMycmxlIHwgbTY4MDAwIHwgbTY4ayB8IG04OGsgfCBtY29yZSBcCi0JfCBtaXBzIHwgbWlwc2JlIHwgbWlwc2ViIHwgbWlwc2VsIHwgbWlwc2xlIFwKLQl8IG1pcHMxNiBcCi0JfCBtaXBzNjQgfCBtaXBzNjRlbCBcCi0JfCBtaXBzNjR2ciB8IG1pcHM2NHZyZWwgXAotCXwgbWlwczY0b3Jpb24gfCBtaXBzNjRvcmlvbmVsIFwKLQl8IG1pcHM2NHZyNDEwMCB8IG1pcHM2NHZyNDEwMGVsIFwKLQl8IG1pcHM2NHZyNDMwMCB8IG1pcHM2NHZyNDMwMGVsIFwKLQl8IG1pcHM2NHZyNTAwMCB8IG1pcHM2NHZyNTAwMGVsIFwKLQl8IG1pcHNpc2EzMiB8IG1pcHNpc2EzMmVsIFwKLQl8IG1pcHNpc2EzMnIyIHwgbWlwc2lzYTMycjJlbCBcCi0JfCBtaXBzaXNhNjQgfCBtaXBzaXNhNjRlbCBcCi0JfCBtaXBzaXNhNjRyMiB8IG1pcHNpc2E2NHIyZWwgXAotCXwgbWlwc2lzYTY0c2IxIHwgbWlwc2lzYTY0c2IxZWwgXAotCXwgbWlwc2lzYTY0c3I3MWsgfCBtaXBzaXNhNjRzcjcxa2VsIFwKLQl8IG1pcHN0eDM5IHwgbWlwc3R4MzllbCBcCi0JfCBtbjEwMjAwIHwgbW4xMDMwMCBcCi0JfCBtc3A0MzAgXAotCXwgbnMxNmsgfCBuczMyayBcCi0JfCBvcGVucmlzYyB8IG9yMzIgXAotCXwgcGRwMTAgfCBwZHAxMSB8IHBqIHwgcGpsIFwKLQl8IHBvd2VycGMgfCBwb3dlcnBjNjQgfCBwb3dlcnBjNjRsZSB8IHBvd2VycGNsZSB8IHBwY2JlIFwKLQl8IHB5cmFtaWQgXAotCXwgc2ggfCBzaFsxMjM0XSB8IHNoWzIzXWUgfCBzaFszNF1lYiB8IHNoYmUgfCBzaGxlIHwgc2hbMTIzNF1sZSB8IHNoM2VsZSBcCi0JfCBzaDY0IHwgc2g2NGxlIFwKLQl8IHNwYXJjIHwgc3BhcmM2NCB8IHNwYXJjODZ4IHwgc3BhcmNsZXQgfCBzcGFyY2xpdGUgfCBzcGFyY3Y4IHwgc3BhcmN2OSB8IHNwYXJjdjliIFwKLQl8IHN0cm9uZ2FybSBcCi0JfCB0YWhvZSB8IHRodW1iIHwgdGljNHggfCB0aWM4MCB8IHRyb24gXAotCXwgdjg1MCB8IHY4NTBlIFwKLQl8IHdlMzJrIFwKLQl8IHg4NiB8IHhzY2FsZSB8IHhzdG9ybXkxNiB8IHh0ZW5zYSBcCi0JfCB6OGspCi0JCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgotCQk7OwotCW02ODExIHwgbTY4aGMxMSB8IG02ODEyIHwgbTY4aGMxMikKLQkJIyBNb3Rvcm9sYSA2OEhDMTEvMTIuCi0JCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgotCQlvcz0tbm9uZQotCQk7OwotCW04ODExMCB8IG02ODBbMTIzNDZdMCB8IG02ODM/MiB8IG02ODM2MCB8IG01MjAwIHwgdjcwIHwgdzY1IHwgejhrKQotCQk7OwotCi0JIyBXZSB1c2UgYHBjJyByYXRoZXIgdGhhbiBgdW5rbm93bicKLQkjIGJlY2F1c2UgKDEpIHRoYXQncyB3aGF0IHRoZXkgbm9ybWFsbHkgYXJlLCBhbmQKLQkjICgyKSB0aGUgd29yZCAidW5rbm93biIgdGVuZHMgdG8gY29uZnVzZSBiZWdpbm5pbmcgdXNlcnMuCi0JaSo4NiB8IHg4Nl82NCkKLQkgIGJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtcGMKLQkgIDs7Ci0JIyBPYmplY3QgaWYgbW9yZSB0aGFuIG9uZSBjb21wYW55IG5hbWUgd29yZC4KLQkqLSotKikKLQkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCi0JCWV4aXQgMQotCQk7OwotCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aCBjb21wYW55IG5hbWUuCi0JNTgwLSogXAotCXwgYTI5ay0qIFwKLQl8IGFscGhhLSogfCBhbHBoYWV2WzQtOF0tKiB8IGFscGhhZXY1Ni0qIHwgYWxwaGFldjZbNzhdLSogXAotCXwgYWxwaGE2NC0qIHwgYWxwaGE2NGV2WzQtOF0tKiB8IGFscGhhNjRldjU2LSogfCBhbHBoYTY0ZXY2Wzc4XS0qIFwKLQl8IGFscGhhcGNhNVs2N10tKiB8IGFscGhhNjRwY2E1WzY3XS0qIHwgYXJjLSogXAotCXwgYXJtLSogIHwgYXJtYmUtKiB8IGFybWxlLSogfCBhcm1lYi0qIHwgYXJtdiotKiBcCi0JfCBhdnItKiBcCi0JfCBiczIwMDAtKiBcCi0JfCBjWzEyM10qIHwgYzMwLSogfCBbY2p0XTkwLSogfCBjNHgtKiB8IGM1NHgtKiB8IGM1NXgtKiB8IGM2eC0qIFwKLQl8IGNsaXBwZXItKiB8IGNyYXludi0qIHwgY3lkcmEtKiBcCi0JfCBkMTB2LSogfCBkMzB2LSogfCBkbHgtKiBcCi0JfCBlbHhzaS0qIFwKLQl8IGYzMFswMV0tKiB8IGY3MDAtKiB8IGZyMzAtKiB8IGZydi0qIHwgZng4MC0qIFwKLQl8IGg4MzAwLSogfCBoODUwMC0qIFwKLQl8IGhwcGEtKiB8IGhwcGExLlswMV0tKiB8IGhwcGEyLjAtKiB8IGhwcGEyLjBbbnddLSogfCBocHBhNjQtKiBcCi0JfCBpKjg2LSogfCBpODYwLSogfCBpOTYwLSogfCBpYTY0LSogXAotCXwgaXAyay0qIHwgaXEyMDAwLSogXAotCXwgbTMyci0qIHwgbTMycmxlLSogXAotCXwgbTY4MDAwLSogfCBtNjgwWzAxMjM0Nl0wLSogfCBtNjgzNjAtKiB8IG02ODM/Mi0qIHwgbTY4ay0qIFwKLQl8IG04ODExMC0qIHwgbTg4ay0qIHwgbWNvcmUtKiBcCi0JfCBtaXBzLSogfCBtaXBzYmUtKiB8IG1pcHNlYi0qIHwgbWlwc2VsLSogfCBtaXBzbGUtKiBcCi0JfCBtaXBzMTYtKiBcCi0JfCBtaXBzNjQtKiB8IG1pcHM2NGVsLSogXAotCXwgbWlwczY0dnItKiB8IG1pcHM2NHZyZWwtKiBcCi0JfCBtaXBzNjRvcmlvbi0qIHwgbWlwczY0b3Jpb25lbC0qIFwKLQl8IG1pcHM2NHZyNDEwMC0qIHwgbWlwczY0dnI0MTAwZWwtKiBcCi0JfCBtaXBzNjR2cjQzMDAtKiB8IG1pcHM2NHZyNDMwMGVsLSogXAotCXwgbWlwczY0dnI1MDAwLSogfCBtaXBzNjR2cjUwMDBlbC0qIFwKLQl8IG1pcHNpc2EzMi0qIHwgbWlwc2lzYTMyZWwtKiBcCi0JfCBtaXBzaXNhMzJyMi0qIHwgbWlwc2lzYTMycjJlbC0qIFwKLQl8IG1pcHNpc2E2NC0qIHwgbWlwc2lzYTY0ZWwtKiBcCi0JfCBtaXBzaXNhNjRyMi0qIHwgbWlwc2lzYTY0cjJlbC0qIFwKLQl8IG1pcHNpc2E2NHNiMS0qIHwgbWlwc2lzYTY0c2IxZWwtKiBcCi0JfCBtaXBzaXNhNjRzcjcxay0qIHwgbWlwc2lzYTY0c3I3MWtlbC0qIFwKLQl8IG1pcHN0eDM5LSogfCBtaXBzdHgzOWVsLSogXAotCXwgbW1peC0qIFwKLQl8IG1zcDQzMC0qIFwKLQl8IG5vbmUtKiB8IG5wMS0qIHwgbnMxNmstKiB8IG5zMzJrLSogXAotCXwgb3Jpb24tKiBcCi0JfCBwZHAxMC0qIHwgcGRwMTEtKiB8IHBqLSogfCBwamwtKiB8IHBuLSogfCBwb3dlci0qIFwKLQl8IHBvd2VycGMtKiB8IHBvd2VycGM2NC0qIHwgcG93ZXJwYzY0bGUtKiB8IHBvd2VycGNsZS0qIHwgcHBjYmUtKiBcCi0JfCBweXJhbWlkLSogXAotCXwgcm9tcC0qIHwgcnM2MDAwLSogXAotCXwgc2gtKiB8IHNoWzEyMzRdLSogfCBzaFsyM11lLSogfCBzaFszNF1lYi0qIHwgc2hiZS0qIFwKLQl8IHNobGUtKiB8IHNoWzEyMzRdbGUtKiB8IHNoM2VsZS0qIHwgc2g2NC0qIHwgc2g2NGxlLSogXAotCXwgc3BhcmMtKiB8IHNwYXJjNjQtKiB8IHNwYXJjODZ4LSogfCBzcGFyY2xldC0qIHwgc3BhcmNsaXRlLSogXAotCXwgc3BhcmN2OC0qIHwgc3BhcmN2OS0qIHwgc3BhcmN2OWItKiB8IHN0cm9uZ2FybS0qIHwgc3YxLSogfCBzeD8tKiBcCi0JfCB0YWhvZS0qIHwgdGh1bWItKiBcCi0JfCB0aWMzMC0qIHwgdGljNHgtKiB8IHRpYzU0eC0qIHwgdGljNTV4LSogfCB0aWM2eC0qIHwgdGljODAtKiBcCi0JfCB0cm9uLSogXAotCXwgdjg1MC0qIHwgdjg1MGUtKiB8IHZheC0qIFwKLQl8IHdlMzJrLSogXAotCXwgeDg2LSogfCB4ODZfNjQtKiB8IHhwczEwMC0qIHwgeHNjYWxlLSogfCB4c3Rvcm15MTYtKiBcCi0JfCB4dGVuc2EtKiBcCi0JfCB5bXAtKiBcCi0JfCB6OGstKikKLQkJOzsKLQkjIFJlY29nbml6ZSB0aGUgdmFyaW91cyBtYWNoaW5lIG5hbWVzIGFuZCBhbGlhc2VzIHdoaWNoIHN0YW5kCi0JIyBmb3IgYSBDUFUgdHlwZSBhbmQgYSBjb21wYW55IGFuZCBzb21ldGltZXMgZXZlbiBhbiBPUy4KLQkzODZic2QpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS1ic2QKLQkJOzsKLQkzYjEgfCA3MzAwIHwgNzMwMC1hdHQgfCBhdHQtNzMwMCB8IHBjNzMwMCB8IHNhZmFyaSB8IHVuaXhwYykKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtYXR0Ci0JCTs7Ci0JM2IqKQotCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAotCQk7OwotCWEyOWtoaWYpCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotICAgIAlhYmFjdXMpCi0JCWJhc2ljX21hY2hpbmU9YWJhY3VzLXVua25vd24KLQkJOzsKLQlhZG9iZTY4aykKLQkJYmFzaWNfbWFjaGluZT1tNjgwMTAtYWRvYmUKLQkJb3M9LXNjb3V0Ci0JCTs7Ci0JYWxsaWFudCB8IGZ4ODApCi0JCWJhc2ljX21hY2hpbmU9Zng4MC1hbGxpYW50Ci0JCTs7Ci0JYWx0b3MgfCBhbHRvczMwNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hbHRvcwotCQk7OwotCWFtMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstbm9uZQotCQlvcz0tYnNkCi0JCTs7Ci0JYW1kNjQpCi0JCWJhc2ljX21hY2hpbmU9eDg2XzY0LXBjCi0JCTs7Ci0JYW1kNjQtKikKLQkJYmFzaWNfbWFjaGluZT14ODZfNjQtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlhbWRhaGwpCi0JCWJhc2ljX21hY2hpbmU9NTgwLWFtZGFobAotCQlvcz0tc3lzdgotCQk7OwotCWFtaWdhIHwgYW1pZ2EtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KLQkJOzsKLQlhbWlnYW9zIHwgYW1pZ2Fkb3MpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCi0JCW9zPS1hbWlnYW9zCi0JCTs7Ci0JYW1pZ2F1bml4IHwgYW1peCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JYXBvbGxvNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KLQkJb3M9LXN5c3YKLQkJOzsKLQlhcG9sbG82OGJzZCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbwotCQlvcz0tYnNkCi0JCTs7Ci0JYXV4KQotCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKLQkJb3M9LWF1eAotCQk7OwotCWJhbGFuY2UpCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstc2VxdWVudAotCQlvcz0tZHluaXgKLQkJOzsKLQljOTApCi0JCWJhc2ljX21hY2hpbmU9YzkwLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCWNvbnZleC1jMSkKLQkJYmFzaWNfbWFjaGluZT1jMS1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMikKLQkJYmFzaWNfbWFjaGluZT1jMi1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMzIpCi0JCWJhc2ljX21hY2hpbmU9YzMyLWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMzNCkKLQkJYmFzaWNfbWFjaGluZT1jMzQtY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzM4KQotCQliYXNpY19tYWNoaW5lPWMzOC1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNyYXkgfCBqOTApCi0JCWJhc2ljX21hY2hpbmU9ajkwLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCWNyYXludikKLQkJYmFzaWNfbWFjaGluZT1jcmF5bnYtY3JheQotCQlvcz0tdW5pY29zbXAKLQkJOzsKLQljcjE2YykKLQkJYmFzaWNfbWFjaGluZT1jcjE2Yy11bmtub3duCi0JCW9zPS1lbGYKLQkJOzsKLQljcmRzIHwgdW5vcykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWNyZHMKLQkJOzsKLQljcmlzdjMyIHwgY3Jpc3YzMi0qIHwgZXRyYXhmcyopCi0JCWJhc2ljX21hY2hpbmU9Y3Jpc3YzMi1heGlzCi0JCTs7Ci0JY3JpcyB8IGNyaXMtKiB8IGV0cmF4KikKLQkJYmFzaWNfbWFjaGluZT1jcmlzLWF4aXMKLQkJOzsKLQljcngpCi0JCWJhc2ljX21hY2hpbmU9Y3J4LXVua25vd24KLQkJb3M9LWVsZgotCQk7OwotCWRhMzAgfCBkYTMwLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1kYTMwCi0JCTs7Ci0JZGVjc3RhdGlvbiB8IGRlY3N0YXRpb24tMzEwMCB8IHBtYXggfCBwbWF4LSogfCBwbWluIHwgZGVjMzEwMCB8IGRlY3N0YXRuKQotCQliYXNpY19tYWNoaW5lPW1pcHMtZGVjCi0JCTs7Ci0JZGVjc3lzdGVtMTAqIHwgZGVjMTAqKQotCQliYXNpY19tYWNoaW5lPXBkcDEwLWRlYwotCQlvcz0tdG9wczEwCi0JCTs7Ci0JZGVjc3lzdGVtMjAqIHwgZGVjMjAqKQotCQliYXNpY19tYWNoaW5lPXBkcDEwLWRlYwotCQlvcz0tdG9wczIwCi0JCTs7Ci0JZGVsdGEgfCAzMzAwIHwgbW90b3JvbGEtMzMwMCB8IG1vdG9yb2xhLWRlbHRhIFwKLQkgICAgICB8IDMzMDAtbW90b3JvbGEgfCBkZWx0YS1tb3Rvcm9sYSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW1vdG9yb2xhCi0JCTs7Ci0JZGVsdGE4OCkKLQkJYmFzaWNfbWFjaGluZT1tODhrLW1vdG9yb2xhCi0JCW9zPS1zeXN2MwotCQk7OwotCWRweDIwIHwgZHB4MjAtKikKLQkJYmFzaWNfbWFjaGluZT1yczYwMDAtYnVsbAotCQlvcz0tYm9zeAotCQk7OwotCWRweDIqIHwgZHB4MiotYnVsbCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JZWJtb24yOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LWVibW9uCi0JCTs7Ci0JZWx4c2kpCi0JCWJhc2ljX21hY2hpbmU9ZWx4c2ktZWx4c2kKLQkJb3M9LWJzZAotCQk7OwotCWVuY29yZSB8IHVtYXggfCBtbWF4KQotCQliYXNpY19tYWNoaW5lPW5zMzJrLWVuY29yZQotCQk7OwotCWVzMTgwMCB8IE9TRTY4ayB8IG9zZTY4ayB8IG9zZSB8IE9TRSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWVyaWNzc29uCi0JCW9zPS1vc2UKLQkJOzsKLQlmeDI4MDApCi0JCWJhc2ljX21hY2hpbmU9aTg2MC1hbGxpYW50Ci0JCTs7Ci0JZ2VuaXgpCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstbnMKLQkJOzsKLQlnbWljcm8pCi0JCWJhc2ljX21hY2hpbmU9dHJvbi1nbWljcm8KLQkJb3M9LXN5c3YKLQkJOzsKLQlnbzMyKQotCQliYXNpY19tYWNoaW5lPWkzODYtcGMKLQkJb3M9LWdvMzIKLQkJOzsKLQloMzA1MHIqIHwgaGl1eCopCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCi0JCW9zPS1oaXV4d2UyCi0JCTs7Ci0JaDgzMDBobXMpCi0JCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQotCQlvcz0taG1zCi0JCTs7Ci0JaDgzMDB4cmF5KQotCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKLQkJb3M9LXhyYXkKLQkJOzsKLQloODUwMGhtcykKLQkJYmFzaWNfbWFjaGluZT1oODUwMC1oaXRhY2hpCi0JCW9zPS1obXMKLQkJOzsKLQloYXJyaXMpCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JaHAzMDAtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCTs7Ci0JaHAzMDBic2QpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQlvcz0tYnNkCi0JCTs7Ci0JaHAzMDBocHV4KQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJb3M9LWhwdXgKLQkJOzsKLQlocDNrOVswLTldWzAtOV0gfCBocDlbMC05XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKLQkJOzsKLQlocDlrMlswLTldWzAtOV0gfCBocDlrMzFbMC05XSkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtaHAKLQkJOzsKLQlocDlrM1syLTldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQk7OwotCWhwOWs2WzAtOV1bMC05XSB8IGhwNlswLTldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAotCQk7OwotCWhwOWs3WzAtNzldWzAtOV0gfCBocDdbMC03OV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCTs7Ci0JaHA5azc4WzAtOV0gfCBocDc4WzAtOV0pCi0JCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs4WzY3XTEgfCBocDhbNjddMSB8IGhwOWs4MFsyNF0gfCBocDgwWzI0XSB8IGhwOWs4Wzc4XTkgfCBocDhbNzhdOSB8IGhwOWs4OTMgfCBocDg5MykKLQkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCTs7Ci0JaHA5azhbMC05XVsxMzY3OV0gfCBocDhbMC05XVsxMzY3OV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs4WzAtOV1bMC05XSB8IGhwOFswLTldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAotCQk7OwotCWhwcGEtbmV4dCkKLQkJb3M9LW5leHRzdGVwMwotCQk7OwotCWhwcGFvc2YpCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQlvcz0tb3NmCi0JCTs7Ci0JaHBwcm8pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JaTM3MC1pYm0qIHwgaWJtKikKLQkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQotCQk7OwotIyBJJ20gbm90IHN1cmUgd2hhdCAiU3lzdjMyIiBtZWFucy4gIFNob3VsZCB0aGlzIGJlIHN5c3YzLjI/Ci0JaSo4NnYzMikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zeXN2MzIKLQkJOzsKLQlpKjg2djQqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JaSo4NnYpCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc3lzdgotCQk7OwotCWkqODZzb2wyKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKLQkJb3M9LXNvbGFyaXMyCi0JCTs7Ci0JaTM4Nm1hY2gpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1tYWNoCi0JCW9zPS1tYWNoCi0JCTs7Ci0JaTM4Ni12c3RhIHwgdnN0YSkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LXZzdGEKLQkJOzsKLQlpcmlzIHwgaXJpczRkKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc2dpCi0JCWNhc2UgJG9zIGluCi0JCSAgICAtaXJpeCopCi0JCQk7OwotCQkgICAgKikKLQkJCW9zPS1pcml4NAotCQkJOzsKLQkJZXNhYwotCQk7OwotCWlzaTY4IHwgaXNpKQotCQliYXNpY19tYWNoaW5lPW02OGstaXNpCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JbTg4ay1vbXJvbiopCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1vbXJvbgotCQk7OwotCW1hZ251bSB8IG0zMjMwKQotCQliYXNpY19tYWNoaW5lPW1pcHMtbWlwcwotCQlvcz0tc3lzdgotCQk7OwotCW1lcmxpbikKLQkJYmFzaWNfbWFjaGluZT1uczMyay11dGVrCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JbWluZ3czMikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCi0JCW9zPS1taW5ndzMyCi0JCTs7Ci0JbWluaWZyYW1lKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1jb252ZXJnZW50Ci0JCTs7Ci0JKm1pbnQgfCAtbWludFswLTldKiB8ICpNaU5UIHwgKk1pTlRbMC05XSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQotCQlvcz0tbWludAotCQk7OwotCW1pcHMzKi0qKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYAotCQk7OwotCW1pcHMzKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AtdW5rbm93bgotCQk7OwotCW1vbml0b3IpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKLQkJb3M9LWNvZmYKLQkJOzsKLQltb3JwaG9zKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgotCQlvcz0tbW9ycGhvcwotCQk7OwotCW1zZG9zKQotCQliYXNpY19tYWNoaW5lPWkzODYtcGMKLQkJb3M9LW1zZG9zCi0JCTs7Ci0JbXZzKQotCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCi0JCW9zPS1tdnMKLQkJOzsKLQluY3IzMDAwKQotCQliYXNpY19tYWNoaW5lPWk0ODYtbmNyCi0JCW9zPS1zeXN2NAotCQk7OwotCW5ldGJzZDM4NikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LW5ldGJzZAotCQk7OwotCW5ldHdpbmRlcikKLQkJYmFzaWNfbWFjaGluZT1hcm12NGwtcmViZWwKLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JbmV3cyB8IG5ld3M3MDAgfCBuZXdzODAwIHwgbmV3czkwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXNvbnkKLQkJb3M9LW5ld3NvcwotCQk7OwotCW5ld3MxMDAwKQotCQliYXNpY19tYWNoaW5lPW02ODAzMC1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZXdzLTM2MDAgfCByaXNjLW5ld3MpCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZWN2NzApCi0JCWJhc2ljX21hY2hpbmU9djcwLW5lYwotCQlvcz0tc3lzdgotCQk7OwotCW5leHQgfCBtKi1uZXh0ICkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5leHQKLQkJY2FzZSAkb3MgaW4KLQkJICAgIC1uZXh0c3RlcCogKQotCQkJOzsKLQkJICAgIC1uczIqKQotCQkgICAgICBvcz0tbmV4dHN0ZXAyCi0JCQk7OwotCQkgICAgKikKLQkJICAgICAgb3M9LW5leHRzdGVwMwotCQkJOzsKLQkJZXNhYwotCQk7OwotCW5oMzAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhhcnJpcwotCQlvcz0tY3h1eAotCQk7OwotCW5oWzQ1XTAwMCkKLQkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcwotCQlvcz0tY3h1eAotCQk7OwotCW5pbmR5OTYwKQotCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKLQkJb3M9LW5pbmR5Ci0JCTs7Ci0JbW9uOTYwKQotCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKLQkJb3M9LW1vbjk2MAotCQk7OwotCW5vbnN0b3B1eCkKLQkJYmFzaWNfbWFjaGluZT1taXBzLWNvbXBhcQotCQlvcz0tbm9uc3RvcHV4Ci0JCTs7Ci0JbnAxKQotCQliYXNpY19tYWNoaW5lPW5wMS1nb3VsZAotCQk7OwotCW5zci10YW5kZW0pCi0JCWJhc2ljX21hY2hpbmU9bnNyLXRhbmRlbQotCQk7OwotCW9wNTBuLSogfCBvcDYwYy0qKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQlvcjMyIHwgb3IzMi0qKQotCQliYXNpY19tYWNoaW5lPW9yMzItdW5rbm93bgotCQlvcz0tY29mZgotCQk7OwotCW9zNDAwKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGMtaWJtCi0JCW9zPS1vczQwMAotCQk7OwotCU9TRTY4MDAwIHwgb3NlNjgwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWVyaWNzc29uCi0JCW9zPS1vc2UKLQkJOzsKLQlvczY4aykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5vbmUKLQkJb3M9LW9zNjhrCi0JCTs7Ci0JcGEtaGl0YWNoaSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKLQkJb3M9LWhpdXh3ZTIKLQkJOzsKLQlwYXJhZ29uKQotCQliYXNpY19tYWNoaW5lPWk4NjAtaW50ZWwKLQkJb3M9LW9zZgotCQk7OwotCXBiZCkKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy10dGkKLQkJOzsKLQlwYmIpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay10dGkKLQkJOzsKLQlwYzUzMiB8IHBjNTMyLSopCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstcGM1MzIKLQkJOzsKLQlwZW50aXVtIHwgcDUgfCBrNSB8IGs2IHwgbmV4Z2VuIHwgdmlhYzMpCi0JCWJhc2ljX21hY2hpbmU9aTU4Ni1wYwotCQk7OwotCXBlbnRpdW1wcm8gfCBwNiB8IDZ4ODYgfCBhdGhsb24gfCBhdGhsb25fKikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCi0JCTs7Ci0JcGVudGl1bWlpIHwgcGVudGl1bTIgfCBwZW50aXVtaWlpIHwgcGVudGl1bTMpCi0JCWJhc2ljX21hY2hpbmU9aTY4Ni1wYwotCQk7OwotCXBlbnRpdW00KQotCQliYXNpY19tYWNoaW5lPWk3ODYtcGMKLQkJOzsKLQlwZW50aXVtLSogfCBwNS0qIHwgazUtKiB8IGs2LSogfCBuZXhnZW4tKiB8IHZpYWMzLSopCi0JCWJhc2ljX21hY2hpbmU9aTU4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBlbnRpdW1wcm8tKiB8IHA2LSogfCA2eDg2LSogfCBhdGhsb24tKikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcGVudGl1bWlpLSogfCBwZW50aXVtMi0qIHwgcGVudGl1bWlpaS0qIHwgcGVudGl1bTMtKikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcGVudGl1bTQtKikKLQkJYmFzaWNfbWFjaGluZT1pNzg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcG4pCi0JCWJhc2ljX21hY2hpbmU9cG4tZ291bGQKLQkJOzsKLQlwb3dlcikJYmFzaWNfbWFjaGluZT1wb3dlci1pYm0KLQkJOzsKLQlwcGMpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCi0JCTs7Ci0JcHBjLSopCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBwY2xlIHwgcG93ZXJwY2xpdHRsZSB8IHBwYy1sZSB8IHBvd2VycGMtbGl0dGxlKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS11bmtub3duCi0JCTs7Ci0JcHBjbGUtKiB8IHBvd2VycGNsaXR0bGUtKikKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwcGM2NCkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjQtdW5rbm93bgotCQk7OwotCXBwYzY0LSopIGJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcHBjNjRsZSB8IHBvd2VycGM2NGxpdHRsZSB8IHBwYzY0LWxlIHwgcG93ZXJwYzY0LWxpdHRsZSkKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjRsZS11bmtub3duCi0JCTs7Ci0JcHBjNjRsZS0qIHwgcG93ZXJwYzY0bGl0dGxlLSopCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwczIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1pYm0KLQkJOzsKLQlwdzMyKQotCQliYXNpY19tYWNoaW5lPWk1ODYtdW5rbm93bgotCQlvcz0tcHczMgotCQk7OwotCXJvbTY4aykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXJvbTY4awotCQlvcz0tY29mZgotCQk7OwotCXJtWzQ2XTAwKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc2llbWVucwotCQk7OwotCXJ0cGMgfCBydHBjLSopCi0JCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KLQkJOzsKLQlzMzkwIHwgczM5MC0qKQotCQliYXNpY19tYWNoaW5lPXMzOTAtaWJtCi0JCTs7Ci0JczM5MHggfCBzMzkweC0qKQotCQliYXNpY19tYWNoaW5lPXMzOTB4LWlibQotCQk7OwotCXNhMjkyMDApCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotCXNiMSkKLQkJYmFzaWNfbWFjaGluZT1taXBzaXNhNjRzYjEtdW5rbm93bgotCQk7OwotCXNiMWVsKQotCQliYXNpY19tYWNoaW5lPW1pcHNpc2E2NHNiMWVsLXVua25vd24KLQkJOzsKLQlzZWkpCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zZWkKLQkJb3M9LXNlaXV4Ci0JCTs7Ci0Jc2VxdWVudCkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKLQkJOzsKLQlzaCkKLQkJYmFzaWNfbWFjaGluZT1zaC1oaXRhY2hpCi0JCW9zPS1obXMKLQkJOzsKLQlzaDY0KQotCQliYXNpY19tYWNoaW5lPXNoNjQtdW5rbm93bgotCQk7OwotCXNwYXJjbGl0ZS13cnMgfCBzaW1zby13cnMpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmNsaXRlLXdycwotCQlvcz0tdnh3b3JrcwotCQk7OwotCXNwczcpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCi0JCW9zPS1zeXN2MgotCQk7OwotCXNwdXIpCi0JCWJhc2ljX21hY2hpbmU9c3B1ci11bmtub3duCi0JCTs7Ci0Jc3QyMDAwKQotCQliYXNpY19tYWNoaW5lPW02OGstdGFuZGVtCi0JCTs7Ci0Jc3RyYXR1cykKLQkJYmFzaWNfbWFjaGluZT1pODYwLXN0cmF0dXMKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0Jc3VuMikKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCi0JCTs7Ci0Jc3VuMm9zMykKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCi0JCW9zPS1zdW5vczMKLQkJOzsKLQlzdW4yb3M0KQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KLQkJb3M9LXN1bm9zNAotCQk7OwotCXN1bjNvczMpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJb3M9LXN1bm9zMwotCQk7OwotCXN1bjNvczQpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJb3M9LXN1bm9zNAotCQk7OwotCXN1bjRvczMpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zdW5vczMKLQkJOzsKLQlzdW40b3M0KQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQlvcz0tc3Vub3M0Ci0JCTs7Ci0Jc3VuNHNvbDIpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zb2xhcmlzMgotCQk7OwotCXN1bjMgfCBzdW4zLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KLQkJOzsKLQlzdW40KQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQk7OwotCXN1bjM4NiB8IHN1bjM4NmkgfCByb2FkcnVubmVyKQotCQliYXNpY19tYWNoaW5lPWkzODYtc3VuCi0JCTs7Ci0Jc3YxKQotCQliYXNpY19tYWNoaW5lPXN2MS1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQlzeW1tZXRyeSkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKLQkJb3M9LWR5bml4Ci0JCTs7Ci0JdDNlKQotCQliYXNpY19tYWNoaW5lPWFscGhhZXY1LWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCXQ5MCkKLQkJYmFzaWNfbWFjaGluZT10OTAtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JdGljNTR4IHwgYzU0eCopCi0JCWJhc2ljX21hY2hpbmU9dGljNTR4LXVua25vd24KLQkJb3M9LWNvZmYKLQkJOzsKLQl0aWM1NXggfCBjNTV4KikKLQkJYmFzaWNfbWFjaGluZT10aWM1NXgtdW5rbm93bgotCQlvcz0tY29mZgotCQk7OwotCXRpYzZ4IHwgYzZ4KikKLQkJYmFzaWNfbWFjaGluZT10aWM2eC11bmtub3duCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JdHgzOSkKLQkJYmFzaWNfbWFjaGluZT1taXBzdHgzOS11bmtub3duCi0JCTs7Ci0JdHgzOWVsKQotCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5ZWwtdW5rbm93bgotCQk7OwotCXRvYWQxKQotCQliYXNpY19tYWNoaW5lPXBkcDEwLXhrbAotCQlvcz0tdG9wczIwCi0JCTs7Ci0JdG93ZXIgfCB0b3dlci0zMikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5jcgotCQk7OwotCXRwZikKLQkJYmFzaWNfbWFjaGluZT1zMzkweC1pYm0KLQkJb3M9LXRwZgotCQk7OwotCXVkaTI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAotCQlvcz0tdWRpCi0JCTs7Ci0JdWx0cmEzKQotCQliYXNpY19tYWNoaW5lPWEyOWstbnl1Ci0JCW9zPS1zeW0xCi0JCTs7Ci0JdjgxMCB8IG5lY3Y4MTApCi0JCWJhc2ljX21hY2hpbmU9djgxMC1uZWMKLQkJb3M9LW5vbmUKLQkJOzsKLQl2YXh2KQotCQliYXNpY19tYWNoaW5lPXZheC1kZWMKLQkJb3M9LXN5c3YKLQkJOzsKLQl2bXMpCi0JCWJhc2ljX21hY2hpbmU9dmF4LWRlYwotCQlvcz0tdm1zCi0JCTs7Ci0JdnBwKnx2eHx2eC0qKQotCQliYXNpY19tYWNoaW5lPWYzMDEtZnVqaXRzdQotCQk7OwotCXZ4d29ya3M5NjApCi0JCWJhc2ljX21hY2hpbmU9aTk2MC13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQl2eHdvcmtzNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQl2eHdvcmtzMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0JdzY1KikKLQkJYmFzaWNfbWFjaGluZT13NjUtd2RjCi0JCW9zPS1ub25lCi0JCTs7Ci0Jdzg5ay0qKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JeHBzIHwgeHBzMTAwKQotCQliYXNpY19tYWNoaW5lPXhwczEwMC1ob25leXdlbGwKLQkJOzsKLQl5bXApCi0JCWJhc2ljX21hY2hpbmU9eW1wLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCXo4ay0qLWNvZmYpCi0JCWJhc2ljX21hY2hpbmU9ejhrLXVua25vd24KLQkJb3M9LXNpbQotCQk7OwotCW5vbmUpCi0JCWJhc2ljX21hY2hpbmU9bm9uZS1ub25lCi0JCW9zPS1ub25lCi0JCTs7Ci0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgbWFudWZhY3R1cmVyIG9mIGNlcnRhaW4gQ1BVIHR5cGVzLiAgSXQgaXMgaW4KLSMgc29tZSBjYXNlcyB0aGUgb25seSBtYW51ZmFjdHVyZXIsIGluIG90aGVycywgaXQgaXMgdGhlIG1vc3QgcG9wdWxhci4KLQl3ODlrKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAotCQk7OwotCW9wNTBuKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCi0JCTs7Ci0Jb3A2MGMpCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKLQkJOzsKLQlyb21wKQotCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCi0JCTs7Ci0JbW1peCkKLQkJYmFzaWNfbWFjaGluZT1tbWl4LWtudXRoCi0JCTs7Ci0JcnM2MDAwKQotCQliYXNpY19tYWNoaW5lPXJzNjAwMC1pYm0KLQkJOzsKLQl2YXgpCi0JCWJhc2ljX21hY2hpbmU9dmF4LWRlYwotCQk7OwotCXBkcDEwKQotCQkjIHRoZXJlIGFyZSBtYW55IGNsb25lcywgc28gREVDIGlzIG5vdCBhIHNhZmUgYmV0Ci0JCWJhc2ljX21hY2hpbmU9cGRwMTAtdW5rbm93bgotCQk7OwotCXBkcDExKQotCQliYXNpY19tYWNoaW5lPXBkcDExLWRlYwotCQk7OwotCXdlMzJrKQotCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAotCQk7OwotCXNoMyB8IHNoNCB8IHNoWzM0XWViIHwgc2hbMTIzNF1sZSB8IHNoWzIzXWVsZSkKLQkJYmFzaWNfbWFjaGluZT1zaC11bmtub3duCi0JCTs7Ci0Jc2g2NCkKLQkJYmFzaWNfbWFjaGluZT1zaDY0LXVua25vd24KLQkJOzsKLQlzcGFyYyB8IHNwYXJjdjggfCBzcGFyY3Y5IHwgc3BhcmN2OWIpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCTs7Ci0JY3lkcmEpCi0JCWJhc2ljX21hY2hpbmU9Y3lkcmEtY3lkcm9tZQotCQk7OwotCW9yaW9uKQotCQliYXNpY19tYWNoaW5lPW9yaW9uLWhpZ2hsZXZlbAotCQk7OwotCW9yaW9uMTA1KQotCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaGlnaGxldmVsCi0JCTs7Ci0JbWFjIHwgbXB3IHwgbWFjLW1wdykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCi0JCTs7Ci0JcG1hYyB8IHBtYWMtbXB3KQotCQliYXNpY19tYWNoaW5lPXBvd2VycGMtYXBwbGUKLQkJOzsKLQkqLXVua25vd24pCi0JCSMgTWFrZSBzdXJlIHRvIG1hdGNoIGFuIGFscmVhZHktY2Fub25pY2FsaXplZCBtYWNoaW5lIG5hbWUuCi0JCTs7Ci0JKikKLQkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCi0JCWV4aXQgMQotCQk7OwotZXNhYwotCi0jIEhlcmUgd2UgY2Fub25pY2FsaXplIGNlcnRhaW4gYWxpYXNlcyBmb3IgbWFudWZhY3R1cmVycy4KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkqLWRpZ2l0YWwqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2RpZ2l0YWwuKi9kZWMvJ2AKLQkJOzsKLQkqLWNvbW1vZG9yZSopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvY29tbW9kb3JlLiovY2JtLydgCi0JCTs7Ci0JKikKLQkJOzsKLWVzYWMKLQotIyBEZWNvZGUgbWFudWZhY3R1cmVyLXNwZWNpZmljIGFsaWFzZXMgZm9yIGNlcnRhaW4gb3BlcmF0aW5nIHN5c3RlbXMuCi0KLWlmIFsgeCIkb3MiICE9IHgiIiBdCi10aGVuCi1jYXNlICRvcyBpbgotICAgICAgICAjIEZpcnN0IG1hdGNoIHNvbWUgc3lzdGVtIHR5cGUgYWxpYXNlcwotICAgICAgICAjIHRoYXQgbWlnaHQgZ2V0IGNvbmZ1c2VkIHdpdGggdmFsaWQgc3lzdGVtIHR5cGVzLgotCSMgLXNvbGFyaXMqIGlzIGEgYmFzaWMgc3lzdGVtIHR5cGUsIHdpdGggdGhpcyBvbmUgZXhjZXB0aW9uLgotCS1zb2xhcmlzMSB8IC1zb2xhcmlzMS4qKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c29sYXJpczF8c3Vub3M0fCdgCi0JCTs7Ci0JLXNvbGFyaXMpCi0JCW9zPS1zb2xhcmlzMgotCQk7OwotCS1zdnI0KikKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JLXVuaXh3YXJlKikKLQkJb3M9LXN5c3Y0LjJ1dwotCQk7OwotCS1nbnUvbGludXgqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8Z251L2xpbnV4fGxpbnV4LWdudXwnYAotCQk7OwotCSMgRmlyc3QgYWNjZXB0IHRoZSBiYXNpYyBzeXN0ZW0gdHlwZXMuCi0JIyBUaGUgcG9ydGFibGUgc3lzdGVtcyBjb21lcyBmaXJzdC4KLQkjIEVhY2ggYWx0ZXJuYXRpdmUgTVVTVCBFTkQgSU4gQSAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgotCSMgLXN5c3YqIGlzIG5vdCBoZXJlIGJlY2F1c2UgaXQgY29tZXMgbGF0ZXIsIGFmdGVyIHN5c3ZyNC4KLQktZ251KiB8IC1ic2QqIHwgLW1hY2gqIHwgLW1pbml4KiB8IC1nZW5peCogfCAtdWx0cml4KiB8IC1pcml4KiBcCi0JICAgICAgfCAtKnZtcyogfCAtc2NvKiB8IC1lc2l4KiB8IC1pc2MqIHwgLWFpeCogfCAtc3Vub3MgfCAtc3Vub3NbMzRdKlwKLQkgICAgICB8IC1ocHV4KiB8IC11bm9zKiB8IC1vc2YqIHwgLWx1bmEqIHwgLWRndXgqIHwgLXNvbGFyaXMqIHwgLXN5bSogXAotCSAgICAgIHwgLWFtaWdhb3MqIHwgLWFtaWdhZG9zKiB8IC1tc2RvcyogfCAtbmV3c29zKiB8IC11bmljb3MqIHwgLWFvZiogXAotCSAgICAgIHwgLWFvcyogXAotCSAgICAgIHwgLW5pbmR5KiB8IC12eHNpbSogfCAtdnh3b3JrcyogfCAtZWJtb24qIHwgLWhtcyogfCAtbXZzKiBcCi0JICAgICAgfCAtY2xpeCogfCAtcmlzY29zKiB8IC11bmlwbHVzKiB8IC1pcmlzKiB8IC1ydHUqIHwgLXhlbml4KiBcCi0JICAgICAgfCAtaGl1eCogfCAtMzg2YnNkKiB8IC1rbmV0YnNkKiB8IC1taXJic2QqIHwgLW5ldGJzZCogfCAtb3BlbmJzZCogXAotCSAgICAgIHwgLWVra29ic2QqIHwgLWtmcmVlYnNkKiB8IC1mcmVlYnNkKiB8IC1yaXNjaXgqIHwgLWx5bnhvcyogXAotCSAgICAgIHwgLWJvc3gqIHwgLW5leHRzdGVwKiB8IC1jeHV4KiB8IC1hb3V0KiB8IC1lbGYqIHwgLW9hYmkqIFwKLQkgICAgICB8IC1wdHgqIHwgLWNvZmYqIHwgLWVjb2ZmKiB8IC13aW5udCogfCAtZG9tYWluKiB8IC12c3RhKiBcCi0JICAgICAgfCAtdWRpKiB8IC1lYWJpKiB8IC1saXRlcyogfCAtaWVlZSogfCAtZ28zMiogfCAtYXV4KiBcCi0JICAgICAgfCAtY2hvcnVzb3MqIHwgLWNob3J1c3JkYiogXAotCSAgICAgIHwgLWN5Z3dpbiogfCAtcGUqIHwgLXBzb3MqIHwgLW1vc3MqIHwgLXByb2VsZiogfCAtcnRlbXMqIFwKLQkgICAgICB8IC1taW5ndzMyKiB8IC1saW51eC1nbnUqIHwgLWxpbnV4LXVjbGliYyogfCAtdXhwdiogfCAtYmVvcyogfCAtbXBlaXgqIHwgLXVkayogXAotCSAgICAgIHwgLWludGVyaXgqIHwgLXV3aW4qIHwgLW1rcyogfCAtcmhhcHNvZHkqIHwgLWRhcndpbiogfCAtb3BlbmVkKiBcCi0JICAgICAgfCAtb3BlbnN0ZXAqIHwgLW9za2l0KiB8IC1jb25peCogfCAtcHczMiogfCAtbm9uc3RvcHV4KiBcCi0JICAgICAgfCAtc3Rvcm0tY2hhb3MqIHwgLXRvcHMxMCogfCAtdGVuZXgqIHwgLXRvcHMyMCogfCAtaXRzKiBcCi0JICAgICAgfCAtb3MyKiB8IC12b3MqIHwgLXBhbG1vcyogfCAtdWNsaW51eCogfCAtbnVjbGV1cyogXAotCSAgICAgIHwgLW1vcnBob3MqIHwgLXN1cGVydXgqIHwgLXJ0bWsqIHwgLXJ0bWstbm92YSogfCAtd2luZGlzcyogXAotCSAgICAgIHwgLXBvd2VybWF4KiB8IC1kbml4KiB8IC1ueDYgfCAtbng3IHwgLXNlaSogfCAtZHJhZ29uZmx5KikKLQkjIFJlbWVtYmVyLCBlYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCi0JCTs7Ci0JLXFueCopCi0JCWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkJICAgIHg4Ni0qIHwgaSo4Ni0qKQotCQkJOzsKLQkJICAgICopCi0JCQlvcz0tbnRvJG9zCi0JCQk7OwotCQllc2FjCi0JCTs7Ci0JLW50by1xbngqKQotCQk7OwotCS1udG8qKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bnRvfG50by1xbnh8J2AKLQkJOzsKLQktc2ltIHwgLWVzMTgwMCogfCAtaG1zKiB8IC14cmF5IHwgLW9zNjhrKiB8IC1ub25lKiB8IC12ODhyKiBcCi0JICAgICAgfCAtd2luZG93cyogfCAtb3N4IHwgLWFidWcgfCAtbmV0d2FyZSogfCAtb3M5KiB8IC1iZW9zKiBcCi0JICAgICAgfCAtbWFjb3MqIHwgLW1wdyogfCAtbWFnaWMqIHwgLW1taXh3YXJlKiB8IC1tb245NjAqIHwgLWxuZXdzKikKLQkJOzsKLQktbWFjKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG1hY3xtYWNvc3wnYAotCQk7OwotCS1saW51eC1kaWV0bGliYykKLQkJb3M9LWxpbnV4LWRpZXRsaWJjCi0JCTs7Ci0JLWxpbnV4KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGxpbnV4fGxpbnV4LWdudXwnYAotCQk7OwotCS1zdW5vczUqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M1fHNvbGFyaXMyfCdgCi0JCTs7Ci0JLXN1bm9zNiopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczZ8c29sYXJpczN8J2AKLQkJOzsKLQktb3BlbmVkKikKLQkJb3M9LW9wZW5lZGl0aW9uCi0JCTs7Ci0gICAgICAgIC1vczQwMCopCi0JCW9zPS1vczQwMAotCQk7OwotCS13aW5jZSopCi0JCW9zPS13aW5jZQotCQk7OwotCS1vc2Zyb3NlKikKLQkJb3M9LW9zZnJvc2UKLQkJOzsKLQktb3NmKikKLQkJb3M9LW9zZgotCQk7OwotCS11dGVrKikKLQkJb3M9LWJzZAotCQk7OwotCS1keW5peCopCi0JCW9zPS1ic2QKLQkJOzsKLQktYWNpcyopCi0JCW9zPS1hb3MKLQkJOzsKLQktYXRoZW9zKikKLQkJb3M9LWF0aGVvcwotCQk7OwotCS1zeWxsYWJsZSopCi0JCW9zPS1zeWxsYWJsZQotCQk7OwotCS0zODZic2QpCi0JCW9zPS1ic2QKLQkJOzsKLQktY3RpeCogfCAtdXRzKikKLQkJb3M9LXN5c3YKLQkJOzsKLQktbm92YSopCi0JCW9zPS1ydG1rLW5vdmEKLQkJOzsKLQktbnMyICkKLQkJb3M9LW5leHRzdGVwMgotCQk7OwotCS1uc2sqKQotCQlvcz0tbnNrCi0JCTs7Ci0JIyBQcmVzZXJ2ZSB0aGUgdmVyc2lvbiBudW1iZXIgb2Ygc2luaXg1LgotCS1zaW5peDUuKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNpbml4fHN5c3Z8J2AKLQkJOzsKLQktc2luaXgqKQotCQlvcz0tc3lzdjQKLQkJOzsKLSAgICAgICAgLXRwZiopCi0JCW9zPS10cGYKLQkJOzsKLQktdHJpdG9uKikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JLW9zcyopCi0JCW9zPS1zeXN2MwotCQk7OwotCS1zdnI0KQotCQlvcz0tc3lzdjQKLQkJOzsKLQktc3ZyMykKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JLXN5c3ZyNCkKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JIyBUaGlzIG11c3QgY29tZSBhZnRlciAtc3lzdnI0LgotCS1zeXN2KikKLQkJOzsKLQktb3NlKikKLQkJb3M9LW9zZQotCQk7OwotCS1lczE4MDAqKQotCQlvcz0tb3NlCi0JCTs7Ci0JLXhlbml4KQotCQlvcz0teGVuaXgKLQkJOzsKLQktKm1pbnQgfCAtbWludFswLTldKiB8IC0qTWlOVCB8IC1NaU5UWzAtOV0qKQotCQlvcz0tbWludAotCQk7OwotCS1hcm9zKikKLQkJb3M9LWFyb3MKLQkJOzsKLQkta2FvcyopCi0JCW9zPS1rYW9zCi0JCTs7Ci0JLW5vbmUpCi0JCTs7Ci0JKikKLQkJIyBHZXQgcmlkIG9mIHRoZSBgLScgYXQgdGhlIGJlZ2lubmluZyBvZiAkb3MuCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAncy9bXi1dKi0vLydgCi0JCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogc3lzdGVtIFxgJG9zXCcgbm90IHJlY29nbml6ZWQgMT4mMgotCQlleGl0IDEKLQkJOzsKLWVzYWMKLWVsc2UKLQotIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyB0aGF0IGNvbWUgd2l0aCB2YXJpb3VzIG1hY2hpbmVzLgotIyBUaGUgdmFsdWUgc2hvdWxkIGJlIHdoYXQgdGhlIHZlbmRvciBjdXJyZW50bHkgc2hpcHMgb3V0IHRoZSBkb29yIHdpdGggdGhlaXIKLSMgbWFjaGluZSBvciBwdXQgYW5vdGhlciB3YXksIHRoZSBtb3N0IHBvcHVsYXIgb3MgcHJvdmlkZWQgd2l0aCB0aGUgbWFjaGluZS4KLQotIyBOb3RlIHRoYXQgaWYgeW91J3JlIGdvaW5nIHRvIHRyeSB0byBtYXRjaCAiLU1BTlVGQUNUVVJFUiIgaGVyZSAoc2F5LAotIyAiLXN1biIpLCB0aGVuIHlvdSBoYXZlIHRvIHRlbGwgdGhlIGNhc2Ugc3RhdGVtZW50IHVwIHRvd2FyZHMgdGhlIHRvcAotIyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcgc3lzdGVtLiAgT3RoZXJ3aXNlLCBjb2RlIGFib3ZlCi0jIHdpbGwgc2lnbmFsIGFuIGVycm9yIHNheWluZyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcKLSMgc3lzdGVtLCBhbmQgd2UnbGwgbmV2ZXIgZ2V0IHRvIHRoaXMgcG9pbnQuCi0KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkqLWFjb3JuKQotCQlvcz0tcmlzY2l4MS4yCi0JCTs7Ci0JYXJtKi1yZWJlbCkKLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JYXJtKi1zZW1pKQotCQlvcz0tYW91dAotCQk7OwotICAgIGM0eC0qIHwgdGljNHgtKikKLSAgICAgICAgb3M9LWNvZmYKLSAgICAgICAgOzsKLQkjIFRoaXMgbXVzdCBjb21lIGJlZm9yZSB0aGUgKi1kZWMgZW50cnkuCi0JcGRwMTAtKikKLQkJb3M9LXRvcHMyMAotCQk7OwotCXBkcDExLSopCi0JCW9zPS1ub25lCi0JCTs7Ci0JKi1kZWMgfCB2YXgtKikKLQkJb3M9LXVsdHJpeDQuMgotCQk7OwotCW02OCotYXBvbGxvKQotCQlvcz0tZG9tYWluCi0JCTs7Ci0JaTM4Ni1zdW4pCi0JCW9zPS1zdW5vczQuMC4yCi0JCTs7Ci0JbTY4MDAwLXN1bikKLQkJb3M9LXN1bm9zMwotCQkjIFRoaXMgYWxzbyBleGlzdHMgaW4gdGhlIGNvbmZpZ3VyZSBwcm9ncmFtLCBidXQgd2FzIG5vdCB0aGUKLQkJIyBkZWZhdWx0LgotCQkjIG9zPS1zdW5vczQKLQkJOzsKLQltNjgqLWNpc2NvKQotCQlvcz0tYW91dAotCQk7OwotCW1pcHMqLWNpc2NvKQotCQlvcz0tZWxmCi0JCTs7Ci0JbWlwcyotKikKLQkJb3M9LWVsZgotCQk7OwotCW9yMzItKikKLQkJb3M9LWNvZmYKLQkJOzsKLQkqLXR0aSkJIyBtdXN0IGJlIGJlZm9yZSBzcGFyYyBlbnRyeSBvciB3ZSBnZXQgdGhlIHdyb25nIG9zLgotCQlvcz0tc3lzdjMKLQkJOzsKLQlzcGFyYy0qIHwgKi1zdW4pCi0JCW9zPS1zdW5vczQuMS4xCi0JCTs7Ci0JKi1iZSkKLQkJb3M9LWJlb3MKLQkJOzsKLQkqLWlibSkKLQkJb3M9LWFpeAotCQk7OwotICAgIAkqLWtudXRoKQotCQlvcz0tbW1peHdhcmUKLQkJOzsKLQkqLXdlYykKLQkJb3M9LXByb2VsZgotCQk7OwotCSotd2luYm9uZCkKLQkJb3M9LXByb2VsZgotCQk7OwotCSotb2tpKQotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JKi1ocCkKLQkJb3M9LWhwdXgKLQkJOzsKLQkqLWhpdGFjaGkpCi0JCW9zPS1oaXV4Ci0JCTs7Ci0JaTg2MC0qIHwgKi1hdHQgfCAqLW5jciB8ICotYWx0b3MgfCAqLW1vdG9yb2xhIHwgKi1jb252ZXJnZW50KQotCQlvcz0tc3lzdgotCQk7OwotCSotY2JtKQotCQlvcz0tYW1pZ2FvcwotCQk7OwotCSotZGcpCi0JCW9zPS1kZ3V4Ci0JCTs7Ci0JKi1kb2xwaGluKQotCQlvcz0tc3lzdjMKLQkJOzsKLQltNjhrLWNjdXIpCi0JCW9zPS1ydHUKLQkJOzsKLQltODhrLW9tcm9uKikKLQkJb3M9LWx1bmEKLQkJOzsKLQkqLW5leHQgKQotCQlvcz0tbmV4dHN0ZXAKLQkJOzsKLQkqLXNlcXVlbnQpCi0JCW9zPS1wdHgKLQkJOzsKLQkqLWNyZHMpCi0JCW9zPS11bm9zCi0JCTs7Ci0JKi1ucykKLQkJb3M9LWdlbml4Ci0JCTs7Ci0JaTM3MC0qKQotCQlvcz0tbXZzCi0JCTs7Ci0JKi1uZXh0KQotCQlvcz0tbmV4dHN0ZXAzCi0JCTs7Ci0JKi1nb3VsZCkKLQkJb3M9LXN5c3YKLQkJOzsKLQkqLWhpZ2hsZXZlbCkKLQkJb3M9LWJzZAotCQk7OwotCSotZW5jb3JlKQotCQlvcz0tYnNkCi0JCTs7Ci0JKi1zZ2kpCi0JCW9zPS1pcml4Ci0JCTs7Ci0JKi1zaWVtZW5zKQotCQlvcz0tc3lzdjQKLQkJOzsKLQkqLW1hc3Njb21wKQotCQlvcz0tcnR1Ci0JCTs7Ci0JZjMwWzAxXS1mdWppdHN1IHwgZjcwMC1mdWppdHN1KQotCQlvcz0tdXhwdgotCQk7OwotCSotcm9tNjhrKQotCQlvcz0tY29mZgotCQk7OwotCSotKmJ1ZykKLQkJb3M9LWNvZmYKLQkJOzsKLQkqLWFwcGxlKQotCQlvcz0tbWFjb3MKLQkJOzsKLQkqLWF0YXJpKikKLQkJb3M9LW1pbnQKLQkJOzsKLQkqKQotCQlvcz0tbm9uZQotCQk7OwotZXNhYwotZmkKLQotIyBIZXJlIHdlIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBrbm93IHRoZSBvcywgYW5kIHRoZSBDUFUgdHlwZSwgYnV0IG5vdCB0aGUKLSMgbWFudWZhY3R1cmVyLiAgV2UgcGljayB0aGUgbG9naWNhbCBtYW51ZmFjdHVyZXIuCi12ZW5kb3I9dW5rbm93bgotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSotdW5rbm93bikKLQkJY2FzZSAkb3MgaW4KLQkJCS1yaXNjaXgqKQotCQkJCXZlbmRvcj1hY29ybgotCQkJCTs7Ci0JCQktc3Vub3MqKQotCQkJCXZlbmRvcj1zdW4KLQkJCQk7OwotCQkJLWFpeCopCi0JCQkJdmVuZG9yPWlibQotCQkJCTs7Ci0JCQktYmVvcyopCi0JCQkJdmVuZG9yPWJlCi0JCQkJOzsKLQkJCS1ocHV4KikKLQkJCQl2ZW5kb3I9aHAKLQkJCQk7OwotCQkJLW1wZWl4KikKLQkJCQl2ZW5kb3I9aHAKLQkJCQk7OwotCQkJLWhpdXgqKQotCQkJCXZlbmRvcj1oaXRhY2hpCi0JCQkJOzsKLQkJCS11bm9zKikKLQkJCQl2ZW5kb3I9Y3JkcwotCQkJCTs7Ci0JCQktZGd1eCopCi0JCQkJdmVuZG9yPWRnCi0JCQkJOzsKLQkJCS1sdW5hKikKLQkJCQl2ZW5kb3I9b21yb24KLQkJCQk7OwotCQkJLWdlbml4KikKLQkJCQl2ZW5kb3I9bnMKLQkJCQk7OwotCQkJLW12cyogfCAtb3BlbmVkKikKLQkJCQl2ZW5kb3I9aWJtCi0JCQkJOzsKLQkJCS1vczQwMCopCi0JCQkJdmVuZG9yPWlibQotCQkJCTs7Ci0JCQktcHR4KikKLQkJCQl2ZW5kb3I9c2VxdWVudAotCQkJCTs7Ci0JCQktdHBmKikKLQkJCQl2ZW5kb3I9aWJtCi0JCQkJOzsKLQkJCS12eHNpbSogfCAtdnh3b3JrcyogfCAtd2luZGlzcyopCi0JCQkJdmVuZG9yPXdycwotCQkJCTs7Ci0JCQktYXV4KikKLQkJCQl2ZW5kb3I9YXBwbGUKLQkJCQk7OwotCQkJLWhtcyopCi0JCQkJdmVuZG9yPWhpdGFjaGkKLQkJCQk7OwotCQkJLW1wdyogfCAtbWFjb3MqKQotCQkJCXZlbmRvcj1hcHBsZQotCQkJCTs7Ci0JCQktKm1pbnQgfCAtbWludFswLTldKiB8IC0qTWlOVCB8IC1NaU5UWzAtOV0qKQotCQkJCXZlbmRvcj1hdGFyaQotCQkJCTs7Ci0JCQktdm9zKikKLQkJCQl2ZW5kb3I9c3RyYXR1cwotCQkJCTs7Ci0JCWVzYWMKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAicy91bmtub3duLyR2ZW5kb3IvImAKLQkJOzsKLWVzYWMKLQotZWNobyAkYmFzaWNfbWFjaGluZSRvcwotZXhpdCAwCi0KLSMgTG9jYWwgdmFyaWFibGVzOgotIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCi0jIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKLSMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgotIyB0aW1lLXN0YW1wLWVuZDogIiciCi0jIEVuZDoKZGlmZiAtLWdpdCBhL3Zta2l0L2F1dG9jb25mL2NvbmZpZ3VyZS5hYyBiL3Zta2l0L2F1dG9jb25mL2NvbmZpZ3VyZS5hYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmViMmJlYy4uMDAwMDAwMAotLS0gYS92bWtpdC9hdXRvY29uZi9jb25maWd1cmUuYWMKKysrIC9kZXYvbnVsbApAQCAtMSw2MzUgKzAsMCBAQAotZG5sID09PSBjb25maWd1cmUuYWMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KLWRubCAgICAgICAgICAgICAgICAgICAgIFRoZSB2bWtpdCBwcm9qZWN0Ci1kbmwKLWRubCBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLWRubCBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi1kbmwKLWRubD09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ci1kbmwgVGhpcyBpcyB0aGUgVk1LaXQgY29uZmlndXJhdGlvbiBzY3JpcHQuIEl0IGlzIHByb2Nlc3NlZCBieSB0aGUgYXV0b2NvbmYKLWRubCBwcm9ncmFtIHRvIHByb2R1Y2UgYSBzY3JpcHQgbmFtZWQgY29uZmlndXJlLiBUaGlzIHNjcmlwdCBjb250YWlucyB0aGUKLWRubCBjb25maWd1cmF0aW9uIGNoZWNrcyB0aGF0IFZNS2l0IG5lZWRzIGluIG9yZGVyIHRvIHN1cHBvcnQgbXVsdGlwbGUgcGxhdGZvcm1zLgotZG5sIFRoaXMgZmlsZSBpcyBjb21wb3NlZCBvZiAxMCBzZWN0aW9ucyBwZXIgdGhlIHJlY29tbWVuZGVkIG9yZ2FuaXphdGlvbiBvZgotZG5sIGF1dG9jb25mIGlucHV0IGRlZmluZWQgaW4gdGhlIGF1dG9jb25mIGRvY3VtZW50YXRpb24uIEFzIHRoaXMgZmlsZSBldm9sdmVzLAotZG5sIHBsZWFzZSBrZWVwIHRoZSB2YXJpb3VzIHR5cGVzIG9mIGNoZWNrcyB3aXRoaW4gdGhlaXIgc2VjdGlvbnMuIFRoZSBzZWN0aW9ucwotZG5sIGFyZSBhcyBmb2xsb3dzOgotZG5sCi1kbmwgU0VDVElPTiAxOiBJbml0aWFsaXphdGlvbiAmIFNldHVwCi1kbmwgU0VDVElPTiAyOiBBcmNoaXRlY3R1cmUsIHRhcmdldCwgYW5kIGhvc3QgY2hlY2tzCi1kbmwgU0VDVElPTiAzOiBDb21tYW5kIGxpbmUgYXJndW1lbnRzIGZvciB0aGUgY29uZmlndXJlIHNjcmlwdC4KLWRubCBTRUNUSU9OIDQ6IENoZWNrIGZvciBwcm9ncmFtcyB3ZSBuZWVkIGFuZCB0aGF0IHRoZXkgYXJlIHRoZSByaWdodCB2ZXJzaW9uCi1kbmwgU0VDVElPTiA1OiBDaGVjayBmb3IgbGlicmFyaWVzCi1kbmwgU0VDVElPTiA2OiBDaGVjayBmb3IgaGVhZGVyIGZpbGVzCi1kbmwgU0VDVElPTiA3OiBDaGVjayBmb3IgdHlwZXMgYW5kIHN0cnVjdHVyZXMKLWRubCBTRUNUSU9OIDg6IENoZWNrIGZvciBzcGVjaWZpYyBmdW5jdGlvbnMgbmVlZGVkCi1kbmwgU0VDVElPTiA5OiBBZGRpdGlvbmFsIGNoZWNrcywgdmFyaWFibGVzLCBldGMuCi1kbmwgU0VDVElPTiAxMDogU3BlY2lmeSB0aGUgb3V0cHV0IGZpbGVzIGFuZCBnZW5lcmF0ZSBpdAotZG5sCi1kbmw9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQotZG5sPT09Ci1kbmw9PT0gU0VDVElPTiAxOiBJbml0aWFsaXphdGlvbiAmIFNldHVwCi1kbmw9PT0KLWRubD09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ci1kbmwgSW5pdGlhbGl6ZSBhdXRvY29uZiBhbmQgZGVmaW5lIHRoZSBwYWNrYWdlIG5hbWUsIHZlcnNpb24gbnVtYmVyIGFuZAotZG5sIGVtYWlsIGFkZHJlc3MgZm9yIHJlcG9ydGluZyBidWdzLgotQUNfSU5JVChbdm1raXRdLFswLjI5c3ZuXSxbbmljb2xhcy5nZW9mZnJheUBnbWFpbC5jb21dKQotCi1kbmwgUHJvdmlkZSBhIGNvcHlyaWdodCBzdWJzdGl0dXRpb24gYW5kIGVuc3VyZSB0aGUgY29weXJpZ2h0IG5vdGljZSBpcyBpbmNsdWRlZAotZG5sIGluIHRoZSBvdXRwdXQgb2YgLS12ZXJzaW9uIG9wdGlvbiBvZiB0aGUgZ2VuZXJhdGVkIGNvbmZpZ3VyZSBzY3JpcHQuCi1BQ19TVUJTVChWTUtJVF9DT1BZUklHSFQsWyJDb3B5cmlnaHQgKGMpIDIwMDMtMjAxMCBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZS4iXSkKLUFDX0NPUFlSSUdIVChbQ29weXJpZ2h0IChjKSAyMDAzLTIwMTAgVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUuXSkKLQotZG5sIEluZGljYXRlIHRoYXQgd2UgcmVxdWlyZSBhdXRvY29uZiAyLjU5IG9yIGxhdGVyLiBUaHMgaXMgbmVlZGVkIGJlY2F1c2Ugd2UKLWRubCB1c2Ugc29tZSBhdXRvY29uZiBtYWNyb3Mgb25seSBhdmFpbGFibGUgaW4gMi41OS4KLUFDX1BSRVJFUSgyLjU5KQotCi1kbmwgVmVyaWZ5IHRoYXQgdGhlIHNvdXJjZSBkaXJlY3RvcnkgaXMgdmFsaWQuIFRoaXMgbWFrZXMgc3VyZSB0aGF0IHdlIGFyZQotZG5sIGNvbmZpZ3VyaW5nIFZNS2l0IGFuZCBub3Qgc29tZSBvdGhlciBwYWNrYWdlIChpdCB2YWxpZGF0ZXMgLS1zcmNkaXIgYXJndW1lbnQpCi1BQ19DT05GSUdfU1JDRElSKFtsaWIvTXZtL1J1bnRpbWUvT2JqZWN0LmNwcF0pCi0KLQotZG5sIFF1aXQgaWYgdGhlIHNvdXJjZSBkaXJlY3RvcnkgaGFzIGFscmVhZHkgYmVlbiBjb25maWd1cmVkLgotZG5sIE5PVEU6IFRoaXMgcmVsaWVzIHVwb24gdW5kb2N1bWVudGVkIGF1dG9jb25mIGJlaGF2aW9yLgotaWYgdGVzdCAke3NyY2Rpcn0gIT0gIi4iIDsgdGhlbgotICBpZiB0ZXN0IC1mICR7c3JjZGlyfS9pbmNsdWRlL212bS9Db25maWcvY29uZmlnLmggOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFtBbHJlYWR5IGNvbmZpZ3VyZWQgaW4gJHtzcmNkaXJ9XSkKLSAgZmkKLWZpCi0KLWRubCBQbGFjZSBhbGwgb2YgdGhlIGV4dHJhIGF1dG9jb25mIGZpbGVzIGludG8gdGhlIGNvbmZpZyBzdWJkaXJlY3RvcnkuIFRlbGwKLWRubCB2YXJpb3VzIHRvb2xzIHdoZXJlIHRoZSBtNCBhdXRvY29uZiBtYWNyb3MgYXJlLgotQUNfQ09ORklHX0FVWF9ESVIoWyRMTFZNX1NSQ19ST09UL2F1dG9jb25mXSkKLQotZG5sIFRlbGwgYXV0b2NvbmYgdGhhdCB0aGlzIGlzIGFuIExMVk0gcHJvamVjdCBiZWluZyBjb25maWd1cmVkCi1kbmwgVGhpcyBwcm92aWRlcyB0aGUgLS13aXRoLWxsdm1zcmMgYW5kIC0td2l0aC1sbHZtb2JqIG9wdGlvbnMKLUxMVk1fQ09ORklHX1BST0pFQ1QoJExMVk1fU1JDX1JPT1QsJExMVk1fT0JKX1JPT1QpCi0KLQotZG5sPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KLWRubD09PQotZG5sPT09IFNFQ1RJT04gMjogQXJjaGl0ZWN0dXJlLCB0YXJnZXQsIGFuZCBob3N0IGNoZWNrcwotZG5sPT09Ci1kbmw9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQotCi1kbmwgQ2hlY2sgdGhlIHRhcmdldCBmb3Igd2hpY2ggd2UncmUgY29tcGlsaW5nIGFuZCB0aGUgaG9zdCB0aGF0IHdpbGwgZG8gdGhlCi1kbmwgY29tcGlsYXRpb25zLiBUaGlzIHdpbGwgdGVsbCB1cyB3aGljaCBMTFZNIGNvbXBpbGVyIHdpbGwgYmUgdXNlZCBmb3IKLWRubCBjb21waWxpbmcgU1NBIGludG8gb2JqZWN0IGNvZGUuIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBlYXJseSBiZWNhdXNlCi1kbmwgZm9sbG93aW5nIHRlc3RzIGRlcGVuZCBvbiBpdC4KLUFDX0NBTk9OSUNBTF9UQVJHRVQKLQotZG5sIERldGVybWluZSB0aGUgcGxhdGZvcm0gdHlwZSBhbmQgY2FjaGUgaXRzIHZhbHVlLiBUaGlzIGhlbHBzIHVzIGNvbmZpZ3VyZQotZG5sIHRoZSBTeXN0ZW0gbGlicmFyeSB0byB0aGUgY29ycmVjdCBidWlsZCBwbGF0Zm9ybS4KLUFDX0NBQ0hFX0NIRUNLKFt0eXBlIG9mIG9wZXJhdGluZyBzeXN0ZW0gd2UncmUgZ29pbmcgdG8gaG9zdCBvbl0sCi0gICAgICAgICAgICAgICBbdm1raXRfY3Zfb3NfdHlwZV0sCi1bY2FzZSAkaG9zdCBpbgotICAqLSotYWl4KikKLSAgICBBQ19NU0dfRVJST1IoW0dvb2QgbHVjayBwb3J0aW5nIHZta2l0IHRvIHlvdXIgaG9zdCFdKQotICAgIHZta2l0X2N2X29zX3R5cGU9IkFJWCIKLSAgICB2bWtpdF9jdl9wbGF0Zm9ybV90eXBlPSJVbml4IiA7OwotICAqLSotaXJpeCopCi0gICAgQUNfTVNHX0VSUk9SKFtHb29kIGx1Y2sgcG9ydGluZyB2bWtpdCB0byB5b3VyIGhvc3QhXSkKLSAgICB2bWtpdF9jdl9vc190eXBlPSJJUklYIgotICAgIHZta2l0X2N2X3BsYXRmb3JtX3R5cGU9IlVuaXgiIDs7Ci0gICotKi1jeWd3aW4qKQotICAgIEFDX01TR19FUlJPUihbR29vZCBsdWNrIHBvcnRpbmcgdm1raXQgdG8geW91ciBob3N0IV0pCi0gICAgdm1raXRfY3Zfb3NfdHlwZT0iQ3lnd2luIgotICAgIHZta2l0X2N2X3BsYXRmb3JtX3R5cGU9IlVuaXgiIDs7Ci0gICotKi1kYXJ3aW4qKQotICAgIERZTElCX0VYVEVOU0lPTj0iZHlsaWIiCi0gICAgdm1raXRfY3Zfb3NfdHlwZT0iRGFyd2luIgotICAgIHZta2l0X2N2X3BsYXRmb3JtX3R5cGU9IlVuaXgiIDs7Ci0gICotKi1mcmVlYnNkKikKLSAgICBBQ19NU0dfRVJST1IoW0dvb2QgbHVjayBwb3J0aW5nIHZta2l0IHRvIHlvdXIgaG9zdCFdKQotICAgIHZta2l0X2N2X29zX3R5cGU9IkZyZWVCU0QiCi0gICAgdm1raXRfY3ZfcGxhdGZvcm1fdHlwZT0iVW5peCIgOzsKLSAgKi0qLW9wZW5ic2QqKQotICAgIEFDX01TR19FUlJPUihbR29vZCBsdWNrIHBvcnRpbmcgdm1raXQgdG8geW91ciBob3N0IV0pCi0gICAgdm1raXRfY3Zfb3NfdHlwZT0iT3BlbkJTRCIKLSAgICB2bWtpdF9jdl9wbGF0Zm9ybV90eXBlPSJVbml4IiA7OwotICAqLSotbmV0YnNkKikKLSAgICBBQ19NU0dfRVJST1IoW0dvb2QgbHVjayBwb3J0aW5nIHZta2l0IHRvIHlvdXIgaG9zdCFdKQotICAgIHZta2l0X2N2X29zX3R5cGU9Ik5ldEJTRCIKLSAgICB2bWtpdF9jdl9wbGF0Zm9ybV90eXBlPSJVbml4IiA7OwotICAqLSotaHB1eCopCi0gICAgQUNfTVNHX0VSUk9SKFtHb29kIGx1Y2sgcG9ydGluZyB2bWtpdCB0byB5b3VyIGhvc3QhXSkKLSAgICB2bWtpdF9jdl9vc190eXBlPSJIUC1VWCIKLSAgICB2bWtpdF9jdl9wbGF0Zm9ybV90eXBlPSJVbml4IiA7OwotICAqLSotaW50ZXJpeCopCi0gICAgQUNfTVNHX0VSUk9SKFtHb29kIGx1Y2sgcG9ydGluZyB2bWtpdCB0byB5b3VyIGhvc3QhXSkKLSAgICB2bWtpdF9jdl9vc190eXBlPSJJbnRlcml4IgotICAgIHZta2l0X2N2X3BsYXRmb3JtX3R5cGU9IlVuaXgiIDs7Ci0gICotKi1saW51eCopCi0gICAgRFlMSUJfRVhURU5TSU9OPSJzbyIKLSAgICB2bWtpdF9jdl9vc190eXBlPSJMaW51eCIKLSAgICB2bWtpdF9jdl9wbGF0Zm9ybV90eXBlPSJVbml4IiA7OwotICAqLSotc29sYXJpcyopCi0gICAgQUNfTVNHX0VSUk9SKFtHb29kIGx1Y2sgcG9ydGluZyB2bWtpdCB0byB5b3VyIGhvc3QhXSkKLSAgICB2bWtpdF9jdl9vc190eXBlPSJTdW5PUyIKLSAgICB2bWtpdF9jdl9wbGF0Zm9ybV90eXBlPSJVbml4IiA7OwotICAqLSotd2luMzIqKQotICAgIEFDX01TR19FUlJPUihbR29vZCBsdWNrIHBvcnRpbmcgdm1raXQgdG8geW91ciBob3N0IV0pCi0gICAgdm1raXRfY3Zfb3NfdHlwZT0iV2luMzIiCi0gICAgdm1raXRfY3ZfcGxhdGZvcm1fdHlwZT0iV2luMzIiIDs7Ci0gICotKi1taW5ndyopCi0gICAgQUNfTVNHX0VSUk9SKFtHb29kIGx1Y2sgcG9ydGluZyB2bWtpdCB0byB5b3VyIGhvc3QhXSkKLSAgICB2bWtpdF9jdl9vc190eXBlPSJNaW5nVyIKLSAgICB2bWtpdF9jdl9wbGF0Zm9ybV90eXBlPSJXaW4zMiIgOzsKLSAgKikKLSAgICBBQ19NU0dfRVJST1IoW0dvb2QgbHVjayBwb3J0aW5nIHZta2l0IHRvIHlvdXIgaG9zdCFdKQotICAgIHZta2l0X2N2X29zX3R5cGU9IlVua25vd24iCi0gICAgdm1raXRfY3ZfcGxhdGZvcm1fdHlwZT0iVW5rbm93biIgOzsKLWVzYWNdKQotCi1kbmwgTWFrZSBzdXJlIHdlIGFyZW4ndCBhdHRlbXB0aW5nIHRvIGNvbmZpZ3VyZSBmb3IgYW4gdW5rbm93biBzeXN0ZW0KLQotQUNfU1VCU1QoW0RZTElCX0VYVEVOU0lPTl0pCi0KLWRubD09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ci1kbmw9PT0KLWRubD09PSBTRUNUSU9OIDM6IENvbW1hbmQgbGluZSBhcmd1bWVudHMgZm9yIHRoZSBjb25maWd1cmUgc2NyaXB0LgotZG5sPT09Ci1kbmw9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQotCi1BQ19BUkdfV0lUSChsbHZtZ2NjLAotICAgICAgIFtBU19IRUxQX1NUUklORygtLXdpdGgtbGx2bWdjYywKLSAgICAgICAgICAgW0NvbXBpbGUgd2l0aCBsbHZtLWdjY10pXSwKLSAgICAgICBbW3dpdGhsbHZtPXllc11dLAotICAgICAgIFtbd2l0aGxsdm09bm9dXSwKLSkKLQotaWYgdGVzdCAieCR3aXRobGx2bSIgPSAieHllcyI7ICB0aGVuCi0gIFdJVEhfTExWTV9HQ0M9MQotICBMTFZNX0ZMQUdTPS1EV0lUSF9MTFZNX0dDQwotZmkKLQotQUNfU1VCU1QoW1dJVEhfTExWTV9HQ0NdKQotQUNfU1VCU1QoW0xMVk1fRkxBR1NdKQotCi1BQ19BUkdfV0lUSCh0aHJlYWQsCi0gICAgICAgW0FTX0hFTFBfU1RSSU5HKC0td2l0aC10aHJlYWQ9c29tZXRoaW5nLAotICAgICAgICAgICBbVGhyZWFkIHR5cGUgKCdjb21tb24nIG9yICdubycpXSldLAotICAgICAgIFt0aHJlYWQ9JHdpdGh2YWxdLFt0aHJlYWQ9Y29tbW9uXQotKQotCi1BU19JRihbdGVzdCAieCR0aHJlYWQiICE9ICJ4bm8iXSwKLSAgW0FDX0NIRUNLX0hFQURFUihbcHRocmVhZC5oXSwsCi0gICAgW0FDX01TR19XQVJOKHBodHJlYWQgaW5jbHVkZSBOT1QgZm91bmQpXSkKLSAgQUNfQ0hFQ0tfTElCKHB0aHJlYWQsIHB0aHJlYWRfY3JlYXRlLCBbXSwgCi0gICAgIFtBQ19NU0dfRVJST1IoW3B0aHJlYWQgbGlicmFyeSBub3QgZm91bmRdKV0pCi0gIF0KLSkKLQotaWYgdGVzdCAieCR0aHJlYWQiID0geGNvbW1vbjsgdGhlbgotICBBQ19ERUZJTkUoW0hBVkVfUFRIUkVBRF0sIFsxXSwgW1VzaW5nIHB0aHJlYWQgbGlicmFyeV0pCi1maQotCi1BQ19BUkdfV0lUSChmaW5hbGl6ZXIsCi0gICAgICAgW0FTX0hFTFBfU1RSSU5HKC0td2l0aC1maW5hbGl6ZXIsCi0gICAgICAgICAgIFtDb21waWxlIHdpdGggZmluYWxpemVyIChkZWZhdWx0IHllcyldKV0sCi0gICAgICAgW1t3aXRoZmluYWxpemVyPSR3aXRoZmluYWxpemVyXV0sCi0gICAgICAgW1t3aXRoZmluYWxpemVyPXllc11dLAotKQotCi1pZiB0ZXN0ICEgIngkd2l0aGZpbmFsaXplciIgPSAieHllcyI7ICB0aGVuCi0gIFZNX0ZMQUdTPSIkVk1fRkxBR1MgLURXSVRIT1VUX0ZJTkFMSVpFUiIKLWZpCi0KLUFDX1NVQlNUKFtWTV9GTEFHU10pCi0KLWRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotZG5sIEFyY2hpdGVjdHVyZQotZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLWNhc2UgJHRhcmdldF9jcHUgaW4KLSAgcG93ZXJwYykgCi0gICAgQUNfREVGSU5FKFtXSVRIXzY0XSwgWzBdLCBbQnVpbGRpbmcgb24gYSBwbGF0Zm9ybSB3aXRob3V0IDY0Yml0IGNhc10pCi0gICAgQUNfU1VCU1QoW1dJVEhfNjRdLCBbMF0pOzsKLSAgKikgCi0gICAgQUNfREVGSU5FKFtXSVRIXzY0XSwgWzFdLCBbQnVpbGRpbmcgb24gYSBwbGF0Zm9ybSB3aXRoIDY0Yml0IGNhc10pCi0gICAgQUNfU1VCU1QoW1dJVEhfNjRdLCBbMV0pOzsKLWVzYWMKLQotCi0KLWRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotZG5sIEdDIHR5cGUgCi1kbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUFDX0FSR19XSVRIKGdjLAotICAgICAgIFtBU19IRUxQX1NUUklORygtLXdpdGgtZ2M9c29tZXRoaW5nLAotICAgICAgICAgICBbR0MgdHlwZSAoJ21tdGsnIChyZXF1aXJlcyBsbHZtLWdjYykgJ3NpbmdsZS1tbWFwJyAnbXVsdGktbW1hcCcgb3IgJ2JvZWhtJyldKV0sCi0gICAgICAgW1tnYz0kd2l0aHZhbF1dLAotICAgICAgIFtbIGVjaG8gVXNpbmcgbW1hcDIgYXMgdnZtIGdjIHR5cGUuCi0gICAgICAgICAgICAgICAgZ2M9c2luZ2xlLW1tYXAKLSAgICAgICBdXQotKQotCi1BQ19BUkdfV0lUSChtbXRrLXBsYW4sCi0gICAgICAgW0FTX0hFTFBfU1RSSU5HKC0td2l0aC1tbXRrLXBsYW49c29tZXRoaW5nLAotICAgICAgICAgICBbTU1UayBwbGFuIHR5cGUgKCdtYXJrc3dlZXAnKV0pXSwKLSAgICAgICBbW01NVEtfUExBTl9IRUFERVI9JHdpdGh2YWxdXSwKLSAgICAgICBbW01NVEtfUExBTl9IRUFERVI9bWFya3N3ZWVwXV0KLSkKLQotaWYgdGVzdCAieCRnYyIgPSAieGJvZWhtIjsgIHRoZW4KLSAgR0NfRkxBR1M9Ii1JXCQoUFJPSl9TUkNfUk9PVCkvbGliL012bS9Cb2VobUdDIC1ER0NfVEhSRUFEUyIKLSAgQUNfREVGSU5FKFtVU0VfR0NfQk9FSE1dLCBbMV0sIFtVc2luZyB0aGUgYm9laG0gZ2NdKQotICBBQ19TVUJTVChHQ19NTUFQMiwgWzBdKQotICBBQ19TVUJTVChHQ19CT0VITSwgWzFdKQotICBBQ19TVUJTVChHQ19NTVRLLCBbMF0pCi0gIEdDX0xJQlM9Qm9laG1HQwotICBjYXNlICR0YXJnZXRfb3MgaW4KLSAgICAqbGludXgqKQotICAgICAgR0NfRkxBR1M9Ii1JXCQoUFJPSl9TUkNfUk9PVCkvbGliL012bS9Cb2VobUdDIC1EVVNFX0dDX0JPRUhNIC1ER0NfVEhSRUFEUyAtREdDX0xJTlVYX1RIUkVBRFMiCi0gICAgOzsKLSAgZXNhYwotZWxzZQotICBpZiB0ZXN0ICJ4JGdjIiA9ICJ4bW10ayI7ICB0aGVuCi0gICAgQUNfU1VCU1QoW0dDX01VTFRJX01NQVBdLCBbMF0pCi0gICAgQUNfU1VCU1QoW0dDX1NJTkdMRV9NTUFQXSwgWzFdKQotICAgIEFDX1NVQlNUKEdDX01NQVAyLCBbMF0pCi0gICAgQUNfU1VCU1QoR0NfQk9FSE0sIFswXSkKLSAgICBBQ19TVUJTVChHQ19NTVRLLCBbMV0pCi0gICAgR0NfTElCUz1NTVRrCi0gICAgR0NfRkxBR1M9Ii1JXCQoUFJPSl9TUkNfUk9PVCkvbGliL012bS9NTVRrIC1EV0lUSF9NTVRLIC1JXCQoUFJPSl9TUkNfUk9PVCkvbW10ay9jb25maWcvXCQoTU1US19QTEFOX0hFQURFUikiCi0gIGVsc2UKLSAgICBHQ19MSUJTPUdDTW1hcDIKLSAgICBpZiB0ZXN0ICJ4JGdjIiA9ICJ4bXVsdGktbW1hcCI7IHRoZW4KLSAgICAgIEdDX0ZMQUdTPSItSVwkKFBST0pfU1JDX1JPT1QpL2xpYi9Ndm0vR0NNbWFwMiAtRFdJVEhfVFJBQ0VSIC1ETVVMVElQTEVfR0MgLUlcJChQUk9KX1NSQ19ST09UKS9saWIvTXZtL0FsbG9jYXRvciIKLSAgICAgIEFDX1NVQlNUKFtHQ19NVUxUSV9NTUFQXSwgWzFdKQotICAgICAgQUNfU1VCU1QoW0dDX1NJTkdMRV9NTUFQXSwgWzBdKQotICAgIGVsc2UKLSAgICAgIEdDX0ZMQUdTPSItSVwkKFBST0pfU1JDX1JPT1QpL2xpYi9Ndm0vR0NNbWFwMiAtRFdJVEhfVFJBQ0VSIC1JXCQoUFJPSl9TUkNfUk9PVCkvbGliL012bS9BbGxvY2F0b3IiCi0gICAgICBBQ19TVUJTVChbR0NfTVVMVElfTU1BUF0sIFswXSkKLSAgICAgIEFDX1NVQlNUKFtHQ19TSU5HTEVfTU1BUF0sIFsxXSkKLSAgICBmaQotICAgIEFDX0RFRklORShbVVNFX0dDX01NQVAyXSwgWzFdLCBbVXNpbmcgdGhlIGdjbW1hcDJdKQotICAgIEFDX1NVQlNUKEdDX01NQVAyLCBbMV0pCi0gICAgQUNfU1VCU1QoR0NfQk9FSE0sIFswXSkKLSAgICBBQ19TVUJTVChHQ19NTVRLLCBbMF0pCi0gIGZpCi1maQotCi0KLWlmIHRlc3QgIngkTU1US19QTEFOX0hFQURFUiIgPSAieG1hcmtzd2VlcCI7ICB0aGVuCi0gIE1NVEtfUExBTj1vcmcubW10ay5wbGFuLm1hcmtzd2VlcC5NUwotZWxzZQotICBpZiB0ZXN0ICJ4JE1NVEtfUExBTl9IRUFERVIiID0gInhjb3B5bXMiOyAgdGhlbgotICBNTVRLX1BMQU49b3JnLm1tdGsucGxhbi5jb3B5bXMuQ29weU1TCi0gIGVsc2UgCi0gICAgaWYgdGVzdCAieCRNTVRLX1BMQU5fSEVBREVSIiAhPSAieCI7ICB0aGVuCi0gICAgICBlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIE1NVEsgcGxhbgotICAgIGZpCi0gIGZpCi1maQotICAKLUFDX1NVQlNUKFtHQ19GTEFHU10pCi1BQ19TVUJTVChbR0NfTElCU10pCi1BQ19TVUJTVChbTU1US19QTEFOXSkKLUFDX1NVQlNUKFtNTVRLX1BMQU5fSEVBREVSXSkKLQotZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1kbmwgRXhjZXB0aW9uIHR5cGUKLWRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotQUNfQVJHX1dJVEgoZXhjZXB0aW9uLXR5cGUsCi0gICAgICAgW0FTX0hFTFBfU1RSSU5HKC0td2l0aC1leGNlcHRpb24tdHlwZT1zb21ldGhpbmcsCi0gICAgICAgICAgIFtFeGNlcHRpb24gdHlwZSAoJ2NoZWNrJyBvciAnZHdhcmYnKV0pXSwKLSAgICAgICBbW2V4Y2VwdGlvbnR5cGU9JHdpdGh2YWxdXSwKLSAgICAgICBbWyBlY2hvIFVzaW5nIGNoZWNrIGFzIGV4Y2VwdGlvbiB0eXBlLgotICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnR5cGU9Y2hlY2sKLSAgICAgICBdXQotKQotCi1BQ19BUkdfV0lUSChydW50aW1lLWV4Y2VwdGlvbi10eXBlLAotICAgICAgIFtBU19IRUxQX1NUUklORygtLXdpdGgtcnVudGltZS1leGNlcHRpb24tdHlwZT1zb21ldGhpbmcsCi0gICAgICAgICAgIFtSdW50aW1lIGV4Y2VwdGlvbiB0eXBlICgnc2V0am1wJyBvciAnZHdhcmYnKV0pXSwKLSAgICAgICBbW3J1bnRpbWVleGNlcHRpb250eXBlPSR3aXRodmFsXV0sCi0gICAgICAgW1sgZWNobyBVc2luZyBzZXRqbXAgYXMgZXhjZXB0aW9uIHR5cGUuCi0gICAgICAgICAgICAgICAgZXhjZXB0aW9udHlwZT1zZXRqbXAKLSAgICAgICBdXQotKQotCi1pZiB0ZXN0ICJ4JGV4Y2VwdGlvbnR5cGUiID0gInhkd2FyZiI7ICB0aGVuCi0gIEVYQ0VQVElPTl9GTEFHUz0iLUREV0FSRl9FWENFUFRJT05TIC1mZXhjZXB0aW9ucyIKLWZpCi0KLWlmIHRlc3QgIngkcnVudGltZWV4Y2VwdGlvbnR5cGUiID0gInhkd2FyZiI7ICB0aGVuCi0gIEVYQ0VQVElPTl9GTEFHUys9Ii1EUlVOVElNRV9EV0FSRl9FWENFUFRJT05TIC1mZXhjZXB0aW9ucyIKLWZpCi0KLWlmIHRlc3QgIngkcnVudGltZWV4Y2VwdGlvbnR5cGUiICE9ICJ4ZHdhcmYiOyB0aGVuCi0gIGlmIHRlc3QgIngkZXhjZXB0aW9udHlwZSIgIT0gInhkd2FyZiI7IHRoZW4KLSAgICBFWENFUFRJT05fRkxBR1M9Ii1mbm8tZXhjZXB0aW9ucyIKLSAgZmkKLWZpCi0KLUFDX1NVQlNUKFtFWENFUFRJT05fRkxBR1NdKQotCi1kbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLWRubCBHTlUgQ0xBU1NQQVRIIGluc3RhbGxhdGlvbiBwcmVmaXgKLWRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1jbGFzc3BhdGh2ZXJzaW9uPTAuOTcuMjsKLQotQUNfQVJHX1dJVEgoZ251LWNsYXNzcGF0aC1saWJzLAotICAgICAgIFtBU19IRUxQX1NUUklORygtLXdpdGgtZ251LWNsYXNzcGF0aC1saWJzPXNvbWV0aGluZywKLSAgICAgICAgICAgW0dOVSBDTEFTU1BBVEggbGlicmFyaWVzIChkZWZhdWx0IGlzIC91c3IvbGliL2NsYXNzcGF0aCldKV0sCi0gICAgICAgW1tjbGFzc3BhdGhsaWJzPSR3aXRodmFsXV0sCi0gICAgICAgW1tjbGFzc3BhdGhsaWJzPS91c3IvbGliL2NsYXNzcGF0aF1dCi0pCi0KLUFDX0FSR19XSVRIKGdudS1jbGFzc3BhdGgtZ2xpYmosCi0gICAgICAgW0FTX0hFTFBfU1RSSU5HKC0td2l0aC1nbnUtY2xhc3NwYXRoLWdsaWJqLAotICAgICAgICAgICBbQnVpbGQgSjMgd2l0aCBHTlUgQ2xhc3NwYXRoIGluc3RhbGwgKGRlZmF1bHQgaXMgJy91c3Ivc2hhcmUvY2xhc3NwYXRoL2dsaWJqLnppcCcpXSldLAotICAgICAgIFtbY2xhc3NwYXRoZ2xpYmo9JHdpdGh2YWxdXSwKLSAgICAgICBbW2NsYXNzcGF0aGdsaWJqPS91c3Ivc2hhcmUvY2xhc3NwYXRoL2dsaWJqLnppcF1dCi0pCi0KLUFDX0FSR19XSVRIKGozLAotICAgICAgIFtBU19IRUxQX1NUUklORygtLXdpdGgtajM9eWVzfG5vLAotICAgICAgICBbQnVpbGQgSjMgKGRlZmF1bHQgaXMgeWVzKV0pXSwKLSAgICAgICBbW1dJVEhfSjM9JHdpdGh2YWxdXSwKLSAgICAgICBbW1dJVEhfSjM9eWVzXV0KLSkKLQotY2xhc3NwYXRoaW5jbHVkZT0iLUkke2NsYXNzcGF0aGxpYnN9Ly4uL2luY2x1ZGUgLUkvdXNyL2luY2x1ZGUvY2xhc3NwYXRoIjsKLQotaWYgdGVzdCAieCR7V0lUSF9KM30iID0gInh5ZXMiOyB0aGVuCi0gIFdJVEhfSjM9MTsKLSAgQUNfREVGSU5FKFtXSVRIX0ozXSwgWzFdLCBbV2l0aCBKM10pCi1lbHNlCi0gIFdJVEhfSjM9MDsKLWZpIAotCi1BQ19TVUJTVChbY2xhc3NwYXRoZ2xpYmpdKQotQUNfU1VCU1QoW2NsYXNzcGF0aGxpYnNdKQotQUNfU1VCU1QoW2NsYXNzcGF0aGluY2x1ZGVdKQotQUNfU1VCU1QoW2NsYXNzcGF0aHZlcnNpb25dKQotQUNfU1VCU1QoW1dJVEhfSjNdKQotCi1kbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLWRubCBMb2NhbCBQTmV0IGRpcmVjdG9yeQotZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1BQ19BUkdfV0lUSChwbmV0LWxvY2FsLXByZWZpeCwKLSAgICAgICBbQVNfSEVMUF9TVFJJTkcoLS13aXRoLXBuZXQtbG9jYWwtcHJlZml4PXNvbWV0aGluZywKLSAgICAgICAgICAgW1BORVQgbG9jYWwgcHJlZml4IChubyBkZWZhdWx0KV0pXSwKLSAgICAgICBbW3BuZXRsb2NhbHByZWZpeD0kd2l0aHZhbF1dLAotICAgICAgIFtbICAgICAgIGVjaG8gTm90IHVzaW5nIFBORVRsb2NhbCBwcmVmaXguICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmV0bG9jYWxwcmVmaXg9JycKLSAgICAgICBdXQotKQotCi1BQ19BUkdfV0lUSChwbmV0bGliLAotICAgICAgIFtBU19IRUxQX1NUUklORygtLXdpdGgtcG5ldGxpYj1zb21ldGhpbmcsCi0gICAgICAgICAgIFtQbmV0bGliJ3MgbXNjb3JsaWIuZGxsIGxvY2F0aW9uIChkZWZhdWx0IGlzIC91c3IvbGliL2NzY2MvbGliLyldKV0sCi0gICAgICAgW1twbmV0bGlicGF0aD0kd2l0aHZhbF1dLAotICAgICAgIFtbcG5ldGxpYnBhdGg9L3Vzci9saWIvY3NjYy9saWIvXV0KLSkKLQotV0lUSF9OMz0wCi0KLWlmIHRlc3QgIngkcG5ldGxvY2FscHJlZml4IiAhPSB4OyB0aGVuCi0gIGVjaG8gVXNpbmcgJHtwbmV0bG9jYWxwcmVmaXh9IGFzIFBORVQgbG9jYWwgcHJlZml4OwotICBXSVRIX04zX1BORVRMSUI9MTsKLSAgV0lUSF9OMz0xOwotICBBQ19ERUZJTkUoW1dJVEhfTjNdLCBbMV0sIFtXaXRoIE4zXSkKLWVsc2UKLSAgV0lUSF9OM19QTkVUTElCPTA7Ci1maQotCi1BQ19TVUJTVChbcG5ldGxvY2FscHJlZml4XSkKLUFDX1NVQlNUKFtXSVRIX04zX1BORVRMSUJdKQotCi1OM19MSUI9UE5ldExpYgotQUNfU1VCU1QoW04zX0xJQl0pCi1BQ19TVUJTVChbcG5ldGxpYnBhdGhdKQotCi1BQ19BUkdfV0lUSChtb25vLAotICAgICAgIFtBU19IRUxQX1NUUklORygtLXdpdGgtbW9ubz1zb21ldGhpbmcsCi0gICAgICAgICBbTW9ubydzIG1zY29ybGliLmRsbCBsb2NhdGlvbiAobm8gZGVmYXVsdCldKV0sCi0gICAgICAgW1ttb25vcGF0aD0kd2l0aHZhbF1dLAotICAgICAgIFtbZWNobyBOb3QgdXNpbmcgTW9ub11dCi0pCi0KLWlmIHRlc3QgIngkbW9ub3BhdGgiICE9IHg7IHRoZW4KLSAgZWNobyBCdWlsZGluZyBOMyB3aXRoIE1vbm87Ci0gIFdJVEhfTjNfTU9OTz0xOwotICBXSVRIX04zPTE7Ci1lbHNlCi0gIFdJVEhfTjNfTU9OTz0wOwotZmkKLQotQUNfU1VCU1QoW1dJVEhfTjNfTU9OT10pCi1BQ19TVUJTVChbbW9ub3BhdGhdKQotCi1BQ19TVUJTVChbV0lUSF9OM10pCi0KLWRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotZG5sIHRveSB2bQotZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1BQ19BUkdfV0lUSChwMywKLSAgICAgICBbQVNfSEVMUF9TVFJJTkcoLS13aXRoLXAzPXllc3xubywKLSAgICAgICAgW0J1aWxkIHRoZSBweXRob24gdmlydHVhbCBtYWNoaW5lIChkZWZhdWx0IGlzIG5vKV0pXSwKLSAgICAgICBbW1dJVEhfUDM9JHdpdGh2YWxdXSwKLSAgICAgICBbW1dJVEhfUDM9bm9dXQotKQotCi1pZiB0ZXN0ICJ4JHtXSVRIX1AzfSIgPSAieHllcyI7IHRoZW4KLSAgZWNobyBCdWlsZGluZyBQMzsKLSAgV0lUSF9QMz0xOwotZWxzZQotICBXSVRIX1AzPTA7Ci1maSAKLQotQUNfU1VCU1QoW1dJVEhfUDNdKQotCi1kbmw9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQotZG5sPT09Ci1kbmw9PT0gU0VDVElPTiA0OiBDaGVjayBmb3IgcHJvZ3JhbXMgd2UgbmVlZCBhbmQgdGhhdCB0aGV5IGFyZSB0aGUgcmlnaHQgdmVyc2lvbgotZG5sPT09Ci1kbmw9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQotCi1kbmwgQ2hlY2sgZm9yIGNvbXBpbGF0aW9uIHRvb2xzCi1BQ19QUk9HX0NQUAotQUNfUFJPR19DQyhnY2MpCi1BQ19QUk9HX0NYWChnKyspCi0KLUFDX1BST0dfTk0KLUFDX1NVQlNUKE5NKQotCi1kbmwgQ2hlY2sgZm9yIHRoZSB0b29scyB0aGF0IHRoZSBtYWtlZmlsZXMgcmVxdWlyZQotQUNfUFJPR19MTl9TCi1BQ19QQVRIX1BST0coQ01QLCBbY21wXSwgW2NtcF0pCi1BQ19QQVRIX1BST0coQ1AsIFtjcF0sIFtjcF0pCi1BQ19QQVRIX1BST0coREFURSwgW2RhdGVdLCBbZGF0ZV0pCi1BQ19QQVRIX1BST0coRklORCwgW2ZpbmRdLCBbZmluZF0pCi1BQ19QQVRIX1BST0coR1JFUCwgW2dyZXBdLCBbZ3JlcF0pCi1BQ19QQVRIX1BST0coTUtESVIsW21rZGlyXSxbbWtkaXJdKQotQUNfUEFUSF9QUk9HKE1WLCAgIFttdl0sICAgW212XSkKLUFDX1BST0dfUkFOTElCCi1BQ19QQVRIX1BST0coUk0sICAgW3JtXSwgICBbcm1dKQotQUNfUEFUSF9QUk9HKFNFRCwgIFtzZWRdLCAgW3NlZF0pCi1BQ19QQVRIX1BST0coVEFSLCAgW3Rhcl0sICBbZ3Rhcl0pCi1BQ19QQVRIX1BST0coQklOUFdELFtwd2RdLCAgW3B3ZF0pCi1BQ19QQVRIX1BST0coQ0FULFtjYXRdLCAgW2NhdF0pCi0KLUFDX1BBVEhfUFJPRyhMTFZNQVMsIFtsbHZtLWFzXSwgIFtsbHZtLWFzXSkKLUFDX1BBVEhfUFJPRyhMTEMsIFtsbGNdLCAgW2xsY10pCi0KLWlmIHRlc3QgIngkZ2MiID0gInhtbXRrIjsgIHRoZW4KLSAgQUNfUEFUSF9QUk9HKEFOVCwgW2FudF0pCi0gIGlmIHRlc3QgLXogIiRBTlQiOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFtBcGFjaGUgQU5UIHJlcXVpcmVkIGZvciBNTVRrLCBidXQgbm90IGZvdW5kXSkKLSAgZmkKLWZpCi0KLWRubCBGaW5kIHRoZSBpbnN0YWxsIHByb2dyYW0KLUFDX1BST0dfSU5TVEFMTAotCi1pZiB0ZXN0ICIkV0lUSF9MTFZNR0NDRElSIiA9ICJkZWZhdWx0IiA7IHRoZW4KLSAgTExWTUdDQz0ibGx2bS1nY2Mke0VYRUVYVH0iCi0gIExMVk1HWFg9Imxsdm0tZysrJHtFWEVFWFR9IgotICBBQ19QQVRIX1BST0coTExWTUdDQywgJExMVk1HQ0MsIFtdKQotICBBQ19QQVRIX1BST0coTExWTUdYWCwgJExMVk1HWFgsIFtdKQotZWxzZQotICBpZiB0ZXN0IC16ICIkTExWTUdDQyI7IHRoZW4KLSAgICBMTFZNR0NDPSIkV0lUSF9MTFZNR0NDRElSL2Jpbi9sbHZtLWdjYyR7RVhFRVhUfSIKLSAgZmkKLSAgaWYgdGVzdCAteiAiJExMVk1HWFgiOyB0aGVuCi0gICAgTExWTUdYWD0iJFdJVEhfTExWTUdDQ0RJUi9iaW4vbGx2bS1nKyske0VYRUVYVH0iCi0gIGZpCi0gIEFDX1NVQlNUKExMVk1HQ0MsJExMVk1HQ0MpCi0gIEFDX1NVQlNUKExMVk1HWFgsJExMVk1HWFgpCi1maQotCi1BQ19NU0dfQ0hFQ0tJTkcoW3Rvb2wgY29tcGF0aWJpbGl0eV0pCi0KLWRubCBFbnN1cmUgdGhhdCBjb21waWxhdGlvbiB0b29scyBhcmUgR0NDIG9yIGEgR05VIGNvbXBhdGlibGUgY29tcGlsZXIgc3VjaCBhcwotZG5sIElDQzsgd2UgdXNlIEdDQyBzcGVjaWZpYyBvcHRpb25zIGluIHRoZSBtYWtlZmlsZXMgc28gdGhlIGNvbXBpbGVyIG5lZWRzCi1kbmwgdG8gc3VwcG9ydCB0aG9zZSBvcHRpb25zLgotZG5sICJpY2MiIGVtaXRzIGdjYyBzaWduYXR1cmVzCi1kbmwgImljYyAtbm8tZ2NjIiBlbWl0cyBubyBnY2Mgc2lnbmF0dXJlIEJVVCBpcyBzdGlsbCBjb21wYXRpYmxlCi1JQ0M9bm8KLUlYWD1ubwotY2FzZSAkQ0MgaW4KLSAgaWNjKnxpY3BjKikKLSAgICBJQ0M9eWVzCi0gICAgSVhYPXllcwotICAgIDs7Ci0gICAqKQotICAgIDs7Ci1lc2FjCi0KLWlmIHRlc3QgIiRHQ0MiICE9ICJ5ZXMiICYmIHRlc3QgIiRJQ0MiICE9ICJ5ZXMiCi10aGVuCi0gIEFDX01TR19FUlJPUihbZ2NjfGljYyByZXF1aXJlZCBidXQgbm90IGZvdW5kXSkKLWZpCi0KLWRubCBFbnN1cmUgdGhhdCBjb21waWxhdGlvbiB0b29scyBhcmUgR0NDOyB3ZSB1c2UgR0NDIHNwZWNpZmljIGV4dGVuc2lvbnMKLWlmIHRlc3QgIiRHWFgiICE9ICJ5ZXMiICYmIHRlc3QgIiRJWFgiICE9ICJ5ZXMiCi10aGVuCi0gIEFDX01TR19FUlJPUihbZysrfGljYyByZXF1aXJlZCBidXQgbm90IGZvdW5kXSkKLWZpCi0KLWRubCBWZXJpZnkgdGhhdCBHQ0MgaXMgdmVyc2lvbiAzLjAgb3IgaGlnaGVyCi1pZiB0ZXN0ICIkR0NDIiA9ICJ5ZXMiCi10aGVuCi0gIEFDX0NPTVBJTEVfSUZFTFNFKFtbI2lmICFkZWZpbmVkKF9fR05VQ19fKSB8fCBfX0dOVUNfXyA8IDMKLSNlcnJvciBVbnN1cHBvcnRlZCBHQ0MgdmVyc2lvbgotI2VuZGlmCi1dXSwgW10sIFtBQ19NU0dfRVJST1IoW2djYyAzLnggcmVxdWlyZWQsIGJ1dCB5b3UgaGF2ZSBhIGxvd2VyIHZlcnNpb25dKV0pCi1maQotCi1kbmwgVG9vbCBjb21wYXRpYmlsaXR5IGlzIG9rYXkgaWYgd2UgbWFrZSBpdCBoZXJlLgotQUNfTVNHX1JFU1VMVChbb2tdKQotCi0KLWRubD09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ci1kbmw9PT0KLWRubD09PSBTRUNUSU9OIDU6IENoZWNrIGZvciBsaWJyYXJpZXMKLWRubD09PQotZG5sPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KLQotQUNfQ0hFQ0tfTElCKHosIGluZmxhdGUsIFtdLCBcCi0gIFtBQ19NU0dfRVJST1IoW1lvdSBuZWVkIHRvIGluc3RhbGwgdGhlIHpsaWIgcGFja2FnZSAoeikuXSldCi0pCi0gIAotaWYgdGVzdCAieCRnYyIgPSAieGJvZWhtIjsgIHRoZW4KLUFDX0NIRUNLX0xJQihnYywgR0NfbWFsbG9jLCBbXSwgXAotICAgIFtBQ19NU0dfRVJST1IoW1lvdSBuZWVkIHRvIGluc3RhbGwgdGhlIGJvZWhtLWdjIHBhY2thZ2UgKGdjKS5dKV0KLSkKLWZpCi0KLWRubD09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ci1kbmw9PT0KLWRubD09PSBTRUNUSU9OIDY6IENoZWNrIGZvciBoZWFkZXIgZmlsZXMKLWRubD09PQotZG5sPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KLQotQUNfQ0hFQ0tfSEVBREVSKFt6bGliLmhdLCBbXSwgXAotICBBQ19NU0dfRVJST1IoW1lvdSBuZWVkIHRvIGluc3RhbGwgdGhlIHpsaWIgZGV2ZWwgcGFja2FnZSAoemxpYi5oKS5dKQotKQotICAKLWlmIHRlc3QgIngkZ2MiID0gInhib2VobSI7ICB0aGVuCi0gIEFDX0NIRUNLX0hFQURFUihbZ2MvZ2MuaF0sIFtdLCBcCi0gICAgQUNfTVNHX0VSUk9SKFtZb3UgbmVlZCB0byBpbnN0YWxsIHRoZSBib2VobS1nYyBkZXZlbCBwYWNrYWdlIChnYy9nYy5oKS5dKQotICApCi1maQotCi0KLW5sPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KLWRubD09PQotZG5sPT09IFNFQ1RJT04gNzogQ2hlY2sgZm9yIHR5cGVzIGFuZCBzdHJ1Y3R1cmVzCi1kbmw9PT0KLWRubD09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ci0KLUFDX1RZUEVfUElEX1QKLUFDX1RZUEVfU0laRV9UCi1BQ19TVFJVQ1RfVE0KLUFDX0NIRUNLX1RZUEVTKFtpbnQ2NF90XSwsQUNfTVNHX0VSUk9SKFtUeXBlIGludDY0X3QgcmVxdWlyZWQgYnV0IG5vdCBmb3VuZF0pKQotQUNfQ0hFQ0tfVFlQRVMoW3VpbnQ2NF90XSwsCi0gICAgICAgICBBQ19DSEVDS19UWVBFUyhbdV9pbnQ2NF90XSwsCi0gICAgICAgICBBQ19NU0dfRVJST1IoW1R5cGUgdWludDY0X3Qgb3IgdV9pbnQ2NF90IHJlcXVpcmVkIGJ1dCBub3QgZm91bmRdKSkpCi0KLWRubD09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ci1kbmw9PT0KLWRubD09PSBTRUNUSU9OIDg6IENoZWNrIGZvciBzcGVjaWZpYyBmdW5jdGlvbnMgbmVlZGVkCi1kbmw9PT0KLWRubD09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ci0KLUFDX0NIRUNLX0ZVTkNTKFtzZXRqbXAgbG9uZ2ptcF0pCi0KLQotZG5sPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0KLWRubD09PQotZG5sPT09IFNFQ1RJT04gOTogQWRkaXRpb25hbCBjaGVja3MsIHZhcmlhYmxlcywgZXRjLgotZG5sPT09Ci1kbmw9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQotCi1kbmw9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQotZG5sPT09Ci1kbmw9PT0gU0VDVElPTiAxMDogU3BlY2lmeSB0aGUgb3V0cHV0IGZpbGVzIGFuZCBnZW5lcmF0ZSBpdAotZG5sPT09Ci1kbmw9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQotCi1kbmwgQ29uZmlndXJlIGhlYWRlciBmaWxlcwotZG5sIFdBUk5JTkc6IGRubCBJZiB5b3UgYWRkIG9yIHJlbW92ZSBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25maWcgaGVhZGVycywgdGhlbgotZG5sIHlvdSBNVVNUIGFsc28gdXBkYXRlIE1ha2VmaWxlLnJ1bGVzIHNvIHRoYXQgdGhlIHZhcmlhYmxlIEZpbGVzVG9Db25maWcKLWRubCBjb250YWlucyB0aGUgc2FtZSBsaXN0IG9mIGZpbGVzIGFzIEFDX0NPTkZJR19IRUFERVJTIGJlbG93LiBUaGlzIGVuc3VyZXMgdGhlCi1kbmwgZmlsZXMgY2FuIGJlIHVwZGF0ZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZWlyICouaW4gc291cmNlcyBjaGFuZ2UuCi1BQ19DT05GSUdfSEVBREVSUyhbaW5jbHVkZS9tdm0vQ29uZmlnL2NvbmZpZy5oXSkKLQotZG5sIFZlcmlmeSB0aGF0IHRoZSBzb3VyY2UgZGlyZWN0b3J5IGlzIHZhbGlkCi1BQ19DT05GSUdfU1JDRElSKFsiTWFrZWZpbGUuY29tbW9uLmluIl0pCi0KLWRubCBDb25maWd1cmUgYSBjb21tb24gTWFrZWZpbGUKLUFDX0NPTkZJR19GSUxFUyhNYWtlZmlsZS5jb21tb24pCi1BQ19DT05GSUdfRklMRVMoTWFrZWZpbGUuY29uZmlnKQotQUNfQ09ORklHX0ZJTEVTKFtsaWIvSjMvQ2xhc3NwYXRoL0NsYXNzcGF0aC5oXSkKLUFDX0NPTkZJR19GSUxFUyhbdG9vbHMvbGxjai9MaW5rUGF0aHMuaF0pCi1BQ19DT05GSUdfRklMRVMoW21tdGsvamF2YS9zcmMvb3JnL2ozL2NvbmZpZy9TZWxlY3RlZC5qYXZhXSkKLQotZG5sIERvIHNwZWNpYWwgY29uZmlndXJhdGlvbiBvZiBNYWtlZmlsZXMKLUFDX0NPTkZJR19NQUtFRklMRShNYWtlZmlsZSkKLUFDX0NPTkZJR19NQUtFRklMRShsaWIvTWFrZWZpbGUpCi0KLQotQUNfT1VUUFVUCmRpZmYgLS1naXQgYS92bWtpdC9hdXRvY29uZi9pbnN0YWxsLXNoIGIvdm1raXQvYXV0b2NvbmYvaW5zdGFsbC1zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ5N2RiNy4uMDAwMDAwMAotLS0gYS92bWtpdC9hdXRvY29uZi9pbnN0YWxsLXNoCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLSMhL2Jpbi9zaAotIyBpbnN0YWxsIC0gaW5zdGFsbCBhIHByb2dyYW0sIHNjcmlwdCwgb3IgZGF0YWZpbGUKLQotc2NyaXB0dmVyc2lvbj0yMDA0LTA5LTEwLjIwCi0KLSMgVGhpcyBvcmlnaW5hdGVzIGZyb20gWDExUjUgKG1pdC91dGlsL3NjcmlwdHMvaW5zdGFsbC5zaCksIHdoaWNoIHdhcwotIyBsYXRlciByZWxlYXNlZCBpbiBYMTFSNiAoeGMvY29uZmlnL3V0aWwvaW5zdGFsbC5zaCkgd2l0aCB0aGUKLSMgZm9sbG93aW5nIGNvcHlyaWdodCBhbmQgbGljZW5zZS4KLSMKLSMgQ29weXJpZ2h0IChDKSAxOTk0IFggQ29uc29ydGl1bQotIwotIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci0jIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0bwotIyBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZQotIyByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKLSMgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKLSMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSMKLSMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLSMgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0jCi0jIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi0jIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCi0jIFggQ09OU09SVElVTSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSMgQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDLQotIyBUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotIwotIyBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiB0aGUgWCBDb25zb3J0aXVtIHNoYWxsIG5vdAotIyBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbC0KLSMgaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gdGhlIFggQ29uc29yLQotIyB0aXVtLgotIwotIwotIyBGU0YgY2hhbmdlcyB0byB0aGlzIGZpbGUgYXJlIGluIHRoZSBwdWJsaWMgZG9tYWluLgotIwotIyBDYWxsaW5nIHRoaXMgc2NyaXB0IGluc3RhbGwtc2ggaXMgcHJlZmVycmVkIG92ZXIgaW5zdGFsbC5zaCwgdG8gcHJldmVudAotIyBgbWFrZScgaW1wbGljaXQgcnVsZXMgZnJvbSBjcmVhdGluZyBhIGZpbGUgY2FsbGVkIGluc3RhbGwgZnJvbSBpdAotIyB3aGVuIHRoZXJlIGlzIG5vIE1ha2VmaWxlLgotIwotIyBUaGlzIHNjcmlwdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIEJTRCBpbnN0YWxsIHNjcmlwdCwgYnV0IHdhcyB3cml0dGVuCi0jIGZyb20gc2NyYXRjaC4gIEl0IGNhbiBvbmx5IGluc3RhbGwgb25lIGZpbGUgYXQgYSB0aW1lLCBhIHJlc3RyaWN0aW9uCi0jIHNoYXJlZCB3aXRoIG1hbnkgT1MncyBpbnN0YWxsIHByb2dyYW1zLgotCi0jIHNldCBET0lUUFJPRyB0byBlY2hvIHRvIHRlc3QgdGhpcyBzY3JpcHQKLQotIyBEb24ndCB1c2UgOi0gc2luY2UgNC4zQlNEIGFuZCBlYXJsaWVyIHNoZWxscyBkb24ndCBsaWtlIGl0LgotZG9pdD0iJHtET0lUUFJPRy19IgotCi0jIHB1dCBpbiBhYnNvbHV0ZSBwYXRocyBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGVtIGluIHlvdXIgcGF0aDsgb3IgdXNlIGVudi4gdmFycy4KLQotbXZwcm9nPSIke01WUFJPRy1tdn0iCi1jcHByb2c9IiR7Q1BQUk9HLWNwfSIKLWNobW9kcHJvZz0iJHtDSE1PRFBST0ctY2htb2R9IgotY2hvd25wcm9nPSIke0NIT1dOUFJPRy1jaG93bn0iCi1jaGdycHByb2c9IiR7Q0hHUlBQUk9HLWNoZ3JwfSIKLXN0cmlwcHJvZz0iJHtTVFJJUFBST0ctc3RyaXB9Igotcm1wcm9nPSIke1JNUFJPRy1ybX0iCi1ta2RpcnByb2c9IiR7TUtESVJQUk9HLW1rZGlyfSIKLQotY2htb2RjbWQ9IiRjaG1vZHByb2cgMDc1NSIKLWNob3duY21kPQotY2hncnBjbWQ9Ci1zdHJpcGNtZD0KLXJtY21kPSIkcm1wcm9nIC1mIgotbXZjbWQ9IiRtdnByb2ciCi1zcmM9Ci1kc3Q9Ci1kaXJfYXJnPQotZHN0YXJnPQotbm9fdGFyZ2V0X2RpcmVjdG9yeT0KLQotdXNhZ2U9IlVzYWdlOiAkMCBbT1BUSU9OXS4uLiBbLVRdIFNSQ0ZJTEUgRFNURklMRQotICAgb3I6ICQwIFtPUFRJT05dLi4uIFNSQ0ZJTEVTLi4uIERJUkVDVE9SWQotICAgb3I6ICQwIFtPUFRJT05dLi4uIC10IERJUkVDVE9SWSBTUkNGSUxFUy4uLgotICAgb3I6ICQwIFtPUFRJT05dLi4uIC1kIERJUkVDVE9SSUVTLi4uCi0KLUluIHRoZSAxc3QgZm9ybSwgY29weSBTUkNGSUxFIHRvIERTVEZJTEUuCi1JbiB0aGUgMm5kIGFuZCAzcmQsIGNvcHkgYWxsIFNSQ0ZJTEVTIHRvIERJUkVDVE9SWS4KLUluIHRoZSA0dGgsIGNyZWF0ZSBESVJFQ1RPUklFUy4KLQotT3B0aW9uczoKLS1jICAgICAgICAgKGlnbm9yZWQpCi0tZCAgICAgICAgIGNyZWF0ZSBkaXJlY3RvcmllcyBpbnN0ZWFkIG9mIGluc3RhbGxpbmcgZmlsZXMuCi0tZyBHUk9VUCAgICRjaGdycHByb2cgaW5zdGFsbGVkIGZpbGVzIHRvIEdST1VQLgotLW0gTU9ERSAgICAkY2htb2Rwcm9nIGluc3RhbGxlZCBmaWxlcyB0byBNT0RFLgotLW8gVVNFUiAgICAkY2hvd25wcm9nIGluc3RhbGxlZCBmaWxlcyB0byBVU0VSLgotLXMgICAgICAgICAkc3RyaXBwcm9nIGluc3RhbGxlZCBmaWxlcy4KLS10IERJUkVDVE9SWSAgaW5zdGFsbCBpbnRvIERJUkVDVE9SWS4KLS1UICAgICAgICAgcmVwb3J0IGFuIGVycm9yIGlmIERTVEZJTEUgaXMgYSBkaXJlY3RvcnkuCi0tLWhlbHAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0LgotLS12ZXJzaW9uICBkaXNwbGF5IHZlcnNpb24gaW5mbyBhbmQgZXhpdC4KLQotRW52aXJvbm1lbnQgdmFyaWFibGVzIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGNvbW1hbmRzOgotICBDSEdSUFBST0cgQ0hNT0RQUk9HIENIT1dOUFJPRyBDUFBST0cgTUtESVJQUk9HIE1WUFJPRyBSTVBST0cgU1RSSVBQUk9HCi0iCi0KLXdoaWxlIHRlc3QgLW4gIiQxIjsgZG8KLSAgY2FzZSAkMSBpbgotICAgIC1jKSBzaGlmdAotICAgICAgICBjb250aW51ZTs7Ci0KLSAgICAtZCkgZGlyX2FyZz10cnVlCi0gICAgICAgIHNoaWZ0Ci0gICAgICAgIGNvbnRpbnVlOzsKLQotICAgIC1nKSBjaGdycGNtZD0iJGNoZ3JwcHJvZyAkMiIKLSAgICAgICAgc2hpZnQKLSAgICAgICAgc2hpZnQKLSAgICAgICAgY29udGludWU7OwotCi0gICAgLS1oZWxwKSBlY2hvICIkdXNhZ2UiOyBleGl0IDA7OwotCi0gICAgLW0pIGNobW9kY21kPSIkY2htb2Rwcm9nICQyIgotICAgICAgICBzaGlmdAotICAgICAgICBzaGlmdAotICAgICAgICBjb250aW51ZTs7Ci0KLSAgICAtbykgY2hvd25jbWQ9IiRjaG93bnByb2cgJDIiCi0gICAgICAgIHNoaWZ0Ci0gICAgICAgIHNoaWZ0Ci0gICAgICAgIGNvbnRpbnVlOzsKLQotICAgIC1zKSBzdHJpcGNtZD0kc3RyaXBwcm9nCi0gICAgICAgIHNoaWZ0Ci0gICAgICAgIGNvbnRpbnVlOzsKLQotICAgIC10KSBkc3Rhcmc9JDIKLQlzaGlmdAotCXNoaWZ0Ci0JY29udGludWU7OwotCi0gICAgLVQpIG5vX3RhcmdldF9kaXJlY3Rvcnk9dHJ1ZQotCXNoaWZ0Ci0JY29udGludWU7OwotCi0gICAgLS12ZXJzaW9uKSBlY2hvICIkMCAkc2NyaXB0dmVyc2lvbiI7IGV4aXQgMDs7Ci0KLSAgICAqKSAgIyBXaGVuIC1kIGlzIHVzZWQsIGFsbCByZW1haW5pbmcgYXJndW1lbnRzIGFyZSBkaXJlY3RvcmllcyB0byBjcmVhdGUuCi0JIyBXaGVuIC10IGlzIHVzZWQsIHRoZSBkZXN0aW5hdGlvbiBpcyBhbHJlYWR5IHNwZWNpZmllZC4KLQl0ZXN0IC1uICIkZGlyX2FyZyRkc3RhcmciICYmIGJyZWFrCi0gICAgICAgICMgT3RoZXJ3aXNlLCB0aGUgbGFzdCBhcmd1bWVudCBpcyB0aGUgZGVzdGluYXRpb24uICBSZW1vdmUgaXQgZnJvbSAkQC4KLQlmb3IgYXJnCi0JZG8KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkZHN0YXJnIjsgdGhlbgotCSAgICAjICRAIGlzIG5vdCBlbXB0eTogaXQgY29udGFpbnMgYXQgbGVhc3QgJGFyZy4KLQkgICAgc2V0IGZub3JkICIkQCIgIiRkc3RhcmciCi0JICAgIHNoaWZ0ICMgZm5vcmQKLQkgIGZpCi0JICBzaGlmdCAjIGFyZwotCSAgZHN0YXJnPSRhcmcKLQlkb25lCi0JYnJlYWs7OwotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLXogIiQxIjsgdGhlbgotICBpZiB0ZXN0IC16ICIkZGlyX2FyZyI7IHRoZW4KLSAgICBlY2hvICIkMDogbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQuIiA+JjIKLSAgICBleGl0IDEKLSAgZmkKLSAgIyBJdCdzIE9LIHRvIGNhbGwgYGluc3RhbGwtc2ggLWQnIHdpdGhvdXQgYXJndW1lbnQuCi0gICMgVGhpcyBjYW4gaGFwcGVuIHdoZW4gY3JlYXRpbmcgY29uZGl0aW9uYWwgZGlyZWN0b3JpZXMuCi0gIGV4aXQgMAotZmkKLQotZm9yIHNyYwotZG8KLSAgIyBQcm90ZWN0IG5hbWVzIHN0YXJ0aW5nIHdpdGggYC0nLgotICBjYXNlICRzcmMgaW4KLSAgICAtKikgc3JjPS4vJHNyYyA7OwotICBlc2FjCi0KLSAgaWYgdGVzdCAtbiAiJGRpcl9hcmciOyB0aGVuCi0gICAgZHN0PSRzcmMKLSAgICBzcmM9Ci0KLSAgICBpZiB0ZXN0IC1kICIkZHN0IjsgdGhlbgotICAgICAgbWtkaXJjbWQ9OgotICAgICAgY2htb2RjbWQ9Ci0gICAgZWxzZQotICAgICAgbWtkaXJjbWQ9JG1rZGlycHJvZwotICAgIGZpCi0gIGVsc2UKLSAgICAjIFdhaXRpbmcgZm9yIHRoaXMgdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlICIkY3Bwcm9nICRzcmMgJGRzdHRtcCIgY29tbWFuZAotICAgICMgbWlnaHQgY2F1c2UgZGlyZWN0b3JpZXMgdG8gYmUgY3JlYXRlZCwgd2hpY2ggd291bGQgYmUgZXNwZWNpYWxseSBiYWQKLSAgICAjIGlmICRzcmMgKGFuZCB0aHVzICRkc3R0bXApIGNvbnRhaW5zICcqJy4KLSAgICBpZiB0ZXN0ICEgLWYgIiRzcmMiICYmIHRlc3QgISAtZCAiJHNyYyI7IHRoZW4KLSAgICAgIGVjaG8gIiQwOiAkc3JjIGRvZXMgbm90IGV4aXN0LiIgPiYyCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgaWYgdGVzdCAteiAiJGRzdGFyZyI7IHRoZW4KLSAgICAgIGVjaG8gIiQwOiBubyBkZXN0aW5hdGlvbiBzcGVjaWZpZWQuIiA+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBkc3Q9JGRzdGFyZwotICAgICMgUHJvdGVjdCBuYW1lcyBzdGFydGluZyB3aXRoIGAtJy4KLSAgICBjYXNlICRkc3QgaW4KLSAgICAgIC0qKSBkc3Q9Li8kZHN0IDs7Ci0gICAgZXNhYwotCi0gICAgIyBJZiBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeSwgYXBwZW5kIHRoZSBpbnB1dCBmaWxlbmFtZTsgd29uJ3Qgd29yawotICAgICMgaWYgZG91YmxlIHNsYXNoZXMgYXJlbid0IGlnbm9yZWQuCi0gICAgaWYgdGVzdCAtZCAiJGRzdCI7IHRoZW4KLSAgICAgIGlmIHRlc3QgLW4gIiRub190YXJnZXRfZGlyZWN0b3J5IjsgdGhlbgotCWVjaG8gIiQwOiAkZHN0YXJnOiBJcyBhIGRpcmVjdG9yeSIgPiYyCi0JZXhpdCAxCi0gICAgICBmaQotICAgICAgZHN0PSRkc3QvYGJhc2VuYW1lICIkc3JjImAKLSAgICBmaQotICBmaQotCi0gICMgVGhpcyBzZWQgY29tbWFuZCBlbXVsYXRlcyB0aGUgZGlybmFtZSBjb21tYW5kLgotICBkc3RkaXI9YGVjaG8gIiRkc3QiIHwgc2VkIC1lICdzLFteL10qJCwsO3MsLyQsLDtzLF4kLC4sJ2AKLQotICAjIE1ha2Ugc3VyZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZXhpc3RzLgotCi0gICMgU2tpcCBsb3RzIG9mIHN0YXQgY2FsbHMgaW4gdGhlIHVzdWFsIGNhc2UuCi0gIGlmIHRlc3QgISAtZCAiJGRzdGRpciI7IHRoZW4KLSAgICBkZWZhdWx0SUZTPScKLQkgJwotICAgIElGUz0iJHtJRlMtJGRlZmF1bHRJRlN9IgotCi0gICAgb0lGUz0kSUZTCi0gICAgIyBTb21lIHNoJ3MgY2FuJ3QgaGFuZGxlIElGUz0vIGZvciBzb21lIHJlYXNvbi4KLSAgICBJRlM9JyUnCi0gICAgc2V0IC0gYGVjaG8gIiRkc3RkaXIiIHwgc2VkIC1lICdzQC9AJUBnJyAtZSAnc0BeJUAvQCdgCi0gICAgSUZTPSRvSUZTCi0KLSAgICBwYXRoY29tcD0KLQotICAgIHdoaWxlIHRlc3QgJCMgLW5lIDAgOyBkbwotICAgICAgcGF0aGNvbXA9JHBhdGhjb21wJDEKLSAgICAgIHNoaWZ0Ci0gICAgICBpZiB0ZXN0ICEgLWQgIiRwYXRoY29tcCI7IHRoZW4KLSAgICAgICAgJG1rZGlycHJvZyAiJHBhdGhjb21wIgotCSMgbWtkaXIgY2FuIGZhaWwgd2l0aCBhIGBGaWxlIGV4aXN0JyBlcnJvciBpbiBjYXNlIHNldmVyYWwKLQkjIGluc3RhbGwtc2ggYXJlIGNyZWF0aW5nIHRoZSBkaXJlY3RvcnkgY29uY3VycmVudGx5LiAgVGhpcwotCSMgaXMgT0suCi0JdGVzdCAtZCAiJHBhdGhjb21wIiB8fCBleGl0Ci0gICAgICBmaQotICAgICAgcGF0aGNvbXA9JHBhdGhjb21wLwotICAgIGRvbmUKLSAgZmkKLQotICBpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KLSAgICAkZG9pdCAkbWtkaXJjbWQgIiRkc3QiIFwKLSAgICAgICYmIHsgdGVzdCAteiAiJGNob3duY21kIiB8fCAkZG9pdCAkY2hvd25jbWQgIiRkc3QiOyB9IFwKLSAgICAgICYmIHsgdGVzdCAteiAiJGNoZ3JwY21kIiB8fCAkZG9pdCAkY2hncnBjbWQgIiRkc3QiOyB9IFwKLSAgICAgICYmIHsgdGVzdCAteiAiJHN0cmlwY21kIiB8fCAkZG9pdCAkc3RyaXBjbWQgIiRkc3QiOyB9IFwKLSAgICAgICYmIHsgdGVzdCAteiAiJGNobW9kY21kIiB8fCAkZG9pdCAkY2htb2RjbWQgIiRkc3QiOyB9Ci0KLSAgZWxzZQotICAgIGRzdGZpbGU9YGJhc2VuYW1lICIkZHN0ImAKLQotICAgICMgTWFrZSBhIGNvdXBsZSBvZiB0ZW1wIGZpbGUgbmFtZXMgaW4gdGhlIHByb3BlciBkaXJlY3RvcnkuCi0gICAgZHN0dG1wPSRkc3RkaXIvX2luc3QuJCRfCi0gICAgcm10bXA9JGRzdGRpci9fcm0uJCRfCi0KLSAgICAjIFRyYXAgdG8gY2xlYW4gdXAgdGhvc2UgdGVtcCBmaWxlcyBhdCBleGl0LgotICAgIHRyYXAgJ3JldD0kPzsgcm0gLWYgIiRkc3R0bXAiICIkcm10bXAiICYmIGV4aXQgJHJldCcgMAotICAgIHRyYXAgJyhleGl0ICQ/KTsgZXhpdCcgMSAyIDEzIDE1Ci0KLSAgICAjIENvcHkgdGhlIGZpbGUgbmFtZSB0byB0aGUgdGVtcCBuYW1lLgotICAgICRkb2l0ICRjcHByb2cgIiRzcmMiICIkZHN0dG1wIiAmJgotCi0gICAgIyBhbmQgc2V0IGFueSBvcHRpb25zOyBkbyBjaG1vZCBsYXN0IHRvIHByZXNlcnZlIHNldHVpZCBiaXRzLgotICAgICMKLSAgICAjIElmIGFueSBvZiB0aGVzZSBmYWlsLCB3ZSBhYm9ydCB0aGUgd2hvbGUgdGhpbmcuICBJZiB3ZSB3YW50IHRvCi0gICAgIyBpZ25vcmUgZXJyb3JzIGZyb20gYW55IG9mIHRoZXNlLCBqdXN0IG1ha2Ugc3VyZSBub3QgdG8gaWdub3JlCi0gICAgIyBlcnJvcnMgZnJvbSB0aGUgYWJvdmUgIiRkb2l0ICRjcHByb2cgJHNyYyAkZHN0dG1wIiBjb21tYW5kLgotICAgICMKLSAgICB7IHRlc3QgLXogIiRjaG93bmNtZCIgfHwgJGRvaXQgJGNob3duY21kICIkZHN0dG1wIjsgfSBcCi0gICAgICAmJiB7IHRlc3QgLXogIiRjaGdycGNtZCIgfHwgJGRvaXQgJGNoZ3JwY21kICIkZHN0dG1wIjsgfSBcCi0gICAgICAmJiB7IHRlc3QgLXogIiRzdHJpcGNtZCIgfHwgJGRvaXQgJHN0cmlwY21kICIkZHN0dG1wIjsgfSBcCi0gICAgICAmJiB7IHRlc3QgLXogIiRjaG1vZGNtZCIgfHwgJGRvaXQgJGNobW9kY21kICIkZHN0dG1wIjsgfSAmJgotCi0gICAgIyBOb3cgcmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgotICAgIHsgJGRvaXQgJG12Y21kIC1mICIkZHN0dG1wIiAiJGRzdGRpci8kZHN0ZmlsZSIgMj4vZGV2L251bGwgXAotICAgICAgfHwgewotCSAgICMgVGhlIHJlbmFtZSBmYWlsZWQsIHBlcmhhcHMgYmVjYXVzZSBtdiBjYW4ndCByZW5hbWUgc29tZXRoaW5nIGVsc2UKLQkgICAjIHRvIGl0c2VsZiwgb3IgcGVyaGFwcyBiZWNhdXNlIG12IGlzIHNvIGFuY2llbnQgdGhhdCBpdCBkb2VzIG5vdAotCSAgICMgc3VwcG9ydCAtZi4KLQotCSAgICMgTm93IHJlbW92ZSBvciBtb3ZlIGFzaWRlIGFueSBvbGQgZmlsZSBhdCBkZXN0aW5hdGlvbiBsb2NhdGlvbi4KLQkgICAjIFdlIHRyeSB0aGlzIHR3byB3YXlzIHNpbmNlIHJtIGNhbid0IHVubGluayBpdHNlbGYgb24gc29tZQotCSAgICMgc3lzdGVtcyBhbmQgdGhlIGRlc3RpbmF0aW9uIGZpbGUgbWlnaHQgYmUgYnVzeSBmb3Igb3RoZXIKLQkgICAjIHJlYXNvbnMuICBJbiB0aGlzIGNhc2UsIHRoZSBmaW5hbCBjbGVhbnVwIG1pZ2h0IGZhaWwgYnV0IHRoZSBuZXcKLQkgICAjIGZpbGUgc2hvdWxkIHN0aWxsIGluc3RhbGwgc3VjY2Vzc2Z1bGx5LgotCSAgIHsKLQkgICAgIGlmIHRlc3QgLWYgIiRkc3RkaXIvJGRzdGZpbGUiOyB0aGVuCi0JICAgICAgICRkb2l0ICRybWNtZCAtZiAiJGRzdGRpci8kZHN0ZmlsZSIgMj4vZGV2L251bGwgXAotCSAgICAgICB8fCAkZG9pdCAkbXZjbWQgLWYgIiRkc3RkaXIvJGRzdGZpbGUiICIkcm10bXAiIDI+L2Rldi9udWxsIFwKLQkgICAgICAgfHwgewotCQkgZWNobyAiJDA6IGNhbm5vdCB1bmxpbmsgb3IgcmVuYW1lICRkc3RkaXIvJGRzdGZpbGUiID4mMgotCQkgKGV4aXQgMSk7IGV4aXQKLQkgICAgICAgfQotCSAgICAgZWxzZQotCSAgICAgICA6Ci0JICAgICBmaQotCSAgIH0gJiYKLQotCSAgICMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KLQkgICAkZG9pdCAkbXZjbWQgIiRkc3R0bXAiICIkZHN0ZGlyLyRkc3RmaWxlIgotCSB9Ci0gICAgfQotICBmaSB8fCB7IChleGl0IDEpOyBleGl0OyB9Ci1kb25lCi0KLSMgVGhlIGZpbmFsIGxpdHRsZSB0cmljayB0byAiY29ycmVjdGx5IiBwYXNzIHRoZSBleGl0IHN0YXR1cyB0byB0aGUgZXhpdCB0cmFwLgotewotICAoZXhpdCAwKTsgZXhpdAotfQotCi0jIExvY2FsIHZhcmlhYmxlczoKLSMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQotIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCi0jIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgotIyB0aW1lLXN0YW1wLWVuZDogIiQiCi0jIEVuZDoKZGlmZiAtLWdpdCBhL3Zta2l0L2NvbmZpZ3VyZSBiL3Zta2l0L2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzYxOWEzYy4uMDAwMDAwMAotLS0gYS92bWtpdC9jb25maWd1cmUKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92bWtpdC9kb2NzL2luZGV4Lmh0bWwgYi92bWtpdC9kb2NzL2luZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMjljNzcuLjAwMDAwMDAKLS0tIGEvdm1raXQvZG9jcy9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdm1raXQgZG94IGdvIGhlcmUuCmRpZmYgLS1naXQgYS92bWtpdC9maW5kLWl0LnNoIGIvdm1raXQvZmluZC1pdC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODNhZGJlZS4uMDAwMDAwMAotLS0gYS92bWtpdC9maW5kLWl0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyEvYmluL2Jhc2gKLQotaWYgWyAteiAiJDEiIF07IHRoZW4KLQotCQllY2hvICQwIHBhdHRlcm4KLQotZWxzZQotCi0JCWdyZXAgLS1leGNsdWRlIGZpbmQtaXQuc2ggLS1leGNsdWRlLWRpciBJSnZtIC0tZXhjbHVkZS1kaXIgSXNvbGF0ZSAtLWV4Y2x1ZGUgKi50eHQgLS1leGNsdWRlLWRpciBhdXRvY29uZiAtLWV4Y2x1ZGUgY29uZmlnLnN0YXR1cyAtLWV4Y2x1ZGUgY29uZmlnLmxvZyAtLWV4Y2x1ZGUgY29uZmlndXJlIC0tZXhjbHVkZSAqLnhtbCAtLWV4Y2x1ZGUgKi5odG1sIC0tZXhjbHVkZSAqLmphciAtLWV4Y2x1ZGUgKi5iYyAtLWV4Y2x1ZGUgTU1Ua0lubGluZS5pbmMgLS1leGNsdWRlLWRpciBwYXRjaGVzIC0tZXhjbHVkZS1kaXIgTjMgLS1leGNsdWRlICouamF2YSAtLWV4Y2x1ZGUgKi5jbGFzcyAtUiAtLWV4Y2x1ZGUtZGlyIC5zdm4gLS1leGNsdWRlLWRpciBSZWxlYXNlIC0tZXhjbHVkZSAqLnMgIiQxIiAuCi0KLWZpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdm1raXQvaW5jbHVkZS9kZWJ1Zy5oIGIvdm1raXQvaW5jbHVkZS9kZWJ1Zy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmFjNTM2Li4wMDAwMDAwCi0tLSBhL3Zta2l0L2luY2x1ZGUvZGVidWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0gZGVidWcuaCAtIERlYnVnIGZhY2lsaXRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2lmbmRlZiBERUJVR19ICi0jZGVmaW5lIERFQlVHX0gKLQotI2RlZmluZSBFU0MgIlwwMzNbIgotI2RlZmluZSBDT0xPUl9OT1JNQUwgIiIKLSNkZWZpbmUgRU5EICJtIgotCi0jZGVmaW5lIF9CTEFDSyAiMDAiCi0jZGVmaW5lIF9SRUQgIjAxIgotI2RlZmluZSBfR1JFRU4gIjAyIgotI2RlZmluZSBfWUVMTE9XICIwMyIKLSNkZWZpbmUgX0JMVUUgIjA0IgotI2RlZmluZSBfTUFHRU5UQSAiMDUiCi0jZGVmaW5lIF9DWUFOICIwNiIKLSNkZWZpbmUgX1dISVRFICIwNyIKLQotI2RlZmluZSBfTk9STUFMICIwMCIKLSNkZWZpbmUgX0JPTEQgIjAxIgotI2RlZmluZSBfU09VTElHTkUgIjA0IgotCi0jZGVmaW5lIE1LX0NPTE9SKHR5cGUsIGJnLCBmZykgdHlwZSI7ImJnIjsiZmcKLQotI2RlZmluZSBXSElURSBNS19DT0xPUihfTk9STUFMLCBfQkxBQ0ssIF9CTEFDSykKLQotI2RlZmluZSBEQVJLX01BR0VOVEEgTUtfQ09MT1IoX05PUk1BTCwgX0JMQUNLLCBfTUFHRU5UQSkKLSNkZWZpbmUgREFSS19ZRUxMT1cgTUtfQ09MT1IoX05PUk1BTCwgX0JMQUNLLCBfWUVMTE9XKQotI2RlZmluZSBEQVJLX0NZQU4gTUtfQ09MT1IoX05PUk1BTCwgX0JMQUNLLCBfQ1lBTikKLSNkZWZpbmUgREFSS19CTFVFIE1LX0NPTE9SKF9OT1JNQUwsIF9CTEFDSywgX0JMVUUpCi0jZGVmaW5lIERBUktfR1JFRU4gTUtfQ09MT1IoX05PUk1BTCwgX0JMQUNLLCBfR1JFRU4pCi0KLSNkZWZpbmUgTElHSFRfTUFHRU5UQSBNS19DT0xPUihfQk9MRCwgX0JMQUNLLCBfTUFHRU5UQSkKLSNkZWZpbmUgTElHSFRfWUVMTE9XIE1LX0NPTE9SKF9CT0xELCBfQkxBQ0ssIF9ZRUxMT1cpCi0jZGVmaW5lIExJR0hUX0NZQU4gTUtfQ09MT1IoX0JPTEQsIF9CTEFDSywgX0NZQU4pCi0jZGVmaW5lIExJR0hUX0JMVUUgTUtfQ09MT1IoX0JPTEQsIF9CTEFDSywgX0JMVUUpCi0jZGVmaW5lIExJR0hUX0dSRUVOIE1LX0NPTE9SKF9CT0xELCBfQkxBQ0ssIF9HUkVFTikKLSNkZWZpbmUgTElHSFRfUkVEIE1LX0NPTE9SKF9CT0xELCBfQkxBQ0ssIF9SRUQpCi0KLSNpZiBERUJVRyA+IDAKLQotICAjaWZkZWYgV0lUSF9DT0xPUgotICAgICNkZWZpbmUgUFJJTlRfREVCVUcoc3ltYiwgbGV2ZWwsIGNvbG9yLCAuLi4pIFwKLSAgICAgIGlmIChzeW1iID4gbGV2ZWwpIHsgXAotICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMlcyVzIiwgRVNDLCBjb2xvciwgRU5EKTsgXAotICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBfX1ZBX0FSR1NfXyk7IFwKLSAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzJXMlcyIsIEVTQywgQ09MT1JfTk9STUFMLCBFTkQpOyBcCi0gICAgICB9Ci0gICNlbHNlCi0gICAgI2RlZmluZSBQUklOVF9ERUJVRyhzeW1iLCBsZXZlbCwgY29sb3IsIC4uLikgXAotICAgICAgaWYgKHN5bWIgPiBsZXZlbCkgeyBcCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCBfX1ZBX0FSR1NfXyk7IFwKLSAgICAgIH0KLSAgI2VuZGlmCi0KLSNlbHNlCi0jZGVmaW5lIFBSSU5UX0RFQlVHKHN5bWIsIGxldmVsLCBjb2xvciwgYXJncy4uLikgZG8ge30gd2hpbGUoMCk7Ci0jZW5kaWYKLQotI2RlZmluZSBVTklNUExFTUVOVEVEKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgbXZtOjpUaHJlYWQ6OmdldCgpLT5wcmludEJhY2t0cmFjZSgpOyAgICAgICAgICAgXAotICBmcHJpbnRmKHN0ZGVyciwgIiVzOiVkXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOyBcCi0gIGFib3J0KCk7IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQotI2RlZmluZSBBQk9SVCgpIFVOSU1QTEVNRU5URUQoKQotI2RlZmluZSBVTlJFQUNIQUJMRSgpIEFCT1JUKCkKLQotI2RlZmluZSBBU1NFUlQoY29uZCkgeyAgXAotCQlpZiAoIWNvbmQpIHsgZnByaW50ZihzdGRlcnIsICJmYXRhbDogYXNzZXJ0KCIjY29uZCIpXG4iKTsgQUJPUlQoKTsgfSB9IFwKLQotI3VuZGVmIEFMV0FZU19JTkxJTkUKLSNkZWZpbmUgQUxXQVlTX0lOTElORSBfX2F0dHJpYnV0ZV9fICgoYWx3YXlzX2lubGluZSkpCi0KLSNpZm5kZWYgREVCVUcKLSNpZmRlZiBfREVCVUcKLSNkZWZpbmUgREVCVUcKLSNlbmRpZgotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvaW5jbHVkZS9qMy9KM0ludHJpbnNpY3MuaCBiL3Zta2l0L2luY2x1ZGUvajMvSjNJbnRyaW5zaWNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMmQxMjUuLjAwMDAwMDAKLS0tIGEvdm1raXQvaW5jbHVkZS9qMy9KM0ludHJpbnNpY3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLS0tIEozSW50cmluc2ljcy5oIC0gSW50cmluc2ljcyBvZiBKMyAtLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2lmbmRlZiBKM19JTlRSSU5TSUNTX0gKLSNkZWZpbmUgSjNfSU5UUklOU0lDU19ICi0KLSNpbmNsdWRlICJtdm0vSklULmgiCi0KLW5hbWVzcGFjZSBqMyB7Ci0KLWNsYXNzIEozSW50cmluc2ljcyA6IHB1YmxpYyBtdm06OkJhc2VJbnRyaW5zaWNzIHsKLQotcHVibGljOgotICBjb25zdCBsbHZtOjpUeXBlKiBKYXZhQXJyYXlVSW50OFR5cGU7Ci0gIGNvbnN0IGxsdm06OlR5cGUqIEphdmFBcnJheVNJbnQ4VHlwZTsKLSAgY29uc3QgbGx2bTo6VHlwZSogSmF2YUFycmF5VUludDE2VHlwZTsKLSAgY29uc3QgbGx2bTo6VHlwZSogSmF2YUFycmF5U0ludDE2VHlwZTsKLSAgY29uc3QgbGx2bTo6VHlwZSogSmF2YUFycmF5VUludDMyVHlwZTsKLSAgY29uc3QgbGx2bTo6VHlwZSogSmF2YUFycmF5U0ludDMyVHlwZTsKLSAgY29uc3QgbGx2bTo6VHlwZSogSmF2YUFycmF5TG9uZ1R5cGU7Ci0gIGNvbnN0IGxsdm06OlR5cGUqIEphdmFBcnJheUZsb2F0VHlwZTsKLSAgY29uc3QgbGx2bTo6VHlwZSogSmF2YUFycmF5RG91YmxlVHlwZTsKLSAgY29uc3QgbGx2bTo6VHlwZSogSmF2YUFycmF5T2JqZWN0VHlwZTsKLSAgCi0gIGNvbnN0IGxsdm06OlR5cGUqIEphdmFPYmplY3RUeXBlOwotICBjb25zdCBsbHZtOjpUeXBlKiBKYXZhT2JqZWN0UHRyVHlwZTsKLSAgY29uc3QgbGx2bTo6VHlwZSogSmF2YUFycmF5VHlwZTsKLSAgY29uc3QgbGx2bTo6VHlwZSogSmF2YUNvbW1vbkNsYXNzVHlwZTsKLSAgY29uc3QgbGx2bTo6VHlwZSogSmF2YUNsYXNzVHlwZTsKLSAgY29uc3QgbGx2bTo6VHlwZSogSmF2YUNsYXNzQXJyYXlUeXBlOwotICBjb25zdCBsbHZtOjpUeXBlKiBKYXZhQ2xhc3NQcmltaXRpdmVUeXBlOwotICBjb25zdCBsbHZtOjpUeXBlKiBDb25zdGFudFBvb2xUeXBlOwotICBjb25zdCBsbHZtOjpUeXBlKiBDb2RlTGluZUluZm9UeXBlOwotICBjb25zdCBsbHZtOjpUeXBlKiBVVEY4VHlwZTsKLSAgY29uc3QgbGx2bTo6VHlwZSogSmF2YU1ldGhvZFR5cGU7Ci0gIGNvbnN0IGxsdm06OlR5cGUqIEphdmFGaWVsZFR5cGU7Ci0gIGNvbnN0IGxsdm06OlR5cGUqIEF0dHJpYnV0VHlwZTsKLSAgY29uc3QgbGx2bTo6VHlwZSogSmF2YVRocmVhZFR5cGU7Ci0gIAotICBsbHZtOjpGdW5jdGlvbiogU3RhcnRKTklGdW5jdGlvbjsKLSAgbGx2bTo6RnVuY3Rpb24qIEVuZEpOSUZ1bmN0aW9uOwotICBsbHZtOjpGdW5jdGlvbiogSW50ZXJmYWNlTG9va3VwRnVuY3Rpb247Ci0gIGxsdm06OkZ1bmN0aW9uKiBWaXJ0dWFsRmllbGRMb29rdXBGdW5jdGlvbjsKLSAgbGx2bTo6RnVuY3Rpb24qIFN0YXRpY0ZpZWxkTG9va3VwRnVuY3Rpb247Ci0gIGxsdm06OkZ1bmN0aW9uKiBQcmludEV4ZWN1dGlvbkZ1bmN0aW9uOwotICBsbHZtOjpGdW5jdGlvbiogUHJpbnRNZXRob2RTdGFydEZ1bmN0aW9uOwotICBsbHZtOjpGdW5jdGlvbiogUHJpbnRNZXRob2RFbmRGdW5jdGlvbjsKLSAgbGx2bTo6RnVuY3Rpb24qIEluaXRpYWxpc2VDbGFzc0Z1bmN0aW9uOwotICBsbHZtOjpGdW5jdGlvbiogSW5pdGlhbGlzYXRpb25DaGVja0Z1bmN0aW9uOwotICBsbHZtOjpGdW5jdGlvbiogRm9yY2VJbml0aWFsaXNhdGlvbkNoZWNrRnVuY3Rpb247Ci0gIGxsdm06OkZ1bmN0aW9uKiBGb3JjZUxvYWRlZENoZWNrRnVuY3Rpb247Ci0gIGxsdm06OkZ1bmN0aW9uKiBDbGFzc0xvb2t1cEZ1bmN0aW9uOwotICBsbHZtOjpGdW5jdGlvbiogU3RyaW5nTG9va3VwRnVuY3Rpb247Ci0gIAotICBsbHZtOjpGdW5jdGlvbiogUmVzb2x2ZVZpcnR1YWxTdHViRnVuY3Rpb247Ci0gIGxsdm06OkZ1bmN0aW9uKiBSZXNvbHZlU3BlY2lhbFN0dWJGdW5jdGlvbjsKLSAgbGx2bTo6RnVuY3Rpb24qIFJlc29sdmVTdGF0aWNTdHViRnVuY3Rpb247Ci0gIGxsdm06OkZ1bmN0aW9uKiBSZXNvbHZlSW50ZXJmYWNlRnVuY3Rpb247Ci0KLSNpZm5kZWYgV0lUSE9VVF9WVEFCTEUKLSAgbGx2bTo6RnVuY3Rpb24qIFZpcnR1YWxMb29rdXBGdW5jdGlvbjsKLSNlbmRpZgotICBsbHZtOjpGdW5jdGlvbiogSXNBc3NpZ25hYmxlRnJvbUZ1bmN0aW9uOwotICBsbHZtOjpGdW5jdGlvbiogSXNTZWNvbmRhcnlDbGFzc0Z1bmN0aW9uOwotICBsbHZtOjpGdW5jdGlvbiogR2V0RGVwdGhGdW5jdGlvbjsKLSAgbGx2bTo6RnVuY3Rpb24qIEdldERpc3BsYXlGdW5jdGlvbjsKLSAgbGx2bTo6RnVuY3Rpb24qIEdldFZUSW5EaXNwbGF5RnVuY3Rpb247Ci0gIGxsdm06OkZ1bmN0aW9uKiBHZXRTdGF0aWNJbnN0YW5jZUZ1bmN0aW9uOwotICBsbHZtOjpGdW5jdGlvbiogQXF1aXJlT2JqZWN0RnVuY3Rpb247Ci0gIGxsdm06OkZ1bmN0aW9uKiBSZWxlYXNlT2JqZWN0RnVuY3Rpb247Ci0gIGxsdm06OkZ1bmN0aW9uKiBHZXRDb25zdGFudFBvb2xBdEZ1bmN0aW9uOwotICBsbHZtOjpGdW5jdGlvbiogTXVsdGlDYWxsTmV3RnVuY3Rpb247Ci0gIGxsdm06OkZ1bmN0aW9uKiBHZXRBcnJheUNsYXNzRnVuY3Rpb247Ci0KLSAgbGx2bTo6RnVuY3Rpb24qIEdldENsYXNzRGVsZWdhdGVlRnVuY3Rpb247Ci0gIGxsdm06OkZ1bmN0aW9uKiBSdW50aW1lRGVsZWdhdGVlRnVuY3Rpb247Ci0gIGxsdm06OkZ1bmN0aW9uKiBBcnJheUxlbmd0aEZ1bmN0aW9uOwotICBsbHZtOjpGdW5jdGlvbiogR2V0VlRGdW5jdGlvbjsKLSAgbGx2bTo6RnVuY3Rpb24qIEdldElNVEZ1bmN0aW9uOwotICBsbHZtOjpGdW5jdGlvbiogR2V0Q2xhc3NGdW5jdGlvbjsKLSAgbGx2bTo6RnVuY3Rpb24qIEdldFZURnJvbUNsYXNzRnVuY3Rpb247Ci0gIGxsdm06OkZ1bmN0aW9uKiBHZXRWVEZyb21DbGFzc0FycmF5RnVuY3Rpb247Ci0gIGxsdm06OkZ1bmN0aW9uKiBHZXRWVEZyb21Db21tb25DbGFzc0Z1bmN0aW9uOwotICBsbHZtOjpGdW5jdGlvbiogR2V0T2JqZWN0U2l6ZUZyb21DbGFzc0Z1bmN0aW9uOwotICBsbHZtOjpGdW5jdGlvbiogR2V0QmFzZUNsYXNzVlRGcm9tVlRGdW5jdGlvbjsKLQotICBsbHZtOjpGdW5jdGlvbiogR2V0TG9ja0Z1bmN0aW9uOwotICAKLSAgbGx2bTo6RnVuY3Rpb24qIEdldEZpbmFsSW50OEZpZWxkRnVuY3Rpb247Ci0gIGxsdm06OkZ1bmN0aW9uKiBHZXRGaW5hbEludDE2RmllbGRGdW5jdGlvbjsKLSAgbGx2bTo6RnVuY3Rpb24qIEdldEZpbmFsSW50MzJGaWVsZEZ1bmN0aW9uOwotICBsbHZtOjpGdW5jdGlvbiogR2V0RmluYWxMb25nRmllbGRGdW5jdGlvbjsKLSAgbGx2bTo6RnVuY3Rpb24qIEdldEZpbmFsRmxvYXRGaWVsZEZ1bmN0aW9uOwotICBsbHZtOjpGdW5jdGlvbiogR2V0RmluYWxEb3VibGVGaWVsZEZ1bmN0aW9uOwotICAKLSAgbGx2bTo6Q29uc3RhbnQqIEphdmFBcnJheVNpemVPZmZzZXRDb25zdGFudDsKLSAgbGx2bTo6Q29uc3RhbnQqIEphdmFBcnJheUVsZW1lbnRzT2Zmc2V0Q29uc3RhbnQ7Ci0gIGxsdm06OkNvbnN0YW50KiBKYXZhT2JqZWN0TG9ja09mZnNldENvbnN0YW50OwotICBsbHZtOjpDb25zdGFudCogSmF2YU9iamVjdFZUT2Zmc2V0Q29uc3RhbnQ7Ci0KLSAgbGx2bTo6Q29uc3RhbnQqIE9mZnNldEFjY2Vzc0luQ29tbW9uQ2xhc3NDb25zdGFudDsKLSAgbGx2bTo6Q29uc3RhbnQqIElzQXJyYXlDb25zdGFudDsKLSAgbGx2bTo6Q29uc3RhbnQqIElzUHJpbWl0aXZlQ29uc3RhbnQ7Ci0gIGxsdm06OkNvbnN0YW50KiBPZmZzZXRPYmplY3RTaXplSW5DbGFzc0NvbnN0YW50OwotICBsbHZtOjpDb25zdGFudCogT2Zmc2V0VlRJbkNsYXNzQ29uc3RhbnQ7Ci0gIGxsdm06OkNvbnN0YW50KiBPZmZzZXRUYXNrQ2xhc3NNaXJyb3JJbkNsYXNzQ29uc3RhbnQ7Ci0gIGxsdm06OkNvbnN0YW50KiBPZmZzZXRTdGF0aWNJbnN0YW5jZUluVGFza0NsYXNzTWlycm9yQ29uc3RhbnQ7Ci0gIGxsdm06OkNvbnN0YW50KiBPZmZzZXRJbml0aWFsaXplZEluVGFza0NsYXNzTWlycm9yQ29uc3RhbnQ7Ci0gIGxsdm06OkNvbnN0YW50KiBPZmZzZXRTdGF0dXNJblRhc2tDbGFzc01pcnJvckNvbnN0YW50OwotICAKLSAgbGx2bTo6Q29uc3RhbnQqIE9mZnNldEpOSUluSmF2YVRocmVhZENvbnN0YW50OwotICBsbHZtOjpDb25zdGFudCogT2Zmc2V0SmF2YUV4Y2VwdGlvbkluSmF2YVRocmVhZENvbnN0YW50OwotICAKLSAgbGx2bTo6Q29uc3RhbnQqIE9mZnNldENsYXNzSW5WVENvbnN0YW50OwotICBsbHZtOjpDb25zdGFudCogT2Zmc2V0RGVwdGhJblZUQ29uc3RhbnQ7Ci0gIGxsdm06OkNvbnN0YW50KiBPZmZzZXREaXNwbGF5SW5WVENvbnN0YW50OwotICBsbHZtOjpDb25zdGFudCogT2Zmc2V0QmFzZUNsYXNzVlRJblZUQ29uc3RhbnQ7Ci0gIGxsdm06OkNvbnN0YW50KiBPZmZzZXRJTVRJblZUQ29uc3RhbnQ7Ci0gIAotICBsbHZtOjpDb25zdGFudCogT2Zmc2V0QmFzZUNsYXNzSW5BcnJheUNsYXNzQ29uc3RhbnQ7Ci0gIGxsdm06OkNvbnN0YW50KiBPZmZzZXRMb2dTaXplSW5QcmltaXRpdmVDbGFzc0NvbnN0YW50OwotICAKLSAgbGx2bTo6Q29uc3RhbnQqIENsYXNzUmVhZHlDb25zdGFudDsKLQotICBsbHZtOjpDb25zdGFudCogSmF2YU9iamVjdE51bGxDb25zdGFudDsKLSAgbGx2bTo6Q29uc3RhbnQqIE1heEFycmF5U2l6ZUNvbnN0YW50OwotICBsbHZtOjpDb25zdGFudCogSmF2YUFycmF5U2l6ZUNvbnN0YW50OwotCi0gIGxsdm06OkZ1bmN0aW9uKiBUaHJvd0V4Y2VwdGlvbkZ1bmN0aW9uOwotICBsbHZtOjpGdW5jdGlvbiogTnVsbFBvaW50ZXJFeGNlcHRpb25GdW5jdGlvbjsKLSAgbGx2bTo6RnVuY3Rpb24qIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25GdW5jdGlvbjsKLSAgbGx2bTo6RnVuY3Rpb24qIENsYXNzQ2FzdEV4Y2VwdGlvbkZ1bmN0aW9uOwotICBsbHZtOjpGdW5jdGlvbiogT3V0T2ZNZW1vcnlFcnJvckZ1bmN0aW9uOwotICBsbHZtOjpGdW5jdGlvbiogU3RhY2tPdmVyZmxvd0Vycm9yRnVuY3Rpb247Ci0gIGxsdm06OkZ1bmN0aW9uKiBOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbkZ1bmN0aW9uOwotICBsbHZtOjpGdW5jdGlvbiogQXJyYXlTdG9yZUV4Y2VwdGlvbkZ1bmN0aW9uOwotICBsbHZtOjpGdW5jdGlvbiogQXJpdGhtZXRpY0V4Y2VwdGlvbkZ1bmN0aW9uOwotICBsbHZtOjpGdW5jdGlvbiogVGhyb3dFeGNlcHRpb25Gcm9tSklURnVuY3Rpb247Ci0gIAotCi0gIEozSW50cmluc2ljcyhsbHZtOjpNb2R1bGUqKTsKLSAgCi0gIHN0YXRpYyB2b2lkIGluaXRpYWxpc2UoKTsKLQotfTsKLQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2luY2x1ZGUvajMvSmF2YUFPVENvbXBpbGVyLmggYi92bWtpdC9pbmNsdWRlL2ozL0phdmFBT1RDb21waWxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDA2YzMyLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2luY2x1ZGUvajMvSmF2YUFPVENvbXBpbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLy89PT0tLS0tLS0gSmF2YUFPVENvbXBpbGVyLmggLSBUaGUgSjMgYWhlYWQgb2YgdGltZSBjb21waWxlciAtLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgSjNfQU9UX0NPTVBJTEVSX0gKLSNkZWZpbmUgSjNfQU9UX0NPTVBJTEVSX0gKLQotI2luY2x1ZGUgImozL0phdmFMTFZNQ29tcGlsZXIuaCIKLQotbmFtZXNwYWNlIGozIHsKLQotY2xhc3MgQXJyYXlPYmplY3Q7Ci1jbGFzcyBBdHRyaWJ1dDsKLQotdXNpbmcgbXZtOjpVVEY4OwotCi1jbGFzcyBKYXZhQU9UQ29tcGlsZXIgOiBwdWJsaWMgSmF2YUxMVk1Db21waWxlciB7Ci0KLXB1YmxpYzoKLSAgSmF2YUFPVENvbXBpbGVyKGNvbnN0IHN0ZDo6c3RyaW5nICZNb2R1bGVJRCk7Ci0gIAotICB2aXJ0dWFsIGJvb2wgaXNTdGF0aWNDb21waWxpbmcoKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIHZpcnR1YWwgYm9vbCBlbWl0RnVuY3Rpb25OYW1lKCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICB2aXJ0dWFsIEphdmFDb21waWxlciogQ3JlYXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBNb2R1bGVJRCkgewotICAgIHJldHVybiBuZXcgSmF2YUFPVENvbXBpbGVyKE1vZHVsZUlEKTsKLSAgfQotICAKLSAgdmlydHVhbCB2b2lkKiBtYXRlcmlhbGl6ZUZ1bmN0aW9uKEphdmFNZXRob2QqIG1ldGgpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbiBub3QgbWF0ZXJpYWxlIGEgZnVuY3Rpb24gaW4gQU9UIG1vZGUuIik7Ci0gICAgYWJvcnQoKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCogR2VuZXJhdGVTdHViKGxsdm06OkZ1bmN0aW9uKiBGKSB7Ci0gICAgLy8gRG8gbm90aGluZyBpbiBjYXNlIG9mIEFPVC4KLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICAKLSAgdmlydHVhbCBsbHZtOjpWYWx1ZSogYWRkQ2FsbGJhY2soQ2xhc3MqIGNsLCB1aW50MTYgaW5kZXgsIFNpZ25kZWYqIHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RhdCwgbGx2bTo6QmFzaWNCbG9jayogaW5zZXJ0KTsKLSAgCi0gIHZpcnR1YWwgdm9pZCBtYWtlVlQoQ2xhc3MqIGNsKTsKLSAgdmlydHVhbCB2b2lkIG1ha2VJTVQoQ2xhc3MqIGNsKTsKLSAKLSAgbGx2bTo6Q29uc3RhbnQqIEhhbmRsZU1hZ2ljKEphdmFPYmplY3QqIG9iaiwgQ29tbW9uQ2xhc3MqIGNsKTsKLSAgdmlydHVhbCBsbHZtOjpDb25zdGFudCogZ2V0RmluYWxPYmplY3QoSmF2YU9iamVjdCogb2JqLCBDb21tb25DbGFzcyogY2wpOwotICB2aXJ0dWFsIEphdmFPYmplY3QqIGdldEZpbmFsT2JqZWN0KGxsdm06OlZhbHVlKiBDKTsKLSAgdmlydHVhbCBsbHZtOjpDb25zdGFudCogZ2V0TmF0aXZlQ2xhc3MoQ29tbW9uQ2xhc3MqIGNsKTsKLSAgdmlydHVhbCBsbHZtOjpDb25zdGFudCogZ2V0SmF2YUNsYXNzKENvbW1vbkNsYXNzKiBjbCk7Ci0gIHZpcnR1YWwgbGx2bTo6Q29uc3RhbnQqIGdldEphdmFDbGFzc1B0cihDb21tb25DbGFzcyogY2wpOwotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50KiBnZXRTdGF0aWNJbnN0YW5jZShDbGFzcyogY2wpOwotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50KiBnZXRWaXJ0dWFsVGFibGUoSmF2YVZpcnR1YWxUYWJsZSopOwotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50KiBnZXRNZXRob2RJbkNsYXNzKEphdmFNZXRob2QqIG1ldGgpOwotICAKLSAgdmlydHVhbCBsbHZtOjpDb25zdGFudCogZ2V0U3RyaW5nKEphdmFTdHJpbmcqIHN0cik7Ci0gIHZpcnR1YWwgbGx2bTo6Q29uc3RhbnQqIGdldFN0cmluZ1B0cihKYXZhU3RyaW5nKiogc3RyKTsKLSAgdmlydHVhbCBsbHZtOjpDb25zdGFudCogZ2V0Q29uc3RhbnRQb29sKEphdmFDb25zdGFudFBvb2wqIGN0cCk7Ci0gIHZpcnR1YWwgbGx2bTo6Q29uc3RhbnQqIGdldE5hdGl2ZUZ1bmN0aW9uKEphdmFNZXRob2QqIG1ldGgsIHZvaWQqIG5hdFB0cik7Ci0gIAotICB2aXJ0dWFsIHZvaWQgc2V0TWV0aG9kKGxsdm06OkZ1bmN0aW9uKiBmdW5jLCB2b2lkKiBwdHIsIGNvbnN0IGNoYXIqIG5hbWUpOwotICAKLSAgdmlydHVhbCB+SmF2YUFPVENvbXBpbGVyKCkge30KLSAgCi0gIHZpcnR1YWwgdm9pZCogbG9hZE1ldGhvZCh2b2lkKiBoYW5kbGUsIGNvbnN0IGNoYXIqIHN5bWJvbCk7Ci0KLSAgdmlydHVhbCBDb21tb25DbGFzcyogZ2V0VW5pcXVlQmFzZUNsYXNzKENvbW1vbkNsYXNzKiBjbCk7Ci0KLXByaXZhdGU6Ci0KLSAgLy8tLS0tLS0tLS0tLS0tLS0gU3RhdGljIGNvbXBpbGVyIHNwZWNpZmljIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0gIGxsdm06OkNvbnN0YW50KiBDcmVhdGVDb25zdGFudEZyb21WVChKYXZhVmlydHVhbFRhYmxlKiBWVCk7Ci0gIGxsdm06OkNvbnN0YW50KiBDcmVhdGVDb25zdGFudEZyb21VVEY4KGNvbnN0IFVURjgqIHZhbCk7Ci0gIGxsdm06OkNvbnN0YW50KiBDcmVhdGVDb25zdGFudEZyb21Db21tb25DbGFzcyhDb21tb25DbGFzcyogY2wpOwotICBsbHZtOjpDb25zdGFudCogQ3JlYXRlQ29uc3RhbnRGcm9tQ2xhc3MoQ2xhc3MqIGNsKTsKLSAgbGx2bTo6Q29uc3RhbnQqIENyZWF0ZUNvbnN0YW50RnJvbUNsYXNzUHJpbWl0aXZlKENsYXNzUHJpbWl0aXZlKiBjbCk7Ci0gIGxsdm06OkNvbnN0YW50KiBDcmVhdGVDb25zdGFudEZyb21DbGFzc0FycmF5KENsYXNzQXJyYXkqIGNsKTsKLSAgbGx2bTo6Q29uc3RhbnQqIENyZWF0ZUNvbnN0YW50RnJvbUF0dHJpYnV0KEF0dHJpYnV0JiBhdHRyaWJ1dCk7Ci0gIGxsdm06OkNvbnN0YW50KiBDcmVhdGVDb25zdGFudEZyb21KYXZhRmllbGQoSmF2YUZpZWxkJiBmaWVsZCk7Ci0gIGxsdm06OkNvbnN0YW50KiBDcmVhdGVDb25zdGFudEZyb21KYXZhTWV0aG9kKEphdmFNZXRob2QmIG1ldGhvZCk7Ci0gIGxsdm06OkNvbnN0YW50KiBDcmVhdGVDb25zdGFudEZyb21TdGF0aWNJbnN0YW5jZShDbGFzcyogY2wpOwotICBsbHZtOjpDb25zdGFudCogQ3JlYXRlQ29uc3RhbnRGcm9tSmF2YVN0cmluZyhKYXZhU3RyaW5nKiBzdHIpOwotICBsbHZtOjpDb25zdGFudCogQ3JlYXRlQ29uc3RhbnRGcm9tSmF2YUNsYXNzKENvbW1vbkNsYXNzKiBjbCk7Ci0gIGxsdm06OkNvbnN0YW50KiBDcmVhdGVDb25zdGFudEZvckJhc2VPYmplY3QoQ29tbW9uQ2xhc3MqIGNsKTsKLSAgbGx2bTo6Q29uc3RhbnQqIENyZWF0ZUNvbnN0YW50RnJvbUphdmFPYmplY3QoSmF2YU9iamVjdCogb2JqKTsKLSAgbGx2bTo6Q29uc3RhbnQqIGdldFVURjgoY29uc3QgVVRGOCogdmFsKTsKLSAgCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gIGxsdm06OkNvbnN0YW50KiBDcmVhdGVDb25zdGFudEZyb21JbnRBcnJheShjb25zdCBUKiB2YWwsIGNvbnN0IGxsdm06OlR5cGUqIFR5KTsKLSAgCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gIGxsdm06OkNvbnN0YW50KiBDcmVhdGVDb25zdGFudEZyb21GUEFycmF5KGNvbnN0IFQqIHZhbCwgY29uc3QgbGx2bTo6VHlwZSogVHkpOwotCi0gIGxsdm06OkNvbnN0YW50KiBDcmVhdGVDb25zdGFudEZyb21PYmplY3RBcnJheShjb25zdCBBcnJheU9iamVjdCogdmFsKTsKLSAgCi0gIHN0ZDo6bWFwPGNvbnN0IENvbW1vbkNsYXNzKiwgbGx2bTo6Q29uc3RhbnQqPiBuYXRpdmVDbGFzc2VzOwotICBzdGQ6Om1hcDxjb25zdCBDbGFzc0FycmF5KiwgbGx2bTo6R2xvYmFsVmFyaWFibGUqPiBhcnJheUNsYXNzZXM7Ci0gIHN0ZDo6bWFwPGNvbnN0IENvbW1vbkNsYXNzKiwgbGx2bTo6Q29uc3RhbnQqPiBqYXZhQ2xhc3NlczsKLSAgc3RkOjptYXA8Y29uc3QgSmF2YVZpcnR1YWxUYWJsZSosIGxsdm06OkNvbnN0YW50Kj4gdmlydHVhbFRhYmxlczsKLSAgc3RkOjptYXA8Y29uc3QgQ2xhc3MqLCBsbHZtOjpDb25zdGFudCo+IHN0YXRpY0luc3RhbmNlczsKLSAgc3RkOjptYXA8Y29uc3QgSmF2YUNvbnN0YW50UG9vbCosIGxsdm06OkNvbnN0YW50Kj4gY29uc3RhbnRQb29sczsKLSAgc3RkOjptYXA8Y29uc3QgSmF2YVN0cmluZyosIGxsdm06OkNvbnN0YW50Kj4gc3RyaW5nczsKLSAgc3RkOjptYXA8Y29uc3QgSmF2YU1ldGhvZCosIGxsdm06OkNvbnN0YW50Kj4gbmF0aXZlRnVuY3Rpb25zOwotICBzdGQ6Om1hcDxjb25zdCBVVEY4KiwgbGx2bTo6Q29uc3RhbnQqPiB1dGY4czsKLSAgc3RkOjptYXA8Y29uc3QgQ2xhc3MqLCBsbHZtOjpDb25zdGFudCo+IHZpcnR1YWxNZXRob2RzOwotICBzdGQ6Om1hcDxjb25zdCBKYXZhT2JqZWN0KiwgbGx2bTo6Q29uc3RhbnQqPiBmaW5hbE9iamVjdHM7Ci0gIHN0ZDo6bWFwPGNvbnN0IGxsdm06OkNvbnN0YW50KiwgSmF2YU9iamVjdCo+IHJldmVyc2VGaW5hbE9iamVjdHM7Ci0gIAotICB0eXBlZGVmIHN0ZDo6bWFwPGNvbnN0IEphdmFPYmplY3QqLCBsbHZtOjpDb25zdGFudCo+OjppdGVyYXRvcgotICAgIGZpbmFsX29iamVjdF9pdGVyYXRvcjsKLSAgCi0gIHR5cGVkZWYgc3RkOjptYXA8Y29uc3QgbGx2bTo6Q29uc3RhbnQqLCBKYXZhT2JqZWN0Kj46Oml0ZXJhdG9yCi0gICAgcmV2ZXJzZV9maW5hbF9vYmplY3RfaXRlcmF0b3I7Ci0gIAotICB0eXBlZGVmIHN0ZDo6bWFwPGNvbnN0IENsYXNzKiwgbGx2bTo6Q29uc3RhbnQqPjo6aXRlcmF0b3IKLSAgICBtZXRob2RfaXRlcmF0b3I7Ci0gIAotICB0eXBlZGVmIHN0ZDo6bWFwPGNvbnN0IENvbW1vbkNsYXNzKiwgbGx2bTo6Q29uc3RhbnQqPjo6aXRlcmF0b3IKLSAgICBuYXRpdmVfY2xhc3NfaXRlcmF0b3I7IAotICAKLSAgdHlwZWRlZiBzdGQ6Om1hcDxjb25zdCBDbGFzc0FycmF5KiwgbGx2bTo6R2xvYmFsVmFyaWFibGUqPjo6aXRlcmF0b3IKLSAgICBhcnJheV9jbGFzc19pdGVyYXRvcjsKLSAgCi0gIHR5cGVkZWYgc3RkOjptYXA8Y29uc3QgQ29tbW9uQ2xhc3MqLCBsbHZtOjpDb25zdGFudCo+OjppdGVyYXRvcgotICAgIGphdmFfY2xhc3NfaXRlcmF0b3I7Ci0gIAotICB0eXBlZGVmIHN0ZDo6bWFwPGNvbnN0IEphdmFWaXJ0dWFsVGFibGUqLCBsbHZtOjpDb25zdGFudCo+OjppdGVyYXRvcgotICAgIHZpcnR1YWxfdGFibGVfaXRlcmF0b3I7Ci0gIAotICB0eXBlZGVmIHN0ZDo6bWFwPGNvbnN0IENsYXNzKiwgbGx2bTo6Q29uc3RhbnQqPjo6aXRlcmF0b3IKLSAgICBzdGF0aWNfaW5zdGFuY2VfaXRlcmF0b3I7Ci0gIAotICB0eXBlZGVmIHN0ZDo6bWFwPGNvbnN0IEphdmFDb25zdGFudFBvb2wqLCBsbHZtOjpDb25zdGFudCo+OjppdGVyYXRvcgotICAgIGNvbnN0YW50X3Bvb2xfaXRlcmF0b3I7Ci0gIAotICB0eXBlZGVmIHN0ZDo6bWFwPGNvbnN0IEphdmFTdHJpbmcqLCBsbHZtOjpDb25zdGFudCo+OjppdGVyYXRvcgotICAgIHN0cmluZ19pdGVyYXRvcjsKLSAgCi0gIHR5cGVkZWYgc3RkOjptYXA8Y29uc3QgSmF2YU1ldGhvZCosIGxsdm06OkNvbnN0YW50Kj46Oml0ZXJhdG9yCi0gICAgbmF0aXZlX2Z1bmN0aW9uX2l0ZXJhdG9yOwotICAKLSAgdHlwZWRlZiBzdGQ6Om1hcDxjb25zdCBVVEY4KiwgbGx2bTo6Q29uc3RhbnQqPjo6aXRlcmF0b3IKLSAgICB1dGY4X2l0ZXJhdG9yOwotCi0gIGJvb2wgaXNDb21waWxpbmcoY29uc3QgQ29tbW9uQ2xhc3MqIGNsKSBjb25zdDsKLQotcHVibGljOgotICBsbHZtOjpGdW5jdGlvbiogU3RhdGljSW5pdGlhbGl6ZXI7Ci0gIGxsdm06OkZ1bmN0aW9uKiBPYmplY3RQcmludGVyOwotICBsbHZtOjpGdW5jdGlvbiogQ2FsbGJhY2s7Ci0gIGxsdm06OkZ1bmN0aW9uKiBBcnJheU9iamVjdFRyYWNlcjsKLSAgbGx2bTo6RnVuY3Rpb24qIFJlZ3VsYXJPYmplY3RUcmFjZXI7Ci0gIGxsdm06OkZ1bmN0aW9uKiBKYXZhT2JqZWN0VHJhY2VyOwotICBsbHZtOjpGdW5jdGlvbiogUmVmZXJlbmNlT2JqZWN0VHJhY2VyOwotICAKLSAgYm9vbCBnZW5lcmF0ZVN0dWJzOwotICBib29sIGFzc3VtZUNvbXBpbGVkOwotICBib29sIGNvbXBpbGVSVDsKLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGNsaW5pdHM7Ci0gIAotICAKLSAgdm9pZCBDcmVhdGVTdGF0aWNJbml0aWFsaXplcigpOwotICAKLSAgdm9pZCBzZXROb0lubGluZShDbGFzcyogY2wpOwotICAKLSAgdm9pZCBwcmludFN0YXRzKCk7Ci0gIAotICB2b2lkIGNvbXBpbGVGaWxlKEpuanZtKiB2bSwgY29uc3QgY2hhciogbmFtZSk7Ci0gIHZvaWQgY29tcGlsZUNsYXNzKENsYXNzKiBjbCk7Ci0gIHZvaWQgZ2VuZXJhdGVNYWluKGNvbnN0IGNoYXIqIG5hbWUsIGJvb2wgaml0KTsKLQotcHJpdmF0ZToKLSAgdm9pZCBjb21waWxlQWxsU3R1YnMoU2lnbmRlZiogc2lnbik7Ci19OwotCi19IC8vIGVuZCBuYW1lc3BhY2UgajMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92bWtpdC9pbmNsdWRlL2ozL0phdmFDb21waWxlci5oIGIvdm1raXQvaW5jbHVkZS9qMy9KYXZhQ29tcGlsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmExODM4My4uMDAwMDAwMAotLS0gYS92bWtpdC9pbmNsdWRlL2ozL0phdmFDb21waWxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLSBKYXZhQ29tcGlsZXIuaCAtIEozIGludGVyZmFjZSBmb3IgdGhlIGNvbXBpbGVyIC0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgSkFWQV9DT01QSUxFUl9ICi0jZGVmaW5lIEpBVkFfQ09NUElMRVJfSAotCi0jaW5jbHVkZSA8Y3N0ZGlvPgotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGRsZmNuLmg+Ci0KLSNpbmNsdWRlICJtdm0vR0MuaCIKLSNpbmNsdWRlICJtdm0vQWxsb2NhdG9yLmgiCi0KLW5hbWVzcGFjZSBtdm0gewotICBjbGFzcyBVVEY4OwotfQotCi1uYW1lc3BhY2UgajMgewotCi1jbGFzcyBDbGFzczsKLWNsYXNzIENvbW1vbkNsYXNzOwotY2xhc3MgSmF2YU1ldGhvZDsKLWNsYXNzIEphdmFWaXJ0dWFsVGFibGU7Ci1jbGFzcyBKbmp2bUNsYXNzTG9hZGVyOwotY2xhc3MgU2lnbmRlZjsKLQotY2xhc3MgSmF2YUNvbXBpbGVyIHsKLXB1YmxpYzoKLSAgCi0gIG12bTo6QnVtcFB0ckFsbG9jYXRvciBhbGxvY2F0b3I7Ci0KLSAgdmlydHVhbCBKYXZhQ29tcGlsZXIqIENyZWF0ZShjb25zdCBzdGQ6OnN0cmluZyYpIHsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAKLSAgdmlydHVhbCB2b2lkKiBtYXRlcmlhbGl6ZUZ1bmN0aW9uKEphdmFNZXRob2QqIG1ldGgpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIk1hdGVyaWFsaXppbmcgYSBmdW5jdGlvbiBpbiBhbiBlbXB0eSBjb21waWxlciIpOwotICAgIGFib3J0KCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgaXNTdGF0aWNDb21waWxpbmcoKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdmlydHVhbCBib29sIGVtaXRGdW5jdGlvbk5hbWUoKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIHJlc29sdmVWaXJ0dWFsQ2xhc3MoQ2xhc3MqIGNsKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJSZXNvbHZpbmcgYSBjbGFzcyBpbiBhbiBlbXB0eSBjb21waWxlciIpOwotICAgIGFib3J0KCk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgcmVzb2x2ZVN0YXRpY0NsYXNzKENsYXNzKiBjbCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiUmVzb2x2aW5nIGEgY2xhc3MgaW4gYW4gZW1wdHkgY29tcGlsZXIiKTsKLSAgICBhYm9ydCgpOwotICB9Ci0KLQotICB2aXJ0dWFsIHZvaWQgc3RhdGljQ2FsbEJ1ZihTaWduZGVmKiBzaWduKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJBc2tpbmcgZm9yIGEgY2FsbGJhY2sgaW4gYW4gZW1wdHkgY29tcGlsZXIiKTsKLSAgICBhYm9ydCgpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIHZpcnR1YWxDYWxsQnVmKFNpZ25kZWYqIHNpZ24pIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkFza2luZyBmb3IgYSBjYWxsYmFjayBpbiBhbiBlbXB0eSBjb21waWxlciIpOwotICAgIGFib3J0KCk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgc3RhdGljQ2FsbEFQKFNpZ25kZWYqIHNpZ24pIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkFza2luZyBmb3IgYSBjYWxsYmFjayBpbiBhbiBlbXB0eSBjb21waWxlciIpOwotICAgIGFib3J0KCk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgdmlydHVhbENhbGxBUChTaWduZGVmKiBzaWduKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJBc2tpbmcgZm9yIGEgY2FsbGJhY2sgaW4gYW4gZW1wdHkgY29tcGlsZXIiKTsKLSAgICBhYm9ydCgpOwotICB9Ci0gIAotICB2aXJ0dWFsIHZvaWQgdmlydHVhbENhbGxTdHViKFNpZ25kZWYqIHNpZ24pIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkFza2luZyBmb3IgYSBjYWxsYmFjayBpbiBhbiBlbXB0eSBjb21waWxlciIpOwotICAgIGFib3J0KCk7Ci0gIH0KLSAgCi0gIHZpcnR1YWwgdm9pZCBzcGVjaWFsQ2FsbFN0dWIoU2lnbmRlZiogc2lnbikgewotICAgIGZwcmludGYoc3RkZXJyLCAiQXNraW5nIGZvciBhIGNhbGxiYWNrIGluIGFuIGVtcHR5IGNvbXBpbGVyIik7Ci0gICAgYWJvcnQoKTsKLSAgfQotICAKLSAgdmlydHVhbCB2b2lkIHN0YXRpY0NhbGxTdHViKFNpZ25kZWYqIHNpZ24pIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkFza2luZyBmb3IgYSBjYWxsYmFjayBpbiBhbiBlbXB0eSBjb21waWxlciIpOwotICAgIGFib3J0KCk7Ci0gIH0KLQotICB2aXJ0dWFsIH5KYXZhQ29tcGlsZXIoKSB7fQotCi0gIHZpcnR1YWwgdm9pZCogbG9hZE1ldGhvZCh2b2lkKiBoYW5kbGUsIGNvbnN0IGNoYXIqIHN5bWJvbCkgewotICAgIHJldHVybiBkbHN5bShoYW5kbGUsIHN5bWJvbCk7Ci0gIH0KLQotICBzdGF0aWMgY29uc3QgbXZtOjpVVEY4KiBJbmxpbmVQcmFnbWE7Ci0gIHN0YXRpYyBjb25zdCBtdm06OlVURjgqIE5vSW5saW5lUHJhZ21hOwotCi0gIHZpcnR1YWwgQ29tbW9uQ2xhc3MqIGdldFVuaXF1ZUJhc2VDbGFzcyhDb21tb25DbGFzcyogY2wpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotfTsKLQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2luY2x1ZGUvajMvSmF2YUpJVENvbXBpbGVyLmggYi92bWtpdC9pbmNsdWRlL2ozL0phdmFKSVRDb21waWxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWU0ZWIxLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2luY2x1ZGUvajMvSmF2YUpJVENvbXBpbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLy89PT0tLS0tLS0tIEphdmFKSVRDb21waWxlci5oIC0gVGhlIEozIGp1c3QgaW4gdGltZSBjb21waWxlciAtLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgSjNfSklUX0NPTVBJTEVSX0gKLSNkZWZpbmUgSjNfSklUX0NPTVBJTEVSX0gKLQotI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9HQ01ldGFkYXRhLmgiCi0jaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvRXhlY3V0aW9uRW5naW5lLmgiCi0jaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvSklURXZlbnRMaXN0ZW5lci5oIgotI2luY2x1ZGUgImozL0phdmFMTFZNQ29tcGlsZXIuaCIKLQotbmFtZXNwYWNlIGozIHsKLQotY2xhc3MgSmF2YUpJVENvbXBpbGVyOwotCi1jbGFzcyBKYXZhSklUTGlzdGVuZXIgOiBwdWJsaWMgbGx2bTo6SklURXZlbnRMaXN0ZW5lciB7Ci0gIEphdmFKSVRDb21waWxlciogVGhlQ29tcGlsZXI7Ci1wdWJsaWM6Ci0gIEphdmFKSVRMaXN0ZW5lcihKYXZhSklUQ29tcGlsZXIqIENvbXBpbGVyKSB7Ci0gICAgVGhlQ29tcGlsZXIgPSBDb21waWxlcjsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBOb3RpZnlGdW5jdGlvbkVtaXR0ZWQoCi0gICAgICBjb25zdCBsbHZtOjpGdW5jdGlvbiAmRiwKLSAgICAgIHZvaWQgKkNvZGUsCi0gICAgICBzaXplX3QgU2l6ZSwKLSAgICAgIGNvbnN0IGxsdm06OkpJVEV2ZW50TGlzdGVuZXI6OkVtaXR0ZWRGdW5jdGlvbkRldGFpbHMgJkRldGFpbHMpOwotfTsKLQotY2xhc3MgSmF2YUpJVENvbXBpbGVyIDogcHVibGljIEphdmFMTFZNQ29tcGlsZXIgewotcHVibGljOgotCi0gIGJvb2wgRW1pdEZ1bmN0aW9uTmFtZTsKLSAgSmF2YUpJVExpc3RlbmVyIGxpc3RlbmVyOwotICBsbHZtOjpFeGVjdXRpb25FbmdpbmUqIGV4ZWN1dGlvbkVuZ2luZTsKLSAgbGx2bTo6R0NNb2R1bGVJbmZvKiBHQ0luZm87Ci0KLSAgSmF2YUpJVENvbXBpbGVyKGNvbnN0IHN0ZDo6c3RyaW5nICZNb2R1bGVJRCk7Ci0gIH5KYXZhSklUQ29tcGlsZXIoKTsKLSAgCi0gIHZpcnR1YWwgYm9vbCBpc1N0YXRpY0NvbXBpbGluZygpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQqIEdlbmVyYXRlU3R1YihsbHZtOjpGdW5jdGlvbiogRik7ICAKLSAKLSAgdmlydHVhbCBib29sIGVtaXRGdW5jdGlvbk5hbWUoKSB7Ci0gICAgcmV0dXJuIEVtaXRGdW5jdGlvbk5hbWU7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgbWFrZVZUKENsYXNzKiBjbCk7Ci0gIHZpcnR1YWwgdm9pZCBtYWtlSU1UKENsYXNzKiBjbCk7Ci0gIAotICB2aXJ0dWFsIHZvaWQqIG1hdGVyaWFsaXplRnVuY3Rpb24oSmF2YU1ldGhvZCogbWV0aCk7Ci0gIAotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50KiBnZXRGaW5hbE9iamVjdChKYXZhT2JqZWN0KiBvYmosIENvbW1vbkNsYXNzKiBjbCk7Ci0gIHZpcnR1YWwgSmF2YU9iamVjdCogZ2V0RmluYWxPYmplY3QobGx2bTo6VmFsdWUqIEMpOwotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50KiBnZXROYXRpdmVDbGFzcyhDb21tb25DbGFzcyogY2wpOwotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50KiBnZXRKYXZhQ2xhc3MoQ29tbW9uQ2xhc3MqIGNsKTsKLSAgdmlydHVhbCBsbHZtOjpDb25zdGFudCogZ2V0SmF2YUNsYXNzUHRyKENvbW1vbkNsYXNzKiBjbCk7Ci0gIHZpcnR1YWwgbGx2bTo6Q29uc3RhbnQqIGdldFN0YXRpY0luc3RhbmNlKENsYXNzKiBjbCk7Ci0gIHZpcnR1YWwgbGx2bTo6Q29uc3RhbnQqIGdldFZpcnR1YWxUYWJsZShKYXZhVmlydHVhbFRhYmxlKik7Ci0gIHZpcnR1YWwgbGx2bTo6Q29uc3RhbnQqIGdldE1ldGhvZEluQ2xhc3MoSmF2YU1ldGhvZCogbWV0aCk7Ci0gIAotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50KiBnZXRTdHJpbmcoSmF2YVN0cmluZyogc3RyKTsKLSAgdmlydHVhbCBsbHZtOjpDb25zdGFudCogZ2V0U3RyaW5nUHRyKEphdmFTdHJpbmcqKiBzdHIpOwotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50KiBnZXRDb25zdGFudFBvb2woSmF2YUNvbnN0YW50UG9vbCogY3RwKTsKLSAgdmlydHVhbCBsbHZtOjpDb25zdGFudCogZ2V0TmF0aXZlRnVuY3Rpb24oSmF2YU1ldGhvZCogbWV0aCwgdm9pZCogbmF0UHRyKTsKLSAgCi0gIHZpcnR1YWwgdm9pZCBzZXRNZXRob2QobGx2bTo6RnVuY3Rpb24qIGZ1bmMsIHZvaWQqIHB0ciwgY29uc3QgY2hhciogbmFtZSk7Ci0gIAotICB2aXJ0dWFsIGxsdm06OlZhbHVlKiBhZGRDYWxsYmFjayhDbGFzcyogY2wsIHVpbnQxNiBpbmRleCwgU2lnbmRlZiogc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdGF0LCBsbHZtOjpCYXNpY0Jsb2NrKiBpbnNlcnQpID0gMDsKLSAgdmlydHVhbCB1aW50cHRyX3QgZ2V0UG9pbnRlck9yU3R1YihKYXZhTWV0aG9kJiBtZXRoLCBpbnQgdHlwZSkgPSAwOwotCi0gIHN0YXRpYyBKYXZhSklUQ29tcGlsZXIqIENyZWF0ZUNvbXBpbGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBNb2R1bGVJRCk7Ci19OwotCi1jbGFzcyBKYXZhSjNMYXp5SklUQ29tcGlsZXIgOiBwdWJsaWMgSmF2YUpJVENvbXBpbGVyIHsKLXB1YmxpYzoKLSAgdmlydHVhbCBib29sIG5lZWRzQ2FsbGJhY2soSmF2YU1ldGhvZCogbWV0aCwgYm9vbCogbmVlZHNJbml0KTsKLSAgdmlydHVhbCBsbHZtOjpWYWx1ZSogYWRkQ2FsbGJhY2soQ2xhc3MqIGNsLCB1aW50MTYgaW5kZXgsIFNpZ25kZWYqIHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RhdCwgbGx2bTo6QmFzaWNCbG9jayogaW5zZXJ0KTsKLSAgdmlydHVhbCB1aW50cHRyX3QgZ2V0UG9pbnRlck9yU3R1YihKYXZhTWV0aG9kJiBtZXRoLCBpbnQgc2lkZSk7Ci0gIAotICB2aXJ0dWFsIEphdmFDb21waWxlciogQ3JlYXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBNb2R1bGVJRCkgewotICAgIHJldHVybiBuZXcgSmF2YUozTGF6eUpJVENvbXBpbGVyKE1vZHVsZUlEKTsKLSAgfQotCi0gIEphdmFKM0xhenlKSVRDb21waWxlcihjb25zdCBzdGQ6OnN0cmluZyYgTW9kdWxlSUQpOwotfTsKLQotfSAvLyBlbmQgbmFtZXNwYWNlIGozCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvaW5jbHVkZS9qMy9KYXZhTExWTUNvbXBpbGVyLmggYi92bWtpdC9pbmNsdWRlL2ozL0phdmFMTFZNQ29tcGlsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjljZTdiMy4uMDAwMDAwMAotLS0gYS92bWtpdC9pbmNsdWRlL2ozL0phdmFMTFZNQ29tcGlsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vLz09PS0tLT09LS0tLSBKYXZhTExWTUNvbXBpbGVyLmggLSBBIExMVk0gQ29tcGlsZXIgZm9yIEozIC0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2lmbmRlZiBKM19MTFZNX0NPTVBJTEVSX0gKLSNkZWZpbmUgSjNfTExWTV9DT01QSUxFUl9ICi0KLSNpbmNsdWRlICJqMy9KYXZhQ29tcGlsZXIuaCIKLSNpbmNsdWRlICJqMy9KM0ludHJpbnNpY3MuaCIKLSNpbmNsdWRlICJqMy9MTFZNSW5mby5oIgotCi0jaW5jbHVkZSAibGx2bS9MTFZNQ29udGV4dC5oIgotI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCi0KLSNpbmNsdWRlIDxtYXA+Ci0KLW5hbWVzcGFjZSBsbHZtIHsKLSAgY2xhc3MgQmFzaWNCbG9jazsKLSAgY2xhc3MgRElGYWN0b3J5OwotfQotCi1uYW1lc3BhY2UgajMgewotCi1jbGFzcyBDb21tb25DbGFzczsKLWNsYXNzIENsYXNzOwotY2xhc3MgQ2xhc3NBcnJheTsKLWNsYXNzIENsYXNzUHJpbWl0aXZlOwotY2xhc3MgSmF2YUNvbnN0YW50UG9vbDsKLWNsYXNzIEphdmFGaWVsZDsKLWNsYXNzIEphdmFNZXRob2Q7Ci1jbGFzcyBKYXZhT2JqZWN0OwotY2xhc3MgSmF2YVN0cmluZzsKLWNsYXNzIEphdmFWaXJ0dWFsVGFibGU7Ci1jbGFzcyBKbmp2bTsKLWNsYXNzIFR5cGVkZWY7Ci1jbGFzcyBTaWduZGVmOwotCi1jbGFzcyBKYXZhTExWTUNvbXBpbGVyIDogcHVibGljIEphdmFDb21waWxlciB7Ci0gIGZyaWVuZCBjbGFzcyBMTFZNQ2xhc3NJbmZvOwotICBmcmllbmQgY2xhc3MgTExWTU1ldGhvZEluZm87Ci0KLXByb3RlY3RlZDoKLSAgbGx2bTo6TW9kdWxlKiBUaGVNb2R1bGU7Ci0gIGxsdm06OkRJRmFjdG9yeSogRGVidWdGYWN0b3J5OyAgCi0gIEozSW50cmluc2ljcyBKYXZhSW50cmluc2ljczsKLQotcHJpdmF0ZTogIAotICBib29sIGVuYWJsZWRFeGNlcHRpb247Ci0gIGJvb2wgY29vcGVyYXRpdmVHQzsKLSAgCi0gIHZpcnR1YWwgdm9pZCBtYWtlVlQoQ2xhc3MqIGNsKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBtYWtlSU1UKENsYXNzKiBjbCkgPSAwOwotICAKLSAgc3RkOjptYXA8Y29uc3QgbGx2bTo6RnVuY3Rpb24qLCBKYXZhTWV0aG9kKj4gZnVuY3Rpb25zOwotICB0eXBlZGVmIHN0ZDo6bWFwPGNvbnN0IGxsdm06OkZ1bmN0aW9uKiwgSmF2YU1ldGhvZCo+OjppdGVyYXRvciBmdW5jdGlvbl9pdGVyYXRvcjsKLSAgCi0gIHN0ZDo6bWFwPEphdmFNZXRob2QqLCBMTFZNTWV0aG9kSW5mbyo+IG1ldGhvZF9pbmZvczsKLSAgdHlwZWRlZiBzdGQ6Om1hcDxKYXZhTWV0aG9kKiwgTExWTU1ldGhvZEluZm8qPjo6aXRlcmF0b3IgbWV0aG9kX2luZm9faXRlcmF0b3I7Ci0gIAotICBzdGQ6Om1hcDxKYXZhRmllbGQqLCBMTFZNRmllbGRJbmZvKj4gZmllbGRfaW5mb3M7Ci0gIHR5cGVkZWYgc3RkOjptYXA8SmF2YUZpZWxkKiwgTExWTUZpZWxkSW5mbyo+OjppdGVyYXRvciBmaWVsZF9pbmZvX2l0ZXJhdG9yOwotICAKLSAgc3RkOjptYXA8U2lnbmRlZiosIExMVk1TaWduYXR1cmVJbmZvKj4gc2lnbmF0dXJlX2luZm9zOwotICB0eXBlZGVmIHN0ZDo6bWFwPFNpZ25kZWYqLCBMTFZNU2lnbmF0dXJlSW5mbyo+OjppdGVyYXRvciBzaWduYXR1cmVfaW5mb19pdGVyYXRvcjsKLSAgCi0gIHN0ZDo6bWFwPENsYXNzKiwgTExWTUNsYXNzSW5mbyo+IGNsYXNzX2luZm9zOwotICB0eXBlZGVmIHN0ZDo6bWFwPENsYXNzKiwgTExWTUNsYXNzSW5mbyo+OjppdGVyYXRvciBjbGFzc19pbmZvX2l0ZXJhdG9yOwotCi0gIHN0ZDo6bWFwPGxsdm06Ok1ETm9kZSosIEphdmFNZXRob2QqPiBEYmdJbmZvczsKLSAgdHlwZWRlZiBzdGQ6Om1hcDxsbHZtOjpNRE5vZGUqLCBKYXZhTWV0aG9kKj46Oml0ZXJhdG9yIGRiZ19pdGVyYXRvcjsKLQotcHVibGljOgotICBKYXZhTExWTUNvbXBpbGVyKGNvbnN0IHN0ZDo6c3RyaW5nICZNb2R1bGVJRCk7Ci0gIAotICB2aXJ0dWFsIGJvb2wgaXNTdGF0aWNDb21waWxpbmcoKSA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBlbWl0RnVuY3Rpb25OYW1lKCkgPSAwOwotICB2aXJ0dWFsIHZvaWQqIEdlbmVyYXRlU3R1YihsbHZtOjpGdW5jdGlvbiogRikgPSAwOwotICB2b2lkIGFkZEphdmFQYXNzZXMoKTsKLSAgCi0gIGxsdm06OkRJRmFjdG9yeSogZ2V0RGVidWdGYWN0b3J5KCkgewotICAgIHJldHVybiBEZWJ1Z0ZhY3Rvcnk7Ci0gIH0KLQotICBsbHZtOjpNb2R1bGUqIGdldExMVk1Nb2R1bGUoKSB7Ci0gICAgcmV0dXJuIFRoZU1vZHVsZTsKLSAgfQotICAKLSAgbGx2bTo6TExWTUNvbnRleHQmIGdldExMVk1Db250ZXh0KCkgewotICAgIHJldHVybiBUaGVNb2R1bGUtPmdldENvbnRleHQoKTsKLSAgfQotCi0gIEozSW50cmluc2ljcyogZ2V0SW50cmluc2ljcygpIHsKLSAgICByZXR1cm4gJkphdmFJbnRyaW5zaWNzOwotICB9Ci0KLSAgYm9vbCBoYXNFeGNlcHRpb25zRW5hYmxlZCgpIHsKLSAgICByZXR1cm4gZW5hYmxlZEV4Y2VwdGlvbjsKLSAgfQotCi0gIGJvb2wgdXNlQ29vcGVyYXRpdmVHQygpIHsKLSAgICByZXR1cm4gY29vcGVyYXRpdmVHQzsKLSAgfQotICAKLSAgdm9pZCBkaXNhYmxlRXhjZXB0aW9ucygpIHsKLSAgICBlbmFibGVkRXhjZXB0aW9uID0gZmFsc2U7Ci0gIH0KLSAgCi0gIHZvaWQgZGlzYWJsZUNvb3BlcmF0aXZlR0MoKSB7Ci0gICAgY29vcGVyYXRpdmVHQyA9IGZhbHNlOwotICB9Ci0gCi0gIHZpcnR1YWwgSmF2YUNvbXBpbGVyKiBDcmVhdGUoY29uc3Qgc3RkOjpzdHJpbmcmIE1vZHVsZUlEKSA9IDA7Ci0gIAotICB2aXJ0dWFsIH5KYXZhTExWTUNvbXBpbGVyKCk7Ci0KLSAgSmF2YU1ldGhvZCogZ2V0SmF2YU1ldGhvZChjb25zdCBsbHZtOjpGdW5jdGlvbiYpOwotICBsbHZtOjpNRE5vZGUqIEdldERiZ1N1YnByb2dyYW0oSmF2YU1ldGhvZCogbWV0aCk7Ci0KLSAgdm9pZCByZXNvbHZlVmlydHVhbENsYXNzKENsYXNzKiBjbCk7Ci0gIHZvaWQgcmVzb2x2ZVN0YXRpY0NsYXNzKENsYXNzKiBjbCk7Ci0gIGxsdm06OkZ1bmN0aW9uKiBnZXRNZXRob2QoSmF2YU1ldGhvZCogbWV0aCk7Ci0KLSAgdm9pZCBpbml0aWFsaXNlQXNzZXNzb3JJbmZvKCk7Ci0gIHN0ZDo6bWFwPGNvbnN0IGNoYXIsIExMVk1Bc3Nlc3NvckluZm8+IEFzc2Vzc29ySW5mbzsKLSAgTExWTUFzc2Vzc29ySW5mbyYgZ2V0VHlwZWRlZkluZm8oY29uc3QgVHlwZWRlZiogdHlwZSk7Ci0KLSAgTExWTVNpZ25hdHVyZUluZm8qIGdldFNpZ25hdHVyZUluZm8oU2lnbmRlZiogc2lnbikgewotICAgIHNpZ25hdHVyZV9pbmZvX2l0ZXJhdG9yIEUgPSBzaWduYXR1cmVfaW5mb3MuZW5kKCk7Ci0gICAgc2lnbmF0dXJlX2luZm9faXRlcmF0b3IgSSA9IHNpZ25hdHVyZV9pbmZvcy5maW5kKHNpZ24pOwotICAgIGlmIChJID09IEUpIHsKLSAgICAgIExMVk1TaWduYXR1cmVJbmZvKiBzaWduSW5mbyA9Ci0gICAgICAgIG5ldyhhbGxvY2F0b3IsICJMTFZNU2lnbmF0dXJlSW5mbyIpIExMVk1TaWduYXR1cmVJbmZvKHNpZ24sIHRoaXMpOwotICAgICAgc2lnbmF0dXJlX2luZm9zLmluc2VydChzdGQ6Om1ha2VfcGFpcihzaWduLCBzaWduSW5mbykpOwotICAgICAgcmV0dXJuIHNpZ25JbmZvOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gSS0+c2Vjb25kOwotICAgIH0KLSAgfQotICAKLSAgTExWTUZpZWxkSW5mbyogZ2V0RmllbGRJbmZvKEphdmFGaWVsZCogZmllbGQpIHsKLSAgICBmaWVsZF9pbmZvX2l0ZXJhdG9yIEUgPSBmaWVsZF9pbmZvcy5lbmQoKTsKLSAgICBmaWVsZF9pbmZvX2l0ZXJhdG9yIEkgPSBmaWVsZF9pbmZvcy5maW5kKGZpZWxkKTsKLSAgICBpZiAoSSA9PSBFKSB7Ci0gICAgICBMTFZNRmllbGRJbmZvKiBmaWVsZEluZm8gPQotICAgICAgICBuZXcoYWxsb2NhdG9yLCAiTExWTUZpZWxkSW5mbyIpIExMVk1GaWVsZEluZm8oZmllbGQsIHRoaXMpOwotICAgICAgZmllbGRfaW5mb3MuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGZpZWxkLCBmaWVsZEluZm8pKTsKLSAgICAgIHJldHVybiBmaWVsZEluZm87Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBJLT5zZWNvbmQ7Ci0gICAgfQotICB9Ci0gIAotICBMTFZNQ2xhc3NJbmZvKiBnZXRDbGFzc0luZm8oQ2xhc3MqIGtsYXNzKSB7Ci0gICAgY2xhc3NfaW5mb19pdGVyYXRvciBFID0gY2xhc3NfaW5mb3MuZW5kKCk7Ci0gICAgY2xhc3NfaW5mb19pdGVyYXRvciBJID0gY2xhc3NfaW5mb3MuZmluZChrbGFzcyk7Ci0gICAgaWYgKEkgPT0gRSkgewotICAgICAgTExWTUNsYXNzSW5mbyogY2xhc3NJbmZvID0KLSAgICAgICAgbmV3KGFsbG9jYXRvciwgIkxMVk1DbGFzc0luZm8iKSBMTFZNQ2xhc3NJbmZvKGtsYXNzLCB0aGlzKTsKLSAgICAgIGNsYXNzX2luZm9zLmluc2VydChzdGQ6Om1ha2VfcGFpcihrbGFzcywgY2xhc3NJbmZvKSk7Ci0gICAgICByZXR1cm4gY2xhc3NJbmZvOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gSS0+c2Vjb25kOwotICAgIH0KLSAgfQotICAKLSAgTExWTU1ldGhvZEluZm8qIGdldE1ldGhvZEluZm8oSmF2YU1ldGhvZCogbWV0aG9kKSB7Ci0gICAgbWV0aG9kX2luZm9faXRlcmF0b3IgRSA9IG1ldGhvZF9pbmZvcy5lbmQoKTsKLSAgICBtZXRob2RfaW5mb19pdGVyYXRvciBJID0gbWV0aG9kX2luZm9zLmZpbmQobWV0aG9kKTsKLSAgICBpZiAoSSA9PSBFKSB7Ci0gICAgICBMTFZNTWV0aG9kSW5mbyogbWV0aG9kSW5mbyA9Ci0gICAgICAgIG5ldyhhbGxvY2F0b3IsICJMTFZNTWV0aG9kSW5mbyIpIExMVk1NZXRob2RJbmZvKG1ldGhvZCwgdGhpcyk7Ci0gICAgICBtZXRob2RfaW5mb3MuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKG1ldGhvZCwgbWV0aG9kSW5mbykpOwotICAgICAgcmV0dXJuIG1ldGhvZEluZm87Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBJLT5zZWNvbmQ7Ci0gICAgfQotICB9Ci0gIAotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50KiBnZXRGaW5hbE9iamVjdChKYXZhT2JqZWN0KiBvYmosIENvbW1vbkNsYXNzKiBjbCkgPSAwOwotICB2aXJ0dWFsIEphdmFPYmplY3QqIGdldEZpbmFsT2JqZWN0KGxsdm06OlZhbHVlKiBDKSA9IDA7Ci0gIHZpcnR1YWwgbGx2bTo6Q29uc3RhbnQqIGdldE5hdGl2ZUNsYXNzKENvbW1vbkNsYXNzKiBjbCkgPSAwOwotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50KiBnZXRKYXZhQ2xhc3MoQ29tbW9uQ2xhc3MqIGNsKSA9IDA7Ci0gIHZpcnR1YWwgbGx2bTo6Q29uc3RhbnQqIGdldEphdmFDbGFzc1B0cihDb21tb25DbGFzcyogY2wpID0gMDsKLSAgdmlydHVhbCBsbHZtOjpDb25zdGFudCogZ2V0U3RhdGljSW5zdGFuY2UoQ2xhc3MqIGNsKSA9IDA7Ci0gIHZpcnR1YWwgbGx2bTo6Q29uc3RhbnQqIGdldFZpcnR1YWxUYWJsZShKYXZhVmlydHVhbFRhYmxlKikgPSAwOwotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50KiBnZXRNZXRob2RJbkNsYXNzKEphdmFNZXRob2QqIG1ldGgpID0gMDsKLSAgCi0gIHZpcnR1YWwgbGx2bTo6Q29uc3RhbnQqIGdldFN0cmluZyhKYXZhU3RyaW5nKiBzdHIpID0gMDsKLSAgdmlydHVhbCBsbHZtOjpDb25zdGFudCogZ2V0U3RyaW5nUHRyKEphdmFTdHJpbmcqKiBzdHIpID0gMDsKLSAgdmlydHVhbCBsbHZtOjpDb25zdGFudCogZ2V0Q29uc3RhbnRQb29sKEphdmFDb25zdGFudFBvb2wqIGN0cCkgPSAwOwotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50KiBnZXROYXRpdmVGdW5jdGlvbihKYXZhTWV0aG9kKiBtZXRoLCB2b2lkKiBuYXRQdHIpID0gMDsKLSAgCi0gIHZpcnR1YWwgdm9pZCBzZXRNZXRob2QobGx2bTo6RnVuY3Rpb24qIGZ1bmMsIHZvaWQqIHB0ciwgY29uc3QgY2hhciogbmFtZSkgPSAwOwotICAKLSAgdmlydHVhbCB2b2lkKiBtYXRlcmlhbGl6ZUZ1bmN0aW9uKEphdmFNZXRob2QqIG1ldGgpID0gMDsKLSAgbGx2bTo6RnVuY3Rpb24qIHBhcnNlRnVuY3Rpb24oSmF2YU1ldGhvZCogbWV0aCk7Ci0gICAKLSAgbGx2bTo6RnVuY3Rpb25QYXNzTWFuYWdlciogSmF2YUZ1bmN0aW9uUGFzc2VzOwotICBsbHZtOjpGdW5jdGlvblBhc3NNYW5hZ2VyKiBKYXZhTmF0aXZlRnVuY3Rpb25QYXNzZXM7Ci0gIAotICB2aXJ0dWFsIGJvb2wgbmVlZHNDYWxsYmFjayhKYXZhTWV0aG9kKiBtZXRoLCBib29sKiBuZWVkc0luaXQpIHsKLSAgICAqbmVlZHNJbml0ID0gdHJ1ZTsKLSAgICByZXR1cm4gbWV0aCA9PSBOVUxMOwotICB9Ci0gIHZpcnR1YWwgbGx2bTo6VmFsdWUqIGFkZENhbGxiYWNrKENsYXNzKiBjbCwgdWludDE2IGluZGV4LCBTaWduZGVmKiBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0YXQsIGxsdm06OkJhc2ljQmxvY2sqIGluc2VydCkgPSAwOwotICAKLSAgdmlydHVhbCB2b2lkIHN0YXRpY0NhbGxCdWYoU2lnbmRlZiogc2lnbikgewotICAgIGdldFNpZ25hdHVyZUluZm8oc2lnbiktPmdldFN0YXRpY0J1ZigpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIHZpcnR1YWxDYWxsQnVmKFNpZ25kZWYqIHNpZ24pIHsKLSAgICBnZXRTaWduYXR1cmVJbmZvKHNpZ24pLT5nZXRWaXJ0dWFsQnVmKCk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgc3RhdGljQ2FsbEFQKFNpZ25kZWYqIHNpZ24pIHsKLSAgICBnZXRTaWduYXR1cmVJbmZvKHNpZ24pLT5nZXRTdGF0aWNBUCgpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIHZpcnR1YWxDYWxsQVAoU2lnbmRlZiogc2lnbikgewotICAgIGdldFNpZ25hdHVyZUluZm8oc2lnbiktPmdldFZpcnR1YWxBUCgpOwotICB9Ci0gIAotICB2aXJ0dWFsIHZvaWQgdmlydHVhbENhbGxTdHViKFNpZ25kZWYqIHNpZ24pIHsKLSAgICBnZXRTaWduYXR1cmVJbmZvKHNpZ24pLT5nZXRWaXJ0dWFsU3R1YigpOwotICB9Ci0gIAotICB2aXJ0dWFsIHZvaWQgc3BlY2lhbENhbGxTdHViKFNpZ25kZWYqIHNpZ24pIHsKLSAgICBnZXRTaWduYXR1cmVJbmZvKHNpZ24pLT5nZXRTcGVjaWFsU3R1YigpOwotICB9Ci0gIAotICB2aXJ0dWFsIHZvaWQgc3RhdGljQ2FsbFN0dWIoU2lnbmRlZiogc2lnbikgewotICAgIGdldFNpZ25hdHVyZUluZm8oc2lnbiktPmdldFN0YXRpY1N0dWIoKTsKLSAgfQotCi0gIGxsdm06OkZ1bmN0aW9uKiBOYXRpdmVMb2FkZXI7Ci19OwotCi19IC8vIGVuZCBuYW1lc3BhY2UgajMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92bWtpdC9pbmNsdWRlL2ozL0xMVk1JbmZvLmggYi92bWtpdC9pbmNsdWRlL2ozL0xMVk1JbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNDVmOWIuLjAwMDAwMDAKLS0tIGEvdm1raXQvaW5jbHVkZS9qMy9MTFZNSW5mby5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0tLSBMTFZNSW5mby5oIC0gQ29tcGlsZXIgaW5mbyBmb3IgTExWTSAtLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIEozX0xMVk1fSU5GT19ICi0jZGVmaW5lIEozX0xMVk1fSU5GT19ICi0KLW5hbWVzcGFjZSBsbHZtIHsKLSAgY2xhc3MgQ29uc3RhbnQ7Ci0gIGNsYXNzIEZ1bmN0aW9uOwotICBjbGFzcyBGdW5jdGlvblR5cGU7Ci0gIGNsYXNzIEdDRnVuY3Rpb25JbmZvOwotICBjbGFzcyBNRE5vZGU7Ci0gIGNsYXNzIE1vZHVsZTsKLSAgY2xhc3MgVHlwZTsKLSAgY2xhc3MgVmFsdWU7Ci19Ci0KLW5hbWVzcGFjZSBqMyB7Ci0KLWNsYXNzIENsYXNzOwotY2xhc3MgSmF2YUZpZWxkOwotY2xhc3MgSmF2YUxMVk1Db21waWxlcjsKLWNsYXNzIEphdmFNZXRob2Q7Ci1jbGFzcyBTaWduZGVmOwotCi1jbGFzcyBMTFZNQXNzZXNzb3JJbmZvIHsKLXB1YmxpYzoKLSAgY29uc3QgbGx2bTo6VHlwZSogbGx2bVR5cGU7Ci0gIGNvbnN0IGxsdm06OlR5cGUqIGxsdm1UeXBlUHRyOwotICB1aW50OF90IGxvZ1NpemVJbkJ5dGVzQ29uc3RhbnQ7Ci19OwotCi1jbGFzcyBMTFZNQ2xhc3NJbmZvIDogcHVibGljIG12bTo6SklUSW5mbyB7Ci0gIGZyaWVuZCBjbGFzcyBKYXZhQU9UQ29tcGlsZXI7Ci0gIGZyaWVuZCBjbGFzcyBKYXZhSklUQ29tcGlsZXI7Ci0gIGZyaWVuZCBjbGFzcyBKYXZhTExWTUNvbXBpbGVyOwotcHJpdmF0ZToKLSAgLy8vIENvbXBpbGVyIC0gVGhlIGNvbXBpbGVyIGZvciB0aGlzIGNsYXNzIGluZm8uCi0gIEphdmFMTFZNQ29tcGlsZXIqIENvbXBpbGVyOwotICAKLSAgQ2xhc3MqIGNsYXNzRGVmOwotICAKLSAgLy8vIHZpcnR1YWxTaXplTExWTSAtIFRoZSBMTFZNIGNvbnN0YW50IHNpemUgb2YgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuCi0gIGxsdm06OkNvbnN0YW50KiB2aXJ0dWFsU2l6ZUNvbnN0YW50OwotCi0gIC8vLyB2aXJ0dWFsVHlwZSAtIFRoZSBMTFZNIHR5cGUgb2YgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAgY29uc3QgbGx2bTo6VHlwZSAqIHZpcnR1YWxUeXBlOwotCi0gIC8vLyBzdGF0aWNUeXBlIC0gVGhlIExMVk0gdHlwZSBvZiB0aGUgc3RhdGljIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0gIGNvbnN0IGxsdm06OlR5cGUgKiBzdGF0aWNUeXBlOwotCi1wdWJsaWM6Ci0gIAotICBsbHZtOjpWYWx1ZSogZ2V0VmlydHVhbFNpemUoKTsKLSAgY29uc3QgbGx2bTo6VHlwZSogZ2V0VmlydHVhbFR5cGUoKTsKLSAgY29uc3QgbGx2bTo6VHlwZSogZ2V0U3RhdGljVHlwZSgpOwotICAKLSAgTExWTUNsYXNzSW5mbyhDbGFzcyogY2wsIEphdmFMTFZNQ29tcGlsZXIqIGNvbXApIDoKLSAgICBDb21waWxlcihjb21wKSwKLSAgICBjbGFzc0RlZihjbCksCi0gICAgdmlydHVhbFNpemVDb25zdGFudCgwKSwKLSAgICB2aXJ0dWFsVHlwZSgwKSwKLSAgICBzdGF0aWNUeXBlKDApIHt9Ci0KLSAgdmlydHVhbCB2b2lkIGNsZWFyKCkgewotICAgIHZpcnR1YWxUeXBlID0gMDsKLSAgICBzdGF0aWNUeXBlID0gMDsKLSAgICB2aXJ0dWFsU2l6ZUNvbnN0YW50ID0gMDsKLSAgfQotfTsKLQotY2xhc3MgTExWTU1ldGhvZEluZm8gOiBwdWJsaWMgbXZtOjpKSVRJbmZvIHsKLXByaXZhdGU6Ci0gIC8vLyBDb21waWxlciAtIFRoZSBjb21waWxlciBmb3IgdGhpcyBtZXRob2QgaW5mby4KLSAgSmF2YUxMVk1Db21waWxlciogQ29tcGlsZXI7Ci0KLSAgSmF2YU1ldGhvZCogbWV0aG9kRGVmOwotCi0gIGxsdm06OkZ1bmN0aW9uKiBtZXRob2RGdW5jdGlvbjsKLSAgbGx2bTo6Q29uc3RhbnQqIG9mZnNldENvbnN0YW50OwotICBjb25zdCBsbHZtOjpGdW5jdGlvblR5cGUqIGZ1bmN0aW9uVHlwZTsKLSAgbGx2bTo6TUROb2RlKiBEYmdTdWJwcm9ncmFtOwotICAKLXB1YmxpYzoKLSAgbGx2bTo6RnVuY3Rpb24qIGdldE1ldGhvZCgpOwotICBsbHZtOjpDb25zdGFudCogZ2V0T2Zmc2V0KCk7Ci0gIGNvbnN0IGxsdm06OkZ1bmN0aW9uVHlwZSogZ2V0RnVuY3Rpb25UeXBlKCk7Ci0gICAgCi0gIExMVk1NZXRob2RJbmZvKEphdmFNZXRob2QqIE0sIEphdmFMTFZNQ29tcGlsZXIqIGNvbXApIDogIENvbXBpbGVyKGNvbXApLAotICAgIG1ldGhvZERlZihNKSwgbWV0aG9kRnVuY3Rpb24oMCksIG9mZnNldENvbnN0YW50KDApLCBmdW5jdGlvblR5cGUoMCksCi0gICAgRGJnU3VicHJvZ3JhbSgwKSB7fQotIAotICB2b2lkIHNldERiZ1N1YnByb2dyYW0obGx2bTo6TUROb2RlKiBub2RlKSB7IERiZ1N1YnByb2dyYW0gPSBub2RlOyB9Ci0gIGxsdm06Ok1ETm9kZSogZ2V0RGJnU3VicHJvZ3JhbSgpIHsgcmV0dXJuIERiZ1N1YnByb2dyYW07IH0KLQotICB2aXJ0dWFsIHZvaWQgY2xlYXIoKSB7Ci0gICAgbWV0aG9kRnVuY3Rpb24gPSAwOwotICAgIG9mZnNldENvbnN0YW50ID0gMDsKLSAgICBmdW5jdGlvblR5cGUgPSAwOwotICAgIERiZ1N1YnByb2dyYW0gPSAwOwotICB9Ci19OwotCi0KLWNsYXNzIExMVk1GaWVsZEluZm8gOiBwdWJsaWMgbXZtOjpKSVRJbmZvIHsKLXByaXZhdGU6Ci0gIC8vLyBDb21waWxlciAtIFRoZSBjb21waWxlciBmb3IgdGhpcyBmaWVsZCBpbmZvLgotICBKYXZhTExWTUNvbXBpbGVyKiBDb21waWxlcjsKLSAgCi0gIEphdmFGaWVsZCogZmllbGREZWY7Ci0gIAotICBsbHZtOjpDb25zdGFudCogb2Zmc2V0Q29uc3RhbnQ7Ci0KLXB1YmxpYzoKLSAgbGx2bTo6Q29uc3RhbnQqIGdldE9mZnNldCgpOwotCi0gIExMVk1GaWVsZEluZm8oSmF2YUZpZWxkKiBGLCBKYXZhTExWTUNvbXBpbGVyKiBjb21wKSA6Ci0gICAgQ29tcGlsZXIoY29tcCksCi0gICAgZmllbGREZWYoRiksIAotICAgIG9mZnNldENvbnN0YW50KDApIHt9Ci0KLSAgdmlydHVhbCB2b2lkIGNsZWFyKCkgewotICAgIG9mZnNldENvbnN0YW50ID0gMDsKLSAgfQotfTsKLQotY2xhc3MgTExWTVNpZ25hdHVyZUluZm8gOiBwdWJsaWMgbXZtOjpKSVRJbmZvIHsKLXByaXZhdGU6Ci0gIC8vLyBDb21waWxlciAtIFRoZSBjb21waWxlciBmb3IgdGhpcyBzaWduYXR1cmUgaW5mby4KLSAgSmF2YUxMVk1Db21waWxlciogQ29tcGlsZXI7Ci0gIAotICBjb25zdCBsbHZtOjpGdW5jdGlvblR5cGUqIHN0YXRpY1R5cGU7Ci0gIGNvbnN0IGxsdm06OkZ1bmN0aW9uVHlwZSogdmlydHVhbFR5cGU7Ci0gIGNvbnN0IGxsdm06OkZ1bmN0aW9uVHlwZSogbmF0aXZlVHlwZTsKLSAgCi0gIGNvbnN0IGxsdm06OkZ1bmN0aW9uVHlwZSogdmlydHVhbEJ1ZlR5cGU7Ci0gIGNvbnN0IGxsdm06OkZ1bmN0aW9uVHlwZSogc3RhdGljQnVmVHlwZTsKLQotICBjb25zdCBsbHZtOjpQb2ludGVyVHlwZSogc3RhdGljUHRyVHlwZTsKLSAgY29uc3QgbGx2bTo6UG9pbnRlclR5cGUqIHZpcnR1YWxQdHJUeXBlOwotICBjb25zdCBsbHZtOjpQb2ludGVyVHlwZSogbmF0aXZlUHRyVHlwZTsKLSAgCi0gIGxsdm06OkZ1bmN0aW9uKiB2aXJ0dWFsQnVmRnVuY3Rpb247Ci0gIGxsdm06OkZ1bmN0aW9uKiB2aXJ0dWFsQVBGdW5jdGlvbjsKLSAgbGx2bTo6RnVuY3Rpb24qIHN0YXRpY0J1ZkZ1bmN0aW9uOwotICBsbHZtOjpGdW5jdGlvbiogc3RhdGljQVBGdW5jdGlvbjsKLSAgCi0gIGxsdm06OkZ1bmN0aW9uKiBzdGF0aWNTdHViRnVuY3Rpb247Ci0gIGxsdm06OkZ1bmN0aW9uKiBzcGVjaWFsU3R1YkZ1bmN0aW9uOwotICBsbHZtOjpGdW5jdGlvbiogdmlydHVhbFN0dWJGdW5jdGlvbjsKLSAgCi0gIFNpZ25kZWYqIHNpZ25hdHVyZTsKLQotICBsbHZtOjpGdW5jdGlvbiogY3JlYXRlRnVuY3Rpb25DYWxsQnVmKGJvb2wgdmlydCk7Ci0gIGxsdm06OkZ1bmN0aW9uKiBjcmVhdGVGdW5jdGlvbkNhbGxBUChib29sIHZpcnQpOwotICBsbHZtOjpGdW5jdGlvbiogY3JlYXRlRnVuY3Rpb25TdHViKGJvb2wgc3BlY2lhbCwgYm9vbCB2aXJ0KTsKLSAgIAotICAKLXB1YmxpYzoKLSAgY29uc3QgbGx2bTo6RnVuY3Rpb25UeXBlKiBnZXRWaXJ0dWFsVHlwZSgpOwotICBjb25zdCBsbHZtOjpGdW5jdGlvblR5cGUqIGdldFN0YXRpY1R5cGUoKTsKLSAgY29uc3QgbGx2bTo6RnVuY3Rpb25UeXBlKiBnZXROYXRpdmVUeXBlKCk7Ci0KLSAgY29uc3QgbGx2bTo6RnVuY3Rpb25UeXBlKiBnZXRWaXJ0dWFsQnVmVHlwZSgpOwotICBjb25zdCBsbHZtOjpGdW5jdGlvblR5cGUqIGdldFN0YXRpY0J1ZlR5cGUoKTsKLQotICBjb25zdCBsbHZtOjpQb2ludGVyVHlwZSogIGdldFN0YXRpY1B0clR5cGUoKTsKLSAgY29uc3QgbGx2bTo6UG9pbnRlclR5cGUqICBnZXROYXRpdmVQdHJUeXBlKCk7Ci0gIGNvbnN0IGxsdm06OlBvaW50ZXJUeXBlKiAgZ2V0VmlydHVhbFB0clR5cGUoKTsKLSAgIAotICBsbHZtOjpGdW5jdGlvbiogZ2V0VmlydHVhbEJ1ZigpOwotICBsbHZtOjpGdW5jdGlvbiogZ2V0VmlydHVhbEFQKCk7Ci0gIGxsdm06OkZ1bmN0aW9uKiBnZXRTdGF0aWNCdWYoKTsKLSAgbGx2bTo6RnVuY3Rpb24qIGdldFN0YXRpY0FQKCk7Ci0gIAotICBsbHZtOjpGdW5jdGlvbiogZ2V0U3RhdGljU3R1YigpOwotICBsbHZtOjpGdW5jdGlvbiogZ2V0U3BlY2lhbFN0dWIoKTsKLSAgbGx2bTo6RnVuY3Rpb24qIGdldFZpcnR1YWxTdHViKCk7Ci0gIAotICBMTFZNU2lnbmF0dXJlSW5mbyhTaWduZGVmKiBzaWduLCBKYXZhTExWTUNvbXBpbGVyKiBjb21wKSA6Ci0gICAgQ29tcGlsZXIoY29tcCksCi0gICAgc3RhdGljVHlwZSgwKSwKLSAgICB2aXJ0dWFsVHlwZSgwKSwKLSAgICBuYXRpdmVUeXBlKDApLAotICAgIHZpcnR1YWxCdWZUeXBlKDApLAotICAgIHN0YXRpY0J1ZlR5cGUoMCksCi0gICAgc3RhdGljUHRyVHlwZSgwKSwKLSAgICB2aXJ0dWFsUHRyVHlwZSgwKSwKLSAgICBuYXRpdmVQdHJUeXBlKDApLAotICAgIHZpcnR1YWxCdWZGdW5jdGlvbigwKSwKLSAgICB2aXJ0dWFsQVBGdW5jdGlvbigwKSwKLSAgICBzdGF0aWNCdWZGdW5jdGlvbigwKSwKLSAgICBzdGF0aWNBUEZ1bmN0aW9uKDApLAotICAgIHN0YXRpY1N0dWJGdW5jdGlvbigwKSwKLSAgICBzcGVjaWFsU3R1YkZ1bmN0aW9uKDApLAotICAgIHZpcnR1YWxTdHViRnVuY3Rpb24oMCksCi0gICAgc2lnbmF0dXJlKHNpZ24pIHt9Ci0KLX07Ci0KLX0gLy8gZW5kIG5hbWVzcGFjZSBqMwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2luY2x1ZGUvajMvTExWTU1hdGVyaWFsaXplci5oIGIvdm1raXQvaW5jbHVkZS9qMy9MTFZNTWF0ZXJpYWxpemVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNGJiZDYuLjAwMDAwMDAKLS0tIGEvdm1raXQvaW5jbHVkZS9qMy9MTFZNTWF0ZXJpYWxpemVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0gTExWTU1hdGVyaWFsaXplci5oIC0gTExWTSBNYXRlcmlhbGl6ZXIgZm9yIEozIC0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2lmbmRlZiBKM19MTFZNX01BVEVSSUFMSVpFUl9ICi0jZGVmaW5lIEozX0xMVk1fTUFURVJJQUxJWkVSX0gKLQotI2luY2x1ZGUgPGxsdm0vR1ZNYXRlcmlhbGl6ZXIuaD4KLQotI2luY2x1ZGUgImozL0phdmFKSVRDb21waWxlci5oIgotCi1uYW1lc3BhY2UgajMgewotCi1jbGFzcyBMTFZNTWF0ZXJpYWxpemVyOwotCi1zdHJ1Y3QgQ2FsbGJhY2tJbmZvIHsKLSAgQ2xhc3MqIGNsOwotICB1aW50MTYgaW5kZXg7Ci0gIGJvb2wgc3RhdDsKLQotICBDYWxsYmFja0luZm8oQ2xhc3MqIGMsIHVpbnQzMiBpLCBib29sIHMpIDoKLSAgICBjbChjKSwgaW5kZXgoaSksIHN0YXQocykge30KLQotfTsKLQotY2xhc3MgSmF2YUxMVk1MYXp5SklUQ29tcGlsZXIgOiBwdWJsaWMgSmF2YUpJVENvbXBpbGVyIHsKLXByaXZhdGU6Ci0gIHN0ZDo6bWFwPGxsdm06OkZ1bmN0aW9uKiwgQ2FsbGJhY2tJbmZvPiBjYWxsYmFja3M7Ci0gIHR5cGVkZWYgc3RkOjptYXA8bGx2bTo6RnVuY3Rpb24qLCBDYWxsYmFja0luZm8+OjppdGVyYXRvciBjYWxsYmFja19pdGVyYXRvcjsKLQotcHVibGljOgotICBsbHZtOjpHVk1hdGVyaWFsaXplciogVGhlTWF0ZXJpYWxpemVyOwotICAKLSAgdmlydHVhbCBsbHZtOjpWYWx1ZSogYWRkQ2FsbGJhY2soQ2xhc3MqIGNsLCB1aW50MTYgaW5kZXgsIFNpZ25kZWYqIHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RhdCwgbGx2bTo6QmFzaWNCbG9jayogaW5zZXJ0KTsKLSAgdmlydHVhbCB1aW50cHRyX3QgZ2V0UG9pbnRlck9yU3R1YihKYXZhTWV0aG9kJiBtZXRoLCBpbnQgc2lkZSk7Ci0gIAotICB2aXJ0dWFsIEphdmFDb21waWxlciogQ3JlYXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBNb2R1bGVJRCkgewotICAgIHJldHVybiBuZXcgSmF2YUxMVk1MYXp5SklUQ29tcGlsZXIoTW9kdWxlSUQpOwotICB9Ci0KLSAgSmF2YUxMVk1MYXp5SklUQ29tcGlsZXIoY29uc3Qgc3RkOjpzdHJpbmcmIE1vZHVsZUlEKTsKLSAgCi0gIHZpcnR1YWwgfkphdmFMTFZNTGF6eUpJVENvbXBpbGVyKCk7Ci0gIAotICB2aXJ0dWFsIHZvaWQqIGxvYWRNZXRob2Qodm9pZCogaGFuZGxlLCBjb25zdCBjaGFyKiBzeW1ib2wpOwotCi0gIGZyaWVuZCBjbGFzcyBMTFZNTWF0ZXJpYWxpemVyOwotfTsKLQotY2xhc3MgTExWTU1hdGVyaWFsaXplciA6IHB1YmxpYyBsbHZtOjpHVk1hdGVyaWFsaXplciB7Ci1wdWJsaWM6Ci0gCi0gIEphdmFMTFZNTGF6eUpJVENvbXBpbGVyKiBDb21wOwotICBsbHZtOjpNb2R1bGUqIFRoZU1vZHVsZTsKLQotICBMTFZNTWF0ZXJpYWxpemVyKGxsdm06Ok1vZHVsZSogTSwgSmF2YUxMVk1MYXp5SklUQ29tcGlsZXIqIEMpOwotCi0gIHZpcnR1YWwgYm9vbCBNYXRlcmlhbGl6ZShsbHZtOjpHbG9iYWxWYWx1ZSAqR1YsIHN0ZDo6c3RyaW5nICpFcnJJbmZvID0gMCk7Ci0gIHZpcnR1YWwgYm9vbCBpc01hdGVyaWFsaXphYmxlKGNvbnN0IGxsdm06Okdsb2JhbFZhbHVlKikgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBpc0RlbWF0ZXJpYWxpemFibGUoY29uc3QgbGx2bTo6R2xvYmFsVmFsdWUqKSBjb25zdCB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHZpcnR1YWwgYm9vbCBNYXRlcmlhbGl6ZU1vZHVsZShsbHZtOjpNb2R1bGUqLCBzdGQ6OnN0cmluZyopIHsgcmV0dXJuIHRydWU7IH0KLX07Ci0KLX0gLy8gRW5kIGozIG5hbWVzcGFjZQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2luY2x1ZGUvajMvT3Bjb2RlTmFtZXMuZGVmIGIvdm1raXQvaW5jbHVkZS9qMy9PcGNvZGVOYW1lcy5kZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMjhkMWMuLjAwMDAwMDAKLS0tIGEvdm1raXQvaW5jbHVkZS9qMy9PcGNvZGVOYW1lcy5kZWYKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLSBPcGNvZGVOYW1lcy5kZWYgLSBOYW1lIG9mIG9wY29kZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIE9QQ09ERV9OQU1FU19ERUYKLSNkZWZpbmUgT1BDT0RFX05BTUVTX0RFRgotCi1zdGF0aWMgY29uc3QgY2hhciogT3Bjb2RlTmFtZXNbMjU2XSA9IHsKLSAgICAgICJOT1AiLAotICAgICAgIkFDT05TVF9OVUxMIiwKLSAgICAgICJJQ09OU1RfTTEiLAotICAgICAgIklDT05TVF8wIiwKLSAgICAgICJJQ09OU1RfMSIsCi0gICAgICAiSUNPTlNUXzIiLAotICAgICAgIklDT05TVF8zIiwKLSAgICAgICJJQ09OU1RfNCIsCi0gICAgICAiSUNPTlNUXzUiLAotICAgICAgIkxDT05TVF8wIiwKLSAgICAgICJMQ09OU1RfMSIsCi0gICAgICAiRkNPTlNUXzAiLAotICAgICAgIkZDT05TVF8xIiwKLSAgICAgICJGQ09OU1RfMiIsCi0gICAgICAiRENPTlNUXzAiLAotICAgICAgIkRDT05TVF8xIiwKLSAgICAgICJCSVBVU0giLAotICAgICAgIlNJUFVTSCIsCi0gICAgICAiTERDIiwKLSAgICAgICJMRENfVyIsCi0gICAgICAiTERDMl9XIiwKLSAgICAgICJJTE9BRCIsCi0gICAgICAiTExPQUQiLAotICAgICAgIkZMT0FEIiwKLSAgICAgICJETE9BRCIsCi0gICAgICAiQUxPQUQiLAotICAgICAgIklMT0FEXzAiLAotICAgICAgIklMT0FEXzEiLAotICAgICAgIklMT0FEXzIiLAotICAgICAgIklMT0FEXzMiLAotICAgICAgIkxMT0FEXzAiLAotICAgICAgIkxMT0FEXzEiLAotICAgICAgIkxMT0FEXzIiLAotICAgICAgIkxMT0FEXzMiLAotICAgICAgIkZMT0FEXzAiLAotICAgICAgIkZMT0FEXzEiLAotICAgICAgIkZMT0FEXzIiLAotICAgICAgIkZMT0FEXzMiLAotICAgICAgIkRMT0FEXzAiLAotICAgICAgIkRMT0FEXzEiLAotICAgICAgIkRMT0FEXzIiLAotICAgICAgIkRMT0FEXzMiLAotICAgICAgIkFMT0FEXzAiLAotICAgICAgIkFMT0FEXzEiLAotICAgICAgIkFMT0FEXzIiLAotICAgICAgIkFMT0FEXzMiLAotICAgICAgIklBTE9BRCIsCi0gICAgICAiTEFMT0FEIiwKLSAgICAgICJGQUxPQUQiLAotICAgICAgIkRBTE9BRCIsCi0gICAgICAiQUFMT0FEIiwKLSAgICAgICJCQUxPQUQiLAotICAgICAgIkNBTE9BRCIsCi0gICAgICAiU0FMT0FEIiwKLSAgICAgICJJU1RPUkUiLAotICAgICAgIkxTVE9SRSIsCi0gICAgICAiRlNUT1JFIiwKLSAgICAgICJEU1RPUkUiLAotICAgICAgIkFTVE9SRSIsCi0gICAgICAiSVNUT1JFXzAiLAotICAgICAgIklTVE9SRV8xIiwKLSAgICAgICJJU1RPUkVfMiIsCi0gICAgICAiSVNUT1JFXzMiLAotICAgICAgIkxTVE9SRV8wIiwKLSAgICAgICJMU1RPUkVfMSIsCi0gICAgICAiTFNUT1JFXzIiLAotICAgICAgIkxTVE9SRV8zIiwKLSAgICAgICJGU1RPUkVfMCIsCi0gICAgICAiRlNUT1JFXzEiLAotICAgICAgIkZTVE9SRV8yIiwKLSAgICAgICJGU1RPUkVfMyIsCi0gICAgICAiRFNUT1JFXzAiLAotICAgICAgIkRTVE9SRV8xIiwKLSAgICAgICJEU1RPUkVfMiIsCi0gICAgICAiRFNUT1JFXzMiLAotICAgICAgIkFTVE9SRV8wIiwKLSAgICAgICJBU1RPUkVfMSIsCi0gICAgICAiQVNUT1JFXzIiLAotICAgICAgIkFTVE9SRV8zIiwKLSAgICAgICJJQVNUT1JFIiwKLSAgICAgICJMQVNUT1JFIiwKLSAgICAgICJGQVNUT1JFIiwKLSAgICAgICJEQVNUT1JFIiwKLSAgICAgICJBQVNUT1JFIiwKLSAgICAgICJCQVNUT1JFIiwKLSAgICAgICJDQVNUT1JFIiwKLSAgICAgICJTQVNUT1JFIiwKLSAgICAgICJQT1AiLAotICAgICAgIlBPUDIiLAotICAgICAgIkRVUCIsCi0gICAgICAiRFVQX1gxIiwKLSAgICAgICJEVVBfWDIiLAotICAgICAgIkRVUDIiLAotICAgICAgIkRVUDJfWDEiLAotICAgICAgIkRVUDJfWDIiLAotICAgICAgIlNXQVAiLAotICAgICAgIklBREQiLAotICAgICAgIkxBREQiLAotICAgICAgIkZBREQiLAotICAgICAgIkRBREQiLAotICAgICAgIklTVUIiLAotICAgICAgIkxTVUIiLAotICAgICAgIkZTVUIiLAotICAgICAgIkRTVUIiLAotICAgICAgIklNVUwiLAotICAgICAgIkxNVUwiLAotICAgICAgIkZNVUwiLAotICAgICAgIkRNVUwiLAotICAgICAgIklESVYiLAotICAgICAgIkxESVYiLAotICAgICAgIkZESVYiLAotICAgICAgIkRESVYiLAotICAgICAgIklSRU0iLAotICAgICAgIkxSRU0iLAotICAgICAgIkZSRU0iLAotICAgICAgIkRSRU0iLAotICAgICAgIklORUciLAotICAgICAgIkxORUciLAotICAgICAgIkZORUciLAotICAgICAgIkRORUciLAotICAgICAgIklTSEwiLAotICAgICAgIkxTSEwiLAotICAgICAgIklTSFIiLAotICAgICAgIkxTSFIiLAotICAgICAgIklVU0hSIiwKLSAgICAgICJMVVNIUiIsCi0gICAgICAiSUFORCIsCi0gICAgICAiTEFORCIsCi0gICAgICAiSU9SIiwKLSAgICAgICJMT1IiLAotICAgICAgIklYT1IiLAotICAgICAgIkxYT1IiLAotICAgICAgIklJTkMiLAotICAgICAgIkkyTCIsCi0gICAgICAiSTJGIiwKLSAgICAgICJJMkQiLAotICAgICAgIkwySSIsCi0gICAgICAiTDJGIiwKLSAgICAgICJMMkQiLAotICAgICAgIkYySSIsCi0gICAgICAiRjJMIiwKLSAgICAgICJGMkQiLAotICAgICAgIkQySSIsCi0gICAgICAiRDJMIiwKLSAgICAgICJEMkYiLAotICAgICAgIkkyQiIsCi0gICAgICAiSTJDIiwKLSAgICAgICJJMlMiLAotICAgICAgIkxDTVAiLAotICAgICAgIkZDTVBMIiwKLSAgICAgICJGQ01QRyIsCi0gICAgICAiRENNUEwiLAotICAgICAgIkRDTVBHIiwKLSAgICAgICJJRkVRIiwKLSAgICAgICJJRk5FIiwKLSAgICAgICJJRkxUIiwKLSAgICAgICJJRkdFIiwKLSAgICAgICJJRkdUIiwKLSAgICAgICJJRkxFIiwKLSAgICAgICJJRl9JQ01QRVEiLAotICAgICAgIklGX0lDTVBORSIsCi0gICAgICAiSUZfSUNNUExUIiwKLSAgICAgICJJRl9JQ01QR0UiLAotICAgICAgIklGX0lDTVBHVCIsCi0gICAgICAiSUZfSUNNUExFIiwKLSAgICAgICJJRl9BQ01QRVEiLAotICAgICAgIklGX0FDTVBORSIsCi0gICAgICAiR09UTyIsCi0gICAgICAiSlNSIiwKLSAgICAgICJSRVQiLAotICAgICAgIlRBQkxFU1dJVENIIiwKLSAgICAgICJMT09LVVBTV0lUQ0giLAotICAgICAgIklSRVRVUk4iLAotICAgICAgIkxSRVRVUk4iLAotICAgICAgIkZSRVRVUk4iLAotICAgICAgIkRSRVRVUk4iLAotICAgICAgIkFSRVRVUk4iLAotICAgICAgIlJFVFVSTiIsCi0gICAgICAiR0VUU1RBVElDIiwKLSAgICAgICJQVVRTVEFUSUMiLAotICAgICAgIkdFVEZJRUxEIiwKLSAgICAgICJQVVRGSUVMRCIsCi0gICAgICAiSU5WT0tFVklSVFVBTCIsCi0gICAgICAiSU5WT0tFU1BFQ0lBTCIsCi0gICAgICAiSU5WT0tFU1RBVElDIiwKLSAgICAgICJJTlZPS0VJTlRFUkZBQ0UiLAotICAgICAgIlVOVVNFRCIsCi0gICAgICAiTkVXIiwKLSAgICAgICJORVdBUlJBWSIsCi0gICAgICAiQU5FV0FSUkFZIiwKLSAgICAgICJBUlJBWUxFTkdUSCIsCi0gICAgICAiQVRIUk9XIiwKLSAgICAgICJDSEVDS0NBU1QiLAotICAgICAgIklOU1RBTkNFT0YiLAotICAgICAgIk1PTklUT1JFTlRFUiIsCi0gICAgICAiTU9OSVRPUkVYSVQiLAotICAgICAgIldJREUiLAotICAgICAgIk1VTFRJQU5FV0FSUkFZIiwKLSAgICAgICJJRk5VTEwiLAotICAgICAgIklGTk9OTlVMTCIsCi0gICAgICAiR09UT19XIiwKLSAgICAgICJKU1JfVyIsCi0gICAgICAiQlJFQUtQT0lOVCIsCi0gICAgICAiSU1QREVQMSIsCi0gICAgICAiSU1QREVQMiIKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvaW5jbHVkZS9tdm0vQWxsb2NhdG9yLmggYi92bWtpdC9pbmNsdWRlL212bS9BbGxvY2F0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA4M2M0Ny4uMDAwMDAwMAotLS0gYS92bWtpdC9pbmNsdWRlL212bS9BbGxvY2F0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0gQWxsb2NhdG9yLmggLSBBIG1lbW9yeSBhbGxvY2F0b3IgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgTVZNX0FMTE9DQVRPUl9ICi0jZGVmaW5lIE1WTV9BTExPQ0FUT1JfSAotCi0jaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPGxpbWl0cz4KLQotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKLQotI2luY2x1ZGUgIm12bS9UaHJlYWRzL0xvY2tzLmgiCi0KLSNkZWZpbmUgZGVjbGFyZV9nY3Jvb3QodHlwZSwgbmFtZSkgdHlwZSBuYW1lOyBsbHZtX2djcm9vdChuYW1lLCAwKTsgbmFtZQotCi1uYW1lc3BhY2UgbXZtIHsKLQotY2xhc3MgQnVtcFB0ckFsbG9jYXRvciB7Ci1wcml2YXRlOgotICBTcGluTG9jayBUaGVMb2NrOwotICBsbHZtOjpCdW1wUHRyQWxsb2NhdG9yIEFsbG9jYXRvcjsKLXB1YmxpYzoKLSAgdm9pZCogQWxsb2NhdGUoc2l6ZV90IHN6LCBjb25zdCBjaGFyKiBuYW1lKSB7Ci0jaWZkZWYgVVNFX0dDX0JPRUhNCi0gICAgcmV0dXJuIEdDX01BTExPQyhzeik7Ci0jZWxzZQotICAgIFRoZUxvY2suYWNxdWlyZSgpOwotICAgIHZvaWQqIHJlcyA9IEFsbG9jYXRvci5BbGxvY2F0ZShzeiwgc2l6ZW9mKHZvaWQqKSk7Ci0gICAgVGhlTG9jay5yZWxlYXNlKCk7Ci0gICAgbWVtc2V0KHJlcywgMCwgc3opOwotICAgIHJldHVybiByZXM7Ci0jZW5kaWYKLSAgfQotCi0gIHZvaWQgRGVhbGxvY2F0ZSh2b2lkKiBvYmopIHt9Ci0KLX07Ci0KLWNsYXNzIFRocmVhZEFsbG9jYXRvciB7Ci1wcml2YXRlOgotICBsbHZtOjpCdW1wUHRyQWxsb2NhdG9yIEFsbG9jYXRvcjsKLXB1YmxpYzoKLSAgdm9pZCogQWxsb2NhdGUoc2l6ZV90IHN6KSB7Ci0jaWZkZWYgVVNFX0dDX0JPRUhNCi0gICAgcmV0dXJuIEdDX01BTExPQyhzeik7Ci0jZWxzZQotICAgIHZvaWQqIHJlcyA9IEFsbG9jYXRvci5BbGxvY2F0ZShzeiwgc2l6ZW9mKHZvaWQqKSk7Ci0gICAgbWVtc2V0KHJlcywgMCwgc3opOwotICAgIHJldHVybiByZXM7Ci0jZW5kaWYKLSAgfQotCi0gIHZvaWQgRGVhbGxvY2F0ZSh2b2lkKiBvYmopIHt9Ci0KLX07Ci0KLWNsYXNzIFBlcm1hbmVudE9iamVjdCB7Ci1wdWJsaWM6Ci0gIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qgc3osIEJ1bXBQdHJBbGxvY2F0b3ImIGFsbG9jYXRvciwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgICByZXR1cm4gYWxsb2NhdG9yLkFsbG9jYXRlKHN6LCBuYW1lKTsKLSAgfQotICAKLSAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCogcHRyKSB7Ci0gICAgZnJlZShwdHIpOwotICB9Ci0KLSAgdm9pZCogb3BlcmF0b3IgbmV3IFtdKHNpemVfdCBzeiwgQnVtcFB0ckFsbG9jYXRvciYgYWxsb2NhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSkgewotICAgIHJldHVybiBhbGxvY2F0b3IuQWxsb2NhdGUoc3osIG5hbWUpOwotICB9Ci0gIAotICB2b2lkKiBvcGVyYXRvciBuZXdbXShzaXplX3Qgc3opIHsKLSAgICByZXR1cm4gbWFsbG9jKHN6KTsKLSAgfQotICAKLSAgdm9pZCBvcGVyYXRvciBkZWxldGVbXSh2b2lkKiBwdHIpIHsKLSAgICByZXR1cm4gZnJlZShwdHIpOwotICB9Ci19OwotCi0vLy8gSklUSW5mbyAtIFRoaXMgY2xhc3MgY2FuIGJlIGRlcml2ZWQgZnJvbSB0byBob2xkIHByaXZhdGUgSklULXNwZWNpZmljCi0vLy8gaW5mb3JtYXRpb24uIE9iamVjdHMgb2YgdHlwZSBhcmUgYWNjZXNzZWQvY3JlYXRlZCB3aXRoCi0vLy8gPENsYXNzPjo6Z2V0SW5mbyBhbmQgZGVzdHJveWVkIHdoZW4gdGhlIDxDbGFzcz4gb2JqZWN0IGlzIGRlc3Ryb3llZC4KLXN0cnVjdCBKSVRJbmZvIDogcHVibGljIG12bTo6UGVybWFuZW50T2JqZWN0IHsKLSAgdmlydHVhbCB+SklUSW5mbygpIHt9Ci0gIHZpcnR1YWwgdm9pZCBjbGVhcigpIHt9Ci19OwotCi19IC8vIGVuZCBuYW1lc3BhY2UgbXZtCi0KLSNlbmRpZiAvLyBNVk1fQUxMT0NBVE9SX0gKZGlmZiAtLWdpdCBhL3Zta2l0L2luY2x1ZGUvbXZtL0NvbmZpZy9jb25maWcuaC5pbiBiL3Zta2l0L2luY2x1ZGUvbXZtL0NvbmZpZy9jb25maWcuaC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVkNGI3Ni4uMDAwMDAwMAotLS0gYS92bWtpdC9pbmNsdWRlL212bS9Db25maWcvY29uZmlnLmguaW4KKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKiBpbmNsdWRlL212bS9Db25maWcvY29uZmlnLmguaW4uICBHZW5lcmF0ZWQgZnJvbSBhdXRvY29uZi9jb25maWd1cmUuYWMgYnkgYXV0b2hlYWRlci4gICovCi0KLS8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBpbnQ2NF90Jy4gKi8KLSN1bmRlZiBIQVZFX0lOVDY0X1QKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX0lOVFRZUEVTX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnYycgbGlicmFyeSAoLWxnYykuICovCi0jdW5kZWYgSEFWRV9MSUJHQwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHB0aHJlYWQnIGxpYnJhcnkgKC1scHRocmVhZCkuICovCi0jdW5kZWYgSEFWRV9MSUJQVEhSRUFECi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgeicgbGlicmFyeSAoLWx6KS4gKi8KLSN1bmRlZiBIQVZFX0xJQloKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBsb25nam1wJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0xPTkdKTVAKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9NRU1PUllfSAotCi0vKiBVc2luZyBwdGhyZWFkIGxpYnJhcnkgKi8KLSN1bmRlZiBIQVZFX1BUSFJFQUQKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRqbXAnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU0VUSk1QCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1RESU5UX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TVFJJTkdTX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TVFJJTkdfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1lTX1NUQVRfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NZU19UWVBFU19ICi0KLS8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGB1aW50NjRfdCcuICovCi0jdW5kZWYgSEFWRV9VSU5UNjRfVAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGB1X2ludDY0X3QnLiAqLwotI3VuZGVmIEhBVkVfVV9JTlQ2NF9UCi0KLS8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLwotI3VuZGVmIFBBQ0tBR0VfQlVHUkVQT1JUCi0KLS8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX05BTUUKLQotLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLwotI3VuZGVmIFBBQ0tBR0VfU1RSSU5HCi0KLS8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX1RBUk5BTUUKLQotLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX1ZFUlNJT04KLQotLyogRGVmaW5lIGFzIHRoZSByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMgKGBpbnQnIG9yIGB2b2lkJykuICovCi0jdW5kZWYgUkVUU0lHVFlQRQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91ciA8c3lzL3RpbWUuaD4gZGVjbGFyZXMgYHN0cnVjdCB0bScuICovCi0jdW5kZWYgVE1fSU5fU1lTX1RJTUUKLQotLyogVXNpbmcgdGhlIGJvZWhtIGdjICovCi0jdW5kZWYgVVNFX0dDX0JPRUhNCi0KLS8qIFVzaW5nIHRoZSBnY21tYXAyICovCi0jdW5kZWYgVVNFX0dDX01NQVAyCi0KLS8qIENvbXBpbGluZyBOMyAqLwotI3VuZGVmIFdJVEhfTjMKLQotLyogQ29tcGlsaW5nIEpOSlZNICovCi0jdW5kZWYgV0lUSF9KMwotCi0vKiBEZWZpbmUgdG8gYGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2VzIG5vdCBkZWZpbmUuICovCi0jdW5kZWYgcGlkX3QKLQotLyogRGVmaW5lIHRvIGB1bnNpZ25lZCBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lcyBub3QgZGVmaW5lLiAqLwotI3VuZGVmIHNpemVfdApkaWZmIC0tZ2l0IGEvdm1raXQvaW5jbHVkZS9tdm0vR0MuaCBiL3Zta2l0L2luY2x1ZGUvbXZtL0dDLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNGIxZWQuLjAwMDAwMDAKLS0tIGEvdm1raXQvaW5jbHVkZS9tdm0vR0MuaAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0gR0MuaCAtIEdhcmJhZ2UgQ29sbGVjdGlvbiBJbnRlcmZhY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgVGhlIE1pY3JvIFZpcnR1YWwgTWFjaGluZQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLQotI2lmbmRlZiBfR0NfSF8KLSNkZWZpbmUgX0dDX0hfCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlICJPYmplY3RIZWFkZXIuaCIKLQotI2lmZGVmIFdJVEhfTExWTV9HQ0MKLWV4dGVybiAiQyIgdm9pZCBfX2xsdm1fZ2Nyb290KHZvaWQqKiwgdm9pZCopIF9fYXR0cmlidXRlX18oKG5vdGhyb3cpKTsKLSNkZWZpbmUgbGx2bV9nY3Jvb3QoYSwgYikgX19sbHZtX2djcm9vdCgodm9pZCoqKSZhLCBiKQotI2Vsc2UKLSNkZWZpbmUgbGx2bV9nY3Jvb3QoYSwgYikKLSNlbmRpZgotCi1uYW1lc3BhY2UgbXZtIHsKLQotCWNsYXNzIFZpcnR1YWxNYWNoaW5lOwotCWNsYXNzIFZpcnR1YWxUYWJsZTsKLQljbGFzcyBnYzsKLQotCWNsYXNzIGdjUm9vdCB7Ci0JcHVibGljOgotCQl2aXJ0dWFsICAgICAgICAgICB+Z2NSb290KCkge30KLQkJdmlydHVhbCB2b2lkICAgICAgdHJhY2VyKHVpbnRwdHJfdCBjbG9zdXJlKSB7fQotCQl1aW50cHRyX3QgaGVhZGVyOwotICAKLQkJLy8vIGdldFZpcnR1YWxUYWJsZSAtIFJldHVybnMgdGhlIHZpcnR1YWwgdGFibGUgb2YgdGhpcyBvYmplY3QuCi0JCS8vLwotCQlWaXJ0dWFsVGFibGUqIGdldFZpcnR1YWxUYWJsZSgpIGNvbnN0IHsKLQkJCXJldHVybiAoKFZpcnR1YWxUYWJsZSoqKSh0aGlzKSlbMF07Ci0JCX0KLSAgCi0JCS8vLyBzZXRWaXJ0dWFsVGFibGUgLSBTZXRzIHRoZSB2aXJ0dWFsIHRhYmxlIG9mIHRoaXMgb2JqZWN0LgotCQkvLy8KLQkJdm9pZCBzZXRWaXJ0dWFsVGFibGUoVmlydHVhbFRhYmxlKiBWVCkgewotCQkJKChWaXJ0dWFsVGFibGUqKikodGhpcykpWzBdID0gVlQ7Ci0JCX0KLQl9OwotCi0JLy8gV0FSTklORzogaWYgeW91IG1vZGlmeSB0aGlzIGNsYXNzLCB5b3UgbXVzdCBhbHNvIGNoYW5nZSB0aGUgZ2VuZXJhdGlvbiBvZiBWVCBpbiBKYXZhQU9UQ29tcGlsZXIKLQljbGFzcyBDb21tb25WaXJ0dWFsVGFibGUgewotCXB1YmxpYzoKLQkJdWludHB0cl90ICAgICAgIGRlc3RydWN0b3I7Ci0JCXVpbnRwdHJfdCAgICAgICBvcGVyYXRvckRlbGV0ZTsKLQkJdWludHB0cl90ICAgICAgIHRyYWNlcjsKLQkJVmlydHVhbE1hY2hpbmUqIHZtOwotCi0JCXVpbnRwdHJfdCogZ2V0RnVuY3Rpb25zKCkgewotCQkJcmV0dXJuICZkZXN0cnVjdG9yOwotCQl9Ci0KLQkJc3RhdGljIGludCBudW1iZXJPZkNvbW1vbkVudHJpZXMoKSB7IHJldHVybiA0OyB9Ci0KLQkJc3RhdGljIHZvaWQgZW1wdHlUcmFjZXIodm9pZCopIHt9Ci0JfTsKLQotfSAvLyBuYW1lc3BhY2UgbXZtCi0KLSNpbmNsdWRlICJNdm1HQy5oIgotCi1uYW1lc3BhY2UgbXZtIHsKLQljbGFzcyBnYyA6IHB1YmxpYyBjb2xsZWN0YWJsZSB7Ci0JfTsKLQotCWNsYXNzIFZpcnR1YWxUYWJsZSA6IHB1YmxpYyBHQ1ZpcnR1YWxUYWJsZSB7fTsKLQotICBzdGF0aWMgY29uc3QgdWludDMyX3QgSGFzaEJpdHMgPSA4OwotICBzdGF0aWMgY29uc3QgdWludDY0X3QgR0NCaXRNYXNrID0gKCgxIDw8IEdDQml0cykgLSAxKTsKLX0gLy8gbmFtZXNwYWNlIG12bQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2luY2x1ZGUvbXZtL0pJVC5oIGIvdm1raXQvaW5jbHVkZS9tdm0vSklULmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MjY0NDMuLjAwMDAwMDAKLS0tIGEvdm1raXQvaW5jbHVkZS9tdm0vSklULmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0gSklULmggLSBKSVQgZmFjaWxpdGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBNaWNybyBWaXJ0dWFsIE1hY2hpbmUKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2lmbmRlZiBNVk1fSklUX0gKLSNkZWZpbmUgTVZNX0pJVF9ICi0KLSNpbmNsdWRlIDxjZmxvYXQ+Ci0jaW5jbHVkZSA8Y21hdGg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAidHlwZXMuaCIKLQotI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKLQotI2luY2x1ZGUgIm12bS9NZXRob2RJbmZvLmgiCi0jaW5jbHVkZSAibXZtL0dDLmgiCi0KLW5hbWVzcGFjZSBsbHZtIHsKLSAgY2xhc3MgQ29uc3RhbnQ7Ci0gIGNsYXNzIENvbnN0YW50RlA7Ci0gIGNsYXNzIENvbnN0YW50SW50OwotICBjbGFzcyBFeGVjdXRpb25FbmdpbmU7Ci0gIGNsYXNzIEZ1bmN0aW9uOwotICBjbGFzcyBGdW5jdGlvblBhc3NNYW5hZ2VyOwotICBjbGFzcyBHQ0Z1bmN0aW9uSW5mbzsKLSAgY2xhc3MgR0NTdHJhdGVneTsKLSAgY2xhc3MgSklUOwotICBjbGFzcyBNb2R1bGU7Ci0gIGNsYXNzIFBvaW50ZXJUeXBlOwotICBjbGFzcyBUYXJnZXREYXRhOwotICBjbGFzcyBUYXJnZXRNYWNoaW5lOwotICBjbGFzcyBUeXBlOwotfQotCi1uYW1lc3BhY2UgbXZtIHsKLQotY2xhc3MgTG9ja1JlY3Vyc2l2ZTsKLQotY29uc3QgZG91YmxlIE1heERvdWJsZSA9ICtJTkZJTklUWTsgLy8xLjAgLyAwLjA7Ci1jb25zdCBkb3VibGUgTWluRG91YmxlID0gLUlORklOSVRZOy8vLTEuMCAvIDAuMDsKLWNvbnN0IGRvdWJsZSBNYXhMb25nRG91YmxlID0gIDkyMjMzNzIwMzY4NTQ3NzU4MDcuMDsKLWNvbnN0IGRvdWJsZSBNaW5Mb25nRG91YmxlID0gLTkyMjMzNzIwMzY4NTQ3NzU4MDguMDsKLWNvbnN0IGRvdWJsZSBNYXhJbnREb3VibGUgPSAyMTQ3NDgzNjQ3LjA7Ci1jb25zdCBkb3VibGUgTWluSW50RG91YmxlID0gLTIxNDc0ODM2NDguMDsKLWNvbnN0IHVpbnQ2NCBNYXhMb25nID0gOTIyMzM3MjAzNjg1NDc3NTgwN0xMOwotY29uc3QgdWludDY0IE1pbkxvbmcgPSAtOTIyMzM3MjAzNjg1NDc3NTgwOFVMTDsKLWNvbnN0IHVpbnQzMiBNYXhJbnQgPSAgMjE0NzQ4MzY0NzsKLWNvbnN0IHVpbnQzMiBNaW5JbnQgPSAgLTIxNDc0ODM2NDhVOwotY29uc3QgZmxvYXQgTWF4RmxvYXQgPSArSU5GSU5JVFk7IC8vKGZsb2F0KSgoKGZsb2F0KTEuMCkgLyAoZmxvYXQpMC4wKTsKLWNvbnN0IGZsb2F0IE1pbkZsb2F0ID0gLUlORklOSVRZOyAvLyhmbG9hdCkoKChmbG9hdCktMS4wKSAvIChmbG9hdCkwLjApOwotY29uc3QgZmxvYXQgTWF4TG9uZ0Zsb2F0ID0gKGZsb2F0KTkyMjMzNzIwMzY4NTQ3NzU4MDcuMDsKLWNvbnN0IGZsb2F0IE1pbkxvbmdGbG9hdCA9IChmbG9hdCktOTIyMzM3MjAzNjg1NDc3NTgwOC4wOwotY29uc3QgZmxvYXQgTWF4SW50RmxvYXQgPSAoZmxvYXQpMjE0NzQ4MzY0Ny4wOwotY29uc3QgZmxvYXQgTWluSW50RmxvYXQgPSAoZmxvYXQpLTIxNDc0ODM2NDguMDsKLWNvbnN0IGZsb2F0IE5hTkZsb2F0ID0gTkFOOyAvLyhmbG9hdCkoKChmbG9hdCkwLjApIC8gKGZsb2F0KTAuMCk7Ci1jb25zdCBkb3VibGUgTmFORG91YmxlID0gTkFOOyAvLzAuMCAvIDAuMDsKLQotY2xhc3MgQmFzZUludHJpbnNpY3MgewotCi1wdWJsaWM6Ci0gIAotICBleHBsaWNpdCBCYXNlSW50cmluc2ljcyhsbHZtOjpNb2R1bGUqKTsKLSAKLSAgbGx2bTo6RnVuY3Rpb24qIGV4Y2VwdGlvbkVuZENhdGNoOwotICBsbHZtOjpGdW5jdGlvbiogZXhjZXB0aW9uQmVnaW5DYXRjaDsKLSAgbGx2bTo6RnVuY3Rpb24qIHVud2luZFJlc3VtZTsKLSAgbGx2bTo6RnVuY3Rpb24qIGV4Y2VwdGlvblNlbGVjdG9yOwotICBsbHZtOjpGdW5jdGlvbiogcGVyc29uYWxpdHk7Ci0gIGxsdm06OkZ1bmN0aW9uKiBsbHZtR2V0RXhjZXB0aW9uOwotCi0gIGxsdm06OkZ1bmN0aW9uKiBwcmludEZsb2F0TExWTTsKLSAgbGx2bTo6RnVuY3Rpb24qIHByaW50RG91YmxlTExWTTsKLSAgbGx2bTo6RnVuY3Rpb24qIHByaW50TG9uZ0xMVk07Ci0gIGxsdm06OkZ1bmN0aW9uKiBwcmludEludExMVk07Ci0gIGxsdm06OkZ1bmN0aW9uKiBwcmludE9iamVjdExMVk07Ci0KLSAgbGx2bTo6RnVuY3Rpb24qIHNldGptcExMVk07Ci0KLSAgbGx2bTo6RnVuY3Rpb24qIGZ1bmNfbGx2bV9mYWJzX2YzMjsKLSAgbGx2bTo6RnVuY3Rpb24qIGZ1bmNfbGx2bV9mYWJzX2Y2NDsKLSAgbGx2bTo6RnVuY3Rpb24qIGZ1bmNfbGx2bV9zcXJ0X2Y2NDsKLSAgbGx2bTo6RnVuY3Rpb24qIGZ1bmNfbGx2bV9zaW5fZjY0OwotICBsbHZtOjpGdW5jdGlvbiogZnVuY19sbHZtX2Nvc19mNjQ7Ci0gIGxsdm06OkZ1bmN0aW9uKiBmdW5jX2xsdm1fdGFuX2Y2NDsKLSAgbGx2bTo6RnVuY3Rpb24qIGZ1bmNfbGx2bV9hc2luX2Y2NDsKLSAgbGx2bTo6RnVuY3Rpb24qIGZ1bmNfbGx2bV9hY29zX2Y2NDsKLSAgbGx2bTo6RnVuY3Rpb24qIGZ1bmNfbGx2bV9hdGFuX2Y2NDsKLSAgbGx2bTo6RnVuY3Rpb24qIGZ1bmNfbGx2bV9hdGFuMl9mNjQ7Ci0gIGxsdm06OkZ1bmN0aW9uKiBmdW5jX2xsdm1fZXhwX2Y2NDsKLSAgbGx2bTo6RnVuY3Rpb24qIGZ1bmNfbGx2bV9sb2dfZjY0OwotICBsbHZtOjpGdW5jdGlvbiogZnVuY19sbHZtX3Bvd19mNjQ7Ci0gIGxsdm06OkZ1bmN0aW9uKiBmdW5jX2xsdm1fY2VpbF9mNjQ7Ci0gIGxsdm06OkZ1bmN0aW9uKiBmdW5jX2xsdm1fZmxvb3JfZjY0OwotICBsbHZtOjpGdW5jdGlvbiogZnVuY19sbHZtX3JpbnRfZjY0OwotICBsbHZtOjpGdW5jdGlvbiogZnVuY19sbHZtX2NicnRfZjY0OwotICBsbHZtOjpGdW5jdGlvbiogZnVuY19sbHZtX2Nvc2hfZjY0OwotICBsbHZtOjpGdW5jdGlvbiogZnVuY19sbHZtX2V4cG0xX2Y2NDsKLSAgbGx2bTo6RnVuY3Rpb24qIGZ1bmNfbGx2bV9oeXBvdF9mNjQ7Ci0gIGxsdm06OkZ1bmN0aW9uKiBmdW5jX2xsdm1fbG9nMTBfZjY0OwotICBsbHZtOjpGdW5jdGlvbiogZnVuY19sbHZtX2xvZzFwX2Y2NDsKLSAgbGx2bTo6RnVuY3Rpb24qIGZ1bmNfbGx2bV9zaW5oX2Y2NDsKLSAgbGx2bTo6RnVuY3Rpb24qIGZ1bmNfbGx2bV90YW5oX2Y2NDsKLQotICBsbHZtOjpGdW5jdGlvbiogbGx2bV9tZW1jcHlfaTMyOwotICBsbHZtOjpGdW5jdGlvbiogbGx2bV9tZW1zZXRfaTMyOwotICBsbHZtOjpGdW5jdGlvbiogbGx2bV9mcmFtZWFkZHJlc3M7Ci0gIGxsdm06OkZ1bmN0aW9uKiBsbHZtX2F0b21pY19sY3NfaTg7Ci0gIGxsdm06OkZ1bmN0aW9uKiBsbHZtX2F0b21pY19sY3NfaTE2OwotICBsbHZtOjpGdW5jdGlvbiogbGx2bV9hdG9taWNfbGNzX2kzMjsKLSAgbGx2bTo6RnVuY3Rpb24qIGxsdm1fYXRvbWljX2xjc19pNjQ7Ci0gIGxsdm06OkZ1bmN0aW9uKiBsbHZtX2F0b21pY19sY3NfcHRyOwotICBsbHZtOjpGdW5jdGlvbiogbGx2bV9nY19nY3Jvb3Q7Ci0KLSAgbGx2bTo6RnVuY3Rpb24qIGNvbmRpdGlvbmFsU2FmZVBvaW50OwotICBsbHZtOjpGdW5jdGlvbiogdW5jb25kaXRpb25hbFNhZmVQb2ludDsKLSAgbGx2bTo6RnVuY3Rpb24qIEFsbG9jYXRlRnVuY3Rpb247Ci0gIGxsdm06OkZ1bmN0aW9uKiBBbGxvY2F0ZVVucmVzb2x2ZWRGdW5jdGlvbjsKLSAgbGx2bTo6RnVuY3Rpb24qIEFkZEZpbmFsaXphdGlvbkNhbmRpZGF0ZTsKLQotICBsbHZtOjpDb25zdGFudCogY29uc3RhbnRJbnQ4WmVybzsKLSAgbGx2bTo6Q29uc3RhbnQqIGNvbnN0YW50WmVybzsKLSAgbGx2bTo6Q29uc3RhbnQqIGNvbnN0YW50T25lOwotICBsbHZtOjpDb25zdGFudCogY29uc3RhbnRUd287Ci0gIGxsdm06OkNvbnN0YW50KiBjb25zdGFudFRocmVlOwotICBsbHZtOjpDb25zdGFudCogY29uc3RhbnRGb3VyOwotICBsbHZtOjpDb25zdGFudCogY29uc3RhbnRGaXZlOwotICBsbHZtOjpDb25zdGFudCogY29uc3RhbnRTaXg7Ci0gIGxsdm06OkNvbnN0YW50KiBjb25zdGFudFNldmVuOwotICBsbHZtOjpDb25zdGFudCogY29uc3RhbnRFaWdodDsKLSAgbGx2bTo6Q29uc3RhbnQqIGNvbnN0YW50TWludXNPbmU7Ci0gIGxsdm06OkNvbnN0YW50KiBjb25zdGFudExvbmdNaW51c09uZTsKLSAgbGx2bTo6Q29uc3RhbnQqIGNvbnN0YW50TG9uZ1plcm87Ci0gIGxsdm06OkNvbnN0YW50KiBjb25zdGFudExvbmdPbmU7Ci0gIGxsdm06OkNvbnN0YW50KiBjb25zdGFudE1pbkludDsKLSAgbGx2bTo6Q29uc3RhbnQqIGNvbnN0YW50TWF4SW50OwotICBsbHZtOjpDb25zdGFudCogY29uc3RhbnRNaW5Mb25nOwotICBsbHZtOjpDb25zdGFudCogY29uc3RhbnRNYXhMb25nOwotICBsbHZtOjpDb25zdGFudCogY29uc3RhbnRGbG9hdFplcm87Ci0gIGxsdm06OkNvbnN0YW50KiBjb25zdGFudEZsb2F0T25lOwotICBsbHZtOjpDb25zdGFudCogY29uc3RhbnRGbG9hdFR3bzsKLSAgbGx2bTo6Q29uc3RhbnQqIGNvbnN0YW50RG91YmxlWmVybzsKLSAgbGx2bTo6Q29uc3RhbnQqIGNvbnN0YW50RG91YmxlT25lOwotICBsbHZtOjpDb25zdGFudCogY29uc3RhbnRNYXhJbnRGbG9hdDsKLSAgbGx2bTo6Q29uc3RhbnQqIGNvbnN0YW50TWluSW50RmxvYXQ7Ci0gIGxsdm06OkNvbnN0YW50KiBjb25zdGFudE1pbkxvbmdGbG9hdDsKLSAgbGx2bTo6Q29uc3RhbnQqIGNvbnN0YW50TWluTG9uZ0RvdWJsZTsKLSAgbGx2bTo6Q29uc3RhbnQqIGNvbnN0YW50TWF4TG9uZ0Zsb2F0OwotICBsbHZtOjpDb25zdGFudCogY29uc3RhbnRNYXhJbnREb3VibGU7Ci0gIGxsdm06OkNvbnN0YW50KiBjb25zdGFudE1pbkludERvdWJsZTsKLSAgbGx2bTo6Q29uc3RhbnQqIGNvbnN0YW50TWF4TG9uZ0RvdWJsZTsKLSAgbGx2bTo6Q29uc3RhbnQqIGNvbnN0YW50RG91YmxlSW5maW5pdHk7Ci0gIGxsdm06OkNvbnN0YW50KiBjb25zdGFudERvdWJsZU1pbnVzSW5maW5pdHk7Ci0gIGxsdm06OkNvbnN0YW50KiBjb25zdGFudEZsb2F0SW5maW5pdHk7Ci0gIGxsdm06OkNvbnN0YW50KiBjb25zdGFudEZsb2F0TWludXNJbmZpbml0eTsKLSAgbGx2bTo6Q29uc3RhbnQqIGNvbnN0YW50RmxvYXRNaW51c1plcm87Ci0gIGxsdm06OkNvbnN0YW50KiBjb25zdGFudERvdWJsZU1pbnVzWmVybzsKLSAgbGx2bTo6Q29uc3RhbnQqIGNvbnN0YW50UHRyTnVsbDsKLSAgbGx2bTo6Q29uc3RhbnQqIGNvbnN0YW50UHRyTG9nU2l6ZTsKLSAgbGx2bTo6Q29uc3RhbnQqIGNvbnN0YW50VGhyZWFkSURNYXNrOwotICBsbHZtOjpDb25zdGFudCogY29uc3RhbnRTdGFja092ZXJmbG93TWFzazsKLSAgbGx2bTo6Q29uc3RhbnQqIGNvbnN0YW50RmF0TWFzazsKLSAgbGx2bTo6Q29uc3RhbnQqIGNvbnN0YW50UHRyT25lOwotICBsbHZtOjpDb25zdGFudCogY29uc3RhbnRQdHJaZXJvOwotICAKLSAgY29uc3QgbGx2bTo6UG9pbnRlclR5cGUqIHB0clR5cGU7Ci0gIGNvbnN0IGxsdm06OlBvaW50ZXJUeXBlKiBwdHIzMlR5cGU7Ci0gIGNvbnN0IGxsdm06OlBvaW50ZXJUeXBlKiBwdHJQdHJUeXBlOwotICBjb25zdCBsbHZtOjpUeXBlKiBhcnJheVB0clR5cGU7Ci0gIGNvbnN0IGxsdm06OlR5cGUqIHBvaW50ZXJTaXplVHlwZTsKLQotICBjb25zdCBsbHZtOjpUeXBlKiBNdXRhdG9yVGhyZWFkVHlwZTsKLSAgY29uc3QgbGx2bTo6VHlwZSogVlRUeXBlOwotCi0gIGxsdm06OkNvbnN0YW50KiBPZmZzZXREb1lpZWxkSW5UaHJlYWRDb25zdGFudDsKLSAgbGx2bTo6Q29uc3RhbnQqIE9mZnNldENYWEV4Y2VwdGlvbkluVGhyZWFkQ29uc3RhbnQ7Ci0gIGxsdm06OkNvbnN0YW50KiBPZmZzZXRWTURhdGFJblRocmVhZENvbnN0YW50OwotCWxsdm06OkNvbnN0YW50KiBPZmZzZXRQZW5kaW5nRXhjZXB0aW9uSW5UaHJlYWRDb25zdGFudDsKLQotCWxsdm06OkNvbnN0YW50KiBPZmZzZXRUaHJlYWRJbk11dGF0b3JUaHJlYWRDb25zdGFudDsKLX07Ci0KLQotY2xhc3MgTXZtTW9kdWxlIHsKLXB1YmxpYzoKLSAgIHN0YXRpYyBsbHZtOjpHQ1N0cmF0ZWd5KiBUaGVHQ1N0cmF0ZWd5OwotICAgc3RhdGljIG12bTo6TG9ja1JlY3Vyc2l2ZSBwcm90ZWN0RW5naW5lOwotICAgc3RhdGljIGxsdm06Ok1vZHVsZSAqZ2xvYmFsTW9kdWxlOwotICAgc3RhdGljIGNvbnN0IGxsdm06OlRhcmdldERhdGEqIFRoZVRhcmdldERhdGE7Ci0gICBzdGF0aWMgbXZtOjpCdW1wUHRyQWxsb2NhdG9yKiBBbGxvY2F0b3I7Ci0gICBzdGF0aWMgbGx2bTo6RXhlY3V0aW9uRW5naW5lKiBleGVjdXRpb25FbmdpbmU7Ci0gICAvL3N0YXRpYyB1bnNpZ25lZCBNZXRhZGF0YVR5cGVLaW5kOwotCi0gICBzdGF0aWMgdWludDY0IGdldFR5cGVTaXplKGNvbnN0IGxsdm06OlR5cGUqIHR5cGUpOwotICAgc3RhdGljIHZvaWQgcnVuUGFzc2VzKGxsdm06OkZ1bmN0aW9uKiBmdW5jLCBsbHZtOjpGdW5jdGlvblBhc3NNYW5hZ2VyKik7Ci0gICBzdGF0aWMgdm9pZCBpbml0aWFsaXNlKGxsdm06OkNvZGVHZW5PcHQ6OkxldmVsID0gbGx2bTo6Q29kZUdlbk9wdDo6RGVmYXVsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpNb2R1bGUqIFRoZU1vZHVsZSA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VGFyZ2V0TWFjaGluZSogVGhlVGFyZ2V0ID0gMCk7Ci0gICBzdGF0aWMgdm9pZCBsb2FkQnl0ZWNvZGVGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gICBzdGF0aWMgaW50IGRpc2Fzc2VtYmxlKHVuc2lnbmVkIGludCogYWRkcik7Ci0gIAotICAgc3RhdGljIHZvaWQgcHJvdGVjdElSKCk7Ci0gICBzdGF0aWMgdm9pZCB1bnByb3RlY3RJUigpOwotCi0gICBzdGF0aWMgdm9pZCBhZGRDb21tYW5kTGluZVBhc3NlcyhsbHZtOjpGdW5jdGlvblBhc3NNYW5hZ2VyKiBQTSk7Ci0KLSAgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXRIb3N0VHJpcGxlKCk7Ci19OwotCi1jbGFzcyBKSVRNZXRob2RJbmZvIDogcHVibGljIE1ldGhvZEluZm8gewotICBsbHZtOjpHQ0Z1bmN0aW9uSW5mbyogR0NJbmZvOwotcHVibGljOgotICB2aXJ0dWFsIHZvaWQgc2Nhbih1aW50cHRyX3QgY2xvc3VyZSwgdm9pZCogaXAsIHZvaWQqIGFkZHIpOwotICBKSVRNZXRob2RJbmZvKGxsdm06OkdDRnVuY3Rpb25JbmZvKiBHRkkpIDogR0NJbmZvKEdGSSkge30KLSAgdm9pZCBhZGRUb1ZNS2l0KFZNS2l0KiB2bWtpdCwgbGx2bTo6SklUKiBqaXQpOwotfTsKLQotY2xhc3MgTXZtSklUTWV0aG9kSW5mbyA6IHB1YmxpYyBKSVRNZXRob2RJbmZvIHsKLXB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIHByaW50KHZvaWQqIGlwLCB2b2lkKiBhZGRyKTsKLSAgTXZtSklUTWV0aG9kSW5mbyhsbHZtOjpHQ0Z1bmN0aW9uSW5mbyogR0ZJLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OkZ1bmN0aW9uKiBGLAotICAgICAgICAgICAgICAgICAgIHZvaWQqIG93bmVyKSA6Ci0gICAgSklUTWV0aG9kSW5mbyhHRkkpIHsKLSAgICAgIE1ldGFJbmZvID0gY29uc3RfY2FzdDxsbHZtOjpGdW5jdGlvbio+KEYpOwotICAgICAgT3duZXIgPSBvd25lcjsKLSAgfQotfTsKLQotfSAvLyBlbmQgbmFtZXNwYWNlIG12bQotCi0jZW5kaWYgLy8gTVZNX0pJVF9ICmRpZmYgLS1naXQgYS92bWtpdC9pbmNsdWRlL212bS9NZXRob2RJbmZvLmggYi92bWtpdC9pbmNsdWRlL212bS9NZXRob2RJbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNjY1MDUuLjAwMDAwMDAKLS0tIGEvdm1raXQvaW5jbHVkZS9tdm0vTWV0aG9kSW5mby5oCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tIE1ldGhvZEluZm8uaCAtIE1ldGEgaW5mb3JtYXRpb24gZm9yIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2lmbmRlZiBNVk1fTUVUSE9ESU5GT19ICi0jZGVmaW5lIE1WTV9NRVRIT0RJTkZPX0gKLQotI2luY2x1ZGUgIm12bS9BbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJtdm0vR0MuaCIKLQotbmFtZXNwYWNlIG12bSB7Ci0KLWNsYXNzIE1ldGhvZEluZm8gOiBwdWJsaWMgUGVybWFuZW50T2JqZWN0IHsKLXB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIHByaW50KHZvaWQqIGlwLCB2b2lkKiBhZGRyKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBzY2FuKHVpbnRwdHJfdCBjbG9zdXJlLCB2b2lkKiBpcCwgdm9pZCogYWRkcikgPSAwOwotICB2aXJ0dWFsIGJvb2wgaXNIaWdoTGV2ZWxNZXRob2QoKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc3RhdGljIHZvaWQqIGlzU3R1Yih2b2lkKiBpcCwgdm9pZCogYWRkcikgewotICAgIGJvb2wgaXNTdHViID0gKCh1bnNpZ25lZCBjaGFyKilpcClbMF0gPT0gMHhDRTsKLSAgICBpZiAoaXNTdHViKSBpcCA9ICgodm9pZCoqKWFkZHIpWzJdOwotICAgIHJldHVybiBpcDsKLSAgfQotCi0gIHZvaWQqIE1ldGFJbmZvOwotICB2b2lkKiBPd25lcjsKLX07Ci0KLWNsYXNzIENhbWxGcmFtZSB7Ci1wdWJsaWM6Ci0gIHZvaWQqIFJldHVybkFkZHJlc3M7Ci0gIHVpbnQxNl90IEZyYW1lU2l6ZTsKLSAgdWludDE2X3QgTnVtTGl2ZU9mZnNldHM7Ci0gIGludDE2X3QgTGl2ZU9mZnNldHNbMV07Ci19OwotCi1jbGFzcyBDYW1sTWV0aG9kSW5mbyA6IHB1YmxpYyBNZXRob2RJbmZvIHsKLXB1YmxpYzoKLSAgQ2FtbEZyYW1lKiBDRjsKLSAgdmlydHVhbCB2b2lkIHNjYW4odWludHB0cl90IGNsb3N1cmUsIHZvaWQqIGlwLCB2b2lkKiBhZGRyKTsKLSAgQ2FtbE1ldGhvZEluZm8oQ2FtbEZyYW1lKiBDKSA6IENGKEMpIHsKLSAgICBPd25lciA9IE5VTEw7Ci0gICAgTWV0YUluZm8gPSBOVUxMOwotICB9Ci19OwotCi1jbGFzcyBTdGF0aWNDYW1sTWV0aG9kSW5mbyA6IHB1YmxpYyBDYW1sTWV0aG9kSW5mbyB7Ci0gIGNvbnN0IGNoYXIqIG5hbWU7Ci1wdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBwcmludCh2b2lkKiBpcCwgdm9pZCogYWRkcik7Ci0gIFN0YXRpY0NhbWxNZXRob2RJbmZvKENhbWxGcmFtZSogQ0YsIGNvbnN0IGNoYXIqIG4pIDoKLSAgICBDYW1sTWV0aG9kSW5mbyhDRikgewotICAgIE93bmVyID0gTlVMTDsKLSAgICBNZXRhSW5mbyA9IE5VTEw7Ci0gICAgbmFtZSA9IG47Ci0gIH0KLX07Ci0KLWNsYXNzIERlZmF1bHRNZXRob2RJbmZvIDogcHVibGljIE1ldGhvZEluZm8gewotcHVibGljOgotICB2aXJ0dWFsIHZvaWQgcHJpbnQodm9pZCogaXAsIHZvaWQqIGFkZHIpOwotICB2aXJ0dWFsIHZvaWQgc2Nhbih1aW50cHRyX3QgY2xvc3VyZSwgdm9pZCogaXAsIHZvaWQqIGFkZHIpOwotICBzdGF0aWMgRGVmYXVsdE1ldGhvZEluZm8gRE07Ci0gICAgCi0gIERlZmF1bHRNZXRob2RJbmZvKCkgewotICAgIE93bmVyID0gTlVMTDsKLSAgICBNZXRhSW5mbyA9IE5VTEw7Ci0gIH0KLX07Ci0KLQotfSAvLyBlbmQgbmFtZXNwYWNlIG12bQotI2VuZGlmIC8vIE1WTV9NRVRIT0RJTkZPX0gKZGlmZiAtLWdpdCBhL3Zta2l0L2luY2x1ZGUvbXZtL1ByaW50QnVmZmVyLmggYi92bWtpdC9pbmNsdWRlL212bS9QcmludEJ1ZmZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzU5MzMzLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2luY2x1ZGUvbXZtL1ByaW50QnVmZmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLS0gUHJpbnRCdWZmZXIuaCAtIFByaW50aW5nIG9iamVjdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTWljcm8gVmlydHVhbCBNYWNoaW5lCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgTVZNX1BSSU5UQlVGRkVSX0gKLSNkZWZpbmUgTVZNX1BSSU5UQlVGRkVSX0gKLQotI2luY2x1ZGUgPGNzdGRpbz4gLy8gc3ByaW50ZgotI2luY2x1ZGUgPGNzdHJpbmc+IC8vIG1lbWNweQotCi0jaW5jbHVkZSAidHlwZXMuaCIKLSNpbmNsdWRlICJtdm0vVVRGOC5oIgotCi1uYW1lc3BhY2UgbXZtIHsKLQotLy8gI2RlZmluZSBWVF9ERVNUUlVDVE9SX09GRlNFVCAwCi0vLyAjZGVmaW5lIFZUX09QRVJBVE9SX0RFTEVURV9PRkZTRVQgMQotLy8gI2RlZmluZSBWVF9UUkFDRVJfT0ZGU0VUIDIKLS8vICNkZWZpbmUgVlRfUFJJTlRfT0ZGU0VUIDMKLS8vICNkZWZpbmUgVlRfSEFTSENPREVfT0ZGU0VUIDQKLS8vICNkZWZpbmUgVlRfTkJfRlVOQ1MgNQotLy8gI2RlZmluZSBWVF9TSVpFIDUgKiBzaXplb2Yodm9pZCopCi0KLWNsYXNzIFByaW50QnVmZmVyOwotCi0vLy8gT2xkT2JqZWN0IC0gUm9vdCBvZiBhbGwgb2JqZWN0cy4gRGVmaW5lIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIHZpcnR1YWwKLS8vLyBtZXRob2RzIGFuZCBzb21lIGNvbW1vZGl0eSBmdW5jdGlvbnMuCi0vLy8gKioqKioqKioqKioqICAgICAgICAgICBUZWNobmljYWxseSB0aGlzIGNsYXNzIGlzIG5vdCB1c2VkIGFueXdoZXJlLCB0byBiZSByZW1vdmVkPyAgICAgICAgICAgKioqKioqKioqKioqCi0vLy8KLWNsYXNzIE9sZE9iamVjdCA6IHB1YmxpYyBnYyB7Ci1wdWJsaWM6Ci0Jc3RhdGljIHZvaWQgICAgIGRlZmF1bHRfdHJhY2VyKGdjICpvLCB1aW50cHRyX3QgY2xvc3VyZSkge30KLQlzdGF0aWMgaW50cHRyX3QgZGVmYXVsdF9oYXNoQ29kZShjb25zdCBnYyAqbykgICAgICAgICAgICB7IHJldHVybiAoaW50cHRyX3QpbzsgfQotCXN0YXRpYyB2b2lkICAgICBkZWZhdWx0X3ByaW50KGNvbnN0IGdjICpvLCBQcmludEJ1ZmZlciAqYnVmKTsKLQotICAvLy8gdHJhY2VyIC0gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0cmFjZXIuIERvZXMgbm90aGluZy4KLSAgLy8vCi0gIHZpcnR1YWwgdm9pZCB0cmFjZXIodWludHB0cl90IGNsb3N1cmUpIHsgZGVmYXVsdF90cmFjZXIodGhpcywgY2xvc3VyZSk7IH0KLQotICAvLy8gcHJpbnQgLSBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHByaW50LgotICAvLy8KLSAgdmlydHVhbCB2b2lkICAgICAgcHJpbnQoUHJpbnRCdWZmZXIgKmJ1ZikgY29uc3QgeyBkZWZhdWx0X3ByaW50KHRoaXMsIGJ1Zik7IH0KLQotICAvLy8gaGFzaENvZGUgLSBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGhhc2hDb2RlLiBSZXR1cm5zIHRoZSBhZGRyZXNzCi0gIC8vLyBvZiB0aGlzIG9iamVjdC4KLSAgLy8vCi0gIHZpcnR1YWwgaW50cHRyX3QgIGhhc2hDb2RlKCkgY29uc3QgeyByZXR1cm4gZGVmYXVsdF9oYXNoQ29kZSh0aGlzKTt9Ci0gIAotfTsKLQotLy8vIFByaW50QnVmZmVyIC0gVGhpcyBjbGFzcyBpcyBhIGJ1ZmZlcmVkIHN0cmluZy4KLS8vLwotY2xhc3MgUHJpbnRCdWZmZXIgewotcHVibGljOgotIAotICAvLy8gY29udGVudHMgLSBUaGUgYnVmZmVyLgotICAvLy8KLSAgY2hhciogY29udGVudHM7Ci0KLSAgLy8vIGNhcGFjaXR5IC0gVGhlIGNhcGFjaXR5IG9mIHRoZSBjdXJyZW50IGJ1ZmZlci4KLSAgLy8vCi0gIHVpbnQzMiAgY2FwYWNpdHk7Ci0KLSAgLy8vIHdyaXRlUG9zaXRpb24gLSBUaGUgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciB3aGVyZSB0aGUgbmV4dCB3cml0ZSB3aWxsCi0gIC8vLyBoYXBwZW4uCi0gIC8vLwotICB1aW50MzIgIHdyaXRlUG9zaXRpb247Ci0KLQl2b2lkIGluaXQoKSB7Ci0JCWNhcGFjaXR5ID0gMjU2OwotCQljb250ZW50cyA9IG5ldyBjaGFyW2NhcGFjaXR5XTsKLQkJd3JpdGVQb3NpdGlvbiA9IDA7Ci0JfQotCi1wdWJsaWM6Ci0JUHJpbnRCdWZmZXIoKSB7Ci0JCWluaXQoKTsKLQl9Ci0KLQlQcmludEJ1ZmZlcihjb25zdCBPbGRPYmplY3QgKm9iaikgewotCQlsbHZtX2djcm9vdChvYmosIDApOwotCQlpbml0KCk7Ci0JCXdyaXRlT2JqKG9iaik7Ci0JfQotCi0JUHJpbnRCdWZmZXIoY29uc3QgVVRGOCAqdXRmOCkgewotCQlpbml0KCk7Ci0JCXdyaXRlVVRGOCh1dGY4KTsKLQl9Ci0KLQl2aXJ0dWFsIH5QcmludEJ1ZmZlcigpIHsKLQkJZGVsZXRlW10gY29udGVudHM7Ci0JfQotCQotCWNoYXIgKmNTdHJpbmcoKSB7Ci0JCXJldHVybiBjb250ZW50czsKLQl9Ci0KLQl2b2lkIGVuc3VyZUNhcGFjaXR5KHVpbnQzMiBsZW4pIHsKLQkJdWludDMyIHNpemUgPSB3cml0ZVBvc2l0aW9uICsgbGVuICsgMTsKLSAgICBpZiAoc2l6ZSA+PSBjYXBhY2l0eSkgewotICAgICAgd2hpbGUgKHNpemUgPj0gY2FwYWNpdHkpCi0gICAgICAgIGNhcGFjaXR5Kj0gNDsKLQkJCWNoYXIgKm5ld0NvbnRlbnRzID0gbmV3IGNoYXJbY2FwYWNpdHldOwotCQkJbWVtY3B5KG5ld0NvbnRlbnRzLCBjb250ZW50cywgd3JpdGVQb3NpdGlvbik7Ci0JCQlkZWxldGVbXSBjb250ZW50czsKLQkJCWNvbnRlbnRzID0gbmV3Q29udGVudHM7Ci0gICAgfQotCX0KLQotICAvLy8gd3JpdGUgLSBXcml0ZXMgdG8gdGhpcyBQcmludEJ1ZmZlci4KLSAgLy8vCi0gIHZpcnR1YWwgUHJpbnRCdWZmZXIgKndyaXRlKGNvbnN0IGNoYXIgKnN0cmluZykgewotICAgIHVpbnQzMiBsZW49IHN0cmxlbihzdHJpbmcpOwotCQllbnN1cmVDYXBhY2l0eShsZW4pOwotICAgIHN0cmNweShjU3RyaW5nKCkgKyB3cml0ZVBvc2l0aW9uLCBzdHJpbmcpOwotICAgIHdyaXRlUG9zaXRpb24rPSBsZW47Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICAvLy8gd3JpdGVDaGFyIC0gV3JpdGVzIGEgY2hhci4KLSAgaW5saW5lIFByaW50QnVmZmVyICp3cml0ZVVURjgoY29uc3QgVVRGOCAqdXRmOCkgewotCQl1aW50MzIgbGVuID0gdXRmOC0+c2l6ZTsKLQkJZW5zdXJlQ2FwYWNpdHkobGVuKTsKLQkJZm9yKHVpbnQzMiBpPTA7IGk8bGVuOyBpKyspIHsKLQkJCS8vCQkJcHJpbnRmKCIlZC8lZDogJyVjICglZCknXG4iLCBpLCBsZW4sIHV0ZjgtPmVsZW1lbnRzW2ldLCB1dGY4LT5lbGVtZW50c1tpXSk7Ci0JCQljb250ZW50c1t3cml0ZVBvc2l0aW9uICsgaV0gPSB1dGY4LT5lbGVtZW50c1tpXTsKLQkJfQotCQljb250ZW50c1t3cml0ZVBvc2l0aW9uICs9IGxlbl0gPSAwOwotCQlyZXR1cm4gdGhpczsKLSAgfQotCi0gIC8vLyB3cml0ZUNoYXIgLSBXcml0ZXMgYSBjaGFyLgotICBpbmxpbmUgUHJpbnRCdWZmZXIgKndyaXRlQm9vbChib29sIHYpIHsKLQkJcmV0dXJuIHdyaXRlKHYgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgfQotCi0gIC8vLyB3cml0ZUNoYXIgLSBXcml0ZXMgYSBjaGFyLgotICBpbmxpbmUgUHJpbnRCdWZmZXIgKndyaXRlQ2hhcihjaGFyIHYpIHsKLSAgICBjaGFyIGJ1ZlszMl07Ci0gICAgc3ByaW50ZihidWYsICIlYyIsIHYpOwotICAgIHJldHVybiB3cml0ZShidWYpOwotICB9Ci0KLSAgLy8vIHdyaXRlQ2hhciAtIFdyaXRlcyBhIGludDMyLgotICBpbmxpbmUgUHJpbnRCdWZmZXIgKndyaXRlUzQoaW50IHYpIHsKLSAgICBjaGFyIGJ1ZlszMl07Ci0gICAgc3ByaW50ZihidWYsICIlZCIsIHYpOwotICAgIHJldHVybiB3cml0ZShidWYpOwotICB9Ci0gIAotICAvLy8gd3JpdGVzOCAtIFdyaXRlcyBhIGludDY0LgotICBpbmxpbmUgUHJpbnRCdWZmZXIgKndyaXRlUzgoc2ludDY0IHYpIHsKLSAgICBjaGFyIGJ1ZlszMl07Ci0gICAgc3ByaW50ZihidWYsICIlbGxkIiwgKGxvbmcgbG9uZyBpbnQpdik7Ci0gICAgcmV0dXJuIHdyaXRlKGJ1Zik7Ci0gIH0KLSAgCi0gIC8vLyB3cml0ZUZQIC0gV3JpdGVzIGEgZG91YmxlLgotICBpbmxpbmUgUHJpbnRCdWZmZXIgKndyaXRlRlAoZG91YmxlIHYpIHsKLSAgICBjaGFyIGJ1ZlszMl07Ci0gICAgc3ByaW50ZihidWYsICIlZiIsIHYpOwotICAgIHJldHVybiB3cml0ZShidWYpOwotICB9Ci0KLSAgLy8vIHdyaXRlUHRyIC0gV3JpdGVzIGEgcG9pbnRlci4KLSAgaW5saW5lIFByaW50QnVmZmVyICp3cml0ZVB0cih2b2lkICpwKSB7Ci0gICAgY2hhciBidWZbMzJdOwotICAgIHNwcmludGYoYnVmLCAiJXAiLCBwKTsKLSAgICByZXR1cm4gd3JpdGUoYnVmKTsKLSAgfQotCi0gIC8vLyB3cml0ZUJ5dGVzIC0gV3JpdGVzIGxlbiBieXRlcyBpbiB0aGUgYnVmZmVyIGJ5dGVzLgotICBpbmxpbmUgUHJpbnRCdWZmZXIgKndyaXRlQnl0ZXModW5zaWduZWQgY2hhciAqYnl0ZXMsIHNpemVfdCBsZW4pIHsKLSAgICB3cml0ZSgiWyIpOwotICAgIGZvciAoc2l6ZV90IGlkeD0gMDsgaWR4IDwgbGVuOyArK2lkeCkgewotICAgICAgaWYgKGlkeCA+IDApCi0gICAgICAgIHdyaXRlKCIgIik7Ci0gICAgICBjaGFyIGJ1ZlszMl07Ci0gICAgICBzcHJpbnRmKGJ1ZiwgIiVkIiwgYnl0ZXNbaWR4XSk7Ci0gICAgICB3cml0ZShidWYpOwotICAgIH0KLSAgICB3cml0ZSgiXSIpOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgLy8vIHdyaXRlT2JqIC0gV3JpdGVzIGEgZ2MgT2JqZWN0IHRvIHRoZSBidWZmZXIuCi0gIC8vLwotICBpbmxpbmUgUHJpbnRCdWZmZXIgKndyaXRlT2JqKGNvbnN0IE9sZE9iamVjdCAqb2JqKSB7Ci0JCWxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0JCW9iai0+cHJpbnQodGhpcyk7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCi0gIC8vLyByZXBsYWNlV2l0aCAtIHJlcGxhY2UgdGhlIGNvbnRlbnQgb2YgdGhlIGJ1ZmZlciBhbmQgZnJlZSB0aGUgb2xkIGJ1ZmZlcgotICAvLy8KLQl2b2lkIHJlcGxhY2VXaXRoKGNoYXIgKmJ1ZmZlcikgewotCQlkZWxldGVbXSB0aGlzLT5jb250ZW50czsKLQkJdGhpcy0+Y29udGVudHMgPSBidWZmZXI7Ci0JfQotfTsKLQotfSAvLyBlbmQgbmFtZXNwYWNlIG12bQotCi0jZW5kaWYgLy8gTVZNX1BSSU5UQlVGRkVSX0gKZGlmZiAtLWdpdCBhL3Zta2l0L2luY2x1ZGUvbXZtL1N5c3RlbVRocmVhZHMuaCBiL3Zta2l0L2luY2x1ZGUvbXZtL1N5c3RlbVRocmVhZHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY2ZTE0OC4uMDAwMDAwMAotLS0gYS92bWtpdC9pbmNsdWRlL212bS9TeXN0ZW1UaHJlYWRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotI2lmbmRlZiBfU1lTVEVNX1RIUkVBRFNfSF8KLSNkZWZpbmUgX1NZU1RFTV9USFJFQURTX0hfCi0KLSNpbmNsdWRlICJNdXRhdG9yVGhyZWFkLmgiCi0jaW5jbHVkZSAibXZtL1RocmVhZHMvQ29uZC5oIgotCi0vLyBTYW1lIHZhbHVlcyB0aGFuIEppa2VzUlZNCi0jZGVmaW5lIElOSVRJQUxfUVVFVUVfU0laRSAyNTYKLSNkZWZpbmUgR1JPV19GQUNUT1IgMgotCi1uYW1lc3BhY2UgbXZtIHsKLWNsYXNzIFZpcnR1YWxNYWNoaW5lOwotCi1jbGFzcyBSZWZlcmVuY2VUaHJlYWQ7Ci1jbGFzcyBKbmp2bTsKLQotY2xhc3MgUmVmZXJlbmNlUXVldWUgewotcHJpdmF0ZToKLQltdm06OmdjKiogUmVmZXJlbmNlczsKLSAgdWludDMyIFF1ZXVlTGVuZ3RoOwotICB1aW50MzIgQ3VycmVudEluZGV4OwotICBtdm06OlNwaW5Mb2NrIFF1ZXVlTG9jazsKLSAgdWludDhfdCBzZW1hbnRpY3M7Ci0KLQltdm06OmdjKiBwcm9jZXNzUmVmZXJlbmNlKG12bTo6Z2MqLCBSZWZlcmVuY2VUaHJlYWQqLCB1aW50cHRyX3QgY2xvc3VyZSk7Ci1wdWJsaWM6Ci0KLSAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgV0VBSyA9IDE7Ci0gIHN0YXRpYyBjb25zdCB1aW50OF90IFNPRlQgPSAyOwotICBzdGF0aWMgY29uc3QgdWludDhfdCBQSEFOVE9NID0gMzsKLQotCi0gIFJlZmVyZW5jZVF1ZXVlKHVpbnQ4X3QgcykgewotICAgIFJlZmVyZW5jZXMgPSBuZXcgbXZtOjpnYypbSU5JVElBTF9RVUVVRV9TSVpFXTsKLSAgICBtZW1zZXQoUmVmZXJlbmNlcywgMCwgSU5JVElBTF9RVUVVRV9TSVpFICogc2l6ZW9mKG12bTo6Z2MqKSk7Ci0gICAgUXVldWVMZW5ndGggPSBJTklUSUFMX1FVRVVFX1NJWkU7Ci0gICAgQ3VycmVudEluZGV4ID0gMDsKLSAgICBzZW1hbnRpY3MgPSBzOwotICB9Ci0KLSAgflJlZmVyZW5jZVF1ZXVlKCkgewotICAgIGRlbGV0ZVtdIFJlZmVyZW5jZXM7Ci0gIH0KLSAKLSAgdm9pZCBhZGRSZWZlcmVuY2UobXZtOjpnYyogcmVmKTsKLSAgCi0gIHZvaWQgYWNxdWlyZSgpIHsKLSAgICBRdWV1ZUxvY2suYWNxdWlyZSgpOwotICB9Ci0KLSAgdm9pZCByZWxlYXNlKCkgewotICAgIFF1ZXVlTG9jay5yZWxlYXNlKCk7Ci0gIH0KLQotICB2b2lkIHNjYW4oUmVmZXJlbmNlVGhyZWFkKiB0aHJlYWQsIHVpbnRwdHJfdCBjbG9zdXJlKTsKLX07Ci0KLWNsYXNzIFJlZmVyZW5jZVRocmVhZCA6IHB1YmxpYyBtdm06Ok11dGF0b3JUaHJlYWQgewotcHVibGljOgotICAvLy8gV2Vha1JlZmVyZW5jZXNRdWV1ZSAtIFRoZSBxdWV1ZSBvZiB3ZWFrIHJlZmVyZW5jZXMuCi0gIC8vLwotICBSZWZlcmVuY2VRdWV1ZSBXZWFrUmVmZXJlbmNlc1F1ZXVlOwotCi0gIC8vLyBTb2Z0UmVmZXJlbmNlc1F1ZXVlIC0gVGhlIHF1ZXVlIG9mIHNvZnQgcmVmZXJlbmNlcy4KLSAgLy8vCi0gIFJlZmVyZW5jZVF1ZXVlIFNvZnRSZWZlcmVuY2VzUXVldWU7Ci0KLSAgLy8vIFBoYW50b21SZWZlcmVuY2VzUXVldWUgLSBUaGUgcXVldWUgb2YgcGhhbnRvbSByZWZlcmVuY2VzLgotICAvLy8KLSAgUmVmZXJlbmNlUXVldWUgUGhhbnRvbVJlZmVyZW5jZXNRdWV1ZTsKLQotCW12bTo6Z2MqKiBUb0VucXVldWU7Ci0gIHVpbnQzMiBUb0VucXVldWVMZW5ndGg7Ci0gIHVpbnQzMiBUb0VucXVldWVJbmRleDsKLSAgCi0gIC8vLyBUb0VucXVldWVMb2NrIC0gQSBsb2NrIHRvIHByb3RlY3QgYWNjZXNzIHRvIHRoZSBxdWV1ZS4KLSAgLy8vCi0gIG12bTo6TG9ja05vcm1hbCBFbnF1ZXVlTG9jazsKLSAgbXZtOjpDb25kIEVucXVldWVDb25kOwotICBtdm06OlNwaW5Mb2NrIFRvRW5xdWV1ZUxvY2s7Ci0KLSAgdm9pZCBhZGRUb0VucXVldWUobXZtOjpnYyogb2JqKTsKLQotICBzdGF0aWMgdm9pZCBlbnF1ZXVlU3RhcnQoUmVmZXJlbmNlVGhyZWFkKik7Ci0KLSAgLy8vIGFkZFdlYWtSZWZlcmVuY2UgLSBBZGQgYSB3ZWFrIHJlZmVyZW5jZSB0byB0aGUgcXVldWUuCi0gIC8vLwotICB2b2lkIGFkZFdlYWtSZWZlcmVuY2UobXZtOjpnYyogcmVmKTsKLSAgCi0gIC8vLyBhZGRTb2Z0UmVmZXJlbmNlIC0gQWRkIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIHF1ZXVlLgotICAvLy8KLSAgdm9pZCBhZGRTb2Z0UmVmZXJlbmNlKG12bTo6Z2MqIHJlZik7Ci0gIAotICAvLy8gYWRkUGhhbnRvbVJlZmVyZW5jZSAtIEFkZCBhIHdlYWsgcmVmZXJlbmNlIHRvIHRoZSBxdWV1ZS4KLSAgLy8vCi0gIHZvaWQgYWRkUGhhbnRvbVJlZmVyZW5jZShtdm06OmdjKiByZWYpOwotCi0gIFJlZmVyZW5jZVRocmVhZChtdm06OlZNS2l0KiB2bWtpdCk7Ci0KLQl2aXJ0dWFsIH5SZWZlcmVuY2VUaHJlYWQoKSB7Ci0gICAgZGVsZXRlW10gVG9FbnF1ZXVlOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIHRyYWNlcih1aW50cHRyX3QgY2xvc3VyZSk7Ci19OwotCi1jbGFzcyBGaW5hbGl6ZXJUaHJlYWQgOiBwdWJsaWMgbXZtOjpNdXRhdG9yVGhyZWFkIHsKLXB1YmxpYzoKLSAgICAvLy8gRmluYWxpemF0aW9uUXVldWVMb2NrIC0gQSBsb2NrIHRvIHByb3RlY3QgYWNjZXNzIHRvIHRoZSBxdWV1ZS4KLSAgLy8vCi0gIG12bTo6U3BpbkxvY2sgRmluYWxpemF0aW9uUXVldWVMb2NrOwotCi0gIC8vLyBmaW5hbGl6YXRpb25RdWV1ZSAtIEEgbGlzdCBvZiBhbGxvY2F0ZWQgb2JqZXRzIHRoYXQgY29udGFpbiBhIGZpbmFsaXplCi0gIC8vLyBtZXRob2QuCi0gIC8vLwotCW12bTo6Z2MqKiBGaW5hbGl6YXRpb25RdWV1ZTsKLQotICAvLy8gQ3VycmVudEluZGV4IC0gQ3VycmVudCBpbmRleCBpbiB0aGUgcXVldWUgb2YgZmluYWxpemFibGUgb2JqZWN0cy4KLSAgLy8vCi0gIHVpbnQzMiBDdXJyZW50SW5kZXg7Ci0KLSAgLy8vIFF1ZXVlTGVuZ3RoIC0gQ3VycmVudCBsZW5ndGggb2YgdGhlIHF1ZXVlIG9mIGZpbmFsaXphYmxlIG9iamVjdHMuCi0gIC8vLwotICB1aW50MzIgUXVldWVMZW5ndGg7Ci0KLSAgLy8vIGdyb3dGaW5hbGl6YXRpb25RdWV1ZSAtIEdyb3cgdGhlIHF1ZXVlIG9mIGZpbmFsaXphYmxlIG9iamVjdHMuCi0gIC8vLwotICB2b2lkIGdyb3dGaW5hbGl6YXRpb25RdWV1ZSgpOwotICAKLSAgLy8vIFRvQmVGaW5hbGl6ZWQgLSBMaXN0IG9mIG9iamVjdHMgdGhhdCBhcmUgc2NoZWR1bGVkIHRvIGJlIGZpbmFsaXplZC4KLSAgLy8vCi0JbXZtOjpnYyoqIFRvQmVGaW5hbGl6ZWQ7Ci0gIAotICAvLy8gVG9CZUZpbmFsaXplZExlbmd0aCAtIEN1cnJlbnQgbGVuZ3RoIG9mIHRoZSBxdWV1ZSBvZiBvYmplY3RzIHNjaGVkdWxlZAotICAvLy8gZm9yIGZpbmFsaXphdGlvbi4KLSAgLy8vCi0gIHVpbnQzMiBUb0JlRmluYWxpemVkTGVuZ3RoOwotCi0gIC8vLyBDdXJyZW50RmluYWxpemVkSW5kZXggLSBUaGUgY3VycmVudCBpbmRleCBpbiB0aGUgVG9CZUZpbmFsaXplZCBxdWV1ZQotICAvLy8gdGhhdCB3aWxsIGJlIHNjZWR1bGVkIGZvciBmaW5hbGl6YXRpb24uCi0gIC8vLwotICB1aW50MzIgQ3VycmVudEZpbmFsaXplZEluZGV4OwotICAKLSAgLy8vIGdyb3dUb0JlRmluYWxpemVkUXVldWUgLSBHcm93IHRoZSBxdWV1ZSBvZiB0aGUgdG8tYmUgZmluYWxpemVkIG9iamVjdHMuCi0gIC8vLwotICB2b2lkIGdyb3dUb0JlRmluYWxpemVkUXVldWUoKTsKLSAgCi0gIC8vLyBmaW5hbGl6YXRpb25Db25kIC0gQ29uZGl0aW9uIHZhcmlhYmxlIHRvIHdha2UgdXAgZmluYWxpemF0aW9uIHRocmVhZHMuCi0gIC8vLwotICBtdm06OkNvbmQgRmluYWxpemF0aW9uQ29uZDsKLQotICAvLy8gZmluYWxpemF0aW9uTG9jayAtIExvY2sgZm9yIHRoZSBjb25kaXRpb24gdmFyaWFibGUuCi0gIC8vLwotICBtdm06OkxvY2tOb3JtYWwgRmluYWxpemF0aW9uTG9jazsKLQotICBzdGF0aWMgdm9pZCBmaW5hbGl6ZXJTdGFydChGaW5hbGl6ZXJUaHJlYWQqKTsKLQotICAvLy8gYWRkRmluYWxpemF0aW9uQ2FuZGlkYXRlIC0gQWRkIGFuIG9iamVjdCB0byB0aGUgcXVldWUgb2Ygb2JqZWN0cyB3aXRoCi0gIC8vLyBhIGZpbmFsaXphdGlvbiBtZXRob2QuCi0gIC8vLwotICB2b2lkIGFkZEZpbmFsaXphdGlvbkNhbmRpZGF0ZShtdm06OmdjKik7Ci0KLSAgLy8vIHNjYW5GaW5hbGl6YXRpb25RdWV1ZSAtIFNjYW4gb2JqZXRzIHdpdGggYSBmaW5hbGl6ZWQgbWV0aG9kIGFuZCBzY2hlZHVsZQotICAvLy8gdGhlbSBmb3IgZmluYWxpemF0aW9uIGlmIHRoZXkgYXJlIG5vdCBsaXZlLgotICAvLy8KLSAgdm9pZCBzY2FuRmluYWxpemF0aW9uUXVldWUodWludHB0cl90IGNsb3N1cmUpOwotCi0gIEZpbmFsaXplclRocmVhZChWTUtpdCogdm1raXQpOwotCi0JfkZpbmFsaXplclRocmVhZCgpIHsKLSAgICBkZWxldGVbXSBGaW5hbGl6YXRpb25RdWV1ZTsKLSAgICBkZWxldGVbXSBUb0JlRmluYWxpemVkOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIHRyYWNlcih1aW50cHRyX3QgY2xvc3VyZSk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBtdm0KLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2luY2x1ZGUvbXZtL1RocmVhZHMvQ29sbGVjdGlvblJWLmggYi92bWtpdC9pbmNsdWRlL212bS9UaHJlYWRzL0NvbGxlY3Rpb25SVi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGM3NzU4Li4wMDAwMDAwCi0tLSBhL3Zta2l0L2luY2x1ZGUvbXZtL1RocmVhZHMvQ29sbGVjdGlvblJWLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0gQ29sbGVjdGlvblJWLmggLSBSZW5kZXotdm91cyBmb3IgZ2FyYmFnZSBjb2xsZWN0aW9uIC0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgX01WTV9DT0xMRUNUSU9OUlZfSF8KLSNkZWZpbmUgX01WTV9DT0xMRUNUSU9OUlZfSF8KLQotI2luY2x1ZGUgIm12bS9UaHJlYWRzL0NvbmQuaCIKLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9Mb2Nrcy5oIgotI2luY2x1ZGUgIm12bS9UaHJlYWRzL1RocmVhZC5oIgotCi1uYW1lc3BhY2UgbXZtIHsKLQotY2xhc3MgQ29sbGVjdGlvblJWIHsKLXB1YmxpYzoKLSAgLy8vIF9sb2NrUlYgLSBMb2NrIGZvciBzeW5jaHJvbml6YXRpb24uCi0gIExvY2tOb3JtYWwgX2xvY2tSVjsgICAgICAgICAKLSAgCi0gIC8vLyBjb25kRW5kUlYgLSBDb25kaXRpb24gZm9yIHVubG9ja2luZyBvdGhlciB0YXNrcyAod3JpdGUgcHJvdGVjdCkuCi0gIENvbmQgY29uZEVuZFJWOwotCi0gIC8vLyBjb2xsZWN0aW9uQ29uZCAtIENvbmRpdGlvbiBmb3IgdW5ibG9ja2luZyB0aGUgaW5pdGF0b3IuCi0gIENvbmQgY29uZEluaXRpYXRvcjsKLQotICAvLy8gbmJKb2luZWQgLSBOdW1iZXIgb2YgdGhyZWFkcyB0aGF0IGpvaW5lZCB0aGUgcmVuZGV6dm91cy4KLSAgdW5zaWduZWQgbmJKb2luZWQ7Ci0gIAotcHVibGljOiAKLSAgQ29sbGVjdGlvblJWKCkgewotICAgIG5iSm9pbmVkID0gMDsKLSAgfQotCi0gIHZvaWQgbG9ja1JWKCkgeyBfbG9ja1JWLmxvY2soKTsgfQotICB2b2lkIHVubG9ja1JWKCkgeyBfbG9ja1JWLnVubG9jaygpOyB9Ci0KLSAgdm9pZCB3YWl0RW5kT2ZSVigpOwotICB2b2lkIHdhaXRSVigpOwotICAKLSAgdm9pZCBzdGFydFJWKCkgewotICAgIG12bTo6VGhyZWFkOjpnZXQoKS0+aW5SViA9IHRydWU7Ci0gICAgbG9ja1JWKCk7Ci0gIH0KLQotICB2b2lkIGNhbmNlbFJWKCkgewotICAgIHVubG9ja1JWKCk7Ci0gICAgbXZtOjpUaHJlYWQ6OmdldCgpLT5pblJWID0gZmFsc2U7Ci0gIH0KLSAgCi0gIHZvaWQgYW5vdGhlcl9tYXJrKCk7Ci0KLSAgdmlydHVhbCB2b2lkIGZpbmlzaFJWKCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgc3luY2hyb25pemUoKSA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIGpvaW4oKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBqb2luQWZ0ZXJVbmNvb3BlcmF0aXZlKHZvaWQqIFNQKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBqb2luQmVmb3JlVW5jb29wZXJhdGl2ZSgpID0gMDsKLQotICAvLy8gcHJlcGFyZUZvckpvaW4gLSBmb3IgdW5jb29wZXJhdGl2ZSBnYywgcHJlcGFyZSB0aGUgU0lHR0MgaGFuZGxlcgotCXZpcnR1YWwgdm9pZCBwcmVwYXJlRm9ySm9pbigpID0gMDsKLX07Ci0KLWNsYXNzIENvb3BlcmF0aXZlQ29sbGVjdGlvblJWIDogcHVibGljIENvbGxlY3Rpb25SViB7Ci1wdWJsaWM6IAotICB2b2lkIGZpbmlzaFJWKCk7Ci0gIHZvaWQgc3luY2hyb25pemUoKTsKLQotICB2b2lkIGpvaW4oKTsKLSAgdm9pZCBqb2luQWZ0ZXJVbmNvb3BlcmF0aXZlKHZvaWQqIFNQKTsKLSAgdm9pZCBqb2luQmVmb3JlVW5jb29wZXJhdGl2ZSgpOwotCXZvaWQgcHJlcGFyZUZvckpvaW4oKTsKLX07Ci0KLWNsYXNzIFVuY29vcGVyYXRpdmVDb2xsZWN0aW9uUlYgOiBwdWJsaWMgQ29sbGVjdGlvblJWIHsKLXB1YmxpYzogCi0gIHZvaWQgZmluaXNoUlYoKTsKLSAgdm9pZCBzeW5jaHJvbml6ZSgpOwotCi0gIHZvaWQgam9pbigpOwotICB2b2lkIGpvaW5BZnRlclVuY29vcGVyYXRpdmUodm9pZCogU1ApOwotICB2b2lkIGpvaW5CZWZvcmVVbmNvb3BlcmF0aXZlKCk7Ci0gIHZvaWQgcHJlcGFyZUZvckpvaW4oKTsKLX07Ci0KLQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2luY2x1ZGUvbXZtL1RocmVhZHMvQ29uZC5oIGIvdm1raXQvaW5jbHVkZS9tdm0vVGhyZWFkcy9Db25kLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViY2Q3NGIuLjAwMDAwMDAKLS0tIGEvdm1raXQvaW5jbHVkZS9tdm0vVGhyZWFkcy9Db25kLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLS0tLS0gQ29uZC5oIC0gVGhyZWFkcyBjb25kaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgVGhlIE1pY3JvIFZpcnR1YWwgTWFjaGluZQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgTVZNX0NPTkRfSAotI2RlZmluZSBNVk1fQ09ORF9ICi0KLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotbmFtZXNwYWNlIG12bSB7Ci0KLWNsYXNzIExvY2s7Ci0KLWNsYXNzIENvbmQgewotICBwdGhyZWFkX2NvbmRfdCBpbnRlcm5hbENvbmQ7Ci1wdWJsaWM6Ci0gIAotICBDb25kKCk7Ci0gIH5Db25kKCk7Ci0gIHZvaWQgYnJvYWRjYXN0KHZvaWQpIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpOwotICB2b2lkIHdhaXQoTG9jayAqbCkgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSk7Ci0gIGludCB0aW1lZFdhaXQoTG9jayAqbCwgdGltZXZhbCAqdHYpIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpOwotICB2b2lkIHNpZ25hbCh2b2lkKSBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsKLX07Ci0KLX0gLy8gZW5kIG5hbWVzcGFjZSBtdm0KLQotI2VuZGlmIC8vIE1WTV9DT05EX0gKZGlmZiAtLWdpdCBhL3Zta2l0L2luY2x1ZGUvbXZtL1RocmVhZHMvTG9ja3MuaCBiL3Zta2l0L2luY2x1ZGUvbXZtL1RocmVhZHMvTG9ja3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwN2EzOS4uMDAwMDAwMAotLS0gYS92bWtpdC9pbmNsdWRlL212bS9UaHJlYWRzL0xvY2tzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0gTG9ja3MuaCAtIFRocmVhZCBsb2NrcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBNaWNybyBWaXJ0dWFsIE1hY2hpbmUKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIE1WTV9MT0NLU19ICi0jZGVmaW5lIE1WTV9MT0NLU19ICi0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxjc3RkaW8+Ci0KLSNpbmNsdWRlICJPYmplY3RIZWFkZXIuaCIKLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9UaHJlYWQuaCIKLQotbmFtZXNwYWNlIG12bSB7Ci0KLWNsYXNzIGdjOwotCi1leHRlcm4gIkMiIHVpbnQ4ICBsbHZtX2F0b21pY19jbXBfc3dhcF9pOCh1aW50OCogcHRyLCAgdWludDggY21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggdmFsKTsKLWV4dGVybiAiQyIgdWludDE2IGxsdm1fYXRvbWljX2NtcF9zd2FwX2kxNih1aW50MTYqIHB0ciwgdWludDE2IGNtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTYgdmFsKTsKLWV4dGVybiAiQyIgdWludDMyIGxsdm1fYXRvbWljX2NtcF9zd2FwX2kzMih1aW50MzIqIHB0ciwgdWludDMyIGNtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgdmFsKTsKLWV4dGVybiAiQyIgdWludDY0IGxsdm1fYXRvbWljX2NtcF9zd2FwX2k2NCh1aW50NjQqIHB0ciwgdWludDY0IGNtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjQgdmFsKTsKLQotI2lmbmRlZiBXSVRIX0xMVk1fR0NDCi0KLS8vIFRPRE86IGZpbmQgd2hhdCBtYWNybyBmb3IgZ2NjIDwgNC4yCi0KLSNkZWZpbmUgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcF8zMihwdHIsIGNtcCwgdmFsKSBcCi0gIG12bTo6bGx2bV9hdG9taWNfY21wX3N3YXBfaTMyKCh1aW50MzIqKShwdHIpLCAodWludDMyKShjbXApLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyKSh2YWwpKSA9PSAodWludDMyKShjbXApCi0KLSNpZiAoX19XT1JEU0laRSA9PSA2NCkKLQotI2RlZmluZSBfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKHB0ciwgY21wLCB2YWwpIFwKLSAgbXZtOjpsbHZtX2F0b21pY19jbXBfc3dhcF9pNjQoKHVpbnQ2NCopKHB0ciksICh1aW50NjQpKGNtcCksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50NjQpKHZhbCkpID09ICh1aW50NjQpKGNtcCkKLQotI2RlZmluZSBfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAocHRyLCBjbXAsdmFsKSBcCi0gIG12bTo6bGx2bV9hdG9taWNfY21wX3N3YXBfaTY0KCh1aW50NjQqKShwdHIpLCAodWludDY0KShjbXApLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDY0KSh2YWwpKQotCi0KLSNlbHNlCi0KLQotCi0jZGVmaW5lIF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAocHRyLCBjbXAsIHZhbCkgXAotICBtdm06Omxsdm1fYXRvbWljX2NtcF9zd2FwX2kzMigodWludDMyKikocHRyKSwgKHVpbnQzMikoY21wKSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMikodmFsKSkgPT0gKHVpbnQzMikoY21wKQotCi0jZGVmaW5lIF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcChwdHIsIGNtcCx2YWwpIFwKLSAgbXZtOjpsbHZtX2F0b21pY19jbXBfc3dhcF9pMzIoKHVpbnQzMiopKHB0ciksICh1aW50MzIpKGNtcCksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzIpKHZhbCkpCi0jZW5kaWYKLQotCi0jZW5kaWYKLQotY2xhc3MgQ29uZDsKLWNsYXNzIEZhdExvY2s7Ci1jbGFzcyBMb2NrTm9ybWFsOwotY2xhc3MgTG9ja1JlY3Vyc2l2ZTsKLWNsYXNzIFRocmVhZDsKLQotLy8vIExvY2sgLSBUaGlzIGNsYXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzIGZvciBkZWNsYXJpbmcgcmVjdXJzaXZlIGFuZCBub3JtYWwKLS8vLyBsb2Nrcy4KLS8vLwotY2xhc3MgTG9jayB7Ci0gIGZyaWVuZCBjbGFzcyBDb25kOwotICAKLXByaXZhdGU6Ci0gIHZpcnR1YWwgdm9pZCB1bnNhZmVMb2NrKGludCBuKSA9IDA7Ci0gIHZpcnR1YWwgaW50IHVuc2FmZVVubG9jaygpID0gMDsKLQotcHJvdGVjdGVkOgotICAvLy8gb3duZXIgLSBXaGljaCB0aHJlYWQgaXMgY3VycmVudGx5IGhvbGRpbmcgdGhlIGxvY2s/Ci0gIC8vLwotICBtdm06OlRocmVhZCogb3duZXI7Ci0KLSAgLy8vIGludGVybmFsTG9jayAtIFRoZSBsb2NrIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwbGF0Zm9ybS4KLSAgLy8vCi0gIHB0aHJlYWRfbXV0ZXhfdCBpbnRlcm5hbExvY2s7Ci0gIAotCi1wdWJsaWM6Ci0KLSAgLy8vIExvY2sgLSBDcmVhdGVzIGEgbG9jaywgcmVjdXJzaXZlIGlmIHJlYyBpcyB0cnVlLgotICAvLy8KLSAgTG9jaygpOwotICAKLSAgLy8vIH5Mb2NrIC0gR2l2ZSBpdCBhIGhvbWUuCi0gIC8vLwotICB2aXJ0dWFsIH5Mb2NrKCk7Ci0gIAotICAvLy8gbG9jayAtIEFjcXVpcmUgdGhlIGxvY2suCi0gIC8vLwotICB2aXJ0dWFsIHZvaWQgbG9jaygpIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpID0gMDsKLQotICAvLy8gdW5sb2NrIC0gUmVsZWFzZSB0aGUgbG9jay4KLSAgLy8vCi0gIHZpcnR1YWwgdm9pZCB1bmxvY2soKSA9IDA7Ci0KLSAgLy8vIHNlbGZPd25lciAtIElzIHRoZSBjdXJyZW50IHRocmVhZCBob2xkaW5nIHRoZSBsb2NrPwotICAvLy8KLSAgYm9vbCBzZWxmT3duZXIoKTsKLQotICAvLy8gZ2V0T3duZXIgLSBHZXQgdGhlIHRocmVhZCB0aGF0IGlzIGhvbGRpbmcgdGhlIGxvY2suCi0gIC8vLwotICBtdm06OlRocmVhZCogZ2V0T3duZXIoKTsKLSAgCi19OwotCi0vLy8gTG9ja05vcm1hbCAtIEEgbm9uLXJlY3Vyc2l2ZSBsb2NrLgotY2xhc3MgTG9ja05vcm1hbCA6IHB1YmxpYyBMb2NrIHsKLSAgZnJpZW5kIGNsYXNzIENvbmQ7Ci1wcml2YXRlOgotICB2aXJ0dWFsIHZvaWQgdW5zYWZlTG9jayhpbnQgbikgewotICAgIG93bmVyID0gbXZtOjpUaHJlYWQ6OmdldCgpOwotICB9Ci0gIAotICB2aXJ0dWFsIGludCB1bnNhZmVVbmxvY2soKSB7Ci0gICAgb3duZXIgPSAwOwotICAgIHJldHVybiAwOwotICB9Ci1wdWJsaWM6Ci0gIExvY2tOb3JtYWwoKSA6IExvY2soKSB7fQotCi0gIHZpcnR1YWwgdm9pZCBsb2NrKCkgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSk7Ci0gIHZpcnR1YWwgdm9pZCB1bmxvY2soKTsKLQotfTsKLQotLy8vIExvY2tSZWN1cnNpdmUgLSBBIHJlY3Vyc2l2ZSBsb2NrLgotY2xhc3MgTG9ja1JlY3Vyc2l2ZSA6IHB1YmxpYyBMb2NrIHsKLSAgZnJpZW5kIGNsYXNzIENvbmQ7Ci1wcml2YXRlOgotICAKLSAgLy8vIG4gLSBOdW1iZXIgb2YgdGltZXMgdGhlIGxvY2sgaGFzIGJlZW4gbG9ja2VkLgotICAvLy8KLSAgaW50IG47Ci0KLSAgdmlydHVhbCB2b2lkIHVuc2FmZUxvY2soaW50IGEpIHsKLSAgICBuID0gYTsKLSAgICBvd25lciA9IG12bTo6VGhyZWFkOjpnZXQoKTsKLSAgfQotICAKLSAgdmlydHVhbCBpbnQgdW5zYWZlVW5sb2NrKCkgewotICAgIGludCByZXQgPSBuOwotICAgIG4gPSAwOwotICAgIG93bmVyID0gMDsKLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLXB1YmxpYzoKLSAgTG9ja1JlY3Vyc2l2ZSgpIDogTG9jaygpIHsgbiA9IDA7IH0KLSAgCi0gIHZpcnR1YWwgdm9pZCBsb2NrKCkgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSk7Ci0gIHZpcnR1YWwgdm9pZCB1bmxvY2soKTsKLSAgdmlydHVhbCBpbnQgdHJ5TG9jaygpOwotCi0gIC8vLyByZWN1cnNpb25Db3VudCAtIEdldCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBsb2NrIGhhcyBiZWVuIGxvY2tlZC4KLSAgLy8vCi0gIGludCByZWN1cnNpb25Db3VudCgpIHsgcmV0dXJuIG47IH0KLQotICAvLy8gdW5sb2NrQWxsIC0gVW5sb2NrIHRoZSBsb2NrLCByZWxlYXNpbmcgaXQgdGhlIG51bWJlciBvZiB0aW1lcyBpdCBpcyBoZWxkLgotICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGxvY2sgaGFzIGJlZW4gbG9ja2VkLgotICAvLy8KLSAgaW50IHVubG9ja0FsbCgpOwotCi0gIC8vLyBsb2NrQWxsIC0gQWNxdWlyZSB0aGUgbG9jayBjb3VudCB0aW1lcy4KLSAgLy8vCi0gIHZvaWQgbG9ja0FsbChpbnQgY291bnQpIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpOwotfTsKLQotLy8vIFNwaW5Mb2NrIC0gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgc3BpbiBsb2NrLiBBIHNwaW4gbG9jayBpcyBPSyB0byB1c2UKLS8vLyB3aGVuIGl0IGlzIGhlbGQgZHVyaW5nIHNob3J0IHBlcmlvZCBvZiB0aW1lcy4gSXQgaXMgQ1BVIGV4cGVuc2l2ZQotLy8vIG90aGVyd2lzZS4KLWNsYXNzIFNwaW5Mb2NrIHsKLXB1YmxpYzoKLQotICAvLy8gbG9ja2VkIC0gSXMgdGhlIHNwaW4gbG9jayBsb2NrZWQ/Ci0gIC8vLwotICB1aW50MzIgbG9ja2VkOwotICAKLSAgLy8vIFNwaW5Mb2NrIC0gSW5pdGlhbGl6ZSB0aGUgbG9jayBhcyBub3QgYmVpbmcgaGVsZC4KLSAgLy8vCi0gIFNwaW5Mb2NrKCkgeyBsb2NrZWQgPSAwOyB9Ci0KLQotICAvLy8gYWNxdWlyZSAtIEFjcXVpcmUgdGhlIHNwaW4gbG9jaywgZG9pbmcgYW4gYWN0aXZlIGxvb3AuCi0gIC8vLwotICB2b2lkIGFjcXVpcmUoKSB7Ci0gICAgZm9yICh1aW50MzIgY291bnQgPSAwOyBjb3VudCA8IDEwMDA7ICsrY291bnQpIHsKLSAgICAgIHVpbnQzMiByZXMgPSBfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAoJmxvY2tlZCwgMCwgMSk7Ci0gICAgICBpZiAoIXJlcykgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICB3aGlsZSAoX19zeW5jX3ZhbF9jb21wYXJlX2FuZF9zd2FwKCZsb2NrZWQsIDAsIDEpKQotICAgICAgbXZtOjpUaHJlYWQ6OnlpZWxkKCk7Ci0gIH0KLQotICB2b2lkIGxvY2soKSB7IGFjcXVpcmUoKTsgfQotCi0gIC8vLyByZWxlYXNlIC0gUmVsZWFzZSB0aGUgc3BpbiBsb2NrLiBUaGlzIG11c3QgYmUgY2FsbGVkIGJ5IHRoZSB0aHJlYWQKLSAgLy8vIGhvbGRpbmcgaXQuCi0gIC8vLwotICB2b2lkIHJlbGVhc2UoKSB7IGxvY2tlZCA9IDA7IH0KLSAgCi0gIHZvaWQgdW5sb2NrKCkgeyByZWxlYXNlKCk7IH0KLX07Ci0KLQotfSAvLyBlbmQgbmFtZXNwYWNlIG12bQotCi0jZW5kaWYgLy8gTVZNX0xPQ0tTX0gKZGlmZiAtLWdpdCBhL3Zta2l0L2luY2x1ZGUvbXZtL1RocmVhZHMvT2JqZWN0TG9ja3MuaCBiL3Zta2l0L2luY2x1ZGUvbXZtL1RocmVhZHMvT2JqZWN0TG9ja3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdkMGY5Ni4uMDAwMDAwMAotLS0gYS92bWtpdC9pbmNsdWRlL212bS9UaHJlYWRzL09iamVjdExvY2tzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLSBPYmplY3RMb2Nrcy5oIC0gT2JqZWN0IGJhc2VkIGxvY2tzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgTVZNX09CSkVDVF9MT0NLU19ICi0jZGVmaW5lIE1WTV9PQkpFQ1RfTE9DS1NfSAotCi0jaW5jbHVkZSAiT2JqZWN0SGVhZGVyLmgiCi0jaW5jbHVkZSAibXZtL0FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm12bS9HQy5oIgotI2luY2x1ZGUgIm12bS9UaHJlYWRzL0NvbmQuaCIKLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9Mb2Nrcy5oIgotI2luY2x1ZGUgIm12bS9UaHJlYWRzL1RocmVhZC5oIgotCi1uYW1lc3BhY2UgbXZtIHsKLQotY2xhc3MgRmF0TG9jazsKLWNsYXNzIExvY2tTeXN0ZW07Ci0KLWNsYXNzIExvY2tpbmdUaHJlYWQgewotcHVibGljOgotICAvLy8gdmFyY29uZCAtIENvbmRpdGlvbiB2YXJpYWJsZSB3aGVuIHRoZSB0aHJlYWQgbmVlZHMgdG8gYmUgYXdha2VuIGZyb20KLSAgLy8vIGEgd2FpdC4KLSAgLy8vCi0gIG12bTo6Q29uZCB2YXJjb25kOwotCi0gIC8vLyBpbnRlcnJ1cHRGbGFnIC0gSGFzIHRoaXMgdGhyZWFkIGJlZW4gaW50ZXJydXB0ZWQ/Ci0gIC8vLwotICB1aW50MzIgaW50ZXJydXB0RmxhZzsKLQotICAvLy8gbmV4dFdhaXRpbmcgLSBOZXh0IHRocmVhZCB3YWl0aW5nIG9uIHRoZSBzYW1lIG1vbml0b3IuCi0gIC8vLwotICBMb2NraW5nVGhyZWFkKiBuZXh0V2FpdGluZzsKLSAgCi0gIC8vLyBwcmV2V2FpdGluZyAtIFByZXZpb3VzIHRocmVhZCB3YWl0aW5nIG9uIHRoZSBzYW1lIG1vbml0b3IuCi0gIC8vLwotICBMb2NraW5nVGhyZWFkKiBwcmV2V2FpdGluZzsKLQotICAvLy8gd2FpdHNPbiAtIFRoZSBsb2NrIG9uIHdoaWNoIHRoZSB0aHJlYWQgaXMgd2FpdGluZyBvbi4KLSAgLy8vCi0gIEZhdExvY2sqIHdhaXRzT247Ci0KLSAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBTdGF0ZVJ1bm5pbmcgPSAwOwotICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IFN0YXRlV2FpdGluZyA9IDE7Ci0gIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgU3RhdGVJbnRlcnJ1cHRlZCA9IDI7Ci0KLSAgLy8vIHN0YXRlIC0gVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhpcyB0aHJlYWQ6IFJ1bm5pbmcsIFdhaXRpbmcgb3IgSW50ZXJydXB0ZWQuCi0gIHVpbnQzMiBzdGF0ZTsKLQotICBMb2NraW5nVGhyZWFkKCkgewotICAgIGludGVycnVwdEZsYWcgPSAwOwotICAgIG5leHRXYWl0aW5nID0gTlVMTDsKLSAgICBwcmV2V2FpdGluZyA9IE5VTEw7Ci0gICAgd2FpdHNPbiA9IE5VTEw7Ci0gICAgc3RhdGUgPSBTdGF0ZVJ1bm5pbmc7Ci0gIH0KLQotICBib29sIHdhaXQoZ2MqIG9iamVjdCwgTG9ja1N5c3RlbSYgdGFibGUsIHN0cnVjdCB0aW1ldmFsKiBpbmZvLCBib29sIHRpbWVkKTsKLSAgdm9pZCBub3RpZnkoZ2MqIG9iamVjdCwgTG9ja1N5c3RlbSYgdGFibGUpOwotICB2b2lkIG5vdGlmeUFsbChnYyogb2JqZWN0LCBMb2NrU3lzdGVtJiB0YWJsZSk7Ci19OwotCi0KLWNsYXNzIEZhdExvY2sgOiBwdWJsaWMgbXZtOjpQZXJtYW5lbnRPYmplY3QgewotcHJpdmF0ZToKLSAgbXZtOjpMb2NrUmVjdXJzaXZlIGludGVybmFsTG9jazsKLSAgbXZtOjpTcGluTG9jayBzcGluTG9jazsKLSAgdWludDMyX3Qgd2FpdGluZ1RocmVhZHM7Ci0gIHVpbnQzMl90IGxvY2tpbmdUaHJlYWRzOwotICBMb2NraW5nVGhyZWFkKiBmaXJzdFRocmVhZDsKLSAgZ2MqIGFzc29jaWF0ZWRPYmplY3Q7Ci0gIHVpbnQzMl90IGluZGV4OwotICBGYXRMb2NrKiBuZXh0RnJlZUxvY2s7Ci1wdWJsaWM6Ci0gIEZhdExvY2sodWludDMyX3QgaW5kZXgsIGdjKiBvYmplY3QpOwotICB1aW50cHRyX3QgZ2V0SUQoKTsKLSAgaW50IHRyeUFjcXVpcmUoKSB7IHJldHVybiBpbnRlcm5hbExvY2sudHJ5TG9jaygpOyB9Ci0gIGJvb2wgYWNxdWlyZShnYyogb2JqZWN0KTsKLSAgdm9pZCBhY3F1aXJlQWxsKGdjKiBvYmplY3QsIHVpbnQzMl90IGNvdW50KTsKLSAgdm9pZCByZWxlYXNlKGdjKiBvYmplY3QsIExvY2tTeXN0ZW0mIHRhYmxlKTsKLSAgbXZtOjpUaHJlYWQqIGdldE93bmVyKCk7Ci0gIGJvb2wgb3duZXIoKTsKLSAgZ2MqIGdldEFzc29jaWF0ZWRPYmplY3QoKSB7IHJldHVybiBhc3NvY2lhdGVkT2JqZWN0OyB9Ci0gIGdjKiogZ2V0QXNzb2NpYXRlZE9iamVjdFB0cigpIHsgcmV0dXJuICZhc3NvY2lhdGVkT2JqZWN0OyB9Ci0KLSAgZnJpZW5kIGNsYXNzIExvY2tTeXN0ZW07Ci0gIGZyaWVuZCBjbGFzcyBMb2NraW5nVGhyZWFkOwotICBmcmllbmQgY2xhc3MgVGhpbkxvY2s7Ci19OwotCi0KLS8vLyBMb2NrU3lzdGVtIC0gVGhpcyBjbGFzcyBtYW5hZ2VzIGFsbCBKYXZhIGxvY2tzIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9ucy4KLS8vLyBFYWNoIEpWTSBtdXN0IG93biBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFuZCBhbGxvY2F0ZSBKYXZhIGxvY2tzCi0vLy8gd2l0aCBpdC4KLS8vLwotY2xhc3MgTG9ja1N5c3RlbSB7Ci0gIGZyaWVuZCBjbGFzcyBGYXRMb2NrOwotcHVibGljOgotICAKLSAgLy8gRml4ZWQgdmFsdWVzLiBXaXRoIHRoZXNlIHZhbHVlcywgYW4gaW5kZXggaXMgb24gMTggYml0cy4KLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IEdsb2JhbFNpemUgPSAxMjg7Ci0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBCaXRJbmRleCA9IDExOwotICBzdGF0aWMgY29uc3QgdWludDMyX3QgSW5kZXhTaXplID0gMSA8PCBCaXRJbmRleDsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IEJpdE1hc2sgPSBJbmRleFNpemUgLSAxOwotICBzdGF0aWMgY29uc3QgdWludDMyX3QgTWF4TG9ja3MgPSBHbG9iYWxTaXplICogSW5kZXhTaXplOwotCi0gIG12bTo6QnVtcFB0ckFsbG9jYXRvciYgYWxsb2NhdG9yOwotCi0gIC8vLyBMb2NrVGFibGUgLSBUaGUgZ2xvYmFsIHRhYmxlIHRoYXQgd2lsbCBob2xkIHRoZSBsb2Nrcy4gVGhlIHRhYmxlIGlzCi0gIC8vLyBhIHR3by1kaW1lbnNpb25hbCBhcnJheSwgYW5kIG9ubHkgb25lIGVudHJ5IGlzIGNyZWF0ZWQsIHNvIHRoYXQKLSAgLy8vIHRoZSBsb2NrIHN5c3RlbSBkb2VzIG5vdCBlYXQgdXAgYWxsIG1lbW9yeSBvbiBzdGFydHVwLgotICAvLy8gIAotICBGYXRMb2NrKiAqKiBMb2NrVGFibGU7Ci0gIAotICAvLy8gY3VycmVudEluZGV4IC0gVGhlIGN1cnJlbnQgaW5kZXggaW4gdGhlIHRhYmxlcy4gQWx3YXlzIGluY3JlbWVudGVkLAotICAvLy8gbmV2ZXIgZGVjcmVtZW50ZWQuCi0gIC8vLwotICB1aW50MzJfdCBjdXJyZW50SW5kZXg7Ci0gCi0gIC8vLyBmcmVlTG9jayAtIFRoZSBsaXN0IG9mIGxvY2tzIHRoYXQgYXJlIGFsbG9jYXRlZCBhbmQgYXZhaWxhYmxlLgotICAvLy8KLSAgRmF0TG9jayogZnJlZUxvY2s7Ci0gCi0gIC8vLyB0aHJlYWRMb2NrIC0gU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIGN1cnJlbnRJbmRleCBmaWVsZC4KLSAgLy8vCi0gIG12bTo6U3BpbkxvY2sgdGhyZWFkTG9jazsKLSAgCi0gIC8vLyBhbGxvY2F0ZSAtIEFsbG9jYXRlIGEgRmF0TG9jay4KLSAgLy8vCi0gIEZhdExvY2sqIGFsbG9jYXRlKGdjKiBvYmopOyAKLSAKLSAgLy8vIGRlYWxsb2NhdGUgLSBQdXQgYSBsb2NrIGluIHRoZSBmcmVlIGxpc3QgbG9jay4KLSAgLy8vCi0gIHZvaWQgZGVhbGxvY2F0ZShGYXRMb2NrKiBsb2NrKTsKLQotICAvLy8gTG9ja1N5c3RlbSAtIERlZmF1bHQgY29uc3RydWN0b3IuIEluaXRpYWxpemUgdGhlIHRhYmxlLgotICAvLy8KLSAgTG9ja1N5c3RlbShtdm06OkJ1bXBQdHJBbGxvY2F0b3ImIGFsbG9jYXRvcik7Ci0KLSAgLy8vIGdldExvY2sgLSBHZXQgYSBsb2NrIGZyb20gYW4gaW5kZXggaW4gdGhlIHRhYmxlLgotICAvLy8KLSAgRmF0TG9jayogZ2V0TG9jayh1aW50MzJfdCBpbmRleCkgewotICAgIHJldHVybiBMb2NrVGFibGVbaW5kZXggPj4gQml0SW5kZXhdW2luZGV4ICYgQml0TWFza107Ci0gIH0KLQotICBGYXRMb2NrKiBnZXRGYXRMb2NrRnJvbUlEKHVpbnRwdHJfdCBJRCk7Ci19OwotCi1jbGFzcyBUaGluTG9jayB7Ci1wdWJsaWM6Ci0gIAotICAvLyBUaGUgaGVhZGVyIG9mIGFuIG9iamVjdCB0aGF0IGhhcyBhIHRoaW4gbG9jayBpbXBsZW1lbnRhdGlvbiBpcyBsaWtlIHRoZQotICAvLyBmb2xsb3dpbmc6Ci0gIC8vCi0gIC8vICAgIHggICAgICB4eHggeHh4eCB4eHh4ICAgICAgICB4eHh4IHh4eHggeHh4eCAgICAgICAgeHh4eCB4eHh4Ci0gIC8vICAgIF4gICAgICBeXl4gXl5eXiBeXl5eICAgICAgICBeXl5eIF5eXl4gXl5eXiAgICAgICAgXl5eXiBeXl5eCi0gIC8vICAgIDEgICAgICAgICAgIDExICAgICAgICAgICAgICAgICAgICAxMiAgICAgICAgICAgICAgICAgIDgKLSAgLy8gZmF0IGxvY2sgICAgdGhyZWFkIGlkICAgICAgIHRoaW4gbG9jayBjb3VudCArIGhhc2ggICAgIEdDIGJpdHMKLQotICBzdGF0aWMgY29uc3QgdWludDY0X3QgRmF0TWFzayA9IDEgPDwgKChzaXplb2Yoc2l6ZV90KSA8PCAzKSAtIDEpOwotCi0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBOb25Mb2NrQml0cyA9IEhhc2hCaXRzICsgR0NCaXRzOwotICBzdGF0aWMgY29uc3QgdWludDY0X3QgTm9uTG9ja0JpdHNNYXNrID0gKCgxIDw8IE5vbkxvY2tCaXRzKSAtIDEpOwotCi0gIHN0YXRpYyBjb25zdCB1aW50NjRfdCBUaGluQ291bnRNYXNrID0gfihGYXRNYXNrICsgVGhyZWFkOjpJRE1hc2sgKyBOb25Mb2NrQml0c01hc2spOwotICBzdGF0aWMgY29uc3QgdWludDY0X3QgVGhpbkNvdW50U2hpZnQgPSBOb25Mb2NrQml0czsKLSAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IFRoaW5Db3VudEFkZCA9IDEgPDwgTm9uTG9ja0JpdHM7Ci0KLSAgLy8vIGluaXRpYWxpc2UgLSBJbml0aWFsaXNlIHRoZSB2YWx1ZSBvZiB0aGUgbG9jay4KLSAgLy8vCi0gIHN0YXRpYyB2b2lkIHJlbW92ZUZhdExvY2soRmF0TG9jayogZmF0TG9jaywgTG9ja1N5c3RlbSYgdGFibGUpOwotCi0gIC8vLyBvdmVyZmxvd1RoaW5sb2NrIC0gQ2hhbmdlIHRoZSBsb2NrIG9mIHRoaXMgb2JqZWN0IHRvIGEgZmF0IGxvY2sgYmVjYXVzZQotICAvLy8gd2UgaGF2ZSByZWFjaGVkIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsb2Nrcy4KLSAgc3RhdGljIHZvaWQgb3ZlcmZsb3dUaGluTG9jayhnYyogb2JqZWN0LCBMb2NrU3lzdGVtJiB0YWJsZSk7Ci0gCi0gIC8vLyBjaGFuZ2VUb0ZhdGxvY2sgLSBDaGFuZ2UgdGhlIGxvY2sgb2YgdGhpcyBvYmplY3QgdG8gYSBmYXQgbG9jay4gVGhlIGxvY2sKLSAgLy8vIG1heSBiZSBpbiBhIHRoaW4gbG9jayBvciBmYXQgbG9jayBzdGF0ZS4KLSAgc3RhdGljIEZhdExvY2sqIGNoYW5nZVRvRmF0bG9jayhnYyogb2JqZWN0LCBMb2NrU3lzdGVtJiB0YWJsZSk7Ci0KLSAgLy8vIGFjcXVpcmUgLSBBY3F1aXJlIHRoZSBsb2NrLgotICBzdGF0aWMgdm9pZCBhY3F1aXJlKGdjKiBvYmplY3QsIExvY2tTeXN0ZW0mIHRhYmxlKTsKLQotICAvLy8gcmVsZWFzZSAtIFJlbGVhc2UgdGhlIGxvY2suCi0gIHN0YXRpYyB2b2lkIHJlbGVhc2UoZ2MqIG9iamVjdCwgTG9ja1N5c3RlbSYgdGFibGUpOwotCi0gIC8vLyBvd25lciAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVuIHRocmVhZCBpcyB0aGUgb3duZXIgb2YgdGhpcyBvYmplY3QncwotICAvLy8gbG9jay4KLSAgc3RhdGljIGJvb2wgb3duZXIoZ2MqIG9iamVjdCwgTG9ja1N5c3RlbSYgdGFibGUpOwotCi0gIC8vLyBnZXRGYXRMb2NrIC0gR2V0IHRoZSBmYXQgbG9jayBpcyB0aGUgbG9jayBpcyBhIGZhdCBsb2NrLCAwIG90aGVyd2lzZS4KLSAgc3RhdGljIEZhdExvY2sqIGdldEZhdExvY2soZ2MqIG9iamVjdCwgTG9ja1N5c3RlbSYgdGFibGUpOwotfTsKLQotfSAvLyBlbmQgbmFtZXNwYWNlIG12bQotCi0jZW5kaWYgLy8gTVZNX09CSkVDVF9MT0NLU19ICmRpZmYgLS1naXQgYS92bWtpdC9pbmNsdWRlL212bS9UaHJlYWRzL1RocmVhZC5oIGIvdm1raXQvaW5jbHVkZS9tdm0vVGhyZWFkcy9UaHJlYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBlNTc5Ny4uMDAwMDAwMAotLS0gYS92bWtpdC9pbmNsdWRlL212bS9UaHJlYWRzL1RocmVhZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEzICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0tLS0tLSBUaHJlYWRzLmggLSBNaWNyby12bSB0aHJlYWRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgTVZNX1RIUkVBRF9ICi0jZGVmaW5lIE1WTV9USFJFQURfSAotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxjc3RkaW8+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgInR5cGVzLmgiCi0KLSNpZmRlZiBSVU5USU1FX0RXQVJGX0VYQ0VQVElPTlMKLSAgI2RlZmluZSBUUlkgdHJ5Ci0gICNkZWZpbmUgQ0FUQ0ggY2F0Y2goLi4uKQotICAjZGVmaW5lIElHTk9SRSBjYXRjaCguLi4pIHsgbXZtOjpUaHJlYWQ6OmdldCgpLT5jbGVhclBlbmRpbmdFeGNlcHRpb24oKTsgfQotICAjZGVmaW5lIEVORF9DQVRDSAotI2Vsc2UKLSAgI2luY2x1ZGUgPGNzZXRqbXA+Ci0gICNpZiBkZWZpbmVkKF9fTUFDSF9fKQotICAgICNkZWZpbmUgVFJZIHsgbXZtOjpFeGNlcHRpb25CdWZmZXIgX19idWZmZXJfXzsgaWYgKCFfc2V0am1wKF9fYnVmZmVyX18uYnVmZmVyKSkKLSAgI2Vsc2UKLSAgICAjZGVmaW5lIFRSWSB7IG12bTo6RXhjZXB0aW9uQnVmZmVyIF9fYnVmZmVyX187IGlmICghc2V0am1wKF9fYnVmZmVyX18uYnVmZmVyKSkKLSAgI2VuZGlmCi0gICNkZWZpbmUgQ0FUQ0ggZWxzZQotICAjZGVmaW5lIElHTk9SRSBlbHNlIHsgbXZtOjpUaHJlYWQ6OmdldCgpLT5jbGVhclBlbmRpbmdFeGNlcHRpb24oKTsgfX0KLSAgI2RlZmluZSBFTkRfQ0FUQ0ggfQotI2VuZGlmCi0KLW5hbWVzcGFjZSBtdm0gewotCi1jbGFzcyBnYzsKLWNsYXNzIE1ldGhvZEluZm87Ci1jbGFzcyBWaXJ0dWFsTWFjaGluZTsKLQotLy8vIENpcmN1bGFyQmFzZSAtIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGNpcmN1bGFyIGxpc3QuIENsYXNzZXMgdGhhdCBleHRlbmQKLS8vLyB0aGlzIGNsYXNzIGF1dG9tYXRpY2FsbHkgcGxhY2UgdGhlaXIgaW5zdGFuY2VzIGluIGEgY2lyY3VsYXIgbGlzdC4KLS8vLwotLy8gV0FSTklORzogaWYgeW91IG1vZGlmeSB0aGlzIGNsYXNzLCB5b3UgbXVzdCBhbHNvIGNoYW5nZSBtdm0tcnVudGltZS5sbAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLWNsYXNzIENpcmN1bGFyQmFzZSB7Ci0gIC8vLyBfbmV4dCAtIFRoZSBuZXh0IG9iamVjdCBpbiB0aGUgbGlzdC4KLSAgLy8vCi0gIFQgICpfbmV4dDsKLQotICAvLy8gX3ByZXYgLSBUaGUgcHJldmlvdXMgb2JqZWN0IGluIHRoZSBsaXN0LgotICAvLy8KLSAgVCAgKl9wcmV2OwotcHVibGljOgotICAvLy8gfkNpcmN1bGFyQmFzZSAtIEdpdmUgdGhlIGNsYXNzIGEgaG9tZS4KLSAgLy8vCi0gIHZpcnR1YWwgfkNpcmN1bGFyQmFzZSgpIHt9Ci0KLSAgLy8vIG5leHQgLSBHZXQgdGhlIG5leHQgb2JqZWN0IGluIHRoZSBsaXN0LgotICAvLy8KLSAgaW5saW5lIFQgKm5leHQoKSB7IHJldHVybiBfbmV4dDsgfQotCi0gIC8vLyBwcmV2IC0gR2V0IHRoZSBwcmV2aW91cyBvYmplY3QgaW4gdGhlIGxpc3QuCi0gIC8vLwotICBpbmxpbmUgVCAqcHJldigpIHsgcmV0dXJuIF9wcmV2OyB9Ci0KLSAgLy8vIENyaWN1bGFyQmFzZSAtIENyZWF0ZXMgdGhlIG9iamVjdCBhcyBhIHNpbmdsZSBlbGVtZW50IGluIHRoZSBsaXN0LgotICAvLy8KLSAgaW5saW5lIENpcmN1bGFyQmFzZSgpIHsgX3ByZXYgPSBfbmV4dCA9IChUKil0aGlzOyB9Ci0KLSAgLy8vIENpcmN1bGFyQmFzZSAtIENyZWF0ZXMgdGhlIG9iamVjdCBhbmQgcGxhY2UgaXQgaW4gdGhlIGdpdmVuIGxpc3QuCi0gIC8vLwotICBpbmxpbmUgZXhwbGljaXQgQ2lyY3VsYXJCYXNlKENpcmN1bGFyQmFzZTxUPiAqcCkgeyBhcHBlbmRUbyhwKTsgfQotCi0gIC8vLyByZW1vdmUgLSBSZW1vdmUgdGhlIG9iamVjdCBmcm9tIGl0cyBsaXN0LgotICAvLy8KLSAgaW5saW5lIHZvaWQgcmVtb3ZlKCkgewotICAgIF9wcmV2LT5fbmV4dCA9IF9uZXh0OyAKLSAgICBfbmV4dC0+X3ByZXYgPSBfcHJldjsKLSAgICBfcHJldiA9IF9uZXh0ID0gKFQqKXRoaXM7Ci0gIH0KLQotICAvLy8gYXBwZW5kIC0gQWRkIHRoZSBvYmplY3QgaW4gdGhlIGxpc3QuCi0gIC8vLwotICBpbmxpbmUgdm9pZCBhcHBlbmRUbyhDaXJjdWxhckJhc2U8VD4gKnApIHsgCi0gICAgX3ByZXYgPSAoVCopcDsKLSAgICBfbmV4dCA9IHAtPl9uZXh0OwotICAgIF9uZXh0LT5fcHJldiA9IChUKil0aGlzOwotICAgIF9wcmV2LT5fbmV4dCA9IChUKil0aGlzOwotICB9Ci0KLSAgLy8vIHByaW50IC0gUHJpbnQgdGhlIGxpc3QgZm9yIGRlYnVnIHB1cnBvc2VzLgotICB2b2lkIHByaW50KCkgewotICAgIFQqIHRlbXAgPSAoVCopdGhpczsKLSAgICBkbyB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVwIC0+ICIsICh2b2lkKil0ZW1wKTsKLSAgICAgIHRlbXAgPSB0ZW1wLT5uZXh0MCgpOwotICAgIH0gd2hpbGUgKHRlbXAgIT0gdGhpcyk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJcbiIpOwotICB9Ci19OwotCi0KLQotI2lmIGRlZmluZWQoX19NQUNIX18pICYmIChkZWZpbmVkKF9fUFBDX18pIHx8IGRlZmluZWQoX19wcGNfXykpCi0jZGVmaW5lIEZSQU1FX0lQKGZwKSAoZnBbMl0pCi0jZWxzZQotI2RlZmluZSBGUkFNRV9JUChmcCkgKGZwWzFdKQotI2VuZGlmCi0KLS8vIEFwcGFyZW50bHkgZ2NjIGZvciBpMzg2IGFuZCBmYW1pbHkgY29uc2lkZXJzIF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApIHRvCi0vLyByZXR1cm4gdGhlIGNhbGxlciwgbm90IHRoZSBjdXJyZW50IGZ1bmN0aW9uLgotI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoaTM4NikgfHwgZGVmaW5lZChfTV9JWDg2KSB8fCBcCi0gICAgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9NX0FNRDY0KQotI2RlZmluZSBGUkFNRV9QVFIoKSBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKQotI2Vsc2UKLSNkZWZpbmUgRlJBTUVfUFRSKCkgKCgodm9pZCoqKV9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApKVswXSkKLSNlbmRpZgotCi0KLWNsYXNzIEtub3duRnJhbWUgewotcHVibGljOgotICB2b2lkKiBjdXJyZW50RlA7Ci0gIHZvaWQqIGN1cnJlbnRJUDsKLSAgS25vd25GcmFtZSogcHJldmlvdXNGcmFtZTsKLX07Ci0KLQotY2xhc3MgRXhjZXB0aW9uQnVmZmVyOwotY2xhc3MgVGhyZWFkOwotY2xhc3MgVk1LaXQ7Ci0KLS8vIFdBUk5JTkc6IGlmIHlvdSBtb2RpZnkgdGhpcyBjbGFzcywgeW91IG11c3QgYWxzbyBjaGFuZ2UgbXZtLXJ1bnRpbWUubGwKLS8vIFdBUk5JTkc6IHdoZW4gYSBWTVRocmVhZERhdGEgaXMgaW4gYSB0aHJlYWQgKGluIGFsbFZtc0RhdGEpLCB5b3UgbXVzdCBuZXZlciBkZWxldGUgaXQgeW91cnNlbGYuCi1jbGFzcyBWTVRocmVhZERhdGEgewotcHVibGljOgotICAvLy8gbXV0IC0gVGhlIGFzc29jaWF0ZWQgdGhyZWFkIG11dGF0b3IKLQlUaHJlYWQqICAgICAgICAgbXV0OwotCi0gIC8vLyB2bSAtIFRoZSBhc3NvY2lhdGVkIHZpcnR1YWwgbWFjaGluZQotCVZpcnR1YWxNYWNoaW5lKiB2bTsKLQotCVZNVGhyZWFkRGF0YShWaXJ0dWFsTWFjaGluZSAqdiwgVGhyZWFkKiBtKSB7Ci0JCXRoaXMtPm11dCA9IG07Ci0JCXRoaXMtPnZtID0gdjsKLQl9Ci0KLSAgdmlydHVhbCB2b2lkIHRyYWNlcih1aW50cHRyX3QgY2xvc3VyZSkge307Ci0KLQl2aXJ0dWFsIH5WTVRocmVhZERhdGEoKSB7fSAvLyBmb3JjZSB0aGUgY29uc3RydWN0aW9uIG9mIGEgVlQKLX07Ci0KLSNkZWZpbmUgVEhSRUFEX1JVTk5JTkcgMQotI2RlZmluZSBUSFJFQURfREFFTU9OICAyCi0KLS8vLyBUaHJlYWQgLSBUaGlzIGNsYXNzIGlzIHRoZSBiYXNlIG9mIGN1c3RvbSB2aXJ0dWFsIG1hY2hpbmVzJyBUaHJlYWQgY2xhc3Nlcy4KLS8vLyBJdCBwcm92aWRlcyBzdGF0aWMgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aHJlYWRzLiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCi0vLy8gY29udGFpbnMgYWxsIHRocmVhZC1zcGVjaWZpYyBpbmZvcm1hdGlvbnMuCi0vLyBXQVJOSU5HOiBpZiB5b3UgbW9kaWZ5IHRoaXMgY2xhc3MsIHlvdSBtdXN0IGFsc28gY2hhbmdlIG12bS1ydW50aW1lLmxsCi1jbGFzcyBUaHJlYWQgOiBwdWJsaWMgQ2lyY3VsYXJCYXNlPFRocmVhZD4gewotcHVibGljOgotICAvLy8gZG9ZaWVsZCAtIEZsYWcgdG8gdGVsbCB0aGUgdGhyZWFkIHRvIHlpZWxkIGZvciBHQyByZWFzb25zLgotICBib29sIGRvWWllbGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMSAtIGludHJpbnNpYwotCi0jaWZkZWYgUlVOVElNRV9EV0FSRl9FWENFUFRJT05TCi0gIHZvaWQqIGludGVybmFsUGVuZGluZ0V4Y2VwdGlvbjsKLSNlbHNlCi0gIC8vLyBsYXN0RXhjZXB0aW9uQnVmZmVyIC0gVGhlIGxhc3QgZXhjZXB0aW9uIGJ1ZmZlciBvbiB0aGlzIHRocmVhZCdzIHN0YWNrLgotICBFeGNlcHRpb25CdWZmZXIqIGxhc3RFeGNlcHRpb25CdWZmZXI7ICAgICAgICAgICAgICAgICAgLy8gMiAtIGludHJpbnNpYwotI2VuZGlmCi0KLSAgLy8vIHZtRGF0YSAtIHZtIHNwZWNpZmljIGRhdGEgLSBub3RpY2UgdGhhdCB2bWtpdCBkbyBub3QgY29uc2lkZXIgdGhhdCB0aGlzIGZpZWxkIGhhcyBhIHZhbHVlCi0JVk1UaHJlYWREYXRhKiB2bURhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMgLSBpbnRyaW5zaWMKLQotICAvLy8gcGVuZGluZ0V4Y2VwdGlvbiAtIHRoZSBwZW5kaW5nIGV4Y2VwdGlvbgotCWdjKiBwZW5kaW5nRXhjZXB0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0IC0gaW50cmluc2ljCi0gIAotCS8vLyB2bWtpdCAtIGEgKHNob3J0Y3V0KSBwb2ludGVyIHRvIHZta2l0IHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gb24gYWxsIHRoZSB2bXMKLQltdm06OlZNS2l0KiB2bWtpdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNQotCi0gIC8vLyBiYXNlU1AgLSBUaGUgYmFzZSBzdGFjayBwb2ludGVyLgotICB2b2lkKiBiYXNlU1A7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNgotCi0gIC8vLyBpblJWIC0gRmxhZyB0byB0ZWxsIHRoYXQgdGhlIHRocmVhZCBpcyBiZWluZyBwYXJ0IG9mIGEgcmVuZGV6dm91cy4KLSAgYm9vbCBpblJWOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDcKLQotICAvLy8gam9pbmVkUlYgLSBGbGFnIHRvIHRlbGwgdGhhdCB0aGUgdGhyZWFkIGhhcyBqb2luZWQgYSByZW5kZXp2b3VzLgotICBib29sIGpvaW5lZFJWOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gOAotCi1wcml2YXRlOgotICAvLy8gbGFzdFNQIC0gSWYgdGhlIHRocmVhZCBpcyBydW5uaW5nIG5hdGl2ZSBjb2RlIHRoYXQgY2FuIG5vdCBiZQotICAvLy8gaW50ZXJydXB0ZWQsIGxhc3RTUCBpcyBub3QgbnVsbCBhbmQgY29udGFpbnMgdGhlIHZhbHVlIG9mIHRoZQotICAvLy8gc3RhY2sgcG9pbnRlciBiZWZvcmUgZW50ZXJpbmcgbmF0aXZlLgotICB2b2lkKiBsYXN0U1A7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gOQotIAotICAvLy8gaW50ZXJuYWxUaHJlYWRJRCAtIFRoZSBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyB0aHJlYWQgaWQuCi0gIHZvaWQqIGludGVybmFsVGhyZWFkSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxMAotCi1wdWJsaWM6Ci0gIC8vLyByb3V0aW5lIC0gVGhlIGZ1bmN0aW9uIHRvIGludm9rZSB3aGVuIHRoZSB0aHJlYWQgc3RhcnRzLgotICB2b2lkICgqcm91dGluZSkobXZtOjpUaHJlYWQqKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTEKLQotICAvLy8gbGFzdEtub3duRnJhbWUgLSBUaGUgbGFzdCBmcmFtZSB0aGF0IHdlIGtub3cgb2YsIGJlZm9yZSByZXN1bWluZyB0byBKTkkuCi0gIEtub3duRnJhbWUqIGxhc3RLbm93bkZyYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxMgotCi0gIC8vLyBhbGxWbXNEYXRhIC0gdGhlIGFycmF5IG9mIHRocmVhZCBzcGVjaWZpYyBkYXRhLgotCVZNVGhyZWFkRGF0YSoqIGFsbFZtc0RhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxMwotCi1wcml2YXRlOgotICAvLy8gc3RhdGUgLSBkYWVtb24sIHJ1bm5pbmcKLQl1aW50MzIgc3RhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTQKLQotcHJpdmF0ZToKLQlmcmllbmQgY2xhc3MgTXV0YXRvclRocmVhZDsKLSAgVGhyZWFkKFZNS2l0KiB2bWspOwotCi1wdWJsaWM6Ci0KLQkvLy8gc2V0RGFlbW9uIC0gdGhlIHRocmVhZCBpcyBhIGRhZW1vbgotCXZvaWQgc2V0RGFlbW9uKCk7Ci0KLQkvLy8gc2V0RGFlbW9uIC0gdGhlIHRocmVhZCBpcyBub3QgYSBkYWVtb24KLQl2b2lkIHNldE5vbkRhZW1vbigpOwotCi0JLy8vIGdldERhZW1vbiAtIGdldCB0aGUgZGFlbW9uIGZsYWcgb2YgdGhlIHRocmVhZAotCXVpbnQzMiBnZXRTdGF0ZSgpIHsgcmV0dXJuIHN0YXRlOyB9Ci0KLSAgLy8vIHlpZWxkIC0gWWllbGQgdGhlIHByb2Nlc3NvciB0byBhbm90aGVyIHRocmVhZC4KLSAgLy8vCi0gIHN0YXRpYyB2b2lkIHlpZWxkKHZvaWQpOwotICAKLSAgLy8vIGtpbGwgLSBLaWxsIHRoZSB0aHJlYWQgd2l0aCB0aGUgZ2l2ZW4gcGlkIGJ5IHNlbmRpbmcgaXQgYSBzaWduYWwuCi0gIC8vLwotICBzdGF0aWMgaW50IGtpbGwodm9pZCogdGlkLCBpbnQgc2lnbm8pOwotICAKLSAgLy8vIGtpbGwgLSBLaWxsIHRoZSBnaXZlbiB0aHJlYWQgYnkgc2VuZGluZyBpdCBhIHNpZ25hbC4KLSAgLy8vCi0gIGludCBraWxsKGludCBzaWdubyk7Ci0gIAotICAvLy8gZXhpdCAtIEV4aXQgdGhlIGN1cnJlbnQgdGhyZWFkLgotICAvLy8KLSAgc3RhdGljIHZvaWQgZXhpdChpbnQgdmFsdWUpOwotICAKLSAgLy8vIHN0YXJ0IC0gU3RhcnQgdGhlIGV4ZWN1dGlvbiBvZiBhIHRocmVhZC4KLSAgLy8vCi0gIHZpcnR1YWwgaW50IHN0YXJ0KHZvaWQgKCpmY3QpKG12bTo6VGhyZWFkKikpOwotICAKLSAgdWludDY0X3QgZ2V0VGhyZWFkSUQoKSB7Ci0gICAgcmV0dXJuICh1aW50NjRfdCl0aGlzOwotICB9Ci0gCi0gIC8vLyBnZXQgLSBHZXQgdGhlIHRocmVhZCBzcGVjaWZpYyBkYXRhIG9mIHRoZSBjdXJyZW50IHRocmVhZC4KLSAgLy8vCi0gIHN0YXRpYyBUaHJlYWQqIGdldCgpIHsKLSAgICByZXR1cm4gKFRocmVhZCopKCh1aW50cHRyX3QpX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCkgJiBJRE1hc2spOwotICB9Ci0gIAotcHJpdmF0ZToKLSAgCi0gIC8vLyBpbnRlcm5hbFRocmVhZFN0YXJ0IC0gVGhlIGltcGxlbWVudGF0aW9uIHNlcGNpZmljIHRocmVhZCBzdGFydGVyCi0gIC8vLyBmdW5jdGlvbi4KLSAgLy8vCi0gIHN0YXRpYyB2b2lkIGludGVybmFsVGhyZWFkU3RhcnQobXZtOjpUaHJlYWQqIHRoKTsKLQotcHVibGljOgotIAotICAvLy8gdHJhY2VyIC0gdHJhY2UgdGhlIHBlbmRpbmdFeGNlcHRpb24gYW5kIHRoZSB2bURhdGEKLSAgLy8vCi0gIHZpcnR1YWwgdm9pZCB0cmFjZXIodWludHB0cl90IGNsb3N1cmUpOwotCi0gIHZvaWQgc2NhblN0YWNrKHVpbnRwdHJfdCBjbG9zdXJlKTsKLSAgCi0gIHZvaWQqIGdldExhc3RTUCgpIHsgcmV0dXJuIGxhc3RTUDsgfQotICB2b2lkICBzZXRMYXN0U1Aodm9pZCogVikgeyBsYXN0U1AgPSBWOyB9Ci0gIAotICB2b2lkIGpvaW5SVkJlZm9yZUVudGVyKCk7Ci0gIHZvaWQgam9pblJWQWZ0ZXJMZWF2ZSh2b2lkKiBzYXZlZFNQKTsKLQotICB2b2lkIGVudGVyVW5jb29wZXJhdGl2ZUNvZGUodW5zaWduZWQgbGV2ZWwgPSAwKSBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsKLSAgdm9pZCBlbnRlclVuY29vcGVyYXRpdmVDb2RlKHZvaWQqIFNQKTsKLSAgdm9pZCBsZWF2ZVVuY29vcGVyYXRpdmVDb2RlKCk7Ci0gIHZvaWQqIHdhaXRPblNQKCk7Ci0KLQotICAvLy8gY2xlYXJQZW5kaW5nRXhjZXB0aW9uIC0gQ2xlYXIgYW55IHBlbmRpbmcgZXhjZXB0aW9uIG9mIHRoZSBjdXJyZW50IHRocmVhZC4KLSAgdm9pZCBjbGVhclBlbmRpbmdFeGNlcHRpb24oKSB7Ci0JCXBlbmRpbmdFeGNlcHRpb24gPSAwOwotI2lmZGVmIFJVTlRJTUVfRFdBUkZfRVhDRVBUSU9OUwotICAgIGludGVybmFsUGVuZGluZ0V4Y2VwdGlvbiA9IDA7Ci0jZW5kaWYKLSAgfQotCi0gIC8vLyBzZXRFeGNlcHRpb24gLSBvbmx5IHNldCB0aGUgcGVuZGluZyBleGNlcHRpb24KLQkvLy8KLQlUaHJlYWQqIHNldFBlbmRpbmdFeGNlcHRpb24oZ2MgKm9iaik7Ci0KLSAgLy8vIHRocm93SXQgLSBUaHJvdyBhIHBlbmRpbmcgZXhjZXB0aW9uLgotICAvLy8KLSAgdm9pZCB0aHJvd0l0KCk7Ci0KLSAgLy8vIGdldFBlbmRpbmdFeGNlcHRpb24gLSBSZXR1cm4gdGhlIHBlbmRpbmcgZXhjZXB0aW9uLgotICAvLy8KLSAgZ2MqIGdldFBlbmRpbmdFeGNlcHRpb24oKSB7Ci0gICAgcmV0dXJuIHBlbmRpbmdFeGNlcHRpb247Ci0gIH0KLQotICBib29sIGlzTXZtVGhyZWFkKCkgewotICAgIGlmICghYmFzZUFkZHIpIHJldHVybiBmYWxzZTsKLSAgICBlbHNlIHJldHVybiAoKCh1aW50cHRyX3QpdGhpcykgJiBNdm1UaHJlYWRNYXNrKSA9PSBiYXNlQWRkcjsKLSAgfQotCi0gIC8vLyBiYXNlQWRkciAtIFRoZSBiYXNlIGFkZHJlc3MgZm9yIGFsbCB0aHJlYWRzLgotICBzdGF0aWMgdWludHB0cl90IGJhc2VBZGRyOwotCi0gIC8vLyBJRE1hc2sgLSBBcHBseSB0aGlzIG1hc2sgdG8gdGhlIHN0YWNrIHBvaW50ZXIgdG8gZ2V0IHRoZSBUaHJlYWQgb2JqZWN0LgotICAvLy8KLSNpZiAoX19XT1JEU0laRSA9PSA2NCkKLSAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IElETWFzayA9IDB4RjdGRjAwMDAwOwotI2Vsc2UKLSAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IElETWFzayA9IDB4N0ZGMDAwMDA7Ci0jZW5kaWYKLSAgLy8vIE12bVRocmVhZE1hc2sgLSBBcHBseSB0aGlzIG1hc2sgdG8gdmVyaWZ5IHRoYXQgdGhlIGN1cnJlbnQgdGhyZWFkIHdhcwotICAvLy8gY3JlYXRlZCBieSBNdm0uCi0gIC8vLwotICBzdGF0aWMgY29uc3QgdWludDY0X3QgTXZtVGhyZWFkTWFzayA9IDB4RjAwMDAwMDA7Ci0KLSAgLy8vIE92ZXJmbG93TWFzayAtIEFwcGx5IHRoaXMgbWFzayB0byBpbXBsZW1lbnQgb3ZlcmZsb3cgY2hlY2tzLiBGb3IKLSAgLy8vIGVmZmljaWVuY3ksIHdlIGxvd2VyIHRoZSBhdmFpbGFibGUgc2l6ZSBvZiB0aGUgc3RhY2s6IGl0IGNhbiBuZXZlciBnbwotICAvLy8gdW5kZXIgMHhDMDAwMAotICAvLy8KLSAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IFN0YWNrT3ZlcmZsb3dNYXNrID0gMHhDMDAwMDsKLQotICAvLy8gc3RhY2tPdmVyZmxvdyAtIFJldHVybnMgaWYgdGhlcmUgaXMgYSBzdGFjayBvdmVyZmxvdyBpbiBKYXZhIGxhbmQuCi0gIC8vLwotICBib29sIHN0YWNrT3ZlcmZsb3coKSB7Ci0gICAgcmV0dXJuICgodWludHB0cl90KV9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApICYgU3RhY2tPdmVyZmxvd01hc2spID09IDA7Ci0gIH0KLQotICAvLy8gb3BlcmF0b3IgbmV3IC0gQWxsb2NhdGUgdGhlIFRocmVhZCBvYmplY3QgYXMgd2VsbCBhcyB0aGUgc3RhY2sgZm9yIHRoaXMKLSAgLy8vIFRocmVhZC4gVGhlIHRocmVhZCBvYmplY3QgaXMgaW5saW5lZCBpbiB0aGUgc3RhY2suCi0gIC8vLwotICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHN6KTsKLSAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCogdGgpOwotICB2aXJ0dWFsIH5UaHJlYWQoKTsKLQotICAvLy8gcHJpbnRCYWNrdHJhY2UgLSBQcmludCB0aGUgYmFja3RyYWNlLgotICAvLy8KLSAgdm9pZCBwcmludEJhY2t0cmFjZSgpOwotIAotICAvLy8gZ2V0RnJhbWVDb250ZXh0IC0gRmlsbCB0aGUgYnVmZmVyIHdpdGggZnJhbWVzIGN1cnJlbnRseSBvbiB0aGUgc3RhY2suCi0gIC8vLwotICB2b2lkIGdldEZyYW1lQ29udGV4dCh2b2lkKiogYnVmZmVyKTsKLSAgCi0gIC8vLyBnZXRGcmFtZUNvbnRleHRMZW5ndGggLSBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgZnJhbWUgY29udGV4dC4KLSAgLy8vCi0gIHVpbnQzMl90IGdldEZyYW1lQ29udGV4dExlbmd0aCgpOwotCi0gIHZvaWQgc3RhcnRLbm93bkZyYW1lKEtub3duRnJhbWUmIEYpIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpOwotICB2b2lkIGVuZEtub3duRnJhbWUoKTsKLSAgdm9pZCBzdGFydFVua25vd25GcmFtZShLbm93bkZyYW1lJiBGKSBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsKLSAgdm9pZCBlbmRVbmtub3duRnJhbWUoKTsKLQotICAvLy8gcmVhbGxvY0FsbFZtc0RhdGEgLSByZWFsbG9jIHRoZSBhbGxWbXNEYXRhIGZyb20gb2xkIHRvIG4gb3IgMCB0byBuIGlmIGFsbFZtc0RhdGE9MAotCS8vLyAgIG11c3QgYmUgcHJvdGVjdGVkIGJ5IHJlbmRlenZvdXMudGhyZWFkTG9jawotICAvLy8KLQl2b2lkIHJlYWxsb2NBbGxWbXNEYXRhKGludCBvbGQsIGludCBuKTsKLQotCS8vLyBhdHRhY2ggLSBhdHRhY2ggdGhlIHZtIHNwZWNpZmljIGRhdGEgb2YgdGhlIGdpdmVuIHZpcnR1YWwgbWFjaGluZQotCS8vLwotCXZvaWQgYXR0YWNoKFZpcnR1YWxNYWNoaW5lKiB2bSk7Ci19OwotCi0jaWZuZGVmIFJVTlRJTUVfRFdBUkZfRVhDRVBUSU9OUwotY2xhc3MgRXhjZXB0aW9uQnVmZmVyIHsKLXB1YmxpYzoKLSAgRXhjZXB0aW9uQnVmZmVyKCkgewotICAgIFRocmVhZCogdGggPSBUaHJlYWQ6OmdldCgpOwotICAgIHByZXZpb3VzQnVmZmVyID0gdGgtPmxhc3RFeGNlcHRpb25CdWZmZXI7Ci0gICAgdGgtPmxhc3RFeGNlcHRpb25CdWZmZXIgPSB0aGlzOwotICB9Ci0KLSAgfkV4Y2VwdGlvbkJ1ZmZlcigpIHsKLSAgICBUaHJlYWQqIHRoID0gVGhyZWFkOjpnZXQoKTsKLSAgICBhc3NlcnQodGgtPmxhc3RFeGNlcHRpb25CdWZmZXIgPT0gdGhpcyAmJiAiV3JvbmcgZXhjZXB0aW9uIGJ1ZmZlciIpOwotICAgIHRoLT5sYXN0RXhjZXB0aW9uQnVmZmVyID0gcHJldmlvdXNCdWZmZXI7Ci0gIH0KLSAgRXhjZXB0aW9uQnVmZmVyKiBwcmV2aW91c0J1ZmZlcjsKLSAgam1wX2J1ZiBidWZmZXI7Ci19OwotI2VuZGlmCi0KLS8vLyBTdGFja1dhbGtlciAtIFRoaXMgY2xhc3Mgd2Fsa3MgdGhlIHN0YWNrIG9mIHRocmVhZHMsIHJldHVybmluZyBhIE1ldGhvZEluZm8KLS8vLyBvYmplY3QgYXQgZWFjaCBpdGVyYXRpb24uCi0vLy8KLWNsYXNzIFN0YWNrV2Fsa2VyIHsKLXB1YmxpYzoKLSAgdm9pZCoqIGFkZHI7Ci0gIHZvaWQqICBpcDsKLSAgS25vd25GcmFtZSogZnJhbWU7Ci0gIG12bTo6VGhyZWFkKiB0aHJlYWQ7Ci0KLSAgU3RhY2tXYWxrZXIobXZtOjpUaHJlYWQqIHRoKSBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsKLSAgdm9pZCBvcGVyYXRvcisrKCk7Ci0gIHZvaWQqIG9wZXJhdG9yKigpOwotICBNZXRob2RJbmZvKiBnZXQoKTsKLQotfTsKLQotCi19IC8vIGVuZCBuYW1lc3BhY2UgbXZtCi0jZW5kaWYgLy8gTVZNX1RIUkVBRF9ICmRpZmYgLS1naXQgYS92bWtpdC9pbmNsdWRlL212bS9VVEY4LmggYi92bWtpdC9pbmNsdWRlL212bS9VVEY4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjOTJiYTMuLjAwMDAwMDAKLS0tIGEvdm1raXQvaW5jbHVkZS9tdm0vVVRGOC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLSNpZm5kZWYgX1VURjhfSU5URVJOQUxfSF8KLSNkZWZpbmUgX1VURjhfSU5URVJOQUxfSF8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlICJtdm0vQWxsb2NhdG9yLmgiCi0KLW5hbWVzcGFjZSBtdm0gewotCi1jbGFzcyBQcmludEJ1ZmZlcjsKLWNsYXNzIFVURjhNYXA7Ci0KLWNsYXNzIFVURjggewotICBmcmllbmQgY2xhc3MgVVRGOE1hcDsKLXByaXZhdGU6Ci0gIAotICAvLy8gb3BlcmF0b3IgbmV3IC0gUmVkZWZpbmVzIHRoZSBuZXcgb3BlcmF0b3Igb2YgdGhpcyBjbGFzcyB0byBhbGxvY2F0ZQotICAvLy8gaXRzIG9iamVjdHMgaW4gcGVybWFuZW50IG1lbW9yeSwgbm90IHdpdGggdGhlIGdhcmJhZ2UgY29sbGVjdG9yLgotICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHN6LCBtdm06OkJ1bXBQdHJBbGxvY2F0b3ImIGFsbG9jYXRvciwgc2ludDMyIG4pIHsKLSAgICByZXR1cm4gYWxsb2NhdG9yLkFsbG9jYXRlKHNpemVvZihVVEY4KSArIChuIC0gMSkgKiBzaXplb2YodWludDE2KSwgIlVURjgiKTsKLSAgfQotICAKLSAgVVRGOChzaW50MzIgbikgewotICAgIHNpemUgPSBuOwotICB9Ci0KLXB1YmxpYzoKLSAgLy8vIHNpemUgLSBUaGUgKGNvbnN0YW50KSBzaXplIG9mIHRoZSBhcnJheS4KLSAgc3NpemVfdCBzaXplOwotCi0gIC8vLyBlbGVtZW50cyAtIEVsZW1lbnRzIG9mIHRoaXMgYXJyYXkuIFRoZSBzaXplIGhlcmUgaXMgZGlmZmVyZW50IHRoYW4gdGhlCi0gIC8vLyBhY3R1YWwgc2l6ZSBvZiB0aGUgSmF2YSBhcnJheS4gVGhpcyBpcyB0byBmYWNpbGl0YXRlIEphdmEgYXJyYXkgYWNjZXNzZXMKLSAgLy8vIGluIEpuSlZNIGNvZGUuIFRoZSBzaXplIHNob3VsZCBiZSBzZXQgdG8gemVybywgYnV0IHRoaXMgaXMgaW52YWxpZCBDOTkuCi0gIHVpbnQxNiBlbGVtZW50c1sxXTsKLSAgCi0gIC8vLyBleHRyYWN0IC0gU2ltaWxhciwgYnV0IGNyZWF0ZXMgaXQgaW4gdGhlIG1hcC4KLSAgY29uc3QgVVRGOCogZXh0cmFjdChVVEY4TWFwKiBtYXAsIHVpbnQzMiBzdGFydCwgdWludDMyIGxlbikgY29uc3Q7Ci0gCi0gIC8vLyBlcXVhbHMgLSBBcmUgdGhlIHR3byBVVEY4cyBlcXVhbD8KLSAgYm9vbCBlcXVhbHMoY29uc3QgVVRGOCogb3RoZXIpIGNvbnN0IHsKLSAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuIHRydWU7Ci0gICAgZWxzZSBpZiAoc2l6ZSAhPSBvdGhlci0+c2l6ZSkgcmV0dXJuIGZhbHNlOwotICAgIGVsc2UgcmV0dXJuICFtZW1jbXAoZWxlbWVudHMsIG90aGVyLT5lbGVtZW50cywgc2l6ZSAqIHNpemVvZih1aW50MTYpKTsKLSAgfQotICAKLSAgLy8vIGVxdWFscyAtIERvZXMgdGhlIFVURjggZXF1YWwgdG8gdGhlIGJ1ZmZlcj8gCi0gIGJvb2wgZXF1YWxzKGNvbnN0IHVpbnQxNiogYnVmLCBzaW50MzIgbGVuKSBjb25zdCB7Ci0gICAgaWYgKHNpemUgIT0gbGVuKSByZXR1cm4gZmFsc2U7Ci0gICAgZWxzZSByZXR1cm4gIW1lbWNtcChlbGVtZW50cywgYnVmLCBzaXplICogc2l6ZW9mKHVpbnQxNikpOwotICB9Ci0KLSAgLy8vIGxlc3NUaGFuIC0gc3RyY21wLWxpa2UgZnVuY3Rpb24gZm9yIFVURjhzLCB1c2VkIGJ5IGhhc2ggdGFibGVzLgotICBib29sIGxlc3NUaGFuKGNvbnN0IFVURjgqIG90aGVyKSBjb25zdCB7Ci0gICAgaWYgKHNpemUgPCBvdGhlci0+c2l6ZSkgcmV0dXJuIHRydWU7Ci0gICAgZWxzZSBpZiAoc2l6ZSA+IG90aGVyLT5zaXplKSByZXR1cm4gZmFsc2U7Ci0gICAgZWxzZSByZXR1cm4gbWVtY21wKChjb25zdCBjaGFyKillbGVtZW50cywgKGNvbnN0IGNoYXIqKW90aGVyLT5lbGVtZW50cywgCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemUgKiBzaXplb2YodWludDE2KSkgPCAwOwotICB9Ci0KLQlzdGF0aWMgdWludDMyX3QgcmVhZGVySGFzaGVyKGNvbnN0IHVpbnQxNiogYnVmLCBzaW50MzIgc2l6ZSk7Ci0JCi0JdWludDMyX3QgaGFzaCgpIGNvbnN0IHsKLQkJcmV0dXJuIHJlYWRlckhhc2hlcihlbGVtZW50cywgc2l6ZSk7Ci0JfQotCi19OwotCi0KLWNsYXNzIFVURjhNYXAgOiBwdWJsaWMgbXZtOjpQZXJtYW5lbnRPYmplY3QgewotcHJpdmF0ZToKLSAgdHlwZWRlZiBzdGQ6Om11bHRpbWFwPGNvbnN0IHVpbnQzMiwgY29uc3QgVVRGOCo+OjppdGVyYXRvciBpdGVyYXRvcjsKLSAgCi0gIG12bTo6TG9ja05vcm1hbCBsb2NrOwotICBtdm06OkJ1bXBQdHJBbGxvY2F0b3ImIGFsbG9jYXRvcjsKLSAgc3RkOjptdWx0aW1hcDxjb25zdCB1aW50MzIsIGNvbnN0IFVURjgqPiBtYXA7Ci1wdWJsaWM6Ci0KLSAgY29uc3QgVVRGOCogbG9va3VwT3JDcmVhdGVBc2NpaXooY29uc3QgY2hhciogYXNjaWl6KTsgCi0gIGNvbnN0IFVURjgqIGxvb2t1cE9yQ3JlYXRlUmVhZGVyKGNvbnN0IHVpbnQxNiogYnVmLCB1aW50MzIgc2l6ZSk7Ci0gIGNvbnN0IFVURjgqIGxvb2t1cEFzY2lpeihjb25zdCBjaGFyKiBhc2NpaXopOyAKLSAgY29uc3QgVVRGOCogbG9va3VwUmVhZGVyKGNvbnN0IHVpbnQxNiogYnVmLCB1aW50MzIgc2l6ZSk7Ci0gIAotICBVVEY4TWFwKG12bTo6QnVtcFB0ckFsbG9jYXRvciYgQSkgOiBhbGxvY2F0b3IoQSkge30KLQotICB+VVRGOE1hcCgpIHsKLSAgICBmb3IgKGl0ZXJhdG9yIGkgPSBtYXAuYmVnaW4oKSwgZSA9IG1hcC5lbmQoKTsgaSE9IGU7ICsraSkgewotICAgICAgYWxsb2NhdG9yLkRlYWxsb2NhdGUoKHZvaWQqKWktPnNlY29uZCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBjb3B5KFVURjhNYXAqIG5ld01hcCkgewotICAgIGZvciAoaXRlcmF0b3IgaSA9IG1hcC5iZWdpbigpLCBlID0gbWFwLmVuZCgpOyBpIT0gZTsgKytpKSB7Ci0gICAgICBuZXdNYXAtPm1hcC5pbnNlcnQoKmkpOwotICAgIH0KLSAgfQotICAKLSAgdm9pZCByZXBsYWNlKGNvbnN0IFVURjgqIG9sZFVURjgsIGNvbnN0IFVURjgqIG5ld1VURjgpOwotICB2b2lkIGluc2VydChjb25zdCBVVEY4KiB2YWwpOwotfTsKLQotfSAvLyBlbmQgbmFtZXNwYWNlIG12bQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2luY2x1ZGUvbXZtL1ZNS2l0LmggYi92bWtpdC9pbmNsdWRlL212bS9WTUtpdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzkyNjAwLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2luY2x1ZGUvbXZtL1ZNS2l0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotI2lmbmRlZiBfVk1LSVRfSF8KLSNkZWZpbmUgX1ZNS0lUX0hfCi0KLSNpbmNsdWRlICJtdm0vQWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAibXZtL1RocmVhZHMvQ29sbGVjdGlvblJWLmgiCi0jaW5jbHVkZSAibXZtL1ZpcnR1YWxNYWNoaW5lLmgiCi0KLSNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCi0KLW5hbWVzcGFjZSBsbHZtIHsKLSAgY2xhc3MgTW9kdWxlOwotICBjbGFzcyBUYXJnZXRNYWNoaW5lOwotfQotCi1uYW1lc3BhY2UgbXZtIHsKLWNsYXNzIE1ldGhvZEluZm87Ci1jbGFzcyBWTUtpdDsKLWNsYXNzIGdjOwotY2xhc3MgRmluYWxpemVyVGhyZWFkOwotY2xhc3MgUmVmZXJlbmNlVGhyZWFkOwotCi1jbGFzcyBGdW5jdGlvbk1hcCB7Ci1wdWJsaWM6Ci0gIC8vLyBGdW5jdGlvbnMgLSBNYXAgb2YgYXBwbGljYXRpdmUgbWV0aG9kcyB0byBmdW5jdGlvbiBwb2ludGVycy4gVGhpcyBtYXAgaXMKLSAgLy8vIHVzZWQgd2hlbiB3YWxraW5nIHRoZSBzdGFjayBzbyB0aGF0IFZNS2l0IGtub3dzIHdoaWNoIGFwcGxpY2F0aXZlIG1ldGhvZAotICAvLy8gaXMgZXhlY3V0aW5nIG9uIHRoZSBzdGFjay4KLSAgLy8vCi0gIHN0ZDo6bWFwPHZvaWQqLCBNZXRob2RJbmZvKj4gRnVuY3Rpb25zOwotCi0gIC8vLyBGdW5jdGlvbk1hcExvY2sgLSBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgRnVuY3Rpb25zIG1hcC4KLSAgLy8vCi0gIG12bTo6U3BpbkxvY2sgRnVuY3Rpb25NYXBMb2NrOwotCi0gIC8vLyBJUFRvTWV0aG9kSW5mbyAtIE1hcCBhIGNvZGUgc3RhcnQgaW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb24gdG8gdGhlIE1ldGhvZEluZm8uCi0gIC8vLwotICBNZXRob2RJbmZvKiBJUFRvTWV0aG9kSW5mbyh2b2lkKiBpcCk7Ci0KLSAgLy8vIGFkZE1ldGhvZEluZm8gLSBBIG5ldyBpbnN0cnVjdGlvbiBwb2ludGVyIGluIHRoZSBmdW5jdGlvbiBtYXAuCi0gIC8vLwotICB2b2lkIGFkZE1ldGhvZEluZm8oTWV0aG9kSW5mbyogbWV0aCwgdm9pZCogaXApOwotCi0gIC8vLyByZW1vdmVNZXRob2RJbmZvcyAtIFJlbW92ZSBhbGwgTWV0aG9kSW5mbyBvd25lZCBieSB0aGUgZ2l2ZW4gb3duZXIuCi0gIHZvaWQgcmVtb3ZlTWV0aG9kSW5mb3Modm9pZCogb3duZXIpOwotCi0gIEZ1bmN0aW9uTWFwKCk7Ci19OwotCi0KLWNsYXNzIE5vbkRhZW1vblRocmVhZE1hbmFnZXIgewotCWZyaWVuZCBjbGFzcyBUaHJlYWQ7Ci1wdWJsaWM6Ci0JTm9uRGFlbW9uVGhyZWFkTWFuYWdlcigpIHsgbm9uRGFlbW9uVGhyZWFkcyA9IDA7IH0KLQotcHJpdmF0ZToKLSAgLy8vIG5vbkRhZW1vblRocmVhZHMgLSBOdW1iZXIgb2YgdGhyZWFkcyBpbiB0aGUgc3lzdGVtIHRoYXQgYXJlIG5vdCBkYWVtb24KLSAgLy8vIHRocmVhZHMuCi0gIC8vCi0gIHVpbnQxNiBub25EYWVtb25UaHJlYWRzOwotCi0gIC8vLyBub25EYWVtb25Mb2NrIC0gUHJvdGVjdGlvbiBsb2NrIGZvciB0aGUgbm9uRGFlbW9uVGhyZWFkcyB2YXJpYWJsZS4KLSAgLy8vCi0gIG12bTo6TG9ja05vcm1hbCBub25EYWVtb25Mb2NrOwotCi0gIC8vLyBub25EYWVtb25WYXIgLSBDb25kaXRpb24gdmFyaWFibGUgdG8gd2FrZSB1cCB0aGUgaW5pdGlhbCB0aHJlYWQgd2hlbiBpdAotICAvLy8gd2FpdHMgZm9yIG90aGVyIG5vbi1kYWVtb24gdGhyZWFkcyB0byBlbmQuIFRoZSBub24tZGFlbW9uIHRocmVhZCB0aGF0Ci0gIC8vLyBkZWNyZW1lbnRzIHRoZSBub25EYWVtb25UaHJlYWRzIHZhcmlhYmxlIHRvIHplcm8gd2FrZXMgdXAgdGhlIGluaXRpYWwKLSAgLy8vIHRocmVhZC4KLSAgLy8vCi0gIG12bTo6Q29uZCBub25EYWVtb25WYXI7Ci0gIAotICAvLy8gbGVhdmUgLSBBIHRocmVhZCBjYWxscyB0aGlzIGZ1bmN0aW9uIHdoZW4gaXQgbGVhdmVzIHRoZSB0aHJlYWQgc3lzdGVtLgotICAvLy8KLSAgdm9pZCBsZWF2ZU5vbkRhZW1vbk1vZGUoKTsKLQotICAvLy8gZW50ZXIgLSBBIHRocmVhZCBjYWxscyB0aGlzIGZ1bmN0aW9uIHdoZW4gaXQgZW50ZXJzIHRoZSB0aHJlYWQgc3lzdGVtLgotICAvLy8KLSAgdm9pZCBlbnRlck5vbkRhZW1vbk1vZGUoKTsKLQotcHVibGljOgotCXZvaWQgd2FpdE5vbkRhZW1vblRocmVhZHMoKTsKLX07Ci0KLWNsYXNzIFZNS2l0IDogcHVibGljIG12bTo6UGVybWFuZW50T2JqZWN0IHsKLXB1YmxpYzoKLSAgLy8vIGFsbG9jYXRvciAtIEJ1bXAgcG9pbnRlciBhbGxvY2F0b3IgdG8gYWxsb2NhdGUgcGVybWFuZW50IG1lbW9yeSBvZiBWTUtpdAotICBtdm06OkJ1bXBQdHJBbGxvY2F0b3ImIGFsbG9jYXRvcjsKLQotCS8vIGluaXRpYWxpc2UgLSBpbml0aWFsaXNlIHZta2l0LiBJZiBuZXZlciBjYWxsZWQsIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBmaXJzdCBjb25zdHJ1Y3RvciBvZiB2bWtpdAotCXN0YXRpYyB2b2lkIGluaXRpYWxpc2UobGx2bTo6Q29kZUdlbk9wdDo6TGV2ZWwgPSBsbHZtOjpDb2RlR2VuT3B0OjpEZWZhdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Ok1vZHVsZSogVGhlTW9kdWxlID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpUYXJnZXRNYWNoaW5lKiBUaGVUYXJnZXQgPSAwKTsKLQotICBWTUtpdChtdm06OkJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jKTsKLQotCUxvY2tSZWN1cnNpdmUgICAgICAgICAgICAgICAgX3Zta2l0TG9jazsKLQotCXZvaWQgdm1raXRMb2NrKCkgeyBfdm1raXRMb2NrLmxvY2soKTsgfQotCXZvaWQgdm1raXRVbmxvY2soKSB7IF92bWtpdExvY2sudW5sb2NrKCk7IH0KLQotCS8vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vLwotCS8vLyAtLS0gICAgICAgICAgICAgdm0gbWFuYWdtZW50ICAgICAgICAgICAgICAgICAgLS0tIC8vLwotCS8vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vLwotCS8vIHZtcyAtIHRoZSBsaXN0IG9mIHZtcy4gCi0JLy8gICAgICAgc3luY2hyb25pemVkIHdpdGggdm1raXRMb2NrCi0JVmlydHVhbE1hY2hpbmUqKiAgICAgICAgICAgICB2bXM7Ci0Jc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICB2bXNBcnJheVNpemU7Ci0KLQlzaXplX3QgYWRkVk0oVmlydHVhbE1hY2hpbmUqIHZtKTsKLQl2b2lkICAgcmVtb3ZlVk0oc2l6ZV90IGlkKTsKLQotCS8vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vLwotCS8vLyAtLS0gICAgICAgICAgICAgdGhyZWFkIG1hbmFnbWVudCAgICAgICAgICAgICAgLS0tIC8vLwotCS8vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vLwotICAvLy8gcHJlcGFyZWRUaHJlYWRzIC0gdGhlIGxpc3Qgb2YgcHJlcGFyZWQgdGhyZWFkcywgdGhleSBhcmUgbm90IHlldCBydW5uaW5nLgotCS8vLyAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgd2l0aCB2bWtpdExvY2sKLSAgLy8vCi0JQ2lyY3VsYXJCYXNlPFRocmVhZD4gICAgICAgICBwcmVwYXJlZFRocmVhZHM7Ci0KLSAgLy8vIHJ1bm5pbmdUaHJlYWRzIC0gdGhlIGxpc3Qgb2YgcnVubmluZyB0aHJlYWRzCi0JLy8vICAgICAgICAgICAgICAgICAgc3luY2hyb25pemUgd2l0aCB2bWtpdExvY2sKLSAgLy8vCi0JQ2lyY3VsYXJCYXNlPFRocmVhZD4gICAgICAgICBydW5uaW5nVGhyZWFkczsKLQotICAvLy8gbnVtYmVyT2ZSdW5uaW5nVGhyZWFkcyAtIFRoZSBudW1iZXIgb2YgdGhyZWFkcyB0aGF0IGN1cnJlbnRseSBydW4gdW5kZXIgdGhpcyBWTS4KLQkvLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCB3aXRoIHZta2l0TG9jawotCS8vLwotICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgIG51bWJlck9mUnVubmluZ1RocmVhZHM7Ci0KLQkvLyBub25EYWVtb25UaHJlYWRzTWFuYWdlciAtIG1hbmFnZXIgb2YgdGhlIG5vbiBkYWVtb24gdGhyZWFkcwotCU5vbkRhZW1vblRocmVhZE1hbmFnZXIgICAgICAgbm9uRGFlbW9uVGhyZWFkc01hbmFnZXI7Ci0KLQl2b2lkIHJlZ2lzdGVyUHJlcGFyZWRUaHJlYWQobXZtOjpUaHJlYWQqIHRoKTsgIAotCXZvaWQgdW5yZWdpc3RlclByZXBhcmVkVGhyZWFkKG12bTo6VGhyZWFkKiB0aCk7Ci0KLQl2b2lkIHJlZ2lzdGVyUnVubmluZ1RocmVhZChtdm06OlRocmVhZCogdGgpOyAgCi0Jdm9pZCB1bnJlZ2lzdGVyUnVubmluZ1RocmVhZChtdm06OlRocmVhZCogdGgpOwotCi0Jdm9pZCB3YWl0Tm9uRGFlbW9uVGhyZWFkcygpOwotCi0JLy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy8vCi0JLy8vIC0tLSAgICAgICAgICAgICBtZW1vcnkgbWFuYWdtZW50ICAgICAgICAgICAgICAtLS0gLy8vCi0JLy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy8vCi0gIC8vLyByZW5kZXp2b3VzIC0gVGhlIHJlbmRlenZvdXMgaW1wbGVtZW50YXRpb24gZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi4KLSAgLy8vCi0jaWZkZWYgV0lUSF9MTFZNX0dDQwotICBDb29wZXJhdGl2ZUNvbGxlY3Rpb25SViAgICAgIHJlbmRlenZvdXM7Ci0jZWxzZQotICBVbmNvb3BlcmF0aXZlQ29sbGVjdGlvblJWICAgIHJlbmRlenZvdXM7Ci0jZW5kaWYKLQotcHJpdmF0ZToKLSAgLy8vIGVucXVldWVUaHJlYWQgLSBUaGUgdGhyZWFkIHRoYXQgZmluYWxpemVzIHJlZmVyZW5jZXMuCi0gIC8vLwotCUZpbmFsaXplclRocmVhZCogICAgICAgICAgICAgZmluYWxpemVyVGhyZWFkOwotICAKLSAgLy8vIGVucXVldWVUaHJlYWQgLSBUaGUgdGhyZWFkIHRoYXQgZW5xdWV1ZXMgcmVmZXJlbmNlcy4KLSAgLy8vCi0gIFJlZmVyZW5jZVRocmVhZCogICAgICAgICAgICAgcmVmZXJlbmNlVGhyZWFkOwotCi0gIC8vLyBnZXRBbmRBbGxvY2F0ZUZpbmFsaXplclRocmVhZCAtIGdldCB0aGUgZmluYWxpemVyIHRocmVhZCBhbmQgYWxsb2NhdGUgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QKLSAgLy8vCi0JRmluYWxpemVyVGhyZWFkKiAgICAgICAgICAgICBnZXRBbmRBbGxvY2F0ZUZpbmFsaXplclRocmVhZCgpOwotCi0gIC8vLyBnZXRBbmRBbGxvY2F0ZVJlZmVyZW5jZVRocmVhZCAtIGdldCB0aGUgcmVmZXJlbmNlIHRocmVhZCBhbmQgYWxsb2NhdGUgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QKLSAgLy8vCi0JUmVmZXJlbmNlVGhyZWFkKiAgICAgICAgICAgICBnZXRBbmRBbGxvY2F0ZVJlZmVyZW5jZVRocmVhZCgpOwotCi1wdWJsaWM6Ci0gIC8vLyBhZGRXZWFrUmVmZXJlbmNlIC0gQWRkIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIHF1ZXVlLgotICAvLy8KLSAgdm9pZCBhZGRXZWFrUmVmZXJlbmNlKG12bTo6Z2MqIHJlZik7Ci0gIAotICAvLy8gYWRkU29mdFJlZmVyZW5jZSAtIEFkZCBhIHdlYWsgcmVmZXJlbmNlIHRvIHRoZSBxdWV1ZS4KLSAgLy8vCi0gIHZvaWQgYWRkU29mdFJlZmVyZW5jZShtdm06OmdjKiByZWYpOwotICAKLSAgLy8vIGFkZFBoYW50b21SZWZlcmVuY2UgLSBBZGQgYSB3ZWFrIHJlZmVyZW5jZSB0byB0aGUgcXVldWUuCi0gIC8vLwotICB2b2lkIGFkZFBoYW50b21SZWZlcmVuY2UobXZtOjpnYyogcmVmKTsKLQotICAvLy8gYWRkRmluYWxpemF0aW9uQ2FuZGlkYXRlIC0gQWRkIGFuIG9iamVjdCB0byB0aGUgcXVldWUgb2Ygb2JqZWN0cyB3aXRoCi0gIC8vLyBhIGZpbmFsaXphdGlvbiBtZXRob2QuCi0gIC8vLwotICB2b2lkIGFkZEZpbmFsaXphdGlvbkNhbmRpZGF0ZShnYyogb2JqZWN0KTsKLQotICAvLy8gc2NhbkZpbmFsaXphdGlvblF1ZXVlIC0gU2NhbiBvYmpldHMgd2l0aCBhIGZpbmFsaXplZCBtZXRob2QgYW5kIHNjaGVkdWxlCi0gIC8vLyB0aGVtIGZvciBmaW5hbGl6YXRpb24gaWYgdGhleSBhcmUgbm90IGxpdmUuCi0gIC8vLyAKLSAgdm9pZCBzY2FuRmluYWxpemF0aW9uUXVldWUodWludHB0cl90IGNsb3N1cmUpOwotICAKLSAgLy8vIHNjYW5XZWFrUmVmZXJlbmNlc1F1ZXVlIC0gU2NhbiBhbGwgd2VhayByZWZlcmVuY2VzLiBDYWxsZWQgYnkgdGhlIEdDCi0gIC8vLyBiZWZvcmUgc2Nhbm5pbmcgdGhlIGZpbmFsaXphdGlvbiBxdWV1ZS4KLSAgLy8vIAotICB2b2lkIHNjYW5XZWFrUmVmZXJlbmNlc1F1ZXVlKHVpbnRwdHJfdCBjbG9zdXJlKTsKLSAgCi0gIC8vLyBzY2FuU29mdFJlZmVyZW5jZXNRdWV1ZSAtIFNjYW4gYWxsIHNvZnQgcmVmZXJlbmNlcy4gQ2FsbGVkIGJ5IHRoZSBHQwotICAvLy8gYmVmb3JlIHNjYW5uaW5nIHRoZSBmaW5hbGl6YXRpb24gcXVldWUuCi0gIC8vLwotICB2b2lkIHNjYW5Tb2Z0UmVmZXJlbmNlc1F1ZXVlKHVpbnRwdHJfdCBjbG9zdXJlKTsKLSAgCi0gIC8vLyBzY2FuUGhhbnRvbVJlZmVyZW5jZXNRdWV1ZSAtIFNjYW4gYWxsIHBoYW50b20gcmVmZXJlbmNlcy4gQ2FsbGVkIGJ5IHRoZSBHQwotICAvLy8gYWZ0ZXIgdGhlIGZpbmFsaXphdGlvbiBxdWV1ZS4KLSAgLy8vCi0gIHZvaWQgc2NhblBoYW50b21SZWZlcmVuY2VzUXVldWUodWludHB0cl90IGNsb3N1cmUpOwotCi0JYm9vbCBzdGFydENvbGxlY3Rpb24oKTsgLy8gMSBvaywgYmVnaW4gY29sbGVjdGlvbiwgMCBkbyBub3Qgc3RhcnQgY29sbGVjdGlvbgotCXZvaWQgZW5kQ29sbGVjdGlvbigpOwotCi0gIHZvaWQgdHJhY2VyKHVpbnRwdHJfdCBjbG9zdXJlKTsKLQotCS8vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vLwotCS8vLyAtLS0gICAgYmFja3RyYWNlIHJlbGF0ZWQgbWV0aG9kcyAgICAgICAgICAgICAgLS0tIC8vLwotCS8vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vLwotICAvLy8gRnVuY3Rpb25zQ2FjaGUgLSBjYWNoZSBvZiBjb21waWxlZCBmdW5jdGlvbnMKLQkvLyAgCi0gIEZ1bmN0aW9uTWFwIEZ1bmN0aW9uc0NhY2hlOwotCi0gIE1ldGhvZEluZm8qIElQVG9NZXRob2RJbmZvKHZvaWQqIGlwKSB7Ci0gICAgcmV0dXJuIEZ1bmN0aW9uc0NhY2hlLklQVG9NZXRob2RJbmZvKGlwKTsKLSAgfQotCi0gIHZvaWQgcmVtb3ZlTWV0aG9kSW5mb3Modm9pZCogb3duZXIpIHsKLSAgICBGdW5jdGlvbnNDYWNoZS5yZW1vdmVNZXRob2RJbmZvcyhvd25lcik7Ci0gIH0KLX07Ci0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS92bWtpdC9pbmNsdWRlL212bS9WaXJ0dWFsTWFjaGluZS5oIGIvdm1raXQvaW5jbHVkZS9tdm0vVmlydHVhbE1hY2hpbmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkYzZiOC4uMDAwMDAwMAotLS0gYS92bWtpdC9pbmNsdWRlL212bS9WaXJ0dWFsTWFjaGluZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tIFZpcnR1YWxNYWNoaW5lLmggLSBSZWdpc3RlcmluZyBhIFZNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgUGllcnJlIGV0IE1hcmllIEN1cmllIAotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgTVZNX1ZJUlRVQUxNQUNISU5FX0gKLSNkZWZpbmUgTVZNX1ZJUlRVQUxNQUNISU5FX0gKLQotI2luY2x1ZGUgIm12bS9BbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9Db2xsZWN0aW9uUlYuaCIKLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9Mb2Nrcy5oIgotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxtYXA+Ci0KLW5hbWVzcGFjZSBtdm0gewotCi0vLy8gVmlydHVhbE1hY2hpbmUgLSBUaGlzIGNsYXNzIGlzIHRoZSByb290IG9mIHZpcnR1YWwgbWFjaGluZSBjbGFzc2VzLiBJdAotLy8vIGRlZmluZXMgd2hhdCBhIFZNIHNob3VsZCBiZS4KLS8vLwotY2xhc3MgVmlydHVhbE1hY2hpbmUgOiBwdWJsaWMgbXZtOjpQZXJtYW5lbnRPYmplY3QgewotcHJpdmF0ZToKLQlmcmllbmQgY2xhc3MgVk1LaXQ7Ci0JVmlydHVhbE1hY2hpbmUobXZtOjpCdW1wUHRyQWxsb2NhdG9yICZBbGxvYykgOiBhbGxvY2F0b3IoQWxsb2MpIHt9Ci0KLXByb3RlY3RlZDoKLSAgVmlydHVhbE1hY2hpbmUobXZtOjpCdW1wUHRyQWxsb2NhdG9yICZBbGxvYywgbXZtOjpWTUtpdCogdm1rKTsKLQotcHVibGljOgotICB2aXJ0dWFsIH5WaXJ0dWFsTWFjaGluZSgpOwotCi0gIC8vLyBhbGxvY2F0b3IgLSBCdW1wIHBvaW50ZXIgYWxsb2NhdG9yIHRvIGFsbG9jYXRlIHBlcm1hbmVudCBtZW1vcnkKLSAgLy8vIHJlbGF0ZWQgdG8gdGhpcyBWTS4KLSAgLy8vCi0gIG12bTo6QnVtcFB0ckFsbG9jYXRvciYgYWxsb2NhdG9yOwotCi0JLy8vIHZta2l0IC0gYSBwb2ludGVyIHRvIHZta2l0IHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gb24gYWxsIHRoZSB2bXMKLQkvLy8KLQltdm06OlZNS2l0KiB2bWtpdDsKLQotCS8vLyB2bUlEIC0gaWQgb2YgdGhlIHZtCi0Jc2l6ZV90IHZtSUQ7Ci0KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLyAoMSkgdGhyZWFkLXJlbGF0ZWQgbWV0aG9kcy4KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0JLy8vIGJ1aWxkVk1UaHJlYWREYXRhIC0gYWxsb2NhdGUgYSBqYXZhIHRocmVhZCBmb3IgdGhlIHVuZGVybHlpbmcgbXV0YXRvci4gQ2FsbGVkIHdoZW4gdGhlIGphdmEgdGhyZWFkIGlzIGEgZm9yZWlnbiB0aHJlYWQuCi0JLy8vCi0JdmlydHVhbCBWTVRocmVhZERhdGEqIGJ1aWxkVk1UaHJlYWREYXRhKFRocmVhZCogbXV0KSB7IHJldHVybiBuZXcgVk1UaHJlYWREYXRhKHRoaXMsIG11dCk7IH0KLQotCS8vLyBydW5BcHBsaWNhdGlvbkltcGwgLSBjb2RlIGV4ZWN1dGVkIGFmdGVyIGEgcnVuQXBwbGljYXRpb24gaW4gYSB2bWtpdCB0aHJlYWQKLQkvLy8KLQl2aXJ0dWFsIHZvaWQgcnVuQXBwbGljYXRpb25JbXBsKGludCBhcmdjLCBjaGFyKiogYXJndikge30KLQotCS8vLyBydW5BcHBsaWNhdGlvbiAtIGxhdW5jaCBydW5BcHBsaWNhdGlvbkltcGwgaW4gYSB2bWtpdCB0aHJlYWQuIFRoZSB2bURhdGEgaXMgbm90IGFsbG9jYXRlZC4KLQkvLy8KLQl2b2lkIHJ1bkFwcGxpY2F0aW9uKGludCBhcmdjLCBjaGFyKiogYXJndik7Ci0KLQkvLy8gcnVuQXBwbGljYXRpb24gLSBsYXVuY2ggc3RhcnRlciBpbiBhIHZta2l0IHRocmVhZC4gVGhlIHZtRGF0YSBpcyBub3QgYWxsb2NhdGVkLgotCS8vLwotCXZvaWQgcnVuQXBwbGljYXRpb24odm9pZCAoKnN0YXJ0ZXIpKFZpcnR1YWxNYWNoaW5lKiB2bSwgaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSwgaW50IGFyZ2MsIGNoYXIqKiBhcmd2KTsKLSAgCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8gKDIpIEdDLXJlbGF0ZWQgbWV0aG9kcy4KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0gIC8vLyBzdGFydENvbGxlY3Rpb24gLSBQcmVsaW1pbmFyeSBjb2RlIGJlZm9yZSBzdGFydGluZyBhIEdDLgotICAvLy8KLSAgdmlydHVhbCB2b2lkIHN0YXJ0Q29sbGVjdGlvbigpIHt9Ci0gIAotICAvLy8gZW5kQ29sbGVjdGlvbiAtIENvZGUgYWZ0ZXIgcnVubmluZyBhIEdDLgotICAvLy8KLSAgdmlydHVhbCB2b2lkIGVuZENvbGxlY3Rpb24oKSB7fQotCi0gIC8vLyBmaW5hbGl6ZU9iamVjdCAtIGludm9rZSB0aGUgZmluYWxpemVyIG9mIGEgamF2YSBvYmplY3QKLSAgLy8vCi0JdmlydHVhbCB2b2lkIGZpbmFsaXplT2JqZWN0KG12bTo6Z2MqIG9iaikgPSAwOwotCi0gIC8vLyBnZXRSZWZlcmVudFB0ciAtIHJldHVybiB0aGUgcmVmZXJlbnQgb2YgYSByZWZlcmVuY2UKLSAgLy8vCi0JdmlydHVhbCBtdm06OmdjKiogZ2V0UmVmZXJlbnQobXZtOjpnYyogcmVmKSA9IDA7Ci0KLSAgLy8vIHNldFJlZmVyZW50UHRyIC0gc2V0IHRoZSByZWZlcmVudCBvZiBhIHJlZmVyZW5jZQotICAvLy8KLQl2aXJ0dWFsIHZvaWQgc2V0UmVmZXJlbnQobXZtOjpnYyogcmVmLCBtdm06OmdjKiB2YWwpID0gMDsKLQotICAvLy8gZW5xdWV1ZVJlZmVyZW5jZSAtIGVucXVldWUgdGhlIHJlZmVyZW5jZQotICAvLy8KLQl2aXJ0dWFsIGJvb2wgZW5xdWV1ZVJlZmVyZW5jZShtdm06OmdjKiBfb2JqKSA9IDA7Ci0KLSAgLy8vIHRyYWNlciAtIFRyYWNlIHRoaXMgdmlydHVhbCBtYWNoaW5lJ3MgR0Mtb2JqZWN0cy4gCi0JLy8vICAgIENhbGxlZCBvbmNlIGJ5IHZtLiBJZiB5b3UgaGF2ZSBHQy1vYmplY3RzIGluIGEgdGhyZWFkIHNwZWNpZmljIGRhdGEsIHJlZGVmaW5lIHRoZSB0cmFjZXIgb2YgeW91ciBWTVRocmVhZERhdGEuCi0gIC8vLwotICB2aXJ0dWFsIHZvaWQgdHJhY2VyKHVpbnRwdHJfdCBjbG9zdXJlKSB7fQotCi0gIC8vLyBnZXRPYmplY3RTaXplIC0gR2V0IHRoZSBzaXplIG9mIHRoaXMgb2JqZWN0LiBVc2VkIGJ5IGNvcHlpbmcgY29sbGVjdG9ycy4KLSAgLy8vCi0gIHZpcnR1YWwgc2l6ZV90IGdldE9iamVjdFNpemUoZ2MqIG9iamVjdCkgPSAwOwotCi0gIC8vLyBnZXRPYmplY3RUeXBlTmFtZSAtIEdldCB0aGUgdHlwZSBvZiB0aGlzIG9iamVjdC4gVXNlZCBieSB0aGUgR0MgZm9yCi0gIC8vLyBkZWJ1Z2dpbmcgcHVycG9zZXMuCi0gIC8vLwotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGdldE9iamVjdFR5cGVOYW1lKGdjKiBvYmplY3QpIHsgcmV0dXJuICJBbiBvYmplY3QiOyB9Ci0KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLyAoNCkgTGF1bmNoLXJlbGF0ZWQgbWV0aG9kcy4KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi19OwotCi19IC8vIGVuZCBuYW1lc3BhY2UgbXZtCi0jZW5kaWYgLy8gTVZNX1ZJUlRVQUxNQUNISU5FX0gKZGlmZiAtLWdpdCBhL3Zta2l0L2luY2x1ZGUvdHlwZXMuaCBiL3Zta2l0L2luY2x1ZGUvdHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNlZjA1Yi4uMDAwMDAwMAotLS0gYS92bWtpdC9pbmNsdWRlL3R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0gdHlwZXMuaCAtIGJpdHNpemVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZNCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgVFlQRVNfSAotI2RlZmluZSBUWVBFU19ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotdHlwZWRlZiB1aW50OF90IHVpbnQ4OwotdHlwZWRlZiBpbnQ4X3Qgc2ludDg7Ci10eXBlZGVmIHVpbnQxNl90IHVpbnQxNjsKLXR5cGVkZWYgaW50MTZfdCBzaW50MTY7Ci10eXBlZGVmIHVpbnQzMl90IHVpbnQzMjsKLXR5cGVkZWYgaW50MzJfdCBzaW50MzI7Ci10eXBlZGVmIHVpbnQ2NF90IHVpbnQ2NDsKLXR5cGVkZWYgaW50NjRfdCBzaW50NjQ7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL0ozL0NsYXNzcGF0aC9DbGFzc3BhdGguaC5pbiBiL3Zta2l0L2xpYi9KMy9DbGFzc3BhdGgvQ2xhc3NwYXRoLmguaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNzUxMGQuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL0ozL0NsYXNzcGF0aC9DbGFzc3BhdGguaC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8vPT09LS0tLS0tLS0gQ2xhc3NwYXRoLmggLSBDb25maWd1cmF0aW9uIGZvciBjbGFzc3BhdGggLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0KLSNkZWZpbmUgR05VQ2xhc3NwYXRoTGlicyAiQGNsYXNzcGF0aGxpYnNAIjsKLSNkZWZpbmUgR05VQ2xhc3NwYXRoR2xpYmogIkBjbGFzc3BhdGhnbGliakAiOwotI2RlZmluZSBHTlVDbGFzc3BhdGhWZXJzaW9uICJAY2xhc3NwYXRodmVyc2lvbkAiOwotCi0jaWZkZWYgTkFUSVZFX0pOSQotI2RlZmluZSBKTklFWFBPUlQKLSNlbHNlCi0jaW5jbHVkZSA8am5pLmg+Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9KMy9DbGFzc3BhdGgvQ2xhc3NwYXRoLmluYyBiL3Zta2l0L2xpYi9KMy9DbGFzc3BhdGgvQ2xhc3NwYXRoLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ2MTc0Yy4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvSjMvQ2xhc3NwYXRoL0NsYXNzcGF0aC5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotLy89PT0tLS0tLS0tLSBDbGFzc3BhdGguY3BwIC0gQ29uZmlndXJhdGlvbiBmb3IgY2xhc3NwYXRoIC0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotCi0KLSNpbmNsdWRlICJDbGFzc3BhdGguaCIKLSNpbmNsdWRlICJDbGFzc3BhdGhSZWZsZWN0LmgiCi0jaW5jbHVkZSAiSmF2YUNsYXNzLmgiCi0jaW5jbHVkZSAiSmF2YVRocmVhZC5oIgotI2luY2x1ZGUgIkphdmFVcGNhbGxzLmgiCi0jaW5jbHVkZSAiSm5qdm0uaCIKLQotCi11c2luZyBuYW1lc3BhY2UgajM7Ci0KLWV4dGVybiAiQyIgewotCi0vLyBEZWZpbmUgaGFzQ2xhc3NJbml0aWFsaXplciBiZWNhdXNlIG9mIGEgYnVnZ3kgaW1wbGVtZW50YXRpb24gaW4gQ2xhc3NwYXRoLgotSk5JRVhQT1JUIGJvb2wgSk5JQ0FMTCBKYXZhX2phdmFfaW9fVk1PYmplY3RTdHJlYW1DbGFzc19oYXNDbGFzc0luaXRpYWxpemVyKAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotamNsYXNzIGNsYXp6LAotI2VuZGlmCi1KYXZhT2JqZWN0KiBDbCkgewotICAKLSAgbGx2bV9nY3Jvb3QoQ2wsIDApOwotICBib29sIHJlcyA9IGZhbHNlOwotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0KLSAgdmVyaWZ5TnVsbChDbCk7Ci0gIEpuanZtKiB2bSA9IEphdmFUaHJlYWQ6OmdldCgpLT5nZXRKVk0oKTsKLSAgVXNlckNvbW1vbkNsYXNzKiBjbCA9IFVzZXJDb21tb25DbGFzczo6cmVzb2x2ZWRJbXBsQ2xhc3MoQ2wsIHRydWUpOwotICAKLSAgaWYgKGNsLT5pc0NsYXNzKCkgJiYgCi0gICAgICBjbC0+YXNDbGFzcygpLT5sb29rdXBNZXRob2REb250VGhyb3codm0tPnVwY2FsbHMtPmNsaW5pdE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0tPnVwY2FsbHMtPmNsaW5pdFR5cGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGZhbHNlLCAwKSkKLSAgcmVzID0gdHJ1ZTsKLQotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotCi0gIHJldHVybiByZXM7Ci19Ci0KLQotLy8gUmVkZWZpbmUgc29tZSBWTU9iamVjdFN0cmVhbUNsYXNzIGZ1bmN0aW9ucyBiZWNhdXNlIG9mIGEgc2xvdyBpbXBsZW1lbnRhdGlvbgotLy8gaW4gQ2xhc3NwYXRoLgotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfamF2YV9pb19WTU9iamVjdFN0cmVhbUNsYXNzX3NldEJvb2xlYW5OYXRpdmUoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsCi1qY2xhc3MgY2xhenosCi0jZW5kaWYKLUphdmFPYmplY3RGaWVsZCogRmllbGQsIEphdmFPYmplY3QqIG9iaiwgamJvb2xlYW4gdmFsKSB7Ci0KLSAgbGx2bV9nY3Jvb3QoRmllbGQsIDApOwotICBsbHZtX2djcm9vdChvYmosIDApOwotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0KLSAgdmVyaWZ5TnVsbChvYmopOwotICBKYXZhRmllbGQqIGZpZWxkID0gSmF2YU9iamVjdEZpZWxkOjpnZXRJbnRlcm5hbEZpZWxkKEZpZWxkKTsKLSAgZmllbGQtPnNldEluc3RhbmNlSW50OEZpZWxkKG9iaiwgKHVpbnQ4KXZhbCk7Ci0KLSAgRU5EX05BVElWRV9FWENFUFRJT04KLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2phdmFfaW9fVk1PYmplY3RTdHJlYW1DbGFzc19zZXRCeXRlTmF0aXZlKAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotamNsYXNzIGNsYXp6LAotI2VuZGlmCi1KYXZhT2JqZWN0RmllbGQqIEZpZWxkLCBKYXZhT2JqZWN0KiBvYmosIGpieXRlIHZhbCkgewotCi0gIGxsdm1fZ2Nyb290KEZpZWxkLCAwKTsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotCi0gIHZlcmlmeU51bGwob2JqKTsKLSAgSmF2YUZpZWxkKiBmaWVsZCA9IEphdmFPYmplY3RGaWVsZDo6Z2V0SW50ZXJuYWxGaWVsZChGaWVsZCk7Ci0gIGZpZWxkLT5zZXRJbnN0YW5jZUludDhGaWVsZChvYmosICh1aW50OCl2YWwpOwotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi19Ci0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9qYXZhX2lvX1ZNT2JqZWN0U3RyZWFtQ2xhc3Nfc2V0Q2hhck5hdGl2ZSgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLWpjbGFzcyBjbGF6eiwKLSNlbmRpZgotSmF2YU9iamVjdEZpZWxkKiBGaWVsZCwgSmF2YU9iamVjdCogb2JqLCBqY2hhciB2YWwpIHsKLQotICBsbHZtX2djcm9vdChGaWVsZCwgMCk7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLQotICB2ZXJpZnlOdWxsKG9iaik7Ci0gIEphdmFGaWVsZCogZmllbGQgPSBKYXZhT2JqZWN0RmllbGQ6OmdldEludGVybmFsRmllbGQoRmllbGQpOwotICBmaWVsZC0+c2V0SW5zdGFuY2VJbnQxNkZpZWxkKChKYXZhT2JqZWN0KilvYmosICh1aW50MTYpdmFsKTsKLQotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotfQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfamF2YV9pb19WTU9iamVjdFN0cmVhbUNsYXNzX3NldFNob3J0TmF0aXZlKAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotamNsYXNzIGNsYXp6LAotI2VuZGlmCi1KYXZhT2JqZWN0RmllbGQqIEZpZWxkLCBKYXZhT2JqZWN0KiBvYmosIGpzaG9ydCB2YWwpIHsKLSAgCi0gIGxsdm1fZ2Nyb290KEZpZWxkLCAwKTsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotICAKLSAgdmVyaWZ5TnVsbChvYmopOwotICBKYXZhRmllbGQqIGZpZWxkID0gSmF2YU9iamVjdEZpZWxkOjpnZXRJbnRlcm5hbEZpZWxkKEZpZWxkKTsKLSAgZmllbGQtPnNldEluc3RhbmNlSW50MTZGaWVsZChvYmosIChzaW50MTYpdmFsKTsKLSAgCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi19Ci0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9qYXZhX2lvX1ZNT2JqZWN0U3RyZWFtQ2xhc3Nfc2V0SW50TmF0aXZlKAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotamNsYXNzIGNsYXp6LAotI2VuZGlmCi1KYXZhT2JqZWN0RmllbGQqIEZpZWxkLCBKYXZhT2JqZWN0KiBvYmosIGppbnQgdmFsKSB7Ci0gIAotICBsbHZtX2djcm9vdChGaWVsZCwgMCk7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLSAgCi0gIHZlcmlmeU51bGwob2JqKTsKLSAgSmF2YUZpZWxkKiBmaWVsZCA9IEphdmFPYmplY3RGaWVsZDo6Z2V0SW50ZXJuYWxGaWVsZChGaWVsZCk7Ci0gIGZpZWxkLT5zZXRJbnN0YW5jZUludDMyRmllbGQob2JqLCAoc2ludDMyKXZhbCk7Ci0KLSAgRU5EX05BVElWRV9FWENFUFRJT04KLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2phdmFfaW9fVk1PYmplY3RTdHJlYW1DbGFzc19zZXRMb25nTmF0aXZlKAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotamNsYXNzIGNsYXp6LAotI2VuZGlmCi1KYXZhT2JqZWN0RmllbGQqIEZpZWxkLCBKYXZhT2JqZWN0KiBvYmosIGpsb25nIHZhbCkgewotICAKLSAgbGx2bV9nY3Jvb3QoRmllbGQsIDApOwotICBsbHZtX2djcm9vdChvYmosIDApOwotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0gIAotICB2ZXJpZnlOdWxsKG9iaik7Ci0gIEphdmFGaWVsZCogZmllbGQgPSBKYXZhT2JqZWN0RmllbGQ6OmdldEludGVybmFsRmllbGQoRmllbGQpOwotICBmaWVsZC0+c2V0SW5zdGFuY2VMb25nRmllbGQob2JqLCAoc2ludDY0KXZhbCk7Ci0gIAotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotfQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfamF2YV9pb19WTU9iamVjdFN0cmVhbUNsYXNzX3NldEZsb2F0TmF0aXZlKAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotamNsYXNzIGNsYXp6LAotI2VuZGlmCi1KYXZhT2JqZWN0RmllbGQqIEZpZWxkLCBKYXZhT2JqZWN0KiBvYmosIGpmbG9hdCB2YWwpIHsKLSAgCi0gIGxsdm1fZ2Nyb290KEZpZWxkLCAwKTsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotICAKLSAgdmVyaWZ5TnVsbChvYmopOwotICBKYXZhRmllbGQqIGZpZWxkID0gSmF2YU9iamVjdEZpZWxkOjpnZXRJbnRlcm5hbEZpZWxkKEZpZWxkKTsKLSAgZmllbGQtPnNldEluc3RhbmNlRmxvYXRGaWVsZChvYmosIChmbG9hdCl2YWwpOwotICAKLSAgRU5EX05BVElWRV9FWENFUFRJT04KLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2phdmFfaW9fVk1PYmplY3RTdHJlYW1DbGFzc19zZXREb3VibGVOYXRpdmUoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsCi1qY2xhc3MgY2xhenosCi0jZW5kaWYKLUphdmFPYmplY3RGaWVsZCogRmllbGQsIEphdmFPYmplY3QqIG9iaiwgamRvdWJsZSB2YWwpIHsKLSAgCi0gIGxsdm1fZ2Nyb290KEZpZWxkLCAwKTsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotICAKLSAgdmVyaWZ5TnVsbChvYmopOwotICBKYXZhRmllbGQqIGZpZWxkID0gSmF2YU9iamVjdEZpZWxkOjpnZXRJbnRlcm5hbEZpZWxkKEZpZWxkKTsKLSAgZmllbGQtPnNldEluc3RhbmNlRG91YmxlRmllbGQob2JqLCAoZG91YmxlKXZhbCk7Ci0KLSAgRU5EX05BVElWRV9FWENFUFRJT04KLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2phdmFfaW9fVk1PYmplY3RTdHJlYW1DbGFzc19zZXRPYmplY3ROYXRpdmUoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsCi1qY2xhc3MgY2xhenosCi0jZW5kaWYKLUphdmFPYmplY3RGaWVsZCogRmllbGQsIEphdmFPYmplY3QqIG9iaiwgSmF2YU9iamVjdCogdmFsKSB7Ci0gIAotICBsbHZtX2djcm9vdChGaWVsZCwgMCk7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gIGxsdm1fZ2Nyb290KHZhbCwgMCk7Ci0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLSAgCi0gIHZlcmlmeU51bGwob2JqKTsKLSAgSmF2YUZpZWxkKiBmaWVsZCA9IEphdmFPYmplY3RGaWVsZDo6Z2V0SW50ZXJuYWxGaWVsZChGaWVsZCk7Ci0gIGZpZWxkLT5zZXRJbnN0YW5jZU9iamVjdEZpZWxkKG9iaiwgdmFsKTsKLQotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotfQotCi1KTklFWFBPUlQgSmF2YU9iamVjdCogSk5JQ0FMTCBKYXZhX2phdmFfaW9fVk1PYmplY3RJbnB1dFN0cmVhbV9hbGxvY2F0ZU9iamVjdCgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLWpjbGFzcyBjbGF6eiwKLSNlbmRpZgotSmF2YU9iamVjdCogdGFyZ2V0LCBKYXZhT2JqZWN0KiBjb25zdHIsIEphdmFPYmplY3RDb25zdHJ1Y3RvciogY29ucykgewotICAKLSAgSmF2YU9iamVjdCogcmVzID0gMDsKLSAgbGx2bV9nY3Jvb3QocmVzLCAwKTsKLSAgbGx2bV9nY3Jvb3QodGFyZ2V0LCAwKTsKLSAgbGx2bV9nY3Jvb3QoY29uc3RyLCAwKTsKLSAgbGx2bV9nY3Jvb3QoY29ucywgMCk7Ci0KLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotICAKLSAgVXNlckNsYXNzKiBjbCA9IAotICAgIChVc2VyQ2xhc3MqKVVzZXJDb21tb25DbGFzczo6cmVzb2x2ZWRJbXBsQ2xhc3ModGFyZ2V0LCB0cnVlKTsKLSAgcmVzID0gY2wtPmRvTmV3KCk7Ci0gIEphdmFNZXRob2QqIG1ldGggPSBKYXZhT2JqZWN0Q29uc3RydWN0b3I6OmdldEludGVybmFsTWV0aG9kKGNvbnMpOwotICBtZXRoLT5pbnZva2VJbnRTcGVjaWFsKGNsLCByZXMpOwotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLSAgcmV0dXJuIHJlczsKLX0KLQotSk5JRVhQT1JUIEphdmFPYmplY3QqIEpOSUNBTEwgSmF2YV9qYXZhX2xhbmdfcmVmbGVjdF9WTUFycmF5X2NyZWF0ZU9iamVjdEFycmF5KAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqIGVudiwKLWpjbGFzcyB0aGlzQ2xhc3MsCi0jZW5kaWYKLUphdmFPYmplY3QqIGFycmF5VHlwZSwgamludCBhcnJheUxlbmd0aCkgewotCi0gIEphdmFPYmplY3QqIHJlcyA9IDA7Ci0gIGxsdm1fZ2Nyb290KGFycmF5VHlwZSwgMCk7Ci0gIGxsdm1fZ2Nyb290KHJlcywgMCk7Ci0KLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotICAKLSAgVXNlckNvbW1vbkNsYXNzKiBiYXNlID0gCi0gICAgVXNlckNvbW1vbkNsYXNzOjpyZXNvbHZlZEltcGxDbGFzcyhhcnJheVR5cGUsIHRydWUpOwotICBKbmp2bUNsYXNzTG9hZGVyKiBsb2FkZXIgPSBiYXNlLT5jbGFzc0xvYWRlcjsKLSAgY29uc3QgVVRGOCogbmFtZSA9IGJhc2UtPmdldE5hbWUoKTsKLSAgY29uc3QgVVRGOCogYXJyYXlOYW1lID0gbG9hZGVyLT5jb25zdHJ1Y3RBcnJheU5hbWUoMSwgbmFtZSk7Ci0gIFVzZXJDbGFzc0FycmF5KiBhcnJheSA9IGxvYWRlci0+Y29uc3RydWN0QXJyYXkoYXJyYXlOYW1lLCBiYXNlKTsKLSAgcmVzID0gYXJyYXktPmRvTmV3KGFycmF5TGVuZ3RoKTsKLQotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotCi0gIHJldHVybiByZXM7Ci19Ci0KLQotLy8gTmV2ZXIgdGhyb3dzLgotSk5JRVhQT1JUIAotYm9vbCBKTklDQUxMIEphdmFfamF2YV91dGlsX2NvbmN1cnJlbnRfYXRvbWljX0F0b21pY0xvbmdfVk1TdXBwb3J0c0NTOCgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLWpjbGFzcyBjbGF6eiwKLSNlbmRpZgotKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLy8gTmV2ZXIgdGhyb3dzLgotSk5JRVhQT1JUIGJvb2wgSk5JQ0FMTCBKYXZhX3N1bl9taXNjX1Vuc2FmZV9jb21wYXJlQW5kU3dhcExvbmcoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsIAotI2VuZGlmCi1KYXZhT2JqZWN0KiB1bnNhZmUsIEphdmFPYmplY3QqIG9iaiwgamxvbmcgb2Zmc2V0LCBqbG9uZyBleHBlY3QsIGpsb25nIHVwZGF0ZSkgewotCi0gIGxsdm1fZ2Nyb290KHVuc2FmZSwgMCk7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gIGpsb25nICpwdHI7IAotICBqbG9uZyAgdmFsdWU7Ci0KLSAgcHRyID0gKGpsb25nICopICgoKHVpbnQ4ICopIG9iaikgKyBvZmZzZXQpOwotCi0gIHZhbHVlID0gKnB0cjsKLQotICBpZiAodmFsdWUgPT0gZXhwZWN0KSB7Ci0gICAgKnB0ciA9IHVwZGF0ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotfQotCi0vLyBOZXZlciB0aHJvd3MuCi1KTklFWFBPUlQgYm9vbCBKTklDQUxMIEphdmFfc3VuX21pc2NfVW5zYWZlX2NvbXBhcmVBbmRTd2FwSW50KAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LCAKLSNlbmRpZgotSmF2YU9iamVjdCogdW5zYWZlLCBKYXZhT2JqZWN0KiBvYmosIGpsb25nIG9mZnNldCwgamludCBleHBlY3QsIGppbnQgdXBkYXRlKSB7Ci0KLSAgbGx2bV9nY3Jvb3QodW5zYWZlLCAwKTsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgamludCAqcHRyOyAKLQotICBwdHIgPSAoamludCAqKSAoKCh1aW50OCAqKSBvYmopICsgb2Zmc2V0KTsKLQotICByZXR1cm4gX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcChwdHIsIGV4cGVjdCwgdXBkYXRlKTsKLX0KLQotLy8gTmV2ZXIgdGhyb3dzLgotSk5JRVhQT1JUIGJvb2wgSk5JQ0FMTCBKYXZhX3N1bl9taXNjX1Vuc2FmZV9jb21wYXJlQW5kU3dhcE9iamVjdCgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwgCi0jZW5kaWYKLUphdmFPYmplY3QqIHVuc2FmZSwgSmF2YU9iamVjdCogb2JqLCBqbG9uZyBvZmZzZXQsIEphdmFPYmplY3QqIGV4cGVjdCwKLUphdmFPYmplY3QqIHVwZGF0ZSkgewotICBsbHZtX2djcm9vdCh1bnNhZmUsIDApOwotICBsbHZtX2djcm9vdChvYmosIDApOwotICBsbHZtX2djcm9vdChleHBlY3QsIDApOwotICBsbHZtX2djcm9vdCh1cGRhdGUsIDApOwotCi0gIGpvYmplY3QgKnB0cjsgCi0KLSAgcHRyID0gKGpvYmplY3QgKikgKCgodWludDggKikgb2JqKSArIG9mZnNldCk7Ci0KLSAgcmV0dXJuIF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAocHRyLCBleHBlY3QsIHVwZGF0ZSk7Ci19Ci0KLS8vIE5ldmVyIHRocm93cy4KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9zdW5fbWlzY19VbnNhZmVfcHV0T2JqZWN0Vm9sYXRpbGUoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsIAotI2VuZGlmCi1KYXZhT2JqZWN0KiB1bnNhZmUsIEphdmFPYmplY3QqIG9iaiwgamxvbmcgb2Zmc2V0LCBKYXZhT2JqZWN0KiB2YWx1ZSkgewotICBsbHZtX2djcm9vdCh1bnNhZmUsIDApOwotICBsbHZtX2djcm9vdChvYmosIDApOwotICBsbHZtX2djcm9vdCh2YWx1ZSwgMCk7Ci0KLSAgSmF2YU9iamVjdCoqIHB0cjsgCi0KLSAgcHRyID0gKEphdmFPYmplY3QqKikgKCgodWludDggKikgb2JqKSArIG9mZnNldCk7Ci0KLSAgKnB0ciA9IHZhbHVlOwotCi19Ci19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvQ2xhc3NwYXRoL0NsYXNzcGF0aENvbnN0cnVjdG9yLmluYyBiL3Zta2l0L2xpYi9KMy9DbGFzc3BhdGgvQ2xhc3NwYXRoQ29uc3RydWN0b3IuaW5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDhjYjhkLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9KMy9DbGFzc3BhdGgvQ2xhc3NwYXRoQ29uc3RydWN0b3IuaW5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8vPT09LSBDbGFzc3BhdGhDb25zdHJ1Y3Rvci5jcHAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLz09PS0tLS0tLS0tLS0tIEdOVSBjbGFzc3BhdGggamF2YS9sYW5nL3JlZmxlY3QvQ29uc3RydWN0b3IgLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLSNpbmNsdWRlICJDbGFzc3BhdGguaCIKLSNpbmNsdWRlICJDbGFzc3BhdGhSZWZsZWN0LmgiCi0jaW5jbHVkZSAiSmF2YUFycmF5LmgiCi0jaW5jbHVkZSAiSmF2YUNsYXNzLmgiCi0jaW5jbHVkZSAiSmF2YU9iamVjdC5oIgotI2luY2x1ZGUgIkphdmFUaHJlYWQuaCIKLSNpbmNsdWRlICJKYXZhVHlwZXMuaCIKLSNpbmNsdWRlICJKYXZhVXBjYWxscy5oIgotI2luY2x1ZGUgIkpuanZtLmgiCi0jaW5jbHVkZSAiSm5qdm1DbGFzc0xvYWRlci5oIgotCi11c2luZyBuYW1lc3BhY2UgajM7Ci0KLWV4dGVybiAiQyIgewotCi1KTklFWFBPUlQgam9iamVjdCBKTklDQUxMIEphdmFfamF2YV9sYW5nX3JlZmxlY3RfQ29uc3RydWN0b3JfZ2V0UGFyYW1ldGVyVHlwZXMoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsCi0jZW5kaWYKLUphdmFPYmplY3RDb25zdHJ1Y3RvciogY29ucykgewotCi0gIEphdmFPYmplY3QqIHJlcyA9IDA7Ci0gIAotICBsbHZtX2djcm9vdChjb25zLCAwKTsKLSAgbGx2bV9nY3Jvb3QocmVzLCAwKTsKLQotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0KLSAgdmVyaWZ5TnVsbChjb25zKTsKLSAgVXNlckNsYXNzKiBjbCA9IEphdmFPYmplY3RDb25zdHJ1Y3Rvcjo6Z2V0Q2xhc3MoY29ucyk7Ci0gIEphdmFNZXRob2QqIG1ldGggPSBKYXZhT2JqZWN0Q29uc3RydWN0b3I6OmdldEludGVybmFsTWV0aG9kKGNvbnMpOwotICBKbmp2bUNsYXNzTG9hZGVyKiBsb2FkZXIgPSBjbC0+Y2xhc3NMb2FkZXI7Ci0KLSAgcmVzID0gbWV0aC0+Z2V0UGFyYW1ldGVyVHlwZXMobG9hZGVyKTsKLSAgRU5EX05BVElWRV9FWENFUFRJT04KLQotICByZXR1cm4gKGpvYmplY3QpcmVzOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfamF2YV9sYW5nX3JlZmxlY3RfQ29uc3RydWN0b3JfZ2V0TW9kaWZpZXJzSW50ZXJuYWwoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsCi0jZW5kaWYKLUphdmFPYmplY3RDb25zdHJ1Y3RvciogY29ucykgewotCi0gIGxsdm1fZ2Nyb290KGNvbnMsIDApOwotICBqaW50IHJlcyA9IDA7Ci0KLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotCi0gIHZlcmlmeU51bGwoY29ucyk7Ci0gIEphdmFNZXRob2QqIG1ldGggPSBKYXZhT2JqZWN0Q29uc3RydWN0b3I6OmdldEludGVybmFsTWV0aG9kKGNvbnMpOwotICByZXMgPSBtZXRoLT5hY2Nlc3M7Ci0KLSAgRU5EX05BVElWRV9FWENFUFRJT04KLQotICByZXR1cm4gcmVzOwotfQotCi1KYXZhT2JqZWN0KiBwcm9jZWVkQ29uc3RydWN0b3IoSmF2YU9iamVjdENvbnN0cnVjdG9yKiBjb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5T2JqZWN0KiBhcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFPYmplY3QqIENsYXp6LCBqaW50IGluZGV4KSAKLSAgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSk7Ci0gCi1KYXZhT2JqZWN0KiBwcm9jZWVkQ29uc3RydWN0b3IoSmF2YU9iamVjdENvbnN0cnVjdG9yKiBjb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5T2JqZWN0KiBhcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFPYmplY3QqIENsYXp6LCBqaW50IGluZGV4KSB7Ci0gIEphdmFPYmplY3QqIHJlcyA9IDA7Ci0JbXZtOjpnYyogZXhjcCA9IDA7Ci0JSmF2YU9iamVjdCogamV4Y3A7Ci0JCi0gIGxsdm1fZ2Nyb290KGNvbnMsIDApOwotICBsbHZtX2djcm9vdChhcmdzLCAwKTsKLSAgbGx2bV9nY3Jvb3QoQ2xhenosIDApOwotICBsbHZtX2djcm9vdChyZXMsIDApOwotICBsbHZtX2djcm9vdChleGNwLCAwKTsKLQlsbHZtX2djcm9vdChqZXhjcCwgMCk7Ci0KLSAgSmF2YU1ldGhvZCogbWV0aCA9IEphdmFPYmplY3RDb25zdHJ1Y3Rvcjo6Z2V0SW50ZXJuYWxNZXRob2QoY29ucyk7Ci0gIFVzZXJDbGFzcyogY2wgPSBKYXZhT2JqZWN0Q29uc3RydWN0b3I6OmdldENsYXNzKGNvbnMpOwotICBKbmp2bSogdm0gPSBjbC0+Y2xhc3NMb2FkZXItPnZtOwotICBzaW50MzIgbmJBcmdzID0gYXJncyA/IEFycmF5T2JqZWN0OjpnZXRTaXplKGFyZ3MpIDogMDsKLSAgU2lnbmRlZiogc2lnbiA9IG1ldGgtPmdldFNpZ25hdHVyZSgpOwotICBzaW50MzIgc2l6ZSA9IHNpZ24tPm5iQXJndW1lbnRzOwotCi0gIGlmIChpc0Fic3RyYWN0KGNsLT5hY2Nlc3MpKSB2bS0+aW5zdGFudGlhdGlvbkV4Y2VwdGlvbihjbCk7Ci0KLSAgbXZtOjpUaHJlYWRBbGxvY2F0b3IgYWxsb2NhdG9yOwotICAvLyBBbGxvY2F0ZSBhIGJ1ZmZlciB0byBzdG9yZSB0aGUgYXJndW1lbnRzLgotICBqdmFsdWUqIGJ1ZiA9IHNpemUgPyAKLSAgICAgIChqdmFsdWUqKWFsbG9jYXRvci5BbGxvY2F0ZShzaXplICogc2l6ZW9mKGp2YWx1ZSkpIDogTlVMTDsKLQotICBpZiAobmJBcmdzID09IHNpemUpIHsKLSAgICBVc2VyQ29tbW9uQ2xhc3MqIF9jbCA9IFVzZXJDb21tb25DbGFzczo6cmVzb2x2ZWRJbXBsQ2xhc3MoQ2xhenosIGZhbHNlKTsKLSAgICBVc2VyQ2xhc3MqIGNsID0gX2NsLT5hc0NsYXNzKCk7Ci0gICAgaWYgKGNsKSB7Ci0gICAgICBjbC0+aW5pdGlhbGlzZUNsYXNzKCk7Ci0gICAgICByZXMgPSBjbC0+ZG9OZXcoKTsKLSAgICAgIEphdmFPYmplY3QqKiBwdHIgPSAoSmF2YU9iamVjdCoqKUFycmF5T2JqZWN0OjpnZXRFbGVtZW50cyhhcmdzKTsKLSAgICAgIAotICAgICAgVHlwZWRlZiogY29uc3QqIGFyZ3VtZW50cyA9IHNpZ24tPmdldEFyZ3VtZW50c1R5cGUoKTsKLSAgICAgIC8vIFN0b3JlIHRoZSBhcmd1bWVudHMsIHVuYm94aW5nIHByaW1pdGl2ZXMgaWYgbmVjZXNzYXJ5LgotICAgICAgZm9yIChzaW50MzIgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgICAgSmF2YU9iamVjdDo6ZGVjYXBzdWxlUHJpbWl0aXZlKHB0cltpXSwgJmJ1ZltpXSwgYXJndW1lbnRzW2ldKTsKLSAgICAgICAgaWYgKCFhcmd1bWVudHNbaV0tPmlzUHJpbWl0aXZlKCkpIHsKLSAgICAgICAgICBidWZbaV0ubCA9IHJlaW50ZXJwcmV0X2Nhc3Q8am9iamVjdD4oJnB0cltpXSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgVFJZIHsKLSAgICAgICAgbWV0aC0+aW52b2tlSW50U3BlY2lhbEJ1ZihjbCwgcmVzLCBidWYpOwotICAgICAgfSBDQVRDSCB7Ci0gICAgICAgIGV4Y3AgPSBtdm06OlRocmVhZDo6Z2V0KCktPmdldFBlbmRpbmdFeGNlcHRpb24oKTsKLSAgICAgIH0gRU5EX0NBVENIOwotCQkJbXZtOjpUaHJlYWQqIG11dCA9IG12bTo6VGhyZWFkOjpnZXQoKTsKLSAgICAgIGlmIChleGNwKSB7Ci0JCQkJamV4Y3AgPSBKbmp2bTo6YXNKYXZhRXhjZXB0aW9uKGV4Y3ApOwotICAgICAgICBpZiAoamV4Y3AgJiYgSmF2YU9iamVjdDo6Z2V0Q2xhc3MoamV4Y3ApLT5pc0Fzc2lnbmFibGVGcm9tKHZtLT51cGNhbGxzLT5uZXdFeGNlcHRpb24pKSB7Ci0gICAgICAgICAgbXV0LT5jbGVhclBlbmRpbmdFeGNlcHRpb24oKTsKLSAgICAgICAgICAvLyBJZiBpdCdzIGFuIGV4Y2VwdGlvbiwgd2UgZW5jYXBzdWxlIGl0IGluIGFuCi0gICAgICAgICAgLy8gaW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotICAgICAgICAgIHZtLT5pbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGpleGNwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBJZiBpdCdzIGFuIGVycm9yLCB0aHJvdyBpdCBhZ2Fpbi4KLSAgICAgICAgICBtdXQtPnRocm93SXQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgdm0tPmlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2xhc3MgaXMgbm90IGEgcmVndWxhciBjbGFzcyIpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHZtLT5pbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIndyb25nIG51bWJlciBvZiBhcmd1bWVudHMiKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotIAotICByZXR1cm4gcmVzOwotfQotCi1KTklFWFBPUlQgSmF2YU9iamVjdCogSk5JQ0FMTCBKYXZhX2phdmFfbGFuZ19yZWZsZWN0X0NvbnN0cnVjdG9yX2NvbnN0cnVjdE5hdGl2ZSgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLSNlbmRpZgotSmF2YU9iamVjdENvbnN0cnVjdG9yKiBjb25zLCBBcnJheU9iamVjdCogYXJncywgSmF2YU9iamVjdCogQ2xhenosIGppbnQgaW5kZXgpIHsKLQotICBKYXZhT2JqZWN0KiByZXMgPSAwOwotCi0gIGxsdm1fZ2Nyb290KHJlcywgMCk7Ci0gIGxsdm1fZ2Nyb290KGNvbnMsIDApOwotICBsbHZtX2djcm9vdChhcmdzLCAwKTsKLSAgbGx2bV9nY3Jvb3QoQ2xhenosIDApOwotICAKLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotCi0gIHJlcyA9IHByb2NlZWRDb25zdHJ1Y3Rvcihjb25zLCBhcmdzLCBDbGF6eiwgaW5kZXgpOwotICAKLSAgRU5EX05BVElWRV9FWENFUFRJT04KLSAgCi0gIHJldHVybiByZXM7Ci19Ci0KLUpOSUVYUE9SVCAKLUFycmF5T2JqZWN0KiBKTklDQUxMIEphdmFfamF2YV9sYW5nX3JlZmxlY3RfQ29uc3RydWN0b3JfZ2V0RXhjZXB0aW9uVHlwZXMoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsIAotI2VuZGlmCi1KYXZhT2JqZWN0Q29uc3RydWN0b3IqIGNvbnMpIHsKLSAgCi0gIEFycmF5T2JqZWN0KiByZXMgPSAwOwotCi0gIGxsdm1fZ2Nyb290KHJlcywgMCk7Ci0gIGxsdm1fZ2Nyb290KGNvbnMsIDApOwotCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLSAgCi0gIHZlcmlmeU51bGwoY29ucyk7Ci0gIFVzZXJDbGFzcyogY2wgPSBKYXZhT2JqZWN0Q29uc3RydWN0b3I6OmdldENsYXNzKGNvbnMpOwotICBKYXZhTWV0aG9kKiBtZXRoID0gSmF2YU9iamVjdENvbnN0cnVjdG9yOjpnZXRJbnRlcm5hbE1ldGhvZChjb25zKTsKLSAgSm5qdm1DbGFzc0xvYWRlciogbG9hZGVyID0gY2wtPmNsYXNzTG9hZGVyOwotCi0gIHJlcyA9IChBcnJheU9iamVjdCopbWV0aC0+Z2V0RXhjZXB0aW9uVHlwZXMobG9hZGVyKTsKLQotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotCi0gIHJldHVybiByZXM7Ci19Ci0KLUpOSUVYUE9SVCBKYXZhT2JqZWN0KiBKTklDQUxMIEphdmFfamF2YV9sYW5nX3JlZmxlY3RfQ29uc3RydWN0b3JfZ2V0U2lnbmF0dXJlKAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LCAKLSNlbmRpZgotSmF2YU9iamVjdENvbnN0cnVjdG9yKiBNZXRoKSB7Ci0KLSAgSmF2YU9iamVjdCogcmVzdWx0ID0gMDsKLQotICBsbHZtX2djcm9vdChyZXN1bHQsIDApOwotICBsbHZtX2djcm9vdChNZXRoLCAwKTsKLQotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0KLSAgdmVyaWZ5TnVsbChNZXRoKTsKLSAgSmF2YU1ldGhvZCogbWV0aCA9IEphdmFPYmplY3RDb25zdHJ1Y3Rvcjo6Z2V0SW50ZXJuYWxNZXRob2QoTWV0aCk7Ci0gIEpuanZtKiB2bSA9IG1ldGgtPmNsYXNzRGVmLT5jbGFzc0xvYWRlci0+dm07Ci0gIHJlc3VsdCA9IHZtLT5pbnRlcm5hbFVURjhUb1N0cihtZXRoLT50eXBlKTsKLSAgCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvQ2xhc3NwYXRoL0NsYXNzcGF0aEZpZWxkLmluYyBiL3Zta2l0L2xpYi9KMy9DbGFzc3BhdGgvQ2xhc3NwYXRoRmllbGQuaW5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGE1NmQwLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9KMy9DbGFzc3BhdGgvQ2xhc3NwYXRoRmllbGQuaW5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE2OSArMCwwIEBACi0vLz09PS0gQ2xhc3NwYXRoVk1GaWVsZC5jcHAgLSBHTlUgY2xhc3NwYXRoIGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkIC0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgIkNsYXNzcGF0aC5oIgotI2luY2x1ZGUgIkNsYXNzcGF0aFJlZmxlY3QuaCIKLSNpbmNsdWRlICJKYXZhQ2xhc3MuaCIKLSNpbmNsdWRlICJKYXZhVGhyZWFkLmgiCi0jaW5jbHVkZSAiSmF2YVR5cGVzLmgiCi0jaW5jbHVkZSAiSmF2YVVwY2FsbHMuaCIKLSNpbmNsdWRlICJKbmp2bS5oIgotCi11c2luZyBuYW1lc3BhY2UgajM7Ci0KLWV4dGVybiAiQyIgewotCi0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9qYXZhX2xhbmdfcmVmbGVjdF9GaWVsZF9nZXRNb2RpZmllcnNJbnRlcm5hbCgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLSNlbmRpZgotSmF2YU9iamVjdEZpZWxkKiBGaWVsZCkgewotICBqaW50IHJlcyA9IDA7Ci0KLSAgbGx2bV9nY3Jvb3QoRmllbGQsIDApOwotCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLQotICBKYXZhRmllbGQqIGZpZWxkID0gSmF2YU9iamVjdEZpZWxkOjpnZXRJbnRlcm5hbEZpZWxkKEZpZWxkKTsKLSAgcmVzID0gZmllbGQtPmFjY2VzczsKLQotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotCi0gIHJldHVybiByZXM7Ci19Ci0KLUpOSUVYUE9SVCBKYXZhT2JqZWN0KiBKTklDQUxMIEphdmFfamF2YV9sYW5nX3JlZmxlY3RfRmllbGRfZ2V0VHlwZSgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLSNlbmRpZgotSmF2YU9iamVjdEZpZWxkKiBGaWVsZCkgewotICAKLSAgSmF2YU9iamVjdCogcmVzID0gMDsKLQotICBsbHZtX2djcm9vdChGaWVsZCwgMCk7Ci0gIGxsdm1fZ2Nyb290KHJlcywgMCk7Ci0KLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotCi0gIFVzZXJDbGFzcyogY2wgPSBKYXZhT2JqZWN0RmllbGQ6OmdldENsYXNzKEZpZWxkKTsKLSAgSmF2YUZpZWxkKiBmaWVsZCA9IEphdmFPYmplY3RGaWVsZDo6Z2V0SW50ZXJuYWxGaWVsZChGaWVsZCk7Ci0gIEpuanZtQ2xhc3NMb2FkZXIqIGxvYWRlciA9IGNsLT5jbGFzc0xvYWRlcjsKLSAgVXNlckNvbW1vbkNsYXNzKiBmaWVsZENsID0gZmllbGQtPmdldFNpZ25hdHVyZSgpLT5hc3NvY0NsYXNzKGxvYWRlcik7Ci0gIHJlcyA9IGZpZWxkQ2wtPmdldENsYXNzRGVsZWdhdGVlKCk7Ci0KLSAgRU5EX05BVElWRV9FWENFUFRJT04KLQotICByZXR1cm4gcmVzOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfamF2YV9sYW5nX3JlZmxlY3RfRmllbGRfZ2V0SW50KAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotI2VuZGlmCi1KYXZhT2JqZWN0RmllbGQqIEZpZWxkLCBKYXZhT2JqZWN0KiBvYmopIHsKLSAgCi0gIGppbnQgcmVzID0gMDsKLSAgCi0gIGxsdm1fZ2Nyb290KEZpZWxkLCAwKTsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLQotICBVc2VyQ2xhc3MqIGNsID0gSmF2YU9iamVjdEZpZWxkOjpnZXRDbGFzcyhGaWVsZCk7Ci0gIEpuanZtKiB2bSA9IGNsLT5jbGFzc0xvYWRlci0+dm07Ci0gIEphdmFGaWVsZCogZmllbGQgPSBKYXZhT2JqZWN0RmllbGQ6OmdldEludGVybmFsRmllbGQoRmllbGQpOwotICBjb25zdCBUeXBlZGVmKiB0eXBlID0gZmllbGQtPmdldFNpZ25hdHVyZSgpOwotICBib29sIHN0YXQgPSAgaXNTdGF0aWMoZmllbGQtPmFjY2Vzcyk7Ci0gIAotICBpZiAoc3RhdCkgewotICAgIGNsLT5pbml0aWFsaXNlQ2xhc3MoKTsKLSAgfSBlbHNlIHsKLSAgICB2ZXJpZnlOdWxsKG9iaik7Ci0gIH0KLSAgCi0gIGlmICh0eXBlLT5pc1ByaW1pdGl2ZSgpKSB7Ci0gICAgY29uc3QgUHJpbWl0aXZlVHlwZWRlZiogcHJpbSA9IChjb25zdCBQcmltaXRpdmVUeXBlZGVmKil0eXBlOwotCi0gICAgaWYgKHByaW0tPmlzSW50KCkpIHsKLSAgICAgIGlmIChzdGF0KSB7Ci0gICAgICAgIHJlcyA9IChzaW50MzIpZmllbGQtPmdldFN0YXRpY0ludDMyRmllbGQoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlcyA9IChzaW50MzIpZmllbGQtPmdldEluc3RhbmNlSW50MzJGaWVsZChvYmopOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocHJpbS0+aXNDaGFyKCkpIHsKLSAgICAgIGlmIChzdGF0KSB7Ci0gICAgICAgIHJlcyA9ICh1aW50MzIpZmllbGQtPmdldFN0YXRpY0ludDE2RmllbGQoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlcyA9ICh1aW50MzIpZmllbGQtPmdldEluc3RhbmNlSW50MTZGaWVsZChvYmopOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocHJpbS0+aXNCeXRlKCkpIHsKLSAgICAgIGlmIChzdGF0KSB7Ci0gICAgICAgIHJlcyA9IChzaW50MzIpZmllbGQtPmdldFN0YXRpY0ludDhGaWVsZCgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzID0gKHNpbnQzMilmaWVsZC0+Z2V0SW5zdGFuY2VJbnQ4RmllbGQob2JqKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHByaW0tPmlzU2hvcnQoKSkgewotICAgICAgaWYgKHN0YXQpIHsKLSAgICAgICAgcmVzID0gKHNpbnQzMilmaWVsZC0+Z2V0U3RhdGljSW50MTZGaWVsZCgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzID0gKHNpbnQzMilmaWVsZC0+Z2V0SW5zdGFuY2VJbnQxNkZpZWxkKG9iaik7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHZtLT5pbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIndyb25nIHR5cGUiKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgICB2bS0+aWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ3cm9uZyB0eXBlIik7Ci0gIH0KLSAgCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0gIAotICByZXR1cm4gcmVzOwotICAKLX0KLQotSk5JRVhQT1JUIGpsb25nIEpOSUNBTEwgSmF2YV9qYXZhX2xhbmdfcmVmbGVjdF9GaWVsZF9nZXRMb25nKAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotI2VuZGlmCi1KYXZhT2JqZWN0RmllbGQqIEZpZWxkLCBKYXZhT2JqZWN0KiBvYmopIHsKLQotICBqbG9uZyByZXMgPSAwOwotICAKLSAgbGx2bV9nY3Jvb3QoRmllbGQsIDApOwotICBsbHZtX2djcm9vdChvYmosIDApOwotCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLQotICBVc2VyQ2xhc3MqIGNsID0gSmF2YU9iamVjdEZpZWxkOjpnZXRDbGFzcyhGaWVsZCk7Ci0gIEpuanZtKiB2bSA9IGNsLT5jbGFzc0xvYWRlci0+dm07Ci0gIEphdmFGaWVsZCogZmllbGQgPSBKYXZhT2JqZWN0RmllbGQ6OmdldEludGVybmFsRmllbGQoRmllbGQpOwotICBib29sIHN0YXQgPSBpc1N0YXRpYyhmaWVsZC0+YWNjZXNzKTsKLSAgCi0gIGlmIChzdGF0KSB7Ci0gICAgY2wtPmluaXRpYWxpc2VDbGFzcygpOwotICB9IGVsc2UgewotICAgIHZlcmlmeU51bGwob2JqKTsKLSAgfQotICAKLSAgY29uc3QgVHlwZWRlZiogdHlwZSA9IGZpZWxkLT5nZXRTaWduYXR1cmUoKTsKLSAgaWYgKHR5cGUtPmlzUHJpbWl0aXZlKCkpIHsKLSAgICBjb25zdCBQcmltaXRpdmVUeXBlZGVmKiBwcmltID0gKGNvbnN0IFByaW1pdGl2ZVR5cGVkZWYqKXR5cGU7Ci0gICAgCi0gICAgaWYgKHByaW0tPmlzSW50KCkpIHsKLSAgICAgIGlmIChzdGF0KSB7Ci0gICAgICAgIHJlcyA9IChzaW50NjQpZmllbGQtPmdldFN0YXRpY0ludDMyRmllbGQoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlcyA9IChzaW50NjQpZmllbGQtPmdldEluc3RhbmNlSW50MzJGaWVsZChvYmopOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocHJpbS0+aXNDaGFyKCkpIHsKLSAgICAgIGlmIChzdGF0KSB7Ci0gICAgICAgIHJlcyA9ICh1aW50NjQpZmllbGQtPmdldFN0YXRpY0ludDE2RmllbGQoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlcyA9ICh1aW50NjQpZmllbGQtPmdldEluc3RhbmNlSW50MTZGaWVsZChvYmopOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocHJpbS0+aXNCeXRlKCkpIHsKLSAgICAgIGlmIChzdGF0KSB7Ci0gICAgICAgIHJlcyA9IChzaW50NjQpZmllbGQtPmdldFN0YXRpY0ludDhGaWVsZCgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzID0gKHNpbnQ2NClmaWVsZC0+Z2V0SW5zdGFuY2VJbnQ4RmllbGQob2JqKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHByaW0tPmlzU2hvcnQoKSkgewotICAgICAgaWYgKHN0YXQpIHsKLSAgICAgICAgcmVzID0gKHNpbnQ2NClmaWVsZC0+Z2V0U3RhdGljSW50MTZGaWVsZCgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzID0gKHNpbnQ2NClmaWVsZC0+Z2V0SW5zdGFuY2VJbnQxNkZpZWxkKG9iaik7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChwcmltLT5pc0xvbmcoKSkgewotICAgICAgaWYgKHN0YXQpIHsKLSAgICAgICAgcmVzID0gKHNpbnQ2NClmaWVsZC0+Z2V0U3RhdGljTG9uZ0ZpZWxkKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXMgPSAoc2ludDY0KWZpZWxkLT5nZXRJbnN0YW5jZUxvbmdGaWVsZChvYmopOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICB2bS0+aWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ3cm9uZyB0eXBlIik7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHZtLT5pbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIndyb25nIHR5cGUiKTsKLSAgfQotICAKLSAgRU5EX05BVElWRV9FWENFUFRJT04KLQotICByZXR1cm4gcmVzOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBKYXZhX2phdmFfbGFuZ19yZWZsZWN0X0ZpZWxkX2dldEJvb2xlYW4oCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsCi0jZW5kaWYKLUphdmFPYmplY3RGaWVsZCogRmllbGQsIEphdmFPYmplY3QqIG9iaikgewotCi0gIGpib29sZWFuIHJlcyA9IDA7Ci0gIAotICBsbHZtX2djcm9vdChGaWVsZCwgMCk7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0KLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotCi0gIFVzZXJDbGFzcyogY2wgPSBKYXZhT2JqZWN0RmllbGQ6OmdldENsYXNzKEZpZWxkKTsKLSAgSm5qdm0qIHZtID0gY2wtPmNsYXNzTG9hZGVyLT52bTsKLSAgSmF2YUZpZWxkKiBmaWVsZCA9IEphdmFPYmplY3RGaWVsZDo6Z2V0SW50ZXJuYWxGaWVsZChGaWVsZCk7Ci0gIGJvb2wgc3RhdCA9ICBpc1N0YXRpYyhmaWVsZC0+YWNjZXNzKTsKLSAgIAotICBpZiAoc3RhdCkgewotICAgIGNsLT5pbml0aWFsaXNlQ2xhc3MoKTsKLSAgfSBlbHNlIHsKLSAgICB2ZXJpZnlOdWxsKG9iaik7Ci0gIH0KLSAgCi0gIGNvbnN0IFR5cGVkZWYqIHR5cGUgPSBmaWVsZC0+Z2V0U2lnbmF0dXJlKCk7Ci0gIGlmICh0eXBlLT5pc1ByaW1pdGl2ZSgpKSB7Ci0gICAgY29uc3QgUHJpbWl0aXZlVHlwZWRlZiogcHJpbSA9IChjb25zdCBQcmltaXRpdmVUeXBlZGVmKil0eXBlOwotICAgIGlmIChwcmltLT5pc0Jvb2woKSkgeyAKLSAgICAgIGlmIChzdGF0KSB7Ci0gICAgICAgIHJlcyA9ICh1aW50OClmaWVsZC0+Z2V0U3RhdGljSW50OEZpZWxkKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXMgPSAodWludDgpZmllbGQtPmdldEluc3RhbmNlSW50OEZpZWxkKG9iaik7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHZtLT5pbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIndyb25nIHR5cGUiKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgdm0tPmlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigid3JvbmcgdHlwZSIpOwotICB9Ci0gIAotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotCi0gIHJldHVybiByZXM7Ci0gIAotfQotCi1KTklFWFBPUlQgamZsb2F0IEpOSUNBTEwgSmF2YV9qYXZhX2xhbmdfcmVmbGVjdF9GaWVsZF9nZXRGbG9hdCgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLSNlbmRpZgotSmF2YU9iamVjdEZpZWxkKiBGaWVsZCwgSmF2YU9iamVjdCogb2JqKSB7Ci0gIAotICBqZmxvYXQgcmVzID0gMDsKLSAgbGx2bV9nY3Jvb3QoRmllbGQsIDApOwotICBsbHZtX2djcm9vdChvYmosIDApOwotCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLSAgCi0gIFVzZXJDbGFzcyogY2wgPSBKYXZhT2JqZWN0RmllbGQ6OmdldENsYXNzKEZpZWxkKTsKLSAgSm5qdm0qIHZtID0gY2wtPmNsYXNzTG9hZGVyLT52bTsKLSAgSmF2YUZpZWxkKiBmaWVsZCA9IEphdmFPYmplY3RGaWVsZDo6Z2V0SW50ZXJuYWxGaWVsZChGaWVsZCk7Ci0gIGJvb2wgc3RhdCA9IGlzU3RhdGljKGZpZWxkLT5hY2Nlc3MpOwotICAKLSAgaWYgKHN0YXQpIHsKLSAgICBjbC0+aW5pdGlhbGlzZUNsYXNzKCk7Ci0gIH0gZWxzZSB7Ci0gICAgdmVyaWZ5TnVsbChvYmopOwotICB9Ci0gIAotICBjb25zdCBUeXBlZGVmKiB0eXBlID0gZmllbGQtPmdldFNpZ25hdHVyZSgpOwotICBpZiAodHlwZS0+aXNQcmltaXRpdmUoKSkgewotICAgIGNvbnN0IFByaW1pdGl2ZVR5cGVkZWYqIHByaW0gPSAoY29uc3QgUHJpbWl0aXZlVHlwZWRlZiopdHlwZTsKLSAgICBpZiAocHJpbS0+aXNCeXRlKCkpIHsKLSAgICAgIGlmIChzdGF0KSB7Ci0gICAgICAgIHJlcyA9IChqZmxvYXQpZmllbGQtPmdldFN0YXRpY0ludDhGaWVsZCgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzID0gKGpmbG9hdClmaWVsZC0+Z2V0SW5zdGFuY2VJbnQ4RmllbGQob2JqKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHByaW0tPmlzSW50KCkpIHsKLSAgICAgIGlmIChzdGF0KSB7Ci0gICAgICAgIHJlcyA9IChqZmxvYXQpZmllbGQtPmdldFN0YXRpY0ludDMyRmllbGQoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlcyA9IChqZmxvYXQpZmllbGQtPmdldEluc3RhbmNlSW50MzJGaWVsZChvYmopOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocHJpbS0+aXNTaG9ydCgpKSB7Ci0gICAgICBpZiAoc3RhdCkgewotICAgICAgICByZXMgPSAoamZsb2F0KWZpZWxkLT5nZXRTdGF0aWNJbnQxNkZpZWxkKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXMgPSAoamZsb2F0KWZpZWxkLT5nZXRJbnN0YW5jZUludDE2RmllbGQob2JqKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHByaW0tPmlzTG9uZygpKSB7Ci0gICAgICBpZiAoc3RhdCkgewotICAgICAgICByZXMgPSAoamZsb2F0KWZpZWxkLT5nZXRTdGF0aWNMb25nRmllbGQoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlcyA9IChqZmxvYXQpZmllbGQtPmdldEluc3RhbmNlTG9uZ0ZpZWxkKG9iaik7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChwcmltLT5pc0NoYXIoKSkgewotICAgICAgLy8gQ2FzdCB0byB1aW50MzIgYmVjYXVzZSBjaGFyIGlzIHVuc2lnbmVkLgotICAgICAgaWYgKHN0YXQpIHsKLSAgICAgICAgcmVzID0gKGpmbG9hdCkodWludDMyKWZpZWxkLT5nZXRTdGF0aWNJbnQxNkZpZWxkKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXMgPSAoamZsb2F0KSh1aW50MzIpZmllbGQtPmdldEluc3RhbmNlSW50MTZGaWVsZChvYmopOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocHJpbS0+aXNGbG9hdCgpKSB7Ci0gICAgICBpZiAoc3RhdCkgewotICAgICAgICByZXMgPSAoamZsb2F0KWZpZWxkLT5nZXRTdGF0aWNGbG9hdEZpZWxkKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXMgPSAoamZsb2F0KWZpZWxkLT5nZXRJbnN0YW5jZUZsb2F0RmllbGQob2JqKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgdm0tPmlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigid3JvbmcgdHlwZSIpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB2bS0+aWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ3cm9uZyB0eXBlIik7Ci0gIH0KLSAgCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLSAgcmV0dXJuIHJlczsKLX0KLQotSk5JRVhQT1JUIGpieXRlIEpOSUNBTEwgSmF2YV9qYXZhX2xhbmdfcmVmbGVjdF9GaWVsZF9nZXRCeXRlKAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotI2VuZGlmCi1KYXZhT2JqZWN0RmllbGQqIEZpZWxkLCBKYXZhT2JqZWN0KiBvYmopIHsKLQotICBqYnl0ZSByZXMgPSAwOwotICBsbHZtX2djcm9vdChGaWVsZCwgMCk7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0KLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotCi0gIFVzZXJDbGFzcyogY2wgPSBKYXZhT2JqZWN0RmllbGQ6OmdldENsYXNzKEZpZWxkKTsKLSAgSm5qdm0qIHZtID0gY2wtPmNsYXNzTG9hZGVyLT52bTsKLSAgSmF2YUZpZWxkKiBmaWVsZCA9IEphdmFPYmplY3RGaWVsZDo6Z2V0SW50ZXJuYWxGaWVsZChGaWVsZCk7Ci0gIGJvb2wgc3RhdCA9IGlzU3RhdGljKGZpZWxkLT5hY2Nlc3MpOwotICAKLSAgaWYgKHN0YXQpIHsKLSAgICBjbC0+aW5pdGlhbGlzZUNsYXNzKCk7Ci0gIH0gZWxzZSB7Ci0gICAgdmVyaWZ5TnVsbChvYmopOwotICB9Ci0gIAotICBjb25zdCBUeXBlZGVmKiB0eXBlID0gZmllbGQtPmdldFNpZ25hdHVyZSgpOwotICBpZiAodHlwZS0+aXNQcmltaXRpdmUoKSkgewotICAgIGNvbnN0IFByaW1pdGl2ZVR5cGVkZWYqIHByaW0gPSAoY29uc3QgUHJpbWl0aXZlVHlwZWRlZiopdHlwZTsKLSAgICBpZiAocHJpbS0+aXNCeXRlKCkpIHsKLSAgICAgIGlmIChzdGF0KSB7Ci0gICAgICAgIHJlcyA9IChzaW50OClmaWVsZC0+Z2V0U3RhdGljSW50OEZpZWxkKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXMgPSAoc2ludDgpZmllbGQtPmdldEluc3RhbmNlSW50OEZpZWxkKG9iaik7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHZtLT5pbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIndyb25nIHR5cGUiKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgdm0tPmlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigid3JvbmcgdHlwZSIpOwotICB9Ci0gIAotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotICAKLSAgcmV0dXJuIHJlczsKLX0KLQotSk5JRVhQT1JUIGpjaGFyIEpOSUNBTEwgSmF2YV9qYXZhX2xhbmdfcmVmbGVjdF9GaWVsZF9nZXRDaGFyKAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotI2VuZGlmCi1KYXZhT2JqZWN0RmllbGQqIEZpZWxkLCBKYXZhT2JqZWN0KiBvYmopIHsKLSAgCi0gIGpjaGFyIHJlcyA9IDA7Ci0gIGxsdm1fZ2Nyb290KEZpZWxkLCAwKTsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLQotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0gIAotICBVc2VyQ2xhc3MqIGNsID0gSmF2YU9iamVjdEZpZWxkOjpnZXRDbGFzcyhGaWVsZCk7Ci0gIEpuanZtKiB2bSA9IGNsLT5jbGFzc0xvYWRlci0+dm07Ci0gIEphdmFGaWVsZCogZmllbGQgPSBKYXZhT2JqZWN0RmllbGQ6OmdldEludGVybmFsRmllbGQoRmllbGQpOwotICBib29sIHN0YXQgPSBpc1N0YXRpYyhmaWVsZC0+YWNjZXNzKTsKLSAgCi0gIGlmIChzdGF0KSB7Ci0gICAgY2wtPmluaXRpYWxpc2VDbGFzcygpOwotICB9IGVsc2UgewotICAgIHZlcmlmeU51bGwob2JqKTsKLSAgfQotICAKLSAgY29uc3QgVHlwZWRlZiogdHlwZSA9IGZpZWxkLT5nZXRTaWduYXR1cmUoKTsKLSAgaWYgKHR5cGUtPmlzUHJpbWl0aXZlKCkpIHsKLSAgICBjb25zdCBQcmltaXRpdmVUeXBlZGVmKiBwcmltID0gKGNvbnN0IFByaW1pdGl2ZVR5cGVkZWYqKXR5cGU7Ci0gICAgaWYgKHByaW0tPmlzQ2hhcigpKSB7Ci0gICAgICBpZiAoc3RhdCkgewotICAgICAgICByZXMgPSAodWludDE2KWZpZWxkLT5nZXRTdGF0aWNJbnQxNkZpZWxkKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXMgPSAodWludDE2KWZpZWxkLT5nZXRJbnN0YW5jZUludDE2RmllbGQob2JqKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgdm0tPmlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigid3JvbmcgdHlwZSIpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB2bS0+aWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ3cm9uZyB0eXBlIik7Ci0gIH0KLQotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotICAKLSAgcmV0dXJuIHJlczsKLSAgCi19Ci0KLUpOSUVYUE9SVCBqc2hvcnQgSk5JQ0FMTCBKYXZhX2phdmFfbGFuZ19yZWZsZWN0X0ZpZWxkX2dldFNob3J0KAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotI2VuZGlmCi1KYXZhT2JqZWN0RmllbGQqIEZpZWxkLCBKYXZhT2JqZWN0KiBvYmopIHsKLQotCi0gIGpzaG9ydCByZXMgPSAwOwotICBsbHZtX2djcm9vdChGaWVsZCwgMCk7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0KLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotCi0gIFVzZXJDbGFzcyogY2wgPSBKYXZhT2JqZWN0RmllbGQ6OmdldENsYXNzKEZpZWxkKTsKLSAgSm5qdm0qIHZtID0gY2wtPmNsYXNzTG9hZGVyLT52bTsKLSAgSmF2YUZpZWxkKiBmaWVsZCA9IEphdmFPYmplY3RGaWVsZDo6Z2V0SW50ZXJuYWxGaWVsZChGaWVsZCk7Ci0gIGJvb2wgc3RhdCA9IGlzU3RhdGljKGZpZWxkLT5hY2Nlc3MpOwotICAKLSAgaWYgKHN0YXQpIHsKLSAgICBjbC0+aW5pdGlhbGlzZUNsYXNzKCk7Ci0gIH0gZWxzZSB7Ci0gICAgdmVyaWZ5TnVsbChvYmopOwotICB9Ci0gIAotICBjb25zdCBUeXBlZGVmKiB0eXBlID0gZmllbGQtPmdldFNpZ25hdHVyZSgpOwotICBpZiAodHlwZS0+aXNQcmltaXRpdmUoKSkgewotICAgIGNvbnN0IFByaW1pdGl2ZVR5cGVkZWYqIHByaW0gPSAoY29uc3QgUHJpbWl0aXZlVHlwZWRlZiopdHlwZTsKLSAgICBpZiAocHJpbS0+aXNTaG9ydCgpKSB7Ci0gICAgICBpZiAoc3RhdCkgewotICAgICAgICByZXMgPSAoc2ludDE2KWZpZWxkLT5nZXRTdGF0aWNJbnQxNkZpZWxkKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXMgPSAoc2ludDE2KWZpZWxkLT5nZXRJbnN0YW5jZUludDE2RmllbGQob2JqKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHByaW0tPmlzQnl0ZSgpKSB7Ci0gICAgICBpZiAoc3RhdCkgewotICAgICAgICByZXMgPSAoc2ludDE2KWZpZWxkLT5nZXRTdGF0aWNJbnQ4RmllbGQoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlcyA9IChzaW50MTYpZmllbGQtPmdldEluc3RhbmNlSW50OEZpZWxkKG9iaik7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHZtLT5pbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIndyb25nIHR5cGUiKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgdm0tPmlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigid3JvbmcgdHlwZSIpOwotICB9Ci0gIAotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotCi0gIHJldHVybiByZXM7Ci19Ci0gIAotSk5JRVhQT1JUIGpkb3VibGUgSk5JQ0FMTCBKYXZhX2phdmFfbGFuZ19yZWZsZWN0X0ZpZWxkX2dldERvdWJsZSgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLSNlbmRpZgotSmF2YU9iamVjdEZpZWxkKiBGaWVsZCwgSmF2YU9iamVjdCogb2JqKSB7Ci0gIAotICBqZG91YmxlIHJlcyA9IDA7Ci0gIGxsdm1fZ2Nyb290KEZpZWxkLCAwKTsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLQotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0gIAotICBVc2VyQ2xhc3MqIGNsID0gSmF2YU9iamVjdEZpZWxkOjpnZXRDbGFzcyhGaWVsZCk7Ci0gIEpuanZtKiB2bSA9IGNsLT5jbGFzc0xvYWRlci0+dm07Ci0gIEphdmFGaWVsZCogZmllbGQgPSBKYXZhT2JqZWN0RmllbGQ6OmdldEludGVybmFsRmllbGQoRmllbGQpOwotICBib29sIHN0YXQgPSBpc1N0YXRpYyhmaWVsZC0+YWNjZXNzKTsKLSAgCi0gIGlmIChzdGF0KSB7Ci0gICAgY2wtPmluaXRpYWxpc2VDbGFzcygpOwotICB9IGVsc2UgewotICAgIHZlcmlmeU51bGwob2JqKTsKLSAgfQotICAKLSAgY29uc3QgVHlwZWRlZiogdHlwZSA9IGZpZWxkLT5nZXRTaWduYXR1cmUoKTsKLSAgaWYgKHR5cGUtPmlzUHJpbWl0aXZlKCkpIHsKLSAgICBjb25zdCBQcmltaXRpdmVUeXBlZGVmKiBwcmltID0gKGNvbnN0IFByaW1pdGl2ZVR5cGVkZWYqKXR5cGU7Ci0gICAgaWYgKHByaW0tPmlzQnl0ZSgpKSB7Ci0gICAgICBpZiAoc3RhdCkgewotICAgICAgICByZXMgPSAoamRvdWJsZSkoc2ludDY0KWZpZWxkLT5nZXRTdGF0aWNJbnQ4RmllbGQoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlcyA9IChqZG91YmxlKShzaW50NjQpZmllbGQtPmdldEluc3RhbmNlSW50OEZpZWxkKG9iaik7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChwcmltLT5pc0ludCgpKSB7Ci0gICAgICBpZiAoc3RhdCkgewotICAgICAgICByZXMgPSAoamRvdWJsZSkoc2ludDY0KWZpZWxkLT5nZXRTdGF0aWNJbnQzMkZpZWxkKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXMgPSAoamRvdWJsZSkoc2ludDY0KWZpZWxkLT5nZXRJbnN0YW5jZUludDMyRmllbGQob2JqKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHByaW0tPmlzU2hvcnQoKSkgewotICAgICAgaWYgKHN0YXQpIHsKLSAgICAgICAgcmVzID0gKGpkb3VibGUpKHNpbnQ2NClmaWVsZC0+Z2V0U3RhdGljSW50MTZGaWVsZCgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzID0gKGpkb3VibGUpKHNpbnQ2NClmaWVsZC0+Z2V0SW5zdGFuY2VJbnQxNkZpZWxkKG9iaik7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChwcmltLT5pc0xvbmcoKSkgewotICAgICAgaWYgKHN0YXQpIHsKLSAgICAgICAgcmVzID0gKGpkb3VibGUpKHNpbnQ2NClmaWVsZC0+Z2V0U3RhdGljTG9uZ0ZpZWxkKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXMgPSAoamRvdWJsZSkoc2ludDY0KWZpZWxkLT5nZXRJbnN0YW5jZUxvbmdGaWVsZChvYmopOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocHJpbS0+aXNDaGFyKCkpIHsKLSAgICAgIGlmIChzdGF0KSB7Ci0gICAgICAgIHJlcyA9IChqZG91YmxlKSh1aW50NjQpZmllbGQtPmdldFN0YXRpY0ludDE2RmllbGQoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlcyA9IChqZG91YmxlKSh1aW50NjQpZmllbGQtPmdldEluc3RhbmNlSW50MTZGaWVsZChvYmopOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocHJpbS0+aXNGbG9hdCgpKSB7Ci0gICAgICBpZiAoc3RhdCkgewotICAgICAgICByZXMgPSAoamRvdWJsZSlmaWVsZC0+Z2V0U3RhdGljRmxvYXRGaWVsZCgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzID0gKGpkb3VibGUpZmllbGQtPmdldEluc3RhbmNlRmxvYXRGaWVsZChvYmopOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocHJpbS0+aXNEb3VibGUoKSkgewotICAgICAgaWYgKHN0YXQpIHsKLSAgICAgICAgcmVzID0gKGpkb3VibGUpZmllbGQtPmdldFN0YXRpY0RvdWJsZUZpZWxkKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXMgPSAoamRvdWJsZSlmaWVsZC0+Z2V0SW5zdGFuY2VEb3VibGVGaWVsZChvYmopOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICB2bS0+aWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ3cm9uZyB0eXBlIik7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHZtLT5pbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIndyb25nIHR5cGUiKTsKLSAgfQotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLSAgcmV0dXJuIHJlczsKLX0KLQotSk5JRVhQT1JUIEphdmFPYmplY3QqIEpOSUNBTEwgSmF2YV9qYXZhX2xhbmdfcmVmbGVjdF9GaWVsZF9nZXQoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsCi0jZW5kaWYKLUphdmFPYmplY3RGaWVsZCogRmllbGQsIEphdmFPYmplY3QqIG9iaikgewotCi0KLSAgSmF2YU9iamVjdCogcmVzID0gMDsKLSAgbGx2bV9nY3Jvb3QoRmllbGQsIDApOwotICBsbHZtX2djcm9vdChvYmosIDApOwotICBsbHZtX2djcm9vdChyZXMsIDApOwotCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLQotICBVc2VyQ2xhc3MqIGNsID0gSmF2YU9iamVjdEZpZWxkOjpnZXRDbGFzcyhGaWVsZCk7Ci0gIEpuanZtKiB2bSA9IGNsLT5jbGFzc0xvYWRlci0+dm07Ci0gIEphdmFGaWVsZCogZmllbGQgPSBKYXZhT2JqZWN0RmllbGQ6OmdldEludGVybmFsRmllbGQoRmllbGQpOwotICBib29sIHN0YXQgPSBpc1N0YXRpYyhmaWVsZC0+YWNjZXNzKTsKLSAgCi0gIGlmIChzdGF0KSB7Ci0gICAgY2wtPmluaXRpYWxpc2VDbGFzcygpOwotICB9IGVsc2UgewotICAgIHZlcmlmeU51bGwob2JqKTsKLSAgfQotICAKLSAgY29uc3QgVHlwZWRlZiogdHlwZSA9IGZpZWxkLT5nZXRTaWduYXR1cmUoKTsKLSAgaWYgKHR5cGUtPmlzUHJpbWl0aXZlKCkpIHsKLSAgICBjb25zdCBQcmltaXRpdmVUeXBlZGVmKiBwcmltID0gKGNvbnN0IFByaW1pdGl2ZVR5cGVkZWYqKXR5cGU7Ci0gICAgaWYgKHByaW0tPmlzQm9vbCgpKSB7Ci0gICAgICB1aW50OCB2YWwgPSAgc3RhdCA/IGZpZWxkLT5nZXRTdGF0aWNJbnQ4RmllbGQoKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5nZXRJbnN0YW5jZUludDhGaWVsZChvYmopOwotICAgICAgcmVzID0gdm0tPnVwY2FsbHMtPmJvb2xDbGFzcy0+ZG9OZXcoKTsKLSAgICAgIHZtLT51cGNhbGxzLT5ib29sVmFsdWUtPnNldEluc3RhbmNlSW50OEZpZWxkKHJlcywgdmFsKTsKLSAgICB9IGVsc2UgaWYgKHByaW0tPmlzQnl0ZSgpKSB7Ci0gICAgICBzaW50OCB2YWwgPSAgc3RhdCA/IGZpZWxkLT5nZXRTdGF0aWNJbnQ4RmllbGQoKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5nZXRJbnN0YW5jZUludDhGaWVsZChvYmopOwotICAgICAgcmVzID0gdm0tPnVwY2FsbHMtPmJ5dGVDbGFzcy0+ZG9OZXcoKTsKLSAgICAgIHZtLT51cGNhbGxzLT5ieXRlVmFsdWUtPnNldEluc3RhbmNlSW50OEZpZWxkKHJlcywgdmFsKTsKLSAgICB9IGVsc2UgaWYgKHByaW0tPmlzQ2hhcigpKSB7Ci0gICAgICB1aW50MTYgdmFsID0gIHN0YXQgPyBmaWVsZC0+Z2V0U3RhdGljSW50MTZGaWVsZCgpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5nZXRJbnN0YW5jZUludDE2RmllbGQob2JqKTsKLSAgICAgIHJlcyA9IHZtLT51cGNhbGxzLT5jaGFyQ2xhc3MtPmRvTmV3KCk7Ci0gICAgICB2bS0+dXBjYWxscy0+Y2hhclZhbHVlLT5zZXRJbnN0YW5jZUludDE2RmllbGQocmVzLCB2YWwpOwotICAgIH0gZWxzZSBpZiAocHJpbS0+aXNTaG9ydCgpKSB7Ci0gICAgICBzaW50MTYgdmFsID0gIHN0YXQgPyBmaWVsZC0+Z2V0U3RhdGljSW50MTZGaWVsZCgpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5nZXRJbnN0YW5jZUludDE2RmllbGQob2JqKTsKLSAgICAgIHJlcyA9IHZtLT51cGNhbGxzLT5zaG9ydENsYXNzLT5kb05ldygpOwotICAgICAgdm0tPnVwY2FsbHMtPnNob3J0VmFsdWUtPnNldEluc3RhbmNlSW50MTZGaWVsZChyZXMsIHZhbCk7Ci0gICAgfSBlbHNlIGlmIChwcmltLT5pc0ludCgpKSB7Ci0gICAgICBzaW50NjQgdmFsID0gIHN0YXQgPyBmaWVsZC0+Z2V0U3RhdGljSW50MzJGaWVsZCgpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5nZXRJbnN0YW5jZUludDMyRmllbGQob2JqKTsKLSAgICAgIHJlcyA9IHZtLT51cGNhbGxzLT5pbnRDbGFzcy0+ZG9OZXcoKTsKLSAgICAgIHZtLT51cGNhbGxzLT5pbnRWYWx1ZS0+c2V0SW5zdGFuY2VJbnQzMkZpZWxkKHJlcywgdmFsKTsKLSAgICB9IGVsc2UgaWYgKHByaW0tPmlzTG9uZygpKSB7Ci0gICAgICBzaW50NjQgdmFsID0gIHN0YXQgPyBmaWVsZC0+Z2V0U3RhdGljTG9uZ0ZpZWxkKCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPmdldEluc3RhbmNlTG9uZ0ZpZWxkKG9iaik7Ci0gICAgICByZXMgPSB2bS0+dXBjYWxscy0+bG9uZ0NsYXNzLT5kb05ldygpOwotICAgICAgdm0tPnVwY2FsbHMtPmxvbmdWYWx1ZS0+c2V0SW5zdGFuY2VMb25nRmllbGQocmVzLCB2YWwpOwotICAgIH0gZWxzZSBpZiAocHJpbS0+aXNGbG9hdCgpKSB7Ci0gICAgICBmbG9hdCB2YWwgPSAgc3RhdCA/IGZpZWxkLT5nZXRTdGF0aWNGbG9hdEZpZWxkKCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+Z2V0SW5zdGFuY2VGbG9hdEZpZWxkKG9iaik7Ci0gICAgICByZXMgPSB2bS0+dXBjYWxscy0+ZmxvYXRDbGFzcy0+ZG9OZXcoKTsKLSAgICAgIHZtLT51cGNhbGxzLT5mbG9hdFZhbHVlLT5zZXRJbnN0YW5jZUZsb2F0RmllbGQocmVzLCB2YWwpOwotICAgIH0gZWxzZSBpZiAocHJpbS0+aXNEb3VibGUoKSkgewotICAgICAgZG91YmxlIHZhbCA9ICBzdGF0ID8gZmllbGQtPmdldFN0YXRpY0RvdWJsZUZpZWxkKCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPmdldEluc3RhbmNlRG91YmxlRmllbGQob2JqKTsKLSAgICAgIHJlcyA9IHZtLT51cGNhbGxzLT5kb3VibGVDbGFzcy0+ZG9OZXcoKTsKLSAgICAgIHZtLT51cGNhbGxzLT5kb3VibGVWYWx1ZS0+c2V0SW5zdGFuY2VEb3VibGVGaWVsZChyZXMsIHZhbCk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChzdGF0KSB7Ci0gICAgICByZXMgPSAgZmllbGQtPmdldFN0YXRpY09iamVjdEZpZWxkKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlcyA9ICBmaWVsZC0+Z2V0SW5zdGFuY2VPYmplY3RGaWVsZChvYmopOwotICAgIH0KLSAgfQotICAKLSAgRU5EX05BVElWRV9FWENFUFRJT04KLQotICByZXR1cm4gcmVzOwotfQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfamF2YV9sYW5nX3JlZmxlY3RfRmllbGRfc2V0KAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotI2VuZGlmCi1KYXZhT2JqZWN0RmllbGQqIEZpZWxkLCBKYXZhT2JqZWN0KiBvYmosIEphdmFPYmplY3QqIHZhbCkgewotICAKLSAgbGx2bV9nY3Jvb3QoRmllbGQsIDApOwotICBsbHZtX2djcm9vdChvYmosIDApOwotICBsbHZtX2djcm9vdCh2YWwsIDApOwotICAKLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotICAKLSAgVXNlckNsYXNzKiBjbCA9IEphdmFPYmplY3RGaWVsZDo6Z2V0Q2xhc3MoRmllbGQpOwotICBKYXZhRmllbGQqIGZpZWxkID0gSmF2YU9iamVjdEZpZWxkOjpnZXRJbnRlcm5hbEZpZWxkKEZpZWxkKTsKLSAganZhbHVlIGJ1ZjsKLSAgYm9vbCBzdGF0ID0gaXNTdGF0aWMoZmllbGQtPmFjY2Vzcyk7Ci0gIAotICAKLSAgaWYgKHN0YXQpIHsKLSAgICBjbC0+aW5pdGlhbGlzZUNsYXNzKCk7Ci0gIH0gZWxzZSB7Ci0gICAgdmVyaWZ5TnVsbChvYmopOwotICB9Ci0gCi0gIGNvbnN0IFR5cGVkZWYqIHR5cGUgPSBmaWVsZC0+Z2V0U2lnbmF0dXJlKCk7Ci0gIEphdmFPYmplY3Q6OmRlY2Fwc3VsZVByaW1pdGl2ZSh2YWwsICZidWYsIHR5cGUpOwotICAKLQotICBpZiAodHlwZS0+aXNQcmltaXRpdmUoKSkgewotICAgIGNvbnN0IFByaW1pdGl2ZVR5cGVkZWYqIHByaW0gPSAoY29uc3QgUHJpbWl0aXZlVHlwZWRlZiopdHlwZTsKLSAgICBpZiAocHJpbS0+aXNCb29sKCkpIHsKLSAgICAgIGlmIChzdGF0KSB7Ci0gICAgICAgIGZpZWxkLT5zZXRTdGF0aWNJbnQ4RmllbGQoYnVmLnopOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZmllbGQtPnNldEluc3RhbmNlSW50OEZpZWxkKG9iaiwgYnVmLnopOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocHJpbS0+aXNCeXRlKCkpIHsKLSAgICAgIGlmIChzdGF0KSB7Ci0gICAgICAgIGZpZWxkLT5zZXRTdGF0aWNJbnQ4RmllbGQoYnVmLmIpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZmllbGQtPnNldEluc3RhbmNlSW50OEZpZWxkKG9iaiwgYnVmLmIpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocHJpbS0+aXNDaGFyKCkpIHsKLSAgICAgIGlmIChzdGF0KSB7Ci0gICAgICAgIGZpZWxkLT5zZXRTdGF0aWNJbnQxNkZpZWxkKGJ1Zi5jKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZpZWxkLT5zZXRJbnN0YW5jZUludDE2RmllbGQob2JqLCBidWYuYyk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChwcmltLT5pc1Nob3J0KCkpIHsKLSAgICAgIGlmIChzdGF0KSB7Ci0gICAgICAgIGZpZWxkLT5zZXRTdGF0aWNJbnQxNkZpZWxkKGJ1Zi5zKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZpZWxkLT5zZXRJbnN0YW5jZUludDE2RmllbGQob2JqLCBidWYucyk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChwcmltLT5pc0ludCgpKSB7Ci0gICAgICBpZiAoc3RhdCkgewotICAgICAgICBmaWVsZC0+c2V0U3RhdGljSW50MzJGaWVsZChidWYuaSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmaWVsZC0+c2V0SW5zdGFuY2VJbnQzMkZpZWxkKG9iaiwgYnVmLmkpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocHJpbS0+aXNMb25nKCkpIHsKLSAgICAgIGlmIChzdGF0KSB7Ci0gICAgICAgIGZpZWxkLT5zZXRTdGF0aWNMb25nRmllbGQoYnVmLmopOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZmllbGQtPnNldEluc3RhbmNlTG9uZ0ZpZWxkKG9iaiwgYnVmLmopOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocHJpbS0+aXNGbG9hdCgpKSB7Ci0gICAgICBpZiAoc3RhdCkgewotICAgICAgICBmaWVsZC0+c2V0U3RhdGljRmxvYXRGaWVsZChidWYuZik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmaWVsZC0+c2V0SW5zdGFuY2VGbG9hdEZpZWxkKG9iaiwgYnVmLmYpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocHJpbS0+aXNEb3VibGUoKSkgewotICAgICAgaWYgKHN0YXQpIHsKLSAgICAgICAgZmllbGQtPnNldFN0YXRpY0RvdWJsZUZpZWxkKGJ1Zi5kKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZpZWxkLT5zZXRJbnN0YW5jZURvdWJsZUZpZWxkKG9iaiwgYnVmLmQpOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoc3RhdCkgewotICAgICAgZmllbGQtPnNldFN0YXRpY09iamVjdEZpZWxkKHZhbCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZpZWxkLT5zZXRJbnN0YW5jZU9iamVjdEZpZWxkKG9iaiwgdmFsKTsKLSAgICB9Ci0gIH0KLQotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotfQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfamF2YV9sYW5nX3JlZmxlY3RfRmllbGRfc2V0Qm9vbGVhbigKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLSNlbmRpZgotSmF2YU9iamVjdEZpZWxkKiBGaWVsZCwgSmF2YU9iamVjdCogb2JqLCBqYm9vbGVhbiB2YWwpIHsKLSAgCi0gIGxsdm1fZ2Nyb290KEZpZWxkLCAwKTsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLQotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0KLSAgVXNlckNsYXNzKiBjbCA9IEphdmFPYmplY3RGaWVsZDo6Z2V0Q2xhc3MoRmllbGQpOwotICBKbmp2bSogdm0gPSBjbC0+Y2xhc3NMb2FkZXItPnZtOwotICBKYXZhRmllbGQqIGZpZWxkID0gSmF2YU9iamVjdEZpZWxkOjpnZXRJbnRlcm5hbEZpZWxkKEZpZWxkKTsKLSAgYm9vbCBzdGF0ID0gaXNTdGF0aWMoZmllbGQtPmFjY2Vzcyk7Ci0gIAotICBpZiAoc3RhdCkgewotICAgIGNsLT5pbml0aWFsaXNlQ2xhc3MoKTsKLSAgfSBlbHNlIHsKLSAgICB2ZXJpZnlOdWxsKG9iaik7Ci0gIH0KLSAKLSAgY29uc3QgVHlwZWRlZiogdHlwZSA9IGZpZWxkLT5nZXRTaWduYXR1cmUoKTsKLSAgaWYgKHR5cGUtPmlzUHJpbWl0aXZlKCkpIHsKLSAgICBjb25zdCBQcmltaXRpdmVUeXBlZGVmKiBwcmltID0gKGNvbnN0IFByaW1pdGl2ZVR5cGVkZWYqKXR5cGU7Ci0gICAgaWYgKHByaW0tPmlzQm9vbCgpKSB7Ci0gICAgICBpZiAoc3RhdCkgewotICAgICAgICBmaWVsZC0+c2V0U3RhdGljSW50OEZpZWxkKCh1aW50OCl2YWwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZmllbGQtPnNldEluc3RhbmNlSW50OEZpZWxkKG9iaiwgKHVpbnQ4KXZhbCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHZtLT5pbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIndyb25nIHR5cGUiKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgdm0tPmlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigid3JvbmcgdHlwZSIpOwotICB9Ci0KLSAgRU5EX05BVElWRV9FWENFUFRJT04KLSAgCi19Ci0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9qYXZhX2xhbmdfcmVmbGVjdF9GaWVsZF9zZXRCeXRlKAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotI2VuZGlmCi1KYXZhT2JqZWN0RmllbGQqIEZpZWxkLCBKYXZhT2JqZWN0KiBvYmosIGpieXRlIHZhbCkgewotICAKLSAgbGx2bV9nY3Jvb3QoRmllbGQsIDApOwotICBsbHZtX2djcm9vdChvYmosIDApOwotICAKLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotICAKLSAgVXNlckNsYXNzKiBjbCA9IEphdmFPYmplY3RGaWVsZDo6Z2V0Q2xhc3MoRmllbGQpOwotICBKbmp2bSogdm0gPSBjbC0+Y2xhc3NMb2FkZXItPnZtOwotICBKYXZhRmllbGQqIGZpZWxkID0gSmF2YU9iamVjdEZpZWxkOjpnZXRJbnRlcm5hbEZpZWxkKEZpZWxkKTsKLSAgYm9vbCBzdGF0ID0gaXNTdGF0aWMoZmllbGQtPmFjY2Vzcyk7Ci0gIAotICBpZiAoc3RhdCkgewotICAgIGNsLT5pbml0aWFsaXNlQ2xhc3MoKTsKLSAgfSBlbHNlIHsKLSAgICB2ZXJpZnlOdWxsKG9iaik7Ci0gIH0KLQotICBjb25zdCBUeXBlZGVmKiB0eXBlID0gZmllbGQtPmdldFNpZ25hdHVyZSgpOwotICBpZiAodHlwZS0+aXNQcmltaXRpdmUoKSkgewotICAgIGNvbnN0IFByaW1pdGl2ZVR5cGVkZWYqIHByaW0gPSAoY29uc3QgUHJpbWl0aXZlVHlwZWRlZiopdHlwZTsKLSAgICBpZiAocHJpbS0+aXNCeXRlKCkpIHsKLSAgICAgIGlmIChzdGF0KSB7Ci0gICAgICAgIGZpZWxkLT5zZXRTdGF0aWNJbnQ4RmllbGQoKHNpbnQ4KXZhbCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmaWVsZC0+c2V0SW5zdGFuY2VJbnQ4RmllbGQob2JqLCAoc2ludDgpdmFsKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHByaW0tPmlzU2hvcnQoKSkgewotICAgICAgaWYgKHN0YXQpIHsKLSAgICAgICAgZmllbGQtPnNldFN0YXRpY0ludDE2RmllbGQoKHNpbnQxNil2YWwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZmllbGQtPnNldEluc3RhbmNlSW50MTZGaWVsZChvYmosIChzaW50MTYpdmFsKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHByaW0tPmlzSW50KCkpIHsKLSAgICAgIGlmIChzdGF0KSB7Ci0gICAgICAgIGZpZWxkLT5zZXRTdGF0aWNJbnQzMkZpZWxkKChzaW50MzIpdmFsKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZpZWxkLT5zZXRJbnN0YW5jZUludDMyRmllbGQob2JqLCAoc2ludDMyKXZhbCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChwcmltLT5pc0xvbmcoKSkgewotICAgICAgaWYgKHN0YXQpIHsKLSAgICAgICAgZmllbGQtPnNldFN0YXRpY0xvbmdGaWVsZCgoc2ludDY0KXZhbCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmaWVsZC0+c2V0SW5zdGFuY2VMb25nRmllbGQob2JqLCAoc2ludDY0KXZhbCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChwcmltLT5pc0Zsb2F0KCkpIHsKLSAgICAgIGlmIChzdGF0KSB7Ci0gICAgICAgIGZpZWxkLT5zZXRTdGF0aWNGbG9hdEZpZWxkKChmbG9hdCl2YWwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZmllbGQtPnNldEluc3RhbmNlRmxvYXRGaWVsZChvYmosIChmbG9hdCl2YWwpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocHJpbS0+aXNEb3VibGUoKSkgewotICAgICAgaWYgKHN0YXQpIHsKLSAgICAgICAgZmllbGQtPnNldFN0YXRpY0RvdWJsZUZpZWxkKChkb3VibGUpdmFsKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZpZWxkLT5zZXRJbnN0YW5jZURvdWJsZUZpZWxkKG9iaiwgKGRvdWJsZSl2YWwpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICB2bS0+aWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ3cm9uZyB0eXBlIik7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHZtLT5pbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIndyb25nIHR5cGUiKTsKLSAgfQotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi19Ci0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9qYXZhX2xhbmdfcmVmbGVjdF9GaWVsZF9zZXRDaGFyKAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotI2VuZGlmCi1KYXZhT2JqZWN0RmllbGQqIEZpZWxkLCBKYXZhT2JqZWN0KiBvYmosIGpjaGFyIHZhbCkgewotICAKLSAgbGx2bV9nY3Jvb3QoRmllbGQsIDApOwotICBsbHZtX2djcm9vdChvYmosIDApOwotCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLQotICBVc2VyQ2xhc3MqIGNsID0gSmF2YU9iamVjdEZpZWxkOjpnZXRDbGFzcyhGaWVsZCk7Ci0gIEpuanZtKiB2bSA9IGNsLT5jbGFzc0xvYWRlci0+dm07Ci0gIEphdmFGaWVsZCogZmllbGQgPSBKYXZhT2JqZWN0RmllbGQ6OmdldEludGVybmFsRmllbGQoRmllbGQpOwotICBib29sIHN0YXQgPSBpc1N0YXRpYyhmaWVsZC0+YWNjZXNzKTsKLSAgCi0gIGlmIChzdGF0KSB7Ci0gICAgY2wtPmluaXRpYWxpc2VDbGFzcygpOwotICB9IGVsc2UgewotICAgIHZlcmlmeU51bGwob2JqKTsKLSAgfQotICBjb25zdCBUeXBlZGVmKiB0eXBlID0gZmllbGQtPmdldFNpZ25hdHVyZSgpOwotICBpZiAodHlwZS0+aXNQcmltaXRpdmUoKSkgewotICAgIGNvbnN0IFByaW1pdGl2ZVR5cGVkZWYqIHByaW0gPSAoY29uc3QgUHJpbWl0aXZlVHlwZWRlZiopdHlwZTsKLSAgICBpZiAocHJpbS0+aXNDaGFyKCkpIHsKLSAgICAgIGlmIChzdGF0KSB7Ci0gICAgICAgIGZpZWxkLT5zZXRTdGF0aWNJbnQxNkZpZWxkKCh1aW50MTYpdmFsKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZpZWxkLT5zZXRJbnN0YW5jZUludDE2RmllbGQob2JqLCAodWludDE2KXZhbCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChwcmltLT5pc0ludCgpKSB7Ci0gICAgICBpZiAoc3RhdCkgewotICAgICAgICBmaWVsZC0+c2V0U3RhdGljSW50MzJGaWVsZCgodWludDMyKXZhbCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmaWVsZC0+c2V0SW5zdGFuY2VJbnQzMkZpZWxkKG9iaiwgKHVpbnQzMil2YWwpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocHJpbS0+aXNMb25nKCkpIHsKLSAgICAgIGlmIChzdGF0KSB7Ci0gICAgICAgIGZpZWxkLT5zZXRTdGF0aWNMb25nRmllbGQoKHVpbnQ2NCl2YWwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZmllbGQtPnNldEluc3RhbmNlTG9uZ0ZpZWxkKG9iaiwgKHVpbnQ2NCl2YWwpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocHJpbS0+aXNGbG9hdCgpKSB7Ci0gICAgICBpZiAoc3RhdCkgewotICAgICAgICBmaWVsZC0+c2V0U3RhdGljRmxvYXRGaWVsZCgoZmxvYXQpKHVpbnQzMil2YWwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZmllbGQtPnNldEluc3RhbmNlRmxvYXRGaWVsZChvYmosIChmbG9hdCkodWludDMyKXZhbCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChwcmltLT5pc0RvdWJsZSgpKSB7Ci0gICAgICBpZiAoc3RhdCkgewotICAgICAgICBmaWVsZC0+c2V0U3RhdGljRG91YmxlRmllbGQoKGRvdWJsZSkodWludDY0KXZhbCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmaWVsZC0+c2V0SW5zdGFuY2VEb3VibGVGaWVsZChvYmosIChkb3VibGUpKHVpbnQ2NCl2YWwpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICB2bS0+aWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ3cm9uZyB0eXBlIik7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHZtLT5pbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIndyb25nIHR5cGUiKTsKLSAgfQotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi19Ci0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9qYXZhX2xhbmdfcmVmbGVjdF9GaWVsZF9zZXRTaG9ydCgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLSNlbmRpZgotSmF2YU9iamVjdEZpZWxkKiBGaWVsZCwgSmF2YU9iamVjdCogb2JqLCBqc2hvcnQgdmFsKSB7Ci0gIAotICBsbHZtX2djcm9vdChGaWVsZCwgMCk7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0KLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotCi0gIFVzZXJDbGFzcyogY2wgPSBKYXZhT2JqZWN0RmllbGQ6OmdldENsYXNzKEZpZWxkKTsKLSAgSm5qdm0qIHZtID0gY2wtPmNsYXNzTG9hZGVyLT52bTsKLSAgSmF2YUZpZWxkKiBmaWVsZCA9IEphdmFPYmplY3RGaWVsZDo6Z2V0SW50ZXJuYWxGaWVsZChGaWVsZCk7Ci0gIGJvb2wgc3RhdCA9IGlzU3RhdGljKGZpZWxkLT5hY2Nlc3MpOwotICAKLSAgaWYgKHN0YXQpIHsKLSAgICBjbC0+aW5pdGlhbGlzZUNsYXNzKCk7Ci0gIH0gZWxzZSB7Ci0gICAgdmVyaWZ5TnVsbChvYmopOwotICB9Ci0gIAotICBjb25zdCBUeXBlZGVmKiB0eXBlID0gZmllbGQtPmdldFNpZ25hdHVyZSgpOwotICBpZiAodHlwZS0+aXNQcmltaXRpdmUoKSkgewotICAgIGNvbnN0IFByaW1pdGl2ZVR5cGVkZWYqIHByaW0gPSAoY29uc3QgUHJpbWl0aXZlVHlwZWRlZiopdHlwZTsKLSAgICBpZiAocHJpbS0+aXNTaG9ydCgpKSB7Ci0gICAgICBpZiAoc3RhdCkgewotICAgICAgICBmaWVsZC0+c2V0U3RhdGljSW50MTZGaWVsZCgoc2ludDE2KXZhbCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmaWVsZC0+c2V0SW5zdGFuY2VJbnQxNkZpZWxkKG9iaiwgKHNpbnQxNil2YWwpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocHJpbS0+aXNJbnQoKSkgewotICAgICAgaWYgKHN0YXQpIHsKLSAgICAgICAgZmllbGQtPnNldFN0YXRpY0ludDMyRmllbGQoKHNpbnQzMil2YWwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZmllbGQtPnNldEluc3RhbmNlSW50MzJGaWVsZChvYmosIChzaW50MzIpdmFsKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHByaW0tPmlzTG9uZygpKSB7Ci0gICAgICBpZiAoc3RhdCkgewotICAgICAgICBmaWVsZC0+c2V0U3RhdGljTG9uZ0ZpZWxkKChzaW50NjQpdmFsKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChwcmltLT5pc0Zsb2F0KCkpIHsKLSAgICAgIGlmIChzdGF0KSB7Ci0gICAgICAgIGZpZWxkLT5zZXRTdGF0aWNGbG9hdEZpZWxkKChmbG9hdCl2YWwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZmllbGQtPnNldEluc3RhbmNlRmxvYXRGaWVsZChvYmosIChmbG9hdCl2YWwpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocHJpbS0+aXNEb3VibGUoKSkgewotICAgICAgaWYgKHN0YXQpIHsKLSAgICAgICAgZmllbGQtPnNldFN0YXRpY0RvdWJsZUZpZWxkKChkb3VibGUpdmFsKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZpZWxkLT5zZXRJbnN0YW5jZURvdWJsZUZpZWxkKG9iaiwgKGRvdWJsZSl2YWwpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICB2bS0+aWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ3cm9uZyB0eXBlIik7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHZtLT5pbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIndyb25nIHR5cGUiKTsKLSAgfQotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi19Ci0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9qYXZhX2xhbmdfcmVmbGVjdF9GaWVsZF9zZXRJbnQoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsCi0jZW5kaWYKLUphdmFPYmplY3RGaWVsZCogRmllbGQsIEphdmFPYmplY3QqIG9iaiwgamludCB2YWwpIHsKLSAgCi0gIGxsdm1fZ2Nyb290KEZpZWxkLCAwKTsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLQotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0KLSAgVXNlckNsYXNzKiBjbCA9IEphdmFPYmplY3RGaWVsZDo6Z2V0Q2xhc3MoRmllbGQpOwotICBKbmp2bSogdm0gPSBjbC0+Y2xhc3NMb2FkZXItPnZtOwotICBKYXZhRmllbGQqIGZpZWxkID0gSmF2YU9iamVjdEZpZWxkOjpnZXRJbnRlcm5hbEZpZWxkKEZpZWxkKTsKLSAgYm9vbCBzdGF0ID0gaXNTdGF0aWMoZmllbGQtPmFjY2Vzcyk7Ci0gIAotICBpZiAoc3RhdCkgewotICAgIGNsLT5pbml0aWFsaXNlQ2xhc3MoKTsKLSAgfSBlbHNlIHsKLSAgICB2ZXJpZnlOdWxsKG9iaik7Ci0gIH0KLSAgCi0gIGNvbnN0IFR5cGVkZWYqIHR5cGUgPSBmaWVsZC0+Z2V0U2lnbmF0dXJlKCk7Ci0gIGlmICh0eXBlLT5pc1ByaW1pdGl2ZSgpKSB7Ci0gICAgY29uc3QgUHJpbWl0aXZlVHlwZWRlZiogcHJpbSA9IChjb25zdCBQcmltaXRpdmVUeXBlZGVmKil0eXBlOwotICAgIGlmIChwcmltLT5pc0ludCgpKSB7Ci0gICAgICBpZiAoc3RhdCkgewotICAgICAgICBmaWVsZC0+c2V0U3RhdGljSW50MzJGaWVsZCgoc2ludDMyKXZhbCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmaWVsZC0+c2V0SW5zdGFuY2VJbnQzMkZpZWxkKG9iaiwgKHNpbnQzMil2YWwpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocHJpbS0+aXNMb25nKCkpIHsKLSAgICAgIGlmIChzdGF0KSB7Ci0gICAgICAgIGZpZWxkLT5zZXRTdGF0aWNMb25nRmllbGQoKHNpbnQ2NCl2YWwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZmllbGQtPnNldEluc3RhbmNlTG9uZ0ZpZWxkKG9iaiwgKHNpbnQ2NCl2YWwpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocHJpbS0+aXNGbG9hdCgpKSB7Ci0gICAgICBpZiAoc3RhdCkgewotICAgICAgICBmaWVsZC0+c2V0U3RhdGljRmxvYXRGaWVsZCgoZmxvYXQpdmFsKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZpZWxkLT5zZXRJbnN0YW5jZUZsb2F0RmllbGQob2JqLCAoZmxvYXQpdmFsKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHByaW0tPmlzRG91YmxlKCkpIHsKLSAgICAgIGlmIChzdGF0KSB7Ci0gICAgICAgIGZpZWxkLT5zZXRTdGF0aWNEb3VibGVGaWVsZCgoZG91YmxlKXZhbCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmaWVsZC0+c2V0SW5zdGFuY2VEb3VibGVGaWVsZChvYmosIChkb3VibGUpdmFsKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgdm0tPmlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigid3JvbmcgdHlwZSIpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB2bS0+aWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ3cm9uZyB0eXBlIik7Ci0gIH0KLQotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotfQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfamF2YV9sYW5nX3JlZmxlY3RfRmllbGRfc2V0TG9uZygKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLSNlbmRpZgotSmF2YU9iamVjdEZpZWxkKiBGaWVsZCwgSmF2YU9iamVjdCogb2JqLCBqbG9uZyB2YWwpIHsKLSAgCi0gIGxsdm1fZ2Nyb290KEZpZWxkLCAwKTsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLSAgCi0gIFVzZXJDbGFzcyogY2wgPSBKYXZhT2JqZWN0RmllbGQ6OmdldENsYXNzKEZpZWxkKTsKLSAgSm5qdm0qIHZtID0gY2wtPmNsYXNzTG9hZGVyLT52bTsKLSAgSmF2YUZpZWxkKiBmaWVsZCA9IEphdmFPYmplY3RGaWVsZDo6Z2V0SW50ZXJuYWxGaWVsZChGaWVsZCk7Ci0gIGJvb2wgc3RhdCA9IGlzU3RhdGljKGZpZWxkLT5hY2Nlc3MpOwotICAKLSAgaWYgKHN0YXQpIHsKLSAgICBjbC0+aW5pdGlhbGlzZUNsYXNzKCk7Ci0gIH0gZWxzZSB7Ci0gICAgdmVyaWZ5TnVsbChvYmopOwotICB9Ci0KLSAgY29uc3QgVHlwZWRlZiogdHlwZSA9IGZpZWxkLT5nZXRTaWduYXR1cmUoKTsKLSAgaWYgKHR5cGUtPmlzUHJpbWl0aXZlKCkpIHsKLSAgICBjb25zdCBQcmltaXRpdmVUeXBlZGVmKiBwcmltID0gKGNvbnN0IFByaW1pdGl2ZVR5cGVkZWYqKXR5cGU7Ci0gICAgaWYgKHByaW0tPmlzTG9uZygpKSB7Ci0gICAgICBpZiAoc3RhdCkgewotICAgICAgICBmaWVsZC0+c2V0U3RhdGljTG9uZ0ZpZWxkKChzaW50NjQpdmFsKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZpZWxkLT5zZXRJbnN0YW5jZUxvbmdGaWVsZChvYmosIChzaW50NjQpdmFsKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHByaW0tPmlzRmxvYXQoKSkgewotICAgICAgaWYgKHN0YXQpIHsKLSAgICAgICAgZmllbGQtPnNldFN0YXRpY0Zsb2F0RmllbGQoKGZsb2F0KXZhbCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmaWVsZC0+c2V0SW5zdGFuY2VGbG9hdEZpZWxkKG9iaiwgKGZsb2F0KXZhbCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChwcmltLT5pc0RvdWJsZSgpKSB7Ci0gICAgICBpZiAoc3RhdCkgewotICAgICAgICBmaWVsZC0+c2V0U3RhdGljRG91YmxlRmllbGQoKGRvdWJsZSl2YWwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZmllbGQtPnNldEluc3RhbmNlRG91YmxlRmllbGQob2JqLCAoZG91YmxlKXZhbCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHZtLT5pbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIndyb25nIHR5cGUiKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgdm0tPmlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigid3JvbmcgdHlwZSIpOwotICB9Ci0KLSAgRU5EX05BVElWRV9FWENFUFRJT04KLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2phdmFfbGFuZ19yZWZsZWN0X0ZpZWxkX3NldEZsb2F0KAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotI2VuZGlmCi1KYXZhT2JqZWN0RmllbGQqIEZpZWxkLCBKYXZhT2JqZWN0KiBvYmosIGpmbG9hdCB2YWwpIHsKLQotICBsbHZtX2djcm9vdChGaWVsZCwgMCk7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0KLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotCi0gIFVzZXJDbGFzcyogY2wgPSBKYXZhT2JqZWN0RmllbGQ6OmdldENsYXNzKEZpZWxkKTsKLSAgSm5qdm0qIHZtID0gY2wtPmNsYXNzTG9hZGVyLT52bTsKLSAgSmF2YUZpZWxkKiBmaWVsZCA9IEphdmFPYmplY3RGaWVsZDo6Z2V0SW50ZXJuYWxGaWVsZChGaWVsZCk7Ci0gIGJvb2wgc3RhdCA9IGlzU3RhdGljKGZpZWxkLT5hY2Nlc3MpOwotICAKLSAgaWYgKHN0YXQpIHsKLSAgICBjbC0+aW5pdGlhbGlzZUNsYXNzKCk7Ci0gIH0gZWxzZSB7Ci0gICAgdmVyaWZ5TnVsbChvYmopOwotICB9Ci0gIAotICBjb25zdCBUeXBlZGVmKiB0eXBlID0gZmllbGQtPmdldFNpZ25hdHVyZSgpOwotICBpZiAodHlwZS0+aXNQcmltaXRpdmUoKSkgewotICAgIGNvbnN0IFByaW1pdGl2ZVR5cGVkZWYqIHByaW0gPSAoY29uc3QgUHJpbWl0aXZlVHlwZWRlZiopdHlwZTsKLSAgICBpZiAocHJpbS0+aXNGbG9hdCgpKSB7Ci0gICAgICBpZiAoc3RhdCkgewotICAgICAgICBmaWVsZC0+c2V0U3RhdGljRmxvYXRGaWVsZCgoZmxvYXQpdmFsKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZpZWxkLT5zZXRJbnN0YW5jZUZsb2F0RmllbGQob2JqLCAoZmxvYXQpdmFsKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHByaW0tPmlzRG91YmxlKCkpIHsKLSAgICAgIGlmIChzdGF0KSB7Ci0gICAgICAgIGZpZWxkLT5zZXRTdGF0aWNEb3VibGVGaWVsZCgoZG91YmxlKXZhbCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmaWVsZC0+c2V0SW5zdGFuY2VEb3VibGVGaWVsZChvYmosIChkb3VibGUpdmFsKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgdm0tPmlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigid3JvbmcgdHlwZSIpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB2bS0+aWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ3cm9uZyB0eXBlIik7Ci0gIH0KLQotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotfQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfamF2YV9sYW5nX3JlZmxlY3RfRmllbGRfc2V0RG91YmxlKAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotI2VuZGlmCi1KYXZhT2JqZWN0RmllbGQqIEZpZWxkLCBKYXZhT2JqZWN0KiBvYmosIGpkb3VibGUgdmFsKSB7Ci0gIAotICBsbHZtX2djcm9vdChGaWVsZCwgMCk7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0KLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotCi0gIFVzZXJDbGFzcyogY2wgPSBKYXZhT2JqZWN0RmllbGQ6OmdldENsYXNzKEZpZWxkKTsKLSAgSm5qdm0qIHZtID0gY2wtPmNsYXNzTG9hZGVyLT52bTsKLSAgSmF2YUZpZWxkKiBmaWVsZCA9IEphdmFPYmplY3RGaWVsZDo6Z2V0SW50ZXJuYWxGaWVsZChGaWVsZCk7Ci0gIGJvb2wgc3RhdCA9IGlzU3RhdGljKGZpZWxkLT5hY2Nlc3MpOwotICAKLSAgaWYgKHN0YXQpIHsKLSAgICBjbC0+aW5pdGlhbGlzZUNsYXNzKCk7Ci0gIH0gZWxzZSB7Ci0gICAgdmVyaWZ5TnVsbChvYmopOwotICB9Ci0gIAotICBjb25zdCBUeXBlZGVmKiB0eXBlID0gZmllbGQtPmdldFNpZ25hdHVyZSgpOwotICBpZiAodHlwZS0+aXNQcmltaXRpdmUoKSkgewotICAgIGNvbnN0IFByaW1pdGl2ZVR5cGVkZWYqIHByaW0gPSAoY29uc3QgUHJpbWl0aXZlVHlwZWRlZiopdHlwZTsKLSAgICBpZiAocHJpbS0+aXNEb3VibGUoKSkgewotICAgICAgaWYgKHN0YXQpIHsKLSAgICAgICAgZmllbGQtPnNldFN0YXRpY0RvdWJsZUZpZWxkKChkb3VibGUpdmFsKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZpZWxkLT5zZXRJbnN0YW5jZURvdWJsZUZpZWxkKG9iaiwgKGRvdWJsZSl2YWwpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICB2bS0+aWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ3cm9uZyB0eXBlIik7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHZtLT5pbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIndyb25nIHR5cGUiKTsKLSAgfQotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi19Ci0KLS8vIE5ldmVyIHRocm93cy4KLUpOSUVYUE9SVCBqbG9uZyBKTklDQUxMIEphdmFfc3VuX21pc2NfVW5zYWZlX29iamVjdEZpZWxkT2Zmc2V0KAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotI2VuZGlmCi1KYXZhT2JqZWN0KiBVbnNhZmUsIEphdmFPYmplY3RGaWVsZCogRmllbGQpIHsKLSAgCi0gIGxsdm1fZ2Nyb290KEZpZWxkLCAwKTsKLSAgbGx2bV9nY3Jvb3QoVW5zYWZlLCAwKTsKLQotICBKYXZhRmllbGQqIGZpZWxkID0gSmF2YU9iamVjdEZpZWxkOjpnZXRJbnRlcm5hbEZpZWxkKEZpZWxkKTsKLSAgcmV0dXJuIChqbG9uZylmaWVsZC0+cHRyT2Zmc2V0OwotfQotCi19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvQ2xhc3NwYXRoL0NsYXNzcGF0aE1ldGhvZC5pbmMgYi92bWtpdC9saWIvSjMvQ2xhc3NwYXRoL0NsYXNzcGF0aE1ldGhvZC5pbmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZmM1NWIuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL0ozL0NsYXNzcGF0aC9DbGFzc3BhdGhNZXRob2QuaW5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8vPT09LSBDbGFzc3BhdGhNZXRob2QuY3BwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLz09PS0tLS0tLS0tLS0tLS0gR05VIGNsYXNzcGF0aCBqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QgLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLSNpbmNsdWRlICJDbGFzc3BhdGguaCIKLSNpbmNsdWRlICJDbGFzc3BhdGhSZWZsZWN0LmgiCi0jaW5jbHVkZSAiSmF2YUFycmF5LmgiCi0jaW5jbHVkZSAiSmF2YUNsYXNzLmgiCi0jaW5jbHVkZSAiSmF2YU9iamVjdC5oIgotI2luY2x1ZGUgIkphdmFUeXBlcy5oIgotI2luY2x1ZGUgIkphdmFUaHJlYWQuaCIKLSNpbmNsdWRlICJKYXZhVXBjYWxscy5oIgotI2luY2x1ZGUgIkpuanZtLmgiCi0jaW5jbHVkZSAiSm5qdm1DbGFzc0xvYWRlci5oIgotCi11c2luZyBuYW1lc3BhY2UgajM7Ci0KLWV4dGVybiAiQyIgewotCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfamF2YV9sYW5nX3JlZmxlY3RfTWV0aG9kX2dldE1vZGlmaWVyc0ludGVybmFsKAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LCAKLSNlbmRpZgotSmF2YU9iamVjdE1ldGhvZCogTWV0aCkgeyAKLSAgCi0gIGppbnQgcmVzID0gMDsKLSAgbGx2bV9nY3Jvb3QoTWV0aCwgMCk7Ci0KLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotICAKLSAgSmF2YU1ldGhvZCogbWV0aCA9IEphdmFPYmplY3RNZXRob2Q6OmdldEludGVybmFsTWV0aG9kKE1ldGgpOyAKLSAgcmVzID0gbWV0aC0+YWNjZXNzOwotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLSAgcmV0dXJuIHJlczsKLX0KLQotSk5JRVhQT1JUIEphdmFPYmplY3QqIEpOSUNBTEwgSmF2YV9qYXZhX2xhbmdfcmVmbGVjdF9NZXRob2RfZ2V0UmV0dXJuVHlwZSgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwgCi0jZW5kaWYKLUphdmFPYmplY3RNZXRob2QqIE1ldGgpIHsKLQotICBKYXZhT2JqZWN0KiByZXMgPSAwOwotICBsbHZtX2djcm9vdChNZXRoLCAwKTsKLSAgbGx2bV9nY3Jvb3QocmVzLCAwKTsKLQotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0KLSAgVXNlckNsYXNzKiBjbCA9IEphdmFPYmplY3RNZXRob2Q6OmdldENsYXNzKE1ldGgpOwotICBKYXZhTWV0aG9kKiBtZXRoID0gSmF2YU9iamVjdE1ldGhvZDo6Z2V0SW50ZXJuYWxNZXRob2QoTWV0aCk7IAotICBKbmp2bUNsYXNzTG9hZGVyKiBsb2FkZXIgPSBjbC0+Y2xhc3NMb2FkZXI7Ci0gIHJlcyA9IG1ldGgtPmdldFJldHVyblR5cGUobG9hZGVyKTsKLQotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotCi0gIHJldHVybiByZXM7Ci19Ci0KLQotSk5JRVhQT1JUIEphdmFPYmplY3QqIEpOSUNBTEwgSmF2YV9qYXZhX2xhbmdfcmVmbGVjdF9NZXRob2RfZ2V0UGFyYW1ldGVyVHlwZXMoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsIAotI2VuZGlmCi1KYXZhT2JqZWN0TWV0aG9kKiBNZXRoKSB7Ci0KLSAgSmF2YU9iamVjdCogcmVzID0gMDsKLSAgbGx2bV9nY3Jvb3QoTWV0aCwgMCk7Ci0gIGxsdm1fZ2Nyb290KHJlcywgMCk7Ci0KLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotCi0gIFVzZXJDbGFzcyogY2wgPSBKYXZhT2JqZWN0TWV0aG9kOjpnZXRDbGFzcyhNZXRoKTsKLSAgSmF2YU1ldGhvZCogbWV0aCA9IEphdmFPYmplY3RNZXRob2Q6OmdldEludGVybmFsTWV0aG9kKE1ldGgpOwotICBKbmp2bUNsYXNzTG9hZGVyKiBsb2FkZXIgPSBjbC0+Y2xhc3NMb2FkZXI7Ci0gIAotICByZXMgPSBtZXRoLT5nZXRQYXJhbWV0ZXJUeXBlcyhsb2FkZXIpOwotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLSAgcmV0dXJuIHJlczsKLX0KLQotSmF2YU9iamVjdCogcHJvY2VlZE1ldGhvZChKYXZhT2JqZWN0TWV0aG9kKiBNZXRoLCBKYXZhT2JqZWN0KiBvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5T2JqZWN0KiBhcmdzLCBKYXZhT2JqZWN0KiBDbCwgamludCBpbmRleCkgCi0gIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSk7Ci0KLUphdmFPYmplY3QqIHByb2NlZWRNZXRob2QoSmF2YU9iamVjdE1ldGhvZCogTWV0aCwgSmF2YU9iamVjdCogb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheU9iamVjdCogYXJncywgSmF2YU9iamVjdCogQ2wsIGppbnQgaW5kZXgpIHsKLQotICBKYXZhT2JqZWN0KiByZXMgPSAwOwotICBKYXZhT2JqZWN0KiBqZXhjID0gMDsKLQltdm06OmdjKiBleGMgPSAwOwotICAKLSAgbGx2bV9nY3Jvb3QocmVzLCAwKTsKLSAgbGx2bV9nY3Jvb3QoTWV0aCwgMCk7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gIGxsdm1fZ2Nyb290KGFyZ3MsIDApOwotICBsbHZtX2djcm9vdChDbCwgMCk7Ci0gIGxsdm1fZ2Nyb290KGV4YywgMCk7Ci0gIGxsdm1fZ2Nyb290KGpleGMsIDApOwotCi0gIEpuanZtKiB2bSA9IEphdmFUaHJlYWQ6OmdldCgpLT5nZXRKVk0oKTsKLQotICBKYXZhTWV0aG9kKiBtZXRoID0gSmF2YU9iamVjdE1ldGhvZDo6Z2V0SW50ZXJuYWxNZXRob2QoTWV0aCk7Ci0gIAotICBzaW50MzIgbmJBcmdzID0gYXJncyA/IEFycmF5T2JqZWN0OjpnZXRTaXplKGFyZ3MpIDogMDsKLSAgU2lnbmRlZiogc2lnbiA9IG1ldGgtPmdldFNpZ25hdHVyZSgpOwotICBzaW50MzIgc2l6ZSA9IHNpZ24tPm5iQXJndW1lbnRzOwotCi0gIG12bTo6VGhyZWFkQWxsb2NhdG9yIGFsbG9jYXRvcjsKLSAganZhbHVlKiBidWYgPSBzaXplID8KLSAgICAgIChqdmFsdWUqKWFsbG9jYXRvci5BbGxvY2F0ZShzaXplICogc2l6ZW9mKGp2YWx1ZSkpIDogTlVMTDsKLSAgCi0gIGlmIChuYkFyZ3MgPT0gc2l6ZSkgewotICAgIFVzZXJDb21tb25DbGFzcyogX2NsID0gVXNlckNvbW1vbkNsYXNzOjpyZXNvbHZlZEltcGxDbGFzcyhDbCwgZmFsc2UpOwotICAgIFVzZXJDbGFzcyogY2wgPSAoVXNlckNsYXNzKilfY2w7Ci0gICAgCi0gICAgaWYgKGlzVmlydHVhbChtZXRoLT5hY2Nlc3MpKSB7Ci0gICAgICB2ZXJpZnlOdWxsKG9iaik7Ci0gICAgICBVc2VyQ29tbW9uQ2xhc3MqIG9iakNsID0gSmF2YU9iamVjdDo6Z2V0Q2xhc3Mob2JqKTsKLSAgICAgIGlmICghKG9iakNsLT5pc0Fzc2lnbmFibGVGcm9tKGNsKSkpIHsKLSAgICAgICAgdm0tPmlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiPHRoaXM+IGlzIG5vdCBhIHZhbGlkIHR5cGUiKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGlzSW50ZXJmYWNlKGNsLT5hY2Nlc3MpKSB7Ci0gICAgICAgIGNsLT5pbml0aWFsaXNlQ2xhc3MoKTsKLSAgICAgICAgVXNlckNsYXNzKiBtZXRob2RDbCA9IDA7Ci0gICAgICAgIFVzZXJDbGFzcyogbG9va3VwID0gb2JqQ2wtPmlzQXJyYXkoKSA/IG9iakNsLT5zdXBlciA6IG9iakNsLT5hc0NsYXNzKCk7Ci0gICAgICAgIG1ldGggPSBsb29rdXAtPmxvb2t1cE1ldGhvZChtZXRoLT5uYW1lLCBtZXRoLT50eXBlLCBmYWxzZSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXRob2RDbCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNsLT5pbml0aWFsaXNlQ2xhc3MoKTsKLSAgICB9Ci0gICAgCi0gICAgSmF2YU9iamVjdCoqIHB0ciA9IEFycmF5T2JqZWN0OjpnZXRFbGVtZW50cyhhcmdzKTsKLSAgICBUeXBlZGVmKiBjb25zdCogYXJndW1lbnRzID0gc2lnbi0+Z2V0QXJndW1lbnRzVHlwZSgpOwotICAgIGZvciAoc2ludDMyIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICBKYXZhT2JqZWN0OjpkZWNhcHN1bGVQcmltaXRpdmUocHRyW2ldLCAmYnVmW2ldLCBhcmd1bWVudHNbaV0pOwotICAgICAgaWYgKCFhcmd1bWVudHNbaV0tPmlzUHJpbWl0aXZlKCkpIHsKLSAgICAgICAgYnVmW2ldLmwgPSByZWludGVycHJldF9jYXN0PGpvYmplY3Q+KCZwdHJbaV0pOwotICAgICAgfQotICAgIH0KLSAgICAKLQotI2RlZmluZSBSVU5fTUVUSChUWVBFLCBWQVIpCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0gICAgVFJZIHsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLSAgICAgIGlmIChpc1ZpcnR1YWwobWV0aC0+YWNjZXNzKSkgewkJCQkJCQkJCQkJCQkJCQkJCVwKLSAgICAgICAgaWYgKGlzUHVibGljKG1ldGgtPmFjY2VzcykgJiYgIWlzRmluYWwobWV0aC0+YWNjZXNzKSAmJgkJCQkJXAotICAgICAgICAgICAgIWlzRmluYWwobWV0aC0+Y2xhc3NEZWYtPmFjY2VzcykpIHsJCQkJCQkJCQkJCQkJXAotICAgICAgICAgIFZBUiA9IG1ldGgtPmludm9rZSMjVFlQRSMjVmlydHVhbEJ1ZihjbCwgb2JqLCBidWYpOwkJCQkJCVwKLSAgICAgICAgfSBlbHNlIHsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotICAgICAgICAgIFZBUiA9IG1ldGgtPmludm9rZSMjVFlQRSMjU3BlY2lhbEJ1ZihjbCwgb2JqLCBidWYpOwkJCQkJCVwKLQkJCQl9CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQl9IGVsc2UgewkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCQkJCVZBUiA9IG1ldGgtPmludm9rZSMjVFlQRSMjU3RhdGljQnVmKGNsLCBidWYpOwkJCQkJCQkJCQlcCi0JCQl9CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCQl9IENBVENIIHsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0gICAgICBleGMgPSBtdm06OlRocmVhZDo6Z2V0KCktPmdldFBlbmRpbmdFeGNlcHRpb24oKTsJCQkJCQkJCQlcCi0gICAgfSBFTkRfQ0FUQ0g7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLSAgICBpZiAoZXhjKSB7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQltdm06OlRocmVhZCogbXV0ID0gbXZtOjpUaHJlYWQ6OmdldCgpOwkJCQkJCQkJCQkJCQkJXAotCQkJamV4YyA9IEpuanZtOjphc0phdmFFeGNlcHRpb24oZXhjKTsJCQkJCQkJCQkJCQkJCQkJXAotICAgICAgaWYgKGpleGMgJiYgSmF2YU9iamVjdDo6Z2V0Q2xhc3MoamV4YyktPmlzQXNzaWduYWJsZUZyb20oCQkJCQlcCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJIHZtLT51cGNhbGxzLT5uZXdFeGNlcHRpb24pKSB7IFwKLSAgICAgICAgbXV0LT5jbGVhclBlbmRpbmdFeGNlcHRpb24oKTsJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQkJSmF2YVRocmVhZDo6ajNUaHJlYWQobXV0KS0+Z2V0SlZNKCktPmludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oamV4Yyk7IFwKLSAgICAgIH0gZWxzZSB7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0gICAgICAgIG11dC0+dGhyb3dJdCgpOwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0gICAgICB9CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotICAgICAgcmV0dXJuIE5VTEw7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotICAgIH0KLSAgICAKLSAgICBUeXBlZGVmKiByZXRUeXBlID0gc2lnbi0+Z2V0UmV0dXJuVHlwZSgpOwotICAgIGlmIChyZXRUeXBlLT5pc1ByaW1pdGl2ZSgpKSB7Ci0gICAgICBQcmltaXRpdmVUeXBlZGVmKiBwcmltID0gKFByaW1pdGl2ZVR5cGVkZWYqKXJldFR5cGU7Ci0gICAgICBpZiAocHJpbS0+aXNWb2lkKCkpIHsKLSAgICAgICAgcmVzID0gMDsKLSAgICAgICAgdWludDMyIHZhbCA9IDA7Ci0gICAgICAgIFJVTl9NRVRIKEludCwgdmFsKTsKLSAgICAgIH0gZWxzZSBpZiAocHJpbS0+aXNCb29sKCkpIHsKLSAgICAgICAgdWludDMyIHZhbCA9IDA7Ci0gICAgICAgIFJVTl9NRVRIKEludCwgdmFsKTsKLSAgICAgICAgcmVzID0gdm0tPnVwY2FsbHMtPmJvb2xDbGFzcy0+ZG9OZXcoKTsKLSAgICAgICAgdm0tPnVwY2FsbHMtPmJvb2xWYWx1ZS0+c2V0SW5zdGFuY2VJbnQ4RmllbGQocmVzLCB2YWwpOwotICAgICAgfSBlbHNlIGlmIChwcmltLT5pc0J5dGUoKSkgewotICAgICAgICB1aW50MzIgdmFsID0gMDsKLSAgICAgICAgUlVOX01FVEgoSW50LCB2YWwpOwotICAgICAgICByZXMgPSB2bS0+dXBjYWxscy0+Ynl0ZUNsYXNzLT5kb05ldygpOwotICAgICAgICB2bS0+dXBjYWxscy0+Ynl0ZVZhbHVlLT5zZXRJbnN0YW5jZUludDhGaWVsZChyZXMsIHZhbCk7Ci0gICAgICB9IGVsc2UgaWYgKHByaW0tPmlzQ2hhcigpKSB7Ci0gICAgICAgIHVpbnQzMiB2YWwgPSAwOwotICAgICAgICBSVU5fTUVUSChJbnQsIHZhbCk7Ci0gICAgICAgIHJlcyA9IHZtLT51cGNhbGxzLT5jaGFyQ2xhc3MtPmRvTmV3KCk7Ci0gICAgICAgIHZtLT51cGNhbGxzLT5jaGFyVmFsdWUtPnNldEluc3RhbmNlSW50MTZGaWVsZChyZXMsIHZhbCk7Ci0gICAgICB9IGVsc2UgaWYgKHByaW0tPmlzU2hvcnQoKSkgewotICAgICAgICB1aW50MzIgdmFsID0gMDsKLSAgICAgICAgUlVOX01FVEgoSW50LCB2YWwpOwotICAgICAgICByZXMgPSB2bS0+dXBjYWxscy0+c2hvcnRDbGFzcy0+ZG9OZXcoKTsKLSAgICAgICAgdm0tPnVwY2FsbHMtPnNob3J0VmFsdWUtPnNldEluc3RhbmNlSW50MTZGaWVsZChyZXMsIHZhbCk7Ci0gICAgICB9IGVsc2UgaWYgKHByaW0tPmlzSW50KCkpIHsKLSAgICAgICAgdWludDMyIHZhbCA9IDA7Ci0gICAgICAgIFJVTl9NRVRIKEludCwgdmFsKTsKLSAgICAgICAgcmVzID0gdm0tPnVwY2FsbHMtPmludENsYXNzLT5kb05ldygpOwotICAgICAgICB2bS0+dXBjYWxscy0+aW50VmFsdWUtPnNldEluc3RhbmNlSW50MzJGaWVsZChyZXMsIHZhbCk7Ci0gICAgICB9IGVsc2UgaWYgKHByaW0tPmlzTG9uZygpKSB7Ci0gICAgICAgIHNpbnQ2NCB2YWwgPSAwOwotICAgICAgICBSVU5fTUVUSChMb25nLCB2YWwpOwotICAgICAgICByZXMgPSB2bS0+dXBjYWxscy0+bG9uZ0NsYXNzLT5kb05ldygpOwotICAgICAgICB2bS0+dXBjYWxscy0+bG9uZ1ZhbHVlLT5zZXRJbnN0YW5jZUxvbmdGaWVsZChyZXMsIHZhbCk7Ci0gICAgICB9IGVsc2UgaWYgKHByaW0tPmlzRmxvYXQoKSkgewotICAgICAgICBmbG9hdCB2YWwgPSAwOwotICAgICAgICBSVU5fTUVUSChGbG9hdCwgdmFsKTsKLSAgICAgICAgcmVzID0gdm0tPnVwY2FsbHMtPmZsb2F0Q2xhc3MtPmRvTmV3KCk7Ci0gICAgICAgIHZtLT51cGNhbGxzLT5mbG9hdFZhbHVlLT5zZXRJbnN0YW5jZUZsb2F0RmllbGQocmVzLCB2YWwpOwotICAgICAgfSBlbHNlIGlmIChwcmltLT5pc0RvdWJsZSgpKSB7Ci0gICAgICAgIGRvdWJsZSB2YWwgPSAwOwotICAgICAgICBSVU5fTUVUSChEb3VibGUsIHZhbCk7Ci0gICAgICAgIHJlcyA9IHZtLT51cGNhbGxzLT5kb3VibGVDbGFzcy0+ZG9OZXcoKTsKLSAgICAgICAgdm0tPnVwY2FsbHMtPmRvdWJsZVZhbHVlLT5zZXRJbnN0YW5jZURvdWJsZUZpZWxkKHJlcywgdmFsKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgUlVOX01FVEgoSmF2YU9iamVjdCwgcmVzKTsKLSAgICB9IAotICB9IGVsc2UgewotICAgIHZtLT5pbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIndyb25nIG51bWJlciBvZiBhcmd1bWVudHMiKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHJldHVybiByZXM7Ci19Ci0KLSN1bmRlZiBSVU5fTUVUSAotCi1KTklFWFBPUlQgSmF2YU9iamVjdCogSk5JQ0FMTCBKYXZhX2phdmFfbGFuZ19yZWZsZWN0X01ldGhvZF9pbnZva2VOYXRpdmUoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsIAotI2VuZGlmCi1KYXZhT2JqZWN0TWV0aG9kKiBNZXRoLCBKYXZhT2JqZWN0KiBvYmosIEFycmF5T2JqZWN0KiBhcmdzLCBKYXZhT2JqZWN0KiBDbCwgamludCBpbmRleCkgewotICAKLSAgSmF2YU9iamVjdCogcmVzID0gMDsKLSAgbGx2bV9nY3Jvb3QocmVzLCAwKTsKLSAgbGx2bV9nY3Jvb3QoTWV0aCwgMCk7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gIGxsdm1fZ2Nyb290KGFyZ3MsIDApOwotICBsbHZtX2djcm9vdChDbCwgMCk7Ci0KLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotCi0gIHJlcyA9IHByb2NlZWRNZXRob2QoTWV0aCwgb2JqLCBhcmdzLCBDbCwgaW5kZXgpOwotICAKLSAgRU5EX05BVElWRV9FWENFUFRJT04KLQotICByZXR1cm4gcmVzOwotfQotCi1KTklFWFBPUlQgQXJyYXlPYmplY3QqIEpOSUNBTEwgSmF2YV9qYXZhX2xhbmdfcmVmbGVjdF9NZXRob2RfZ2V0RXhjZXB0aW9uVHlwZXMoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsIAotI2VuZGlmCi1KYXZhT2JqZWN0TWV0aG9kKiBNZXRoKSB7Ci0KLSAgQXJyYXlPYmplY3QqIHJlcyA9IDA7Ci0gIGxsdm1fZ2Nyb290KE1ldGgsIDApOwotICBsbHZtX2djcm9vdChyZXMsIDApOwotCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLQotICB2ZXJpZnlOdWxsKE1ldGgpOwotICBVc2VyQ2xhc3MqIGNsID0gSmF2YU9iamVjdE1ldGhvZDo6Z2V0Q2xhc3MoTWV0aCk7Ci0gIEphdmFNZXRob2QqIG1ldGggPSBKYXZhT2JqZWN0TWV0aG9kOjpnZXRJbnRlcm5hbE1ldGhvZChNZXRoKTsKLSAgSm5qdm1DbGFzc0xvYWRlciogbG9hZGVyID0gY2wtPmNsYXNzTG9hZGVyOwotICByZXMgPSBtZXRoLT5nZXRFeGNlcHRpb25UeXBlcyhsb2FkZXIpOwotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLSAgcmV0dXJuIHJlczsKLX0KLQotSk5JRVhQT1JUIEphdmFPYmplY3QqIEpOSUNBTEwgSmF2YV9qYXZhX2xhbmdfcmVmbGVjdF9NZXRob2RfZ2V0U2lnbmF0dXJlKAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LCAKLSNlbmRpZgotSmF2YU9iamVjdE1ldGhvZCogTWV0aCkgewotCi0gIEphdmFPYmplY3QqIHJlc3VsdCA9IDA7Ci0gIGxsdm1fZ2Nyb290KE1ldGgsIDApOwotICBsbHZtX2djcm9vdChyZXN1bHQsIDApOwotCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLQotICB2ZXJpZnlOdWxsKE1ldGgpOwotICBKYXZhTWV0aG9kKiBtZXRoID0gSmF2YU9iamVjdE1ldGhvZDo6Z2V0SW50ZXJuYWxNZXRob2QoTWV0aCk7Ci0gIEpuanZtKiB2bSA9IEphdmFUaHJlYWQ6OmdldCgpLT5nZXRKVk0oKTsKLSAgcmVzdWx0ID0gdm0tPmludGVybmFsVVRGOFRvU3RyKG1ldGgtPnR5cGUpOwotICAKLSAgRU5EX05BVElWRV9FWENFUFRJT04KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvQ2xhc3NwYXRoL0NsYXNzcGF0aFJlZmxlY3QuaCBiL3Zta2l0L2xpYi9KMy9DbGFzc3BhdGgvQ2xhc3NwYXRoUmVmbGVjdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODUzN2IxLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9KMy9DbGFzc3BhdGgvQ2xhc3NwYXRoUmVmbGVjdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8vPT09LS0gQ2xhc3NwYXRoUmVmbGVjdC5oIC0gSW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgY29yZSBzeXN0ZW0gY2xhc3NlcyAtLS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIEpOSlZNX0NMQVNTUEFUSF9SRUZMRUNUX0gKLSNkZWZpbmUgSk5KVk1fQ0xBU1NQQVRIX1JFRkxFQ1RfSAotCi0jaW5jbHVkZSAibXZtL0dDLmgiCi0KLSNpbmNsdWRlICJKYXZhQ2xhc3MuaCIKLSNpbmNsdWRlICJKYXZhT2JqZWN0LmgiCi0jaW5jbHVkZSA8SmF2YVRocmVhZC5oPgotCi1leHRlcm4gIkMiIGozOjpKYXZhT2JqZWN0KiBpbnRlcm5hbEZpbGxJblN0YWNrVHJhY2UoajM6OkphdmFPYmplY3QqKTsKLQotbmFtZXNwYWNlIGozIHsKLQotY2xhc3MgSmF2YU9iamVjdENsYXNzIDogcHVibGljIEphdmFPYmplY3QgewotcHJpdmF0ZToKLSAgSmF2YU9iamVjdCogc2lnbmVyczsKLSAgSmF2YU9iamVjdCogcGQ7Ci0gIFVzZXJDb21tb25DbGFzcyogdm1kYXRhOwotICBKYXZhT2JqZWN0KiBjb25zdHJ1Y3RvcjsKLQotcHVibGljOgotICAKLSAgc3RhdGljIFVzZXJDb21tb25DbGFzcyogZ2V0Q2xhc3MoSmF2YU9iamVjdENsYXNzKiBjbCkgewotICAgIGxsdm1fZ2Nyb290KGNsLCAwKTsKLSAgICByZXR1cm4gY2wtPnZtZGF0YTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIHNldENsYXNzKEphdmFPYmplY3RDbGFzcyogY2wsIFVzZXJDb21tb25DbGFzcyogdm1kYXRhKSB7Ci0gICAgbGx2bV9nY3Jvb3QoY2wsIDApOwotICAgIGNsLT52bWRhdGEgPSB2bWRhdGE7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBzZXRQcm90ZWN0aW9uRG9tYWluKEphdmFPYmplY3RDbGFzcyogY2wsIEphdmFPYmplY3QqIHBkKSB7Ci0gICAgbGx2bV9nY3Jvb3QoY2wsIDApOwotICAgIGxsdm1fZ2Nyb290KHBkLCAwKTsKLSAgICBjbC0+cGQgPSBwZDsKLSAgfQotICAKLSAgc3RhdGljIEphdmFPYmplY3QqIGdldFByb3RlY3Rpb25Eb21haW4oSmF2YU9iamVjdENsYXNzKiBjbCkgewotICAgIGxsdm1fZ2Nyb290KGNsLCAwKTsKLSAgICByZXR1cm4gY2wtPnBkOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgc3RhdGljVHJhY2VyKEphdmFPYmplY3RDbGFzcyogb2JqLCB1aW50cHRyX3QgY2xvc3VyZSkgewotICAgIG12bTo6Q29sbGVjdG9yOjptYXJrQW5kVHJhY2Uob2JqLCAmb2JqLT5wZCwgY2xvc3VyZSk7Ci0gICAgbXZtOjpDb2xsZWN0b3I6Om1hcmtBbmRUcmFjZShvYmosICZvYmotPnNpZ25lcnMsIGNsb3N1cmUpOwotICAgIG12bTo6Q29sbGVjdG9yOjptYXJrQW5kVHJhY2Uob2JqLCAmb2JqLT5jb25zdHJ1Y3RvciwgY2xvc3VyZSk7Ci0gICAgaWYgKG9iai0+dm1kYXRhKSB7Ci0gICAgICBKYXZhT2JqZWN0KiogT2JqID0gb2JqLT52bWRhdGEtPmNsYXNzTG9hZGVyLT5nZXRKYXZhQ2xhc3NMb2FkZXJQdHIoKTsKLSAgICAgIGlmICgqT2JqKSBtdm06OkNvbGxlY3Rvcjo6bWFya0FuZFRyYWNlUm9vdChPYmosIGNsb3N1cmUpOwotICAgIH0KLSAgfQotfTsKLQotY2xhc3MgSmF2YU9iamVjdEZpZWxkIDogcHVibGljIEphdmFPYmplY3QgewotcHJpdmF0ZToKLSAgdWludDggZmxhZzsKLSAgSmF2YU9iamVjdENsYXNzKiBkZWNsYXJpbmdDbGFzczsKLSAgSmF2YU9iamVjdCogbmFtZTsKLSAgdWludDMyIHNsb3Q7Ci0KLXB1YmxpYzoKLQotICBzdGF0aWMgdm9pZCBzdGF0aWNUcmFjZXIoSmF2YU9iamVjdEZpZWxkKiBvYmosIHVpbnRwdHJfdCBjbG9zdXJlKSB7Ci0gICAgbXZtOjpDb2xsZWN0b3I6Om1hcmtBbmRUcmFjZShvYmosICZvYmotPm5hbWUsIGNsb3N1cmUpOwotICAgIG12bTo6Q29sbGVjdG9yOjptYXJrQW5kVHJhY2Uob2JqLCAmb2JqLT5kZWNsYXJpbmdDbGFzcywgY2xvc3VyZSk7Ci0gIH0KLQotICBzdGF0aWMgSmF2YUZpZWxkKiBnZXRJbnRlcm5hbEZpZWxkKEphdmFPYmplY3RGaWVsZCogc2VsZikgewotICAgIGxsdm1fZ2Nyb290KHNlbGYsIDApOwotICAgIFVzZXJDb21tb25DbGFzcyogY2xzID0gSmF2YU9iamVjdENsYXNzOjpnZXRDbGFzcyhzZWxmLT5kZWNsYXJpbmdDbGFzcyk7IAotICAgIHJldHVybiAmKGNscy0+YXNDbGFzcygpLT52aXJ0dWFsRmllbGRzW3NlbGYtPnNsb3RdKTsKLSAgfQotCi0gIHN0YXRpYyBVc2VyQ2xhc3MqIGdldENsYXNzKEphdmFPYmplY3RGaWVsZCogc2VsZikgewotICAgIGxsdm1fZ2Nyb290KHNlbGYsIDApOwotICAgIFVzZXJDb21tb25DbGFzcyogY2xzID0gSmF2YU9iamVjdENsYXNzOjpnZXRDbGFzcyhzZWxmLT5kZWNsYXJpbmdDbGFzcyk7IAotICAgIHJldHVybiBjbHMtPmFzQ2xhc3MoKTsKLSAgfQotCi19OwotCi1jbGFzcyBKYXZhT2JqZWN0TWV0aG9kIDogcHVibGljIEphdmFPYmplY3QgewotcHJpdmF0ZToKLSAgdWludDggZmxhZzsKLSAgSmF2YU9iamVjdENsYXNzKiBkZWNsYXJpbmdDbGFzczsKLSAgSmF2YU9iamVjdCogbmFtZTsKLSAgdWludDMyIHNsb3Q7Ci0KLXB1YmxpYzoKLSAgCi0gIHN0YXRpYyB2b2lkIHN0YXRpY1RyYWNlcihKYXZhT2JqZWN0TWV0aG9kKiBvYmosIHVpbnRwdHJfdCBjbG9zdXJlKSB7Ci0gICAgbXZtOjpDb2xsZWN0b3I6Om1hcmtBbmRUcmFjZShvYmosICZvYmotPm5hbWUsIGNsb3N1cmUpOwotICAgIG12bTo6Q29sbGVjdG9yOjptYXJrQW5kVHJhY2Uob2JqLCAmb2JqLT5kZWNsYXJpbmdDbGFzcywgY2xvc3VyZSk7Ci0gIH0KLSAgCi0gIHN0YXRpYyBKYXZhTWV0aG9kKiBnZXRJbnRlcm5hbE1ldGhvZChKYXZhT2JqZWN0TWV0aG9kKiBzZWxmKSB7Ci0gICAgbGx2bV9nY3Jvb3Qoc2VsZiwgMCk7Ci0gICAgVXNlckNvbW1vbkNsYXNzKiBjbHMgPSBKYXZhT2JqZWN0Q2xhc3M6OmdldENsYXNzKHNlbGYtPmRlY2xhcmluZ0NsYXNzKTsgCi0gICAgcmV0dXJuICYoY2xzLT5hc0NsYXNzKCktPnZpcnR1YWxNZXRob2RzW3NlbGYtPnNsb3RdKTsKLSAgfQotICAKLSAgc3RhdGljIFVzZXJDbGFzcyogZ2V0Q2xhc3MoSmF2YU9iamVjdE1ldGhvZCogc2VsZikgewotICAgIGxsdm1fZ2Nyb290KHNlbGYsIDApOwotICAgIFVzZXJDb21tb25DbGFzcyogY2xzID0gSmF2YU9iamVjdENsYXNzOjpnZXRDbGFzcyhzZWxmLT5kZWNsYXJpbmdDbGFzcyk7IAotICAgIHJldHVybiBjbHMtPmFzQ2xhc3MoKTsKLSAgfQotCi19OwotCi1jbGFzcyBKYXZhT2JqZWN0Q29uc3RydWN0b3IgOiBwdWJsaWMgSmF2YU9iamVjdCB7Ci1wcml2YXRlOgotICB1aW50OCBmbGFnOwotICBKYXZhT2JqZWN0Q2xhc3MqIGRlY2xhcmluZ0NsYXNzOwotICB1aW50MzIgc2xvdDsKLQotcHVibGljOgotICBzdGF0aWMgdm9pZCBzdGF0aWNUcmFjZXIoSmF2YU9iamVjdENvbnN0cnVjdG9yKiBvYmosIHVpbnRwdHJfdCBjbG9zdXJlKSB7Ci0gICAgbXZtOjpDb2xsZWN0b3I6Om1hcmtBbmRUcmFjZShvYmosICZvYmotPmRlY2xhcmluZ0NsYXNzLCBjbG9zdXJlKTsKLSAgfQotICAKLSAgc3RhdGljIEphdmFNZXRob2QqIGdldEludGVybmFsTWV0aG9kKEphdmFPYmplY3RDb25zdHJ1Y3Rvciogc2VsZikgewotICAgIGxsdm1fZ2Nyb290KHNlbGYsIDApOwotICAgIFVzZXJDb21tb25DbGFzcyogY2xzID0gSmF2YU9iamVjdENsYXNzOjpnZXRDbGFzcyhzZWxmLT5kZWNsYXJpbmdDbGFzcyk7IAotICAgIHJldHVybiAmKGNscy0+YXNDbGFzcygpLT52aXJ0dWFsTWV0aG9kc1tzZWxmLT5zbG90XSk7Ci0gIH0KLSAgCi0gIHN0YXRpYyBVc2VyQ2xhc3MqIGdldENsYXNzKEphdmFPYmplY3RDb25zdHJ1Y3Rvciogc2VsZikgewotICAgIGxsdm1fZ2Nyb290KHNlbGYsIDApOwotICAgIFVzZXJDb21tb25DbGFzcyogY2xzID0gSmF2YU9iamVjdENsYXNzOjpnZXRDbGFzcyhzZWxmLT5kZWNsYXJpbmdDbGFzcyk7IAotICAgIHJldHVybiBjbHMtPmFzQ2xhc3MoKTsKLSAgfQotCi19OwotCi1jbGFzcyBKYXZhT2JqZWN0Vk1UaHJlYWQgOiBwdWJsaWMgSmF2YU9iamVjdCB7Ci1wcml2YXRlOgotICBKYXZhT2JqZWN0KiB0aHJlYWQ7Ci0gIGJvb2wgcnVubmluZzsKLSAgSmF2YVRocmVhZCogdm1kYXRhOwotCi1wdWJsaWM6Ci0gIHN0YXRpYyB2b2lkIHN0YXRpY0Rlc3RydWN0b3IoSmF2YU9iamVjdFZNVGhyZWFkKiBvYmopIHsKLSAgICBsbHZtX2djcm9vdChvYmosIDApOwotICAgIGRlbGV0ZSBvYmotPnZtZGF0YS0+bXV0OwotICB9Ci0gIAotICBzdGF0aWMgdm9pZCBzdGF0aWNUcmFjZXIoSmF2YU9iamVjdFZNVGhyZWFkKiBvYmosIHVpbnRwdHJfdCBjbG9zdXJlKSB7Ci0gICAgbXZtOjpDb2xsZWN0b3I6Om1hcmtBbmRUcmFjZShvYmosICZvYmotPnRocmVhZCwgY2xvc3VyZSk7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBzZXRWbWRhdGEoSmF2YU9iamVjdFZNVGhyZWFkKiB2bXRocmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEphdmFUaHJlYWQqIGludGVybmFsX3RocmVhZCkgewotICAgIGxsdm1fZ2Nyb290KHZtdGhyZWFkLCAwKTsKLSAgICB2bXRocmVhZC0+dm1kYXRhID0gaW50ZXJuYWxfdGhyZWFkOwotICB9Ci0KLX07Ci0KLQotY2xhc3MgSmF2YU9iamVjdFRocm93YWJsZSA6IHB1YmxpYyBKYXZhT2JqZWN0IHsKLXByaXZhdGU6Ci0gIEphdmFPYmplY3QqIGRldGFpbGVkTWVzc2FnZTsKLSAgSmF2YU9iamVjdCogY2F1c2U7Ci0gIEphdmFPYmplY3QqIHN0YWNrVHJhY2U7Ci0gIEphdmFPYmplY3QqIHZtU3RhdGU7Ci0KLXB1YmxpYzoKLQotICBzdGF0aWMgdm9pZCBzZXREZXRhaWxlZE1lc3NhZ2UoSmF2YU9iamVjdFRocm93YWJsZSogc2VsZiwgSmF2YU9iamVjdCogb2JqKSB7Ci0gICAgbGx2bV9nY3Jvb3Qoc2VsZiwgMCk7Ci0gICAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgICBzZWxmLT5kZXRhaWxlZE1lc3NhZ2UgPSBvYmo7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBmaWxsSW5TdGFja1RyYWNlKEphdmFPYmplY3RUaHJvd2FibGUqIHNlbGYpIHsKLSAgICBsbHZtX2djcm9vdChzZWxmLCAwKTsKLSAgICBzZWxmLT5jYXVzZSA9IHNlbGY7Ci0gICAgc2VsZi0+dm1TdGF0ZSA9IGludGVybmFsRmlsbEluU3RhY2tUcmFjZShzZWxmKTsKLSAgICBzZWxmLT5zdGFja1RyYWNlID0gTlVMTDsKLSAgfQotfTsKLQotY2xhc3MgSmF2YU9iamVjdFJlZmVyZW5jZSA6IHB1YmxpYyBKYXZhT2JqZWN0IHsKLXByaXZhdGU6Ci0gIEphdmFPYmplY3QqIHJlZmVyZW50OwotICBKYXZhT2JqZWN0KiBxdWV1ZTsKLSAgSmF2YU9iamVjdCogbmV4dE9uUXVldWU7Ci0KLXB1YmxpYzoKLSAgc3RhdGljIHZvaWQgaW5pdChKYXZhT2JqZWN0UmVmZXJlbmNlKiBzZWxmLCBKYXZhT2JqZWN0KiByLCBKYXZhT2JqZWN0KiBxKSB7Ci0gICAgbGx2bV9nY3Jvb3Qoc2VsZiwgMCk7Ci0gICAgbGx2bV9nY3Jvb3QociwgMCk7Ci0gICAgbGx2bV9nY3Jvb3QocSwgMCk7Ci0gICAgc2VsZi0+cmVmZXJlbnQgPSByOwotICAgIHNlbGYtPnF1ZXVlID0gcTsKLSAgfQotCi0gIHN0YXRpYyBKYXZhT2JqZWN0KiogZ2V0UmVmZXJlbnRQdHIoSmF2YU9iamVjdFJlZmVyZW5jZSogc2VsZikgewotICAgIGxsdm1fZ2Nyb290KHNlbGYsIDApOwotICAgIHJldHVybiAmKHNlbGYtPnJlZmVyZW50KTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIHNldFJlZmVyZW50KEphdmFPYmplY3RSZWZlcmVuY2UqIHNlbGYsIEphdmFPYmplY3QqIHIpIHsKLSAgICBsbHZtX2djcm9vdChzZWxmLCAwKTsKLSAgICBsbHZtX2djcm9vdChyLCAwKTsKLSAgICBzZWxmLT5yZWZlcmVudCA9IHI7Ci0gIH0KLX07Ci0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvQ2xhc3NwYXRoL0NsYXNzcGF0aFZNQ2xhc3MuaW5jIGIvdm1raXQvbGliL0ozL0NsYXNzcGF0aC9DbGFzc3BhdGhWTUNsYXNzLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM0YzZiNC4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvSjMvQ2xhc3NwYXRoL0NsYXNzcGF0aFZNQ2xhc3MuaW5jCisrKyAvZGV2L251bGwKQEAgLTEsNjI1ICswLDAgQEAKLS8vPT09LS0tLSBDbGFzc3BhdGhWTUNsYXNzLmNwcCAtIEdOVSBjbGFzc3BhdGggamF2YS9sYW5nL1ZNQ2xhc3MgLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSAidHlwZXMuaCIKLQotI2luY2x1ZGUgIkNsYXNzcGF0aC5oIgotI2luY2x1ZGUgIkNsYXNzcGF0aFJlZmxlY3QuaCIKLSNpbmNsdWRlICJKYXZhQWNjZXNzLmgiCi0jaW5jbHVkZSAiSmF2YUFycmF5LmgiCi0jaW5jbHVkZSAiSmF2YUNsYXNzLmgiCi0jaW5jbHVkZSAiSmF2YU9iamVjdC5oIgotI2luY2x1ZGUgIkphdmFTdHJpbmcuaCIKLSNpbmNsdWRlICJKYXZhVHlwZXMuaCIKLSNpbmNsdWRlICJKYXZhVGhyZWFkLmgiCi0jaW5jbHVkZSAiSmF2YVVwY2FsbHMuaCIKLSNpbmNsdWRlICJKbmp2bS5oIgotCi11c2luZyBuYW1lc3BhY2UgajM7Ci0KLWV4dGVybiAiQyIgewotCi0vLyBOZXZlciB0aHJvd3MKLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfamF2YV9sYW5nX1ZNQ2xhc3NfaXNBcnJheSgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLWpjbGFzcyBjbGF6eiwKLSNlbmRpZgotSmF2YU9iamVjdENsYXNzKiBrbGFzcykgewotCi0gIGxsdm1fZ2Nyb290KGtsYXNzLCAwKTsKLQotICBVc2VyQ29tbW9uQ2xhc3MqIGNsID0gSmF2YU9iamVjdENsYXNzOjpnZXRDbGFzcyhrbGFzcyk7Ci0KLSAgcmV0dXJuIGNsLT5pc0FycmF5KCk7Ci0gIAotfQotCi1KTklFWFBPUlQgSmF2YU9iamVjdCogSk5JQ0FMTCBKYXZhX2phdmFfbGFuZ19WTUNsYXNzX2Zvck5hbWUoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsCi1qY2xhc3MgY2xhenosCi0jZW5kaWYKLUphdmFTdHJpbmcqIHN0ciwgCi1qYm9vbGVhbiBjbGluaXQsIAotSmF2YU9iamVjdCogbG9hZGVyKSB7Ci0KLSAgSmF2YU9iamVjdCogcmVzID0gMDsKLSAgbGx2bV9nY3Jvb3QobG9hZGVyLCAwKTsKLSAgbGx2bV9nY3Jvb3Qoc3RyLCAwKTsKLSAgbGx2bV9nY3Jvb3QocmVzLCAwKTsKLQotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0KLSAgdmVyaWZ5TnVsbChzdHIpOwotICBKbmp2bSogdm0gPSBKYXZhVGhyZWFkOjpnZXQoKS0+Z2V0SlZNKCk7Ci0gIEpuanZtQ2xhc3NMb2FkZXIqIEpDTCA9IAotICAgIEpuanZtQ2xhc3NMb2FkZXI6OmdldEpuanZtTG9hZGVyRnJvbUphdmFPYmplY3QobG9hZGVyLCB2bSk7Ci0gIFVzZXJDb21tb25DbGFzcyogY2wgPSBKQ0wtPmxvYWRDbGFzc0Zyb21KYXZhU3RyaW5nKHN0ciwgdHJ1ZSwgZmFsc2UpOwotCi0gIGlmIChjbCAhPSAwKSB7Ci0gICAgaWYgKGNsaW5pdCAmJiBjbC0+YXNDbGFzcygpKSB7Ci0gICAgICBjbC0+YXNDbGFzcygpLT5pbml0aWFsaXNlQ2xhc3MoKTsKLSAgICB9Ci0gICAgcmVzID0gY2wtPmdldENsYXNzRGVsZWdhdGVlKCk7Ci0gIH0gZWxzZSB7Ci0gICAgdm0tPmNsYXNzTm90Rm91bmRFeGNlcHRpb24oc3RyKTsKLSAgfQotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLSAgcmV0dXJuIHJlczsKLX0KLQotSk5JRVhQT1JUIEphdmFPYmplY3QqIEpOSUNBTEwgSmF2YV9qYXZhX2xhbmdfVk1DbGFzc19nZXREZWNsYXJlZENvbnN0cnVjdG9ycygKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLWpjbGFzcyBjbGF6eiwKLSNlbmRpZgotSmF2YU9iamVjdCogQ2wsIAotamJvb2xlYW4gcHVibGljT25seSkgewotCi0gIEFycmF5T2JqZWN0KiByZXQgPSAwOwotICBKYXZhT2JqZWN0KiB0bXAgPSAwOwotICBsbHZtX2djcm9vdChDbCwgMCk7Ci0gIGxsdm1fZ2Nyb290KHJldCwgMCk7Ci0gIGxsdm1fZ2Nyb290KHRtcCwgMCk7Ci0KLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotCi0gIEpuanZtKiB2bSA9IEphdmFUaHJlYWQ6OmdldCgpLT5nZXRKVk0oKTsKLSAgVXNlckNvbW1vbkNsYXNzKiBjbCA9IFVzZXJDb21tb25DbGFzczo6cmVzb2x2ZWRJbXBsQ2xhc3MoQ2wsIGZhbHNlKTsKLQotICBpZiAoY2wtPmlzQXJyYXkoKSB8fCBjbC0+aXNJbnRlcmZhY2UoKSB8fCBjbC0+aXNQcmltaXRpdmUoKSkgewotICAgIHJldCA9IChBcnJheU9iamVjdCopdm0tPnVwY2FsbHMtPmNvbnN0cnVjdG9yQXJyYXlDbGFzcy0+ZG9OZXcoMCk7Ci0gIH0gZWxzZSB7Ci0gICAgVXNlckNsYXNzKiByZWFsQ2wgPSBjbC0+YXNDbGFzcygpOzsKLSAgICB1aW50MzIgc2l6ZSA9IDA7Ci0gICAgCi0gICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCByZWFsQ2wtPm5iVmlydHVhbE1ldGhvZHM7ICsraSkgewotICAgICAgSmF2YU1ldGhvZCogbWV0aCA9ICZyZWFsQ2wtPnZpcnR1YWxNZXRob2RzW2ldOwotICAgICAgYm9vbCBwdWIgPSBpc1B1YmxpYyhtZXRoLT5hY2Nlc3MpOwotICAgICAgaWYgKG1ldGgtPm5hbWUtPmVxdWFscyh2bS0+dXBjYWxscy0+aW5pdE5hbWUpICYmIAotICAgICAgICAgICghcHVibGljT25seSB8fCBwdWIpKSB7Ci0gICAgICAgICsrc2l6ZTsKLSAgICAgIH0KLSAgICB9Ci0gIAotICAgIHJldCA9IChBcnJheU9iamVjdCopdm0tPnVwY2FsbHMtPmNvbnN0cnVjdG9yQXJyYXlDbGFzcy0+ZG9OZXcoc2l6ZSk7Ci0KLSAgICBzaW50MzIgaW5kZXggPSAwOwotICAgIGZvciAodWludDMyIGkgPSAwOyBpIDwgcmVhbENsLT5uYlZpcnR1YWxNZXRob2RzOyArK2kpIHsKLSAgICAgIEphdmFNZXRob2QqIG1ldGggPSAmcmVhbENsLT52aXJ0dWFsTWV0aG9kc1tpXTsKLSAgICAgIGJvb2wgcHViID0gaXNQdWJsaWMobWV0aC0+YWNjZXNzKTsKLSAgICAgIGlmIChtZXRoLT5uYW1lLT5lcXVhbHModm0tPnVwY2FsbHMtPmluaXROYW1lKSAmJiAKLSAgICAgICAgICAoIXB1YmxpY09ubHkgfHwgcHViKSkgewotICAgICAgICBVc2VyQ2xhc3MqIENvbnMgPSB2bS0+dXBjYWxscy0+bmV3Q29uc3RydWN0b3I7Ci0gICAgICAgIHRtcCA9IENvbnMtPmRvTmV3KCk7Ci0gICAgICAgIHZtLT51cGNhbGxzLT5pbml0Q29uc3RydWN0b3ItPmludm9rZUludFNwZWNpYWwoQ29ucywgdG1wLCAmQ2wsIGkpOwotICAgICAgICBBcnJheU9iamVjdDo6c2V0RWxlbWVudChyZXQsIHRtcCwgaW5kZXgpOwotICAgICAgICBpbmRleCsrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLSAgcmV0dXJuIHJldDsKLX0KLQotSk5JRVhQT1JUIEphdmFPYmplY3QqIEpOSUNBTEwgSmF2YV9qYXZhX2xhbmdfVk1DbGFzc19nZXREZWNsYXJlZE1ldGhvZHMoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsCi1qY2xhc3MgY2xhenosCi0jZW5kaWYKLUphdmFPYmplY3QqIENsLCAKLWpib29sZWFuIHB1YmxpY09ubHkpIHsKLQotICBBcnJheU9iamVjdCogcmV0ID0gMDsKLSAgSmF2YU9iamVjdCogdG1wID0gMDsKLSAgSmF2YVN0cmluZyogc3RyID0gMDsKLSAgbGx2bV9nY3Jvb3QoQ2wsIDApOwotICBsbHZtX2djcm9vdChyZXQsIDApOwotICBsbHZtX2djcm9vdCh0bXAsIDApOwotICBsbHZtX2djcm9vdChzdHIsIDApOwotCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLQotICBKbmp2bSogdm0gPSBKYXZhVGhyZWFkOjpnZXQoKS0+Z2V0SlZNKCk7Ci0gIFVzZXJDb21tb25DbGFzcyogY2wgPSBVc2VyQ29tbW9uQ2xhc3M6OnJlc29sdmVkSW1wbENsYXNzKENsLCBmYWxzZSk7Ci0gIENsYXNzcGF0aCogdXBjYWxscyA9IHZtLT51cGNhbGxzOwotCi0gIGlmIChjbC0+aXNBcnJheSgpIHx8IGNsLT5pc1ByaW1pdGl2ZSgpKSB7Ci0gICAgcmV0ID0gKEFycmF5T2JqZWN0Kil1cGNhbGxzLT5tZXRob2RBcnJheUNsYXNzLT5kb05ldygwKTsKLSAgfSBlbHNlIHsKLSAgICBVc2VyQ2xhc3MqIHJlYWxDbCA9IGNsLT5hc0NsYXNzKCk7Ci0gICAgdWludDMyIHNpemUgPSAwOwotCi0gICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCByZWFsQ2wtPm5iVmlydHVhbE1ldGhvZHMgKyByZWFsQ2wtPm5iU3RhdGljTWV0aG9kczsKLSAgICAgICAgICsraSkgewotICAgICAgSmF2YU1ldGhvZCogbWV0aCA9ICZyZWFsQ2wtPnZpcnR1YWxNZXRob2RzW2ldOwotICAgICAgYm9vbCBwdWIgPSBpc1B1YmxpYyhtZXRoLT5hY2Nlc3MpOwotICAgICAgaWYgKCEobWV0aC0+bmFtZS0+ZXF1YWxzKHZtLT51cGNhbGxzLT5pbml0TmFtZSkpICYmIAotICAgICAgICAgICghcHVibGljT25seSB8fCBwdWIpKSB7Ci0gICAgICAgICsrc2l6ZTsgCi0gICAgICB9Ci0gICAgfQotCi0gICAgCi0gICAgcmV0ID0gKEFycmF5T2JqZWN0Kil1cGNhbGxzLT5tZXRob2RBcnJheUNsYXNzLT5kb05ldyhzaXplKTsKLQotICAgIHNpbnQzMiBpbmRleCA9IDA7Ci0gICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCByZWFsQ2wtPm5iVmlydHVhbE1ldGhvZHMgKyByZWFsQ2wtPm5iU3RhdGljTWV0aG9kczsKLSAgICAgICAgICsraSkgewotICAgICAgSmF2YU1ldGhvZCogbWV0aCA9ICZyZWFsQ2wtPnZpcnR1YWxNZXRob2RzW2ldOwotICAgICAgYm9vbCBwdWIgPSBpc1B1YmxpYyhtZXRoLT5hY2Nlc3MpOwotICAgICAgaWYgKCEobWV0aC0+bmFtZS0+ZXF1YWxzKHZtLT51cGNhbGxzLT5pbml0TmFtZSkpICYmIAotICAgICAgICAgICghcHVibGljT25seSB8fCBwdWIpKSB7Ci0gICAgICAgIC8vIFRPRE86IGNoZWNrIHBhcmFtZXRlciB0eXBlcwotICAgICAgICBVc2VyQ2xhc3MqIE1ldGggPSB2bS0+dXBjYWxscy0+bmV3TWV0aG9kOwotICAgICAgICB0bXAgPSBNZXRoLT5kb05ldygpOwotICAgICAgICBzdHIgPSB2bS0+aW50ZXJuYWxVVEY4VG9TdHIobWV0aC0+bmFtZSk7Ci0gICAgICAgIHVwY2FsbHMtPmluaXRNZXRob2QtPmludm9rZUludFNwZWNpYWwoTWV0aCwgdG1wLCAmQ2wsICZzdHIsIGkpOwotICAgICAgICBBcnJheU9iamVjdDo6c2V0RWxlbWVudChyZXQsIHRtcCwgaW5kZXgpOwotICAgICAgICBpbmRleCsrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLSAgcmV0dXJuIHJldDsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2phdmFfbGFuZ19WTUNsYXNzX2dldE1vZGlmaWVycygKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLWpjbGFzcyBjbGF6eiwKLSNlbmRpZgotSmF2YU9iamVjdCogQ2wsIAotamJvb2xlYW4gaWdub3JlKSB7Ci0gIAotICBqaW50IHJlcyA9IDA7Ci0gIGxsdm1fZ2Nyb290KENsLCAwKTsKLQotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0KLSAgVXNlckNvbW1vbkNsYXNzKiBjbCA9IFVzZXJDb21tb25DbGFzczo6cmVzb2x2ZWRJbXBsQ2xhc3MoQ2wsIGZhbHNlKTsKLSAgcmVzID0gY2wtPmdldEFjY2VzcygpOwotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0gIHJldHVybiByZXM7Ci19Ci0KLUpOSUVYUE9SVCBKYXZhT2JqZWN0KiBKTklDQUxMIEphdmFfamF2YV9sYW5nX1ZNQ2xhc3NfZ2V0TmFtZSgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLWpjbGFzcyBjbGF6eiwgCi0jZW5kaWYKLUphdmFPYmplY3QqIENsKSB7Ci0KLSAgSmF2YU9iamVjdCogcmVzdWx0ID0gMDsKLSAgbGx2bV9nY3Jvb3QoQ2wsIDApOwotICBsbHZtX2djcm9vdChyZXN1bHQsIDApOwotCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLQotICBKbmp2bSogdm0gPSBKYXZhVGhyZWFkOjpnZXQoKS0+Z2V0SlZNKCk7Ci0gIFVzZXJDb21tb25DbGFzcyogY2wgPSBVc2VyQ29tbW9uQ2xhc3M6OnJlc29sdmVkSW1wbENsYXNzKENsLCBmYWxzZSk7Ci0gIAotICBjb25zdCBVVEY4KiBpbmFtZSA9IGNsLT5nZXROYW1lKCk7Ci0gIHJlc3VsdCA9IEphdmFTdHJpbmc6OmludGVybmFsVG9KYXZhKGluYW1lLCB2bSk7Ci0KLSAgRU5EX05BVElWRV9FWENFUFRJT04KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBKYXZhX2phdmFfbGFuZ19WTUNsYXNzX2lzUHJpbWl0aXZlKAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotamNsYXNzIGNsYXp6LCAKLSNlbmRpZgotSmF2YU9iamVjdCogQ2wpIHsKLSAKLSAgamJvb2xlYW4gcmVzID0gMDsKLSAgbGx2bV9nY3Jvb3QoQ2wsIDApOwotCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLSAgCi0gIFVzZXJDb21tb25DbGFzcyogY2wgPSBVc2VyQ29tbW9uQ2xhc3M6OnJlc29sdmVkSW1wbENsYXNzKENsLCBmYWxzZSk7Ci0gIAotICByZXMgPSBjbC0+aXNQcmltaXRpdmUoKTsKLQotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotCi0gIHJldHVybiByZXM7Ci19Ci0KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfamF2YV9sYW5nX1ZNQ2xhc3NfaXNJbnRlcmZhY2UoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsCi1qY2xhc3MgY2xhenosIAotI2VuZGlmCi1KYXZhT2JqZWN0KiBDbCkgewotCi0gIGpib29sZWFuIHJlcyA9IDA7Ci0gIGxsdm1fZ2Nyb290KENsLCAwKTsKLQotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0KLSAgVXNlckNvbW1vbkNsYXNzKiBjbCA9IFVzZXJDb21tb25DbGFzczo6cmVzb2x2ZWRJbXBsQ2xhc3MoQ2wsIGZhbHNlKTsKLQotICByZXMgPSBjbC0+aXNJbnRlcmZhY2UoKTsKLQotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotCi0gIHJldHVybiByZXM7Ci19Ci0KLUpOSUVYUE9SVCBKYXZhT2JqZWN0KiBKTklDQUxMIEphdmFfamF2YV9sYW5nX1ZNQ2xhc3NfZ2V0Q29tcG9uZW50VHlwZSgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLWpjbGFzcyBjbGF6eiwgCi0jZW5kaWYKLUphdmFPYmplY3QqIENsKSB7Ci0gIAotICBKYXZhT2JqZWN0KiByZXMgPSAwOwotICBsbHZtX2djcm9vdChyZXMsIDApOwotICBsbHZtX2djcm9vdChDbCwgMCk7Ci0KLSAgCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLQotICBVc2VyQ29tbW9uQ2xhc3MqIGNsID0gVXNlckNvbW1vbkNsYXNzOjpyZXNvbHZlZEltcGxDbGFzcyhDbCwgZmFsc2UpOwotCi0gIGlmIChjbC0+aXNBcnJheSgpKSB7Ci0gICAgVXNlckNvbW1vbkNsYXNzKiBiYyA9IGNsLT5hc0FycmF5Q2xhc3MoKS0+YmFzZUNsYXNzKCk7Ci0gICAgcmVzID0gYmMtPmdldENsYXNzRGVsZWdhdGVlKCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmVzID0gMDsKLSAgfQotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0gIHJldHVybiByZXM7Ci19Ci0KLUpOSUVYUE9SVCBKYXZhT2JqZWN0KiBKTklDQUxMIEphdmFfamF2YV9sYW5nX1ZNQ2xhc3NfZ2V0Q2xhc3NMb2FkZXIoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsCi1qY2xhc3MgY2xhenosIAotI2VuZGlmCi1KYXZhT2JqZWN0KiBDbCkgewotCi0gIEphdmFPYmplY3QqIHJlcyA9IDA7Ci0gIGxsdm1fZ2Nyb290KHJlcywgMCk7Ci0gIGxsdm1fZ2Nyb290KENsLCAwKTsKLQotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0KLSAgVXNlckNvbW1vbkNsYXNzKiBjbCA9IFVzZXJDb21tb25DbGFzczo6cmVzb2x2ZWRJbXBsQ2xhc3MoQ2wsIGZhbHNlKTsKLSAgcmVzID0gY2wtPmNsYXNzTG9hZGVyLT5nZXRKYXZhQ2xhc3NMb2FkZXIoKTsKLQotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotCi0gIHJldHVybiByZXM7Ci19Ci0KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfamF2YV9sYW5nX1ZNQ2xhc3NfaXNBc3NpZ25hYmxlRnJvbSgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLWpjbGFzcyBjbGF6eiwgCi0jZW5kaWYKLUphdmFPYmplY3QqIENsMSwgSmF2YU9iamVjdCogQ2wyKSB7Ci0gIAotICBqYm9vbGVhbiByZXMgPSAwOwotICBsbHZtX2djcm9vdChDbDEsIDApOwotICBsbHZtX2djcm9vdChDbDIsIDApOwotICAKLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotCi0gIEpuanZtKiB2bSA9IEphdmFUaHJlYWQ6OmdldCgpLT5nZXRKVk0oKTsKLSAgaWYgKCFDbDIpIHZtLT5udWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCi0gIFVzZXJDb21tb25DbGFzcyogY2wxID0gVXNlckNvbW1vbkNsYXNzOjpyZXNvbHZlZEltcGxDbGFzcyhDbDEsIGZhbHNlKTsKLSAgVXNlckNvbW1vbkNsYXNzKiBjbDIgPSBVc2VyQ29tbW9uQ2xhc3M6OnJlc29sdmVkSW1wbENsYXNzKENsMiwgZmFsc2UpOwotCi0gIHJlcyA9IGNsMi0+aXNBc3NpZ25hYmxlRnJvbShjbDEpOwotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLSAgcmV0dXJuIHJlczsKLQotfQotCi1KTklFWFBPUlQgSmF2YU9iamVjdCogSk5JQ0FMTCBKYXZhX2phdmFfbGFuZ19WTUNsYXNzX2dldFN1cGVyY2xhc3MoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsCi1qY2xhc3MgY2xhenosIAotI2VuZGlmCi1KYXZhT2JqZWN0KiBDbCkgewotCi0gIEphdmFPYmplY3QqIHJlcyA9IDA7Ci0gIGxsdm1fZ2Nyb290KENsLCAwKTsKLSAgbGx2bV9nY3Jvb3QocmVzLCAwKTsKLQotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0KLSAgVXNlckNvbW1vbkNsYXNzKiBjbCA9IFVzZXJDb21tb25DbGFzczo6cmVzb2x2ZWRJbXBsQ2xhc3MoQ2wsIGZhbHNlKTsKLSAgaWYgKGNsLT5pc0ludGVyZmFjZSgpKSByZXMgPSAwOwotICBlbHNlIHsKLSAgICBpZiAoY2wtPmdldFN1cGVyKCkpIHJlcyA9IGNsLT5nZXRTdXBlcigpLT5nZXRDbGFzc0RlbGVnYXRlZSgpOwotICAgIGVsc2UgcmVzID0gMDsKLSAgfQotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0gIAotICByZXR1cm4gcmVzOwotfQotCi1KTklFWFBPUlQgYm9vbCBKTklDQUxMIEphdmFfamF2YV9sYW5nX1ZNQ2xhc3NfaXNJbnN0YW5jZSgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLWpjbGFzcyBjbGF6eiwgCi0jZW5kaWYKLUphdmFPYmplY3QqIENsLCBKYXZhT2JqZWN0KiBvYmopIHsKLQotICBib29sIHJlcyA9IGZhbHNlOwotICBsbHZtX2djcm9vdChDbCwgMCk7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0KLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotCi0gIFVzZXJDb21tb25DbGFzcyogY2wgPSBVc2VyQ29tbW9uQ2xhc3M6OnJlc29sdmVkSW1wbENsYXNzKENsLCBmYWxzZSk7Ci0gIHJlcyA9IEphdmFPYmplY3Q6Omluc3RhbmNlT2Yob2JqLCBjbCk7Ci0KLSAgRU5EX05BVElWRV9FWENFUFRJT04KLQotICByZXR1cm4gcmVzOwotfQotCi1KTklFWFBPUlQgSmF2YU9iamVjdCogSk5JQ0FMTCBKYXZhX2phdmFfbGFuZ19WTUNsYXNzX2dldERlY2xhcmVkRmllbGRzKAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotamNsYXNzIGNsYXp6LCAKLSNlbmRpZgotSmF2YU9iamVjdCogQ2wsIGpib29sZWFuIHB1YmxpY09ubHkpIHsKLQotICBBcnJheU9iamVjdCogcmV0ID0gMDsKLSAgSmF2YU9iamVjdCogdG1wID0gMDsKLSAgSmF2YVN0cmluZyogbmFtZSA9IDA7Ci0gIGxsdm1fZ2Nyb290KENsLCAwKTsKLSAgbGx2bV9nY3Jvb3QocmV0LCAwKTsKLSAgbGx2bV9nY3Jvb3QodG1wLCAwKTsKLSAgbGx2bV9nY3Jvb3QobmFtZSwgMCk7Ci0KLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotCi0gIEpuanZtKiB2bSA9IEphdmFUaHJlYWQ6OmdldCgpLT5nZXRKVk0oKTsKLSAgVXNlckNvbW1vbkNsYXNzKiBjbCA9IFVzZXJDb21tb25DbGFzczo6cmVzb2x2ZWRJbXBsQ2xhc3MoQ2wsIGZhbHNlKTsKLQotICBpZiAoIWNsLT5pc0NsYXNzKCkpIHsKLSAgICByZXQgPSAoQXJyYXlPYmplY3QqKXZtLT51cGNhbGxzLT5maWVsZEFycmF5Q2xhc3MtPmRvTmV3KDApOwotICB9IGVsc2UgewotICAgIFVzZXJDbGFzcyogcmVhbENsID0gY2wtPmFzQ2xhc3MoKTsgCi0gICAgdWludDMyIHNpemUgPSAwOwotICAgIGZvciAodWludDMyIGkgPSAwOyBpIDwgcmVhbENsLT5uYlZpcnR1YWxGaWVsZHMgKyByZWFsQ2wtPm5iU3RhdGljRmllbGRzOwotICAgICAgICAgKytpKSB7Ci0gICAgICBKYXZhRmllbGQqIGZpZWxkID0gJnJlYWxDbC0+dmlydHVhbEZpZWxkc1tpXTsKLSAgICAgIGlmICghcHVibGljT25seSB8fCBpc1B1YmxpYyhmaWVsZC0+YWNjZXNzKSkgewotICAgICAgICArK3NpemU7Ci0gICAgICB9Ci0gICAgfQotCi0KLSAgICByZXQgPSAoQXJyYXlPYmplY3QqKXZtLT51cGNhbGxzLT5maWVsZEFycmF5Q2xhc3MtPmRvTmV3KHNpemUpOwotCi0gICAgc2ludDMyIGluZGV4ID0gMDsKLSAgICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IHJlYWxDbC0+bmJWaXJ0dWFsRmllbGRzICsgcmVhbENsLT5uYlN0YXRpY0ZpZWxkczsKLSAgICAgICAgICsraSkgewotICAgICAgSmF2YUZpZWxkKiBmaWVsZCA9ICZyZWFsQ2wtPnZpcnR1YWxGaWVsZHNbaV07Ci0gICAgICBpZiAoIXB1YmxpY09ubHkgfHwgaXNQdWJsaWMoZmllbGQtPmFjY2VzcykpIHsKLSAgICAgICAgLy8gVE9ETzogY2hlY2sgcGFyYW1ldGVyIHR5cGVzCi0gICAgICAgIFVzZXJDbGFzcyogRmllbGQgPSB2bS0+dXBjYWxscy0+bmV3RmllbGQ7Ci0gICAgICAgIHRtcCA9IEZpZWxkLT5kb05ldygpOwotICAgICAgICBuYW1lID0gdm0tPmludGVybmFsVVRGOFRvU3RyKGZpZWxkLT5uYW1lKTsKLSAgICAgICAgdm0tPnVwY2FsbHMtPmluaXRGaWVsZC0+aW52b2tlSW50U3BlY2lhbChGaWVsZCwgdG1wLCAmQ2wsICZuYW1lLCBpKTsKLSAgICAgICAgQXJyYXlPYmplY3Q6OnNldEVsZW1lbnQocmV0LCB0bXAsIGluZGV4KTsKLSAgICAgICAgaW5kZXgrKzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotCi0gIHJldHVybiByZXQ7Ci19Ci0KLUpOSUVYUE9SVCBKYXZhT2JqZWN0KiBKTklDQUxMIEphdmFfamF2YV9sYW5nX1ZNQ2xhc3NfZ2V0SW50ZXJmYWNlcygKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLWpjbGFzcyBjbGF6eiwgCi0jZW5kaWYKLUphdmFPYmplY3QqIENsKSB7Ci0KLSAgQXJyYXlPYmplY3QqIHJlcyA9IDA7Ci0gIGxsdm1fZ2Nyb290KHJlcywgMCk7Ci0gIGxsdm1fZ2Nyb290KENsLCAwKTsKLQotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0KLSAgSm5qdm0qIHZtID0gSmF2YVRocmVhZDo6Z2V0KCktPmdldEpWTSgpOwotICBVc2VyQ29tbW9uQ2xhc3MqIGNsID0gVXNlckNvbW1vbkNsYXNzOjpyZXNvbHZlZEltcGxDbGFzcyhDbCwgZmFsc2UpOwotICByZXMgPSAoQXJyYXlPYmplY3QqKXZtLT51cGNhbGxzLT5jbGFzc0FycmF5Q2xhc3MtPmRvTmV3KGNsLT5uYkludGVyZmFjZXMpOwotCi0gIGZvciAodWludDE2IGkgPSAwOyBpIDwgY2wtPm5iSW50ZXJmYWNlczsgKytpKSB7Ci0gICAgVXNlckNsYXNzKiBrbGFzcyA9IGNsLT5pbnRlcmZhY2VzW2ldOwotICAgIEFycmF5T2JqZWN0OjpzZXRFbGVtZW50KHJlcywga2xhc3MtPmdldENsYXNzRGVsZWdhdGVlKCksIGkpOwotICB9Ci0KLSAgRU5EX05BVElWRV9FWENFUFRJT04KLQotICByZXR1cm4gcmVzOwotfQotCi0KLUpOSUVYUE9SVCBKYXZhT2JqZWN0KiBKTklDQUxMIEphdmFfamF2YV9sYW5nX1ZNQ2xhc3NfZ2V0RGVjbGFyaW5nQ2xhc3MoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsCi1qY2xhc3MgY2xhenosIAotI2VuZGlmCi1KYXZhT2JqZWN0KiBDbCkgewotICBKYXZhT2JqZWN0KiByZXMgPSAwOwotCi0gIGxsdm1fZ2Nyb290KHJlcywgMCk7Ci0gIGxsdm1fZ2Nyb290KENsLCAwKTsKLQotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0KLSAgVXNlckNsYXNzKiBjbCA9IFVzZXJDb21tb25DbGFzczo6cmVzb2x2ZWRJbXBsQ2xhc3MoQ2wsIGZhbHNlKS0+YXNDbGFzcygpOwotCi0gIGlmIChjbCkgewotICAgIGNsLT5yZXNvbHZlSW5uZXJPdXRlckNsYXNzZXMoKTsKLSAgICBVc2VyQ2xhc3MqIG91dGVyID0gY2wtPmdldE91dGVyQ2xhc3MoKTsKLSAgICBpZiAob3V0ZXIpIHsKLSAgICAgIHJlcyA9IG91dGVyLT5nZXRDbGFzc0RlbGVnYXRlZSgpOwotICAgIH0KLSAgfQotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLSAgcmV0dXJuIHJlczsKLQotfQotCi1KTklFWFBPUlQgSmF2YU9iamVjdCogSk5JQ0FMTCBKYXZhX2phdmFfbGFuZ19WTUNsYXNzX2dldERlY2xhcmVkQ2xhc3NlcygKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLWpjbGFzcyBjbGF6eiwgCi0jZW5kaWYKLUphdmFPYmplY3QqIENsLCBib29sIHB1YmxpY09ubHkpIHsKLQotICBBcnJheU9iamVjdCogcmVzdWx0ID0gMDsKLSAgbGx2bV9nY3Jvb3QocmVzdWx0LCAwKTsKLSAgbGx2bV9nY3Jvb3QoQ2wsIDApOwotCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLQotICBKbmp2bSogdm0gPSBKYXZhVGhyZWFkOjpnZXQoKS0+Z2V0SlZNKCk7Ci0gIFVzZXJDbGFzcyogY2wgPSBVc2VyQ29tbW9uQ2xhc3M6OnJlc29sdmVkSW1wbENsYXNzKENsLCBmYWxzZSktPmFzQ2xhc3MoKTsKLSAgaWYgKGNsKSB7Ci0gICAgY2wtPnJlc29sdmVJbm5lck91dGVyQ2xhc3NlcygpOwotICAgIFVzZXJDbGFzc0FycmF5KiBhcnJheSA9IHZtLT51cGNhbGxzLT5jb25zdHJ1Y3RvckFycmF5Q2xhc3M7Ci0gICAgCi0gICAgdWludDE2IHNpemVBcnJheSA9IDA7Ci0KLSAgICBpZiAocHVibGljT25seSkgewotICAgICAgZm9yICh1aW50MTYgaSA9IDA7IGkgPCBjbC0+bmJJbm5lckNsYXNzZXM7ICsraSkgewotICAgICAgICBVc2VyQ2xhc3MqIGtsYXNzID0gY2wtPmlubmVyQ2xhc3Nlc1tpXTsKLSAgICAgICAgaWYgKGlzUHVibGljKGtsYXNzLT5pbm5lckFjY2VzcykpICsrc2l6ZUFycmF5OwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBzaXplQXJyYXkgPSBjbC0+bmJJbm5lckNsYXNzZXM7Ci0gICAgfQotCi0gICAgcmVzdWx0ID0gKEFycmF5T2JqZWN0KilhcnJheS0+ZG9OZXcoc2l6ZUFycmF5KTsKLSAgICBmb3IgKHVpbnQxNiBpID0gMDsgaSA8IGNsLT5uYklubmVyQ2xhc3NlczsgKytpKSB7Ci0gICAgICBVc2VyQ2xhc3MqIGtsYXNzID0gY2wtPmlubmVyQ2xhc3Nlc1tpXTsKLSAgICAgIGlmICghcHVibGljT25seSB8fCBpc1B1YmxpYyhrbGFzcy0+aW5uZXJBY2Nlc3MpKQotICAgICAgICBBcnJheU9iamVjdDo6c2V0RWxlbWVudChyZXN1bHQsIGtsYXNzLT5nZXRDbGFzc0RlbGVnYXRlZSgpLCBpKTsgCi0gICAgfQotICB9Ci0gIAotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLSAgcmV0dXJuIHJlc3VsdDsKLQotfQotCi0vLyBPbmx5IHRocm93cy4KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9qYXZhX2xhbmdfVk1DbGFzc190aHJvd0V4Y2VwdGlvbigKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLWpjbGFzcyBjbGF6eiwgCi0jZW5kaWYKLUphdmFPYmplY3QqIHRocm93YWJsZSkgewotICAKLSAgbGx2bV9nY3Jvb3QodGhyb3dhYmxlLCAwKTsKLQotICBhc3NlcnQodGhyb3dhYmxlICYmICJVc2luZyBpbnRlcm5hbCBWTSB0aHJvdyBleGNlcHRpb24gd2l0aG91dCBleGNlcHRpb24iKTsKLSAgbXZtOjpUaHJlYWQ6OmdldCgpLT5zZXRQZW5kaW5nRXhjZXB0aW9uKHRocm93YWJsZSk7Ci19Ci0KLUpOSUVYUE9SVCBBcnJheU9iamVjdCogSmF2YV9qYXZhX2xhbmdfVk1DbGFzc19nZXREZWNsYXJlZEFubm90YXRpb25zKAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotamNsYXNzIGNsYXp6LCAKLSNlbmRpZgotSmF2YU9iamVjdCogQ2wpIHsKLSAgLy8gVE9ETyBpbXBsZW1lbnQgbWUKLSAgCi0gIEFycmF5T2JqZWN0KiByZXMgPSAwOwotICBsbHZtX2djcm9vdChyZXMsIDApOwotICBsbHZtX2djcm9vdChDbCwgMCk7Ci0gIAotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0KLSAgSm5qdm0qIHZtID0gSmF2YVRocmVhZDo6Z2V0KCktPmdldEpWTSgpOwotICBVc2VyQ2xhc3NBcnJheSogYXJyYXkgPSB2bS0+dXBjYWxscy0+Y29uc3RydWN0b3JBcnJheUFubm90YXRpb247Ci0gIHJlcyA9IChBcnJheU9iamVjdCopYXJyYXktPmRvTmV3KDApOwotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLSAgcmV0dXJuIHJlczsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEphdmFfamF2YV9sYW5nX1ZNQ2xhc3NfaXNBbm9ueW1vdXNDbGFzcygKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLWpjbGFzcyBjbGF6eiwgCi0jZW5kaWYKLUphdmFPYmplY3QqIENsKSB7Ci0gCi0gIGpib29sZWFuIHJlcyA9IGZhbHNlOwotICBsbHZtX2djcm9vdChDbCwgMCk7Ci0KLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotICAKLSAgVXNlckNsYXNzKiBjbCA9IFVzZXJDb21tb25DbGFzczo6cmVzb2x2ZWRJbXBsQ2xhc3MoQ2wsIGZhbHNlKS0+YXNDbGFzcygpOwotCi0gIGlmIChjbCkgcmVzID0gY2wtPmlzQW5vbnltb3VzOwotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLSAgcmV0dXJuIHJlczsKLX0KLQotCi19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvQ2xhc3NwYXRoL0NsYXNzcGF0aFZNQ2xhc3NMb2FkZXIuaW5jIGIvdm1raXQvbGliL0ozL0NsYXNzcGF0aC9DbGFzc3BhdGhWTUNsYXNzTG9hZGVyLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI4ZTQ4MC4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvSjMvQ2xhc3NwYXRoL0NsYXNzcGF0aFZNQ2xhc3NMb2FkZXIuaW5jCisrKyAvZGV2L251bGwKQEAgLTEsMzc2ICswLDAgQEAKLS8vPT09LSBDbGFzc3BhdGhWTUNsYXNzTG9hZGVyLmNwcCAtIEdOVSBjbGFzc3BhdGggamF2YS9sYW5nL1ZNQ2xhc3NMb2FkZXIgLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSAidHlwZXMuaCIKLQotI2luY2x1ZGUgIkNsYXNzcGF0aC5oIgotI2luY2x1ZGUgIkphdmFBcnJheS5oIgotI2luY2x1ZGUgIkphdmFDbGFzcy5oIgotI2luY2x1ZGUgIkphdmFPYmplY3QuaCIKLSNpbmNsdWRlICJKYXZhU3RyaW5nLmgiCi0jaW5jbHVkZSAiSmF2YVRocmVhZC5oIgotI2luY2x1ZGUgIkphdmFVcGNhbGxzLmgiCi0jaW5jbHVkZSAiSm5qdm0uaCIKLSNpbmNsdWRlICJSZWFkZXIuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGozOwotCi1leHRlcm4gIkMiIHsKLQotSk5JRVhQT1JUIEphdmFPYmplY3QqIEpOSUNBTEwgSmF2YV9qYXZhX2xhbmdfVk1DbGFzc0xvYWRlcl9nZXRQcmltaXRpdmVDbGFzcygKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLWpjbGFzcyBjbGF6eiwKLSNlbmRpZgotamNoYXIgYnl0ZUlkKSB7Ci0gIAotICBKYXZhT2JqZWN0KiByZXMgPSAwOwotICBsbHZtX2djcm9vdChyZXMsIDApOwotCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLQotICBKbmp2bSogdm0gPSBKYXZhVGhyZWFkOjpnZXQoKS0+Z2V0SlZNKCk7Ci0gIFVzZXJDbGFzc1ByaW1pdGl2ZSogcHJpbSA9IAotICAgIFVzZXJDbGFzc1ByaW1pdGl2ZTo6Ynl0ZUlkVG9QcmltaXRpdmUoYnl0ZUlkLCB2bS0+dXBjYWxscyk7Ci0gIAotICBpZiAoIXByaW0pIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgInVua25vd24gYnl0ZSBwcmltaXRpdmUgJWMiLCBieXRlSWQpOwotICAgIGFib3J0KCk7Ci0gIH0KLSAgCi0gIHJlcyA9IHByaW0tPmdldENsYXNzRGVsZWdhdGVlKCk7Ci0KLSAgRU5EX05BVElWRV9FWENFUFRJT04KLQotICByZXR1cm4gcmVzOwotICAKLX0KLQotSk5JRVhQT1JUIEphdmFPYmplY3QqIEpOSUNBTEwgSmF2YV9qYXZhX2xhbmdfVk1DbGFzc0xvYWRlcl9maW5kTG9hZGVkQ2xhc3MoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsCi1qY2xhc3MgY2xhenosCi0jZW5kaWYKLUphdmFPYmplY3QqIGxvYWRlciwKLUphdmFTdHJpbmcqIG5hbWUpIHsKLSAgCi0gIEphdmFPYmplY3QqIHJlcyA9IDA7Ci0gIGxsdm1fZ2Nyb290KGxvYWRlciwgMCk7Ci0gIGxsdm1fZ2Nyb290KG5hbWUsIDApOwotICBsbHZtX2djcm9vdChyZXMsIDApOwotCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLQotICBKbmp2bSogdm0gPSBKYXZhVGhyZWFkOjpnZXQoKS0+Z2V0SlZNKCk7Ci0gIEpuanZtQ2xhc3NMb2FkZXIqIEpDTCA9IAotICAgIEpuanZtQ2xhc3NMb2FkZXI6OmdldEpuanZtTG9hZGVyRnJvbUphdmFPYmplY3QobG9hZGVyLCB2bSk7Ci0gIFVzZXJDb21tb25DbGFzcyogY2wgPSBKQ0wtPmxvb2t1cENsYXNzRnJvbUphdmFTdHJpbmcobmFtZSk7Ci0KLSAgaWYgKGNsKSByZXMgPSBjbC0+Z2V0Q2xhc3NEZWxlZ2F0ZWUoKTsKLQotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotCi0gIHJldHVybiByZXM7Ci0gIAotICByZXR1cm4gMDsKLX0KLQotSk5JRVhQT1JUIEphdmFPYmplY3QqIEpOSUNBTEwgSmF2YV9qYXZhX2xhbmdfVk1DbGFzc0xvYWRlcl9sb2FkQ2xhc3MoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsCi1qY2xhc3MgY2xhenosCi0jZW5kaWYKLUphdmFTdHJpbmcqIHN0ciwgCi1qYm9vbGVhbiBkb1Jlc29sdmUpIHsKLQotICBKYXZhT2JqZWN0KiByZXMgPSAwOwotICBsbHZtX2djcm9vdChyZXMsIDApOwotICBsbHZtX2djcm9vdChzdHIsIDApOwotCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLQotICBKbmp2bSogdm0gPSBKYXZhVGhyZWFkOjpnZXQoKS0+Z2V0SlZNKCk7Ci0KLSAgSm5qdm1DbGFzc0xvYWRlciogSkNMID0gdm0tPmJvb3RzdHJhcExvYWRlcjsKLSAgVXNlckNvbW1vbkNsYXNzKiBjbCA9IEpDTC0+bG9hZENsYXNzRnJvbUphdmFTdHJpbmcoc3RyLCBkb1Jlc29sdmUsIGZhbHNlKTsKLQotICBpZiAoY2wgIT0gMCkgcmVzID0gY2wtPmdldENsYXNzRGVsZWdhdGVlKCk7Ci0gIAotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotCi0gIHJldHVybiByZXM7Ci19Ci0KLUpOSUVYUE9SVCBKYXZhT2JqZWN0KiBKTklDQUxMIEphdmFfamF2YV9sYW5nX1ZNQ2xhc3NMb2FkZXJfZGVmaW5lQ2xhc3MoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsCi1qY2xhc3MgY2xhenosIAotI2VuZGlmCi1KYXZhT2JqZWN0KiBsb2FkZXIsIAotSmF2YVN0cmluZyogc3RyLCAKLUFycmF5VUludDgqIGJ5dGVzLCAKLWppbnQgb2ZmLCAKLWppbnQgbGVuLCAKLUphdmFPYmplY3QqIHBkKSB7Ci0gIAotICBKYXZhT2JqZWN0KiByZXMgPSAwOwotICBKYXZhT2JqZWN0KiBleGNwID0gMDsKLSAgbGx2bV9nY3Jvb3QobG9hZGVyLCAwKTsKLSAgbGx2bV9nY3Jvb3Qoc3RyLCAwKTsKLSAgbGx2bV9nY3Jvb3QoYnl0ZXMsIDApOwotICBsbHZtX2djcm9vdChwZCwgMCk7Ci0gIGxsdm1fZ2Nyb290KHJlcywgMCk7Ci0gIGxsdm1fZ2Nyb290KGV4Y3AsIDApOwotCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLQotICBKbmp2bSogdm0gPSBKYXZhVGhyZWFkOjpnZXQoKS0+Z2V0SlZNKCk7Ci0KLSAgSm5qdm1DbGFzc0xvYWRlciogSkNMID0gCi0gICAgSm5qdm1DbGFzc0xvYWRlcjo6Z2V0Sm5qdm1Mb2FkZXJGcm9tSmF2YU9iamVjdChsb2FkZXIsIHZtKTsKLSAKLSAgaW50MzJfdCBzaXplID0gSmF2YUFycmF5OjpnZXRTaXplKGJ5dGVzKTsKLSAgQ2xhc3NCeXRlcyogY2xhc3NCeXRlcyA9IG5ldyAoSkNMLT5hbGxvY2F0b3IsIHNpemUpIENsYXNzQnl0ZXMoc2l6ZSk7Ci0gIG1lbWNweShjbGFzc0J5dGVzLT5lbGVtZW50cywgSmF2YUFycmF5OjpnZXRFbGVtZW50cyhieXRlcyksIHNpemUpOwotICAgCi0gIC8vIEJlZm9yZSBjcmVhdGluZyBhIGNsYXNzLCBkbyBhIGNoZWNrIG9uIHRoZSBieXRlcy4gIAotICBSZWFkZXIgcmVhZGVyKGNsYXNzQnl0ZXMpOwotICB1aW50MzIgbWFnaWMgPSByZWFkZXIucmVhZFU0KCk7Ci0gIGlmIChtYWdpYyAhPSBKbmp2bTo6TWFnaWMpIHsKLSAgICBKYXZhVGhyZWFkOjpnZXQoKS0+Z2V0SlZNKCktPmNsYXNzRm9ybWF0RXJyb3IoImJhZCBtYWdpYyBudW1iZXIiKTsKLSAgfQotCi0gIAotICBjb25zdCBVVEY4KiBuYW1lID0gSmF2YVN0cmluZzo6amF2YVRvSW50ZXJuYWwoc3RyLCBKQ0wtPmhhc2hVVEY4KTsKLSAgVXNlckNvbW1vbkNsYXNzKiBjbCA9IEpDTC0+bG9va3VwQ2xhc3MobmFtZSk7Ci0gIAotICBpZiAoIWNsKSB7Ci0gICAgVXNlckNsYXNzKiBjbCA9IEpDTC0+Y29uc3RydWN0Q2xhc3MobmFtZSwgY2xhc3NCeXRlcyk7Ci0gICAgY2wtPnJlc29sdmVDbGFzcygpOwotCi0gICAgcmVzID0gY2wtPmdldENsYXNzRGVsZWdhdGVlKHBkKTsKLSAgfSBlbHNlIHsKLSAgICBleGNwID0gdm0tPkNyZWF0ZUxpbmthZ2VFcnJvcigiZHVwbGljYXRlIGNsYXNzIGRlZmluaXRpb24iKTsKLSAgICBtdm06OlRocmVhZDo6Z2V0KCktPnNldFBlbmRpbmdFeGNlcHRpb24oZXhjcCktPnRocm93SXQoKTsKLSAgfQotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLSAgcmV0dXJuIHJlczsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2phdmFfbGFuZ19WTUNsYXNzTG9hZGVyX3Jlc29sdmVDbGFzcygKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLWpjbGFzcyBjbGF6eiwKLSNlbmRpZgotSmF2YU9iamVjdCogQ2wpIHsKLSAKLSAgbGx2bV9nY3Jvb3QoQ2wsIDApOwotICAKLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotICAKLSAgdmVyaWZ5TnVsbChDbCk7Ci0gIFVzZXJDb21tb25DbGFzczo6cmVzb2x2ZWRJbXBsQ2xhc3MoQ2wsIGZhbHNlKTsKLQotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotfQotCi0jZGVmaW5lIE5VTV9CT09UX1BBQ0tBR0VTIDE2OAotCi1zdGF0aWMgY29uc3QgY2hhciogYm9vdFBhY2thZ2VzW05VTV9CT09UX1BBQ0tBR0VTXSA9IHsKLQkJCQkiamF2YS5hcHBsZXQiLAotCQkJCSJqYXZhLmF3dCIsCi0JCQkJImphdmEuYXd0LmNvbG9yIiwKLQkJCQkiamF2YS5hd3QuZGF0YXRyYW5zZmVyIiwKLQkJCQkiamF2YS5hd3QuZG5kIiwKLQkJCQkiamF2YS5hd3QuZG5kLnBlZXIiLAotCQkJCSJqYXZhLmF3dC5ldmVudCIsCi0JCQkJImphdmEuYXd0LmZvbnQiLAotCQkJCSJqYXZhLmF3dC5nZW9tIiwKLQkJCQkiamF2YS5hd3QuaW0iLAotCQkJCSJqYXZhLmF3dC5pbS5zcGkiLAotCQkJCSJqYXZhLmF3dC5pbWFnZSIsCi0JCQkJImphdmEuYXd0LmltYWdlLnJlbmRlcmFibGUiLAotCQkJCSJqYXZhLmF3dC5wZWVyIiwKLQkJCQkiamF2YS5hd3QucHJpbnQiLAotCQkJCSJqYXZhLmJlYW5zIiwKLQkJCQkiamF2YS5iZWFucy5iZWFuY29udGV4dCIsCi0JCQkJImphdmEuaW8iLAotCQkJCSJqYXZhLmxhbmciLAotCQkJCSJqYXZhLmxhbmcuYW5ub3RhdGlvbiIsCi0JCQkJImphdmEubGFuZy5pbnN0cnVtZW50IiwKLQkJCQkiamF2YS5sYW5nLm1hbmFnZW1lbnQiLAotCQkJCSJqYXZhLmxhbmcucmVmIiwKLQkJCQkiamF2YS5sYW5nLnJlZmxlY3QiLAotCQkJCSJqYXZhLm1hdGgiLAotCQkJCSJqYXZhLm5ldCIsCi0JCQkJImphdmEubmlvIiwKLQkJCQkiamF2YS5uaW8uY2hhbm5lbHMiLAotCQkJCSJqYXZhLm5pby5jaGFubmVscy5zcGkiLAotCQkJCSJqYXZhLm5pby5jaGFyc2V0IiwKLQkJCQkiamF2YS5uaW8uY2hhcnNldC5zcGkiLAotCQkJCSJqYXZhLnJtaSIsCi0JCQkJImphdmEucm1pLmFjdGl2YXRpb24iLAotCQkJCSJqYXZhLnJtaS5kZ2MiLAotCQkJCSJqYXZhLnJtaS5yZWdpc3RyeSIsCi0JCQkJImphdmEucm1pLnNlcnZlciIsCi0JCQkJImphdmEuc2VjdXJpdHkiLAotCQkJCSJqYXZhLnNlY3VyaXR5LmFjbCIsCi0JCQkJImphdmEuc2VjdXJpdHkuY2VydCIsCi0JCQkJImphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcyIsCi0JCQkJImphdmEuc2VjdXJpdHkuc3BlYyIsCi0JCQkJImphdmEuc3FsIiwKLQkJCQkiamF2YS50ZXh0IiwKLQkJCQkiamF2YS51dGlsIiwKLQkJCQkiamF2YS51dGlsLmNvbmN1cnJlbnQiLAotCQkJCSJqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMiLAotCQkJCSJqYXZhLnV0aWwuY29uY3VycmVudC5sb2NrcyIsCi0JCQkJImphdmEudXRpbC5qYXIiLAotCQkJCSJqYXZhLnV0aWwubG9nZ2luZyIsCi0JCQkJImphdmEudXRpbC5wcmVmcyIsCi0JCQkJImphdmEudXRpbC5yZWdleCIsCi0JCQkJImphdmEudXRpbC56aXAiLAotCQkJCSJqYXZheC5hY2Nlc3NpYmlsaXR5IiwKLQkJCQkiamF2YXguYWN0aXZpdHkiLAotCQkJCSJqYXZheC5jcnlwdG8iLAotCQkJCSJqYXZheC5jcnlwdG8uaW50ZXJmYWNlcyIsCi0JCQkJImphdmF4LmNyeXB0by5zcGVjIiwKLQkJCQkiamF2YXguaW1hZ2VpbyIsCi0JCQkJImphdmF4LmltYWdlaW8uZXZlbnQiLAotCQkJCSJqYXZheC5pbWFnZWlvLm1ldGFkYXRhIiwKLQkJCQkiamF2YXguaW1hZ2Vpby5wbHVnaW5zLmJtcCIsCi0JCQkJImphdmF4LmltYWdlaW8ucGx1Z2lucy5qcGVnIiwKLQkJCQkiamF2YXguaW1hZ2Vpby5zcGkiLAotCQkJCSJqYXZheC5pbWFnZWlvLnN0cmVhbSIsCi0JCQkJImphdmF4Lm1hbmFnZW1lbnQiLAotCQkJCSJqYXZheC5tYW5hZ2VtZW50LmxvYWRpbmciLAotCQkJCSJqYXZheC5tYW5hZ2VtZW50Lm1vZGVsbWJlYW4iLAotCQkJCSJqYXZheC5tYW5hZ2VtZW50Lm1vbml0b3IiLAotCQkJCSJqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbiIsCi0JCQkJImphdmF4Lm1hbmFnZW1lbnQucmVsYXRpb24iLAotCQkJCSJqYXZheC5tYW5hZ2VtZW50LnJlbW90ZSIsCi0JCQkJImphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLnJtaSIsCi0JCQkJImphdmF4Lm1hbmFnZW1lbnQudGltZXIiLAotCQkJCSJqYXZheC5uYW1pbmciLAotCQkJCSJqYXZheC5uYW1pbmcuZGlyZWN0b3J5IiwKLQkJCQkiamF2YXgubmFtaW5nLmV2ZW50IiwKLQkJCQkiamF2YXgubmFtaW5nLmxkYXAiLAotCQkJCSJqYXZheC5uYW1pbmcuc3BpIiwKLQkJCQkiamF2YXgubmV0IiwKLQkJCQkiamF2YXgubmV0LnNzbCIsCi0JCQkJImphdmF4LnByaW50IiwKLQkJCQkiamF2YXgucHJpbnQuYXR0cmlidXRlIiwKLQkJCQkiamF2YXgucHJpbnQuYXR0cmlidXRlLnN0YW5kYXJkIiwKLQkJCQkiamF2YXgucHJpbnQuZXZlbnQiLAotCQkJCSJqYXZheC5ybWkiLAotCQkJCSJqYXZheC5ybWkuQ09SQkEiLAotCQkJCSJqYXZheC5ybWkuc3NsIiwKLQkJCQkiamF2YXguc2VjdXJpdHkuYXV0aCIsCi0JCQkJImphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2siLAotCQkJCSJqYXZheC5zZWN1cml0eS5hdXRoLmtlcmJlcm9zIiwKLQkJCQkiamF2YXguc2VjdXJpdHkuYXV0aC5sb2dpbiIsCi0JCQkJImphdmF4LnNlY3VyaXR5LmF1dGguc3BpIiwKLQkJCQkiamF2YXguc2VjdXJpdHkuYXV0aC54NTAwIiwKLQkJCQkiamF2YXguc2VjdXJpdHkuY2VydCIsCi0JCQkJImphdmF4LnNlY3VyaXR5LnNhc2wiLAotCQkJCSJqYXZheC5zb3VuZC5taWRpIiwKLQkJCQkiamF2YXguc291bmQubWlkaS5zcGkiLAotCQkJCSJqYXZheC5zb3VuZC5zYW1wbGVkIiwKLQkJCQkiamF2YXguc291bmQuc2FtcGxlZC5zcGkiLAotCQkJCSJqYXZheC5zcWwiLAotCQkJCSJqYXZheC5zcWwucm93c2V0IiwKLQkJCQkiamF2YXguc3FsLnJvd3NldC5zZXJpYWwiLAotCQkJCSJqYXZheC5zcWwucm93c2V0LnNwaSIsCi0JCQkJImphdmF4LnN3aW5nIiwKLQkJCQkiamF2YXguc3dpbmcuYm9yZGVyIiwKLQkJCQkiamF2YXguc3dpbmcuY29sb3JjaG9vc2VyIiwKLQkJCQkiamF2YXguc3dpbmcuZXZlbnQiLAotCQkJCSJqYXZheC5zd2luZy5maWxlY2hvb3NlciIsCi0JCQkJImphdmF4LnN3aW5nLnBsYWYiLAotCQkJCSJqYXZheC5zd2luZy5wbGFmLmJhc2ljIiwKLQkJCQkiamF2YXguc3dpbmcucGxhZi5tZXRhbCIsCi0JCQkJImphdmF4LnN3aW5nLnBsYWYubXVsdGkiLAotCQkJCSJqYXZheC5zd2luZy5wbGFmLnN5bnRoIiwKLQkJCQkiamF2YXguc3dpbmcudGFibGUiLAotCQkJCSJqYXZheC5zd2luZy50ZXh0IiwKLQkJCQkiamF2YXguc3dpbmcudGV4dC5odG1sIiwKLQkJCQkiamF2YXguc3dpbmcudGV4dC5odG1sLnBhcnNlciIsCi0JCQkJImphdmF4LnN3aW5nLnRleHQucnRmIiwKLQkJCQkiamF2YXguc3dpbmcudHJlZSIsCi0JCQkJImphdmF4LnN3aW5nLnVuZG8iLAotCQkJCSJqYXZheC50cmFuc2FjdGlvbiIsCi0JCQkJImphdmF4LnRyYW5zYWN0aW9uLnhhIiwKLQkJCQkiamF2YXgueG1sIiwKLQkJCQkiamF2YXgueG1sLmRhdGF0eXBlIiwKLQkJCQkiamF2YXgueG1sLm5hbWVzcGFjZSIsCi0JCQkJImphdmF4LnhtbC5wYXJzZXJzIiwKLQkJCQkiamF2YXgueG1sLnRyYW5zZm9ybSIsCi0JCQkJImphdmF4LnhtbC50cmFuc2Zvcm0uZG9tIiwKLQkJCQkiamF2YXgueG1sLnRyYW5zZm9ybS5zYXgiLAotCQkJCSJqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbSIsCi0JCQkJImphdmF4LnhtbC52YWxpZGF0aW9uIiwKLQkJCQkiamF2YXgueG1sLnhwYXRoIiwKLQkJCQkib3JnLmlldGYuamdzcyIsCi0JCQkJIm9yZy5vbWcuQ09SQkEiLAotCQkJCSJvcmcub21nLkNPUkJBXzJfMyIsCi0JCQkJIm9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlIiwKLQkJCQkib3JnLm9tZy5DT1JCQS5EeW5BbnlQYWNrYWdlIiwKLQkJCQkib3JnLm9tZy5DT1JCQS5PUkJQYWNrYWdlIiwKLQkJCQkib3JnLm9tZy5DT1JCQS5wb3J0YWJsZSIsCi0JCQkJIm9yZy5vbWcuQ09SQkEuVHlwZUNvZGVQYWNrYWdlIiwKLQkJCQkib3JnLm9tZy5Db3NOYW1pbmciLAotCQkJCSJvcmcub21nLkNvc05hbWluZy5OYW1pbmdDb250ZXh0RXh0UGFja2FnZSIsCi0JCQkJIm9yZy5vbWcuQ29zTmFtaW5nLk5hbWluZ0NvbnRleHRQYWNrYWdlIiwKLQkJCQkib3JnLm9tZy5EeW5hbWljIiwKLQkJCQkib3JnLm9tZy5EeW5hbWljQW55IiwKLQkJCQkib3JnLm9tZy5EeW5hbWljQW55LkR5bkFueUZhY3RvcnlQYWNrYWdlIiwKLQkJCQkib3JnLm9tZy5EeW5hbWljQW55LkR5bkFueVBhY2thZ2UiLAotCQkJCSJvcmcub21nLklPUCIsCi0JCQkJIm9yZy5vbWcuSU9QLkNvZGVjRmFjdG9yeVBhY2thZ2UiLAotCQkJCSJvcmcub21nLklPUC5Db2RlY1BhY2thZ2UiLAotCQkJCSJvcmcub21nLk1lc3NhZ2luZyIsCi0JCQkJIm9yZy5vbWcuUG9ydGFibGVJbnRlcmNlcHRvciIsCi0JCQkJIm9yZy5vbWcuUG9ydGFibGVJbnRlcmNlcHRvci5PUkJJbml0SW5mb1BhY2thZ2UiLAotCQkJCSJvcmcub21nLlBvcnRhYmxlU2VydmVyIiwKLQkJCQkib3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5DdXJyZW50UGFja2FnZSIsCi0JCQkJIm9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BTWFuYWdlclBhY2thZ2UiLAotCQkJCSJvcmcub21nLlBvcnRhYmxlU2VydmVyLlBPQVBhY2thZ2UiLAotCQkJCSJvcmcub21nLlBvcnRhYmxlU2VydmVyLnBvcnRhYmxlIiwKLQkJCQkib3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5TZXJ2YW50TG9jYXRvclBhY2thZ2UiLAotCQkJCSJvcmcub21nLlNlbmRpbmdDb250ZXh0IiwKLQkJCQkib3JnLm9tZy5zdHViLmphdmEucm1pIiwKLQkJCQkib3JnLnczYy5kb20iLAotCQkJCSJvcmcudzNjLmRvbS5ib290c3RyYXAiLAotCQkJCSJvcmcudzNjLmRvbS5ldmVudHMiLAotCQkJCSJvcmcudzNjLmRvbS5scyIsCi0JCQkJIm9yZy54bWwuc2F4IiwKLQkJCQkib3JnLnhtbC5zYXguZXh0IiwKLQkJCQkib3JnLnhtbC5zYXguaGVscGVycyIKLX07Ci0KLWV4dGVybiAiQyIgQXJyYXlPYmplY3QqIEphdmFfamF2YV9sYW5nX1ZNQ2xhc3NMb2FkZXJfZ2V0Qm9vdFBhY2thZ2VzX18oKSB7Ci0gIEFycmF5T2JqZWN0KiBvYmogPSAwOwotICBsbHZtX2djcm9vdChvYmosIDApOwotICAKLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotICAKLSAgSm5qdm0qIHZtID0gSmF2YVRocmVhZDo6Z2V0KCktPmdldEpWTSgpOwotICBvYmogPSAoQXJyYXlPYmplY3QqKXZtLT51cGNhbGxzLT5BcnJheU9mU3RyaW5nLT5kb05ldyhOVU1fQk9PVF9QQUNLQUdFUyk7Ci0gIGZvciAodWludDMyIGkgPSAwOyBpIDwgTlVNX0JPT1RfUEFDS0FHRVM7ICsraSkgewotICAgIEFycmF5T2JqZWN0OjpzZXRFbGVtZW50KG9iaiwgdm0tPmFzY2lpelRvU3RyKGJvb3RQYWNrYWdlc1tpXSksIGkpOwotICB9Ci0gIAotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotCi0gIHJldHVybiBvYmo7Ci19Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL0ozL0NsYXNzcGF0aC9DbGFzc3BhdGhWTU9iamVjdC5pbmMgYi92bWtpdC9saWIvSjMvQ2xhc3NwYXRoL0NsYXNzcGF0aFZNT2JqZWN0LmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0M2NiNC4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvSjMvQ2xhc3NwYXRoL0NsYXNzcGF0aFZNT2JqZWN0LmluYworKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vLz09PS0tLS0tLSBDbGFzc3BhdGhWTU9iamVjdC5jcHAgLSBHTlUgY2xhc3NwYXRoIGphdmEvbGFuZy9WTU9iamVjdCAtLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLSNpbmNsdWRlICJDbGFzc3BhdGguaCIKLSNpbmNsdWRlICJKYXZhQXJyYXkuaCIKLSNpbmNsdWRlICJKYXZhQ2xhc3MuaCIKLSNpbmNsdWRlICJKYXZhT2JqZWN0LmgiCi0jaW5jbHVkZSAiSmF2YVRocmVhZC5oIgotI2luY2x1ZGUgIkpuanZtLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBqMzsKLQotZXh0ZXJuICJDIiB7Ci0KLUpOSUVYUE9SVCBKYXZhT2JqZWN0KiBKTklDQUxMIEphdmFfamF2YV9sYW5nX1ZNT2JqZWN0X2Nsb25lKAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotamNsYXNzIGNsYXp6LCAKLSNlbmRpZgotSmF2YU9iamVjdCogc3JjKSB7Ci0gIAotICBKYXZhT2JqZWN0KiByZXMgPSAwOwotICBsbHZtX2djcm9vdChyZXMsIDApOwotICBsbHZtX2djcm9vdChzcmMsIDApOwotCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLQotICBVc2VyQ29tbW9uQ2xhc3MqIGNsID0gSmF2YU9iamVjdDo6Z2V0Q2xhc3Moc3JjKTsKLSAgc2l6ZV90IHNpemUgPSAwOwotICBpZiAoY2wtPmlzQXJyYXkoKSkgewotICAgIFVzZXJDbGFzc0FycmF5KiBhcnJheSA9IGNsLT5hc0FycmF5Q2xhc3MoKTsKLSAgICBVc2VyQ29tbW9uQ2xhc3MqIGJhc2UgPSBhcnJheS0+YmFzZUNsYXNzKCk7Ci0gICAgdWludDMyIGxvZ1NpemUgPSBiYXNlLT5pc1ByaW1pdGl2ZSgpID8gCi0gICAgICBiYXNlLT5hc1ByaW1pdGl2ZUNsYXNzKCktPmxvZ1NpemUgOiAoc2l6ZW9mKEphdmFPYmplY3QqKSA9PSA4ID8gMyA6IDIpOwotCi0gICAgc2l6ZSA9IHNpemVvZihKYXZhT2JqZWN0KSArIHNpemVvZihzc2l6ZV90KSArIAotICAgICAgICAgICAgICAgICAgKEphdmFBcnJheTo6Z2V0U2l6ZShzcmMpIDw8IGxvZ1NpemUpOwotICB9IGVsc2UgewotICAgIGFzc2VydChjbC0+aXNDbGFzcygpICYmICJOb3QgYSBjbGFzcyEiKTsKLSAgICBzaXplID0gY2wtPmFzQ2xhc3MoKS0+Z2V0VmlydHVhbFNpemUoKTsKLSAgfQotICByZXMgPSAoSmF2YU9iamVjdCopbXZtOjpnYzo6b3BlcmF0b3IgbmV3KHNpemUsIHNyYy0+Z2V0VmlydHVhbFRhYmxlKCkpOwotICBtZW1jcHkoKHZvaWQqKSgodWludHB0cl90KXJlcyArIDIgKiBzaXplb2Yodm9pZCopKSwKLSAgICAgICAgICh2b2lkKikoKHVpbnRwdHJfdClzcmMgKyAyICogc2l6ZW9mKHZvaWQqKSksCi0gICAgICAgICBzaXplIC0gMiAqIHNpemVvZih2b2lkKikpOwotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLSAgcmV0dXJuIHJlczsKLX0gCi0KLUpOSUVYUE9SVCBKYXZhT2JqZWN0KiBKTklDQUxMIEphdmFfamF2YV9sYW5nX1ZNT2JqZWN0X2dldENsYXNzKAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotamNsYXNzIGNsYXp6LAotI2VuZGlmCi1KYXZhT2JqZWN0KiBvYmopIHsKLSAgCi0gIEphdmFPYmplY3QqIHJlcyA9IDA7Ci0gIGxsdm1fZ2Nyb290KHJlcywgMCk7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0KLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotCi0gIHJlcyA9IEphdmFPYmplY3Q6OmdldENsYXNzKG9iaiktPmdldENsYXNzRGVsZWdhdGVlKCk7Ci0KLSAgRU5EX05BVElWRV9FWENFUFRJT04KLQotICByZXR1cm4gcmVzOwotfQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfamF2YV9sYW5nX1ZNT2JqZWN0X25vdGlmeUFsbCgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLWpjbGFzcyBjbGF6eiwKLSNlbmRpZgotSmF2YU9iamVjdCogb2JqKSB7Ci0KLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLQotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0KLSAgSmF2YU9iamVjdDo6bm90aWZ5QWxsKG9iaik7Ci0KLSAgRU5EX05BVElWRV9FWENFUFRJT04KLX0KLQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfamF2YV9sYW5nX1ZNT2JqZWN0X3dhaXQoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsCi1qY2xhc3MgY2xhenosCi0jZW5kaWYKLUphdmFPYmplY3QqIG9iaiwgamxvbmcgbXMsIGppbnQgbnMpIHsKLQotICBsbHZtX2djcm9vdChvYmosIDApOwotCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLQotICB1aW50MzIgc2VjID0gKHVpbnQzMikgKG1zIC8gMTAwMCk7Ci0gIHVpbnQzMiB1c2VjID0gKG5zIC8gMTAwMCkgKyAxMDAwICogKG1zICUgMTAwMCk7Ci0gIGlmIChucyAmJiAhdXNlYykgdXNlYyA9IDE7Ci0gIGlmIChzZWMgfHwgdXNlYykgewotICAgIHN0cnVjdCB0aW1ldmFsIHQ7Ci0gICAgdC50dl9zZWMgPSBzZWM7Ci0gICAgdC50dl91c2VjID0gdXNlYzsKLSAgICBKYXZhT2JqZWN0Ojp0aW1lZFdhaXQob2JqLCB0KTsKLSAgfSBlbHNlIHsKLSAgICBKYXZhT2JqZWN0Ojp3YWl0KG9iaik7Ci0gIH0KLQotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotfQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfamF2YV9sYW5nX1ZNT2JqZWN0X25vdGlmeSgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLWpjbGFzcyBjbGF6eiwKLSNlbmRpZgotSmF2YU9iamVjdCogb2JqKSB7Ci0KLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLQotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0KLSAgSmF2YU9iamVjdDo6bm90aWZ5KG9iaik7Ci0KLSAgRU5EX05BVElWRV9FWENFUFRJT04KLX0KLQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL0ozL0NsYXNzcGF0aC9DbGFzc3BhdGhWTVJ1bnRpbWUuaW5jIGIvdm1raXQvbGliL0ozL0NsYXNzcGF0aC9DbGFzc3BhdGhWTVJ1bnRpbWUuaW5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDc0OWM5Li4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9KMy9DbGFzc3BhdGgvQ2xhc3NwYXRoVk1SdW50aW1lLmluYworKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vLz09PS0tLS0tLSBDbGFzc3BhdGhWTVJ1bnRpbWUuY3BwIC0gR05VIGNsYXNzcGF0aCBqYXZhL2xhbmcvVk1SdW50aW1lIC0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotCi0jaW5jbHVkZSAibXZtL0dDLmgiCi0KLSNpbmNsdWRlICJ0eXBlcy5oIgotCi0jaW5jbHVkZSAiQ2xhc3NwYXRoLmgiCi0jaW5jbHVkZSAiSmF2YUFycmF5LmgiCi0jaW5jbHVkZSAiSmF2YUNsYXNzLmgiCi0jaW5jbHVkZSAiSmF2YU9iamVjdC5oIgotI2luY2x1ZGUgIkphdmFTdHJpbmcuaCIKLSNpbmNsdWRlICJKYXZhVGhyZWFkLmgiCi0jaW5jbHVkZSAiSmF2YVVwY2FsbHMuaCIKLSNpbmNsdWRlICJKbmp2bS5oIgotCi0jaW5jbHVkZSA8Y3NldGptcD4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi11c2luZyBuYW1lc3BhY2UgajM7Ci0KLWV4dGVybiAiQyIgewotCi0KLUpOSUVYUE9SVCBKYXZhT2JqZWN0KiBKTklDQUxMIEphdmFfamF2YV9sYW5nX1ZNUnVudGltZV9tYXBMaWJyYXJ5TmFtZSgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLWpjbGFzcyBjbGF6eiwKLSNlbmRpZgotSmF2YVN0cmluZyogc3RyTGliKSB7Ci0gIAotICBKYXZhT2JqZWN0KiByZXMgPSAwOwotICBBcnJheVVJbnQxNiogYXJyYXkgPSAwOwotICBjb25zdCBBcnJheVVJbnQxNiogdXRmOExpYiA9IDA7Ci0gIGxsdm1fZ2Nyb290KHJlcywgMCk7Ci0gIGxsdm1fZ2Nyb290KGFycmF5LCAwKTsKLSAgbGx2bV9nY3Jvb3QodXRmOExpYiwgMCk7Ci0gIGxsdm1fZ2Nyb290KHN0ckxpYiwgMCk7Ci0KLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotCi0gIEpuanZtKiB2bSA9IEphdmFUaHJlYWQ6OmdldCgpLT5nZXRKVk0oKTsKLQotICB1dGY4TGliID0gSmF2YVN0cmluZzo6Z2V0VmFsdWUoc3RyTGliKTsKLSAgdWludDMyIHN0TGliID0gc3RyTGliLT5vZmZzZXQ7Ci0gIHNpbnQzMiBsZ0xpYiA9IHN0ckxpYi0+Y291bnQ7Ci0gIHNpbnQzMiBsZ1ByZSA9IHZtLT51cGNhbGxzLT5wcmVsaWItPnNpemU7Ci0gIHNpbnQzMiBsZ1Bvc3QgPSB2bS0+dXBjYWxscy0+cG9zdGxpYi0+c2l6ZTsKLSAgCi0gIHVpbnQzMiBzaXplID0gKHVpbnQzMikobGdQcmUgKyBsZ0xpYiArIGxnUG9zdCk7Ci0gIGFycmF5ID0gKEFycmF5VUludDE2Kil2bS0+dXBjYWxscy0+QXJyYXlPZkNoYXItPmRvTmV3KHNpemUpOwotICB1aW50MTYqIGVsZW1lbnRzID0gQXJyYXlVSW50MTY6OmdldEVsZW1lbnRzKGFycmF5KTsKLQotICBtZW1tb3ZlKGVsZW1lbnRzLCB2bS0+dXBjYWxscy0+cHJlbGliLT5lbGVtZW50cywKLSAgICAgICAgICBsZ1ByZSAqIHNpemVvZih1aW50MTYpKTsKLSAgbWVtbW92ZSgmKGVsZW1lbnRzW2xnUHJlXSksIEFycmF5VUludDE2OjpnZXRFbGVtZW50cyh1dGY4TGliKSArIHN0TGliLAotICAgICAgICAgIGxnTGliICogc2l6ZW9mKHVpbnQxNikpOwotICBtZW1tb3ZlKCYoZWxlbWVudHNbbGdQcmUgKyBsZ0xpYl0pLCB2bS0+dXBjYWxscy0+cG9zdGxpYi0+ZWxlbWVudHMsCi0gICAgICAgICAgIGxnUG9zdCAqIHNpemVvZih1aW50MTYpKTsKLSAgCi0gIHJlcyA9IHZtLT5jb25zdHJ1Y3RTdHJpbmcoYXJyYXkpOwotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLSAgcmV0dXJuIHJlczsKLSAgCi19Ci0KLXR5cGVkZWYgaW50ICgqb25Mb2FkX3QpKGNvbnN0IHZvaWQqKiwgdm9pZCopOwotZXh0ZXJuICJDIiB2b2lkICBqM0VuZEpOSSh1aW50MzIqKiBvbGQpOwotZXh0ZXJuICJDIiB2b2lkICBqM1N0YXJ0Sk5JKHVpbnQzMiogbnVtLCB1aW50MzIqKiBvbGQsIG12bTo6S25vd25GcmFtZSogRnJhbWUpOwotCi1leHRlcm4gIkMiIHZvaWQgY2FsbE9uTG9hZCh2b2lkKiByZXMsIEpuanZtQ2xhc3NMb2FkZXIqIGxvYWRlciwgSm5qdm0qIHZtKQotICBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsKLQotLy8gQ2FsbHMgdGhlIEpOSV9PbkxvYWQgZnVuY3Rpb24gb2YgYSBkeW5hbWljIGxpYnJhcnkuCi1leHRlcm4gIkMiIHZvaWQgY2FsbE9uTG9hZCh2b2lkKiByZXMsIEpuanZtQ2xhc3NMb2FkZXIqIGxvYWRlciwgSm5qdm0qIHZtKSB7Ci0KLSAgb25Mb2FkX3Qgb25Mb2FkID0gKG9uTG9hZF90KWxvYWRlci0+bG9hZEluTGliKCJKTklfT25Mb2FkIiwgcmVzKTsKLSAgCi0gIGlmIChvbkxvYWQpIHsKLSAgICB1aW50MzIgbnVtID0gMDsKLSAgICB1aW50MzIqIG9sZCA9IDA7Ci0gICAgbXZtOjpLbm93bkZyYW1lIEZyYW1lOwotICAgIAotICAgIGozU3RhcnRKTkkoJm51bSwgJm9sZCwgJkZyYW1lKTsKLSAgICBvbkxvYWQoJnZtLT5qYXZhdm1FbnYsIHJlcyk7Ci0gICAgajNFbmRKTkkoJm9sZCk7Ci0gIH0KLX0KLQotLy8gTmV2ZXIgdGhyb3dzLgotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2phdmFfbGFuZ19WTVJ1bnRpbWVfbmF0aXZlTG9hZCgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLWpjbGFzcyBjbGF6eiwKLSNlbmRpZgotSmF2YVN0cmluZyogc3RyLAotSmF2YU9iamVjdCogamF2YUxvYWRlcikgewotICAKLSAgCi0gIGxsdm1fZ2Nyb290KHN0ciwgMCk7Ci0gIGxsdm1fZ2Nyb290KGphdmFMb2FkZXIsIDApOwotCi0gIHZvaWQqIHJlcyA9IDA7Ci0gIAotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0KLSAgSm5qdm0qIHZtID0gSmF2YVRocmVhZDo6Z2V0KCktPmdldEpWTSgpOwotICBKbmp2bUNsYXNzTG9hZGVyKiBsb2FkZXIgPSAKLSAgICBKbmp2bUNsYXNzTG9hZGVyOjpnZXRKbmp2bUxvYWRlckZyb21KYXZhT2JqZWN0KGphdmFMb2FkZXIsIHZtKTsKLQotICBtdm06OlRocmVhZEFsbG9jYXRvciBhbGxvY2F0b3I7Ci0gIGNoYXIqIGJ1ZiA9IEphdmFTdHJpbmc6OnN0clRvQXNjaWl6KHN0ciwgJmFsbG9jYXRvcik7Ci0gIAotICByZXMgPSBsb2FkZXItPmxvYWRMaWIoYnVmKTsKLSAKLSAgaWYgKHJlcykgY2FsbE9uTG9hZChyZXMsIGxvYWRlciwgdm0pOwotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLSAgcmV0dXJuIHJlcyAhPSAwOwotfQotCi0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9qYXZhX2xhbmdfVk1SdW50aW1lX2djKAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotamNsYXNzIGNsYXp6LAotI2VuZGlmCi0pIHsKLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotICAKLSAgbXZtOjpDb2xsZWN0b3I6OmNvbGxlY3QoKTsKLQotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotfQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfamF2YV9sYW5nX1ZNUnVudGltZV9ydW5GaW5hbGl6YXRpb24oCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsCi1qY2xhc3MgY2xhenosCi0jZW5kaWYKLSkgewotICBtdm06OkNvbGxlY3Rvcjo6Y29sbGVjdCgpOwotICAvLyBTbGVlcCBhIGJpdC4KLSAgc2xlZXAoMSk7Ci0gIHJldHVybjsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2phdmFfbGFuZ19WTVJ1bnRpbWVfcnVuRmluYWxpemF0aW9uRm9yRXhpdCgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLWpjbGFzcyBjbGF6eiwKLSNlbmRpZgotKSB7Ci0gIHJldHVybjsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2phdmFfbGFuZ19WTVJ1bnRpbWVfcnVuRmluYWxpemVyc09uRXhpdCgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLWpjbGFzcyBjbGF6eiwKLSNlbmRpZgotdWludDggdmFsdWUKLSkgewotICByZXR1cm47Ci19Ci0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9qYXZhX2xhbmdfVk1SdW50aW1lX2V4aXQoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsCi1qY2xhc3MgY2xhenosCi0jZW5kaWYKLWppbnQgcGFyMSkgewotICBleGl0KHBhcjEpOwotfQotCi1KTklFWFBPUlQgamxvbmcgSmF2YV9qYXZhX2xhbmdfVk1SdW50aW1lX2ZyZWVNZW1vcnkoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsCi1qY2xhc3MgY2xhenosCi0jZW5kaWYKLSkgewotICByZXR1cm4gKGpsb25nKW12bTo6Q29sbGVjdG9yOjpnZXRGcmVlTWVtb3J5KCk7Ci19Ci0KLUpOSUVYUE9SVCBqbG9uZyBKYXZhX2phdmFfbGFuZ19WTVJ1bnRpbWVfdG90YWxNZW1vcnkoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsCi1qY2xhc3MgY2xhenosCi0jZW5kaWYKLSkgewotICByZXR1cm4gKGpsb25nKW12bTo6Q29sbGVjdG9yOjpnZXRUb3RhbE1lbW9yeSgpOwotfQotCi1KTklFWFBPUlQgamxvbmcgSmF2YV9qYXZhX2xhbmdfVk1SdW50aW1lX21heE1lbW9yeSgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLWpjbGFzcyBjbGF6eiwKLSNlbmRpZgotKSB7Ci0gIHJldHVybiAoamxvbmcpbXZtOjpDb2xsZWN0b3I6OmdldE1heE1lbW9yeSgpOwotfQotCi1KTklFWFBPUlQgamludCBKYXZhX2phdmFfbGFuZ19WTVJ1bnRpbWVfYXZhaWxhYmxlUHJvY2Vzc29ycygpewotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotamNsYXNzIGNsYXp6LAotI2VuZGlmCi0gIHJldHVybiAxOwotfQotfQotCmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvQ2xhc3NwYXRoL0NsYXNzcGF0aFZNU3RhY2tXYWxrZXIuaW5jIGIvdm1raXQvbGliL0ozL0NsYXNzcGF0aC9DbGFzc3BhdGhWTVN0YWNrV2Fsa2VyLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ5NGY0ZC4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvSjMvQ2xhc3NwYXRoL0NsYXNzcGF0aFZNU3RhY2tXYWxrZXIuaW5jCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLy89PT0tIENsYXNzcGF0aFZNU3RhY2tXYWxrZXIuY3BwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vPT09LS0tLS0tLS0tLS0tIEdOVSBjbGFzc3BhdGggZ251L2NsYXNzcGF0aC9WTVN0YWNrV2Fsa2VyIC0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSAidHlwZXMuaCIKLQotI2luY2x1ZGUgIkNsYXNzcGF0aC5oIgotI2luY2x1ZGUgIkNsYXNzcGF0aFJlZmxlY3QuaCIKLSNpbmNsdWRlICJKYXZhQXJyYXkuaCIKLSNpbmNsdWRlICJKYXZhQ2xhc3MuaCIKLSNpbmNsdWRlICJKYXZhT2JqZWN0LmgiCi0jaW5jbHVkZSAiSmF2YVRocmVhZC5oIgotI2luY2x1ZGUgIkphdmFVcGNhbGxzLmgiCi0jaW5jbHVkZSAiSm5qdm0uaCIKLQotdXNpbmcgbmFtZXNwYWNlIGozOwotCi1leHRlcm4gIkMiIHsKLQotSk5JRVhQT1JUIEphdmFPYmplY3QqIEpOSUNBTEwgSmF2YV9nbnVfY2xhc3NwYXRoX1ZNU3RhY2tXYWxrZXJfZ2V0Q2xhc3NDb250ZXh0KAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotamNsYXNzIGNsYXp6LAotI2VuZGlmCi0pIHsKLQotICBBcnJheU9iamVjdCogcmVzdWx0ID0gTlVMTDsKLSAgSmF2YU9iamVjdCogZGVsZWdhdGVlID0gTlVMTDsKLSAgbGx2bV9nY3Jvb3QocmVzdWx0LCAwKTsKLSAgbGx2bV9nY3Jvb3QoZGVsZWdhdGVlLCAwKTsKLQotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0KLQltdm06OlRocmVhZCogbXV0ID0gbXZtOjpUaHJlYWQ6OmdldCgpOwotCUphdmFUaHJlYWQqICB0aCA9IEphdmFUaHJlYWQ6OmozVGhyZWFkKG11dCk7Ci0gIEpuanZtKiB2bSA9IHRoLT5nZXRKVk0oKTsKLSAgdWludDMyIGxlbmd0aCA9IG11dC0+Z2V0RnJhbWVDb250ZXh0TGVuZ3RoKCk7Ci0gIAotICBtdm06OlRocmVhZEFsbG9jYXRvciBhbGxvY2F0b3I7ICAKLSAgdWludHB0cl90KiBidWZmZXIgPSAodWludHB0cl90KilhbGxvY2F0b3IuQWxsb2NhdGUobGVuZ3RoICogc2l6ZW9mKHVpbnRwdHJfdCkpOwotICAKLSAgdWludDMyIGZpbmFsU2l6ZSA9IHRoLT5nZXRKYXZhRnJhbWVDb250ZXh0KCh2b2lkKiopYnVmZmVyKTsKLSAgCi0gIHJlc3VsdCA9IChBcnJheU9iamVjdCopCi0gICAgdm0tPnVwY2FsbHMtPnN0YWNrVHJhY2VBcnJheS0+ZG9OZXcoZmluYWxTaXplKTsKLSAgIAotICBmb3IgKHVpbnQzMiBpID0gMDsgaSAhPSBmaW5hbFNpemU7ICsraSkgewotICAgIEphdmFNZXRob2QqIG1ldGggPSAoKEphdmFNZXRob2QqKilidWZmZXIpW2ldOwotICAgIGFzc2VydChtZXRoICYmICJXcm9uZyBzdGFjayB0cmFjZSIpOwotICAgIGRlbGVnYXRlZSA9IG1ldGgtPmNsYXNzRGVmLT5nZXRDbGFzc0RlbGVnYXRlZSgpOzsKLSAgICBBcnJheU9iamVjdDo6c2V0RWxlbWVudChyZXN1bHQsIGRlbGVnYXRlZSwgaSk7Ci0gIH0KLSAgCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0gIAotICByZXR1cm4gcmVzdWx0OwotfQotCi1KTklFWFBPUlQgSmF2YU9iamVjdCogSk5JQ0FMTCBKYXZhX2dudV9jbGFzc3BhdGhfVk1TdGFja1dhbGtlcl9nZXRDbGFzc0xvYWRlcigKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLWpjbGFzcyBjbGF6eiwKLSNlbmRpZgotSmF2YU9iamVjdCogQ2wpIHsKLSAgCi0gIEphdmFPYmplY3QqIHJlcyA9IDA7Ci0gIGxsdm1fZ2Nyb290KHJlcywgMCk7Ci0gIGxsdm1fZ2Nyb290KENsLCAwKTsKLQotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0gIAotICBVc2VyQ29tbW9uQ2xhc3MqIGNsID0gVXNlckNvbW1vbkNsYXNzOjpyZXNvbHZlZEltcGxDbGFzcyhDbCwgZmFsc2UpOwotICByZXMgPSBjbC0+Y2xhc3NMb2FkZXItPmdldEphdmFDbGFzc0xvYWRlcigpOwotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLSAgcmV0dXJuIHJlczsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL0ozL0NsYXNzcGF0aC9DbGFzc3BhdGhWTVN5c3RlbS5pbmMgYi92bWtpdC9saWIvSjMvQ2xhc3NwYXRoL0NsYXNzcGF0aFZNU3lzdGVtLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ0MWNjZC4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvSjMvQ2xhc3NwYXRoL0NsYXNzcGF0aFZNU3lzdGVtLmluYworKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLz09PS0tIENsYXNzcGF0aFZNU3lzdGVtLmNwcCAtIEdOVSBjbGFzc3BhdGggamF2YS9sYW5nL1ZNU3lzdGVtIC0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLSNpbmNsdWRlICJDbGFzc3BhdGguaCIKLSNpbmNsdWRlICJKYXZhQXJyYXkuaCIKLSNpbmNsdWRlICJKYXZhQ2xhc3MuaCIKLSNpbmNsdWRlICJKYXZhT2JqZWN0LmgiCi0jaW5jbHVkZSAiSmF2YVRocmVhZC5oIgotI2luY2x1ZGUgIkpuanZtLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBqMzsKLQotZXh0ZXJuICJDIiB7Ci0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9qYXZhX2xhbmdfVk1TeXN0ZW1fYXJyYXljb3B5KAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotamNsYXNzIF9jbCwKLSNlbmRpZgotSmF2YU9iamVjdCogc3JjLAotamludCBzc3RhcnQsCi1KYXZhT2JqZWN0KiBkc3QsCi1qaW50IGRzdGFydCwKLWppbnQgbGVuKSB7Ci0KLSAgSmF2YU9iamVjdCogY3VyID0gMDsKLSAgbGx2bV9nY3Jvb3Qoc3JjLCAwKTsKLSAgbGx2bV9nY3Jvb3QoZHN0LCAwKTsKLSAgbGx2bV9nY3Jvb3QoY3VyLCAwKTsKLSAgYXNzZXJ0KHNyYy0+Z2V0VmlydHVhbFRhYmxlKCkpOwotICBhc3NlcnQoZHN0LT5nZXRWaXJ0dWFsVGFibGUoKSk7Ci0KLQltdm06OlRocmVhZCogbXV0ID0gbXZtOjpUaHJlYWQ6OmdldCgpOwotICBKbmp2bSAqdm0gPSBKYXZhVGhyZWFkOjpqM1RocmVhZChtdXQpLT5nZXRKVk0oKTsKLQotICBpZiAoc3JjID09IE5VTEwgfHwgZHN0ID09IE5VTEwpIHsKLSAgICBtdXQtPnNldFBlbmRpbmdFeGNlcHRpb24odm0tPkNyZWF0ZU51bGxQb2ludGVyRXhjZXB0aW9uKCkpOwotICAgIHJldHVybjsKLSAgfQotICAKLSAgaWYgKCEoSmF2YU9iamVjdDo6Z2V0Q2xhc3Moc3JjKS0+aXNBcnJheSgpICYmCi0gICAgICAgIEphdmFPYmplY3Q6OmdldENsYXNzKGRzdCktPmlzQXJyYXkoKSkpIHsKLSAgICBtdXQtPnNldFBlbmRpbmdFeGNlcHRpb24odm0tPkNyZWF0ZUFycmF5U3RvcmVFeGNlcHRpb24oKEphdmFWaXJ0dWFsVGFibGUqKWRzdC0+Z2V0VmlydHVhbFRhYmxlKCkpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgCi0gIFVzZXJDbGFzc0FycmF5KiB0cyA9IChVc2VyQ2xhc3NBcnJheSopSmF2YU9iamVjdDo6Z2V0Q2xhc3Moc3JjKTsKLSAgVXNlckNsYXNzQXJyYXkqIHRkID0gKFVzZXJDbGFzc0FycmF5KilKYXZhT2JqZWN0OjpnZXRDbGFzcyhkc3QpOwotICBVc2VyQ29tbW9uQ2xhc3MqIGRzdFR5cGUgPSB0ZC0+YmFzZUNsYXNzKCk7Ci0gIFVzZXJDb21tb25DbGFzcyogc3JjVHlwZSA9IHRzLT5iYXNlQ2xhc3MoKTsKLQotICBzaW50MzIgc3JjU2l6ZSA9IEphdmFBcnJheTo6Z2V0U2l6ZShzcmMpOwotICBzaW50MzIgZHN0U2l6ZSA9IEphdmFBcnJheTo6Z2V0U2l6ZShkc3QpOwotCi0gIGlmIChsZW4gPiBzcmNTaXplKSB7Ci0gICAgbXV0LT5zZXRQZW5kaW5nRXhjZXB0aW9uKHZtLT5DcmVhdGVJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKGxlbikpOwotICB9IGVsc2UgaWYgKGxlbiA+IGRzdFNpemUpIHsKLSAgICBtdXQtPnNldFBlbmRpbmdFeGNlcHRpb24odm0tPkNyZWF0ZUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24obGVuKSk7Ci0gIH0gZWxzZSBpZiAobGVuICsgc3N0YXJ0ID4gc3JjU2l6ZSkgewotICAgIG11dC0+c2V0UGVuZGluZ0V4Y2VwdGlvbih2bS0+Q3JlYXRlSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihsZW4gKyBzc3RhcnQpKTsKLSAgfSBlbHNlIGlmIChsZW4gKyBkc3RhcnQgPiBkc3RTaXplKSB7Ci0gICAgbXV0LT5zZXRQZW5kaW5nRXhjZXB0aW9uKHZtLT5DcmVhdGVJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKGxlbiArIGRzdGFydCkpOwotICB9IGVsc2UgaWYgKGRzdGFydCA8IDApIHsKLSAgICBtdXQtPnNldFBlbmRpbmdFeGNlcHRpb24odm0tPkNyZWF0ZUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oZHN0YXJ0KSk7Ci0gIH0gZWxzZSBpZiAoc3N0YXJ0IDwgMCkgewotICAgIG11dC0+c2V0UGVuZGluZ0V4Y2VwdGlvbih2bS0+Q3JlYXRlSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihzc3RhcnQpKTsKLSAgfSBlbHNlIGlmIChsZW4gPCAwKSB7Ci0gICAgbXV0LT5zZXRQZW5kaW5nRXhjZXB0aW9uKHZtLT5DcmVhdGVJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKGxlbikpOwotICB9IGVsc2UgaWYgKChkc3RUeXBlLT5pc1ByaW1pdGl2ZSgpIHx8IHNyY1R5cGUtPmlzUHJpbWl0aXZlKCkpICYmCi0gICAgICAgICAgICAgc3JjVHlwZSAhPSBkc3RUeXBlKSB7Ci0gICAgbXV0LT5zZXRQZW5kaW5nRXhjZXB0aW9uKHZtLT5DcmVhdGVBcnJheVN0b3JlRXhjZXB0aW9uKChKYXZhVmlydHVhbFRhYmxlKilkc3QtPmdldFZpcnR1YWxUYWJsZSgpKSk7Ci0gIH0KLSAgaWYgKG11dC0+Z2V0UGVuZGluZ0V4Y2VwdGlvbigpICE9IE5VTEwpIHJldHVybjsKLSAgCi0gIGppbnQgaSA9IHNzdGFydDsKLSAgamludCBsZW5ndGggPSBsZW47Ci0gIGJvb2wgZG9UaHJvdyA9IGZhbHNlOwotICBpZiAoIShkc3RUeXBlLT5pc1ByaW1pdGl2ZSgpKSkgewotICAgIHdoaWxlIChpIDwgc3N0YXJ0ICsgbGVuICYmICFkb1Rocm93KSB7Ci0gICAgICBjdXIgPSBBcnJheU9iamVjdDo6Z2V0RWxlbWVudCgoQXJyYXlPYmplY3QqKXNyYywgaSk7Ci0gICAgICBpZiAoY3VyKSB7Ci0gICAgICAgIGlmICghKEphdmFPYmplY3Q6OmdldENsYXNzKGN1ciktPmlzQXNzaWduYWJsZUZyb20oZHN0VHlwZSkpKSB7Ci0gICAgICAgICAgZG9UaHJvdyA9IHRydWU7Ci0gICAgICAgICAgbGVuZ3RoID0gaTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgKytpOwotICAgIH0KLSAgfQotICAKLSAgdWludDMyIGxvZ1NpemUgPSBkc3RUeXBlLT5pc1ByaW1pdGl2ZSgpID8gCi0gICAgZHN0VHlwZS0+YXNQcmltaXRpdmVDbGFzcygpLT5sb2dTaXplIDogKHNpemVvZihKYXZhT2JqZWN0KikgPT0gOCA/IDMgOiAyKTsKLQotICB2b2lkKiBwdHJEc3QgPSAodm9pZCopKChpbnQ2NF90KUphdmFBcnJheTo6Z2V0RWxlbWVudHMoZHN0KSArIChkc3RhcnQgPDwgbG9nU2l6ZSkpOwotICB2b2lkKiBwdHJTcmMgPSAodm9pZCopKChpbnQ2NF90KUphdmFBcnJheTo6Z2V0RWxlbWVudHMoc3JjKSArIChzc3RhcnQgPDwgbG9nU2l6ZSkpOwotICBtZW1tb3ZlKHB0ckRzdCwgcHRyU3JjLCBsZW5ndGggPDwgbG9nU2l6ZSk7Ci0KLSAgaWYgKGRvVGhyb3cpIHsKLSAgICBtdXQtPnNldFBlbmRpbmdFeGNlcHRpb24odm0tPkNyZWF0ZUFycmF5U3RvcmVFeGNlcHRpb24oKEphdmFWaXJ0dWFsVGFibGUqKWRzdC0+Z2V0VmlydHVhbFRhYmxlKCkpKTsKLSAgfQotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfamF2YV9sYW5nX1ZNU3lzdGVtX2lkZW50aXR5SGFzaENvZGUoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsCi1qY2xhc3MgY2xhenosCi0jZW5kaWYKLUphdmFPYmplY3QqIG9iaikgewotCi0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gIGlmIChvYmogPT0gTlVMTCkgcmV0dXJuIDA7Ci0gIHJldHVybiBKYXZhT2JqZWN0OjpoYXNoQ29kZShvYmopOwotfQotCi19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvQ2xhc3NwYXRoL0NsYXNzcGF0aFZNU3lzdGVtUHJvcGVydGllcy5pbmMgYi92bWtpdC9saWIvSjMvQ2xhc3NwYXRoL0NsYXNzcGF0aFZNU3lzdGVtUHJvcGVydGllcy5pbmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMmIwMTguLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL0ozL0NsYXNzcGF0aC9DbGFzc3BhdGhWTVN5c3RlbVByb3BlcnRpZXMuaW5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8vPT09LSBDbGFzc3BhdGhWTVN5c3RlbS9Qcm9wZXJ0aWVzLmNwcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHTlUgY2xhc3NwYXRoIGdudS9jbGFzc3BhdGgvVk1TeXN0ZW1Qcm9wZXJ0aWVzIC09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+Ci0KLSNpbmNsdWRlICJ0eXBlcy5oIgotCi0jaW5jbHVkZSAiQ2xhc3NwYXRoLmgiCi0jaW5jbHVkZSAiSmF2YUFycmF5LmgiCi0jaW5jbHVkZSAiSmF2YUNsYXNzLmgiCi0jaW5jbHVkZSAiSmF2YU9iamVjdC5oIgotI2luY2x1ZGUgIkphdmFUaHJlYWQuaCIKLSNpbmNsdWRlICJKYXZhVXBjYWxscy5oIgotI2luY2x1ZGUgIkpuanZtLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBqMzsKLQotZXh0ZXJuICJDIiB7Ci0KLXZvaWQgc2V0UHJvcGVydHkoSm5qdm0qIHZtLCBKYXZhT2JqZWN0KiBwcm9wLCBjb25zdCBjaGFyKiBrZXksCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhbCkgewotCi0gIEphdmFTdHJpbmcqIFZhbCA9IDA7IAotICBKYXZhU3RyaW5nKiBLZXkgPSAwOyAKLSAgbGx2bV9nY3Jvb3QocHJvcCwgMCk7Ci0gIGxsdm1fZ2Nyb290KFZhbCwgMCk7Ci0gIGxsdm1fZ2Nyb290KEtleSwgMCk7Ci0KLSAgVmFsID0gdm0tPmFzY2lpelRvU3RyKHZhbCk7Ci0gIEtleSA9IHZtLT5hc2NpaXpUb1N0cihrZXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHZtLT51cGNhbGxzLT5zZXRQcm9wZXJ0eS0+aW52b2tlSW50U3BlY2lhbCgoVXNlckNsYXNzKilKYXZhT2JqZWN0OjpnZXRDbGFzcyhwcm9wKSwgcHJvcCwgJktleSwgJlZhbCk7Ci19Ci0KLXZvaWQgc2V0VW5hbWVQcm9wKEpuanZtKiB2bSwgSmF2YU9iamVjdCogcHJvcCkgewotCi0gIGxsdm1fZ2Nyb290KHByb3AsIDApOwotCi0gIHN0cnVjdCB1dHNuYW1lIGluZm9zOwotICB1bmFtZSgmaW5mb3MpOwotICBzZXRQcm9wZXJ0eSh2bSwgcHJvcCwgIm9zLm5hbWUiLCBpbmZvcy5zeXNuYW1lKTsKLSAgc2V0UHJvcGVydHkodm0sIHByb3AsICJvcy5hcmNoIiwgaW5mb3MubWFjaGluZSk7Ci0gIHNldFByb3BlcnR5KHZtLCBwcm9wLCAib3MudmVyc2lvbiIsIGluZm9zLnJlbGVhc2UpOwotICBpZiAoIXN0cmNtcChpbmZvcy5tYWNoaW5lLCAicHBjIikpIHsKLSAgICBzZXRQcm9wZXJ0eSh2bSwgcHJvcCwgImdudS5jcHUuZW5kaWFuIiwiYmlnIik7Ci0gIH0gZWxzZSB7Ci0gICAgc2V0UHJvcGVydHkodm0sIHByb3AsICJnbnUuY3B1LmVuZGlhbiIsImxpdHRsZSIpOwotICB9Ci19Ci0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9nbnVfY2xhc3NwYXRoX1ZNU3lzdGVtUHJvcGVydGllc19wcmVJbml0KAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotamNsYXNzIGNsYXp6LAotI2VuZGlmCi1KYXZhT2JqZWN0KiBwcm9wKSB7Ci0gIAotICBsbHZtX2djcm9vdChwcm9wLCAwKTsKLSAgCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLQotICBKbmp2bSogdm0gPSBKYXZhVGhyZWFkOjpnZXQoKS0+Z2V0SlZNKCk7Ci0gIGNvbnN0IGNoYXIqIHRtcDsKLSAgc2V0UHJvcGVydHkodm0sIHByb3AsICJqYXZhLnZtLnNwZWNpZmljYXRpb24udmVyc2lvbiIsICIxLjAiKTsKLSAgc2V0UHJvcGVydHkodm0sIHByb3AsICJqYXZhLnZtLnNwZWNpZmljYXRpb24udmVuZG9yIiwKLSAgICAgICAgICAgICAgIlN1biBNaWNyb3N5c3RlbXMsIEluYyIpOwotICBzZXRQcm9wZXJ0eSh2bSwgcHJvcCwgImphdmEudm0uc3BlY2lmaWNhdGlvbi5uYW1lIiwKLSAgICAgICAgICAgICAgIkphdmEgVmlydHVhbCBNYWNoaW5lIFNwZWNpZmljYXRpb24iKTsKLSAgc2V0UHJvcGVydHkodm0sIHByb3AsICJqYXZhLnNwZWNpZmljYXRpb24udmVyc2lvbiIsICIxLjUiKTsKLSAgc2V0UHJvcGVydHkodm0sIHByb3AsICJqYXZhLnNwZWNpZmljYXRpb24udmVuZG9yIiwgIlN1biBNaWNyb3N5c3RlbXMsIEluYyIpOwotICBzZXRQcm9wZXJ0eSh2bSwgcHJvcCwgImphdmEuc3BlY2lmaWNhdGlvbi5uYW1lIiwKLSAgICAgICAgICAgICAgIkphdmEgUGxhdGZvcm0gQVBJIFNwZWNpZmljYXRpb24iKTsKLSAgc2V0UHJvcGVydHkodm0sIHByb3AsICJqYXZhLnZlcnNpb24iLCAiMS41Iik7Ci0gIHNldFByb3BlcnR5KHZtLCBwcm9wLCAiamF2YS5ydW50aW1lLnZlcnNpb24iLCAiMS41Iik7Ci0gIHNldFByb3BlcnR5KHZtLCBwcm9wLCAiamF2YS52ZW5kb3IiLCAiVGhlIFZNS2l0IFByb2plY3QiKTsKLSAgc2V0UHJvcGVydHkodm0sIHByb3AsICJqYXZhLnZlbmRvci51cmwiLCAiaHR0cDovL3Zta2l0Lmxsdm0ub3JnIik7Ci0gIAotICB0bXAgPSBnZXRlbnYoIkpBVkFfSE9NRSIpOwotICBpZiAoIXRtcCkgdG1wID0gIiI7Ci0gIHNldFByb3BlcnR5KHZtLCBwcm9wLCAiamF2YS5ob21lIiwgdG1wKTsKLSAgCi0gIEpuanZtQm9vdHN0cmFwTG9hZGVyKiBKQ0wgPSB2bS0+Ym9vdHN0cmFwTG9hZGVyOwotICBzZXRQcm9wZXJ0eSh2bSwgcHJvcCwgImphdmEuY2xhc3MudmVyc2lvbiIsICI0OS4wIik7Ci0gIHNldFByb3BlcnR5KHZtLCBwcm9wLCAiamF2YS5jbGFzcy5wYXRoIiwgdm0tPmNsYXNzcGF0aCk7Ci0gIHNldFByb3BlcnR5KHZtLCBwcm9wLCAiamF2YS5ib290LmNsYXNzLnBhdGgiLCBKQ0wtPmJvb3RDbGFzc3BhdGhFbnYpOwotICBzZXRQcm9wZXJ0eSh2bSwgcHJvcCwgInN1bi5ib290LmNsYXNzLnBhdGgiLCBKQ0wtPmJvb3RDbGFzc3BhdGhFbnYpOwotICBzZXRQcm9wZXJ0eSh2bSwgcHJvcCwgImphdmEudm0udmVyc2lvbiIsICIwLjI4Iik7Ci0gIHNldFByb3BlcnR5KHZtLCBwcm9wLCAiamF2YS52bS52ZW5kb3IiLCAiVGhlIFZNS2l0IFByb2plY3QiKTsKLSAgc2V0UHJvcGVydHkodm0sIHByb3AsICJqYXZhLnZtLm5hbWUiLCAiSjMiKTsKLSAgc2V0UHJvcGVydHkodm0sIHByb3AsICJqYXZhLnNwZWNpZmljYXRpb24udmVyc2lvbiIsICIxLjUiKTsKLSAgc2V0UHJvcGVydHkodm0sIHByb3AsICJqYXZhLmlvLnRtcGRpciIsICIvdG1wIik7Ci0gIAotICB0bXAgPSBnZXRlbnYoIkpBVkFfQ09NUElMRVIiKTsKLSAgaWYgKCF0bXApIHRtcCA9ICJnY2oiOwotICBzZXRQcm9wZXJ0eSh2bSwgcHJvcCwgImphdmEuY29tcGlsZXIiLCB0bXApOwotICAKLSAgc2V0UHJvcGVydHkodm0sIHByb3AsICJidWlsZC5jb21waWxlciIsICJnY2oiKTsKLSAgc2V0UHJvcGVydHkodm0sIHByb3AsICJnY2ouY2xhc3MucGF0aCIsIEpDTC0+Ym9vdENsYXNzcGF0aEVudik7Ci0gIHNldFByb3BlcnR5KHZtLCBwcm9wLCAiZ251LmNsYXNzcGF0aC5ib290LmxpYnJhcnkucGF0aCIsCi0gICAgICAgICAgICAgIEpDTC0+bGliQ2xhc3NwYXRoRW52KTsKLSAgCi0gIHNldFVuYW1lUHJvcCh2bSwgcHJvcCk7Ci0gIAotICBzZXRQcm9wZXJ0eSh2bSwgcHJvcCwgImZpbGUuc2VwYXJhdG9yIiwgdm0tPmRpclNlcGFyYXRvcik7Ci0gIHNldFByb3BlcnR5KHZtLCBwcm9wLCAicGF0aC5zZXBhcmF0b3IiLCB2bS0+ZW52U2VwYXJhdG9yKTsKLSAgc2V0UHJvcGVydHkodm0sIHByb3AsICJsaW5lLnNlcGFyYXRvciIsICJcbiIpOwotICAKLSAgdG1wID0gZ2V0ZW52KCJVU0VSTkFNRSIpOwotICBpZiAoIXRtcCkgdG1wID0gZ2V0ZW52KCJMT0dOQU1FIik7Ci0gIGVsc2UgaWYgKCF0bXApIHRtcCA9IGdldGVudigiTkFNRSIpOwotICBlbHNlIGlmICghdG1wKSB0bXAgPSAiIjsKLSAgc2V0UHJvcGVydHkodm0sIHByb3AsICJ1c2VyLm5hbWUiLCB0bXApOwotICAKLSAgdG1wICA9IGdldGVudigiSE9NRSIpOwotICBpZiAoIXRtcCkgdG1wID0gIiI7Ci0gIHNldFByb3BlcnR5KHZtLCBwcm9wLCAidXNlci5ob21lIiwgdG1wKTsKLSAgCi0gIHRtcCA9IGdldGVudigiUFdEIik7Ci0gIGlmICghdG1wKSB0bXAgPSAiIjsKLSAgc2V0UHJvcGVydHkodm0sIHByb3AsICJ1c2VyLmRpciIsIHRtcCk7Ci0gCi0gIC8vIERpc2FibGUgdGhpcyBwcm9wZXJ0eS4gVGhlIENsYXNzcGF0aCBpY29udiBpbXBsZW1lbnRhdGlvbiBpcyByZWFsbHkKLSAgLy8gbm90IG9wdGltaXplZCAoaXQgb3Zlci1hYnVzZXMgSk5JIGNhbGxzKS4KLSAgLy9zZXRQcm9wZXJ0eSh2bSwgcHJvcCwgImdudS5jbGFzc3BhdGgubmlvLmNoYXJzZXQucHJvdmlkZXIuaWNvbnYiLCAidHJ1ZSIpOyAKLSAgc2V0UHJvcGVydHkodm0sIHByb3AsICJmaWxlLmVuY29kaW5nIiwgIklTTzg4NTlfMSIpOwotICBzZXRQcm9wZXJ0eSh2bSwgcHJvcCwgImdudS5qYXZhLnV0aWwuem9uZWluZm8uZGlyIiwgIi91c3Ivc2hhcmUvem9uZWluZm8iKTsKLQotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotfQotCi1leHRlcm4gIkMiIHZvaWQgSmF2YV9nbnVfY2xhc3NwYXRoX1ZNU3lzdGVtUHJvcGVydGllc19wb3N0SW5pdF9fTGphdmFfdXRpbF9Qcm9wZXJ0aWVzXzIoSmF2YU9iamVjdCogcHJvcCkgewotCi0gIGxsdm1fZ2Nyb290KHByb3AsIDApOwotCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLQotICBKbmp2bSogdm0gPSBKYXZhVGhyZWFkOjpnZXQoKS0+Z2V0SlZNKCk7Ci0gIGZvciAoc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNoYXIqLCBjaGFyKj4gPjo6aXRlcmF0b3IgaSA9IAotICAgICAgIHZtLT5wb3N0UHJvcGVydGllcy5iZWdpbigpLCBlID0gdm0tPnBvc3RQcm9wZXJ0aWVzLmVuZCgpOyBpIT0gZTsgaSsrKSB7Ci0gICAgc2V0UHJvcGVydHkodm0sIHByb3AsIGktPmZpcnN0LCBpLT5zZWNvbmQpOwotICB9Ci0KLSAgRU5EX05BVElWRV9FWENFUFRJT04KLX0KLQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL0ozL0NsYXNzcGF0aC9DbGFzc3BhdGhWTVRocmVhZC5pbmMgYi92bWtpdC9saWIvSjMvQ2xhc3NwYXRoL0NsYXNzcGF0aFZNVGhyZWFkLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM0MGQ1NC4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvSjMvQ2xhc3NwYXRoL0NsYXNzcGF0aFZNVGhyZWFkLmluYworKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vLz09PS0gQ2xhc3NwYXRoVk1UaHJlYWQuY3BwIC0gR05VIGNsYXNzcGF0aCBqYXZhL2xhbmcvVk1UaHJlYWQgLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLSNpbmNsdWRlICJDbGFzc3BhdGguaCIKLSNpbmNsdWRlICJKYXZhQXJyYXkuaCIKLSNpbmNsdWRlICJKYXZhQ2xhc3MuaCIKLSNpbmNsdWRlICJKYXZhT2JqZWN0LmgiCi0jaW5jbHVkZSAiSmF2YVRocmVhZC5oIgotI2luY2x1ZGUgIkphdmFVcGNhbGxzLmgiCi0jaW5jbHVkZSAiSm5qdm0uaCIKLQotdXNpbmcgbmFtZXNwYWNlIGozOwotCi1leHRlcm4gIkMiIHsKLQotLy8gTmV2ZXIgdGhyb3dzLgotLy8gTmV2ZXIgY2FsbHMgSmF2YSBjb2RlLgotSk5JRVhQT1JUIEphdmFPYmplY3QqIEpOSUNBTEwgSmF2YV9qYXZhX2xhbmdfVk1UaHJlYWRfY3VycmVudFRocmVhZCgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLWpjbGFzcyBjbGF6egotI2VuZGlmCi0pIHsKLSAgcmV0dXJuIEphdmFUaHJlYWQ6OmdldCgpLT5jdXJyZW50VGhyZWFkKCk7Ci19Ci0KLXZvaWQgc3RhcnQobXZtOjpUaHJlYWQqIG11dCkgewotICBKYXZhT2JqZWN0Vk1UaHJlYWQqIHZtVGhyZWFkID0gTlVMTDsKLSAgSmF2YU9iamVjdCogamF2YVRocmVhZCA9IE5VTEw7Ci0gIGxsdm1fZ2Nyb290KHZtVGhyZWFkLCAwKTsKLSAgbGx2bV9nY3Jvb3QoamF2YVRocmVhZCwgMCk7Ci0KLQlKYXZhVGhyZWFkKiB0aHJlYWQgPSBKYXZhVGhyZWFkOjpqM1RocmVhZChtdXQpOwotICBKbmp2bSogdm0gPSB0aHJlYWQtPmdldEpWTSgpOwotICAvLyBXYWl0IHNvbWUgdGltZSB0byBsZXQgdGhlIGNyZWF0b3IgaW5pdGlhbGlzZSB0aGVzZSBmaWVsZHMuCi0gIHdoaWxlICgodGhyZWFkLT5qYXZhVGhyZWFkID09IE5VTEwpIHx8ICh0aHJlYWQtPnZtVGhyZWFkID09IE5VTEwpKSB7Ci0gICAgbXZtOjpUaHJlYWQ6OnlpZWxkKCk7Ci0gIH0KLQotICAvLyBPaywgbm93IHRoYXQgdGhlIHRocmVhZCBpcyBjcmVhdGVkIHdlIGNhbiBzZXQgdGhlIHRoZSB2YWx1ZSBvZiB2bWRhdGEsCi0gIC8vIHdoaWNoIGlzIHRoZSBKYXZhVGhyZWFkIG9iamVjdC4KLSAgdm1UaHJlYWQgPSAoSmF2YU9iamVjdFZNVGhyZWFkKil0aHJlYWQtPnZtVGhyZWFkOwotICBhc3NlcnQodm1UaHJlYWQgJiYgIkRpZG4ndCBmaXggdGhlIHZtVGhyZWFkIG9mIGEgajMgdGhyZWFkIik7Ci0gIGFzc2VydCh2bVRocmVhZC0+Z2V0VmlydHVhbFRhYmxlKCkpOwotICBKYXZhT2JqZWN0Vk1UaHJlYWQ6OnNldFZtZGF0YSh2bVRocmVhZCwgdGhyZWFkKTsKLSAgCi0gIFVzZXJDbGFzcyogdm10aENsYXNzID0gKFVzZXJDbGFzcyopSmF2YU9iamVjdDo6Z2V0Q2xhc3Modm1UaHJlYWQpOyAKLSAgCi0gIGphdmFUaHJlYWQgPSB0aHJlYWQtPmphdmFUaHJlYWQ7Ci0gIGFzc2VydChqYXZhVGhyZWFkICYmICJEaWRuJ3QgZml4IHRoZSBqYXZhVGhyZWFkIG9mIGEgajMgdGhyZWFkIik7Ci0gIC8vIElmIHRoZSB0aHJlYWQgaXMgbm90IGEgZGFlbW9uLCBpdCBpcyBhZGRlZCB0byB0aGUgbGlzdCBvZiB0aHJlYWRzIHRvCi0gIC8vIHdhaXQgdW50aWwgZXhpdC4KLSAgYm9vbCBpc0RhZW1vbiA9IHZtLT51cGNhbGxzLT5kYWVtb24tPmdldEluc3RhbmNlSW50OEZpZWxkKGphdmFUaHJlYWQpOwotCi0gIGlmIChpc0RhZW1vbikKLQkJbXV0LT5zZXREYWVtb24oKTsKLQkKLSAgYXNzZXJ0KHZtVGhyZWFkLT5nZXRWaXJ0dWFsVGFibGUoKSk7Ci0gIGFzc2VydChqYXZhVGhyZWFkLT5nZXRWaXJ0dWFsVGFibGUoKSk7Ci0gIC8vIFJ1biB0aGUgVk1UaHJlYWQ6OnJ1biBmdW5jdGlvbgotICB2bS0+dXBjYWxscy0+cnVuVk1UaHJlYWQtPmludm9rZUludFNwZWNpYWwodm10aENsYXNzLCB2bVRocmVhZCk7Ci19Ci0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9qYXZhX2xhbmdfVk1UaHJlYWRfc3RhcnQoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsCi0jZW5kaWYKLUphdmFPYmplY3QqIHZtVGhyZWFkLCBzaW50NjQgc3RhY2tTaXplKSB7Ci0KLSAgSmF2YU9iamVjdCogamF2YVRocmVhZCA9IDA7Ci0gIGxsdm1fZ2Nyb290KHZtVGhyZWFkLCAwKTsKLSAgbGx2bV9nY3Jvb3QoamF2YVRocmVhZCwgMCk7Ci0KLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotCi0gIEpuanZtKiB2bSA9IEphdmFUaHJlYWQ6OmdldCgpLT5nZXRKVk0oKTsKLSAgCi0gIC8vIENsYXNzcGF0aCBoYXMgc2V0IHRoaXMgZmllbGQuCi0gIGphdmFUaHJlYWQgPSB2bS0+dXBjYWxscy0+YXNzb2NUaHJlYWQtPmdldEluc3RhbmNlT2JqZWN0RmllbGQodm1UaHJlYWQpOwotICBhc3NlcnQoamF2YVRocmVhZCAmJiAiVk1UaHJlYWQgd2l0aCBubyBKYXZhIGVxdWl2YWxlbnQiKTsKLSAKLQlKYXZhVGhyZWFkKiB0aCA9IEphdmFUaHJlYWQ6OmFzc29jaWF0ZSh2bSwgbmV3IG12bTo6TXV0YXRvclRocmVhZCh2bS0+dm1raXQpKTsKLQotICBpZiAoIXRoKSB2bS0+b3V0T2ZNZW1vcnlFcnJvcigpOwotICB0aC0+bXV0LT5zdGFydCgodm9pZCAoKikobXZtOjpUaHJlYWQqKSlzdGFydCk7Ci0gIC8vIE5vdyB0aGF0IHRoZSB0aHJlYWQgaGFzIGJlZW4gY3JlYXRlZCwgaW5pdGlhbGlzZSBpdHMgb2JqZWN0IGZpZWxkcy4KLQotCXRoLT5pbml0aWFsaXNlKGphdmFUaHJlYWQsIHZtVGhyZWFkKTsKLQotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotfQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfamF2YV9sYW5nX1ZNVGhyZWFkX2ludGVycnVwdCgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLSNlbmRpZgotSmF2YU9iamVjdCogdm10aHJlYWQpIHsKLQotICBsbHZtX2djcm9vdCh2bXRocmVhZCwgMCk7ICAKLQotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0KLSAgSm5qdm0qIHZtID0gSmF2YVRocmVhZDo6Z2V0KCktPmdldEpWTSgpOwotICBKYXZhRmllbGQqIGZpZWxkID0gdm0tPnVwY2FsbHMtPnZtZGF0YVZNVGhyZWFkOyAKLSAgCi0gIC8vIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgdGhyZWFkIHRvIGJlIGludGVycnVwdGVkIGhhcyBub3QgZmluaXNoZWQKLSAgLy8gaXRzIGluaXRpYWxpemF0aW9uLiBXYWl0IHVudGlsIHRoZSBpbml0aWFsaXphdGlvbiBpcyBkb25lLgotICB3aGlsZSAoZmllbGQtPmdldEluc3RhbmNlT2JqZWN0RmllbGQodm10aHJlYWQpID09IDApCi0gICAgbXZtOjpUaHJlYWQ6OnlpZWxkKCk7Ci0gIAotICBKYXZhVGhyZWFkKiAgdGggPSAoSmF2YVRocmVhZCopZmllbGQtPmdldEluc3RhbmNlT2JqZWN0RmllbGQodm10aHJlYWQpOwotICB0aC0+bG9ja2luZ1RocmVhZC5pbnRlcnJ1cHRGbGFnID0gMTsKLSAgbXZtOjpGYXRMb2NrKiBsb2NrID0gdGgtPmxvY2tpbmdUaHJlYWQud2FpdHNPbjsKLQotICAvLyBJZiB0aGUgdGhyZWFkIGlzIGJsb2NrZWQgb24gYSB3YWl0LiBXZSBhbHNvIHZlcmlmeSBuZXh0V2FpdGluZyBpbiBjYXNlCi0gIC8vIHRoZSB0aHJlYWQgaGFzIGJlZW4gbm90aWZpZWQuCi0gIGlmIChsb2NrICYmIHRoLT5sb2NraW5nVGhyZWFkLm5leHRXYWl0aW5nKSB7Ci0gICAgdGgtPmxvY2tpbmdUaHJlYWQuc3RhdGUgPSBtdm06OkxvY2tpbmdUaHJlYWQ6OlN0YXRlSW50ZXJydXB0ZWQ7Ci0gIAotICAgIC8vIE1ha2Ugc3VyZSB0aGUgdGhyZWFkIGlzIHdhaXRpbmcuCi0gICAgdWludDMyIGxvY2tlZCA9IDA7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIGxvY2tlZCA9IChsb2NrLT50cnlBY3F1aXJlKCkgPT0gMCk7Ci0gICAgICBpZiAobG9ja2VkIHx8IChsb2NrLT5nZXRPd25lcigpICE9IHRoLT5tdXQgJiYgbG9jay0+Z2V0T3duZXIoKSAhPSAwKSkKLSAgICAgICAgYnJlYWs7Ci0gICAgICBlbHNlIG12bTo6VGhyZWFkOjp5aWVsZCgpOwotICAgIH0KLSAgICAKLSAgICAvLyBJbnRlcnJ1cHQgdGhlIHRocmVhZC4KLSAgICB0aC0+bG9ja2luZ1RocmVhZC52YXJjb25kLnNpZ25hbCgpOwotCi0gICAgLy8gUmVsZWFzZSB0aGUgbG9jayBpZiB3ZSBhY3F1aXJlZCBpdC4KLSAgICBpZiAobG9ja2VkKSBsb2NrLT5yZWxlYXNlKGxvY2stPmdldEFzc29jaWF0ZWRPYmplY3QoKSwgdm0tPmxvY2tTeXN0ZW0pOwotICB9Ci0KLSAgLy8gSGVyZSB3ZSBjb3VsZCBhbHNvIHJhaXNlIGEgc2lnbmFsIGZvciBpbnRlcnJ1cHRpbmcgSS9PCi0gIAotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotfQotCi0vLyBOZXZlciB0aHJvd3MuCi0vLyBOZXZlciBjYWxscyBKYXZhIGNvZGUuCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBKYXZhX2phdmFfbGFuZ19WTVRocmVhZF9pbnRlcnJ1cHRlZCgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLWpjbGFzcyBjbGF6eiwKLSNlbmRpZgotKSB7Ci0gIEphdmFUaHJlYWQqIHRoID0gSmF2YVRocmVhZDo6Z2V0KCk7Ci0gIHVpbnQzMiBpbnRlcnJ1cHQgPSB0aC0+bG9ja2luZ1RocmVhZC5pbnRlcnJ1cHRGbGFnOwotICB0aC0+bG9ja2luZ1RocmVhZC5pbnRlcnJ1cHRGbGFnID0gMDsKLSAgcmV0dXJuIChqYm9vbGVhbilpbnRlcnJ1cHQ7Ci19Ci0KLS8vIE5ldmVyIHRocm93cy4KLS8vIE5ldmVyIGNhbGxzIEphdmEgY29kZS4KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfamF2YV9sYW5nX1ZNVGhyZWFkX2lzSW50ZXJydXB0ZWQoCi0jaWZkZWYgTkFUSVZFX0pOSQotSk5JRW52ICplbnYsCi0jZW5kaWYKLUphdmFPYmplY3QqIHZtdGhyZWFkKSB7Ci0gIAotICBsbHZtX2djcm9vdCh2bXRocmVhZCwgMCk7Ci0KLSAgSm5qdm0qIHZtID0gSmF2YVRocmVhZDo6Z2V0KCktPmdldEpWTSgpOwotICBKYXZhRmllbGQqIGZpZWxkID0gdm0tPnVwY2FsbHMtPnZtZGF0YVZNVGhyZWFkOwotICBKYXZhVGhyZWFkKiB0aCA9IChKYXZhVGhyZWFkKilmaWVsZC0+Z2V0SW5zdGFuY2VPYmplY3RGaWVsZCh2bXRocmVhZCk7Ci0gIHJldHVybiAoamJvb2xlYW4pdGgtPmxvY2tpbmdUaHJlYWQuaW50ZXJydXB0RmxhZzsKLX0KLQotLy8gTmV2ZXIgdGhyb3dzLgotLy8gTmV2ZXIgY2FsbHMgSmF2YSBjb2RlLgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2phdmFfbGFuZ19WTVRocmVhZF9uYXRpdmVTZXRQcmlvcml0eSgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLSNlbmRpZgotSmF2YU9iamVjdCogdm10aHJlYWQsIGppbnQgcHJpbykgewotICAvLyBDdXJyZW50bHkgbm90IGltcGxlbWVudGVkCi0gIGxsdm1fZ2Nyb290KHZtdGhyZWFkLCAwKTsKLX0KLQotLy8gTmV2ZXIgdGhyb3dzLgotLy8gTmV2ZXIgY2FsbHMgSmF2YSBjb2RlLgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2phdmFfbGFuZ19WTVRocmVhZF9uYXRpdmVTdG9wKAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotI2VuZGlmCi1KYXZhT2JqZWN0KiB2bXRocmVhZCwgSmF2YU9iamVjdCogZXhjKSB7Ci0gIC8vIEN1cnJlbnRseSBub3QgaW1wbGVtZW50ZWQKLSAgbGx2bV9nY3Jvb3Qodm10aHJlYWQsIDApOwotICBsbHZtX2djcm9vdChleGMsIDApOwotfQotCi0vLyBOZXZlciB0aHJvd3MuCi0vLyBOZXZlciBjYWxscyBKYXZhIGNvZGUuCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfamF2YV9sYW5nX1ZNVGhyZWFkX3lpZWxkKAotI2lmZGVmIE5BVElWRV9KTkkKLUpOSUVudiAqZW52LAotamNsYXNzIGNsYXp6LAotI2VuZGlmCi0pIHsKLSAgbXZtOjpUaHJlYWQ6OnlpZWxkKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9KMy9DbGFzc3BhdGgvQ2xhc3NwYXRoVk1UaHJvd2FibGUuaW5jIGIvdm1raXQvbGliL0ozL0NsYXNzcGF0aC9DbGFzc3BhdGhWTVRocm93YWJsZS5pbmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0OWQ0MmMuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL0ozL0NsYXNzcGF0aC9DbGFzc3BhdGhWTVRocm93YWJsZS5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLy89PT0tIENsYXNzcGF0aFZNQ2xhc3NMb2FkZXIuY3BwIC0gR05VIGNsYXNzcGF0aCBqYXZhL2xhbmcvVk1DbGFzc0xvYWRlciAtPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJtdm0vVk1LaXQuaCIKLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLSNpbmNsdWRlICJDbGFzc3BhdGguaCIKLSNpbmNsdWRlICJKYXZhQWNjZXNzLmgiCi0jaW5jbHVkZSAiSmF2YUFycmF5LmgiCi0jaW5jbHVkZSAiSmF2YUNsYXNzLmgiCi0jaW5jbHVkZSAiSmF2YUNvbnN0YW50UG9vbC5oIgotI2luY2x1ZGUgIkphdmFPYmplY3QuaCIKLSNpbmNsdWRlICJKYXZhU3RyaW5nLmgiCi0jaW5jbHVkZSAiSmF2YVRocmVhZC5oIgotI2luY2x1ZGUgIkphdmFVcGNhbGxzLmgiCi0jaW5jbHVkZSAiSm5qdm0uaCIKLSNpbmNsdWRlICJSZWFkZXIuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGozOwotCi1leHRlcm4gIkMiIHsKLQotSmF2YU9iamVjdCogaW50ZXJuYWxGaWxsSW5TdGFja1RyYWNlKEphdmFPYmplY3QqIHRocm93YWJsZSkgewotICAKLSAgSmF2YU9iamVjdCogdm1UaHJvd2FibGUgPSAwOwotICBBcnJheVB0ciogcmVzdWx0ID0gMDsKLSAgbGx2bV9nY3Jvb3QodGhyb3dhYmxlLCAwKTsKLSAgbGx2bV9nY3Jvb3Qodm1UaHJvd2FibGUsIDApOwotICBsbHZtX2djcm9vdChyZXN1bHQsIDApOwotCi0JbXZtOjpUaHJlYWQqIG11dCA9IG12bTo6VGhyZWFkOjpnZXQoKTsKLSAgdWludDMyIGxlbmd0aCA9IG11dC0+Z2V0RnJhbWVDb250ZXh0TGVuZ3RoKCk7Ci0KLSAgSm5qdm0qIHZtID0gSmF2YVRocmVhZDo6ajNUaHJlYWQobXV0KS0+Z2V0SlZNKCk7Ci0KLSAgaWYgKHNpemVvZih2b2lkKikgPT0gNCkgewotICAgIENsYXNzQXJyYXkqIGNsID0gdm0tPnVwY2FsbHMtPkFycmF5T2ZJbnQ7Ci0gICAgcmVzdWx0ID0gKEFycmF5UHRyKikgY2wtPmRvTmV3KGxlbmd0aCk7Ci0gIH0gZWxzZSB7Ci0gICAgQ2xhc3NBcnJheSogY2wgPSB2bS0+dXBjYWxscy0+QXJyYXlPZkxvbmc7Ci0gICAgcmVzdWx0ID0gKEFycmF5UHRyKikgY2wtPmRvTmV3KGxlbmd0aCk7Ci0gIH0KLSAgCi0gIC8vIERvbid0IGNhbGwgdGgtPmdldEZyYW1lQ29udGV4dCBiZWNhdXNlIGl0IGlzIG5vdCBHQy1zYWZlLgotICBtdm06OlN0YWNrV2Fsa2VyIFdhbGtlcihtdXQpOwotICB1aW50MzJfdCBpID0gMDsKLQotICB3aGlsZSAodm9pZCogaXAgPSAqV2Fsa2VyKSB7Ci0gICAgQXJyYXlQdHI6OnNldEVsZW1lbnQocmVzdWx0LCBpcCwgaSk7Ci0gICAgKytpOwotICAgICsrV2Fsa2VyOwotICB9Ci0KLSAgLy8gU2V0IHRoZSB0ZW1wb3J5IGRhdGEgaW4gdGhlIG5ldyBWTVRocm93YWJsZSBvYmplY3QuCi0gIHZtVGhyb3dhYmxlID0gdm0tPnVwY2FsbHMtPm5ld1ZNVGhyb3dhYmxlLT5kb05ldygpOwotICB2bS0+dXBjYWxscy0+dm1EYXRhVk1UaHJvd2FibGUtPnNldEluc3RhbmNlT2JqZWN0RmllbGQodm1UaHJvd2FibGUsIHJlc3VsdCk7Ci0gIHJldHVybiB2bVRocm93YWJsZTsKLX0KLQotSk5JRVhQT1JUIEphdmFPYmplY3QqIEpOSUNBTEwgSmF2YV9qYXZhX2xhbmdfVk1UaHJvd2FibGVfZmlsbEluU3RhY2tUcmFjZSgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLWpjbGFzcyBjbGF6eiwKLSNlbmRpZgotSmF2YU9iamVjdCogdGhyb3dhYmxlKSB7Ci0gIAotICBKYXZhT2JqZWN0KiByZXMgPSAwOwotICBsbHZtX2djcm9vdChyZXMsIDApOwotICBsbHZtX2djcm9vdCh0aHJvd2FibGUsIDApOwotCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLQotICByZXMgPSBpbnRlcm5hbEZpbGxJblN0YWNrVHJhY2UodGhyb3dhYmxlKTsKLQotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotCi0gIHJldHVybiByZXM7Ci19Ci0KLQotSmF2YU9iamVjdCogY29uc1N0YWNrRWxlbWVudChKYXZhTWV0aG9kKiBtZXRoLCB2b2lkKiBpcCkgewotCi0gIEphdmFTdHJpbmcqIG1ldGhvZE5hbWUgPSAwOwotICBKYXZhU3RyaW5nKiBjbGFzc05hbWUgPSAwOwotICBKYXZhU3RyaW5nKiBzb3VyY2VOYW1lID0gMDsKLSAgSmF2YU9iamVjdCogcmVzID0gMDsKLSAgbGx2bV9nY3Jvb3QobWV0aG9kTmFtZSwgMCk7Ci0gIGxsdm1fZ2Nyb290KGNsYXNzTmFtZSwgMCk7Ci0gIGxsdm1fZ2Nyb290KHNvdXJjZU5hbWUsIDApOwotICBsbHZtX2djcm9vdChyZXMsIDApOwotCi0gIEpuanZtKiB2bSA9IG1ldGgtPmNsYXNzRGVmLT5jbGFzc0xvYWRlci0+dm07Ci0gIG1ldGhvZE5hbWUgPSB2bS0+aW50ZXJuYWxVVEY4VG9TdHIobWV0aC0+bmFtZSk7Ci0gIENsYXNzKiBjbCA9IG1ldGgtPmNsYXNzRGVmOwotICBjbGFzc05hbWUgPSBKYXZhU3RyaW5nOjppbnRlcm5hbFRvSmF2YShjbC0+bmFtZSwgdm0pOwotICAKLSAgQXR0cmlidXQqIHNvdXJjZUF0dCA9IGNsLT5sb29rdXBBdHRyaWJ1dChBdHRyaWJ1dDo6c291cmNlRmlsZUF0dHJpYnV0KTsKLSAgCi0gIC8vIFdlIGRvbid0IGhhdmUgdGhlIGJ5dGVzIGlmIHRoZSBjbGFzcyB3YXMgdm1qYydlZC4KLSAgaWYgKHNvdXJjZUF0dCAmJiBjbC0+Z2V0Qnl0ZXMoKSkgewotICAgIFJlYWRlciByZWFkZXIoc291cmNlQXR0LCBjbC0+Ynl0ZXMpOwotICAgIHVpbnQxNiBpbmRleCA9IHJlYWRlci5yZWFkVTIoKTsKLSAgICBzb3VyY2VOYW1lID0gdm0tPmludGVybmFsVVRGOFRvU3RyKGNsLT5nZXRDb25zdGFudFBvb2woKS0+VVRGOEF0KGluZGV4KSk7Ci0gIH0KLQotICBib29sIG5hdGl2ZSA9IGlzTmF0aXZlKG1ldGgtPmFjY2Vzcyk7Ci0gIHVpbnQxNiBsaW5lTnVtYmVyID0gbWV0aC0+bG9va3VwTGluZU51bWJlcihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oaXApKTsKLQotICBVc2VyQ2xhc3MqIG5ld1MgPSB2bS0+dXBjYWxscy0+bmV3U3RhY2tUcmFjZUVsZW1lbnQ7Ci0gIHJlcyA9IG5ld1MtPmRvTmV3KCk7Ci0gIHZtLT51cGNhbGxzLT5pbml0U3RhY2tUcmFjZUVsZW1lbnQtPmludm9rZUludFNwZWNpYWwobmV3UywgcmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb3VyY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWV0aG9kTmFtZSwgbmF0aXZlKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotSk5JRVhQT1JUIEphdmFPYmplY3QqIEpOSUNBTEwgSmF2YV9qYXZhX2xhbmdfVk1UaHJvd2FibGVfZ2V0U3RhY2tUcmFjZSgKLSNpZmRlZiBOQVRJVkVfSk5JCi1KTklFbnYgKmVudiwKLSNlbmRpZgotSmF2YU9iamVjdCogdm10aHJvdywgSmF2YU9iamVjdCogdGhyb3dhYmxlKSB7Ci0KLSAgQXJyYXlPYmplY3QqIHJlc3VsdCA9IE5VTEw7Ci0gIEphdmFPYmplY3QqIHN0YWNrID0gTlVMTDsKLSAgbGx2bV9nY3Jvb3Qodm10aHJvdywgMCk7Ci0gIGxsdm1fZ2Nyb290KHRocm93YWJsZSwgMCk7Ci0gIGxsdm1fZ2Nyb290KHJlc3VsdCwgMCk7Ci0gIGxsdm1fZ2Nyb290KHN0YWNrLCAwKTsKLQotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0KLSAgSm5qdm0qICAgICAgdm0gPSBKYXZhVGhyZWFkOjpnZXQoKS0+Z2V0SlZNKCk7Ci0JbXZtOjpWTUtpdCogdm1raXQgPSB2bS0+dm1raXQ7Ci0gIEphdmFGaWVsZCogIGZpZWxkID0gdm0tPnVwY2FsbHMtPnZtRGF0YVZNVGhyb3dhYmxlOwotCi0gIHN0YWNrID0gZmllbGQtPmdldEluc3RhbmNlT2JqZWN0RmllbGQodm10aHJvdyk7Ci0gIAotICAvLyByZW1vdmUgdGhlIFZNVGhyb3dhYmxlLmZpbGxJblN0YWNrVHJhY2UgbWV0aG9kIGFuZCB0aGUgbGFzdCBtZXRob2QKLSAgLy8gb24gdGhlIHN0YWNrLgotICBzaW50MzIgaW5kZXggPSAyOzsKLSAgd2hpbGUgKGluZGV4ICE9IEphdmFBcnJheTo6Z2V0U2l6ZShzdGFjaykpIHsKLSAgICBtdm06Ok1ldGhvZEluZm8qIE1JID0gdm1raXQtPklQVG9NZXRob2RJbmZvKEFycmF5UHRyOjpnZXRFbGVtZW50KChBcnJheVB0ciopc3RhY2ssIGluZGV4KSk7Ci0gICAgaWYgKCFNSS0+aXNIaWdoTGV2ZWxNZXRob2QoKSkgKytpbmRleDsKLSAgICBlbHNlIHsKLSAgICAgIEphdmFNZXRob2QqIG1ldGggPSAoSmF2YU1ldGhvZCopTUktPk1ldGFJbmZvOwotICAgICAgYXNzZXJ0KG1ldGggJiYgIldyb25nIHN0YWNrIHRyYWNlIik7Ci0gICAgICBpZiAobWV0aC0+Y2xhc3NEZWYtPmlzQXNzaWduYWJsZUZyb20odm0tPnVwY2FsbHMtPm5ld1Rocm93YWJsZSkpIHsKLSAgICAgICAgKytpbmRleDsKLSAgICAgIH0gZWxzZSBicmVhazsKLSAgICB9Ci0gIH0KLSAgCi0gIHNpbnQzMiBzaXplID0gMDsKLSAgc2ludDMyIGN1ciA9IGluZGV4OwotICB3aGlsZSAoY3VyIDwgSmF2YUFycmF5OjpnZXRTaXplKHN0YWNrKSkgewotICAgIG12bTo6TWV0aG9kSW5mbyogTUkgPSB2bWtpdC0+SVBUb01ldGhvZEluZm8oQXJyYXlQdHI6OmdldEVsZW1lbnQoKEFycmF5UHRyKilzdGFjaywgY3VyKSk7Ci0gICAgKytjdXI7Ci0gICAgaWYgKE1JLT5pc0hpZ2hMZXZlbE1ldGhvZCgpKSArK3NpemU7Ci0gIH0KLQotICByZXN1bHQgPSAoQXJyYXlPYmplY3QqKQotICAgIHZtLT51cGNhbGxzLT5zdGFja1RyYWNlQXJyYXktPmRvTmV3KHNpemUpOwotICAKLSAgY3VyID0gMDsKLSAgZm9yIChzaW50MzIgaSA9IGluZGV4OyBpIDwgSmF2YUFycmF5OjpnZXRTaXplKHN0YWNrKTsgKytpKSB7Ci0gICAgbXZtOjpNZXRob2RJbmZvKiBNSSA9IHZta2l0LT5JUFRvTWV0aG9kSW5mbyhBcnJheVB0cjo6Z2V0RWxlbWVudCgoQXJyYXlQdHIqKXN0YWNrLCBpKSk7Ci0gICAgaWYgKE1JLT5pc0hpZ2hMZXZlbE1ldGhvZCgpKSB7Ci0gICAgICBKYXZhTWV0aG9kKiBtZXRoID0gKEphdmFNZXRob2QqKU1JLT5NZXRhSW5mbzsKLSAgICAgIEFycmF5T2JqZWN0OjpzZXRFbGVtZW50KHJlc3VsdCwgY29uc1N0YWNrRWxlbWVudChtZXRoLCBBcnJheVB0cjo6Z2V0RWxlbWVudCgoQXJyYXlQdHIqKXN0YWNrLCBpKSksIGN1cik7Ci0gICAgICBjdXIrKzsKLSAgICB9Ci0gIH0KLSAgCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL0ozL0NsYXNzcGF0aC9KYXZhVXBjYWxscy5jcHAgYi92bWtpdC9saWIvSjMvQ2xhc3NwYXRoL0phdmFVcGNhbGxzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIyM2NjNS4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvSjMvQ2xhc3NwYXRoL0phdmFVcGNhbGxzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwNDQgKzAsMCBAQAotLy89PT0tLS0tLS0tLSBKYXZhVXBjYWxscy5jcHAgLSBVcGNhbGxzIHRvIEphdmEgZW50aXRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJDbGFzc3BhdGhSZWZsZWN0LmgiCi0jaW5jbHVkZSAiSmF2YUFjY2Vzcy5oIgotI2luY2x1ZGUgIkphdmFDbGFzcy5oIgotI2luY2x1ZGUgIkphdmFPYmplY3QuaCIKLSNpbmNsdWRlICJKYXZhU3RyaW5nLmgiCi0jaW5jbHVkZSAiSmF2YVRocmVhZC5oIgotI2luY2x1ZGUgIkphdmFVcGNhbGxzLmgiCi0jaW5jbHVkZSAiSm5qdm0uaCIKLSNpbmNsdWRlICJtdm0vU3lzdGVtVGhyZWFkcy5oIgotI2luY2x1ZGUgIm12bS9WTUtpdC5oIgotI2luY2x1ZGUgImozL0phdmFDb21waWxlci5oIgotI2luY2x1ZGUgIkphdmFUeXBlcy5oIgotCi0vLyBmb3IgZGxvcGVuIGFuZCBkbHN5bQotI2luY2x1ZGUgPGRsZmNuLmg+IAotCi11c2luZyBuYW1lc3BhY2UgajM7Ci0KLXR5cGVkZWYgdm9pZCAoKnN0YXRpY19pbml0X3QpKEpuanZtQ2xhc3NMb2FkZXIqKTsKLQotY29uc3QgVVRGOCogSmF2YUNvbXBpbGVyOjpJbmxpbmVQcmFnbWEgPSAwOwotY29uc3QgVVRGOCogSmF2YUNvbXBpbGVyOjpOb0lubGluZVByYWdtYSA9IDA7Ci0KLSNkZWZpbmUgQ09NUElMRV9NRVRIT0RTKGNsKSBcCi0gIGZvciAoQ29tbW9uQ2xhc3M6Om1ldGhvZF9pdGVyYXRvciBpID0gY2wtPnZpcnR1YWxNZXRob2RzLmJlZ2luKCksIFwKLSAgICAgICAgICAgIGUgPSBjbC0+dmlydHVhbE1ldGhvZHMuZW5kKCk7IGkhPSBlOyArK2kpIHsgXAotICAgIGktPnNlY29uZC0+Y29tcGlsZWRQdHIoKTsgXAotICB9IFwKLSAgXAotICBmb3IgKENvbW1vbkNsYXNzOjptZXRob2RfaXRlcmF0b3IgaSA9IGNsLT5zdGF0aWNNZXRob2RzLmJlZ2luKCksIFwKLSAgICAgICAgICAgIGUgPSBjbC0+c3RhdGljTWV0aG9kcy5lbmQoKTsgaSE9IGU7ICsraSkgeyBcCi0gICAgaS0+c2Vjb25kLT5jb21waWxlZFB0cigpOyBcCi0gIH0KLQotdm9pZCBDbGFzc3BhdGg6OkNyZWF0ZUphdmFUaHJlYWQoSm5qdm0qIHZtLCBKYXZhVGhyZWFkKiBteXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGhOYW1lLCBKYXZhT2JqZWN0KiBHcm91cCkgewotICBKYXZhT2JqZWN0Vk1UaHJlYWQqIHZtdGggPSBOVUxMOwotICBKYXZhT2JqZWN0KiB0aCA9IE5VTEw7Ci0gIEphdmFPYmplY3QqIG5hbWUgPSBOVUxMOwotICBsbHZtX2djcm9vdChHcm91cCwgMCk7Ci0gIGxsdm1fZ2Nyb290KHZtdGgsIDApOwotICBsbHZtX2djcm9vdCh0aCwgMCk7Ci0gIGxsdm1fZ2Nyb290KG5hbWUsIDApOwotCi0gIHRoID0gbmV3VGhyZWFkLT5kb05ldygpOwotICBteXRoLT5qYXZhVGhyZWFkID0gdGg7Ci0gIHZtdGggPSAoSmF2YU9iamVjdFZNVGhyZWFkKiluZXdWTVRocmVhZC0+ZG9OZXcoKTsKLSAgbmFtZSA9IHZtLT5hc2NpaXpUb1N0cih0aE5hbWUpOwotICAKLSAgdGhyZWFkTmFtZS0+c2V0SW5zdGFuY2VPYmplY3RGaWVsZCh0aCwgbmFtZSk7Ci0gIHByaW9yaXR5LT5zZXRJbnN0YW5jZUludDMyRmllbGQodGgsICh1aW50MzIpMSk7Ci0gIGRhZW1vbi0+c2V0SW5zdGFuY2VJbnQ4RmllbGQodGgsICh1aW50MzIpMCk7Ci0gIHZtVGhyZWFkLT5zZXRJbnN0YW5jZU9iamVjdEZpZWxkKHRoLCB2bXRoKTsKLSAgYXNzb2NUaHJlYWQtPnNldEluc3RhbmNlT2JqZWN0RmllbGQodm10aCwgdGgpOwotICBydW5uaW5nLT5zZXRJbnN0YW5jZUludDhGaWVsZCh2bXRoLCAodWludDMyKTEpOwotICBKYXZhT2JqZWN0Vk1UaHJlYWQ6OnNldFZtZGF0YSh2bXRoLCBteXRoKTsKLSAgCi0gIGdyb3VwLT5zZXRJbnN0YW5jZU9iamVjdEZpZWxkKHRoLCBHcm91cCk7Ci0gIGdyb3VwQWRkVGhyZWFkLT5pbnZva2VJbnRTcGVjaWFsKHRocmVhZEdyb3VwLCBHcm91cCwgJnRoKTsKLSAgCi0gIGZpbmFsaXNlQ3JlYXRlSW5pdGlhbFRocmVhZC0+aW52b2tlSW50U3RhdGljKGluaGVyaXRhYmxlVGhyZWFkTG9jYWwsICZ0aCk7Ci19Ci0KLQotdm9pZCBDbGFzc3BhdGg6OkNyZWF0ZUZvcmVpZ25KYXZhVGhyZWFkKEpuanZtKiB2bSwgSmF2YVRocmVhZCogbXl0aCkgewotICBKYXZhT2JqZWN0KiBSRyA9IDA7Ci0gIGxsdm1fZ2Nyb290KFJHLCAwKTsKLQotICBSRyA9IHJvb3RHcm91cC0+Z2V0U3RhdGljT2JqZWN0RmllbGQoKTsgICAgICAgICAgIC8vIHNob3VsZCBiZSBzeXN0ZW0gZ3JvdXAgb3IgYSBzcGVjaWFsIGdyb3VwIGZvciBmb3JlaWduIHRocmVhZHMKLSAgQ3JlYXRlSmF2YVRocmVhZCh2bSwgbXl0aCwgImZvcmVpZ24gdGhyZWFkIiwgUkcpOwotfQotICAKLQotdm9pZCBDbGFzc3BhdGg6OkluaXRpYWxpemVUaHJlYWRpbmcoSm5qdm0qIHZtKSB7Ci0KLSAgSmF2YU9iamVjdCogUkcgPSAwOwotICBKYXZhT2JqZWN0KiBTeXN0ZW1Hcm91cCA9IDA7Ci0gIEphdmFPYmplY3QqIHN5c3RlbU5hbWUgPSAwOwotICBsbHZtX2djcm9vdChSRywgMCk7Ci0gIGxsdm1fZ2Nyb290KFN5c3RlbUdyb3VwLCAwKTsKLSAgbGx2bV9nY3Jvb3Qoc3lzdGVtTmFtZSwgMCk7Ci0KLSAgLy8gUmVzb2x2ZSBhbmQgaW5pdGlhbGl6ZSBjbGFzc2VzIGZpcnN0LgotICBuZXdUaHJlYWQtPnJlc29sdmVDbGFzcygpOwotICBuZXdUaHJlYWQtPmluaXRpYWxpc2VDbGFzcygpOwotICAKLSAgbmV3Vk1UaHJlYWQtPnJlc29sdmVDbGFzcygpOwotICBuZXdWTVRocmVhZC0+aW5pdGlhbGlzZUNsYXNzKCk7Ci0gIAotICB0aHJlYWRHcm91cC0+cmVzb2x2ZUNsYXNzKCk7Ci0gIHRocmVhZEdyb3VwLT5pbml0aWFsaXNlQ2xhc3MoKTsKLQotICAvLyBDcmVhdGUgdGhlIG1haW4gdGhyZWFkCi0gIFJHID0gcm9vdEdyb3VwLT5nZXRTdGF0aWNPYmplY3RGaWVsZCgpOwotICBhc3NlcnQoUkcgJiYgIk5vIHJvb3QgZ3JvdXAiKTsKLSAgYXNzZXJ0KHZtLT5nZXRNYWluVGhyZWFkKCkgJiYgIlZNIGRpZCBub3Qgc2V0IGl0cyBtYWluIHRocmVhZCIpOwotICBDcmVhdGVKYXZhVGhyZWFkKHZtLCBKYXZhVGhyZWFkOjpnZXQoKSwgIm1haW4iLCBSRyk7Ci0KLSAgLy8gQ3JlYXRlIHRoZSAic3lzdGVtIiBncm91cC4KLSAgU3lzdGVtR3JvdXAgPSB0aHJlYWRHcm91cC0+ZG9OZXcoKTsKLSAgaW5pdEdyb3VwLT5pbnZva2VJbnRTcGVjaWFsKHRocmVhZEdyb3VwLCBTeXN0ZW1Hcm91cCk7Ci0gIHN5c3RlbU5hbWUgPSB2bS0+YXNjaWl6VG9TdHIoInN5c3RlbSIpOwotICBncm91cE5hbWUtPnNldEluc3RhbmNlT2JqZWN0RmllbGQoU3lzdGVtR3JvdXAsIHN5c3RlbU5hbWUpOwotfQotCi1leHRlcm4gIkMiIHZvaWQgSmF2YV9qYXZhX2xhbmdfcmVmX1dlYWtSZWZlcmVuY2VfXzAwMDNDaW5pdF8wMDAzRV9fTGphdmFfbGFuZ19PYmplY3RfMigKLSAgICBKYXZhT2JqZWN0UmVmZXJlbmNlKiByZWZlcmVuY2UsIEphdmFPYmplY3QqIHJlZmVyZW50KSB7Ci0gIGxsdm1fZ2Nyb290KHJlZmVyZW5jZSwgMCk7Ci0gIGxsdm1fZ2Nyb290KHJlZmVyZW50LCAwKTsKLQotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0gIAotICBKYXZhT2JqZWN0UmVmZXJlbmNlOjppbml0KHJlZmVyZW5jZSwgcmVmZXJlbnQsIDApOwotICBtdm06OlRocmVhZDo6Z2V0KCktPnZta2l0LT5hZGRXZWFrUmVmZXJlbmNlKHJlZmVyZW5jZSk7Ci0KLSAgRU5EX05BVElWRV9FWENFUFRJT04KLQotfQotCi1leHRlcm4gIkMiIHZvaWQgSmF2YV9qYXZhX2xhbmdfcmVmX1dlYWtSZWZlcmVuY2VfXzAwMDNDaW5pdF8wMDAzRV9fTGphdmFfbGFuZ19PYmplY3RfMkxqYXZhX2xhbmdfcmVmX1JlZmVyZW5jZVF1ZXVlXzIoCi0gICAgSmF2YU9iamVjdFJlZmVyZW5jZSogcmVmZXJlbmNlLAotICAgIEphdmFPYmplY3QqIHJlZmVyZW50LAotICAgIEphdmFPYmplY3QqIHF1ZXVlKSB7Ci0gIGxsdm1fZ2Nyb290KHJlZmVyZW5jZSwgMCk7Ci0gIGxsdm1fZ2Nyb290KHJlZmVyZW50LCAwKTsKLSAgbGx2bV9nY3Jvb3QocXVldWUsIDApOwotICAKLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotICAKLSAgSmF2YU9iamVjdFJlZmVyZW5jZTo6aW5pdChyZWZlcmVuY2UsIHJlZmVyZW50LCBxdWV1ZSk7Ci0gIG12bTo6VGhyZWFkOjpnZXQoKS0+dm1raXQtPmFkZFdlYWtSZWZlcmVuY2UocmVmZXJlbmNlKTsKLSAgCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLX0KLQotZXh0ZXJuICJDIiB2b2lkIEphdmFfamF2YV9sYW5nX3JlZl9Tb2Z0UmVmZXJlbmNlX18wMDAzQ2luaXRfMDAwM0VfX0xqYXZhX2xhbmdfT2JqZWN0XzIoCi0gICAgSmF2YU9iamVjdFJlZmVyZW5jZSogcmVmZXJlbmNlLCBKYXZhT2JqZWN0KiByZWZlcmVudCkgewotICBsbHZtX2djcm9vdChyZWZlcmVuY2UsIDApOwotICBsbHZtX2djcm9vdChyZWZlcmVudCwgMCk7Ci0gIAotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0gIAotICBKYXZhT2JqZWN0UmVmZXJlbmNlOjppbml0KHJlZmVyZW5jZSwgcmVmZXJlbnQsIDApOwotICBtdm06OlRocmVhZDo6Z2V0KCktPnZta2l0LT5hZGRTb2Z0UmVmZXJlbmNlKHJlZmVyZW5jZSk7Ci0gIAotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotCi19Ci0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX2phdmFfbGFuZ19yZWZfU29mdFJlZmVyZW5jZV9fMDAwM0Npbml0XzAwMDNFX19MamF2YV9sYW5nX09iamVjdF8yTGphdmFfbGFuZ19yZWZfUmVmZXJlbmNlUXVldWVfMigKLSAgICBKYXZhT2JqZWN0UmVmZXJlbmNlKiByZWZlcmVuY2UsCi0gICAgSmF2YU9iamVjdCogcmVmZXJlbnQsCi0gICAgSmF2YU9iamVjdCogcXVldWUpIHsKLSAgbGx2bV9nY3Jvb3QocmVmZXJlbmNlLCAwKTsKLSAgbGx2bV9nY3Jvb3QocmVmZXJlbnQsIDApOwotICBsbHZtX2djcm9vdChxdWV1ZSwgMCk7Ci0gCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLQotICBKYXZhT2JqZWN0UmVmZXJlbmNlOjppbml0KHJlZmVyZW5jZSwgcmVmZXJlbnQsIHF1ZXVlKTsKLSAgbXZtOjpUaHJlYWQ6OmdldCgpLT52bWtpdC0+YWRkU29mdFJlZmVyZW5jZShyZWZlcmVuY2UpOwotICAKLSAgRU5EX05BVElWRV9FWENFUFRJT04KLQotfQotCi1leHRlcm4gIkMiIHZvaWQgSmF2YV9qYXZhX2xhbmdfcmVmX1BoYW50b21SZWZlcmVuY2VfXzAwMDNDaW5pdF8wMDAzRV9fTGphdmFfbGFuZ19PYmplY3RfMkxqYXZhX2xhbmdfcmVmX1JlZmVyZW5jZVF1ZXVlXzIoCi0gICAgSmF2YU9iamVjdFJlZmVyZW5jZSogcmVmZXJlbmNlLAotICAgIEphdmFPYmplY3QqIHJlZmVyZW50LAotICAgIEphdmFPYmplY3QqIHF1ZXVlKSB7Ci0gIGxsdm1fZ2Nyb290KHJlZmVyZW5jZSwgMCk7Ci0gIGxsdm1fZ2Nyb290KHJlZmVyZW50LCAwKTsKLSAgbGx2bV9nY3Jvb3QocXVldWUsIDApOwotICAKLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotICAKLSAgSmF2YU9iamVjdFJlZmVyZW5jZTo6aW5pdChyZWZlcmVuY2UsIHJlZmVyZW50LCBxdWV1ZSk7Ci0gIG12bTo6VGhyZWFkOjpnZXQoKS0+dm1raXQtPmFkZFBoYW50b21SZWZlcmVuY2UocmVmZXJlbmNlKTsKLQotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotfQotCi1leHRlcm4gIkMiIEphdmFTdHJpbmcqIEphdmFfamF2YV9sYW5nX1ZNU3RyaW5nX2ludGVybl9fTGphdmFfbGFuZ19TdHJpbmdfMigKLSAgICBKYXZhU3RyaW5nKiBvYmopIHsKLSAgY29uc3QgQXJyYXlVSW50MTYqIGFycmF5ID0gMDsKLSAgSmF2YVN0cmluZyogcmVzID0gMDsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgbGx2bV9nY3Jvb3QoYXJyYXksIDApOwotICBsbHZtX2djcm9vdChyZXMsIDApOwotICAvLyBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgaW50ZXJuZWQsIGp1c3QgcmV0dXJuLgotICBpZiAob2JqLT5nZXRWaXJ0dWFsVGFibGUoKSA9PSBKYXZhU3RyaW5nOjppbnRlcm5TdHJpbmdWVCkgcmV0dXJuIG9iajsKLSAgCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLSAgCi0gIEpuanZtKiB2bSA9IG9iai0+Z2V0SlZNKCk7Ci0gIGFycmF5ID0gSmF2YVN0cmluZzo6c3RyVG9BcnJheShvYmosIHZtKTsKLSAgcmVzID0gdm0tPmNvbnN0cnVjdFN0cmluZyhhcnJheSk7Ci0gIAotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotCi0gIHJldHVybiByZXM7Ci19Ci0KLWV4dGVybiAiQyIgdWludDggSmF2YV9qYXZhX2xhbmdfQ2xhc3NfaXNBcnJheV9fKEphdmFPYmplY3RDbGFzcyoga2xhc3MpIHsKLSAgbGx2bV9nY3Jvb3Qoa2xhc3MsIDApOwotICBVc2VyQ29tbW9uQ2xhc3MqIGNsID0gMDsKLQotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0KLSAgY2wgPSBKYXZhT2JqZWN0Q2xhc3M6OmdldENsYXNzKGtsYXNzKTsKLSAgCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0gIAotICByZXR1cm4gKHVpbnQ4KWNsLT5pc0FycmF5KCk7Ci19Ci0KLWV4dGVybiAiQyIgSmF2YU9iamVjdCogSmF2YV9nbnVfY2xhc3NwYXRoX1ZNU3RhY2tXYWxrZXJfZ2V0Q2FsbGluZ0NsYXNzX18oKSB7Ci0gIAotICBKYXZhT2JqZWN0KiByZXMgPSAwOwotICBsbHZtX2djcm9vdChyZXMsIDApOwotCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLQotICBKYXZhVGhyZWFkKiB0aCA9IEphdmFUaHJlYWQ6OmdldCgpOwotICBVc2VyQ2xhc3MqIGNsID0gdGgtPmdldENhbGxpbmdDbGFzc0xldmVsKDIpOwotICBpZiAoY2wgIT0gTlVMTCkgcmVzID0gY2wtPmdldENsYXNzRGVsZWdhdGVlKCk7Ci0gIAotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotCi0gIHJldHVybiByZXM7Ci19Ci0KLWV4dGVybiAiQyIgSmF2YU9iamVjdCogSmF2YV9nbnVfY2xhc3NwYXRoX1ZNU3RhY2tXYWxrZXJfZ2V0Q2FsbGluZ0NsYXNzTG9hZGVyX18oKSB7Ci0gIAotICBKYXZhT2JqZWN0KiByZXMgPSAwOwotICBsbHZtX2djcm9vdChyZXMsIDApOwotICAKLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotICAKLSAgSmF2YVRocmVhZCogdGggPSBKYXZhVGhyZWFkOjpnZXQoKTsKLSAgVXNlckNsYXNzKiBjbCA9IHRoLT5nZXRDYWxsaW5nQ2xhc3NMZXZlbCgyKTsKLSAgcmVzID0gY2wtPmNsYXNzTG9hZGVyLT5nZXRKYXZhQ2xhc3NMb2FkZXIoKTsgIAotICAKLSAgRU5EX05BVElWRV9FWENFUFRJT04KLQotICByZXR1cm4gcmVzOwotfQotCi1leHRlcm4gIkMiIEphdmFPYmplY3QqIEphdmFfZ251X2NsYXNzcGF0aF9WTVN0YWNrV2Fsa2VyX2ZpcnN0Tm9uTnVsbENsYXNzTG9hZGVyX18oKSB7Ci0gIEphdmFPYmplY3QqIHJlcyA9IDA7Ci0gIGxsdm1fZ2Nyb290KHJlcywgMCk7Ci0gIAotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0gIAotICBKYXZhVGhyZWFkKiB0aCA9IEphdmFUaHJlYWQ6OmdldCgpOwotICByZXMgPSB0aC0+Z2V0Tm9uTnVsbENsYXNzTG9hZGVyKCk7Ci0gIAotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotCi0gIHJldHVybiByZXM7Ci19Ci0KLWV4dGVybiAiQyIgSmF2YU9iamVjdCogSmF2YV9zdW5fcmVmbGVjdF9SZWZsZWN0aW9uX2dldENhbGxlckNsYXNzX19JKHVpbnQzMiBpbmRleCkgewotICAKLSAgSmF2YU9iamVjdCogcmVzID0gMDsKLSAgbGx2bV9nY3Jvb3QocmVzLCAwKTsKLSAgCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMCkKLSAgCi0gIEphdmFUaHJlYWQqIHRoID0gSmF2YVRocmVhZDo6Z2V0KCk7Ci0gIFVzZXJDbGFzcyogY2wgPSB0aC0+Z2V0Q2FsbGluZ0NsYXNzTGV2ZWwoaW5kZXgpOwotICBpZiAoY2wpIHJlcyA9IGNsLT5nZXRDbGFzc0RlbGVnYXRlZSgpOwotICAKLSAgRU5EX05BVElWRV9FWENFUFRJT04KLQotICByZXR1cm4gcmVzOwotfQotCi1leHRlcm4gIkMiIEphdmFPYmplY3QqIEphdmFfamF2YV9sYW5nX3JlZmxlY3RfQWNjZXNzaWJsZU9iamVjdF9nZXRBbm5vdGF0aW9uX19MamF2YV9sYW5nX0NsYXNzXzIoCi0gICAgSmF2YU9iamVjdCogb2JqKSB7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gIHJldHVybiAwOwotfQotCi1leHRlcm4gIkMiIEphdmFPYmplY3QqIEphdmFfamF2YV9sYW5nX3JlZmxlY3RfQWNjZXNzaWJsZU9iamVjdF9nZXREZWNsYXJlZEFubm90YXRpb25zX18oKSB7Ci0gIEphdmFPYmplY3QqIHJlcyA9IDA7Ci0gIGxsdm1fZ2Nyb290KHJlcywgMCk7Ci0gIAotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDApCi0gIAotICBKbmp2bSogdm0gPSBKYXZhVGhyZWFkOjpnZXQoKS0+Z2V0SlZNKCk7Ci0gIFVzZXJDbGFzc0FycmF5KiBhcnJheSA9IHZtLT51cGNhbGxzLT5jb25zdHJ1Y3RvckFycmF5QW5ub3RhdGlvbjsKLSAgcmVzID0gYXJyYXktPmRvTmV3KDApOwotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLSAgcmV0dXJuIHJlczsKLX0KLQotZXh0ZXJuICJDIiB2b2lkIG5hdGl2ZUphdmFPYmplY3RDbGFzc1RyYWNlcigKLSAgICBKYXZhT2JqZWN0Q2xhc3MqIG9iaiwgdWludHB0cl90IGNsb3N1cmUpIHsKLSAgSmF2YU9iamVjdENsYXNzOjpzdGF0aWNUcmFjZXIob2JqLCBjbG9zdXJlKTsKLX0KLQotZXh0ZXJuICJDIiB2b2lkIG5hdGl2ZUphdmFPYmplY3RGaWVsZFRyYWNlcigKLSAgICBKYXZhT2JqZWN0RmllbGQqIG9iaiwgdWludHB0cl90IGNsb3N1cmUpIHsKLSAgSmF2YU9iamVjdEZpZWxkOjpzdGF0aWNUcmFjZXIob2JqLCBjbG9zdXJlKTsKLX0KLQotZXh0ZXJuICJDIiB2b2lkIG5hdGl2ZUphdmFPYmplY3RNZXRob2RUcmFjZXIoCi0gICAgSmF2YU9iamVjdE1ldGhvZCogb2JqLCB1aW50cHRyX3QgY2xvc3VyZSkgewotICBKYXZhT2JqZWN0TWV0aG9kOjpzdGF0aWNUcmFjZXIob2JqLCBjbG9zdXJlKTsKLX0KLQotZXh0ZXJuICJDIiB2b2lkIG5hdGl2ZUphdmFPYmplY3RDb25zdHJ1Y3RvclRyYWNlcigKLSAgICBKYXZhT2JqZWN0Q29uc3RydWN0b3IqIG9iaiwgdWludHB0cl90IGNsb3N1cmUpIHsKLSAgSmF2YU9iamVjdENvbnN0cnVjdG9yOjpzdGF0aWNUcmFjZXIob2JqLCBjbG9zdXJlKTsKLX0KLQotZXh0ZXJuICJDIiB2b2lkIG5hdGl2ZUphdmFPYmplY3RWTVRocmVhZFRyYWNlcigKLSAgICBKYXZhT2JqZWN0Vk1UaHJlYWQqIG9iaiwgdWludHB0cl90IGNsb3N1cmUpIHsKLSAgSmF2YU9iamVjdFZNVGhyZWFkOjpzdGF0aWNUcmFjZXIob2JqLCBjbG9zdXJlKTsKLX0KLQotZXh0ZXJuICJDIiB2b2lkIG5hdGl2ZUphdmFPYmplY3RWTVRocmVhZERlc3RydWN0b3IoSmF2YU9iamVjdFZNVGhyZWFkKiBvYmopIHsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgSmF2YU9iamVjdFZNVGhyZWFkOjpzdGF0aWNEZXN0cnVjdG9yKG9iaik7Ci19Ci0KLWV4dGVybiAiQyIgSmF2YVN0cmluZyogSmF2YV9qYXZhX2xhbmdfVk1TeXN0ZW1fZ2V0ZW52X19MamF2YV9sYW5nX1N0cmluZ18yKEphdmFTdHJpbmcqIHN0cikgewotICBKYXZhU3RyaW5nKiByZXQgPSAwOwotICBsbHZtX2djcm9vdChzdHIsIDApOwotICBsbHZtX2djcm9vdChyZXQsIDApOwotICAKLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigwKQotCi0gIG12bTo6VGhyZWFkQWxsb2NhdG9yIGFsbG9jYXRvcjsKLSAgY2hhciogYnVmID0gSmF2YVN0cmluZzo6c3RyVG9Bc2NpaXooc3RyLCAmYWxsb2NhdG9yKTsKLSAgY2hhciogcmVzID0gZ2V0ZW52KGJ1Zik7Ci0gIGlmIChyZXMpIHsKLSAgICBKbmp2bSogdm0gPSBKYXZhVGhyZWFkOjpnZXQoKS0+Z2V0SlZNKCk7Ci0gICAgcmV0ID0gdm0tPmFzY2lpelRvU3RyKHJlcyk7Ci0gIH0KLSAgCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLSAgcmV0dXJuIHJldDsKLX0KLQotCi1DbGFzc3BhdGg6OkNsYXNzcGF0aChKbmp2bUJvb3RzdHJhcExvYWRlciogbG9hZGVyLCBib29sIGRsTG9hZCkgewotICAgCi0gIC8vIFRyeSB0byBmaW5kIGlmIHdlIGhhdmUgYSBwcmUtY29tcGlsZWQgcnQuamFyCi0gIGlmIChkbExvYWQpIHsKLSAgICBTdXBlckFycmF5ID0gKENsYXNzKilkbHN5bShTRUxGX0hBTkRMRSwgImphdmFfbGFuZ19PYmplY3QiKTsKLSAgICBpZiAoIVN1cGVyQXJyYXkpIHsKLSAgICAgIGxvYWRlci0+bmF0aXZlSGFuZGxlID0gZGxvcGVuKCJsaWJ2bWpjIkRZTERfRVhURU5TSU9OLCBSVExEX0xBWlkgfCBSVExEX0dMT0JBTCk7Ci0gICAgICBpZiAobG9hZGVyLT5uYXRpdmVIYW5kbGUpIHsKLSAgICAgICAgLy8gRm91bmQgaXQhCi0gICAgICAgIFN1cGVyQXJyYXkgPSAoQ2xhc3MqKWRsc3ltKGxvYWRlci0+bmF0aXZlSGFuZGxlLCAiamF2YV9sYW5nX09iamVjdCIpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoU3VwZXJBcnJheSkgewotICAgICAgYXNzZXJ0KFRoZUNvbXBpbGVyICYmIAotCQkJCQkgICAiTG9hZGluZyBsaWJ2bWpjIkRZTERfRVhURU5TSU9OIiByZXF1aXJlcyBhIGNvbXBpbGVyIik7Ci0JCQlDbGFzc0FycmF5OjpTdXBlckFycmF5ID0gKENsYXNzKilTdXBlckFycmF5LT5nZXRJbnRlcm5hbCgpOwotICAgICAgCi0gICAgICAvLyBHZXQgdGhlIG5hdGl2ZSBjbGFzc2VzLgotICAgICAgT2ZWb2lkID0gKENsYXNzUHJpbWl0aXZlKilkbHN5bShsb2FkZXItPm5hdGl2ZUhhbmRsZSwgInZvaWQiKTsKLSAgICAgIE9mQm9vbCA9IChDbGFzc1ByaW1pdGl2ZSopZGxzeW0obG9hZGVyLT5uYXRpdmVIYW5kbGUsICJib29sZWFuIik7Ci0gICAgICBPZkJ5dGUgPSAoQ2xhc3NQcmltaXRpdmUqKWRsc3ltKGxvYWRlci0+bmF0aXZlSGFuZGxlLCAiYnl0ZSIpOwotICAgICAgT2ZDaGFyID0gKENsYXNzUHJpbWl0aXZlKilkbHN5bShsb2FkZXItPm5hdGl2ZUhhbmRsZSwgImNoYXIiKTsKLSAgICAgIE9mU2hvcnQgPSAoQ2xhc3NQcmltaXRpdmUqKWRsc3ltKGxvYWRlci0+bmF0aXZlSGFuZGxlLCAic2hvcnQiKTsKLSAgICAgIE9mSW50ID0gKENsYXNzUHJpbWl0aXZlKilkbHN5bShsb2FkZXItPm5hdGl2ZUhhbmRsZSwgImludCIpOwotICAgICAgT2ZGbG9hdCA9IChDbGFzc1ByaW1pdGl2ZSopZGxzeW0obG9hZGVyLT5uYXRpdmVIYW5kbGUsICJmbG9hdCIpOwotICAgICAgT2ZMb25nID0gKENsYXNzUHJpbWl0aXZlKilkbHN5bShsb2FkZXItPm5hdGl2ZUhhbmRsZSwgImxvbmciKTsKLSAgICAgIE9mRG91YmxlID0gKENsYXNzUHJpbWl0aXZlKilkbHN5bShsb2FkZXItPm5hdGl2ZUhhbmRsZSwgImRvdWJsZSIpOwotICAgICAgCi0gICAgICAKLSAgICAgIC8vIFdlIGhhdmUgdGhlIGphdmEvbGFuZy9PYmplY3QgY2xhc3MsIGV4ZWN1dGUgdGhlIHN0YXRpYyBpbml0aWFsaXplci4KLSAgICAgIHN0YXRpY19pbml0X3QgaW5pdCA9IChzdGF0aWNfaW5pdF90KSh1aW50cHRyX3QpU3VwZXJBcnJheS0+Y2xhc3NMb2FkZXI7Ci0gICAgICBhc3NlcnQoaW5pdCAmJiAiTG9hZGVkIHRoZSB3cm9uZyBib290IGxpYnJhcnkiKTsKLSAgICAgIGluaXQobG9hZGVyKTsKLSAgICAgIAotICAgICAgLy8gR2V0IHRoZSBiYXNlIG9iamVjdCBhcnJheXMgYWZ0ZXIgdGhlIGluaXQsIGJlY2F1c2UgaW5pdCBwdXRzIGFycmF5cwotICAgICAgLy8gaW4gdGhlIGNsYXNzIGxvYWRlciBtYXAuCi0gICAgICBBcnJheU9mU3RyaW5nID0gCi0gICAgICAgIGxvYWRlci0+Y29uc3RydWN0QXJyYXkobG9hZGVyLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KCJbTGphdmEvbGFuZy9TdHJpbmc7IikpOwotICAKLSAgICAgIEFycmF5T2ZPYmplY3QgPSAKLSAgICAgICAgbG9hZGVyLT5jb25zdHJ1Y3RBcnJheShsb2FkZXItPmFzY2lpekNvbnN0cnVjdFVURjgoIltMamF2YS9sYW5nL09iamVjdDsiKSk7Ci0gICAgICAKLSAgICAgIEludGVyZmFjZXNBcnJheSA9IEFycmF5T2ZPYmplY3QtPmludGVyZmFjZXM7Ci0gICAgICBDbGFzc0FycmF5OjpJbnRlcmZhY2VzQXJyYXkgPSBJbnRlcmZhY2VzQXJyYXk7Ci0KLSAgICB9Ci0gIH0KLSAgIAotICBpZiAoIU9mQ2hhcikgewotICAgIC8vIEFsbG9jYXRlIGludGVyZmFjZXMuCi0gICAgSW50ZXJmYWNlc0FycmF5ID0gKENsYXNzKiopbG9hZGVyLT5hbGxvY2F0b3IuQWxsb2NhdGUoMiAqIHNpemVvZihVc2VyQ2xhc3MqKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludGVyZmFjZSBhcnJheSIpOwotICAgIENsYXNzQXJyYXk6OkludGVyZmFjZXNBcnJheSA9IEludGVyZmFjZXNBcnJheTsKLQotICAgIC8vIENyZWF0ZSB0aGUgcHJpbWl0aXZlIGNsYXNzZXMuCi0gICAgT2ZDaGFyID0gVVBDQUxMX1BSSU1JVElWRV9DTEFTUyhsb2FkZXIsICJjaGFyIiwgMSk7Ci0gICAgT2ZCb29sID0gVVBDQUxMX1BSSU1JVElWRV9DTEFTUyhsb2FkZXIsICJib29sZWFuIiwgMCk7Ci0gICAgT2ZTaG9ydCA9IFVQQ0FMTF9QUklNSVRJVkVfQ0xBU1MobG9hZGVyLCAic2hvcnQiLCAxKTsKLSAgICBPZkludCA9IFVQQ0FMTF9QUklNSVRJVkVfQ0xBU1MobG9hZGVyLCAiaW50IiwgMik7Ci0gICAgT2ZMb25nID0gVVBDQUxMX1BSSU1JVElWRV9DTEFTUyhsb2FkZXIsICJsb25nIiwgMyk7Ci0gICAgT2ZGbG9hdCA9IFVQQ0FMTF9QUklNSVRJVkVfQ0xBU1MobG9hZGVyLCAiZmxvYXQiLCAyKTsKLSAgICBPZkRvdWJsZSA9IFVQQ0FMTF9QUklNSVRJVkVfQ0xBU1MobG9hZGVyLCAiZG91YmxlIiwgMyk7Ci0gICAgT2ZWb2lkID0gVVBDQUxMX1BSSU1JVElWRV9DTEFTUyhsb2FkZXIsICJ2b2lkIiwgMCk7Ci0gICAgT2ZCeXRlID0gVVBDQUxMX1BSSU1JVElWRV9DTEFTUyhsb2FkZXIsICJieXRlIiwgMCk7Ci0gIH0KLSAgCi0gIC8vIENyZWF0ZSB0aGUgcHJpbWl0aXZlIGFycmF5cy4KLSAgQXJyYXlPZkNoYXIgICA9IGxvYWRlci0+Y29uc3RydWN0QXJyYXkobG9hZGVyLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KCJbQyIpLCBPZkNoYXIpOwotICBBcnJheU9mQnl0ZSAgID0gbG9hZGVyLT5jb25zdHJ1Y3RBcnJheShsb2FkZXItPmFzY2lpekNvbnN0cnVjdFVURjgoIltCIiksIE9mQnl0ZSk7Ci0gIEFycmF5T2ZJbnQgICAgPSBsb2FkZXItPmNvbnN0cnVjdEFycmF5KGxvYWRlci0+YXNjaWl6Q29uc3RydWN0VVRGOCgiW0kiKSwgT2ZJbnQpOwotICBBcnJheU9mQm9vbCAgID0gbG9hZGVyLT5jb25zdHJ1Y3RBcnJheShsb2FkZXItPmFzY2lpekNvbnN0cnVjdFVURjgoIltaIiksIE9mQm9vbCk7Ci0gIEFycmF5T2ZMb25nICAgPSBsb2FkZXItPmNvbnN0cnVjdEFycmF5KGxvYWRlci0+YXNjaWl6Q29uc3RydWN0VVRGOCgiW0oiKSwgT2ZMb25nKTsKLSAgQXJyYXlPZkZsb2F0ICA9IGxvYWRlci0+Y29uc3RydWN0QXJyYXkobG9hZGVyLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KCJbRiIpLCBPZkZsb2F0KTsKLSAgQXJyYXlPZkRvdWJsZSA9IGxvYWRlci0+Y29uc3RydWN0QXJyYXkobG9hZGVyLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KCJbRCIpLCBPZkRvdWJsZSk7Ci0gIEFycmF5T2ZTaG9ydCAgPSBsb2FkZXItPmNvbnN0cnVjdEFycmF5KGxvYWRlci0+YXNjaWl6Q29uc3RydWN0VVRGOCgiW1MiKSwgT2ZTaG9ydCk7Ci0gIAotICAvLyBGaWxsIHRoZSBtYXBzLgotICBwcmltaXRpdmVNYXBbSV9WT0lEXSAgID0gT2ZWb2lkOwotICBwcmltaXRpdmVNYXBbSV9CT09MXSAgID0gT2ZCb29sOwotICBwcmltaXRpdmVNYXBbSV9CWVRFXSAgID0gT2ZCeXRlOwotICBwcmltaXRpdmVNYXBbSV9DSEFSXSAgID0gT2ZDaGFyOwotICBwcmltaXRpdmVNYXBbSV9TSE9SVF0gID0gT2ZTaG9ydDsKLSAgcHJpbWl0aXZlTWFwW0lfSU5UXSAgICA9IE9mSW50OwotICBwcmltaXRpdmVNYXBbSV9GTE9BVF0gID0gT2ZGbG9hdDsKLSAgcHJpbWl0aXZlTWFwW0lfTE9OR10gICA9IE9mTG9uZzsKLSAgcHJpbWl0aXZlTWFwW0lfRE9VQkxFXSA9IE9mRG91YmxlOwotCi0gIGFycmF5VGFibGVbSmF2YUFycmF5OjpUX0JPT0xFQU4gLSA0XSA9IEFycmF5T2ZCb29sOwotICBhcnJheVRhYmxlW0phdmFBcnJheTo6VF9CWVRFIC0gNF0gICAgPSBBcnJheU9mQnl0ZTsKLSAgYXJyYXlUYWJsZVtKYXZhQXJyYXk6OlRfQ0hBUiAtIDRdICAgID0gQXJyYXlPZkNoYXI7Ci0gIGFycmF5VGFibGVbSmF2YUFycmF5OjpUX1NIT1JUIC0gNF0gICA9IEFycmF5T2ZTaG9ydDsKLSAgYXJyYXlUYWJsZVtKYXZhQXJyYXk6OlRfSU5UIC0gNF0gICAgID0gQXJyYXlPZkludDsKLSAgYXJyYXlUYWJsZVtKYXZhQXJyYXk6OlRfRkxPQVQgLSA0XSAgID0gQXJyYXlPZkZsb2F0OwotICBhcnJheVRhYmxlW0phdmFBcnJheTo6VF9MT05HIC0gNF0gICAgPSBBcnJheU9mTG9uZzsKLSAgYXJyYXlUYWJsZVtKYXZhQXJyYXk6OlRfRE9VQkxFIC0gNF0gID0gQXJyYXlPZkRvdWJsZTsKLSAgCi0gIEF0dHJpYnV0Ojphbm5vdGF0aW9uc0F0dHJpYnV0ICAgICA9IGxvYWRlci0+YXNjaWl6Q29uc3RydWN0VVRGOCgiUnVudGltZVZpc2libGVBbm5vdGF0aW9ucyIpOwotICBBdHRyaWJ1dDo6Y29kZUF0dHJpYnV0ICAgICAgICAgICAgPSBsb2FkZXItPmFzY2lpekNvbnN0cnVjdFVURjgoIkNvZGUiKTsKLSAgQXR0cmlidXQ6OmV4Y2VwdGlvbnNBdHRyaWJ1dCAgICAgID0gbG9hZGVyLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KCJFeGNlcHRpb25zIik7Ci0gIEF0dHJpYnV0Ojpjb25zdGFudEF0dHJpYnV0ICAgICAgICA9IGxvYWRlci0+YXNjaWl6Q29uc3RydWN0VVRGOCgiQ29uc3RhbnRWYWx1ZSIpOwotICBBdHRyaWJ1dDo6bGluZU51bWJlclRhYmxlQXR0cmlidXQgPSBsb2FkZXItPmFzY2lpekNvbnN0cnVjdFVURjgoIkxpbmVOdW1iZXJUYWJsZSIpOwotICBBdHRyaWJ1dDo6aW5uZXJDbGFzc2VzQXR0cmlidXQgICAgPSBsb2FkZXItPmFzY2lpekNvbnN0cnVjdFVURjgoIklubmVyQ2xhc3NlcyIpOwotICBBdHRyaWJ1dDo6c291cmNlRmlsZUF0dHJpYnV0ICAgICAgPSBsb2FkZXItPmFzY2lpekNvbnN0cnVjdFVURjgoIlNvdXJjZUZpbGUiKTsKLSAKLSAgSmF2YUNvbXBpbGVyOjpJbmxpbmVQcmFnbWEgICAgICAgID0gbG9hZGVyLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KCJMb3JnL3ZtbWFnaWMvcHJhZ21hL0lubGluZTsiKTsKLSAgSmF2YUNvbXBpbGVyOjpOb0lubGluZVByYWdtYSAgICAgID0gbG9hZGVyLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KCJMb3JnL3ZtbWFnaWMvcHJhZ21hL05vSW5saW5lOyIpOwotCi0gIGluaXROYW1lID0gbG9hZGVyLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KCI8aW5pdD4iKTsKLSAgaW5pdEV4Y2VwdGlvblNpZyA9IGxvYWRlci0+YXNjaWl6Q29uc3RydWN0VVRGOCgiKExqYXZhL2xhbmcvU3RyaW5nOylWIik7Ci0gIGNsaW5pdE5hbWUgPSBsb2FkZXItPmFzY2lpekNvbnN0cnVjdFVURjgoIjxjbGluaXQ+Iik7Ci0gIGNsaW5pdFR5cGUgPSBsb2FkZXItPmFzY2lpekNvbnN0cnVjdFVURjgoIigpViIpOwotICBydW5OYW1lID0gbG9hZGVyLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KCJydW4iKTsKLSAgcHJlbGliID0gbG9hZGVyLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KCJsaWIiKTsKLSNpZiBkZWZpbmVkKF9fTUFDSF9fKQotICBwb3N0bGliID0gbG9hZGVyLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KCIuZHlsaWIiKTsKLSNlbHNlIAotICBwb3N0bGliID0gbG9hZGVyLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KCIuc28iKTsKLSNlbmRpZgotICBtYXRoTmFtZSA9IGxvYWRlci0+YXNjaWl6Q29uc3RydWN0VVRGOCgiamF2YS9sYW5nL01hdGgiKTsKLSAgc3RhY2tXYWxrZXJOYW1lID0gbG9hZGVyLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KCJnbnUvY2xhc3NwYXRoL1ZNU3RhY2tXYWxrZXIiKTsKLSAgTm9DbGFzc0RlZkZvdW5kRXJyb3JOYW1lID0gbG9hZGVyLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KCJqYXZhL2xhbmcvTm9DbGFzc0RlZkZvdW5kRXJyb3IiKTsKLQotI2RlZmluZSBERUZfVVRGOCh2YXIpIFwKLSAgdmFyID0gbG9hZGVyLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KCN2YXIpCi0gIAotICBERUZfVVRGOChhYnMpOwotICBERUZfVVRGOChzcXJ0KTsKLSAgREVGX1VURjgoc2luKTsKLSAgREVGX1VURjgoY29zKTsKLSAgREVGX1VURjgodGFuKTsKLSAgREVGX1VURjgoYXNpbik7Ci0gIERFRl9VVEY4KGFjb3MpOwotICBERUZfVVRGOChhdGFuKTsKLSAgREVGX1VURjgoYXRhbjIpOwotICBERUZfVVRGOChleHApOwotICBERUZfVVRGOChsb2cpOwotICBERUZfVVRGOChwb3cpOwotICBERUZfVVRGOChjZWlsKTsKLSAgREVGX1VURjgoZmxvb3IpOwotICBERUZfVVRGOChyaW50KTsKLSAgREVGX1VURjgoY2JydCk7Ci0gIERFRl9VVEY4KGNvc2gpOwotICBERUZfVVRGOChleHBtMSk7Ci0gIERFRl9VVEY4KGh5cG90KTsKLSAgREVGX1VURjgobG9nMTApOwotICBERUZfVVRGOChsb2cxcCk7Ci0gIERFRl9VVEY4KHNpbmgpOwotICBERUZfVVRGOCh0YW5oKTsKLSAgREVGX1VURjgoZmluYWxpemUpOwotCi0jdW5kZWYgREVGX1VURjgKLX0KLQotdm9pZCBDbGFzc3BhdGg6OnBvc3RJbml0aWFsaXNlQ2xhc3NwYXRoKEpuanZtQ2xhc3NMb2FkZXIqIGxvYWRlcikgewotCi0gIG5ld0NsYXNzTG9hZGVyID0gCi0gICAgVVBDQUxMX0NMQVNTKGxvYWRlciwgImphdmEvbGFuZy9DbGFzc0xvYWRlciIpOwotICAKLSAgZ2V0U3lzdGVtQ2xhc3NMb2FkZXIgPQotICAgIFVQQ0FMTF9NRVRIT0QobG9hZGVyLCAiamF2YS9sYW5nL0NsYXNzTG9hZGVyIiwgImdldFN5c3RlbUNsYXNzTG9hZGVyIiwKLSAgICAgICAgICAgICAgICAgICIoKUxqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7IiwgQUNDX1NUQVRJQyk7Ci0KLSAgc2V0Q29udGV4dENsYXNzTG9hZGVyID0KLSAgICBVUENBTExfTUVUSE9EKGxvYWRlciwgImphdmEvbGFuZy9UaHJlYWQiLCAic2V0Q29udGV4dENsYXNzTG9hZGVyIiwKLSAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9DbGFzc0xvYWRlcjspViIsIEFDQ19WSVJUVUFMKTsKLQotICBuZXdTdHJpbmcgPSAKLSAgICBVUENBTExfQ0xBU1MobG9hZGVyLCAiamF2YS9sYW5nL1N0cmluZyIpOwotICAKLSAgbmV3Q2xhc3MgPQotICAgIFVQQ0FMTF9DTEFTUyhsb2FkZXIsICJqYXZhL2xhbmcvQ2xhc3MiKTsKLSAgCi0gIG5ld1Rocm93YWJsZSA9Ci0gICAgVVBDQUxMX0NMQVNTKGxvYWRlciwgImphdmEvbGFuZy9UaHJvd2FibGUiKTsKLSAgCi0gIG5ld0V4Y2VwdGlvbiA9Ci0gICAgVVBDQUxMX0NMQVNTKGxvYWRlciwgImphdmEvbGFuZy9FeGNlcHRpb24iKTsKLQotICBuZXdQb2ludGVyMzIgPSAKLSAgICBVUENBTExfQ0xBU1MobG9hZGVyLCAiZ251L2NsYXNzcGF0aC9Qb2ludGVyMzIiKTsKLSAgCi0gIG5ld1BvaW50ZXI2NCA9IAotICAgIFVQQ0FMTF9DTEFTUyhsb2FkZXIsICJnbnUvY2xhc3NwYXRoL1BvaW50ZXI2NCIpOwotIAotICBuZXdEaXJlY3RCeXRlQnVmZmVyID0KLSAgICBVUENBTExfQ0xBU1MobG9hZGVyLCAiamF2YS9uaW8vRGlyZWN0Qnl0ZUJ1ZmZlckltcGwkUmVhZFdyaXRlIik7Ci0KLSAgSW5pdERpcmVjdEJ5dGVCdWZmZXIgPQotICAgIFVQQ0FMTF9NRVRIT0QobG9hZGVyLCAiamF2YS9uaW8vRGlyZWN0Qnl0ZUJ1ZmZlckltcGwkUmVhZFdyaXRlIiwgIjxpbml0PiIsCi0gICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvT2JqZWN0O0xnbnUvY2xhc3NwYXRoL1BvaW50ZXI7SUlJKVYiLAotICAgICAgICAgICAgICAgICAgQUNDX1ZJUlRVQUwpOwotCi0gIGluaXRDbGFzcyA9Ci0gICAgVVBDQUxMX01FVEhPRChsb2FkZXIsICJqYXZhL2xhbmcvQ2xhc3MiLCAiPGluaXQ+IiwgIihMamF2YS9sYW5nL09iamVjdDspViIsCi0gICAgICAgICAgICAgICAgICBBQ0NfVklSVFVBTCk7Ci0KLSAgaW5pdENsYXNzV2l0aFByb3RlY3Rpb25Eb21haW4gPQotICAgIFVQQ0FMTF9NRVRIT0QobG9hZGVyLCAiamF2YS9sYW5nL0NsYXNzIiwgIjxpbml0PiIsCi0gICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3NlY3VyaXR5L1Byb3RlY3Rpb25Eb21haW47KVYiLAotICAgICAgICAgICAgICAgICAgQUNDX1ZJUlRVQUwpOwotCi0gIHZtZGF0YUNsYXNzID0KLSAgICBVUENBTExfRklFTEQobG9hZGVyLCAiamF2YS9sYW5nL0NsYXNzIiwgInZtZGF0YSIsICJMamF2YS9sYW5nL09iamVjdDsiLAotICAgICAgICAgICAgICAgICBBQ0NfVklSVFVBTCk7Ci0gIAotICBzZXRQcm9wZXJ0eSA9IAotICAgIFVQQ0FMTF9NRVRIT0QobG9hZGVyLCAiamF2YS91dGlsL1Byb3BlcnRpZXMiLCAic2V0UHJvcGVydHkiLAotICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9PYmplY3Q7IiwKLSAgICAgICAgICAgICAgICAgIEFDQ19WSVJUVUFMKTsKLQotICBpbml0U3RyaW5nID0KLSAgICBVUENBTExfTUVUSE9EKGxvYWRlciwgImphdmEvbGFuZy9TdHJpbmciLCAiPGluaXQ+IiwgIihbQ0lJWilWIiwgQUNDX1ZJUlRVQUwpOwotICAKLSAgaW5pdENvbnN0cnVjdG9yID0KLSAgICBVUENBTExfTUVUSE9EKGxvYWRlciwgImphdmEvbGFuZy9yZWZsZWN0L0NvbnN0cnVjdG9yIiwgIjxpbml0PiIsCi0gICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvQ2xhc3M7SSlWIiwgQUNDX1ZJUlRVQUwpOwotCi0gIG5ld0NvbnN0cnVjdG9yID0KLSAgICBVUENBTExfQ0xBU1MobG9hZGVyLCAiamF2YS9sYW5nL3JlZmxlY3QvQ29uc3RydWN0b3IiKTsKLQotICBjb25zdHJ1Y3RvckFycmF5Q2xhc3MgPQotICAgIFVQQ0FMTF9BUlJBWV9DTEFTUyhsb2FkZXIsICJqYXZhL2xhbmcvcmVmbGVjdC9Db25zdHJ1Y3RvciIsIDEpOwotICAKLSAgY29uc3RydWN0b3JBcnJheUFubm90YXRpb24gPQotICAgIFVQQ0FMTF9BUlJBWV9DTEFTUyhsb2FkZXIsICJqYXZhL2xhbmcvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uIiwgMSk7Ci0KLSAgY29uc3RydWN0b3JTbG90ID0KLSAgICBVUENBTExfRklFTEQobG9hZGVyLCAiamF2YS9sYW5nL3JlZmxlY3QvQ29uc3RydWN0b3IiLCAic2xvdCIsICJJIiwgQUNDX1ZJUlRVQUwpOwotICAKLSAgaW5pdE1ldGhvZCA9Ci0gICAgVVBDQUxMX01FVEhPRChsb2FkZXIsICJqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QiLCAiPGluaXQ+IiwKLSAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9DbGFzcztMamF2YS9sYW5nL1N0cmluZztJKVYiLCBBQ0NfVklSVFVBTCk7Ci0KLSAgbmV3TWV0aG9kID0KLSAgICBVUENBTExfQ0xBU1MobG9hZGVyLCAiamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kIik7Ci0KLSAgbWV0aG9kQXJyYXlDbGFzcyA9Ci0gICAgVVBDQUxMX0FSUkFZX0NMQVNTKGxvYWRlciwgImphdmEvbGFuZy9yZWZsZWN0L01ldGhvZCIsIDEpOwotCi0gIG1ldGhvZFNsb3QgPQotICAgIFVQQ0FMTF9GSUVMRChsb2FkZXIsICJqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QiLCAic2xvdCIsICJJIiwgQUNDX1ZJUlRVQUwpOwotICAKLSAgaW5pdEZpZWxkID0KLSAgICBVUENBTExfTUVUSE9EKGxvYWRlciwgImphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkIiwgIjxpbml0PiIsCi0gICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvQ2xhc3M7TGphdmEvbGFuZy9TdHJpbmc7SSlWIiwgQUNDX1ZJUlRVQUwpOwotCi0gIG5ld0ZpZWxkID0KLSAgICBVUENBTExfQ0xBU1MobG9hZGVyLCAiamF2YS9sYW5nL3JlZmxlY3QvRmllbGQiKTsKLQotICBmaWVsZEFycmF5Q2xhc3MgPQotICAgIFVQQ0FMTF9BUlJBWV9DTEFTUyhsb2FkZXIsICJqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZCIsIDEpOwotICAKLSAgZmllbGRTbG90ID0KLSAgICBVUENBTExfRklFTEQobG9hZGVyLCAiamF2YS9sYW5nL3JlZmxlY3QvRmllbGQiLCAic2xvdCIsICJJIiwgQUNDX1ZJUlRVQUwpOwotICAKLSAgCi0gIGNsYXNzQXJyYXlDbGFzcyA9Ci0gICAgVVBDQUxMX0FSUkFZX0NMQVNTKGxvYWRlciwgImphdmEvbGFuZy9DbGFzcyIsIDEpOwotICAKLSAgbmV3Vk1UaHJvd2FibGUgPQotICAgIFVQQ0FMTF9DTEFTUyhsb2FkZXIsICJqYXZhL2xhbmcvVk1UaHJvd2FibGUiKTsKLSAgCi0gIGluaXRWTVRocm93YWJsZSA9Ci0gICAgVVBDQUxMX01FVEhPRChsb2FkZXIsICJqYXZhL2xhbmcvVk1UaHJvd2FibGUiLCAiPGluaXQ+IiwgIigpViIsIEFDQ19WSVJUVUFMKTsKLQotICB2bURhdGFWTVRocm93YWJsZSA9Ci0gICAgVVBDQUxMX0ZJRUxEKGxvYWRlciwgImphdmEvbGFuZy9WTVRocm93YWJsZSIsICJ2bWRhdGEiLCAiTGphdmEvbGFuZy9PYmplY3Q7IiwKLSAgICAgICAgICAgICAgICAgQUNDX1ZJUlRVQUwpOwotCi0gIGJ1ZmZlckFkZHJlc3MgPQotICAgIFVQQ0FMTF9GSUVMRChsb2FkZXIsICJqYXZhL25pby9CdWZmZXIiLCAiYWRkcmVzcyIsICJMZ251L2NsYXNzcGF0aC9Qb2ludGVyOyIsCi0gICAgICAgICAgICAgICAgIEFDQ19WSVJUVUFMKTsKLQotICBkYXRhUG9pbnRlcjMyID0KLSAgICBVUENBTExfRklFTEQobG9hZGVyLCAiZ251L2NsYXNzcGF0aC9Qb2ludGVyMzIiLCAiZGF0YSIsICJJIiwgQUNDX1ZJUlRVQUwpOwotICAKLSAgZGF0YVBvaW50ZXI2NCA9Ci0gICAgVVBDQUxMX0ZJRUxEKGxvYWRlciwgImdudS9jbGFzc3BhdGgvUG9pbnRlcjY0IiwgImRhdGEiLCAiSiIsIEFDQ19WSVJUVUFMKTsKLQotICB2bWRhdGFDbGFzc0xvYWRlciA9Ci0gICAgVVBDQUxMX0ZJRUxEKGxvYWRlciwgImphdmEvbGFuZy9DbGFzc0xvYWRlciIsICJ2bWRhdGEiLCAiTGphdmEvbGFuZy9PYmplY3Q7IiwKLSAgICAgICAgICAgICAgICAgQUNDX1ZJUlRVQUwpOwotICAKLSAgbmV3U3RhY2tUcmFjZUVsZW1lbnQgPQotICAgIFVQQ0FMTF9DTEFTUyhsb2FkZXIsICJqYXZhL2xhbmcvU3RhY2tUcmFjZUVsZW1lbnQiKTsKLSAgCi0gIHN0YWNrVHJhY2VBcnJheSA9Ci0gICAgVVBDQUxMX0FSUkFZX0NMQVNTKGxvYWRlciwgImphdmEvbGFuZy9TdGFja1RyYWNlRWxlbWVudCIsIDEpOwotCi0gIGluaXRTdGFja1RyYWNlRWxlbWVudCA9Ci0gICAgVVBDQUxMX01FVEhPRChsb2FkZXIsICAiamF2YS9sYW5nL1N0YWNrVHJhY2VFbGVtZW50IiwgIjxpbml0PiIsCi0gICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0lMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztaKVYiLAotICAgICAgICAgICAgICAgICAgQUNDX1ZJUlRVQUwpOwotCi0gIGJvb2xWYWx1ZSA9Ci0gICAgVVBDQUxMX0ZJRUxEKGxvYWRlciwgImphdmEvbGFuZy9Cb29sZWFuIiwgInZhbHVlIiwgIloiLCBBQ0NfVklSVFVBTCk7Ci0gIAotICBieXRlVmFsdWUgPQotICAgIFVQQ0FMTF9GSUVMRChsb2FkZXIsICJqYXZhL2xhbmcvQnl0ZSIsICJ2YWx1ZSIsICJCIiwgQUNDX1ZJUlRVQUwpOwotCi0gIHNob3J0VmFsdWUgPQotICAgIFVQQ0FMTF9GSUVMRChsb2FkZXIsICJqYXZhL2xhbmcvU2hvcnQiLCAidmFsdWUiLCAiUyIsIEFDQ19WSVJUVUFMKTsKLQotICBjaGFyVmFsdWUgPQotICAgIFVQQ0FMTF9GSUVMRChsb2FkZXIsICJqYXZhL2xhbmcvQ2hhcmFjdGVyIiwgInZhbHVlIiwgIkMiLCBBQ0NfVklSVFVBTCk7Ci0KLSAgaW50VmFsdWUgPQotICAgIFVQQ0FMTF9GSUVMRChsb2FkZXIsICJqYXZhL2xhbmcvSW50ZWdlciIsICJ2YWx1ZSIsICJJIiwgQUNDX1ZJUlRVQUwpOwotCi0gIGxvbmdWYWx1ZSA9Ci0gICAgVVBDQUxMX0ZJRUxEKGxvYWRlciwgImphdmEvbGFuZy9Mb25nIiwgInZhbHVlIiwgIkoiLCBBQ0NfVklSVFVBTCk7Ci0KLSAgZmxvYXRWYWx1ZSA9Ci0gICAgVVBDQUxMX0ZJRUxEKGxvYWRlciwgImphdmEvbGFuZy9GbG9hdCIsICJ2YWx1ZSIsICJGIiwgQUNDX1ZJUlRVQUwpOwotCi0gIGRvdWJsZVZhbHVlID0KLSAgICBVUENBTExfRklFTEQobG9hZGVyLCAiamF2YS9sYW5nL0RvdWJsZSIsICJ2YWx1ZSIsICJEIiwgQUNDX1ZJUlRVQUwpOwotCi0gIENsYXNzcGF0aDo6dm9pZENsYXNzID0KLSAgICBVUENBTExfQ0xBU1MobG9hZGVyLCAiamF2YS9sYW5nL1ZvaWQiKTsKLSAgCi0gIENsYXNzcGF0aDo6Ym9vbENsYXNzID0KLSAgICBVUENBTExfQ0xBU1MobG9hZGVyLCAiamF2YS9sYW5nL0Jvb2xlYW4iKTsKLQotICBDbGFzc3BhdGg6OmJ5dGVDbGFzcyA9Ci0gICAgVVBDQUxMX0NMQVNTKGxvYWRlciwgImphdmEvbGFuZy9CeXRlIik7Ci0KLSAgQ2xhc3NwYXRoOjpzaG9ydENsYXNzID0KLSAgICBVUENBTExfQ0xBU1MobG9hZGVyLCAiamF2YS9sYW5nL1Nob3J0Iik7Ci0KLSAgQ2xhc3NwYXRoOjpjaGFyQ2xhc3MgPQotICAgIFVQQ0FMTF9DTEFTUyhsb2FkZXIsICJqYXZhL2xhbmcvQ2hhcmFjdGVyIik7IAotCi0gIENsYXNzcGF0aDo6aW50Q2xhc3MgPQotICAgIFVQQ0FMTF9DTEFTUyhsb2FkZXIsICJqYXZhL2xhbmcvSW50ZWdlciIpOwotCi0gIENsYXNzcGF0aDo6ZmxvYXRDbGFzcyA9Ci0gICAgVVBDQUxMX0NMQVNTKGxvYWRlciwgImphdmEvbGFuZy9GbG9hdCIpOwotCi0gIENsYXNzcGF0aDo6ZG91YmxlQ2xhc3MgPQotICAgIFVQQ0FMTF9DTEFTUyhsb2FkZXIsICJqYXZhL2xhbmcvRG91YmxlIik7Ci0KLSAgQ2xhc3NwYXRoOjpsb25nQ2xhc3MgPQotICAgIFVQQ0FMTF9DTEFTUyhsb2FkZXIsICJqYXZhL2xhbmcvTG9uZyIpOwotICAKLSAgQ2xhc3NwYXRoOjpPZk9iamVjdCA9Ci0gICAgVVBDQUxMX0NMQVNTKGxvYWRlciwgImphdmEvbGFuZy9PYmplY3QiKTsKLQotICB2bVN0YWNrV2Fsa2VyID0KLSAgICBVUENBTExfQ0xBU1MobG9hZGVyLCAiZ251L2NsYXNzcGF0aC9WTVN0YWNrV2Fsa2VyIik7Ci0KLSAgbG9hZEluQ2xhc3NMb2FkZXIgPQotICAgIFVQQ0FMTF9NRVRIT0QobG9hZGVyLCAiamF2YS9sYW5nL0NsYXNzTG9hZGVyIiwgImxvYWRDbGFzcyIsCi0gICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL0NsYXNzOyIsIEFDQ19WSVJUVUFMKTsKLQotICBKYXZhTWV0aG9kKiBpbnRlcm5TdHJpbmcgPQotICAgIFVQQ0FMTF9NRVRIT0QobG9hZGVyLCAiamF2YS9sYW5nL1ZNU3RyaW5nIiwgImludGVybiIsCi0gICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsiLCBBQ0NfU1RBVElDKTsgCi0gIGludGVyblN0cmluZy0+c2V0TmF0aXZlKCk7Ci0gIAotICBKYXZhTWV0aG9kKiBpc0FycmF5ID0KLSAgICBVUENBTExfTUVUSE9EKGxvYWRlciwgImphdmEvbGFuZy9DbGFzcyIsICJpc0FycmF5IiwgIigpWiIsIEFDQ19WSVJUVUFMKTsKLSAgaXNBcnJheS0+c2V0TmF0aXZlKCk7Ci0KLQotICBVUENBTExfUkVGTEVDVF9DTEFTU19FWENFUFRJT04obG9hZGVyLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKTsKLSAgVVBDQUxMX0NMQVNTX0VYQ0VQVElPTihsb2FkZXIsIEFycmF5U3RvcmVFeGNlcHRpb24pOwotICBVUENBTExfQ0xBU1NfRVhDRVBUSU9OKGxvYWRlciwgQ2xhc3NDYXN0RXhjZXB0aW9uKTsKLSAgVVBDQUxMX0NMQVNTX0VYQ0VQVElPTihsb2FkZXIsIElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24pOwotICBVUENBTExfQ0xBU1NfRVhDRVBUSU9OKGxvYWRlciwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKTsKLSAgVVBDQUxMX0NMQVNTX0VYQ0VQVElPTihsb2FkZXIsIEludGVycnVwdGVkRXhjZXB0aW9uKTsKLSAgVVBDQUxMX0NMQVNTX0VYQ0VQVElPTihsb2FkZXIsIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24pOwotICBVUENBTExfQ0xBU1NfRVhDRVBUSU9OKGxvYWRlciwgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKTsKLSAgVVBDQUxMX0NMQVNTX0VYQ0VQVElPTihsb2FkZXIsIE5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uKTsKLSAgVVBDQUxMX0NMQVNTX0VYQ0VQVElPTihsb2FkZXIsIE51bGxQb2ludGVyRXhjZXB0aW9uKTsKLSAgVVBDQUxMX0NMQVNTX0VYQ0VQVElPTihsb2FkZXIsIFNlY3VyaXR5RXhjZXB0aW9uKTsKLSAgVVBDQUxMX0NMQVNTX0VYQ0VQVElPTihsb2FkZXIsIENsYXNzRm9ybWF0RXJyb3IpOwotICBVUENBTExfQ0xBU1NfRVhDRVBUSU9OKGxvYWRlciwgQ2xhc3NDaXJjdWxhcml0eUVycm9yKTsKLSAgVVBDQUxMX0NMQVNTX0VYQ0VQVElPTihsb2FkZXIsIE5vQ2xhc3NEZWZGb3VuZEVycm9yKTsKLSAgVVBDQUxMX0NMQVNTX0VYQ0VQVElPTihsb2FkZXIsIFVuc3VwcG9ydGVkQ2xhc3NWZXJzaW9uRXJyb3IpOwotICBVUENBTExfQ0xBU1NfRVhDRVBUSU9OKGxvYWRlciwgTm9TdWNoRmllbGRFcnJvcik7Ci0gIFVQQ0FMTF9DTEFTU19FWENFUFRJT04obG9hZGVyLCBOb1N1Y2hNZXRob2RFcnJvcik7Ci0gIFVQQ0FMTF9DTEFTU19FWENFUFRJT04obG9hZGVyLCBJbnN0YW50aWF0aW9uRXJyb3IpOwotICBVUENBTExfQ0xBU1NfRVhDRVBUSU9OKGxvYWRlciwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbik7Ci0gIFVQQ0FMTF9DTEFTU19FWENFUFRJT04obG9hZGVyLCBJbGxlZ2FsQWNjZXNzRXJyb3IpOwotICBVUENBTExfQ0xBU1NfRVhDRVBUSU9OKGxvYWRlciwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbik7Ci0gIFVQQ0FMTF9DTEFTU19FWENFUFRJT04obG9hZGVyLCBWZXJpZnlFcnJvcik7Ci0gIFVQQ0FMTF9DTEFTU19FWENFUFRJT04obG9hZGVyLCBFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IpOwotICBVUENBTExfQ0xBU1NfRVhDRVBUSU9OKGxvYWRlciwgTGlua2FnZUVycm9yKTsKLSAgVVBDQUxMX0NMQVNTX0VYQ0VQVElPTihsb2FkZXIsIEFic3RyYWN0TWV0aG9kRXJyb3IpOwotICBVUENBTExfQ0xBU1NfRVhDRVBUSU9OKGxvYWRlciwgVW5zYXRpc2ZpZWRMaW5rRXJyb3IpOwotICBVUENBTExfQ0xBU1NfRVhDRVBUSU9OKGxvYWRlciwgSW50ZXJuYWxFcnJvcik7Ci0gIFVQQ0FMTF9DTEFTU19FWENFUFRJT04obG9hZGVyLCBPdXRPZk1lbW9yeUVycm9yKTsKLSAgVVBDQUxMX0NMQVNTX0VYQ0VQVElPTihsb2FkZXIsIFN0YWNrT3ZlcmZsb3dFcnJvcik7Ci0gIFVQQ0FMTF9DTEFTU19FWENFUFRJT04obG9hZGVyLCBVbmtub3duRXJyb3IpOwotICBVUENBTExfQ0xBU1NfRVhDRVBUSU9OKGxvYWRlciwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbik7Ci0gIFVQQ0FMTF9DTEFTU19FWENFUFRJT04obG9hZGVyLCBBcml0aG1ldGljRXhjZXB0aW9uKTsKLSAgCi0gIFVQQ0FMTF9NRVRIT0RfRVhDRVBUSU9OKGxvYWRlciwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbik7Ci0gIFVQQ0FMTF9NRVRIT0RfRVhDRVBUSU9OKGxvYWRlciwgQXJyYXlTdG9yZUV4Y2VwdGlvbik7Ci0gIFVQQ0FMTF9NRVRIT0RfRVhDRVBUSU9OKGxvYWRlciwgQ2xhc3NDYXN0RXhjZXB0aW9uKTsKLSAgVVBDQUxMX01FVEhPRF9FWENFUFRJT04obG9hZGVyLCBJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uKTsKLSAgVVBDQUxMX01FVEhPRF9FWENFUFRJT04obG9hZGVyLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24pOwotICBVUENBTExfTUVUSE9EX0VYQ0VQVElPTihsb2FkZXIsIEludGVycnVwdGVkRXhjZXB0aW9uKTsKLSAgVVBDQUxMX01FVEhPRF9FWENFUFRJT04obG9hZGVyLCBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKTsKLSAgVVBDQUxMX01FVEhPRF9FWENFUFRJT04obG9hZGVyLCBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24pOwotICBVUENBTExfTUVUSE9EX0VYQ0VQVElPTihsb2FkZXIsIE5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uKTsKLSAgVVBDQUxMX01FVEhPRF9FWENFUFRJT04obG9hZGVyLCBOdWxsUG9pbnRlckV4Y2VwdGlvbik7Ci0gIFVQQ0FMTF9NRVRIT0RfRVhDRVBUSU9OKGxvYWRlciwgU2VjdXJpdHlFeGNlcHRpb24pOwotICBVUENBTExfTUVUSE9EX0VYQ0VQVElPTihsb2FkZXIsIENsYXNzRm9ybWF0RXJyb3IpOwotICBVUENBTExfTUVUSE9EX0VYQ0VQVElPTihsb2FkZXIsIENsYXNzQ2lyY3VsYXJpdHlFcnJvcik7Ci0gIFVQQ0FMTF9NRVRIT0RfRVhDRVBUSU9OKGxvYWRlciwgTm9DbGFzc0RlZkZvdW5kRXJyb3IpOwotICBVUENBTExfTUVUSE9EX0VYQ0VQVElPTihsb2FkZXIsIFVuc3VwcG9ydGVkQ2xhc3NWZXJzaW9uRXJyb3IpOwotICBVUENBTExfTUVUSE9EX0VYQ0VQVElPTihsb2FkZXIsIE5vU3VjaEZpZWxkRXJyb3IpOwotICBVUENBTExfTUVUSE9EX0VYQ0VQVElPTihsb2FkZXIsIE5vU3VjaE1ldGhvZEVycm9yKTsKLSAgVVBDQUxMX01FVEhPRF9FWENFUFRJT04obG9hZGVyLCBJbnN0YW50aWF0aW9uRXJyb3IpOwotICBVUENBTExfTUVUSE9EX0VYQ0VQVElPTihsb2FkZXIsIEluc3RhbnRpYXRpb25FeGNlcHRpb24pOwotICBVUENBTExfTUVUSE9EX0VYQ0VQVElPTihsb2FkZXIsIElsbGVnYWxBY2Nlc3NFcnJvcik7Ci0gIFVQQ0FMTF9NRVRIT0RfRVhDRVBUSU9OKGxvYWRlciwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbik7Ci0gIFVQQ0FMTF9NRVRIT0RfRVhDRVBUSU9OKGxvYWRlciwgVmVyaWZ5RXJyb3IpOwotICBVUENBTExfTUVUSE9EX0VYQ0VQVElPTihsb2FkZXIsIEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcik7Ci0gIFVQQ0FMTF9NRVRIT0RfRVhDRVBUSU9OKGxvYWRlciwgTGlua2FnZUVycm9yKTsKLSAgVVBDQUxMX01FVEhPRF9FWENFUFRJT04obG9hZGVyLCBBYnN0cmFjdE1ldGhvZEVycm9yKTsKLSAgVVBDQUxMX01FVEhPRF9FWENFUFRJT04obG9hZGVyLCBVbnNhdGlzZmllZExpbmtFcnJvcik7Ci0gIFVQQ0FMTF9NRVRIT0RfRVhDRVBUSU9OKGxvYWRlciwgSW50ZXJuYWxFcnJvcik7Ci0gIFVQQ0FMTF9NRVRIT0RfRVhDRVBUSU9OKGxvYWRlciwgT3V0T2ZNZW1vcnlFcnJvcik7Ci0gIFVQQ0FMTF9NRVRIT0RfRVhDRVBUSU9OKGxvYWRlciwgU3RhY2tPdmVyZmxvd0Vycm9yKTsKLSAgVVBDQUxMX01FVEhPRF9FWENFUFRJT04obG9hZGVyLCBVbmtub3duRXJyb3IpOwotICBVUENBTExfTUVUSE9EX0VYQ0VQVElPTihsb2FkZXIsIENsYXNzTm90Rm91bmRFeGNlcHRpb24pOwotICBVUENBTExfTUVUSE9EX0VYQ0VQVElPTihsb2FkZXIsIEFyaXRobWV0aWNFeGNlcHRpb24pOwotICAKLSAgVVBDQUxMX01FVEhPRF9XSVRIX0VYQ0VQVElPTihsb2FkZXIsIE5vQ2xhc3NEZWZGb3VuZEVycm9yKTsKLSAgVVBDQUxMX01FVEhPRF9XSVRIX0VYQ0VQVElPTihsb2FkZXIsIEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcik7Ci0gIFVQQ0FMTF9NRVRIT0RfV0lUSF9FWENFUFRJT04obG9hZGVyLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKTsKLQotICBJbml0T2JqZWN0ID0gVVBDQUxMX01FVEhPRChsb2FkZXIsICJqYXZhL2xhbmcvT2JqZWN0IiwgIjxpbml0PiIsICIoKVYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ0NfVklSVFVBTCk7Ci0gIAotICBGaW5hbGl6ZU9iamVjdCA9IFVQQ0FMTF9NRVRIT0QobG9hZGVyLCAiamF2YS9sYW5nL09iamVjdCIsICJmaW5hbGl6ZSIsICIoKVYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNDX1ZJUlRVQUwpOwotICAKLSAgSW50VG9TdHJpbmcgPSBVUENBTExfTUVUSE9EKGxvYWRlciwgImphdmEvbGFuZy9JbnRlZ2VyIiwgInRvU3RyaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoSUkpTGphdmEvbGFuZy9TdHJpbmc7IiwgQUNDX1NUQVRJQyk7Ci0KLSAgU3lzdGVtQXJyYXljb3B5ID0gVVBDQUxMX01FVEhPRChsb2FkZXIsICJqYXZhL2xhbmcvU3lzdGVtIiwgImFycmF5Y29weSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL09iamVjdDtJTGphdmEvbGFuZy9PYmplY3Q7SUkpViIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNDX1NUQVRJQyk7Ci0gIAotICBWTVN5c3RlbUFycmF5Y29weSA9IFVQQ0FMTF9NRVRIT0QobG9hZGVyLCAiamF2YS9sYW5nL1ZNU3lzdGVtIiwgImFycmF5Y29weSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL09iamVjdDtJTGphdmEvbGFuZy9PYmplY3Q7SUkpViIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNDX1NUQVRJQyk7Ci0gIAotICBTeXN0ZW1DbGFzcyA9IFVQQ0FMTF9DTEFTUyhsb2FkZXIsICJqYXZhL2xhbmcvU3lzdGVtIik7Ci0KLSAgbmV3VGhyZWFkID0gCi0gICAgVVBDQUxMX0NMQVNTKGxvYWRlciwgImphdmEvbGFuZy9UaHJlYWQiKTsKLSAgCi0gIG5ld1ZNVGhyZWFkID0gCi0gICAgVVBDQUxMX0NMQVNTKGxvYWRlciwgImphdmEvbGFuZy9WTVRocmVhZCIpOwotICAKLSAgYXNzb2NUaHJlYWQgPSAKLSAgICBVUENBTExfRklFTEQobG9hZGVyLCAiamF2YS9sYW5nL1ZNVGhyZWFkIiwgInRocmVhZCIsICJMamF2YS9sYW5nL1RocmVhZDsiLAotICAgICAgICAgICAgICAgICBBQ0NfVklSVFVBTCk7Ci0gIAotICB2bWRhdGFWTVRocmVhZCA9IAotICAgIFVQQ0FMTF9GSUVMRChsb2FkZXIsICJqYXZhL2xhbmcvVk1UaHJlYWQiLCAidm1kYXRhIiwgIkxqYXZhL2xhbmcvT2JqZWN0OyIsCi0gICAgICAgICAgICAgICAgIEFDQ19WSVJUVUFMKTsKLSAgCi0gIGluaGVyaXRhYmxlVGhyZWFkTG9jYWwgPSAKLSAgICBVUENBTExfQ0xBU1MobG9hZGVyLCAiamF2YS9sYW5nL0luaGVyaXRhYmxlVGhyZWFkTG9jYWwiKTsKLQotICBmaW5hbGlzZUNyZWF0ZUluaXRpYWxUaHJlYWQgPSAKLSAgICBVUENBTExfTUVUSE9EKGxvYWRlciwgImphdmEvbGFuZy9Jbmhlcml0YWJsZVRocmVhZExvY2FsIiwgIm5ld0NoaWxkVGhyZWFkIiwKLSAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9UaHJlYWQ7KVYiLCBBQ0NfU1RBVElDKTsKLSAgCi0gIGluaXRWTVRocmVhZCA9IAotICAgIFVQQ0FMTF9NRVRIT0QobG9hZGVyLCAiamF2YS9sYW5nL1ZNVGhyZWFkIiwgIjxpbml0PiIsCi0gICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvVGhyZWFkOylWIiwgQUNDX1ZJUlRVQUwpOwotICAKLSAgcnVuVk1UaHJlYWQgPSAKLSAgICBVUENBTExfTUVUSE9EKGxvYWRlciwgImphdmEvbGFuZy9WTVRocmVhZCIsICJydW4iLCAiKClWIiwgQUNDX1ZJUlRVQUwpOwotCi0KLSAgZ3JvdXBBZGRUaHJlYWQgPSAKLSAgICBVUENBTExfTUVUSE9EKGxvYWRlciwgImphdmEvbGFuZy9UaHJlYWRHcm91cCIsICJhZGRUaHJlYWQiLAotICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL1RocmVhZDspViIsIEFDQ19WSVJUVUFMKTsKLSAgCi0gIGluaXRHcm91cCA9IAotICAgIFVQQ0FMTF9NRVRIT0QobG9hZGVyLCAiamF2YS9sYW5nL1RocmVhZEdyb3VwIiwgIjxpbml0PiIsCi0gICAgICAgICAgICAgICAgICAiKClWIiwgQUNDX1ZJUlRVQUwpOwotICAKLSAgZ3JvdXBOYW1lID0gCi0gICAgVVBDQUxMX0ZJRUxEKGxvYWRlciwgImphdmEvbGFuZy9UaHJlYWRHcm91cCIsICJuYW1lIiwgIkxqYXZhL2xhbmcvU3RyaW5nOyIsCi0gICAgICAgICAgICAgICAgIEFDQ19WSVJUVUFMKTsKLSAgCi0gIHRocmVhZE5hbWUgPSAKLSAgICAgVVBDQUxMX0ZJRUxEKGxvYWRlciwgImphdmEvbGFuZy9UaHJlYWQiLCAibmFtZSIsICJMamF2YS9sYW5nL1N0cmluZzsiLAotICAgICAgICAgICAgICAgICAgQUNDX1ZJUlRVQUwpOwotICAgCi0KLSAgcHJpb3JpdHkgPSAKLSAgICBVUENBTExfRklFTEQobG9hZGVyLCAgImphdmEvbGFuZy9UaHJlYWQiLCAicHJpb3JpdHkiLCAiSSIsIEFDQ19WSVJUVUFMKTsKLQotICBkYWVtb24gPSAKLSAgICBVUENBTExfRklFTEQobG9hZGVyLCAiamF2YS9sYW5nL1RocmVhZCIsICJkYWVtb24iLCAiWiIsIEFDQ19WSVJUVUFMKTsKLQotICBncm91cCA9Ci0gICAgVVBDQUxMX0ZJRUxEKGxvYWRlciwgImphdmEvbGFuZy9UaHJlYWQiLCAiZ3JvdXAiLAotICAgICAgICAgICAgICAgICAiTGphdmEvbGFuZy9UaHJlYWRHcm91cDsiLCBBQ0NfVklSVFVBTCk7Ci0gIAotICBydW5uaW5nID0gCi0gICAgVVBDQUxMX0ZJRUxEKGxvYWRlciwgImphdmEvbGFuZy9WTVRocmVhZCIsICJydW5uaW5nIiwgIloiLCBBQ0NfVklSVFVBTCk7Ci0gIAotICB0aHJlYWRHcm91cCA9IAotICAgIFVQQ0FMTF9DTEFTUyhsb2FkZXIsICJqYXZhL2xhbmcvVGhyZWFkR3JvdXAiKTsKLSAgCi0gIHJvb3RHcm91cCA9Ci0gICAgVVBDQUxMX0ZJRUxEKGxvYWRlciwgImphdmEvbGFuZy9UaHJlYWRHcm91cCIsICJyb290IiwKLSAgICAgICAgICAgICAgICAgIkxqYXZhL2xhbmcvVGhyZWFkR3JvdXA7IiwgQUNDX1NUQVRJQyk7Ci0KLSAgdm1UaHJlYWQgPSAKLSAgICBVUENBTExfRklFTEQobG9hZGVyLCAiamF2YS9sYW5nL1RocmVhZCIsICJ2bVRocmVhZCIsCi0gICAgICAgICAgICAgICAgICJMamF2YS9sYW5nL1ZNVGhyZWFkOyIsIEFDQ19WSVJUVUFMKTsKLSAgCi0gIHVuY2F1Z2h0RXhjZXB0aW9uID0gCi0gICAgVVBDQUxMX01FVEhPRChsb2FkZXIsICJqYXZhL2xhbmcvVGhyZWFkR3JvdXAiLCAgInVuY2F1Z2h0RXhjZXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9UaHJlYWQ7TGphdmEvbGFuZy9UaHJvd2FibGU7KVYiLCBBQ0NfVklSVFVBTCk7Ci0KLSAgCi0gIG1ldGhvZENsYXNzID0KLSAgICBVUENBTExfRklFTEQobG9hZGVyLCAiamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kIiwgImRlY2xhcmluZ0NsYXNzIiwKLSAgICAgICAgICAgICAgICAgIkxqYXZhL2xhbmcvQ2xhc3M7IiwgQUNDX1ZJUlRVQUwpOwotICAKLSAgZmllbGRDbGFzcyA9Ci0gICAgVVBDQUxMX0ZJRUxEKGxvYWRlciwgImphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkIiwgImRlY2xhcmluZ0NsYXNzIiwKLSAgICAgICAgICAgICAgICAgIkxqYXZhL2xhbmcvQ2xhc3M7IiwgQUNDX1ZJUlRVQUwpOwotICAKLSAgY29uc3RydWN0b3JDbGFzcyA9Ci0gICAgVVBDQUxMX0ZJRUxEKGxvYWRlciwgImphdmEvbGFuZy9yZWZsZWN0L0NvbnN0cnVjdG9yIiwgImNsYXp6IiwKLSAgICAgICAgICAgICAgICAgIkxqYXZhL2xhbmcvQ2xhc3M7IiwgQUNDX1ZJUlRVQUwpOwotCi0gIGxvYWRlci0+bG9hZE5hbWUobG9hZGVyLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KCJqYXZhL2xhbmcvU3RyaW5nIiksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZmFsc2UsIE5VTEwpOwotCi0gIGxvYWRlci0+bG9hZE5hbWUobG9hZGVyLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KCJqYXZhL2xhbmcvT2JqZWN0IiksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZmFsc2UsIE5VTEwpOwotICAKLSAgLy8gRG9uJ3QgY29tcGlsZSBtZXRob2RzIGhlcmUsIHdlIHN0aWxsIGRvbid0IGtub3cgd2hlcmUgdG8gYWxsb2NhdGUgSmF2YQotICAvLyBzdHJpbmdzLgotICAKLSAgSmF2YU1ldGhvZCogZ2V0RW52ID0KLSAgICBVUENBTExfTUVUSE9EKGxvYWRlciwgImphdmEvbGFuZy9WTVN5c3RlbSIsICJnZXRlbnYiLAotICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7IiwgQUNDX1NUQVRJQyk7Ci0gIGdldEVudi0+c2V0TmF0aXZlKCk7Ci0KLSAgSmF2YU1ldGhvZCogZ2V0Q2FsbGluZ0NsYXNzID0KLSAgICBVUENBTExfTUVUSE9EKGxvYWRlciwgImdudS9jbGFzc3BhdGgvVk1TdGFja1dhbGtlciIsICJnZXRDYWxsaW5nQ2xhc3MiLAotICAgICAgICAgICAgICAgICAgIigpTGphdmEvbGFuZy9DbGFzczsiLCBBQ0NfU1RBVElDKTsKLSAgZ2V0Q2FsbGluZ0NsYXNzLT5zZXROYXRpdmUoKTsKLSAgCi0gIEphdmFNZXRob2QqIGdldENhbGxpbmdDbGFzc0xvYWRlciA9Ci0gICAgVVBDQUxMX01FVEhPRChsb2FkZXIsICJnbnUvY2xhc3NwYXRoL1ZNU3RhY2tXYWxrZXIiLCAiZ2V0Q2FsbGluZ0NsYXNzTG9hZGVyIiwKLSAgICAgICAgICAgICAgICAgICIoKUxqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7IiwgQUNDX1NUQVRJQyk7Ci0gIGdldENhbGxpbmdDbGFzc0xvYWRlci0+c2V0TmF0aXZlKCk7Ci0gIAotICBKYXZhTWV0aG9kKiBmaXJzdE5vbk51bGxDbGFzc0xvYWRlciA9Ci0gICAgVVBDQUxMX01FVEhPRChsb2FkZXIsICJnbnUvY2xhc3NwYXRoL1ZNU3RhY2tXYWxrZXIiLCAiZmlyc3ROb25OdWxsQ2xhc3NMb2FkZXIiLAotICAgICAgICAgICAgICAgICAgIigpTGphdmEvbGFuZy9DbGFzc0xvYWRlcjsiLCBBQ0NfU1RBVElDKTsKLSAgZmlyc3ROb25OdWxsQ2xhc3NMb2FkZXItPnNldE5hdGl2ZSgpOwotICAKLSAgSmF2YU1ldGhvZCogZ2V0Q2FsbGVyQ2xhc3MgPQotICAgIFVQQ0FMTF9NRVRIT0QobG9hZGVyLCAic3VuL3JlZmxlY3QvUmVmbGVjdGlvbiIsICJnZXRDYWxsZXJDbGFzcyIsCi0gICAgICAgICAgICAgICAgICAiKEkpTGphdmEvbGFuZy9DbGFzczsiLCBBQ0NfU1RBVElDKTsKLSAgZ2V0Q2FsbGVyQ2xhc3MtPnNldE5hdGl2ZSgpOwotICAKLSAgSmF2YU1ldGhvZCogcG9zdFByb3BlcnRpZXMgPQotICAgIFVQQ0FMTF9NRVRIT0QobG9hZGVyLCAiZ251L2NsYXNzcGF0aC9WTVN5c3RlbVByb3BlcnRpZXMiLCAicG9zdEluaXQiLAotICAgICAgICAgICAgICAgICAgIihMamF2YS91dGlsL1Byb3BlcnRpZXM7KVYiLCBBQ0NfU1RBVElDKTsKLSAgcG9zdFByb3BlcnRpZXMtPnNldE5hdGl2ZSgpOwotCi0gIC8vIEFsc28gaW1wbGVtZW50IHRoZXNlIHR3b3MsIGltcGxlbWVudGF0aW9uIGluIEdOVSBDbGFzc3BhdGggMC45Ny4yIGlzIGJ1Z2d5LgotICBKYXZhTWV0aG9kKiBnZXRBbm5vdGF0aW9uID0KLSAgICBVUENBTExfTUVUSE9EKGxvYWRlciwgImphdmEvbGFuZy9yZWZsZWN0L0FjY2Vzc2libGVPYmplY3QiLCAiZ2V0QW5ub3RhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvQ2xhc3M7KUxqYXZhL2xhbmcvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uOyIsCi0gICAgICAgICAgICAgICAgICBBQ0NfVklSVFVBTCk7Ci0gIGdldEFubm90YXRpb24tPnNldE5hdGl2ZSgpOwotICAKLSAgSmF2YU1ldGhvZCogZ2V0QW5ub3RhdGlvbnMgPQotICAgIFVQQ0FMTF9NRVRIT0QobG9hZGVyLCAiamF2YS9sYW5nL3JlZmxlY3QvQWNjZXNzaWJsZU9iamVjdCIsCi0gICAgICAgICAgICAgICAgICAiZ2V0RGVjbGFyZWRBbm5vdGF0aW9ucyIsCi0gICAgICAgICAgICAgICAgICAiKClbTGphdmEvbGFuZy9hbm5vdGF0aW9uL0Fubm90YXRpb247IiwKLSAgICAgICAgICAgICAgICAgIEFDQ19WSVJUVUFMKTsKLSAgZ2V0QW5ub3RhdGlvbnMtPnNldE5hdGl2ZSgpOwotICAKLSAgSmF2YU1ldGhvZCogZ2V0Qm9vdFBhY2thZ2VzID0KLSAgICBVUENBTExfTUVUSE9EKGxvYWRlciwgImphdmEvbGFuZy9WTUNsYXNzTG9hZGVyIiwgImdldEJvb3RQYWNrYWdlcyIsCi0gICAgICAgICAgICAgICAgICAiKClbTGphdmEvbGFuZy9TdHJpbmc7IiwgQUNDX1NUQVRJQyk7Ci0gIGdldEJvb3RQYWNrYWdlcy0+c2V0TmF0aXZlKCk7Ci0gIAotICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotICAvLwotICAvLyBUbyBtYWtlIGNsYXNzZXMgbm9uIEdDLWFsbG9jYXRlZCwgd2UgaGF2ZSB0byBieXBhc3MgdGhlIHRyYWNlciBmdW5jdGlvbnMgb2YKLSAgLy8gamF2YS5sYW5nLkNsYXNzLCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCwgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGFuZAotICAvLyBqYXZhLmxhbmcucmVmbGVjdC5jb25zdHJ1Y3Rvci4gVGhlIG5ldyB0cmFjZXIgZnVuY3Rpb25zIHRyYWNlIHRoZSBjbGFzc2xvYWRlcgotICAvLyBpbnN0ZWFkIG9mIHRoZSBjbGFzcy9maWVsZC9tZXRob2QuCi0gIC8vCi0gIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0gCi0gIG5ld0NsYXNzLT5nZXRWaXJ0dWFsVlQoKS0+c2V0TmF0aXZlVHJhY2VyKAotICAgICAgKHVpbnRwdHJfdCluYXRpdmVKYXZhT2JqZWN0Q2xhc3NUcmFjZXIsCi0gICAgICAgIm5hdGl2ZUphdmFPYmplY3RDbGFzc1RyYWNlciIpOwotCi0gIG5ld0NvbnN0cnVjdG9yLT5nZXRWaXJ0dWFsVlQoKS0+c2V0TmF0aXZlVHJhY2VyKAotICAgICAgKHVpbnRwdHJfdCluYXRpdmVKYXZhT2JqZWN0Q29uc3RydWN0b3JUcmFjZXIsCi0gICAgICAibmF0aXZlSmF2YU9iamVjdENvbnN0cnVjdG9yVHJhY2VyIik7Ci0KLSAgIG5ld01ldGhvZC0+Z2V0VmlydHVhbFZUKCktPnNldE5hdGl2ZVRyYWNlcigKLSAgICAgICh1aW50cHRyX3QpbmF0aXZlSmF2YU9iamVjdE1ldGhvZFRyYWNlciwKLSAgICAgICJuYXRpdmVKYXZhT2JqZWN0TWV0aG9kVHJhY2VyIik7Ci0KLSAgIG5ld0ZpZWxkLT5nZXRWaXJ0dWFsVlQoKS0+c2V0TmF0aXZlVHJhY2VyKAotICAgICAgKHVpbnRwdHJfdCluYXRpdmVKYXZhT2JqZWN0RmllbGRUcmFjZXIsCi0gICAgICAibmF0aXZlSmF2YU9iamVjdEZpZWxkVHJhY2VyIik7IAotICAgCi0gICBuZXdWTVRocmVhZC0+Z2V0VmlydHVhbFZUKCktPnNldE5hdGl2ZVRyYWNlcigKLSAgICAgICh1aW50cHRyX3QpbmF0aXZlSmF2YU9iamVjdFZNVGhyZWFkVHJhY2VyLAotICAgICAgIm5hdGl2ZUphdmFPYmplY3RWTVRocmVhZFRyYWNlciIpOwotIAotICAgbmV3Vk1UaHJlYWQtPmdldFZpcnR1YWxWVCgpLT5zZXROYXRpdmVEZXN0cnVjdG9yKAotICAgICAgKHVpbnRwdHJfdCluYXRpdmVKYXZhT2JqZWN0Vk1UaHJlYWREZXN0cnVjdG9yLAotICAgICAgIm5hdGl2ZUphdmFPYmplY3RWTVRocmVhZERlc3RydWN0b3IiKTsKLQotICAgCi0gIG5ld1JlZmVyZW5jZSA9IFVQQ0FMTF9DTEFTUyhsb2FkZXIsICJqYXZhL2xhbmcvcmVmL1JlZmVyZW5jZSIpOwotICAgIAotICBFbnF1ZXVlUmVmZXJlbmNlID0gCi0gICAgVVBDQUxMX01FVEhPRChsb2FkZXIsICJqYXZhL2xhbmcvcmVmL1JlZmVyZW5jZSIsICAiZW5xdWV1ZSIsICIoKVoiLAotICAgICAgICAgICAgICAgICAgQUNDX1ZJUlRVQUwpOwotIAotICBKYXZhTWV0aG9kKiBpbml0V2Vha1JlZmVyZW5jZSA9Ci0gICAgVVBDQUxMX01FVEhPRChsb2FkZXIsICJqYXZhL2xhbmcvcmVmL1dlYWtSZWZlcmVuY2UiLCAiPGluaXQ+IiwKLSAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9PYmplY3Q7KVYiLAotICAgICAgICAgICAgICAgICAgQUNDX1ZJUlRVQUwpOwotICBpbml0V2Vha1JlZmVyZW5jZS0+c2V0TmF0aXZlKCk7Ci0gIAotICBpbml0V2Vha1JlZmVyZW5jZSA9Ci0gICAgVVBDQUxMX01FVEhPRChsb2FkZXIsICJqYXZhL2xhbmcvcmVmL1dlYWtSZWZlcmVuY2UiLCAiPGluaXQ+IiwKLSAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9yZWYvUmVmZXJlbmNlUXVldWU7KVYiLAotICAgICAgICAgICAgICAgICAgQUNDX1ZJUlRVQUwpOwotICBpbml0V2Vha1JlZmVyZW5jZS0+c2V0TmF0aXZlKCk7Ci0gIAotICBKYXZhTWV0aG9kKiBpbml0U29mdFJlZmVyZW5jZSA9Ci0gICAgVVBDQUxMX01FVEhPRChsb2FkZXIsICJqYXZhL2xhbmcvcmVmL1NvZnRSZWZlcmVuY2UiLCAiPGluaXQ+IiwKLSAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9PYmplY3Q7KVYiLAotICAgICAgICAgICAgICAgICAgQUNDX1ZJUlRVQUwpOwotICBpbml0U29mdFJlZmVyZW5jZS0+c2V0TmF0aXZlKCk7Ci0gIAotICBpbml0U29mdFJlZmVyZW5jZSA9Ci0gICAgVVBDQUxMX01FVEhPRChsb2FkZXIsICJqYXZhL2xhbmcvcmVmL1NvZnRSZWZlcmVuY2UiLCAiPGluaXQ+IiwKLSAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9yZWYvUmVmZXJlbmNlUXVldWU7KVYiLAotICAgICAgICAgICAgICAgICAgQUNDX1ZJUlRVQUwpOwotICBpbml0U29mdFJlZmVyZW5jZS0+c2V0TmF0aXZlKCk7Ci0gIAotICBKYXZhTWV0aG9kKiBpbml0UGhhbnRvbVJlZmVyZW5jZSA9Ci0gICAgVVBDQUxMX01FVEhPRChsb2FkZXIsICJqYXZhL2xhbmcvcmVmL1BoYW50b21SZWZlcmVuY2UiLCAiPGluaXQ+IiwKLSAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9yZWYvUmVmZXJlbmNlUXVldWU7KVYiLAotICAgICAgICAgICAgICAgICAgQUNDX1ZJUlRVQUwpOwotICBpbml0UGhhbnRvbVJlZmVyZW5jZS0+c2V0TmF0aXZlKCk7Ci19Ci0KLSNpbmNsdWRlICJDbGFzc3BhdGhDb25zdHJ1Y3Rvci5pbmMiCi0jaW5jbHVkZSAiQ2xhc3NwYXRoLmluYyIKLSNpbmNsdWRlICJDbGFzc3BhdGhGaWVsZC5pbmMiCi0jaW5jbHVkZSAiQ2xhc3NwYXRoTWV0aG9kLmluYyIKLSNpbmNsdWRlICJDbGFzc3BhdGhWTUNsYXNzLmluYyIKLSNpbmNsdWRlICJDbGFzc3BhdGhWTUNsYXNzTG9hZGVyLmluYyIKLSNpbmNsdWRlICJDbGFzc3BhdGhWTU9iamVjdC5pbmMiCi0jaW5jbHVkZSAiQ2xhc3NwYXRoVk1SdW50aW1lLmluYyIKLSNpbmNsdWRlICJDbGFzc3BhdGhWTVN0YWNrV2Fsa2VyLmluYyIKLSNpbmNsdWRlICJDbGFzc3BhdGhWTVN5c3RlbS5pbmMiCi0jaW5jbHVkZSAiQ2xhc3NwYXRoVk1TeXN0ZW1Qcm9wZXJ0aWVzLmluYyIKLSNpbmNsdWRlICJDbGFzc3BhdGhWTVRocmVhZC5pbmMiCi0jaW5jbHVkZSAiQ2xhc3NwYXRoVk1UaHJvd2FibGUuaW5jIgpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL0ozL0NsYXNzcGF0aC9KYXZhVXBjYWxscy5oIGIvdm1raXQvbGliL0ozL0NsYXNzcGF0aC9KYXZhVXBjYWxscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGI2NDZlLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9KMy9DbGFzc3BhdGgvSmF2YVVwY2FsbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0gSmF2YVVwY2FsbHMuaCAtIFVwY2FsbHMgdG8gSmF2YSBlbnRpdGllcyAtLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2lmbmRlZiBKTkpWTV9KQVZBX1VQQ0FMTFNfSAotI2RlZmluZSBKTkpWTV9KQVZBX1VQQ0FMTFNfSAotCi0jaW5jbHVkZSAibXZtL0FsbG9jYXRvci5oIgotCi0jaW5jbHVkZSAiSm5qdm1Db25maWcuaCIKLQotI2RlZmluZSBVUENBTExfQ0xBU1Modm0sIG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdm0tPmxvYWROYW1lKHZtLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KG5hbWUpLCB0cnVlLCBmYWxzZSwgTlVMTCkKLQotI2RlZmluZSBVUENBTExfUFJJTUlUSVZFX0NMQVNTKGxvYWRlciwgbmFtZSwgbmIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgbmV3KGxvYWRlci0+YWxsb2NhdG9yLCAiUHJpbWl0aXZlIGNsYXNzIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgVXNlckNsYXNzUHJpbWl0aXZlKGxvYWRlciwgbG9hZGVyLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KG5hbWUpLCBuYikgICAgXAotCi0jZGVmaW5lIFVQQ0FMTF9GSUVMRCh2bSwgY2wsIG5hbWUsIHR5cGUsIGFjYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBVUENBTExfQ0xBU1Modm0sIGNsKS0+bG9va3VwRmllbGREb250VGhyb3codm0tPmFzY2lpekNvbnN0cnVjdFVURjgobmFtZSksICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KHR5cGUpLCAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1N0YXRpYyhhY2MpLCBmYWxzZSwgMCkKLQotI2RlZmluZSBVUENBTExfTUVUSE9EKHZtLCBjbCwgbmFtZSwgdHlwZSwgYWNjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgVVBDQUxMX0NMQVNTKHZtLCBjbCktPmxvb2t1cE1ldGhvZERvbnRUaHJvdyh2bS0+YXNjaWl6Q29uc3RydWN0VVRGOChuYW1lKSwgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0tPmFzY2lpekNvbnN0cnVjdFVURjgodHlwZSksICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU3RhdGljKGFjYyksIGZhbHNlLCAwKQotCi0jZGVmaW5lIFVQQ0FMTF9BUlJBWV9DTEFTUyhsb2FkZXIsIG5hbWUsIGRlcHRoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBsb2FkZXItPmNvbnN0cnVjdEFycmF5KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsb2FkZXItPmNvbnN0cnVjdEFycmF5TmFtZShkZXB0aCwgbG9hZGVyLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KG5hbWUpKSkgICAgICAgCi0KLSNkZWZpbmUgVVBDQUxMX0NMQVNTX0VYQ0VQVElPTihsb2FkZXIsIG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG5hbWUgPSBVUENBTExfQ0xBU1MobG9hZGVyLCAiamF2YS9sYW5nLyIjbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotI2RlZmluZSBVUENBTExfUkVGTEVDVF9DTEFTU19FWENFUFRJT04obG9hZGVyLCBuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgbmFtZSA9IFVQQ0FMTF9DTEFTUyhsb2FkZXIsICJqYXZhL2xhbmcvcmVmbGVjdC8iI25hbWUpICAgICAgICAgICAgICAgICAgIAotCi0jZGVmaW5lIFVQQ0FMTF9NRVRIT0RfRVhDRVBUSU9OKGxvYWRlciwgbmFtZSkgXAotICBJbml0IyNuYW1lID0gbmFtZS0+bG9va3VwTWV0aG9kRG9udFRocm93KGxvYWRlci0+YXNjaWl6Q29uc3RydWN0VVRGOCgiPGluaXQ+IiksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXItPmFzY2lpekNvbnN0cnVjdFVURjgoIihMamF2YS9sYW5nL1N0cmluZzspViIpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKLQotI2RlZmluZSBVUENBTExfTUVUSE9EX1dJVEhfRVhDRVBUSU9OKGxvYWRlciwgbmFtZSkgXAotICBFcnJvcldpdGhFeGNwIyNuYW1lID0gbmFtZS0+bG9va3VwTWV0aG9kRG9udFRocm93KGxvYWRlci0+YXNjaWl6Q29uc3RydWN0VVRGOCgiPGluaXQ+IiksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXItPmFzY2lpekNvbnN0cnVjdFVURjgoIihMamF2YS9sYW5nL1Rocm93YWJsZTspViIpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCAwKTsKLQotbmFtZXNwYWNlIGozIHsKLQotY2xhc3MgSm5qdm07Ci1jbGFzcyBKYXZhRmllbGQ7Ci1jbGFzcyBKYXZhTWV0aG9kOwotY2xhc3MgQ2xhc3M7Ci1jbGFzcyBDbGFzc0FycmF5OwotCi0jaWYgZGVmaW5lZChfX01BQ0hfXykKLSNkZWZpbmUgU0VMRl9IQU5ETEUgUlRMRF9ERUZBVUxUCi0jZGVmaW5lIERZTERfRVhURU5TSU9OICIuZHlsaWIiCi0jZWxzZQotI2RlZmluZSBTRUxGX0hBTkRMRSAwCi0jZGVmaW5lIERZTERfRVhURU5TSU9OICIuc28iCi0jZW5kaWYKLQotY2xhc3MgQ2xhc3NwYXRoIDogcHVibGljIG12bTo6UGVybWFuZW50T2JqZWN0IHsKLXB1YmxpYzogCi0JQ2xhc3NwYXRoKEpuanZtQm9vdHN0cmFwTG9hZGVyKiBsb2FkZXIsIGJvb2wgZGxMb2FkKTsKLQotICB2b2lkIHBvc3RJbml0aWFsaXNlQ2xhc3NwYXRoKEpuanZtQ2xhc3NMb2FkZXIqIGxvYWRlcik7Ci0KLSAgVXNlckNsYXNzKiAgbmV3Q2xhc3NMb2FkZXI7Ci0gIEphdmFNZXRob2QqIGdldFN5c3RlbUNsYXNzTG9hZGVyOwotICBKYXZhTWV0aG9kKiBzZXRDb250ZXh0Q2xhc3NMb2FkZXI7Ci0gIFVzZXJDbGFzcyogbmV3U3RyaW5nOwotICBVc2VyQ2xhc3MqIG5ld0NsYXNzOwotICBVc2VyQ2xhc3MqIG5ld1Rocm93YWJsZTsKLSAgVXNlckNsYXNzKiBuZXdFeGNlcHRpb247Ci0gIEphdmFNZXRob2QqIGluaXRDbGFzczsKLSAgSmF2YU1ldGhvZCogaW5pdENsYXNzV2l0aFByb3RlY3Rpb25Eb21haW47Ci0gIEphdmFGaWVsZCogdm1kYXRhQ2xhc3M7Ci0gIEphdmFNZXRob2QqIHNldFByb3BlcnR5OwotICBKYXZhTWV0aG9kKiBpbml0U3RyaW5nOwotICBKYXZhTWV0aG9kKiBnZXRDYWxsaW5nQ2xhc3NMb2FkZXI7Ci0gIEphdmFNZXRob2QqIGluaXRDb25zdHJ1Y3RvcjsKLSAgVXNlckNsYXNzQXJyYXkqIGNvbnN0cnVjdG9yQXJyYXlDbGFzczsKLSAgVXNlckNsYXNzQXJyYXkqIGNvbnN0cnVjdG9yQXJyYXlBbm5vdGF0aW9uOwotICBVc2VyQ2xhc3MqICAgICAgbmV3Q29uc3RydWN0b3I7Ci0gIEphdmFGaWVsZCogIGNvbnN0cnVjdG9yU2xvdDsKLSAgSmF2YU1ldGhvZCogaW5pdE1ldGhvZDsKLSAgSmF2YU1ldGhvZCogaW5pdEZpZWxkOwotICBVc2VyQ2xhc3NBcnJheSogbWV0aG9kQXJyYXlDbGFzczsKLSAgVXNlckNsYXNzQXJyYXkqIGZpZWxkQXJyYXlDbGFzczsKLSAgVXNlckNsYXNzKiAgICAgIG5ld01ldGhvZDsKLSAgVXNlckNsYXNzKiAgICAgIG5ld0ZpZWxkOwotICBKYXZhRmllbGQqICBtZXRob2RTbG90OwotICBKYXZhRmllbGQqICBmaWVsZFNsb3Q7Ci0gIFVzZXJDbGFzc0FycmF5KiBjbGFzc0FycmF5Q2xhc3M7Ci0gIEphdmFNZXRob2QqIGxvYWRJbkNsYXNzTG9hZGVyOwotICBKYXZhTWV0aG9kKiBpbml0Vk1UaHJvd2FibGU7Ci0gIEphdmFGaWVsZCogIHZtRGF0YVZNVGhyb3dhYmxlOwotICBVc2VyQ2xhc3MqICBuZXdWTVRocm93YWJsZTsKLSAgSmF2YUZpZWxkKiAgYnVmZmVyQWRkcmVzczsKLSAgSmF2YUZpZWxkKiAgZGF0YVBvaW50ZXIzMjsKLSAgSmF2YUZpZWxkKiAgZGF0YVBvaW50ZXI2NDsKLSAgVXNlckNsYXNzKiAgbmV3UG9pbnRlcjMyOwotICBVc2VyQ2xhc3MqICBuZXdQb2ludGVyNjQ7Ci0gIFVzZXJDbGFzcyogIG5ld0RpcmVjdEJ5dGVCdWZmZXI7Ci0gIEphdmFNZXRob2QqIEluaXREaXJlY3RCeXRlQnVmZmVyOwotICBKYXZhRmllbGQqICB2bWRhdGFDbGFzc0xvYWRlcjsKLQotICBKYXZhRmllbGQqIGJvb2xWYWx1ZTsKLSAgSmF2YUZpZWxkKiBieXRlVmFsdWU7Ci0gIEphdmFGaWVsZCogc2hvcnRWYWx1ZTsKLSAgSmF2YUZpZWxkKiBjaGFyVmFsdWU7Ci0gIEphdmFGaWVsZCogaW50VmFsdWU7Ci0gIEphdmFGaWVsZCogbG9uZ1ZhbHVlOwotICBKYXZhRmllbGQqIGZsb2F0VmFsdWU7Ci0gIEphdmFGaWVsZCogZG91YmxlVmFsdWU7Ci0KLSAgVXNlckNsYXNzKiBuZXdTdGFja1RyYWNlRWxlbWVudDsKLSAgVXNlckNsYXNzQXJyYXkqIHN0YWNrVHJhY2VBcnJheTsKLSAgSmF2YU1ldGhvZCogaW5pdFN0YWNrVHJhY2VFbGVtZW50OwotICAKLSAgVXNlckNsYXNzKiB2b2lkQ2xhc3M7Ci0gIFVzZXJDbGFzcyogYm9vbENsYXNzOwotICBVc2VyQ2xhc3MqIGJ5dGVDbGFzczsKLSAgVXNlckNsYXNzKiBzaG9ydENsYXNzOwotICBVc2VyQ2xhc3MqIGNoYXJDbGFzczsKLSAgVXNlckNsYXNzKiBpbnRDbGFzczsKLSAgVXNlckNsYXNzKiBmbG9hdENsYXNzOwotICBVc2VyQ2xhc3MqIGRvdWJsZUNsYXNzOwotICBVc2VyQ2xhc3MqIGxvbmdDbGFzczsKLSAgCi0gIFVzZXJDbGFzcyogdm1TdGFja1dhbGtlcjsKLSAgCi0gIFVzZXJDbGFzcyogbmV3VGhyZWFkOwotICBVc2VyQ2xhc3MqIG5ld1ZNVGhyZWFkOwotICBKYXZhRmllbGQqIGFzc29jVGhyZWFkOwotICBKYXZhRmllbGQqIHZtZGF0YVZNVGhyZWFkOwotICBKYXZhTWV0aG9kKiBmaW5hbGlzZUNyZWF0ZUluaXRpYWxUaHJlYWQ7Ci0gIEphdmFNZXRob2QqIGluaXRWTVRocmVhZDsKLSAgSmF2YU1ldGhvZCogcnVuVk1UaHJlYWQ7Ci0gIEphdmFNZXRob2QqIGdyb3VwQWRkVGhyZWFkOwotICBKYXZhRmllbGQqIHRocmVhZE5hbWU7Ci0gIEphdmFGaWVsZCogZ3JvdXBOYW1lOwotICBKYXZhTWV0aG9kKiBpbml0R3JvdXA7Ci0gIEphdmFGaWVsZCogcHJpb3JpdHk7Ci0gIEphdmFGaWVsZCogZGFlbW9uOwotICBKYXZhRmllbGQqIGdyb3VwOwotICBKYXZhRmllbGQqIHJ1bm5pbmc7Ci0gIFVzZXJDbGFzcyogdGhyZWFkR3JvdXA7Ci0gIEphdmFGaWVsZCogcm9vdEdyb3VwOwotICBKYXZhRmllbGQqIHZtVGhyZWFkOwotICBKYXZhTWV0aG9kKiB1bmNhdWdodEV4Y2VwdGlvbjsKLSAgVXNlckNsYXNzKiAgaW5oZXJpdGFibGVUaHJlYWRMb2NhbDsKLSAgCi0KLSAgVXNlckNsYXNzKiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotICBVc2VyQ2xhc3MqIEFycmF5U3RvcmVFeGNlcHRpb247Ci0gIFVzZXJDbGFzcyogQ2xhc3NDYXN0RXhjZXB0aW9uOwotICBVc2VyQ2xhc3MqIElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb247Ci0gIFVzZXJDbGFzcyogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwotICBVc2VyQ2xhc3MqIEludGVycnVwdGVkRXhjZXB0aW9uOwotICBVc2VyQ2xhc3MqIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb247Ci0gIFVzZXJDbGFzcyogQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uOwotICBVc2VyQ2xhc3MqIE5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uOwotICBVc2VyQ2xhc3MqIE51bGxQb2ludGVyRXhjZXB0aW9uOwotICBVc2VyQ2xhc3MqIFNlY3VyaXR5RXhjZXB0aW9uOwotICBVc2VyQ2xhc3MqIENsYXNzRm9ybWF0RXJyb3I7Ci0gIFVzZXJDbGFzcyogQ2xhc3NDaXJjdWxhcml0eUVycm9yOwotICBVc2VyQ2xhc3MqIE5vQ2xhc3NEZWZGb3VuZEVycm9yOwotICBVc2VyQ2xhc3MqIFVuc3VwcG9ydGVkQ2xhc3NWZXJzaW9uRXJyb3I7Ci0gIFVzZXJDbGFzcyogTm9TdWNoRmllbGRFcnJvcjsKLSAgVXNlckNsYXNzKiBOb1N1Y2hNZXRob2RFcnJvcjsKLSAgVXNlckNsYXNzKiBJbnN0YW50aWF0aW9uRXJyb3I7Ci0gIFVzZXJDbGFzcyogSW5zdGFudGlhdGlvbkV4Y2VwdGlvbjsKLSAgVXNlckNsYXNzKiBJbGxlZ2FsQWNjZXNzRXJyb3I7Ci0gIFVzZXJDbGFzcyogSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsKLSAgVXNlckNsYXNzKiBWZXJpZnlFcnJvcjsKLSAgVXNlckNsYXNzKiBFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3I7Ci0gIFVzZXJDbGFzcyogTGlua2FnZUVycm9yOwotICBVc2VyQ2xhc3MqIEFic3RyYWN0TWV0aG9kRXJyb3I7Ci0gIFVzZXJDbGFzcyogVW5zYXRpc2ZpZWRMaW5rRXJyb3I7Ci0gIFVzZXJDbGFzcyogSW50ZXJuYWxFcnJvcjsKLSAgVXNlckNsYXNzKiBPdXRPZk1lbW9yeUVycm9yOwotICBVc2VyQ2xhc3MqIFN0YWNrT3ZlcmZsb3dFcnJvcjsKLSAgVXNlckNsYXNzKiBVbmtub3duRXJyb3I7Ci0gIFVzZXJDbGFzcyogQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsKLSAgVXNlckNsYXNzKiBBcml0aG1ldGljRXhjZXB0aW9uOwotCi0gIEphdmFNZXRob2QqIEluaXRJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotICBKYXZhTWV0aG9kKiBJbml0QXJyYXlTdG9yZUV4Y2VwdGlvbjsKLSAgSmF2YU1ldGhvZCogSW5pdENsYXNzQ2FzdEV4Y2VwdGlvbjsKLSAgSmF2YU1ldGhvZCogSW5pdElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb247Ci0gIEphdmFNZXRob2QqIEluaXRJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247Ci0gIEphdmFNZXRob2QqIEluaXRJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLSAgSmF2YU1ldGhvZCogSW5pdEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb247Ci0gIEphdmFNZXRob2QqIEluaXRBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb247Ci0gIEphdmFNZXRob2QqIEluaXROZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbjsKLSAgSmF2YU1ldGhvZCogSW5pdE51bGxQb2ludGVyRXhjZXB0aW9uOwotICBKYXZhTWV0aG9kKiBJbml0U2VjdXJpdHlFeGNlcHRpb247Ci0gIEphdmFNZXRob2QqIEluaXRDbGFzc0Zvcm1hdEVycm9yOwotICBKYXZhTWV0aG9kKiBJbml0Q2xhc3NDaXJjdWxhcml0eUVycm9yOwotICBKYXZhTWV0aG9kKiBJbml0Tm9DbGFzc0RlZkZvdW5kRXJyb3I7Ci0gIEphdmFNZXRob2QqIEluaXRVbnN1cHBvcnRlZENsYXNzVmVyc2lvbkVycm9yOwotICBKYXZhTWV0aG9kKiBJbml0Tm9TdWNoRmllbGRFcnJvcjsKLSAgSmF2YU1ldGhvZCogSW5pdE5vU3VjaE1ldGhvZEVycm9yOwotICBKYXZhTWV0aG9kKiBJbml0SW5zdGFudGlhdGlvbkVycm9yOwotICBKYXZhTWV0aG9kKiBJbml0SW5zdGFudGlhdGlvbkV4Y2VwdGlvbjsKLSAgSmF2YU1ldGhvZCogSW5pdElsbGVnYWxBY2Nlc3NFcnJvcjsKLSAgSmF2YU1ldGhvZCogSW5pdElsbGVnYWxBY2Nlc3NFeGNlcHRpb247Ci0gIEphdmFNZXRob2QqIEluaXRWZXJpZnlFcnJvcjsKLSAgSmF2YU1ldGhvZCogSW5pdEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcjsKLSAgSmF2YU1ldGhvZCogSW5pdExpbmthZ2VFcnJvcjsKLSAgSmF2YU1ldGhvZCogSW5pdEFic3RyYWN0TWV0aG9kRXJyb3I7Ci0gIEphdmFNZXRob2QqIEluaXRVbnNhdGlzZmllZExpbmtFcnJvcjsKLSAgSmF2YU1ldGhvZCogSW5pdEludGVybmFsRXJyb3I7Ci0gIEphdmFNZXRob2QqIEluaXRPdXRPZk1lbW9yeUVycm9yOwotICBKYXZhTWV0aG9kKiBJbml0U3RhY2tPdmVyZmxvd0Vycm9yOwotICBKYXZhTWV0aG9kKiBJbml0VW5rbm93bkVycm9yOwotICBKYXZhTWV0aG9kKiBJbml0Q2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsKLSAgSmF2YU1ldGhvZCogSW5pdEFyaXRobWV0aWNFeGNlcHRpb247Ci0gIAotICBKYXZhTWV0aG9kKiBTeXN0ZW1BcnJheWNvcHk7Ci0gIEphdmFNZXRob2QqIFZNU3lzdGVtQXJyYXljb3B5OwotICBDbGFzcyogICAgICBTeXN0ZW1DbGFzczsKLSAgCi0gIEphdmFNZXRob2QqIEludFRvU3RyaW5nOwotCi0gIEphdmFNZXRob2QqIEluaXRPYmplY3Q7Ci0gIEphdmFNZXRob2QqIEZpbmFsaXplT2JqZWN0OwotCi0gIEphdmFNZXRob2QqIEVycm9yV2l0aEV4Y3BOb0NsYXNzRGVmRm91bmRFcnJvcjsKLSAgSmF2YU1ldGhvZCogRXJyb3JXaXRoRXhjcEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcjsKLSAgSmF2YU1ldGhvZCogRXJyb3JXaXRoRXhjcEludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0gIAotICAKLQotICBVc2VyQ2xhc3NBcnJheSogQXJyYXlPZkJ5dGU7Ci0gIFVzZXJDbGFzc0FycmF5KiBBcnJheU9mQ2hhcjsKLSAgVXNlckNsYXNzQXJyYXkqIEFycmF5T2ZJbnQ7Ci0gIFVzZXJDbGFzc0FycmF5KiBBcnJheU9mU2hvcnQ7Ci0gIFVzZXJDbGFzc0FycmF5KiBBcnJheU9mQm9vbDsKLSAgVXNlckNsYXNzQXJyYXkqIEFycmF5T2ZMb25nOwotICBVc2VyQ2xhc3NBcnJheSogQXJyYXlPZkZsb2F0OwotICBVc2VyQ2xhc3NBcnJheSogQXJyYXlPZkRvdWJsZTsKLSAgVXNlckNsYXNzQXJyYXkqIEFycmF5T2ZPYmplY3Q7Ci0gIFVzZXJDbGFzc0FycmF5KiBBcnJheU9mU3RyaW5nOwotICAKLSAgVXNlckNsYXNzUHJpbWl0aXZlKiBPZkJ5dGU7Ci0gIFVzZXJDbGFzc1ByaW1pdGl2ZSogT2ZDaGFyOwotICBVc2VyQ2xhc3NQcmltaXRpdmUqIE9mSW50OwotICBVc2VyQ2xhc3NQcmltaXRpdmUqIE9mU2hvcnQ7Ci0gIFVzZXJDbGFzc1ByaW1pdGl2ZSogT2ZCb29sOwotICBVc2VyQ2xhc3NQcmltaXRpdmUqIE9mTG9uZzsKLSAgVXNlckNsYXNzUHJpbWl0aXZlKiBPZkZsb2F0OwotICBVc2VyQ2xhc3NQcmltaXRpdmUqIE9mRG91YmxlOwotICBVc2VyQ2xhc3NQcmltaXRpdmUqIE9mVm9pZDsKLQotICBVc2VyQ2xhc3MqIE9mT2JqZWN0OwotICAKLSAgSmF2YUZpZWxkKiBtZXRob2RDbGFzczsKLSAgSmF2YUZpZWxkKiBmaWVsZENsYXNzOwotICBKYXZhRmllbGQqIGNvbnN0cnVjdG9yQ2xhc3M7Ci0gIAotICBKYXZhTWV0aG9kKiBFbnF1ZXVlUmVmZXJlbmNlOwotICBDbGFzcyogICAgICBuZXdSZWZlcmVuY2U7Ci0KLSAgLy8vIHVwY2FsbHMgLSBVcGNhbGwgY2xhc3NlcywgZmllbGRzIGFuZCBtZXRob2RzIHNvIHRoYXQgQysrIGNvZGUgY2FuIGNhbGwKLSAgLy8vIEphdmEgY29kZS4KLSAgLy8vCi0gIENsYXNzcGF0aCogdXBjYWxsczsKLSAgCi0gIC8vLyBJbnRlcmZhY2VzQXJyYXkgLSBUaGUgaW50ZXJmYWNlcyB0aGF0IGFycmF5IGNsYXNzZXMgaW1wbGVtZW50LgotICAvLy8KLSAgVXNlckNsYXNzKiogSW50ZXJmYWNlc0FycmF5OwotCi0gIC8vLyBTdXBlckFycmF5IC0gVGhlIHN1cGVyIG9mIGFycmF5IGNsYXNzZXMuCi0gIFVzZXJDbGFzcyogU3VwZXJBcnJheTsKLQotICAvLy8gTGlzdHMgb2YgVVRGOHMgdXNlZCBpbnRlcm5hbHkgaW4gVk1LaXQuCi0gIGNvbnN0IFVURjgqIE5vQ2xhc3NEZWZGb3VuZEVycm9yTmFtZTsKLSAgY29uc3QgVVRGOCogaW5pdE5hbWU7Ci0gIGNvbnN0IFVURjgqIGNsaW5pdE5hbWU7Ci0gIGNvbnN0IFVURjgqIGNsaW5pdFR5cGU7IAotICBjb25zdCBVVEY4KiBpbml0RXhjZXB0aW9uU2lnOwotICBjb25zdCBVVEY4KiBydW5OYW1lOyAKLSAgY29uc3QgVVRGOCogcHJlbGliOyAKLSAgY29uc3QgVVRGOCogcG9zdGxpYjsgCi0gIGNvbnN0IFVURjgqIG1hdGhOYW1lOwotICBjb25zdCBVVEY4KiBzdGFja1dhbGtlck5hbWU7Ci0gIGNvbnN0IFVURjgqIGFiczsKLSAgY29uc3QgVVRGOCogc3FydDsKLSAgY29uc3QgVVRGOCogc2luOwotICBjb25zdCBVVEY4KiBjb3M7Ci0gIGNvbnN0IFVURjgqIHRhbjsKLSAgY29uc3QgVVRGOCogYXNpbjsKLSAgY29uc3QgVVRGOCogYWNvczsKLSAgY29uc3QgVVRGOCogYXRhbjsKLSAgY29uc3QgVVRGOCogYXRhbjI7Ci0gIGNvbnN0IFVURjgqIGV4cDsKLSAgY29uc3QgVVRGOCogbG9nOwotICBjb25zdCBVVEY4KiBwb3c7Ci0gIGNvbnN0IFVURjgqIGNlaWw7Ci0gIGNvbnN0IFVURjgqIGZsb29yOwotICBjb25zdCBVVEY4KiByaW50OwotICBjb25zdCBVVEY4KiBjYnJ0OwotICBjb25zdCBVVEY4KiBjb3NoOwotICBjb25zdCBVVEY4KiBleHBtMTsKLSAgY29uc3QgVVRGOCogaHlwb3Q7Ci0gIGNvbnN0IFVURjgqIGxvZzEwOwotICBjb25zdCBVVEY4KiBsb2cxcDsKLSAgY29uc3QgVVRGOCogc2luaDsKLSAgY29uc3QgVVRGOCogdGFuaDsKLSAgY29uc3QgVVRGOCogZmluYWxpemU7Ci0KLSAgLy8vIHByaW1pdGl2ZU1hcCAtIE1hcCBvZiBwcmltaXRpdmUgY2xhc3NlcywgaGFzaGVkIGJ5IGlkLgotICBzdGQ6Om1hcDxjb25zdCBjaGFyLCBVc2VyQ2xhc3NQcmltaXRpdmUqPiBwcmltaXRpdmVNYXA7Ci0KLSAgVXNlckNsYXNzUHJpbWl0aXZlKiBnZXRQcmltaXRpdmVDbGFzcyhjaGFyIGlkKSB7Ci0gICAgcmV0dXJuIHByaW1pdGl2ZU1hcFtpZF07Ci0gIH0KLQotICAvLy8gYXJyYXlUYWJsZSAtIFRhYmxlIG9mIGFycmF5IGNsYXNzZXMuCi0gIFVzZXJDbGFzc0FycmF5KiBhcnJheVRhYmxlWzhdOwotCi0gIFVzZXJDbGFzc0FycmF5KiBnZXRBcnJheUNsYXNzKHVuc2lnbmVkIGlkKSB7Ci0gICAgcmV0dXJuIGFycmF5VGFibGVbaWQgLSA0XTsKLSAgfQotCi1wcml2YXRlOgotICB2b2lkIENyZWF0ZUphdmFUaHJlYWQoSm5qdm0qIHZtLCBKYXZhVGhyZWFkKiBteXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwgSmF2YU9iamVjdCogR3JvdXApOwotCi1wdWJsaWM6Ci0gIHZvaWQgSW5pdGlhbGl6ZVRocmVhZGluZyhKbmp2bSogdm0pOwotCi0gIHZvaWQgQ3JlYXRlRm9yZWlnbkphdmFUaHJlYWQoSm5qdm0qIHZtLCBKYXZhVGhyZWFkKiBteXRoKTsKLX07Ci0KLQotfSAvLyBlbmQgbmFtZXNwYWNlIGozCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL0ozL0NsYXNzcGF0aC9NYWtlZmlsZSBiL3Zta2l0L2xpYi9KMy9DbGFzc3BhdGgvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZmQwZDguLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL0ozL0NsYXNzcGF0aC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMjPT09LSBsaWIvSm5KVk0vQ2xhc3NwYXRoL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCi0jIAotIyAgICAgICAgICAgICAgICAgICAgIFRoZSB2bWtpdCBwcm9qZWN0Ci0jCi0jIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0jIAotIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKLUxFVkVMID0gLi4vLi4vLi4KLQotCi1FWFRSQV9ESVNUID0gQ2xhc3NwYXRoQ29uc3RydWN0b3IuaW5jIENsYXNzcGF0aEZpZWxkLmluYyBDbGFzc3BhdGguaW5jIENsYXNzcGF0aE1ldGhvZC5pbmMgXAotCSAgICAgQ2xhc3NwYXRoVk1DbGFzcy5pbmMgQ2xhc3NwYXRoVk1DbGFzc0xvYWRlci5pbmMgQ2xhc3NwYXRoVk1PYmplY3QuaW5jIFwKLQkgICAgIENsYXNzcGF0aFZNUnVudGltZS5pbmMgQ2xhc3NwYXRoVk1TdGFja1dhbGtlci5pbmMgQ2xhc3NwYXRoVk1TeXN0ZW0uaW5jIFwKLQkgICAgIENsYXNzcGF0aFZNU3lzdGVtUHJvcGVydGllcy5pbmMgQ2xhc3NwYXRoVk1UaHJlYWQuaW5jIENsYXNzcGF0aFZNVGhyb3dhYmxlLmluYwotCi1pbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbmZpZwotCi1pZmVxICgkKFdJVEhfTExWTV9HQ0MpLCAxKQotICBNT0RVTEVfTkFNRSA9IENsYXNzcGF0aAotZWxzZQotICBMSUJSQVJZTkFNRSA9IENsYXNzcGF0aAotZW5kaWYKLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KLQotQ1hYLkZsYWdzICs9IC1JJChQUk9KX1NSQ19ESVIpLy4uL1ZNQ29yZSAkKENMQVNTUEFUSF9GTEFHUykKLQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL0ozL0NvbXBpbGVyL0V4Y2VwdGlvbnNDaGVjay5pbmMgYi92bWtpdC9saWIvSjMvQ29tcGlsZXIvRXhjZXB0aW9uc0NoZWNrLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMzODA2Ny4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvSjMvQ29tcGlsZXIvRXhjZXB0aW9uc0NoZWNrLmluYworKysgL2Rldi9udWxsCkBAIC0xLDQ4MCArMCwwIEBACi1JbnN0cnVjdGlvbiogSmF2YUpJVDo6aW52b2tlKFZhbHVlICpGLCBzdGQ6OnZlY3RvcjxsbHZtOjpWYWx1ZSo+JiBhcmdzLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgewotICAKLSAgSW5zdHJ1Y3Rpb24qIHJlcyA9IENhbGxJbnN0OjpDcmVhdGUoRiwgYXJncy5iZWdpbigpLCBhcmdzLmVuZCgpLCBOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnNlcnRBdEVuZCk7Ci0gIERlYnVnTG9jIERMID0gQ3JlYXRlTG9jYXRpb24oKTsKLSAgcmVzLT5zZXREZWJ1Z0xvYyhETCk7Ci0gIAotICBpZiAoVGhlQ29tcGlsZXItPmhhc0V4Y2VwdGlvbnNFbmFibGVkKCkpIHsKLSAgICBWYWx1ZSogZXhjZXB0aW9uUHRyID0gZ2V0UGVuZGluZ0V4Y2VwdGlvblB0cihnZXRNdXRhdG9yVGhyZWFkUHRyKCkpOwotICAgIAotICAgIC8vIEdldCB0aGUgSmF2YSBleGNlcHRpb24uCi0gICAgVmFsdWUqIG9iaiA9IDA7Ci0gICAgCi0gICAgQmFzaWNCbG9jayogaWZOb3JtYWwgPSBjcmVhdGVCYXNpY0Jsb2NrKCJubyBleGNlcHRpb24gYmxvY2siKTsKLSAgCi0gICAgVmFsdWUqIHRlc3QgPSAwOwotICAgIENvbnN0YW50KiB6ZXJvID0gaW50cmluc2ljcy0+SmF2YU9iamVjdE51bGxDb25zdGFudDsKLQotICAgIC8vIElmIEYgaXMgYSBydW50aW1lIGludHJpbnNpYyB0aGF0IGRvZXMgbm90IGFjY2VzcyBtZW1vcnksIHVzZSBhIGhhY2sKLSAgICAvLyB0aGF0IHdpbGwgcHJldmVudCBMTFZNIGZyb20gbW92aW5nIHRoZSBleGNlcHRpb24gY2hlY2s6IHJ1bnRpbWUKLSAgICAvLyBpbnRyaW5zaWNzIHJldHVybiB0aGUgZXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiB3YXMgcmFpc2VkLgotICAgIGlmIChGID09IGludHJpbnNpY3MtPkluaXRpYWxpc2F0aW9uQ2hlY2tGdW5jdGlvbiB8fCAKLSAgICAgICAgRiA9PSBpbnRyaW5zaWNzLT5HZXRDb25zdGFudFBvb2xBdEZ1bmN0aW9uIHx8Ci0gICAgICAgIEYgPT0gaW50cmluc2ljcy0+R2V0QXJyYXlDbGFzc0Z1bmN0aW9uIHx8Ci0gICAgICAgIEYgPT0gaW50cmluc2ljcy0+R2V0Q2xhc3NEZWxlZ2F0ZWVGdW5jdGlvbikgewotICAgICAgLy8gTWFrZSB0aGUgbG9hZCB2b2xhdGlsZSB0byBmb3JjZSB0aGUgaW5zdHJ1Y3Rpb24gYWZ0ZXIgdGhlIGNhbGwuCi0gICAgICAvLyBPdGhlcndpc2UsIExMVk0gd2lsbCBtZXJnZSB0aGUgbG9hZCB3aXRoIGEgcHJldmlvdXMgbG9hZCBiZWNhdXNlCi0gICAgICAvLyB0aGUgZnVuY3Rpb24gaXMgcmVhZG5vbmUuCi0gICAgICBvYmogPSBuZXcgTG9hZEluc3QoZXhjZXB0aW9uUHRyLCAiIiwgVGhlQ29tcGlsZXItPnVzZUNvb3BlcmF0aXZlR0MoKSwgY3VycmVudEJsb2NrKTsKLSAgICAgIHRlc3QgPSBuZXcgQml0Q2FzdEluc3QocmVzLCBpbnRyaW5zaWNzLT5KYXZhT2JqZWN0VHlwZSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICB0ZXN0ID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX0VRLCB0ZXN0LCBvYmosICIiKTsKLSAgICAgIFZhbHVlKiBUID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX05FLCBvYmosIHplcm8sICIiKTsKLSAgICAgIHRlc3QgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQW5kKHRlc3QsIFQsICIiLCBjdXJyZW50QmxvY2spOwotICAgIH0gZWxzZSB7Ci0gICAgICBvYmogPSBuZXcgTG9hZEluc3QoZXhjZXB0aW9uUHRyLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgIHRlc3QgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfTkUsIG9iaiwgemVybywgIiIpOwotICAgIH0KLQotICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShjdXJyZW50RXhjZXB0aW9uQmxvY2ssIGlmTm9ybWFsLCB0ZXN0LCBjdXJyZW50QmxvY2spOwotCi0gICAgCi0gICAgaWYgKCFjdXJyZW50RXhjZXB0aW9uQmxvY2stPmVtcHR5KCkpIHsKLSAgICAgIEluc3RydWN0aW9uKiBpbnNuID0gY3VycmVudEV4Y2VwdGlvbkJsb2NrLT5iZWdpbigpOwotICAgICAgUEhJTm9kZSogbm9kZSA9IGR5bl9jYXN0PFBISU5vZGU+KGluc24pOwotICAgICAgaWYgKG5vZGUpIG5vZGUtPmFkZEluY29taW5nKG9iaiwgY3VycmVudEJsb2NrKTsKLSAgICB9Ci0gIAotICAgIGN1cnJlbnRCbG9jayA9IGlmTm9ybWFsOyAKLSAgfQotCi0gIHJldHVybiByZXM7Ci19Ci0KLUluc3RydWN0aW9uKiBKYXZhSklUOjppbnZva2UoVmFsdWUgKkYsIFZhbHVlKiBhcmcxLCBjb25zdCBjaGFyKiBOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgewotCi0gIEluc3RydWN0aW9uKiByZXMgPSBDYWxsSW5zdDo6Q3JlYXRlKEYsIGFyZzEsIE5hbWUsIEluc2VydEF0RW5kKTsKLSAgRGVidWdMb2MgREwgPSBDcmVhdGVMb2NhdGlvbigpOwotICByZXMtPnNldERlYnVnTG9jKERMKTsKLSAgCi0gIGlmIChUaGVDb21waWxlci0+aGFzRXhjZXB0aW9uc0VuYWJsZWQoKSkgewotICAgIFZhbHVlKiBleGNlcHRpb25QdHIgPSBnZXRQZW5kaW5nRXhjZXB0aW9uUHRyKGdldE11dGF0b3JUaHJlYWRQdHIoKSk7Ci0gICAgCi0gICAgLy8gR2V0IHRoZSBKYXZhIGV4Y2VwdGlvbi4KLSAgICBWYWx1ZSogb2JqID0gMDsKLSAgICAKLSAgICBCYXNpY0Jsb2NrKiBpZk5vcm1hbCA9IGNyZWF0ZUJhc2ljQmxvY2soIm5vIGV4Y2VwdGlvbiBibG9jayIpOwotICAKLSAgICBWYWx1ZSogdGVzdCA9IDA7Ci0gICAgQ29uc3RhbnQqIHplcm8gPSBpbnRyaW5zaWNzLT5KYXZhT2JqZWN0TnVsbENvbnN0YW50OwotICAgIGlmIChGID09IGludHJpbnNpY3MtPkluaXRpYWxpc2F0aW9uQ2hlY2tGdW5jdGlvbiB8fCAKLSAgICAgICAgRiA9PSBpbnRyaW5zaWNzLT5HZXRDb25zdGFudFBvb2xBdEZ1bmN0aW9uIHx8Ci0gICAgICAgIEYgPT0gaW50cmluc2ljcy0+R2V0QXJyYXlDbGFzc0Z1bmN0aW9uIHx8Ci0gICAgICAgIEYgPT0gaW50cmluc2ljcy0+R2V0Q2xhc3NEZWxlZ2F0ZWVGdW5jdGlvbikgewotICAgICAgb2JqID0gbmV3IExvYWRJbnN0KGV4Y2VwdGlvblB0ciwgIiIsIFRoZUNvbXBpbGVyLT51c2VDb29wZXJhdGl2ZUdDKCksIGN1cnJlbnRCbG9jayk7Ci0gICAgICB0ZXN0ID0gbmV3IEJpdENhc3RJbnN0KHJlcywgaW50cmluc2ljcy0+SmF2YU9iamVjdFR5cGUsICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgdGVzdCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9FUSwgdGVzdCwgb2JqLCAiIik7Ci0gICAgICBWYWx1ZSogVCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9ORSwgb2JqLCB6ZXJvLCAiIik7Ci0gICAgICB0ZXN0ID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZCh0ZXN0LCBULCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICB9IGVsc2UgewotICAgICAgb2JqID0gbmV3IExvYWRJbnN0KGV4Y2VwdGlvblB0ciwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICB0ZXN0ID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX05FLCBvYmosIHplcm8sICIiKTsKLSAgICB9Ci0KLSAgICBCcmFuY2hJbnN0OjpDcmVhdGUoY3VycmVudEV4Y2VwdGlvbkJsb2NrLCBpZk5vcm1hbCwgdGVzdCwgY3VycmVudEJsb2NrKTsKLSAKLSAgICBpZiAoIWN1cnJlbnRFeGNlcHRpb25CbG9jay0+ZW1wdHkoKSkgewotICAgICAgSW5zdHJ1Y3Rpb24qIGluc24gPSBjdXJyZW50RXhjZXB0aW9uQmxvY2stPmJlZ2luKCk7Ci0gICAgICBQSElOb2RlKiBub2RlID0gZHluX2Nhc3Q8UEhJTm9kZT4oaW5zbik7Ci0gICAgICBpZiAobm9kZSkgbm9kZS0+YWRkSW5jb21pbmcob2JqLCBjdXJyZW50QmxvY2spOwotICAgIH0KLSAgCi0gICAgY3VycmVudEJsb2NrID0gaWZOb3JtYWw7Ci0gIH0KLQotICByZXR1cm4gcmVzOwotfQotCi1JbnN0cnVjdGlvbiogSmF2YUpJVDo6aW52b2tlKFZhbHVlICpGLCBWYWx1ZSogYXJnMSwgVmFsdWUqIGFyZzIsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIE5hbWUsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7Ci0KLSAgVmFsdWUqIGFyZ3NbMl0gPSB7IGFyZzEsIGFyZzIgfTsKLSAgCi0gIEluc3RydWN0aW9uKiByZXMgPSBDYWxsSW5zdDo6Q3JlYXRlKEYsIGFyZ3MsIGFyZ3MgKyAyLCBOYW1lLCBJbnNlcnRBdEVuZCk7Ci0gIERlYnVnTG9jIERMID0gQ3JlYXRlTG9jYXRpb24oKTsKLSAgcmVzLT5zZXREZWJ1Z0xvYyhETCk7Ci0gIAotICBpZiAoVGhlQ29tcGlsZXItPmhhc0V4Y2VwdGlvbnNFbmFibGVkKCkpIHsKLSAgICBWYWx1ZSogZXhjZXB0aW9uUHRyID0gZ2V0UGVuZGluZ0V4Y2VwdGlvblB0cihnZXRNdXRhdG9yVGhyZWFkUHRyKCkpOwotICAgIAotICAgIC8vIEdldCB0aGUgSmF2YSBleGNlcHRpb24uCi0gICAgVmFsdWUqIG9iaiA9IDA7Ci0gICAgCi0gICAgQmFzaWNCbG9jayogaWZOb3JtYWwgPSBjcmVhdGVCYXNpY0Jsb2NrKCJubyBleGNlcHRpb24gYmxvY2siKTsKLSAgICAKLSAgICBWYWx1ZSogdGVzdCA9IDA7Ci0gICAgQ29uc3RhbnQqIHplcm8gPSBpbnRyaW5zaWNzLT5KYXZhT2JqZWN0TnVsbENvbnN0YW50OwotICAgIGlmIChGID09IGludHJpbnNpY3MtPkluaXRpYWxpc2F0aW9uQ2hlY2tGdW5jdGlvbiB8fCAKLSAgICAgICAgRiA9PSBpbnRyaW5zaWNzLT5HZXRDb25zdGFudFBvb2xBdEZ1bmN0aW9uIHx8Ci0gICAgICAgIEYgPT0gaW50cmluc2ljcy0+R2V0QXJyYXlDbGFzc0Z1bmN0aW9uIHx8Ci0gICAgICAgIEYgPT0gaW50cmluc2ljcy0+R2V0Q2xhc3NEZWxlZ2F0ZWVGdW5jdGlvbikgewotICAgICAgb2JqID0gbmV3IExvYWRJbnN0KGV4Y2VwdGlvblB0ciwgIiIsIFRoZUNvbXBpbGVyLT51c2VDb29wZXJhdGl2ZUdDKCksIGN1cnJlbnRCbG9jayk7Ci0gICAgICB0ZXN0ID0gbmV3IEJpdENhc3RJbnN0KHJlcywgaW50cmluc2ljcy0+SmF2YU9iamVjdFR5cGUsICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgdGVzdCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9FUSwgdGVzdCwgb2JqLCAiIik7Ci0gICAgICBWYWx1ZSogVCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9ORSwgb2JqLCB6ZXJvLCAiIik7Ci0gICAgICB0ZXN0ID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZCh0ZXN0LCBULCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICB9IGVsc2UgewotICAgICAgb2JqID0gbmV3IExvYWRJbnN0KGV4Y2VwdGlvblB0ciwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICB0ZXN0ID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX05FLCBvYmosIHplcm8sICIiKTsKLSAgICB9Ci0gIAotICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShjdXJyZW50RXhjZXB0aW9uQmxvY2ssIGlmTm9ybWFsLCB0ZXN0LCBjdXJyZW50QmxvY2spOwotICAKLSAgICBpZiAoIWN1cnJlbnRFeGNlcHRpb25CbG9jay0+ZW1wdHkoKSkgewotICAgICAgSW5zdHJ1Y3Rpb24qIGluc24gPSBjdXJyZW50RXhjZXB0aW9uQmxvY2stPmJlZ2luKCk7Ci0gICAgICBQSElOb2RlKiBub2RlID0gZHluX2Nhc3Q8UEhJTm9kZT4oaW5zbik7Ci0gICAgICBpZiAobm9kZSkgbm9kZS0+YWRkSW5jb21pbmcob2JqLCBjdXJyZW50QmxvY2spOwotICAgIH0KLQotICAgIGN1cnJlbnRCbG9jayA9IGlmTm9ybWFsOwotICB9Ci0KLSAgcmV0dXJuIHJlczsKLX0KLQotSW5zdHJ1Y3Rpb24qIEphdmFKSVQ6Omludm9rZShWYWx1ZSAqRiwgY29uc3QgY2hhciogTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKLSAgSW5zdHJ1Y3Rpb24qIHJlcyA9IGxsdm06OkNhbGxJbnN0OjpDcmVhdGUoRiwgTmFtZSwgSW5zZXJ0QXRFbmQpOwotICBEZWJ1Z0xvYyBETCA9IENyZWF0ZUxvY2F0aW9uKCk7Ci0gIHJlcy0+c2V0RGVidWdMb2MoREwpOwotICAKLSAgaWYgKFRoZUNvbXBpbGVyLT5oYXNFeGNlcHRpb25zRW5hYmxlZCgpKSB7Ci0gICAgVmFsdWUqIGV4Y2VwdGlvblB0ciA9IGdldFBlbmRpbmdFeGNlcHRpb25QdHIoZ2V0TXV0YXRvclRocmVhZFB0cigpKTsKLSAgICAKLSAgICAvLyBHZXQgdGhlIEphdmEgZXhjZXB0aW9uLgotICAgIFZhbHVlKiBvYmogPSAwOwotICAgIAotICAgIEJhc2ljQmxvY2sqIGlmTm9ybWFsID0gY3JlYXRlQmFzaWNCbG9jaygibm8gZXhjZXB0aW9uIGJsb2NrIik7Ci0gIAotICAgIFZhbHVlKiB0ZXN0ID0gMDsKLSAgICBDb25zdGFudCogemVybyA9IGludHJpbnNpY3MtPkphdmFPYmplY3ROdWxsQ29uc3RhbnQ7Ci0gICAgaWYgKEYgPT0gaW50cmluc2ljcy0+SW5pdGlhbGlzYXRpb25DaGVja0Z1bmN0aW9uIHx8IAotICAgICAgICBGID09IGludHJpbnNpY3MtPkdldENvbnN0YW50UG9vbEF0RnVuY3Rpb24gfHwKLSAgICAgICAgRiA9PSBpbnRyaW5zaWNzLT5HZXRBcnJheUNsYXNzRnVuY3Rpb24gfHwKLSAgICAgICAgRiA9PSBpbnRyaW5zaWNzLT5HZXRDbGFzc0RlbGVnYXRlZUZ1bmN0aW9uKSB7Ci0gICAgICBvYmogPSBuZXcgTG9hZEluc3QoZXhjZXB0aW9uUHRyLCAiIiwgVGhlQ29tcGlsZXItPnVzZUNvb3BlcmF0aXZlR0MoKSwgY3VycmVudEJsb2NrKTsKLSAgICAgIHRlc3QgPSBuZXcgQml0Q2FzdEluc3QocmVzLCBpbnRyaW5zaWNzLT5KYXZhT2JqZWN0VHlwZSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICB0ZXN0ID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX0VRLCB0ZXN0LCBvYmosICIiKTsKLSAgICAgIFZhbHVlKiBUID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX05FLCBvYmosIHplcm8sICIiKTsKLSAgICAgIHRlc3QgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQW5kKHRlc3QsIFQsICIiLCBjdXJyZW50QmxvY2spOwotICAgIH0gZWxzZSB7Ci0gICAgICBvYmogPSBuZXcgTG9hZEluc3QoZXhjZXB0aW9uUHRyLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgIHRlc3QgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfTkUsIG9iaiwgemVybywgIiIpOwotICAgIH0KLQotICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShjdXJyZW50RXhjZXB0aW9uQmxvY2ssIGlmTm9ybWFsLCB0ZXN0LCBjdXJyZW50QmxvY2spOwotICAKLSAgICBpZiAoIWN1cnJlbnRFeGNlcHRpb25CbG9jay0+ZW1wdHkoKSkgewotICAgICAgSW5zdHJ1Y3Rpb24qIGluc24gPSBjdXJyZW50RXhjZXB0aW9uQmxvY2stPmJlZ2luKCk7Ci0gICAgICBQSElOb2RlKiBub2RlID0gZHluX2Nhc3Q8UEhJTm9kZT4oaW5zbik7Ci0gICAgICBpZiAobm9kZSkgbm9kZS0+YWRkSW5jb21pbmcob2JqLCBjdXJyZW50QmxvY2spOwotICAgIH0KLQotICAgIGN1cnJlbnRCbG9jayA9IGlmTm9ybWFsOwotICB9Ci0KLSAgcmV0dXJuIHJlczsKLX0KLQotdm9pZCBKYXZhSklUOjp0aHJvd0V4Y2VwdGlvbihsbHZtOjpGdW5jdGlvbiogRiwgVmFsdWUqIGFyZzEpIHsKLSAgSW5zdHJ1Y3Rpb24qIG9iaiA9IENhbGxJbnN0OjpDcmVhdGUoRiwgYXJnMSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIERlYnVnTG9jIERMID0gQ3JlYXRlTG9jYXRpb24oKTsKLSAgb2JqLT5zZXREZWJ1Z0xvYyhETCk7Ci0KLSAgaWYgKGN1cnJlbnRFeGNlcHRpb25CbG9jayAhPSBlbmRFeGNlcHRpb25CbG9jaykgewotICAgIEluc3RydWN0aW9uKiBpbnNuID0gY3VycmVudEV4Y2VwdGlvbkJsb2NrLT5iZWdpbigpOwotICAgIFBISU5vZGUqIG5vZGUgPSBkeW5fY2FzdDxQSElOb2RlPihpbnNuKTsKLSAgICBpZiAobm9kZSkgbm9kZS0+YWRkSW5jb21pbmcob2JqLCBjdXJyZW50QmxvY2spOwotICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShjdXJyZW50RXhjZXB0aW9uQmxvY2ssIGN1cnJlbnRCbG9jayk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGVuZE5vZGUpIHsKLSAgICAgIGVuZE5vZGUtPmFkZEluY29taW5nKENvbnN0YW50OjpnZXROdWxsVmFsdWUoZW5kTm9kZS0+Z2V0VHlwZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gICAgfQotICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShlbmRCbG9jaywgY3VycmVudEJsb2NrKTsKLSAgfQotfQotCi12b2lkIEphdmFKSVQ6OnRocm93RXhjZXB0aW9uKFZhbHVlKiBvYmopIHsKLSAgSklUVmVyaWZ5TnVsbChvYmopOwotCVZhbHVlKiBleGNlcHRpb25QdHIgPSBnZXRQZW5kaW5nRXhjZXB0aW9uUHRyKGdldE11dGF0b3JUaHJlYWRQdHIoKSk7Ci0KLSAgbmV3IFN0b3JlSW5zdChvYmosIGV4Y2VwdGlvblB0ciwgY3VycmVudEJsb2NrKTsKLSAgaWYgKGN1cnJlbnRFeGNlcHRpb25CbG9jayAhPSBlbmRFeGNlcHRpb25CbG9jaykgewotICAgIEluc3RydWN0aW9uKiBpbnNuID0gY3VycmVudEV4Y2VwdGlvbkJsb2NrLT5iZWdpbigpOwotICAgIFBISU5vZGUqIG5vZGUgPSBkeW5fY2FzdDxQSElOb2RlPihpbnNuKTsKLSAgICBpZiAobm9kZSkgbm9kZS0+YWRkSW5jb21pbmcob2JqLCBjdXJyZW50QmxvY2spOwotICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShjdXJyZW50RXhjZXB0aW9uQmxvY2ssIGN1cnJlbnRCbG9jayk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGVuZE5vZGUpIHsKLSAgICAgIGVuZE5vZGUtPmFkZEluY29taW5nKENvbnN0YW50OjpnZXROdWxsVmFsdWUoZW5kTm9kZS0+Z2V0VHlwZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gICAgfQotICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShlbmRCbG9jaywgY3VycmVudEJsb2NrKTsKLSAgfQotfQotCi12b2lkIEphdmFKSVQ6OnRocm93RXhjZXB0aW9uKGxsdm06OkZ1bmN0aW9uKiBGLCBWYWx1ZSoqIGFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBuYkFyZ3MpIHsKLSAgSW5zdHJ1Y3Rpb24qIG9iaiA9IENhbGxJbnN0OjpDcmVhdGUoRiwgYXJncywgYXJncyArIG5iQXJncywgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIERlYnVnTG9jIERMID0gQ3JlYXRlTG9jYXRpb24oKTsKLSAgb2JqLT5zZXREZWJ1Z0xvYyhETCk7Ci0KLSAgaWYgKGN1cnJlbnRFeGNlcHRpb25CbG9jayAhPSBlbmRFeGNlcHRpb25CbG9jaykgewotICAgIEluc3RydWN0aW9uKiBpbnNuID0gY3VycmVudEV4Y2VwdGlvbkJsb2NrLT5iZWdpbigpOwotICAgIFBISU5vZGUqIG5vZGUgPSBkeW5fY2FzdDxQSElOb2RlPihpbnNuKTsKLSAgICBpZiAobm9kZSkgbm9kZS0+YWRkSW5jb21pbmcob2JqLCBjdXJyZW50QmxvY2spOwotICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShjdXJyZW50RXhjZXB0aW9uQmxvY2ssIGN1cnJlbnRCbG9jayk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGVuZE5vZGUpIHsKLSAgICAgIGVuZE5vZGUtPmFkZEluY29taW5nKENvbnN0YW50OjpnZXROdWxsVmFsdWUoZW5kTm9kZS0+Z2V0VHlwZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gICAgfQotICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShlbmRCbG9jaywgY3VycmVudEJsb2NrKTsKLSAgfQotfQotCi0vLy8gSGFuZGxlciAtIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBleGNlcHRpb24gaGFuZGxlci4gSXQgaXMgb25seSBuZWVkZWQKLS8vLyB3aGVuIHBhcnNpbmcgdGhlIC5jbGFzcyBmaWxlIGluIHRoZSBKSVQsIHRoZXJlZm9yZSBpdCBpcyBvbmx5IGRlZmluZWQKLS8vLyBoZXJlLiBUaGUgcmVhZEV4Y2VwdGlvblRhYmxlIGZ1bmN0aW9uIGlzIHRoZSBvbmx5IGZ1bmN0aW9uIHRoYXQgbWFrZXMKLS8vLyB1c2Ugb2YgdGhpcyBjbGFzcy4KLXN0cnVjdCBIYW5kbGVyIHsKLSAgCi0gIC8vLyBzdGFydHBjIC0gVGhlIGJ5dGVjb2RlIG51bWJlciB0aGF0IGJlZ2lucyB0aGUgdHJ5IGNsYXVzZS4KLSAgdWludDMyIHN0YXJ0cGM7Ci0KLSAgLy8vIGVuZHBjIC0gVGhlIGJ5dGVjb2RlIG51bWJlciB0aGF0IGVuZHMgdGhlIHRyeSBjbGF1c2UuCi0gIHVpbnQzMiBlbmRwYzsKLQotICAvLy8gaGFuZGxlcnBjIC0gVGhlIGJ5dGVjb2RlIG51bWJlciB3aGVyZSB0aGUgaGFuZGxlciBjb2RlIHN0YXJ0cy4KLSAgdWludDMyIGhhbmRsZXJwYzsKLQotICAvLy8gY2F0Y2hlIC0gSW5kZXggaW4gdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhlIGV4Y2VwdGlvbiBjbGFzcy4KLSAgdWludDE2IGNhdGNoZTsKLQotICAvLy8gY2F0Y2hDbGFzcyAtIFRoZSBjbGFzcyBvZiB0aGUgZXhjZXB0aW9uOiBpdCBtdXN0IGFsd2F5cyBiZSBsb2FkZWQgYmVmb3JlCi0gIC8vLyByZWFkaW5nIHRoZSBleGNlcHRpb24gdGFibGUgc28gdGhhdCB3ZSBkbyBub3QgdGhyb3cgYW4gZXhjZXB0aW9uCi0gIC8vLyB3aGVuIGNvbXBpbGluZy4KLSAgVXNlckNsYXNzKiBjYXRjaENsYXNzOwotCi0gIC8vLyB0ZXN0ZXIgLSBUaGUgYmFzaWMgYmxvY2sgdGhhdCB0ZXN0cyBpZiB0aGUgZXhjZXB0aW9uIGlzIGhhbmRsZWQgYnkgdGhpcwotICAvLy8gaGFuZGxlci4gSWYgdGhlIGhhbmRsZXIgaXMgbm90IHRoZSBmaXJzdCBvZiBhIGxpc3Qgb2YgaGFuZGxlcnMgd2l0aCB0aGUKLSAgLy8vIHNhbWUgcmFuZ2UsIHRoYW4gdGhpcyBibG9jayBpcyB0aGUgY2F0Y2hlciBibG9jay4gT3RoZXJ3aXNlLCBpdCBpcyB0aGUKLSAgLy8vIGRlc3RpbmF0aW9uIG9mIHRoZSBjYXRjaGVyIGJsb2NrIGFuZCBvZiB0aGUgaGFuZGxlcnMgdGhhdCBkbyBub3QgaGFuZGxlcgotICAvLy8gdGhlIGV4Y2VwdGlvbi4KLSAgbGx2bTo6QmFzaWNCbG9jayogdGVzdGVyOwotCi0gIC8vLyBqYXZhSGFuZGxlciAtIFRoZSBKYXZhIGNvZGUgdGhhdCBoYW5kbGVzIHRoZSBleGNlcHRpb24uIEF0IHRoaXMgcG9pbnQsIHdlCi0gIC8vLyBrbm93IHdlIGhhdmUgY2F1Z2h0IGFuZCBhcmUgaGFuZGxpbmcgdGhlIGV4Y2VwdGlvbi4gVGhlIEphdmEgZXhjZXB0aW9uCi0gIC8vLyBvYmplY3QgaXMgdGhlIFBISSBub2RlIHRoYXQgYmVnaW5zIHRoaXMgYmxvY2suCi0gIGxsdm06OkJhc2ljQmxvY2sqIGphdmFIYW5kbGVyOwotCi19OwotCi11bnNpZ25lZCBKYXZhSklUOjpyZWFkRXhjZXB0aW9uVGFibGUoUmVhZGVyJiByZWFkZXIsIHVpbnQzMiBjb2RlTGVuKSB7Ci0KLSAgLy8gVGhpcyBmdW5jdGlvbiB1c2VzIGN1cnJlbnRCbG9jayB0byBzaW1wbGlmeSB0aGluZ3MuIFdlIHNhdmUgdGhlIGN1cnJlbnQKLSAgLy8gdmFsdWUgb2YgY3VycmVudEJsb2NrIHRvIHJlc3RvcmUgaXQgYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24KLSAgQmFzaWNCbG9jayogdGVtcCA9IGN1cnJlbnRCbG9jazsKLSAgCi0gIHNpbnQxNiBuYmUgPSByZWFkZXIucmVhZFUyKCk7Ci0gIHNpbnQxNiBzeW5jID0gaXNTeW5jaHJvKGNvbXBpbGluZ01ldGhvZC0+YWNjZXNzKSA/IDEgOiAwOwotICBuYmUgKz0gc3luYzsKLSAKLSAgbXZtOjpUaHJlYWRBbGxvY2F0b3IgYWxsb2NhdG9yOwotICAvLyBMb29wIG92ZXIgYWxsIGhhbmRsZXJzIGluIHRoZSBieXRlY29kZSB0byBpbml0aWFsaXplIHRoZWlyIHZhbHVlcy4KLSAgSGFuZGxlciogaGFuZGxlcnMgPQotICAgICAgKEhhbmRsZXIqKWFsbG9jYXRvci5BbGxvY2F0ZShzaXplb2YoSGFuZGxlcikgKiAobmJlIC0gc3luYykpOwotICBmb3IgKHVpbnQxNiBpID0gMDsgaSA8IG5iZSAtIHN5bmM7ICsraSkgewotICAgIEhhbmRsZXIqIGV4ICAgPSAmaGFuZGxlcnNbaV07Ci0gICAgZXgtPnN0YXJ0cGMgICA9IHJlYWRlci5yZWFkVTIoKTsKLSAgICBleC0+ZW5kcGMgICAgID0gcmVhZGVyLnJlYWRVMigpOwotICAgIGV4LT5oYW5kbGVycGMgPSByZWFkZXIucmVhZFUyKCk7Ci0KLSAgICBleC0+Y2F0Y2hlID0gcmVhZGVyLnJlYWRVMigpOwotCi0gICAgaWYgKGV4LT5jYXRjaGUpIHsKLSAgICAgIFVzZXJDbGFzcyogY2wgPSAKLSAgICAgICAgKFVzZXJDbGFzcyopKGNvbXBpbGluZ0NsYXNzLT5jdHBJbmZvLT5pc0NsYXNzTG9hZGVkKGV4LT5jYXRjaGUpKTsKLSAgICAgIC8vIFdoZW4gbG9hZGluZyB0aGUgY2xhc3MsIHdlIG1hZGUgc3VyZSB0aGF0IGFsbCBleGNlcHRpb24gY2xhc3NlcwotICAgICAgLy8gd2VyZSBsb2FkZWQsIHNvIGNsIG11c3QgaGF2ZSBhIHZhbHVlLgotICAgICAgYXNzZXJ0KGNsICYmICJleGNlcHRpb24gY2xhc3MgaGFzIG5vdCBiZWVuIGxvYWRlZCIpOwotICAgICAgZXgtPmNhdGNoQ2xhc3MgPSBjbDsKLSAgICB9IGVsc2UgewotICAgICAgZXgtPmNhdGNoQ2xhc3MgPSB1cGNhbGxzLT5uZXdUaHJvd2FibGU7Ci0gICAgfQotICAgIAotICAgIGV4LT50ZXN0ZXIgPSBjcmVhdGVCYXNpY0Jsb2NrKCJ0ZXN0RXhjZXB0aW9uIik7Ci0gICAgCi0gICAgLy8gUEhJIE5vZGUgZm9yIHRoZSBleGNlcHRpb24gb2JqZWN0Ci0gICAgUEhJTm9kZTo6Q3JlYXRlKGludHJpbnNpY3MtPkphdmFPYmplY3RUeXBlLCAiIiwgZXgtPnRlc3Rlcik7Ci0gICAgCi0gICAgLy8gU2V0IHRoZSB1bndpbmQgZGVzdGluYXRpb24gb2YgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgcmFuZ2Ugb2YgdGhpcwotICAgIC8vIGhhbmRsZXIgdG8gdGhlIHRlc3QgYmxvY2sgb2YgdGhlIGhhbmRsZXIuIElmIGFuIGluc3RydWN0aW9uIGFscmVhZHkgaGFzCi0gICAgLy8gYSBoYW5kbGVyIGFuZCB0aHVzIGlzIG5vdCB0aGUgc3luY2hyb25pemUgb3IgcmVndWxhciBlbmQgaGFuZGxlciBibG9jaywKLSAgICAvLyBsZWF2ZSBpdCBhcy1pcy4KLSAgICBmb3IgKHVpbnQxNiBpID0gZXgtPnN0YXJ0cGM7IGkgPCBleC0+ZW5kcGM7ICsraSkgewotICAgICAgaWYgKG9wY29kZUluZm9zW2ldLmV4Y2VwdGlvbkJsb2NrID09IGVuZEV4Y2VwdGlvbkJsb2NrKSB7Ci0gICAgICAgIG9wY29kZUluZm9zW2ldLmV4Y2VwdGlvbkJsb2NrID0gZXgtPnRlc3RlcjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJZiB0aGUgaGFuZGxlciBwYyBkb2VzIG5vdCBhbHJlYWR5IGhhdmUgYSBibG9jaywgY3JlYXRlIGEgbmV3IG9uZS4KLSAgICBpZiAoIShvcGNvZGVJbmZvc1tleC0+aGFuZGxlcnBjXS5uZXdCbG9jaykpIHsKLSAgICAgIG9wY29kZUluZm9zW2V4LT5oYW5kbGVycGNdLm5ld0Jsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygiamF2YUhhbmRsZXIiKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gU2V0IHRoZSBKYXZhIGhhbmRsZXIgZm9yIHRoaXMgZXhjZXB0aW9uLgotICAgIGV4LT5qYXZhSGFuZGxlciA9IG9wY29kZUluZm9zW2V4LT5oYW5kbGVycGNdLm5ld0Jsb2NrOwotICAgIG9wY29kZUluZm9zW2V4LT5oYW5kbGVycGNdLmhhbmRsZXIgPSB0cnVlOwotICAgIAotICAgIGlmIChleC0+amF2YUhhbmRsZXItPmVtcHR5KCkpIHsKLSAgICAgIFBISU5vZGU6OkNyZWF0ZShpbnRyaW5zaWNzLT5KYXZhT2JqZWN0VHlwZSwgIiIsIGV4LT5qYXZhSGFuZGxlcik7Ci0gICAgfQotCi0gIH0KLQotICAvLyBMb29wIG92ZXIgYWxsIGhhbmRsZXJzIHRvIGltcGxlbWVudCB0aGVpciB0ZXN0ZXIuCi0gIGZvciAoc2ludDE2IGkgPSAwOyBpIDwgbmJlIC0gc3luYzsgKytpKSB7Ci0gICAgSGFuZGxlciogY3VyID0gJmhhbmRsZXJzW2ldOwotICAgIEJhc2ljQmxvY2sqIGJiTmV4dCA9IDA7Ci0gICAgUEhJTm9kZSogamF2YU5vZGUgPSAwOwotICAgIGN1cnJlbnRFeGNlcHRpb25CbG9jayA9IG9wY29kZUluZm9zW2N1ci0+aGFuZGxlcnBjXS5leGNlcHRpb25CbG9jazsKLQotICAgIC8vIExvb2sgb3V0IHdoZXJlIHdlIGdvIGlmIHdlJ3JlIG5vdCB0aGUgaGFuZGxlciBmb3IgdGhlIGV4Y2VwdGlvbi4KLSAgICBpZiAoaSArIDEgIT0gbmJlIC0gc3luYykgewotICAgICAgSGFuZGxlciogbmV4dCA9ICZoYW5kbGVyc1tpICsgMV07Ci0gICAgICBpZiAoIShjdXItPnN0YXJ0cGMgPj0gbmV4dC0+c3RhcnRwYyAmJiBjdXItPmVuZHBjIDw9IG5leHQtPmVuZHBjKSkgewotICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBoYW5kbGVyIHRvIGdvIHRvIChlaXRoZXIgb25lIHRoYXQgaGFzIHRoZSBzYW1lIHJhbmdlCi0gICAgICAgIC8vIG9yIG9uZSB0aGF0IGNvbnRhaW5zIHRoZSByYW5nZSksIHRoZW4gd2UganVtcCB0byB0aGUgZW5kIGhhbmRsZXIuCi0gICAgICAgIGJiTmV4dCA9IGVuZEV4Y2VwdGlvbkJsb2NrOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gSWYgdGhlcmUncyBhIGhhbmRsZXIgdG8gZ290bywgd2UganVtcCB0byBpdHMgdGVzdGVyIGJsb2NrIGFuZCByZWNvcmQKLSAgICAgICAgLy8gdGhlIGV4Y2VwdGlvbiBQSEkgbm9kZSB0byBnaXZlIG91ciBleGNlcHRpb24gdG8gdGhlIHRlc3Rlci4KLSAgICAgICAgYmJOZXh0ID0gbmV4dC0+dGVzdGVyOwotICAgICAgICBqYXZhTm9kZSA9IGR5bl9jYXN0PFBISU5vZGU+KGJiTmV4dC0+YmVnaW4oKSk7Ci0gICAgICAgIGFzc2VydChqYXZhTm9kZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gaGFuZGxlciBhZnRlciB1cywgd2UganVtcCB0byB0aGUgZW5kIGhhbmRsZXIuCi0gICAgICBiYk5leHQgPSBlbmRFeGNlcHRpb25CbG9jazsKLSAgICB9Ci0KLSAgICBjdXJyZW50QmxvY2sgPSBjdXItPnRlc3RlcjsKLSAgICAKLSAgICBhc3NlcnQoY3VyLT5jYXRjaENsYXNzICYmIAotICAgICAgICAgICAiQ2xhc3Mgbm90IGxvYWRlZCB3aGVuIHJlYWRpbmcgdGhlIGV4Y2VwdGlvbiB0YWJsZSIpOwotCi0gICAgVmFsdWUqIFZUVmFyID0gVGhlQ29tcGlsZXItPmdldFZpcnR1YWxUYWJsZShjdXItPmNhdGNoQ2xhc3MtPnZpcnR1YWxWVCk7Ci0gICAgCi0gICAgLy8gR2V0IHRoZSBKYXZhIGV4Y2VwdGlvbi4KLSAgICBWYWx1ZSogb2JqID0gY3VycmVudEJsb2NrLT5iZWdpbigpOwotICAgIAotICAgIFZhbHVlKiBvYmpWVCA9IENhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+R2V0VlRGdW5jdGlvbiwgb2JqLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0KLSAgICB1aW50MzIgZGVwdGggPSBjdXItPmNhdGNoQ2xhc3MtPnZpcnR1YWxWVC0+ZGVwdGg7Ci0gICAgVmFsdWUqIGRlcHRoQ2wgPSBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSwgZGVwdGgpOwotICAgIFZhbHVlKiBjbXAgPSAwOwotCi0gICAgaWYgKGRlcHRoID49IEphdmFWaXJ0dWFsVGFibGU6OmdldERpc3BsYXlMZW5ndGgoKSkgewotICAgICAgVmFsdWUqIGNsYXNzQXJnc1syXSA9IHsgb2JqVlQsIFZUVmFyIH07Ci0gICAgICAgICAgCi0gICAgICBjbXAgPSBDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPklzU2Vjb25kYXJ5Q2xhc3NGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NBcmdzLCBjbGFzc0FyZ3MgKyAyLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLQotICAgIH0gZWxzZSB7Ci0gICAgIAotICAgICAgVmFsdWUqIGluRGlzcGxheSA9IENhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+R2V0RGlzcGxheUZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqVlQsICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICAgICAgCi0gICAgICBWYWx1ZSogZGlzcGxheUFyZ3NbMl0gPSB7IGluRGlzcGxheSwgZGVwdGhDbCB9OwotICAgICAgVmFsdWUqIFZUSW5EaXNwbGF5ID0gQ2FsbEluc3Q6OkNyZWF0ZShpbnRyaW5zaWNzLT5HZXRWVEluRGlzcGxheUZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5QXJncywgZGlzcGxheUFyZ3MgKyAyLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgICAgICAgICAgICAKLSAgICAgIGNtcCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9FUSwgVlRJbkRpc3BsYXksIFZUVmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICIiKTsKLSAgICB9Ci0gICAKLSAgICAvLyBBZGQgdGhlIEphdmEgZXhjZXB0aW9uIGluIHRoZSBwaGkgbm9kZSBvZiB0aGUgaGFuZGxlci4KLSAgICBJbnN0cnVjdGlvbiogaW5zbiA9IGN1ci0+amF2YUhhbmRsZXItPmJlZ2luKCk7Ci0gICAgUEhJTm9kZSogbm9kZSA9IGR5bl9jYXN0PFBISU5vZGU+KGluc24pOwotICAgIGFzc2VydChub2RlICYmICJtYWxmb3JtZWQgZXhjZXB0aW9ucyIpOwotICAgIG5vZGUtPmFkZEluY29taW5nKG9iaiwgY3VycmVudEJsb2NrKTsKLSAgIAotICAgIC8vIEFkZCB0aGUgSmF2YSBleGNlcHRpb24gaW4gdGhlIHBoaSBub2RlIG9mIHRoZSBuZXh0IGJsb2NrLgotICAgIGlmIChqYXZhTm9kZSkKLSAgICAgIGphdmFOb2RlLT5hZGRJbmNvbWluZyhvYmosIGN1cnJlbnRCbG9jayk7Ci0gCi0gICAgLy8gSWYgd2UgYXJlIGNhdGNoaW5nIHRoaXMgZXhjZXB0aW9uLCB0aGVuIGp1bXAgdG8gdGhlIEphdmEgSGFuZGxlciwKLSAgICAvLyBvdGhlcndpc2UganVtcCB0byBvdXIgbmV4dCBoYW5kbGVyLgotICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShjdXItPmphdmFIYW5kbGVyLCBiYk5leHQsIGNtcCwgY3VycmVudEJsb2NrKTsKLQotICAgIGN1cnJlbnRCbG9jayA9IGN1ci0+amF2YUhhbmRsZXI7Ci0KLSAgICAvLyBGaXJzdCB0aGluZyBpbiB0aGUgaGFuZGxlcjogY2xlYXIgdGhlIGV4Y2VwdGlvbi4KLSAgICBWYWx1ZSogZXhjZXB0aW9uUHRyID0gZ2V0UGVuZGluZ0V4Y2VwdGlvblB0cihnZXRNdXRhdG9yVGhyZWFkUHRyKCkpOwotICAgIAotICAgIC8vIENsZWFyIGV4Y2VwdGlvbnMuCi0gICAgbmV3IFN0b3JlSW5zdChpbnRyaW5zaWNzLT5KYXZhT2JqZWN0TnVsbENvbnN0YW50LCBleGNlcHRpb25QdHIsCi0gICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotCi0gIH0KLSAKLSAgLy8gUmVzdG9yZSBjdXJyZW50QmxvY2suCi0gIGN1cnJlbnRCbG9jayA9IHRlbXA7Ci0gIHJldHVybiBuYmU7Ci19Ci0KLXZvaWQgSmF2YUpJVDo6ZmluaXNoRXhjZXB0aW9ucygpIHsKLSAgcHJlZF9pdGVyYXRvciBQSSA9IHByZWRfYmVnaW4oZW5kRXhjZXB0aW9uQmxvY2spOwotICBwcmVkX2l0ZXJhdG9yIFBFID0gcHJlZF9lbmQoZW5kRXhjZXB0aW9uQmxvY2spOwotICBpZiAoUEkgPT0gUEUpIHsKLSAgICBlbmRFeGNlcHRpb25CbG9jay0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGVuZE5vZGUpIHsKLSAgICAgIGVuZE5vZGUtPmFkZEluY29taW5nKENvbnN0YW50OjpnZXROdWxsVmFsdWUoZW5kTm9kZS0+Z2V0VHlwZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZEV4Y2VwdGlvbkJsb2NrKTsKLSAgICB9Ci0gICAgQnJhbmNoSW5zdDo6Q3JlYXRlKGVuZEJsb2NrLCBlbmRFeGNlcHRpb25CbG9jayk7Ci0gIH0KLSAKLQotICBQSSA9IHByZWRfYmVnaW4odW5pZmllZFVucmVhY2hhYmxlKTsKLSAgUEUgPSBwcmVkX2VuZCh1bmlmaWVkVW5yZWFjaGFibGUpOwotICBpZiAoUEkgPT0gUEUpIHsKLSAgICB1bmlmaWVkVW5yZWFjaGFibGUtPmVyYXNlRnJvbVBhcmVudCgpOwotICB9IGVsc2UgewotICAgIG5ldyBVbnJlYWNoYWJsZUluc3QoKmxsdm1Db250ZXh0LCB1bmlmaWVkVW5yZWFjaGFibGUpOwotICB9Ci0gIAotICBmb3IgKEZ1bmN0aW9uOjppdGVyYXRvciBCSSA9IGxsdm1GdW5jdGlvbi0+YmVnaW4oKSwgQkUgPSBsbHZtRnVuY3Rpb24tPmVuZCgpOwotICAgICAgIEJJICE9IEJFOyBCSSsrKSB7Ci0gICAgUEkgPSBwcmVkX2JlZ2luKEJJKTsKLSAgICBQRSA9IHByZWRfZW5kKEJJKTsKLSAgICBpZiAoUEkgPT0gUEUpIHsKLSAgICAgIEluc3RydWN0aW9uKiBpbnNuID0gQkktPmJlZ2luKCk7Ci0gICAgICBQSElOb2RlKiBub2RlID0gZHluX2Nhc3Q8UEhJTm9kZT4oaW5zbik7Ci0gICAgICBpZiAobm9kZSkgewotICAgICAgICBub2RlLT5yZXBsYWNlQWxsVXNlc1dpdGgoQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShub2RlLT5nZXRUeXBlKCkpKTsKLSAgICAgICAgbm9kZS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9KMy9Db21waWxlci9FeGNlcHRpb25zRHdhcmYuaW5jIGIvdm1raXQvbGliL0ozL0NvbXBpbGVyL0V4Y2VwdGlvbnNEd2FyZi5pbmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYmJiNGMuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL0ozL0NvbXBpbGVyL0V4Y2VwdGlvbnNEd2FyZi5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OTIgKzAsMCBAQAotSW5zdHJ1Y3Rpb24qIEphdmFKSVQ6Omludm9rZShWYWx1ZSAqRiwgc3RkOjp2ZWN0b3I8bGx2bTo6VmFsdWUqPiYgYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKLSAgCi0gIC8vIG1lYW5zOiBpcyB0aGVyZSBhIGhhbmRsZXIgZm9yIG1lPwotICBpZiAoY3VycmVudEV4Y2VwdGlvbkJsb2NrICE9IGVuZEV4Y2VwdGlvbkJsb2NrKSB7Ci0gICAgQmFzaWNCbG9jayogaWZOb3JtYWwgPSBjcmVhdGVCYXNpY0Jsb2NrKCJubyBleGNlcHRpb24gYmxvY2siKTsKLSAgICBjdXJyZW50QmxvY2sgPSBpZk5vcm1hbDsKLSAgICByZXR1cm4gbGx2bTo6SW52b2tlSW5zdDo6Q3JlYXRlKEYsIGlmTm9ybWFsLCBjdXJyZW50RXhjZXB0aW9uQmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmJlZ2luKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5lbmQoKSwgTmFtZSwgSW5zZXJ0QXRFbmQpOwotICB9IGVsc2UgewotICAgIHJldHVybiBsbHZtOjpDYWxsSW5zdDo6Q3JlYXRlKEYsIGFyZ3MuYmVnaW4oKSwgYXJncy5lbmQoKSwgTmFtZSwgSW5zZXJ0QXRFbmQpOwotICB9Ci19Ci0KLUluc3RydWN0aW9uKiBKYXZhSklUOjppbnZva2UoVmFsdWUgKkYsIFZhbHVlKiBhcmcxLCBjb25zdCBjaGFyKiBOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgewotCi0gIC8vIG1lYW5zOiBpcyB0aGVyZSBhIGhhbmRsZXIgZm9yIG1lPwotICBpZiAoY3VycmVudEV4Y2VwdGlvbkJsb2NrICE9IGVuZEV4Y2VwdGlvbkJsb2NrKSB7Ci0gICAgQmFzaWNCbG9jayogaWZOb3JtYWwgPSBjcmVhdGVCYXNpY0Jsb2NrKCJubyBleGNlcHRpb24gYmxvY2siKTsKLSAgICBjdXJyZW50QmxvY2sgPSBpZk5vcm1hbDsKLSAgICBWYWx1ZSogYXJnWzFdID0geyBhcmcxIH07Ci0gICAgcmV0dXJuIEludm9rZUluc3Q6OkNyZWF0ZShGLCBpZk5vcm1hbCwgY3VycmVudEV4Y2VwdGlvbkJsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBhcmcgKyAxLCBOYW1lLCBJbnNlcnRBdEVuZCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIENhbGxJbnN0OjpDcmVhdGUoRiwgYXJnMSwgTmFtZSwgSW5zZXJ0QXRFbmQpOwotICB9Ci19Ci0KLUluc3RydWN0aW9uKiBKYXZhSklUOjppbnZva2UoVmFsdWUgKkYsIFZhbHVlKiBhcmcxLCBWYWx1ZSogYXJnMiwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogTmFtZSwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKLQotICBWYWx1ZSogYXJnc1syXSA9IHsgYXJnMSwgYXJnMiB9OwotICAKLSAgLy8gbWVhbnM6IGlzIHRoZXJlIGEgaGFuZGxlciBmb3IgbWU/Ci0gIGlmIChjdXJyZW50RXhjZXB0aW9uQmxvY2sgIT0gZW5kRXhjZXB0aW9uQmxvY2spIHsKLSAgICBCYXNpY0Jsb2NrKiBpZk5vcm1hbCA9IGNyZWF0ZUJhc2ljQmxvY2soIm5vIGV4Y2VwdGlvbiBibG9jayIpOwotICAgIGN1cnJlbnRCbG9jayA9IGlmTm9ybWFsOwotICAgIHJldHVybiBJbnZva2VJbnN0OjpDcmVhdGUoRiwgaWZOb3JtYWwsIGN1cnJlbnRFeGNlcHRpb25CbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MsIGFyZ3MgKyAyLCBOYW1lLCBJbnNlcnRBdEVuZCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIENhbGxJbnN0OjpDcmVhdGUoRiwgYXJncywgYXJncyArIDIsIE5hbWUsIEluc2VydEF0RW5kKTsKLSAgfQotfQotCi1JbnN0cnVjdGlvbiogSmF2YUpJVDo6aW52b2tlKFZhbHVlICpGLCBjb25zdCBjaGFyKiBOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgewotICAvLyBtZWFuczogaXMgdGhlcmUgYSBoYW5kbGVyIGZvciBtZT8KLSAgaWYgKGN1cnJlbnRFeGNlcHRpb25CbG9jayAhPSBlbmRFeGNlcHRpb25CbG9jaykgewotICAgIEJhc2ljQmxvY2sqIGlmTm9ybWFsID0gY3JlYXRlQmFzaWNCbG9jaygibm8gZXhjZXB0aW9uIGJsb2NrIik7Ci0gICAgY3VycmVudEJsb2NrID0gaWZOb3JtYWw7Ci0gICAgVmFsdWUqIGFyZ3NbMV07Ci0gICAgcmV0dXJuIGxsdm06Okludm9rZUluc3Q6OkNyZWF0ZShGLCBpZk5vcm1hbCwgY3VycmVudEV4Y2VwdGlvbkJsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncywgYXJncywgTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc2VydEF0RW5kKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gbGx2bTo6Q2FsbEluc3Q6OkNyZWF0ZShGLCBOYW1lLCBJbnNlcnRBdEVuZCk7Ci0gIH0KLX0KLQotdm9pZCBKYXZhSklUOjp0aHJvd0V4Y2VwdGlvbihsbHZtOjpGdW5jdGlvbiogRiwgVmFsdWUqIGFyZzEpIHsKLSAgaWYgKGN1cnJlbnRFeGNlcHRpb25CbG9jayAhPSBlbmRFeGNlcHRpb25CbG9jaykgewotICAgIFZhbHVlKiBleEFyZ3NbMV0gPSB7IGFyZzEgfTsKLSAgICBJbnZva2VJbnN0OjpDcmVhdGUoRiwgdW5pZmllZFVucmVhY2hhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RXhjZXB0aW9uQmxvY2ssIGV4QXJncywgZXhBcmdzICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIH0gZWxzZSB7Ci0gICAgQ2FsbEluc3Q6OkNyZWF0ZShGLCBhcmcxLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICBuZXcgVW5yZWFjaGFibGVJbnN0KGN1cnJlbnRCbG9jayk7Ci0gIH0KLX0KLQotdm9pZCBKYXZhSklUOjp0aHJvd0V4Y2VwdGlvbihWYWx1ZSogb2JqKSB7Ci0gIEZ1bmN0aW9uKiBGID0gbW9kdWxlLT5UaHJvd0V4Y2VwdGlvbkZ1bmN0aW9uOwotICBpZiAoY3VycmVudEV4Y2VwdGlvbkJsb2NrICE9IGVuZEV4Y2VwdGlvbkJsb2NrKSB7Ci0gICAgVmFsdWUqIGV4QXJnc1sxXSA9IHsgb2JqIH07Ci0gICAgSW52b2tlSW5zdDo6Q3JlYXRlKEYsIHVuaWZpZWRVbnJlYWNoYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEV4Y2VwdGlvbkJsb2NrLCBleEFyZ3MsIGV4QXJncyArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICIiLCBjdXJyZW50QmxvY2spOwotICB9IGVsc2UgewotICAgIENhbGxJbnN0OjpDcmVhdGUoRiwgb2JqLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICBuZXcgVW5yZWFjaGFibGVJbnN0KGN1cnJlbnRCbG9jayk7Ci0gIH0KLX0KLQotdm9pZCBKYXZhSklUOjp0aHJvd0V4Y2VwdGlvbihsbHZtOjpGdW5jdGlvbiogRiwgVmFsdWUqKiBhcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgbmJBcmdzKSB7Ci0gIGlmIChjdXJyZW50RXhjZXB0aW9uQmxvY2sgIT0gZW5kRXhjZXB0aW9uQmxvY2spIHsKLSAgICBJbnZva2VJbnN0OjpDcmVhdGUoRiwgdW5pZmllZFVucmVhY2hhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RXhjZXB0aW9uQmxvY2ssIGFyZ3MsIGFyZ3MgKyBuYkFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICIiLCBjdXJyZW50QmxvY2spOwotICB9IGVsc2UgewotICAgIENhbGxJbnN0OjpDcmVhdGUoRiwgYXJncywgYXJncyArIG5iQXJncywgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgbmV3IFVucmVhY2hhYmxlSW5zdChjdXJyZW50QmxvY2spOwotICB9Ci19Ci0KLS8vLyBIYW5kbGVyIC0gVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGV4Y2VwdGlvbiBoYW5kbGVyLiBJdCBpcyBvbmx5IG5lZWRlZAotLy8vIHdoZW4gcGFyc2luZyB0aGUgLmNsYXNzIGZpbGUgaW4gdGhlIEpJVCwgdGhlcmVmb3JlIGl0IGlzIG9ubHkgZGVmaW5lZAotLy8vIGhlcmUuIFRoZSByZWFkRXhjZXB0aW9uVGFibGUgZnVuY3Rpb24gaXMgdGhlIG9ubHkgZnVuY3Rpb24gdGhhdCBtYWtlcwotLy8vIHVzZSBvZiB0aGlzIGNsYXNzLgotc3RydWN0IEhhbmRsZXIgewotICAKLSAgLy8vIHN0YXJ0cGMgLSBUaGUgYnl0ZWNvZGUgbnVtYmVyIHRoYXQgYmVnaW5zIHRoZSB0cnkgY2xhdXNlLgotICB1aW50MzIgc3RhcnRwYzsKLQotICAvLy8gZW5kcGMgLSBUaGUgYnl0ZWNvZGUgbnVtYmVyIHRoYXQgZW5kcyB0aGUgdHJ5IGNsYXVzZS4KLSAgdWludDMyIGVuZHBjOwotCi0gIC8vLyBoYW5kbGVycGMgLSBUaGUgYnl0ZWNvZGUgbnVtYmVyIHdoZXJlIHRoZSBoYW5kbGVyIGNvZGUgc3RhcnRzLgotICB1aW50MzIgaGFuZGxlcnBjOwotCi0gIC8vLyBjYXRjaGUgLSBJbmRleCBpbiB0aGUgY29uc3RhbnQgcG9vbCBvZiB0aGUgZXhjZXB0aW9uIGNsYXNzLgotICB1aW50MTYgY2F0Y2hlOwotCi0gIC8vLyBjYXRjaENsYXNzIC0gVGhlIGNsYXNzIG9mIHRoZSBleGNlcHRpb246IGl0IG11c3QgYWx3YXlzIGJlIGxvYWRlZCBiZWZvcmUKLSAgLy8vIHJlYWRpbmcgdGhlIGV4Y2VwdGlvbiB0YWJsZSBzbyB0aGF0IHdlIGRvIG5vdCB0aHJvdyBhbiBleGNlcHRpb24KLSAgLy8vIHdoZW4gY29tcGlsaW5nLgotICBVc2VyQ2xhc3MqIGNhdGNoQ2xhc3M7Ci0KLSAgLy8vIGNhdGNoZXIgLSBUaGUgYmFzaWMgYmxvY2sgdGhhdCBjYXRjaGVzIHRoZSBleGNlcHRpb24uIFRoZSBjYXRjaGVyIGRlYWxzCi0gIC8vLyB3aXRoIExMVk0gY29kZWdlbiBhbmQgZGVjbGFyZXMgdGhlIGxsdm0uc2VsZWN0IG1ldGhvZC4gVGhpcyBibG9jayBpcyB0aGUKLSAgLy8vIGRlc3RpbmF0aW9uIG9mIGludm9rZSBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgaW4gdGhlIHRyeSBjbGF1c2UuCi0gIGxsdm06OkJhc2ljQmxvY2sqIGNhdGNoZXI7Ci0KLSAgLy8vIHRlc3RlciAtIFRoZSBiYXNpYyBibG9jayB0aGF0IHRlc3RzIGlmIHRoZSBleGNlcHRpb24gaXMgaGFuZGxlZCBieSB0aGlzCi0gIC8vLyBoYW5kbGVyLiBJZiB0aGUgaGFuZGxlciBpcyBub3QgdGhlIGZpcnN0IG9mIGEgbGlzdCBvZiBoYW5kbGVycyB3aXRoIHRoZQotICAvLy8gc2FtZSByYW5nZSwgdGhhbiB0aGlzIGJsb2NrIGlzIHRoZSBjYXRjaGVyIGJsb2NrLiBPdGhlcndpc2UsIGl0IGlzIHRoZQotICAvLy8gZGVzdGluYXRpb24gb2YgdGhlIGNhdGNoZXIgYmxvY2sgYW5kIG9mIHRoZSBoYW5kbGVycyB0aGF0IGRvIG5vdCBoYW5kbGVyCi0gIC8vLyB0aGUgZXhjZXB0aW9uLgotICBsbHZtOjpCYXNpY0Jsb2NrKiB0ZXN0ZXI7Ci0KLSAgLy8vIGphdmFIYW5kbGVyIC0gVGhlIEphdmEgY29kZSB0aGF0IGhhbmRsZXMgdGhlIGV4Y2VwdGlvbi4gQXQgdGhpcyBwb2ludCwgd2UKLSAgLy8vIGtub3cgd2UgaGF2ZSBjYXVnaHQgYW5kIGFyZSBoYW5kbGluZyB0aGUgZXhjZXB0aW9uLiBUaGUgSmF2YSBleGNlcHRpb24KLSAgLy8vIG9iamVjdCBpcyB0aGUgUEhJIG5vZGUgdGhhdCBiZWdpbnMgdGhpcyBibG9jay4KLSAgbGx2bTo6QmFzaWNCbG9jayogamF2YUhhbmRsZXI7Ci0KLSAgLy8vIG5hdGl2ZUhhbmRsZXIgLSBUaGUgQ1hYIGV4Y2VwdGlvbi1yZWxhdGVkIGNvZGUgdGhhdCBoYW5kbGVzIHRoZSBleGNlcHRpb24uCi0gIC8vLyBUaGUgYmxvY2sgY2xlYXJzIHRoZSBleGNlcHRpb24gZnJvbSB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50LCBjYWxscwotICAvLy8gdGhlIENYWCBiZWdpbiBhbmQgZW5kIGNhdGNoIG1ldGhvZHMgYW5kIGp1bXBzIHRvIHRoZSBKYXZhIGhhbmRsZXIuCi0gIGxsdm06OkJhc2ljQmxvY2sqIG5hdGl2ZUhhbmRsZXI7Ci0KLSAgLy8vIGV4Y2VwdGlvblBISSAtIFRoZSBDWFggZXhjZXB0aW9uIG9iamVjdCBmb3IgdGhlIHRlc3RlciBibG9jay4gVGhlCi0gIC8vLyB0ZXN0ZXIgaGFzIGluY29taW5nIGJsb2NrcywgZWl0aGVyIGZyb20gdGhlIGNhdGNoZXIgb3IgZnJvbSBvdGhlcgotICAvLy8gaGFuZGxlcnMgdGhhdCBkb24ndCBoYW5kbGUgdGhlIGV4Y2VwdGlvbi4gVGhlcmVmb3JlIGVhY2ggaW5jb21pbmcgYmxvY2sKLSAgLy8vIHNwZWNpZmllcyB0aGUgQ1hYIGV4Y2VwdGlvbiBvYmplY3QgdGhhdCB3YXMgY2F1Z2h0LgotICBsbHZtOjpQSElOb2RlKiBleGNlcHRpb25QSEk7Ci19OwotCi11bnNpZ25lZCBKYXZhSklUOjpyZWFkRXhjZXB0aW9uVGFibGUoUmVhZGVyJiByZWFkZXIsIHVpbnQzMiBjb2RlTGVuKSB7Ci0KLSAgLy8gVGhpcyBmdW5jdGlvbiB1c2VzIGN1cnJlbnRCbG9jayB0byBzaW1wbGlmeSB0aGluZ3MuIFdlIHNhdmUgdGhlIGN1cnJlbnQKLSAgLy8gdmFsdWUgb2YgY3VycmVudEJsb2NrIHRvIHJlc3RvcmUgaXQgYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24KLSAgQmFzaWNCbG9jayogdGVtcCA9IGN1cnJlbnRCbG9jazsKLSAgCi0gIHNpbnQxNiBuYmUgPSByZWFkZXIucmVhZFUyKCk7Ci0gIHNpbnQxNiBzeW5jID0gaXNTeW5jaHJvKGNvbXBpbGluZ01ldGhvZC0+YWNjZXNzKSA/IDEgOiAwOwotICBuYmUgKz0gc3luYzsKLSAKLSAgLy8gcmVhbEVuZEV4Y2VwdGlvbkJsb2NrIGlzIHRoZSBibG9jayB3aGVyZSBoYW5kbGVycyB3aWxsIHJlc3VtZSBpZgotICAvLyB0aGV5IGRvbid0IHRyZWF0IHRoZSBleGNlcHRpb24uIHJlYWxFbmRFeGNlcHRpb25CbG9jayBkb2VzIG5vdAotICAvLyBoYXZlIHRvIGNhdGNoIHRoZSBleGNlcHRpb24uCi0gIEJhc2ljQmxvY2sqIHJlYWxFbmRFeGNlcHRpb25CbG9jayA9IGVuZEV4Y2VwdGlvbkJsb2NrOwotCi0gIC8vIGVuZEV4Y2VwdGlvbkJsb2NrQ2F0Y2hlciBpcyB0aGUgYmxvY2sgd2hlcmUgZXZlcnkgaW5zdHJ1Y3Rpb24gd2lsbAotICAvLyB1bndpbmQuCi0gIEJhc2ljQmxvY2sqIGVuZEV4Y2VwdGlvbkJsb2NrQ2F0Y2hlciA9IGVuZEV4Y2VwdGlvbkJsb2NrOwotCi0gIGlmIChzeW5jKSB7Ci0gICAgLy8gc3luY2hyb25pemVFeGNlcHRpb25CbG9jayBpcyB0aGUgdGhlIGJsb2NrIHdoaWNoIHdpbGwgcmVsZWFzZSB0aGUgbG9jawotICAgIC8vIG9uIHRoZSBvYmplY3QuIHRyeVN5bmNocm9uaXplRXhjZXB0aW9uQmxvY2sgaXMgdGhlIGJsb2NrIHdoaWNoIHdpbGwKLSAgICAvLyBjYXRjaCB0aGUgZXhjZXB0aW9uIGlmIG9uZSBpcyB0aHJvd24uCi0gICAgQmFzaWNCbG9jayogc3luY2hyb25pemVFeGNlcHRpb25CbG9jayA9IAotICAgICAgICAgIGNyZWF0ZUJhc2ljQmxvY2soInN5bmNocm9uaXplRXhjZXB0aW9uQmxvY2siKTsKLSAgICBCYXNpY0Jsb2NrKiB0cnlTeW5jaHJvbml6ZUV4Y2VwdGlvbkJsb2NrID0gCi0gICAgICAgICAgY3JlYXRlQmFzaWNCbG9jaygidHJ5U3luY2hyb25pemVFeGNlcHRpb25CbG9jayIpOwotCi0gICAgLy8gU28gc3luY2hyb25pemVFeGNlcHRpb25CbG9jayBiZWNvbWVzIHRoZSBibG9jayB3aGVyZSBldmVyeSBpbnN0cnVjdGlvbnMKLSAgICAvLyB3aWxsIHVud2luZC4KLSAgICByZWFsRW5kRXhjZXB0aW9uQmxvY2sgPSBzeW5jaHJvbml6ZUV4Y2VwdGlvbkJsb2NrOwotICAgIGVuZEV4Y2VwdGlvbkJsb2NrQ2F0Y2hlciA9IHRyeVN5bmNocm9uaXplRXhjZXB0aW9uQmxvY2s7Ci0gICAgVmFsdWUqIGFyZ3NTeW5jID0gMDsKLSAgICBpZiAoaXNWaXJ0dWFsKGNvbXBpbGluZ01ldGhvZC0+YWNjZXNzKSkgewotICAgICAgYXJnc1N5bmMgPSBsbHZtRnVuY3Rpb24tPmFyZ19iZWdpbigpOwotICAgIH0gZWxzZSB7Ci0gICAgICBWYWx1ZSogY2wgPSBtb2R1bGUtPmdldEphdmFDbGFzcyhjb21waWxpbmdDbGFzcyk7Ci0gICAgICBhcmdzU3luYyA9IGNsOwotICAgIH0KLQotICAgIC8vIEluIHRoZSBzeW5jaHJvbml6ZUV4Y2VwdGlvbkJsb2NrOiByZWxlYXNlIHRoZSBvYmplY3QgYW5kIGdvIHRvCi0gICAgLy8gZW5kRXhjZXB0aW9uQmxvY2ssIHdoaWNoIHdpbGwgdW53aW5kIHRoZSBmdW5jdGlvbi4KLSAgICAKLSAgICBDYWxsSW5zdDo6Q3JlYXRlKG1vZHVsZS0+UmVsZWFzZU9iamVjdEZ1bmN0aW9uLCBhcmdzU3luYywgIiIsCi0gICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZUV4Y2VwdGlvbkJsb2NrKTsKLQotICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShlbmRFeGNlcHRpb25CbG9jaywgc3luY2hyb25pemVFeGNlcHRpb25CbG9jayk7Ci0gICAKLQotICAgIC8vIEluIHRoZSB0cnlTeW5jaHJvbml6ZUV4Y2VwdGlvbkJsb2NrOiBjYXRjaCB0aGUgZXhjZXB0aW9uIGFuZCBtb3ZlCi0gICAgLy8gdG8gc3luY2hyb25pemVFeGNlcHRpb25CbG9jay4KLQotICAgIGNvbnN0IFBvaW50ZXJUeXBlKiBQb2ludGVyVHlfMCA9IG1vZHVsZS0+cHRyVHlwZTsKLSAgICBJbnN0cnVjdGlvbiogcHRyX2VoX3B0ciA9IENhbGxJbnN0OjpDcmVhdGUobW9kdWxlLT5sbHZtR2V0RXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZWhfcHRyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeVN5bmNocm9uaXplRXhjZXB0aW9uQmxvY2spOwotICAgIENvbnN0YW50KiBDID0gQ29uc3RhbnRFeHByOjpnZXRDYXN0KEluc3RydWN0aW9uOjpCaXRDYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS0+cGVyc29uYWxpdHksIFBvaW50ZXJUeV8wKTsKLSAgICBWYWx1ZSogaW50MzJfZWhfc2VsZWN0X3BhcmFtc1szXSA9IAotICAgICAgeyBwdHJfZWhfcHRyLCBDLCBtb2R1bGUtPmNvbnN0YW50UHRyTnVsbCB9OwotICAgIENhbGxJbnN0OjpDcmVhdGUobW9kdWxlLT5leGNlcHRpb25TZWxlY3RvciwgaW50MzJfZWhfc2VsZWN0X3BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgIGludDMyX2VoX3NlbGVjdF9wYXJhbXMgKyAzLCAiZWhfc2VsZWN0IiwgCi0gICAgICAgICAgICAgICAgICAgICB0cnlTeW5jaHJvbml6ZUV4Y2VwdGlvbkJsb2NrKTsKLQotICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShzeW5jaHJvbml6ZUV4Y2VwdGlvbkJsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICB0cnlTeW5jaHJvbml6ZUV4Y2VwdGlvbkJsb2NrKTsKLQotICAgIC8vIE5vdyB3ZSBjYW4gc2V0IHRoZSB1bndpbmQgZGVzdGluYXRpb24gb2YgYWxsIGluc3RydWN0aW9ucyB0bwotICAgIC8vIHRoZSBleGNlcHRpb24gY2F0Y2hlci4KLSAgICBmb3IgKHVpbnQxNiBpID0gMDsgaSA8IGNvZGVMZW47ICsraSkgewotICAgICAgaWYgKG9wY29kZUluZm9zW2ldLmV4Y2VwdGlvbkJsb2NrID09IGVuZEV4Y2VwdGlvbkJsb2NrKSB7Ci0gICAgICAgIG9wY29kZUluZm9zW2ldLmV4Y2VwdGlvbkJsb2NrID0gdHJ5U3luY2hyb25pemVFeGNlcHRpb25CbG9jazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIG12bTo6VGhyZWFkQWxsb2NhdG9yIGFsbG9jYXRvcjsKLSAgLy8gTG9vcCBvdmVyIGFsbCBoYW5kbGVycyBpbiB0aGUgYnl0ZWNvZGUgdG8gaW5pdGlhbGl6ZSB0aGVpciB2YWx1ZXMuCi0gIEhhbmRsZXIqIGhhbmRsZXJzID0gKEhhbmRsZXIqKQotICAgICAgYWxsb2NhdG9yLkFsbG9jYXRlKHNpemVvZihIYW5kbGVyKSAqIChuYmUgLSBzeW5jKSk7Ci0gIGZvciAodWludDE2IGkgPSAwOyBpIDwgbmJlIC0gc3luYzsgKytpKSB7Ci0gICAgSGFuZGxlciogZXggICA9ICZoYW5kbGVyc1tpXTsKLSAgICBleC0+c3RhcnRwYyAgID0gcmVhZGVyLnJlYWRVMigpOwotICAgIGV4LT5lbmRwYyAgICAgPSByZWFkZXIucmVhZFUyKCk7Ci0gICAgZXgtPmhhbmRsZXJwYyA9IHJlYWRlci5yZWFkVTIoKTsKLQotICAgIGV4LT5jYXRjaGUgPSByZWFkZXIucmVhZFUyKCk7Ci0KLSAgICBpZiAoZXgtPmNhdGNoZSkgewotICAgICAgVXNlckNsYXNzKiBjbCA9IAotICAgICAgICAoVXNlckNsYXNzKikoY29tcGlsaW5nQ2xhc3MtPmN0cEluZm8tPmlzQ2xhc3NMb2FkZWQoZXgtPmNhdGNoZSkpOwotICAgICAgLy8gV2hlbiBsb2FkaW5nIHRoZSBjbGFzcywgd2UgbWFkZSBzdXJlIHRoYXQgYWxsIGV4Y2VwdGlvbiBjbGFzc2VzCi0gICAgICAvLyB3ZXJlIGxvYWRlZCwgc28gY2wgbXVzdCBoYXZlIGEgdmFsdWUuCi0gICAgICBhc3NlcnQoY2wgJiYgImV4Y2VwdGlvbiBjbGFzcyBoYXMgbm90IGJlZW4gbG9hZGVkIik7Ci0gICAgICBleC0+Y2F0Y2hDbGFzcyA9IGNsOwotICAgIH0gZWxzZSB7Ci0gICAgICBleC0+Y2F0Y2hDbGFzcyA9IHVwY2FsbHMtPm5ld1Rocm93YWJsZTsKLSAgICB9Ci0gICAgCi0gICAgZXgtPmNhdGNoZXIgPSBjcmVhdGVCYXNpY0Jsb2NrKCJ0ZXN0RXhjZXB0aW9uIik7Ci0gICAgCi0gICAgLy8gU2V0IHRoZSB1bndpbmQgZGVzdGluYXRpb24gb2YgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgcmFuZ2Ugb2YgdGhpcwotICAgIC8vIGhhbmRsZXIgdG8gdGhlIHRlc3QgYmxvY2sgb2YgdGhlIGhhbmRsZXIuIElmIGFuIGluc3RydWN0aW9uIGFscmVhZHkgaGFzCi0gICAgLy8gYSBoYW5kbGVyIGFuZCB0aHVzIGlzIG5vdCB0aGUgc3luY2hyb25pemUgb3IgcmVndWxhciBlbmQgaGFuZGxlciBibG9jaywKLSAgICAvLyBsZWF2ZSBpdCBhcy1pcy4KLSAgICBmb3IgKHVpbnQxNiBpID0gZXgtPnN0YXJ0cGM7IGkgPCBleC0+ZW5kcGM7ICsraSkgewotICAgICAgaWYgKG9wY29kZUluZm9zW2ldLmV4Y2VwdGlvbkJsb2NrID09IGVuZEV4Y2VwdGlvbkJsb2NrQ2F0Y2hlcikgewotICAgICAgICBvcGNvZGVJbmZvc1tpXS5leGNlcHRpb25CbG9jayA9IGV4LT5jYXRjaGVyOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIHRoZSBoYW5kbGVyIHBjIGRvZXMgbm90IGFscmVhZHkgaGF2ZSBhIGJsb2NrLCBjcmVhdGUgYSBuZXcgb25lLgotICAgIGlmICghKG9wY29kZUluZm9zW2V4LT5oYW5kbGVycGNdLm5ld0Jsb2NrKSkgewotICAgICAgb3Bjb2RlSW5mb3NbZXgtPmhhbmRsZXJwY10ubmV3QmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJqYXZhSGFuZGxlciIpOwotICAgIH0KLSAgICAKLSAgICAvLyBTZXQgdGhlIEphdmEgaGFuZGxlciBmb3IgdGhpcyBleGNlcHRpb24uCi0gICAgZXgtPmphdmFIYW5kbGVyID0gb3Bjb2RlSW5mb3NbZXgtPmhhbmRsZXJwY10ubmV3QmxvY2s7Ci0gICAgb3Bjb2RlSW5mb3NbZXgtPmhhbmRsZXJwY10uaGFuZGxlciA9IHRydWU7Ci0KLSAgICAvLyBTZXQgdGhlIG5hdGl2ZSBoYW5kbGVyIG9mIHRoaXMgZXhjZXB0aW9uLCB3aGljaCB3aWxsIGNhdGNoIHRoZSBleGNlcHRpb24KLSAgICAvLyBvYmplY3QuCi0gICAgZXgtPm5hdGl2ZUhhbmRsZXIgPSBjcmVhdGVCYXNpY0Jsb2NrKCJuYXRpdmVIYW5kbGVyIik7Ci0gIH0KLQotICAvLyBMb29wIG92ZXIgYWxsIGhhbmRsZXJzIHRvIGtub3cgd2hpY2ggb25lcyBoYXZlIHRoZSBzYW1lIHJhbmdlLiBIYW5kbGVycwotICAvLyB3aXRoIGEgc2FtZSByYW5nZSBhbGwgdmVyaWZ5IHRoZSBleGNlcHRpb24ncyBjbGFzcywgYnV0IG9ubHkgb25lIGNhdGNoZXMKLSAgLy8gdGhlIGV4Y2VwdGlvbi4gVGhpcyBpcyB0aGUgcmVhc29uIHdoeSB3ZSBoYXZlIGEgdGVzdGVyIGJsb2NrCi0gIC8vIGFuZCBhIGNhdGNoZXIgYmxvY2s6IHRoZSBmaXJzdCBvbmUgdGVzdHMgdGhlIGV4Y2VwdGlvbidzIGNsYXNzLCBhbmQgdGhlCi0gIC8vIHNlY29uZCBvbmUgY2F0Y2hlcyB0aGUgZXhjZXB0aW9uLgotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChzaW50MTYgaSA9IDA7IGkgPCBuYmUgLSBzeW5jOyArK2kpIHsKLSAgICBIYW5kbGVyKiBjdXIgPSAmaGFuZGxlcnNbaV07Ci0KLSAgICAvLyBJZiB3ZSBhcmUgdGhlIGZpcnN0IGhhbmRsZXIsIHdlIG11c3QgaGF2ZSBvbmUgYmxvY2sgZm9yIGNhdGNoaW5nCi0gICAgLy8gdGhlIGV4Y2VwdGlvbiwgYW5kIG9uZSBibG9jayBmb3IgY29tcGFyaW5nIHRoZSBleGNlcHRpb24uIFRoZSBmb3JtZXIKLSAgICAvLyBpcyBjYXRjaGVyIGFuZCB0aGUgbGF0dGVyIGlzIHRlc3Rlci4gSGFuZGxlcnMgdGhhdCBsaXZlIGluCi0gICAgLy8gdGhlIHJhbmdlIG9mIHRoaXMgaGFuZGxlciB3aWxsIGp1bXAgdG8gdGVzdGVyIGJlY2F1c2UgdGhleQotICAgIC8vIGhhdmUgYWxyZWFkeSBjYXRjaGVkIHRoZSBleGNlcHRpb24uIFRoZSBvdGhlciBpbnN0cnVjdGlvbnMgaW4gdGhlIHJhbmdlCi0gICAgLy8gb2YgdGhpcyBoYW5kbGVyIHdpbGwganVtcCB0byBjYXRjaGVyIGJlY2F1c2UgdGhlCi0gICAgLy8gZXhjZXB0aW9uIHN0aWxsIGhhcyB0byBiZSBjYXRjaGVkLgotICAgIGlmIChmaXJzdCkgewotICAgICAgY3VyLT50ZXN0ZXIgPSBjcmVhdGVCYXNpY0Jsb2NrKCJyZWFsVGVzdEV4Y2VwdGlvbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBjdXItPnRlc3RlciA9IGN1ci0+Y2F0Y2hlcjsKLSAgICB9Ci0gICAKLSAgICAvLyBTZXQgdGhlIGV4Y2VwdGlvbiBhcyBhIHBoaSBub2RlLiBUaGlzIFBISSBoYXMgdHdvIHR5cGVzIG9mIGluY29taW5nCi0gICAgLy8gbm9kZXM6Ci0gICAgLy8gLSBIYW5kbGVycyB3aXRoaW4gdGhlIHJhbmdlOiB0aGV5IGhhdmUgYWxyZWFkeSBjYXRjaGVkIHRoZSBleGNlcHRpb24KLSAgICAvLyAgIGFuZCB2ZXJpZmllZCBpdHMgdHlwZS4gVGhleSBhcmUgbm90IHRoZSByaWdodCBoYW5kbGVyIGZvciB0aGUKLSAgICAvLyAgIGV4Y2VwdGlvbiwgc28gdGhleSBqdW1wIHRvIHRoaXMgaGFuZGxlcgotICAgIC8vIC0gVGhlIHRlc3RFeGNlcHRpb24gYmxvY2sgb2YgdGhpcyBoYW5kbGVyICh3aGljaCBpcyB1bmlxdWUpLiBJdCBoYXMKLSAgICAvLyAgIGNhdGNoZWQgdGhlIGV4Y2VwdGlvbiBhbmQgaXMgbm93IGp1bXBpbmcgdG8gcGVyZm9ybSB0aGUgdGVzdC4KLSAgICBjdXItPmV4Y2VwdGlvblBISSA9IFBISU5vZGU6OkNyZWF0ZShtb2R1bGUtPnB0clR5cGUsICIiLCBjdXItPnRlc3Rlcik7Ci0KLSAgICAvLyBMb29rIGlmIHRoZSBuZXh0IGhhbmRsZXIgaGFzIHRoZSBzYW1lIHJhbmdlIG9yIGhhcyBhIGRpZmZlcmVudCByYW5nZS4KLSAgICAvLyBJZiBpdCdzIGluIHRoZSBzYW1lIHJhbmdlLCB0aGVuIG5vIG5lZWQgdG8gY2F0Y2ggdGhlIGV4Y2VwdGlvbi4KLSAgICAvLyBPdGhlcndpc2UsIGl0J3MgYSBuZXcgcmFuZ2UgYW5kIHdlIG5lZWQgdG8gY2F0Y2ggdGhlIGV4Y2VwdGlvbi4KLSAgICBpZiAoaSArIDEgIT0gbmJlIC0gc3luYykgewotICAgICAgSGFuZGxlciogbmV4dCA9ICZoYW5kbGVyc1tpICsgMV07Ci0gICAgICAKLSAgICAgIGlmIChjdXItPnN0YXJ0cGMgPT0gbmV4dC0+c3RhcnRwYyAmJiBjdXItPmVuZHBjID09IG5leHQtPmVuZHBjKSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmaXJzdCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfSAKLSAgfQotICAKLQotICAvLyBMb29wIG92ZXIgYWxsIGhhbmRsZXJzIHRvIGltcGxlbWVudCB0aGVpciBjYXRjaGVyIGFuZCB0ZXN0ZXIuCi0gIGZvciAoc2ludDE2IGkgPSAwOyBpIDwgbmJlIC0gc3luYzsgKytpKSB7Ci0gICAgSGFuZGxlciogY3VyID0gJmhhbmRsZXJzW2ldOwotICAgIEJhc2ljQmxvY2sqIGJiTmV4dCA9IDA7Ci0gICAgUEhJTm9kZSogbm9kZU5leHQgPSAwOwotICAgIGN1cnJlbnRFeGNlcHRpb25CbG9jayA9IG9wY29kZUluZm9zW2N1ci0+aGFuZGxlcnBjXS5leGNlcHRpb25CbG9jazsKLQotICAgIC8vIExvb2sgb3V0IHdoZXJlIHdlIGdvIGlmIHdlJ3JlIG5vdCB0aGUgaGFuZGxlciBmb3IgdGhlIGV4Y2VwdGlvbi4KLSAgICBpZiAoaSArIDEgIT0gbmJlIC0gc3luYykgewotICAgICAgSGFuZGxlciogbmV4dCA9ICZoYW5kbGVyc1tpICsgMV07Ci0gICAgICBpZiAoIShjdXItPnN0YXJ0cGMgPj0gbmV4dC0+c3RhcnRwYyAmJiBjdXItPmVuZHBjIDw9IG5leHQtPmVuZHBjKSkgewotICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBoYW5kbGVyIHRvIGdvIHRvIChlaXRoZXIgb25lIHRoYXQgaGFzIHRoZSBzYW1lIHJhbmdlCi0gICAgICAgIC8vIG9yIG9uZSB0aGF0IGNvbnRhaW5zIHRoZSByYW5nZSksIHRoZW4gd2UganVtcCB0byB0aGUgZW5kIGhhbmRsZXIuCi0gICAgICAgIGJiTmV4dCA9IHJlYWxFbmRFeGNlcHRpb25CbG9jazsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIElmIHRoZXJlJ3MgYSBoYW5kbGVyIHRvIGdvdG8sIHdlIGp1bXAgdG8gaXRzIHRlc3RlciBibG9jayBhbmQgcmVjb3JkCi0gICAgICAgIC8vIHRoZSBleGNlcHRpb24gUEhJIG5vZGUgdG8gZ2l2ZSBvdXIgZXhjZXB0aW9uIHRvIHRoZSB0ZXN0ZXIuCi0gICAgICAgIGJiTmV4dCA9IG5leHQtPnRlc3RlcjsKLSAgICAgICAgbm9kZU5leHQgPSBuZXh0LT5leGNlcHRpb25QSEk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gaGFuZGxlciBhZnRlciB1cywgd2UganVtcCB0byB0aGUgZW5kIGhhbmRsZXIuCi0gICAgICBiYk5leHQgPSByZWFsRW5kRXhjZXB0aW9uQmxvY2s7Ci0gICAgfQotCi0gICAgLy8gSWYgdGhlIHRlc3RlciBhbmQgdGhlIGNhdGNoZXIgaXMgbm90IHRoZSBzYW1lLCB0aGVuIHdlIG11c3QgaW1wbGVtZW50Ci0gICAgLy8gdGhlIGNhdGNoZXIuIFRoZSBjYXRjaGVyIGNhdGNoZXMgdGhlIGV4Y2VwdGlvbiwganVtcHMgdG8gdGhlIHRlc3RlcgotICAgIC8vIGFuZCBnaXZlcyB0aGUgZXhjZXB0aW9uIGFzIGFuIGluY29taW5nIG5vZGUgdGhlIHRoZSBleGNlcHRpb25QSEkuCi0gICAgaWYgKGN1ci0+dGVzdGVyICE9IGN1ci0+Y2F0Y2hlcikgewotICAgICAgY29uc3QgUG9pbnRlclR5cGUqIFBvaW50ZXJUeV8wID0gbW9kdWxlLT5wdHJUeXBlOwotICAgICAgSW5zdHJ1Y3Rpb24qIHB0cl9laF9wdHIgPSAKLSAgICAgICAgQ2FsbEluc3Q6OkNyZWF0ZShtb2R1bGUtPmxsdm1HZXRFeGNlcHRpb24sICJlaF9wdHIiLCBjdXItPmNhdGNoZXIpOwotICAgICAgQ29uc3RhbnQqIEMgPSBDb25zdGFudEV4cHI6OmdldENhc3QoSW5zdHJ1Y3Rpb246OkJpdENhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUtPnBlcnNvbmFsaXR5LCBQb2ludGVyVHlfMCk7Ci0gICAgICBWYWx1ZSogaW50MzJfZWhfc2VsZWN0X3BhcmFtc1szXSA9IAotICAgICAgICB7IHB0cl9laF9wdHIsIEMsIG1vZHVsZS0+Y29uc3RhbnRQdHJOdWxsIH07Ci0gICAgICBsbHZtOjpDYWxsSW5zdDo6Q3JlYXRlKG1vZHVsZS0+ZXhjZXB0aW9uU2VsZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX2VoX3NlbGVjdF9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX2VoX3NlbGVjdF9wYXJhbXMgKyAzLCAiZWhfc2VsZWN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyLT5jYXRjaGVyKTsKLSAgICAgIGxsdm06OkJyYW5jaEluc3Q6OkNyZWF0ZShjdXItPnRlc3RlciwgY3VyLT5jYXRjaGVyKTsKLSAgICAgIGN1ci0+ZXhjZXB0aW9uUEhJLT5hZGRJbmNvbWluZyhwdHJfZWhfcHRyLCBjdXItPmNhdGNoZXIpOwotICAgIH0gCi0gICAgCi0gICAgY3VycmVudEJsb2NrID0gY3VyLT50ZXN0ZXI7Ci0gICAgCi0gICAgVmFsdWUqIGNsVmFyID0gMDsgCi0KLSAgICAvLyBXZSBrbm93IGNhdGNoQ2xhc3MgZXhpc3RzIGJlY2F1c2Ugd2UgaGF2ZSBsb2FkZWQgYWxsIGV4Y2VwdGlvbnMgY2F0Y2hlZAotICAgIC8vIGJ5IHRoZSBtZXRob2Qgd2hlbiB3ZSBsb2FkZWQgdGhlIGNsYXNzIHRoYXQgZGVmaW5lZCB0aGlzIG1ldGhvZC4KLSAgICBjbFZhciA9IG1vZHVsZS0+Z2V0TmF0aXZlQ2xhc3MoY3VyLT5jYXRjaENsYXNzKTsKLQotICAgIGlmIChjbFZhci0+Z2V0VHlwZSgpICE9IG1vZHVsZS0+SmF2YUNvbW1vbkNsYXNzVHlwZSkgCi0gICAgICBjbFZhciA9IG5ldyBCaXRDYXN0SW5zdChjbFZhciwgbW9kdWxlLT5KYXZhQ29tbW9uQ2xhc3NUeXBlLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gICAKLQkJVmFsdWUqIG11dGF0b3JUaHJlYWRJZCA9IGdldE11dGF0b3JUaHJlYWRQdHIoKTsKLQkJVmFsdWUqIGphdmFUaHJlYWRJZCA9IGdldEphdmFUaHJlYWRQdHIobXV0YXRvclRocmVhZElkKTsKLSAgICBWYWx1ZSogamF2YUV4Y2VwdGlvblB0ciA9IGdldEdldEphdmFFeGNlcHRpb25QdHIoamF2YVRocmVhZElkKTsKLSAgICAKLSAgICAvLyBHZXQgdGhlIEphdmEgZXhjZXB0aW9uLgotICAgIFZhbHVlKiBvYmogPSBuZXcgTG9hZEluc3QoamF2YUV4Y2VwdGlvblB0ciwgIiIsIGN1cnJlbnRCbG9jayk7Ci0KLSAgICBWYWx1ZSogb2JqQ2wgPSBDYWxsSW5zdDo6Q3JlYXRlKG1vZHVsZS0+R2V0Q2xhc3NGdW5jdGlvbiwgb2JqLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0KLSAgICBWYWx1ZSogZGVwdGhDbCA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6SW50MzJUeSwgY3VyLT5jYXRjaENsYXNzLT5kZXB0aCk7Ci0gICAgVmFsdWUqIGRlcHRoQ2xPYmogPSBDYWxsSW5zdDo6Q3JlYXRlKG1vZHVsZS0+R2V0RGVwdGhGdW5jdGlvbiwgb2JqQ2wsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICAgIAotICAgIC8vIENvbXBhcmUgdGhlIGV4Y2VwdGlvbiB3aXRoIHRoZSBleGNlcHRpb24gY2xhc3Mgd2UgY2F0Y2guCi0gICAgVmFsdWUqIGNtcCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9VTEUsIGRlcHRoQ2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aENsT2JqLCAiIik7Ci0KLSAgICBCYXNpY0Jsb2NrKiBzdXBEZXB0aCA9IGNyZWF0ZUJhc2ljQmxvY2soInN1cGVyaW9yIGRlcHRoIik7Ci0gICAgICAgICAgICAKLSAgICBCcmFuY2hJbnN0OjpDcmVhdGUoc3VwRGVwdGgsIGJiTmV4dCwgY21wLCBjdXJyZW50QmxvY2spOwotICAgIAotICAgIGlmIChub2RlTmV4dCkKLSAgICAgIG5vZGVOZXh0LT5hZGRJbmNvbWluZyhjdXItPmV4Y2VwdGlvblBISSwgY3VycmVudEJsb2NrKTsKLSAgCi0gICAgY3VycmVudEJsb2NrID0gc3VwRGVwdGg7Ci0gICAgVmFsdWUqIGluRGlzcGxheSA9IENhbGxJbnN0OjpDcmVhdGUobW9kdWxlLT5HZXREaXNwbGF5RnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqQ2wsICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICAgICAgCi0gICAgVmFsdWUqIGRpc3BsYXlBcmdzWzJdID0geyBpbkRpc3BsYXksIGRlcHRoQ2wgfTsKLSAgICBWYWx1ZSogY2xJbkRpc3BsYXkgPSBDYWxsSW5zdDo6Q3JlYXRlKG1vZHVsZS0+R2V0Q2xhc3NJbkRpc3BsYXlGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlBcmdzLCBkaXNwbGF5QXJncyArIDIsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgICAgICAgICAgICAKLSAgICBjbXAgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfRVEsIGNsSW5EaXNwbGF5LCBjbFZhciwKLSAgICAgICAgICAgICAgICAgICAgICAgIiIpOwotICAgIAotICAgIC8vIElmIHdlIGFyZSBjYXRjaGluZyB0aGlzIGV4Y2VwdGlvbiwgdGhlbiBqdW1wIHRvIHRoZSBuYXRpdmVIYW5kbGVyLAotICAgIC8vIG90aGVyd2lzZSBqdW1wIHRvIG91ciBuZXh0IGhhbmRsZXIuCi0gICAgQnJhbmNoSW5zdDo6Q3JlYXRlKGN1ci0+bmF0aXZlSGFuZGxlciwgYmJOZXh0LCBjbXAsIGN1cnJlbnRCbG9jayk7IAotCi0gICAgLy8gQWRkIHRoZSBpbmNvbWluZyB2YWx1ZSB0byB0aGUgbmV4dCBoYW5kbGVyLCB3aGljaCBpcyB0aGUgZXhjZXB0aW9uIHdlCi0gICAgLy8ganVzdCBjYXRjaGVkLgotICAgIGlmIChub2RlTmV4dCkKLSAgICAgIG5vZGVOZXh0LT5hZGRJbmNvbWluZyhjdXItPmV4Y2VwdGlvblBISSwgY3VycmVudEJsb2NrKTsKLSAgICAKLSAgICBjdXJyZW50QmxvY2sgPSBjdXItPm5hdGl2ZUhhbmRsZXI7Ci0gCi0JCW11dGF0b3JUaHJlYWRJZCA9IGdldE11dGF0b3JUaHJlYWRQdHIoKTsKLQkJamF2YVRocmVhZElkID0gZ2V0SmF2YVRocmVhZFB0cihtdXRhdG9yVGhyZWFkSWQpOwotICAgIGphdmFFeGNlcHRpb25QdHIgPSBnZXRHZXRKYXZhRXhjZXB0aW9uUHRyKGphdmFUaHJlYWRJZCk7Ci0gICAgCi0gICAgLy8gR2V0IHRoZSBKYXZhIGV4Y2VwdGlvbi4KLSAgICBWYWx1ZSogZXhjID0gbmV3IExvYWRJbnN0KGphdmFFeGNlcHRpb25QdHIsICIiLCBjdXJyZW50QmxvY2spOwotICAgIFZhbHVlKiBjeHhFeGNlcHRpb25QdHIgPSBnZXRDWFhFeGNlcHRpb25QdHIobXV0YXRvclRocmVhZElkKTsKLQotICAgIC8vIENsZWFyIGV4Y2VwdGlvbnMuCi0gICAgbmV3IFN0b3JlSW5zdChtb2R1bGUtPmNvbnN0YW50UHRyTnVsbCwgY3h4RXhjZXB0aW9uUHRyLCBjdXJyZW50QmxvY2spOwotICAgIG5ldyBTdG9yZUluc3QobW9kdWxlLT5KYXZhT2JqZWN0TnVsbENvbnN0YW50LCBqYXZhRXhjZXB0aW9uUHRyLAotICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLQotICAgIC8vIENhbGwgdGhlIENYWCBiZWdpbiBhbmQgZW5kIGNhdGNoZXIuCi0gICAgQ2FsbEluc3Q6OkNyZWF0ZShtb2R1bGUtPmV4Y2VwdGlvbkJlZ2luQ2F0Y2gsIGN1ci0+ZXhjZXB0aW9uUEhJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgInRtcDgiLCBjdXItPm5hdGl2ZUhhbmRsZXIpOwotICAgIENhbGxJbnN0OjpDcmVhdGUobW9kdWxlLT5leGNlcHRpb25FbmRDYXRjaCwgIiIsIGN1ci0+bmF0aXZlSGFuZGxlcik7Ci0KLSAgICAvLyBXZSBjYW4gbm93IGp1bXAgdG8gdGhlIEphdmEgaGFuZGxlciEKLSAgICBCcmFuY2hJbnN0OjpDcmVhdGUoY3VyLT5qYXZhSGFuZGxlciwgY3VyLT5uYXRpdmVIYW5kbGVyKTsKLQotICAgIC8vIElmIHRoZSBKYXZhIGhhbmRsZXIgaXMgZW1wdHksIGNyZWF0ZSBhIFBISSBub2RlIHRoYXQgd2lsbCBjb250YWluIHRoZQotICAgIC8vIGV4Y2VwdGlvbiBhbmQgZ2l2ZSBvdXIgb3duLgotICAgIGlmIChjdXItPmphdmFIYW5kbGVyLT5lbXB0eSgpKSB7Ci0gICAgICBQSElOb2RlKiBub2RlID0gUEhJTm9kZTo6Q3JlYXRlKEpuanZtTW9kdWxlOjpKYXZhT2JqZWN0VHlwZSwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ci0+amF2YUhhbmRsZXIpOwotICAgICAgbm9kZS0+YWRkSW5jb21pbmcoZXhjLCBjdXItPm5hdGl2ZUhhbmRsZXIpOwotICAgICAgCi0gICAgfSBlbHNlIHsKLSAgICAgIC8vIElmIHRoZSBKYXZhIGhhbmRsZXIgaXMgbm90IGVtcHR5LCB0aGVuIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBpcyB0aGUKLSAgICAgIC8vIFBISSBub2RlLiBHaXZlIGl0IG91ciBvd24uCi0gICAgICBJbnN0cnVjdGlvbiogaW5zbiA9IGN1ci0+amF2YUhhbmRsZXItPmJlZ2luKCk7Ci0gICAgICBQSElOb2RlKiBub2RlID0gZHluX2Nhc3Q8UEhJTm9kZT4oaW5zbik7Ci0gICAgICBhc3NlcnQobm9kZSAmJiAibWFsZm9ybWVkIGV4Y2VwdGlvbnMiKTsKLSAgICAgIG5vZGUtPmFkZEluY29taW5nKGV4YywgY3VyLT5uYXRpdmVIYW5kbGVyKTsKLSAgICB9Ci0KLSAgfQotIAotICAvLyBSZXN0b3JlIGN1cnJlbnRCbG9jay4KLSAgY3VycmVudEJsb2NrID0gdGVtcDsKLSAgcmV0dXJuIG5iZTsKLQotfQotCi12b2lkIEphdmFKSVQ6OmZpbmlzaEV4Y2VwdGlvbnMoKSB7Ci0gIHByZWRfaXRlcmF0b3IgUEkgPSBwcmVkX2JlZ2luKGVuZEV4Y2VwdGlvbkJsb2NrKTsKLSAgcHJlZF9pdGVyYXRvciBQRSA9IHByZWRfZW5kKGVuZEV4Y2VwdGlvbkJsb2NrKTsKLSAgaWYgKFBJID09IFBFKSB7Ci0gICAgZW5kRXhjZXB0aW9uQmxvY2stPmVyYXNlRnJvbVBhcmVudCgpOwotICB9IGVsc2UgewotICAgIFZhbHVlKiBjeHhFeGNlcHRpb25QdHIgPSBnZXRDWFhFeGNlcHRpb25QdHIoZ2V0TXV0YXRvclRocmVhZFB0cigpKTsKLSAgICBWYWx1ZSogY3h4RXhjZXB0aW9uID0gbmV3IExvYWRJbnN0KGN4eEV4Y2VwdGlvblB0ciwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgbGx2bTo6Q2FsbEluc3Q6OkNyZWF0ZShtb2R1bGUtPnVud2luZFJlc3VtZSwgY3h4RXhjZXB0aW9uLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICBuZXcgVW5yZWFjaGFibGVJbnN0KGN1cnJlbnRCbG9jayk7Ci0gIH0KLSAgCi0gIFBJID0gcHJlZF9iZWdpbih1bmlmaWVkVW5yZWFjaGFibGUpOwotICBQRSA9IHByZWRfZW5kKHVuaWZpZWRVbnJlYWNoYWJsZSk7Ci0gIGlmIChQSSA9PSBQRSkgewotICAgIHVuaWZpZWRVbnJlYWNoYWJsZS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gIH0gZWxzZSB7Ci0gICAgbmV3IFVucmVhY2hhYmxlSW5zdCh1bmlmaWVkVW5yZWFjaGFibGUpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9KMy9Db21waWxlci9KM0ludHJpbnNpY3MuY3BwIGIvdm1raXQvbGliL0ozL0NvbXBpbGVyL0ozSW50cmluc2ljcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NTAzM2UuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL0ozL0NvbXBpbGVyL0ozSW50cmluc2ljcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tIEozSW50cmluc2ljcy5jcHAgLSBJbnRyaW5zaWNzIGZvciBKMyAtLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgotI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCi0jaW5jbHVkZSAibGx2bS9MTFZNQ29udGV4dC5oIgotI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCi0KLSNpbmNsdWRlICJtdm0vSklULmgiCi0KLSNpbmNsdWRlICJKYXZhQWNjZXNzLmgiCi0jaW5jbHVkZSAiSmF2YUFycmF5LmgiCi0jaW5jbHVkZSAiSmF2YUNsYXNzLmgiCi0jaW5jbHVkZSAiSmF2YVR5cGVzLmgiCi0KLSNpbmNsdWRlICJqMy9KM0ludHJpbnNpY3MuaCIKLSNpbmNsdWRlICJqMy9MTFZNSW5mby5oIgotCi11c2luZyBuYW1lc3BhY2UgajM7Ci11c2luZyBuYW1lc3BhY2UgbGx2bTsKLQotbmFtZXNwYWNlIGozIHsgCi0gIG5hbWVzcGFjZSBsbHZtX3J1bnRpbWUgeyAKLSAgICAjaW5jbHVkZSAiTExWTVJ1bnRpbWUuaW5jIgotICB9Ci19Ci0KLUozSW50cmluc2ljczo6SjNJbnRyaW5zaWNzKGxsdm06Ok1vZHVsZSogbW9kdWxlKSA6Ci0gIEJhc2VJbnRyaW5zaWNzKG1vZHVsZSkgewotICBqMzo6bGx2bV9ydW50aW1lOjptYWtlTExWTU1vZHVsZUNvbnRlbnRzKG1vZHVsZSk7Ci0gIAotICBMTFZNQ29udGV4dCYgQ29udGV4dCA9IG1vZHVsZS0+Z2V0Q29udGV4dCgpOwotCi0gIENvbnN0YW50UG9vbFR5cGUgPSBwdHJQdHJUeXBlOwotICAKLSAgSmF2YU9iamVjdFR5cGUgPSAKLSAgICBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKG1vZHVsZS0+Z2V0VHlwZUJ5TmFtZSgiSmF2YU9iamVjdCIpKTsKLQotICBKYXZhT2JqZWN0UHRyVHlwZSA9IFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoSmF2YU9iamVjdFR5cGUpOwotCi0gIEphdmFBcnJheVR5cGUgPQotICAgIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwobW9kdWxlLT5nZXRUeXBlQnlOYW1lKCJKYXZhQXJyYXkiKSk7Ci0gIAotICBKYXZhQ29tbW9uQ2xhc3NUeXBlID0KLSAgICBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKG1vZHVsZS0+Z2V0VHlwZUJ5TmFtZSgiSmF2YUNvbW1vbkNsYXNzIikpOwotICBKYXZhQ2xhc3NQcmltaXRpdmVUeXBlID0KLSAgICBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKG1vZHVsZS0+Z2V0VHlwZUJ5TmFtZSgiSmF2YUNsYXNzUHJpbWl0aXZlIikpOwotICBKYXZhQ2xhc3NBcnJheVR5cGUgPQotICAgIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwobW9kdWxlLT5nZXRUeXBlQnlOYW1lKCJKYXZhQ2xhc3NBcnJheSIpKTsKLSAgSmF2YUNsYXNzVHlwZSA9Ci0gICAgUG9pbnRlclR5cGU6OmdldFVucXVhbChtb2R1bGUtPmdldFR5cGVCeU5hbWUoIkphdmFDbGFzcyIpKTsKLSAgCi0gIEphdmFBcnJheVVJbnQ4VHlwZSA9Ci0gICAgUG9pbnRlclR5cGU6OmdldFVucXVhbChtb2R1bGUtPmdldFR5cGVCeU5hbWUoIkFycmF5VUludDgiKSk7Ci0gIEphdmFBcnJheVNJbnQ4VHlwZSA9Ci0gICAgUG9pbnRlclR5cGU6OmdldFVucXVhbChtb2R1bGUtPmdldFR5cGVCeU5hbWUoIkFycmF5U0ludDgiKSk7Ci0gIEphdmFBcnJheVVJbnQxNlR5cGUgPQotICAgIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwobW9kdWxlLT5nZXRUeXBlQnlOYW1lKCJBcnJheVVJbnQxNiIpKTsKLSAgSmF2YUFycmF5U0ludDE2VHlwZSA9Ci0gICAgUG9pbnRlclR5cGU6OmdldFVucXVhbChtb2R1bGUtPmdldFR5cGVCeU5hbWUoIkFycmF5U0ludDE2IikpOwotICBKYXZhQXJyYXlVSW50MzJUeXBlID0KLSAgICBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKG1vZHVsZS0+Z2V0VHlwZUJ5TmFtZSgiQXJyYXlVSW50MzIiKSk7Ci0gIEphdmFBcnJheVNJbnQzMlR5cGUgPQotICAgIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwobW9kdWxlLT5nZXRUeXBlQnlOYW1lKCJBcnJheVNJbnQzMiIpKTsKLSAgSmF2YUFycmF5TG9uZ1R5cGUgPQotICAgIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwobW9kdWxlLT5nZXRUeXBlQnlOYW1lKCJBcnJheUxvbmciKSk7Ci0gIEphdmFBcnJheUZsb2F0VHlwZSA9Ci0gICAgUG9pbnRlclR5cGU6OmdldFVucXVhbChtb2R1bGUtPmdldFR5cGVCeU5hbWUoIkFycmF5RmxvYXQiKSk7Ci0gIEphdmFBcnJheURvdWJsZVR5cGUgPQotICAgIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwobW9kdWxlLT5nZXRUeXBlQnlOYW1lKCJBcnJheURvdWJsZSIpKTsKLSAgSmF2YUFycmF5T2JqZWN0VHlwZSA9Ci0gICAgUG9pbnRlclR5cGU6OmdldFVucXVhbChtb2R1bGUtPmdldFR5cGVCeU5hbWUoIkFycmF5T2JqZWN0IikpOwotCi0gIEphdmFGaWVsZFR5cGUgPQotICAgIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwobW9kdWxlLT5nZXRUeXBlQnlOYW1lKCJKYXZhRmllbGQiKSk7Ci0gIEphdmFNZXRob2RUeXBlID0KLSAgICBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKG1vZHVsZS0+Z2V0VHlwZUJ5TmFtZSgiSmF2YU1ldGhvZCIpKTsKLSAgVVRGOFR5cGUgPQotICAgIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwobW9kdWxlLT5nZXRUeXBlQnlOYW1lKCJVVEY4IikpOwotICBBdHRyaWJ1dFR5cGUgPQotICAgIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwobW9kdWxlLT5nZXRUeXBlQnlOYW1lKCJBdHRyaWJ1dCIpKTsKLSAgSmF2YVRocmVhZFR5cGUgPQotICAgIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwobW9kdWxlLT5nZXRUeXBlQnlOYW1lKCJKYXZhVGhyZWFkIikpOwotICAKLSAgQ29kZUxpbmVJbmZvVHlwZSA9Ci0gICAgUG9pbnRlclR5cGU6OmdldFVucXVhbChtb2R1bGUtPmdldFR5cGVCeU5hbWUoIkNvZGVMaW5lSW5mbyIpKTsKLSAgCi0gIEphdmFPYmplY3ROdWxsQ29uc3RhbnQgPQotICAgIENvbnN0YW50OjpnZXROdWxsVmFsdWUoSjNJbnRyaW5zaWNzOjpKYXZhT2JqZWN0VHlwZSk7Ci0gIE1heEFycmF5U2l6ZUNvbnN0YW50ID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YUFycmF5OjpNYXhBcnJheVNpemUpOwotICBKYXZhQXJyYXlTaXplQ29uc3RhbnQgPSBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoQ29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSmF2YU9iamVjdCkgKyBzaXplb2Yoc3NpemVfdCkpOwotICAKLSAgCi0gIEphdmFBcnJheUVsZW1lbnRzT2Zmc2V0Q29uc3RhbnQgPSBjb25zdGFudFR3bzsKLSAgSmF2YUFycmF5U2l6ZU9mZnNldENvbnN0YW50ID0gY29uc3RhbnRPbmU7Ci0gIEphdmFPYmplY3RMb2NrT2Zmc2V0Q29uc3RhbnQgPSBjb25zdGFudE9uZTsKLSAgSmF2YU9iamVjdFZUT2Zmc2V0Q29uc3RhbnQgPSBjb25zdGFudFplcm87Ci0KLSAgT2Zmc2V0Q2xhc3NJblZUQ29uc3RhbnQgPQotICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgIEphdmFWaXJ0dWFsVGFibGU6OmdldENsYXNzSW5kZXgoKSk7Ci0gIE9mZnNldERlcHRoSW5WVENvbnN0YW50ID0KLSAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoQ29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgICBKYXZhVmlydHVhbFRhYmxlOjpnZXREZXB0aEluZGV4KCkpOwotICBPZmZzZXREaXNwbGF5SW5WVENvbnN0YW50ID0KLSAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoQ29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgICBKYXZhVmlydHVhbFRhYmxlOjpnZXREaXNwbGF5SW5kZXgoKSk7Ci0gIE9mZnNldEJhc2VDbGFzc1ZUSW5WVENvbnN0YW50ID0KLSAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoQ29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgICBKYXZhVmlydHVhbFRhYmxlOjpnZXRCYXNlQ2xhc3NJbmRleCgpKTsKLSAgT2Zmc2V0SU1USW5WVENvbnN0YW50ID0KLSAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoQ29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgICBKYXZhVmlydHVhbFRhYmxlOjpnZXRJTVRJbmRleCgpKTsKLSAgCi0gIE9mZnNldEFjY2Vzc0luQ29tbW9uQ2xhc3NDb25zdGFudCA9IGNvbnN0YW50T25lOwotICBJc0FycmF5Q29uc3RhbnQgPSBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDE2VHkoQ29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSk5KVk1fQVJSQVkpOwotICAKLSAgSXNQcmltaXRpdmVDb25zdGFudCA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MTZUeShDb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSk5KVk1fUFJJTUlUSVZFKTsKLSAKLSAgT2Zmc2V0QmFzZUNsYXNzSW5BcnJheUNsYXNzQ29uc3RhbnQgPSBjb25zdGFudE9uZTsKLSAgT2Zmc2V0TG9nU2l6ZUluUHJpbWl0aXZlQ2xhc3NDb25zdGFudCA9IGNvbnN0YW50T25lOwotCi0gIE9mZnNldE9iamVjdFNpemVJbkNsYXNzQ29uc3RhbnQgPSBjb25zdGFudE9uZTsKLSAgT2Zmc2V0VlRJbkNsYXNzQ29uc3RhbnQgPSBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoQ29udGV4dCksIDcpOwotICBPZmZzZXRUYXNrQ2xhc3NNaXJyb3JJbkNsYXNzQ29uc3RhbnQgPSBjb25zdGFudFRocmVlOwotICBPZmZzZXRTdGF0aWNJbnN0YW5jZUluVGFza0NsYXNzTWlycm9yQ29uc3RhbnQgPSBjb25zdGFudFRocmVlOwotICBPZmZzZXRTdGF0dXNJblRhc2tDbGFzc01pcnJvckNvbnN0YW50ID0gY29uc3RhbnRaZXJvOwotICBPZmZzZXRJbml0aWFsaXplZEluVGFza0NsYXNzTWlycm9yQ29uc3RhbnQgPSBjb25zdGFudE9uZTsKLSAgCi0gIE9mZnNldEpOSUluSmF2YVRocmVhZENvbnN0YW50ID0gICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwgMSk7Ci0gIAotICBDbGFzc1JlYWR5Q29uc3RhbnQgPSBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDhUeShDb250ZXh0KSwgcmVhZHkpOwotICAKLSAgSW50ZXJmYWNlTG9va3VwRnVuY3Rpb24gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJqM0ludGVyZmFjZUxvb2t1cCIpOwotICBNdWx0aUNhbGxOZXdGdW5jdGlvbiA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImozTXVsdGlDYWxsTmV3Iik7Ci0gIEZvcmNlTG9hZGVkQ2hlY2tGdW5jdGlvbiA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImZvcmNlTG9hZGVkQ2hlY2siKTsKLSAgSW5pdGlhbGlzYXRpb25DaGVja0Z1bmN0aW9uID0gbW9kdWxlLT5nZXRGdW5jdGlvbigiaW5pdGlhbGlzYXRpb25DaGVjayIpOwotICBGb3JjZUluaXRpYWxpc2F0aW9uQ2hlY2tGdW5jdGlvbiA9IAotICAgIG1vZHVsZS0+Z2V0RnVuY3Rpb24oImZvcmNlSW5pdGlhbGlzYXRpb25DaGVjayIpOwotICBJbml0aWFsaXNlQ2xhc3NGdW5jdGlvbiA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImozUnVudGltZUluaXRpYWxpc2VDbGFzcyIpOwotICAKLSAgR2V0Q29uc3RhbnRQb29sQXRGdW5jdGlvbiA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImdldENvbnN0YW50UG9vbEF0Iik7Ci0gIEFycmF5TGVuZ3RoRnVuY3Rpb24gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJhcnJheUxlbmd0aCIpOwotICBHZXRWVEZ1bmN0aW9uID0gbW9kdWxlLT5nZXRGdW5jdGlvbigiZ2V0VlQiKTsKLSAgR2V0SU1URnVuY3Rpb24gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJnZXRJTVQiKTsKLSAgR2V0Q2xhc3NGdW5jdGlvbiA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImdldENsYXNzIik7Ci0gIENsYXNzTG9va3VwRnVuY3Rpb24gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJqM0NsYXNzTG9va3VwIik7Ci0gIEdldFZURnJvbUNsYXNzRnVuY3Rpb24gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJnZXRWVEZyb21DbGFzcyIpOwotICBHZXRWVEZyb21DbGFzc0FycmF5RnVuY3Rpb24gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJnZXRWVEZyb21DbGFzc0FycmF5Iik7Ci0gIEdldFZURnJvbUNvbW1vbkNsYXNzRnVuY3Rpb24gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJnZXRWVEZyb21Db21tb25DbGFzcyIpOwotICBHZXRCYXNlQ2xhc3NWVEZyb21WVEZ1bmN0aW9uID0gbW9kdWxlLT5nZXRGdW5jdGlvbigiZ2V0QmFzZUNsYXNzVlRGcm9tVlQiKTsKLSAgR2V0T2JqZWN0U2l6ZUZyb21DbGFzc0Z1bmN0aW9uID0gCi0gICAgbW9kdWxlLT5nZXRGdW5jdGlvbigiZ2V0T2JqZWN0U2l6ZUZyb21DbGFzcyIpOwotIAotICBHZXRDbGFzc0RlbGVnYXRlZUZ1bmN0aW9uID0gbW9kdWxlLT5nZXRGdW5jdGlvbigiZ2V0Q2xhc3NEZWxlZ2F0ZWUiKTsKLSAgUnVudGltZURlbGVnYXRlZUZ1bmN0aW9uID0gbW9kdWxlLT5nZXRGdW5jdGlvbigiajNSdW50aW1lRGVsZWdhdGVlIik7Ci0gIElzQXNzaWduYWJsZUZyb21GdW5jdGlvbiA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImlzQXNzaWduYWJsZUZyb20iKTsKLSAgSXNTZWNvbmRhcnlDbGFzc0Z1bmN0aW9uID0gbW9kdWxlLT5nZXRGdW5jdGlvbigiaXNTZWNvbmRhcnlDbGFzcyIpOwotICBHZXREZXB0aEZ1bmN0aW9uID0gbW9kdWxlLT5nZXRGdW5jdGlvbigiZ2V0RGVwdGgiKTsKLSAgR2V0U3RhdGljSW5zdGFuY2VGdW5jdGlvbiA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImdldFN0YXRpY0luc3RhbmNlIik7Ci0gIEdldERpc3BsYXlGdW5jdGlvbiA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImdldERpc3BsYXkiKTsKLSAgR2V0VlRJbkRpc3BsYXlGdW5jdGlvbiA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImdldFZUSW5EaXNwbGF5Iik7Ci0gIEFxdWlyZU9iamVjdEZ1bmN0aW9uID0gbW9kdWxlLT5nZXRGdW5jdGlvbigiajNKYXZhT2JqZWN0QXF1aXJlIik7Ci0gIFJlbGVhc2VPYmplY3RGdW5jdGlvbiA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImozSmF2YU9iamVjdFJlbGVhc2UiKTsKLQotICBWaXJ0dWFsRmllbGRMb29rdXBGdW5jdGlvbiA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImozVmlydHVhbEZpZWxkTG9va3VwIik7Ci0gIFN0YXRpY0ZpZWxkTG9va3VwRnVuY3Rpb24gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJqM1N0YXRpY0ZpZWxkTG9va3VwIik7Ci0gIFN0cmluZ0xvb2t1cEZ1bmN0aW9uID0gbW9kdWxlLT5nZXRGdW5jdGlvbigiajNTdHJpbmdMb29rdXAiKTsKLSAgU3RhcnRKTklGdW5jdGlvbiA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImozU3RhcnRKTkkiKTsKLSAgRW5kSk5JRnVuY3Rpb24gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJqM0VuZEpOSSIpOwotICAKLSAgUmVzb2x2ZVZpcnR1YWxTdHViRnVuY3Rpb24gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJqM1Jlc29sdmVWaXJ0dWFsU3R1YiIpOwotICBSZXNvbHZlU3RhdGljU3R1YkZ1bmN0aW9uID0gbW9kdWxlLT5nZXRGdW5jdGlvbigiajNSZXNvbHZlU3RhdGljU3R1YiIpOwotICBSZXNvbHZlU3BlY2lhbFN0dWJGdW5jdGlvbiA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImozUmVzb2x2ZVNwZWNpYWxTdHViIik7Ci0gIFJlc29sdmVJbnRlcmZhY2VGdW5jdGlvbiA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImozUmVzb2x2ZUludGVyZmFjZSIpOwotICAKLSAgTnVsbFBvaW50ZXJFeGNlcHRpb25GdW5jdGlvbiA9Ci0gICAgbW9kdWxlLT5nZXRGdW5jdGlvbigiajNOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOwotICBDbGFzc0Nhc3RFeGNlcHRpb25GdW5jdGlvbiA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImozQ2xhc3NDYXN0RXhjZXB0aW9uIik7Ci0gIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25GdW5jdGlvbiA9IAotICAgIG1vZHVsZS0+Z2V0RnVuY3Rpb24oImozSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOwotICBOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbkZ1bmN0aW9uID0gCi0gICAgbW9kdWxlLT5nZXRGdW5jdGlvbigiajNOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbiIpOwotICBPdXRPZk1lbW9yeUVycm9yRnVuY3Rpb24gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJqM091dE9mTWVtb3J5RXJyb3IiKTsKLSAgU3RhY2tPdmVyZmxvd0Vycm9yRnVuY3Rpb24gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJqM1N0YWNrT3ZlcmZsb3dFcnJvciIpOwotICBBcnJheVN0b3JlRXhjZXB0aW9uRnVuY3Rpb24gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJqM0FycmF5U3RvcmVFeGNlcHRpb24iKTsKLSAgQXJpdGhtZXRpY0V4Y2VwdGlvbkZ1bmN0aW9uID0gbW9kdWxlLT5nZXRGdW5jdGlvbigiajNBcml0aG1ldGljRXhjZXB0aW9uIik7Ci0KLSAgUHJpbnRFeGVjdXRpb25GdW5jdGlvbiA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImozUHJpbnRFeGVjdXRpb24iKTsKLSAgUHJpbnRNZXRob2RTdGFydEZ1bmN0aW9uID0gbW9kdWxlLT5nZXRGdW5jdGlvbigiajNQcmludE1ldGhvZFN0YXJ0Iik7Ci0gIFByaW50TWV0aG9kRW5kRnVuY3Rpb24gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJqM1ByaW50TWV0aG9kRW5kIik7Ci0KLSAgVGhyb3dFeGNlcHRpb25GdW5jdGlvbiA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImozVGhyb3dFeGNlcHRpb24iKTsKLQotICBHZXRBcnJheUNsYXNzRnVuY3Rpb24gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJqM0dldEFycmF5Q2xhc3MiKTsKLSAKLSAgR2V0RmluYWxJbnQ4RmllbGRGdW5jdGlvbiA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImdldEZpbmFsSW50OEZpZWxkIik7Ci0gIEdldEZpbmFsSW50MTZGaWVsZEZ1bmN0aW9uID0gbW9kdWxlLT5nZXRGdW5jdGlvbigiZ2V0RmluYWxJbnQxNkZpZWxkIik7Ci0gIEdldEZpbmFsSW50MzJGaWVsZEZ1bmN0aW9uID0gbW9kdWxlLT5nZXRGdW5jdGlvbigiZ2V0RmluYWxJbnQzMkZpZWxkIik7Ci0gIEdldEZpbmFsTG9uZ0ZpZWxkRnVuY3Rpb24gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJnZXRGaW5hbExvbmdGaWVsZCIpOwotICBHZXRGaW5hbEZsb2F0RmllbGRGdW5jdGlvbiA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImdldEZpbmFsRmxvYXRGaWVsZCIpOwotICBHZXRGaW5hbERvdWJsZUZpZWxkRnVuY3Rpb24gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJnZXRGaW5hbERvdWJsZUZpZWxkIik7Ci0KLSNpZm5kZWYgV0lUSE9VVF9WVEFCTEUKLSAgVmlydHVhbExvb2t1cEZ1bmN0aW9uID0gbW9kdWxlLT5nZXRGdW5jdGlvbigiajNWaXJ0dWFsVGFibGVMb29rdXAiKTsKLSNlbmRpZgotCi0gIEdldExvY2tGdW5jdGlvbiA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImdldExvY2siKTsKLSAgVGhyb3dFeGNlcHRpb25Gcm9tSklURnVuY3Rpb24gPQotICAgIG1vZHVsZS0+Z2V0RnVuY3Rpb24oImozVGhyb3dFeGNlcHRpb25Gcm9tSklUIik7Ci0gCi19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvQ29tcGlsZXIvSmF2YUFPVENvbXBpbGVyLmNwcCBiL3Zta2l0L2xpYi9KMy9Db21waWxlci9KYXZhQU9UQ29tcGlsZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTIwZGRiLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9KMy9Db21waWxlci9KYXZhQU9UQ29tcGlsZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjE5OSArMCwwIEBACi0vLz09PS0tLS0tIEphdmFBT1RDb21waWxlci5jcHAgLSBTdXBwb3J0IGZvciBBaGVhZCBvZiBUaW1lIENvbXBpbGVyIC0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJsbHZtL0Jhc2ljQmxvY2suaCIKLSNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgotI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCi0jaW5jbHVkZSAibGx2bS9MTFZNQ29udGV4dC5oIgotI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCi0jaW5jbHVkZSAibGx2bS9QYXNzTWFuYWdlci5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgotCi0jaW5jbHVkZSAibXZtL1RocmVhZHMvVGhyZWFkLmgiCi0jaW5jbHVkZSAibXZtL1ZNS2l0LmgiCi0KLSNpbmNsdWRlICJqMy9KM0ludHJpbnNpY3MuaCIKLSNpbmNsdWRlICJqMy9KYXZhQU9UQ29tcGlsZXIuaCIKLSNpbmNsdWRlICJqMy9KYXZhSklUQ29tcGlsZXIuaCIKLQotI2luY2x1ZGUgIkphdmFBcnJheS5oIgotI2luY2x1ZGUgIkphdmFDb25zdGFudFBvb2wuaCIKLSNpbmNsdWRlICJKYXZhU3RyaW5nLmgiCi0jaW5jbHVkZSAiSmF2YVRocmVhZC5oIgotI2luY2x1ZGUgIkphdmFUeXBlcy5oIgotI2luY2x1ZGUgIkphdmFVcGNhbGxzLmgiCi0jaW5jbHVkZSAiSm5qdm0uaCIKLSNpbmNsdWRlICJSZWFkZXIuaCIKLSNpbmNsdWRlICJaaXAuaCIKLQotI2luY2x1ZGUgPGNzdGRpbz4KLQotdXNpbmcgbmFtZXNwYWNlIGozOwotdXNpbmcgbmFtZXNwYWNlIGxsdm07Ci0KLWJvb2wgSmF2YUFPVENvbXBpbGVyOjppc0NvbXBpbGluZyhjb25zdCBDb21tb25DbGFzcyogY2wpIGNvbnN0IHsKLSAgaWYgKGNsLT5pc0NsYXNzKCkpIHsKLSAgICAvLyBBIGNsYXNzIGlzIGJlaW5nIHN0YXRpYyBjb21waWxlZCBpZiBvd25lciBjbGFzcyBpcyBub3QgbnVsbC4KLSAgICByZXR1cm4gY2wtPmFzQ2xhc3MoKS0+Z2V0T3duZXJDbGFzcygpICE9IDA7Ci0gIH0gZWxzZSBpZiAoY2wtPmlzQXJyYXkoKSkgewotICAgIC8vIE9ubHkgY29tcGlsZSBhbiBhcmF5IGlmIHdlIGFyZSBjb21waWxpbmcgcnQuamFyLgotICAgIHJldHVybiBjb21waWxlUlQ7Ci0gIH0gZWxzZSBpZiAoY2wtPmlzUHJpbWl0aXZlKCkgJiYgY29tcGlsZVJUKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLUNvbnN0YW50KiBKYXZhQU9UQ29tcGlsZXI6OmdldE5hdGl2ZUNsYXNzKENvbW1vbkNsYXNzKiBjbGFzc0RlZikgewotCi0gIGlmIChjbGFzc0RlZi0+aXNDbGFzcygpIHx8IGlzQ29tcGlsaW5nKGNsYXNzRGVmKSB8fCBhc3N1bWVDb21waWxlZCkgewotCi0gICAgbmF0aXZlX2NsYXNzX2l0ZXJhdG9yIEVuZCA9IG5hdGl2ZUNsYXNzZXMuZW5kKCk7Ci0gICAgbmF0aXZlX2NsYXNzX2l0ZXJhdG9yIEkgPSBuYXRpdmVDbGFzc2VzLmZpbmQoY2xhc3NEZWYpOwotICAgIGlmIChJID09IEVuZCkgewotICAgICAgY29uc3QgbGx2bTo6VHlwZSogVHkgPSAwOwotICAgICAgCi0gICAgICBpZiAoY2xhc3NEZWYtPmlzQXJyYXkoKSkgewotICAgICAgICBUeSA9IEphdmFJbnRyaW5zaWNzLkphdmFDbGFzc0FycmF5VHlwZS0+Z2V0Q29udGFpbmVkVHlwZSgwKTsgCi0gICAgICB9IGVsc2UgaWYgKGNsYXNzRGVmLT5pc1ByaW1pdGl2ZSgpKSB7Ci0gICAgICAgIFR5ID0gSmF2YUludHJpbnNpY3MuSmF2YUNsYXNzUHJpbWl0aXZlVHlwZS0+Z2V0Q29udGFpbmVkVHlwZSgwKTsgCi0gICAgICB9IGVsc2UgewotICAgICAgICBUeSA9IEphdmFJbnRyaW5zaWNzLkphdmFDbGFzc1R5cGUtPmdldENvbnRhaW5lZFR5cGUoMCk7IAotICAgICAgfQotICAgIAotICAgICAgR2xvYmFsVmFyaWFibGUqIHZhckdWID0KLSAgICAgICAgbmV3IEdsb2JhbFZhcmlhYmxlKCpnZXRMTFZNTW9kdWxlKCksIFR5LCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhbHVlOjpFeHRlcm5hbExpbmthZ2UsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBVVEY4QnVmZmVyKGNsYXNzRGVmLT5uYW1lKS50b0NvbXBpbGVOYW1lKCktPmNTdHJpbmcoKSk7Ci0gICAgCi0gICAgICBuYXRpdmVDbGFzc2VzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjbGFzc0RlZiwgdmFyR1YpKTsKLQotICAgICAgaWYgKGNsYXNzRGVmLT5pc0NsYXNzKCkgJiYgaXNDb21waWxpbmcoY2xhc3NEZWYpKSB7Ci0gICAgICAgIENvbnN0YW50KiBDID0gQ3JlYXRlQ29uc3RhbnRGcm9tQ2xhc3MoY2xhc3NEZWYtPmFzQ2xhc3MoKSk7Ci0gICAgICAgIHZhckdWLT5zZXRJbml0aWFsaXplcihDKTsKLSAgICAgIH0gZWxzZSBpZiAoY2xhc3NEZWYtPmlzQXJyYXkoKSkgewotICAgICAgICBDb25zdGFudCogQyA9IENyZWF0ZUNvbnN0YW50RnJvbUNsYXNzQXJyYXkoY2xhc3NEZWYtPmFzQXJyYXlDbGFzcygpKTsKLSAgICAgICAgdmFyR1YtPnNldEluaXRpYWxpemVyKEMpOwotICAgICAgfSBlbHNlIGlmIChjbGFzc0RlZi0+aXNQcmltaXRpdmUoKSkgewotICAgICAgICBDb25zdGFudCogQyA9IAotICAgICAgICAgIENyZWF0ZUNvbnN0YW50RnJvbUNsYXNzUHJpbWl0aXZlKGNsYXNzRGVmLT5hc1ByaW1pdGl2ZUNsYXNzKCkpOwotICAgICAgICB2YXJHVi0+c2V0SW5pdGlhbGl6ZXIoQyk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiB2YXJHVjsKLQotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gSS0+c2Vjb25kOwotICAgIH0KLSAgfSBlbHNlIGlmIChjbGFzc0RlZi0+aXNBcnJheSgpKSB7Ci0gICAgYXJyYXlfY2xhc3NfaXRlcmF0b3IgRW5kID0gYXJyYXlDbGFzc2VzLmVuZCgpOwotICAgIGFycmF5X2NsYXNzX2l0ZXJhdG9yIEkgPSBhcnJheUNsYXNzZXMuZmluZChjbGFzc0RlZi0+YXNBcnJheUNsYXNzKCkpOwotICAgIGlmIChJID09IEVuZCkgewotICAgICAgY29uc3QgbGx2bTo6VHlwZSogVHkgPSBKYXZhSW50cmluc2ljcy5KYXZhQ2xhc3NBcnJheVR5cGU7Ci0gICAgICBNb2R1bGUmIE1vZCA9ICpnZXRMTFZNTW9kdWxlKCk7Ci0gICAgCi0gICAgICBHbG9iYWxWYXJpYWJsZSogdmFyR1YgPSAKLSAgICAgICAgbmV3IEdsb2JhbFZhcmlhYmxlKE1vZCwgVHksIGZhbHNlLCBHbG9iYWxWYWx1ZTo6SW50ZXJuYWxMaW5rYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShUeSksCi0gICAgICAgICAgICAgICAgICAgICAgICBVVEY4QnVmZmVyKGNsYXNzRGVmLT5uYW1lKS50b0NvbXBpbGVOYW1lKCktPmNTdHJpbmcoKSk7Ci0gICAgCi0gICAgICBhcnJheUNsYXNzZXMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNsYXNzRGVmLT5hc0FycmF5Q2xhc3MoKSwgdmFyR1YpKTsKLSAgICAgIHJldHVybiB2YXJHVjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIEktPnNlY29uZDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgYXNzZXJ0KDAgJiYgIkltcGxlbWVudCBtZSIpOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1Db25zdGFudCogSmF2YUFPVENvbXBpbGVyOjpnZXRDb25zdGFudFBvb2woSmF2YUNvbnN0YW50UG9vbCogY3RwKSB7Ci0gIGxsdm06OkNvbnN0YW50KiB2YXJHViA9IDA7Ci0gIGNvbnN0YW50X3Bvb2xfaXRlcmF0b3IgRW5kID0gY29uc3RhbnRQb29scy5lbmQoKTsKLSAgY29uc3RhbnRfcG9vbF9pdGVyYXRvciBJID0gY29uc3RhbnRQb29scy5maW5kKGN0cCk7Ci0gIGlmIChJID09IEVuZCkgewotICAgIGNvbnN0IFR5cGUqIFR5ID0gSmF2YUludHJpbnNpY3MuQ29uc3RhbnRQb29sVHlwZS0+Z2V0Q29udGFpbmVkVHlwZSgwKTsKLSAgICBNb2R1bGUmIE1vZCA9ICpnZXRMTFZNTW9kdWxlKCk7Ci0gICAgCi0gICAgdmFyR1YgPSBuZXcgR2xvYmFsVmFyaWFibGUoTW9kLCBUeSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFsdWU6OkludGVybmFsTGlua2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFR5KSwgIiIpOwotICAgIGNvbnN0YW50UG9vbHMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGN0cCwgdmFyR1YpKTsKLSAgICByZXR1cm4gdmFyR1Y7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIEktPnNlY29uZDsKLSAgfQotfQotCi1Db25zdGFudCogSmF2YUFPVENvbXBpbGVyOjpnZXRNZXRob2RJbkNsYXNzKEphdmFNZXRob2QqIG1ldGgpIHsKLSAgQ2xhc3MqIGNsID0gbWV0aC0+Y2xhc3NEZWY7Ci0gIENvbnN0YW50KiBNT2Zmc2V0ID0gMDsKLSAgQ29uc3RhbnQqIEFycmF5ID0gMDsKLQotICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IGNsLT5uYlZpcnR1YWxNZXRob2RzICsgY2wtPm5iU3RhdGljTWV0aG9kczsgKytpKSB7Ci0gICAgaWYgKCZjbC0+dmlydHVhbE1ldGhvZHNbaV0gPT0gbWV0aCkgewotICAgICAgTU9mZnNldCA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShnZXRMTFZNQ29udGV4dCgpKSwgaSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgYXNzZXJ0KE1PZmZzZXQgJiYgIk5vIG9mZnNldCBmb3IgbWV0aG9kIik7Ci0KLSAgbWV0aG9kX2l0ZXJhdG9yIFNJID0gdmlydHVhbE1ldGhvZHMuZmluZChjbCk7Ci0gIGlmIChTSSAhPSB2aXJ0dWFsTWV0aG9kcy5lbmQoKSkgewotICAgIEFycmF5ID0gU0ktPnNlY29uZDsgCi0gICAgYXNzZXJ0KEFycmF5ICYmICJObyBhcnJheSBpbiBjbGFzcyIpOwotICB9IGVsc2UgewotICAgIHN0ZDo6c3RyaW5nIG5hbWUoVVRGOEJ1ZmZlcihjbC0+bmFtZSkudG9Db21waWxlTmFtZSgpLT5jU3RyaW5nKCkpOwotICAgIG5hbWUgKz0gIl9WaXJ0dWFsTWV0aG9kcyI7Ci0gICAgTW9kdWxlJiBNb2QgPSAqZ2V0TExWTU1vZHVsZSgpOwotICAgIGNvbnN0IFR5cGUqIEFUeSA9Ci0gICAgICBBcnJheVR5cGU6OmdldChKYXZhSW50cmluc2ljcy5KYXZhTWV0aG9kVHlwZS0+Z2V0Q29udGFpbmVkVHlwZSgwKSwKLSAgICAgICAgICAgICAgICAgICAgIGNsLT5uYlZpcnR1YWxNZXRob2RzICsgY2wtPm5iU3RhdGljTWV0aG9kcyk7Ci0KLSAgICBBcnJheSA9IG5ldyBHbG9iYWxWYXJpYWJsZShNb2QsIEFUeSwgZmFsc2UsIEdsb2JhbFZhbHVlOjpFeHRlcm5hbExpbmthZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgbmFtZSk7Ci0gICAgdmlydHVhbE1ldGhvZHMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNsLCBBcnJheSkpOwotICB9Ci0gICAgCi0gIENvbnN0YW50KiBHRVBzWzJdID0geyBnZXRJbnRyaW5zaWNzKCktPmNvbnN0YW50WmVybywgTU9mZnNldCB9OwotICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRHZXRFbGVtZW50UHRyKEFycmF5LCBHRVBzLCAyKTsKLX0KLQotQ29uc3RhbnQqIEphdmFBT1RDb21waWxlcjo6Z2V0U3RyaW5nKEphdmFTdHJpbmcqIHN0cikgewotICBhc3NlcnQoIXVzZUNvb3BlcmF0aXZlR0MoKSk7Ci0gIHN0cmluZ19pdGVyYXRvciBTSSA9IHN0cmluZ3MuZmluZChzdHIpOwotICBpZiAoU0kgIT0gc3RyaW5ncy5lbmQoKSkgewotICAgIHJldHVybiBTSS0+c2Vjb25kOwotICB9IGVsc2UgewotICAgIGFzc2VydChzdHIgJiYgIk5vIHN0cmluZyBnaXZlbiIpOwotICAgIExMVk1DbGFzc0luZm8qIExDSSA9IGdldENsYXNzSW5mbyhKYXZhT2JqZWN0OjpnZXRDbGFzcyhzdHIpLT5hc0NsYXNzKCkpOwotICAgIGNvbnN0IGxsdm06OlR5cGUqIFR5ID0gTENJLT5nZXRWaXJ0dWFsVHlwZSgpOwotICAgIE1vZHVsZSYgTW9kID0gKmdldExMVk1Nb2R1bGUoKTsKLSAgICAKLSAgICBjb25zdCBjaGFyKiBuYW1lID0gSmF2YVN0cmluZzo6c3RyVG9Bc2NpaXooc3RyKTsKLSAgICBHbG9iYWxWYXJpYWJsZSogdmFyR1YgPSAKLSAgICAgIG5ldyBHbG9iYWxWYXJpYWJsZShNb2QsIFR5LT5nZXRDb250YWluZWRUeXBlKDApLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxMaW5rYWdlLCAwLCAic3RyIik7Ci0gICAgZGVsZXRlW10gbmFtZTsKLSAgICBDb25zdGFudCogcmVzID0gQ29uc3RhbnRFeHByOjpnZXRDYXN0KEluc3RydWN0aW9uOjpCaXRDYXN0LCB2YXJHViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFJbnRyaW5zaWNzLkphdmFPYmplY3RUeXBlKTsKLSAgICBzdHJpbmdzLmluc2VydChzdGQ6Om1ha2VfcGFpcihzdHIsIHJlcykpOwotICAgIENvbnN0YW50KiBDID0gQ3JlYXRlQ29uc3RhbnRGcm9tSmF2YVN0cmluZyhzdHIpOwotICAgIHZhckdWLT5zZXRJbml0aWFsaXplcihDKTsKLSAgICByZXR1cm4gcmVzOwotICB9Ci19Ci0KLUNvbnN0YW50KiBKYXZhQU9UQ29tcGlsZXI6OmdldFN0cmluZ1B0cihKYXZhU3RyaW5nKiogc3RyKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lIik7Ci0gIGFib3J0KCk7Ci19Ci0KLUNvbnN0YW50KiBKYXZhQU9UQ29tcGlsZXI6OmdldEphdmFDbGFzcyhDb21tb25DbGFzcyogY2wpIHsKLSAgamF2YV9jbGFzc19pdGVyYXRvciBFbmQgPSBqYXZhQ2xhc3Nlcy5lbmQoKTsKLSAgamF2YV9jbGFzc19pdGVyYXRvciBJID0gamF2YUNsYXNzZXMuZmluZChjbCk7Ci0gIGlmIChJID09IEVuZCkgewotICAgIGZpbmFsX29iamVjdF9pdGVyYXRvciBFbmQgPSBmaW5hbE9iamVjdHMuZW5kKCk7Ci0gICAgZmluYWxfb2JqZWN0X2l0ZXJhdG9yIEkgPSBmaW5hbE9iamVjdHMuZmluZChjbC0+ZGVsZWdhdGVlWzBdKTsKLSAgICBpZiAoSSA9PSBFbmQpIHsKLSAgICAKLSAgICAgIENsYXNzKiBqYXZhQ2xhc3MgPSBjbC0+Y2xhc3NMb2FkZXItPnZtLT51cGNhbGxzLT5uZXdDbGFzczsKLSAgICAgIExMVk1DbGFzc0luZm8qIExDSSA9IGdldENsYXNzSW5mbyhqYXZhQ2xhc3MpOwotICAgICAgY29uc3QgbGx2bTo6VHlwZSogVHkgPSBMQ0ktPmdldFZpcnR1YWxUeXBlKCk7Ci0gICAgICBNb2R1bGUmIE1vZCA9ICpnZXRMTFZNTW9kdWxlKCk7Ci0gICAgCi0gICAgICBHbG9iYWxWYXJpYWJsZSogdmFyR1YgPSAKLSAgICAgICAgbmV3IEdsb2JhbFZhcmlhYmxlKE1vZCwgVHktPmdldENvbnRhaW5lZFR5cGUoMCksIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFsdWU6OkludGVybmFsTGlua2FnZSwgMCwgIiIpOwotICAgIAotICAgICAgQ29uc3RhbnQqIHJlcyA9IENvbnN0YW50RXhwcjo6Z2V0Q2FzdChJbnN0cnVjdGlvbjo6Qml0Q2FzdCwgdmFyR1YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFJbnRyaW5zaWNzLkphdmFPYmplY3RUeXBlKTsKLSAgCi0gICAgICBqYXZhQ2xhc3Nlcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY2wsIHJlcykpOwotICAgICAgdmFyR1YtPnNldEluaXRpYWxpemVyKENyZWF0ZUNvbnN0YW50RnJvbUphdmFDbGFzcyhjbCkpOwotICAgICAgcmV0dXJuIHJlczsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIEktPnNlY29uZDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIEktPnNlY29uZDsKLSAgfQotfQotCi1Db25zdGFudCogSmF2YUFPVENvbXBpbGVyOjpnZXRKYXZhQ2xhc3NQdHIoQ29tbW9uQ2xhc3MqIGNsKSB7Ci0gIC8vIE1ha2Ugc3VyZSBpdCdzIGVtaXR0ZWQuCi0gIGdldEphdmFDbGFzcyhjbCk7Ci0KLSAgQ29uc3RhbnQqIENsID0gZ2V0TmF0aXZlQ2xhc3MoY2wpOwotICBDbCA9IENvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdChDbCwgSmF2YUludHJpbnNpY3MuSmF2YUNvbW1vbkNsYXNzVHlwZSk7Ci0KLSAgQ29uc3RhbnQqIEdFUFsyXSA9IHsgZ2V0SW50cmluc2ljcygpLT5jb25zdGFudFplcm8sCi0gICAgICAgICAgICAgICAgICAgICAgIGdldEludHJpbnNpY3MoKS0+Y29uc3RhbnRaZXJvIH07Ci0gIAotICBDb25zdGFudCogVENNQXJyYXkgPSBDb25zdGFudEV4cHI6OmdldEdldEVsZW1lbnRQdHIoQ2wsIEdFUCwgMik7Ci0gICAgCi0gIENvbnN0YW50KiBHRVAyWzJdID0geyBnZXRJbnRyaW5zaWNzKCktPmNvbnN0YW50WmVybywKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEludHJpbnNpY3MoKS0+Y29uc3RhbnRaZXJvIH07Ci0KLSAgQ29uc3RhbnQqIFB0ciA9IENvbnN0YW50RXhwcjo6Z2V0R2V0RWxlbWVudFB0cihUQ01BcnJheSwgR0VQMiwgMik7Ci0gIHJldHVybiBQdHI7Ci19Ci0KLUphdmFPYmplY3QqIEphdmFBT1RDb21waWxlcjo6Z2V0RmluYWxPYmplY3QobGx2bTo6VmFsdWUqIG9iaikgewotICBpZiAoQ29uc3RhbnQqIENJID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KG9iaikpIHsKLSAgICByZXZlcnNlX2ZpbmFsX29iamVjdF9pdGVyYXRvciBFbmQgPSByZXZlcnNlRmluYWxPYmplY3RzLmVuZCgpOwotICAgIHJldmVyc2VfZmluYWxfb2JqZWN0X2l0ZXJhdG9yIEkgPSByZXZlcnNlRmluYWxPYmplY3RzLmZpbmQoQ0kpOwotICAgIGlmIChJICE9IEVuZCkgcmV0dXJuIEktPnNlY29uZDsKLSAgfQotICAKLSAgcmV0dXJuIDA7Ci19Ci0KLUNvbnN0YW50KiBKYXZhQU9UQ29tcGlsZXI6OkhhbmRsZU1hZ2ljKEphdmFPYmplY3QqIG9iaiwgQ29tbW9uQ2xhc3MqIG9iakNsKSB7Ci0KLSAgc3RhdGljIGNvbnN0IFVURjgqIEFkZHJlc3NBcnJheSA9IG9iakNsLT5jbGFzc0xvYWRlci0+YXNjaWl6Q29uc3RydWN0VVRGOCgib3JnL3ZtbWFnaWMvdW5ib3hlZC9BZGRyZXNzQXJyYXkiKTsKLSAgc3RhdGljIGNvbnN0IFVURjgqIFdvcmRBcnJheSA9IG9iakNsLT5jbGFzc0xvYWRlci0+YXNjaWl6Q29uc3RydWN0VVRGOCgib3JnL3ZtbWFnaWMvdW5ib3hlZC9Xb3JkQXJyYXkiKTsKLSAgc3RhdGljIGNvbnN0IFVURjgqIEV4dGVudEFycmF5ID0gb2JqQ2wtPmNsYXNzTG9hZGVyLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KCJvcmcvdm1tYWdpYy91bmJveGVkL0V4dGVudEFycmF5Iik7Ci0gIHN0YXRpYyBjb25zdCBVVEY4KiBPYmplY3RSZWZlcmVuY2VBcnJheSA9IG9iakNsLT5jbGFzc0xvYWRlci0+YXNjaWl6Q29uc3RydWN0VVRGOCgib3JnL3ZtbWFnaWMvdW5ib3hlZC9PYmplY3RSZWZlcmVuY2VBcnJheSIpOwotICBzdGF0aWMgY29uc3QgVVRGOCogT2Zmc2V0QXJyYXkgPSBvYmpDbC0+Y2xhc3NMb2FkZXItPmFzY2lpekNvbnN0cnVjdFVURjgoIm9yZy92bW1hZ2ljL3VuYm94ZWQvT2Zmc2V0QXJyYXkiKTsKLSAgY29uc3QgVVRGOCogbmFtZSA9IG9iakNsLT5uYW1lOwotCi0gIGlmIChuYW1lLT5lcXVhbHMoQWRkcmVzc0FycmF5KSB8fCBuYW1lLT5lcXVhbHMoV29yZEFycmF5KSB8fAotICAgICAgbmFtZS0+ZXF1YWxzKEV4dGVudEFycmF5KSB8fCBuYW1lLT5lcXVhbHMoT2JqZWN0UmVmZXJlbmNlQXJyYXkpIHx8IAotICAgICAgbmFtZS0+ZXF1YWxzKE9mZnNldEFycmF5KSkgewotICAgIAotICAgIGludHB0cl90KiByZWFsT2JqID0gKGludHB0cl90KilvYmo7Ci0gICAgaW50cHRyX3Qgc2l6ZSA9IHJlYWxPYmpbMF07Ci0KLSAgICBjb25zdCBBcnJheVR5cGUqIEFUeSA9IEFycmF5VHlwZTo6Z2V0KEphdmFJbnRyaW5zaWNzLkphdmFPYmplY3RUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSArIDEpOwotICAKLSAgICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IFZhbHM7Ci0gICAgZm9yIChzaW50MzIgaSA9IDA7IGkgPCBzaXplICsgMTsgKytpKSB7Ci0gICAgICBDb25zdGFudCogQ0kgPSBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDY0VHkoZ2V0TExWTUNvbnRleHQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KHJlYWxPYmpbaV0pKTsKLSAgICAgIENJID0gQ29uc3RhbnRFeHByOjpnZXRJbnRUb1B0cihDSSwgSmF2YUludHJpbnNpY3MuSmF2YU9iamVjdFR5cGUpOwotICAgICAgVmFscy5wdXNoX2JhY2soQ0kpOwotICAgIH0KLQotICAgIENvbnN0YW50KiBDQSA9IENvbnN0YW50QXJyYXk6OmdldChBVHksIFZhbHMpOwotICAKLSAgICBHbG9iYWxWYXJpYWJsZSogdmFyR1YgPSBuZXcgR2xvYmFsVmFyaWFibGUoKmdldExMVk1Nb2R1bGUoKSwgQ0EtPmdldFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBLCAiIik7Ci0gCi0gICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdCh2YXJHViwgSmF2YUludHJpbnNpY3MuSmF2YU9iamVjdFR5cGUpOwotCi0gIH0gZWxzZSB7Ci0gICAgQ29uc3RhbnQqIENJID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ2NFR5KGdldExMVk1Db250ZXh0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qob2JqKSk7Ci0gICAgQ0kgPSBDb25zdGFudEV4cHI6OmdldEludFRvUHRyKENJLCBKYXZhSW50cmluc2ljcy5KYXZhT2JqZWN0VHlwZSk7Ci0gICAgcmV0dXJuIENJOwotICB9Ci19Ci0KLQotQ29uc3RhbnQqIEphdmFBT1RDb21waWxlcjo6Z2V0RmluYWxPYmplY3QoSmF2YU9iamVjdCogb2JqLCBDb21tb25DbGFzcyogb2JqQ2wpIHsKLSAgYXNzZXJ0KCF1c2VDb29wZXJhdGl2ZUdDKCkpOwotICBsbHZtOjpHbG9iYWxWYXJpYWJsZSogdmFyR1YgPSAwOwotICBmaW5hbF9vYmplY3RfaXRlcmF0b3IgRW5kID0gZmluYWxPYmplY3RzLmVuZCgpOwotICBmaW5hbF9vYmplY3RfaXRlcmF0b3IgSSA9IGZpbmFsT2JqZWN0cy5maW5kKG9iaik7Ci0gIGlmIChJID09IEVuZCkgewotICAKLSAgICBpZiAobXZtOjpDb2xsZWN0b3I6OmJlZ09mKG9iaikpIHsKLSAgICAgIGNvbnN0IFR5cGUqIFR5ID0gMDsKLSAgICAgIENvbW1vbkNsYXNzKiBjbCA9IEphdmFPYmplY3Q6OmdldENsYXNzKG9iaik7Ci0gICAgICAKLSAgICAgIGlmIChjbC0+aXNBcnJheSgpKSB7Ci0gICAgICAgIENsYXNzcGF0aCogdXBjYWxscyA9IGNsLT5jbGFzc0xvYWRlci0+dm0tPnVwY2FsbHM7Ci0gICAgICAgIENvbW1vbkNsYXNzKiBzdWJDbGFzcyA9IGNsLT5hc0FycmF5Q2xhc3MoKS0+YmFzZUNsYXNzKCk7Ci0gICAgICAgIGlmIChzdWJDbGFzcy0+aXNQcmltaXRpdmUoKSkgewotICAgICAgICAgIGlmIChzdWJDbGFzcyA9PSB1cGNhbGxzLT5PZkJvb2wpIHsKLSAgICAgICAgICAgIFR5ID0gVHlwZTo6Z2V0SW50OFR5KGdldExMVk1Db250ZXh0KCkpOwotICAgICAgICAgIH0gZWxzZSBpZiAoc3ViQ2xhc3MgPT0gdXBjYWxscy0+T2ZCeXRlKSB7Ci0gICAgICAgICAgICBUeSA9IFR5cGU6OmdldEludDhUeShnZXRMTFZNQ29udGV4dCgpKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKHN1YkNsYXNzID09IHVwY2FsbHMtPk9mU2hvcnQpIHsKLSAgICAgICAgICAgIFR5ID0gVHlwZTo6Z2V0SW50MTZUeShnZXRMTFZNQ29udGV4dCgpKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKHN1YkNsYXNzID09IHVwY2FsbHMtPk9mQ2hhcikgewotICAgICAgICAgICAgVHkgPSBUeXBlOjpnZXRJbnQxNlR5KGdldExMVk1Db250ZXh0KCkpOwotICAgICAgICAgIH0gZWxzZSBpZiAoc3ViQ2xhc3MgPT0gdXBjYWxscy0+T2ZJbnQpIHsKLSAgICAgICAgICAgIFR5ID0gVHlwZTo6Z2V0SW50MzJUeShnZXRMTFZNQ29udGV4dCgpKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKHN1YkNsYXNzID09IHVwY2FsbHMtPk9mRmxvYXQpIHsKLSAgICAgICAgICAgIFR5ID0gVHlwZTo6Z2V0RmxvYXRUeShnZXRMTFZNQ29udGV4dCgpKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKHN1YkNsYXNzID09IHVwY2FsbHMtPk9mTG9uZykgewotICAgICAgICAgICAgVHkgPSBUeXBlOjpnZXRJbnQ2NFR5KGdldExMVk1Db250ZXh0KCkpOwotICAgICAgICAgIH0gZWxzZSBpZiAoc3ViQ2xhc3MgPT0gdXBjYWxscy0+T2ZEb3VibGUpIHsKLSAgICAgICAgICAgIFR5ID0gVHlwZTo6Z2V0RG91YmxlVHkoZ2V0TExWTUNvbnRleHQoKSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFib3J0KCk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFR5ID0gSmF2YUludHJpbnNpY3MuSmF2YU9iamVjdFR5cGU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IFR5cGUqPiBFbGVtdHM7Ci0gICAgICAgIGNvbnN0IEFycmF5VHlwZSogQVR5ID0gQXJyYXlUeXBlOjpnZXQoVHksIEphdmFBcnJheTo6Z2V0U2l6ZShvYmopKTsKLSAgICAgICAgRWxlbXRzLnB1c2hfYmFjayhKYXZhSW50cmluc2ljcy5KYXZhT2JqZWN0VHlwZS0+Z2V0Q29udGFpbmVkVHlwZSgwKSk7Ci0gICAgICAgIEVsZW10cy5wdXNoX2JhY2soSmF2YUludHJpbnNpY3MucG9pbnRlclNpemVUeXBlKTsKLSAgICAgICAgRWxlbXRzLnB1c2hfYmFjayhBVHkpOwotICAgICAgICBUeSA9IFN0cnVjdFR5cGU6OmdldChnZXRMTFZNTW9kdWxlKCktPmdldENvbnRleHQoKSwgRWxlbXRzKTsKLQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgTExWTUNsYXNzSW5mbyogTENJID0gZ2V0Q2xhc3NJbmZvKGNsLT5hc0NsYXNzKCkpOwotICAgICAgICBUeSA9IExDSS0+Z2V0VmlydHVhbFR5cGUoKS0+Z2V0Q29udGFpbmVkVHlwZSgwKTsKLSAgICAgIH0KLQotICAgICAgTW9kdWxlJiBNb2QgPSAqZ2V0TExWTU1vZHVsZSgpOwotICAgICAgLy8gU2V0IGFzIEV4dGVybmFsLCBzbyB0aGF0IGlubGluaW5nIE1NVGsgY29kZSB3b3Jrcy4KLSAgICAgIHZhckdWID0gbmV3IEdsb2JhbFZhcmlhYmxlKE1vZCwgVHksIGZhbHNlLCBHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxMaW5rYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgImZpbmFsT2JqZWN0Iik7Ci0KLSAgICAgIENvbnN0YW50KiBDID0gQ29uc3RhbnRFeHByOjpnZXRCaXRDYXN0KHZhckdWLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YUludHJpbnNpY3MuSmF2YU9iamVjdFR5cGUpOwotICAKLSAgICAgIGZpbmFsT2JqZWN0cy5pbnNlcnQoc3RkOjptYWtlX3BhaXIob2JqLCBDKSk7Ci0gICAgICByZXZlcnNlRmluYWxPYmplY3RzLmluc2VydChzdGQ6Om1ha2VfcGFpcihDLCBvYmopKTsKLSAgICAKLSAgICAgIHZhckdWLT5zZXRJbml0aWFsaXplcihDcmVhdGVDb25zdGFudEZyb21KYXZhT2JqZWN0KG9iaikpOwotICAgICAgcmV0dXJuIEM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIENvbnN0YW50KiBDSSA9IEhhbmRsZU1hZ2ljKG9iaiwgb2JqQ2wpOwotICAgICAgZmluYWxPYmplY3RzLmluc2VydChzdGQ6Om1ha2VfcGFpcihvYmosIENJKSk7Ci0gICAgICByZXR1cm4gQ0k7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHJldHVybiBJLT5zZWNvbmQ7Ci0gIH0KLX0KLQotQ29uc3RhbnQqIEphdmFBT1RDb21waWxlcjo6Q3JlYXRlQ29uc3RhbnRGcm9tU3RhdGljSW5zdGFuY2UoQ2xhc3MqIGNsKSB7Ci0gIExMVk1DbGFzc0luZm8qIExDSSA9IGdldENsYXNzSW5mbyhjbCk7Ci0gIGNvbnN0IFR5cGUqIFR5ID0gTENJLT5nZXRTdGF0aWNUeXBlKCk7Ci0gIGNvbnN0IFN0cnVjdFR5cGUqIFNUeSA9IGR5bl9jYXN0PFN0cnVjdFR5cGU+KFR5LT5nZXRDb250YWluZWRUeXBlKDApKTsKLSAgCi0gIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gRWx0czsKLSAgCi0gIGZvciAodWludDMyIGkgPSAwOyBpIDwgY2wtPm5iU3RhdGljRmllbGRzOyArK2kpIHsKLSAgICBKYXZhRmllbGQmIGZpZWxkID0gY2wtPnN0YXRpY0ZpZWxkc1tpXTsKLSAgICBjb25zdCBUeXBlZGVmKiB0eXBlID0gZmllbGQuZ2V0U2lnbmF0dXJlKCk7Ci0gICAgTExWTUFzc2Vzc29ySW5mbyYgTEFJID0gZ2V0VHlwZWRlZkluZm8odHlwZSk7Ci0gICAgY29uc3QgVHlwZSogVHkgPSBMQUkubGx2bVR5cGU7Ci0KLSAgICBBdHRyaWJ1dCogYXR0cmlidXQgPSBmaWVsZC5sb29rdXBBdHRyaWJ1dChBdHRyaWJ1dDo6Y29uc3RhbnRBdHRyaWJ1dCk7Ci0KLSAgICBpZiAoIWF0dHJpYnV0KSB7Ci0gICAgICBpZiAoY2wtPmdldFN0YXRpY0luc3RhbmNlKCkgIT0gTlVMTCkgewotICAgICAgICBpZiAodHlwZS0+aXNQcmltaXRpdmUoKSkgewotICAgICAgICAgIGNvbnN0IFByaW1pdGl2ZVR5cGVkZWYqIHByaW0gPSAoY29uc3QgUHJpbWl0aXZlVHlwZWRlZiopdHlwZTsKLSAgICAgICAgICBpZiAocHJpbS0+aXNCb29sKCkgfHwgcHJpbS0+aXNCeXRlKCkpIHsKLSAgICAgICAgICAgIENvbnN0YW50SW50KiBDSSA9IENvbnN0YW50SW50OjpnZXQoCi0gICAgICAgICAgICAgICAgVHlwZTo6Z2V0SW50OFR5KGdldExMVk1Db250ZXh0KCkpLAotICAgICAgICAgICAgICAgIGZpZWxkLmdldFN0YXRpY0ludDhGaWVsZCgpKTsKLSAgICAgICAgICAgIEVsdHMucHVzaF9iYWNrKENJKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKHByaW0tPmlzU2hvcnQoKSB8fCBwcmltLT5pc0NoYXIoKSkgewotICAgICAgICAgICAgQ29uc3RhbnRJbnQqIENJID0gQ29uc3RhbnRJbnQ6OmdldCgKLSAgICAgICAgICAgICAgICBUeXBlOjpnZXRJbnQxNlR5KGdldExMVk1Db250ZXh0KCkpLAotICAgICAgICAgICAgICAgIGZpZWxkLmdldFN0YXRpY0ludDE2RmllbGQoKSk7Ci0gICAgICAgICAgICBFbHRzLnB1c2hfYmFjayhDSSk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChwcmltLT5pc0ludCgpKSB7Ci0gICAgICAgICAgICBDb25zdGFudEludCogQ0kgPSBDb25zdGFudEludDo6Z2V0KAotICAgICAgICAgICAgICAgIFR5cGU6OmdldEludDMyVHkoZ2V0TExWTUNvbnRleHQoKSksCi0gICAgICAgICAgICAgICAgZmllbGQuZ2V0U3RhdGljSW50MzJGaWVsZCgpKTsKLSAgICAgICAgICAgIEVsdHMucHVzaF9iYWNrKENJKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKHByaW0tPmlzTG9uZygpKSB7Ci0gICAgICAgICAgICBDb25zdGFudEludCogQ0kgPSBDb25zdGFudEludDo6Z2V0KAotICAgICAgICAgICAgICAgIFR5cGU6OmdldEludDY0VHkoZ2V0TExWTUNvbnRleHQoKSksCi0gICAgICAgICAgICAgICAgZmllbGQuZ2V0U3RhdGljTG9uZ0ZpZWxkKCkpOwotICAgICAgICAgICAgRWx0cy5wdXNoX2JhY2soQ0kpOwotICAgICAgICAgIH0gZWxzZSBpZiAocHJpbS0+aXNGbG9hdCgpKSB7Ci0gICAgICAgICAgICBDb25zdGFudCogQ0YgPSBDb25zdGFudEZQOjpnZXQoCi0gICAgICAgICAgICAgICAgVHlwZTo6Z2V0RmxvYXRUeShnZXRMTFZNQ29udGV4dCgpKSwKLSAgICAgICAgICAgICAgICBmaWVsZC5nZXRTdGF0aWNGbG9hdEZpZWxkKCkpOwotICAgICAgICAgICAgRWx0cy5wdXNoX2JhY2soQ0YpOwotICAgICAgICAgIH0gZWxzZSBpZiAocHJpbS0+aXNEb3VibGUoKSkgewotICAgICAgICAgICAgQ29uc3RhbnQqIENGID0gQ29uc3RhbnRGUDo6Z2V0KAotICAgICAgICAgICAgICAgIFR5cGU6OmdldERvdWJsZVR5KGdldExMVk1Db250ZXh0KCkpLAotICAgICAgICAgICAgICAgIGZpZWxkLmdldFN0YXRpY0RvdWJsZUZpZWxkKCkpOwotICAgICAgICAgICAgRWx0cy5wdXNoX2JhY2soQ0YpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhYm9ydCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBKYXZhT2JqZWN0KiB2YWwgPSBmaWVsZC5nZXRTdGF0aWNPYmplY3RGaWVsZCgpOwotICAgICAgICAgIGlmICh2YWwpIHsKLSAgICAgICAgICAgIEpuanZtQ2xhc3NMb2FkZXIqIEpDTCA9IGNsLT5jbGFzc0xvYWRlcjsKLSAgICAgICAgICAgIENvbW1vbkNsYXNzKiBGaWVsZENsID0gZmllbGQuZ2V0U2lnbmF0dXJlKCktPmFzc29jQ2xhc3MoSkNMKTsKLSAgICAgICAgICAgIENvbnN0YW50KiBDTyA9IGdldEZpbmFsT2JqZWN0KHZhbCwgRmllbGRDbCk7Ci0gICAgICAgICAgICBFbHRzLnB1c2hfYmFjayhDTyk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEVsdHMucHVzaF9iYWNrKENvbnN0YW50OjpnZXROdWxsVmFsdWUoVHkpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEVsdHMucHVzaF9iYWNrKENvbnN0YW50OjpnZXROdWxsVmFsdWUoVHkpKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgUmVhZGVyIHJlYWRlcihhdHRyaWJ1dCwgY2wtPmJ5dGVzKTsKLSAgICAgIEphdmFDb25zdGFudFBvb2wgKiBjdHBJbmZvID0gY2wtPmN0cEluZm87Ci0gICAgICB1aW50MTYgaWR4ID0gcmVhZGVyLnJlYWRVMigpOwotICAgICAgaWYgKHR5cGUtPmlzUHJpbWl0aXZlKCkpIHsKLSAgICAgICAgaWYgKFR5ID09IFR5cGU6OmdldEludDY0VHkoZ2V0TExWTUNvbnRleHQoKSkpIHsKLSAgICAgICAgICBFbHRzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KFR5LCAodWludDY0KWN0cEluZm8tPkxvbmdBdChpZHgpKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoVHkgPT0gVHlwZTo6Z2V0RG91YmxlVHkoZ2V0TExWTUNvbnRleHQoKSkpIHsKLSAgICAgICAgICBFbHRzLnB1c2hfYmFjayhDb25zdGFudEZQOjpnZXQoVHksIGN0cEluZm8tPkRvdWJsZUF0KGlkeCkpKTsKLSAgICAgICAgfSBlbHNlIGlmIChUeSA9PSBUeXBlOjpnZXRGbG9hdFR5KGdldExMVk1Db250ZXh0KCkpKSB7Ci0gICAgICAgICAgRWx0cy5wdXNoX2JhY2soQ29uc3RhbnRGUDo6Z2V0KFR5LCBjdHBJbmZvLT5GbG9hdEF0KGlkeCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBFbHRzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KFR5LCAodWludDY0KWN0cEluZm8tPkludGVnZXJBdChpZHgpKSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNSZWZlcmVuY2UoKSl7Ci0gICAgICAgIGNvbnN0IFVURjgqIHV0ZjggPSBjdHBJbmZvLT5VVEY4QXQoY3RwSW5mby0+Y3RwRGVmW2lkeF0pOwotICAgICAgICBKYXZhU3RyaW5nKiBvYmogPSBjdHBJbmZvLT5yZXNvbHZlU3RyaW5nKHV0ZjgsIGlkeCk7Ci0gICAgICAgIENvbnN0YW50KiBDID0gZ2V0U3RyaW5nKG9iaik7Ci0gICAgICAgIEMgPSBDb25zdGFudEV4cHI6OmdldEJpdENhc3QoQywgSmF2YUludHJpbnNpY3MuSmF2YU9iamVjdFR5cGUpOwotICAgICAgICBFbHRzLnB1c2hfYmFjayhDKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lIik7Ci0gICAgICAgIGFib3J0KCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gICAKLSAgcmV0dXJuIENvbnN0YW50U3RydWN0OjpnZXQoU1R5LCBFbHRzKTsKLX0KLQotQ29uc3RhbnQqIEphdmFBT1RDb21waWxlcjo6Z2V0U3RhdGljSW5zdGFuY2UoQ2xhc3MqIGNsYXNzRGVmKSB7Ci0gIHN0YXRpY19pbnN0YW5jZV9pdGVyYXRvciBFbmQgPSBzdGF0aWNJbnN0YW5jZXMuZW5kKCk7Ci0gIHN0YXRpY19pbnN0YW5jZV9pdGVyYXRvciBJID0gc3RhdGljSW5zdGFuY2VzLmZpbmQoY2xhc3NEZWYpOwotICBpZiAoSSA9PSBFbmQpIHsKLSAgICAKLSAgICBMTFZNQ2xhc3NJbmZvKiBMQ0kgPSBnZXRDbGFzc0luZm8oY2xhc3NEZWYpOwotICAgIGNvbnN0IFR5cGUqIFR5ID0gTENJLT5nZXRTdGF0aWNUeXBlKCk7Ci0gICAgVHkgPSBUeS0+Z2V0Q29udGFpbmVkVHlwZSgwKTsKLSAgICBzdGQ6OnN0cmluZyBuYW1lKFVURjhCdWZmZXIoY2xhc3NEZWYtPm5hbWUpLnRvQ29tcGlsZU5hbWUoKS0+Y1N0cmluZygpKTsKLSAgICBuYW1lICs9ICJfc3RhdGljIjsKLSAgICBNb2R1bGUmIE1vZCA9ICpnZXRMTFZNTW9kdWxlKCk7Ci0gICAgR2xvYmFsVmFyaWFibGUqIHZhckdWID0gCi0gICAgICBuZXcgR2xvYmFsVmFyaWFibGUoTW9kLCBUeSwgZmFsc2UsIEdsb2JhbFZhbHVlOjpFeHRlcm5hbExpbmthZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMCwgbmFtZSk7Ci0KLSAgICBDb25zdGFudCogcmVzID0gQ29uc3RhbnRFeHByOjpnZXRDYXN0KEluc3RydWN0aW9uOjpCaXRDYXN0LCB2YXJHViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFJbnRyaW5zaWNzLnB0clR5cGUpOwotICAgIHN0YXRpY0luc3RhbmNlcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY2xhc3NEZWYsIHJlcykpOwotICAgIAotICAgIGlmIChpc0NvbXBpbGluZyhjbGFzc0RlZikpIHsgCi0gICAgICBDb25zdGFudCogQyA9IENyZWF0ZUNvbnN0YW50RnJvbVN0YXRpY0luc3RhbmNlKGNsYXNzRGVmKTsKLSAgICAgIHZhckdWLT5zZXRJbml0aWFsaXplcihDKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzOwotICB9IGVsc2UgewotICAgIHJldHVybiBJLT5zZWNvbmQ7Ci0gIH0KLX0KLQotQ29uc3RhbnQqIEphdmFBT1RDb21waWxlcjo6Z2V0VmlydHVhbFRhYmxlKEphdmFWaXJ0dWFsVGFibGUqIFZUKSB7Ci0gIENvbW1vbkNsYXNzKiBjbGFzc0RlZiA9IFZULT5jbDsKLSAgdWludDMyIHNpemUgPSAwOwotICBpZiAoY2xhc3NEZWYtPmlzQ2xhc3MoKSkgewotICAgIExMVk1DbGFzc0luZm8qIExDSSA9IGdldENsYXNzSW5mbyhjbGFzc0RlZi0+YXNDbGFzcygpKTsKLSAgICBMQ0ktPmdldFZpcnR1YWxUeXBlKCk7Ci0gICAgc2l6ZSA9IGNsYXNzRGVmLT5hc0NsYXNzKCktPnZpcnR1YWxUYWJsZVNpemU7Ci0gIH0gZWxzZSB7Ci0gICAgc2l6ZSA9IEphdmFWaXJ0dWFsVGFibGU6OmdldEJhc2VTaXplKCk7Ci0gIH0KLSAgbGx2bTo6Q29uc3RhbnQqIHJlcyA9IDA7Ci0gIHZpcnR1YWxfdGFibGVfaXRlcmF0b3IgRW5kID0gdmlydHVhbFRhYmxlcy5lbmQoKTsKLSAgdmlydHVhbF90YWJsZV9pdGVyYXRvciBJID0gdmlydHVhbFRhYmxlcy5maW5kKFZUKTsKLSAgaWYgKEkgPT0gRW5kKSB7Ci0gICAgCi0gICAgY29uc3QgQXJyYXlUeXBlKiBBVHkgPSAKLSAgICAgIGR5bl9jYXN0PEFycmF5VHlwZT4oSmF2YUludHJpbnNpY3MuVlRUeXBlLT5nZXRDb250YWluZWRUeXBlKDApKTsKLSAgICBjb25zdCBQb2ludGVyVHlwZSogUFR5ID0gZHluX2Nhc3Q8UG9pbnRlclR5cGU+KEFUeS0+Z2V0Q29udGFpbmVkVHlwZSgwKSk7Ci0gICAgQVR5ID0gQXJyYXlUeXBlOjpnZXQoUFR5LCBzaXplKTsKLSAgICBzdGQ6OnN0cmluZyBuYW1lKFVURjhCdWZmZXIoY2xhc3NEZWYtPm5hbWUpLnRvQ29tcGlsZU5hbWUoKS0+Y1N0cmluZygpKTsKLSAgICBuYW1lICs9ICJfVlQiOwotICAgIC8vIERvIG5vdCBzZXQgYSB2aXJ0dWFsIHRhYmxlIGFzIGEgY29uc3RhbnQsIGJlY2F1c2UgdGhlIHJ1bnRpbWUgbWF5Ci0gICAgLy8gbW9kaWZ5IGl0LgotICAgIE1vZHVsZSYgTW9kID0gKmdldExMVk1Nb2R1bGUoKTsKLSAgICBHbG9iYWxWYXJpYWJsZSogdmFyR1YgPSBuZXcgR2xvYmFsVmFyaWFibGUoTW9kLCBBVHksIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxMaW5rYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBuYW1lKTsKLSAgCi0gICAgcmVzID0gQ29uc3RhbnRFeHByOjpnZXRDYXN0KEluc3RydWN0aW9uOjpCaXRDYXN0LCB2YXJHViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YUludHJpbnNpY3MuVlRUeXBlKTsKLSAgICB2aXJ0dWFsVGFibGVzLmluc2VydChzdGQ6Om1ha2VfcGFpcihWVCwgcmVzKSk7Ci0gIAotICAgIGlmIChpc0NvbXBpbGluZyhjbGFzc0RlZikgfHwgYXNzdW1lQ29tcGlsZWQpIHsKLSAgICAgIENvbnN0YW50KiBDID0gQ3JlYXRlQ29uc3RhbnRGcm9tVlQoVlQpOwotICAgICAgdmFyR1YtPnNldEluaXRpYWxpemVyKEMpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzOwotICB9IGVsc2UgewotICAgIHJldHVybiBJLT5zZWNvbmQ7Ci0gIH0gCi19Ci0KLUNvbnN0YW50KiBKYXZhQU9UQ29tcGlsZXI6OmdldE5hdGl2ZUZ1bmN0aW9uKEphdmFNZXRob2QqIG1ldGgsIHZvaWQqIHB0cikgewotICBsbHZtOjpDb25zdGFudCogdmFyR1YgPSAwOwotICBuYXRpdmVfZnVuY3Rpb25faXRlcmF0b3IgRW5kID0gbmF0aXZlRnVuY3Rpb25zLmVuZCgpOwotICBuYXRpdmVfZnVuY3Rpb25faXRlcmF0b3IgSSA9IG5hdGl2ZUZ1bmN0aW9ucy5maW5kKG1ldGgpOwotICBpZiAoSSA9PSBFbmQpIHsKLSAgICAKLSAgICBMTFZNU2lnbmF0dXJlSW5mbyogTFNJID0gZ2V0U2lnbmF0dXJlSW5mbyhtZXRoLT5nZXRTaWduYXR1cmUoKSk7Ci0gICAgY29uc3QgbGx2bTo6VHlwZSogdmFsUHRyVHlwZSA9IExTSS0+Z2V0TmF0aXZlUHRyVHlwZSgpOwotICAgIAotICAgIE1vZHVsZSYgTW9kID0gKmdldExMVk1Nb2R1bGUoKTsKLSAgICB2YXJHViA9IG5ldyBHbG9iYWxWYXJpYWJsZShNb2QsIHZhbFB0clR5cGUsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZSh2YWxQdHJUeXBlKSwgIiIpOwotICAKLSAgICBuYXRpdmVGdW5jdGlvbnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKG1ldGgsIHZhckdWKSk7Ci0gICAgcmV0dXJuIHZhckdWOwotICB9IGVsc2UgewotICAgIHJldHVybiBJLT5zZWNvbmQ7Ci0gIH0KLX0KLQotQ29uc3RhbnQqIEphdmFBT1RDb21waWxlcjo6Q3JlYXRlQ29uc3RhbnRGb3JCYXNlT2JqZWN0KENvbW1vbkNsYXNzKiBjbCkgewotICBjb25zdCBTdHJ1Y3RUeXBlKiBTVHkgPSAKLSAgICBkeW5fY2FzdDxTdHJ1Y3RUeXBlPihKYXZhSW50cmluc2ljcy5KYXZhT2JqZWN0VHlwZS0+Z2V0Q29udGFpbmVkVHlwZSgwKSk7Ci0gIAotICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IEVsbXRzOwotCi0gIC8vIFZUCi0gIEVsbXRzLnB1c2hfYmFjayhnZXRWaXJ0dWFsVGFibGUoY2wtPnZpcnR1YWxWVCkpOwotICAKLSAgLy8gbG9jawotICBDb25zdGFudCogTCA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50NjRUeShnZXRMTFZNQ29udGV4dCgpKSwgMCk7Ci0gIEVsbXRzLnB1c2hfYmFjayhDb25zdGFudEV4cHI6OmdldEludFRvUHRyKEwsIEphdmFJbnRyaW5zaWNzLnB0clR5cGUpKTsKLQotICByZXR1cm4gQ29uc3RhbnRTdHJ1Y3Q6OmdldChTVHksIEVsbXRzKTsKLX0KLQotQ29uc3RhbnQqIEphdmFBT1RDb21waWxlcjo6Q3JlYXRlQ29uc3RhbnRGcm9tSmF2YUNsYXNzKENvbW1vbkNsYXNzKiBjbCkgewotICBDbGFzcyogamF2YUNsYXNzID0gY2wtPmNsYXNzTG9hZGVyLT52bS0+dXBjYWxscy0+bmV3Q2xhc3M7Ci0gIExMVk1DbGFzc0luZm8qIExDSSA9IGdldENsYXNzSW5mbyhqYXZhQ2xhc3MpOwotICBjb25zdCBTdHJ1Y3RUeXBlKiBTVHkgPSAKLSAgICBkeW5fY2FzdDxTdHJ1Y3RUeXBlPihMQ0ktPmdldFZpcnR1YWxUeXBlKCktPmdldENvbnRhaW5lZFR5cGUoMCkpOwotCi0gIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gRWxtdHM7Ci0KLSAgLy8gSmF2YU9iamVjdAotICBFbG10cy5wdXNoX2JhY2soQ3JlYXRlQ29uc3RhbnRGb3JCYXNlT2JqZWN0KGphdmFDbGFzcykpOwotICAKLSAgLy8gc2lnbmVycwotICBFbG10cy5wdXNoX2JhY2soQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShKYXZhSW50cmluc2ljcy5KYXZhT2JqZWN0VHlwZSkpOwotICAKLSAgLy8gcGQKLSAgRWxtdHMucHVzaF9iYWNrKENvbnN0YW50OjpnZXROdWxsVmFsdWUoSmF2YUludHJpbnNpY3MuSmF2YU9iamVjdFR5cGUpKTsKLSAgCi0gIC8vIHZtZGF0YQotICBDb25zdGFudCogQ2wgPSBnZXROYXRpdmVDbGFzcyhjbCk7Ci0gIENsID0gQ29uc3RhbnRFeHByOjpnZXRDYXN0KEluc3RydWN0aW9uOjpCaXRDYXN0LCBDbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YUludHJpbnNpY3MuSmF2YU9iamVjdFR5cGUpOwotICBFbG10cy5wdXNoX2JhY2soQ2wpOwotCi0gIC8vIGNvbnN0cnVjdG9yCi0gIEVsbXRzLnB1c2hfYmFjayhDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEphdmFJbnRyaW5zaWNzLkphdmFPYmplY3RUeXBlKSk7Ci0KLSAgcmV0dXJuIENvbnN0YW50U3RydWN0OjpnZXQoU1R5LCBFbG10cyk7Ci19Ci0KLUNvbnN0YW50KiBKYXZhQU9UQ29tcGlsZXI6OkNyZWF0ZUNvbnN0YW50RnJvbUphdmFPYmplY3QoSmF2YU9iamVjdCogb2JqKSB7Ci0gIENvbW1vbkNsYXNzKiBjbCA9IEphdmFPYmplY3Q6OmdldENsYXNzKG9iaik7Ci0KLSAgaWYgKGNsLT5pc0FycmF5KCkpIHsKLSAgICBDbGFzc3BhdGgqIHVwY2FsbHMgPSBjbC0+Y2xhc3NMb2FkZXItPnZtLT51cGNhbGxzOwotICAgIENvbW1vbkNsYXNzKiBzdWJDbGFzcyA9IGNsLT5hc0FycmF5Q2xhc3MoKS0+YmFzZUNsYXNzKCk7Ci0gICAgaWYgKHN1YkNsYXNzLT5pc1ByaW1pdGl2ZSgpKSB7Ci0gICAgICBpZiAoc3ViQ2xhc3MgPT0gdXBjYWxscy0+T2ZCb29sKSB7Ci0gICAgICAgIHJldHVybiBDcmVhdGVDb25zdGFudEZyb21JbnRBcnJheTxBcnJheVVJbnQ4PigoQXJyYXlVSW50OCopb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6OmdldEludDhUeShnZXRMTFZNQ29udGV4dCgpKSk7Ci0gICAgICB9IGVsc2UgaWYgKHN1YkNsYXNzID09IHVwY2FsbHMtPk9mQnl0ZSkgewotICAgICAgICByZXR1cm4gQ3JlYXRlQ29uc3RhbnRGcm9tSW50QXJyYXk8QXJyYXlTSW50OD4oKEFycmF5U0ludDgqKW9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlOjpnZXRJbnQ4VHkoZ2V0TExWTUNvbnRleHQoKSkpOwotICAgICAgfSBlbHNlIGlmIChzdWJDbGFzcyA9PSB1cGNhbGxzLT5PZlNob3J0KSB7Ci0gICAgICAgIHJldHVybiBDcmVhdGVDb25zdGFudEZyb21JbnRBcnJheTxBcnJheVNJbnQxNj4oKEFycmF5U0ludDE2KilvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZTo6Z2V0SW50MTZUeShnZXRMTFZNQ29udGV4dCgpKSk7Ci0gICAgICB9IGVsc2UgaWYgKHN1YkNsYXNzID09IHVwY2FsbHMtPk9mQ2hhcikgewotICAgICAgICByZXR1cm4gQ3JlYXRlQ29uc3RhbnRGcm9tSW50QXJyYXk8QXJyYXlVSW50MTY+KChBcnJheVVJbnQxNiopb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6OmdldEludDE2VHkoZ2V0TExWTUNvbnRleHQoKSkpOwotICAgICAgfSBlbHNlIGlmIChzdWJDbGFzcyA9PSB1cGNhbGxzLT5PZkludCkgewotICAgICAgICByZXR1cm4gQ3JlYXRlQ29uc3RhbnRGcm9tSW50QXJyYXk8QXJyYXlTSW50MzI+KChBcnJheVNJbnQzMiopb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6OmdldEludDMyVHkoZ2V0TExWTUNvbnRleHQoKSkpOwotICAgICAgfSBlbHNlIGlmIChzdWJDbGFzcyA9PSB1cGNhbGxzLT5PZkZsb2F0KSB7Ci0gICAgICAgIHJldHVybiBDcmVhdGVDb25zdGFudEZyb21GUEFycmF5PEFycmF5RmxvYXQ+KChBcnJheUZsb2F0KilvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZTo6Z2V0RmxvYXRUeShnZXRMTFZNQ29udGV4dCgpKSk7Ci0gICAgICB9IGVsc2UgaWYgKHN1YkNsYXNzID09IHVwY2FsbHMtPk9mTG9uZykgewotICAgICAgICByZXR1cm4gQ3JlYXRlQ29uc3RhbnRGcm9tSW50QXJyYXk8QXJyYXlMb25nPigoQXJyYXlMb25nKilvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZTo6Z2V0SW50NjRUeShnZXRMTFZNQ29udGV4dCgpKSk7Ci0gICAgICB9IGVsc2UgaWYgKHN1YkNsYXNzID09IHVwY2FsbHMtPk9mRG91YmxlKSB7Ci0gICAgICAgIHJldHVybiBDcmVhdGVDb25zdGFudEZyb21GUEFycmF5PEFycmF5RG91YmxlPigoQXJyYXlEb3VibGUqKW9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlOjpnZXREb3VibGVUeShnZXRMTFZNQ29udGV4dCgpKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBhYm9ydCgpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gQ3JlYXRlQ29uc3RhbnRGcm9tT2JqZWN0QXJyYXkoKEFycmF5T2JqZWN0KilvYmopOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAKLSAgICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IEVsbXRzOwotICAgIAotICAgIC8vIEphdmFPYmplY3QKLSAgICBDb25zdGFudCogQ3VyQ29uc3RhbnQgPQotICAgICAgICBDcmVhdGVDb25zdGFudEZvckJhc2VPYmplY3QoSmF2YU9iamVjdDo6Z2V0Q2xhc3Mob2JqKSk7Ci0KLSAgICBmb3IgKHVpbnQzMiBqID0gMTsgaiA8PSBjbC0+dmlydHVhbFZULT5kZXB0aDsgKytqKSB7Ci0gICAgICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IFRlbXBFbHRzOwotICAgICAgRWxtdHMucHVzaF9iYWNrKEN1ckNvbnN0YW50KTsKLSAgICAgIFRlbXBFbHRzLnB1c2hfYmFjayhDdXJDb25zdGFudCk7Ci0gICAgICBDbGFzcyogY3VyQ2wgPSBjbC0+dmlydHVhbFZULT5kaXNwbGF5W2pdLT5jbC0+YXNDbGFzcygpOwotICAgICAgTExWTUNsYXNzSW5mbyogTENJID0gZ2V0Q2xhc3NJbmZvKGN1ckNsKTsKLSAgICAgIGNvbnN0IFN0cnVjdFR5cGUqIFNUeSA9IAotICAgICAgICBkeW5fY2FzdDxTdHJ1Y3RUeXBlPihMQ0ktPmdldFZpcnR1YWxUeXBlKCktPmdldENvbnRhaW5lZFR5cGUoMCkpOwotCi0gICAgICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IGN1ckNsLT5uYlZpcnR1YWxGaWVsZHM7ICsraSkgewotICAgICAgICBKYXZhRmllbGQmIGZpZWxkID0gY3VyQ2wtPnZpcnR1YWxGaWVsZHNbaV07Ci0gICAgICAgIGNvbnN0IFR5cGVkZWYqIHR5cGUgPSBmaWVsZC5nZXRTaWduYXR1cmUoKTsKLSAgICAgICAgaWYgKHR5cGUtPmlzUHJpbWl0aXZlKCkpIHsKLSAgICAgICAgICBjb25zdCBQcmltaXRpdmVUeXBlZGVmKiBwcmltID0gKGNvbnN0IFByaW1pdGl2ZVR5cGVkZWYqKXR5cGU7Ci0gICAgICAgICAgaWYgKHByaW0tPmlzQm9vbCgpIHx8IHByaW0tPmlzQnl0ZSgpKSB7Ci0gICAgICAgICAgICBDb25zdGFudEludCogQ0kgPSBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDhUeShnZXRMTFZNQ29udGV4dCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0SW5zdGFuY2VJbnQ4RmllbGQob2JqKSk7Ci0gICAgICAgICAgICBUZW1wRWx0cy5wdXNoX2JhY2soQ0kpOwotICAgICAgICAgIH0gZWxzZSBpZiAocHJpbS0+aXNTaG9ydCgpIHx8IHByaW0tPmlzQ2hhcigpKSB7Ci0gICAgICAgICAgICBDb25zdGFudEludCogQ0kgPSBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDE2VHkoZ2V0TExWTUNvbnRleHQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldEluc3RhbmNlSW50MTZGaWVsZChvYmopKTsKLSAgICAgICAgICAgIFRlbXBFbHRzLnB1c2hfYmFjayhDSSk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChwcmltLT5pc0ludCgpKSB7Ci0gICAgICAgICAgICBDb25zdGFudEludCogQ0kgPSBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoZ2V0TExWTUNvbnRleHQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldEluc3RhbmNlSW50MzJGaWVsZChvYmopKTsKLSAgICAgICAgICAgIFRlbXBFbHRzLnB1c2hfYmFjayhDSSk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChwcmltLT5pc0xvbmcoKSkgewotICAgICAgICAgICAgQ29uc3RhbnRJbnQqIENJID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ2NFR5KGdldExMVk1Db250ZXh0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRJbnN0YW5jZUxvbmdGaWVsZChvYmopKTsKLSAgICAgICAgICAgIFRlbXBFbHRzLnB1c2hfYmFjayhDSSk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChwcmltLT5pc0Zsb2F0KCkpIHsKLSAgICAgICAgICAgIENvbnN0YW50KiBDRiA9IENvbnN0YW50RlA6OmdldChUeXBlOjpnZXRGbG9hdFR5KGdldExMVk1Db250ZXh0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldEluc3RhbmNlRmxvYXRGaWVsZChvYmopKTsKLSAgICAgICAgICAgIFRlbXBFbHRzLnB1c2hfYmFjayhDRik7Ci0gICAgICAgICAgfSBlbHNlIGlmIChwcmltLT5pc0RvdWJsZSgpKSB7Ci0gICAgICAgICAgICBDb25zdGFudCogQ0YgPSBDb25zdGFudEZQOjpnZXQoVHlwZTo6Z2V0RG91YmxlVHkoZ2V0TExWTUNvbnRleHQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0SW5zdGFuY2VEb3VibGVGaWVsZChvYmopKTsKLSAgICAgICAgICAgIFRlbXBFbHRzLnB1c2hfYmFjayhDRik7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFib3J0KCk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIEphdmFPYmplY3QqIHZhbCA9IGZpZWxkLmdldEluc3RhbmNlT2JqZWN0RmllbGQob2JqKTsKLSAgICAgICAgICBpZiAodmFsKSB7Ci0gICAgICAgICAgICBKbmp2bUNsYXNzTG9hZGVyKiBKQ0wgPSBjbC0+Y2xhc3NMb2FkZXI7Ci0gICAgICAgICAgICBDb21tb25DbGFzcyogRmllbGRDbCA9IGZpZWxkLmdldFNpZ25hdHVyZSgpLT5hc3NvY0NsYXNzKEpDTCk7Ci0gICAgICAgICAgICBDb25zdGFudCogQyA9IGdldEZpbmFsT2JqZWN0KHZhbCwgRmllbGRDbCk7Ci0gICAgICAgICAgICBUZW1wRWx0cy5wdXNoX2JhY2soQyk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnN0IGxsdm06OlR5cGUqIFR5ID0gSmF2YUludHJpbnNpY3MuSmF2YU9iamVjdFR5cGU7Ci0gICAgICAgICAgICBUZW1wRWx0cy5wdXNoX2JhY2soQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShUeSkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgQ3VyQ29uc3RhbnQgPSBDb25zdGFudFN0cnVjdDo6Z2V0KFNUeSwgVGVtcEVsdHMpOwotICAgIH0KLQotICAgIHJldHVybiBDdXJDb25zdGFudDsKLSAgfQotfQotCi1Db25zdGFudCogSmF2YUFPVENvbXBpbGVyOjpDcmVhdGVDb25zdGFudEZyb21KYXZhU3RyaW5nKEphdmFTdHJpbmcqIHN0cikgewotICBDbGFzcyogY2wgPSBKYXZhT2JqZWN0OjpnZXRDbGFzcyhzdHIpLT5hc0NsYXNzKCk7Ci0gIExMVk1DbGFzc0luZm8qIExDSSA9IGdldENsYXNzSW5mbyhjbCk7Ci0gIGNvbnN0IFN0cnVjdFR5cGUqIFNUeSA9IAotICAgIGR5bl9jYXN0PFN0cnVjdFR5cGU+KExDSS0+Z2V0VmlydHVhbFR5cGUoKS0+Z2V0Q29udGFpbmVkVHlwZSgwKSk7Ci0KLSAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBFbG10czsKLQotICBFbG10cy5wdXNoX2JhY2soQ3JlYXRlQ29uc3RhbnRGb3JCYXNlT2JqZWN0KGNsKSk7Ci0KLSAgQ29uc3RhbnQqIEFycmF5ID0KLSAgICBDcmVhdGVDb25zdGFudEZyb21JbnRBcnJheTxBcnJheVVJbnQxNj4oSmF2YVN0cmluZzo6Z2V0VmFsdWUoc3RyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZTo6Z2V0SW50MTZUeShnZXRMTFZNQ29udGV4dCgpKSk7Ci0gIAotCi0gIE1vZHVsZSYgTW9kID0gKmdldExMVk1Nb2R1bGUoKTsKLSAgR2xvYmFsVmFyaWFibGUqIHZhckdWID0gbmV3IEdsb2JhbFZhcmlhYmxlKE1vZCwgQXJyYXktPmdldFR5cGUoKSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxWYWx1ZTo6SW50ZXJuYWxMaW5rYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXksICIiKTsKLSAKLQlBcnJheSA9IENvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdCh2YXJHViwgSmF2YUludHJpbnNpY3MuSmF2YU9iamVjdFR5cGUpOwotCi0gIEVsbXRzLnB1c2hfYmFjayhBcnJheSk7Ci0gIEVsbXRzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoZ2V0TExWTUNvbnRleHQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ci0+Y291bnQpKTsKLSAgRWxtdHMucHVzaF9iYWNrKENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShnZXRMTFZNQ29udGV4dCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLT5jYWNoZWRIYXNoQ29kZSkpOwotICBFbG10cy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KGdldExMVk1Db250ZXh0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHItPm9mZnNldCkpOwotIAotICByZXR1cm4gQ29uc3RhbnRTdHJ1Y3Q6OmdldChTVHksIEVsbXRzKTsKLX0KLQotCi1Db25zdGFudCogSmF2YUFPVENvbXBpbGVyOjpDcmVhdGVDb25zdGFudEZyb21BdHRyaWJ1dChBdHRyaWJ1dCYgYXR0cmlidXQpIHsKLSAgY29uc3QgU3RydWN0VHlwZSogU1R5ID0gCi0gICAgZHluX2Nhc3Q8U3RydWN0VHlwZT4oSmF2YUludHJpbnNpY3MuQXR0cmlidXRUeXBlLT5nZXRDb250YWluZWRUeXBlKDApKTsKLQotCi0gIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gRWxtdHM7Ci0KLSAgLy8gbmFtZQotICBFbG10cy5wdXNoX2JhY2soZ2V0VVRGOChhdHRyaWJ1dC5uYW1lKSk7Ci0KLSAgLy8gc3RhcnQKLSAgRWxtdHMucHVzaF9iYWNrKENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShnZXRMTFZNQ29udGV4dCgpKSwgYXR0cmlidXQuc3RhcnQpKTsKLQotICAvLyBuYmIKLSAgRWxtdHMucHVzaF9iYWNrKENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShnZXRMTFZNQ29udGV4dCgpKSwgYXR0cmlidXQubmJiKSk7Ci0gIAotICByZXR1cm4gQ29uc3RhbnRTdHJ1Y3Q6OmdldChTVHksIEVsbXRzKTsKLX0KLQotQ29uc3RhbnQqIEphdmFBT1RDb21waWxlcjo6Q3JlYXRlQ29uc3RhbnRGcm9tQ29tbW9uQ2xhc3MoQ29tbW9uQ2xhc3MqIGNsKSB7Ci0gIGNvbnN0IFN0cnVjdFR5cGUqIFNUeSA9IAotICAgIGR5bl9jYXN0PFN0cnVjdFR5cGU+KEphdmFJbnRyaW5zaWNzLkphdmFDb21tb25DbGFzc1R5cGUtPmdldENvbnRhaW5lZFR5cGUoMCkpOwotICBNb2R1bGUmIE1vZCA9ICpnZXRMTFZNTW9kdWxlKCk7Ci0gIAotICBjb25zdCBsbHZtOjpUeXBlKiBUZW1wVHkgPSAwOwotCi0gIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gQ29tbW9uQ2xhc3NFbHRzOwotICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IFRlbXBFbG10czsKLQotICAvLyBkZWxlZ2F0ZWUKLSAgY29uc3QgQXJyYXlUeXBlKiBBVHkgPSBkeW5fY2FzdDxBcnJheVR5cGU+KFNUeS0+Z2V0Q29udGFpbmVkVHlwZSgwKSk7Ci0gIGFzc2VydChBVHkgJiYgIk1hbGZvcm1lZCB0eXBlIik7Ci0KLSAgQ29uc3RhbnQqIFRDTVsxXSA9IHsgZ2V0SmF2YUNsYXNzKGNsKSB9OwotICBDb21tb25DbGFzc0VsdHMucHVzaF9iYWNrKENvbnN0YW50QXJyYXk6OmdldChBVHksIFRDTSwgMSkpOwotICAKLSAgLy8gYWNjZXNzCi0gIENvbW1vbkNsYXNzRWx0cy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQxNlR5KGdldExMVk1Db250ZXh0KCkpLCBjbC0+YWNjZXNzKSk7Ci0gCi0gIC8vIGludGVyZmFjZXMKLSAgaWYgKGNsLT5uYkludGVyZmFjZXMpIHsKLSAgICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IGNsLT5uYkludGVyZmFjZXM7ICsraSkgewotICAgICAgVGVtcEVsbXRzLnB1c2hfYmFjayhnZXROYXRpdmVDbGFzcyhjbC0+aW50ZXJmYWNlc1tpXSkpOwotICAgIH0KLQotICAgIEFUeSA9IEFycmF5VHlwZTo6Z2V0KEphdmFJbnRyaW5zaWNzLkphdmFDbGFzc1R5cGUsIGNsLT5uYkludGVyZmFjZXMpOwotICAgIENvbnN0YW50KiBpbnRlcmZhY2VzID0gQ29uc3RhbnRBcnJheTo6Z2V0KEFUeSwgVGVtcEVsbXRzKTsKLSAgICBpbnRlcmZhY2VzID0gbmV3IEdsb2JhbFZhcmlhYmxlKE1vZCwgQVR5LCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFsdWU6OkludGVybmFsTGlua2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZXMsICIiKTsKLSAgICBpbnRlcmZhY2VzID0gQ29uc3RhbnRFeHByOjpnZXRDYXN0KEluc3RydWN0aW9uOjpCaXRDYXN0LCBpbnRlcmZhY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoSmF2YUludHJpbnNpY3MuSmF2YUNsYXNzVHlwZSkpOwotCi0gICAgQ29tbW9uQ2xhc3NFbHRzLnB1c2hfYmFjayhpbnRlcmZhY2VzKTsKLSAgfSBlbHNlIHsKLSAgICBjb25zdCBUeXBlKiBUeSA9IFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoSmF2YUludHJpbnNpY3MuSmF2YUNsYXNzVHlwZSk7Ci0gICAgQ29tbW9uQ2xhc3NFbHRzLnB1c2hfYmFjayhDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFR5KSk7Ci0gIH0KLQotICAvLyBuYkludGVyZmFjZXMKLSAgQ29tbW9uQ2xhc3NFbHRzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDE2VHkoZ2V0TExWTUNvbnRleHQoKSksIGNsLT5uYkludGVyZmFjZXMpKTsKLQotICAvLyBuYW1lCi0gIENvbW1vbkNsYXNzRWx0cy5wdXNoX2JhY2soZ2V0VVRGOChjbC0+bmFtZSkpOwotCi0gIC8vIHN1cGVyCi0gIGlmIChjbC0+c3VwZXIpIHsKLSAgICBDb21tb25DbGFzc0VsdHMucHVzaF9iYWNrKGdldE5hdGl2ZUNsYXNzKGNsLT5zdXBlcikpOwotICB9IGVsc2UgewotICAgIFRlbXBUeSA9IEphdmFJbnRyaW5zaWNzLkphdmFDbGFzc1R5cGU7Ci0gICAgQ29tbW9uQ2xhc3NFbHRzLnB1c2hfYmFjayhDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFRlbXBUeSkpOwotICB9Ci0KLSAgLy8gY2xhc3NMb2FkZXI6IHN0b3JlIHRoZSBzdGF0aWMgaW5pdGlhbGl6ZXIsIGl0IHdpbGwgYmUgb3ZlcnJpZGVuIG9uY2UKLSAgLy8gdGhlIGNsYXNzIGlzIGxvYWRlZC4KLSAgQ29uc3RhbnQqIGxvYWRlciA9IENvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdChTdGF0aWNJbml0aWFsaXplciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhSW50cmluc2ljcy5wdHJUeXBlKTsKLSAgQ29tbW9uQ2xhc3NFbHRzLnB1c2hfYmFjayhsb2FkZXIpOwotICAKLSAgLy8gdmlydHVhbFRhYmxlCi0gIGlmIChjbC0+dmlydHVhbFZUKSB7Ci0gICAgQ29tbW9uQ2xhc3NFbHRzLnB1c2hfYmFjayhnZXRWaXJ0dWFsVGFibGUoY2wtPnZpcnR1YWxWVCkpOwotICB9IGVsc2UgewotICAgIFRlbXBUeSA9IEphdmFJbnRyaW5zaWNzLlZUVHlwZTsKLSAgICBDb21tb25DbGFzc0VsdHMucHVzaF9iYWNrKENvbnN0YW50OjpnZXROdWxsVmFsdWUoVGVtcFR5KSk7Ci0gIH0KLSAgcmV0dXJuIENvbnN0YW50U3RydWN0OjpnZXQoU1R5LCBDb21tb25DbGFzc0VsdHMpOwotfQotCi1Db25zdGFudCogSmF2YUFPVENvbXBpbGVyOjpDcmVhdGVDb25zdGFudEZyb21KYXZhRmllbGQoSmF2YUZpZWxkJiBmaWVsZCkgewotICBjb25zdCBTdHJ1Y3RUeXBlKiBTVHkgPSAKLSAgICBkeW5fY2FzdDxTdHJ1Y3RUeXBlPihKYXZhSW50cmluc2ljcy5KYXZhRmllbGRUeXBlLT5nZXRDb250YWluZWRUeXBlKDApKTsKLSAgCi0gIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gRmllbGRFbHRzOwotICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IFRlbXBFbHRzOwotICAKLSAgLy8gc2lnbmF0dXJlCi0gIEZpZWxkRWx0cy5wdXNoX2JhY2soQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShKYXZhSW50cmluc2ljcy5wdHJUeXBlKSk7Ci0gIAotICAvLyBhY2Nlc3MKLSAgRmllbGRFbHRzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDE2VHkoZ2V0TExWTUNvbnRleHQoKSksIGZpZWxkLmFjY2VzcykpOwotCi0gIC8vIG5hbWUKLSAgRmllbGRFbHRzLnB1c2hfYmFjayhnZXRVVEY4KGZpZWxkLm5hbWUpKTsKLQotICAvLyB0eXBlCi0gIEZpZWxkRWx0cy5wdXNoX2JhY2soZ2V0VVRGOChmaWVsZC50eXBlKSk7Ci0gIAotICAvLyBhdHRyaWJ1dHMgCi0gIGlmIChmaWVsZC5uYkF0dHJpYnV0cykgewotICAgIGNvbnN0IGxsdm06OlR5cGUqIEF0dHJUeSA9IEphdmFJbnRyaW5zaWNzLkF0dHJpYnV0VHlwZS0+Z2V0Q29udGFpbmVkVHlwZSgwKTsKLSAgICBjb25zdCBBcnJheVR5cGUqIEFUeSA9IEFycmF5VHlwZTo6Z2V0KEF0dHJUeSwgZmllbGQubmJBdHRyaWJ1dHMpOwotICAgIGZvciAodWludDMyIGkgPSAwOyBpIDwgZmllbGQubmJBdHRyaWJ1dHM7ICsraSkgewotICAgICAgVGVtcEVsdHMucHVzaF9iYWNrKENyZWF0ZUNvbnN0YW50RnJvbUF0dHJpYnV0KGZpZWxkLmF0dHJpYnV0c1tpXSkpOwotICAgIH0KLQotICAgIENvbnN0YW50KiBhdHRyaWJ1dHMgPSBDb25zdGFudEFycmF5OjpnZXQoQVR5LCBUZW1wRWx0cyk7Ci0gICAgVGVtcEVsdHMuY2xlYXIoKTsKLSAgICBhdHRyaWJ1dHMgPSBuZXcgR2xvYmFsVmFyaWFibGUoKmdldExMVk1Nb2R1bGUoKSwgQVR5LCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxWYWx1ZTo6SW50ZXJuYWxMaW5rYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dHMsICIiKTsKLSAgICBhdHRyaWJ1dHMgPSBDb25zdGFudEV4cHI6OmdldENhc3QoSW5zdHJ1Y3Rpb246OkJpdENhc3QsIGF0dHJpYnV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YUludHJpbnNpY3MuQXR0cmlidXRUeXBlKTsKLSAgCi0gICAgRmllbGRFbHRzLnB1c2hfYmFjayhhdHRyaWJ1dHMpOwotICB9IGVsc2UgewotICAgIEZpZWxkRWx0cy5wdXNoX2JhY2soQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShKYXZhSW50cmluc2ljcy5BdHRyaWJ1dFR5cGUpKTsKLSAgfQotICAKLSAgLy8gbmJBdHRyaWJ1dHMKLSAgRmllbGRFbHRzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDE2VHkoZ2V0TExWTUNvbnRleHQoKSksIGZpZWxkLm5iQXR0cmlidXRzKSk7Ci0KLSAgLy8gY2xhc3NEZWYKLSAgRmllbGRFbHRzLnB1c2hfYmFjayhnZXROYXRpdmVDbGFzcyhmaWVsZC5jbGFzc0RlZikpOwotCi0gIC8vIHB0ck9mZnNldAotICBGaWVsZEVsdHMucHVzaF9iYWNrKENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShnZXRMTFZNQ29udGV4dCgpKSwgZmllbGQucHRyT2Zmc2V0KSk7Ci0KLSAgLy8gbnVtCi0gIEZpZWxkRWx0cy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQxNlR5KGdldExMVk1Db250ZXh0KCkpLCBmaWVsZC5udW0pKTsKLQotICByZXR1cm4gQ29uc3RhbnRTdHJ1Y3Q6OmdldChTVHksIEZpZWxkRWx0cyk7IAotfQotCi1Db25zdGFudCogSmF2YUFPVENvbXBpbGVyOjpDcmVhdGVDb25zdGFudEZyb21KYXZhTWV0aG9kKEphdmFNZXRob2QmIG1ldGhvZCkgewotICBjb25zdCBTdHJ1Y3RUeXBlKiBTVHkgPSAKLSAgICBkeW5fY2FzdDxTdHJ1Y3RUeXBlPihKYXZhSW50cmluc2ljcy5KYXZhTWV0aG9kVHlwZS0+Z2V0Q29udGFpbmVkVHlwZSgwKSk7Ci0gIE1vZHVsZSYgTW9kID0gKmdldExMVk1Nb2R1bGUoKTsKLSAgCi0gIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gTWV0aG9kRWx0czsKLSAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBUZW1wRWx0czsKLSAgCi0gIC8vIHNpZ25hdHVyZQotICBNZXRob2RFbHRzLnB1c2hfYmFjayhDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEphdmFJbnRyaW5zaWNzLnB0clR5cGUpKTsKLSAgCi0gIC8vIGFjY2VzcwotICBNZXRob2RFbHRzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDE2VHkoZ2V0TExWTUNvbnRleHQoKSksIG1ldGhvZC5hY2Nlc3MpKTsKLSAKLSAgLy8gYXR0cmlidXRzCi0gIGlmIChtZXRob2QubmJBdHRyaWJ1dHMpIHsKLSAgICBjb25zdCBsbHZtOjpUeXBlKiBBdHRyVHkgPSBKYXZhSW50cmluc2ljcy5BdHRyaWJ1dFR5cGUtPmdldENvbnRhaW5lZFR5cGUoMCk7Ci0gICAgY29uc3QgQXJyYXlUeXBlKiBBVHkgPSBBcnJheVR5cGU6OmdldChBdHRyVHksIG1ldGhvZC5uYkF0dHJpYnV0cyk7Ci0gICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBtZXRob2QubmJBdHRyaWJ1dHM7ICsraSkgewotICAgICAgVGVtcEVsdHMucHVzaF9iYWNrKENyZWF0ZUNvbnN0YW50RnJvbUF0dHJpYnV0KG1ldGhvZC5hdHRyaWJ1dHNbaV0pKTsKLSAgICB9Ci0KLSAgICBDb25zdGFudCogYXR0cmlidXRzID0gQ29uc3RhbnRBcnJheTo6Z2V0KEFUeSwgVGVtcEVsdHMpOwotICAgIFRlbXBFbHRzLmNsZWFyKCk7Ci0gICAgYXR0cmlidXRzID0gbmV3IEdsb2JhbFZhcmlhYmxlKE1vZCwgQVR5LCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxWYWx1ZTo6SW50ZXJuYWxMaW5rYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dHMsICIiKTsKLSAgICBhdHRyaWJ1dHMgPSBDb25zdGFudEV4cHI6OmdldENhc3QoSW5zdHJ1Y3Rpb246OkJpdENhc3QsIGF0dHJpYnV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YUludHJpbnNpY3MuQXR0cmlidXRUeXBlKTsKLQotICAgIE1ldGhvZEVsdHMucHVzaF9iYWNrKGF0dHJpYnV0cyk7Ci0gIH0gZWxzZSB7Ci0gICAgTWV0aG9kRWx0cy5wdXNoX2JhY2soQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShKYXZhSW50cmluc2ljcy5BdHRyaWJ1dFR5cGUpKTsKLSAgfQotICAKLSAgLy8gbmJBdHRyaWJ1dHMKLSAgTWV0aG9kRWx0cy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQxNlR5KGdldExMVk1Db250ZXh0KCkpLCBtZXRob2QubmJBdHRyaWJ1dHMpKTsKLSAgCi0gIC8vIGNsYXNzRGVmCi0gIE1ldGhvZEVsdHMucHVzaF9iYWNrKGdldE5hdGl2ZUNsYXNzKG1ldGhvZC5jbGFzc0RlZikpOwotICAKLSAgLy8gbmFtZQotICBNZXRob2RFbHRzLnB1c2hfYmFjayhnZXRVVEY4KG1ldGhvZC5uYW1lKSk7Ci0KLSAgLy8gdHlwZQotICBNZXRob2RFbHRzLnB1c2hfYmFjayhnZXRVVEY4KG1ldGhvZC50eXBlKSk7Ci0gIAotICAvLyBjYW5CZUlubGluZWQKLSAgTWV0aG9kRWx0cy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ4VHkoZ2V0TExWTUNvbnRleHQoKSksIG1ldGhvZC5jYW5CZUlubGluZWQpKTsKLQotICAvLyBjb2RlCi0gIGlmIChpc0Fic3RyYWN0KG1ldGhvZC5hY2Nlc3MpKSB7Ci0gICAgTWV0aG9kRWx0cy5wdXNoX2JhY2soQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShKYXZhSW50cmluc2ljcy5wdHJUeXBlKSk7Ci0gIH0gZWxzZSB7Ci0gICAgTExWTU1ldGhvZEluZm8qIExNSSA9IGdldE1ldGhvZEluZm8oJm1ldGhvZCk7Ci0gICAgRnVuY3Rpb24qIGZ1bmMgPSBMTUktPmdldE1ldGhvZCgpOwotICAgIE1ldGhvZEVsdHMucHVzaF9iYWNrKENvbnN0YW50RXhwcjo6Z2V0Q2FzdChJbnN0cnVjdGlvbjo6Qml0Q2FzdCwgZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YUludHJpbnNpY3MucHRyVHlwZSkpOwotICB9Ci0gIAotICAvLyBjb2RlSW5mbwotICBNZXRob2RFbHRzLnB1c2hfYmFjayhDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEphdmFJbnRyaW5zaWNzLkNvZGVMaW5lSW5mb1R5cGUpKTsKLSAgCi0gIC8vIGNvZGVJbmZvTGVuZ3RoCi0gIE1ldGhvZEVsdHMucHVzaF9iYWNrKENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MTZUeShnZXRMTFZNQ29udGV4dCgpKSwgMCkpOwotCi0gIC8vIG9mZnNldAotICBNZXRob2RFbHRzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoZ2V0TExWTUNvbnRleHQoKSksIG1ldGhvZC5vZmZzZXQpKTsKLQotICByZXR1cm4gQ29uc3RhbnRTdHJ1Y3Q6OmdldChTVHksIE1ldGhvZEVsdHMpOyAKLX0KLQotQ29uc3RhbnQqIEphdmFBT1RDb21waWxlcjo6Q3JlYXRlQ29uc3RhbnRGcm9tQ2xhc3NQcmltaXRpdmUoQ2xhc3NQcmltaXRpdmUqIGNsKSB7Ci0gIGNvbnN0IGxsdm06OlR5cGUqIEpDUFR5ID0gCi0gICAgSmF2YUludHJpbnNpY3MuSmF2YUNsYXNzUHJpbWl0aXZlVHlwZS0+Z2V0Q29udGFpbmVkVHlwZSgwKTsKLSAgY29uc3QgU3RydWN0VHlwZSogU1R5ID0gZHluX2Nhc3Q8U3RydWN0VHlwZT4oSkNQVHkpOwotICAKLSAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBDbGFzc0VsdHM7Ci0gIAotICAvLyBjb21tb24gY2xhc3MKLSAgQ2xhc3NFbHRzLnB1c2hfYmFjayhDcmVhdGVDb25zdGFudEZyb21Db21tb25DbGFzcyhjbCkpOwotCi0gIC8vIHByaW1TaXplCi0gIENsYXNzRWx0cy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KGdldExMVk1Db250ZXh0KCkpLCBjbC0+bG9nU2l6ZSkpOwotCi0gIHJldHVybiBDb25zdGFudFN0cnVjdDo6Z2V0KFNUeSwgQ2xhc3NFbHRzKTsKLX0KLQotQ29uc3RhbnQqIEphdmFBT1RDb21waWxlcjo6Q3JlYXRlQ29uc3RhbnRGcm9tQ2xhc3NBcnJheShDbGFzc0FycmF5KiBjbCkgewotICBjb25zdCBTdHJ1Y3RUeXBlKiBTVHkgPSAKLSAgICBkeW5fY2FzdDxTdHJ1Y3RUeXBlPihKYXZhSW50cmluc2ljcy5KYXZhQ2xhc3NBcnJheVR5cGUtPmdldENvbnRhaW5lZFR5cGUoMCkpOwotICAKLSAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBDbGFzc0VsdHM7Ci0gIENvbnN0YW50KiBDbEdFUHNbMl0gPSB7IGdldEludHJpbnNpY3MoKS0+Y29uc3RhbnRaZXJvLAotICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbnRyaW5zaWNzKCktPmNvbnN0YW50WmVybyB9OwotICAKLSAgLy8gY29tbW9uIGNsYXNzCi0gIENsYXNzRWx0cy5wdXNoX2JhY2soQ3JlYXRlQ29uc3RhbnRGcm9tQ29tbW9uQ2xhc3MoY2wpKTsKLQotICAvLyBiYXNlQ2xhc3MKLSAgQ29uc3RhbnQqIENsID0gZ2V0TmF0aXZlQ2xhc3MoY2wtPmJhc2VDbGFzcygpKTsKLSAgaWYgKENsLT5nZXRUeXBlKCkgIT0gSmF2YUludHJpbnNpY3MuSmF2YUNvbW1vbkNsYXNzVHlwZSkKLSAgICBDbCA9IENvbnN0YW50RXhwcjo6Z2V0R2V0RWxlbWVudFB0cihDbCwgQ2xHRVBzLCAyKTsKLSAgICAKLSAgQ2xhc3NFbHRzLnB1c2hfYmFjayhDbCk7Ci0gIAotICByZXR1cm4gQ29uc3RhbnRTdHJ1Y3Q6OmdldChTVHksIENsYXNzRWx0cyk7Ci19Ci0KLUNvbnN0YW50KiBKYXZhQU9UQ29tcGlsZXI6OkNyZWF0ZUNvbnN0YW50RnJvbUNsYXNzKENsYXNzKiBjbCkgewotICBjb25zdCBTdHJ1Y3RUeXBlKiBTVHkgPSAKLSAgICBkeW5fY2FzdDxTdHJ1Y3RUeXBlPihKYXZhSW50cmluc2ljcy5KYXZhQ2xhc3NUeXBlLT5nZXRDb250YWluZWRUeXBlKDApKTsKLSAgTW9kdWxlJiBNb2QgPSAqZ2V0TExWTU1vZHVsZSgpOwotICAKLSAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBDbGFzc0VsdHM7Ci0gIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gVGVtcEVsdHM7Ci0KLSAgLy8gY29tbW9uIGNsYXNzCi0gIENsYXNzRWx0cy5wdXNoX2JhY2soQ3JlYXRlQ29uc3RhbnRGcm9tQ29tbW9uQ2xhc3MoY2wpKTsKLQotICAvLyB2aXJ0dWFsU2l6ZQotICBDbGFzc0VsdHMucHVzaF9iYWNrKENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShnZXRMTFZNQ29udGV4dCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsLT52aXJ0dWFsU2l6ZSkpOwotICAKLSAgLy8gYWxnaW5tZW50Ci0gIENsYXNzRWx0cy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KGdldExMVk1Db250ZXh0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2wtPmFsaWdubWVudCkpOwotCi0gIC8vIElzb2xhdGVJbmZvCi0gIGNvbnN0IEFycmF5VHlwZSogQVR5ID0gZHluX2Nhc3Q8QXJyYXlUeXBlPihTVHktPmdldENvbnRhaW5lZFR5cGUoMykpOwotICBhc3NlcnQoQVR5ICYmICJNYWxmb3JtZWQgdHlwZSIpOwotICAKLSAgY29uc3QgU3RydWN0VHlwZSogVENNVHkgPSBkeW5fY2FzdDxTdHJ1Y3RUeXBlPihBVHktPmdldENvbnRhaW5lZFR5cGUoMCkpOwotICBhc3NlcnQoVENNVHkgJiYgIk1hbGZvcm1lZCB0eXBlIik7Ci0KLSAgdWludDMyIHN0YXR1cyA9IGNsLT5uZWVkc0luaXRpYWxpc2F0aW9uQ2hlY2soKSA/IHZtamMgOiByZWFkeTsKLSAgVGVtcEVsdHMucHVzaF9iYWNrKENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50OFR5KGdldExMVk1Db250ZXh0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpKTsKLSAgVGVtcEVsdHMucHVzaF9iYWNrKENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MVR5KGdldExMVk1Db250ZXh0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPT0gcmVhZHkgPyAxIDogMCkpOwotICBUZW1wRWx0cy5wdXNoX2JhY2soZ2V0U3RhdGljSW5zdGFuY2UoY2wpKTsKLSAgQ29uc3RhbnQqIENTdHJbMV0gPSB7IENvbnN0YW50U3RydWN0OjpnZXQoVENNVHksIFRlbXBFbHRzKSB9OwotICBUZW1wRWx0cy5jbGVhcigpOwotICBDbGFzc0VsdHMucHVzaF9iYWNrKENvbnN0YW50QXJyYXk6OmdldChBVHksIENTdHIsIDEpKTsKLQotICBpZiAoY2wtPm5iVmlydHVhbEZpZWxkcyArIGNsLT5uYlN0YXRpY0ZpZWxkcykgewotICAgIEFUeSA9IEFycmF5VHlwZTo6Z2V0KEphdmFJbnRyaW5zaWNzLkphdmFGaWVsZFR5cGUtPmdldENvbnRhaW5lZFR5cGUoMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2wtPm5iVmlydHVhbEZpZWxkcyArIGNsLT5uYlN0YXRpY0ZpZWxkcyk7Ci0gIH0KLQotICAvLyB2aXJ0dWFsRmllbGRzCi0gIGlmIChjbC0+bmJWaXJ0dWFsRmllbGRzKSB7Ci0KLSAgICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IGNsLT5uYlZpcnR1YWxGaWVsZHM7ICsraSkgewotICAgICAgVGVtcEVsdHMucHVzaF9iYWNrKENyZWF0ZUNvbnN0YW50RnJvbUphdmFGaWVsZChjbC0+dmlydHVhbEZpZWxkc1tpXSkpOwotICAgIH0KLQotICB9IAotICAKLSAgLy8gc3RhdGljRmllbGRzCi0gIGlmIChjbC0+bmJTdGF0aWNGaWVsZHMpIHsKLQotICAgIGZvciAodWludDMyIGkgPSAwOyBpIDwgY2wtPm5iU3RhdGljRmllbGRzOyArK2kpIHsKLSAgICAgIFRlbXBFbHRzLnB1c2hfYmFjayhDcmVhdGVDb25zdGFudEZyb21KYXZhRmllbGQoY2wtPnN0YXRpY0ZpZWxkc1tpXSkpOwotICAgIH0KLQotICB9Ci0KLSAgQ29uc3RhbnQqIGZpZWxkcyA9IDA7Ci0gIGlmIChjbC0+bmJTdGF0aWNGaWVsZHMgKyBjbC0+bmJWaXJ0dWFsRmllbGRzKSB7Ci0gIAotICAgIGZpZWxkcyA9IENvbnN0YW50QXJyYXk6OmdldChBVHksIFRlbXBFbHRzKTsKLSAgICBUZW1wRWx0cy5jbGVhcigpOwotICAgIGZpZWxkcyA9IG5ldyBHbG9iYWxWYXJpYWJsZShNb2QsIEFUeSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkcywgIiIpOwotICAgIGZpZWxkcyA9IENvbnN0YW50RXhwcjo6Z2V0Q2FzdChJbnN0cnVjdGlvbjo6Qml0Q2FzdCwgZmllbGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhSW50cmluc2ljcy5KYXZhRmllbGRUeXBlKTsKLSAgfSBlbHNlIHsKLSAgICBmaWVsZHMgPSBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEphdmFJbnRyaW5zaWNzLkphdmFGaWVsZFR5cGUpOwotICB9Ci0KLSAgLy8gdmlydHVhbEZpZWxkcwotICBDbGFzc0VsdHMucHVzaF9iYWNrKGZpZWxkcyk7Ci0KLSAgQ29uc3RhbnRJbnQqIG5iVmlydHVhbEZpZWxkcyA9IAotICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MTZUeShnZXRMTFZNQ29udGV4dCgpKSwgY2wtPm5iVmlydHVhbEZpZWxkcyk7Ci0gIC8vIG5iVmlydHVhbEZpZWxkcwotICBDbGFzc0VsdHMucHVzaF9iYWNrKG5iVmlydHVhbEZpZWxkcyk7Ci0gIAotICAvLyBzdGF0aWNGaWVsZHMKLSAgLy8gT3V0cHV0IG51bGwsIGdldExMVk1Nb2R1bGUoKSB3aWxsIGJlIHNldCBpbiAgdGhlIGluaXRpYWxpemVyLiBPdGhlcndpc2UsIHRoZQotICAvLyBhc3NlbWJseSBlbWl0dGVyIG9mIExMVk0gd2lsbCB0cnkgdG8gYWxpZ24gdGhlIGRhdGEuCi0gIENsYXNzRWx0cy5wdXNoX2JhY2soQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShKYXZhSW50cmluc2ljcy5KYXZhRmllbGRUeXBlKSk7Ci0KLSAgLy8gbmJTdGF0aWNGaWVsZHMKLSAgQ2xhc3NFbHRzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDE2VHkoZ2V0TExWTUNvbnRleHQoKSksIGNsLT5uYlN0YXRpY0ZpZWxkcykpOwotICAKLSAgLy8gdmlydHVhbE1ldGhvZHMKLSAgaWYgKGNsLT5uYlZpcnR1YWxNZXRob2RzICsgY2wtPm5iU3RhdGljTWV0aG9kcykgewotICAgIEFUeSA9IEFycmF5VHlwZTo6Z2V0KEphdmFJbnRyaW5zaWNzLkphdmFNZXRob2RUeXBlLT5nZXRDb250YWluZWRUeXBlKDApLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNsLT5uYlZpcnR1YWxNZXRob2RzICsgY2wtPm5iU3RhdGljTWV0aG9kcyk7Ci0gIH0KLQotICBpZiAoY2wtPm5iVmlydHVhbE1ldGhvZHMpIHsKLSAgICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IGNsLT5uYlZpcnR1YWxNZXRob2RzOyArK2kpIHsKLSAgICAgIFRlbXBFbHRzLnB1c2hfYmFjayhDcmVhdGVDb25zdGFudEZyb21KYXZhTWV0aG9kKGNsLT52aXJ0dWFsTWV0aG9kc1tpXSkpOwotICAgIH0KLSAgfQotICAgIAotICBpZiAoY2wtPm5iU3RhdGljTWV0aG9kcykgewotICAgIGZvciAodWludDMyIGkgPSAwOyBpIDwgY2wtPm5iU3RhdGljTWV0aG9kczsgKytpKSB7Ci0gICAgICBUZW1wRWx0cy5wdXNoX2JhY2soQ3JlYXRlQ29uc3RhbnRGcm9tSmF2YU1ldGhvZChjbC0+c3RhdGljTWV0aG9kc1tpXSkpOwotICAgIH0KLSAgfQotCi0gIENvbnN0YW50KiBtZXRob2RzID0gMDsKLSAgaWYgKGNsLT5uYlZpcnR1YWxNZXRob2RzICsgY2wtPm5iU3RhdGljTWV0aG9kcykgewotICAgIG1ldGhvZHMgPSBDb25zdGFudEFycmF5OjpnZXQoQVR5LCBUZW1wRWx0cyk7Ci0gICAgVGVtcEVsdHMuY2xlYXIoKTsKLQotICAgIEdsb2JhbFZhcmlhYmxlKiBHViA9IE5VTEw7Ci0gICAgbWV0aG9kX2l0ZXJhdG9yIFNJID0gdmlydHVhbE1ldGhvZHMuZmluZChjbCk7Ci0gICAgaWYgKFNJICE9IHZpcnR1YWxNZXRob2RzLmVuZCgpKSB7Ci0gICAgICBHViA9IGR5bl9jYXN0PEdsb2JhbFZhcmlhYmxlPihTSS0+c2Vjb25kKTsKLSAgICAgIEdWLT5zZXRJbml0aWFsaXplcihtZXRob2RzKTsKLSAgICB9IGVsc2UgewotICAgICAgc3RkOjpzdHJpbmcgbmFtZShVVEY4QnVmZmVyKGNsLT5uYW1lKS50b0NvbXBpbGVOYW1lKCktPmNTdHJpbmcoKSk7Ci0gICAgICBuYW1lICs9ICJfVmlydHVhbE1ldGhvZHMiOwotICAgICAgR1YgPSBuZXcgR2xvYmFsVmFyaWFibGUoTW9kLCBBVHksIGZhbHNlLCBHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxMaW5rYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kcywgbmFtZSk7Ci0gICAgICB2aXJ0dWFsTWV0aG9kcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY2wsIEdWKSk7Ci0gICAgfQotICAgIG1ldGhvZHMgPSBDb25zdGFudEV4cHI6OmdldENhc3QoSW5zdHJ1Y3Rpb246OkJpdENhc3QsIEdWLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YUludHJpbnNpY3MuSmF2YU1ldGhvZFR5cGUpOwotICB9IGVsc2UgewotICAgIG1ldGhvZHMgPSBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEphdmFJbnRyaW5zaWNzLkphdmFNZXRob2RUeXBlKTsKLSAgfQotCi0gIC8vIHZpcnR1YWxNZXRob2RzCi0gIENsYXNzRWx0cy5wdXNoX2JhY2sobWV0aG9kcyk7Ci0KLSAgQ29uc3RhbnRJbnQqIG5iVmlydHVhbE1ldGhvZHMgPSAKLSAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDE2VHkoZ2V0TExWTUNvbnRleHQoKSksIGNsLT5uYlZpcnR1YWxNZXRob2RzKTsKLSAgLy8gbmJWaXJ0dWFsTWV0aG9kcwotICBDbGFzc0VsdHMucHVzaF9iYWNrKG5iVmlydHVhbE1ldGhvZHMpOwotICAKLSAgLy8gc3RhdGljTWV0aG9kcwotICAvLyBPdXRwdXQgbnVsbCwgZ2V0TExWTU1vZHVsZSgpIHdpbGwgYmUgc2V0IGluICB0aGUgaW5pdGlhbGl6ZXIuCi0gIENsYXNzRWx0cy5wdXNoX2JhY2soQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShKYXZhSW50cmluc2ljcy5KYXZhTWV0aG9kVHlwZSkpOwotCi0gIC8vIG5iU3RhdGljTWV0aG9kcwotICBDbGFzc0VsdHMucHVzaF9iYWNrKENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MTZUeShnZXRMTFZNQ29udGV4dCgpKSwgY2wtPm5iU3RhdGljTWV0aG9kcykpOwotCi0gIC8vIG93bmVyQ2xhc3MKLSAgQ2xhc3NFbHRzLnB1c2hfYmFjayhDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEphdmFJbnRyaW5zaWNzLnB0clR5cGUpKTsKLSAgCi0gIC8vIGJ5dGVzCi0gIENsYXNzRWx0cy5wdXNoX2JhY2soQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShKYXZhSW50cmluc2ljcy5KYXZhQXJyYXlVSW50OFR5cGUpKTsKLQotICAvLyBjdHBJbmZvCi0gIENsYXNzRWx0cy5wdXNoX2JhY2soQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShKYXZhSW50cmluc2ljcy5wdHJUeXBlKSk7Ci0KLSAgLy8gYXR0cmlidXRzCi0gIGlmIChjbC0+bmJBdHRyaWJ1dHMpIHsKLSAgICBBVHkgPSBBcnJheVR5cGU6OmdldChKYXZhSW50cmluc2ljcy5BdHRyaWJ1dFR5cGUtPmdldENvbnRhaW5lZFR5cGUoMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2wtPm5iQXR0cmlidXRzKTsKLQotICAgIGZvciAodWludDMyIGkgPSAwOyBpIDwgY2wtPm5iQXR0cmlidXRzOyArK2kpIHsKLSAgICAgIFRlbXBFbHRzLnB1c2hfYmFjayhDcmVhdGVDb25zdGFudEZyb21BdHRyaWJ1dChjbC0+YXR0cmlidXRzW2ldKSk7Ci0gICAgfQotCi0gICAgQ29uc3RhbnQqIGF0dHJpYnV0cyA9IENvbnN0YW50QXJyYXk6OmdldChBVHksIFRlbXBFbHRzKTsKLSAgICBUZW1wRWx0cy5jbGVhcigpOwotICAgIGF0dHJpYnV0cyA9IG5ldyBHbG9iYWxWYXJpYWJsZSgqZ2V0TExWTU1vZHVsZSgpLCBBVHksIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0cywgIiIpOwotICAgIGF0dHJpYnV0cyA9IENvbnN0YW50RXhwcjo6Z2V0Q2FzdChJbnN0cnVjdGlvbjo6Qml0Q2FzdCwgYXR0cmlidXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhSW50cmluc2ljcy5BdHRyaWJ1dFR5cGUpOwotICAgIENsYXNzRWx0cy5wdXNoX2JhY2soYXR0cmlidXRzKTsKLSAgfSBlbHNlIHsKLSAgICBDbGFzc0VsdHMucHVzaF9iYWNrKENvbnN0YW50OjpnZXROdWxsVmFsdWUoSmF2YUludHJpbnNpY3MuQXR0cmlidXRUeXBlKSk7Ci0gIH0KLSAgCi0gIC8vIG5iQXR0cmlidXRzCi0gIENsYXNzRWx0cy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQxNlR5KGdldExMVk1Db250ZXh0KCkpLCBjbC0+bmJBdHRyaWJ1dHMpKTsKLSAgCi0gIC8vIGlubmVyQ2xhc3NlcwotICBpZiAoY2wtPm5iSW5uZXJDbGFzc2VzKSB7Ci0gICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBjbC0+bmJJbm5lckNsYXNzZXM7ICsraSkgewotICAgICAgVGVtcEVsdHMucHVzaF9iYWNrKGdldE5hdGl2ZUNsYXNzKGNsLT5pbm5lckNsYXNzZXNbaV0pKTsKLSAgICB9Ci0KLSAgICBjb25zdCBsbHZtOjpUeXBlKiBUZW1wVHkgPSBKYXZhSW50cmluc2ljcy5KYXZhQ2xhc3NUeXBlOwotICAgIEFUeSA9IEFycmF5VHlwZTo6Z2V0KFRlbXBUeSwgY2wtPm5iSW5uZXJDbGFzc2VzKTsKLSAgICBDb25zdGFudCogaW5uZXJDbGFzc2VzID0gQ29uc3RhbnRBcnJheTo6Z2V0KEFUeSwgVGVtcEVsdHMpOwotICAgIGlubmVyQ2xhc3NlcyA9IG5ldyBHbG9iYWxWYXJpYWJsZSgqZ2V0TExWTU1vZHVsZSgpLCBBVHksIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyQ2xhc3NlcywgIiIpOwotICAgIGlubmVyQ2xhc3NlcyA9IENvbnN0YW50RXhwcjo6Z2V0Q2FzdChJbnN0cnVjdGlvbjo6Qml0Q2FzdCwgaW5uZXJDbGFzc2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFRlbXBUeSkpOwotCi0gICAgQ2xhc3NFbHRzLnB1c2hfYmFjayhpbm5lckNsYXNzZXMpOwotICB9IGVsc2UgewotICAgIGNvbnN0IFR5cGUqIFR5ID0gUG9pbnRlclR5cGU6OmdldFVucXVhbChKYXZhSW50cmluc2ljcy5KYXZhQ2xhc3NUeXBlKTsKLSAgICBDbGFzc0VsdHMucHVzaF9iYWNrKENvbnN0YW50OjpnZXROdWxsVmFsdWUoVHkpKTsKLSAgfQotCi0gIC8vIG5iSW5uZXJDbGFzc2VzCi0gIENsYXNzRWx0cy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQxNlR5KGdldExMVk1Db250ZXh0KCkpLCBjbC0+bmJJbm5lckNsYXNzZXMpKTsKLQotICAvLyBvdXRlckNsYXNzCi0gIGlmIChjbC0+b3V0ZXJDbGFzcykgewotICAgIENsYXNzRWx0cy5wdXNoX2JhY2soZ2V0TmF0aXZlQ2xhc3MoY2wtPm91dGVyQ2xhc3MpKTsKLSAgfSBlbHNlIHsKLSAgICBDbGFzc0VsdHMucHVzaF9iYWNrKENvbnN0YW50OjpnZXROdWxsVmFsdWUoSmF2YUludHJpbnNpY3MuSmF2YUNsYXNzVHlwZSkpOwotICB9Ci0KLSAgLy8gaW5uZXJBY2Nlc3MKLSAgQ2xhc3NFbHRzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDE2VHkoZ2V0TExWTUNvbnRleHQoKSksIGNsLT5pbm5lckFjY2VzcykpOwotICAKLSAgLy8gaW5uZXJPdXRlclJlc29sdmVkCi0gIENsYXNzRWx0cy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ4VHkoZ2V0TExWTUNvbnRleHQoKSksIGNsLT5pbm5lck91dGVyUmVzb2x2ZWQpKTsKLSAgCi0gIC8vIGlzQW5vbnltb3VzCi0gIENsYXNzRWx0cy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ4VHkoZ2V0TExWTUNvbnRleHQoKSksIGNsLT5pc0Fub255bW91cykpOwotICAKLSAgLy8gdmlydHVhbFRhYmxlU2l6ZQotICBDbGFzc0VsdHMucHVzaF9iYWNrKENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShnZXRMTFZNQ29udGV4dCgpKSwgY2wtPnZpcnR1YWxUYWJsZVNpemUpKTsKLSAgCi0gIC8vIHN0YXRpY1NpemUKLSAgQ2xhc3NFbHRzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoZ2V0TExWTUNvbnRleHQoKSksIGNsLT5zdGF0aWNTaXplKSk7Ci0KLSAgcmV0dXJuIENvbnN0YW50U3RydWN0OjpnZXQoU1R5LCBDbGFzc0VsdHMpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotQ29uc3RhbnQqIEphdmFBT1RDb21waWxlcjo6Q3JlYXRlQ29uc3RhbnRGcm9tSW50QXJyYXkoY29uc3QgVCogdmFsLCBjb25zdCBUeXBlKiBUeSkgewotICBzdGQ6OnZlY3Rvcjxjb25zdCBUeXBlKj4gRWxlbXRzOwotICBjb25zdCBBcnJheVR5cGUqIEFUeSA9IEFycmF5VHlwZTo6Z2V0KFR5LCBUOjpnZXRTaXplKHZhbCkpOwotICBFbGVtdHMucHVzaF9iYWNrKEphdmFJbnRyaW5zaWNzLkphdmFPYmplY3RUeXBlLT5nZXRDb250YWluZWRUeXBlKDApKTsKLSAgRWxlbXRzLnB1c2hfYmFjayhKYXZhSW50cmluc2ljcy5wb2ludGVyU2l6ZVR5cGUpOwotICAKLQotICBFbGVtdHMucHVzaF9iYWNrKEFUeSk7Ci0KLSAgY29uc3QgU3RydWN0VHlwZSogU1R5ID0gU3RydWN0VHlwZTo6Z2V0KGdldExMVk1Nb2R1bGUoKS0+Z2V0Q29udGV4dCgpLCBFbGVtdHMpOwotICAKLSAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBDdHM7Ci0gIEN0cy5wdXNoX2JhY2soQ3JlYXRlQ29uc3RhbnRGb3JCYXNlT2JqZWN0KEphdmFPYmplY3Q6OmdldENsYXNzKHZhbCkpKTsKLSAgQ3RzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KEphdmFJbnRyaW5zaWNzLnBvaW50ZXJTaXplVHlwZSwgVDo6Z2V0U2l6ZSh2YWwpKSk7Ci0gIAotICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IFZhbHM7Ci0gIGZvciAoc2ludDMyIGkgPSAwOyBpIDwgVDo6Z2V0U2l6ZSh2YWwpOyArK2kpIHsKLSAgICBWYWxzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KFR5LCAodWludDY0KVQ6OmdldEVsZW1lbnQodmFsLCBpKSkpOwotICB9Ci0KLSAgQ3RzLnB1c2hfYmFjayhDb25zdGFudEFycmF5OjpnZXQoQVR5LCBWYWxzKSk7Ci0gIAotICByZXR1cm4gQ29uc3RhbnRTdHJ1Y3Q6OmdldChTVHksIEN0cyk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1Db25zdGFudCogSmF2YUFPVENvbXBpbGVyOjpDcmVhdGVDb25zdGFudEZyb21GUEFycmF5KGNvbnN0IFQqIHZhbCwgY29uc3QgVHlwZSogVHkpIHsKLSAgc3RkOjp2ZWN0b3I8Y29uc3QgVHlwZSo+IEVsZW10czsKLSAgY29uc3QgQXJyYXlUeXBlKiBBVHkgPSBBcnJheVR5cGU6OmdldChUeSwgVDo6Z2V0U2l6ZSh2YWwpKTsKLSAgRWxlbXRzLnB1c2hfYmFjayhKYXZhSW50cmluc2ljcy5KYXZhT2JqZWN0VHlwZS0+Z2V0Q29udGFpbmVkVHlwZSgwKSk7Ci0gIEVsZW10cy5wdXNoX2JhY2soSmF2YUludHJpbnNpY3MucG9pbnRlclNpemVUeXBlKTsKLSAgCi0KLSAgRWxlbXRzLnB1c2hfYmFjayhBVHkpOwotCi0gIGNvbnN0IFN0cnVjdFR5cGUqIFNUeSA9IFN0cnVjdFR5cGU6OmdldChnZXRMTFZNTW9kdWxlKCktPmdldENvbnRleHQoKSwgRWxlbXRzKTsKLSAgCi0gIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gQ3RzOwotICBDdHMucHVzaF9iYWNrKENyZWF0ZUNvbnN0YW50Rm9yQmFzZU9iamVjdChKYXZhT2JqZWN0OjpnZXRDbGFzcyh2YWwpKSk7Ci0gIEN0cy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChKYXZhSW50cmluc2ljcy5wb2ludGVyU2l6ZVR5cGUsIFQ6OmdldFNpemUodmFsKSkpOwotICAKLSAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBWYWxzOwotICBmb3IgKHNpbnQzMiBpID0gMDsgaSA8IFQ6OmdldFNpemUodmFsKTsgKytpKSB7Ci0gICAgVmFscy5wdXNoX2JhY2soQ29uc3RhbnRGUDo6Z2V0KFR5LCAoZG91YmxlKVQ6OmdldEVsZW1lbnQodmFsLCBpKSkpOwotICB9Ci0KLSAgQ3RzLnB1c2hfYmFjayhDb25zdGFudEFycmF5OjpnZXQoQVR5LCBWYWxzKSk7Ci0gIAotICByZXR1cm4gQ29uc3RhbnRTdHJ1Y3Q6OmdldChTVHksIEN0cyk7Ci19Ci0KLUNvbnN0YW50KiBKYXZhQU9UQ29tcGlsZXI6OkNyZWF0ZUNvbnN0YW50RnJvbU9iamVjdEFycmF5KGNvbnN0IEFycmF5T2JqZWN0KiB2YWwpIHsKLSAgc3RkOjp2ZWN0b3I8Y29uc3QgVHlwZSo+IEVsZW10czsKLSAgY29uc3QgbGx2bTo6VHlwZSogVHkgPSBKYXZhSW50cmluc2ljcy5KYXZhT2JqZWN0VHlwZTsKLSAgY29uc3QgQXJyYXlUeXBlKiBBVHkgPSBBcnJheVR5cGU6OmdldChUeSwgQXJyYXlPYmplY3Q6OmdldFNpemUodmFsKSk7Ci0gIEVsZW10cy5wdXNoX2JhY2soSmF2YUludHJpbnNpY3MuSmF2YU9iamVjdFR5cGUtPmdldENvbnRhaW5lZFR5cGUoMCkpOwotICBFbGVtdHMucHVzaF9iYWNrKEphdmFJbnRyaW5zaWNzLnBvaW50ZXJTaXplVHlwZSk7Ci0gIAotCi0gIEVsZW10cy5wdXNoX2JhY2soQVR5KTsKLQotICBjb25zdCBTdHJ1Y3RUeXBlKiBTVHkgPSBTdHJ1Y3RUeXBlOjpnZXQoZ2V0TExWTU1vZHVsZSgpLT5nZXRDb250ZXh0KCksIEVsZW10cyk7Ci0gIAotICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IEN0czsKLSAgQ3RzLnB1c2hfYmFjayhDcmVhdGVDb25zdGFudEZvckJhc2VPYmplY3QoSmF2YU9iamVjdDo6Z2V0Q2xhc3ModmFsKSkpOwotICBDdHMucHVzaF9iYWNrKENvbnN0YW50SW50OjpnZXQoSmF2YUludHJpbnNpY3MucG9pbnRlclNpemVUeXBlLAotICAgICAgICBBcnJheU9iamVjdDo6Z2V0U2l6ZSh2YWwpKSk7Ci0gIAotICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IFZhbHM7Ci0gIGZvciAoc2ludDMyIGkgPSAwOyBpIDwgQXJyYXlPYmplY3Q6OmdldFNpemUodmFsKTsgKytpKSB7Ci0gICAgaWYgKEFycmF5T2JqZWN0OjpnZXRFbGVtZW50KHZhbCwgaSkpIHsKLSAgICAgIFZhbHMucHVzaF9iYWNrKGdldEZpbmFsT2JqZWN0KEFycmF5T2JqZWN0OjpnZXRFbGVtZW50KHZhbCwgaSksCi0gICAgICAgICAgSmF2YU9iamVjdDo6Z2V0Q2xhc3ModmFsKS0+YXNBcnJheUNsYXNzKCktPmJhc2VDbGFzcygpKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFZhbHMucHVzaF9iYWNrKENvbnN0YW50OjpnZXROdWxsVmFsdWUoSmF2YUludHJpbnNpY3MuSmF2YU9iamVjdFR5cGUpKTsKLSAgICB9Ci0gIH0KLQotICBDdHMucHVzaF9iYWNrKENvbnN0YW50QXJyYXk6OmdldChBVHksIFZhbHMpKTsKLSAgCi0gIHJldHVybiBDb25zdGFudFN0cnVjdDo6Z2V0KFNUeSwgQ3RzKTsKLX0KLQotQ29uc3RhbnQqIEphdmFBT1RDb21waWxlcjo6Q3JlYXRlQ29uc3RhbnRGcm9tVVRGOChjb25zdCBVVEY4KiB2YWwpIHsKLSAgc3RkOjp2ZWN0b3I8Y29uc3QgVHlwZSo+IEVsZW10czsKLSAgY29uc3QgQXJyYXlUeXBlKiBBVHkgPSBBcnJheVR5cGU6OmdldChUeXBlOjpnZXRJbnQxNlR5KGdldExMVk1Db250ZXh0KCkpLCB2YWwtPnNpemUpOwotICBFbGVtdHMucHVzaF9iYWNrKEphdmFJbnRyaW5zaWNzLnBvaW50ZXJTaXplVHlwZSk7Ci0KLSAgRWxlbXRzLnB1c2hfYmFjayhBVHkpOwotCi0gIGNvbnN0IFN0cnVjdFR5cGUqIFNUeSA9IFN0cnVjdFR5cGU6OmdldChnZXRMTFZNTW9kdWxlKCktPmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW10cyk7Ci0gIAotICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IEN0czsKLSAgQ3RzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KEphdmFJbnRyaW5zaWNzLnBvaW50ZXJTaXplVHlwZSwgdmFsLT5zaXplKSk7Ci0gIAotICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IFZhbHM7Ci0gIGZvciAoc2ludDMyIGkgPSAwOyBpIDwgdmFsLT5zaXplOyArK2kpIHsKLSAgICBWYWxzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDE2VHkoZ2V0TExWTUNvbnRleHQoKSksIHZhbC0+ZWxlbWVudHNbaV0pKTsKLSAgfQotCi0gIEN0cy5wdXNoX2JhY2soQ29uc3RhbnRBcnJheTo6Z2V0KEFUeSwgVmFscykpOwotICAKLSAgcmV0dXJuIENvbnN0YW50U3RydWN0OjpnZXQoU1R5LCBDdHMpOwotCi19Ci0KLUNvbnN0YW50KiBKYXZhQU9UQ29tcGlsZXI6OmdldFVURjgoY29uc3QgVVRGOCogdmFsKSB7Ci0gIHV0ZjhfaXRlcmF0b3IgRW5kID0gdXRmOHMuZW5kKCk7Ci0gIHV0ZjhfaXRlcmF0b3IgSSA9IHV0ZjhzLmZpbmQodmFsKTsKLSAgaWYgKEkgPT0gRW5kKSB7Ci0gICAgQ29uc3RhbnQqIEMgPSBDcmVhdGVDb25zdGFudEZyb21VVEY4KHZhbCk7Ci0gICAgTW9kdWxlJiBNb2QgPSAqZ2V0TExWTU1vZHVsZSgpOwotICAgIEdsb2JhbFZhcmlhYmxlKiB2YXJHViA9IG5ldyBHbG9iYWxWYXJpYWJsZShNb2QsIEMtPmdldFR5cGUoKSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFsdWU6OkludGVybmFsTGlua2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQywgIiIpOwotICAgIAotICAgIENvbnN0YW50KiByZXMgPSBDb25zdGFudEV4cHI6OmdldENhc3QoSW5zdHJ1Y3Rpb246OkJpdENhc3QsIHZhckdWLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YUludHJpbnNpY3MuVVRGOFR5cGUpOwotICAgIHV0ZjhzLmluc2VydChzdGQ6Om1ha2VfcGFpcih2YWwsIHJlcykpOwotCi0gICAgcmV0dXJuIHJlczsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gSS0+c2Vjb25kOwotICB9Ci19Ci0KLUNvbnN0YW50KiBKYXZhQU9UQ29tcGlsZXI6OkNyZWF0ZUNvbnN0YW50RnJvbVZUKEphdmFWaXJ0dWFsVGFibGUqIFZUKSB7Ci0gIENvbW1vbkNsYXNzKiBjbGFzc0RlZiA9IFZULT5jbDsKLSAgdWludDMyIHNpemUgPSBjbGFzc0RlZi0+aXNDbGFzcygpID8gY2xhc3NEZWYtPmFzQ2xhc3MoKS0+dmlydHVhbFRhYmxlU2l6ZSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFWaXJ0dWFsVGFibGU6OmdldEJhc2VTaXplKCk7Ci0gIEphdmFWaXJ0dWFsVGFibGUqIFJlYWxWVCA9IGNsYXNzRGVmLT5pc0NsYXNzKCkgPyAKLSAgICBWVCA6IENsYXNzQXJyYXk6OlN1cGVyQXJyYXktPnZpcnR1YWxWVDsKLQotICBjb25zdCBBcnJheVR5cGUqIEFUeSA9IAotICAgIGR5bl9jYXN0PEFycmF5VHlwZT4oSmF2YUludHJpbnNpY3MuVlRUeXBlLT5nZXRDb250YWluZWRUeXBlKDApKTsKLSAgY29uc3QgUG9pbnRlclR5cGUqIFBUeSA9IGR5bl9jYXN0PFBvaW50ZXJUeXBlPihBVHktPmdldENvbnRhaW5lZFR5cGUoMCkpOwotICBBVHkgPSBBcnJheVR5cGU6OmdldChQVHksIHNpemUpOwotCi0gIENvbnN0YW50UG9pbnRlck51bGwqIE4gPSBDb25zdGFudFBvaW50ZXJOdWxsOjpnZXQoUFR5KTsKLSAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBFbGVtdHM7Ci0gICAKLSAgLy8gRGVzdHJ1Y3RvcgotICBGdW5jdGlvbiogRmluYWxpemVyID0gMDsKLSAgSmF2YU1ldGhvZCogbWV0aCA9IChKYXZhTWV0aG9kKikoUmVhbFZULT5kZXN0cnVjdG9yKTsKLSAgaWYgKG1ldGgpIHsKLSAgICBMTFZNTWV0aG9kSW5mbyogTE1JID0gZ2V0TWV0aG9kSW5mbyhtZXRoKTsKLSAgICBGaW5hbGl6ZXIgPSBMTUktPmdldE1ldGhvZCgpOwotICB9Ci0gIAotICBFbGVtdHMucHVzaF9iYWNrKEZpbmFsaXplciA/IAotICAgICAgQ29uc3RhbnRFeHByOjpnZXRDYXN0KEluc3RydWN0aW9uOjpCaXRDYXN0LCBGaW5hbGl6ZXIsIFBUeSkgOiBOKTsKLSAgCi0gIC8vIERlbGV0ZQotICBFbGVtdHMucHVzaF9iYWNrKE4pOwotICAKLSAgLy8gVHJhY2VyCi0gIEZ1bmN0aW9uKiBUcmFjZXIgPSAwOwotICBpZiAoY2xhc3NEZWYtPmlzQXJyYXkoKSkgewotICAgIGlmIChjbGFzc0RlZi0+YXNBcnJheUNsYXNzKCktPmJhc2VDbGFzcygpLT5pc1ByaW1pdGl2ZSgpKSB7Ci0gICAgICBUcmFjZXIgPSBKYXZhT2JqZWN0VHJhY2VyOwotICAgIH0gZWxzZSB7Ci0gICAgICBUcmFjZXIgPSBBcnJheU9iamVjdFRyYWNlcjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoY2xhc3NEZWYtPmlzQ2xhc3MoKSkgewotICAgIGlmIChjbGFzc0RlZi0+aXNBc3NpZ25hYmxlRnJvbShjbGFzc0RlZi0+Y2xhc3NMb2FkZXItPnZtLT51cGNhbGxzLT5uZXdSZWZlcmVuY2UpKSB7Ci0gICAgICBUcmFjZXIgPSBSZWZlcmVuY2VPYmplY3RUcmFjZXI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFRyYWNlciA9IFJlZ3VsYXJPYmplY3RUcmFjZXI7Ci0gICAgfQotICB9Ci0KLSAgRWxlbXRzLnB1c2hfYmFjayhUcmFjZXIgPyAKLSAgICAgIENvbnN0YW50RXhwcjo6Z2V0Q2FzdChJbnN0cnVjdGlvbjo6Qml0Q2FzdCwgVHJhY2VyLCBQVHkpIDogTik7Ci0KLSAgLy8gdm0KLSAgRWxlbXRzLnB1c2hfYmFjayhOKTsKLSAgCi0JLy8gc3BlY2lhbGl6ZWQgdHJhY2VycwotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbXZtOjpWaXJ0dWFsVGFibGU6Om51bWJlck9mU3BlY2lhbGl6ZWRUcmFjZXJzKCk7IGkrKykgewotICAgIC8vIFB1c2ggbnVsbCBmb3Igbm93LgotICAgIEVsZW10cy5wdXNoX2JhY2soTik7Ci0gIH0KLQotICAvLyBDbGFzcwotICBFbGVtdHMucHVzaF9iYWNrKENvbnN0YW50RXhwcjo6Z2V0Q2FzdChJbnN0cnVjdGlvbjo6Qml0Q2FzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmF0aXZlQ2xhc3MoY2xhc3NEZWYpLCBQVHkpKTsKLQotICAvLyBkZXB0aAotICBFbGVtdHMucHVzaF9iYWNrKENvbnN0YW50RXhwcjo6Z2V0SW50VG9QdHIoCi0gICAgICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50NjRUeShnZXRMTFZNQ29udGV4dCgpKSwgVlQtPmRlcHRoKSwgUFR5KSk7Ci0gIAotICAvLyBvZmZzZXQKLSAgRWxlbXRzLnB1c2hfYmFjayhDb25zdGFudEV4cHI6OmdldEludFRvUHRyKAotICAgICAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDY0VHkoZ2V0TExWTUNvbnRleHQoKSksIFZULT5vZmZzZXQpLCBQVHkpKTsKLSAgCi0gIC8vIGNhY2hlCi0gIEVsZW10cy5wdXNoX2JhY2soTik7Ci0gIAotICAvLyBkaXNwbGF5Ci0gIGZvciAodWludDMyIGkgPSAwOyBpIDwgSmF2YVZpcnR1YWxUYWJsZTo6Z2V0RGlzcGxheUxlbmd0aCgpOyArK2kpIHsKLSAgICBpZiAoVlQtPmRpc3BsYXlbaV0pIHsKLSAgICAgIENvbnN0YW50KiBUZW1wID0gZ2V0VmlydHVhbFRhYmxlKFZULT5kaXNwbGF5W2ldKTsKLSAgICAgIFRlbXAgPSBDb25zdGFudEV4cHI6OmdldEJpdENhc3QoVGVtcCwgUFR5KTsKLSAgICAgIEVsZW10cy5wdXNoX2JhY2soVGVtcCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEVsZW10cy5wdXNoX2JhY2soQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShQVHkpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8vIG5iU2Vjb25kYXJ5VHlwZXMKLSAgRWxlbXRzLnB1c2hfYmFjayhDb25zdGFudEV4cHI6OmdldEludFRvUHRyKAotICAgICAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDY0VHkoZ2V0TExWTUNvbnRleHQoKSksIFZULT5uYlNlY29uZGFyeVR5cGVzKSwgUFR5KSk7Ci0gIAotICAvLyBzZWNvbmRhcnlUeXBlcwotICBjb25zdCBBcnJheVR5cGUqIERUeSA9IEFycmF5VHlwZTo6Z2V0KEphdmFJbnRyaW5zaWNzLlZUVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVC0+bmJTZWNvbmRhcnlUeXBlcyk7Ci0gIAotICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IFRlbXBFbG10czsKLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBWVC0+bmJTZWNvbmRhcnlUeXBlczsgKytpKSB7Ci0gICAgYXNzZXJ0KFZULT5zZWNvbmRhcnlUeXBlc1tpXSAmJiAiTm8gc2Vjb25kYXJ5IHR5cGUiKTsKLSAgICBDb25zdGFudCogQ2wgPSBnZXRWaXJ0dWFsVGFibGUoVlQtPnNlY29uZGFyeVR5cGVzW2ldKTsKLSAgICBUZW1wRWxtdHMucHVzaF9iYWNrKENsKTsKLSAgfQotICBDb25zdGFudCogZGlzcGxheSA9IENvbnN0YW50QXJyYXk6OmdldChEVHksIFRlbXBFbG10cyk7Ci0gIFRlbXBFbG10cy5jbGVhcigpOwotICAKLSAgZGlzcGxheSA9IG5ldyBHbG9iYWxWYXJpYWJsZSgqZ2V0TExWTU1vZHVsZSgpLCBEVHksIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFsdWU6OkludGVybmFsTGlua2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LCAiIik7Ci0KLSAgZGlzcGxheSA9IENvbnN0YW50RXhwcjo6Z2V0Q2FzdChJbnN0cnVjdGlvbjo6Qml0Q2FzdCwgZGlzcGxheSwgUFR5KTsKLSAgCi0gIEVsZW10cy5wdXNoX2JhY2soZGlzcGxheSk7Ci0gICAgCi0gIC8vIGJhc2VDbGFzc1ZUCi0gIGlmIChWVC0+YmFzZUNsYXNzVlQpIHsKLSAgICBDb25zdGFudCogVGVtcCA9IGdldFZpcnR1YWxUYWJsZShWVC0+YmFzZUNsYXNzVlQpOwotICAgIFRlbXAgPSBDb25zdGFudEV4cHI6OmdldEJpdENhc3QoVGVtcCwgUFR5KTsKLSAgICBFbGVtdHMucHVzaF9iYWNrKFRlbXApOwotICB9IGVsc2UgewotICAgIEVsZW10cy5wdXNoX2JhY2soQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShQVHkpKTsKLSAgfQotICAgCi0gIC8vIElNVAotICBpZiAoIVZULT5JTVQpIHsKLSAgICBFbGVtdHMucHVzaF9iYWNrKENvbnN0YW50OjpnZXROdWxsVmFsdWUoUFR5KSk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gVE9ETzogYWRkIGEgbnVsbCBlbGVtZW50IGF0IHRoZSBlbmQgdG8gZGlhZ25vc2UgZXJyb3JzLgotICAgIENsYXNzKiBjbCA9IGNsYXNzRGVmLT5hc0NsYXNzKCk7Ci0gICAgYXNzZXJ0KGNsICYmICJOb3QgYSBjbGFzcyIpOwotICAgIHN0ZDo6c2V0PEphdmFNZXRob2QqPiBjb250ZW50c1tJbnRlcmZhY2VNZXRob2RUYWJsZTo6TnVtSW5kZXhlc107Ci0gICAgY2xhc3NEZWYtPmFzQ2xhc3MoKS0+ZmlsbElNVChjb250ZW50cyk7Ci0gIAotCi0gICAgY29uc3QgQXJyYXlUeXBlKiBBVHkgPSAKLSAgICAgIGR5bl9jYXN0PEFycmF5VHlwZT4oSmF2YUludHJpbnNpY3MuVlRUeXBlLT5nZXRDb250YWluZWRUeXBlKDApKTsKLSAgICBjb25zdCBQb2ludGVyVHlwZSogUFR5ID0gZHluX2Nhc3Q8UG9pbnRlclR5cGU+KEFUeS0+Z2V0Q29udGFpbmVkVHlwZSgwKSk7Ci0gICAgQVR5ID0gQXJyYXlUeXBlOjpnZXQoUFR5LCBJbnRlcmZhY2VNZXRob2RUYWJsZTo6TnVtSW5kZXhlcyk7Ci0gIAotICAgIENvbnN0YW50UG9pbnRlck51bGwqIE4gPSBDb25zdGFudFBvaW50ZXJOdWxsOjpnZXQoUFR5KTsKLSAgICBzdGQ6OnZlY3RvcjxDb25zdGFudCo+IElFbGVtdHM7Ci0KLSAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgSW50ZXJmYWNlTWV0aG9kVGFibGU6Ok51bUluZGV4ZXM7ICsraSkgewotICAgICAgc3RkOjpzZXQ8SmF2YU1ldGhvZCo+JiBhdEluZGV4ID0gY29udGVudHNbaV07Ci0gICAgICB1aW50MzJfdCBzaXplID0gYXRJbmRleC5zaXplKCk7Ci0gICAgICBpZiAoc2l6ZSA9PSAxKSB7Ci0gICAgICAgIEphdmFNZXRob2QqIEltZXRoID0gKihhdEluZGV4LmJlZ2luKCkpOwotICAgICAgICBKYXZhTWV0aG9kKiBtZXRoID0gY2wtPmxvb2t1cE1ldGhvZERvbnRUaHJvdyhJbWV0aC0+bmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1ldGgtPnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCB0cnVlLCAwKTsKLSAgICAgICAgYXNzZXJ0KG1ldGggJiYgIk5vIG1ldGhvZCBmb3VuZCIpOwotICAgICAgICBMTFZNTWV0aG9kSW5mbyogTE1JID0gZ2V0TWV0aG9kSW5mbyhtZXRoKTsKLSAgICAgICAgRnVuY3Rpb24qIGZ1bmMgPSBMTUktPmdldE1ldGhvZCgpOwotICAgICAgICBJRWxlbXRzLnB1c2hfYmFjayhDb25zdGFudEV4cHI6OmdldEJpdENhc3QoZnVuYywgUFR5KSk7Ci0gICAgICB9IGVsc2UgaWYgKHNpemUgPiAxKSB7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPEphdmFNZXRob2QqPiBtZXRob2RzOwotICAgICAgICBib29sIFNhbWVNZXRob2QgPSB0cnVlOwotICAgICAgICBKYXZhTWV0aG9kKiBPbGRNZXRob2QgPSAwOwotICAgICAgCi0gICAgICAgIGZvciAoc3RkOjpzZXQ8SmF2YU1ldGhvZCo+OjppdGVyYXRvciBpdCA9IGF0SW5kZXguYmVnaW4oKSwKLSAgICAgICAgICAgICBldCA9IGF0SW5kZXguZW5kKCk7IGl0ICE9IGV0OyArK2l0KSB7Ci0gICAgICAgICAgSmF2YU1ldGhvZCogSW1ldGggPSAqaXQ7Ci0gICAgICAgICAgSmF2YU1ldGhvZCogQ21ldGggPSBjbC0+bG9va3VwTWV0aG9kRG9udFRocm93KEltZXRoLT5uYW1lLCBJbWV0aC0+dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCB0cnVlLCAwKTsKLSAgICAgICAKLSAgICAgICAgICBpZiAoT2xkTWV0aG9kICYmIE9sZE1ldGhvZCAhPSBDbWV0aCkgU2FtZU1ldGhvZCA9IGZhbHNlOwotICAgICAgICAgIGVsc2UgT2xkTWV0aG9kID0gQ21ldGg7Ci0gICAgICAgIAotICAgICAgICAgIG1ldGhvZHMucHVzaF9iYWNrKENtZXRoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChTYW1lTWV0aG9kKSB7Ci0gICAgICAgICAgYXNzZXJ0KG1ldGhvZHNbMF0gJiYgIk5vIG1ldGhvZCBmb3VuZCIpOwotICAgICAgICAgIExMVk1NZXRob2RJbmZvKiBMTUkgPSBnZXRNZXRob2RJbmZvKG1ldGhvZHNbMF0pOwotICAgICAgICAgIEZ1bmN0aW9uKiBmdW5jID0gTE1JLT5nZXRNZXRob2QoKTsKLSAgICAgICAgICBJRWxlbXRzLnB1c2hfYmFjayhDb25zdGFudEV4cHI6OmdldEJpdENhc3QoZnVuYywgUFR5KSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICB1aW50MzJfdCBsZW5ndGggPSAyICogc2l6ZTsKLSAgICAgICAgCi0gICAgICAgICAgY29uc3QgQXJyYXlUeXBlKiBBVHkgPSAKLSAgICAgICAgICAgIGR5bl9jYXN0PEFycmF5VHlwZT4oSmF2YUludHJpbnNpY3MuVlRUeXBlLT5nZXRDb250YWluZWRUeXBlKDApKTsKLSAgICAgICAgICBBVHkgPSBBcnJheVR5cGU6OmdldChQVHksIGxlbmd0aCk7Ci0gICAgICAgICAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiBJbnRlcm5hbEVsZW10czsKLSAgICAgCi0KLSAgICAgICAgICBzdGQ6OnNldDxKYXZhTWV0aG9kKj46Oml0ZXJhdG9yIEludGVyZiA9IGF0SW5kZXguYmVnaW4oKTsKLSAgICAgICAgICBmb3IgKHN0ZDo6dmVjdG9yPEphdmFNZXRob2QqPjo6aXRlcmF0b3IgaXQgPSBtZXRob2RzLmJlZ2luKCksCi0gICAgICAgICAgICAgICBldCA9IG1ldGhvZHMuZW5kKCk7IGl0ICE9IGV0OyArK2l0LCArK0ludGVyZikgewotICAgICAgICAgICAgSmF2YU1ldGhvZCogSW1ldGggPSAqSW50ZXJmOwotICAgICAgICAgICAgSmF2YU1ldGhvZCogQ21ldGggPSAqaXQ7Ci0gICAgICAgICAgICBhc3NlcnQoQ21ldGggJiYgIk5vIG1ldGhvZCBmb3VuZCIpOwotCi0gICAgICAgICAgICBMTFZNTWV0aG9kSW5mbyogTE1JID0gZ2V0TWV0aG9kSW5mbyhDbWV0aCk7Ci0gICAgICAgICAgICBGdW5jdGlvbiogZnVuYyA9IExNSS0+Z2V0TWV0aG9kKCk7Ci0gICAgICAgICAgICBJbnRlcm5hbEVsZW10cy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgIENvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdChnZXRNZXRob2RJbkNsYXNzKEltZXRoKSwgUFR5KSk7Ci0gICAgICAgICAgICBJbnRlcm5hbEVsZW10cy5wdXNoX2JhY2soQ29uc3RhbnRFeHByOjpnZXRCaXRDYXN0KGZ1bmMsIFBUeSkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBDb25zdGFudCogQXJyYXkgPSBDb25zdGFudEFycmF5OjpnZXQoQVR5LCBJbnRlcm5hbEVsZW10cyk7Ci0gICAgCi0gICAgICAgICAgR2xvYmFsVmFyaWFibGUqIEdWID0gbmV3IEdsb2JhbFZhcmlhYmxlKCpnZXRMTFZNTW9kdWxlKCksIEFUeSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LCAiIik7Ci0gICAgIAotICAgICAgICAgIENvbnN0YW50KiBDSSA9Ci0gICAgICAgICAgICBDb25zdGFudEV4cHI6OmdldFB0clRvSW50KEdWLCBKYXZhSW50cmluc2ljcy5wb2ludGVyU2l6ZVR5cGUpOwotICAgICAgICAgIENJID0gQ29uc3RhbnRFeHByOjpnZXRBZGQoQ0ksCi0gICAgICAgICAgICBDb25zdGFudEV4cHI6OmdldEludGVnZXJDYXN0KEphdmFJbnRyaW5zaWNzLmNvbnN0YW50T25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhSW50cmluc2ljcy5wb2ludGVyU2l6ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSk7Ci0gICAgICAgICAgQ0kgPSBDb25zdGFudEV4cHI6OmdldEludFRvUHRyKENJLCBQVHkpOwotICAgICAgICAgIElFbGVtdHMucHVzaF9iYWNrKENJKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgSUVsZW10cy5wdXNoX2JhY2soTik7Ci0gICAgICB9Ci0gICAgfQotIAotICAgIENvbnN0YW50KiBBcnJheSA9IENvbnN0YW50QXJyYXk6OmdldChBVHksIElFbGVtdHMpOwotICAgIEdsb2JhbFZhcmlhYmxlKiBHViA9IG5ldyBHbG9iYWxWYXJpYWJsZSgqZ2V0TExWTU1vZHVsZSgpLCBBVHksIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxWYWx1ZTo6SW50ZXJuYWxMaW5rYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheSwgIiIpOwotICAgIEVsZW10cy5wdXNoX2JhY2soQ29uc3RhbnRFeHByOjpnZXRCaXRDYXN0KEdWLCBQVHkpKTsKLSAgfQotIAotICAvLyBtZXRob2RzCi0gIGZvciAodWludDMyIGkgPSBKYXZhVmlydHVhbFRhYmxlOjpnZXRGaXJzdEphdmFNZXRob2RJbmRleCgpOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgSmF2YU1ldGhvZCogbWV0aCA9ICgoSmF2YU1ldGhvZCoqKVJlYWxWVClbaV07Ci0gICAgTExWTU1ldGhvZEluZm8qIExNSSA9IGdldE1ldGhvZEluZm8obWV0aCk7Ci0gICAgRnVuY3Rpb24qIEYgPSBMTUktPmdldE1ldGhvZCgpOwotICAgIGlmIChpc0Fic3RyYWN0KG1ldGgtPmFjY2VzcykpIHsKLSAgICAgIEVsZW10cy5wdXNoX2JhY2soQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShQVHkpKTsKLSAgICB9IGVsc2UgewotICAgICAgRWxlbXRzLnB1c2hfYmFjayhDb25zdGFudEV4cHI6OmdldENhc3QoSW5zdHJ1Y3Rpb246OkJpdENhc3QsIEYsIFBUeSkpOwotICAgIH0KLSAgfQotCi0gIENvbnN0YW50KiBBcnJheSA9IENvbnN0YW50QXJyYXk6OmdldChBVHksIEVsZW10cyk7Ci0gIAotICByZXR1cm4gQXJyYXk7Ci19Ci0KLW5hbWVzcGFjZSBtdm0gewotICBsbHZtOjpGdW5jdGlvblBhc3MqIGNyZWF0ZUVzY2FwZUFuYWx5c2lzUGFzcyhsbHZtOjpGdW5jdGlvbiopOwotfQotCi1uYW1lc3BhY2UgajMgewotICBsbHZtOjpGdW5jdGlvblBhc3MqIGNyZWF0ZUxvd2VyQ29uc3RhbnRDYWxsc1Bhc3MoKTsKLX0KLQotSmF2YUFPVENvbXBpbGVyOjpKYXZhQU9UQ29tcGlsZXIoY29uc3Qgc3RkOjpzdHJpbmcmIE1vZHVsZUlEKSA6Ci0gIEphdmFMTFZNQ29tcGlsZXIoTW9kdWxlSUQpIHsKLSAKLSAgZ2VuZXJhdGVTdHVicyA9IHRydWU7Ci0gIGFzc3VtZUNvbXBpbGVkID0gZmFsc2U7Ci0gIGNvbXBpbGVSVCA9IGZhbHNlOwotCi0gIHN0ZDo6dmVjdG9yPGNvbnN0IGxsdm06OlR5cGUqPiBsbHZtQXJnczsKLSAgbGx2bUFyZ3MucHVzaF9iYWNrKEphdmFJbnRyaW5zaWNzLnB0clR5cGUpOyAvLyBjbGFzcyBsb2FkZXIuCi0gIGNvbnN0IEZ1bmN0aW9uVHlwZSogRlR5ID0gRnVuY3Rpb25UeXBlOjpnZXQoVHlwZTo6Z2V0Vm9pZFR5KGdldExMVk1Db250ZXh0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1BcmdzLCBmYWxzZSk7Ci0KLSAgU3RhdGljSW5pdGlhbGl6ZXIgPSBGdW5jdGlvbjo6Q3JlYXRlKEZUeSwgR2xvYmFsVmFsdWU6OkludGVybmFsTGlua2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbml0IiwgZ2V0TExWTU1vZHVsZSgpKTsKLSAgCi0gIGxsdm1BcmdzLmNsZWFyKCk7Ci0gIEZUeSA9IEZ1bmN0aW9uVHlwZTo6Z2V0KFR5cGU6OmdldFZvaWRUeShnZXRMTFZNQ29udGV4dCgpKSwgbGx2bUFyZ3MsIGZhbHNlKTsKLSAgQ2FsbGJhY2sgPSBGdW5jdGlvbjo6Q3JlYXRlKEZUeSwgR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGF0aWNDYWxsYmFjayIsIGdldExMVk1Nb2R1bGUoKSk7Ci0KLSAgbGx2bUFyZ3MuY2xlYXIoKTsKLSAgbGx2bUFyZ3MucHVzaF9iYWNrKEphdmFJbnRyaW5zaWNzLkphdmFNZXRob2RUeXBlKTsKLSAgCi0gIEZUeSA9IEZ1bmN0aW9uVHlwZTo6Z2V0KEphdmFJbnRyaW5zaWNzLnB0clR5cGUsIGxsdm1BcmdzLCBmYWxzZSk7Ci0KLSAgTmF0aXZlTG9hZGVyID0gRnVuY3Rpb246OkNyZWF0ZShGVHksIEdsb2JhbFZhbHVlOjpFeHRlcm5hbExpbmthZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZtamNOYXRpdmVMb2FkZXIiLCBnZXRMTFZNTW9kdWxlKCkpOwotICAKLSAgbGx2bUFyZ3MuY2xlYXIoKTsKLSAgRlR5ID0gRnVuY3Rpb25UeXBlOjpnZXQoVHlwZTo6Z2V0Vm9pZFR5KGdldExMVk1Db250ZXh0KCkpLCBsbHZtQXJncywgZmFsc2UpOwotICBPYmplY3RQcmludGVyID0gRnVuY3Rpb246OkNyZWF0ZShGVHksIEdsb2JhbFZhbHVlOjpFeHRlcm5hbExpbmthZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcmludEphdmFPYmplY3QiLCBnZXRMTFZNTW9kdWxlKCkpOwotICAKLSAgQXJyYXlPYmplY3RUcmFjZXIgPSBGdW5jdGlvbjo6Q3JlYXRlKEZUeSwgR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcnJheU9iamVjdFRyYWNlciIsIGdldExMVk1Nb2R1bGUoKSk7Ci0gIAotICBSZWd1bGFyT2JqZWN0VHJhY2VyID0gRnVuY3Rpb246OkNyZWF0ZShGVHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhbHVlOjpFeHRlcm5hbExpbmthZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWd1bGFyT2JqZWN0VHJhY2VyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TExWTU1vZHVsZSgpKTsKLSAgCi0gIEphdmFPYmplY3RUcmFjZXIgPSBGdW5jdGlvbjo6Q3JlYXRlKEZUeSwgR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkphdmFPYmplY3RUcmFjZXIiLCBnZXRMTFZNTW9kdWxlKCkpOwotICAKLSAgUmVmZXJlbmNlT2JqZWN0VHJhY2VyID0gRnVuY3Rpb246OkNyZWF0ZShGVHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVmZXJlbmNlT2JqZWN0VHJhY2VyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMTFZNTW9kdWxlKCkpOwotfQotCi12b2lkIEphdmFBT1RDb21waWxlcjo6cHJpbnRTdGF0cygpIHsKLSAgZnByaW50ZihzdGRlcnIsICItLS0tLS0tLS0tLS0tLS0tLSBJbmZvIGZyb20gdGhlIG1vZHVsZSAtLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiTnVtYmVyIG9mIG5hdGl2ZSBjbGFzc2VzICAgICAgICAgICAgOiAlbGx1XG4iLCAKLSAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nIGludCkgbmF0aXZlQ2xhc3Nlcy5zaXplKCkpOwotICBmcHJpbnRmKHN0ZGVyciwgIk51bWJlciBvZiBKYXZhIGNsYXNzZXMgICAgICAgICAgICAgIDogJWxsdVxuIiwKLSAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nIGludCkgamF2YUNsYXNzZXMuc2l6ZSgpKTsKLSAgZnByaW50ZihzdGRlcnIsICJOdW1iZXIgb2YgZXh0ZXJuYWwgYXJyYXkgY2xhc3NlcyAgICA6ICVsbHVcbiIsCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIGFycmF5Q2xhc3Nlcy5zaXplKCkpOwotICBmcHJpbnRmKHN0ZGVyciwgIk51bWJlciBvZiB2aXJ0dWFsIHRhYmxlcyAgICAgICAgICAgIDogJWxsdVxuIiwgCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIHZpcnR1YWxUYWJsZXMuc2l6ZSgpKTsKLSAgZnByaW50ZihzdGRlcnIsICJOdW1iZXIgb2Ygc3RhdGljIGluc3RhbmNlcyAgICAgICAgICA6ICVsbHVcbiIsIAotICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBzdGF0aWNJbnN0YW5jZXMuc2l6ZSgpKTsKLSAgZnByaW50ZihzdGRlcnIsICJOdW1iZXIgb2YgY29uc3RhbnQgcG9vbHMgICAgICAgICAgICA6ICVsbHVcbiIsIAotICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBjb25zdGFudFBvb2xzLnNpemUoKSk7Ci0gIGZwcmludGYoc3RkZXJyLCAiTnVtYmVyIG9mIHN0cmluZ3MgICAgICAgICAgICAgICAgICAgOiAlbGx1XG4iLCAKLSAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nIGludCkgc3RyaW5ncy5zaXplKCkpOwotICBmcHJpbnRmKHN0ZGVyciwgIk51bWJlciBvZiBuYXRpdmUgZnVuY3Rpb25zICAgICAgICAgIDogJWxsdVxuIiwgCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIG5hdGl2ZUZ1bmN0aW9ucy5zaXplKCkpOwotICBmcHJpbnRmKHN0ZGVyciwgIi0tLS0tLS0tLS0tLS0tLS0tIFRvdGFsIHNpemUgaW4gLmRhdGEgLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLSAgdWludDY0IHNpemUgPSAwOwotICBNb2R1bGUqIE1vZCA9IGdldExMVk1Nb2R1bGUoKTsKLSAgZm9yIChNb2R1bGU6OmNvbnN0X2dsb2JhbF9pdGVyYXRvciBpID0gTW9kLT5nbG9iYWxfYmVnaW4oKSwKLSAgICAgICBlID0gTW9kLT5nbG9iYWxfZW5kKCk7IGkgIT0gZTsgKytpKSB7Ci0gICAgc2l6ZSArPSBtdm06Ok12bU1vZHVsZTo6Z2V0VHlwZVNpemUoaS0+Z2V0VHlwZSgpKTsKLSAgfQotICBmcHJpbnRmKHN0ZGVyciwgIiVsbHVCXG4iLCAodW5zaWduZWQgbG9uZyBsb25nIGludClzaXplKTsKLX0KLQotdm9pZCBKYXZhQU9UQ29tcGlsZXI6OkNyZWF0ZVN0YXRpY0luaXRpYWxpemVyKCkgewotCi0gIHN0ZDo6dmVjdG9yPGNvbnN0IGxsdm06OlR5cGUqPiBsbHZtQXJnczsKLSAgbGx2bUFyZ3MucHVzaF9iYWNrKEphdmFJbnRyaW5zaWNzLnB0clR5cGUpOyAvLyBjbGFzcyBsb2FkZXIKLSAgbGx2bUFyZ3MucHVzaF9iYWNrKEphdmFJbnRyaW5zaWNzLkphdmFDb21tb25DbGFzc1R5cGUpOyAvLyBjbAotICBjb25zdCBGdW5jdGlvblR5cGUqIEZUeSA9Ci0gICAgRnVuY3Rpb25UeXBlOjpnZXQoVHlwZTo6Z2V0Vm9pZFR5KGdldExMVk1Db250ZXh0KCkpLCBsbHZtQXJncywgZmFsc2UpOwotCi0gIEZ1bmN0aW9uKiBBZGRDbGFzcyA9IEZ1bmN0aW9uOjpDcmVhdGUoRlR5LCBHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxMaW5rYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bWpjQWRkUHJlQ29tcGlsZWRDbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TExWTU1vZHVsZSgpKTsKLSAKLSAgbGx2bUFyZ3MuY2xlYXIoKTsKLSAgLy8gY2xhc3MgbG9hZGVyCi0gIGxsdm1BcmdzLnB1c2hfYmFjayhKYXZhSW50cmluc2ljcy5wdHJUeXBlKTsKLSAgLy8gYXJyYXkgcHRyCi0gIGxsdm1BcmdzLnB1c2hfYmFjayhQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKEphdmFJbnRyaW5zaWNzLkphdmFDbGFzc0FycmF5VHlwZSkpOwotICAvLyBuYW1lCi0gIGxsdm1BcmdzLnB1c2hfYmFjayhKYXZhSW50cmluc2ljcy5VVEY4VHlwZSk7Ci0gIEZUeSA9IEZ1bmN0aW9uVHlwZTo6Z2V0KFR5cGU6OmdldFZvaWRUeShnZXRMTFZNQ29udGV4dCgpKSwgbGx2bUFyZ3MsIGZhbHNlKTsKLSAgCi0gIEZ1bmN0aW9uKiBHZXRDbGFzc0FycmF5ID0gRnVuY3Rpb246OkNyZWF0ZShGVHksIEdsb2JhbFZhbHVlOjpFeHRlcm5hbExpbmthZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidm1qY0dldENsYXNzQXJyYXkiLCBnZXRMTFZNTW9kdWxlKCkpOwotICAKLSAgQmFzaWNCbG9jayogY3VycmVudEJsb2NrID0gQmFzaWNCbG9jazo6Q3JlYXRlKGdldExMVk1Db250ZXh0KCksICJlbnRlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0aWNJbml0aWFsaXplcik7Ci0gIEZ1bmN0aW9uOjphcmdfaXRlcmF0b3IgbG9hZGVyID0gU3RhdGljSW5pdGlhbGl6ZXItPmFyZ19iZWdpbigpOwotICAKLSAgVmFsdWUqIEFyZ3NbM107Ci0gIC8vIElmIHdlIGhhdmUgZGVmaW5lZCBzb21lIHN0cmluZ3MuCi0gIGlmIChzdHJpbmdzLmJlZ2luKCkgIT0gc3RyaW5ncy5lbmQoKSkgewotICAgIGxsdm1BcmdzLmNsZWFyKCk7Ci0gICAgbGx2bUFyZ3MucHVzaF9iYWNrKEphdmFJbnRyaW5zaWNzLnB0clR5cGUpOyAvLyBjbGFzcyBsb2FkZXIKLSAgICBsbHZtQXJncy5wdXNoX2JhY2soc3RyaW5ncy5iZWdpbigpLT5zZWNvbmQtPmdldFR5cGUoKSk7IC8vIHZhbAotICAgIEZUeSA9IEZ1bmN0aW9uVHlwZTo6Z2V0KFR5cGU6OmdldFZvaWRUeShnZXRMTFZNQ29udGV4dCgpKSwgbGx2bUFyZ3MsIGZhbHNlKTsKLSAgCi0gICAgRnVuY3Rpb24qIEFkZFN0cmluZyA9IEZ1bmN0aW9uOjpDcmVhdGUoRlR5LCBHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxMaW5rYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2bWpjQWRkU3RyaW5nIiwgZ2V0TExWTU1vZHVsZSgpKTsKLSAgCi0KLSAgCi0gICAgZm9yIChzdHJpbmdfaXRlcmF0b3IgaSA9IHN0cmluZ3MuYmVnaW4oKSwgZSA9IHN0cmluZ3MuZW5kKCk7IGkgIT0gZTsgKytpKSB7Ci0gICAgICBBcmdzWzBdID0gbG9hZGVyOwotICAgICAgQXJnc1sxXSA9IGktPnNlY29uZDsKLSAgICAgIENhbGxJbnN0OjpDcmVhdGUoQWRkU3RyaW5nLCBBcmdzLCBBcmdzICsgMiwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgfQotICB9Ci0gCi0jaWYgMAotICAvLyBEaXNhYmxlIGluaXRpYWxpemF0aW9uIG9mIFVURjhzLCBpdCBtYWtlcyB0aGUgSW5pdCBtZXRob2QgdG9vIGJpZy4KLSAgLy8gSWYgd2UgaGF2ZSBkZWZpbmVkIHNvbWUgVVRGOHMuCi0gIGlmICh1dGY4cy5iZWdpbigpICE9IHV0ZjhzLmVuZCgpKSB7Ci0gICAgbGx2bUFyZ3MuY2xlYXIoKTsKLSAgICBsbHZtQXJncy5wdXNoX2JhY2soSmF2YUludHJpbnNpY3MucHRyVHlwZSk7IC8vIGNsYXNzIGxvYWRlcgotICAgIGxsdm1BcmdzLnB1c2hfYmFjayh1dGY4cy5iZWdpbigpLT5zZWNvbmQtPmdldFR5cGUoKSk7IC8vIHZhbAotICAgIEZUeSA9IEZ1bmN0aW9uVHlwZTo6Z2V0KFR5cGU6OmdldFZvaWRUeShnZXRMTFZNQ29udGV4dCgpKSwgbGx2bUFyZ3MsIGZhbHNlKTsKLSAgCi0gICAgRnVuY3Rpb24qIEFkZFVURjggPSBGdW5jdGlvbjo6Q3JlYXRlKEZUeSwgR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZtamNBZGRVVEY4IiwgZ2V0TExWTU1vZHVsZSgpKTsKLSAgCi0KLSAgCi0gICAgZm9yICh1dGY4X2l0ZXJhdG9yIGkgPSB1dGY4cy5iZWdpbigpLCBlID0gdXRmOHMuZW5kKCk7IGkgIT0gZTsgKytpKSB7Ci0gICAgICBBcmdzWzBdID0gbG9hZGVyOwotICAgICAgQXJnc1sxXSA9IGktPnNlY29uZDsKLSAgICAgIENhbGxJbnN0OjpDcmVhdGUoQWRkVVRGOCwgQXJncywgQXJncyArIDIsICIiLCBjdXJyZW50QmxvY2spOwotICAgIH0KLSAgfQotI2VuZGlmCi0KLSAgZm9yIChuYXRpdmVfY2xhc3NfaXRlcmF0b3IgaSA9IG5hdGl2ZUNsYXNzZXMuYmVnaW4oKSwgCi0gICAgICAgZSA9IG5hdGl2ZUNsYXNzZXMuZW5kKCk7IGkgIT0gZTsgKytpKSB7Ci0gICAgaWYgKGlzQ29tcGlsaW5nKGktPmZpcnN0KSkgewotICAgICAgQXJnc1swXSA9IGxvYWRlcjsKLSAgICAgIEFyZ3NbMV0gPSBDb25zdGFudEV4cHI6OmdldEJpdENhc3QoaS0+c2Vjb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhSW50cmluc2ljcy5KYXZhQ29tbW9uQ2xhc3NUeXBlKTsKLSAgICAgIENhbGxJbnN0OjpDcmVhdGUoQWRkQ2xhc3MsIEFyZ3MsIEFyZ3MgKyAyLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICB9Ci0gIH0KLSAgCi0gIGZvciAoYXJyYXlfY2xhc3NfaXRlcmF0b3IgaSA9IGFycmF5Q2xhc3Nlcy5iZWdpbigpLCAKLSAgICAgICBlID0gYXJyYXlDbGFzc2VzLmVuZCgpOyBpICE9IGU7ICsraSkgewotICAgIEFyZ3NbMF0gPSBsb2FkZXI7Ci0gICAgQXJnc1sxXSA9IGktPnNlY29uZDsKLSAgICBBcmdzWzJdID0gZ2V0VVRGOChpLT5maXJzdC0+bmFtZSk7Ci0gICAgQ2FsbEluc3Q6OkNyZWF0ZShHZXRDbGFzc0FycmF5LCBBcmdzLCBBcmdzICsgMywgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIH0KLSAgCi0KLSAgUmV0dXJuSW5zdDo6Q3JlYXRlKGdldExMVk1Db250ZXh0KCksIGN1cnJlbnRCbG9jayk7Ci19Ci0KLXZvaWQgSmF2YUFPVENvbXBpbGVyOjpzZXROb0lubGluZShDbGFzcyogY2wpIHsKLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBjbC0+bmJWaXJ0dWFsTWV0aG9kczsgKytpKSB7Ci0gICAgSmF2YU1ldGhvZCYgbWV0aCA9IGNsLT52aXJ0dWFsTWV0aG9kc1tpXTsKLSAgICBpZiAoIWlzQWJzdHJhY3QobWV0aC5hY2Nlc3MpKSB7Ci0gICAgICBMTFZNTWV0aG9kSW5mbyogTE1JID0gZ2V0TWV0aG9kSW5mbygmbWV0aCk7Ci0gICAgICBGdW5jdGlvbiogZnVuYyA9IExNSS0+Z2V0TWV0aG9kKCk7Ci0gICAgICBmdW5jLT5hZGRGbkF0dHIoQXR0cmlidXRlOjpOb0lubGluZSk7Ci0gICAgfQotICB9Ci0gIAotICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IGNsLT5uYlN0YXRpY01ldGhvZHM7ICsraSkgewotICAgIEphdmFNZXRob2QmIG1ldGggPSBjbC0+c3RhdGljTWV0aG9kc1tpXTsKLSAgICBpZiAoIWlzQWJzdHJhY3QobWV0aC5hY2Nlc3MpKSB7Ci0gICAgICBMTFZNTWV0aG9kSW5mbyogTE1JID0gZ2V0TWV0aG9kSW5mbygmbWV0aCk7Ci0gICAgICBGdW5jdGlvbiogZnVuYyA9IExNSS0+Z2V0TWV0aG9kKCk7Ci0gICAgICBmdW5jLT5hZGRGbkF0dHIoQXR0cmlidXRlOjpOb0lubGluZSk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgSmF2YUFPVENvbXBpbGVyOjptYWtlVlQoQ2xhc3MqIGNsKSB7Ci0gIEphdmFWaXJ0dWFsVGFibGUqIFZUID0gY2wtPnZpcnR1YWxWVDsKLSAgCi0gIGlmIChjbC0+c3VwZXIpIHsKLSAgICAvLyBDb3B5IHRoZSBzdXBlciBWVCBpbnRvIHRoZSBjdXJyZW50IFZULgotICAgIHVpbnQzMiBzaXplID0gY2wtPnN1cGVyLT52aXJ0dWFsVGFibGVTaXplIC0gCi0gICAgICAgIEphdmFWaXJ0dWFsVGFibGU6OmdldEZpcnN0SmF2YU1ldGhvZEluZGV4KCk7Ci0gICAgbWVtY3B5KFZULT5nZXRGaXJzdEphdmFNZXRob2QoKSwgY2wtPnN1cGVyLT52aXJ0dWFsVlQtPmdldEZpcnN0SmF2YU1ldGhvZCgpLAotICAgICAgICAgICBzaXplICogc2l6ZW9mKHVpbnRwdHJfdCkpOwotICAgIFZULT5kZXN0cnVjdG9yID0gY2wtPnN1cGVyLT52aXJ0dWFsVlQtPmRlc3RydWN0b3I7Ci0gIH0KLSAgCi0gIGZvciAodWludDMyIGkgPSAwOyBpIDwgY2wtPm5iVmlydHVhbE1ldGhvZHM7ICsraSkgewotICAgIEphdmFNZXRob2QmIG1ldGggPSBjbC0+dmlydHVhbE1ldGhvZHNbaV07Ci0gICAgKCh2b2lkKiopVlQpW21ldGgub2Zmc2V0XSA9ICZtZXRoOwotICB9Ci0KLSAgaWYgKCFjbC0+c3VwZXIpIFZULT5kZXN0cnVjdG9yID0gMDsKLQotfQotCi12b2lkIEphdmFBT1RDb21waWxlcjo6bWFrZUlNVChDbGFzcyogY2wpIHsKLX0KLQotdm9pZCBKYXZhQU9UQ29tcGlsZXI6OnNldE1ldGhvZChGdW5jdGlvbiogZnVuYywgdm9pZCogcHRyLCBjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIGZ1bmMtPnNldE5hbWUobmFtZSk7Ci0gIGZ1bmMtPnNldExpbmthZ2UoR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSk7Ci19Ci0KLVZhbHVlKiBKYXZhQU9UQ29tcGlsZXI6OmFkZENhbGxiYWNrKENsYXNzKiBjbCwgdWludDE2IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2lnbmRlZiogc2lnbiwgYm9vbCBzdGF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayogaW5zZXJ0KSB7Ci0gCi0gIEphdmFDb25zdGFudFBvb2wqIGN0cEluZm8gPSBjbC0+Y3RwSW5mbzsKLSAgU2lnbmRlZiogc2lnbmF0dXJlID0gMDsKLSAgY29uc3QgVVRGOCogbmFtZSA9IDA7Ci0gIGNvbnN0IFVURjgqIG1ldGhDbCA9IDA7Ci0gIGN0cEluZm8tPm5hbWVPZlN0YXRpY09yU3BlY2lhbE1ldGhvZChpbmRleCwgbWV0aENsLCBuYW1lLCBzaWduYXR1cmUpOwotCi0KLSAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBlbWl0dGluZyBhIGNhbGxiYWNrIGZyb20gJXMgKCVzLiVzKVxuIiwKLSAgICAgICAgICBVVEY4QnVmZmVyKGNsLT5uYW1lKS5jU3RyaW5nKCksIFVURjhCdWZmZXIobWV0aENsKS5jU3RyaW5nKCksCi0gICAgICAgICAgVVRGOEJ1ZmZlcihuYW1lKS5jU3RyaW5nKCkpOwotCi0gIExMVk1TaWduYXR1cmVJbmZvKiBMU0kgPSBnZXRTaWduYXR1cmVJbmZvKHNpZ24pOwotICAKLSAgY29uc3QgRnVuY3Rpb25UeXBlKiB0eXBlID0gc3RhdCA/IExTSS0+Z2V0U3RhdGljVHlwZSgpIDogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMU0ktPmdldFZpcnR1YWxUeXBlKCk7Ci0gIAotICBWYWx1ZSogZnVuYyA9IENvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdChDYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlclR5cGU6OmdldFVucXVhbCh0eXBlKSk7Ci0gIAotICByZXR1cm4gZnVuYzsKLX0KLQotdm9pZCBKYXZhQU9UQ29tcGlsZXI6OmNvbXBpbGVDbGFzcyhDbGFzcyogY2wpIHsKLSAgCi0gIC8vIE1ha2Ugc3VyZSB0aGUgY2xhc3MgaXMgZW1pdHRlZC4KLSAgZ2V0TmF0aXZlQ2xhc3MoY2wpOwotCi0gIGZvciAodWludDMyIGkgPSAwOyBpIDwgY2wtPm5iVmlydHVhbE1ldGhvZHM7ICsraSkgewotICAgIEphdmFNZXRob2QmIG1ldGggPSBjbC0+dmlydHVhbE1ldGhvZHNbaV07Ci0gICAgaWYgKCFpc0Fic3RyYWN0KG1ldGguYWNjZXNzKSkgcGFyc2VGdW5jdGlvbigmbWV0aCk7Ci0gICAgaWYgKGdlbmVyYXRlU3R1YnMpIGNvbXBpbGVBbGxTdHVicyhtZXRoLmdldFNpZ25hdHVyZSgpKTsKLSAgfQotICAKLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBjbC0+bmJTdGF0aWNNZXRob2RzOyArK2kpIHsKLSAgICBKYXZhTWV0aG9kJiBtZXRoID0gY2wtPnN0YXRpY01ldGhvZHNbaV07Ci0gICAgaWYgKCFpc0Fic3RyYWN0KG1ldGguYWNjZXNzKSkgcGFyc2VGdW5jdGlvbigmbWV0aCk7Ci0gICAgaWYgKGdlbmVyYXRlU3R1YnMpIGNvbXBpbGVBbGxTdHVicyhtZXRoLmdldFNpZ25hdHVyZSgpKTsKLSAgfQotfQotCi0KLQotdm9pZCBleHRyYWN0RmlsZXMoQ2xhc3NCeXRlcyogYnl0ZXMsCi0gICAgICAgICAgICAgICAgICBKYXZhQU9UQ29tcGlsZXIqIE0sCi0gICAgICAgICAgICAgICAgICBKbmp2bUJvb3RzdHJhcExvYWRlciogYm9vdHN0cmFwTG9hZGVyLAotICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q2xhc3MqPiYgY2xhc3NlcykgewotICBaaXBBcmNoaXZlIGFyY2hpdmUoYnl0ZXMsIGJvb3RzdHJhcExvYWRlci0+YWxsb2NhdG9yKTsKLSAgIAotICBtdm06OkJ1bXBQdHJBbGxvY2F0b3IgYWxsb2NhdG9yOyAKLSAgY2hhciogcmVhbE5hbWUgPSAoY2hhciopYWxsb2NhdG9yLkFsbG9jYXRlKDQwOTYsICJ0ZW1wIik7Ci0gIGZvciAoWmlwQXJjaGl2ZTo6dGFibGVfaXRlcmF0b3IgaSA9IGFyY2hpdmUuZmlsZXRhYmxlLmJlZ2luKCksIAotICAgICAgIGUgPSBhcmNoaXZlLmZpbGV0YWJsZS5lbmQoKTsgaSAhPSBlOyArK2kpIHsKLSAgICBaaXBGaWxlKiBmaWxlID0gaS0+c2Vjb25kOwotICAgICAKLSAgICBjaGFyKiBuYW1lID0gZmlsZS0+ZmlsZW5hbWU7Ci0gICAgdWludDMyIHNpemUgPSBzdHJsZW4obmFtZSk7Ci0gICAgaWYgKHNpemUgPiA2ICYmICFzdHJjbXAoJihuYW1lW3NpemUgLSA2XSksICIuY2xhc3MiKSkgewotICAgICAgbWVtY3B5KHJlYWxOYW1lLCBuYW1lLCBzaXplKTsKLSAgICAgIHJlYWxOYW1lW3NpemUgLSA2XSA9IDA7Ci0gICAgICBjb25zdCBVVEY4KiB1dGY4ID0gYm9vdHN0cmFwTG9hZGVyLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KHJlYWxOYW1lKTsKLSAgICAgIENsYXNzKiBjbCA9IGJvb3RzdHJhcExvYWRlci0+bG9hZE5hbWUodXRmOCwgdHJ1ZSwgZmFsc2UsIE5VTEwpOwotICAgICAgYXNzZXJ0KGNsICYmICJDbGFzcyBub3QgY3JlYXRlZCIpOwotICAgICAgaWYgKGNsID09IENsYXNzQXJyYXk6OlN1cGVyQXJyYXkpIE0tPmNvbXBpbGVSVCA9IHRydWU7Ci0gICAgICBjbGFzc2VzLnB1c2hfYmFjayhjbCk7ICAKLSAgICB9IGVsc2UgaWYgKHNpemUgPiA0ICYmICghc3RyY21wKCZuYW1lW3NpemUgLSA0XSwgIi5qYXIiKSB8fCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKCZuYW1lW3NpemUgLSA0XSwgIi56aXAiKSkpIHsKLSAgICAgIENsYXNzQnl0ZXMqIHJlcyA9IG5ldyAoYWxsb2NhdG9yLCBmaWxlLT51Y3NpemUpIENsYXNzQnl0ZXMoZmlsZS0+dWNzaXplKTsKLSAgICAgIGludCBvayA9IGFyY2hpdmUucmVhZEZpbGUocmVzLCBmaWxlKTsKLSAgICAgIGlmICghb2spIHJldHVybjsKLSAgICAgIAotICAgICAgZXh0cmFjdEZpbGVzKHJlcywgTSwgYm9vdHN0cmFwTG9hZGVyLCBjbGFzc2VzKTsKLSAgICB9Ci0gIH0KLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciogbmFtZTsKLQotCi12b2lkIG1haW5Db21waWxlclN0YXJ0KG12bTo6VmlydHVhbE1hY2hpbmUqIF92bSwgaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0JSm5qdm0qIHZtID0gKEpuanZtKilfdm07Ci0KLQlKYXZhVGhyZWFkOjphc3NvY2lhdGUodm0sIG12bTo6VGhyZWFkOjpnZXQoKSk7Ci0KLSAgSm5qdm1Cb290c3RyYXBMb2FkZXIqIGJvb3RzdHJhcExvYWRlciA9IHZtLT5ib290c3RyYXBMb2FkZXI7Ci0gIEphdmFBT1RDb21waWxlciogTSA9IChKYXZhQU9UQ29tcGlsZXIqKWJvb3RzdHJhcExvYWRlci0+Z2V0Q29tcGlsZXIoKTsKLSAgSmF2YUpJVENvbXBpbGVyKiBDb21wID0gMDsKLSAgbXZtOjpUaHJlYWRBbGxvY2F0b3IgYWxsb2NhdG9yOwotICBib290c3RyYXBMb2FkZXItPmFuYWx5c2VDbGFzc3BhdGhFbnYodm0tPmJvb3RzdHJhcExvYWRlci0+Ym9vdENsYXNzcGF0aEVudik7Ci0gIHVpbnQzMiBzaXplID0gc3RybGVuKG5hbWUpOwotICBpZiAoc2l6ZSA+IDQgJiYgCi0gICAgICAoIXN0cmNtcCgmbmFtZVtzaXplIC0gNF0sICIuamFyIikgfHwgIXN0cmNtcCgmbmFtZVtzaXplIC0gNF0sICIuemlwIikpKSB7Ci0gICAgYm9vdHN0cmFwTG9hZGVyLT5hbmFseXNlQ2xhc3NwYXRoRW52KG5hbWUpOwotICB9Ci0KLSAgaWYgKCFNLT5jbGluaXRzLT5lbXB0eSgpKSB7Ci0gICAgQ29tcCA9IEphdmFKSVRDb21waWxlcjo6Q3JlYXRlQ29tcGlsZXIoIkpJVCIpOwotICAgIENvbXAtPkVtaXRGdW5jdGlvbk5hbWUgPSB0cnVlOwotICAgIGlmICghTS0+dXNlQ29vcGVyYXRpdmVHQygpKSB7Ci0gICAgICBDb21wLT5kaXNhYmxlQ29vcGVyYXRpdmVHQygpOwotICAgIH0KLSAgICBib290c3RyYXBMb2FkZXItPnNldENvbXBpbGVyKENvbXApOwotICAgIGJvb3RzdHJhcExvYWRlci0+YW5hbHlzZUNsYXNzcGF0aEVudih2bS0+Y2xhc3NwYXRoKTsKLSAgfSBlbHNlIHsKLSAgICBib290c3RyYXBMb2FkZXItPmFuYWx5c2VDbGFzc3BhdGhFbnYodm0tPmNsYXNzcGF0aCk7Ci0gICAgdm0tPnVwY2FsbHMtPnBvc3RJbml0aWFsaXNlQ2xhc3NwYXRoKGJvb3RzdHJhcExvYWRlcik7Ci0gIH0KLSAgCi0gICAgCi0gIGlmIChzaXplID4gNCAmJiAKLSAgICAgICghc3RyY21wKCZuYW1lW3NpemUgLSA0XSwgIi5qYXIiKSB8fCAhc3RyY21wKCZuYW1lW3NpemUgLSA0XSwgIi56aXAiKSkpIHsKLSAgCi0gICAgc3RkOjp2ZWN0b3I8Q2xhc3MqPiBjbGFzc2VzOwotICAgIENsYXNzQnl0ZXMqIGJ5dGVzID0gUmVhZGVyOjpvcGVuRmlsZShib290c3RyYXBMb2FkZXIsIG5hbWUpOwotICAgICAgCi0gICAgaWYgKCFieXRlcykgewotICAgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCBmaW5kIHppcCBmaWxlLlxuIik7Ci0gICAgICBnb3RvIGVuZDsKLSAgICB9Ci0KLSAgICBleHRyYWN0RmlsZXMoYnl0ZXMsIE0sIGJvb3RzdHJhcExvYWRlciwgY2xhc3Nlcyk7Ci0gICAgLy8gTm93IHRoYXQgd2Uga25vdyBpZiB3ZSBjYW4gdHJ1c3QgdGhpcyBjb21waWxlciwgYWRkIHRoZSBKYXZhIHBhc3Nlcy4KLSAgICBNLT5hZGRKYXZhUGFzc2VzKCk7Ci0KLQotICAgICAgLy8gRmlyc3QgcmVzb2x2ZSBldmVyeW9uZSBzbyB0aGF0IHRoZXJlIGNhbiBub3QgYmUgdW5rbm93biByZWZlcmVuY2VzIGluCi0gICAgICAvLyBjb25zdGFudCBwb29scy4KLSAgICAgIGZvciAoc3RkOjp2ZWN0b3I8Q2xhc3MqPjo6aXRlcmF0b3IgaSA9IGNsYXNzZXMuYmVnaW4oKSwKLSAgICAgICAgICAgZSA9IGNsYXNzZXMuZW5kKCk7IGkgIT0gZTsgKytpKSB7Ci0gICAgICAgIENsYXNzKiBjbCA9ICppOwotICAgICAgICBjbC0+cmVzb2x2ZUNsYXNzKCk7Ci0gICAgICAgIGNsLT5zZXRPd25lckNsYXNzKG12bTo6VGhyZWFkOjpnZXQoKSk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IGNsLT5uYlZpcnR1YWxNZXRob2RzOyArK2kpIHsKLSAgICAgICAgICBMTFZNTWV0aG9kSW5mbyogTE1JID0gTS0+Z2V0TWV0aG9kSW5mbygmY2wtPnZpcnR1YWxNZXRob2RzW2ldKTsKLSAgICAgICAgICBMTUktPmdldE1ldGhvZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBjbC0+bmJTdGF0aWNNZXRob2RzOyArK2kpIHsKLSAgICAgICAgICBMTFZNTWV0aG9kSW5mbyogTE1JID0gTS0+Z2V0TWV0aG9kSW5mbygmY2wtPnN0YXRpY01ldGhvZHNbaV0pOwotICAgICAgICAgIExNSS0+Z2V0TWV0aG9kKCk7Ci0gICAgICAgIH0KLQotICAgICAgfQotCi0gICAgICBpZiAoIU0tPmNsaW5pdHMtPmVtcHR5KCkpIHsKLSAgICAgICAgdm0tPmxvYWRCb290c3RyYXAoKTsKLQotICAgICAgICBmb3IgKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaSA9IE0tPmNsaW5pdHMtPmJlZ2luKCksCi0gICAgICAgICAgICAgZSA9IE0tPmNsaW5pdHMtPmVuZCgpOyBpICE9IGU7ICsraSkgewotICAgICAgICAgIAotICAgICAgICAgIGlmIChpLT5hdChpLT5sZW5ndGgoKSAtIDEpID09ICcqJykgewotICAgICAgICAgICAgZm9yIChzdGQ6OnZlY3RvcjxDbGFzcyo+OjppdGVyYXRvciBpaSA9IGNsYXNzZXMuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgZWUgPSBjbGFzc2VzLmVuZCgpOyBpaSAhPSBlZTsgKytpaSkgewotICAgICAgICAgICAgICBDbGFzcyogY2wgPSAqaWk7Ci0gICAgICAgICAgICAgIGlmICghc3RybmNtcChVVEY4QnVmZmVyKGNsLT5uYW1lKS5jU3RyaW5nKCksIGktPmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpLT5sZW5ndGgoKSAtIDEpKSB7Ci0gICAgICAgICAgICAgICAgVFJZIHsKLSAgICAgICAgICAgICAgICAgIGNsLT5hc0NsYXNzKCktPmluaXRpYWxpc2VDbGFzcygpOwotICAgICAgICAgICAgICAgIH0gQ0FUQ0ggewotICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciB3aGVuIGluaXRpYWxpemluZyAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGOEJ1ZmZlcihjbC0+bmFtZSkuY1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgIGFib3J0KCk7Ci0gICAgICAgICAgICAgICAgfSBFTkRfQ0FUQ0g7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICBjb25zdCBVVEY4KiBuYW1lID0gYm9vdHN0cmFwTG9hZGVyLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KGktPmNfc3RyKCkpOwotICAgICAgICAgICAgQ29tbW9uQ2xhc3MqIGNsID0gYm9vdHN0cmFwTG9hZGVyLT5sb29rdXBDbGFzcyhuYW1lKTsKLSAgICAgICAgICAgIGlmIChjbCAmJiBjbC0+aXNDbGFzcygpKSB7Ci0gICAgICAgICAgICAgIFRSWSB7Ci0gICAgICAgICAgICAgICAgY2wtPmFzQ2xhc3MoKS0+aW5pdGlhbGlzZUNsYXNzKCk7Ci0gICAgICAgICAgICAgIH0gQ0FUQ0ggewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3Igd2hlbiBpbml0aWFsaXppbmcgJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBVVEY4QnVmZmVyKGNsLT5uYW1lKS5jU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGFib3J0KCk7Ci0gICAgICAgICAgICAgIH0gRU5EX0NBVENIOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDbGFzcyAlcyBkb2VzIG5vdCBleGlzdCBvciBpcyBhbiBhcnJheSBjbGFzcy5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgaS0+Y19zdHIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJvb3RzdHJhcExvYWRlci0+c2V0Q29tcGlsZXIoTSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGZvciAoc3RkOjp2ZWN0b3I8Q2xhc3MqPjo6aXRlcmF0b3IgaSA9IGNsYXNzZXMuYmVnaW4oKSwgZSA9IGNsYXNzZXMuZW5kKCk7Ci0gICAgICAgICAgIGkgIT0gZTsgKytpKSB7Ci0gICAgICAgIENsYXNzKiBjbCA9ICppOwotICAgICAgICBjbC0+c2V0T3duZXJDbGFzcyhtdm06OlRocmVhZDo6Z2V0KCkpOwotICAgICAgfQotICAgICAgCi0gICAgICBmb3IgKHN0ZDo6dmVjdG9yPENsYXNzKj46Oml0ZXJhdG9yIGkgPSBjbGFzc2VzLmJlZ2luKCksIGUgPSBjbGFzc2VzLmVuZCgpOwotICAgICAgICAgICBpICE9IGU7ICsraSkgewotICAgICAgICBDbGFzcyogY2wgPSAqaTsKLSAgICAgICAgTS0+Y29tcGlsZUNsYXNzKGNsKTsKLSAgICAgIH0KLQotICAgIH0gZWxzZSB7Ci0gICAgICBNLT5hZGRKYXZhUGFzc2VzKCk7Ci0gICAgICBjaGFyKiByZWFsTmFtZSA9IChjaGFyKilhbGxvY2F0b3IuQWxsb2NhdGUoc2l6ZSArIDEpOwotICAgICAgaWYgKHNpemUgPiA2ICYmICFzdHJjbXAoJm5hbWVbc2l6ZSAtIDZdLCAiLmNsYXNzIikpIHsKLSAgICAgICAgbWVtY3B5KHJlYWxOYW1lLCBuYW1lLCBzaXplIC0gNik7Ci0gICAgICAgIHJlYWxOYW1lW3NpemUgLSA2XSA9IDA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBtZW1jcHkocmVhbE5hbWUsIG5hbWUsIHNpemUgKyAxKTsKLSAgICAgIH0KLSAgICAgCi0gICAgICBjb25zdCBVVEY4KiB1dGY4ID0gYm9vdHN0cmFwTG9hZGVyLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KHJlYWxOYW1lKTsKLSAgICAgIFVzZXJDbGFzcyogY2wgPSBib290c3RyYXBMb2FkZXItPmxvYWROYW1lKHV0ZjgsIHRydWUsIHRydWUsIE5VTEwpOwotICAgICAgCi0gICAgICBpZiAoIU0tPmNsaW5pdHMtPmVtcHR5KCkpIHsKLSAgICAgICAgdm0tPmxvYWRCb290c3RyYXAoKTsKLSAgICAgICAgY2wtPmluaXRpYWxpc2VDbGFzcygpOwotICAgICAgICBib290c3RyYXBMb2FkZXItPnNldENvbXBpbGVyKE0pOwotICAgICAgfQotICAgICAgCi0gICAgICBjbC0+c2V0T3duZXJDbGFzcyhtdm06OlRocmVhZDo6Z2V0KCkpOwotICAgICAgY2wtPnJlc29sdmVJbm5lck91dGVyQ2xhc3NlcygpOwotICAgICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBjbC0+bmJJbm5lckNsYXNzZXM7ICsraSkgewotICAgICAgICBjbC0+aW5uZXJDbGFzc2VzW2ldLT5zZXRPd25lckNsYXNzKG12bTo6VGhyZWFkOjpnZXQoKSk7Ci0gICAgICAgIE0tPmNvbXBpbGVDbGFzcyhjbC0+aW5uZXJDbGFzc2VzW2ldKTsKLSAgICAgIH0KLSAgICAgIE0tPmNvbXBpbGVDbGFzcyhjbCk7Ci0gICAgfQotIAotICAgIGlmIChNLT5jb21waWxlUlQpIHsKLSAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGlmIHdlIGNvbXBpbGUgUlQsIHRoZSBuYXRpdmUgY2xhc3NlcyBhcmUgZW1pdHRlZC4KLSAgICAgIE0tPmdldE5hdGl2ZUNsYXNzKHZtLT51cGNhbGxzLT5PZlZvaWQpOwotICAgICAgTS0+Z2V0TmF0aXZlQ2xhc3Modm0tPnVwY2FsbHMtPk9mQm9vbCk7Ci0gICAgICBNLT5nZXROYXRpdmVDbGFzcyh2bS0+dXBjYWxscy0+T2ZCeXRlKTsKLSAgICAgIE0tPmdldE5hdGl2ZUNsYXNzKHZtLT51cGNhbGxzLT5PZkNoYXIpOwotICAgICAgTS0+Z2V0TmF0aXZlQ2xhc3Modm0tPnVwY2FsbHMtPk9mU2hvcnQpOwotICAgICAgTS0+Z2V0TmF0aXZlQ2xhc3Modm0tPnVwY2FsbHMtPk9mSW50KTsKLSAgICAgIE0tPmdldE5hdGl2ZUNsYXNzKHZtLT51cGNhbGxzLT5PZkZsb2F0KTsKLSAgICAgIE0tPmdldE5hdGl2ZUNsYXNzKHZtLT51cGNhbGxzLT5PZkxvbmcpOwotICAgICAgTS0+Z2V0TmF0aXZlQ2xhc3Modm0tPnVwY2FsbHMtPk9mRG91YmxlKTsKLQotICAgICAgLy8gQWxzbyBkbyBub3QgYWxsb3cgaW5saW5nIG9mIHNvbWUgZnVuY3Rpb25zLgotI2RlZmluZSBTRVRfSU5MSU5FKE5BTUUpIHsgXAotICAgICAgY29uc3QgVVRGOCogbmFtZSA9IGJvb3RzdHJhcExvYWRlci0+YXNjaWl6Q29uc3RydWN0VVRGOChOQU1FKTsgXAotICAgICAgQ2xhc3MqIGNsID0gKENsYXNzKilib290c3RyYXBMb2FkZXItPmxvb2t1cENsYXNzKG5hbWUpOyBcCi0gICAgICBpZiAoY2wpIE0tPnNldE5vSW5saW5lKGNsKTsgfQotCi0gICAgICBTRVRfSU5MSU5FKCJqYXZhL3V0aWwvY29uY3VycmVudC9hdG9taWMvQXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVyIikKLSAgICAgIFNFVF9JTkxJTkUoImphdmEvdXRpbC9jb25jdXJyZW50L2F0b21pYy9BdG9taWNSZWZlcmVuY2VGaWVsZFVwZGF0ZXIiCi0gICAgICAgICAgICAgICAgICIkQXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVySW1wbCIpCi0gICAgICBTRVRfSU5MSU5FKCJqYXZhL3V0aWwvY29uY3VycmVudC9hdG9taWMvQXRvbWljSW50ZWdlckZpZWxkVXBkYXRlciIpCi0gICAgICBTRVRfSU5MSU5FKCJqYXZhL3V0aWwvY29uY3VycmVudC9hdG9taWMvQXRvbWljSW50ZWdlckZpZWxkVXBkYXRlciIKLSAgICAgICAgICAgICAgICAgIiRBdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVySW1wbCIpCi0gICAgICBTRVRfSU5MSU5FKCJqYXZhL3V0aWwvY29uY3VycmVudC9hdG9taWMvQXRvbWljTG9uZ0ZpZWxkVXBkYXRlciIpCi0gICAgICBTRVRfSU5MSU5FKCJqYXZhL3V0aWwvY29uY3VycmVudC9hdG9taWMvQXRvbWljTG9uZ0ZpZWxkVXBkYXRlciIKLSAgICAgICAgICAgICAgICAgIiRDQVNVcGRhdGVyIikKLSAgICAgIFNFVF9JTkxJTkUoImphdmEvdXRpbC9jb25jdXJyZW50L2F0b21pYy9BdG9taWNMb25nRmllbGRVcGRhdGVyIgotICAgICAgICAgICAgICAgICAiJExvY2tlZFVwZGF0ZXIiKQotI3VuZGVmIFNFVF9JTkxJTkUKLSAgICB9Ci0KLSAgICBNLT5DcmVhdGVTdGF0aWNJbml0aWFsaXplcigpOwotCi1lbmQ6Ci0JCXJldHVybjsKLX0KLQotdm9pZCBKYXZhQU9UQ29tcGlsZXI6OmNvbXBpbGVGaWxlKEpuanZtKiB2bSwgY29uc3QgY2hhciogbikgewotICBuYW1lID0gbjsKLQl2bS0+cnVuQXBwbGljYXRpb24obWFpbkNvbXBpbGVyU3RhcnQsIDAsIDApOwotICB2bS0+dm1raXQtPndhaXROb25EYWVtb25UaHJlYWRzKCk7Ci19Ci0KLS8vLyBjb21waWxlQWxsU3R1YnMgLSBDb21waWxlIGFsbCB0aGUgbmF0aXZlIC0+IEphdmEgc3R1YnMuIAotLy8vIFRPRE86IE9uY2UgTExWTSBzdXBwb3J0cyB2YV9hcmcsIGVuYWJsZSBBUC4KLS8vLwotdm9pZCBKYXZhQU9UQ29tcGlsZXI6OmNvbXBpbGVBbGxTdHVicyhTaWduZGVmKiBzaWduKSB7Ci0gIHNpZ24tPmdldFN0YXRpY0NhbGxCdWYoKTsKLSAgLy8gZ2V0U3RhdGljQ2FsbEFQKCk7Ci0gIHNpZ24tPmdldFZpcnR1YWxDYWxsQnVmKCk7Ci0gIC8vIGdldFZpcnR1YWxDYWxsQVAoKTsKLX0KLQotdm9pZCBKYXZhQU9UQ29tcGlsZXI6OmdlbmVyYXRlTWFpbihjb25zdCBjaGFyKiBuYW1lLCBib29sIGppdCkgewotCi0gIC8vIFR5cGUgRGVmaW5pdGlvbnMKLSAgc3RkOjp2ZWN0b3I8Y29uc3QgVHlwZSo+IEZ1bmNBcmdzOwotICBGdW5jQXJncy5wdXNoX2JhY2soVHlwZTo6Z2V0SW50MzJUeShnZXRMTFZNQ29udGV4dCgpKSk7Ci0gIEZ1bmNBcmdzLnB1c2hfYmFjayhQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKEphdmFJbnRyaW5zaWNzLnB0clR5cGUpKTsKLSAgCi0gIEZ1bmN0aW9uVHlwZSogRnVuY1R5ID0gRnVuY3Rpb25UeXBlOjpnZXQoVHlwZTo6Z2V0SW50MzJUeShnZXRMTFZNQ29udGV4dCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jQXJncywgZmFsc2UpOwotCi0gIEZ1bmN0aW9uKiBNYWluRnVuYyA9IEZ1bmN0aW9uOjpDcmVhdGUoRnVuY1R5LCBHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxMaW5rYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWluIiwgVGhlTW9kdWxlKTsKLSAgQmFzaWNCbG9jayogY3VycmVudEJsb2NrID0gQmFzaWNCbG9jazo6Q3JlYXRlKGdldExMVk1Db250ZXh0KCksICJlbnRlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluRnVuYyk7Ci0gCi0gIEdsb2JhbFZhcmlhYmxlKiBHdmFyQXJyYXlTdHIgPSBuZXcgR2xvYmFsVmFyaWFibGUoCi0gICAgKlRoZU1vZHVsZSwgQXJyYXlUeXBlOjpnZXQoVHlwZTo6Z2V0SW50OFR5KGdldExMVk1Db250ZXh0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihuYW1lKSArIDEpLAotICAgIHRydWUsIEdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2UsIDAsICJtYWluQ2xhc3MiKTsKLQotCi0gIENvbnN0YW50KiBOYW1lQXJyYXkgPSBDb25zdGFudEFycmF5OjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgbmFtZSwgdHJ1ZSk7Ci0gIEd2YXJBcnJheVN0ci0+c2V0SW5pdGlhbGl6ZXIoTmFtZUFycmF5KTsKLSAgVmFsdWUqIEluZGljZXNbMl0gPSB7IEphdmFJbnRyaW5zaWNzLmNvbnN0YW50WmVybywKLSAgICAgICAgICAgICAgICAgICAgICAgIEphdmFJbnRyaW5zaWNzLmNvbnN0YW50WmVybyB9OwotICBWYWx1ZSogQXJnTmFtZSA9IENvbnN0YW50RXhwcjo6Z2V0R2V0RWxlbWVudFB0cihHdmFyQXJyYXlTdHIsIEluZGljZXMsIDIpOwotCi0gIEZ1bmN0aW9uOjphcmdfaXRlcmF0b3IgRnVuY1ZhbHMgPSBNYWluRnVuYy0+YXJnX2JlZ2luKCk7Ci0gIFZhbHVlKiBBcmdjID0gRnVuY1ZhbHMrKzsKLSAgVmFsdWUqIEFyZ3YgPSBGdW5jVmFscysrOwotICBWYWx1ZSogQXJnc1szXSA9IHsgQXJnYywgQXJndiwgQXJnTmFtZSB9OwotCi0gIEZ1bmNBcmdzLnB1c2hfYmFjayhBcmdzWzJdLT5nZXRUeXBlKCkpOwotCi0gIEZ1bmNUeSA9IEZ1bmN0aW9uVHlwZTo6Z2V0KFR5cGU6OmdldEludDMyVHkoZ2V0TExWTUNvbnRleHQoKSksIEZ1bmNBcmdzLCBmYWxzZSk7Ci0KLSAgRnVuY3Rpb24qIENhbGxlZEZ1bmMgPSAKLSAgICBGdW5jdGlvbjo6Q3JlYXRlKEZ1bmNUeSwgR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSwKLSAgICAgICAgICAgICAgICAgICAgIGppdCA/ICJTdGFydEpuanZtV2l0aEpJVCIgOiAiU3RhcnRKbmp2bVdpdGhvdXRKSVQiLAotICAgICAgICAgICAgICAgICAgICAgVGhlTW9kdWxlKTsKLQotICBWYWx1ZSogcmVzID0gQ2FsbEluc3Q6OkNyZWF0ZShDYWxsZWRGdW5jLCBBcmdzLCBBcmdzICsgMywgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIFJldHVybkluc3Q6OkNyZWF0ZShnZXRMTFZNQ29udGV4dCgpLCByZXMsIGN1cnJlbnRCbG9jayk7Ci0KLX0KLQotCi0vLyBVc2UgYSBGYWtlRnVuY3Rpb24gdG8gcmV0dXJuIGZyb20gbG9hZE1ldGhvZCwgc28gdGhhdCB0aGUgY29tcGlsZXIgdGhpbmtzCi0vLyB0aGUgbWV0aG9kIGlzIGRlZmluZWQgYnkgSjMuCi1leHRlcm4gIkMiIHZvaWQgX19KYXZhQU9URmFrZUZ1bmN0aW9uX18oKSB7fQotCi12b2lkKiBKYXZhQU9UQ29tcGlsZXI6OmxvYWRNZXRob2Qodm9pZCogaGFuZGxlLCBjb25zdCBjaGFyKiBzeW1ib2wpIHsKLSAgRnVuY3Rpb24qIEYgPSBtdm06Ok12bU1vZHVsZTo6Z2xvYmFsTW9kdWxlLT5nZXRGdW5jdGlvbihzeW1ib2wpOwotICBpZiAoRikgewotICAgIHJldHVybiAodm9pZCopKHVpbnRwdHJfdClfX0phdmFBT1RGYWtlRnVuY3Rpb25fXzsKLSAgfQotCi0gIHJldHVybiBKYXZhQ29tcGlsZXI6OmxvYWRNZXRob2QoaGFuZGxlLCBzeW1ib2wpOwotfQotCi0jaWZkZWYgV0lUSF9NTVRLCi0KLSNpbmNsdWRlIDxzZXQ+Ci1leHRlcm4gc3RkOjpzZXQ8bXZtOjpnYyo+IF9fSW50ZXJuYWxTZXRfXzsKLQotQ29tbW9uQ2xhc3MqIEphdmFBT1RDb21waWxlcjo6Z2V0VW5pcXVlQmFzZUNsYXNzKENvbW1vbkNsYXNzKiBjbCkgewotICBzdGQ6OnNldDxtdm06OmdjKj46Oml0ZXJhdG9yIEkgPSBfX0ludGVybmFsU2V0X18uYmVnaW4oKTsKLSAgc3RkOjpzZXQ8bXZtOjpnYyo+OjppdGVyYXRvciBFID0gX19JbnRlcm5hbFNldF9fLmVuZCgpOwotICBDb21tb25DbGFzcyogY3VycmVudENsYXNzID0gMDsKLQotICBmb3IgKDsgSSAhPSBFOyArK0kpIHsKLSAgICBKYXZhT2JqZWN0KiBvYmogPSAoSmF2YU9iamVjdCopKCpJKTsKLSAgICBpZiAoIVZNQ2xhc3NMb2FkZXI6OmlzVk1DbGFzc0xvYWRlcihjbC0+Y2xhc3NMb2FkZXItPnZtLCBvYmopICYmIEphdmFPYmplY3Q6Omluc3RhbmNlT2Yob2JqLCBjbCkpIHsKLSAgICAgIGlmIChjdXJyZW50Q2xhc3MgIT0gTlVMTCkgewotICAgICAgICBpZiAoSmF2YU9iamVjdDo6Z2V0Q2xhc3Mob2JqKSAhPSBjdXJyZW50Q2xhc3MpIHsKLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY3VycmVudENsYXNzID0gSmF2YU9iamVjdDo6Z2V0Q2xhc3Mob2JqKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGN1cnJlbnRDbGFzczsKLX0KLQotI2Vsc2UKLUNvbW1vbkNsYXNzKiBKYXZhQU9UQ29tcGlsZXI6OmdldFVuaXF1ZUJhc2VDbGFzcyhDb21tb25DbGFzcyogY2wpIHsKLSAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9KMy9Db21waWxlci9KYXZhSklULmNwcCBiL3Zta2l0L2xpYi9KMy9Db21waWxlci9KYXZhSklULmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM2YmJhOS4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvSjMvQ29tcGlsZXIvSmF2YUpJVC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNDE3ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0gSmF2YUpJVC5jcHAgLSBKYXZhIGp1c3QgaW4gdGltZSBjb21waWxlciAtLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0KLSNkZWZpbmUgREVCVUcgMAotI2RlZmluZSBKTkpWTV9DT01QSUxFIDAKLSNkZWZpbmUgSk5KVk1fRVhFQ1VURSAwCi0KLSNpbmNsdWRlIDxjc3RyaW5nPgotCi0jaW5jbHVkZSA8bGx2bS9Db25zdGFudHMuaD4KLSNpbmNsdWRlIDxsbHZtL0Rlcml2ZWRUeXBlcy5oPgotI2luY2x1ZGUgPGxsdm0vRnVuY3Rpb24uaD4KLSNpbmNsdWRlIDxsbHZtL0luc3RydWN0aW9ucy5oPgotI2luY2x1ZGUgPGxsdm0vTW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGx2bS9UeXBlLmg+Ci0jaW5jbHVkZSA8bGx2bS9BbmFseXNpcy9EZWJ1Z0luZm8uaD4KLSNpbmNsdWRlIDxsbHZtL1N1cHBvcnQvQ0ZHLmg+Ci0KLSNpbmNsdWRlICJtdm0vSklULmgiCi0KLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgIkphdmFBcnJheS5oIgotI2luY2x1ZGUgIkphdmFDbGFzcy5oIgotI2luY2x1ZGUgIkphdmFDb25zdGFudFBvb2wuaCIKLSNpbmNsdWRlICJKYXZhT2JqZWN0LmgiCi0jaW5jbHVkZSAiSmF2YUpJVC5oIgotI2luY2x1ZGUgIkphdmFTdHJpbmcuaCIKLSNpbmNsdWRlICJKYXZhVGhyZWFkLmgiCi0jaW5jbHVkZSAiSmF2YVR5cGVzLmgiCi0jaW5jbHVkZSAiSmF2YVVwY2FsbHMuaCIKLSNpbmNsdWRlICJKbmp2bS5oIgotI2luY2x1ZGUgIlJlYWRlci5oIgotCi0jaW5jbHVkZSAiajMvSmF2YUxMVk1Db21waWxlci5oIgotI2luY2x1ZGUgImozL0ozSW50cmluc2ljcy5oIgotCi11c2luZyBuYW1lc3BhY2UgajM7Ci11c2luZyBuYW1lc3BhY2UgbGx2bTsKLQotc3RhdGljIGJvb2wgbmVlZHNJbml0aWFsaXNhdGlvbkNoZWNrKENsYXNzKiBjbCwgQ2xhc3MqIGNvbXBpbGluZ0NsYXNzKSB7Ci0gIGlmIChjbC0+aXNSZWFkeUZvckNvbXBpbGF0aW9uKCkgfHwgCi0gICAgICAoIWNsLT5pc0ludGVyZmFjZSgpICYmIGNvbXBpbGluZ0NsYXNzLT5pc0Fzc2lnbmFibGVGcm9tKGNsKSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIWNsLT5uZWVkc0luaXRpYWxpc2F0aW9uQ2hlY2soKSkgewotICAgIGlmICghY2wtPmlzUmVhZHkoKSkgewotICAgICAgY2wtPnNldEluaXRpYWxpemF0aW9uU3RhdGUocmVhZHkpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBKYXZhSklUOjpjYW5CZUlubGluZWQoSmF2YU1ldGhvZCogbWV0aCkgewotICBKbmp2bUNsYXNzTG9hZGVyKiBsb2FkZXIgPSBtZXRoLT5jbGFzc0RlZi0+Y2xhc3NMb2FkZXI7Ci0gIHJldHVybiAobWV0aC0+Y2FuQmVJbmxpbmVkICYmCi0gICAgICAgICAgbWV0aCAhPSBjb21waWxpbmdNZXRob2QgJiYgaW5saW5lTWV0aG9kc1ttZXRoXSA9PSAwICYmCi0gICAgICAgICAgKGxvYWRlciA9PSBjb21waWxpbmdDbGFzcy0+Y2xhc3NMb2FkZXIgfHwKLSAgICAgICAgICAgbG9hZGVyID09IGNvbXBpbGluZ0NsYXNzLT5jbGFzc0xvYWRlci0+dm0tPmJvb3RzdHJhcExvYWRlcikpOwotfQotCi12b2lkIEphdmFKSVQ6Omludm9rZVZpcnR1YWwodWludDE2IGluZGV4KSB7Ci0gIAotICBKYXZhQ29uc3RhbnRQb29sKiBjdHBJbmZvID0gY29tcGlsaW5nQ2xhc3MtPmN0cEluZm87Ci0gIENvbW1vbkNsYXNzKiBjbCA9IDA7Ci0gIEphdmFNZXRob2QqIG1ldGggPSAwOwotICBjdHBJbmZvLT5pbmZvT2ZNZXRob2QoaW5kZXgsIEFDQ19WSVJUVUFMLCBjbCwgbWV0aCk7Ci0gIGJvb2wgY2FuQmVEaXJlY3QgPSBmYWxzZTsKLSAgVmFsdWUqIHZhbCA9IE5VTEw7ICAvLyBUaGUgcmV0dXJuIGZyb20gdGhlIG1ldGhvZC4KLSAKLSAgaWYgKChjbCAmJiBpc0ZpbmFsKGNsLT5hY2Nlc3MpKSB8fCAKLSAgICAgIChtZXRoICYmIChpc0ZpbmFsKG1ldGgtPmFjY2VzcykgfHwgaXNQcml2YXRlKG1ldGgtPmFjY2VzcykpKSkgewotICAgIGNhbkJlRGlyZWN0ID0gdHJ1ZTsKLSAgfQotCi0gIGlmIChtZXRoICYmIGlzSW50ZXJmYWNlKG1ldGgtPmNsYXNzRGVmLT5hY2Nlc3MpKSB7Ci0gICAgLy8gVGhpcyBjYW4gaGFwcGVuIGJlY2F1c2Ugd2UgY29tcHV0ZSBtaXJhbmRhIG1ldGhvZHMgYmVmb3JlIHJlc29sdmluZwotICAgIC8vIGludGVyZmFjZXMuCi0JCXJldHVybiBpbnZva2VJbnRlcmZhY2UoaW5kZXgpOwotCX0KLSAKLSAgY29uc3QgVVRGOCogbmFtZSA9IDA7Ci0gIFNpZ25kZWYqIHNpZ25hdHVyZSA9IGN0cEluZm8tPmluZm9PZkludGVyZmFjZU9yVmlydHVhbE1ldGhvZChpbmRleCwgbmFtZSk7Ci0gCi0gIGlmIChUaGVDb21waWxlci0+aXNTdGF0aWNDb21waWxpbmcoKSkgewotICAgIFZhbHVlKiBvYmogPSBvYmplY3RTdGFja1tzdGFjay5zaXplKCkgLSBzaWduYXR1cmUtPm5iQXJndW1lbnRzIC0gMV07Ci0gICAgSmF2YU9iamVjdCogc291cmNlID0gVGhlQ29tcGlsZXItPmdldEZpbmFsT2JqZWN0KG9iaik7Ci0gICAgaWYgKHNvdXJjZSkgewotICAgICAgY2FuQmVEaXJlY3QgPSB0cnVlOwotICAgICAgQ29tbW9uQ2xhc3MqIHNvdXJjZUNsYXNzID0gSmF2YU9iamVjdDo6Z2V0Q2xhc3Moc291cmNlKTsKLSAgICAgIENsYXNzKiBsb29rdXAgPSBzb3VyY2VDbGFzcy0+aXNBcnJheSgpID8gc291cmNlQ2xhc3MtPnN1cGVyIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlQ2xhc3MtPmFzQ2xhc3MoKTsKLSAgICAgIG1ldGggPSBsb29rdXAtPmxvb2t1cE1ldGhvZERvbnRUaHJvdyhuYW1lLCBzaWduYXR1cmUtPmtleU5hbWUsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIDApOwotICAgIH0KLSAgICBDb21tb25DbGFzcyogdW5pcXVlID0gVGhlQ29tcGlsZXItPmdldFVuaXF1ZUJhc2VDbGFzcyhjbCk7Ci0gICAgaWYgKHVuaXF1ZSkgewotICAgICAgY2FuQmVEaXJlY3QgPSB0cnVlOwotICAgICAgQ2xhc3MqIGxvb2t1cCA9IHVuaXF1ZS0+aXNBcnJheSgpID8gdW5pcXVlLT5zdXBlciA6IHVuaXF1ZS0+YXNDbGFzcygpOwotICAgICAgbWV0aCA9IGxvb2t1cC0+bG9va3VwTWV0aG9kRG9udFRocm93KG5hbWUsIHNpZ25hdHVyZS0+a2V5TmFtZSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgMCk7Ci0gICAgfQotICB9Ci0gCi0gIFR5cGVkZWYqIHJldFR5cGVkZWYgPSBzaWduYXR1cmUtPmdldFJldHVyblR5cGUoKTsKLSAgc3RkOjp2ZWN0b3I8VmFsdWUqPiBhcmdzOyAvLyBzaXplID0gW3NpZ25hdHVyZS0+bmJJbiArIDNdOwotICBMTFZNU2lnbmF0dXJlSW5mbyogTFNJID0gVGhlQ29tcGlsZXItPmdldFNpZ25hdHVyZUluZm8oc2lnbmF0dXJlKTsKLSAgY29uc3QgbGx2bTo6RnVuY3Rpb25UeXBlKiB2aXJ0dWFsVHlwZSA9IExTSS0+Z2V0VmlydHVhbFR5cGUoKTsKLSAgRnVuY3Rpb25UeXBlOjpwYXJhbV9pdGVyYXRvciBpdCAgPSB2aXJ0dWFsVHlwZS0+cGFyYW1fZW5kKCk7Ci0gIGNvbnN0IGxsdm06OlR5cGUqIHJldFR5cGUgPSB2aXJ0dWFsVHlwZS0+Z2V0UmV0dXJuVHlwZSgpOwotCi0gIGJvb2wgbmVlZHNJbml0ID0gZmFsc2U7Ci0gIGlmIChjYW5CZURpcmVjdCAmJiBtZXRoICYmICFUaGVDb21waWxlci0+bmVlZHNDYWxsYmFjayhtZXRoLCAmbmVlZHNJbml0KSkgewotICAgIG1ha2VBcmdzKGl0LCBpbmRleCwgYXJncywgc2lnbmF0dXJlLT5uYkFyZ3VtZW50cyArIDEpOwotICAgIEpJVFZlcmlmeU51bGwoYXJnc1swXSk7Ci0gICAgdmFsID0gaW52b2tlKFRoZUNvbXBpbGVyLT5nZXRNZXRob2QobWV0aCksIGFyZ3MsICIiLCBjdXJyZW50QmxvY2spOwotICB9IGVsc2UgewotCi0gICAgQmFzaWNCbG9jayogZW5kQmxvY2sgPSAwOwotICAgIFBISU5vZGUqIG5vZGUgPSAwOwotI2lmIDAKLSAgICAvLyBUT0RPOiBlbmFibGUgdGhpcyBvbmx5IHdoZW4gaW5saW5pbmc/Ci0gICAgaWYgKG1ldGggJiYgIWlzQWJzdHJhY3QobWV0aC0+YWNjZXNzKSkgewotICAgICAgVmFsdWUqIGNsID0gQ2FsbEluc3Q6OkNyZWF0ZShpbnRyaW5zaWNzLT5HZXRDbGFzc0Z1bmN0aW9uLCBhcmdzWzBdLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgICAgIFZhbHVlKiBjbDIgPSBpbnRyaW5zaWNzLT5nZXROYXRpdmVDbGFzcyhtZXRoLT5jbGFzc0RlZik7Ci0gICAgICBpZiAoY2wyLT5nZXRUeXBlKCkgIT0gaW50cmluc2ljcy0+SmF2YUNvbW1vbkNsYXNzVHlwZSkgewotICAgICAgICBjbDIgPSBuZXcgQml0Q2FzdEluc3QoY2wyLCBpbnRyaW5zaWNzLT5KYXZhQ29tbW9uQ2xhc3NUeXBlLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgIH0KLQotICAgICAgVmFsdWUqIHRlc3QgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfRVEsIGNsLCBjbDIsICIiKTsKLQotICAgICAgQmFzaWNCbG9jayogdHJ1ZUJsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygidHJ1ZSB2aXJ0dWFsIGludm9rZSIpOwotICAgICAgQmFzaWNCbG9jayogZmFsc2VCbG9jayA9IGNyZWF0ZUJhc2ljQmxvY2soImZhbHNlIHZpcnR1YWwgaW52b2tlIik7Ci0gICAgICBlbmRCbG9jayA9IGNyZWF0ZUJhc2ljQmxvY2soImVuZCB2aXJ0dWFsIGludm9rZSIpOwotICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKHRydWVCbG9jaywgZmFsc2VCbG9jaywgdGVzdCwgY3VycmVudEJsb2NrKTsKLSAgICAgIGN1cnJlbnRCbG9jayA9IHRydWVCbG9jazsKLSAgICAgIFZhbHVlKiByZXMgPSAwOwotICAgICAgaWYgKGNhbkJlSW5saW5lZChtZXRoKSkgewotICAgICAgICByZXMgPSBpbnZva2VJbmxpbmUobWV0aCwgYXJncyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBGdW5jdGlvbiogZnVuYyA9IGludHJpbnNpY3MtPmdldE1ldGhvZChtZXRoKTsKLSAgICAgICAgcmVzID0gaW52b2tlKGZ1bmMsIGFyZ3MsICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgfQotICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKGVuZEJsb2NrLCBjdXJyZW50QmxvY2spOwotICAgICAgaWYgKHJldFR5cGUgIT0gVHlwZTo6Z2V0Vm9pZFR5KCpsbHZtQ29udGV4dCkpIHsKLSAgICAgICAgbm9kZSA9IFBISU5vZGU6OkNyZWF0ZSh2aXJ0dWFsVHlwZS0+Z2V0UmV0dXJuVHlwZSgpLCAiIiwgZW5kQmxvY2spOwotICAgICAgICBub2RlLT5hZGRJbmNvbWluZyhyZXMsIGN1cnJlbnRCbG9jayk7Ci0gICAgICB9Ci0gICAgICBjdXJyZW50QmxvY2sgPSBmYWxzZUJsb2NrOwotICAgIH0KLSNlbmRpZgotCi0gICAgVmFsdWUqIGluZGV4ZXMyWzJdOwotICAgIGluZGV4ZXMyWzBdID0gaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvOwotCi0gICAgaWYgKG1ldGgpIHsKLSAgICAgIExMVk1NZXRob2RJbmZvKiBMTUkgPSBUaGVDb21waWxlci0+Z2V0TWV0aG9kSW5mbyhtZXRoKTsKLSAgICAgIENvbnN0YW50KiBPZmZzZXQgPSBMTUktPmdldE9mZnNldCgpOwotICAgICAgaW5kZXhlczJbMV0gPSBPZmZzZXQ7Ci0gICAgfSBlbHNlIHsKLSAgIAotICAgICAgR2xvYmFsVmFyaWFibGUqIEdWID0gbmV3IEdsb2JhbFZhcmlhYmxlKCpsbHZtRnVuY3Rpb24tPmdldFBhcmVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxMaW5rYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPmNvbnN0YW50WmVybywgIiIpOwotICAgIAotICAgICAgQmFzaWNCbG9jayogcmVzb2x2ZVZpcnR1YWwgPSBjcmVhdGVCYXNpY0Jsb2NrKCJyZXNvbHZlVmlydHVhbCIpOwotICAgICAgQmFzaWNCbG9jayogZW5kUmVzb2x2ZVZpcnR1YWwgPSBjcmVhdGVCYXNpY0Jsb2NrKCJlbmRSZXNvbHZlVmlydHVhbCIpOwotICAgICAgUEhJTm9kZSogbm9kZSA9IFBISU5vZGU6OkNyZWF0ZShUeXBlOjpnZXRJbnQzMlR5KCpsbHZtQ29udGV4dCksICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRSZXNvbHZlVmlydHVhbCk7Ci0KLSAgICAgIFZhbHVlKiBsb2FkID0gbmV3IExvYWRJbnN0KEdWLCAiIiwgZmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0gICAgICBWYWx1ZSogdGVzdCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9FUSwgbG9hZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPmNvbnN0YW50WmVybywgIiIpOwotICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKHJlc29sdmVWaXJ0dWFsLCBlbmRSZXNvbHZlVmlydHVhbCwgdGVzdCwgY3VycmVudEJsb2NrKTsKLSAgICAgIG5vZGUtPmFkZEluY29taW5nKGxvYWQsIGN1cnJlbnRCbG9jayk7Ci0gICAgICBjdXJyZW50QmxvY2sgPSByZXNvbHZlVmlydHVhbDsKLSAgICAgIHN0ZDo6dmVjdG9yPFZhbHVlKj4gQXJnczsKLSAgICAgIEFyZ3MucHVzaF9iYWNrKFRoZUNvbXBpbGVyLT5nZXROYXRpdmVDbGFzcyhjb21waWxpbmdDbGFzcykpOwotICAgICAgQXJncy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KCpsbHZtQ29udGV4dCksIGluZGV4KSk7Ci0gICAgICBBcmdzLnB1c2hfYmFjayhHVik7Ci0gICAgICBWYWx1ZSogdGFyZ2V0T2JqZWN0ID0gZ2V0VGFyZ2V0KHNpZ25hdHVyZSk7Ci0gICAgICBBcmdzLnB1c2hfYmFjayhuZXcgTG9hZEluc3QoCi0gICAgICAgICAgdGFyZ2V0T2JqZWN0LCAiIiwgVGhlQ29tcGlsZXItPnVzZUNvb3BlcmF0aXZlR0MoKSwgY3VycmVudEJsb2NrKSk7Ci0gICAgICBsb2FkID0gaW52b2tlKGludHJpbnNpY3MtPlZpcnR1YWxMb29rdXBGdW5jdGlvbiwgQXJncywgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICBub2RlLT5hZGRJbmNvbWluZyhsb2FkLCBjdXJyZW50QmxvY2spOwotICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKGVuZFJlc29sdmVWaXJ0dWFsLCBjdXJyZW50QmxvY2spOwotICAgICAgY3VycmVudEJsb2NrID0gZW5kUmVzb2x2ZVZpcnR1YWw7Ci0KLSAgICAgIGluZGV4ZXMyWzFdID0gbm9kZTsKLSAgICB9Ci0KLSAgICBtYWtlQXJncyhpdCwgaW5kZXgsIGFyZ3MsIHNpZ25hdHVyZS0+bmJBcmd1bWVudHMgKyAxKTsKLSAgICBKSVRWZXJpZnlOdWxsKGFyZ3NbMF0pOwotICAgIFZhbHVlKiBWVCA9IENhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+R2V0VlRGdW5jdGlvbiwgYXJnc1swXSwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotIAotICAgIFZhbHVlKiBGdW5jUHRyID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShWVCwgaW5kZXhlczIsIGluZGV4ZXMyICsgMiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gICAgCi0gICAgVmFsdWUqIEZ1bmMgPSBuZXcgTG9hZEluc3QoRnVuY1B0ciwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIAotICAgIEZ1bmMgPSBuZXcgQml0Q2FzdEluc3QoRnVuYywgTFNJLT5nZXRWaXJ0dWFsUHRyVHlwZSgpLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICB2YWwgPSBpbnZva2UoRnVuYywgYXJncywgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIAotICAgIGlmIChlbmRCbG9jaykgewotICAgICAgaWYgKG5vZGUpIHsKLSAgICAgICAgbm9kZS0+YWRkSW5jb21pbmcodmFsLCBjdXJyZW50QmxvY2spOwotICAgICAgICB2YWwgPSBub2RlOwotICAgICAgfQotICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKGVuZEJsb2NrLCBjdXJyZW50QmxvY2spOwotICAgICAgY3VycmVudEJsb2NrID0gZW5kQmxvY2s7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHJldFR5cGUgIT0gVHlwZTo6Z2V0Vm9pZFR5KCpsbHZtQ29udGV4dCkpIHsKLSAgICBpZiAocmV0VHlwZSA9PSBpbnRyaW5zaWNzLT5KYXZhT2JqZWN0VHlwZSkgewotICAgICAgSm5qdm1DbGFzc0xvYWRlciogSkNMID0gY29tcGlsaW5nQ2xhc3MtPmNsYXNzTG9hZGVyOwotICAgICAgcHVzaCh2YWwsIGZhbHNlLCBzaWduYXR1cmUtPmdldFJldHVyblR5cGUoKS0+ZmluZEFzc29jQ2xhc3MoSkNMKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHB1c2godmFsLCByZXRUeXBlZGVmLT5pc1Vuc2lnbmVkKCkpOwotICAgICAgaWYgKHJldFR5cGUgPT0gVHlwZTo6Z2V0RG91YmxlVHkoKmxsdm1Db250ZXh0KSB8fCByZXRUeXBlID09IFR5cGU6OmdldEludDY0VHkoKmxsdm1Db250ZXh0KSkgewotICAgICAgICBwdXNoKGludHJpbnNpY3MtPmNvbnN0YW50WmVybywgZmFsc2UpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1sbHZtOjpWYWx1ZSogSmF2YUpJVDo6Z2V0TXV0YXRvclRocmVhZFB0cigpIHsKLSAgVmFsdWUqIEZyYW1lQWRkciA9IENhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+bGx2bV9mcmFtZWFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWludHJpbnNpY3MtPmNvbnN0YW50WmVybywgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIFZhbHVlKiB0aHJlYWRJZCA9IG5ldyBQdHJUb0ludEluc3QoRnJhbWVBZGRyLCBpbnRyaW5zaWNzLT5wb2ludGVyU2l6ZVR5cGUsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJIGN1cnJlbnRCbG9jayk7Ci0gIHRocmVhZElkID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZCh0aHJlYWRJZCwgaW50cmluc2ljcy0+Y29uc3RhbnRUaHJlYWRJRE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgY3VycmVudEJsb2NrKTsKLSAgdGhyZWFkSWQgPSBuZXcgSW50VG9QdHJJbnN0KHRocmVhZElkLCBpbnRyaW5zaWNzLT5NdXRhdG9yVGhyZWFkVHlwZSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0KLSAgcmV0dXJuIHRocmVhZElkOwotfQotCi1sbHZtOjpWYWx1ZSogSmF2YUpJVDo6Z2V0RG9ZaWVsZFB0cihsbHZtOjpWYWx1ZSogbXV0YXRvclRocmVhZFB0cikgeyAKLQlWYWx1ZSogR0VQWzNdID0geyBpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sCi0JCQkJCQkJCQkJaW50cmluc2ljcy0+T2Zmc2V0VGhyZWFkSW5NdXRhdG9yVGhyZWFkQ29uc3RhbnQsCi0JCQkJCQkJCQkJaW50cmluc2ljcy0+T2Zmc2V0RG9ZaWVsZEluVGhyZWFkQ29uc3RhbnQgfTsKLSAgICAKLQlyZXR1cm4gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShtdXRhdG9yVGhyZWFkUHRyLCBHRVAsIEdFUCArIDMsICIiLCBjdXJyZW50QmxvY2spOwotfQotCi1sbHZtOjpWYWx1ZSogSmF2YUpJVDo6Z2V0Q1hYRXhjZXB0aW9uUHRyKGxsdm06OlZhbHVlKiBtdXRhdG9yVGhyZWFkUHRyKSB7IAotCVZhbHVlKiBHRVBbM10gPSB7IGludHJpbnNpY3MtPmNvbnN0YW50WmVybywKLQkJCQkJCQkJCQlpbnRyaW5zaWNzLT5PZmZzZXRUaHJlYWRJbk11dGF0b3JUaHJlYWRDb25zdGFudCwKLQkJCQkJCQkJCQlpbnRyaW5zaWNzLT5PZmZzZXRDWFhFeGNlcHRpb25JblRocmVhZENvbnN0YW50IH07Ci0gICAgCi0JcmV0dXJuIEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUobXV0YXRvclRocmVhZFB0ciwgR0VQLCBHRVAgKyAzLCAiIiwgY3VycmVudEJsb2NrKTsKLX0KLQotbGx2bTo6VmFsdWUqIEphdmFKSVQ6OmdldFBlbmRpbmdFeGNlcHRpb25QdHIobGx2bTo6VmFsdWUqIG11dGF0b3JUaHJlYWRQdHIpIHsgCi0JVmFsdWUqIEdFUFszXSA9IHsgaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLAotCQkJCQkJCQkJCWludHJpbnNpY3MtPk9mZnNldFRocmVhZEluTXV0YXRvclRocmVhZENvbnN0YW50LAotCQkJCQkJCQkJCWludHJpbnNpY3MtPk9mZnNldFBlbmRpbmdFeGNlcHRpb25JblRocmVhZENvbnN0YW50IH07Ci0gICAgCi0JVmFsdWUqIHJlcyA9IEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUobXV0YXRvclRocmVhZFB0ciwgR0VQLCBHRVAgKyAzLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgcmV0dXJuIG5ldyBCaXRDYXN0SW5zdChyZXMsIGludHJpbnNpY3MtPkphdmFPYmplY3RQdHJUeXBlLCAiIiwgY3VycmVudEJsb2NrKTsKLX0KLQotbGx2bTo6VmFsdWUqIEphdmFKSVQ6OmdldEphdmFUaHJlYWRQdHIobGx2bTo6VmFsdWUqIG11dGF0b3JUaHJlYWRQdHIpIHsgCi0JVmFsdWUqIEdFUFszXSA9IHsgaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLAotCQkJCQkJCQkJCWludHJpbnNpY3MtPk9mZnNldFRocmVhZEluTXV0YXRvclRocmVhZENvbnN0YW50LAotCQkJCQkJCQkJCWludHJpbnNpY3MtPk9mZnNldFZNRGF0YUluVGhyZWFkQ29uc3RhbnQgfTsKLSAgICAKLQlWYWx1ZSAqcmVzID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShtdXRhdG9yVGhyZWFkUHRyLCBHRVAsIEdFUCArIDMsICIiLCBjdXJyZW50QmxvY2spOwotCXJlcyA9IG5ldyBMb2FkSW5zdChyZXMsICIiLCBjdXJyZW50QmxvY2spOwotICByZXR1cm4gbmV3IEJpdENhc3RJbnN0KHJlcywgaW50cmluc2ljcy0+SmF2YVRocmVhZFR5cGUsICIiLCBjdXJyZW50QmxvY2spOwotfQotCi1sbHZtOjpWYWx1ZSogSmF2YUpJVDo6Z2V0Sk5JRW52UHRyKGxsdm06OlZhbHVlKiBqYXZhVGhyZWFkUHRyKSB7IAotCVZhbHVlKiBHRVBbMl0gPSB7IGludHJpbnNpY3MtPmNvbnN0YW50WmVybywKLQkJCQkJCQkJCQlpbnRyaW5zaWNzLT5PZmZzZXRKTklJbkphdmFUaHJlYWRDb25zdGFudCB9OwotICAgIAotCVZhbHVlKiByZXMgPSBHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlKGphdmFUaHJlYWRQdHIsIEdFUCwgR0VQICsgMiwgIiIsIGN1cnJlbnRCbG9jayk7Ci0JcmV0dXJuIG5ldyBCaXRDYXN0SW5zdChyZXMsIGludHJpbnNpY3MtPnB0clR5cGUsICIiLCBjdXJyZW50QmxvY2spOwotfQotCi0KLWV4dGVybiAiQyIgdm9pZCBqM1Rocm93RXhjZXB0aW9uRnJvbUpJVCgpOwotCi1sbHZtOjpGdW5jdGlvbiogSmF2YUpJVDo6bmF0aXZlQ29tcGlsZShpbnRwdHJfdCBuYXRQdHIpIHsKLSAgCi0gIFBSSU5UX0RFQlVHKEpOSlZNX0NPTVBJTEUsIDEsIENPTE9SX05PUk1BTCwgIm5hdGl2ZSBjb21waWxlICVzLiVzXG4iLAotICAgICAgICAgICAgICBVVEY4QnVmZmVyKGNvbXBpbGluZ0NsYXNzLT5uYW1lKS5jU3RyaW5nKCksCi0gICAgICAgICAgICAgIFVURjhCdWZmZXIoY29tcGlsaW5nTWV0aG9kLT5uYW1lKS5jU3RyaW5nKCkpOwotICAKLSAgYm9vbCBzdGF0ID0gaXNTdGF0aWMoY29tcGlsaW5nTWV0aG9kLT5hY2Nlc3MpOwotCi0gIGNvbnN0IEZ1bmN0aW9uVHlwZSAqZnVuY1R5cGUgPSBsbHZtRnVuY3Rpb24tPmdldEZ1bmN0aW9uVHlwZSgpOwotICBjb25zdCBsbHZtOjpUeXBlKiByZXR1cm5UeXBlID0gZnVuY1R5cGUtPmdldFJldHVyblR5cGUoKTsKLSAgCi0gIGJvb2wgajMgPSBmYWxzZTsKLSAgCi0gIGNvbnN0IFVURjgqIGpuaUNvbnNDbE5hbWUgPSBjb21waWxpbmdDbGFzcy0+bmFtZTsKLSAgY29uc3QgVVRGOCogam5pQ29uc05hbWUgPSBjb21waWxpbmdNZXRob2QtPm5hbWU7Ci0gIGNvbnN0IFVURjgqIGpuaUNvbnNUeXBlID0gY29tcGlsaW5nTWV0aG9kLT50eXBlOwotICBzaW50MzIgY2xlbiA9IGpuaUNvbnNDbE5hbWUtPnNpemU7Ci0gIHNpbnQzMiBtbmxlbiA9IGpuaUNvbnNOYW1lLT5zaXplOwotICBzaW50MzIgbXRsZW4gPSBqbmlDb25zVHlwZS0+c2l6ZTsKLQotICBtdm06OlRocmVhZEFsbG9jYXRvciBhbGxvY2F0b3I7Ci0gIGNoYXIqIGZ1bmN0aW9uTmFtZSA9IChjaGFyKilhbGxvY2F0b3IuQWxsb2NhdGUoCi0gICAgICAzICsgSk5JX05BTUVfUFJFX0xFTiArICgobW5sZW4gKyBjbGVuICsgbXRsZW4pIDw8IDMpKTsKLSAgCi0gIGlmICghbmF0UHRyKSB7Ci0gICAgbmF0UHRyID0gY29tcGlsaW5nQ2xhc3MtPmNsYXNzTG9hZGVyLT5uYXRpdmVMb29rdXAoY29tcGlsaW5nTWV0aG9kLCBqMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbk5hbWUpOwotICB9Ci0gIAotICBpZiAoIW5hdFB0ciAmJiAhVGhlQ29tcGlsZXItPmlzU3RhdGljQ29tcGlsaW5nKCkpIHsKLSAgICBjdXJyZW50QmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJzdGFydCIpOwotICAgIENhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+VGhyb3dFeGNlcHRpb25Gcm9tSklURnVuY3Rpb24sICIiLCBjdXJyZW50QmxvY2spOwotICAgIGlmIChyZXR1cm5UeXBlICE9IFR5cGU6OmdldFZvaWRUeSgqbGx2bUNvbnRleHQpKSB7Ci0gICAgICBSZXR1cm5JbnN0OjpDcmVhdGUoKmxsdm1Db250ZXh0LCBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKHJldHVyblR5cGUpLCBjdXJyZW50QmxvY2spOwotICAgIH0gZWxzZSB7Ci0gICAgICBSZXR1cm5JbnN0OjpDcmVhdGUoKmxsdm1Db250ZXh0LCBjdXJyZW50QmxvY2spOwotICAgIH0KLSAgCi0gICAgUFJJTlRfREVCVUcoSk5KVk1fQ09NUElMRSwgMSwgQ09MT1JfTk9STUFMLCAiZW5kIG5hdGl2ZSBjb21waWxlICVzLiVzXG4iLAotICAgICAgICAgICAgICAgIFVURjhCdWZmZXIoY29tcGlsaW5nQ2xhc3MtPm5hbWUpLmNTdHJpbmcoKSwKLSAgICAgICAgICAgICAgICBVVEY4QnVmZmVyKGNvbXBpbGluZ01ldGhvZC0+bmFtZSkuY1N0cmluZygpKTsKLSAgCi0gICAgcmV0dXJuIGxsdm1GdW5jdGlvbjsKLSAgfQotICAKLSAgCi0gIEZ1bmN0aW9uKiBmdW5jID0gbGx2bUZ1bmN0aW9uOwotICBpZiAoajMpIHsKLSAgICBGdW5jdGlvbiogY2FsbGVlID0gRnVuY3Rpb246OkNyZWF0ZShsbHZtRnVuY3Rpb24tPmdldEZ1bmN0aW9uVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhbHVlOjpFeHRlcm5hbExpbmthZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1GdW5jdGlvbi0+Z2V0UGFyZW50KCkpOwotICAgIFRoZUNvbXBpbGVyLT5zZXRNZXRob2QoY2FsbGVlLCAodm9pZCopbmF0UHRyLCBmdW5jdGlvbk5hbWUpOwotICAgIGN1cnJlbnRCbG9jayA9IGNyZWF0ZUJhc2ljQmxvY2soInN0YXJ0Iik7Ci0gICAgc3RkOjp2ZWN0b3I8VmFsdWUqPiBhcmdzOwotICAgIGZvciAoRnVuY3Rpb246OmFyZ19pdGVyYXRvciBpID0gZnVuYy0+YXJnX2JlZ2luKCksIGUgPSBmdW5jLT5hcmdfZW5kKCk7Ci0gICAgICAgICBpICE9IGU7Ci0gICAgICAgICBpKyspIHsKLSAgICAgIGFyZ3MucHVzaF9iYWNrKGkpOwotICAgIH0KLSAgICBWYWx1ZSogcmVzID0gQ2FsbEluc3Q6OkNyZWF0ZSgKLSAgICAgICAgY2FsbGVlLCBhcmdzLmJlZ2luKCksIGFyZ3MuZW5kKCksICIiLCBjdXJyZW50QmxvY2spOwotICAgIGlmIChyZXR1cm5UeXBlICE9IFR5cGU6OmdldFZvaWRUeSgqbGx2bUNvbnRleHQpKSB7Ci0gICAgICBSZXR1cm5JbnN0OjpDcmVhdGUoKmxsdm1Db250ZXh0LCByZXMsIGN1cnJlbnRCbG9jayk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFJldHVybkluc3Q6OkNyZWF0ZSgqbGx2bUNvbnRleHQsIGN1cnJlbnRCbG9jayk7Ci0gICAgfQotICAgIHJldHVybiBsbHZtRnVuY3Rpb247Ci0gIH0KLQotCi0gIGN1cnJlbnRFeGNlcHRpb25CbG9jayA9IGVuZEV4Y2VwdGlvbkJsb2NrID0gMDsKLSAgY3VycmVudEJsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygic3RhcnQiKTsKLSAgZW5kQmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJlbmQgYmxvY2siKTsKLSAgCi0gIGlmIChyZXR1cm5UeXBlICE9IFR5cGU6OmdldFZvaWRUeSgqbGx2bUNvbnRleHQpKSB7Ci0gICAgZW5kTm9kZSA9IFBISU5vZGU6OkNyZWF0ZShyZXR1cm5UeXBlLCAiIiwgZW5kQmxvY2spOwotICB9Ci0gIAotICAvLyBBbGxvY2F0ZSBjdXJyZW50TG9jYWxJbmRleE51bWJlciBwb2ludGVyCi0gIFZhbHVlKiB0ZW1wID0gbmV3IEFsbG9jYUluc3QoVHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICBuZXcgU3RvcmVJbnN0KGludHJpbnNpY3MtPmNvbnN0YW50WmVybywgdGVtcCwgZmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0gIAotICAvLyBBbGxvY2F0ZSBvbGRDdXJyZW50TG9jYWxJbmRleE51bWJlciBwb2ludGVyCi0gIFZhbHVlKiBvbGRDTElOID0gbmV3IEFsbG9jYUluc3QoUG9pbnRlclR5cGU6OmdldFVucXVhbChUeXBlOjpnZXRJbnQzMlR5KCpsbHZtQ29udGV4dCkpLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICAKLSAgQ29uc3RhbnQqIHNpemVGID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KCpsbHZtQ29udGV4dCksIHNpemVvZihtdm06Oktub3duRnJhbWUpKTsKLSAgVmFsdWUqIEZyYW1lID0gbmV3IEFsbG9jYUluc3QoVHlwZTo6Z2V0SW50OFR5KCpsbHZtQ29udGV4dCksIHNpemVGLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgCi0gIHVpbnQzMiBuYXJncyA9IGZ1bmMtPmFyZ19zaXplKCkgKyAxICsgKHN0YXQgPyAxIDogMCk7IAotICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IG5hdGl2ZUFyZ3M7Ci0gIAotICAKLSAgVmFsdWUqIGpuaUVudiA9IGdldEpOSUVudlB0cihnZXRKYXZhVGhyZWFkUHRyKGdldE11dGF0b3JUaHJlYWRQdHIoKSkpOwotIAotICBuYXRpdmVBcmdzLnB1c2hfYmFjayhqbmlFbnYpOwotCi0gIHVpbnQzMiBpbmRleCA9IDA7Ci0gIGlmIChzdGF0KSB7Ci0gICAgVmFsdWUqIGNsID0gVGhlQ29tcGlsZXItPmdldEphdmFDbGFzc1B0cihjb21waWxpbmdDbGFzcyk7Ci0gICAgbmF0aXZlQXJncy5wdXNoX2JhY2soY2wpOwotICAgIGluZGV4ID0gMjsKLSAgfSBlbHNlIHsKLSAgICBpbmRleCA9IDE7Ci0gIH0KLSAgZm9yIChGdW5jdGlvbjo6YXJnX2l0ZXJhdG9yIGkgPSBmdW5jLT5hcmdfYmVnaW4oKTsgCi0gICAgICAgaW5kZXggPCBuYXJnczsgKytpLCArK2luZGV4KSB7Ci0gICAgCi0gICAgaWYgKGktPmdldFR5cGUoKSA9PSBpbnRyaW5zaWNzLT5KYXZhT2JqZWN0VHlwZSkgewotICAgICAgQmFzaWNCbG9jayogQkIgPSBjcmVhdGVCYXNpY0Jsb2NrKCIiKTsKLSAgICAgIEJhc2ljQmxvY2sqIE5vdFplcm8gPSBjcmVhdGVCYXNpY0Jsb2NrKCIiKTsKLSAgICAgIGNvbnN0IFR5cGUqIFR5ID0gUG9pbnRlclR5cGU6OmdldFVucXVhbChpbnRyaW5zaWNzLT5KYXZhT2JqZWN0VHlwZSk7Ci0gICAgICBQSElOb2RlKiBub2RlID0gUEhJTm9kZTo6Q3JlYXRlKFR5LCAiIiwgQkIpOwotCi0gICAgICBWYWx1ZSogdGVzdCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9FUSwgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPkphdmFPYmplY3ROdWxsQ29uc3RhbnQsICIiKTsKLQotICAgICAgbm9kZS0+YWRkSW5jb21pbmcoQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShUeSksIGN1cnJlbnRCbG9jayk7Ci0gICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoQkIsIE5vdFplcm8sIHRlc3QsIGN1cnJlbnRCbG9jayk7Ci0KLSAgICAgIGN1cnJlbnRCbG9jayA9IE5vdFplcm87Ci0KLSAgICAgIEluc3RydWN0aW9uKiB0ZW1wID0gbmV3IEFsbG9jYUluc3QoaW50cmluc2ljcy0+SmF2YU9iamVjdFR5cGUsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jLT5iZWdpbigpLT5nZXRUZXJtaW5hdG9yKCkpOwotICAgICAgaWYgKGkgPT0gZnVuYy0+YXJnX2JlZ2luKCkgJiYgIXN0YXQpIHsKLSAgICAgICAgdGhpcy0+dGhpc09iamVjdCA9IHRlbXA7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmIChUaGVDb21waWxlci0+dXNlQ29vcGVyYXRpdmVHQygpKSB7Ci0gICAgICAgIFZhbHVlKiBHQ0FyZ3NbMl0gPSB7IAotICAgICAgICAgIG5ldyBCaXRDYXN0SW5zdCh0ZW1wLCBpbnRyaW5zaWNzLT5wdHJQdHJUeXBlLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy0+YmVnaW4oKS0+Z2V0VGVybWluYXRvcigpKSwKLSAgICAgICAgICBpbnRyaW5zaWNzLT5jb25zdGFudFB0ck51bGwKLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIENhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+bGx2bV9nY19nY3Jvb3QsIEdDQXJncywgR0NBcmdzICsgMiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy0+YmVnaW4oKS0+Z2V0VGVybWluYXRvcigpKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgbmV3IFN0b3JlSW5zdChpLCB0ZW1wLCBmYWxzZSwgY3VycmVudEJsb2NrKTsKLSAgICAgIG5vZGUtPmFkZEluY29taW5nKHRlbXAsIGN1cnJlbnRCbG9jayk7Ci0gICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoQkIsIGN1cnJlbnRCbG9jayk7Ci0KLSAgICAgIGN1cnJlbnRCbG9jayA9IEJCOwotCi0gICAgICBuYXRpdmVBcmdzLnB1c2hfYmFjayhub2RlKTsKLSAgICB9IGVsc2UgewotICAgICAgbmF0aXZlQXJncy5wdXNoX2JhY2soaSk7Ci0gICAgfQotICB9Ci0gIAotICAKLSAgSW5zdHJ1Y3Rpb24qIFJlc3VsdE9iamVjdCA9IDA7Ci0gIGlmIChyZXR1cm5UeXBlID09IGludHJpbnNpY3MtPkphdmFPYmplY3RUeXBlKSB7Ci0gICAgUmVzdWx0T2JqZWN0ID0gbmV3IEFsbG9jYUluc3QoaW50cmluc2ljcy0+SmF2YU9iamVjdFR5cGUsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMtPmJlZ2luKCktPmJlZ2luKCkpOwotICAgIAotICAgIGlmIChUaGVDb21waWxlci0+dXNlQ29vcGVyYXRpdmVHQygpKSB7Ci0gICAgICAKLSAgICAgIFZhbHVlKiBHQ0FyZ3NbMl0gPSB7IAotICAgICAgICBuZXcgQml0Q2FzdEluc3QoUmVzdWx0T2JqZWN0LCBpbnRyaW5zaWNzLT5wdHJQdHJUeXBlLCAiIiwgY3VycmVudEJsb2NrKSwKLSAgICAgICAgaW50cmluc2ljcy0+Y29uc3RhbnRQdHJOdWxsCi0gICAgICB9OwotICAgICAgCi0gICAgICBDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPmxsdm1fZ2NfZ2Nyb290LCBHQ0FyZ3MsIEdDQXJncyArIDIsICIiLAotICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICAgIH0gZWxzZSB7Ci0gICAgICBuZXcgU3RvcmVJbnN0KGludHJpbnNpY3MtPkphdmFPYmplY3ROdWxsQ29uc3RhbnQsIFJlc3VsdE9iamVjdCwgIiIsCi0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gICAgfQotICB9Ci0gIAotICBWYWx1ZSogbmF0aXZlRnVuYyA9IFRoZUNvbXBpbGVyLT5nZXROYXRpdmVGdW5jdGlvbihjb21waWxpbmdNZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluYXRQdHIpOwotCi0gIGlmIChUaGVDb21waWxlci0+aXNTdGF0aWNDb21waWxpbmcoKSkgewotICAgIFZhbHVlKiBBcmcgPSBUaGVDb21waWxlci0+Z2V0TWV0aG9kSW5DbGFzcyhjb21waWxpbmdNZXRob2QpOyAKLSAgICAKLSAgICAvLyBJZiB0aGUgZ2xvYmFsIHZhcmlhYmxlIGlzIG51bGwsIHRoZW4gbG9hZCBpdC4KLSAgICBCYXNpY0Jsb2NrKiB1bmxvYWRlZEJsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygiIik7Ci0gICAgQmFzaWNCbG9jayogZW5kQmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCIiKTsKLSAgICBWYWx1ZSogdGVzdCA9IG5ldyBMb2FkSW5zdChuYXRpdmVGdW5jLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICBjb25zdCBsbHZtOjpUeXBlKiBUeSA9IHRlc3QtPmdldFR5cGUoKTsKLSAgICBQSElOb2RlKiBub2RlID0gUEhJTm9kZTo6Q3JlYXRlKFR5LCAiIiwgZW5kQmxvY2spOwotICAgIG5vZGUtPmFkZEluY29taW5nKHRlc3QsIGN1cnJlbnRCbG9jayk7Ci0gICAgVmFsdWUqIGNtcCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9FUSwgdGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50OjpnZXROdWxsVmFsdWUoVHkpLCAiIik7Ci0gICAgQnJhbmNoSW5zdDo6Q3JlYXRlKHVubG9hZGVkQmxvY2ssIGVuZEJsb2NrLCBjbXAsIGN1cnJlbnRCbG9jayk7Ci0gICAgY3VycmVudEJsb2NrID0gdW5sb2FkZWRCbG9jazsKLQotICAgIFZhbHVlKiByZXMgPSBDYWxsSW5zdDo6Q3JlYXRlKFRoZUNvbXBpbGVyLT5OYXRpdmVMb2FkZXIsIEFyZywgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLQotICAgIHJlcyA9IG5ldyBCaXRDYXN0SW5zdChyZXMsIFR5LCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICBuZXcgU3RvcmVJbnN0KHJlcywgbmF0aXZlRnVuYywgY3VycmVudEJsb2NrKTsKLSAgICBub2RlLT5hZGRJbmNvbWluZyhyZXMsIGN1cnJlbnRCbG9jayk7Ci0gICAgQnJhbmNoSW5zdDo6Q3JlYXRlKGVuZEJsb2NrLCBjdXJyZW50QmxvY2spOwotICAgIGN1cnJlbnRCbG9jayA9IGVuZEJsb2NrOwotICAgIG5hdGl2ZUZ1bmMgPSBub2RlOwotICB9Ci0KLSAgLy8gU3luY2hyb25pemUgYmVmb3JlIHNheWluZyB3ZSdyZSBlbnRlcmluZyBuYXRpdmUKLSAgaWYgKGlzU3luY2hybyhjb21waWxpbmdNZXRob2QtPmFjY2VzcykpCi0gICAgYmVnaW5TeW5jaHJvbml6ZSgpOwotICAKLSAgVmFsdWUqIEFyZ3M0WzNdID0geyB0ZW1wLCBvbGRDTElOLCBGcmFtZSB9OwotCi0gIENhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+U3RhcnRKTklGdW5jdGlvbiwgQXJnczQsIEFyZ3M0ICsgMywgIiIsCi0gICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgCi0gIFZhbHVlKiByZXN1bHQgPSBsbHZtOjpDYWxsSW5zdDo6Q3JlYXRlKG5hdGl2ZUZ1bmMsIG5hdGl2ZUFyZ3MuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQXJncy5lbmQoKSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0KLSAgaWYgKHJldHVyblR5cGUgPT0gaW50cmluc2ljcy0+SmF2YU9iamVjdFR5cGUpIHsKLSAgICBjb25zdCBUeXBlKiBUeSA9IFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoaW50cmluc2ljcy0+SmF2YU9iamVjdFR5cGUpOwotICAgIENvbnN0YW50KiBDID0gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShUeSk7Ci0gICAgVmFsdWUqIGNtcCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9FUSwgcmVzdWx0LCBDLCAiIik7Ci0gICAgQmFzaWNCbG9jayogbG9hZEJsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygiIik7Ci0KLSAgICBlbmROb2RlLT5hZGRJbmNvbWluZyhpbnRyaW5zaWNzLT5KYXZhT2JqZWN0TnVsbENvbnN0YW50LCBjdXJyZW50QmxvY2spOwotICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShlbmRCbG9jaywgbG9hZEJsb2NrLCBjbXAsIGN1cnJlbnRCbG9jayk7Ci0KLSAgICBjdXJyZW50QmxvY2sgPSBsb2FkQmxvY2s7Ci0gICAgcmVzdWx0ID0gbmV3IExvYWRJbnN0KAotICAgICAgICByZXN1bHQsICIiLCBUaGVDb21waWxlci0+dXNlQ29vcGVyYXRpdmVHQygpLCBjdXJyZW50QmxvY2spOwotICAgIG5ldyBTdG9yZUluc3QocmVzdWx0LCBSZXN1bHRPYmplY3QsICIiLCBjdXJyZW50QmxvY2spOwotICAgIGVuZE5vZGUtPmFkZEluY29taW5nKHJlc3VsdCwgY3VycmVudEJsb2NrKTsKLQotICB9IGVsc2UgaWYgKHJldHVyblR5cGUgIT0gVHlwZTo6Z2V0Vm9pZFR5KCpsbHZtQ29udGV4dCkpIHsKLSAgICBlbmROb2RlLT5hZGRJbmNvbWluZyhyZXN1bHQsIGN1cnJlbnRCbG9jayk7Ci0gIH0KLSAgCi0gIEJyYW5jaEluc3Q6OkNyZWF0ZShlbmRCbG9jaywgY3VycmVudEJsb2NrKTsKLQotCi0gIGN1cnJlbnRCbG9jayA9IGVuZEJsb2NrOyAKLSAKLSAgVmFsdWUqIEFyZ3MyWzFdID0geyBvbGRDTElOIH07Ci0KLSAgQ2FsbEluc3Q6OkNyZWF0ZShpbnRyaW5zaWNzLT5FbmRKTklGdW5jdGlvbiwgQXJnczIsIEFyZ3MyICsgMSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIAotICAvLyBTeW5jaHJvbml6ZSBhZnRlciBsZWF2aW5nIG5hdGl2ZS4KLSAgaWYgKGlzU3luY2hybyhjb21waWxpbmdNZXRob2QtPmFjY2VzcykpCi0gICAgZW5kU3luY2hyb25pemUoKTsKLSAgCi0gIGlmIChyZXR1cm5UeXBlICE9IFR5cGU6OmdldFZvaWRUeSgqbGx2bUNvbnRleHQpKQotICAgIFJldHVybkluc3Q6OkNyZWF0ZSgqbGx2bUNvbnRleHQsIGVuZE5vZGUsIGN1cnJlbnRCbG9jayk7Ci0gIGVsc2UKLSAgICBSZXR1cm5JbnN0OjpDcmVhdGUoKmxsdm1Db250ZXh0LCBjdXJyZW50QmxvY2spOwotICAKLSAgUFJJTlRfREVCVUcoSk5KVk1fQ09NUElMRSwgMSwgQ09MT1JfTk9STUFMLCAiZW5kIG5hdGl2ZSBjb21waWxlICVzLiVzXG4iLAotICAgICAgICAgICAgICBVVEY4QnVmZmVyKGNvbXBpbGluZ0NsYXNzLT5uYW1lKS5jU3RyaW5nKCksCi0gICAgICAgICAgICAgIFVURjhCdWZmZXIoY29tcGlsaW5nTWV0aG9kLT5uYW1lKS5jU3RyaW5nKCkpOwotICAKLSAgcmV0dXJuIGxsdm1GdW5jdGlvbjsKLX0KLQotdm9pZCBKYXZhSklUOjptb25pdG9yRW50ZXIoVmFsdWUqIG9iaikgewotICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IGdlcDsKLSAgZ2VwLnB1c2hfYmFjayhpbnRyaW5zaWNzLT5jb25zdGFudFplcm8pOwotICBnZXAucHVzaF9iYWNrKGludHJpbnNpY3MtPkphdmFPYmplY3RMb2NrT2Zmc2V0Q29uc3RhbnQpOwotICBWYWx1ZSogbG9ja1B0ciA9IEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUob2JqLCBnZXAuYmVnaW4oKSwgZ2VwLmVuZCgpLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gIAotICBWYWx1ZSogbG9jayA9IG5ldyBMb2FkSW5zdChsb2NrUHRyLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgbG9jayA9IG5ldyBQdHJUb0ludEluc3QobG9jaywgaW50cmluc2ljcy0+cG9pbnRlclNpemVUeXBlLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgVmFsdWUqIE5vbkxvY2tCaXRzTWFzayA9IENvbnN0YW50SW50OjpnZXQoaW50cmluc2ljcy0+cG9pbnRlclNpemVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdm06OlRoaW5Mb2NrOjpOb25Mb2NrQml0c01hc2spOwotCi0gIGxvY2sgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQW5kKGxvY2ssIE5vbkxvY2tCaXRzTWFzaywgIiIsIGN1cnJlbnRCbG9jayk7Ci0KLSAgbG9ja1B0ciA9IG5ldyBCaXRDYXN0SW5zdChsb2NrUHRyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKGludHJpbnNpY3MtPnBvaW50ZXJTaXplVHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIFZhbHVlKiB0aHJlYWRJZCA9IGdldE11dGF0b3JUaHJlYWRQdHIoKTsKLSAgdGhyZWFkSWQgPSBuZXcgUHRyVG9JbnRJbnN0KHRocmVhZElkLCBpbnRyaW5zaWNzLT5wb2ludGVyU2l6ZVR5cGUsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgVmFsdWUqIG5ld1ZhbE1hc2sgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlT3IodGhyZWFkSWQsIGxvY2ssICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotCi0gIHN0ZDo6dmVjdG9yPFZhbHVlKj4gYXRvbWljQXJnczsKLSAgYXRvbWljQXJncy5wdXNoX2JhY2sobG9ja1B0cik7Ci0gIGF0b21pY0FyZ3MucHVzaF9iYWNrKGxvY2spOwotICBhdG9taWNBcmdzLnB1c2hfYmFjayhuZXdWYWxNYXNrKTsKLQotICAvLyBEbyB0aGUgYXRvbWljIGNvbXBhcmUgYW5kIHN3YXAuCi0gIFZhbHVlKiBhdG9taWMgPSBDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPmxsdm1fYXRvbWljX2xjc19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0b21pY0FyZ3MuYmVnaW4oKSwgYXRvbWljQXJncy5lbmQoKSwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gIAotICBWYWx1ZSogY21wID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX0VRLCBhdG9taWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jaywgIiIpOwotICAKLSAgQmFzaWNCbG9jayogT0sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJzeW5jaHJvbml6ZSBwYXNzZWQiKTsKLSAgQmFzaWNCbG9jayogTm90T0sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJzeW5jaHJvbml6ZSBkaWQgbm90IHBhc3MiKTsKLQotICBCcmFuY2hJbnN0OjpDcmVhdGUoT0ssIE5vdE9LLCBjbXAsIGN1cnJlbnRCbG9jayk7Ci0KLSAgLy8gVGhlIGF0b21pYyBjYXMgZGlkIG5vdCB3b3JrLgotICBjdXJyZW50QmxvY2sgPSBOb3RPSzsKLSAgQ2FsbEluc3Q6OkNyZWF0ZShpbnRyaW5zaWNzLT5BcXVpcmVPYmplY3RGdW5jdGlvbiwgb2JqLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgQnJhbmNoSW5zdDo6Q3JlYXRlKE9LLCBjdXJyZW50QmxvY2spOwotCi0gIGN1cnJlbnRCbG9jayA9IE9LOwotfQotCi12b2lkIEphdmFKSVQ6Om1vbml0b3JFeGl0KFZhbHVlKiBvYmopIHsKLSAgc3RkOjp2ZWN0b3I8VmFsdWUqPiBnZXA7Ci0gIGdlcC5wdXNoX2JhY2soaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvKTsKLSAgZ2VwLnB1c2hfYmFjayhpbnRyaW5zaWNzLT5KYXZhT2JqZWN0TG9ja09mZnNldENvbnN0YW50KTsKLSAgVmFsdWUqIGxvY2tQdHIgPSBHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlKG9iaiwgZ2VwLmJlZ2luKCksIGdlcC5lbmQoKSwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICBsb2NrUHRyID0gbmV3IEJpdENhc3RJbnN0KGxvY2tQdHIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoaW50cmluc2ljcy0+cG9pbnRlclNpemVUeXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgY3VycmVudEJsb2NrKTsKLSAgVmFsdWUqIGxvY2sgPSBuZXcgTG9hZEluc3QobG9ja1B0ciwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIFZhbHVlKiBOb25Mb2NrQml0c01hc2sgPSBDb25zdGFudEludDo6Z2V0KAotICAgICAgaW50cmluc2ljcy0+cG9pbnRlclNpemVUeXBlLCBtdm06OlRoaW5Mb2NrOjpOb25Mb2NrQml0c01hc2spOwotCi0gIFZhbHVlKiBsb2NrZWRNYXNrID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZCgKLSAgICAgIGxvY2ssIE5vbkxvY2tCaXRzTWFzaywgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIAotICBWYWx1ZSogdGhyZWFkSWQgPSBnZXRNdXRhdG9yVGhyZWFkUHRyKCk7Ci0gIHRocmVhZElkID0gbmV3IFB0clRvSW50SW5zdCh0aHJlYWRJZCwgaW50cmluc2ljcy0+cG9pbnRlclNpemVUeXBlLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gIAotICBWYWx1ZSogb2xkVmFsTWFzayA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVPcih0aHJlYWRJZCwgbG9ja2VkTWFzaywgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0KLSAgc3RkOjp2ZWN0b3I8VmFsdWUqPiBhdG9taWNBcmdzOwotICBhdG9taWNBcmdzLnB1c2hfYmFjayhsb2NrUHRyKTsKLSAgYXRvbWljQXJncy5wdXNoX2JhY2sob2xkVmFsTWFzayk7Ci0gIGF0b21pY0FyZ3MucHVzaF9iYWNrKGxvY2tlZE1hc2spOwotCi0gIC8vIERvIHRoZSBhdG9taWMgY29tcGFyZSBhbmQgc3dhcC4KLSAgVmFsdWUqIGF0b21pYyA9IENhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+bGx2bV9hdG9taWNfbGNzX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRvbWljQXJncy5iZWdpbigpLCBhdG9taWNBcmdzLmVuZCgpLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgCi0gIFZhbHVlKiBjbXAgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfRVEsIGF0b21pYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRWYWxNYXNrLCAiIik7Ci0gIAotICBCYXNpY0Jsb2NrKiBPSyA9IGNyZWF0ZUJhc2ljQmxvY2soInVuc3luY2hyb25pemUgcGFzc2VkIik7Ci0gIEJhc2ljQmxvY2sqIE5vdE9LID0gY3JlYXRlQmFzaWNCbG9jaygidW5zeW5jaHJvbml6ZSBkaWQgbm90IHBhc3MiKTsKLQotICBCcmFuY2hJbnN0OjpDcmVhdGUoT0ssIE5vdE9LLCBjbXAsIGN1cnJlbnRCbG9jayk7Ci0KLSAgLy8gVGhlIGF0b21pYyBjYXMgZGlkIG5vdCB3b3JrLgotICBjdXJyZW50QmxvY2sgPSBOb3RPSzsKLSAgQ2FsbEluc3Q6OkNyZWF0ZShpbnRyaW5zaWNzLT5SZWxlYXNlT2JqZWN0RnVuY3Rpb24sIG9iaiwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIEJyYW5jaEluc3Q6OkNyZWF0ZShPSywgY3VycmVudEJsb2NrKTsKLQotICBjdXJyZW50QmxvY2sgPSBPSzsKLX0KLQotdm9pZCBKYXZhSklUOjpiZWdpblN5bmNocm9uaXplKCkgewotICBWYWx1ZSogb2JqID0gMDsKLSAgaWYgKGlzVmlydHVhbChjb21waWxpbmdNZXRob2QtPmFjY2VzcykpIHsKLSAgICBhc3NlcnQodGhpc09iamVjdCAhPSBOVUxMICYmICJiZWdpblN5bmNocm9uaXplIHdpdGhvdXQgdGhpcyIpOwotICAgIG9iaiA9IG5ldyBMb2FkSW5zdCgKLSAgICAgICAgdGhpc09iamVjdCwgIiIsIFRoZUNvbXBpbGVyLT51c2VDb29wZXJhdGl2ZUdDKCksIGN1cnJlbnRCbG9jayk7Ci0gIH0gZWxzZSB7Ci0gICAgb2JqID0gVGhlQ29tcGlsZXItPmdldEphdmFDbGFzc1B0cihjb21waWxpbmdDbGFzcyk7Ci0gICAgb2JqID0gbmV3IExvYWRJbnN0KG9iaiwgIiIsIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICB9Ci0gIG1vbml0b3JFbnRlcihvYmopOwotfQotCi12b2lkIEphdmFKSVQ6OmVuZFN5bmNocm9uaXplKCkgewotICBWYWx1ZSogb2JqID0gMDsKLSAgaWYgKGlzVmlydHVhbChjb21waWxpbmdNZXRob2QtPmFjY2VzcykpIHsKLSAgICBhc3NlcnQodGhpc09iamVjdCAhPSBOVUxMICYmICJlbmRTeW5jaHJvbml6ZSB3aXRob3V0IHRoaXMiKTsKLSAgICBvYmogPSBuZXcgTG9hZEluc3QoCi0gICAgICAgIHRoaXNPYmplY3QsICIiLCBUaGVDb21waWxlci0+dXNlQ29vcGVyYXRpdmVHQygpLCBjdXJyZW50QmxvY2spOwotICB9IGVsc2UgewotICAgIG9iaiA9IFRoZUNvbXBpbGVyLT5nZXRKYXZhQ2xhc3NQdHIoY29tcGlsaW5nQ2xhc3MpOwotICAgIG9iaiA9IG5ldyBMb2FkSW5zdChvYmosICIiLCBmYWxzZSwgY3VycmVudEJsb2NrKTsKLSAgfQotICBtb25pdG9yRXhpdChvYmopOwotfQotCi0KLXN0YXRpYyB2b2lkIHJlbW92ZVVudXNlZExvY2FscyhzdGQ6OnZlY3RvcjxBbGxvY2FJbnN0Kj4mIGxvY2FscykgewotICBmb3IgKHN0ZDo6dmVjdG9yPEFsbG9jYUluc3QqPjo6aXRlcmF0b3IgaSA9IGxvY2Fscy5iZWdpbigpLAotICAgICAgIGUgPSBsb2NhbHMuZW5kKCk7IGkgIT0gZTsgKytpKSB7Ci0gICAgQWxsb2NhSW5zdCogdGVtcCA9ICppOwotICAgIHVuc2lnbmVkIHVzZXMgPSB0ZW1wLT5nZXROdW1Vc2VzKCk7Ci0gICAgaWYgKCF1c2VzKSB7Ci0gICAgICB0ZW1wLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICB9IGVsc2UgaWYgKHVzZXMgPT0gMSAmJiBkeW5fY2FzdDxTdG9yZUluc3Q+KCoodGVtcC0+dXNlX2JlZ2luKCkpKSkgewotICAgICAgZHluX2Nhc3Q8U3RvcmVJbnN0PigqKHRlbXAtPnVzZV9iZWdpbigpKSktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgdGVtcC0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgfQotICB9Ci19Ci0gIAotc3RhdGljIHZvaWQgcmVtb3ZlVW51c2VkT2JqZWN0cyhzdGQ6OnZlY3RvcjxBbGxvY2FJbnN0Kj4mIG9iamVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEozSW50cmluc2ljcyogaW50cmluc2ljcywgYm9vbCBjb29wKSB7Ci0gIGZvciAoc3RkOjp2ZWN0b3I8QWxsb2NhSW5zdCo+OjppdGVyYXRvciBpID0gb2JqZWN0cy5iZWdpbigpLAotICAgICAgIGUgPSBvYmplY3RzLmVuZCgpOyBpICE9IGU7ICsraSkgewotICAgIEFsbG9jYUluc3QqIHRlbXAgPSAqaTsKLSAgICB1bnNpZ25lZCB1c2VzID0gdGVtcC0+Z2V0TnVtVXNlcygpOwotICAgIGlmICghdXNlcykgewotICAgICAgdGVtcC0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgfSBlbHNlIGlmICh1c2VzID09IDEgJiYgZHluX2Nhc3Q8U3RvcmVJbnN0PigqKHRlbXAtPnVzZV9iZWdpbigpKSkpIHsKLSAgICAgIGR5bl9jYXN0PFN0b3JlSW5zdD4oKih0ZW1wLT51c2VfYmVnaW4oKSkpLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgIHRlbXAtPmVyYXNlRnJvbVBhcmVudCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoY29vcCkgewotICAgICAgICBJbnN0cnVjdGlvbiogSSA9IG5ldyBCaXRDYXN0SW5zdCh0ZW1wLCBpbnRyaW5zaWNzLT5wdHJQdHJUeXBlLCAiIik7Ci0gICAgICAgIEktPmluc2VydEFmdGVyKHRlbXApOwotICAgICAgICBWYWx1ZSogR0NBcmdzWzJdID0geyBJLCBpbnRyaW5zaWNzLT5jb25zdGFudFB0ck51bGwgfTsKLSAgICAgICAgSW5zdHJ1Y3Rpb24qIEMgPSBDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPmxsdm1fZ2NfZ2Nyb290LCBHQ0FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0FyZ3MgKyAyLCAiIik7Ci0gICAgICAgIEMtPmluc2VydEFmdGVyKEkpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1JbnN0cnVjdGlvbiogSmF2YUpJVDo6aW5saW5lQ29tcGlsZShCYXNpY0Jsb2NrKiYgY3VyQkIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrKiBlbmRFeEJsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VmFsdWUqPiYgYXJncykgewotICBEYmdTdWJwcm9ncmFtID0gVGhlQ29tcGlsZXItPkdldERiZ1N1YnByb2dyYW0oY29tcGlsaW5nTWV0aG9kKTsKLQotICBQUklOVF9ERUJVRyhKTkpWTV9DT01QSUxFLCAxLCBDT0xPUl9OT1JNQUwsICJpbmxpbmUgY29tcGlsZSAlcy4lc1xuIiwKLSAgICAgICAgICAgICAgVVRGOEJ1ZmZlcihjb21waWxpbmdDbGFzcy0+bmFtZSkuY1N0cmluZygpLAotICAgICAgICAgICAgICBVVEY4QnVmZmVyKGNvbXBpbGluZ01ldGhvZC0+bmFtZSkuY1N0cmluZygpKTsKLSAgCi0gIEF0dHJpYnV0KiBjb2RlQXR0ID0gY29tcGlsaW5nTWV0aG9kLT5sb29rdXBBdHRyaWJ1dChBdHRyaWJ1dDo6Y29kZUF0dHJpYnV0KTsKLSAgCi0gIGlmICghY29kZUF0dCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiSSBoYXZlbid0IHZlcmlmaWVkIHlvdXIgY2xhc3MgZmlsZSBhbmQgaXQncyBtYWxmb3JtZWQ6IgotICAgICAgICAgICAgICAgICAgICAiIG5vIGNvZGUgYXR0cmlidXQgZm91bmQgZm9yICVzLiVzIVxuIiwKLSAgICAgICAgICAgICAgICAgICAgVVRGOEJ1ZmZlcihjb21waWxpbmdDbGFzcy0+bmFtZSkuY1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICBVVEY4QnVmZmVyKGNvbXBpbGluZ01ldGhvZC0+bmFtZSkuY1N0cmluZygpKTsKLSAgICBhYm9ydCgpOwotICB9Ci0KLSAgUmVhZGVyIHJlYWRlcihjb2RlQXR0LCBjb21waWxpbmdDbGFzcy0+Ynl0ZXMpOwotICB1aW50MTYgbWF4U3RhY2sgPSByZWFkZXIucmVhZFUyKCk7Ci0gIHVpbnQxNiBtYXhMb2NhbHMgPSByZWFkZXIucmVhZFUyKCk7Ci0gIHVpbnQzMiBjb2RlTGVuID0gcmVhZGVyLnJlYWRVNCgpOwotICB1aW50MzIgc3RhcnQgPSByZWFkZXIuY3Vyc29yOwotICAKLSAgcmVhZGVyLnNlZWsoY29kZUxlbiwgUmVhZGVyOjpTZWVrQ3VyKTsKLSAgCi0gIExMVk1NZXRob2RJbmZvKiBMTUkgPSBUaGVDb21waWxlci0+Z2V0TWV0aG9kSW5mbyhjb21waWxpbmdNZXRob2QpOwotICBhc3NlcnQoTE1JKTsKLSAgRnVuY3Rpb24qIGZ1bmMgPSBMTUktPmdldE1ldGhvZCgpOwotCi0gIGNvbnN0IFR5cGUqIHJldHVyblR5cGUgPSBmdW5jLT5nZXRSZXR1cm5UeXBlKCk7Ci0gIGVuZEJsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygiZW5kIik7Ci0KLSAgY3VycmVudEJsb2NrID0gY3VyQkI7Ci0gIGVuZEV4Y2VwdGlvbkJsb2NrID0gZW5kRXhCbG9jazsKLQotICBvcGNvZGVJbmZvcyA9IG5ldyBPcGluZm9bY29kZUxlbl07Ci0gIG1lbXNldChvcGNvZGVJbmZvcywgMCwgY29kZUxlbiAqIHNpemVvZihPcGluZm8pKTsKLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBjb2RlTGVuOyArK2kpIHsKLSAgICBvcGNvZGVJbmZvc1tpXS5leGNlcHRpb25CbG9jayA9IGVuZEV4QmxvY2s7Ci0gIH0KLSAgCi0gIEJhc2ljQmxvY2sqIGZpcnN0QkIgPSBsbHZtRnVuY3Rpb24tPmJlZ2luKCk7Ci0gIAotICBpZiAoZmlyc3RCQi0+YmVnaW4oKSAhPSBmaXJzdEJCLT5lbmQoKSkgewotICAgIEluc3RydWN0aW9uKiBmaXJzdEluc3RydWN0aW9uID0gZmlyc3RCQi0+YmVnaW4oKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4TG9jYWxzOyBpKyspIHsKLSAgICAgIGludExvY2Fscy5wdXNoX2JhY2sobmV3IEFsbG9jYUluc3QoVHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpLCAiIiwgZmlyc3RJbnN0cnVjdGlvbikpOwotICAgICAgbmV3IFN0b3JlSW5zdChDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSksIGludExvY2Fscy5iYWNrKCksIGZhbHNlLCBmaXJzdEluc3RydWN0aW9uKTsKLSAgICAgIGRvdWJsZUxvY2Fscy5wdXNoX2JhY2sobmV3IEFsbG9jYUluc3QoVHlwZTo6Z2V0RG91YmxlVHkoKmxsdm1Db250ZXh0KSwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5zdHJ1Y3Rpb24pKTsKLSAgICAgIG5ldyBTdG9yZUluc3QoQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShUeXBlOjpnZXREb3VibGVUeSgqbGx2bUNvbnRleHQpKSwgZG91YmxlTG9jYWxzLmJhY2soKSwgZmFsc2UsIGZpcnN0SW5zdHJ1Y3Rpb24pOwotICAgICAgbG9uZ0xvY2Fscy5wdXNoX2JhY2sobmV3IEFsbG9jYUluc3QoVHlwZTo6Z2V0SW50NjRUeSgqbGx2bUNvbnRleHQpLCAiIiwgZmlyc3RJbnN0cnVjdGlvbikpOwotICAgICAgbmV3IFN0b3JlSW5zdChDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFR5cGU6OmdldEludDY0VHkoKmxsdm1Db250ZXh0KSksIGxvbmdMb2NhbHMuYmFjaygpLCBmYWxzZSwgZmlyc3RJbnN0cnVjdGlvbik7Ci0gICAgICBmbG9hdExvY2Fscy5wdXNoX2JhY2sobmV3IEFsbG9jYUluc3QoVHlwZTo6Z2V0RmxvYXRUeSgqbGx2bUNvbnRleHQpLCAiIiwgZmlyc3RJbnN0cnVjdGlvbikpOwotICAgICAgbmV3IFN0b3JlSW5zdChDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFR5cGU6OmdldEZsb2F0VHkoKmxsdm1Db250ZXh0KSksIGZsb2F0TG9jYWxzLmJhY2soKSwgZmFsc2UsIGZpcnN0SW5zdHJ1Y3Rpb24pOwotICAgICAgb2JqZWN0TG9jYWxzLnB1c2hfYmFjayhuZXcgQWxsb2NhSW5zdChpbnRyaW5zaWNzLT5KYXZhT2JqZWN0VHlwZSwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEluc3RydWN0aW9uKSk7Ci0gICAgIAotICAgICAgLy8gVGhlIEdDU3RyYXRlZ3kgd2lsbCBhbHJlYWR5IGluaXRpYWxpemUgdGhlIHZhbHVlLgotICAgICAgaWYgKCFUaGVDb21waWxlci0+dXNlQ29vcGVyYXRpdmVHQygpKQotICAgICAgICBuZXcgU3RvcmVJbnN0KENvbnN0YW50OjpnZXROdWxsVmFsdWUoaW50cmluc2ljcy0+SmF2YU9iamVjdFR5cGUpLCBvYmplY3RMb2NhbHMuYmFjaygpLCBmYWxzZSwgZmlyc3RJbnN0cnVjdGlvbik7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4U3RhY2s7IGkrKykgewotICAgICAgb2JqZWN0U3RhY2sucHVzaF9iYWNrKG5ldyBBbGxvY2FJbnN0KGludHJpbnNpY3MtPkphdmFPYmplY3RUeXBlLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEluc3RydWN0aW9uKSk7Ci0gICAgICBhZGRIaWdoTGV2ZWxUeXBlKG9iamVjdFN0YWNrLmJhY2soKSwgdXBjYWxscy0+T2ZPYmplY3QpOwotICAgICAgaW50U3RhY2sucHVzaF9iYWNrKG5ldyBBbGxvY2FJbnN0KFR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSwgIiIsIGZpcnN0SW5zdHJ1Y3Rpb24pKTsKLSAgICAgIGRvdWJsZVN0YWNrLnB1c2hfYmFjayhuZXcgQWxsb2NhSW5zdChUeXBlOjpnZXREb3VibGVUeSgqbGx2bUNvbnRleHQpLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEluc3RydWN0aW9uKSk7Ci0gICAgICBsb25nU3RhY2sucHVzaF9iYWNrKG5ldyBBbGxvY2FJbnN0KFR5cGU6OmdldEludDY0VHkoKmxsdm1Db250ZXh0KSwgIiIsIGZpcnN0SW5zdHJ1Y3Rpb24pKTsKLSAgICAgIGZsb2F0U3RhY2sucHVzaF9iYWNrKG5ldyBBbGxvY2FJbnN0KFR5cGU6OmdldEZsb2F0VHkoKmxsdm1Db250ZXh0KSwgIiIsIGZpcnN0SW5zdHJ1Y3Rpb24pKTsKLSAgICB9Ci0KLSAgfSBlbHNlIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heExvY2FsczsgaSsrKSB7Ci0gICAgICBpbnRMb2NhbHMucHVzaF9iYWNrKG5ldyBBbGxvY2FJbnN0KFR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSwgIiIsIGZpcnN0QkIpKTsKLSAgICAgIG5ldyBTdG9yZUluc3QoQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShUeXBlOjpnZXRJbnQzMlR5KCpsbHZtQ29udGV4dCkpLCBpbnRMb2NhbHMuYmFjaygpLCBmYWxzZSwgZmlyc3RCQik7Ci0gICAgICBkb3VibGVMb2NhbHMucHVzaF9iYWNrKG5ldyBBbGxvY2FJbnN0KFR5cGU6OmdldERvdWJsZVR5KCpsbHZtQ29udGV4dCksICIiLCBmaXJzdEJCKSk7Ci0gICAgICBuZXcgU3RvcmVJbnN0KENvbnN0YW50OjpnZXROdWxsVmFsdWUoVHlwZTo6Z2V0RG91YmxlVHkoKmxsdm1Db250ZXh0KSksIGRvdWJsZUxvY2Fscy5iYWNrKCksIGZhbHNlLCBmaXJzdEJCKTsKLSAgICAgIGxvbmdMb2NhbHMucHVzaF9iYWNrKG5ldyBBbGxvY2FJbnN0KFR5cGU6OmdldEludDY0VHkoKmxsdm1Db250ZXh0KSwgIiIsIGZpcnN0QkIpKTsKLSAgICAgIG5ldyBTdG9yZUluc3QoQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShUeXBlOjpnZXRJbnQ2NFR5KCpsbHZtQ29udGV4dCkpLCBsb25nTG9jYWxzLmJhY2soKSwgZmFsc2UsIGZpcnN0QkIpOwotICAgICAgZmxvYXRMb2NhbHMucHVzaF9iYWNrKG5ldyBBbGxvY2FJbnN0KFR5cGU6OmdldEZsb2F0VHkoKmxsdm1Db250ZXh0KSwgIiIsIGZpcnN0QkIpKTsKLSAgICAgIG5ldyBTdG9yZUluc3QoQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShUeXBlOjpnZXRGbG9hdFR5KCpsbHZtQ29udGV4dCkpLCBmbG9hdExvY2Fscy5iYWNrKCksIGZhbHNlLCBmaXJzdEJCKTsKLSAgICAgIG9iamVjdExvY2Fscy5wdXNoX2JhY2sobmV3IEFsbG9jYUluc3QoaW50cmluc2ljcy0+SmF2YU9iamVjdFR5cGUsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEJCKSk7Ci0gICAgICAvLyBUaGUgR0NTdHJhdGVneSB3aWxsIGFscmVhZHkgaW5pdGlhbGl6ZSB0aGUgdmFsdWUuCi0gICAgICBpZiAoIVRoZUNvbXBpbGVyLT51c2VDb29wZXJhdGl2ZUdDKCkpCi0gICAgICAgIG5ldyBTdG9yZUluc3QoQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShpbnRyaW5zaWNzLT5KYXZhT2JqZWN0VHlwZSksIG9iamVjdExvY2Fscy5iYWNrKCksIGZhbHNlLCBmaXJzdEJCKTsKLSAgICB9Ci0gICAgCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhTdGFjazsgaSsrKSB7Ci0gICAgICBvYmplY3RTdGFjay5wdXNoX2JhY2sobmV3IEFsbG9jYUluc3QoaW50cmluc2ljcy0+SmF2YU9iamVjdFR5cGUsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0QkIpKTsKLSAgICAgIGFkZEhpZ2hMZXZlbFR5cGUob2JqZWN0U3RhY2suYmFjaygpLCB1cGNhbGxzLT5PZk9iamVjdCk7Ci0gICAgICBpbnRTdGFjay5wdXNoX2JhY2sobmV3IEFsbG9jYUluc3QoVHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpLCAiIiwgZmlyc3RCQikpOwotICAgICAgZG91YmxlU3RhY2sucHVzaF9iYWNrKG5ldyBBbGxvY2FJbnN0KFR5cGU6OmdldERvdWJsZVR5KCpsbHZtQ29udGV4dCksICIiLCBmaXJzdEJCKSk7Ci0gICAgICBsb25nU3RhY2sucHVzaF9iYWNrKG5ldyBBbGxvY2FJbnN0KFR5cGU6OmdldEludDY0VHkoKmxsdm1Db250ZXh0KSwgIiIsIGZpcnN0QkIpKTsKLSAgICAgIGZsb2F0U3RhY2sucHVzaF9iYWNrKG5ldyBBbGxvY2FJbnN0KFR5cGU6OmdldEZsb2F0VHkoKmxsdm1Db250ZXh0KSwgIiIsIGZpcnN0QkIpKTsKLSAgICB9Ci0gIH0KLSAgICAgIAotICAKLSAgdWludDMyIGluZGV4ID0gMDsKLSAgdWludDMyIGNvdW50ID0gMDsKLSAgdWludDMyIG1heCA9IGFyZ3Muc2l6ZSgpOwotICBTaWduZGVmKiBzaWduID0gY29tcGlsaW5nTWV0aG9kLT5nZXRTaWduYXR1cmUoKTsKLSAgVHlwZWRlZiogY29uc3QqIGFyZ3VtZW50cyA9IHNpZ24tPmdldEFyZ3VtZW50c1R5cGUoKTsKLSAgdWludDMyIHR5cGUgPSAwOwotICBzdGQ6OnZlY3RvcjxWYWx1ZSo+OjppdGVyYXRvciBpID0gYXJncy5iZWdpbigpOyAKLQotICBpZiAoaXNWaXJ0dWFsKGNvbXBpbGluZ01ldGhvZC0+YWNjZXNzKSkgewotICAgIEluc3RydWN0aW9uKiBWID0gbmV3IFN0b3JlSW5zdCgqaSwgb2JqZWN0TG9jYWxzWzBdLCBmYWxzZSwgY3VycmVudEJsb2NrKTsKLSAgICBhZGRIaWdoTGV2ZWxUeXBlKFYsIGNvbXBpbGluZ0NsYXNzKTsKLSAgICArK2k7Ci0gICAgKytpbmRleDsKLSAgICArK2NvdW50OwotICAgIHRoaXNPYmplY3QgPSBvYmplY3RMb2NhbHNbMF07Ci0gIH0KLQotICAKLSAgZm9yICg7Y291bnQgPCBtYXg7ICsraSwgKytpbmRleCwgKytjb3VudCwgKyt0eXBlKSB7Ci0gICAgCi0gICAgY29uc3QgVHlwZWRlZiogY3VyID0gYXJndW1lbnRzW3R5cGVdOwotICAgIGNvbnN0IFR5cGUqIGN1clR5cGUgPSAoKmkpLT5nZXRUeXBlKCk7Ci0KLSAgICBpZiAoY3VyVHlwZSA9PSBUeXBlOjpnZXRJbnQ2NFR5KCpsbHZtQ29udGV4dCkpewotICAgICAgbmV3IFN0b3JlSW5zdCgqaSwgbG9uZ0xvY2Fsc1tpbmRleF0sIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgICAgKytpbmRleDsKLSAgICB9IGVsc2UgaWYgKGN1ci0+aXNVbnNpZ25lZCgpKSB7Ci0gICAgICBuZXcgU3RvcmVJbnN0KG5ldyBaRXh0SW5zdCgqaSwgVHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpLCAiIiwgY3VycmVudEJsb2NrKSwKLSAgICAgICAgICAgICAgICAgICAgaW50TG9jYWxzW2luZGV4XSwgZmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0gICAgfSBlbHNlIGlmIChjdXJUeXBlID09IFR5cGU6OmdldEludDhUeSgqbGx2bUNvbnRleHQpIHx8IGN1clR5cGUgPT0gVHlwZTo6Z2V0SW50MTZUeSgqbGx2bUNvbnRleHQpKSB7Ci0gICAgICBuZXcgU3RvcmVJbnN0KG5ldyBTRXh0SW5zdCgqaSwgVHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpLCAiIiwgY3VycmVudEJsb2NrKSwKLSAgICAgICAgICAgICAgICAgICAgaW50TG9jYWxzW2luZGV4XSwgZmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0gICAgfSBlbHNlIGlmIChjdXJUeXBlID09IFR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSkgewotICAgICAgbmV3IFN0b3JlSW5zdCgqaSwgaW50TG9jYWxzW2luZGV4XSwgZmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0gICAgfSBlbHNlIGlmIChjdXJUeXBlID09IFR5cGU6OmdldERvdWJsZVR5KCpsbHZtQ29udGV4dCkpIHsKLSAgICAgIG5ldyBTdG9yZUluc3QoKmksIGRvdWJsZUxvY2Fsc1tpbmRleF0sIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgICAgKytpbmRleDsKLSAgICB9IGVsc2UgaWYgKGN1clR5cGUgPT0gVHlwZTo6Z2V0RmxvYXRUeSgqbGx2bUNvbnRleHQpKSB7Ci0gICAgICBuZXcgU3RvcmVJbnN0KCppLCBmbG9hdExvY2Fsc1tpbmRleF0sIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgIH0gZWxzZSB7Ci0gICAgICBJbnN0cnVjdGlvbiogViA9IG5ldyBTdG9yZUluc3QoKmksIG9iamVjdExvY2Fsc1tpbmRleF0sIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgICAgYWRkSGlnaExldmVsVHlwZShWLCBjdXItPmZpbmRBc3NvY0NsYXNzKGNvbXBpbGluZ0NsYXNzLT5jbGFzc0xvYWRlcikpOwotICAgIH0KLSAgfQotICAKLSAgcmVhZEV4Y2VwdGlvblRhYmxlKHJlYWRlciwgY29kZUxlbik7Ci0gIAotICByZWFkZXIuY3Vyc29yID0gc3RhcnQ7Ci0gIGV4cGxvcmVPcGNvZGVzKHJlYWRlciwgY29kZUxlbik7Ci0KLSAgaWYgKHJldHVyblR5cGUgIT0gVHlwZTo6Z2V0Vm9pZFR5KCpsbHZtQ29udGV4dCkpIHsKLSAgICBlbmROb2RlID0gUEhJTm9kZTo6Q3JlYXRlKHJldHVyblR5cGUsICIiLCBlbmRCbG9jayk7Ci0gIH0KLQotICByZWFkZXIuY3Vyc29yID0gc3RhcnQ7Ci0gIGNvbXBpbGVPcGNvZGVzKHJlYWRlciwgY29kZUxlbik7Ci0gIAotICBQUklOVF9ERUJVRyhKTkpWTV9DT01QSUxFLCAxLCBDT0xPUl9OT1JNQUwsCi0gICAgICAgICAgICAgICItLT4gZW5kIGlubGluZSBjb21waWxpbmcgJXMuJXNcbiIsCi0gICAgICAgICAgICAgIFVURjhCdWZmZXIoY29tcGlsaW5nQ2xhc3MtPm5hbWUpLmNTdHJpbmcoKSwKLSAgICAgICAgICAgICAgVVRGOEJ1ZmZlcihjb21waWxpbmdNZXRob2QtPm5hbWUpLmNTdHJpbmcoKSk7Ci0KLSAgY3VyQkIgPSBlbmRCbG9jazsKLQotCi0gIHJlbW92ZVVudXNlZExvY2FscyhpbnRMb2NhbHMpOwotICByZW1vdmVVbnVzZWRMb2NhbHMoZG91YmxlTG9jYWxzKTsKLSAgcmVtb3ZlVW51c2VkTG9jYWxzKGZsb2F0TG9jYWxzKTsKLSAgcmVtb3ZlVW51c2VkTG9jYWxzKGxvbmdMb2NhbHMpOwotICByZW1vdmVVbnVzZWRMb2NhbHMoaW50U3RhY2spOwotICByZW1vdmVVbnVzZWRMb2NhbHMoZG91YmxlU3RhY2spOwotICByZW1vdmVVbnVzZWRMb2NhbHMoZmxvYXRTdGFjayk7Ci0gIHJlbW92ZVVudXNlZExvY2Fscyhsb25nU3RhY2spOwotICAKLSAgcmVtb3ZlVW51c2VkT2JqZWN0cyhvYmplY3RMb2NhbHMsIGludHJpbnNpY3MsIFRoZUNvbXBpbGVyLT51c2VDb29wZXJhdGl2ZUdDKCkpOwotICByZW1vdmVVbnVzZWRPYmplY3RzKG9iamVjdFN0YWNrLCBpbnRyaW5zaWNzLCBUaGVDb21waWxlci0+dXNlQ29vcGVyYXRpdmVHQygpKTsKLQotCi0gIGRlbGV0ZVtdIG9wY29kZUluZm9zOwotICByZXR1cm4gZW5kTm9kZTsKLSAgICAKLX0KLQotbGx2bTo6RnVuY3Rpb24qIEphdmFKSVQ6OmphdmFDb21waWxlKCkgewotICBQUklOVF9ERUJVRyhKTkpWTV9DT01QSUxFLCAxLCBDT0xPUl9OT1JNQUwsICJjb21waWxpbmcgJXMuJXNcbiIsCi0gICAgICAgICAgICAgIFVURjhCdWZmZXIoY29tcGlsaW5nQ2xhc3MtPm5hbWUpLmNTdHJpbmcoKSwKLSAgICAgICAgICAgICAgVVRGOEJ1ZmZlcihjb21waWxpbmdNZXRob2QtPm5hbWUpLmNTdHJpbmcoKSk7Ci0KLSAgRGJnU3VicHJvZ3JhbSA9IFRoZUNvbXBpbGVyLT5HZXREYmdTdWJwcm9ncmFtKGNvbXBpbGluZ01ldGhvZCk7Ci0KLSAgQXR0cmlidXQqIGNvZGVBdHQgPSBjb21waWxpbmdNZXRob2QtPmxvb2t1cEF0dHJpYnV0KEF0dHJpYnV0Ojpjb2RlQXR0cmlidXQpOwotICAKLSAgaWYgKCFjb2RlQXR0KSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJJIGhhdmVuJ3QgdmVyaWZpZWQgeW91ciBjbGFzcyBmaWxlIGFuZCBpdCdzIG1hbGZvcm1lZDoiCi0gICAgICAgICAgICAgICAgICAgICIgbm8gY29kZSBhdHRyaWJ1dGUgZm91bmQgZm9yICVzLiVzIVxuIiwKLSAgICAgICAgICAgICAgICAgICAgVVRGOEJ1ZmZlcihjb21waWxpbmdDbGFzcy0+bmFtZSkuY1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICBVVEY4QnVmZmVyKGNvbXBpbGluZ01ldGhvZC0+bmFtZSkuY1N0cmluZygpKTsKLSAgICBhYm9ydCgpOwotICB9IAotCi0gIFJlYWRlciByZWFkZXIoY29kZUF0dCwgY29tcGlsaW5nQ2xhc3MtPmJ5dGVzKTsKLSAgdWludDE2IG1heFN0YWNrID0gcmVhZGVyLnJlYWRVMigpOwotICB1aW50MTYgbWF4TG9jYWxzID0gcmVhZGVyLnJlYWRVMigpOwotICB1aW50MzIgY29kZUxlbiA9IHJlYWRlci5yZWFkVTQoKTsKLSAgdWludDMyIHN0YXJ0ID0gcmVhZGVyLmN1cnNvcjsKLSAgCi0gIHJlYWRlci5zZWVrKGNvZGVMZW4sIFJlYWRlcjo6U2Vla0N1cik7Ci0KLSAgY29uc3QgRnVuY3Rpb25UeXBlICpmdW5jVHlwZSA9IGxsdm1GdW5jdGlvbi0+Z2V0RnVuY3Rpb25UeXBlKCk7Ci0gIGNvbnN0IFR5cGUqIHJldHVyblR5cGUgPSBmdW5jVHlwZS0+Z2V0UmV0dXJuVHlwZSgpOwotICAKLSAgRnVuY3Rpb24qIGZ1bmMgPSBsbHZtRnVuY3Rpb247Ci0KLSAgY3VycmVudEJsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygic3RhcnQiKTsKLSAgZW5kRXhjZXB0aW9uQmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJlbmRFeGNlcHRpb25CbG9jayIpOwotICB1bmlmaWVkVW5yZWFjaGFibGUgPSBjcmVhdGVCYXNpY0Jsb2NrKCJ1bmlmaWVkVW5yZWFjaGFibGUiKTsKLQotICBvcGNvZGVJbmZvcyA9IG5ldyBPcGluZm9bY29kZUxlbl07Ci0gIG1lbXNldChvcGNvZGVJbmZvcywgMCwgY29kZUxlbiAqIHNpemVvZihPcGluZm8pKTsKLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBjb2RlTGVuOyArK2kpIHsKLSAgICBvcGNvZGVJbmZvc1tpXS5leGNlcHRpb25CbG9jayA9IGVuZEV4Y2VwdGlvbkJsb2NrOwotICB9Ci0KLSAgSW5zdHJ1Y3Rpb24qIHJldHVyblZhbHVlID0gTlVMTDsKLSAgaWYgKHJldHVyblR5cGUgPT0gaW50cmluc2ljcy0+SmF2YU9iamVjdFR5cGUgJiYKLSAgICAgIFRoZUNvbXBpbGVyLT51c2VDb29wZXJhdGl2ZUdDKCkpIHsKLSAgICByZXR1cm5WYWx1ZSA9IG5ldyBBbGxvY2FJbnN0KGludHJpbnNpY3MtPkphdmFPYmplY3RUeXBlLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gICAgSW5zdHJ1Y3Rpb24qIGNhc3QgPSAKLSAgICAgICAgbmV3IEJpdENhc3RJbnN0KHJldHVyblZhbHVlLCBpbnRyaW5zaWNzLT5wdHJQdHJUeXBlLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICBWYWx1ZSogR0NBcmdzWzJdID0geyBjYXN0LCBpbnRyaW5zaWNzLT5jb25zdGFudFB0ck51bGwgfTsKLSAgICAgICAgCi0gICAgQ2FsbEluc3Q6OkNyZWF0ZShpbnRyaW5zaWNzLT5sbHZtX2djX2djcm9vdCwgR0NBcmdzLCBHQ0FyZ3MgKyAyLCAiIiwKLSAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgfQotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4TG9jYWxzOyBpKyspIHsKLSAgICBpbnRMb2NhbHMucHVzaF9iYWNrKG5ldyBBbGxvY2FJbnN0KFR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSwgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgIG5ldyBTdG9yZUluc3QoQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShUeXBlOjpnZXRJbnQzMlR5KCpsbHZtQ29udGV4dCkpLCBpbnRMb2NhbHMuYmFjaygpLCBmYWxzZSwgY3VycmVudEJsb2NrKTsKLSAgICBkb3VibGVMb2NhbHMucHVzaF9iYWNrKG5ldyBBbGxvY2FJbnN0KFR5cGU6OmdldERvdWJsZVR5KCpsbHZtQ29udGV4dCksICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICBuZXcgU3RvcmVJbnN0KENvbnN0YW50OjpnZXROdWxsVmFsdWUoVHlwZTo6Z2V0RG91YmxlVHkoKmxsdm1Db250ZXh0KSksIGRvdWJsZUxvY2Fscy5iYWNrKCksIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgIGxvbmdMb2NhbHMucHVzaF9iYWNrKG5ldyBBbGxvY2FJbnN0KFR5cGU6OmdldEludDY0VHkoKmxsdm1Db250ZXh0KSwgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgIG5ldyBTdG9yZUluc3QoQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShUeXBlOjpnZXRJbnQ2NFR5KCpsbHZtQ29udGV4dCkpLCBsb25nTG9jYWxzLmJhY2soKSwgZmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0gICAgZmxvYXRMb2NhbHMucHVzaF9iYWNrKG5ldyBBbGxvY2FJbnN0KFR5cGU6OmdldEZsb2F0VHkoKmxsdm1Db250ZXh0KSwgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgIG5ldyBTdG9yZUluc3QoQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShUeXBlOjpnZXRGbG9hdFR5KCpsbHZtQ29udGV4dCkpLCBmbG9hdExvY2Fscy5iYWNrKCksIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgIG9iamVjdExvY2Fscy5wdXNoX2JhY2sobmV3IEFsbG9jYUluc3QoaW50cmluc2ljcy0+SmF2YU9iamVjdFR5cGUsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKSk7Ci0gICAgLy8gVGhlIEdDU3RyYXRlZ3kgd2lsbCBhbHJlYWR5IGluaXRpYWxpemUgdGhlIHZhbHVlLgotICAgIGlmICghVGhlQ29tcGlsZXItPnVzZUNvb3BlcmF0aXZlR0MoKSkKLSAgICAgIG5ldyBTdG9yZUluc3QoQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShpbnRyaW5zaWNzLT5KYXZhT2JqZWN0VHlwZSksIG9iamVjdExvY2Fscy5iYWNrKCksIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICB9Ci0gIAotICBmb3IgKGludCBpID0gMDsgaSA8IG1heFN0YWNrOyBpKyspIHsKLSAgICBvYmplY3RTdGFjay5wdXNoX2JhY2sobmV3IEFsbG9jYUluc3QoaW50cmluc2ljcy0+SmF2YU9iamVjdFR5cGUsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spKTsKLSAgICBhZGRIaWdoTGV2ZWxUeXBlKG9iamVjdFN0YWNrLmJhY2soKSwgdXBjYWxscy0+T2ZPYmplY3QpOwotICAgIGludFN0YWNrLnB1c2hfYmFjayhuZXcgQWxsb2NhSW5zdChUeXBlOjpnZXRJbnQzMlR5KCpsbHZtQ29udGV4dCksICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICBkb3VibGVTdGFjay5wdXNoX2JhY2sobmV3IEFsbG9jYUluc3QoVHlwZTo6Z2V0RG91YmxlVHkoKmxsdm1Db250ZXh0KSwgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgIGxvbmdTdGFjay5wdXNoX2JhY2sobmV3IEFsbG9jYUluc3QoVHlwZTo6Z2V0SW50NjRUeSgqbGx2bUNvbnRleHQpLCAiIiwgY3VycmVudEJsb2NrKSk7Ci0gICAgZmxvYXRTdGFjay5wdXNoX2JhY2sobmV3IEFsbG9jYUluc3QoVHlwZTo6Z2V0RmxvYXRUeSgqbGx2bUNvbnRleHQpLCAiIiwgY3VycmVudEJsb2NrKSk7Ci0gIH0KLSAKLSAgdWludDMyIGluZGV4ID0gMDsKLSAgdWludDMyIGNvdW50ID0gMDsKLSAgdWludDMyIG1heCA9IGZ1bmMtPmFyZ19zaXplKCk7Ci0gIEZ1bmN0aW9uOjphcmdfaXRlcmF0b3IgaSA9IGZ1bmMtPmFyZ19iZWdpbigpOyAKLSAgU2lnbmRlZiogc2lnbiA9IGNvbXBpbGluZ01ldGhvZC0+Z2V0U2lnbmF0dXJlKCk7Ci0gIFR5cGVkZWYqIGNvbnN0KiBhcmd1bWVudHMgPSBzaWduLT5nZXRBcmd1bWVudHNUeXBlKCk7Ci0gIHVpbnQzMiB0eXBlID0gMDsKLQotICBpZiAoaXNWaXJ0dWFsKGNvbXBpbGluZ01ldGhvZC0+YWNjZXNzKSkgewotICAgIEluc3RydWN0aW9uKiBWID0gbmV3IFN0b3JlSW5zdChpLCBvYmplY3RMb2NhbHNbMF0sIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgIGFkZEhpZ2hMZXZlbFR5cGUoViwgY29tcGlsaW5nQ2xhc3MpOwotICAgICsraTsKLSAgICArK2luZGV4OwotICAgICsrY291bnQ7Ci0gICAgdGhpc09iamVjdCA9IG9iamVjdExvY2Fsc1swXTsKLSAgfQotCi0gIGZvciAoO2NvdW50IDwgbWF4OyArK2ksICsraW5kZXgsICsrY291bnQsICsrdHlwZSkgewotICAgIAotICAgIGNvbnN0IFR5cGVkZWYqIGN1ciA9IGFyZ3VtZW50c1t0eXBlXTsKLSAgICBjb25zdCBsbHZtOjpUeXBlKiBjdXJUeXBlID0gaS0+Z2V0VHlwZSgpOwotCi0gICAgaWYgKGN1clR5cGUgPT0gVHlwZTo6Z2V0SW50NjRUeSgqbGx2bUNvbnRleHQpKXsKLSAgICAgIG5ldyBTdG9yZUluc3QoaSwgbG9uZ0xvY2Fsc1tpbmRleF0sIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgICAgKytpbmRleDsKLSAgICB9IGVsc2UgaWYgKGN1ci0+aXNVbnNpZ25lZCgpKSB7Ci0gICAgICBuZXcgU3RvcmVJbnN0KG5ldyBaRXh0SW5zdChpLCBUeXBlOjpnZXRJbnQzMlR5KCpsbHZtQ29udGV4dCksICIiLCBjdXJyZW50QmxvY2spLAotICAgICAgICAgICAgICAgICAgICBpbnRMb2NhbHNbaW5kZXhdLCBmYWxzZSwgY3VycmVudEJsb2NrKTsKLSAgICB9IGVsc2UgaWYgKGN1clR5cGUgPT0gVHlwZTo6Z2V0SW50OFR5KCpsbHZtQ29udGV4dCkgfHwgY3VyVHlwZSA9PSBUeXBlOjpnZXRJbnQxNlR5KCpsbHZtQ29udGV4dCkpIHsKLSAgICAgIG5ldyBTdG9yZUluc3QobmV3IFNFeHRJbnN0KGksIFR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSwgIiIsIGN1cnJlbnRCbG9jayksCi0gICAgICAgICAgICAgICAgICAgIGludExvY2Fsc1tpbmRleF0sIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgIH0gZWxzZSBpZiAoY3VyVHlwZSA9PSBUeXBlOjpnZXRJbnQzMlR5KCpsbHZtQ29udGV4dCkpIHsKLSAgICAgIG5ldyBTdG9yZUluc3QoaSwgaW50TG9jYWxzW2luZGV4XSwgZmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0gICAgfSBlbHNlIGlmIChjdXJUeXBlID09IFR5cGU6OmdldERvdWJsZVR5KCpsbHZtQ29udGV4dCkpIHsKLSAgICAgIG5ldyBTdG9yZUluc3QoaSwgZG91YmxlTG9jYWxzW2luZGV4XSwgZmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0gICAgICArK2luZGV4OwotICAgIH0gZWxzZSBpZiAoY3VyVHlwZSA9PSBUeXBlOjpnZXRGbG9hdFR5KCpsbHZtQ29udGV4dCkpIHsKLSAgICAgIG5ldyBTdG9yZUluc3QoaSwgZmxvYXRMb2NhbHNbaW5kZXhdLCBmYWxzZSwgY3VycmVudEJsb2NrKTsKLSAgICB9IGVsc2UgewotICAgICAgSW5zdHJ1Y3Rpb24qIFYgPSBuZXcgU3RvcmVJbnN0KGksIG9iamVjdExvY2Fsc1tpbmRleF0sIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgICAgYWRkSGlnaExldmVsVHlwZShWLCBjdXItPmZpbmRBc3NvY0NsYXNzKGNvbXBpbGluZ0NsYXNzLT5jbGFzc0xvYWRlcikpOwotICAgIH0KLSAgfQotCi0gIC8vIE5vdyB0aGF0IGFyZ3VtZW50cyBoYXZlIGJlZW4gc2V0dXAsIHdlIGNhbiBwcm9jZWVkIHdpdGggcnVudGltZSBjYWxscy4KLSNpZiBKTkpWTV9FWEVDVVRFID4gMAotICAgIHsKLSAgICBWYWx1ZSogYXJnID0gVGhlQ29tcGlsZXItPmdldE1ldGhvZEluQ2xhc3MoY29tcGlsaW5nTWV0aG9kKTsKLQotICAgIGxsdm06OkNhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+UHJpbnRNZXRob2RTdGFydEZ1bmN0aW9uLCBhcmcsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgICB9Ci0jZW5kaWYKLQotICByZWFkRXhjZXB0aW9uVGFibGUocmVhZGVyLCBjb2RlTGVuKTsKLSAgCi0gIHJlYWRlci5jdXJzb3IgPSBzdGFydDsKLSAgZXhwbG9yZU9wY29kZXMocmVhZGVyLCBjb2RlTGVuKTsKLSAKLSAgZW5kQmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJlbmQiKTsKLQotICBpZiAocmV0dXJuVHlwZSAhPSBUeXBlOjpnZXRWb2lkVHkoKmxsdm1Db250ZXh0KSkgewotICAgIGVuZE5vZGUgPSBsbHZtOjpQSElOb2RlOjpDcmVhdGUocmV0dXJuVHlwZSwgIiIsIGVuZEJsb2NrKTsKLSAgfQotICAKLSAgaWYgKGlzU3luY2hybyhjb21waWxpbmdNZXRob2QtPmFjY2VzcykpIHsKLSAgICBiZWdpblN5bmNocm9uaXplKCk7Ci0gIH0KLSAgCi0gIGlmIChUaGVDb21waWxlci0+dXNlQ29vcGVyYXRpdmVHQygpKSB7Ci0gICAgVmFsdWUqIFlpZWxkUHRyID0gZ2V0RG9ZaWVsZFB0cihnZXRNdXRhdG9yVGhyZWFkUHRyKCkpOwotCi0gICAgVmFsdWUqIFlpZWxkID0gbmV3IExvYWRJbnN0KFlpZWxkUHRyLCAiIiwgY3VycmVudEJsb2NrKTsKLQotICAgIEJhc2ljQmxvY2sqIGNvbnRpbnVlQmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJBZnRlciBzYWZlIHBvaW50Iik7Ci0gICAgQmFzaWNCbG9jayogeWllbGRCbG9jayA9IGNyZWF0ZUJhc2ljQmxvY2soIkluIHNhZmUgcG9pbnQiKTsKLSAgICBCcmFuY2hJbnN0OjpDcmVhdGUoeWllbGRCbG9jaywgY29udGludWVCbG9jaywgWWllbGQsIGN1cnJlbnRCbG9jayk7Ci0KLSAgICBjdXJyZW50QmxvY2sgPSB5aWVsZEJsb2NrOwotICAgIENhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+Y29uZGl0aW9uYWxTYWZlUG9pbnQsICIiLCBjdXJyZW50QmxvY2spOwotICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShjb250aW51ZUJsb2NrLCBjdXJyZW50QmxvY2spOwotCi0gICAgY3VycmVudEJsb2NrID0gY29udGludWVCbG9jazsKLSAgfQotICAKLSAgaWYgKFRoZUNvbXBpbGVyLT5oYXNFeGNlcHRpb25zRW5hYmxlZCgpKSB7Ci0gICAgLy8gVmFyaWFibGVzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIHRoZSBsb2NrIGhhcyBiZWVuIHRha2VuLiBEbyB0aGUgc3RhY2sKLSAgICAvLyBjaGVjayBub3c6IGlmIHRoZXJlIGlzIGFuIGV4Y2VwdGlvbiwgd2Ugd2lsbCBnbyB0byB0aGUgbG9jayByZWxlYXNlIGNvZGUuCi0gICAgY3VycmVudEV4Y2VwdGlvbkJsb2NrID0gb3Bjb2RlSW5mb3NbMF0uZXhjZXB0aW9uQmxvY2s7Ci0gICAgVmFsdWUqIEZyYW1lQWRkciA9IENhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+bGx2bV9mcmFtZWFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICBGcmFtZUFkZHIgPSBuZXcgUHRyVG9JbnRJbnN0KEZyYW1lQWRkciwgaW50cmluc2ljcy0+cG9pbnRlclNpemVUeXBlLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gICAgVmFsdWUqIHN0YWNrQ2hlY2sgPSAKLSAgICAgIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBbmQoRnJhbWVBZGRyLCBpbnRyaW5zaWNzLT5jb25zdGFudFN0YWNrT3ZlcmZsb3dNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgY3VycmVudEJsb2NrKTsKLQotICAgIHN0YWNrQ2hlY2sgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfRVEsIHN0YWNrQ2hlY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5jb25zdGFudFB0clplcm8sICIiKTsKLSAgICBCYXNpY0Jsb2NrKiBzdGFja092ZXJmbG93ID0gY3JlYXRlQmFzaWNCbG9jaygic3RhY2sgb3ZlcmZsb3ciKTsKLSAgICBCYXNpY0Jsb2NrKiBub1N0YWNrT3ZlcmZsb3cgPSBjcmVhdGVCYXNpY0Jsb2NrKCJubyBzdGFjayBvdmVyZmxvdyIpOwotICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShzdGFja092ZXJmbG93LCBub1N0YWNrT3ZlcmZsb3csIHN0YWNrQ2hlY2ssCi0gICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gICAgY3VycmVudEJsb2NrID0gc3RhY2tPdmVyZmxvdzsKLSAgICB0aHJvd0V4Y2VwdGlvbihpbnRyaW5zaWNzLT5TdGFja092ZXJmbG93RXJyb3JGdW5jdGlvbiwgMCwgMCk7Ci0gICAgY3VycmVudEJsb2NrID0gbm9TdGFja092ZXJmbG93OwotICB9Ci0KLSAgcmVhZGVyLmN1cnNvciA9IHN0YXJ0OwotICBjb21waWxlT3Bjb2RlcyhyZWFkZXIsIGNvZGVMZW4pOwotICAKLSAgYXNzZXJ0KHN0YWNrLnNpemUoKSA9PSAwICYmICJTdGFjayBub3QgZW1wdHkgYWZ0ZXIgY29tcGlsaW5nIGJ5dGVjb2RlIik7Ci0gIC8vIEZpeCBhIGphdmFjKD8pIGJ1ZyB3aGVyZSBhIG1ldGhvZCBvbmx5IHRocm93cyBhbiBleGNlcHRpb24gYW5kIGRvZXMKLSAgLy8gbm90IHJldHVybi4KLSAgcHJlZF9pdGVyYXRvciBQSSA9IHByZWRfYmVnaW4oZW5kQmxvY2spOwotICBwcmVkX2l0ZXJhdG9yIFBFID0gcHJlZF9lbmQoZW5kQmxvY2spOwotICBpZiAoUEkgPT0gUEUgJiYgcmV0dXJuVHlwZSAhPSBUeXBlOjpnZXRWb2lkVHkoKmxsdm1Db250ZXh0KSkgewotICAgIEluc3RydWN0aW9uKiBJID0gY3VycmVudEJsb2NrLT5nZXRUZXJtaW5hdG9yKCk7Ci0gICAgCi0gICAgaWYgKGlzYTxVbnJlYWNoYWJsZUluc3Q+KEkpKSB7Ci0gICAgICBJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShlbmRCbG9jaywgY3VycmVudEJsb2NrKTsKLSAgICAgIGVuZE5vZGUtPmFkZEluY29taW5nKENvbnN0YW50OjpnZXROdWxsVmFsdWUocmV0dXJuVHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICAgIH0gZWxzZSBpZiAoSW52b2tlSW5zdCogSUkgPSBkeW5fY2FzdDxJbnZva2VJbnN0PihJKSkgewotICAgICAgSUktPnNldE5vcm1hbERlc3QoZW5kQmxvY2spOwotICAgICAgZW5kTm9kZS0+YWRkSW5jb21pbmcoQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShyZXR1cm5UeXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gICAgfQotCi0gIH0KLSAgY3VycmVudEJsb2NrID0gZW5kQmxvY2s7Ci0KLSAgaWYgKHJldHVyblZhbHVlICE9IE5VTEwpIHsKLSAgICBuZXcgU3RvcmVJbnN0KGVuZE5vZGUsIHJldHVyblZhbHVlLCBjdXJyZW50QmxvY2spOwotICB9Ci0gIAotICBpZiAoaXNTeW5jaHJvKGNvbXBpbGluZ01ldGhvZC0+YWNjZXNzKSkgewotICAgIGVuZFN5bmNocm9uaXplKCk7Ci0gIH0KLQotI2lmIEpOSlZNX0VYRUNVVEUgPiAwCi0gICAgewotICAgIFZhbHVlKiBhcmcgPSBUaGVDb21waWxlci0+Z2V0TWV0aG9kSW5DbGFzcyhjb21waWxpbmdNZXRob2QpOyAKLSAgICBDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPlByaW50TWV0aG9kRW5kRnVuY3Rpb24sIGFyZywgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgfQotI2VuZGlmCi0KLSAgUEkgPSBwcmVkX2JlZ2luKGN1cnJlbnRCbG9jayk7Ci0gIFBFID0gcHJlZF9lbmQoY3VycmVudEJsb2NrKTsKLSAgaWYgKFBJID09IFBFKSB7Ci0gICAgY3VycmVudEJsb2NrLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAocmV0dXJuVHlwZSAhPSBUeXBlOjpnZXRWb2lkVHkoKmxsdm1Db250ZXh0KSkgewotICAgICAgaWYgKHJldHVyblZhbHVlICE9IE5VTEwpIHsKLSAgICAgICAgVmFsdWUqIG9iaiA9IG5ldyBMb2FkSW5zdCgKLSAgICAgICAgICAgIHJldHVyblZhbHVlLCAiIiwgVGhlQ29tcGlsZXItPnVzZUNvb3BlcmF0aXZlR0MoKSwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgUmV0dXJuSW5zdDo6Q3JlYXRlKCpsbHZtQ29udGV4dCwgb2JqLCBjdXJyZW50QmxvY2spOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgUmV0dXJuSW5zdDo6Q3JlYXRlKCpsbHZtQ29udGV4dCwgZW5kTm9kZSwgY3VycmVudEJsb2NrKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgUmV0dXJuSW5zdDo6Q3JlYXRlKCpsbHZtQ29udGV4dCwgY3VycmVudEJsb2NrKTsKLSAgICB9Ci0gIH0KLQotICBjdXJyZW50QmxvY2sgPSBlbmRFeGNlcHRpb25CbG9jazsKLQotICBmaW5pc2hFeGNlcHRpb25zKCk7Ci0gICAKLSAgcmVtb3ZlVW51c2VkTG9jYWxzKGludExvY2Fscyk7Ci0gIHJlbW92ZVVudXNlZExvY2Fscyhkb3VibGVMb2NhbHMpOwotICByZW1vdmVVbnVzZWRMb2NhbHMoZmxvYXRMb2NhbHMpOwotICByZW1vdmVVbnVzZWRMb2NhbHMobG9uZ0xvY2Fscyk7Ci0gIHJlbW92ZVVudXNlZExvY2FscyhpbnRTdGFjayk7Ci0gIHJlbW92ZVVudXNlZExvY2Fscyhkb3VibGVTdGFjayk7Ci0gIHJlbW92ZVVudXNlZExvY2FscyhmbG9hdFN0YWNrKTsKLSAgcmVtb3ZlVW51c2VkTG9jYWxzKGxvbmdTdGFjayk7Ci0gIAotICByZW1vdmVVbnVzZWRPYmplY3RzKG9iamVjdExvY2FscywgaW50cmluc2ljcywgVGhlQ29tcGlsZXItPnVzZUNvb3BlcmF0aXZlR0MoKSk7Ci0gIHJlbW92ZVVudXNlZE9iamVjdHMob2JqZWN0U3RhY2ssIGludHJpbnNpY3MsIFRoZUNvbXBpbGVyLT51c2VDb29wZXJhdGl2ZUdDKCkpOwotIAotICBkZWxldGVbXSBvcGNvZGVJbmZvczsKLQotICBQUklOVF9ERUJVRyhKTkpWTV9DT01QSUxFLCAxLCBDT0xPUl9OT1JNQUwsICItLT4gZW5kIGNvbXBpbGluZyAlcy4lc1xuIiwKLSAgICAgICAgICAgICAgVVRGOEJ1ZmZlcihjb21waWxpbmdDbGFzcy0+bmFtZSkuY1N0cmluZygpLAotICAgICAgICAgICAgICBVVEY4QnVmZmVyKGNvbXBpbGluZ01ldGhvZC0+bmFtZSkuY1N0cmluZygpKTsKLSAgCi0jaWZuZGVmIERXQVJGX0VYQ0VQVElPTlMKLSAgaWYgKGNvZGVMZW4gPCA1ICYmICFjYWxsc1N0YWNrV2Fsa2VyICYmICFUaGVDb21waWxlci0+aXNTdGF0aWNDb21waWxpbmcoKSkKLSAgICBjb21waWxpbmdNZXRob2QtPmNhbkJlSW5saW5lZCA9IGZhbHNlOwotI2VuZGlmCi0gIAotICBBdHRyaWJ1dCogYW5ub3RhdGlvbnNBdHQgPQotICAgIGNvbXBpbGluZ01ldGhvZC0+bG9va3VwQXR0cmlidXQoQXR0cmlidXQ6OmFubm90YXRpb25zQXR0cmlidXQpOwotICAKLSAgaWYgKGFubm90YXRpb25zQXR0KSB7Ci0gICAgUmVhZGVyIHJlYWRlcihhbm5vdGF0aW9uc0F0dCwgY29tcGlsaW5nQ2xhc3MtPmJ5dGVzKTsKLSAgICBBbm5vdGF0aW9uUmVhZGVyIEFSKHJlYWRlciwgY29tcGlsaW5nQ2xhc3MpOwotICAgIHVpbnQxNiBudW1Bbm5vdGF0aW9ucyA9IHJlYWRlci5yZWFkVTIoKTsKLSAgICBmb3IgKHVpbnQxNiBpID0gMDsgaSA8IG51bUFubm90YXRpb25zOyArK2kpIHsKLSAgICAgIEFSLnJlYWRBbm5vdGF0aW9uKCk7Ci0gICAgICBjb25zdCBVVEY4KiBuYW1lID0KLSAgICAgICAgY29tcGlsaW5nQ2xhc3MtPmN0cEluZm8tPlVURjhBdChBUi5Bbm5vdGF0aW9uTmFtZUluZGV4KTsKLSAgICAgIGlmIChuYW1lLT5lcXVhbHMoVGhlQ29tcGlsZXItPklubGluZVByYWdtYSkpIHsKLSAgICAgICAgbGx2bUZ1bmN0aW9uLT5hZGRGbkF0dHIoQXR0cmlidXRlOjpBbHdheXNJbmxpbmUpOwotICAgICAgfSBlbHNlIGlmIChuYW1lLT5lcXVhbHMoVGhlQ29tcGlsZXItPk5vSW5saW5lUHJhZ21hKSkgewotICAgICAgICBsbHZtRnVuY3Rpb24tPmFkZEZuQXR0cihBdHRyaWJ1dGU6Ok5vSW5saW5lKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAKLSAgcmV0dXJuIGxsdm1GdW5jdGlvbjsKLX0KLQotdm9pZCBKYXZhSklUOjpjb21wYXJlRlAoVmFsdWUqIHZhbDEsIFZhbHVlKiB2YWwyLCBjb25zdCBUeXBlKiB0eSwgYm9vbCBsKSB7Ci0gIFZhbHVlKiBvbmUgPSBpbnRyaW5zaWNzLT5jb25zdGFudE9uZTsKLSAgVmFsdWUqIHplcm8gPSBpbnRyaW5zaWNzLT5jb25zdGFudFplcm87Ci0gIFZhbHVlKiBtaW51cyA9IGludHJpbnNpY3MtPmNvbnN0YW50TWludXNPbmU7Ci0KLSAgVmFsdWUqIGMgPSBuZXcgRkNtcEluc3QoKmN1cnJlbnRCbG9jaywgRkNtcEluc3Q6OkZDTVBfVUdULCB2YWwxLCB2YWwyLCAiIik7Ci0gIFZhbHVlKiByID0gbGx2bTo6U2VsZWN0SW5zdDo6Q3JlYXRlKGMsIG9uZSwgemVybywgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIGMgPSBuZXcgRkNtcEluc3QoKmN1cnJlbnRCbG9jaywgRkNtcEluc3Q6OkZDTVBfVUxULCB2YWwxLCB2YWwyLCAiIik7Ci0gIHIgPSBsbHZtOjpTZWxlY3RJbnN0OjpDcmVhdGUoYywgbWludXMsIHIsICIiLCBjdXJyZW50QmxvY2spOwotICBjID0gbmV3IEZDbXBJbnN0KCpjdXJyZW50QmxvY2ssIEZDbXBJbnN0OjpGQ01QX1VOTywgdmFsMSwgdmFsMiwgIiIpOwotICByID0gbGx2bTo6U2VsZWN0SW5zdDo6Q3JlYXRlKGMsIGwgPyBvbmUgOiBtaW51cywgciwgIiIsIGN1cnJlbnRCbG9jayk7Ci0KLSAgcHVzaChyLCBmYWxzZSk7Ci0KLX0KLQotdm9pZCBKYXZhSklUOjpsb2FkQ29uc3RhbnQodWludDE2IGluZGV4KSB7Ci0gIEphdmFDb25zdGFudFBvb2wqIGN0cEluZm8gPSBjb21waWxpbmdDbGFzcy0+Y3RwSW5mbzsKLSAgdWludDggdHlwZSA9IGN0cEluZm8tPnR5cGVBdChpbmRleCk7Ci0gIAotICBpZiAodHlwZSA9PSBKYXZhQ29uc3RhbnRQb29sOjpDb25zdGFudFN0cmluZykgewotCi0gICAgaWYgKFRoZUNvbXBpbGVyLT5pc1N0YXRpY0NvbXBpbGluZygpKSB7Ci0gICAgICBjb25zdCBVVEY4KiB1dGY4ID0gY3RwSW5mby0+VVRGOEF0KGN0cEluZm8tPmN0cERlZltpbmRleF0pOwotICAgICAgSmF2YVN0cmluZyogc3RyID0gKihjb21waWxpbmdDbGFzcy0+Y2xhc3NMb2FkZXItPlVURjhUb1N0cih1dGY4KSk7Ci0gICAgICBWYWx1ZSogdmFsID0gVGhlQ29tcGlsZXItPmdldFN0cmluZyhzdHIpOwotICAgICAgcHVzaCh2YWwsIGZhbHNlLCB1cGNhbGxzLT5uZXdTdHJpbmcpOwotICAgIH0gZWxzZSB7Ci0gICAgICBKYXZhU3RyaW5nKiogc3RyID0gKEphdmFTdHJpbmcqKiljdHBJbmZvLT5jdHBSZXNbaW5kZXhdOwotICAgICAgaWYgKHN0cikgewotICAgICAgICBWYWx1ZSogdmFsID0gVGhlQ29tcGlsZXItPmdldFN0cmluZ1B0cihzdHIpOwotICAgICAgICB2YWwgPSBuZXcgTG9hZEluc3QodmFsLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgcHVzaCh2YWwsIGZhbHNlLCB1cGNhbGxzLT5uZXdTdHJpbmcpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gTG9va3VwIHRoZSBjb25zdGFudCBwb29sIGNhY2hlCi0gICAgICAgIGNvbnN0IGxsdm06OlR5cGUqIFR5ID0gUG9pbnRlclR5cGU6OmdldFVucXVhbChpbnRyaW5zaWNzLT5KYXZhT2JqZWN0VHlwZSk7Ci0gICAgICAgIFZhbHVlKiB2YWwgPSBnZXRDb25zdGFudFBvb2xBdChpbmRleCwgaW50cmluc2ljcy0+U3RyaW5nTG9va3VwRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeSwgMCwgZmFsc2UpOwotICAgICAgICB2YWwgPSBuZXcgTG9hZEluc3QodmFsLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgcHVzaCh2YWwsIGZhbHNlLCB1cGNhbGxzLT5uZXdTdHJpbmcpOwotICAgICAgfQotICAgIH0KLQotICB9IGVsc2UgaWYgKHR5cGUgPT0gSmF2YUNvbnN0YW50UG9vbDo6Q29uc3RhbnRMb25nKSB7Ci0gICAgcHVzaChDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDY0VHkoKmxsdm1Db250ZXh0KSwgY3RwSW5mby0+TG9uZ0F0KGluZGV4KSksCi0gICAgICAgICBmYWxzZSk7Ci0gIH0gZWxzZSBpZiAodHlwZSA9PSBKYXZhQ29uc3RhbnRQb29sOjpDb25zdGFudERvdWJsZSkgewotICAgIHB1c2goQ29uc3RhbnRGUDo6Z2V0KFR5cGU6OmdldERvdWJsZVR5KCpsbHZtQ29udGV4dCksIGN0cEluZm8tPkRvdWJsZUF0KGluZGV4KSksCi0gICAgICAgICBmYWxzZSk7Ci0gIH0gZWxzZSBpZiAodHlwZSA9PSBKYXZhQ29uc3RhbnRQb29sOjpDb25zdGFudEludGVnZXIpIHsKLSAgICBwdXNoKENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpLCBjdHBJbmZvLT5JbnRlZ2VyQXQoaW5kZXgpKSwKLSAgICAgICAgIGZhbHNlKTsKLSAgfSBlbHNlIGlmICh0eXBlID09IEphdmFDb25zdGFudFBvb2w6OkNvbnN0YW50RmxvYXQpIHsKLSAgICBwdXNoKENvbnN0YW50RlA6OmdldChUeXBlOjpnZXRGbG9hdFR5KCpsbHZtQ29udGV4dCksIGN0cEluZm8tPkZsb2F0QXQoaW5kZXgpKSwKLSAgICAgICAgIGZhbHNlKTsKLSAgfSBlbHNlIGlmICh0eXBlID09IEphdmFDb25zdGFudFBvb2w6OkNvbnN0YW50Q2xhc3MpIHsKLSAgICBVc2VyQ29tbW9uQ2xhc3MqIGNsID0gMDsKLSAgICBWYWx1ZSogcmVzID0gZ2V0UmVzb2x2ZWRDb21tb25DbGFzcyhpbmRleCwgZmFsc2UsICZjbCk7Ci0KLSAgICByZXMgPSBDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPkdldENsYXNzRGVsZWdhdGVlRnVuY3Rpb24sIHJlcywgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICAgIHB1c2gocmVzLCBmYWxzZSwgdXBjYWxscy0+bmV3Q2xhc3MpOwotICB9IGVsc2UgewotICAgIGZwcmludGYoc3RkZXJyLCAiSSBoYXZlbid0IHZlcmlmaWVkIHlvdXIgY2xhc3MgZmlsZSBhbmQgaXQncyBtYWxmb3JtZWQ6IgotICAgICAgICAgICAgICAgICAgICAiIHVua25vd24gbGRjICVkIGluICVzLiVzIVxuIiwgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgVVRGOEJ1ZmZlcihjb21waWxpbmdDbGFzcy0+bmFtZSkuY1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICBVVEY4QnVmZmVyKGNvbXBpbGluZ01ldGhvZC0+bmFtZSkuY1N0cmluZygpKTsKLSAgICBhYm9ydCgpOwotICB9Ci19Ci0KLXZvaWQgSmF2YUpJVDo6SklUVmVyaWZ5TnVsbChWYWx1ZSogb2JqKSB7Ci0KLSAgaWYgKFRoZUNvbXBpbGVyLT5oYXNFeGNlcHRpb25zRW5hYmxlZCgpKSB7Ci0gICAgQ29uc3RhbnQqIHplcm8gPSBpbnRyaW5zaWNzLT5KYXZhT2JqZWN0TnVsbENvbnN0YW50OwotICAgIFZhbHVlKiB0ZXN0ID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX0VRLCBvYmosIHplcm8sICIiKTsKLQotICAgIEJhc2ljQmxvY2sqIGV4aXQgPSBjcmVhdGVCYXNpY0Jsb2NrKCJ2ZXJpZnlOdWxsRXhpdCIpOwotICAgIEJhc2ljQmxvY2sqIGNvbnQgPSBjcmVhdGVCYXNpY0Jsb2NrKCJ2ZXJpZnlOdWxsQ29udCIpOwotCi0gICAgQnJhbmNoSW5zdDo6Q3JlYXRlKGV4aXQsIGNvbnQsIHRlc3QsIGN1cnJlbnRCbG9jayk7Ci0gICAgY3VycmVudEJsb2NrID0gZXhpdDsKLSAgICB0aHJvd0V4Y2VwdGlvbihpbnRyaW5zaWNzLT5OdWxsUG9pbnRlckV4Y2VwdGlvbkZ1bmN0aW9uLCAwLCAwKTsKLSAgICBjdXJyZW50QmxvY2sgPSBjb250OwotICB9Ci0gCi19Ci0KLVZhbHVlKiBKYXZhSklUOjp2ZXJpZnlBbmRDb21wdXRlUHRyKFZhbHVlKiBvYmosIFZhbHVlKiBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUqIGFycmF5VHlwZSwgYm9vbCB2ZXJpZikgewotICBKSVRWZXJpZnlOdWxsKG9iaik7Ci0gIAotICBpZiAoaW5kZXgtPmdldFR5cGUoKSAhPSBUeXBlOjpnZXRJbnQzMlR5KCpsbHZtQ29udGV4dCkpIHsKLSAgICBpbmRleCA9IG5ldyBTRXh0SW5zdChpbmRleCwgVHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgfQotICAKLSAgaWYgKFRoZUNvbXBpbGVyLT5oYXNFeGNlcHRpb25zRW5hYmxlZCgpKSB7Ci0gICAgVmFsdWUqIHNpemUgPSBhcnJheVNpemUob2JqKTsKLSAgICAKLSAgICBWYWx1ZSogY21wID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX1VMVCwgaW5kZXgsIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIik7Ci0KLSAgICBCYXNpY0Jsb2NrKiBpZlRydWUgPSAgY3JlYXRlQmFzaWNCbG9jaygidHJ1ZSB2ZXJpZnlBbmRDb21wdXRlUHRyIik7Ci0gICAgQmFzaWNCbG9jayogaWZGYWxzZSA9IGNyZWF0ZUJhc2ljQmxvY2soImZhbHNlIHZlcmlmeUFuZENvbXB1dGVQdHIiKTsKLQotICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShpZlRydWUsIGlmRmFsc2UsIGNtcCwgY3VycmVudEJsb2NrKTsKLSAgICAKLSAgICBjdXJyZW50QmxvY2sgPSBpZkZhbHNlOwotICAgIFZhbHVlKiBhcmdzWzJdID0geyBvYmosIGluZGV4IH07Ci0gICAgdGhyb3dFeGNlcHRpb24oaW50cmluc2ljcy0+SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbkZ1bmN0aW9uLCBhcmdzLCAyKTsKLSAgICBjdXJyZW50QmxvY2sgPSBpZlRydWU7Ci0gIH0KLSAgCi0gIENvbnN0YW50KiB6ZXJvID0gaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvOwotICBWYWx1ZSogdmFsID0gbmV3IEJpdENhc3RJbnN0KG9iaiwgYXJyYXlUeXBlLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgCi0gIFZhbHVlKiBpbmRleGVzWzNdID0geyB6ZXJvLCBpbnRyaW5zaWNzLT5KYXZhQXJyYXlFbGVtZW50c09mZnNldENvbnN0YW50LCBpbmRleCB9OwotICBWYWx1ZSogcHRyID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZSh2YWwsIGluZGV4ZXMsIGluZGV4ZXMgKyAzLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLQotICByZXR1cm4gcHRyOwotCi19Ci0KLXZvaWQgSmF2YUpJVDo6bWFrZUFyZ3MoRnVuY3Rpb25UeXBlOjpwYXJhbV9pdGVyYXRvciBpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIGluZGV4LCBzdGQ6OnZlY3RvcjxWYWx1ZSo+JiBBcmdzLCB1aW50MzIgbmIpIHsKLSAgQXJncy5yZXNlcnZlKG5iICsgMik7Ci0gIG12bTo6VGhyZWFkQWxsb2NhdG9yIHRocmVhZEFsbG9jYXRvcjsKLSAgVmFsdWUqKiBhcmdzID0gKFZhbHVlKiopdGhyZWFkQWxsb2NhdG9yLkFsbG9jYXRlKG5iKnNpemVvZihWYWx1ZSopKTsKLSAgc2ludDMyIHN0YXJ0ID0gbmIgLSAxOwotICBmb3IgKHNpbnQzMiBpID0gc3RhcnQ7IGkgPj0gMDsgLS1pKSB7Ci0gICAgaXQtLTsKLSAgICBpZiAoaXQtPmdldCgpID09IFR5cGU6OmdldEludDY0VHkoKmxsdm1Db250ZXh0KSB8fCBpdC0+Z2V0KCkgPT0gVHlwZTo6Z2V0RG91YmxlVHkoKmxsdm1Db250ZXh0KSkgewotICAgICAgcG9wKCk7Ci0gICAgfQotICAgIFZhbHVlKiB0bXAgPSBwb3AoKTsKLSAgICAKLSAgICBjb25zdCBUeXBlKiB0eXBlID0gaXQtPmdldCgpOwotICAgIGlmICh0bXAtPmdldFR5cGUoKSAhPSB0eXBlKSB7IC8vIGludDggb3IgaW50MTYKLSAgICAgIGNvbnZlcnRWYWx1ZSh0bXAsIHR5cGUsIGN1cnJlbnRCbG9jaywgZmFsc2UpOwotICAgIH0KLSAgICBhcmdzW2ldID0gdG1wOwotCi0gIH0KLQotICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IG5iOyArK2kpIHsKLSAgICBBcmdzLnB1c2hfYmFjayhhcmdzW2ldKTsKLSAgfQotfQotCi1WYWx1ZSogSmF2YUpJVDo6Z2V0VGFyZ2V0KFNpZ25kZWYqIHNpZ25hdHVyZSkgewotICBpbnQgb2Zmc2V0ID0gMDsKLSAgVHlwZWRlZiogY29uc3QqIGFyZ3VtZW50cyA9IHNpZ25hdHVyZS0+Z2V0QXJndW1lbnRzVHlwZSgpOwotICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IHNpZ25hdHVyZS0+bmJBcmd1bWVudHM7IGkrKykgewotICAgIGlmIChhcmd1bWVudHNbaV0tPmlzRG91YmxlKCkgfHwgYXJndW1lbnRzW2ldLT5pc0xvbmcoKSkgewotICAgICAgb2Zmc2V0Kys7Ci0gICAgfQotICAgIG9mZnNldCsrOwotICB9Ci0gIHJldHVybiBvYmplY3RTdGFja1tjdXJyZW50U3RhY2tJbmRleCAtIDEgLSBvZmZzZXRdOwotfQotCi1JbnN0cnVjdGlvbiogSmF2YUpJVDo6bG93ZXJNYXRoT3BzKGNvbnN0IFVURjgqIG5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxWYWx1ZSo+JiBhcmdzKSB7Ci0gIGlmIChuYW1lLT5lcXVhbHModXBjYWxscy0+YWJzKSkgewotICAgIGNvbnN0IFR5cGUqIFR5ID0gYXJnc1swXS0+Z2V0VHlwZSgpOwotICAgIGlmIChUeSA9PSBUeXBlOjpnZXRJbnQzMlR5KCpsbHZtQ29udGV4dCkpIHsKLSAgICAgIENvbnN0YW50KiBjb25zdF9pbnQzMl85ID0gaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvOwotICAgICAgQ29uc3RhbnQqIGNvbnN0X2ludDMyXzEwID0gaW50cmluc2ljcy0+Y29uc3RhbnRNaW51c09uZTsKLSAgICAgIEJpbmFyeU9wZXJhdG9yKiBpbnQzMl90bXBuZWcgPSAKLSAgICAgICAgQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZShJbnN0cnVjdGlvbjo6U3ViLCBjb25zdF9pbnQzMl85LCBhcmdzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0bXBuZWciLCBjdXJyZW50QmxvY2spOwotICAgICAgSUNtcEluc3QqIGludDFfYWJzY29uZCA9IAotICAgICAgICBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfU0dULCBhcmdzWzBdLCBjb25zdF9pbnQzMl8xMCwKLSAgICAgICAgICAgICAgICAgICAgICJhYnNjb25kIik7Ci0gICAgICByZXR1cm4gbGx2bTo6U2VsZWN0SW5zdDo6Q3JlYXRlKGludDFfYWJzY29uZCwgYXJnc1swXSwgaW50MzJfdG1wbmVnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJzIiwgY3VycmVudEJsb2NrKTsKLSAgICB9IGVsc2UgaWYgKFR5ID09IFR5cGU6OmdldEludDY0VHkoKmxsdm1Db250ZXh0KSkgewotICAgICAgQ29uc3RhbnQqIGNvbnN0X2ludDY0XzkgPSBpbnRyaW5zaWNzLT5jb25zdGFudExvbmdaZXJvOwotICAgICAgQ29uc3RhbnQqIGNvbnN0X2ludDY0XzEwID0gaW50cmluc2ljcy0+Y29uc3RhbnRMb25nTWludXNPbmU7Ci0gICAgICAKLSAgICAgIEJpbmFyeU9wZXJhdG9yKiBpbnQ2NF90bXBuZWcgPSAKLSAgICAgICAgQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZShJbnN0cnVjdGlvbjo6U3ViLCBjb25zdF9pbnQ2NF85LCBhcmdzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0bXBuZWciLCBjdXJyZW50QmxvY2spOwotCi0gICAgICBJQ21wSW5zdCogaW50MV9hYnNjb25kID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX1NHVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1swXSwgY29uc3RfaW50NjRfMTAsICJhYnNjb25kIik7Ci0gICAgICAKLSAgICAgIHJldHVybiBsbHZtOjpTZWxlY3RJbnN0OjpDcmVhdGUoaW50MV9hYnNjb25kLCBhcmdzWzBdLCBpbnQ2NF90bXBuZWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYnMiLCBjdXJyZW50QmxvY2spOwotICAgIH0gZWxzZSBpZiAoVHkgPT0gVHlwZTo6Z2V0RmxvYXRUeSgqbGx2bUNvbnRleHQpKSB7Ci0gICAgICByZXR1cm4gbGx2bTo6Q2FsbEluc3Q6OkNyZWF0ZShpbnRyaW5zaWNzLT5mdW5jX2xsdm1fZmFic19mMzIsIGFyZ3NbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG1wMSIsIGN1cnJlbnRCbG9jayk7Ci0gICAgfSBlbHNlIGlmIChUeSA9PSBUeXBlOjpnZXREb3VibGVUeSgqbGx2bUNvbnRleHQpKSB7Ci0gICAgICByZXR1cm4gbGx2bTo6Q2FsbEluc3Q6OkNyZWF0ZShpbnRyaW5zaWNzLT5mdW5jX2xsdm1fZmFic19mNjQsIGFyZ3NbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG1wMSIsIGN1cnJlbnRCbG9jayk7Ci0gICAgfQotICB9IGVsc2UgaWYgKG5hbWUtPmVxdWFscyh1cGNhbGxzLT5zcXJ0KSkgewotICAgIHJldHVybiBsbHZtOjpDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPmZ1bmNfbGx2bV9zcXJ0X2Y2NCwgYXJnc1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG1wMSIsIGN1cnJlbnRCbG9jayk7Ci0gIH0gZWxzZSBpZiAobmFtZS0+ZXF1YWxzKHVwY2FsbHMtPnNpbikpIHsKLSAgICByZXR1cm4gbGx2bTo6Q2FsbEluc3Q6OkNyZWF0ZShpbnRyaW5zaWNzLT5mdW5jX2xsdm1fc2luX2Y2NCwgYXJnc1swXSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRtcDEiLCBjdXJyZW50QmxvY2spOwotICB9IGVsc2UgaWYgKG5hbWUtPmVxdWFscyh1cGNhbGxzLT5jb3MpKSB7Ci0gICAgcmV0dXJuIGxsdm06OkNhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+ZnVuY19sbHZtX2Nvc19mNjQsIGFyZ3NbMF0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0bXAxIiwgY3VycmVudEJsb2NrKTsKLSAgfSBlbHNlIGlmIChuYW1lLT5lcXVhbHModXBjYWxscy0+dGFuKSkgewotICAgIHJldHVybiBsbHZtOjpDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPmZ1bmNfbGx2bV90YW5fZjY0LCBhcmdzWzBdLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG1wMSIsIGN1cnJlbnRCbG9jayk7Ci0gIH0gZWxzZSBpZiAobmFtZS0+ZXF1YWxzKHVwY2FsbHMtPmFzaW4pKSB7Ci0gICAgcmV0dXJuIGxsdm06OkNhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+ZnVuY19sbHZtX2FzaW5fZjY0LCBhcmdzWzBdLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG1wMSIsIGN1cnJlbnRCbG9jayk7Ci0gIH0gZWxzZSBpZiAobmFtZS0+ZXF1YWxzKHVwY2FsbHMtPmFjb3MpKSB7Ci0gICAgcmV0dXJuIGxsdm06OkNhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+ZnVuY19sbHZtX2Fjb3NfZjY0LCBhcmdzWzBdLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG1wMSIsIGN1cnJlbnRCbG9jayk7Ci0gIH0gZWxzZSBpZiAobmFtZS0+ZXF1YWxzKHVwY2FsbHMtPmF0YW4pKSB7Ci0gICAgcmV0dXJuIGxsdm06OkNhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+ZnVuY19sbHZtX2F0YW5fZjY0LCBhcmdzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0bXAxIiwgY3VycmVudEJsb2NrKTsKLSAgfSBlbHNlIGlmIChuYW1lLT5lcXVhbHModXBjYWxscy0+YXRhbjIpKSB7Ci0gICAgcmV0dXJuIGxsdm06OkNhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+ZnVuY19sbHZtX2F0YW4yX2Y2NCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5iZWdpbigpLCBhcmdzLmVuZCgpLCAidG1wMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgfSBlbHNlIGlmIChuYW1lLT5lcXVhbHModXBjYWxscy0+ZXhwKSkgewotICAgIHJldHVybiBsbHZtOjpDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPmZ1bmNfbGx2bV9leHBfZjY0LCBhcmdzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0bXAxIiwgY3VycmVudEJsb2NrKTsKLSAgfSBlbHNlIGlmIChuYW1lLT5lcXVhbHModXBjYWxscy0+bG9nKSkgewotICAgIHJldHVybiBsbHZtOjpDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPmZ1bmNfbGx2bV9sb2dfZjY0LCBhcmdzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0bXAxIiwgY3VycmVudEJsb2NrKTsKLSAgfSBlbHNlIGlmIChuYW1lLT5lcXVhbHModXBjYWxscy0+cG93KSkgewotICAgIHJldHVybiBsbHZtOjpDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPmZ1bmNfbGx2bV9wb3dfZjY0LCBhcmdzLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5lbmQoKSwgInRtcDEiLCBjdXJyZW50QmxvY2spOwotICB9IGVsc2UgaWYgKG5hbWUtPmVxdWFscyh1cGNhbGxzLT5jZWlsKSkgewotICAgIHJldHVybiBsbHZtOjpDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPmZ1bmNfbGx2bV9jZWlsX2Y2NCwgYXJnc1swXSwgInRtcDEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gIH0gZWxzZSBpZiAobmFtZS0+ZXF1YWxzKHVwY2FsbHMtPmZsb29yKSkgewotICAgIHJldHVybiBsbHZtOjpDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPmZ1bmNfbGx2bV9mbG9vcl9mNjQsIGFyZ3NbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRtcDEiLCBjdXJyZW50QmxvY2spOwotICB9IGVsc2UgaWYgKG5hbWUtPmVxdWFscyh1cGNhbGxzLT5yaW50KSkgewotICAgIHJldHVybiBsbHZtOjpDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPmZ1bmNfbGx2bV9yaW50X2Y2NCwgYXJnc1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG1wMSIsIGN1cnJlbnRCbG9jayk7Ci0gIH0gZWxzZSBpZiAobmFtZS0+ZXF1YWxzKHVwY2FsbHMtPmNicnQpKSB7Ci0gICAgcmV0dXJuIGxsdm06OkNhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+ZnVuY19sbHZtX2NicnRfZjY0LCBhcmdzWzBdLCAidG1wMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgfSBlbHNlIGlmIChuYW1lLT5lcXVhbHModXBjYWxscy0+Y29zaCkpIHsKLSAgICByZXR1cm4gbGx2bTo6Q2FsbEluc3Q6OkNyZWF0ZShpbnRyaW5zaWNzLT5mdW5jX2xsdm1fY29zaF9mNjQsIGFyZ3NbMF0sICJ0bXAxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICB9IGVsc2UgaWYgKG5hbWUtPmVxdWFscyh1cGNhbGxzLT5leHBtMSkpIHsKLSAgICByZXR1cm4gbGx2bTo6Q2FsbEluc3Q6OkNyZWF0ZShpbnRyaW5zaWNzLT5mdW5jX2xsdm1fZXhwbTFfZjY0LCBhcmdzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0bXAxIiwgY3VycmVudEJsb2NrKTsKLSAgfSBlbHNlIGlmIChuYW1lLT5lcXVhbHModXBjYWxscy0+aHlwb3QpKSB7Ci0gICAgcmV0dXJuIGxsdm06OkNhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+ZnVuY19sbHZtX2h5cG90X2Y2NCwgYXJnc1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG1wMSIsIGN1cnJlbnRCbG9jayk7Ci0gIH0gZWxzZSBpZiAobmFtZS0+ZXF1YWxzKHVwY2FsbHMtPmxvZzEwKSkgewotICAgIHJldHVybiBsbHZtOjpDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPmZ1bmNfbGx2bV9sb2cxMF9mNjQsIGFyZ3NbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRtcDEiLCBjdXJyZW50QmxvY2spOwotICB9IGVsc2UgaWYgKG5hbWUtPmVxdWFscyh1cGNhbGxzLT5sb2cxcCkpIHsKLSAgICByZXR1cm4gbGx2bTo6Q2FsbEluc3Q6OkNyZWF0ZShpbnRyaW5zaWNzLT5mdW5jX2xsdm1fbG9nMXBfZjY0LCBhcmdzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0bXAxIiwgY3VycmVudEJsb2NrKTsKLSAgfSBlbHNlIGlmIChuYW1lLT5lcXVhbHModXBjYWxscy0+c2luaCkpIHsKLSAgICByZXR1cm4gbGx2bTo6Q2FsbEluc3Q6OkNyZWF0ZShpbnRyaW5zaWNzLT5mdW5jX2xsdm1fc2luaF9mNjQsIGFyZ3NbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRtcDEiLCBjdXJyZW50QmxvY2spOwotICB9IGVsc2UgaWYgKG5hbWUtPmVxdWFscyh1cGNhbGxzLT50YW5oKSkgewotICAgIHJldHVybiBsbHZtOjpDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPmZ1bmNfbGx2bV90YW5oX2Y2NCwgYXJnc1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG1wMSIsIGN1cnJlbnRCbG9jayk7Ci0gIH0KLSAgCi0gIHJldHVybiAwOwotCi19Ci0KLQotSW5zdHJ1Y3Rpb24qIEphdmFKSVQ6Omludm9rZUlubGluZShKYXZhTWV0aG9kKiBtZXRoLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VmFsdWUqPiYgYXJncykgewotICBKYXZhSklUIGppdChUaGVDb21waWxlciwgbWV0aCwgbGx2bUZ1bmN0aW9uKTsKLSAgaml0LnVuaWZpZWRVbnJlYWNoYWJsZSA9IHVuaWZpZWRVbnJlYWNoYWJsZTsKLSAgaml0LmlubGluZU1ldGhvZHMgPSBpbmxpbmVNZXRob2RzOwotICBqaXQuaW5saW5lTWV0aG9kc1ttZXRoXSA9IHRydWU7Ci0gIGppdC5pbmxpbmluZyA9IHRydWU7Ci0gIEluc3RydWN0aW9uKiByZXQgPSBqaXQuaW5saW5lQ29tcGlsZShjdXJyZW50QmxvY2ssIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEV4Y2VwdGlvbkJsb2NrLCBhcmdzKTsKLSAgaW5saW5lTWV0aG9kc1ttZXRoXSA9IGZhbHNlOwotICByZXR1cm4gcmV0OwotfQotCi12b2lkIEphdmFKSVQ6Omludm9rZVNwZWNpYWwodWludDE2IGluZGV4KSB7Ci0gIEphdmFDb25zdGFudFBvb2wqIGN0cEluZm8gPSBjb21waWxpbmdDbGFzcy0+Y3RwSW5mbzsKLSAgSmF2YU1ldGhvZCogbWV0aCA9IDA7Ci0gIFNpZ25kZWYqIHNpZ25hdHVyZSA9IDA7Ci0gIGNvbnN0IFVURjgqIG5hbWUgPSAwOwotICBjb25zdCBVVEY4KiBjbCA9IDA7Ci0KLSAgY3RwSW5mby0+bmFtZU9mU3RhdGljT3JTcGVjaWFsTWV0aG9kKGluZGV4LCBjbCwgbmFtZSwgc2lnbmF0dXJlKTsKLSAgTExWTVNpZ25hdHVyZUluZm8qIExTSSA9IFRoZUNvbXBpbGVyLT5nZXRTaWduYXR1cmVJbmZvKHNpZ25hdHVyZSk7Ci0gIGNvbnN0IGxsdm06OkZ1bmN0aW9uVHlwZSogdmlydHVhbFR5cGUgPSBMU0ktPmdldFZpcnR1YWxUeXBlKCk7Ci0gIGxsdm06Okluc3RydWN0aW9uKiB2YWwgPSAwOwotCi0gIGlmICghbWV0aCkgewotICAgIG1ldGggPSBjdHBJbmZvLT5pbmZvT2ZTdGF0aWNPclNwZWNpYWxNZXRob2QoaW5kZXgsIEFDQ19WSVJUVUFMLCBzaWduYXR1cmUpOwotICB9Ci0KLSAgVmFsdWUqIGZ1bmMgPSAwOwotICBib29sIG5lZWRzSW5pdCA9IGZhbHNlOwotICBpZiAoVGhlQ29tcGlsZXItPm5lZWRzQ2FsbGJhY2sobWV0aCwgJm5lZWRzSW5pdCkpIHsKLSAgICBpZiAobmVlZHNJbml0KSB7Ci0gICAgICAvLyBNYWtlIHN1cmUgdGhlIGNsYXNzIGlzIGxvYWRlZCBiZWZvcmUgbWF0ZXJpYWxpemluZyB0aGUgbWV0aG9kLgotICAgICAgdWludDMyIGNsSW5kZXggPSBjdHBJbmZvLT5nZXRDbGFzc0luZGV4RnJvbU1ldGhvZChpbmRleCk7Ci0gICAgICBVc2VyQ29tbW9uQ2xhc3MqIGNsID0gMDsKLSAgICAgIFZhbHVlKiBDbCA9IGdldFJlc29sdmVkQ29tbW9uQ2xhc3MoY2xJbmRleCwgZmFsc2UsICZjbCk7Ci0gICAgICBpZiAoY2wgPT0gTlVMTCkgewotICAgICAgICBDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPkZvcmNlTG9hZGVkQ2hlY2tGdW5jdGlvbiwgQ2wsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gICAgICB9Ci0gICAgfQotICAgIGZ1bmMgPSBUaGVDb21waWxlci0+YWRkQ2FsbGJhY2soY29tcGlsaW5nQ2xhc3MsIGluZGV4LCBzaWduYXR1cmUsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgfSBlbHNlIHsKLSAgICBmdW5jID0gVGhlQ29tcGlsZXItPmdldE1ldGhvZChtZXRoKTsKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPFZhbHVlKj4gYXJnczsKLSAgRnVuY3Rpb25UeXBlOjpwYXJhbV9pdGVyYXRvciBpdCAgPSB2aXJ0dWFsVHlwZS0+cGFyYW1fZW5kKCk7Ci0gIG1ha2VBcmdzKGl0LCBpbmRleCwgYXJncywgc2lnbmF0dXJlLT5uYkFyZ3VtZW50cyArIDEpOwotICBKSVRWZXJpZnlOdWxsKGFyZ3NbMF0pOyAKLSAgCi0gIGlmIChtZXRoID09IHVwY2FsbHMtPkluaXRPYmplY3QpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAobWV0aCAmJiBjYW5CZUlubGluZWQobWV0aCkpIHsKLSAgICB2YWwgPSBpbnZva2VJbmxpbmUobWV0aCwgYXJncyk7Ci0gIH0gZWxzZSB7Ci0gICAgdmFsID0gaW52b2tlKGZ1bmMsIGFyZ3MsICIiLCBjdXJyZW50QmxvY2spOwotICB9Ci0gIAotICBjb25zdCBsbHZtOjpUeXBlKiByZXRUeXBlID0gdmlydHVhbFR5cGUtPmdldFJldHVyblR5cGUoKTsKLSAgaWYgKHJldFR5cGUgIT0gVHlwZTo6Z2V0Vm9pZFR5KCpsbHZtQ29udGV4dCkpIHsKLSAgICBpZiAocmV0VHlwZSA9PSBpbnRyaW5zaWNzLT5KYXZhT2JqZWN0VHlwZSkgewotICAgICAgSm5qdm1DbGFzc0xvYWRlciogSkNMID0gY29tcGlsaW5nQ2xhc3MtPmNsYXNzTG9hZGVyOwotICAgICAgcHVzaCh2YWwsIGZhbHNlLCBzaWduYXR1cmUtPmdldFJldHVyblR5cGUoKS0+ZmluZEFzc29jQ2xhc3MoSkNMKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHB1c2godmFsLCBzaWduYXR1cmUtPmdldFJldHVyblR5cGUoKS0+aXNVbnNpZ25lZCgpKTsKLSAgICAgIGlmIChyZXRUeXBlID09IFR5cGU6OmdldERvdWJsZVR5KCpsbHZtQ29udGV4dCkgfHwKLSAgICAgICAgICByZXRUeXBlID09IFR5cGU6OmdldEludDY0VHkoKmxsdm1Db250ZXh0KSkgewotICAgICAgICBwdXNoKGludHJpbnNpY3MtPmNvbnN0YW50WmVybywgZmFsc2UpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIEphdmFKSVQ6Omludm9rZVN0YXRpYyh1aW50MTYgaW5kZXgpIHsKLSAgSmF2YUNvbnN0YW50UG9vbCogY3RwSW5mbyA9IGNvbXBpbGluZ0NsYXNzLT5jdHBJbmZvOwotICBTaWduZGVmKiBzaWduYXR1cmUgPSAwOwotICBjb25zdCBVVEY4KiBuYW1lID0gMDsKLSAgY29uc3QgVVRGOCogY2xhc3NOYW1lID0gMDsKLSAgY3RwSW5mby0+bmFtZU9mU3RhdGljT3JTcGVjaWFsTWV0aG9kKGluZGV4LCBjbGFzc05hbWUsIG5hbWUsIHNpZ25hdHVyZSk7Ci0gIExMVk1TaWduYXR1cmVJbmZvKiBMU0kgPSBUaGVDb21waWxlci0+Z2V0U2lnbmF0dXJlSW5mbyhzaWduYXR1cmUpOwotICBjb25zdCBsbHZtOjpGdW5jdGlvblR5cGUqIHN0YXRpY1R5cGUgPSBMU0ktPmdldFN0YXRpY1R5cGUoKTsKLSAgY3RwSW5mby0+bWFya0FzU3RhdGljQ2FsbChpbmRleCk7Ci0gIGxsdm06Okluc3RydWN0aW9uKiB2YWwgPSAwOwotICAKLSAgaWYgKGNsYXNzTmFtZS0+ZXF1YWxzKHVwY2FsbHMtPnN0YWNrV2Fsa2VyTmFtZSkpIHsKLSAgICBjYWxsc1N0YWNrV2Fsa2VyID0gdHJ1ZTsKLSAgfQotCi0gIEphdmFNZXRob2QqIG1ldGggPSBjdHBJbmZvLT5pbmZvT2ZTdGF0aWNPclNwZWNpYWxNZXRob2QoaW5kZXgsIEFDQ19TVEFUSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlKTsKLSAgICAKLQotICB1aW50MzIgY2xJbmRleCA9IGN0cEluZm8tPmdldENsYXNzSW5kZXhGcm9tTWV0aG9kKGluZGV4KTsKLSAgVXNlckNsYXNzKiBjbCA9IDA7Ci0gIFZhbHVlKiBDbCA9IGdldFJlc29sdmVkQ2xhc3MoY2xJbmRleCwgdHJ1ZSwgdHJ1ZSwgJmNsKTsKLSAgaWYgKCFtZXRoIHx8IChjbCAmJiBuZWVkc0luaXRpYWxpc2F0aW9uQ2hlY2soY2wsIGNvbXBpbGluZ0NsYXNzKSkpIHsKLSAgICBDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPkZvcmNlSW5pdGlhbGlzYXRpb25DaGVja0Z1bmN0aW9uLCBDbCwgIiIsCi0gICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICB9Ci0gIAotICBWYWx1ZSogZnVuYyA9IDA7Ci0gIGJvb2wgbmVlZHNJbml0ID0gZmFsc2U7Ci0gIGlmIChUaGVDb21waWxlci0+bmVlZHNDYWxsYmFjayhtZXRoLCAmbmVlZHNJbml0KSkgewotICAgIGZ1bmMgPSBUaGVDb21waWxlci0+YWRkQ2FsbGJhY2soY29tcGlsaW5nQ2xhc3MsIGluZGV4LCBzaWduYXR1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBjdXJyZW50QmxvY2spOwotICB9IGVsc2UgewotICAgIGZ1bmMgPSBUaGVDb21waWxlci0+Z2V0TWV0aG9kKG1ldGgpOwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8VmFsdWUqPiBhcmdzOyAvLyBzaXplID0gW3NpZ25hdHVyZS0+bmJJbiArIDJdOyAKLSAgRnVuY3Rpb25UeXBlOjpwYXJhbV9pdGVyYXRvciBpdCAgPSBzdGF0aWNUeXBlLT5wYXJhbV9lbmQoKTsKLSAgbWFrZUFyZ3MoaXQsIGluZGV4LCBhcmdzLCBzaWduYXR1cmUtPm5iQXJndW1lbnRzKTsKLQotICBpZiAoY2xhc3NOYW1lLT5lcXVhbHModXBjYWxscy0+bWF0aE5hbWUpKSB7Ci0gICAgdmFsID0gbG93ZXJNYXRoT3BzKG5hbWUsIGFyZ3MpOwotICB9Ci0gICAgCi0gIGlmICh2YWwgPT0gTlVMTCkgewotICAgIGlmIChtZXRoICE9IE5VTEwgJiYgY2FuQmVJbmxpbmVkKG1ldGgpKSB7Ci0gICAgICB2YWwgPSBpbnZva2VJbmxpbmUobWV0aCwgYXJncyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHZhbCA9IGludm9rZShmdW5jLCBhcmdzLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICB9Ci0gIH0KLQotICBjb25zdCBsbHZtOjpUeXBlKiByZXRUeXBlID0gc3RhdGljVHlwZS0+Z2V0UmV0dXJuVHlwZSgpOwotICBpZiAocmV0VHlwZSAhPSBUeXBlOjpnZXRWb2lkVHkoKmxsdm1Db250ZXh0KSkgewotICAgIGlmIChyZXRUeXBlID09IGludHJpbnNpY3MtPkphdmFPYmplY3RUeXBlKSB7Ci0gICAgICBKbmp2bUNsYXNzTG9hZGVyKiBKQ0wgPSBjb21waWxpbmdDbGFzcy0+Y2xhc3NMb2FkZXI7Ci0gICAgICBwdXNoKHZhbCwgZmFsc2UsIHNpZ25hdHVyZS0+Z2V0UmV0dXJuVHlwZSgpLT5maW5kQXNzb2NDbGFzcyhKQ0wpKTsKLSAgICB9IGVsc2UgewotICAgICAgcHVzaCh2YWwsIHNpZ25hdHVyZS0+Z2V0UmV0dXJuVHlwZSgpLT5pc1Vuc2lnbmVkKCkpOwotICAgICAgaWYgKHJldFR5cGUgPT0gVHlwZTo6Z2V0RG91YmxlVHkoKmxsdm1Db250ZXh0KSB8fAotICAgICAgICAgIHJldFR5cGUgPT0gVHlwZTo6Z2V0SW50NjRUeSgqbGx2bUNvbnRleHQpKSB7Ci0gICAgICAgIHB1c2goaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCBmYWxzZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLVZhbHVlKiBKYXZhSklUOjpnZXRDb25zdGFudFBvb2xBdCh1aW50MzIgaW5kZXgsIEZ1bmN0aW9uKiByZXNvbHZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlKiByZXR1cm5UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlKiBhZGRpdGlvbmFsQXJnLCBib29sIGRvVGhyb3cpIHsKLQotLy8gVGhpcyBtYWtlcyB1bnN3aXRjaCBsb29wIHZlcnkgdW5oYXBweSB0aW1lLXdpc2UsIGJ1dCBtYWtlcyBHVk4gaGFwcHkKLS8vIG51bWJlci13aXNlLiBJTU8sIGl0J3MgYmV0dGVyIHRvIGhhdmUgdGhpcyB0aGFuIFVuc3dpdGNoLgotICBKYXZhQ29uc3RhbnRQb29sKiBjdHAgPSBjb21waWxpbmdDbGFzcy0+Y3RwSW5mbzsKLSAgVmFsdWUqIENUUCA9IFRoZUNvbXBpbGVyLT5nZXRDb25zdGFudFBvb2woY3RwKTsKLSAgVmFsdWUqIENsID0gVGhlQ29tcGlsZXItPmdldE5hdGl2ZUNsYXNzKGNvbXBpbGluZ0NsYXNzKTsKLQotICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IEFyZ3M7Ci0gIEFyZ3MucHVzaF9iYWNrKHJlc29sdmVyKTsKLSAgQXJncy5wdXNoX2JhY2soQ1RQKTsKLSAgQXJncy5wdXNoX2JhY2soQ2wpOwotICBBcmdzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSwgaW5kZXgpKTsKLSAgaWYgKGFkZGl0aW9uYWxBcmcpIEFyZ3MucHVzaF9iYWNrKGFkZGl0aW9uYWxBcmcpOwotCi0gIFZhbHVlKiByZXMgPSAwOwotICBpZiAoZG9UaHJvdykgewotICAgIHJlcyA9IGludm9rZShpbnRyaW5zaWNzLT5HZXRDb25zdGFudFBvb2xBdEZ1bmN0aW9uLCBBcmdzLCAiIiwKLSAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgfSBlbHNlIHsKLSAgICByZXMgPSBDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPkdldENvbnN0YW50UG9vbEF0RnVuY3Rpb24sIEFyZ3MuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ3MuZW5kKCksICIiLCBjdXJyZW50QmxvY2spOwotICB9Ci0gIAotICBjb25zdCBUeXBlKiByZWFsVHlwZSA9IAotICAgIGludHJpbnNpY3MtPkdldENvbnN0YW50UG9vbEF0RnVuY3Rpb24tPmdldFJldHVyblR5cGUoKTsKLSAgaWYgKHJldHVyblR5cGUgPT0gVHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpKSB7Ci0gICAgcmV0dXJuIG5ldyBQdHJUb0ludEluc3QocmVzLCBUeXBlOjpnZXRJbnQzMlR5KCpsbHZtQ29udGV4dCksICIiLCBjdXJyZW50QmxvY2spOwotICB9IGVsc2UgaWYgKHJldHVyblR5cGUgIT0gcmVhbFR5cGUpIHsKLSAgICByZXR1cm4gbmV3IEJpdENhc3RJbnN0KHJlcywgcmV0dXJuVHlwZSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIH0gCi0gIAotICByZXR1cm4gcmVzOwotfQotCi1WYWx1ZSogSmF2YUpJVDo6Z2V0UmVzb2x2ZWRDb21tb25DbGFzcyh1aW50MTYgaW5kZXgsIGJvb2wgZG9UaHJvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJDb21tb25DbGFzcyoqIGFscmVhZHlSZXNvbHZlZCkgewotICAgIAotICBKYXZhQ29uc3RhbnRQb29sKiBjdHBJbmZvID0gY29tcGlsaW5nQ2xhc3MtPmN0cEluZm87Ci0gIENvbW1vbkNsYXNzKiBjbCA9IGN0cEluZm8tPmdldE1ldGhvZENsYXNzSWZMb2FkZWQoaW5kZXgpOwotICBWYWx1ZSogbm9kZSA9IDA7Ci0gIGlmIChjbCAmJiAoIWNsLT5pc0NsYXNzKCkgfHwgY2wtPmFzQ2xhc3MoKS0+aXNSZXNvbHZlZCgpKSkgewotICAgIGlmIChhbHJlYWR5UmVzb2x2ZWQpICphbHJlYWR5UmVzb2x2ZWQgPSBjbDsKLSAgICBub2RlID0gVGhlQ29tcGlsZXItPmdldE5hdGl2ZUNsYXNzKGNsKTsKLSAgICAvLyBTaW5jZSB3ZSBvbmx5IGFsbG9jYXRlIGZvciBhcnJheSBjbGFzc2VzIHRoYXQgd2Ugb3duIGFuZAotICAgIC8vIG9ueSBwcmltaXRpdmUgYXJyYXlzIGFyZSBhbHJlYWR5IGFsbG9jYXRlZCwgdmVyaWZ5IHRoYXQgdGhlIGNsYXNzCi0gICAgLy8gYXJyYXkgaXMgbm90IGV4dGVybmFsLgotICAgIGlmIChUaGVDb21waWxlci0+aXNTdGF0aWNDb21waWxpbmcoKSAmJiBjbC0+aXNBcnJheSgpICYmIAotICAgICAgICBub2RlLT5nZXRUeXBlKCkgIT0gaW50cmluc2ljcy0+SmF2YUNsYXNzQXJyYXlUeXBlKSB7Ci0gICAgICBub2RlID0gbmV3IExvYWRJbnN0KG5vZGUsICIiLCBjdXJyZW50QmxvY2spOwotICAgIH0KLSAgICBpZiAobm9kZS0+Z2V0VHlwZSgpICE9IGludHJpbnNpY3MtPkphdmFDb21tb25DbGFzc1R5cGUpIHsKLSAgICAgIG5vZGUgPSBuZXcgQml0Q2FzdEluc3Qobm9kZSwgaW50cmluc2ljcy0+SmF2YUNvbW1vbkNsYXNzVHlwZSwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIG5vZGUgPSBnZXRDb25zdGFudFBvb2xBdChpbmRleCwgaW50cmluc2ljcy0+Q2xhc3NMb29rdXBGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmluc2ljcy0+SmF2YUNvbW1vbkNsYXNzVHlwZSwgMCwgZG9UaHJvdyk7Ci0gIH0KLSAgCi0gIHJldHVybiBub2RlOwotfQotCi1WYWx1ZSogSmF2YUpJVDo6Z2V0UmVzb2x2ZWRDbGFzcyh1aW50MTYgaW5kZXgsIGJvb2wgY2xpbml0LCBib29sIGRvVGhyb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyoqIGFscmVhZHlSZXNvbHZlZCkgewotICAgIAotICBKYXZhQ29uc3RhbnRQb29sKiBjdHBJbmZvID0gY29tcGlsaW5nQ2xhc3MtPmN0cEluZm87Ci0gIENsYXNzKiBjbCA9IChDbGFzcyopKGN0cEluZm8tPmdldE1ldGhvZENsYXNzSWZMb2FkZWQoaW5kZXgpKTsKLSAgVmFsdWUqIG5vZGUgPSAwOwotICBib29sIG5lZWRzSW5pdCA9IHRydWU7Ci0gIGlmIChjbCAmJiBjbC0+aXNSZXNvbHZlZCgpKSB7Ci0gICAgaWYgKGFscmVhZHlSZXNvbHZlZCkgKCphbHJlYWR5UmVzb2x2ZWQpID0gY2w7Ci0gICAgbm9kZSA9IFRoZUNvbXBpbGVyLT5nZXROYXRpdmVDbGFzcyhjbCk7Ci0gICAgbmVlZHNJbml0ID0gbmVlZHNJbml0aWFsaXNhdGlvbkNoZWNrKGNsLCBjb21waWxpbmdDbGFzcyk7Ci0gIH0gZWxzZSB7Ci0gICAgbm9kZSA9IGdldENvbnN0YW50UG9vbEF0KGluZGV4LCBpbnRyaW5zaWNzLT5DbGFzc0xvb2t1cEZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5KYXZhQ2xhc3NUeXBlLCAwLCBkb1Rocm93KTsKLSAgfQotIAotCi0gIGlmIChjbGluaXQgJiYgbmVlZHNJbml0KSB7Ci0gICAgaWYgKG5vZGUtPmdldFR5cGUoKSAhPSBpbnRyaW5zaWNzLT5KYXZhQ2xhc3NUeXBlKSB7Ci0gICAgICBub2RlID0gbmV3IEJpdENhc3RJbnN0KG5vZGUsIGludHJpbnNpY3MtPkphdmFDbGFzc1R5cGUsICIiLCBjdXJyZW50QmxvY2spOwotICAgIH0KLSAgICByZXR1cm4gaW52b2tlKGludHJpbnNpY3MtPkluaXRpYWxpc2F0aW9uQ2hlY2tGdW5jdGlvbiwgbm9kZSwgIiIsCi0gICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICB9IGVsc2UgewotICAgIHJldHVybiBub2RlOwotICB9Ci19Ci0KLXZvaWQgSmF2YUpJVDo6aW52b2tlTmV3KHVpbnQxNiBpbmRleCkgewotICAKLSAgQ2xhc3MqIGNsID0gMDsKLSAgVmFsdWUqIENsID0gZ2V0UmVzb2x2ZWRDbGFzcyhpbmRleCwgdHJ1ZSwgdHJ1ZSwgJmNsKTsKLSAgICAgICAgICAKLSAgVmFsdWUqIFZUID0gMDsKLSAgVmFsdWUqIFNpemUgPSAwOwotICAKLSAgaWYgKGNsKSB7Ci0gICAgVlQgPSBUaGVDb21waWxlci0+Z2V0VmlydHVhbFRhYmxlKGNsLT52aXJ0dWFsVlQpOwotICAgIExMVk1DbGFzc0luZm8qIExDSSA9IFRoZUNvbXBpbGVyLT5nZXRDbGFzc0luZm8oY2wpOwotICAgIFNpemUgPSBMQ0ktPmdldFZpcnR1YWxTaXplKCk7Ci0gICAgCi0gICAgYm9vbCBuZWVkc0NoZWNrID0gbmVlZHNJbml0aWFsaXNhdGlvbkNoZWNrKGNsLCBjb21waWxpbmdDbGFzcyk7Ci0gICAgaWYgKG5lZWRzQ2hlY2spIHsKLSAgICAgIENsID0gaW52b2tlKGludHJpbnNpY3MtPkZvcmNlSW5pdGlhbGlzYXRpb25DaGVja0Z1bmN0aW9uLCBDbCwgIiIsCi0gICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICAgIH0KLQotICB9IGVsc2UgewotICAgIFZUID0gQ2FsbEluc3Q6OkNyZWF0ZShpbnRyaW5zaWNzLT5HZXRWVEZyb21DbGFzc0Z1bmN0aW9uLCBDbCwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gICAgU2l6ZSA9IENhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+R2V0T2JqZWN0U2l6ZUZyb21DbGFzc0Z1bmN0aW9uLCBDbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgY3VycmVudEJsb2NrKTsKLSAgfQotIAotICBWVCA9IG5ldyBCaXRDYXN0SW5zdChWVCwgaW50cmluc2ljcy0+cHRyVHlwZSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIEluc3RydWN0aW9uKiB2YWwgPSBpbnZva2UoY2wgPyBpbnRyaW5zaWNzLT5BbGxvY2F0ZUZ1bmN0aW9uIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPkFsbG9jYXRlVW5yZXNvbHZlZEZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSwgVlQsICIiLCBjdXJyZW50QmxvY2spOwotCi0gIGFkZEhpZ2hMZXZlbFR5cGUodmFsLCBjbCA/IGNsIDogdXBjYWxscy0+T2ZPYmplY3QpOwotICBJbnN0cnVjdGlvbiogcmVzID0gbmV3IEJpdENhc3RJbnN0KHZhbCwgaW50cmluc2ljcy0+SmF2YU9iamVjdFR5cGUsICIiLCBjdXJyZW50QmxvY2spOwotICBwdXNoKHJlcywgZmFsc2UsIGNsID8gY2wgOiB1cGNhbGxzLT5PZk9iamVjdCk7Ci0KLSAgLy8gTWFrZSBzdXJlIHRvIGFkZCB0aGUgb2JqZWN0IHRvIHRoZSBmaW5hbGl6YXRpb24gbGlzdCBhZnRlciBpdCBoYXMgYmVlbgotICAvLyBwdXNoZWQuCi0gIGlmIChjbCAmJiBjbC0+dmlydHVhbFZULT5kZXN0cnVjdG9yKSB7Ci0gICAgQ2FsbEluc3Q6OkNyZWF0ZShpbnRyaW5zaWNzLT5BZGRGaW5hbGl6YXRpb25DYW5kaWRhdGUsIHZhbCwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIH0KLX0KLQotVmFsdWUqIEphdmFKSVQ6OmxkUmVzb2x2ZWQodWludDE2IGluZGV4LCBib29sIHN0YXQsIFZhbHVlKiBvYmplY3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSogZmllbGRUeXBlUHRyKSB7Ci0gIEphdmFDb25zdGFudFBvb2wqIGluZm8gPSBjb21waWxpbmdDbGFzcy0+Y3RwSW5mbzsKLSAgCi0gIEphdmFGaWVsZCogZmllbGQgPSBpbmZvLT5sb29rdXBGaWVsZChpbmRleCwgc3RhdCk7Ci0gIGlmIChmaWVsZCAmJiBmaWVsZC0+Y2xhc3NEZWYtPmlzUmVzb2x2ZWQoKSkgewotICAgIExMVk1DbGFzc0luZm8qIExDSSA9IFRoZUNvbXBpbGVyLT5nZXRDbGFzc0luZm8oZmllbGQtPmNsYXNzRGVmKTsKLSAgICBMTFZNRmllbGRJbmZvKiBMRkkgPSBUaGVDb21waWxlci0+Z2V0RmllbGRJbmZvKGZpZWxkKTsKLSAgICBjb25zdCBUeXBlKiB0eXBlID0gMDsKLSAgICBpZiAoc3RhdCkgewotICAgICAgdHlwZSA9IExDSS0+Z2V0U3RhdGljVHlwZSgpOwotICAgICAgVmFsdWUqIENsID0gVGhlQ29tcGlsZXItPmdldE5hdGl2ZUNsYXNzKGZpZWxkLT5jbGFzc0RlZik7Ci0gICAgICBib29sIG5lZWRzQ2hlY2sgPSBuZWVkc0luaXRpYWxpc2F0aW9uQ2hlY2soZmllbGQtPmNsYXNzRGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGluZ0NsYXNzKTsKLSAgICAgIGlmIChuZWVkc0NoZWNrKSB7Ci0gICAgICAgIENsID0gaW52b2tlKGludHJpbnNpY3MtPkluaXRpYWxpc2F0aW9uQ2hlY2tGdW5jdGlvbiwgQ2wsICIiLAotICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICAgICAgfQotICAgICAgaWYgKG5lZWRzQ2hlY2spIHsKLSAgICAgICAgQ2FsbEluc3Q6OkNyZWF0ZShpbnRyaW5zaWNzLT5Gb3JjZUluaXRpYWxpc2F0aW9uQ2hlY2tGdW5jdGlvbiwgQ2wsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gICAgICB9Ci0KLSAgICAgIG9iamVjdCA9IFRoZUNvbXBpbGVyLT5nZXRTdGF0aWNJbnN0YW5jZShmaWVsZC0+Y2xhc3NEZWYpOwotICAgIH0gZWxzZSB7Ci0gICAgICBvYmplY3QgPSBuZXcgTG9hZEluc3QoCi0gICAgICAgICAgb2JqZWN0LCAiIiwgVGhlQ29tcGlsZXItPnVzZUNvb3BlcmF0aXZlR0MoKSwgY3VycmVudEJsb2NrKTsKLSAgICAgIEpJVFZlcmlmeU51bGwob2JqZWN0KTsKLSAgICAgIHR5cGUgPSBMQ0ktPmdldFZpcnR1YWxUeXBlKCk7Ci0gICAgfQotICAgIAotICAgIFZhbHVlKiBvYmplY3RDb252ZXJ0ID0gbmV3IEJpdENhc3RJbnN0KG9iamVjdCwgdHlwZSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0KLSAgICBWYWx1ZSogYXJnc1syXSA9IHsgaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCBMRkktPmdldE9mZnNldCgpIH07Ci0gICAgVmFsdWUqIHB0ciA9IGxsdm06OkdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUob2JqZWN0Q29udmVydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLCBhcmdzICsgMiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgICByZXR1cm4gcHRyOwotICB9Ci0KLSAgY29uc3QgVHlwZSogUHR5ID0gaW50cmluc2ljcy0+YXJyYXlQdHJUeXBlOwotICBDb25zdGFudCogemVybyA9IGludHJpbnNpY3MtPmNvbnN0YW50WmVybzsKLSAgICAKLSAgRnVuY3Rpb24qIGZ1bmMgPSBzdGF0ID8gaW50cmluc2ljcy0+U3RhdGljRmllbGRMb29rdXBGdW5jdGlvbiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPlZpcnR1YWxGaWVsZExvb2t1cEZ1bmN0aW9uOwotICAgIAotICBjb25zdCBUeXBlKiByZXR1cm5UeXBlID0gMDsKLSAgaWYgKHN0YXQpIHsKLSAgICByZXR1cm5UeXBlID0gaW50cmluc2ljcy0+cHRyVHlwZTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm5UeXBlID0gVHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpOwotICB9Ci0KLSAgVmFsdWUqIHB0ciA9IGdldENvbnN0YW50UG9vbEF0KGluZGV4LCBmdW5jLCByZXR1cm5UeXBlLCAwLCB0cnVlKTsKLSAgaWYgKCFzdGF0KSB7Ci0gICAgb2JqZWN0ID0gbmV3IExvYWRJbnN0KAotICAgICAgICBvYmplY3QsICIiLCBUaGVDb21waWxlci0+dXNlQ29vcGVyYXRpdmVHQygpLCBjdXJyZW50QmxvY2spOwotICAgIFZhbHVlKiB0bXAgPSBuZXcgQml0Q2FzdEluc3Qob2JqZWN0LCBQdHksICIiLCBjdXJyZW50QmxvY2spOwotICAgIFZhbHVlKiBhcmdzWzJdID0geyB6ZXJvLCBwdHIgfTsKLSAgICBwdHIgPSBHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlKHRtcCwgYXJncywgYXJncyArIDIsICIiLCBjdXJyZW50QmxvY2spOwotICB9Ci0gICAgCi0gIHJldHVybiBuZXcgQml0Q2FzdEluc3QocHRyLCBmaWVsZFR5cGVQdHIsICIiLCBjdXJyZW50QmxvY2spOwotfQotCi12b2lkIEphdmFKSVQ6OmNvbnZlcnRWYWx1ZShWYWx1ZSomIHZhbCwgY29uc3QgVHlwZSogdDEsIEJhc2ljQmxvY2sqIGN1cnJlbnRCbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNpZ24pIHsKLSAgY29uc3QgVHlwZSogdDIgPSB2YWwtPmdldFR5cGUoKTsKLSAgaWYgKHQxICE9IHQyKSB7Ci0gICAgaWYgKHQxLT5pc0ludGVnZXJUeSgpICYmIHQyLT5pc0ludGVnZXJUeSgpKSB7Ci0gICAgICBpZiAodDItPmdldFByaW1pdGl2ZVNpemVJbkJpdHMoKSA8IHQxLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCkpIHsKLSAgICAgICAgaWYgKHVzaWduKSB7Ci0gICAgICAgICAgdmFsID0gbmV3IFpFeHRJbnN0KHZhbCwgdDEsICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHZhbCA9IG5ldyBTRXh0SW5zdCh2YWwsIHQxLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdmFsID0gbmV3IFRydW5jSW5zdCh2YWwsIHQxLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgIH0gICAgCi0gICAgfSBlbHNlIGlmICh0MS0+aXNGbG9hdFR5KCkgJiYgdDItPmlzRmxvYXRUeSgpKSB7Ci0gICAgICBpZiAodDItPmdldFByaW1pdGl2ZVNpemVJbkJpdHMoKSA8IHQxLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCkpIHsKLSAgICAgICAgdmFsID0gbmV3IEZQRXh0SW5zdCh2YWwsIHQxLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhbCA9IG5ldyBGUFRydW5jSW5zdCh2YWwsIHQxLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgIH0gICAgCi0gICAgfSBlbHNlIGlmIChpc2E8UG9pbnRlclR5cGU+KHQxKSAmJiBpc2E8UG9pbnRlclR5cGU+KHQyKSkgewotICAgICAgdmFsID0gbmV3IEJpdENhc3RJbnN0KHZhbCwgdDEsICIiLCBjdXJyZW50QmxvY2spOwotICAgIH0gICAgCi0gIH0KLX0KLSAKLQotdm9pZCBKYXZhSklUOjpzZXRTdGF0aWNGaWVsZCh1aW50MTYgaW5kZXgpIHsKLSAgVHlwZWRlZiogc2lnbiA9IGNvbXBpbGluZ0NsYXNzLT5jdHBJbmZvLT5pbmZvT2ZGaWVsZChpbmRleCk7Ci0gIExMVk1Bc3Nlc3NvckluZm8mIExBSSA9IFRoZUNvbXBpbGVyLT5nZXRUeXBlZGVmSW5mbyhzaWduKTsKLSAgY29uc3QgVHlwZSogdHlwZSA9IExBSS5sbHZtVHlwZTsKLSAgIAotICBWYWx1ZSogcHRyID0gbGRSZXNvbHZlZChpbmRleCwgdHJ1ZSwgTlVMTCwgTEFJLmxsdm1UeXBlUHRyKTsKLQotICBWYWx1ZSogdmFsID0gcG9wKCk7IAotICBpZiAodHlwZSA9PSBUeXBlOjpnZXRJbnQ2NFR5KCpsbHZtQ29udGV4dCkgfHwKLSAgICAgIHR5cGUgPT0gVHlwZTo6Z2V0RG91YmxlVHkoKmxsdm1Db250ZXh0KSkgewotICAgIHZhbCA9IHBvcCgpOwotICB9Ci0KLSAgaWYgKHR5cGUgIT0gdmFsLT5nZXRUeXBlKCkpIHsgLy8gaW50MSwgaW50OCwgaW50MTYKLSAgICBjb252ZXJ0VmFsdWUodmFsLCB0eXBlLCBjdXJyZW50QmxvY2ssIGZhbHNlKTsKLSAgfQotCi0gIG5ldyBTdG9yZUluc3QodmFsLCBwdHIsIGZhbHNlLCBjdXJyZW50QmxvY2spOwotfQotCi12b2lkIEphdmFKSVQ6OmdldFN0YXRpY0ZpZWxkKHVpbnQxNiBpbmRleCkgewotICBUeXBlZGVmKiBzaWduID0gY29tcGlsaW5nQ2xhc3MtPmN0cEluZm8tPmluZm9PZkZpZWxkKGluZGV4KTsKLSAgTExWTUFzc2Vzc29ySW5mbyYgTEFJID0gVGhlQ29tcGlsZXItPmdldFR5cGVkZWZJbmZvKHNpZ24pOwotICBjb25zdCBUeXBlKiB0eXBlID0gTEFJLmxsdm1UeXBlOwotICAKLSAgVmFsdWUqIHB0ciA9IGxkUmVzb2x2ZWQoaW5kZXgsIHRydWUsIE5VTEwsIExBSS5sbHZtVHlwZVB0cik7Ci0gIAotICBib29sIGZpbmFsID0gZmFsc2U7Ci0KLSAgaWYgKCFjb21waWxpbmdNZXRob2QtPm5hbWUtPmVxdWFscyh1cGNhbGxzLT5jbGluaXROYW1lKSkgewotICAgIEphdmFGaWVsZCogZmllbGQgPSBjb21waWxpbmdDbGFzcy0+Y3RwSW5mby0+bG9va3VwRmllbGQoaW5kZXgsIHRydWUpOwotICAgIGlmIChmaWVsZCAmJiBmaWVsZC0+Y2xhc3NEZWYtPmlzUmVhZHkoKSkgZmluYWwgPSBpc0ZpbmFsKGZpZWxkLT5hY2Nlc3MpOwotICAgIGlmIChmaW5hbCkgewotICAgICAgaWYgKHNpZ24tPmlzUHJpbWl0aXZlKCkpIHsKLSAgICAgICAgY29uc3QgUHJpbWl0aXZlVHlwZWRlZiogcHJpbSA9IChQcmltaXRpdmVUeXBlZGVmKilzaWduOwotICAgICAgICBpZiAocHJpbS0+aXNJbnQoKSkgewotICAgICAgICAgIHNpbnQzMiB2YWwgPSBmaWVsZC0+Z2V0U3RhdGljSW50MzJGaWVsZCgpOwotICAgICAgICAgIHB1c2goQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KCpsbHZtQ29udGV4dCksIHZhbCksIGZhbHNlKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcmltLT5pc0J5dGUoKSkgewotICAgICAgICAgIHNpbnQ4IHZhbCA9IChzaW50OClmaWVsZC0+Z2V0U3RhdGljSW50OEZpZWxkKCk7Ci0gICAgICAgICAgcHVzaChDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDhUeSgqbGx2bUNvbnRleHQpLCB2YWwpLCBmYWxzZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJpbS0+aXNCb29sKCkpIHsKLSAgICAgICAgICB1aW50OCB2YWwgPSAodWludDgpZmllbGQtPmdldFN0YXRpY0ludDhGaWVsZCgpOwotICAgICAgICAgIHB1c2goQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ4VHkoKmxsdm1Db250ZXh0KSwgdmFsKSwgdHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJpbS0+aXNTaG9ydCgpKSB7Ci0gICAgICAgICAgc2ludDE2IHZhbCA9IChzaW50MTYpZmllbGQtPmdldFN0YXRpY0ludDE2RmllbGQoKTsKLSAgICAgICAgICBwdXNoKENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MTZUeSgqbGx2bUNvbnRleHQpLCB2YWwpLCBmYWxzZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJpbS0+aXNDaGFyKCkpIHsKLSAgICAgICAgICB1aW50MTYgdmFsID0gKHVpbnQxNilmaWVsZC0+Z2V0U3RhdGljSW50MTZGaWVsZCgpOwotICAgICAgICAgIHB1c2goQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQxNlR5KCpsbHZtQ29udGV4dCksIHZhbCksIHRydWUpOwotICAgICAgICB9IGVsc2UgaWYgKHByaW0tPmlzTG9uZygpKSB7Ci0gICAgICAgICAgc2ludDY0IHZhbCA9IChzaW50NjQpZmllbGQtPmdldFN0YXRpY0xvbmdGaWVsZCgpOwotICAgICAgICAgIHB1c2goQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ2NFR5KCpsbHZtQ29udGV4dCksIHZhbCksIGZhbHNlKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcmltLT5pc0Zsb2F0KCkpIHsKLSAgICAgICAgICBmbG9hdCB2YWwgPSAoZmxvYXQpZmllbGQtPmdldFN0YXRpY0Zsb2F0RmllbGQoKTsKLSAgICAgICAgICBwdXNoKENvbnN0YW50RlA6OmdldChUeXBlOjpnZXRGbG9hdFR5KCpsbHZtQ29udGV4dCksIHZhbCksIGZhbHNlKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcmltLT5pc0RvdWJsZSgpKSB7Ci0gICAgICAgICAgZG91YmxlIHZhbCA9IChkb3VibGUpZmllbGQtPmdldFN0YXRpY0RvdWJsZUZpZWxkKCk7Ci0gICAgICAgICAgcHVzaChDb25zdGFudEZQOjpnZXQoVHlwZTo6Z2V0RG91YmxlVHkoKmxsdm1Db250ZXh0KSwgdmFsKSwgZmFsc2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGFib3J0KCk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChUaGVDb21waWxlci0+aXNTdGF0aWNDb21waWxpbmcoKSAmJiAhVGhlQ29tcGlsZXItPnVzZUNvb3BlcmF0aXZlR0MoKSkgewotICAgICAgICAgIEphdmFPYmplY3QqIHZhbCA9IGZpZWxkLT5nZXRTdGF0aWNPYmplY3RGaWVsZCgpOwotICAgICAgICAgIEpuanZtQ2xhc3NMb2FkZXIqIEpDTCA9IGZpZWxkLT5jbGFzc0RlZi0+Y2xhc3NMb2FkZXI7Ci0gICAgICAgICAgVmFsdWUqIFYgPSBUaGVDb21waWxlci0+Z2V0RmluYWxPYmplY3QodmFsLCBzaWduLT5hc3NvY0NsYXNzKEpDTCkpOwotICAgICAgICAgIENvbW1vbkNsYXNzKiBjbCA9IG12bTo6Q29sbGVjdG9yOjpiZWdPZih2YWwpID8KLSAgICAgICAgICAgICAgSmF2YU9iamVjdDo6Z2V0Q2xhc3ModmFsKSA6IE5VTEw7Ci0gICAgICAgICAgcHVzaChWLCBmYWxzZSwgY2wpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIERvIG5vdCBjYWxsIGdldEZpbmFsT2JqZWN0LCBhcyB0aGUgb2JqZWN0IG1heSBtb3ZlIGluLWJldHdlZW4gdHdvCi0gICAgICAgICAgLy8gbG9hZHMgb2YgdGhpcyBzdGF0aWMuCi0gICAgICAgICAgVmFsdWUqIFYgPSBuZXcgTG9hZEluc3QocHRyLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgICBKbmp2bUNsYXNzTG9hZGVyKiBKQ0wgPSBjb21waWxpbmdDbGFzcy0+Y2xhc3NMb2FkZXI7Ci0gICAgICAgICAgcHVzaChWLCBmYWxzZSwgc2lnbi0+ZmluZEFzc29jQ2xhc3MoSkNMKSk7Ci0gICAgICAgIH0gCi0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFmaW5hbCkgewotICAgIEpuanZtQ2xhc3NMb2FkZXIqIEpDTCA9IGNvbXBpbGluZ0NsYXNzLT5jbGFzc0xvYWRlcjsKLSAgICBDb21tb25DbGFzcyogY2wgPSBzaWduLT5maW5kQXNzb2NDbGFzcyhKQ0wpOwotICAgIHB1c2gobmV3IExvYWRJbnN0KHB0ciwgIiIsIGN1cnJlbnRCbG9jayksIHNpZ24tPmlzVW5zaWduZWQoKSwgY2wpOwotICB9Ci0gIGlmICh0eXBlID09IFR5cGU6OmdldEludDY0VHkoKmxsdm1Db250ZXh0KSB8fAotICAgICAgdHlwZSA9PSBUeXBlOjpnZXREb3VibGVUeSgqbGx2bUNvbnRleHQpKSB7Ci0gICAgcHVzaChpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sIGZhbHNlKTsKLSAgfQotfQotCi12b2lkIEphdmFKSVQ6OnNldFZpcnR1YWxGaWVsZCh1aW50MTYgaW5kZXgpIHsKLSAgVHlwZWRlZiogc2lnbiA9IGNvbXBpbGluZ0NsYXNzLT5jdHBJbmZvLT5pbmZvT2ZGaWVsZChpbmRleCk7Ci0gIExMVk1Bc3Nlc3NvckluZm8mIExBSSA9IFRoZUNvbXBpbGVyLT5nZXRUeXBlZGVmSW5mbyhzaWduKTsKLSAgY29uc3QgVHlwZSogdHlwZSA9IExBSS5sbHZtVHlwZTsKLSAgaW50IHN0YWNrSW5kZXggPSBjdXJyZW50U3RhY2tJbmRleCAtIDI7Ci0gIGlmICh0eXBlID09IFR5cGU6OmdldEludDY0VHkoKmxsdm1Db250ZXh0KSB8fAotICAgICAgdHlwZSA9PSBUeXBlOjpnZXREb3VibGVUeSgqbGx2bUNvbnRleHQpKSB7Ci0gICAgc3RhY2tJbmRleC0tOwotICB9Ci0gIFZhbHVlKiBvYmplY3QgPSBvYmplY3RTdGFja1tzdGFja0luZGV4XTsKLSAgVmFsdWUqIHB0ciA9IGxkUmVzb2x2ZWQoaW5kZXgsIGZhbHNlLCBvYmplY3QsIExBSS5sbHZtVHlwZVB0cik7Ci0KLSAgVmFsdWUqIHZhbCA9IHBvcCgpOwotICBpZiAodHlwZSA9PSBUeXBlOjpnZXRJbnQ2NFR5KCpsbHZtQ29udGV4dCkgfHwKLSAgICAgIHR5cGUgPT0gVHlwZTo6Z2V0RG91YmxlVHkoKmxsdm1Db250ZXh0KSkgewotICAgIHZhbCA9IHBvcCgpOwotICB9Ci0gIHBvcCgpOyAvLyBQb3AgdGhlIG9iamVjdAotICAKLSAgaWYgKHR5cGUgIT0gdmFsLT5nZXRUeXBlKCkpIHsgLy8gaW50MSwgaW50OCwgaW50MTYKLSAgICBjb252ZXJ0VmFsdWUodmFsLCB0eXBlLCBjdXJyZW50QmxvY2ssIGZhbHNlKTsKLSAgfQotCi0gIG5ldyBTdG9yZUluc3QodmFsLCBwdHIsIGZhbHNlLCBjdXJyZW50QmxvY2spOwotfQotCi12b2lkIEphdmFKSVQ6OmdldFZpcnR1YWxGaWVsZCh1aW50MTYgaW5kZXgpIHsKLSAgVHlwZWRlZiogc2lnbiA9IGNvbXBpbGluZ0NsYXNzLT5jdHBJbmZvLT5pbmZvT2ZGaWVsZChpbmRleCk7Ci0gIEpuanZtQ2xhc3NMb2FkZXIqIEpDTCA9IGNvbXBpbGluZ0NsYXNzLT5jbGFzc0xvYWRlcjsKLSAgQ29tbW9uQ2xhc3MqIGNsID0gc2lnbi0+ZmluZEFzc29jQ2xhc3MoSkNMKTsKLSAgCi0gIExMVk1Bc3Nlc3NvckluZm8mIExBSSA9IFRoZUNvbXBpbGVyLT5nZXRUeXBlZGVmSW5mbyhzaWduKTsKLSAgY29uc3QgVHlwZSogdHlwZSA9IExBSS5sbHZtVHlwZTsKLSAgVmFsdWUqIG9iaiA9IG9iamVjdFN0YWNrW2N1cnJlbnRTdGFja0luZGV4IC0gMV07Ci0gIHBvcCgpOyAvLyBQb3AgdGhlIG9iamVjdAotICAKLSAgVmFsdWUqIHB0ciA9IGxkUmVzb2x2ZWQoaW5kZXgsIGZhbHNlLCBvYmosIExBSS5sbHZtVHlwZVB0cik7Ci0gIAotICBib29sIGZpbmFsID0gZmFsc2U7Ci0gIAotICAvLyBJbiBpbml0IG1ldGhvZHMsIHRoZSBmaWVsZHMgaGF2ZSBub3QgYmVlbiBzZXQgeWV0LgotICBpZiAoIWNvbXBpbGluZ01ldGhvZC0+bmFtZS0+ZXF1YWxzKHVwY2FsbHMtPmluaXROYW1lKSkgewotICAgIEphdmFGaWVsZCogZmllbGQgPSBjb21waWxpbmdDbGFzcy0+Y3RwSW5mby0+bG9va3VwRmllbGQoaW5kZXgsIGZhbHNlKTsKLSAgICBpZiAoZmllbGQpIHsKLSAgICAgIGZpbmFsID0gaXNGaW5hbChmaWVsZC0+YWNjZXNzKSAmJiBzaWduLT5pc1ByaW1pdGl2ZSgpOwotICAgIH0KLSAgICBpZiAoZmluYWwpIHsKLSAgICAgIEZ1bmN0aW9uKiBGID0gMDsKLSAgICAgIGFzc2VydChzaWduLT5pc1ByaW1pdGl2ZSgpKTsKLSAgICAgIGNvbnN0IFByaW1pdGl2ZVR5cGVkZWYqIHByaW0gPSAoUHJpbWl0aXZlVHlwZWRlZiopc2lnbjsKLSAgICAgIGlmIChwcmltLT5pc0ludCgpKSB7Ci0gICAgICAgIEYgPSBpbnRyaW5zaWNzLT5HZXRGaW5hbEludDMyRmllbGRGdW5jdGlvbjsKLSAgICAgIH0gZWxzZSBpZiAocHJpbS0+aXNCeXRlKCkpIHsKLSAgICAgICAgRiA9IGludHJpbnNpY3MtPkdldEZpbmFsSW50OEZpZWxkRnVuY3Rpb247Ci0gICAgICB9IGVsc2UgaWYgKHByaW0tPmlzQm9vbCgpKSB7Ci0gICAgICAgIEYgPSBpbnRyaW5zaWNzLT5HZXRGaW5hbEludDhGaWVsZEZ1bmN0aW9uOwotICAgICAgfSBlbHNlIGlmIChwcmltLT5pc1Nob3J0KCkpIHsKLSAgICAgICAgRiA9IGludHJpbnNpY3MtPkdldEZpbmFsSW50MTZGaWVsZEZ1bmN0aW9uOwotICAgICAgfSBlbHNlIGlmIChwcmltLT5pc0NoYXIoKSkgewotICAgICAgICBGID0gaW50cmluc2ljcy0+R2V0RmluYWxJbnQxNkZpZWxkRnVuY3Rpb247Ci0gICAgICB9IGVsc2UgaWYgKHByaW0tPmlzTG9uZygpKSB7Ci0gICAgICAgIEYgPSBpbnRyaW5zaWNzLT5HZXRGaW5hbExvbmdGaWVsZEZ1bmN0aW9uOwotICAgICAgfSBlbHNlIGlmIChwcmltLT5pc0Zsb2F0KCkpIHsKLSAgICAgICAgRiA9IGludHJpbnNpY3MtPkdldEZpbmFsRmxvYXRGaWVsZEZ1bmN0aW9uOwotICAgICAgfSBlbHNlIGlmIChwcmltLT5pc0RvdWJsZSgpKSB7Ci0gICAgICAgIEYgPSBpbnRyaW5zaWNzLT5HZXRGaW5hbERvdWJsZUZpZWxkRnVuY3Rpb247Ci0gICAgICB9IGVsc2UgewotICAgICAgICBhYm9ydCgpOwotICAgICAgfQotICAgICAgcHVzaChDYWxsSW5zdDo6Q3JlYXRlKEYsIHB0ciwgIiIsIGN1cnJlbnRCbG9jayksIHNpZ24tPmlzVW5zaWduZWQoKSwgY2wpOwotICAgIH0KLSAgfQotIAotICBpZiAoIWZpbmFsKSBwdXNoKG5ldyBMb2FkSW5zdChwdHIsICIiLCBjdXJyZW50QmxvY2spLCBzaWduLT5pc1Vuc2lnbmVkKCksIGNsKTsKLSAgaWYgKHR5cGUgPT0gVHlwZTo6Z2V0SW50NjRUeSgqbGx2bUNvbnRleHQpIHx8Ci0gICAgICB0eXBlID09IFR5cGU6OmdldERvdWJsZVR5KCpsbHZtQ29udGV4dCkpIHsKLSAgICBwdXNoKGludHJpbnNpY3MtPmNvbnN0YW50WmVybywgZmFsc2UpOwotICB9Ci19Ci0KLQotdm9pZCBKYXZhSklUOjppbnZva2VJbnRlcmZhY2UodWludDE2IGluZGV4KSB7Ci0gIAotICAvLyBEbyB0aGUgdXN1YWwKLSAgSmF2YUNvbnN0YW50UG9vbCogY3RwSW5mbyA9IGNvbXBpbGluZ0NsYXNzLT5jdHBJbmZvOwotICBjb25zdCBVVEY4KiBuYW1lID0gMDsKLSAgU2lnbmRlZiogc2lnbmF0dXJlID0gY3RwSW5mby0+aW5mb09mSW50ZXJmYWNlT3JWaXJ0dWFsTWV0aG9kKGluZGV4LCBuYW1lKTsKLSAgCi0gIExMVk1TaWduYXR1cmVJbmZvKiBMU0kgPSBUaGVDb21waWxlci0+Z2V0U2lnbmF0dXJlSW5mbyhzaWduYXR1cmUpOwotICBjb25zdCBsbHZtOjpGdW5jdGlvblR5cGUqIHZpcnR1YWxUeXBlID0gTFNJLT5nZXRWaXJ0dWFsVHlwZSgpOwotICBjb25zdCBsbHZtOjpQb2ludGVyVHlwZSogdmlydHVhbFB0clR5cGUgPSBMU0ktPmdldFZpcnR1YWxQdHJUeXBlKCk7Ci0gCi0gIGNvbnN0IGxsdm06OlR5cGUqIHJldFR5cGUgPSB2aXJ0dWFsVHlwZS0+Z2V0UmV0dXJuVHlwZSgpOwotICAgCi0gIENvbW1vbkNsYXNzKiBjbCA9IDA7Ci0gIEphdmFNZXRob2QqIG1ldGggPSAwOwotICBjdHBJbmZvLT5pbmZvT2ZNZXRob2QoaW5kZXgsIEFDQ19WSVJUVUFMLCBjbCwgbWV0aCk7Ci0gIFZhbHVlKiBNZXRoID0gMDsKLQotICBpZiAobWV0aCkgewotICAgIE1ldGggPSBUaGVDb21waWxlci0+Z2V0TWV0aG9kSW5DbGFzcyhtZXRoKTsKLSAgfSBlbHNlIHsKLSAgICBNZXRoID0gZ2V0Q29uc3RhbnRQb29sQXQoaW5kZXgsIGludHJpbnNpY3MtPkludGVyZmFjZUxvb2t1cEZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5KYXZhTWV0aG9kVHlwZSwgMCwgdHJ1ZSk7Ci0gIH0KLQotICB1aW50MzJfdCB0YWJsZUluZGV4ID0gSW50ZXJmYWNlTWV0aG9kVGFibGU6OmdldEluZGV4KG5hbWUsIHNpZ25hdHVyZS0+a2V5TmFtZSk7Ci0gIENvbnN0YW50KiBJbmRleCA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlSW5kZXgpOwotICBWYWx1ZSogdGFyZ2V0T2JqZWN0ID0gZ2V0VGFyZ2V0KHNpZ25hdHVyZSk7Ci0gIHRhcmdldE9iamVjdCA9IG5ldyBMb2FkSW5zdCgKLSAgICAgICAgICB0YXJnZXRPYmplY3QsICIiLCBUaGVDb21waWxlci0+dXNlQ29vcGVyYXRpdmVHQygpLCBjdXJyZW50QmxvY2spOwotICBKSVRWZXJpZnlOdWxsKHRhcmdldE9iamVjdCk7Ci0gIC8vIFRPRE86IFRoZSBmb2xsb3dpbmcgY29kZSBuZWVkcyBtb3JlIHRlc3RpbmcuCi0jaWYgMAotICBCYXNpY0Jsb2NrKiBlbmRCbG9jayA9IGNyZWF0ZUJhc2ljQmxvY2soImVuZCBpbnRlcmZhY2UgaW52b2tlIik7Ci0gIFBISU5vZGUgKiBub2RlID0gUEhJTm9kZTo6Q3JlYXRlKHZpcnR1YWxQdHJUeXBlLCAiIiwgZW5kQmxvY2spOwotCi0gIEJhc2ljQmxvY2sqIGxhYmVsX2JiID0gY3JlYXRlQmFzaWNCbG9jaygiYmIiKTsKLSAgQmFzaWNCbG9jayogbGFiZWxfYmI0ID0gY3JlYXRlQmFzaWNCbG9jaygiYmI0Iik7Ci0gIEJhc2ljQmxvY2sqIGxhYmVsX2JiNiA9IGNyZWF0ZUJhc2ljQmxvY2soImJiNiIpOwotICBCYXNpY0Jsb2NrKiBsYWJlbF9iYjcgPSBjcmVhdGVCYXNpY0Jsb2NrKCJiYjciKTsKLSAgICAKLSAgLy8gQmxvY2sgZW50cnkgKGxhYmVsX2VudHJ5KQotICBWYWx1ZSogVlQgPSBDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPkdldFZURnVuY3Rpb24sIHRhcmdldE9iamVjdCwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgVmFsdWUqIElNVCA9IENhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+R2V0SU1URnVuY3Rpb24sIFZULCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLQotCi0gIFZhbHVlKiBpbmRpY2VzWzJdID0geyBpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sIEluZGV4IH07Ci0gIEluc3RydWN0aW9uKiBwdHJfMTggPSBHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlKElNVCwgaW5kaWNlcywgaW5kaWNlcyArIDIsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICBJbnN0cnVjdGlvbiogaW50MzJfMTkgPSBuZXcgTG9hZEluc3QocHRyXzE4LCAiIiwgZmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0gIGludDMyXzE5ID0gbmV3IFB0clRvSW50SW5zdChpbnQzMl8xOSwgaW50cmluc2ljcy0+cG9pbnRlclNpemVUeXBlLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gIFZhbHVlKiBvbmUgPSBDb25zdGFudEludDo6Z2V0KGludHJpbnNpY3MtPnBvaW50ZXJTaXplVHlwZSwgMSk7Ci0gIFZhbHVlKiB6ZXJvID0gQ29uc3RhbnRJbnQ6OmdldChpbnRyaW5zaWNzLT5wb2ludGVyU2l6ZVR5cGUsIDApOwotICBCaW5hcnlPcGVyYXRvciogaW50MzJfMjAgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlKEluc3RydWN0aW9uOjpBbmQsIGludDMyXzE5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIElDbXBJbnN0KiBpbnQxX3RvQm9vbCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9FUSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyXzIwLCB6ZXJvLCAidG9Cb29sIik7Ci0gIEJyYW5jaEluc3Q6OkNyZWF0ZShsYWJlbF9iYiwgbGFiZWxfYmI0LCBpbnQxX3RvQm9vbCwgY3VycmVudEJsb2NrKTsKLSAgICAKLSAgLy8gQmxvY2sgYmIgKGxhYmVsX2JiKQotICBjdXJyZW50QmxvY2sgPSBsYWJlbF9iYjsKLSAgQ2FzdEluc3QqIHB0cl8yMiA9IG5ldyBJbnRUb1B0ckluc3QoaW50MzJfMTksIHZpcnR1YWxQdHJUeXBlLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgCi0gIG5vZGUtPmFkZEluY29taW5nKHB0cl8yMiwgY3VycmVudEJsb2NrKTsKLSAgQnJhbmNoSW5zdDo6Q3JlYXRlKGVuZEJsb2NrLCBjdXJyZW50QmxvY2spOwotICAgIAotICAvLyBCbG9jayBiYjQgKGxhYmVsX2JiNCkKLSAgY3VycmVudEJsb2NrID0gbGFiZWxfYmI0OwotICBDb25zdGFudCogTWludXNUd28gPSBDb25zdGFudEludDo6Z2V0KGludHJpbnNpY3MtPnBvaW50ZXJTaXplVHlwZSwgLTIpOwotICBCaW5hcnlPcGVyYXRvciogaW50MzJfMjUgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlKEluc3RydWN0aW9uOjpBbmQsIGludDMyXzE5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pbnVzVHdvLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgY29uc3QgUG9pbnRlclR5cGUqIFR5ID0gUG9pbnRlclR5cGU6OmdldFVucXVhbChpbnRyaW5zaWNzLT5KYXZhTWV0aG9kVHlwZSk7Ci0gIENhc3RJbnN0KiBwdHJfMjYgPSBuZXcgSW50VG9QdHJJbnN0KGludDMyXzI1LCBUeSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIExvYWRJbnN0KiBpbnQzMl8yNyA9IG5ldyBMb2FkSW5zdChwdHJfMjYsICIiLCBmYWxzZSwgY3VycmVudEJsb2NrKTsKLSAgSUNtcEluc3QqIGludDFfMjggPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfRVEsIGludDMyXzI3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRoLCAiIik7Ci0gIEJyYW5jaEluc3Q6OkNyZWF0ZShsYWJlbF9iYjYsIGxhYmVsX2JiNywgaW50MV8yOCwgY3VycmVudEJsb2NrKTsKLSAgICAKLSAgLy8gQmxvY2sgYmI2IChsYWJlbF9iYjYpCi0gIGN1cnJlbnRCbG9jayA9IGxhYmVsX2JiNjsKLSAgUEhJTm9kZSogcHRyX3RhYmxlXzBfbGNzc2EgPSBQSElOb2RlOjpDcmVhdGUoVHksICJ0YWJsZS4wLmxjc3NhIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgcHRyX3RhYmxlXzBfbGNzc2EtPnJlc2VydmVPcGVyYW5kU3BhY2UoMik7Ci0gIHB0cl90YWJsZV8wX2xjc3NhLT5hZGRJbmNvbWluZyhwdHJfMjYsIGxhYmVsX2JiNCk7Ci0gICAKLSAgR2V0RWxlbWVudFB0ckluc3QqIHB0cl8zMSA9IEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUocHRyX3RhYmxlXzBfbGNzc2EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPmNvbnN0YW50T25lLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLQotICBMb2FkSW5zdCogaW50MzJfMzIgPSBuZXcgTG9hZEluc3QocHRyXzMxLCAiIiwgZmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0gIENhc3RJbnN0KiBwdHJfMzMgPSBuZXcgQml0Q2FzdEluc3QoaW50MzJfMzIsIHZpcnR1YWxQdHJUeXBlLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICBub2RlLT5hZGRJbmNvbWluZyhwdHJfMzMsIGN1cnJlbnRCbG9jayk7Ci0KLSAgQnJhbmNoSW5zdDo6Q3JlYXRlKGVuZEJsb2NrLCBjdXJyZW50QmxvY2spOwotICAgIAotICAvLyBCbG9jayBiYjcgKGxhYmVsX2JiNykKLSAgY3VycmVudEJsb2NrID0gbGFiZWxfYmI3OwotICBQSElOb2RlKiBpbnQzMl9pbmR2YXIgPSBQSElOb2RlOjpDcmVhdGUoVHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluZHZhciIsIGN1cnJlbnRCbG9jayk7Ci0gIGludDMyX2luZHZhci0+cmVzZXJ2ZU9wZXJhbmRTcGFjZSgyKTsKLSAgaW50MzJfaW5kdmFyLT5hZGRJbmNvbWluZyhpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sIGxhYmVsX2JiNCk7Ci0gICAgCi0gIEJpbmFyeU9wZXJhdG9yKiBpbnQzMl90YWJsZV8wMTBfcmVjID0KLSAgICBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlKEluc3RydWN0aW9uOjpTaGwsIGludDMyX2luZHZhciwgaW50cmluc2ljcy0+Y29uc3RhbnRPbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAidGFibGUuMDEwLnJlYyIsIGN1cnJlbnRCbG9jayk7Ci0KLSAgQmluYXJ5T3BlcmF0b3IqIGludDMyX19yZWMgPQotICAgIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGUoSW5zdHJ1Y3Rpb246OkFkZCwgaW50MzJfdGFibGVfMDEwX3JlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPmNvbnN0YW50VHdvLCAiLnJlYyIsIGN1cnJlbnRCbG9jayk7Ci0gIEdldEVsZW1lbnRQdHJJbnN0KiBwdHJfMzcgPSBHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlKHB0cl8yNiwgaW50MzJfX3JlYywgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gIExvYWRJbnN0KiBpbnQzMl8zOCA9IG5ldyBMb2FkSW5zdChwdHJfMzcsICIiLCBmYWxzZSwgY3VycmVudEJsb2NrKTsKLSAgSUNtcEluc3QqIGludDFfMzkgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfRVEsIGludDMyXzM4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRoLCAiIik7Ci0gIEJpbmFyeU9wZXJhdG9yKiBpbnQzMl9pbmR2YXJfbmV4dCA9Ci0gICAgQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZShJbnN0cnVjdGlvbjo6QWRkLCBpbnQzMl9pbmR2YXIsIGludHJpbnNpY3MtPmNvbnN0YW50T25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImluZHZhci5uZXh0IiwgY3VycmVudEJsb2NrKTsKLSAgQnJhbmNoSW5zdDo6Q3JlYXRlKGxhYmVsX2JiNiwgbGFiZWxfYmI3LCBpbnQxXzM5LCBjdXJyZW50QmxvY2spOwotICAKLSAgaW50MzJfaW5kdmFyLT5hZGRJbmNvbWluZyhpbnQzMl9pbmR2YXJfbmV4dCwgY3VycmVudEJsb2NrKTsKLSAgcHRyX3RhYmxlXzBfbGNzc2EtPmFkZEluY29taW5nKHB0cl8zNywgY3VycmVudEJsb2NrKTsKLSAgICAgIAotICBjdXJyZW50QmxvY2sgPSBlbmRCbG9jazsKLSNlbHNlCi0gIHN0ZDo6dmVjdG9yPFZhbHVlKj4gQXJnczsKLSAgQXJncy5wdXNoX2JhY2sodGFyZ2V0T2JqZWN0KTsKLSAgQXJncy5wdXNoX2JhY2soTWV0aCk7Ci0gIEFyZ3MucHVzaF9iYWNrKEluZGV4KTsKLSAgVmFsdWUqIG5vZGUgPQotICAgICAgaW52b2tlKGludHJpbnNpY3MtPlJlc29sdmVJbnRlcmZhY2VGdW5jdGlvbiwgQXJncywgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIG5vZGUgPSBuZXcgQml0Q2FzdEluc3Qobm9kZSwgdmlydHVhbFB0clR5cGUsICIiLCBjdXJyZW50QmxvY2spOwotI2VuZGlmCi0KLSAgc3RkOjp2ZWN0b3I8VmFsdWUqPiBhcmdzOyAvLyBzaXplID0gW3NpZ25hdHVyZS0+bmJJbiArIDNdOwotICBGdW5jdGlvblR5cGU6OnBhcmFtX2l0ZXJhdG9yIGl0ICA9IHZpcnR1YWxUeXBlLT5wYXJhbV9lbmQoKTsKLSAgbWFrZUFyZ3MoaXQsIGluZGV4LCBhcmdzLCBzaWduYXR1cmUtPm5iQXJndW1lbnRzICsgMSk7Ci0gIEpJVFZlcmlmeU51bGwoYXJnc1swXSk7Ci0gIFZhbHVlKiByZXQgPSBpbnZva2Uobm9kZSwgYXJncywgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIGlmIChyZXRUeXBlICE9IFR5cGU6OmdldFZvaWRUeSgqbGx2bUNvbnRleHQpKSB7Ci0gICAgaWYgKHJldC0+Z2V0VHlwZSgpID09IGludHJpbnNpY3MtPkphdmFPYmplY3RUeXBlKSB7Ci0gICAgICBKbmp2bUNsYXNzTG9hZGVyKiBKQ0wgPSBjb21waWxpbmdDbGFzcy0+Y2xhc3NMb2FkZXI7Ci0gICAgICBwdXNoKHJldCwgZmFsc2UsIHNpZ25hdHVyZS0+Z2V0UmV0dXJuVHlwZSgpLT5maW5kQXNzb2NDbGFzcyhKQ0wpKTsKLSAgICB9IGVsc2UgewotICAgICAgcHVzaChyZXQsIHNpZ25hdHVyZS0+Z2V0UmV0dXJuVHlwZSgpLT5pc1Vuc2lnbmVkKCkpOwotICAgICAgaWYgKHJldFR5cGUgPT0gVHlwZTo6Z2V0RG91YmxlVHkoKmxsdm1Db250ZXh0KSB8fAotICAgICAgICAgIHJldFR5cGUgPT0gVHlwZTo6Z2V0SW50NjRUeSgqbGx2bUNvbnRleHQpKSB7Ci0gICAgICAgIHB1c2goaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCBmYWxzZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgSmF2YUpJVDo6bG93ZXJBcnJheWNvcHkoc3RkOjp2ZWN0b3I8VmFsdWUqPiYgYXJncykgewotICBGdW5jdGlvbiogbWV0aCA9IFRoZUNvbXBpbGVyLT5nZXRNZXRob2QodXBjYWxscy0+Vk1TeXN0ZW1BcnJheWNvcHkpOwotCi0gIFZhbHVlKiBwdHJfc3JjID0gYXJnc1swXTsKLSAgVmFsdWUqIGludDMyX3N0YXJ0ID0gYXJnc1sxXTsKLSAgVmFsdWUqIHB0cl9kc3QgPSBhcmdzWzJdOwotICBWYWx1ZSogaW50MzJfc3RhcnQyID0gYXJnc1szXTsKLSAgVmFsdWUqIGludDMyX2xlbmd0aCA9IGFyZ3NbNF07Ci0KLSAgSklUVmVyaWZ5TnVsbChwdHJfc3JjKTsKLSAgSklUVmVyaWZ5TnVsbChwdHJfZHN0KTsKLQotICBCYXNpY0Jsb2NrKiBsYWJlbF9lbnRyeSA9IGN1cnJlbnRCbG9jazsKLSAgQmFzaWNCbG9jayogbGFiZWxfYmIgPSBjcmVhdGVCYXNpY0Jsb2NrKCJiYiIpOwotICBCYXNpY0Jsb2NrKiBsYWJlbF9iYjIgPSBjcmVhdGVCYXNpY0Jsb2NrKCJiYjIiKTsKLSAgQmFzaWNCbG9jayogbGFiZWxfYmI0ID0gY3JlYXRlQmFzaWNCbG9jaygiYmI0Iik7Ci0gIEJhc2ljQmxvY2sqIGxhYmVsX2JiNSA9IGNyZWF0ZUJhc2ljQmxvY2soImJiNSIpOwotICBCYXNpY0Jsb2NrKiBsYWJlbF9iYjEyX3ByZWhlYWRlciA9IGNyZWF0ZUJhc2ljQmxvY2soImJiMTIucHJlaGVhZGVyIik7Ci0gIEJhc2ljQmxvY2sqIGxhYmVsX2JiNyA9IGNyZWF0ZUJhc2ljQmxvY2soImJiNyIpOwotICBCYXNpY0Jsb2NrKiBsYWJlbF9iYjExID0gY3JlYXRlQmFzaWNCbG9jaygiYmIxMSIpOwotICBCYXNpY0Jsb2NrKiBsYWJlbF9tZW1tb3ZlID0gY3JlYXRlQmFzaWNCbG9jaygibWVtbW92ZSIpOwotICBCYXNpY0Jsb2NrKiBsYWJlbF9iYWNrd2FyZCA9IGNyZWF0ZUJhc2ljQmxvY2soImJhY2t3YXJkIik7Ci0gIEJhc2ljQmxvY2sqIGxhYmVsX3JldHVybiA9IGNyZWF0ZUJhc2ljQmxvY2soInJldHVybiIpOwotICAKLSAgQmFzaWNCbG9jayogbG9nX2xhYmVsX2VudHJ5ID0gY3JlYXRlQmFzaWNCbG9jaygibG9nX2VudHJ5Iik7Ci0gIEJhc2ljQmxvY2sqIGxvZ19sYWJlbF9iYiA9IGNyZWF0ZUJhc2ljQmxvY2soImxvZ19iYiIpOwotICAgIAotICAvLyBCbG9jayBlbnRyeSAobGFiZWxfZW50cnkpCi0gIENhbGxJbnN0KiBwdHJfMTYgPSBDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPkdldFZURnVuY3Rpb24sIHB0cl9zcmMsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbF9lbnRyeSk7Ci0gIENhbGxJbnN0KiBwdHJfMTcgPSBDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPkdldFZURnVuY3Rpb24sIHB0cl9kc3QsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbF9lbnRyeSk7Ci0gIAotICBJQ21wSW5zdCogaW50MV8xOCA9IG5ldyBJQ21wSW5zdCgqbGFiZWxfZW50cnksIElDbXBJbnN0OjpJQ01QX0VRLCBwdHJfMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl8xNywgIiIpOwotICBCcmFuY2hJbnN0OjpDcmVhdGUobGFiZWxfYmIsIGxhYmVsX2JiMiwgaW50MV8xOCwgbGFiZWxfZW50cnkpOwotICAgIAotICAvLyBCbG9jayBiYiAobGFiZWxfYmIpCi0gIGN1cnJlbnRCbG9jayA9IGxhYmVsX2JiOwotICBDYWxsSW5zdCogcHRyXzIwID0gQ2FsbEluc3Q6OkNyZWF0ZShpbnRyaW5zaWNzLT5HZXRDbGFzc0Z1bmN0aW9uLCBwdHJfc3JjLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxfYmIpOwotICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IHB0cl8yMV9pbmRpY2VzOwotICBwdHJfMjFfaW5kaWNlcy5wdXNoX2JhY2soaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvKTsKLSAgcHRyXzIxX2luZGljZXMucHVzaF9iYWNrKGludHJpbnNpY3MtPk9mZnNldEFjY2Vzc0luQ29tbW9uQ2xhc3NDb25zdGFudCk7Ci0gIEluc3RydWN0aW9uKiBwdHJfMjEgPQotICAgIEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUocHRyXzIwLCBwdHJfMjFfaW5kaWNlcy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyXzIxX2luZGljZXMuZW5kKCksICIiLCBsYWJlbF9iYik7Ci0gIExvYWRJbnN0KiBpbnQzMl8yMiA9IG5ldyBMb2FkSW5zdChwdHJfMjEsICIiLCBmYWxzZSwgbGFiZWxfYmIpOwotICBWYWx1ZSogY21wID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZChpbnQzMl8yMiwgaW50cmluc2ljcy0+SXNBcnJheUNvbnN0YW50LCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxfYmIpOwotICBWYWx1ZSogemVybyA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MTZUeSgqbGx2bUNvbnRleHQpLCAwKTsKLSAgSUNtcEluc3QqIGludDFfMjMgPSBuZXcgSUNtcEluc3QoKmxhYmVsX2JiLCBJQ21wSW5zdDo6SUNNUF9ORSwgY21wLCB6ZXJvLCAiIik7Ci0gIEJyYW5jaEluc3Q6OkNyZWF0ZShsYWJlbF9iYjQsIGxhYmVsX2JiMiwgaW50MV8yMywgbGFiZWxfYmIpOwotICAgCi0KLSAgLy8gQmxvY2sgYmIyIChsYWJlbF9iYjIpCi0gIGN1cnJlbnRCbG9jayA9IGxhYmVsX2JiMjsKLSAgaW52b2tlKG1ldGgsIGFyZ3MsICIiLCBsYWJlbF9iYjIpOwotICBCcmFuY2hJbnN0OjpDcmVhdGUobGFiZWxfcmV0dXJuLCBjdXJyZW50QmxvY2spOwotICAgIAotICAgIAotICAvLyBCbG9jayBiYjQgKGxhYmVsX2JiNCkKLSAgY3VycmVudEJsb2NrID0gbGFiZWxfYmI0OwotICBCaW5hcnlPcGVyYXRvciogaW50MzJfMjcgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlKEluc3RydWN0aW9uOjpBZGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfbGVuZ3RoLCBpbnQzMl9zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgbGFiZWxfYmI0KTsKLSAgVmFsdWUqIGludDMyXzI4ID0gYXJyYXlTaXplKHB0cl9zcmMpOwotICAgIAotICBJQ21wSW5zdCogaW50MV8yOSA9IG5ldyBJQ21wSW5zdCgqbGFiZWxfYmI0LCBJQ21wSW5zdDo6SUNNUF9VTEUsIGludDMyXzI3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl8yOCwgIiIpOwotICBCcmFuY2hJbnN0OjpDcmVhdGUobGFiZWxfYmI1LCBsYWJlbF9iYjcsIGludDFfMjksIGxhYmVsX2JiNCk7Ci0gICAgCi0gIC8vIEJsb2NrIGJiNSAobGFiZWxfYmI1KQotICBjdXJyZW50QmxvY2sgPSBsYWJlbF9iYjU7Ci0gIEJpbmFyeU9wZXJhdG9yKiBpbnQzMl8zMSA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGUoSW5zdHJ1Y3Rpb246OkFkZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl9sZW5ndGgsIGludDMyX3N0YXJ0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgbGFiZWxfYmI1KTsKLSAgVmFsdWUqIGludDMyXzMyID0gYXJyYXlTaXplKHB0cl9kc3QpOwotICAgIAotICBJQ21wSW5zdCogaW50MV8zMyA9IG5ldyBJQ21wSW5zdCgqbGFiZWxfYmI1LCBJQ21wSW5zdDo6SUNNUF9VTEUsIGludDMyXzMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl8zMiwgIiIpOwotICBCcmFuY2hJbnN0OjpDcmVhdGUobGFiZWxfYmIxMl9wcmVoZWFkZXIsIGxhYmVsX2JiNywgaW50MV8zMywgbGFiZWxfYmI1KTsKLSAgICAKLSAgLy8gQmxvY2sgYmIxMi5wcmVoZWFkZXIgKGxhYmVsX2JiMTJfcHJlaGVhZGVyKQotICBjdXJyZW50QmxvY2sgPSBsYWJlbF9iYjEyX3ByZWhlYWRlcjsKLSAgSUNtcEluc3QqIGludDFfMzUgPSBuZXcgSUNtcEluc3QoKmxhYmVsX2JiMTJfcHJlaGVhZGVyLCBJQ21wSW5zdDo6SUNNUF9VR1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX2xlbmd0aCwgaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCAiIik7Ci0gIEJyYW5jaEluc3Q6OkNyZWF0ZShsb2dfbGFiZWxfZW50cnksIGxhYmVsX3JldHVybiwgaW50MV8zNSwgbGFiZWxfYmIxMl9wcmVoZWFkZXIpOwotICAgIAotICAvLyBCbG9jayBiYjcgKGxhYmVsX2JiNykKLSAgY3VycmVudEJsb2NrID0gbGFiZWxfYmI3OwotICBWYWx1ZSogVlRBcmdzWzFdID0geyBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKGludHJpbnNpY3MtPlZUVHlwZSkgfTsKLSAgdGhyb3dFeGNlcHRpb24oaW50cmluc2ljcy0+QXJyYXlTdG9yZUV4Y2VwdGlvbkZ1bmN0aW9uLCBWVEFyZ3MsIDEpOwotICAgCi0KLSAgCi0gIC8vIEJsb2NrIGVudHJ5IChsYWJlbF9lbnRyeSkKLSAgY3VycmVudEJsb2NrID0gbG9nX2xhYmVsX2VudHJ5OwotICBWYWx1ZSogcHRyXzEwX2luZGljZXNbMl0gPSB7IGludHJpbnNpY3MtPmNvbnN0YW50WmVybywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5PZmZzZXRCYXNlQ2xhc3NJbkFycmF5Q2xhc3NDb25zdGFudCB9OwotICBJbnN0cnVjdGlvbiogdGVtcCA9IG5ldyBCaXRDYXN0SW5zdChwdHJfMjAsIGludHJpbnNpY3MtPkphdmFDbGFzc0FycmF5VHlwZSwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19sYWJlbF9lbnRyeSk7Ci0gIEluc3RydWN0aW9uKiBwdHJfMTAgPSBHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlKHRlbXAsIHB0cl8xMF9pbmRpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfMTBfaW5kaWNlcyArIDIsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbGFiZWxfZW50cnkpOwotCi0gIExvYWRJbnN0KiBwdHJfMTEgPSBuZXcgTG9hZEluc3QocHRyXzEwLCAiIiwgZmFsc2UsIGxvZ19sYWJlbF9lbnRyeSk7Ci0gICAgCi0gIFZhbHVlKiBwdHJfMTJfaW5kaWNlc1syXSA9IHsgaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPk9mZnNldEFjY2Vzc0luQ29tbW9uQ2xhc3NDb25zdGFudCB9OwotICBJbnN0cnVjdGlvbiogcHRyXzEyID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShwdHJfMTEsIHB0cl8xMl9pbmRpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfMTJfaW5kaWNlcyArIDIsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbGFiZWxfZW50cnkpOwotICBMb2FkSW5zdCogaW50MTZfMTMgPSBuZXcgTG9hZEluc3QocHRyXzEyLCAiIiwgZmFsc2UsIGxvZ19sYWJlbF9lbnRyeSk7Ci0KLSAgQmluYXJ5T3BlcmF0b3IqIGludDMyXzE1ID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZShJbnN0cnVjdGlvbjo6QW5kLCBpbnQxNl8xMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5Jc1ByaW1pdGl2ZUNvbnN0YW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCBsb2dfbGFiZWxfZW50cnkpOwotICBJQ21wSW5zdCogaW50MV8xNiA9IG5ldyBJQ21wSW5zdCgqbG9nX2xhYmVsX2VudHJ5LCBJQ21wSW5zdDo6SUNNUF9FUSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfMTUsIHplcm8sICIiKTsKLSAgQnJhbmNoSW5zdDo6Q3JlYXRlKGxhYmVsX2JiMiwgbG9nX2xhYmVsX2JiLCBpbnQxXzE2LCBsb2dfbGFiZWxfZW50cnkpOwotICAgIAotICAvLyBCbG9jayBiYiAobG9nX2xhYmVsX2JiKQotICBjdXJyZW50QmxvY2sgPSBsb2dfbGFiZWxfYmI7Ci0gIFZhbHVlKiBwdHJfMTFfaW5kaWNlc1syXSA9IHsgaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPk9mZnNldExvZ1NpemVJblByaW1pdGl2ZUNsYXNzQ29uc3RhbnQgfTsKLSAgdGVtcCA9IG5ldyBCaXRDYXN0SW5zdChwdHJfMTEsIGludHJpbnNpY3MtPkphdmFDbGFzc1ByaW1pdGl2ZVR5cGUsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19sYWJlbF9iYik7Ci0gIEdldEVsZW1lbnRQdHJJbnN0KiBwdHJfMTggPSBHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlKHRlbXAsIHB0cl8xMV9pbmRpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfMTFfaW5kaWNlcyArIDIsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbGFiZWxfYmIpOwotICBMb2FkSW5zdCogaW50MzJfMjAgPSBuZXcgTG9hZEluc3QocHRyXzE4LCAiIiwgZmFsc2UsIGxvZ19sYWJlbF9iYik7Ci0gICAKLSAgaW50MzJfc3RhcnQgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU2hsKGludDMyX3N0YXJ0LCBpbnQzMl8yMCwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbGFiZWxfYmIpOwotICBpbnQzMl9zdGFydDIgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU2hsKGludDMyX3N0YXJ0MiwgaW50MzJfMjAsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19sYWJlbF9iYik7Ci0gIGludDMyX2xlbmd0aCA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVTaGwoaW50MzJfbGVuZ3RoLCBpbnQzMl8yMCwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX2xhYmVsX2JiKTsKLQotICBwdHJfc3JjID0gbmV3IEJpdENhc3RJbnN0KHB0cl9zcmMsIGludHJpbnNpY3MtPkphdmFBcnJheVVJbnQ4VHlwZSwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX2xhYmVsX2JiKTsKLSAgCi0gIHB0cl9kc3QgPSBuZXcgQml0Q2FzdEluc3QocHRyX2RzdCwgaW50cmluc2ljcy0+SmF2YUFycmF5VUludDhUeXBlLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfbGFiZWxfYmIpOwotICAKLSAgVmFsdWUqIGluZGV4ZXNbM10gPSB7IGludHJpbnNpY3MtPmNvbnN0YW50WmVybywKLSAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPkphdmFBcnJheUVsZW1lbnRzT2Zmc2V0Q29uc3RhbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl9zdGFydCB9OwotICBJbnN0cnVjdGlvbiogcHRyXzQyID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShwdHJfc3JjLCBpbmRleGVzLCBpbmRleGVzICsgMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIGxvZ19sYWJlbF9iYik7Ci0gIAotICBpbmRleGVzWzJdID0gaW50MzJfc3RhcnQyOwotICBJbnN0cnVjdGlvbiogcHRyXzQ0ID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShwdHJfZHN0LCBpbmRleGVzLCBpbmRleGVzICsgMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIGxvZ19sYWJlbF9iYik7Ci0gCi0gIEJyYW5jaEluc3Q6OkNyZWF0ZShsYWJlbF9tZW1tb3ZlLCBsb2dfbGFiZWxfYmIpOwotCi0gIC8vIEJsb2NrIG1lbW1vdmUKLSAgY3VycmVudEJsb2NrID0gbGFiZWxfbWVtbW92ZTsKLSAgVmFsdWUqIHNyY19pbnQgPSBuZXcgUHRyVG9JbnRJbnN0KHB0cl80MiwgaW50cmluc2ljcy0+cG9pbnRlclNpemVUeXBlLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gIAotICBWYWx1ZSogZHN0X2ludCA9IG5ldyBQdHJUb0ludEluc3QocHRyXzQ0LCBpbnRyaW5zaWNzLT5wb2ludGVyU2l6ZVR5cGUsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLQotICBjbXAgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfVUxULCBkc3RfaW50LCBzcmNfaW50LCAiIik7Ci0KLSAgVmFsdWUqIGluY3JlbWVudCA9IFNlbGVjdEluc3Q6OkNyZWF0ZShjbXAsIGludHJpbnNpY3MtPmNvbnN0YW50T25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPmNvbnN0YW50TWludXNPbmUsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gIEJyYW5jaEluc3Q6OkNyZWF0ZShsYWJlbF9iYjExLCBsYWJlbF9iYWNrd2FyZCwgY21wLCBjdXJyZW50QmxvY2spOwotCi0gIFBISU5vZGUqIHBoaV9kc3RfcHRyID0gUEhJTm9kZTo6Q3JlYXRlKHB0cl80NC0+Z2V0VHlwZSgpLCAiIiwgbGFiZWxfYmIxMSk7Ci0gIFBISU5vZGUqIHBoaV9zcmNfcHRyID0gUEhJTm9kZTo6Q3JlYXRlKHB0cl80NC0+Z2V0VHlwZSgpLCAiIiwgbGFiZWxfYmIxMSk7Ci0gIHBoaV9kc3RfcHRyLT5hZGRJbmNvbWluZyhwdHJfNDQsIGN1cnJlbnRCbG9jayk7Ci0gIHBoaV9zcmNfcHRyLT5hZGRJbmNvbWluZyhwdHJfNDIsIGN1cnJlbnRCbG9jayk7Ci0gCi0gIC8vIEJsb2NrIGJhY2t3YXJkCi0gIGN1cnJlbnRCbG9jayA9IGxhYmVsX2JhY2t3YXJkOwotCi0gIHB0cl80MiA9IEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUocHRyXzQyLCBpbnQzMl9sZW5ndGgsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gIAotICBwdHJfNDQgPSBHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlKHB0cl80NCwgaW50MzJfbGVuZ3RoLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICAKLSAgcHRyXzQyID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShwdHJfNDIsIGludHJpbnNpY3MtPmNvbnN0YW50TWludXNPbmUsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gIAotICBwdHJfNDQgPSBHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlKHB0cl80NCwgaW50cmluc2ljcy0+Y29uc3RhbnRNaW51c09uZSwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgCi0gIHBoaV9kc3RfcHRyLT5hZGRJbmNvbWluZyhwdHJfNDQsIGN1cnJlbnRCbG9jayk7Ci0gIHBoaV9zcmNfcHRyLT5hZGRJbmNvbWluZyhwdHJfNDIsIGN1cnJlbnRCbG9jayk7Ci0KLSAgQnJhbmNoSW5zdDo6Q3JlYXRlKGxhYmVsX2JiMTEsIGN1cnJlbnRCbG9jayk7Ci0gIAotICAvLyBCbG9jayBiYjExIChsYWJlbF9iYjExKQotICBjdXJyZW50QmxvY2sgPSBsYWJlbF9iYjExOwotICBBcmd1bWVudCogZndkcmVmXzM5ID0gbmV3IEFyZ3VtZW50KFR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSk7Ci0gIFBISU5vZGUqIGludDMyX2lfMDE2ID0gUEhJTm9kZTo6Q3JlYXRlKFR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkuMDE2IiwgbGFiZWxfYmIxMSk7Ci0gIGludDMyX2lfMDE2LT5yZXNlcnZlT3BlcmFuZFNwYWNlKDIpOwotICBpbnQzMl9pXzAxNi0+YWRkSW5jb21pbmcoZndkcmVmXzM5LCBsYWJlbF9iYjExKTsKLSAgaW50MzJfaV8wMTYtPmFkZEluY29taW5nKGludHJpbnNpY3MtPmNvbnN0YW50WmVybywgbG9nX2xhYmVsX2JiKTsKLSAgIAotICBMb2FkSW5zdCogcHRyXzQzID0gbmV3IExvYWRJbnN0KHBoaV9zcmNfcHRyLCAiIiwgZmFsc2UsIGxhYmVsX2JiMTEpOwotICBuZXcgU3RvcmVJbnN0KHB0cl80MywgcGhpX2RzdF9wdHIsIGZhbHNlLCBsYWJlbF9iYjExKTsKLQotCi0gIHB0cl80MiA9IEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUocGhpX3NyY19wdHIsIGluY3JlbWVudCwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxfYmIxMSk7Ci0gIAotICBwdHJfNDQgPSBHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlKHBoaV9kc3RfcHRyLCBpbmNyZW1lbnQsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsX2JiMTEpOwotICBwaGlfZHN0X3B0ci0+YWRkSW5jb21pbmcocHRyXzQ0LCBsYWJlbF9iYjExKTsKLSAgcGhpX3NyY19wdHItPmFkZEluY29taW5nKHB0cl80MiwgbGFiZWxfYmIxMSk7Ci0KLSAgQmluYXJ5T3BlcmF0b3IqIGludDMyX2luZHZhcl9uZXh0ID0KLSAgICBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlKEluc3RydWN0aW9uOjpBZGQsIGludDMyX2lfMDE2LCBpbnRyaW5zaWNzLT5jb25zdGFudE9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmR2YXIubmV4dCIsIGxhYmVsX2JiMTEpOwotICBJQ21wSW5zdCogaW50MV9leGl0Y29uZCA9IG5ldyBJQ21wSW5zdCgqbGFiZWxfYmIxMSwgSUNtcEluc3Q6OklDTVBfRVEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX2luZHZhcl9uZXh0LCBpbnQzMl9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGl0Y29uZCIpOwotICBCcmFuY2hJbnN0OjpDcmVhdGUobGFiZWxfcmV0dXJuLCBsYWJlbF9iYjExLCBpbnQxX2V4aXRjb25kLCBsYWJlbF9iYjExKTsKLQotICAvLyBSZXNvbHZlIEZvcndhcmQgUmVmZXJlbmNlcwotICBmd2RyZWZfMzktPnJlcGxhY2VBbGxVc2VzV2l0aChpbnQzMl9pbmR2YXJfbmV4dCk7IGRlbGV0ZSBmd2RyZWZfMzk7Ci0KLSAgY3VycmVudEJsb2NrID0gbGFiZWxfcmV0dXJuOwotfQotCi1EZWJ1Z0xvYyBKYXZhSklUOjpDcmVhdGVMb2NhdGlvbigpIHsKLSAgRGVidWdMb2MgREwgPSBEZWJ1Z0xvYzo6Z2V0KGN1cnJlbnRCeXRlY29kZUluZGV4LCAwLCBEYmdTdWJwcm9ncmFtKTsKLSAgcmV0dXJuIERMOwotfQotCi0jaWZkZWYgRFdBUkZfRVhDRVBUSU9OUwotI2luY2x1ZGUgIkV4Y2VwdGlvbnNEd2FyZi5pbmMiCi0jZWxzZQotI2luY2x1ZGUgIkV4Y2VwdGlvbnNDaGVjay5pbmMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9KMy9Db21waWxlci9KYXZhSklULmggYi92bWtpdC9saWIvSjMvQ29tcGlsZXIvSmF2YUpJVC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGViMjBmLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9KMy9Db21waWxlci9KYXZhSklULmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MTggKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLSBKYXZhSklULmggLSBKYXZhIGp1c3QgaW4gdGltZSBjb21waWxlciAtLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgSk5KVk1fSkFWQV9KSVRfSAotI2RlZmluZSBKTkpWTV9KQVZBX0pJVF9ICi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8bWFwPgotCi0jaW5jbHVkZSAibGx2bS9CYXNpY0Jsb2NrLmgiCi0jaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgotI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCi0jaW5jbHVkZSAibGx2bS9MTFZNQ29udGV4dC5oIgotI2luY2x1ZGUgImxsdm0vTWV0YWRhdGEuaCIKLSNpbmNsdWRlICJsbHZtL1R5cGUuaCIKLSNpbmNsdWRlICJsbHZtL1ZhbHVlLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnTG9jLmgiCi0jaW5jbHVkZSAibGx2bS9BbmFseXNpcy9EZWJ1Z0luZm8uaCIKLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLSNpbmNsdWRlICJqMy9KYXZhTExWTUNvbXBpbGVyLmgiCi0KLSNpbmNsdWRlICJKYXZhQ2xhc3MuaCIKLSNpbmNsdWRlICJKYXZhVXBjYWxscy5oIgotI2luY2x1ZGUgIkpuanZtLmgiCi0KLW5hbWVzcGFjZSBqMyB7Ci0KLWNsYXNzIENsYXNzOwotY2xhc3MgSmF2YU1ldGhvZDsKLWNsYXNzIFJlYWRlcjsKLQotLy8vIE9waW5mbyAtIFRoaXMgY2xhc3MgZ2l2ZXMgZm9yIGVhY2ggb3Bjb2RlIGlmIGl0IHN0YXJ0cyBhIG5ldyBibG9jayBhbmQKLS8vLyBpdHMgZXhjZXB0aW9uIGRlc3RpbmF0aW9uLgotLy8vCi1zdHJ1Y3QgT3BpbmZvIHsKLQotICAvLy8gbmV3QmxvY2sgLSBJZiBpdCBpcyBub24tbnVsbCwgdGhlIGJsb2NrIHRoYXQgdGhlIGluc3RydWN0aW9uIHN0YXJ0cy4KLSAgLy8vCi0gIGxsdm06OkJhc2ljQmxvY2sqIG5ld0Jsb2NrOwotCi0gIC8vLyBleGNlcHRpb25CbG9jayAtIE5ldmVyIG51bGwsIHRoZSBleGNlcHRpb24gZGVzdGluYXRpb24gb2YgdGhlCi0gIC8vLyBpbnN0cnVjdGlvbi4KLSAgLy8vCi0gIGxsdm06OkJhc2ljQmxvY2sqIGV4Y2VwdGlvbkJsb2NrOwotCi0gIC8vLyBoYW5kbGVyIC0gSWYgdGhlIGluc3RydWN0aW9uIGlzIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBvZiBhIEphdmEgZXhjZXB0aW9uCi0gIC8vLyBoYW5kbGVyLgotICAvLy8KLSAgYm9vbCBoYW5kbGVyOwotCi0gIC8vLyBzdGFjayAtIFRoZSBzdGFjayBhdCB0aGlzIGxvY2F0aW9uIGlmIHRoZXJlIGlzIGEgbmV3IGJsb2NrCi0gIC8vLwotICBzdGQ6OnZlY3RvcjxDb21tb25DbGFzcyo+IHN0YWNrOwotfTsKLQotCi0vLy8gSmF2YUpJVCAtIFRoZSBjb21waWxhdGlvbiBlbmdpbmUgb2YgSjMuIFBhcnNlcyB0aGUgYnljb2RlIGFuZCByZXR1cm5zCi0vLy8gaXRzIExMVk0gcmVwcmVzZW50YXRpb24uCi0vLy8KLWNsYXNzIEphdmFKSVQgewotcHVibGljOgotIAotICAvLy8gSmF2YUpJVCAtIERlZmF1bHQgY29uc3RydWN0b3IuCi0gIEphdmFKSVQoSmF2YUxMVk1Db21waWxlciogQywgSmF2YU1ldGhvZCogbWV0aCwgbGx2bTo6RnVuY3Rpb24qIGZ1bmMpIHsKLSAgICBjb21waWxpbmdNZXRob2QgPSBtZXRoOwotICAgIGNvbXBpbGluZ0NsYXNzID0gbWV0aC0+Y2xhc3NEZWY7Ci0gICAgdXBjYWxscyA9IGNvbXBpbGluZ0NsYXNzLT5jbGFzc0xvYWRlci0+dm0tPnVwY2FsbHM7Ci0gICAgVGhlQ29tcGlsZXIgPSBDOwotICAgIGludHJpbnNpY3MgPSBUaGVDb21waWxlci0+Z2V0SW50cmluc2ljcygpOwotICAgIGxsdm1GdW5jdGlvbiA9IGZ1bmM7Ci0gICAgbGx2bUNvbnRleHQgPSAmZnVuYy0+Z2V0Q29udGV4dCgpOwotICAgIGlubGluaW5nID0gZmFsc2U7Ci0gICAgY2FsbHNTdGFja1dhbGtlciA9IGZhbHNlOwotICAgIGVuZE5vZGUgPSAwOwotICAgIGN1cnJlbnRTdGFja0luZGV4ID0gMDsKLSAgICBjdXJyZW50Qnl0ZWNvZGVJbmRleCA9IDA7Ci0gICAgdGhpc09iamVjdCA9IE5VTEw7Ci0gIH0KLQotICAvLy8gamF2YUNvbXBpbGUgLSBDb21waWxlIHRoZSBKYXZhIG1ldGhvZC4KLSAgbGx2bTo6RnVuY3Rpb24qIGphdmFDb21waWxlKCk7Ci0gIAotICAvLy8gbmF0aXZlQ29tcGlsZSAtIENvbXBpbGUgdGhlIG5hdGl2ZSBtZXRob2QuCi0gIGxsdm06OkZ1bmN0aW9uKiBuYXRpdmVDb21waWxlKGludHB0cl90IG5hdFB0ciA9IDApOwotCi1wcml2YXRlOgotICAKLSAgLy8vIGNvbXBpbGluZ0NsYXNzIC0gVGhlIGNsYXNzIHRoYXQgaXMgZGVmaW5pbmcgdGhlIG1ldGhvZCBiZWluZyBjb21waWxlZC4KLSAgQ2xhc3MqIGNvbXBpbGluZ0NsYXNzOwotCi0gIC8vLyBjb21waWxpbmdNZXRob2QgLSBUaGUgbWV0aG9kIGJlaW5nIGNvbXBpbGVkLgotICBKYXZhTWV0aG9kKiBjb21waWxpbmdNZXRob2Q7Ci0KLSAgLy8vIHVwY2FsbHMgLSBVcGNhbGxzIHVzZWQgdHAgdHlwZSB0aGUgc3RhY2sgYW5kIGxvY2Fscy4KLSAgQ2xhc3NwYXRoKiB1cGNhbGxzOwotCi0gIC8vLyBsbHZtRnVuY3Rpb24gLSBUaGUgTExWTSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWV0aG9kLgotICBsbHZtOjpGdW5jdGlvbiogbGx2bUZ1bmN0aW9uOwotCi0gIC8vLyBsbHZtQ29udGV4dCAtIFRoZSBjdXJyZW50IExMVk0gY29udGV4dCBvZiBjb21waWxhdGlvbi4KLSAgbGx2bTo6TExWTUNvbnRleHQqIGxsdm1Db250ZXh0OwotICAKLSAgLy8vIGludHJpbnNpY3MgLSBUaGUgTExWTSBpbnRyaW5zaWNzIHdoZXJlIGxpdmVzIHRoZSBjb21waWxpbmcgTExWTSBmdW5jdGlvbi4KLSAgSjNJbnRyaW5zaWNzKiBpbnRyaW5zaWNzOwotCi0gIC8vLyBUaGVDb21waWxlciAtIFRoZSBMTFZNIEphdmEgY29tcGlsZXIuCi0gIC8vLwotICBKYXZhTExWTUNvbXBpbGVyKiBUaGVDb21waWxlcjsKLSAgCi0gIC8vLyBsb2NhbHMgLSBUaGUgbG9jYWxzIG9mIHRoZSBtZXRob2QuCi0gIHN0ZDo6dmVjdG9yPGxsdm06OkFsbG9jYUluc3QqPiBpbnRMb2NhbHM7Ci0gIHN0ZDo6dmVjdG9yPGxsdm06OkFsbG9jYUluc3QqPiBsb25nTG9jYWxzOwotICBzdGQ6OnZlY3RvcjxsbHZtOjpBbGxvY2FJbnN0Kj4gZmxvYXRMb2NhbHM7Ci0gIHN0ZDo6dmVjdG9yPGxsdm06OkFsbG9jYUluc3QqPiBkb3VibGVMb2NhbHM7Ci0gIHN0ZDo6dmVjdG9yPGxsdm06OkFsbG9jYUluc3QqPiBvYmplY3RMb2NhbHM7Ci0KLSAgLy8vIGVuZEJsb2NrIC0gVGhlIGJsb2NrIHRoYXQgcmV0dXJucy4KLSAgbGx2bTo6QmFzaWNCbG9jayogZW5kQmxvY2s7Ci0KLSAgLy8vIGVuZE5vZGUgLSBUaGUgcmVzdWx0IG9mIHRoZSBtZXRob2QuCi0gIGxsdm06OlBISU5vZGUqIGVuZE5vZGU7Ci0gIAotICAvLy8gYXJyYXlTaXplIC0gR2V0IHRoZSBzaXplIG9mIHRoZSBhcnJheS4KLSAgbGx2bTo6VmFsdWUqIGFycmF5U2l6ZShsbHZtOjpWYWx1ZSogb2JqKSB7Ci0gICAgcmV0dXJuIGxsdm06OkNhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+QXJyYXlMZW5ndGhGdW5jdGlvbiwgb2JqLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICB9Ci0gIAotICAvLy8gY29udmVydFZhbHVlIC0gQ29udmVydCBhIHZhbHVlIHRvIGEgbmV3IHR5cGUuCi0gIHZvaWQgY29udmVydFZhbHVlKGxsdm06OlZhbHVlKiYgdmFsLCBjb25zdCBsbHZtOjpUeXBlKiB0MSwKLSAgICAgICAgICAgICAgICAgICAgbGx2bTo6QmFzaWNCbG9jayogY3VycmVudEJsb2NrLCBib29sIHVzaWduKTsKLSAKLSAgLy8vIGdldE11dGF0b3JUaHJlYWRQdHIgLSBFbWl0IGNvZGUgdG8gZ2V0IGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBNdXRhdG9yVGhyZWFkLgotCWxsdm06OlZhbHVlKiBnZXRNdXRhdG9yVGhyZWFkUHRyKCk7Ci0KLSAgLy8vIGdldERvWWllbGRQdHIgLSBFbWl0IGNvZGUgdG8gZ2V0IGEgcG9pbnRlciB0byBkb1lpZWxkLgotCWxsdm06OlZhbHVlKiBnZXREb1lpZWxkUHRyKGxsdm06OlZhbHVlKiBtdXRhdG9yVGhyZWFkUHRyKTsKLQotICAvLy8gZ2V0Q1hYRXhjZXB0aW9uUHRyIC0gRW1pdCBjb2RlIHRvIGdldCBhIHBvaW50ZXIgdG8gaW50ZXJuYWxQZW5kaW5nRXhjZXB0aW9uLgotCWxsdm06OlZhbHVlKiBnZXRDWFhFeGNlcHRpb25QdHIobGx2bTo6VmFsdWUqIG11dGF0b3JUaHJlYWRQdHIpOwotCi0gIC8vLyBnZXRQZW5kaW5nRXhjZXB0aW9uUHRyIC0gRW1pdCBjb2RlIHRvIGdldCBhIHBvaW50ZXIgdG8gdGhlIEphdmEgcGVuZGluZyBleGNlcHRpb24KLQlsbHZtOjpWYWx1ZSogZ2V0UGVuZGluZ0V4Y2VwdGlvblB0cihsbHZtOjpWYWx1ZSogbXV0YXRvclRocmVhZFB0cik7Ci0KLSAgLy8vIGdldEphdmFUaHJlYWRQdHIgLSBFbWl0IGNvZGUgdG8gZ2V0IGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBKYXZhVGhyZWFkLgotCWxsdm06OlZhbHVlKiBnZXRKYXZhVGhyZWFkUHRyKGxsdm06OlZhbHVlKiBtdXRhdG9yVGhyZWFkUHRyKTsKLQotICAvLy8gZ2V0Sk5JRW52UHRyIC0gRW1pdCBjb2RlIHRvIGdldCBhIHBvaW50ZXIgdG8gSk5JRW52Ci0JbGx2bTo6VmFsdWUqIGdldEpOSUVudlB0cihsbHZtOjpWYWx1ZSogamF2YVRocmVhZFB0cik7Ci0JCi0KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEZWJ1Z2dpbmcgc3VwcG9ydCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0gIAotICBsbHZtOjpNRE5vZGUqIERiZ1N1YnByb2dyYW07Ci0gIAotICAvLy8gY3VycmVudEJ5dGVjb2RlSW5kZXggLSBUaGUgY3VycmVudCBieXRlY29kZSBiZWluZyBwcm9jZXNzZWQuCi0gIHVpbnQxNiBjdXJyZW50Qnl0ZWNvZGVJbmRleDsKLSAgCi0gIC8vLyBDcmVhdGVMb2NhdGlvbiAtIENyZWF0ZSBkZWJ1ZyBpbmZvcm1hdGlvbiBmb3IgYSBjYWxsLgotICBsbHZtOjpEZWJ1Z0xvYyBDcmVhdGVMb2NhdGlvbigpOwotCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbmxpbmUgc3VwcG9ydCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0gIC8vLyBpbmxpbmVDb21waWxlIC0gUGFyc2UgdGhlIG1ldGhvZCBhbmQgc3RhcnQgaXRzIExMVk0gcmVwcmVzZW50YXRpb24KLSAgLy8vIGF0IGN1ckJCLiBlbmRFeEJsb2NrIGlzIHRoZSBleGNlcHRpb24gZGVzdGluYXRpb24uIGFyZ3MgaXMgdGhlCi0gIC8vLyBhcmd1bWVudHMgb2YgdGhlIG1ldGhvZC4KLSAgbGx2bTo6SW5zdHJ1Y3Rpb24qIGlubGluZUNvbXBpbGUobGx2bTo6QmFzaWNCbG9jayomIGN1ckJCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpCYXNpY0Jsb2NrKiBlbmRFeEJsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxsbHZtOjpWYWx1ZSo+JiBhcmdzKTsKLQotCi0gIC8vLyBpbmxpbmVNZXRob2RzIC0gTWV0aG9kcyB0aGF0IGFyZSBjdXJyZW50bHkgYmVpbmcgaW5saW5lZC4gVGhlIEpJVAotICAvLy8gdXNlcyB0aGlzIG1hcCB0byBub3QgaW5saW5lIGEgbWV0aG9kIGN1cnJlbnRseSBiZWluIGlubGluZWQuCi0gIHN0ZDo6bWFwPEphdmFNZXRob2QqLCBib29sPiBpbmxpbmVNZXRob2RzOwotCi0gIC8vLyBpbmxpbmluZyAtIEFyZSB3ZSBKSVR0aW5nIGEgbWV0aG9kIGlubGluZT8KLSAgYm9vbCBpbmxpbmluZzsKLSAgCi0gIC8vLyBjYW5CZUlubGluZWQgLSBDYW4gdGhpcyBtZXRob2QncyBib2R5IGJlIGlubGluZWQ/Ci0gIGJvb2wgY2FuQmVJbmxpbmVkKEphdmFNZXRob2QqIG1ldGgpOwotCi0gIC8vLyBjYWxsc1N0YWNrV2Fsa2VyIC0gSXMgdGhlIG1ldGhvZCBjYWxsaW5nIGEgc3RhY2sgd2Fsa2VyIG1ldGhvZD8gSWYgaXQgaXMsCi0gIC8vLyB0aGVuIHRoaXMgbWV0aG9kIGNhbiBub3QgYmUgaW5saW5lZC4KLSAgYm9vbCBjYWxsc1N0YWNrV2Fsa2VyOwotCi0gIAotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJ5dGVjb2RlIHBhcnNpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotICAvLy8gY29tcGlsZU9wY29kZXMgLSBQYXJzZSB0aGUgYnl0ZWNvZGUgYW5kIGNyZWF0ZSBMTFZNIGluc3RydWN0aW9ucy4KLSAgdm9pZCBjb21waWxlT3Bjb2RlcyhSZWFkZXImIHJlYWRlciwgdWludDMyIGNvZGVMZW5ndGgpOwotCi0gIC8vLyBleHBsb3JlT3Bjb2RlcyAtIFBhcnNlIHRoZSBieXRlY29kZSBhbmQgY3JlYXRlIHRoZSBiYXNpYyBibG9ja3MuCi0gIHZvaWQgZXhwbG9yZU9wY29kZXMoUmVhZGVyJiByZWFkZXIsIHVpbnQzMiBjb2RlTGVuZ3RoKTsKLSAgCi0gIC8vLyByZWFkRXhjZXB0aW9uVGFibGUgLSBSZWFkIHRoZSBleGNlcHRpb24gdGFibGUgaW4gdGhlIGJ5dGVjb2RlLiBQcmVwYXJlCi0gIC8vLyBleGNlcHRpb24gZGVzdGluYXRpb24gZm9yIGFsbCBKYXZhIGluc3RydWN0aW9ucyBhbmQgc2V0IHRoZSBleGNlcHRpb24KLSAgLy8vIG9iamVjdCB0byBoYW5kbGVyIGJsb2Nrcy4KLSAgdW5zaWduZWQgcmVhZEV4Y2VwdGlvblRhYmxlKFJlYWRlciYgcmVhZGVyLCB1aW50MzIgY29kZUxlbmd0aCk7Ci0KLSAgLy8vIGxvYWRDb25zdGFudCAtIExvYWQgYSBjb25zdGFudCBmcm9tIHRoZSBfbGRjIGJ5dGVjb2RlLgotICB2b2lkIGxvYWRDb25zdGFudCh1aW50MTYgaW5kZXgpOwotCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUnVudGltZSBleGNlcHRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotICAKLSAgLy8vIEpJVFZlcmlmeU51bGwgLSBJbnNlcnQgYSBudWxsIHBvaW50ZXIgY2hlY2sgaW4gdGhlIExMVk0gY29kZS4KLSAgdm9pZCBKSVRWZXJpZnlOdWxsKGxsdm06OlZhbHVlKiBvYmopOwotICAKLSAgCi0gIC8vLyB2ZXJpZnlBbmRDb21wdXRlUHRyIC0gQ29tcHV0ZXMgdGhlIGFkZHJlc3MgaW4gdGhlIGFycmF5LiBJZiBvdXQgb2YgYm91bmRzCi0gIC8vLyB0aHJvdyBhbiBleGNlcHRpb24uCi0gIGxsdm06OlZhbHVlKiB2ZXJpZnlBbmRDb21wdXRlUHRyKGxsdm06OlZhbHVlKiBvYmosIGxsdm06OlZhbHVlKiBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VHlwZSogYXJyYXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHZlcmlmID0gdHJ1ZSk7Ci0KLSAgLy8vIGNvbXBhcmVGUCAtIERvIGZsb2F0IGNvbXBhcmlzb25zLgotICB2b2lkIGNvbXBhcmVGUChsbHZtOjpWYWx1ZSosIGxsdm06OlZhbHVlKiwgY29uc3QgbGx2bTo6VHlwZSosIGJvb2wgbCk7Ci0gIAotCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3RhY2sgbWFuaXB1bGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0gIC8vLyBzdGFjayAtIFRoZSBjb21waWxlciBzdGFjay4KLSAgc3RkOjp2ZWN0b3I8Q29tbW9uQ2xhc3MqPiBzdGFjazsKLSAgdWludDMyIGN1cnJlbnRTdGFja0luZGV4OwotICBzdGQ6OnZlY3RvcjxsbHZtOjpBbGxvY2FJbnN0Kj4gb2JqZWN0U3RhY2s7Ci0gIHN0ZDo6dmVjdG9yPGxsdm06OkFsbG9jYUluc3QqPiBpbnRTdGFjazsKLSAgc3RkOjp2ZWN0b3I8bGx2bTo6QWxsb2NhSW5zdCo+IGxvbmdTdGFjazsKLSAgc3RkOjp2ZWN0b3I8bGx2bTo6QWxsb2NhSW5zdCo+IGZsb2F0U3RhY2s7Ci0gIHN0ZDo6dmVjdG9yPGxsdm06OkFsbG9jYUluc3QqPiBkb3VibGVTdGFjazsKLQotICAvLy8gcHVzaCAtIFB1c2ggYSBuZXcgdmFsdWUgaW4gdGhlIHN0YWNrLgotICB2b2lkIHB1c2gobGx2bTo6VmFsdWUqIHZhbCwgYm9vbCB1bnNpZ24sIENvbW1vbkNsYXNzKiBjbCA9IDApIHsKLSAgICBjb25zdCBsbHZtOjpUeXBlKiB0eXBlID0gdmFsLT5nZXRUeXBlKCk7Ci0gICAgaWYgKHVuc2lnbikgewotICAgICAgdmFsID0gbmV3IGxsdm06OlpFeHRJbnN0KHZhbCwgbGx2bTo6VHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgIG5ldyBsbHZtOjpTdG9yZUluc3QodmFsLCBpbnRTdGFja1tjdXJyZW50U3RhY2tJbmRleCsrXSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gICAgICBzdGFjay5wdXNoX2JhY2sodXBjYWxscy0+T2ZJbnQpOwotICAgIH0gZWxzZSBpZiAodHlwZSA9PSBsbHZtOjpUeXBlOjpnZXRJbnQ4VHkoKmxsdm1Db250ZXh0KSB8fAotICAgICAgICAgICAgICAgdHlwZSA9PSBsbHZtOjpUeXBlOjpnZXRJbnQxNlR5KCpsbHZtQ29udGV4dCkpIHsKLSAgICAgIHZhbCA9IG5ldyBsbHZtOjpTRXh0SW5zdCh2YWwsIGxsdm06OlR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgICAgIG5ldyBsbHZtOjpTdG9yZUluc3QodmFsLCBpbnRTdGFja1tjdXJyZW50U3RhY2tJbmRleCsrXSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gICAgICBzdGFjay5wdXNoX2JhY2sodXBjYWxscy0+T2ZJbnQpOwotICAgIH0gZWxzZSBpZiAodHlwZSA9PSBsbHZtOjpUeXBlOjpnZXRJbnQzMlR5KCpsbHZtQ29udGV4dCkpIHsKLSAgICAgIG5ldyBsbHZtOjpTdG9yZUluc3QodmFsLCBpbnRTdGFja1tjdXJyZW50U3RhY2tJbmRleCsrXSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gICAgICBzdGFjay5wdXNoX2JhY2sodXBjYWxscy0+T2ZJbnQpOwotICAgIH0gZWxzZSBpZiAodHlwZSA9PSBsbHZtOjpUeXBlOjpnZXRJbnQ2NFR5KCpsbHZtQ29udGV4dCkpIHsKLSAgICAgIG5ldyBsbHZtOjpTdG9yZUluc3QodmFsLCBsb25nU3RhY2tbY3VycmVudFN0YWNrSW5kZXgrK10sIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICAgICAgc3RhY2sucHVzaF9iYWNrKHVwY2FsbHMtPk9mTG9uZyk7Ci0gICAgfSBlbHNlIGlmICh0eXBlID09IGxsdm06OlR5cGU6OmdldEZsb2F0VHkoKmxsdm1Db250ZXh0KSkgewotICAgICAgbmV3IGxsdm06OlN0b3JlSW5zdCh2YWwsIGZsb2F0U3RhY2tbY3VycmVudFN0YWNrSW5kZXgrK10sIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICAgICAgc3RhY2sucHVzaF9iYWNrKHVwY2FsbHMtPk9mRmxvYXQpOwotICAgIH0gZWxzZSBpZiAodHlwZSA9PSBsbHZtOjpUeXBlOjpnZXREb3VibGVUeSgqbGx2bUNvbnRleHQpKSB7Ci0gICAgICBuZXcgbGx2bTo6U3RvcmVJbnN0KHZhbCwgZG91YmxlU3RhY2tbY3VycmVudFN0YWNrSW5kZXgrK10sIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICAgICAgc3RhY2sucHVzaF9iYWNrKHVwY2FsbHMtPk9mRG91YmxlKTsKLSAgICB9IGVsc2UgewotICAgICAgYXNzZXJ0KHR5cGUgPT0gaW50cmluc2ljcy0+SmF2YU9iamVjdFR5cGUgJiYgIkNhbid0IGhhbmRsZSB0aGlzIHR5cGUiKTsKLSAgICAgIGxsdm06Okluc3RydWN0aW9uKiBWID0gbmV3IAotICAgICAgICBsbHZtOjpTdG9yZUluc3QodmFsLCBvYmplY3RTdGFja1tjdXJyZW50U3RhY2tJbmRleCsrXSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICAgICAgc3RhY2sucHVzaF9iYWNrKGNsID8gY2wgOiB1cGNhbGxzLT5PZk9iamVjdCk7Ci0gICAgICBhZGRIaWdoTGV2ZWxUeXBlKFYsIHRvcFR5cGVJbmZvKCkpOwotICAgICAgaWYgKGxsdm06Okluc3RydWN0aW9uKiBJID0gbGx2bTo6ZHluX2Nhc3Q8bGx2bTo6SW5zdHJ1Y3Rpb24+KHZhbCkpIHsKLSAgICAgICAgYWRkSGlnaExldmVsVHlwZShJLCB0b3BUeXBlSW5mbygpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB2b2lkIGFkZEhpZ2hMZXZlbFR5cGUobGx2bTo6SW5zdHJ1Y3Rpb24qIFYsIENvbW1vbkNsYXNzKiBjbCkgewotICAgIC8vIEVuYWJsZSB0aGlzIHdoZW4gaXQgd2lsbCBiZSBhY3R1YWxseSB1c2VkLgotI2lmIDAKLSAgICBsbHZtOjpWYWx1ZSogQVsxXSA9IAotICAgICAgeyBUaGVDb21waWxlci0+Z2V0TmF0aXZlQ2xhc3MoY2wgPyBjbCA6IHVwY2FsbHMtPk9mT2JqZWN0KSB9OwotICAgIGxsdm06Ok1ETm9kZSogTm9kZSA9IGxsdm06Ok1ETm9kZTo6Z2V0KCpsbHZtQ29udGV4dCwgQSwgMSk7Ci0gICAgVi0+c2V0TWV0YWRhdGEoaW50cmluc2ljcy0+TWV0YWRhdGFUeXBlS2luZCwgTm9kZSk7Ci0jZW5kaWYKLSAgfQotCi0KLSAgLy8vIHBvcCAtIFBvcCBhIHZhbHVlIGZyb20gdGhlIHN0YWNrIGFuZCByZXR1cm4gaXQuCi0gIGxsdm06OlZhbHVlKiBwb3AoKSB7Ci0gICAgbGx2bTo6VmFsdWUqIHJlcyA9IHRvcCgpOwotICAgIC0tY3VycmVudFN0YWNrSW5kZXg7Ci0gICAgc3RhY2sucG9wX2JhY2soKTsKLSAgICByZXR1cm4gcmVzOwotICB9Ci0KLSAgLy8vIHRvcCAtIFJldHVybiB0aGUgdmFsdWUgb24gdG9wIG9mIHRoZSBzdGFjay4KLSAgbGx2bTo6VmFsdWUqIHRvcCgpIHsKLSAgICBDb21tb25DbGFzcyogY2wgPSBzdGFjay5iYWNrKCk7Ci0gICAgaWYgKGNsID09IHVwY2FsbHMtPk9mSW50KSB7Ci0gICAgICByZXR1cm4gbmV3IGxsdm06OkxvYWRJbnN0KGludFN0YWNrW2N1cnJlbnRTdGFja0luZGV4IC0gMV0sICIiLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgICB9IGVsc2UgaWYgKGNsID09IHVwY2FsbHMtPk9mRmxvYXQpIHsKLSAgICAgIHJldHVybiBuZXcgbGx2bTo6TG9hZEluc3QoZmxvYXRTdGFja1tjdXJyZW50U3RhY2tJbmRleCAtIDFdLCAiIiwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gICAgfSBlbHNlIGlmIChjbCA9PSB1cGNhbGxzLT5PZkRvdWJsZSkgewotICAgICAgcmV0dXJuIG5ldyBsbHZtOjpMb2FkSW5zdChkb3VibGVTdGFja1tjdXJyZW50U3RhY2tJbmRleCAtIDFdLCAiIiwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gICAgfSBlbHNlIGlmIChjbCA9PSB1cGNhbGxzLT5PZkxvbmcpIHsKLSAgICAgIHJldHVybiBuZXcgbGx2bTo6TG9hZEluc3QobG9uZ1N0YWNrW2N1cnJlbnRTdGFja0luZGV4IC0gMV0sICIiLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIG5ldyBsbHZtOjpMb2FkSW5zdChvYmplY3RTdGFja1tjdXJyZW50U3RhY2tJbmRleCAtIDFdLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlQ29tcGlsZXItPnVzZUNvb3BlcmF0aXZlR0MoKSwgY3VycmVudEJsb2NrKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8vLyB0b3BUeXBlSW5mbyAtIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgdmFsdWUgb24gdG9wIG9mIHRoZSBzdGFjay4KLSAgQ29tbW9uQ2xhc3MqIHRvcFR5cGVJbmZvKCkgewotICAgIHJldHVybiBzdGFjay5iYWNrKCk7Ci0gIH0KLSAKLSAgLy8vIHN0YWNrU2l6ZSAtIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc3RhY2suCi0gIHVpbnQzMiBzdGFja1NpemUoKSB7Ci0gICAgcmV0dXJuIHN0YWNrLnNpemUoKTsgICAgCi0gIH0KLSAgCi0gIC8vLyBwb3BBc0ludCAtIFBvcCBhIHZhbHVlIGZyb20gdGhlIHN0YWNrIGFuZCByZXR1cm5zIGl0IGFzIGEgSmF2YQotICAvLy8gaW50LCBpZSBzaWduZWQgaW50MzIuCi0gIGxsdm06OlZhbHVlKiBwb3BBc0ludCgpIHsKLSAgICByZXR1cm4gcG9wKCk7Ci0gIH0KLQotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEV4Y2VwdGlvbiBzdXBwb3J0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLSAgCi0gIC8vLyBqc3JzIC0gVGhlIGxpc3Qgb2YganNycyAoanVtcCBzdWJyb3V0aW5lKSBpbnN0cnVjdGlvbnMuCi0gIHN0ZDo6dmVjdG9yPGxsdm06OkJhc2ljQmxvY2sqPiBqc3JzOwotCi0gIC8vLyBlbmRFeGNlcHRpb25CbG9jayAtIFRoZSBpbml0aWFsIGV4Y2VwdGlvbiBibG9jayB3aGVyZSBlYWNoIGhhbmRsZXIgZ29lcwotICAvLy8gaWYgaXQgZG9lcyBub3QgaGFuZGxlIHRoZSBleGNlcHRpb24uCi0gIGxsdm06OkJhc2ljQmxvY2sqIGVuZEV4Y2VwdGlvbkJsb2NrOwotCi0gIC8vLyBjdXJyZW50RXhjZXB0aW9uQmxvY2sgLSBUaGUgZXhjZXB0aW9uIGJsb2NrIG9mIHRoZSBjdXJyZW50IGluc3RydWN0aW9uLgotICBsbHZtOjpCYXNpY0Jsb2NrKiBjdXJyZW50RXhjZXB0aW9uQmxvY2s7Ci0KLSAgLy8vIHVuaWZpZWRVbnJlYWNoYWJsZSAtIFdoZW4gYW4gZXhjZXB0aW9uIGlzIHRocm93biwgdGhlIGNvZGUgYWZ0ZXIgaXMKLSAgLy8vIHVucmVhY2hhYmxlLiBBbGwgaW52b2tlcyB0aGF0IG9ubHkgdGhyb3cgYW4gZXhjZXB0aW9uIGhhdmUgdGhlCi0gIC8vLyB1bmlmaWVkVW5yZWFjaGFibGUgYmxvY2sgYXMgdGhlaXIgbm9ybWFsIGRlc3RpbmF0aW9uLgotICBsbHZtOjpCYXNpY0Jsb2NrKiB1bmlmaWVkVW5yZWFjaGFibGU7Ci0KLSAgLy8vIHRocm93RXhjZXB0aW9uIC0gRW1pdCBjb2RlIHRvIHRocm93IGFuIGV4Y2VwdGlvbi4KLSAgdm9pZCB0aHJvd0V4Y2VwdGlvbihsbHZtOjpGdW5jdGlvbiogRiwgbGx2bTo6VmFsdWUqKiBhcmdzLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBuYkFyZ3MpOwotICB2b2lkIHRocm93RXhjZXB0aW9uKGxsdm06OkZ1bmN0aW9uKiBGLCBsbHZtOjpWYWx1ZSogYXJnMSk7Ci0gIHZvaWQgdGhyb3dFeGNlcHRpb24obGx2bTo6VmFsdWUqIG9iaik7Ci0KLSAgLy8vIGZpbmlzaEV4Y2VwdGlvbnMgLSBFbWl0IGNvZGUgdG8gdW53aW5kIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGlmIGFuCi0gIC8vLyBleGNlcHRpb24gaXMgdGhyb3duLgotICB2b2lkIGZpbmlzaEV4Y2VwdGlvbnMoKTsKLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnRyb2wgZmxvdyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSAgLy8vIG9wY29kZUluZm9zIC0gVGhlIGluZm9ybWF0aW9ucyBmb3IgZWFjaCBpbnN0cnVjdGlvbi4KLSAgT3BpbmZvKiBvcGNvZGVJbmZvczsKLQotICAvLy8gY3VycmVudEJsb2NrIC0gVGhlIGN1cnJlbnQgYmxvY2sgb2YgdGhlIEpJVC4KLSAgbGx2bTo6QmFzaWNCbG9jayogY3VycmVudEJsb2NrOwotCi0gIC8vLyBjcmVhdGVCYXNpY0Jsb2NrIC0gQ3JlYXRlIGEgbmV3IGJhc2ljIGJsb2NrLgotICBsbHZtOjpCYXNpY0Jsb2NrKiBjcmVhdGVCYXNpY0Jsb2NrKGNvbnN0IGNoYXIqIG5hbWUgPSAiIikgewotICAgIHJldHVybiBsbHZtOjpCYXNpY0Jsb2NrOjpDcmVhdGUoKmxsdm1Db250ZXh0LCBuYW1lLCBsbHZtRnVuY3Rpb24pOwotICB9Ci0gCi0gIC8vLyBicmFuY2ggLSBCcmFuY2ggYmFzZWQgb24gYSBib29sZWFuIHZhbHVlLgotICB2b2lkIGJyYW5jaChsbHZtOjpWYWx1ZSogdGVzdCwgbGx2bTo6QmFzaWNCbG9jayogaWZUcnVlLCAKLSAgICAgICAgICAgICAgbGx2bTo6QmFzaWNCbG9jayogaWZGYWxzZSwgbGx2bTo6QmFzaWNCbG9jayogaW5zZXJ0LAotICAgICAgICAgICAgICBPcGluZm8mIGluZm8pIHsKLSAgICBpZiAoc3RhY2tTaXplKCkpCi0gICAgICBpZiAoIWluZm8uc3RhY2suc2l6ZSgpKQotICAgICAgICBpbmZvLnN0YWNrID0gc3RhY2s7Ci0gICAgbGx2bTo6QnJhbmNoSW5zdDo6Q3JlYXRlKGlmVHJ1ZSwgaWZGYWxzZSwgdGVzdCwgaW5zZXJ0KTsKLSAgfQotCi0gIC8vLyBicmFuY2ggLSBCcmFuY2ggdG8gYSBuZXcgYmxvY2suCi0gIHZvaWQgYnJhbmNoKE9waW5mbyYgaW5mbywgbGx2bTo6QmFzaWNCbG9jayogaW5zZXJ0KSB7Ci0gICAgaWYgKHN0YWNrU2l6ZSgpKQotICAgICAgaWYgKCFpbmZvLnN0YWNrLnNpemUoKSkKLSAgICAgICAgaW5mby5zdGFjayA9IHN0YWNrOwotICAgIGxsdm06OkJyYW5jaEluc3Q6OkNyZWF0ZShpbmZvLm5ld0Jsb2NrLCBpbnNlcnQpOwotICB9Ci0gIAotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTeW5jaHJvbml6YXRpb24gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLSAgCi0gIGxsdm06OlZhbHVlKiB0aGlzT2JqZWN0OwotCi0gIC8vLyBiZWdpblN5bmNocm9uaXplIC0gRW1pdCBzeW5jaHJvbml6YXRpb24gY29kZSB0byBhY3F1aXJlIHRoZSBpbnN0YW5jZQotICAvLy8gb3IgdGhlIGNsYXNzLgotICB2b2lkIGJlZ2luU3luY2hyb25pemUoKTsKLQotICAvLy8gZW5kU3luY2hyb25pemUgLSBFbWl0IHN5bmNocm9uaXphdGlvbiBjb2RlIHRvIHJlbGVhc2UgdGhlIGluc3RhbmNlIG9yIHRoZQotICAvLy8gY2xhc3MuCi0gIHZvaWQgZW5kU3luY2hyb25pemUoKTsKLQotICAvLy8gbW9uaXRvckVudGVyIC0gRW1pdCBzeW5jaHJvbml6YXRpb24gY29kZSB0byBhY3F1aXJlIHRoZSBsb2NrIG9mIHRoZSB2YWx1ZS4KLSAgdm9pZCBtb25pdG9yRW50ZXIobGx2bTo6VmFsdWUqIG9iaik7Ci0gIAotICAvLy8gbW9uaXRvckV4aXQgLSBFbWl0IHN5bmNocm9uaXphdGlvbiBjb2RlIHRvIHJlbGVhc2UgdGhlIGxvY2sgb2YgdGhlIHZhbHVlLgotICB2b2lkIG1vbml0b3JFeGl0KGxsdm06OlZhbHVlKiBvYmopOwotCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEphdmEgZmllbGQgYWNjZXNzZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0gIC8vLyBnZXRTdGF0aWNGaWVsZCAtIEVtaXQgY29kZSB0byBnZXQgdGhlIHN0YXRpYyBmaWVsZCBkZWNsYXJlZCBhdCB0aGUgZ2l2ZW4KLSAgLy8vIGluZGV4IGluIHRoZSBjb25zdGFudCBwb29sLgotICB2b2lkIGdldFN0YXRpY0ZpZWxkKHVpbnQxNiBpbmRleCk7Ci0KLSAgLy8vIHNldFN0YXRpY0ZpZWxkIC0gRW1pdCBjb2RlIHRvIHNldCBhIHZhbHVlIHRvIHRoZSBzdGF0aWMgZmllbGQgZGVjbGFyZWQKLSAgLy8vIGF0IHRoZSBnaXZlbiBpbmRleCBpbiB0aGUgY29uc3RhbnQgcG9vbC4KLSAgdm9pZCBzZXRTdGF0aWNGaWVsZCh1aW50MTYgaW5kZXgpOwotCi0gIC8vLyBnZXRWaXJ0dWFsRmllbGQgLSBFbWl0IGNvZGUgdG8gZ2V0IHRoZSB2aXJ0dWFsIGZpZWxkIGRlY2xhcmVkIGF0IHRoZSBnaXZlbgotICAvLy8gaW5kZXggaW4gdGhlIGNvbnN0YW50IHBvb2wuCi0gIHZvaWQgZ2V0VmlydHVhbEZpZWxkKHVpbnQxNiBpbmRleCk7Ci0KLSAgLy8vIHNldFZpcnR1YWxGaWVsZCAtIEVtaXQgY29kZSB0byBzZXQgYSB2YWx1ZSB0byB0aGUgdmlydHVhbCBmaWVsZCBkZWNsYXJlZAotICAvLy8gYXQgdGhlIGdpdmVuIGluZGV4IGluIHRoZSBjb25zdGFudCBwb29sLgotICB2b2lkIHNldFZpcnR1YWxGaWVsZCh1aW50MTYgaW5kZXgpOwotCi0gIC8vLyBsZFJlc29sdmVkIC0gRW1pdCBjb2RlIHRvIGdldCBhIHBvaW50ZXIgdG8gYSBmaWVsZC4KLSAgbGx2bTo6VmFsdWUqIGxkUmVzb2x2ZWQodWludDE2IGluZGV4LCBib29sIHN0YXQsIGxsdm06OlZhbHVlKiBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OlR5cGUqIGZpZWxkVHlwZVB0cik7Ci0KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0YW50IHBvb2wgYWNjZXNzZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0gCi0gIC8vLyBnZXRSZXNvbHZlZENvbW1vbkNsYXNzIC0gRW1pdCBjb2RlIHRvIGdldCBhIHJlc29sdmVkIGNvbW1vbiBjbGFzcy4gSWYgdGhlCi0gIC8vLyBjb25zdGFudCBwb29sIGFscmVhZHkgbGlua3MgdG8gdGhlIGNsYXNzLCB0aGUgY2xhc3MgaXMgZW1pdHRlZCBkaXJlY3RseS4KLSAgLy8vIE90aGVyd2lzZSB0aGUgSklUIGluc3RhbGxzIGEgcmVzb2x2ZXIgd2hpY2ggd2lsbCBiZSBjYWxsZWQgYXQgcnVudGltZS4KLSAgbGx2bTo6VmFsdWUqIGdldFJlc29sdmVkQ29tbW9uQ2xhc3ModWludDE2IGluZGV4LCBib29sIGRvVGhyb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJDb21tb25DbGFzcyoqIGFscmVhZHlSZXNvbHZlZCk7Ci0gIAotICAvLy8gZ2V0UmVzb2x2ZWRDb21tb25DbGFzcyAtIFNpbWlsYXIgdG8gZ2V0UmVzb2x2ZWRDb21tb25DbGFzcywgYnV0IHRoZSB0eXBlCi0gIC8vLyBvZiB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgQ2xhc3MuCi0gIGxsdm06OlZhbHVlKiBnZXRSZXNvbHZlZENsYXNzKHVpbnQxNiBpbmRleCwgYm9vbCBjbGluaXQsIGJvb2wgZG9UaHJvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckNsYXNzKiogYWxyZWFkeVJlc29sdmVkKTsKLSAgCi0gIC8vLyBnZXRDb25zdGFudFBvb2xBdCAtIFJldHVybiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4IG9mIHRoZSBjb25zdGFudAotICAvLy8gcG9vbC4gVGhlIGdlbmVyYXRlZCBjb2RlIGludm9rZXMgdGhlIHJlc29sdmVyIGlmIHRoZSBjb25zdGFudCBwb29sCi0gIC8vLyBjb250YWlucyBubyB2YWx1ZSBhdCB0aGUgaW5kZXguCi0gIGxsdm06OlZhbHVlKiBnZXRDb25zdGFudFBvb2xBdCh1aW50MzIgaW5kZXgsIGxsdm06OkZ1bmN0aW9uKiByZXNvbHZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OlR5cGUqIHJldHVyblR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSogYWRkQXJnLCBib29sIGRvVGhyb3cgPSB0cnVlKTsKLQotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBKYXZhIG1ldGhvZCBjYWxscyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLSAgCi0gIC8vLyBtYWtlQXJncyAtIEluc2VydCB0aGUgYXJndW1lbnRzIG9mIGEgbWV0aG9kIGluIHRoZSB2ZWN0b3IuIFRoZSBhcmd1bWVudHMKLSAgLy8vIGFyZSBwb3BwZWQgZnJvbSB0aGUgY29tcGlsYXRpb24gc3RhY2suCi0gIHZvaWQgbWFrZUFyZ3MobGx2bTo6RnVuY3Rpb25UeXBlOjpwYXJhbV9pdGVyYXRvciBpdCwKLSAgICAgICAgICAgICAgICB1aW50MzIgaW5kZXgsIHN0ZDo6dmVjdG9yPGxsdm06OlZhbHVlKj4mIHJlc3VsdCwgdWludDMyIG5iKTsKLQotICAvLy8gZ2V0VGFyZ2V0IC0gR2V0IHRoZSB0YXJnZXQgb2JqZWN0IGZvciBpbnZvY2F0aW9uLgotICBsbHZtOjpWYWx1ZSogZ2V0VGFyZ2V0KFNpZ25kZWYqIHNpZ25hdHVyZSk7Ci0KLSAgLy8vIGludm9rZVZpcnR1YWwgLSBJbnZva2UgYSBKYXZhIHZpcnR1YWwgbWV0aG9kLgotICB2b2lkIGludm9rZVZpcnR1YWwodWludDE2IGluZGV4KTsKLQotICAvLy8gaW52b2tlSW50ZXJmYWNlIC0gSW52b2tlIGEgSmF2YSBpbnRlcmZhY2UgbWV0aG9kLgotICB2b2lkIGludm9rZUludGVyZmFjZSh1aW50MTYgaW5kZXgpOwotCi0gIC8vLyBpbnZva2VTcGVjaWFsIC0gSW52b2tlIGFuIGluc3RhbmNlIEphdmEgbWV0aG9kIGRpcmVjdGx5LgotICB2b2lkIGludm9rZVNwZWNpYWwodWludDE2IGluZGV4KTsKLQotICAvLy8gaW52b2tlU3RhdGljIC0gSW52b2tlIGEgc3RhdGljIEphdmEgbWV0aG9kLgotICB2b2lkIGludm9rZVN0YXRpYyh1aW50MTYgaW5kZXgpOwotCi0gIC8vLyBpbnZva2VOZXcgLSBBbGxvY2F0ZSBhIG5ldyBvYmplY3QuCi0gIHZvaWQgaW52b2tlTmV3KHVpbnQxNiBpbmRleCk7Ci0KLSAgLy8vIGludm9rZUlubGluZSAtIEluc3RlYWQgb2YgY2FsbGluZyB0aGUgbWV0aG9kLCBpbmxpbmUgaXQuCi0gIGxsdm06Okluc3RydWN0aW9uKiBpbnZva2VJbmxpbmUoSmF2YU1ldGhvZCogbWV0aCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bGx2bTo6VmFsdWUqPiYgYXJncyk7Ci0KLSAgLy8vIGxvd2VyTWF0aE9wcyAtIE1hcCBKYXZhIE1hdGggb3BlcmF0aW9ucyB0byBMTFZNIGludHJpbnNpY3MuCi0gIGxsdm06Okluc3RydWN0aW9uKiBsb3dlck1hdGhPcHMoY29uc3QgVVRGOCogbmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bGx2bTo6VmFsdWUqPiYgYXJncyk7Ci0gCi0gIC8vLyBsb3dlckFycmF5Y29weSAtIENyZWF0ZSBhIGZhc3QgcGF0aCBmb3IgU3lzdGVtLmFycmF5Y29weS4KLSAgdm9pZCBsb3dlckFycmF5Y29weShzdGQ6OnZlY3RvcjxsbHZtOjpWYWx1ZSo+JiBhcmdzKTsKLQotICAvLy8gaW52b2tlIC0gaW52b2tlIHRoZSBMTFZNIG1ldGhvZCBvZiBhIEphdmEgbWV0aG9kLgotICBsbHZtOjpJbnN0cnVjdGlvbiogaW52b2tlKGxsdm06OlZhbHVlICpGLCBzdGQ6OnZlY3RvcjxsbHZtOjpWYWx1ZSo+JmFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7Ci0gIGxsdm06Okluc3RydWN0aW9uKiBpbnZva2UobGx2bTo6VmFsdWUgKkYsIGxsdm06OlZhbHVlICpBY3R1YWwxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpBY3R1YWwyLCBjb25zdCBjaGFyKiBOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKLSAgbGx2bTo6SW5zdHJ1Y3Rpb24qIGludm9rZShsbHZtOjpWYWx1ZSAqRiwgbGx2bTo6VmFsdWUgKkFjdHVhbDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogTmFtZSwgbGx2bTo6QmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOwotICBsbHZtOjpJbnN0cnVjdGlvbiogaW52b2tlKGxsdm06OlZhbHVlICpGLCBjb25zdCBjaGFyKiBOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKLSAgCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBZaWVsZCBwb2ludCBzdXBwb3J0ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0gIHZvaWQgY2hlY2tZaWVsZFBvaW50KCk7Ci19OwotCi1lbnVtIE9wY29kZSB7Ci0gICAgICBOT1AgPSAweDAwLAotICAgICAgQUNPTlNUX05VTEwgPSAweDAxLAotICAgICAgSUNPTlNUX00xID0gMHgwMiwKLSAgICAgIElDT05TVF8wID0gMHgwMywKLSAgICAgIElDT05TVF8xID0gMHgwNCwKLSAgICAgIElDT05TVF8yID0gMHgwNSwKLSAgICAgIElDT05TVF8zID0gMHgwNiwKLSAgICAgIElDT05TVF80ID0gMHgwNywKLSAgICAgIElDT05TVF81ID0gMHgwOCwKLSAgICAgIExDT05TVF8wID0gMHgwOSwKLSAgICAgIExDT05TVF8xID0gMHgwQSwKLSAgICAgIEZDT05TVF8wID0gMHgwQiwKLSAgICAgIEZDT05TVF8xID0gMHgwQywKLSAgICAgIEZDT05TVF8yID0gMHgwRCwKLSAgICAgIERDT05TVF8wID0gMHgwRSwKLSAgICAgIERDT05TVF8xID0gMHgwRiwKLSAgICAgIEJJUFVTSCA9IDB4MTAsCi0gICAgICBTSVBVU0ggPSAweDExLAotICAgICAgTERDID0gMHgxMiwKLSAgICAgIExEQ19XID0gMHgxMywKLSAgICAgIExEQzJfVyA9IDB4MTQsCi0gICAgICBJTE9BRCA9IDB4MTUsCi0gICAgICBMTE9BRCA9IDB4MTYsCi0gICAgICBGTE9BRCA9IDB4MTcsCi0gICAgICBETE9BRCA9IDB4MTgsCi0gICAgICBBTE9BRCA9IDB4MTksCi0gICAgICBJTE9BRF8wID0gMHgxQSwKLSAgICAgIElMT0FEXzEgPSAweDFCLAotICAgICAgSUxPQURfMiA9IDB4MUMsCi0gICAgICBJTE9BRF8zID0gMHgxRCwKLSAgICAgIExMT0FEXzAgPSAweDFFLAotICAgICAgTExPQURfMSA9IDB4MUYsCi0gICAgICBMTE9BRF8yID0gMHgyMCwKLSAgICAgIExMT0FEXzMgPSAweDIxLAotICAgICAgRkxPQURfMCA9IDB4MjIsCi0gICAgICBGTE9BRF8xID0gMHgyMywKLSAgICAgIEZMT0FEXzIgPSAweDI0LAotICAgICAgRkxPQURfMyA9IDB4MjUsCi0gICAgICBETE9BRF8wID0gMHgyNiwKLSAgICAgIERMT0FEXzEgPSAweDI3LAotICAgICAgRExPQURfMiA9IDB4MjgsCi0gICAgICBETE9BRF8zID0gMHgyOSwKLSAgICAgIEFMT0FEXzAgPSAweDJBLAotICAgICAgQUxPQURfMSA9IDB4MkIsCi0gICAgICBBTE9BRF8yID0gMHgyQywKLSAgICAgIEFMT0FEXzMgPSAweDJELAotICAgICAgSUFMT0FEID0gMHgyRSwKLSAgICAgIExBTE9BRCA9IDB4MkYsCi0gICAgICBGQUxPQUQgPSAweDMwLAotICAgICAgREFMT0FEID0gMHgzMSwKLSAgICAgIEFBTE9BRCA9IDB4MzIsCi0gICAgICBCQUxPQUQgPSAweDMzLAotICAgICAgQ0FMT0FEID0gMHgzNCwKLSAgICAgIFNBTE9BRCA9IDB4MzUsCi0gICAgICBJU1RPUkUgPSAweDM2LAotICAgICAgTFNUT1JFID0gMHgzNywKLSAgICAgIEZTVE9SRSA9IDB4MzgsCi0gICAgICBEU1RPUkUgPSAweDM5LAotICAgICAgQVNUT1JFID0gMHgzQSwKLSAgICAgIElTVE9SRV8wID0gMHgzQiwKLSAgICAgIElTVE9SRV8xID0gMHgzQywKLSAgICAgIElTVE9SRV8yID0gMHgzRCwKLSAgICAgIElTVE9SRV8zID0gMHgzRSwKLSAgICAgIExTVE9SRV8wID0gMHgzRiwKLSAgICAgIExTVE9SRV8xID0gMHg0MCwKLSAgICAgIExTVE9SRV8yID0gMHg0MSwKLSAgICAgIExTVE9SRV8zID0gMHg0MiwKLSAgICAgIEZTVE9SRV8wID0gMHg0MywKLSAgICAgIEZTVE9SRV8xID0gMHg0NCwKLSAgICAgIEZTVE9SRV8yID0gMHg0NSwKLSAgICAgIEZTVE9SRV8zID0gMHg0NiwKLSAgICAgIERTVE9SRV8wID0gMHg0NywKLSAgICAgIERTVE9SRV8xID0gMHg0OCwKLSAgICAgIERTVE9SRV8yID0gMHg0OSwKLSAgICAgIERTVE9SRV8zID0gMHg0QSwKLSAgICAgIEFTVE9SRV8wID0gMHg0QiwKLSAgICAgIEFTVE9SRV8xID0gMHg0QywKLSAgICAgIEFTVE9SRV8yID0gMHg0RCwKLSAgICAgIEFTVE9SRV8zID0gMHg0RSwKLSAgICAgIElBU1RPUkUgPSAweDRGLAotICAgICAgTEFTVE9SRSA9IDB4NTAsCi0gICAgICBGQVNUT1JFID0gMHg1MSwKLSAgICAgIERBU1RPUkUgPSAweDUyLAotICAgICAgQUFTVE9SRSA9IDB4NTMsCi0gICAgICBCQVNUT1JFID0gMHg1NCwKLSAgICAgIENBU1RPUkUgPSAweDU1LAotICAgICAgU0FTVE9SRSA9IDB4NTYsCi0gICAgICBQT1AgPSAweDU3LAotICAgICAgUE9QMiA9IDB4NTgsCi0gICAgICBEVVAgPSAweDU5LAotICAgICAgRFVQX1gxID0gMHg1QSwKLSAgICAgIERVUF9YMiA9IDB4NUIsCi0gICAgICBEVVAyID0gMHg1QywKLSAgICAgIERVUDJfWDEgPSAweDVELAotICAgICAgRFVQMl9YMiA9IDB4NUUsCi0gICAgICBTV0FQID0gMHg1RiwKLSAgICAgIElBREQgPSAweDYwLAotICAgICAgTEFERCA9IDB4NjEsCi0gICAgICBGQUREID0gMHg2MiwKLSAgICAgIERBREQgPSAweDYzLAotICAgICAgSVNVQiA9IDB4NjQsCi0gICAgICBMU1VCID0gMHg2NSwKLSAgICAgIEZTVUIgPSAweDY2LAotICAgICAgRFNVQiA9IDB4NjcsCi0gICAgICBJTVVMID0gMHg2OCwKLSAgICAgIExNVUwgPSAweDY5LAotICAgICAgRk1VTCA9IDB4NkEsCi0gICAgICBETVVMID0gMHg2QiwKLSAgICAgIElESVYgPSAweDZDLAotICAgICAgTERJViA9IDB4NkQsCi0gICAgICBGRElWID0gMHg2RSwKLSAgICAgIERESVYgPSAweDZGLAotICAgICAgSVJFTSA9IDB4NzAsCi0gICAgICBMUkVNID0gMHg3MSwKLSAgICAgIEZSRU0gPSAweDcyLAotICAgICAgRFJFTSA9IDB4NzMsCi0gICAgICBJTkVHID0gMHg3NCwKLSAgICAgIExORUcgPSAweDc1LAotICAgICAgRk5FRyA9IDB4NzYsCi0gICAgICBETkVHID0gMHg3NywKLSAgICAgIElTSEwgPSAweDc4LAotICAgICAgTFNITCA9IDB4NzksCi0gICAgICBJU0hSID0gMHg3QSwKLSAgICAgIExTSFIgPSAweDdCLAotICAgICAgSVVTSFIgPSAweDdDLAotICAgICAgTFVTSFIgPSAweDdELAotICAgICAgSUFORCA9IDB4N0UsCi0gICAgICBMQU5EID0gMHg3RiwKLSAgICAgIElPUiA9IDB4ODAsCi0gICAgICBMT1IgPSAweDgxLAotICAgICAgSVhPUiA9IDB4ODIsCi0gICAgICBMWE9SID0gMHg4MywKLSAgICAgIElJTkMgPSAweDg0LAotICAgICAgSTJMID0gMHg4NSwKLSAgICAgIEkyRiA9IDB4ODYsCi0gICAgICBJMkQgPSAweDg3LAotICAgICAgTDJJID0gMHg4OCwKLSAgICAgIEwyRiA9IDB4ODksCi0gICAgICBMMkQgPSAweDhBLAotICAgICAgRjJJID0gMHg4QiwKLSAgICAgIEYyTCA9IDB4OEMsCi0gICAgICBGMkQgPSAweDhELAotICAgICAgRDJJID0gMHg4RSwKLSAgICAgIEQyTCA9IDB4OEYsCi0gICAgICBEMkYgPSAweDkwLAotICAgICAgSTJCID0gMHg5MSwKLSAgICAgIEkyQyA9IDB4OTIsCi0gICAgICBJMlMgPSAweDkzLAotICAgICAgTENNUCA9IDB4OTQsCi0gICAgICBGQ01QTCA9IDB4OTUsCi0gICAgICBGQ01QRyA9IDB4OTYsCi0gICAgICBEQ01QTCA9IDB4OTcsCi0gICAgICBEQ01QRyA9IDB4OTgsCi0gICAgICBJRkVRID0gMHg5OSwKLSAgICAgIElGTkUgPSAweDlBLAotICAgICAgSUZMVCA9IDB4OUIsCi0gICAgICBJRkdFID0gMHg5QywKLSAgICAgIElGR1QgPSAweDlELAotICAgICAgSUZMRSA9IDB4OUUsCi0gICAgICBJRl9JQ01QRVEgPSAweDlGLAotICAgICAgSUZfSUNNUE5FID0gMHhBMCwKLSAgICAgIElGX0lDTVBMVCA9IDB4QTEsCi0gICAgICBJRl9JQ01QR0UgPSAweEEyLAotICAgICAgSUZfSUNNUEdUID0gMHhBMywKLSAgICAgIElGX0lDTVBMRSA9IDB4QTQsCi0gICAgICBJRl9BQ01QRVEgPSAweEE1LAotICAgICAgSUZfQUNNUE5FID0gMHhBNiwKLSAgICAgIEdPVE8gPSAweEE3LAotICAgICAgSlNSID0gMHhBOCwKLSAgICAgIFJFVCA9IDB4QTksCi0gICAgICBUQUJMRVNXSVRDSCA9IDB4QUEsCi0gICAgICBMT09LVVBTV0lUQ0ggPSAweEFCLAotICAgICAgSVJFVFVSTiA9IDB4QUMsCi0gICAgICBMUkVUVVJOID0gMHhBRCwKLSAgICAgIEZSRVRVUk4gPSAweEFFLAotICAgICAgRFJFVFVSTiA9IDB4QUYsCi0gICAgICBBUkVUVVJOID0gMHhCMCwKLSAgICAgIFJFVFVSTiA9IDB4QjEsCi0gICAgICBHRVRTVEFUSUMgPSAweEIyLAotICAgICAgUFVUU1RBVElDID0gMHhCMywKLSAgICAgIEdFVEZJRUxEID0gMHhCNCwKLSAgICAgIFBVVEZJRUxEID0gMHhCNSwKLSAgICAgIElOVk9LRVZJUlRVQUwgPSAweEI2LAotICAgICAgSU5WT0tFU1BFQ0lBTCA9IDB4QjcsCi0gICAgICBJTlZPS0VTVEFUSUMgPSAweEI4LAotICAgICAgSU5WT0tFSU5URVJGQUNFID0gMHhCOSwKLSAgICAgIFVOVVNFRCA9IDB4QkEsCi0gICAgICBORVcgPSAweEJCLAotICAgICAgTkVXQVJSQVkgPSAweEJDLAotICAgICAgQU5FV0FSUkFZID0gMHhCRCwKLSAgICAgIEFSUkFZTEVOR1RIID0gMHhCRSwKLSAgICAgIEFUSFJPVyA9IDB4QkYsCi0gICAgICBDSEVDS0NBU1QgPSAweEMwLAotICAgICAgSU5TVEFOQ0VPRiA9IDB4QzEsCi0gICAgICBNT05JVE9SRU5URVIgPSAweEMyLAotICAgICAgTU9OSVRPUkVYSVQgPSAweEMzLAotICAgICAgV0lERSA9IDB4QzQsCi0gICAgICBNVUxUSUFORVdBUlJBWSA9IDB4QzUsCi0gICAgICBJRk5VTEwgPSAweEM2LAotICAgICAgSUZOT05OVUxMID0gMHhDNywKLSAgICAgIEdPVE9fVyA9IDB4QzgsCi0gICAgICBKU1JfVyA9IDB4QzksCi0gICAgICBCUkVBS1BPSU5UID0gMHhDQSwKLSAgICAgIElNUERFUDEgPSAweEZFLAotICAgICAgSU1QREVQMiA9IDB4RkYKLX07Ci0KLX0gLy8gZW5kIG5hbWVzcGFjZSBqMwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9KMy9Db21waWxlci9KYXZhSklUQ29tcGlsZXIuY3BwIGIvdm1raXQvbGliL0ozL0NvbXBpbGVyL0phdmFKSVRDb21waWxlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZTg4NTAuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL0ozL0NvbXBpbGVyL0phdmFKSVRDb21waWxlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0ODAgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0gSmF2YUpJVENvbXBpbGVyLmNwcCAtIFN1cHBvcnQgZm9yIEpJVCBjb21waWxpbmcgLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKLSNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgotI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKLSNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgotI2luY2x1ZGUgImxsdm0vTExWTUNvbnRleHQuaCIKLSNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgotI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvRGVidWdJbmZvLmgiCi0jaW5jbHVkZSAibGx2bS9Db2RlR2VuL0dDU3RyYXRlZ3kuaCIKLSNpbmNsdWRlIDxsbHZtL0NvZGVHZW4vSklUQ29kZUVtaXR0ZXIuaD4KLSNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmgiCi0jaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvRXhlY3V0aW9uRW5naW5lLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hbmFnZWRTdGF0aWMuaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKLSNpbmNsdWRlIDwuLi9saWIvRXhlY3V0aW9uRW5naW5lL0pJVC9KSVQuaD4KLQotI2luY2x1ZGUgIm12bS9HQy5oIgotI2luY2x1ZGUgIm12bS9WaXJ0dWFsTWFjaGluZS5oIgotI2luY2x1ZGUgIm12bS9WTUtpdC5oIgotCi0jaW5jbHVkZSAiSmF2YUNsYXNzLmgiCi0jaW5jbHVkZSAiSmF2YUNvbnN0YW50UG9vbC5oIgotI2luY2x1ZGUgIkphdmFUaHJlYWQuaCIKLSNpbmNsdWRlICJKYXZhVHlwZXMuaCIKLSNpbmNsdWRlICJKbmp2bS5oIgotCi0jaW5jbHVkZSAiajMvSmF2YUpJVENvbXBpbGVyLmgiCi0jaW5jbHVkZSAiajMvSjNJbnRyaW5zaWNzLmgiCi0jaW5jbHVkZSAiajMvTExWTU1hdGVyaWFsaXplci5oIgotCi11c2luZyBuYW1lc3BhY2UgajM7Ci11c2luZyBuYW1lc3BhY2UgbGx2bTsKLQotY2xhc3MgSmF2YUpJVE1ldGhvZEluZm8gOiBwdWJsaWMgbXZtOjpKSVRNZXRob2RJbmZvIHsKLXB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIHByaW50KHZvaWQqIGlwLCB2b2lkKiBhZGRyKTsKLSAgdmlydHVhbCBib29sIGlzSGlnaExldmVsTWV0aG9kKCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBKYXZhSklUTWV0aG9kSW5mbyhsbHZtOjpHQ0Z1bmN0aW9uSW5mbyogR0ZJLAotICAgICAgICAgICAgICAgICAgICBKYXZhTWV0aG9kKiBtKSA6Ci0gICAgICBtdm06OkpJVE1ldGhvZEluZm8oR0ZJKSB7Ci0gICAgTWV0YUluZm8gPSBtOwotICAgIE93bmVyID0gbS0+Y2xhc3NEZWYtPmNsYXNzTG9hZGVyLT5nZXRDb21waWxlcigpOwotICB9Ci19OwotCi12b2lkIEphdmFKSVRNZXRob2RJbmZvOjpwcmludCh2b2lkKiBpcCwgdm9pZCogYWRkcikgewotICB2b2lkKiBuZXdfaXAgPSBOVUxMOwotICBpZiAoaXApIG5ld19pcCA9IGlzU3R1YihpcCwgYWRkcik7Ci0gIEphdmFNZXRob2QqIG1ldGggPSAoSmF2YU1ldGhvZCopTWV0YUluZm87Ci0gIENvZGVMaW5lSW5mbyogaW5mbyA9IG1ldGgtPmxvb2t1cENvZGVMaW5lSW5mbygodWludHB0cl90KWlwKTsKLSAgaWYgKGluZm8gIT0gTlVMTCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiOyAlcCAoJXApIGluICVzLiVzIChsaW5lICVkLCBieXRlY29kZSAlZCwgY29kZSBzdGFydCAlcCkiLCBuZXdfaXAsIGFkZHIsCi0gICAgICAgICAgICBVVEY4QnVmZmVyKG1ldGgtPmNsYXNzRGVmLT5uYW1lKS5jU3RyaW5nKCksCi0gICAgICAgICAgICBVVEY4QnVmZmVyKG1ldGgtPm5hbWUpLmNTdHJpbmcoKSwKLSAgICAgICAgICAgIG1ldGgtPmxvb2t1cExpbmVOdW1iZXIoKHVpbnRwdHJfdClpcCksCi0gICAgICAgICAgICBpbmZvLT5ieXRlY29kZUluZGV4LCBtZXRoLT5jb2RlKTsKLSAgfSBlbHNlIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIjsgJXAgKCVwKSBpbiAlcy4lcyAobmF0aXZlIG1ldGhvZCwgY29kZSBzdGFydCAlcCkiLCBuZXdfaXAsIGFkZHIsCi0gICAgICAgICAgICBVVEY4QnVmZmVyKG1ldGgtPmNsYXNzRGVmLT5uYW1lKS5jU3RyaW5nKCksCi0gICAgICAgICAgICBVVEY4QnVmZmVyKG1ldGgtPm5hbWUpLmNTdHJpbmcoKSwgbWV0aC0+Y29kZSk7Ci0gIH0KLSAgaWYgKGlwICE9IG5ld19pcCkgZnByaW50ZihzdGRlcnIsICIgKGZyb20gc3R1YikiKTsKLSAgZnByaW50ZihzdGRlcnIsICJcbiIpOwotfQotCi0KLXZvaWQgSmF2YUpJVExpc3RlbmVyOjpOb3RpZnlGdW5jdGlvbkVtaXR0ZWQoY29uc3QgRnVuY3Rpb24gJkYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqQ29kZSwgc2l6ZV90IFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW1pdHRlZEZ1bmN0aW9uRGV0YWlscyAmRGV0YWlscykgewotCi0gIC8vIFRoZSBmb2xsb3dpbmcgaXMgbmVjZXNzYXJ5IGZvciAtbG9hZC1iYy4KLSAgaWYgKEYuZ2V0UGFyZW50KCkgIT0gVGhlQ29tcGlsZXItPmdldExMVk1Nb2R1bGUoKSkgcmV0dXJuOwotICBhc3NlcnQoRi5oYXNHQygpKTsKLSAgaWYgKFRoZUNvbXBpbGVyLT5HQ0luZm8gIT0gTlVMTCkgewotICAgIGFzc2VydChUaGVDb21waWxlci0+R0NJbmZvID09IERldGFpbHMuTUYtPmdldEdNSSgpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgVGhlQ29tcGlsZXItPkdDSW5mbyA9IERldGFpbHMuTUYtPmdldEdNSSgpOwotfQotCi0KLUNvbnN0YW50KiBKYXZhSklUQ29tcGlsZXI6OmdldE5hdGl2ZUNsYXNzKENvbW1vbkNsYXNzKiBjbGFzc0RlZikgewotICBjb25zdCBsbHZtOjpUeXBlKiBUeSA9IGNsYXNzRGVmLT5pc0NsYXNzKCkgPyBKYXZhSW50cmluc2ljcy5KYXZhQ2xhc3NUeXBlIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YUludHJpbnNpY3MuSmF2YUNvbW1vbkNsYXNzVHlwZTsKLSAgCi0gIENvbnN0YW50SW50KiBDSSA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50NjRUeShnZXRMTFZNQ29udGV4dCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdChjbGFzc0RlZikpOwotICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRJbnRUb1B0cihDSSwgVHkpOwotfQotCi1Db25zdGFudCogSmF2YUpJVENvbXBpbGVyOjpnZXRDb25zdGFudFBvb2woSmF2YUNvbnN0YW50UG9vbCogY3RwKSB7Ci0gIHZvaWQqIHB0ciA9IGN0cC0+Y3RwUmVzOwotICBhc3NlcnQocHRyICYmICJObyBjb25zdGFudCBwb29sIGZvdW5kIik7Ci0gIENvbnN0YW50SW50KiBDSSA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50NjRUeShnZXRMTFZNQ29udGV4dCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdChwdHIpKTsKLSAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0SW50VG9QdHIoQ0ksIEphdmFJbnRyaW5zaWNzLkNvbnN0YW50UG9vbFR5cGUpOwotfQotCi1Db25zdGFudCogSmF2YUpJVENvbXBpbGVyOjpnZXRNZXRob2RJbkNsYXNzKEphdmFNZXRob2QqIG1ldGgpIHsKLSAgQ29uc3RhbnRJbnQqIENJID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ2NFR5KGdldExMVk1Db250ZXh0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KW1ldGgpOwotICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRJbnRUb1B0cihDSSwgSmF2YUludHJpbnNpY3MuSmF2YU1ldGhvZFR5cGUpOwotfQotCi1Db25zdGFudCogSmF2YUpJVENvbXBpbGVyOjpnZXRTdHJpbmcoSmF2YVN0cmluZyogc3RyKSB7Ci0gIGxsdm1fZ2Nyb290KHN0ciwgMCk7Ci0gIGZwcmludGYoc3RkZXJyLCAiU2hvdWxkIG5vdCBiZSBoZXJlXG4iKTsKLSAgYWJvcnQoKTsKLX0KLQotQ29uc3RhbnQqIEphdmFKSVRDb21waWxlcjo6Z2V0U3RyaW5nUHRyKEphdmFTdHJpbmcqKiBzdHIpIHsKLSAgYXNzZXJ0KHN0ciAmJiAiTm8gc3RyaW5nIGdpdmVuIik7Ci0gIGNvbnN0IGxsdm06OlR5cGUqIFR5ID0gUG9pbnRlclR5cGU6OmdldFVucXVhbChKYXZhSW50cmluc2ljcy5KYXZhT2JqZWN0VHlwZSk7Ci0gIENvbnN0YW50SW50KiBDSSA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50NjRUeShnZXRMTFZNQ29udGV4dCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjQoc3RyKSk7Ci0gIHJldHVybiBDb25zdGFudEV4cHI6OmdldEludFRvUHRyKENJLCBUeSk7Ci19Ci0KLUNvbnN0YW50KiBKYXZhSklUQ29tcGlsZXI6OmdldEphdmFDbGFzcyhDb21tb25DbGFzcyogY2wpIHsKLSAgZnByaW50ZihzdGRlcnIsICJTaG91bGQgbm90IGJlIGhlcmVcbiIpOwotICBhYm9ydCgpOwotfQotCi1Db25zdGFudCogSmF2YUpJVENvbXBpbGVyOjpnZXRKYXZhQ2xhc3NQdHIoQ29tbW9uQ2xhc3MqIGNsKSB7Ci0gIEphdmFPYmplY3QqIGNvbnN0KiBvYmogPSBjbC0+Z2V0Q2xhc3NEZWxlZ2F0ZWVQdHIoKTsKLSAgYXNzZXJ0KG9iaiAmJiAiRGVsZWdhdGVlIG5vdCBjcmVhdGVkIik7Ci0gIENvbnN0YW50KiBDSSA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50NjRUeShnZXRMTFZNQ29udGV4dCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjQob2JqKSk7Ci0gIGNvbnN0IFR5cGUqIFR5ID0gUG9pbnRlclR5cGU6OmdldFVucXVhbChKYXZhSW50cmluc2ljcy5KYXZhT2JqZWN0VHlwZSk7Ci0gIHJldHVybiBDb25zdGFudEV4cHI6OmdldEludFRvUHRyKENJLCBUeSk7Ci19Ci0KLUphdmFPYmplY3QqIEphdmFKSVRDb21waWxlcjo6Z2V0RmluYWxPYmplY3QobGx2bTo6VmFsdWUqIG9iaikgewotICAvLyBvYmogY2FuIG5vdCBlbmNvZGUgZGlyZWNsdHkgYW4gb2JqZWN0LgotICByZXR1cm4gTlVMTDsKLX0KLQotQ29uc3RhbnQqIEphdmFKSVRDb21waWxlcjo6Z2V0RmluYWxPYmplY3QoSmF2YU9iamVjdCogb2JqLCBDb21tb25DbGFzcyogY2wpIHsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLUNvbnN0YW50KiBKYXZhSklUQ29tcGlsZXI6OmdldFN0YXRpY0luc3RhbmNlKENsYXNzKiBjbGFzc0RlZikgewotICB2b2lkKiBvYmogPSBjbGFzc0RlZi0+Z2V0U3RhdGljSW5zdGFuY2UoKTsKLSAgaWYgKCFvYmopIHsKLSAgICBjbGFzc0RlZi0+YWNxdWlyZSgpOwotICAgIG9iaiA9IGNsYXNzRGVmLT5nZXRTdGF0aWNJbnN0YW5jZSgpOwotICAgIGlmICghb2JqKSB7Ci0gICAgICAvLyBBbGxvY2F0ZSBub3cgc28gdGhhdCBjb21waWxlZCBjb2RlIGNhbiByZWZlcmVuY2UgaXQuCi0gICAgICBvYmogPSBjbGFzc0RlZi0+YWxsb2NhdGVTdGF0aWNJbnN0YW5jZSgpOwotICAgIH0KLSAgICBjbGFzc0RlZi0+cmVsZWFzZSgpOwotICB9Ci0gIENvbnN0YW50KiBDSSA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50NjRUeShnZXRMTFZNQ29udGV4dCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDY0X3Qob2JqKSkpOwotICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRJbnRUb1B0cihDSSwgSmF2YUludHJpbnNpY3MucHRyVHlwZSk7Ci19Ci0KLUNvbnN0YW50KiBKYXZhSklUQ29tcGlsZXI6OmdldFZpcnR1YWxUYWJsZShKYXZhVmlydHVhbFRhYmxlKiBWVCkgewotICBpZiAoVlQtPmNsLT5pc0NsYXNzKCkpIHsKLSAgICBMTFZNQ2xhc3NJbmZvKiBMQ0kgPSBnZXRDbGFzc0luZm8oVlQtPmNsLT5hc0NsYXNzKCkpOwotICAgIExDSS0+Z2V0VmlydHVhbFR5cGUoKTsKLSAgfQotICAKLSAgQ29uc3RhbnRJbnQqIENJID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ2NFR5KGdldExMVk1Db250ZXh0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KFZUKSk7Ci0gIHJldHVybiBDb25zdGFudEV4cHI6OmdldEludFRvUHRyKENJLCBKYXZhSW50cmluc2ljcy5WVFR5cGUpOwotfQotCi1Db25zdGFudCogSmF2YUpJVENvbXBpbGVyOjpnZXROYXRpdmVGdW5jdGlvbihKYXZhTWV0aG9kKiBtZXRoLCB2b2lkKiBwdHIpIHsKLSAgTExWTVNpZ25hdHVyZUluZm8qIExTSSA9IGdldFNpZ25hdHVyZUluZm8obWV0aC0+Z2V0U2lnbmF0dXJlKCkpOwotICBjb25zdCBsbHZtOjpUeXBlKiB2YWxQdHJUeXBlID0gTFNJLT5nZXROYXRpdmVQdHJUeXBlKCk7Ci0gIAotICBhc3NlcnQocHRyICYmICJObyBuYXRpdmUgZnVuY3Rpb24gZ2l2ZW4iKTsKLQotICBDb25zdGFudCogQ0kgPSBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDY0VHkoZ2V0TExWTUNvbnRleHQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QocHRyKSk7Ci0gIHJldHVybiBDb25zdGFudEV4cHI6OmdldEludFRvUHRyKENJLCB2YWxQdHJUeXBlKTsKLX0KLQotSmF2YUpJVENvbXBpbGVyOjpKYXZhSklUQ29tcGlsZXIoY29uc3Qgc3RkOjpzdHJpbmcgJk1vZHVsZUlEKSA6Ci0gIEphdmFMTFZNQ29tcGlsZXIoTW9kdWxlSUQpLCBsaXN0ZW5lcih0aGlzKSB7Ci0KLSAgRW1pdEZ1bmN0aW9uTmFtZSA9IGZhbHNlOwotICBHQ0luZm8gPSBOVUxMOwotCi0gIGV4ZWN1dGlvbkVuZ2luZSA9IEV4ZWN1dGlvbkVuZ2luZTo6Y3JlYXRlSklUKFRoZU1vZHVsZSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgbGx2bTo6Q29kZUdlbk9wdDo6RGVmYXVsdCwgZmFsc2UpOwotICBleGVjdXRpb25FbmdpbmUtPlJlZ2lzdGVySklURXZlbnRMaXN0ZW5lcigmbGlzdGVuZXIpOwotCi0gIGFkZEphdmFQYXNzZXMoKTsKLX0KLQotSmF2YUpJVENvbXBpbGVyOjp+SmF2YUpJVENvbXBpbGVyKCkgewotICBleGVjdXRpb25FbmdpbmUtPnJlbW92ZU1vZHVsZShUaGVNb2R1bGUpOwotICBkZWxldGUgZXhlY3V0aW9uRW5naW5lOwotICAvLyB+SmF2YUxMVk1Db21waWxlciB3aWxsIGRlbGV0ZSB0aGUgbW9kdWxlLgotfQotCi12b2lkIEphdmFKSVRDb21waWxlcjo6bWFrZVZUKENsYXNzKiBjbCkgeyAKLSAgSmF2YVZpcnR1YWxUYWJsZSogVlQgPSBjbC0+dmlydHVhbFZUOyAKLSAgYXNzZXJ0KFZUICYmICJObyBWVCB3YXMgYWxsb2NhdGVkISIpOwotICAgIAotICBpZiAoVlQtPmluaXQpIHsKLSAgICAvLyBUaGUgVlQgaGFzIGFscmVhZHkgYmVlbiBmaWxsZWQgYnkgdGhlIEFPVCBjb21waWxlciBzbyB0aGVyZQotICAgIC8vIGlzIG5vdGhpbmcgbGVmdCB0byBkbyEKLSAgICByZXR1cm47Ci0gIH0KLSAgCi0gIGlmIChjbC0+c3VwZXIpIHsKLSAgICAvLyBDb3B5IHRoZSBzdXBlciBWVCBpbnRvIHRoZSBjdXJyZW50IFZULgotICAgIHVpbnQzMiBzaXplID0gY2wtPnN1cGVyLT52aXJ0dWFsVGFibGVTaXplIC0gCi0gICAgICAgIEphdmFWaXJ0dWFsVGFibGU6OmdldEZpcnN0SmF2YU1ldGhvZEluZGV4KCk7Ci0gICAgbWVtY3B5KFZULT5nZXRGaXJzdEphdmFNZXRob2QoKSwgY2wtPnN1cGVyLT52aXJ0dWFsVlQtPmdldEZpcnN0SmF2YU1ldGhvZCgpLAotICAgICAgICAgICBzaXplICogc2l6ZW9mKHVpbnRwdHJfdCkpOwotICAgIFZULT5kZXN0cnVjdG9yID0gY2wtPnN1cGVyLT52aXJ0dWFsVlQtPmRlc3RydWN0b3I7Ci0gIH0KLQotCi0gIC8vIEZpbGwgdGhlIHZpcnR1YWwgdGFibGUgd2l0aCBmdW5jdGlvbiBwb2ludGVycy4KLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBjbC0+bmJWaXJ0dWFsTWV0aG9kczsgKytpKSB7Ci0gICAgSmF2YU1ldGhvZCYgbWV0aCA9IGNsLT52aXJ0dWFsTWV0aG9kc1tpXTsKLQotICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGZpbmFsaXplIG1ldGhvZC4gRG9uJ3QgcHV0IGEgZmluYWxpemVyCi0gICAgLy8gaWYgdGhlcmUgaXMgbm9uZSwgb3IgaWYgaXQgaXMgZW1wdHkuCi0gICAgaWYgKG1ldGgub2Zmc2V0ID09IDApIHsKLSAgICAgIGlmICghY2wtPnN1cGVyKSB7Ci0gICAgICAgIG1ldGguY2FuQmVJbmxpbmVkID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFZULT5kZXN0cnVjdG9yID0gZ2V0UG9pbnRlck9yU3R1YihtZXRoLCBKYXZhTWV0aG9kOjpWaXJ0dWFsKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgVlQtPmdldEZ1bmN0aW9ucygpW21ldGgub2Zmc2V0XSA9IGdldFBvaW50ZXJPclN0dWIobWV0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFNZXRob2Q6OlZpcnR1YWwpOwotICAgIH0KLSAgfQotCi19Ci0KLWV4dGVybiAiQyIgdm9pZCBUaHJvd1VuZm91bmRJbnRlcmZhY2UoKSB7Ci0gIGFib3J0KCk7Ci19Ci0KLXZvaWQgSmF2YUpJVENvbXBpbGVyOjptYWtlSU1UKENsYXNzKiBjbCkgewotICBJbnRlcmZhY2VNZXRob2RUYWJsZSogSU1UID0gY2wtPnZpcnR1YWxWVC0+SU1UOwotICBpZiAoIUlNVCkgcmV0dXJuOwotIAotICBzdGQ6OnNldDxKYXZhTWV0aG9kKj4gY29udGVudHNbSW50ZXJmYWNlTWV0aG9kVGFibGU6Ok51bUluZGV4ZXNdOwotICBjbC0+ZmlsbElNVChjb250ZW50cyk7Ci0KLSAgCi0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBJbnRlcmZhY2VNZXRob2RUYWJsZTo6TnVtSW5kZXhlczsgKytpKSB7Ci0gICAgc3RkOjpzZXQ8SmF2YU1ldGhvZCo+JiBhdEluZGV4ID0gY29udGVudHNbaV07Ci0gICAgdWludDMyX3Qgc2l6ZSA9IGF0SW5kZXguc2l6ZSgpOwotICAgIGlmIChzaXplID09IDEpIHsKLSAgICAgIEphdmFNZXRob2QqIEltZXRoID0gKihhdEluZGV4LmJlZ2luKCkpOwotICAgICAgSmF2YU1ldGhvZCogbWV0aCA9IGNsLT5sb29rdXBNZXRob2REb250VGhyb3coSW1ldGgtPm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWV0aC0+dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCB0cnVlLCAwKTsKLSAgICAgIGlmIChtZXRoKSB7Ci0gICAgICAgIElNVC0+Y29udGVudHNbaV0gPSBnZXRQb2ludGVyT3JTdHViKCptZXRoLCBKYXZhTWV0aG9kOjpJbnRlcmZhY2UpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgSU1ULT5jb250ZW50c1tpXSA9ICh1aW50cHRyX3QpVGhyb3dVbmZvdW5kSW50ZXJmYWNlOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoc2l6ZSA+IDEpIHsKLSAgICAgIHN0ZDo6dmVjdG9yPEphdmFNZXRob2QqPiBtZXRob2RzOwotICAgICAgYm9vbCBTYW1lTWV0aG9kID0gdHJ1ZTsKLSAgICAgIEphdmFNZXRob2QqIE9sZE1ldGhvZCA9IDA7Ci0gICAgICAKLSAgICAgIGZvciAoc3RkOjpzZXQ8SmF2YU1ldGhvZCo+OjppdGVyYXRvciBpdCA9IGF0SW5kZXguYmVnaW4oKSwKLSAgICAgICAgICAgZXQgPSBhdEluZGV4LmVuZCgpOyBpdCAhPSBldDsgKytpdCkgewotICAgICAgICBKYXZhTWV0aG9kKiBJbWV0aCA9ICppdDsKLSAgICAgICAgSmF2YU1ldGhvZCogQ21ldGggPSBjbC0+bG9va3VwTWV0aG9kRG9udFRocm93KEltZXRoLT5uYW1lLCBJbWV0aC0+dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCB0cnVlLCAwKTsKLSAgICAgICAKLSAgICAgICAgaWYgKE9sZE1ldGhvZCAmJiBPbGRNZXRob2QgIT0gQ21ldGgpIFNhbWVNZXRob2QgPSBmYWxzZTsKLSAgICAgICAgZWxzZSBPbGRNZXRob2QgPSBDbWV0aDsKLSAgICAgICAKLSAgICAgICAgbWV0aG9kcy5wdXNoX2JhY2soQ21ldGgpOwotICAgICAgfQotCi0gICAgICBpZiAoU2FtZU1ldGhvZCkgewotICAgICAgICBpZiAobWV0aG9kc1swXSkgewotICAgICAgICAgIElNVC0+Y29udGVudHNbaV0gPSBnZXRQb2ludGVyT3JTdHViKCoobWV0aG9kc1swXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YU1ldGhvZDo6SW50ZXJmYWNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBJTVQtPmNvbnRlbnRzW2ldID0gKHVpbnRwdHJfdClUaHJvd1VuZm91bmRJbnRlcmZhY2U7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgLy8gQWRkIG9uZSB0byBoYXZlIGEgTlVMTC10ZXJtaW5hdGVkIHRhYmxlLgotICAgICAgICB1aW50MzJfdCBsZW5ndGggPSAoMiAqIHNpemUgKyAxKSAqIHNpemVvZih1aW50cHRyX3QpOwotICAgICAgCi0gICAgICAgIHVpbnRwdHJfdCogdGFibGUgPSAodWludHB0cl90KikKLSAgICAgICAgICBjbC0+Y2xhc3NMb2FkZXItPmFsbG9jYXRvci5BbGxvY2F0ZShsZW5ndGgsICJJTVQiKTsKLSAgICAgIAotICAgICAgICBJTVQtPmNvbnRlbnRzW2ldID0gKHVpbnRwdHJfdCl0YWJsZSB8IDE7Ci0KLSAgICAgICAgdWludDMyX3QgaiA9IDA7Ci0gICAgICAgIHN0ZDo6c2V0PEphdmFNZXRob2QqPjo6aXRlcmF0b3IgSW50ZXJmID0gYXRJbmRleC5iZWdpbigpOwotICAgICAgICBmb3IgKHN0ZDo6dmVjdG9yPEphdmFNZXRob2QqPjo6aXRlcmF0b3IgaXQgPSBtZXRob2RzLmJlZ2luKCksCi0gICAgICAgICAgICAgZXQgPSBtZXRob2RzLmVuZCgpOyBpdCAhPSBldDsgKytpdCwgaiArPSAyLCArK0ludGVyZikgewotICAgICAgICAgIEphdmFNZXRob2QqIEltZXRoID0gKkludGVyZjsKLSAgICAgICAgICBKYXZhTWV0aG9kKiBDbWV0aCA9ICppdDsKLSAgICAgICAgICBhc3NlcnQoSW1ldGggIT0gTlVMTCk7Ci0gICAgICAgICAgYXNzZXJ0KGogPCAyICogc2l6ZSAtIDEpOwotICAgICAgICAgIHRhYmxlW2pdID0gKHVpbnRwdHJfdClJbWV0aDsKLSAgICAgICAgICBpZiAoQ21ldGgpIHsKLSAgICAgICAgICAgIHRhYmxlW2ogKyAxXSA9IGdldFBvaW50ZXJPclN0dWIoKkNtZXRoLCBKYXZhTWV0aG9kOjpJbnRlcmZhY2UpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0YWJsZVtqICsgMV0gPSAodWludHB0cl90KVRocm93VW5mb3VuZEludGVyZmFjZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0KEludGVyZiA9PSBhdEluZGV4LmVuZCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBKYXZhSklUQ29tcGlsZXI6OnNldE1ldGhvZChGdW5jdGlvbiogZnVuYywgdm9pZCogcHRyLCBjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIGZ1bmMtPnNldExpbmthZ2UoR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSk7Ci0gIGZ1bmMtPnNldE5hbWUobmFtZSk7Ci0gIGFzc2VydChwdHIgJiYgIk5vIHZhbHVlIGdpdmVuIik7Ci0gIGV4ZWN1dGlvbkVuZ2luZS0+dXBkYXRlR2xvYmFsTWFwcGluZyhmdW5jLCBwdHIpOwotfQotCi12b2lkKiBKYXZhSklUQ29tcGlsZXI6Om1hdGVyaWFsaXplRnVuY3Rpb24oSmF2YU1ldGhvZCogbWV0aCkgewotICBtdm06Ok12bU1vZHVsZTo6cHJvdGVjdElSKCk7Ci0gIEZ1bmN0aW9uKiBmdW5jID0gcGFyc2VGdW5jdGlvbihtZXRoKTsKLSAgdm9pZCogcmVzID0gZXhlY3V0aW9uRW5naW5lLT5nZXRQb2ludGVyVG9HbG9iYWwoZnVuYyk7Ci0gCi0gIGlmICghZnVuYy0+aXNEZWNsYXJhdGlvbigpKSB7Ci0gICAgbGx2bTo6R0NGdW5jdGlvbkluZm8qIEdGSSA9ICYoR0NJbmZvLT5nZXRGdW5jdGlvbkluZm8oKmZ1bmMpKTsKLSAgICBhc3NlcnQoKEdGSSAhPSBOVUxMKSAmJiAiTm8gR0MgaW5mb3JtYXRpb24iKTsKLSAgCi0JCW12bTo6Vk1LaXQqIHZta2l0ID0gbXZtOjpUaHJlYWQ6OmdldCgpLT52bWtpdDsKLSAgICBtdm06OkpJVE1ldGhvZEluZm8qIE1JID0gCi0gICAgICBuZXcoYWxsb2NhdG9yLCAiSmF2YUpJVE1ldGhvZEluZm8iKSBKYXZhSklUTWV0aG9kSW5mbyhHRkksIG1ldGgpOwotICAgIE1JLT5hZGRUb1ZNS2l0KHZta2l0LCAoSklUKilleGVjdXRpb25FbmdpbmUpOwotCi0gICAgdWludDMyX3QgaW5mb0xlbmd0aCA9IEdGSS0+c2l6ZSgpOwotICAgIG1ldGgtPmNvZGVJbmZvTGVuZ3RoID0gaW5mb0xlbmd0aDsKLSAgICBpZiAoaW5mb0xlbmd0aCA9PSAwKSB7Ci0gICAgICBtZXRoLT5jb2RlSW5mbyA9IE5VTEw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG12bTo6QnVtcFB0ckFsbG9jYXRvciYgSmF2YUFsbG9jID0gbWV0aC0+Y2xhc3NEZWYtPmNsYXNzTG9hZGVyLT5hbGxvY2F0b3I7Ci0gICAgICBDb2RlTGluZUluZm8qIGluZm9UYWJsZSA9Ci0gICAgICAgIG5ldyhKYXZhQWxsb2MsICJDb2RlTGluZUluZm8iKSBDb2RlTGluZUluZm9baW5mb0xlbmd0aF07Ci0gICAgICB1aW50MzJfdCBpbmRleCA9IDA7Ci0gICAgICBmb3IgKEdDRnVuY3Rpb25JbmZvOjppdGVyYXRvciBJID0gR0ZJLT5iZWdpbigpLCBFID0gR0ZJLT5lbmQoKTsKLSAgICAgICAgICAgSSAhPSBFOwotICAgICAgICAgICBJKyssIGluZGV4KyspIHsKLSAgICAgICAgRGVidWdMb2MgREwgPSBJLT5Mb2M7Ci0gICAgICAgIHVpbnQzMl90IGJ5dGVjb2RlSW5kZXggPSBETC5nZXRMaW5lKCk7Ci0gICAgICAgIHVpbnQzMl90IHNlY29uZCA9IERMLmdldENvbCgpOwotICAgICAgICBhc3NlcnQoc2Vjb25kID09IDAgJiYgIldyb25nIGNvbHVtbiBudW1iZXIiKTsKLSAgICAgICAgdWludHB0cl90IGFkZHJlc3MgPQotICAgICAgICAgICAgKChKSVQqKWV4ZWN1dGlvbkVuZ2luZSktPmdldENvZGVFbWl0dGVyKCktPmdldExhYmVsQWRkcmVzcyhJLT5MYWJlbCk7Ci0gICAgICAgIGluZm9UYWJsZVtpbmRleF0uYWRkcmVzcyA9IGFkZHJlc3M7Ci0gICAgICAgIGluZm9UYWJsZVtpbmRleF0uYnl0ZWNvZGVJbmRleCA9IGJ5dGVjb2RlSW5kZXg7Ci0gICAgICB9Ci0gICAgICBtZXRoLT5jb2RlSW5mbyA9IGluZm9UYWJsZTsKLSAgICB9Ci0gIH0KLSAgICAvLyBOb3cgdGhhdCBpdCdzIGNvbXBpbGVkLCB3ZSBkb24ndCBuZWVkIHRoZSBJUiBhbnltb3JlCi0gIGZ1bmMtPmRlbGV0ZUJvZHkoKTsKLSAgbXZtOjpNdm1Nb2R1bGU6OnVucHJvdGVjdElSKCk7Ci0gIHJldHVybiByZXM7Ci19Ci0KLXZvaWQqIEphdmFKSVRDb21waWxlcjo6R2VuZXJhdGVTdHViKGxsdm06OkZ1bmN0aW9uKiBGKSB7Ci0gIG12bTo6TXZtTW9kdWxlOjpwcm90ZWN0SVIoKTsKLSAgdm9pZCogcmVzID0gZXhlY3V0aW9uRW5naW5lLT5nZXRQb2ludGVyVG9HbG9iYWwoRik7Ci0gIAotICBsbHZtOjpHQ0Z1bmN0aW9uSW5mbyogR0ZJID0gJihHQ0luZm8tPmdldEZ1bmN0aW9uSW5mbygqRikpOwotICBhc3NlcnQoKEdGSSAhPSBOVUxMKSAmJiAiTm8gR0MgaW5mb3JtYXRpb24iKTsKLSAgCi0JbXZtOjpWTUtpdCogdm1raXQgPSBtdm06OlRocmVhZDo6Z2V0KCktPnZta2l0OwotICBtdm06OkpJVE1ldGhvZEluZm8qIE1JID0gCi0gICAgbmV3KGFsbG9jYXRvciwgIkpJVE1ldGhvZEluZm8iKSBtdm06Ok12bUpJVE1ldGhvZEluZm8oR0ZJLCBGLCB0aGlzKTsKLSAgTUktPmFkZFRvVk1LaXQodm1raXQsIChKSVQqKWV4ZWN1dGlvbkVuZ2luZSk7Ci0gIAotICAvLyBOb3cgdGhhdCBpdCdzIGNvbXBpbGVkLCB3ZSBkb24ndCBuZWVkIHRoZSBJUiBhbnltb3JlCi0gIEYtPmRlbGV0ZUJvZHkoKTsKLSAgbXZtOjpNdm1Nb2R1bGU6OnVucHJvdGVjdElSKCk7Ci0gIHJldHVybiByZXM7Ci19Ci0KLS8vIEhlbHBlciBmdW5jdGlvbiB0byBydW4gYW4gZXhlY3V0YWJsZSB3aXRoIGEgSklUCi1leHRlcm4gIkMiIGludCBTdGFydEpuanZtV2l0aEpJVChpbnQgYXJnYywgY2hhcioqIGFyZ3YsIGNoYXIqIG1haW5DbGFzcykgewotICBsbHZtOjpsbHZtX3NodXRkb3duX29iaiBYOyAKLQotICBtdm06OkJ1bXBQdHJBbGxvY2F0b3IgQWxsb2NhdG9yOwotCW12bTo6Vk1LaXQqIHZta2l0ID0gbmV3KEFsbG9jYXRvciwgIlZNS2l0IikgbXZtOjpWTUtpdChBbGxvY2F0b3IpOwotCi0gIG12bTo6VGhyZWFkQWxsb2NhdG9yIHRoYWxsb2NhdG9yOwotICBjaGFyKiogbmV3QXJndiA9IChjaGFyKiopdGhhbGxvY2F0b3IuQWxsb2NhdGUoKGFyZ2MgKyAxKSAqIHNpemVvZihjaGFyKikpOwotICBtZW1jcHkobmV3QXJndiArIDEsIGFyZ3YsIGFyZ2MgKiBzaXplb2Yodm9pZCopKTsKLSAgbmV3QXJndlswXSA9IG5ld0FyZ3ZbMV07Ci0gIG5ld0FyZ3ZbMV0gPSBtYWluQ2xhc3M7Ci0KLSAgSmF2YUpJVENvbXBpbGVyKiBDb21wID0gSmF2YUpJVENvbXBpbGVyOjpDcmVhdGVDb21waWxlcigiSklUTW9kdWxlIik7Ci0gIEpuanZtKiB2bSA9IG5ldyhBbGxvY2F0b3IsICJWTSIpIEpuanZtKEFsbG9jYXRvciwgdm1raXQsIENvbXAsIHRydWUpOwotICB2bS0+cnVuQXBwbGljYXRpb24oYXJnYyArIDEsIG5ld0FyZ3YpOwotICB2bWtpdC0+d2FpdE5vbkRhZW1vblRocmVhZHMoKTsKLSAgCi0gIHJldHVybiAwOwotfQotCi11aW50cHRyX3QgSmF2YUozTGF6eUpJVENvbXBpbGVyOjpnZXRQb2ludGVyT3JTdHViKEphdmFNZXRob2QmIG1ldGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaWRlKSB7Ci0gIHJldHVybiBtZXRoLmdldFNpZ25hdHVyZSgpLT5nZXRWaXJ0dWFsQ2FsbFN0dWIoKTsKLX0KLQotVmFsdWUqIEphdmFKM0xhenlKSVRDb21waWxlcjo6YWRkQ2FsbGJhY2soQ2xhc3MqIGNsLCB1aW50MTYgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaWduZGVmKiBzaWduLCBib29sIHN0YXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpCYXNpY0Jsb2NrKiBpbnNlcnQpIHsKLSAgTExWTVNpZ25hdHVyZUluZm8qIExTSSA9IGdldFNpZ25hdHVyZUluZm8oc2lnbik7Ci0gIC8vIFNldCB0aGUgc3R1YiBpbiB0aGUgY29uc3RhbnQgcG9vbC4KLSAgSmF2YUNvbnN0YW50UG9vbCogY3RwSW5mbyA9IGNsLT5jdHBJbmZvOwotICB1aW50cHRyX3Qgc3R1YiA9IHN0YXQgPyBzaWduLT5nZXRTdGF0aWNDYWxsU3R1YigpIDogc2lnbi0+Z2V0U3BlY2lhbENhbGxTdHViKCk7Ci0gIGlmICghY3RwSW5mby0+Y3RwUmVzW2luZGV4XSkgewotICAgIC8vIERvIGEgY29tcGFyZSBhbmQgc3dhcCwgc28gdGhhdCB3ZSBkbyBub3Qgb3ZlcndydGllIHdoYXQgYSBzdHViIG1pZ2h0Ci0gICAgLy8gaGF2ZSBqdXN0IHVwZGF0ZWQuCi0gICAgdWludHB0cl90IHZhbCA9ICh1aW50cHRyX3QpCi0gICAgICBfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAoJihjdHBJbmZvLT5jdHBSZXNbaW5kZXhdKSwgTlVMTCwgc3R1Yik7Ci0gICAgLy8gSWYgdGhlcmUgaXMgc29tZXRoaW5nIGluIHRoZSB0aGUgY29uc3RhbnQgcG9vbCB0aGF0IGlzIG5vdCBOVUxMIG5vcgotICAgIC8vIHRoZSBzdHViLCB0aGVuIGl0J3MgdGhlIG1ldGhvZC4KLSAgICBpZiAodmFsICE9IDAgJiYgdmFsICE9IHN0dWIpIHsKLSAgICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEludFRvUHRyKAotICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50NjRUeShpbnNlcnQtPmdldENvbnRleHQoKSksIHZhbCksCi0gICAgICAgICAgc3RhdCA/IExTSS0+Z2V0U3RhdGljUHRyVHlwZSgpIDogTFNJLT5nZXRWaXJ0dWFsUHRyVHlwZSgpKTsKLSAgICB9Ci0gIH0KLSAgLy8gTG9hZCB0aGUgY29uc3RhbnQgcG9vbC4KLSAgVmFsdWUqIENUUCA9IGdldENvbnN0YW50UG9vbChjdHBJbmZvKTsKLSAgVmFsdWUqIEluZGV4ID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KGluc2VydC0+Z2V0Q29udGV4dCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0gIFZhbHVlKiBmdW5jID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShDVFAsIEluZGV4LCAiIiwgaW5zZXJ0KTsKLSAgZnVuYyA9IG5ldyBMb2FkSW5zdChmdW5jLCAiIiwgZmFsc2UsIGluc2VydCk7Ci0gIC8vIEJpdGNhc3QgaXQgdG8gdGhlIExMVk0gZnVuY3Rpb24uCi0gIGZ1bmMgPSBuZXcgQml0Q2FzdEluc3QoZnVuYywgc3RhdCA/IExTSS0+Z2V0U3RhdGljUHRyVHlwZSgpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFNJLT5nZXRWaXJ0dWFsUHRyVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICIiLCBpbnNlcnQpOwotICByZXR1cm4gZnVuYzsKLX0KLQotYm9vbCBKYXZhSjNMYXp5SklUQ29tcGlsZXI6Om5lZWRzQ2FsbGJhY2soSmF2YU1ldGhvZCogbWV0aCwgYm9vbCogbmVlZHNJbml0KSB7Ci0gICpuZWVkc0luaXQgPSB0cnVlOwotICByZXR1cm4gKG1ldGggPT0gTlVMTCB8fCBtZXRoLT5jb2RlID09IE5VTEwpOwotfQotCi1KYXZhSjNMYXp5SklUQ29tcGlsZXI6OkphdmFKM0xhenlKSVRDb21waWxlcihjb25zdCBzdGQ6OnN0cmluZyYgTW9kdWxlSUQpCi0gICAgOiBKYXZhSklUQ29tcGlsZXIoTW9kdWxlSUQpIHt9Ci0KLQotc3RhdGljIGxsdm06OmNsOjpvcHQ8Ym9vbD4gTExWTUxhenkoImxsdm0tbGF6eSIsIAotICAgICAgICAgICAgICAgICAgICAgY2w6OmRlc2MoIlVzZSBMTFZNIGxhenkgc3R1YnMiKSwKLSAgICAgICAgICAgICAgICAgICAgIGNsOjppbml0KGZhbHNlKSk7Ci0KLUphdmFKSVRDb21waWxlciogSmF2YUpJVENvbXBpbGVyOjpDcmVhdGVDb21waWxlcihjb25zdCBzdGQ6OnN0cmluZyYgTW9kdWxlSUQpIHsKLSAgLy8gVGhpcyBpcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCBjb21waWxlci4KLSAgaWYgKExMVk1MYXp5KSB7Ci0gICAgcmV0dXJuIG5ldyBKYXZhTExWTUxhenlKSVRDb21waWxlcihNb2R1bGVJRCk7Ci0gIH0KLSAgcmV0dXJuIG5ldyBKYXZhSjNMYXp5SklUQ29tcGlsZXIoTW9kdWxlSUQpOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL0ozL0NvbXBpbGVyL0phdmFKSVRPcGNvZGVzLmNwcCBiL3Zta2l0L2xpYi9KMy9Db21waWxlci9KYXZhSklUT3Bjb2Rlcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZDFkMTEuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL0ozL0NvbXBpbGVyL0phdmFKSVRPcGNvZGVzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI3MjIgKzAsMCBAQAotLy89PT0tLS0tIEphdmFKSVRPcGNvZGVzLmNwcCAtIFJlYWRzIGFuZCBjb21waWxlcyBvcGNvZGVzIC0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNkZWZpbmUgREVCVUcgMAotI2RlZmluZSBKTkpWTV9DT01QSUxFIDAKLSNkZWZpbmUgSk5KVk1fRVhFQ1VURSAwCi0KLSNpbmNsdWRlIDxjc3RyaW5nPgotCi0jaW5jbHVkZSA8bGx2bS9Db25zdGFudHMuaD4KLSNpbmNsdWRlIDxsbHZtL0Rlcml2ZWRUeXBlcy5oPgotI2luY2x1ZGUgPGxsdm0vRnVuY3Rpb24uaD4KLSNpbmNsdWRlIDxsbHZtL0luc3RydWN0aW9ucy5oPgotI2luY2x1ZGUgPGxsdm0vTW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGx2bS9UeXBlLmg+Ci0KLSNpbmNsdWRlICJtdm0vSklULmgiCi0KLSNpbmNsdWRlICJkZWJ1Zy5oIgotCi0jaW5jbHVkZSAiSmF2YUFycmF5LmgiCi0jaW5jbHVkZSAiSmF2YUNsYXNzLmgiCi0jaW5jbHVkZSAiSmF2YUNvbnN0YW50UG9vbC5oIgotI2luY2x1ZGUgIkphdmFPYmplY3QuaCIKLSNpbmNsdWRlICJKYXZhSklULmgiCi0jaW5jbHVkZSAiSmF2YVRocmVhZC5oIgotI2luY2x1ZGUgIkphdmFUeXBlcy5oIgotI2luY2x1ZGUgIkpuanZtLmgiCi0jaW5jbHVkZSAiUmVhZGVyLmgiCi0KLSNpbmNsdWRlICJqMy9KM0ludHJpbnNpY3MuaCIKLQotI2lmIERFQlVHID4gMCAmJiAoSk5KVk1fQ09NUElMRSA+IDAgfHwgSk5KVk1fRVhFQ1VURSA+IDApCi0jaW5jbHVkZSAiajMvT3Bjb2RlTmFtZXMuZGVmIgotI2VuZGlmCi0KLXVzaW5nIG5hbWVzcGFjZSBqMzsKLXVzaW5nIG5hbWVzcGFjZSBsbHZtOwotCi11aW50OCBhcnJheVR5cGUoSmF2YU1ldGhvZCogbWV0aCwgdW5zaWduZWQgaW50IHQpIHsKLSAgaWYgKHQgPT0gSmF2YUFycmF5OjpUX0NIQVIpIHsKLSAgICByZXR1cm4gSV9DSEFSOwotICB9IGVsc2UgaWYgKHQgPT0gSmF2YUFycmF5OjpUX0JPT0xFQU4pIHsKLSAgICByZXR1cm4gSV9CT09MOwotICB9IGVsc2UgaWYgKHQgPT0gSmF2YUFycmF5OjpUX0lOVCkgewotICAgIHJldHVybiBJX0lOVDsKLSAgfSBlbHNlIGlmICh0ID09IEphdmFBcnJheTo6VF9TSE9SVCkgewotICAgIHJldHVybiBJX1NIT1JUOwotICB9IGVsc2UgaWYgKHQgPT0gSmF2YUFycmF5OjpUX0JZVEUpIHsKLSAgICByZXR1cm4gSV9CWVRFOwotICB9IGVsc2UgaWYgKHQgPT0gSmF2YUFycmF5OjpUX0ZMT0FUKSB7Ci0gICAgcmV0dXJuIElfRkxPQVQ7Ci0gIH0gZWxzZSBpZiAodCA9PSBKYXZhQXJyYXk6OlRfTE9ORykgewotICAgIHJldHVybiBJX0xPTkc7Ci0gIH0gZWxzZSBpZiAodCA9PSBKYXZhQXJyYXk6OlRfRE9VQkxFKSB7Ci0gICAgcmV0dXJuIElfRE9VQkxFOwotICB9IGVsc2UgewotICAgIGZwcmludGYoc3RkZXJyLCAiSSBoYXZlbid0IHZlcmlmaWVkIHlvdXIgY2xhc3MgZmlsZSBhbmQgaXQncyBtYWxmb3JtZWQ6IgotICAgICAgICAgICAgICAgICAgICAiIHVua25vd24gYXJyYXkgdHlwZSAlZCBpbiAlcy4lcyFcbiIsIHQsCi0gICAgICAgICAgICAgICAgICAgIFVURjhCdWZmZXIobWV0aC0+Y2xhc3NEZWYtPm5hbWUpLmNTdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgVVRGOEJ1ZmZlcihtZXRoLT5uYW1lKS5jU3RyaW5nKCkpOwotICAgIGFib3J0KCk7Ci0gIH0KLX0KLQotc3RhdGljIGlubGluZSB1aW50MzIgV1JFQURfVTEoUmVhZGVyJiByZWFkZXIsIGJvb2wgaW5pdCwgdWludDMyICZpLCBib29sJiB3aWRlKSB7Ci0gIGlmICh3aWRlKSB7Ci0gICAgd2lkZSA9IGluaXQ7Ci0gICAgaSArPSAyOwotICAgIHJldHVybiByZWFkZXIucmVhZFUyKCk7Ci0gIH0gZWxzZSB7Ci0gICAgaSArPSAxOwotICAgIHJldHVybiByZWFkZXIucmVhZFUxKCk7Ci0gIH0KLX0KLQotc3RhdGljIGlubGluZSBzaW50MzIgV1JFQURfUzEoUmVhZGVyJiByZWFkZXIsIGJvb2wgaW5pdCwgdWludDMyICZpLCBib29sICZ3aWRlKSB7Ci0gIGlmICh3aWRlKSB7Ci0gICAgd2lkZSA9IGluaXQ7IAotICAgIGkgKz0gMjsKLSAgICByZXR1cm4gcmVhZGVyLnJlYWRTMigpOwotICB9IGVsc2UgewotICAgIGkgKz0gMTsKLSAgICByZXR1cm4gcmVhZGVyLnJlYWRTMSgpOwotICB9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdWludDMyIFdDQUxDKHVpbnQzMiBuLCBib29sJiB3aWRlKSB7Ci0gIGlmICh3aWRlKSB7Ci0gICAgd2lkZSA9IGZhbHNlOwotICAgIHJldHVybiBuIDw8IDE7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIG47Ci0gIH0KLX0KLQotdm9pZCBKYXZhSklUOjpjb21waWxlT3Bjb2RlcyhSZWFkZXImIHJlYWRlciwgdWludDMyIGNvZGVMZW5ndGgpIHsKLSAgYm9vbCB3aWRlID0gZmFsc2U7Ci0gIHVpbnQzMiBqc3JJbmRleCA9IDA7Ci0gIHVpbnQzMiBzdGFydCA9IHJlYWRlci5jdXJzb3I7Ci0gIG12bTo6VGhyZWFkQWxsb2NhdG9yIGFsbG9jYXRvcjsKLSAgZm9yKHVpbnQzMiBpID0gMDsgaSA8IGNvZGVMZW5ndGg7ICsraSkgewotICAgIHJlYWRlci5jdXJzb3IgPSBzdGFydCArIGk7Ci0gICAgdWludDggYnl0ZWNvZGUgPSByZWFkZXIucmVhZFUxKCk7Ci0gICAgCi0gICAgUFJJTlRfREVCVUcoSk5KVk1fQ09NUElMRSwgMSwgQ09MT1JfTk9STUFMLCAiXHRbYXQgJTVkXSAlLTVkICIsIGksCi0gICAgICAgICAgICAgICAgYnl0ZWNvZGUpOwotICAgIFBSSU5UX0RFQlVHKEpOSlZNX0NPTVBJTEUsIDEsIExJR0hUX0JMVUUsICJjb21waWxpbmcgIik7Ci0gICAgUFJJTlRfREVCVUcoSk5KVk1fQ09NUElMRSwgMSwgTElHSFRfQ1lBTiwgT3Bjb2RlTmFtZXNbYnl0ZWNvZGVdKTsKLSAgICBQUklOVF9ERUJVRyhKTkpWTV9DT01QSUxFLCAxLCBMSUdIVF9CTFVFLCAiXG4iKTsKLSAgICAKLSAgICBPcGluZm8qIG9waW5mbyA9ICYob3Bjb2RlSW5mb3NbaV0pOwotICAgIAotICAgIGlmIChvcGluZm8tPm5ld0Jsb2NrKSB7Ci0gICAgICBpZiAoY3VycmVudEJsb2NrLT5nZXRUZXJtaW5hdG9yKCkgPT0gMCkgewotICAgICAgICAvLyBMb2FkIHRoZSBleGNlcHRpb24gb2JqZWN0IGlmIHdlIGhhdmUgYnJhbmNoZWQgdG8gYSBoYW5kbGVyLgotICAgICAgICBpZiAob3BpbmZvLT5oYW5kbGVyKSB7Ci0gICAgICAgICAgSW5zdHJ1Y3Rpb24qIEkgPSBvcGluZm8tPm5ld0Jsb2NrLT5iZWdpbigpOwotICAgICAgICAgIFBISU5vZGUgKiBub2RlID0gZHluX2Nhc3Q8UEhJTm9kZT4oSSk7Ci0gICAgICAgICAgYXNzZXJ0KG5vZGUgJiYgIkhhbmRsZXIgbWFybGZvcm1lZCIpOwotICAgICAgICAgIFZhbHVlKiBvYmogPSBwb3AoKTsKLSAgICAgICAgICBub2RlLT5hZGRJbmNvbWluZyhvYmosIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJhbmNoKCpvcGluZm8sIGN1cnJlbnRCbG9jayk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGN1cnJlbnRCbG9jayA9IG9waW5mby0+bmV3QmxvY2s7Ci0gICAgICAKLSAgICAgIHN0YWNrLmNsZWFyKCk7Ci0gICAgICBpZiAob3BpbmZvLT5oYW5kbGVyKSB7Ci0gICAgICAgIEluc3RydWN0aW9uKiBJID0gb3BpbmZvLT5uZXdCbG9jay0+YmVnaW4oKTsKLSAgICAgICAgYXNzZXJ0KGlzYTxQSElOb2RlPihJKSAmJiAiSGFuZGxlciBtYXJsZm9ybWVkIik7Ci0gICAgICAgIC8vIElmIGl0J3MgYSBoYW5kbGVyLCBwdXQgdGhlIGV4Y2VwdGlvbiBvYmplY3QgaW4gdGhlIHN0YWNrLgotICAgICAgICBuZXcgU3RvcmVJbnN0KEksIG9iamVjdFN0YWNrWzBdLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgc3RhY2sucHVzaF9iYWNrKHVwY2FsbHMtPk9mT2JqZWN0KTsKLSAgICAgICAgY3VycmVudFN0YWNrSW5kZXggPSAxOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RhY2sgPSBvcGluZm8tPnN0YWNrOwotICAgICAgICBjdXJyZW50U3RhY2tJbmRleCA9IHN0YWNrLnNpemUoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBjdXJyZW50RXhjZXB0aW9uQmxvY2sgPSBvcGluZm8tPmV4Y2VwdGlvbkJsb2NrOwotICAgIAotICAgIGN1cnJlbnRCeXRlY29kZUluZGV4ID0gaTsKLQotICAgIC8vIFRvIHByZXZlbnQgYSBnY2ogYnVnIHdpdGggdXNlbGVzcyBnb3RvCi0gICAgaWYgKGN1cnJlbnRCbG9jay0+Z2V0VGVybWluYXRvcigpICE9IDApIHsgCi0gICAgICBjdXJyZW50QmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJnY2ogYnVnIik7Ci0gICAgfQotICAgIAotI2lmIEpOSlZNX0VYRUNVVEUgPiAxCi0JCS8vCQlpZiAoY29tcGlsaW5nTWV0aG9kLT5uYW1lLT5lcXVhbHMoY29tcGlsaW5nQ2xhc3MtPmNsYXNzTG9hZGVyLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KCJhbGxvY1Nsb3dPbmNlIikpKQotICAgIHsKLSAgICAgIFZhbHVlKiBhcmdzWzNdID0gewotICAgICAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSwgKGludDY0X3QpYnl0ZWNvZGUpLAotICAgICAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSwgKGludDY0X3QpaSksCi0gICAgICAgIFRoZUNvbXBpbGVyLT5nZXRNZXRob2RJbkNsYXNzKGNvbXBpbGluZ01ldGhvZCkKLSAgICAgIH07Ci0gICAgCi0gICAgCi0gICAgICBDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPlByaW50RXhlY3V0aW9uRnVuY3Rpb24sIGFyZ3MsIGFyZ3MgKyAzLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgICB9Ci0jZW5kaWYKLSAgICAKLSAgICBzd2l0Y2ggKGJ5dGVjb2RlKSB7Ci0gICAgICAKLSAgICAgIGNhc2UgTk9QIDogYnJlYWs7Ci0KLSAgICAgIGNhc2UgQUNPTlNUX05VTEwgOiAKLSAgICAgICAgcHVzaChpbnRyaW5zaWNzLT5KYXZhT2JqZWN0TnVsbENvbnN0YW50LCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIElDT05TVF9NMSA6Ci0gICAgICAgIHB1c2goaW50cmluc2ljcy0+Y29uc3RhbnRNaW51c09uZSwgZmFsc2UpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBJQ09OU1RfMCA6Ci0gICAgICAgIHB1c2goaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIElDT05TVF8xIDoKLSAgICAgICAgcHVzaChpbnRyaW5zaWNzLT5jb25zdGFudE9uZSwgZmFsc2UpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBJQ09OU1RfMiA6Ci0gICAgICAgIHB1c2goaW50cmluc2ljcy0+Y29uc3RhbnRUd28sIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgSUNPTlNUXzMgOgotICAgICAgICBwdXNoKGludHJpbnNpY3MtPmNvbnN0YW50VGhyZWUsIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgSUNPTlNUXzQgOgotICAgICAgICBwdXNoKGludHJpbnNpY3MtPmNvbnN0YW50Rm91ciwgZmFsc2UpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBJQ09OU1RfNSA6Ci0gICAgICAgIHB1c2goaW50cmluc2ljcy0+Y29uc3RhbnRGaXZlLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIExDT05TVF8wIDoKLSAgICAgICAgcHVzaChpbnRyaW5zaWNzLT5jb25zdGFudExvbmdaZXJvLCBmYWxzZSk7Ci0gICAgICAgIHB1c2goaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIExDT05TVF8xIDoKLSAgICAgICAgcHVzaChpbnRyaW5zaWNzLT5jb25zdGFudExvbmdPbmUsIGZhbHNlKTsKLSAgICAgICAgcHVzaChpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRkNPTlNUXzAgOgotICAgICAgICBwdXNoKGludHJpbnNpY3MtPmNvbnN0YW50RmxvYXRaZXJvLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEZDT05TVF8xIDoKLSAgICAgICAgcHVzaChpbnRyaW5zaWNzLT5jb25zdGFudEZsb2F0T25lLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgCi0gICAgICBjYXNlIEZDT05TVF8yIDoKLSAgICAgICAgcHVzaChpbnRyaW5zaWNzLT5jb25zdGFudEZsb2F0VHdvLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgCi0gICAgICBjYXNlIERDT05TVF8wIDoKLSAgICAgICAgcHVzaChpbnRyaW5zaWNzLT5jb25zdGFudERvdWJsZVplcm8sIGZhbHNlKTsKLSAgICAgICAgcHVzaChpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICAgIGNhc2UgRENPTlNUXzEgOgotICAgICAgICBwdXNoKGludHJpbnNpY3MtPmNvbnN0YW50RG91YmxlT25lLCBmYWxzZSk7Ci0gICAgICAgIHB1c2goaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEJJUFVTSCA6IAotICAgICAgICBwdXNoKENvbnN0YW50RXhwcjo6Z2V0U0V4dChDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDhUeSgqbGx2bUNvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5yZWFkVTEoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSksIGZhbHNlKTsKLSAgICAgICAgaSsrOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBTSVBVU0ggOgotICAgICAgICBwdXNoKENvbnN0YW50RXhwcjo6Z2V0U0V4dChDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDE2VHkoKmxsdm1Db250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIucmVhZFMyKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlOjpnZXRJbnQzMlR5KCpsbHZtQ29udGV4dCkpLCBmYWxzZSk7Ci0gICAgICAgIGkgKz0gMjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgTERDIDoKLSAgICAgICAgbG9hZENvbnN0YW50KHJlYWRlci5yZWFkVTEoKSk7Ci0gICAgICAgIGkrKzsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgTERDX1cgOgotICAgICAgICBsb2FkQ29uc3RhbnQocmVhZGVyLnJlYWRTMigpKTsKLSAgICAgICAgaSArPSAyOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBMREMyX1cgOgotICAgICAgICBsb2FkQ29uc3RhbnQocmVhZGVyLnJlYWRTMigpKTsKLSAgICAgICAgaSArPSAyOwotICAgICAgICBwdXNoKGludHJpbnNpY3MtPmNvbnN0YW50WmVybywgZmFsc2UpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBJTE9BRCA6Ci0gICAgICAgIHB1c2gobmV3IExvYWRJbnN0KGludExvY2Fsc1tXUkVBRF9VMShyZWFkZXIsIGZhbHNlLCBpLCB3aWRlKV0sICIiLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKSwgZmFsc2UpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBMTE9BRCA6Ci0gICAgICAgIHB1c2gobmV3IExvYWRJbnN0KGxvbmdMb2NhbHNbV1JFQURfVTEocmVhZGVyLCBmYWxzZSwgaSwgd2lkZSldLCAiIiwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayksIGZhbHNlKTsKLSAgICAgICAgcHVzaChpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRkxPQUQgOgotICAgICAgICBwdXNoKG5ldyBMb2FkSW5zdChmbG9hdExvY2Fsc1tXUkVBRF9VMShyZWFkZXIsIGZhbHNlLCBpLCB3aWRlKV0sICIiLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKSwgZmFsc2UpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBETE9BRCA6Ci0gICAgICAgIHB1c2gobmV3IExvYWRJbnN0KGRvdWJsZUxvY2Fsc1tXUkVBRF9VMShyZWFkZXIsIGZhbHNlLCBpLCB3aWRlKV0sICIiLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKSwgZmFsc2UpOwotICAgICAgICBwdXNoKGludHJpbnNpY3MtPmNvbnN0YW50WmVybywgZmFsc2UpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBBTE9BRCA6Ci0gICAgICAgIHB1c2gobmV3IExvYWRJbnN0KG9iamVjdExvY2Fsc1tXUkVBRF9VMShyZWFkZXIsIGZhbHNlLCBpLCB3aWRlKV0sICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVDb21waWxlci0+dXNlQ29vcGVyYXRpdmVHQygpLCBjdXJyZW50QmxvY2spLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgCi0gICAgICBjYXNlIElMT0FEXzAgOgotICAgICAgICBwdXNoKG5ldyBMb2FkSW5zdChpbnRMb2NhbHNbMF0sICIiLCBmYWxzZSwgY3VycmVudEJsb2NrKSwgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBJTE9BRF8xIDoKLSAgICAgICAgcHVzaChuZXcgTG9hZEluc3QoaW50TG9jYWxzWzFdLCAiIiwgZmFsc2UsIGN1cnJlbnRCbG9jayksIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgSUxPQURfMiA6Ci0gICAgICAgIHB1c2gobmV3IExvYWRJbnN0KGludExvY2Fsc1syXSwgIiIsIGZhbHNlLCBjdXJyZW50QmxvY2spLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIElMT0FEXzMgOgotICAgICAgICBwdXNoKG5ldyBMb2FkSW5zdChpbnRMb2NhbHNbM10sICIiLCBmYWxzZSwgY3VycmVudEJsb2NrKSwgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBMTE9BRF8wIDoKLSAgICAgICAgcHVzaChuZXcgTG9hZEluc3QobG9uZ0xvY2Fsc1swXSwgIiIsIGZhbHNlLCBjdXJyZW50QmxvY2spLAotICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgcHVzaChpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgTExPQURfMSA6Ci0gICAgICAgIHB1c2gobmV3IExvYWRJbnN0KGxvbmdMb2NhbHNbMV0sICIiLCBmYWxzZSwgY3VycmVudEJsb2NrKSwKLSAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIHB1c2goaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgCi0gICAgICBjYXNlIExMT0FEXzIgOgotICAgICAgICBwdXNoKG5ldyBMb2FkSW5zdChsb25nTG9jYWxzWzJdLCAiIiwgZmFsc2UsIGN1cnJlbnRCbG9jayksCi0gICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICBwdXNoKGludHJpbnNpY3MtPmNvbnN0YW50WmVybywgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBMTE9BRF8zIDoKLSAgICAgICAgcHVzaChuZXcgTG9hZEluc3QobG9uZ0xvY2Fsc1szXSwgIiIsIGZhbHNlLCBjdXJyZW50QmxvY2spLAotICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgcHVzaChpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICAgIGNhc2UgRkxPQURfMCA6Ci0gICAgICAgIHB1c2gobmV3IExvYWRJbnN0KGZsb2F0TG9jYWxzWzBdLCAiIiwgZmFsc2UsIGN1cnJlbnRCbG9jayksCi0gICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBGTE9BRF8xIDoKLSAgICAgICAgcHVzaChuZXcgTG9hZEluc3QoZmxvYXRMb2NhbHNbMV0sICIiLCBmYWxzZSwgY3VycmVudEJsb2NrKSwKLSAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEZMT0FEXzIgOgotICAgICAgICBwdXNoKG5ldyBMb2FkSW5zdChmbG9hdExvY2Fsc1syXSwgIiIsIGZhbHNlLCBjdXJyZW50QmxvY2spLAotICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRkxPQURfMyA6Ci0gICAgICAgIHB1c2gobmV3IExvYWRJbnN0KGZsb2F0TG9jYWxzWzNdLCAiIiwgZmFsc2UsIGN1cnJlbnRCbG9jayksCi0gICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBETE9BRF8wIDoKLSAgICAgICAgcHVzaChuZXcgTG9hZEluc3QoZG91YmxlTG9jYWxzWzBdLCAiIiwgZmFsc2UsIGN1cnJlbnRCbG9jayksCi0gICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICBwdXNoKGludHJpbnNpY3MtPmNvbnN0YW50WmVybywgZmFsc2UpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBETE9BRF8xIDoKLSAgICAgICAgcHVzaChuZXcgTG9hZEluc3QoZG91YmxlTG9jYWxzWzFdLCAiIiwgZmFsc2UsIGN1cnJlbnRCbG9jayksCi0gICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICBwdXNoKGludHJpbnNpY3MtPmNvbnN0YW50WmVybywgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBETE9BRF8yIDoKLSAgICAgICAgcHVzaChuZXcgTG9hZEluc3QoZG91YmxlTG9jYWxzWzJdLCAiIiwgZmFsc2UsIGN1cnJlbnRCbG9jayksCi0gICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICBwdXNoKGludHJpbnNpY3MtPmNvbnN0YW50WmVybywgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBETE9BRF8zIDoKLSAgICAgICAgcHVzaChuZXcgTG9hZEluc3QoZG91YmxlTG9jYWxzWzNdLCAiIiwgZmFsc2UsIGN1cnJlbnRCbG9jayksCi0gICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICBwdXNoKGludHJpbnNpY3MtPmNvbnN0YW50WmVybywgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBBTE9BRF8wIDoKLSAgICAgICAgcHVzaChuZXcgTG9hZEluc3Qob2JqZWN0TG9jYWxzWzBdLCAiIiwgVGhlQ29tcGlsZXItPnVzZUNvb3BlcmF0aXZlR0MoKSwgY3VycmVudEJsb2NrKSwKLSAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgCi0gICAgICBjYXNlIEFMT0FEXzEgOgotICAgICAgICBwdXNoKG5ldyBMb2FkSW5zdChvYmplY3RMb2NhbHNbMV0sICIiLCBUaGVDb21waWxlci0+dXNlQ29vcGVyYXRpdmVHQygpLCBjdXJyZW50QmxvY2spLAotICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQUxPQURfMiA6Ci0gICAgICAgIHB1c2gobmV3IExvYWRJbnN0KG9iamVjdExvY2Fsc1syXSwgIiIsIFRoZUNvbXBpbGVyLT51c2VDb29wZXJhdGl2ZUdDKCksIGN1cnJlbnRCbG9jayksCi0gICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBBTE9BRF8zIDoKLSAgICAgICAgcHVzaChuZXcgTG9hZEluc3Qob2JqZWN0TG9jYWxzWzNdLCAiIiwgVGhlQ29tcGlsZXItPnVzZUNvb3BlcmF0aXZlR0MoKSwgY3VycmVudEJsb2NrKSwKLSAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgCi0gICAgICBjYXNlIElBTE9BRCA6IHsKLSAgICAgICAgVmFsdWUqIGluZGV4ID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBvYmogPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIHB0ciA9IHZlcmlmeUFuZENvbXB1dGVQdHIob2JqLCBpbmRleCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPkphdmFBcnJheVNJbnQzMlR5cGUpOwotICAgICAgICBwdXNoKG5ldyBMb2FkSW5zdChwdHIsICIiLCBjdXJyZW50QmxvY2spLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIExBTE9BRCA6IHsKLSAgICAgICAgVmFsdWUqIGluZGV4ID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBvYmogPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIHB0ciA9IHZlcmlmeUFuZENvbXB1dGVQdHIob2JqLCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmluc2ljcy0+SmF2YUFycmF5TG9uZ1R5cGUpOwotICAgICAgICBwdXNoKG5ldyBMb2FkSW5zdChwdHIsICIiLCBjdXJyZW50QmxvY2spLCBmYWxzZSk7Ci0gICAgICAgIHB1c2goaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIEZBTE9BRCA6IHsKLSAgICAgICAgVmFsdWUqIGluZGV4ID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBvYmogPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIHB0ciA9IHZlcmlmeUFuZENvbXB1dGVQdHIob2JqLCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmluc2ljcy0+SmF2YUFycmF5RmxvYXRUeXBlKTsKLSAgICAgICAgcHVzaChuZXcgTG9hZEluc3QocHRyLCAiIiwgY3VycmVudEJsb2NrKSwgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBEQUxPQUQgOiB7Ci0gICAgICAgIFZhbHVlKiBpbmRleCA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogb2JqID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBwdHIgPSB2ZXJpZnlBbmRDb21wdXRlUHRyKG9iaiwgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPkphdmFBcnJheURvdWJsZVR5cGUpOwotICAgICAgICBwdXNoKG5ldyBMb2FkSW5zdChwdHIsICIiLCBjdXJyZW50QmxvY2spLCBmYWxzZSk7Ci0gICAgICAgIHB1c2goaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIEFBTE9BRCA6IHsKLSAgICAgICAgVmFsdWUqIGluZGV4ID0gcG9wKCk7Ci0gICAgICAgIENvbW1vbkNsYXNzKiBjbCA9IHRvcFR5cGVJbmZvKCk7Ci0gICAgICAgIFZhbHVlKiBvYmogPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIHB0ciA9IHZlcmlmeUFuZENvbXB1dGVQdHIob2JqLCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmluc2ljcy0+SmF2YUFycmF5T2JqZWN0VHlwZSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY2wtPmlzQXJyYXkoKSkgY2wgPSBjbC0+YXNBcnJheUNsYXNzKCktPmJhc2VDbGFzcygpOwotICAgICAgICBwdXNoKG5ldyBMb2FkSW5zdChwdHIsICIiLCBjdXJyZW50QmxvY2spLCBmYWxzZSwgY2wpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBCQUxPQUQgOiB7Ci0gICAgICAgIFZhbHVlKiBpbmRleCA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogb2JqID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBwdHIgPSB2ZXJpZnlBbmRDb21wdXRlUHRyKG9iaiwgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPkphdmFBcnJheVNJbnQ4VHlwZSk7Ci0gICAgICAgIFZhbHVlKiB2YWwgPSBuZXcgTG9hZEluc3QocHRyLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgcHVzaChuZXcgU0V4dEluc3QodmFsLCBUeXBlOjpnZXRJbnQzMlR5KCpsbHZtQ29udGV4dCksICIiLCBjdXJyZW50QmxvY2spLAotICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgQ0FMT0FEIDogewotICAgICAgICBWYWx1ZSogaW5kZXggPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIG9iaiA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogcHRyID0gdmVyaWZ5QW5kQ29tcHV0ZVB0cihvYmosIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5KYXZhQXJyYXlVSW50MTZUeXBlKTsKLSAgICAgICAgVmFsdWUqIHZhbCA9IG5ldyBMb2FkSW5zdChwdHIsICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICBwdXNoKG5ldyBaRXh0SW5zdCh2YWwsIFR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSwgIiIsIGN1cnJlbnRCbG9jayksCi0gICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBTQUxPQUQgOiB7Ci0gICAgICAgIFZhbHVlKiBpbmRleCA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogb2JqID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBwdHIgPSB2ZXJpZnlBbmRDb21wdXRlUHRyKG9iaiwgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPkphdmFBcnJheVNJbnQxNlR5cGUpOwotICAgICAgICBWYWx1ZSogdmFsID0gbmV3IExvYWRJbnN0KHB0ciwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIHB1c2gobmV3IFNFeHRJbnN0KHZhbCwgVHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpLCAiIiwgY3VycmVudEJsb2NrKSwKLSAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIElTVE9SRSA6IHsKLSAgICAgICAgVmFsdWUqIHZhbCA9IHBvcEFzSW50KCk7Ci0gICAgICAgIG5ldyBTdG9yZUluc3QodmFsLCBpbnRMb2NhbHNbV1JFQURfVTEocmVhZGVyLCBmYWxzZSwgaSwgd2lkZSldLAotICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBMU1RPUkUgOgotICAgICAgICBwb3AoKTsgLy8gcmVtb3ZlIHRoZSAwIG9uIHRoZSBzdGFjawotICAgICAgICBuZXcgU3RvcmVJbnN0KHBvcCgpLCBsb25nTG9jYWxzW1dSRUFEX1UxKHJlYWRlciwgZmFsc2UsIGksIHdpZGUpXSwKLSAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICAgIGNhc2UgRlNUT1JFIDoKLSAgICAgICAgbmV3IFN0b3JlSW5zdChwb3AoKSwgZmxvYXRMb2NhbHNbV1JFQURfVTEocmVhZGVyLCBmYWxzZSwgaSwgd2lkZSldLAotICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBEU1RPUkUgOgotICAgICAgICBwb3AoKTsgLy8gcmVtb3ZlIHRoZSAwIG9uIHRoZSBzdGFjawotICAgICAgICBuZXcgU3RvcmVJbnN0KHBvcCgpLCBkb3VibGVMb2NhbHNbV1JFQURfVTEocmVhZGVyLCBmYWxzZSwgaSwgd2lkZSldLAotICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBBU1RPUkUgOiB7Ci0gICAgICAgIENvbW1vbkNsYXNzKiBjbCA9IHRvcFR5cGVJbmZvKCk7Ci0gICAgICAgIEluc3RydWN0aW9uKiBWID0KLSAgICAgICAgICBuZXcgU3RvcmVJbnN0KHBvcCgpLCBvYmplY3RMb2NhbHNbV1JFQURfVTEocmVhZGVyLCBmYWxzZSwgaSwgd2lkZSldLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIGFkZEhpZ2hMZXZlbFR5cGUoViwgY2wpOwotICAgICAgICBicmVhazsKLSAgICAgIH0gCi0gICAgICBjYXNlIElTVE9SRV8wIDogewotICAgICAgICBWYWx1ZSogdmFsID0gcG9wKCk7Ci0gICAgICAgIGlmICh2YWwtPmdldFR5cGUoKSAhPSBUeXBlOjpnZXRJbnQzMlR5KCpsbHZtQ29udGV4dCkpIC8vIGludDggYW5kIGludDE2Ci0gICAgICAgICAgdmFsID0gbmV3IFpFeHRJbnN0KHZhbCwgVHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgbmV3IFN0b3JlSW5zdCh2YWwsIGludExvY2Fsc1swXSwgZmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIElTVE9SRV8xIDogewotICAgICAgICBWYWx1ZSogdmFsID0gcG9wKCk7Ci0gICAgICAgIGlmICh2YWwtPmdldFR5cGUoKSAhPSBUeXBlOjpnZXRJbnQzMlR5KCpsbHZtQ29udGV4dCkpIC8vIGludDggYW5kIGludDE2Ci0gICAgICAgICAgdmFsID0gbmV3IFpFeHRJbnN0KHZhbCwgVHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgbmV3IFN0b3JlSW5zdCh2YWwsIGludExvY2Fsc1sxXSwgZmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIElTVE9SRV8yIDogewotICAgICAgICBWYWx1ZSogdmFsID0gcG9wKCk7Ci0gICAgICAgIGlmICh2YWwtPmdldFR5cGUoKSAhPSBUeXBlOjpnZXRJbnQzMlR5KCpsbHZtQ29udGV4dCkpIC8vIGludDggYW5kIGludDE2Ci0gICAgICAgICAgdmFsID0gbmV3IFpFeHRJbnN0KHZhbCwgVHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgbmV3IFN0b3JlSW5zdCh2YWwsIGludExvY2Fsc1syXSwgZmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIElTVE9SRV8zIDogewotICAgICAgICBWYWx1ZSogdmFsID0gcG9wKCk7Ci0gICAgICAgIGlmICh2YWwtPmdldFR5cGUoKSAhPSBUeXBlOjpnZXRJbnQzMlR5KCpsbHZtQ29udGV4dCkpIC8vIGludDggYW5kIGludDE2Ci0gICAgICAgICAgdmFsID0gbmV3IFpFeHRJbnN0KHZhbCwgVHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgbmV3IFN0b3JlSW5zdCh2YWwsIGludExvY2Fsc1szXSwgZmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIExTVE9SRV8wIDoKLSAgICAgICAgcG9wKCk7IC8vIHJlbW92ZSB0aGUgMCBvbiB0aGUgc3RhY2sKLSAgICAgICAgbmV3IFN0b3JlSW5zdChwb3AoKSwgbG9uZ0xvY2Fsc1swXSwgZmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgCi0gICAgICBjYXNlIExTVE9SRV8xIDoKLSAgICAgICAgcG9wKCk7IC8vIHJlbW92ZSB0aGUgMCBvbiB0aGUgc3RhY2sKLSAgICAgICAgbmV3IFN0b3JlSW5zdChwb3AoKSwgbG9uZ0xvY2Fsc1sxXSwgZmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgCi0gICAgICBjYXNlIExTVE9SRV8yIDoKLSAgICAgICAgcG9wKCk7IC8vIHJlbW92ZSB0aGUgMCBvbiB0aGUgc3RhY2sKLSAgICAgICAgbmV3IFN0b3JlSW5zdChwb3AoKSwgbG9uZ0xvY2Fsc1syXSwgZmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgCi0gICAgICBjYXNlIExTVE9SRV8zIDoKLSAgICAgICAgcG9wKCk7IC8vIHJlbW92ZSB0aGUgMCBvbiB0aGUgc3RhY2sKLSAgICAgICAgbmV3IFN0b3JlSW5zdChwb3AoKSwgbG9uZ0xvY2Fsc1szXSwgZmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgCi0gICAgICBjYXNlIEZTVE9SRV8wIDoKLSAgICAgICAgbmV3IFN0b3JlSW5zdChwb3AoKSwgZmxvYXRMb2NhbHNbMF0sIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBGU1RPUkVfMSA6Ci0gICAgICAgIG5ldyBTdG9yZUluc3QocG9wKCksIGZsb2F0TG9jYWxzWzFdLCBmYWxzZSwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICAgIGNhc2UgRlNUT1JFXzIgOgotICAgICAgICBuZXcgU3RvcmVJbnN0KHBvcCgpLCBmbG9hdExvY2Fsc1syXSwgZmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgCi0gICAgICBjYXNlIEZTVE9SRV8zIDoKLSAgICAgICAgbmV3IFN0b3JlSW5zdChwb3AoKSwgZmxvYXRMb2NhbHNbM10sIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBEU1RPUkVfMCA6Ci0gICAgICAgIHBvcCgpOyAvLyByZW1vdmUgdGhlIDAgb24gdGhlIHN0YWNrCi0gICAgICAgIG5ldyBTdG9yZUluc3QocG9wKCksIGRvdWJsZUxvY2Fsc1swXSwgZmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgCi0gICAgICBjYXNlIERTVE9SRV8xIDoKLSAgICAgICAgcG9wKCk7IC8vIHJlbW92ZSB0aGUgMCBvbiB0aGUgc3RhY2sKLSAgICAgICAgbmV3IFN0b3JlSW5zdChwb3AoKSwgZG91YmxlTG9jYWxzWzFdLCBmYWxzZSwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICAgIGNhc2UgRFNUT1JFXzIgOgotICAgICAgICBwb3AoKTsgLy8gcmVtb3ZlIHRoZSAwIG9uIHRoZSBzdGFjawotICAgICAgICBuZXcgU3RvcmVJbnN0KHBvcCgpLCBkb3VibGVMb2NhbHNbMl0sIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBEU1RPUkVfMyA6Ci0gICAgICAgIHBvcCgpOyAvLyByZW1vdmUgdGhlIDAgb24gdGhlIHN0YWNrCi0gICAgICAgIG5ldyBTdG9yZUluc3QocG9wKCksIGRvdWJsZUxvY2Fsc1szXSwgZmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgCi0gICAgICBjYXNlIEFTVE9SRV8wIDogewotICAgICAgICBDb21tb25DbGFzcyogY2wgPSB0b3BUeXBlSW5mbygpOwotICAgICAgICBJbnN0cnVjdGlvbiogViA9IG5ldyBTdG9yZUluc3QocG9wKCksIG9iamVjdExvY2Fsc1swXSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICAgICAgICBhZGRIaWdoTGV2ZWxUeXBlKFYsIGNsKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgQVNUT1JFXzEgOiB7Ci0gICAgICAgIENvbW1vbkNsYXNzKiBjbCA9IHRvcFR5cGVJbmZvKCk7Ci0gICAgICAgIEluc3RydWN0aW9uKiBWID0gbmV3IFN0b3JlSW5zdChwb3AoKSwgb2JqZWN0TG9jYWxzWzFdLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIGFkZEhpZ2hMZXZlbFR5cGUoViwgY2wpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBBU1RPUkVfMiA6IHsKLSAgICAgICAgQ29tbW9uQ2xhc3MqIGNsID0gdG9wVHlwZUluZm8oKTsKLSAgICAgICAgSW5zdHJ1Y3Rpb24qIFYgPSBuZXcgU3RvcmVJbnN0KHBvcCgpLCBvYmplY3RMb2NhbHNbMl0sIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgICAgICAgYWRkSGlnaExldmVsVHlwZShWLCBjbCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIEFTVE9SRV8zIDogewotICAgICAgICBDb21tb25DbGFzcyogY2wgPSB0b3BUeXBlSW5mbygpOwotICAgICAgICBJbnN0cnVjdGlvbiogViA9IG5ldyBTdG9yZUluc3QocG9wKCksIG9iamVjdExvY2Fsc1szXSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICAgICAgICBhZGRIaWdoTGV2ZWxUeXBlKFYsIGNsKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgSUFTVE9SRSA6IHsKLSAgICAgICAgVmFsdWUqIHZhbCA9IHBvcEFzSW50KCk7Ci0gICAgICAgIFZhbHVlKiBpbmRleCA9IHBvcEFzSW50KCk7Ci0gICAgICAgIFZhbHVlKiBvYmogPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIHB0ciA9IHZlcmlmeUFuZENvbXB1dGVQdHIob2JqLCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmluc2ljcy0+SmF2YUFycmF5U0ludDMyVHlwZSk7Ci0gICAgICAgIG5ldyBTdG9yZUluc3QodmFsLCBwdHIsIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBMQVNUT1JFIDogewotICAgICAgICBwb3AoKTsgLy8gcmVtb3ZlIHRoZSAwIG9uIHN0YWNrCi0gICAgICAgIFZhbHVlKiB2YWwgPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIGluZGV4ID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBvYmogPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIHB0ciA9IHZlcmlmeUFuZENvbXB1dGVQdHIob2JqLCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmluc2ljcy0+SmF2YUFycmF5TG9uZ1R5cGUpOwotICAgICAgICBuZXcgU3RvcmVJbnN0KHZhbCwgcHRyLCBmYWxzZSwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgRkFTVE9SRSA6IHsKLSAgICAgICAgVmFsdWUqIHZhbCA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogaW5kZXggPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIG9iaiA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogcHRyID0gdmVyaWZ5QW5kQ29tcHV0ZVB0cihvYmosIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5KYXZhQXJyYXlGbG9hdFR5cGUpOwotICAgICAgICBuZXcgU3RvcmVJbnN0KHZhbCwgcHRyLCBmYWxzZSwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgREFTVE9SRSA6IHsKLSAgICAgICAgcG9wKCk7IC8vIHJlbW92ZSB0aGUgMCBvbiBzdGFjawotICAgICAgICBWYWx1ZSogdmFsID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBpbmRleCA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogb2JqID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBwdHIgPSB2ZXJpZnlBbmRDb21wdXRlUHRyKG9iaiwgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPkphdmFBcnJheURvdWJsZVR5cGUpOwotICAgICAgICBuZXcgU3RvcmVJbnN0KHZhbCwgcHRyLCBmYWxzZSwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgQUFTVE9SRSA6IHsKLSAgICAgICAgaWYgKFRoZUNvbXBpbGVyLT5oYXNFeGNlcHRpb25zRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgLy8gR2V0IHZhbCBhbmQgb2JqZWN0IGFuZCBkb24ndCBwb3AgdGhlbTogSXNBc3NpZ25hYmxlRnJvbUZ1bmN0aW9uCi0gICAgICAgICAgLy8gbWF5IGdvIGludG8gcnVudGltZSBhbmQgd2UgZG9uJ3Qgd2FudCB2YWx1ZXMgaW4gcmVnaXN0ZXJzIGF0IHRoYXQKLSAgICAgICAgICAvLyBwb2ludC4KLSAgICAgICAgICBWYWx1ZSogdmFsID0gbmV3IExvYWRJbnN0KG9iamVjdFN0YWNrW2N1cnJlbnRTdGFja0luZGV4IC0gMV0sICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlQ29tcGlsZXItPnVzZUNvb3BlcmF0aXZlR0MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgICAgVmFsdWUqIG9iaiA9IG5ldyBMb2FkSW5zdChvYmplY3RTdGFja1tjdXJyZW50U3RhY2tJbmRleCAtIDNdLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZUNvbXBpbGVyLT51c2VDb29wZXJhdGl2ZUdDKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICAgICAgICAgIFZhbHVlKiBjbXAgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfRVEsIHZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPkphdmFPYmplY3ROdWxsQ29uc3RhbnQsICIiKTsKLQotICAgICAgICAgIEJhc2ljQmxvY2sqIGVuZEJsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygiZW5kIGFycmF5IHN0b3JlIGNoZWNrIik7Ci0gICAgICAgICAgQmFzaWNCbG9jayogY2hlY2tCbG9jayA9IGNyZWF0ZUJhc2ljQmxvY2soImFycmF5IHN0b3JlIGNoZWNrIik7Ci0gICAgICAgICAgQmFzaWNCbG9jayogZXhjZXB0aW9uQmxvY2sgPSAKLSAgICAgICAgICAgIGNyZWF0ZUJhc2ljQmxvY2soImFycmF5IHN0b3JlIGV4Y2VwdGlvbiIpOwotICAgICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShlbmRCbG9jaywgY2hlY2tCbG9jaywgY21wLCBjdXJyZW50QmxvY2spOwotICAgICAgICAgIGN1cnJlbnRCbG9jayA9IGNoZWNrQmxvY2s7Ci0gICAgICAgIAotICAgICAgICAgIFZhbHVlKiB2YWxWVCA9IENhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+R2V0VlRGdW5jdGlvbiwgdmFsLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgICAKLSAgICAgICAgICBWYWx1ZSogb2JqVlQgPSBDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPkdldFZURnVuY3Rpb24sIG9iaiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICAgICAgICAgIG9ialZUID0gQ2FsbEluc3Q6OkNyZWF0ZShpbnRyaW5zaWNzLT5HZXRCYXNlQ2xhc3NWVEZyb21WVEZ1bmN0aW9uLCBvYmpWVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgICAgCi0gICAgICAgICAgVmFsdWUqIFZUQXJnc1syXSA9IHsgdmFsVlQsIG9ialZUIH07Ci0gICAgICAgICAgCi0gICAgICAgICAgVmFsdWUqIHJlcyA9IENhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+SXNBc3NpZ25hYmxlRnJvbUZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZUQXJncywgVlRBcmdzICsgMiwgIiIsIGN1cnJlbnRCbG9jayk7Ci0KLSAgICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoZW5kQmxvY2ssIGV4Y2VwdGlvbkJsb2NrLCByZXMsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgICAgCi0gICAgICAgICAgY3VycmVudEJsb2NrID0gZXhjZXB0aW9uQmxvY2s7Ci0gICAgICAgICAgdGhyb3dFeGNlcHRpb24oaW50cmluc2ljcy0+QXJyYXlTdG9yZUV4Y2VwdGlvbkZ1bmN0aW9uLCBWVEFyZ3MsIDIpOwotCi0gICAgICAgICAgY3VycmVudEJsb2NrID0gZW5kQmxvY2s7Ci0gICAgICAgIH0KLSAgICAgICAgVmFsdWUqIHZhbCA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogaW5kZXggPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIG9iaiA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogcHRyID0gdmVyaWZ5QW5kQ29tcHV0ZVB0cihvYmosIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5KYXZhQXJyYXlPYmplY3RUeXBlKTsKLQotICAgICAgICBuZXcgU3RvcmVJbnN0KHZhbCwgcHRyLCBmYWxzZSwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgQkFTVE9SRSA6IHsKLSAgICAgICAgVmFsdWUqIHZhbCA9IHBvcCgpOwotICAgICAgICBpZiAodmFsLT5nZXRUeXBlKCkgIT0gVHlwZTo6Z2V0SW50OFR5KCpsbHZtQ29udGV4dCkpIHsKLSAgICAgICAgICB2YWwgPSBuZXcgVHJ1bmNJbnN0KHZhbCwgVHlwZTo6Z2V0SW50OFR5KCpsbHZtQ29udGV4dCksICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICB9Ci0gICAgICAgIFZhbHVlKiBpbmRleCA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogb2JqID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBwdHIgPSB2ZXJpZnlBbmRDb21wdXRlUHRyKG9iaiwgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPkphdmFBcnJheVNJbnQ4VHlwZSk7Ci0gICAgICAgIG5ldyBTdG9yZUluc3QodmFsLCBwdHIsIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBDQVNUT1JFIDogewotICAgICAgICBWYWx1ZSogdmFsID0gcG9wKCk7Ci0gICAgICAgIGNvbnN0IFR5cGUqIHR5cGUgPSB2YWwtPmdldFR5cGUoKTsKLSAgICAgICAgaWYgKHR5cGUgPT0gVHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpKSB7Ci0gICAgICAgICAgdmFsID0gbmV3IFRydW5jSW5zdCh2YWwsIFR5cGU6OmdldEludDE2VHkoKmxsdm1Db250ZXh0KSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBUeXBlOjpnZXRJbnQ4VHkoKmxsdm1Db250ZXh0KSkgewotICAgICAgICAgIHZhbCA9IG5ldyBaRXh0SW5zdCh2YWwsIFR5cGU6OmdldEludDE2VHkoKmxsdm1Db250ZXh0KSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIH0KLSAgICAgICAgVmFsdWUqIGluZGV4ID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBvYmogPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIHB0ciA9IHZlcmlmeUFuZENvbXB1dGVQdHIob2JqLCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmluc2ljcy0+SmF2YUFycmF5VUludDE2VHlwZSk7Ci0gICAgICAgIG5ldyBTdG9yZUluc3QodmFsLCBwdHIsIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBTQVNUT1JFIDogewotICAgICAgICBWYWx1ZSogdmFsID0gcG9wKCk7Ci0gICAgICAgIGNvbnN0IFR5cGUqIHR5cGUgPSB2YWwtPmdldFR5cGUoKTsKLSAgICAgICAgaWYgKHR5cGUgPT0gVHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpKSB7Ci0gICAgICAgICAgdmFsID0gbmV3IFRydW5jSW5zdCh2YWwsIFR5cGU6OmdldEludDE2VHkoKmxsdm1Db250ZXh0KSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBUeXBlOjpnZXRJbnQ4VHkoKmxsdm1Db250ZXh0KSkgewotICAgICAgICAgIHZhbCA9IG5ldyBTRXh0SW5zdCh2YWwsIFR5cGU6OmdldEludDE2VHkoKmxsdm1Db250ZXh0KSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIH0KLSAgICAgICAgVmFsdWUqIGluZGV4ID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBvYmogPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIHB0ciA9IHZlcmlmeUFuZENvbXB1dGVQdHIob2JqLCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmluc2ljcy0+SmF2YUFycmF5U0ludDE2VHlwZSk7Ci0gICAgICAgIG5ldyBTdG9yZUluc3QodmFsLCBwdHIsIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBQT1AgOgotICAgICAgICBwb3AoKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgUE9QMiA6Ci0gICAgICAgIHBvcCgpOyBwb3AoKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRFVQIDoKLSAgICAgICAgcHVzaCh0b3AoKSwgZmFsc2UsIHRvcFR5cGVJbmZvKCkpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBEVVBfWDEgOiB7Ci0gICAgICAgIENvbW1vbkNsYXNzKiBvbmVDbCA9IHRvcFR5cGVJbmZvKCk7Ci0gICAgICAgIFZhbHVlKiBvbmUgPSBwb3AoKTsKLSAgICAgICAgQ29tbW9uQ2xhc3MqIHR3b0NsID0gdG9wVHlwZUluZm8oKTsKLSAgICAgICAgVmFsdWUqIHR3byA9IHBvcCgpOwotICAgICAgICAKLSAgICAgICAgcHVzaChvbmUsIGZhbHNlLCBvbmVDbCk7Ci0gICAgICAgIHB1c2godHdvLCBmYWxzZSwgdHdvQ2wpOwotICAgICAgICBwdXNoKG9uZSwgZmFsc2UsIG9uZUNsKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgRFVQX1gyIDogewotICAgICAgICBDb21tb25DbGFzcyogb25lQ2wgPSB0b3BUeXBlSW5mbygpOwotICAgICAgICBWYWx1ZSogb25lID0gcG9wKCk7Ci0gICAgICAgIENvbW1vbkNsYXNzKiB0d29DbCA9IHRvcFR5cGVJbmZvKCk7Ci0gICAgICAgIFZhbHVlKiB0d28gPSBwb3AoKTsKLSAgICAgICAgQ29tbW9uQ2xhc3MqIHRocmVlQ2wgPSB0b3BUeXBlSW5mbygpOwotICAgICAgICBWYWx1ZSogdGhyZWUgPSBwb3AoKTsKLQotICAgICAgICBwdXNoKG9uZSwgZmFsc2UsIG9uZUNsKTsKLSAgICAgICAgcHVzaCh0aHJlZSwgZmFsc2UsIHRocmVlQ2wpOwotICAgICAgICBwdXNoKHR3bywgZmFsc2UsIHR3b0NsKTsKLSAgICAgICAgcHVzaChvbmUsIGZhbHNlLCBvbmVDbCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIERVUDIgOiB7Ci0gICAgICAgIENvbW1vbkNsYXNzKiBvbmVDbCA9IHRvcFR5cGVJbmZvKCk7Ci0gICAgICAgIFZhbHVlKiBvbmUgPSBwb3AoKTsKLSAgICAgICAgQ29tbW9uQ2xhc3MqIHR3b0NsID0gdG9wVHlwZUluZm8oKTsKLSAgICAgICAgVmFsdWUqIHR3byA9IHBvcCgpOwotICAgICAgICAKLSAgICAgICAgcHVzaCh0d28sIGZhbHNlLCB0d29DbCk7Ci0gICAgICAgIHB1c2gob25lLCBmYWxzZSwgb25lQ2wpOwotICAgICAgICBwdXNoKHR3bywgZmFsc2UsIHR3b0NsKTsKLSAgICAgICAgcHVzaChvbmUsIGZhbHNlLCBvbmVDbCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIERVUDJfWDEgOiB7Ci0gICAgICAgIENvbW1vbkNsYXNzKiBvbmVDbCA9IHRvcFR5cGVJbmZvKCk7Ci0gICAgICAgIFZhbHVlKiBvbmUgPSBwb3AoKTsKLSAgICAgICAgQ29tbW9uQ2xhc3MqIHR3b0NsID0gdG9wVHlwZUluZm8oKTsKLSAgICAgICAgVmFsdWUqIHR3byA9IHBvcCgpOwotICAgICAgICBDb21tb25DbGFzcyogdGhyZWVDbCA9IHRvcFR5cGVJbmZvKCk7Ci0gICAgICAgIFZhbHVlKiB0aHJlZSA9IHBvcCgpOwotCi0gICAgICAgIHB1c2godHdvLCBmYWxzZSwgdHdvQ2wpOwotICAgICAgICBwdXNoKG9uZSwgZmFsc2UsIG9uZUNsKTsKLQotICAgICAgICBwdXNoKHRocmVlLCBmYWxzZSwgdGhyZWVDbCk7Ci0gICAgICAgIHB1c2godHdvLCBmYWxzZSwgdHdvQ2wpOwotICAgICAgICBwdXNoKG9uZSwgZmFsc2UsIG9uZUNsKTsKLQotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBEVVAyX1gyIDogewotICAgICAgICBDb21tb25DbGFzcyogb25lQ2wgPSB0b3BUeXBlSW5mbygpOwotICAgICAgICBWYWx1ZSogb25lID0gcG9wKCk7Ci0gICAgICAgIENvbW1vbkNsYXNzKiB0d29DbCA9IHRvcFR5cGVJbmZvKCk7Ci0gICAgICAgIFZhbHVlKiB0d28gPSBwb3AoKTsKLSAgICAgICAgQ29tbW9uQ2xhc3MqIHRocmVlQ2wgPSB0b3BUeXBlSW5mbygpOwotICAgICAgICBWYWx1ZSogdGhyZWUgPSBwb3AoKTsKLSAgICAgICAgQ29tbW9uQ2xhc3MqIGZvdXJDbCA9IHRvcFR5cGVJbmZvKCk7Ci0gICAgICAgIFZhbHVlKiBmb3VyID0gcG9wKCk7Ci0KLSAgICAgICAgcHVzaCh0d28sIGZhbHNlLCB0d29DbCk7Ci0gICAgICAgIHB1c2gob25lLCBmYWxzZSwgb25lQ2wpOwotICAgICAgICAKLSAgICAgICAgcHVzaChmb3VyLCBmYWxzZSwgZm91ckNsKTsKLSAgICAgICAgcHVzaCh0aHJlZSwgZmFsc2UsIHRocmVlQ2wpOwotICAgICAgICBwdXNoKHR3bywgZmFsc2UsIHR3b0NsKTsKLSAgICAgICAgcHVzaChvbmUsIGZhbHNlLCBvbmVDbCk7Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgU1dBUCA6IHsKLSAgICAgICAgQ29tbW9uQ2xhc3MqIG9uZUNsID0gdG9wVHlwZUluZm8oKTsKLSAgICAgICAgVmFsdWUqIG9uZSA9IHBvcCgpOwotICAgICAgICBDb21tb25DbGFzcyogdHdvQ2wgPSB0b3BUeXBlSW5mbygpOwotICAgICAgICBWYWx1ZSogdHdvID0gcG9wKCk7Ci0gICAgICAgIHB1c2gob25lLCBmYWxzZSwgb25lQ2wpOwotICAgICAgICBwdXNoKHR3bywgZmFsc2UsIHR3b0NsKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgSUFERCA6IHsKLSAgICAgICAgVmFsdWUqIHZhbDIgPSBwb3BBc0ludCgpOwotICAgICAgICBWYWx1ZSogdmFsMSA9IHBvcEFzSW50KCk7Ci0gICAgICAgIHB1c2goQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFkZCh2YWwxLCB2YWwyLCAiIiwgY3VycmVudEJsb2NrKSwKLSAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIExBREQgOiB7Ci0gICAgICAgIHBvcCgpOwotICAgICAgICBsbHZtOjpWYWx1ZSogdmFsMiA9IHBvcCgpOwotICAgICAgICBwb3AoKTsKLSAgICAgICAgbGx2bTo6VmFsdWUqIHZhbDEgPSBwb3AoKTsKLSAgICAgICAgcHVzaChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQWRkKHZhbDEsIHZhbDIsICIiLCBjdXJyZW50QmxvY2spLAotICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgcHVzaChpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgRkFERCA6IHsKLSAgICAgICAgVmFsdWUqIHZhbDIgPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIHZhbDEgPSBwb3AoKTsKLSAgICAgICAgcHVzaChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRkFkZCh2YWwxLCB2YWwyLCAiIiwgY3VycmVudEJsb2NrKSwKLSAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIERBREQgOiB7Ci0gICAgICAgIHBvcCgpOwotICAgICAgICBsbHZtOjpWYWx1ZSogdmFsMiA9IHBvcCgpOwotICAgICAgICBwb3AoKTsKLSAgICAgICAgbGx2bTo6VmFsdWUqIHZhbDEgPSBwb3AoKTsKLSAgICAgICAgcHVzaChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRkFkZCh2YWwxLCB2YWwyLCAiIiwgY3VycmVudEJsb2NrKSwKLSAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIHB1c2goaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIElTVUIgOiB7Ci0gICAgICAgIFZhbHVlKiB2YWwyID0gcG9wQXNJbnQoKTsKLSAgICAgICAgVmFsdWUqIHZhbDEgPSBwb3BBc0ludCgpOwotICAgICAgICBwdXNoKEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVTdWIodmFsMSwgdmFsMiwgIiIsIGN1cnJlbnRCbG9jayksCi0gICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTFNVQiA6IHsKLSAgICAgICAgcG9wKCk7Ci0gICAgICAgIGxsdm06OlZhbHVlKiB2YWwyID0gcG9wKCk7Ci0gICAgICAgIHBvcCgpOwotICAgICAgICBsbHZtOjpWYWx1ZSogdmFsMSA9IHBvcCgpOwotICAgICAgICBwdXNoKEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVTdWIodmFsMSwgdmFsMiwgIiIsIGN1cnJlbnRCbG9jayksCi0gICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICBwdXNoKGludHJpbnNpY3MtPmNvbnN0YW50WmVybywgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBGU1VCIDogewotICAgICAgICBWYWx1ZSogdmFsMiA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogdmFsMSA9IHBvcCgpOwotICAgICAgICBwdXNoKEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVGU3ViKHZhbDEsIHZhbDIsICIiLCBjdXJyZW50QmxvY2spLAotICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgRFNVQiA6IHsKLSAgICAgICAgcG9wKCk7Ci0gICAgICAgIGxsdm06OlZhbHVlKiB2YWwyID0gcG9wKCk7Ci0gICAgICAgIHBvcCgpOwotICAgICAgICBsbHZtOjpWYWx1ZSogdmFsMSA9IHBvcCgpOwotICAgICAgICBwdXNoKEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVGU3ViKHZhbDEsIHZhbDIsICIiLCBjdXJyZW50QmxvY2spLAotICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgcHVzaChpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgSU1VTCA6IHsKLSAgICAgICAgVmFsdWUqIHZhbDIgPSBwb3BBc0ludCgpOwotICAgICAgICBWYWx1ZSogdmFsMSA9IHBvcEFzSW50KCk7Ci0gICAgICAgIHB1c2goQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU11bCh2YWwxLCB2YWwyLCAiIiwgY3VycmVudEJsb2NrKSwKLSAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIExNVUwgOiB7Ci0gICAgICAgIHBvcCgpOwotICAgICAgICBsbHZtOjpWYWx1ZSogdmFsMiA9IHBvcCgpOwotICAgICAgICBwb3AoKTsKLSAgICAgICAgbGx2bTo6VmFsdWUqIHZhbDEgPSBwb3AoKTsKLSAgICAgICAgcHVzaChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTXVsKHZhbDEsIHZhbDIsICIiLCBjdXJyZW50QmxvY2spLAotICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgcHVzaChpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgRk1VTCA6IHsKLSAgICAgICAgVmFsdWUqIHZhbDIgPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIHZhbDEgPSBwb3AoKTsKLSAgICAgICAgcHVzaChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRk11bCh2YWwxLCB2YWwyLCAiIiwgY3VycmVudEJsb2NrKSwKLSAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIERNVUwgOiB7Ci0gICAgICAgIHBvcCgpOwotICAgICAgICBsbHZtOjpWYWx1ZSogdmFsMiA9IHBvcCgpOwotICAgICAgICBwb3AoKTsKLSAgICAgICAgbGx2bTo6VmFsdWUqIHZhbDEgPSBwb3AoKTsKLSAgICAgICAgcHVzaChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRk11bCh2YWwxLCB2YWwyLCAiIiwgY3VycmVudEJsb2NrKSwKLSAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIHB1c2goaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIElESVYgOiB7Ci0gICAgICAgIFZhbHVlKiB2YWwyID0gcG9wQXNJbnQoKTsKLSAgICAgICAgVmFsdWUqIHZhbDEgPSBwb3BBc0ludCgpOwotICAgICAgICBpZiAoVGhlQ29tcGlsZXItPmhhc0V4Y2VwdGlvbnNFbmFibGVkKCkpIHsKLSAgICAgICAgICBWYWx1ZSogY21wID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX0VRLCB2YWwyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCAiIik7Ci0gICAgICAgICAgQmFzaWNCbG9jayogaWZGYWxzZSA9IGNyZWF0ZUJhc2ljQmxvY2soIm5vbiBudWxsIGRpdiIpOwotICAgICAgICAgIEJhc2ljQmxvY2sqIGlmVHJ1ZSA9IGNyZWF0ZUJhc2ljQmxvY2soIm51bGwgZGl2Iik7Ci0KLSAgICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoaWZUcnVlLCBpZkZhbHNlLCBjbXAsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgICAgY3VycmVudEJsb2NrID0gaWZUcnVlOwotICAgICAgICAgIHRocm93RXhjZXB0aW9uKGludHJpbnNpY3MtPkFyaXRobWV0aWNFeGNlcHRpb25GdW5jdGlvbiwgMCwgMCk7Ci0gICAgICAgICAgY3VycmVudEJsb2NrID0gaWZGYWxzZTsgIAotICAgICAgICB9Ci0gICAgICAgIFZhbHVlKiBjbXAgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfRVEsIHZhbDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmluc2ljcy0+Y29uc3RhbnRNaW51c09uZSwgIiIpOwotICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygibm9uIC0xIGRpdiIpOwotICAgICAgICBCYXNpY0Jsb2NrKiBpZlRydWUgPSBjcmVhdGVCYXNpY0Jsb2NrKCItMSBkaXYiKTsKLSAgICAgICAgQmFzaWNCbG9jayogZW5kQmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJFbmQgZGl2aXNpb24iKTsKLSAgICAgICAgUEhJTm9kZSogbm9kZSA9IFBISU5vZGU6OkNyZWF0ZSh2YWwxLT5nZXRUeXBlKCksICIiLCBlbmRCbG9jayk7Ci0gICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShpZlRydWUsIGlmRmFsc2UsIGNtcCwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgY3VycmVudEJsb2NrID0gaWZUcnVlOwotICAgICAgICBub2RlLT5hZGRJbmNvbWluZyhCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU3ViKGludHJpbnNpY3MtPmNvbnN0YW50WmVybywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwxLCAiIiwgY3VycmVudEJsb2NrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKGVuZEJsb2NrLCBjdXJyZW50QmxvY2spOwotICAgICAgICBjdXJyZW50QmxvY2sgPSBpZkZhbHNlOwotICAgICAgICBub2RlLT5hZGRJbmNvbWluZygKLSAgICAgICAgICAgIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVTRGl2KHZhbDEsIHZhbDIsICIiLCBjdXJyZW50QmxvY2spLAotICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKGVuZEJsb2NrLCBjdXJyZW50QmxvY2spOwotICAgICAgICBjdXJyZW50QmxvY2sgPSBlbmRCbG9jazsKLSAgICAgICAgcHVzaChub2RlLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIExESVYgOiB7Ci0gICAgICAgIHBvcCgpOwotICAgICAgICBsbHZtOjpWYWx1ZSogdmFsMiA9IHBvcCgpOwotICAgICAgICBwb3AoKTsKLSAgICAgICAgbGx2bTo6VmFsdWUqIHZhbDEgPSBwb3AoKTsKLSAgICAgICAgaWYgKFRoZUNvbXBpbGVyLT5oYXNFeGNlcHRpb25zRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgVmFsdWUqIGNtcCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9FUSwgdmFsMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPmNvbnN0YW50TG9uZ1plcm8sICIiKTsKLSAgICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygibm9uIG51bGwgZGl2Iik7Ci0gICAgICAgICAgQmFzaWNCbG9jayogaWZUcnVlID0gY3JlYXRlQmFzaWNCbG9jaygibnVsbCBkaXYiKTsKLQotICAgICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShpZlRydWUsIGlmRmFsc2UsIGNtcCwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgICBjdXJyZW50QmxvY2sgPSBpZlRydWU7Ci0gICAgICAgICAgdGhyb3dFeGNlcHRpb24oaW50cmluc2ljcy0+QXJpdGhtZXRpY0V4Y2VwdGlvbkZ1bmN0aW9uLCAwLCAwKTsKLSAgICAgICAgICBjdXJyZW50QmxvY2sgPSBpZkZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHB1c2goQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVNEaXYodmFsMSwgdmFsMiwgIiIsIGN1cnJlbnRCbG9jayksCi0gICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICBwdXNoKGludHJpbnNpY3MtPmNvbnN0YW50WmVybywgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBGRElWIDogewotICAgICAgICBWYWx1ZSogdmFsMiA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogdmFsMSA9IHBvcCgpOwotICAgICAgICBwdXNoKEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVGRGl2KHZhbDEsIHZhbDIsICIiLCBjdXJyZW50QmxvY2spLAotICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgRERJViA6IHsKLSAgICAgICAgcG9wKCk7Ci0gICAgICAgIGxsdm06OlZhbHVlKiB2YWwyID0gcG9wKCk7Ci0gICAgICAgIHBvcCgpOwotICAgICAgICBsbHZtOjpWYWx1ZSogdmFsMSA9IHBvcCgpOwotICAgICAgICBwdXNoKEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVGRGl2KHZhbDEsIHZhbDIsICIiLCBjdXJyZW50QmxvY2spLAotICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgcHVzaChpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgSVJFTSA6IHsKLSAgICAgICAgVmFsdWUqIHZhbDIgPSBwb3BBc0ludCgpOwotICAgICAgICBWYWx1ZSogdmFsMSA9IHBvcEFzSW50KCk7Ci0gICAgICAgIGlmIChUaGVDb21waWxlci0+aGFzRXhjZXB0aW9uc0VuYWJsZWQoKSkgewotICAgICAgICAgIFZhbHVlKiBjbXAgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfRVEsIHZhbDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sICIiKTsKLSAgICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygibm9uIG51bGwgcmVtIik7Ci0gICAgICAgICAgQmFzaWNCbG9jayogaWZUcnVlID0gY3JlYXRlQmFzaWNCbG9jaygibnVsbCByZW0iKTsKLQotICAgICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShpZlRydWUsIGlmRmFsc2UsIGNtcCwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgICBjdXJyZW50QmxvY2sgPSBpZlRydWU7Ci0gICAgICAgICAgdGhyb3dFeGNlcHRpb24oaW50cmluc2ljcy0+QXJpdGhtZXRpY0V4Y2VwdGlvbkZ1bmN0aW9uLCAwLCAwKTsKLSAgICAgICAgICBjdXJyZW50QmxvY2sgPSBpZkZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIFZhbHVlKiBjbXAgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfRVEsIHZhbDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmluc2ljcy0+Y29uc3RhbnRNaW51c09uZSwgIiIpOwotICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygibm9uIC0xIHJlbSIpOwotICAgICAgICBCYXNpY0Jsb2NrKiBlbmRCbG9jayA9IGNyZWF0ZUJhc2ljQmxvY2soImVuZCBibG9jayIpOwotICAgICAgICBQSElOb2RlKiBub2RlID0gUEhJTm9kZTo6Q3JlYXRlKHZhbDEtPmdldFR5cGUoKSwgIiIsIGVuZEJsb2NrKTsKLSAgICAgICAgbm9kZS0+YWRkSW5jb21pbmcoaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCBjdXJyZW50QmxvY2spOwotICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoZW5kQmxvY2ssIGlmRmFsc2UsIGNtcCwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgY3VycmVudEJsb2NrID0gaWZGYWxzZTsKLSAgICAgICAgbm9kZS0+YWRkSW5jb21pbmcoCi0gICAgICAgICAgICBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU1JlbSh2YWwxLCB2YWwyLCAiIiwgY3VycmVudEJsb2NrKSwKLSAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShlbmRCbG9jaywgY3VycmVudEJsb2NrKTsKLSAgICAgICAgY3VycmVudEJsb2NrID0gZW5kQmxvY2s7Ci0gICAgICAgIHB1c2gobm9kZSwgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBMUkVNIDogewotICAgICAgICBwb3AoKTsKLSAgICAgICAgbGx2bTo6VmFsdWUqIHZhbDIgPSBwb3AoKTsKLSAgICAgICAgcG9wKCk7Ci0gICAgICAgIGxsdm06OlZhbHVlKiB2YWwxID0gcG9wKCk7Ci0gICAgICAgIGlmIChUaGVDb21waWxlci0+aGFzRXhjZXB0aW9uc0VuYWJsZWQoKSkgewotICAgICAgICAgIFZhbHVlKiBjbXAgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfRVEsIHZhbDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5jb25zdGFudExvbmdaZXJvLCAiIik7Ci0gICAgICAgICAgQmFzaWNCbG9jayogaWZGYWxzZSA9IGNyZWF0ZUJhc2ljQmxvY2soIm5vbiBudWxsIGRpdiIpOwotICAgICAgICAgIEJhc2ljQmxvY2sqIGlmVHJ1ZSA9IGNyZWF0ZUJhc2ljQmxvY2soIm51bGwgZGl2Iik7Ci0KLSAgICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoaWZUcnVlLCBpZkZhbHNlLCBjbXAsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgICAgY3VycmVudEJsb2NrID0gaWZUcnVlOwotICAgICAgICAgIHRocm93RXhjZXB0aW9uKGludHJpbnNpY3MtPkFyaXRobWV0aWNFeGNlcHRpb25GdW5jdGlvbiwgMCwgMCk7Ci0gICAgICAgICAgY3VycmVudEJsb2NrID0gaWZGYWxzZTsKLSAgICAgICAgfQotICAgICAgICBwdXNoKEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVTUmVtKHZhbDEsIHZhbDIsICIiLCBjdXJyZW50QmxvY2spLAotICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgcHVzaChpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgRlJFTSA6IHsKLSAgICAgICAgVmFsdWUqIHZhbDIgPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIHZhbDEgPSBwb3AoKTsKLSAgICAgICAgcHVzaChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRlJlbSh2YWwxLCB2YWwyLCAiIiwgY3VycmVudEJsb2NrKSwKLSAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIERSRU0gOiB7Ci0gICAgICAgIHBvcCgpOwotICAgICAgICBsbHZtOjpWYWx1ZSogdmFsMiA9IHBvcCgpOwotICAgICAgICBwb3AoKTsKLSAgICAgICAgbGx2bTo6VmFsdWUqIHZhbDEgPSBwb3AoKTsKLSAgICAgICAgcHVzaChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRlJlbSh2YWwxLCB2YWwyLCAiIiwgY3VycmVudEJsb2NrKSwKLSAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIHB1c2goaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIElORUcgOgotICAgICAgICBwdXNoKEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVTdWIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3BBc0ludCgpLCAiIiwgY3VycmVudEJsb2NrKSwKLSAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgCi0gICAgICBjYXNlIExORUcgOiB7Ci0gICAgICAgIHBvcCgpOwotICAgICAgICBwdXNoKEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVTdWIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5jb25zdGFudExvbmdaZXJvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wKCksICIiLCBjdXJyZW50QmxvY2spLCBmYWxzZSk7Ci0gICAgICAgIHB1c2goaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIEZORUcgOgotICAgICAgICBwdXNoKEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVGU3ViKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmluc2ljcy0+Y29uc3RhbnRGbG9hdE1pbnVzWmVybywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcCgpLCAiIiwgY3VycmVudEJsb2NrKSwgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBETkVHIDogewotICAgICAgICBwb3AoKTsKLSAgICAgICAgcHVzaChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRlN1YigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPmNvbnN0YW50RG91YmxlTWludXNaZXJvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wKCksICIiLCBjdXJyZW50QmxvY2spLCBmYWxzZSk7Ci0gICAgICAgIHB1c2goaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIElTSEwgOiB7Ci0gICAgICAgIFZhbHVlKiB2YWwyID0gcG9wQXNJbnQoKTsKLSAgICAgICAgVmFsdWUqIHZhbDEgPSBwb3BBc0ludCgpOwotICAgICAgICBwdXNoKEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVTaGwodmFsMSwgdmFsMiwgIiIsIGN1cnJlbnRCbG9jayksCi0gICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBMU0hMIDogewotICAgICAgICBWYWx1ZSogdmFsMiA9IG5ldyBaRXh0SW5zdChwb3AoKSwgVHlwZTo6Z2V0SW50NjRUeSgqbGx2bUNvbnRleHQpLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgcG9wKCk7IC8vIHJlbW92ZSB0aGUgMCBvbiB0aGUgc3RhY2sKLSAgICAgICAgVmFsdWUqIHZhbDEgPSBwb3AoKTsKLSAgICAgICAgcHVzaChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU2hsKHZhbDEsIHZhbDIsICIiLCBjdXJyZW50QmxvY2spLAotICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgcHVzaChpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgSVNIUiA6IHsKLSAgICAgICAgVmFsdWUqIHZhbDIgPSBwb3BBc0ludCgpOwotICAgICAgICBWYWx1ZSogdmFsMSA9IHBvcEFzSW50KCk7Ci0gICAgICAgIHB1c2goQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFTaHIodmFsMSwgdmFsMiwgIiIsIGN1cnJlbnRCbG9jayksCi0gICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBMU0hSIDogewotICAgICAgICBWYWx1ZSogdmFsMiA9IG5ldyBaRXh0SW5zdChwb3AoKSwgVHlwZTo6Z2V0SW50NjRUeSgqbGx2bUNvbnRleHQpLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgcG9wKCk7IC8vIHJlbW92ZSB0aGUgMCBvbiB0aGUgc3RhY2sKLSAgICAgICAgVmFsdWUqIHZhbDEgPSBwb3AoKTsKLSAgICAgICAgcHVzaChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQVNocih2YWwxLCB2YWwyLCAiIiwgY3VycmVudEJsb2NrKSwKLSAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIHB1c2goaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIElVU0hSIDogewotICAgICAgICBWYWx1ZSogdmFsMiA9IHBvcEFzSW50KCk7Ci0gICAgICAgIFZhbHVlKiB2YWwxID0gcG9wQXNJbnQoKTsKLSAgICAgICAgVmFsdWUqIG1hc2sgPSBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSwgMHgxRik7Ci0gICAgICAgIHZhbDIgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQW5kKHZhbDIsIG1hc2ssICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICBwdXNoKEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVMU2hyKHZhbDEsIHZhbDIsICIiLCBjdXJyZW50QmxvY2spLAotICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgTFVTSFIgOiB7Ci0gICAgICAgIFZhbHVlKiB2YWwyID0gbmV3IFpFeHRJbnN0KHBvcCgpLCBUeXBlOjpnZXRJbnQ2NFR5KCpsbHZtQ29udGV4dCksICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICBWYWx1ZSogbWFzayA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50NjRUeSgqbGx2bUNvbnRleHQpLCAweDNGKTsKLSAgICAgICAgdmFsMiA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBbmQodmFsMiwgbWFzaywgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIHBvcCgpOyAvLyByZW1vdmUgdGhlIDAgb24gdGhlIHN0YWNrCi0gICAgICAgIFZhbHVlKiB2YWwxID0gcG9wKCk7Ci0gICAgICAgIHB1c2goQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUxTaHIodmFsMSwgdmFsMiwgIiIsIGN1cnJlbnRCbG9jayksCi0gICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICBwdXNoKGludHJpbnNpY3MtPmNvbnN0YW50WmVybywgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBJQU5EIDogewotICAgICAgICBWYWx1ZSogdmFsMiA9IHBvcEFzSW50KCk7Ci0gICAgICAgIFZhbHVlKiB2YWwxID0gcG9wQXNJbnQoKTsKLSAgICAgICAgcHVzaChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQW5kKHZhbDEsIHZhbDIsICIiLCBjdXJyZW50QmxvY2spLAotICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgTEFORCA6IHsKLSAgICAgICAgcG9wKCk7Ci0gICAgICAgIFZhbHVlKiB2YWwyID0gcG9wKCk7Ci0gICAgICAgIHBvcCgpOyAvLyByZW1vdmUgdGhlIDAgb24gdGhlIHN0YWNrCi0gICAgICAgIFZhbHVlKiB2YWwxID0gcG9wKCk7Ci0gICAgICAgIHB1c2goQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZCh2YWwxLCB2YWwyLCAiIiwgY3VycmVudEJsb2NrKSwKLSAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIHB1c2goaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIElPUiA6IHsKLSAgICAgICAgVmFsdWUqIHZhbDIgPSBwb3BBc0ludCgpOwotICAgICAgICBWYWx1ZSogdmFsMSA9IHBvcEFzSW50KCk7Ci0gICAgICAgIHB1c2goQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU9yKHZhbDEsIHZhbDIsICIiLCBjdXJyZW50QmxvY2spLAotICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgTE9SIDogewotICAgICAgICBwb3AoKTsKLSAgICAgICAgVmFsdWUqIHZhbDIgPSBwb3AoKTsKLSAgICAgICAgcG9wKCk7IC8vIHJlbW92ZSB0aGUgMCBvbiB0aGUgc3RhY2sKLSAgICAgICAgVmFsdWUqIHZhbDEgPSBwb3AoKTsKLSAgICAgICAgcHVzaChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlT3IodmFsMSwgdmFsMiwgIiIsIGN1cnJlbnRCbG9jayksCi0gICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICBwdXNoKGludHJpbnNpY3MtPmNvbnN0YW50WmVybywgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBJWE9SIDogewotICAgICAgICBWYWx1ZSogdmFsMiA9IHBvcEFzSW50KCk7Ci0gICAgICAgIFZhbHVlKiB2YWwxID0gcG9wQXNJbnQoKTsKLSAgICAgICAgcHVzaChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlWG9yKHZhbDEsIHZhbDIsICIiLCBjdXJyZW50QmxvY2spLAotICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgTFhPUiA6IHsKLSAgICAgICAgcG9wKCk7Ci0gICAgICAgIFZhbHVlKiB2YWwyID0gcG9wKCk7Ci0gICAgICAgIHBvcCgpOyAvLyByZW1vdmUgdGhlIDAgb24gdGhlIHN0YWNrCi0gICAgICAgIFZhbHVlKiB2YWwxID0gcG9wKCk7Ci0gICAgICAgIHB1c2goQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVhvcih2YWwxLCB2YWwyLCAiIiwgY3VycmVudEJsb2NrKSwKLSAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIHB1c2goaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIElJTkMgOiB7Ci0gICAgICAgIHVpbnQxNiBpZHggPSBXUkVBRF9VMShyZWFkZXIsIHRydWUsIGksIHdpZGUpOwotICAgICAgICBzaW50MTYgdmFsID0gV1JFQURfUzEocmVhZGVyLCBmYWxzZSwgaSwgd2lkZSk7Ci0gICAgICAgIGxsdm06OlZhbHVlKiBhZGQgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQWRkKAotICAgICAgICAgICAgbmV3IExvYWRJbnN0KGludExvY2Fsc1tpZHhdLCAiIiwgY3VycmVudEJsb2NrKSwgCi0gICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSwgdmFsKSwgIiIsCi0gICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICAgICAgICBuZXcgU3RvcmVJbnN0KGFkZCwgaW50TG9jYWxzW2lkeF0sIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBJMkwgOgotICAgICAgICBwdXNoKG5ldyBTRXh0SW5zdChwb3AoKSwgbGx2bTo6VHlwZTo6Z2V0SW50NjRUeSgqbGx2bUNvbnRleHQpLCAiIiwgY3VycmVudEJsb2NrKSwKLSAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIHB1c2goaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEkyRiA6Ci0gICAgICAgIHB1c2gobmV3IFNJVG9GUEluc3QocG9wKCksIGxsdm06OlR5cGU6OmdldEZsb2F0VHkoKmxsdm1Db250ZXh0KSwgIiIsIGN1cnJlbnRCbG9jayksCi0gICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgICAgCi0gICAgICBjYXNlIEkyRCA6Ci0gICAgICAgIHB1c2gobmV3IFNJVG9GUEluc3QocG9wKCksIGxsdm06OlR5cGU6OmdldERvdWJsZVR5KCpsbHZtQ29udGV4dCksICIiLCBjdXJyZW50QmxvY2spLAotICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgcHVzaChpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICAgIGNhc2UgTDJJIDoKLSAgICAgICAgcG9wKCk7Ci0gICAgICAgIHB1c2gobmV3IFRydW5jSW5zdChwb3AoKSwgbGx2bTo6VHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpLCAiIiwgY3VycmVudEJsb2NrKSwKLSAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgCi0gICAgICBjYXNlIEwyRiA6Ci0gICAgICAgIHBvcCgpOwotICAgICAgICBwdXNoKG5ldyBTSVRvRlBJbnN0KHBvcCgpLCBsbHZtOjpUeXBlOjpnZXRGbG9hdFR5KCpsbHZtQ29udGV4dCksICIiLCBjdXJyZW50QmxvY2spLAotICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICAgIGNhc2UgTDJEIDoKLSAgICAgICAgcG9wKCk7Ci0gICAgICAgIHB1c2gobmV3IFNJVG9GUEluc3QocG9wKCksIGxsdm06OlR5cGU6OmdldERvdWJsZVR5KCpsbHZtQ29udGV4dCksICIiLCBjdXJyZW50QmxvY2spLAotICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgcHVzaChpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICAgIGNhc2UgRjJJIDogewotICAgICAgICBsbHZtOjpWYWx1ZSogdmFsID0gcG9wKCk7Ci0gICAgICAgIGxsdm06OlZhbHVlKiB0ZXN0ID0gbmV3IEZDbXBJbnN0KCpjdXJyZW50QmxvY2ssIEZDbXBJbnN0OjpGQ01QX09ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLCB2YWwsICIiKTsKLSAgICAgICAgCi0gICAgICAgIEJhc2ljQmxvY2sqIHJlcyA9IGNyZWF0ZUJhc2ljQmxvY2soIkYySSIpOwotICAgICAgICBQSElOb2RlKiBub2RlID0gUEhJTm9kZTo6Q3JlYXRlKGxsdm06OlR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSwgIiIsIHJlcyk7Ci0gICAgICAgIG5vZGUtPmFkZEluY29taW5nKGludHJpbnNpY3MtPmNvbnN0YW50WmVybywgY3VycmVudEJsb2NrKTsKLSAgICAgICAgQmFzaWNCbG9jayogY29udCA9IGNyZWF0ZUJhc2ljQmxvY2soIkYySSIpOwotCi0gICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShyZXMsIGNvbnQsIHRlc3QsIGN1cnJlbnRCbG9jayk7Ci0KLSAgICAgICAgY3VycmVudEJsb2NrID0gY29udDsKLSAgICAgICAgCi0gICAgICAgIHRlc3QgPSBuZXcgRkNtcEluc3QoKmN1cnJlbnRCbG9jaywgRkNtcEluc3Q6OkZDTVBfT0dFLCB2YWwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPmNvbnN0YW50TWF4SW50RmxvYXQsICIiKTsKLQotICAgICAgICBjb250ID0gY3JlYXRlQmFzaWNCbG9jaygiRjJJIik7Ci0KLSAgICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKHJlcywgY29udCwgdGVzdCwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgbm9kZS0+YWRkSW5jb21pbmcoaW50cmluc2ljcy0+Y29uc3RhbnRNYXhJbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0KLSAgICAgICAgY3VycmVudEJsb2NrID0gY29udDsKLQotICAgICAgICB0ZXN0ID0gbmV3IEZDbXBJbnN0KCpjdXJyZW50QmxvY2ssIEZDbXBJbnN0OjpGQ01QX09MRSwgdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPmNvbnN0YW50TWluSW50RmxvYXQsICIiKTsKLSAgICAgICAgCi0gICAgICAgIGNvbnQgPSBjcmVhdGVCYXNpY0Jsb2NrKCJGMkkiKTsKLQotICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUocmVzLCBjb250LCB0ZXN0LCBjdXJyZW50QmxvY2spOwotICAgICAgICBub2RlLT5hZGRJbmNvbWluZyhpbnRyaW5zaWNzLT5jb25zdGFudE1pbkludCwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgCi0gICAgICAgIGN1cnJlbnRCbG9jayA9IGNvbnQ7Ci0gICAgICAgIGxsdm06OlZhbHVlKiBuZXdWYWwgPSBuZXcgRlBUb1NJSW5zdCh2YWwsIFR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUocmVzLCBjdXJyZW50QmxvY2spOwotCi0gICAgICAgIG5vZGUtPmFkZEluY29taW5nKG5ld1ZhbCwgY3VycmVudEJsb2NrKTsKLQotICAgICAgICBjdXJyZW50QmxvY2sgPSByZXM7Ci0KLSAgICAgICAgcHVzaChub2RlLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIEYyTCA6IHsKLSAgICAgICAgbGx2bTo6VmFsdWUqIHZhbCA9IHBvcCgpOwotICAgICAgICBsbHZtOjpWYWx1ZSogdGVzdCA9IG5ldyBGQ21wSW5zdCgqY3VycmVudEJsb2NrLCBGQ21wSW5zdDo6RkNNUF9PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCwgdmFsLCAiIik7Ci0gICAgICAgIAotICAgICAgICBCYXNpY0Jsb2NrKiByZXMgPSBjcmVhdGVCYXNpY0Jsb2NrKCJGMkwiKTsKLSAgICAgICAgUEhJTm9kZSogbm9kZSA9IFBISU5vZGU6OkNyZWF0ZShsbHZtOjpUeXBlOjpnZXRJbnQ2NFR5KCpsbHZtQ29udGV4dCksICIiLCByZXMpOwotICAgICAgICBub2RlLT5hZGRJbmNvbWluZyhpbnRyaW5zaWNzLT5jb25zdGFudExvbmdaZXJvLCBjdXJyZW50QmxvY2spOwotICAgICAgICBCYXNpY0Jsb2NrKiBjb250ID0gY3JlYXRlQmFzaWNCbG9jaygiRjJMIik7Ci0KLSAgICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKHJlcywgY29udCwgdGVzdCwgY3VycmVudEJsb2NrKTsKLQotICAgICAgICBjdXJyZW50QmxvY2sgPSBjb250OwotICAgICAgICAKLSAgICAgICAgdGVzdCA9IG5ldyBGQ21wSW5zdCgqY3VycmVudEJsb2NrLCBGQ21wSW5zdDo6RkNNUF9PR0UsIHZhbCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmluc2ljcy0+Y29uc3RhbnRNYXhMb25nRmxvYXQsICIiKTsKLQotICAgICAgICBjb250ID0gY3JlYXRlQmFzaWNCbG9jaygiRjJMIik7Ci0KLSAgICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKHJlcywgY29udCwgdGVzdCwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgbm9kZS0+YWRkSW5jb21pbmcoaW50cmluc2ljcy0+Y29uc3RhbnRNYXhMb25nLCBjdXJyZW50QmxvY2spOwotCi0gICAgICAgIGN1cnJlbnRCbG9jayA9IGNvbnQ7Ci0KLSAgICAgICAgdGVzdCA9IG5ldyBGQ21wSW5zdCgqY3VycmVudEJsb2NrLCBGQ21wSW5zdDo6RkNNUF9PTEUsIHZhbCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmluc2ljcy0+Y29uc3RhbnRNaW5Mb25nRmxvYXQsICIiKTsKLSAgICAgICAgCi0gICAgICAgIGNvbnQgPSBjcmVhdGVCYXNpY0Jsb2NrKCJGMkwiKTsKLQotICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUocmVzLCBjb250LCB0ZXN0LCBjdXJyZW50QmxvY2spOwotICAgICAgICBub2RlLT5hZGRJbmNvbWluZyhpbnRyaW5zaWNzLT5jb25zdGFudE1pbkxvbmcsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIAotICAgICAgICBjdXJyZW50QmxvY2sgPSBjb250OwotICAgICAgICBsbHZtOjpWYWx1ZSogbmV3VmFsID0gbmV3IEZQVG9TSUluc3QodmFsLCBUeXBlOjpnZXRJbnQ2NFR5KCpsbHZtQ29udGV4dCksICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKHJlcywgY3VycmVudEJsb2NrKTsKLQotICAgICAgICBub2RlLT5hZGRJbmNvbWluZyhuZXdWYWwsIGN1cnJlbnRCbG9jayk7Ci0KLSAgICAgICAgY3VycmVudEJsb2NrID0gcmVzOwotICAgICAgICAKLSAgICAgICAgcHVzaChub2RlLCBmYWxzZSk7Ci0gICAgICAgIHB1c2goaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIEYyRCA6Ci0gICAgICAgIHB1c2gobmV3IEZQRXh0SW5zdChwb3AoKSwgbGx2bTo6VHlwZTo6Z2V0RG91YmxlVHkoKmxsdm1Db250ZXh0KSwgIiIsIGN1cnJlbnRCbG9jayksCi0gICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICBwdXNoKGludHJpbnNpY3MtPmNvbnN0YW50WmVybywgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBEMkkgOiB7Ci0gICAgICAgIHBvcCgpOyAvLyByZW1vdmUgdGhlIDAgb24gdGhlIHN0YWNrCi0gICAgICAgIGxsdm06OlZhbHVlKiB2YWwgPSBwb3AoKTsKLSAgICAgICAgbGx2bTo6VmFsdWUqIHRlc3QgPSBuZXcgRkNtcEluc3QoKmN1cnJlbnRCbG9jaywgRkNtcEluc3Q6OkZDTVBfT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwsIHZhbCwgIiIpOwotICAgICAgICAKLSAgICAgICAgQmFzaWNCbG9jayogcmVzID0gY3JlYXRlQmFzaWNCbG9jaygiRDJJIik7Ci0gICAgICAgIFBISU5vZGUqIG5vZGUgPSBQSElOb2RlOjpDcmVhdGUobGx2bTo6VHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpLCAiIiwgcmVzKTsKLSAgICAgICAgbm9kZS0+YWRkSW5jb21pbmcoaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCBjdXJyZW50QmxvY2spOwotICAgICAgICBCYXNpY0Jsb2NrKiBjb250ID0gY3JlYXRlQmFzaWNCbG9jaygiRDJJIik7Ci0KLSAgICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKHJlcywgY29udCwgdGVzdCwgY3VycmVudEJsb2NrKTsKLQotICAgICAgICBjdXJyZW50QmxvY2sgPSBjb250OwotICAgICAgICAKLSAgICAgICAgdGVzdCA9IG5ldyBGQ21wSW5zdCgqY3VycmVudEJsb2NrLCBGQ21wSW5zdDo6RkNNUF9PR0UsIHZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5jb25zdGFudE1heEludERvdWJsZSwgIiIpOwotCi0gICAgICAgIGNvbnQgPSBjcmVhdGVCYXNpY0Jsb2NrKCJEMkkiKTsKLQotICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUocmVzLCBjb250LCB0ZXN0LCBjdXJyZW50QmxvY2spOwotICAgICAgICBub2RlLT5hZGRJbmNvbWluZyhpbnRyaW5zaWNzLT5jb25zdGFudE1heEludCwgY3VycmVudEJsb2NrKTsKLQotICAgICAgICBjdXJyZW50QmxvY2sgPSBjb250OwotCi0gICAgICAgIHRlc3QgPSBuZXcgRkNtcEluc3QoKmN1cnJlbnRCbG9jaywgRkNtcEluc3Q6OkZDTVBfT0xFLCB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmluc2ljcy0+Y29uc3RhbnRNaW5JbnREb3VibGUsICIiKTsKLSAgICAgICAgCi0gICAgICAgIGNvbnQgPSBjcmVhdGVCYXNpY0Jsb2NrKCJEMkkiKTsKLQotICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUocmVzLCBjb250LCB0ZXN0LCBjdXJyZW50QmxvY2spOwotICAgICAgICBub2RlLT5hZGRJbmNvbWluZyhpbnRyaW5zaWNzLT5jb25zdGFudE1pbkludCwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgCi0gICAgICAgIGN1cnJlbnRCbG9jayA9IGNvbnQ7Ci0gICAgICAgIGxsdm06OlZhbHVlKiBuZXdWYWwgPSBuZXcgRlBUb1NJSW5zdCh2YWwsIFR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUocmVzLCBjdXJyZW50QmxvY2spOwotCi0gICAgICAgIG5vZGUtPmFkZEluY29taW5nKG5ld1ZhbCwgY3VycmVudEJsb2NrKTsKLQotICAgICAgICBjdXJyZW50QmxvY2sgPSByZXM7Ci0gICAgICAgIAotICAgICAgICBwdXNoKG5vZGUsIGZhbHNlKTsKLQotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBEMkwgOiB7Ci0gICAgICAgIHBvcCgpOyAvLyByZW1vdmUgdGhlIDAgb24gdGhlIHN0YWNrCi0gICAgICAgIGxsdm06OlZhbHVlKiB2YWwgPSBwb3AoKTsKLSAgICAgICAgbGx2bTo6VmFsdWUqIHRlc3QgPSBuZXcgRkNtcEluc3QoKmN1cnJlbnRCbG9jaywgRkNtcEluc3Q6OkZDTVBfT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwsIHZhbCwgIiIpOwotICAgICAgICAKLSAgICAgICAgQmFzaWNCbG9jayogcmVzID0gY3JlYXRlQmFzaWNCbG9jaygiRDJMIik7Ci0gICAgICAgIFBISU5vZGUqIG5vZGUgPSBQSElOb2RlOjpDcmVhdGUobGx2bTo6VHlwZTo6Z2V0SW50NjRUeSgqbGx2bUNvbnRleHQpLCAiIiwgcmVzKTsKLSAgICAgICAgbm9kZS0+YWRkSW5jb21pbmcoaW50cmluc2ljcy0+Y29uc3RhbnRMb25nWmVybywgY3VycmVudEJsb2NrKTsKLSAgICAgICAgQmFzaWNCbG9jayogY29udCA9IGNyZWF0ZUJhc2ljQmxvY2soIkQyTCIpOwotCi0gICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShyZXMsIGNvbnQsIHRlc3QsIGN1cnJlbnRCbG9jayk7Ci0KLSAgICAgICAgY3VycmVudEJsb2NrID0gY29udDsKLSAgICAgICAgCi0gICAgICAgIHRlc3QgPSBuZXcgRkNtcEluc3QoKmN1cnJlbnRCbG9jaywgRkNtcEluc3Q6OkZDTVBfT0dFLCB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmluc2ljcy0+Y29uc3RhbnRNYXhMb25nRG91YmxlLCAiIik7Ci0KLSAgICAgICAgY29udCA9IGNyZWF0ZUJhc2ljQmxvY2soIkQyTCIpOwotCi0gICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShyZXMsIGNvbnQsIHRlc3QsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIG5vZGUtPmFkZEluY29taW5nKGludHJpbnNpY3MtPmNvbnN0YW50TWF4TG9uZywgY3VycmVudEJsb2NrKTsKLQotICAgICAgICBjdXJyZW50QmxvY2sgPSBjb250OwotCi0gICAgICAgIHRlc3QgPSAKLSAgICAgICAgICBuZXcgRkNtcEluc3QoKmN1cnJlbnRCbG9jaywgRkNtcEluc3Q6OkZDTVBfT0xFLCB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPmNvbnN0YW50TWluTG9uZ0RvdWJsZSwgIiIpOwotICAgICAgICAKLSAgICAgICAgY29udCA9IGNyZWF0ZUJhc2ljQmxvY2soIkQyTCIpOwotCi0gICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShyZXMsIGNvbnQsIHRlc3QsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIG5vZGUtPmFkZEluY29taW5nKGludHJpbnNpY3MtPmNvbnN0YW50TWluTG9uZywgY3VycmVudEJsb2NrKTsKLSAgICAgICAgCi0gICAgICAgIGN1cnJlbnRCbG9jayA9IGNvbnQ7Ci0gICAgICAgIGxsdm06OlZhbHVlKiBuZXdWYWwgPSBuZXcgRlBUb1NJSW5zdCh2YWwsIFR5cGU6OmdldEludDY0VHkoKmxsdm1Db250ZXh0KSwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUocmVzLCBjdXJyZW50QmxvY2spOwotCi0gICAgICAgIG5vZGUtPmFkZEluY29taW5nKG5ld1ZhbCwgY3VycmVudEJsb2NrKTsKLQotICAgICAgICBjdXJyZW50QmxvY2sgPSByZXM7Ci0gICAgICAgIAotICAgICAgICBwdXNoKG5vZGUsIGZhbHNlKTsKLSAgICAgICAgcHVzaChpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgRDJGIDoKLSAgICAgICAgcG9wKCk7IC8vIHJlbW92ZSB0aGUgMCBvbiB0aGUgc3RhY2sKLSAgICAgICAgcHVzaChuZXcgRlBUcnVuY0luc3QocG9wKCksIGxsdm06OlR5cGU6OmdldEZsb2F0VHkoKmxsdm1Db250ZXh0KSwgIiIsIGN1cnJlbnRCbG9jayksCi0gICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBJMkIgOiB7Ci0gICAgICAgIFZhbHVlKiB2YWwgPSBwb3AoKTsKLSAgICAgICAgaWYgKHZhbC0+Z2V0VHlwZSgpID09IFR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSkgewotICAgICAgICAgIHZhbCA9IG5ldyBUcnVuY0luc3QodmFsLCBsbHZtOjpUeXBlOjpnZXRJbnQ4VHkoKmxsdm1Db250ZXh0KSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVzaChuZXcgU0V4dEluc3QodmFsLCBsbHZtOjpUeXBlOjpnZXRJbnQzMlR5KCpsbHZtQ29udGV4dCksICIiLCBjdXJyZW50QmxvY2spLAotICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgSTJDIDogewotICAgICAgICBWYWx1ZSogdmFsID0gcG9wKCk7Ci0gICAgICAgIGlmICh2YWwtPmdldFR5cGUoKSA9PSBUeXBlOjpnZXRJbnQzMlR5KCpsbHZtQ29udGV4dCkpIHsKLSAgICAgICAgICB2YWwgPSBuZXcgVHJ1bmNJbnN0KHZhbCwgbGx2bTo6VHlwZTo6Z2V0SW50MTZUeSgqbGx2bUNvbnRleHQpLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgfQotICAgICAgICBwdXNoKG5ldyBaRXh0SW5zdCh2YWwsIGxsdm06OlR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSwgIiIsIGN1cnJlbnRCbG9jayksCi0gICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBJMlMgOiB7Ci0gICAgICAgIFZhbHVlKiB2YWwgPSBwb3AoKTsKLSAgICAgICAgaWYgKHZhbC0+Z2V0VHlwZSgpID09IFR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSkgewotICAgICAgICAgIHZhbCA9IG5ldyBUcnVuY0luc3QodmFsLCBsbHZtOjpUeXBlOjpnZXRJbnQxNlR5KCpsbHZtQ29udGV4dCksICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICB9Ci0gICAgICAgIHB1c2gobmV3IFNFeHRJbnN0KHZhbCwgbGx2bTo6VHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpLCAiIiwgY3VycmVudEJsb2NrKSwKLSAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIExDTVAgOiB7Ci0gICAgICAgIHBvcCgpOwotICAgICAgICBsbHZtOjpWYWx1ZSogdmFsMiA9IHBvcCgpOwotICAgICAgICBwb3AoKTsKLSAgICAgICAgbGx2bTo6VmFsdWUqIHZhbDEgPSBwb3AoKTsKLQotICAgICAgICBsbHZtOjpWYWx1ZSogdGVzdCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9FUSwgdmFsMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsMiwgIiIpOwotICAgICAgICAKLSAgICAgICAgQmFzaWNCbG9jayogY29udCA9IGNyZWF0ZUJhc2ljQmxvY2soIkxDTVAiKTsKLSAgICAgICAgQmFzaWNCbG9jayogcmVzID0gY3JlYXRlQmFzaWNCbG9jaygiTENNUCIpOwotICAgICAgICBQSElOb2RlKiBub2RlID0gUEhJTm9kZTo6Q3JlYXRlKGxsdm06OlR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSwgIiIsIHJlcyk7Ci0gICAgICAgIG5vZGUtPmFkZEluY29taW5nKGludHJpbnNpY3MtPmNvbnN0YW50WmVybywgY3VycmVudEJsb2NrKTsKLSAgICAgICAgCi0gICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShyZXMsIGNvbnQsIHRlc3QsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIGN1cnJlbnRCbG9jayA9IGNvbnQ7Ci0KLSAgICAgICAgdGVzdCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9TTFQsIHZhbDEsIHZhbDIsICIiKTsKLSAgICAgICAgbm9kZS0+YWRkSW5jb21pbmcoaW50cmluc2ljcy0+Y29uc3RhbnRNaW51c09uZSwgY3VycmVudEJsb2NrKTsKLQotICAgICAgICBjb250ID0gY3JlYXRlQmFzaWNCbG9jaygiTENNUCIpOwotICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUocmVzLCBjb250LCB0ZXN0LCBjdXJyZW50QmxvY2spOwotICAgICAgICBjdXJyZW50QmxvY2sgPSBjb250OwotICAgICAgICBub2RlLT5hZGRJbmNvbWluZyhpbnRyaW5zaWNzLT5jb25zdGFudE9uZSwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKHJlcywgY3VycmVudEJsb2NrKTsKLSAgICAgICAgY3VycmVudEJsb2NrID0gcmVzOwotICAgICAgICAKLSAgICAgICAgcHVzaChub2RlLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIEZDTVBMIDogewotICAgICAgICBsbHZtOjpWYWx1ZSogdmFsMiA9IHBvcCgpOwotICAgICAgICBsbHZtOjpWYWx1ZSogdmFsMSA9IHBvcCgpOwotICAgICAgICBjb21wYXJlRlAodmFsMSwgdmFsMiwgVHlwZTo6Z2V0RmxvYXRUeSgqbGx2bUNvbnRleHQpLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIEZDTVBHIDogewotICAgICAgICBsbHZtOjpWYWx1ZSogdmFsMiA9IHBvcCgpOwotICAgICAgICBsbHZtOjpWYWx1ZSogdmFsMSA9IHBvcCgpOwotICAgICAgICBjb21wYXJlRlAodmFsMSwgdmFsMiwgVHlwZTo6Z2V0RmxvYXRUeSgqbGx2bUNvbnRleHQpLCB0cnVlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgRENNUEwgOiB7Ci0gICAgICAgIHBvcCgpOwotICAgICAgICBsbHZtOjpWYWx1ZSogdmFsMiA9IHBvcCgpOwotICAgICAgICBwb3AoKTsKLSAgICAgICAgbGx2bTo6VmFsdWUqIHZhbDEgPSBwb3AoKTsKLSAgICAgICAgCi0gICAgICAgIGNvbXBhcmVGUCh2YWwxLCB2YWwyLCBUeXBlOjpnZXREb3VibGVUeSgqbGx2bUNvbnRleHQpLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIERDTVBHIDogewotICAgICAgICBwb3AoKTsKLSAgICAgICAgbGx2bTo6VmFsdWUqIHZhbDIgPSBwb3AoKTsKLSAgICAgICAgcG9wKCk7Ci0gICAgICAgIGxsdm06OlZhbHVlKiB2YWwxID0gcG9wKCk7Ci0gICAgICAgIAotICAgICAgICBjb21wYXJlRlAodmFsMSwgdmFsMiwgVHlwZTo6Z2V0RG91YmxlVHkoKmxsdm1Db250ZXh0KSwgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBJRkVRIDogewotICAgICAgICB1aW50MzIgdG1wID0gaTsKLSAgICAgICAgT3BpbmZvJiBpZlRydWVJbmZvID0gb3Bjb2RlSW5mb3NbdG1wICsgcmVhZGVyLnJlYWRTMigpXTsKLSAgICAgICAgaSArPSAyOwotICAgICAgICBCYXNpY0Jsb2NrKiBpZlRydWUgPSBpZlRydWVJbmZvLm5ld0Jsb2NrOwotCi0gICAgICAgIFZhbHVlKiBvcCA9IHBvcCgpOwotICAgICAgICBjb25zdCBUeXBlKiB0eXBlID0gb3AtPmdldFR5cGUoKTsKLSAgICAgICAgQ29uc3RhbnQqIHZhbCA9IENvbnN0YW50OjpnZXROdWxsVmFsdWUodHlwZSk7Ci0gICAgICAgIGxsdm06OlZhbHVlKiB0ZXN0ID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX0VRLCBvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLCAiIik7Ci0gICAgICAgIEJhc2ljQmxvY2sqIGlmRmFsc2UgPSBjcmVhdGVCYXNpY0Jsb2NrKCJmYWxzZSBJRkVRIik7Ci0gICAgICAgIGJyYW5jaCh0ZXN0LCBpZlRydWUsIGlmRmFsc2UsIGN1cnJlbnRCbG9jaywgaWZUcnVlSW5mbyk7Ci0gICAgICAgIGN1cnJlbnRCbG9jayA9IGlmRmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIElGTkUgOiB7Ci0gICAgICAgIHVpbnQzMiB0bXAgPSBpOwotICAgICAgICBPcGluZm8mIGlmVHJ1ZUluZm8gPSBvcGNvZGVJbmZvc1t0bXAgKyByZWFkZXIucmVhZFMyKCldOwotICAgICAgICBpICs9IDI7Ci0gICAgICAgIEJhc2ljQmxvY2sqIGlmVHJ1ZSA9IGlmVHJ1ZUluZm8ubmV3QmxvY2s7Ci0gICAgICAgIAotICAgICAgICBWYWx1ZSogb3AgPSBwb3AoKTsKLSAgICAgICAgY29uc3QgVHlwZSogdHlwZSA9IG9wLT5nZXRUeXBlKCk7Ci0gICAgICAgIENvbnN0YW50KiB2YWwgPSBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKHR5cGUpOwotICAgICAgICBsbHZtOjpWYWx1ZSogdGVzdCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9ORSwgb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCwgIiIpOwotICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2UgSUZORSIpOwotICAgICAgICBicmFuY2godGVzdCwgaWZUcnVlLCBpZkZhbHNlLCBjdXJyZW50QmxvY2ssIGlmVHJ1ZUluZm8pOwotICAgICAgICBjdXJyZW50QmxvY2sgPSBpZkZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBJRkxUIDogewotICAgICAgICB1aW50MzIgdG1wID0gaTsKLSAgICAgICAgT3BpbmZvJiBpZlRydWVJbmZvID0gb3Bjb2RlSW5mb3NbdG1wICsgcmVhZGVyLnJlYWRTMigpXTsKLSAgICAgICAgaSArPSAyOwotICAgICAgICBCYXNpY0Jsb2NrKiBpZlRydWUgPSBpZlRydWVJbmZvLm5ld0Jsb2NrOwotICAgICAgICBWYWx1ZSogb3AgPSBwb3AoKTsKLSAgICAgICAgY29uc3QgVHlwZSogdHlwZSA9IG9wLT5nZXRUeXBlKCk7Ci0gICAgICAgIENvbnN0YW50KiB2YWwgPSBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKHR5cGUpOwotICAgICAgICBsbHZtOjpWYWx1ZSogdGVzdCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9TTFQsIG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwsICIiKTsKLSAgICAgICAgQmFzaWNCbG9jayogaWZGYWxzZSA9IGNyZWF0ZUJhc2ljQmxvY2soImZhbHNlIElGTFQiKTsKLSAgICAgICAgYnJhbmNoKHRlc3QsIGlmVHJ1ZSwgaWZGYWxzZSwgY3VycmVudEJsb2NrLCBpZlRydWVJbmZvKTsKLSAgICAgICAgY3VycmVudEJsb2NrID0gaWZGYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgSUZHRSA6IHsKLSAgICAgICAgdWludDMyIHRtcCA9IGk7Ci0gICAgICAgIE9waW5mbyYgaWZUcnVlSW5mbyA9IG9wY29kZUluZm9zW3RtcCArIHJlYWRlci5yZWFkUzIoKV07Ci0gICAgICAgIGkgKz0gMjsKLSAgICAgICAgQmFzaWNCbG9jayogaWZUcnVlID0gaWZUcnVlSW5mby5uZXdCbG9jazsKLSAgICAgICAgVmFsdWUqIG9wID0gcG9wKCk7Ci0gICAgICAgIGNvbnN0IFR5cGUqIHR5cGUgPSBvcC0+Z2V0VHlwZSgpOwotICAgICAgICBDb25zdGFudCogdmFsID0gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZSh0eXBlKTsKLSAgICAgICAgbGx2bTo6VmFsdWUqIHRlc3QgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfU0dFLCBvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLCAiIik7Ci0gICAgICAgIEJhc2ljQmxvY2sqIGlmRmFsc2UgPSBjcmVhdGVCYXNpY0Jsb2NrKCJmYWxzZSBJRkdFIik7Ci0gICAgICAgIGJyYW5jaCh0ZXN0LCBpZlRydWUsIGlmRmFsc2UsIGN1cnJlbnRCbG9jaywgaWZUcnVlSW5mbyk7Ci0gICAgICAgIGN1cnJlbnRCbG9jayA9IGlmRmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIElGR1QgOiB7Ci0gICAgICAgIHVpbnQzMiB0bXAgPSBpOwotICAgICAgICBPcGluZm8mIGlmVHJ1ZUluZm8gPSBvcGNvZGVJbmZvc1t0bXAgKyByZWFkZXIucmVhZFMyKCldOwotICAgICAgICBpICs9IDI7Ci0gICAgICAgIEJhc2ljQmxvY2sqIGlmVHJ1ZSA9IGlmVHJ1ZUluZm8ubmV3QmxvY2s7Ci0gICAgICAgIFZhbHVlKiBvcCA9IHBvcCgpOwotICAgICAgICBjb25zdCBUeXBlKiB0eXBlID0gb3AtPmdldFR5cGUoKTsKLSAgICAgICAgQ29uc3RhbnQqIHZhbCA9IENvbnN0YW50OjpnZXROdWxsVmFsdWUodHlwZSk7Ci0gICAgICAgIGxsdm06OlZhbHVlKiB0ZXN0ID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX1NHVCwgb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCwgIiIpOwotICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2UgSUZHVCIpOwotICAgICAgICBicmFuY2godGVzdCwgaWZUcnVlLCBpZkZhbHNlLCBjdXJyZW50QmxvY2ssIGlmVHJ1ZUluZm8pOwotICAgICAgICBjdXJyZW50QmxvY2sgPSBpZkZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBJRkxFIDogewotICAgICAgICB1aW50MzIgdG1wID0gaTsKLSAgICAgICAgT3BpbmZvJiBpZlRydWVJbmZvID0gb3Bjb2RlSW5mb3NbdG1wICsgcmVhZGVyLnJlYWRTMigpXTsKLSAgICAgICAgaSArPSAyOwotICAgICAgICBCYXNpY0Jsb2NrKiBpZlRydWUgPSBpZlRydWVJbmZvLm5ld0Jsb2NrOwotICAgICAgICBWYWx1ZSogb3AgPSBwb3AoKTsKLSAgICAgICAgY29uc3QgVHlwZSogdHlwZSA9IG9wLT5nZXRUeXBlKCk7Ci0gICAgICAgIENvbnN0YW50KiB2YWwgPSBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKHR5cGUpOwotICAgICAgICBsbHZtOjpWYWx1ZSogdGVzdCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9TTEUsIG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwsICIiKTsKLSAgICAgICAgQmFzaWNCbG9jayogaWZGYWxzZSA9IGNyZWF0ZUJhc2ljQmxvY2soImZhbHNlIElGTEUiKTsKLSAgICAgICAgYnJhbmNoKHRlc3QsIGlmVHJ1ZSwgaWZGYWxzZSwgY3VycmVudEJsb2NrLCBpZlRydWVJbmZvKTsKLSAgICAgICAgY3VycmVudEJsb2NrID0gaWZGYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgSUZfSUNNUEVRIDogewotICAgICAgICBWYWx1ZSAqdmFsMiA9IHBvcEFzSW50KCk7Ci0gICAgICAgIFZhbHVlICp2YWwxID0gcG9wQXNJbnQoKTsKLSAgICAgICAgdWludDMyIHRtcCA9IGk7Ci0gICAgICAgIE9waW5mbyYgaWZUcnVlSW5mbyA9IG9wY29kZUluZm9zW3RtcCArIHJlYWRlci5yZWFkUzIoKV07Ci0gICAgICAgIGkgKz0gMjsKLSAgICAgICAgQmFzaWNCbG9jayogaWZUcnVlID0gaWZUcnVlSW5mby5uZXdCbG9jazsKLSAgICAgICAgbGx2bTo6VmFsdWUqIHRlc3QgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfRVEsIHZhbDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbDIsICIiKTsKLSAgICAgICAgQmFzaWNCbG9jayogaWZGYWxzZSA9IGNyZWF0ZUJhc2ljQmxvY2soImZhbHNlIElGX0lDTVBFUSIpOwotICAgICAgICBicmFuY2godGVzdCwgaWZUcnVlLCBpZkZhbHNlLCBjdXJyZW50QmxvY2ssIGlmVHJ1ZUluZm8pOwotICAgICAgICBjdXJyZW50QmxvY2sgPSBpZkZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBJRl9JQ01QTkUgOiB7Ci0gICAgICAgIFZhbHVlICp2YWwyID0gcG9wQXNJbnQoKTsKLSAgICAgICAgVmFsdWUgKnZhbDEgPSBwb3BBc0ludCgpOwotICAgICAgICB1aW50MzIgdG1wID0gaTsKLSAgICAgICAgT3BpbmZvJiBpZlRydWVJbmZvID0gb3Bjb2RlSW5mb3NbdG1wICsgcmVhZGVyLnJlYWRTMigpXTsKLSAgICAgICAgaSArPSAyOwotICAgICAgICBCYXNpY0Jsb2NrKiBpZlRydWUgPSBpZlRydWVJbmZvLm5ld0Jsb2NrOwotICAgICAgICBsbHZtOjpWYWx1ZSogdGVzdCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9ORSwgdmFsMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsMiwgIiIpOwotICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2UgSUZfSUNNUE5FIik7Ci0gICAgICAgIGJyYW5jaCh0ZXN0LCBpZlRydWUsIGlmRmFsc2UsIGN1cnJlbnRCbG9jaywgaWZUcnVlSW5mbyk7Ci0gICAgICAgIGN1cnJlbnRCbG9jayA9IGlmRmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIElGX0lDTVBMVCA6IHsKLSAgICAgICAgVmFsdWUgKnZhbDIgPSBwb3BBc0ludCgpOwotICAgICAgICBWYWx1ZSAqdmFsMSA9IHBvcEFzSW50KCk7Ci0gICAgICAgIHVpbnQzMiB0bXAgPSBpOwotICAgICAgICBPcGluZm8mIGlmVHJ1ZUluZm8gPSBvcGNvZGVJbmZvc1t0bXAgKyByZWFkZXIucmVhZFMyKCldOwotICAgICAgICBpICs9IDI7Ci0gICAgICAgIEJhc2ljQmxvY2sqIGlmVHJ1ZSA9IGlmVHJ1ZUluZm8ubmV3QmxvY2s7Ci0gICAgICAgIGxsdm06OlZhbHVlKiB0ZXN0ID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX1NMVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsMSwgdmFsMiwgIiIpOwotICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2UgSUZfSUZDTVBMVCIpOwotICAgICAgICBicmFuY2godGVzdCwgaWZUcnVlLCBpZkZhbHNlLCBjdXJyZW50QmxvY2ssIGlmVHJ1ZUluZm8pOwotICAgICAgICBjdXJyZW50QmxvY2sgPSBpZkZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgICAgCi0gICAgICBjYXNlIElGX0lDTVBHRSA6IHsKLSAgICAgICAgVmFsdWUgKnZhbDIgPSBwb3BBc0ludCgpOwotICAgICAgICBWYWx1ZSAqdmFsMSA9IHBvcEFzSW50KCk7Ci0gICAgICAgIHVpbnQzMiB0bXAgPSBpOwotICAgICAgICBPcGluZm8mIGlmVHJ1ZUluZm8gPSBvcGNvZGVJbmZvc1t0bXAgKyByZWFkZXIucmVhZFMyKCldOwotICAgICAgICBpICs9IDI7Ci0gICAgICAgIEJhc2ljQmxvY2sqIGlmVHJ1ZSA9IGlmVHJ1ZUluZm8ubmV3QmxvY2s7Ci0gICAgICAgIGxsdm06OlZhbHVlKiB0ZXN0ID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX1NHRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsMSwgdmFsMiwgIiIpOwotICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2UgSUZfSUNNUEdFIik7Ci0gICAgICAgIGJyYW5jaCh0ZXN0LCBpZlRydWUsIGlmRmFsc2UsIGN1cnJlbnRCbG9jaywgaWZUcnVlSW5mbyk7Ci0gICAgICAgIGN1cnJlbnRCbG9jayA9IGlmRmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIElGX0lDTVBHVCA6IHsKLSAgICAgICAgVmFsdWUgKnZhbDIgPSBwb3BBc0ludCgpOwotICAgICAgICBWYWx1ZSAqdmFsMSA9IHBvcEFzSW50KCk7Ci0gICAgICAgIHVpbnQzMiB0bXAgPSBpOwotICAgICAgICBPcGluZm8mIGlmVHJ1ZUluZm8gPSBvcGNvZGVJbmZvc1t0bXAgKyByZWFkZXIucmVhZFMyKCldOwotICAgICAgICBpICs9IDI7Ci0gICAgICAgIEJhc2ljQmxvY2sqIGlmVHJ1ZSA9IGlmVHJ1ZUluZm8ubmV3QmxvY2s7Ci0gICAgICAgIGxsdm06OlZhbHVlKiB0ZXN0ID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX1NHVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsMSwgdmFsMiwgIiIpOwotICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2UgSUZfSUNNUEdUIik7Ci0gICAgICAgIGJyYW5jaCh0ZXN0LCBpZlRydWUsIGlmRmFsc2UsIGN1cnJlbnRCbG9jaywgaWZUcnVlSW5mbyk7Ci0gICAgICAgIGN1cnJlbnRCbG9jayA9IGlmRmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIElGX0lDTVBMRSA6IHsKLSAgICAgICAgVmFsdWUgKnZhbDIgPSBwb3BBc0ludCgpOwotICAgICAgICBWYWx1ZSAqdmFsMSA9IHBvcEFzSW50KCk7Ci0gICAgICAgIHVpbnQzMiB0bXAgPSBpOwotICAgICAgICBPcGluZm8mIGlmVHJ1ZUluZm8gPSBvcGNvZGVJbmZvc1t0bXAgKyByZWFkZXIucmVhZFMyKCldOwotICAgICAgICBpICs9IDI7Ci0gICAgICAgIEJhc2ljQmxvY2sqIGlmVHJ1ZSA9IGlmVHJ1ZUluZm8ubmV3QmxvY2s7Ci0gICAgICAgIGxsdm06OlZhbHVlKiB0ZXN0ID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX1NMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsMSwgdmFsMiwgIiIpOwotICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2UgSUZfSUNNUExFIik7Ci0gICAgICAgIGJyYW5jaCh0ZXN0LCBpZlRydWUsIGlmRmFsc2UsIGN1cnJlbnRCbG9jaywgaWZUcnVlSW5mbyk7Ci0gICAgICAgIGN1cnJlbnRCbG9jayA9IGlmRmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIElGX0FDTVBFUSA6IHsKLSAgICAgICAgVmFsdWUgKnZhbDIgPSBwb3AoKTsKLSAgICAgICAgVmFsdWUgKnZhbDEgPSBwb3AoKTsKLSAgICAgICAgdWludDMyIHRtcCA9IGk7Ci0gICAgICAgIE9waW5mbyYgaWZUcnVlSW5mbyA9IG9wY29kZUluZm9zW3RtcCArIHJlYWRlci5yZWFkUzIoKV07Ci0gICAgICAgIGkgKz0gMjsKLSAgICAgICAgQmFzaWNCbG9jayogaWZUcnVlID0gaWZUcnVlSW5mby5uZXdCbG9jazsKLSAgICAgICAgbGx2bTo6VmFsdWUqIHRlc3QgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfRVEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbDEsIHZhbDIsICIiKTsKLSAgICAgICAgQmFzaWNCbG9jayogaWZGYWxzZSA9IGNyZWF0ZUJhc2ljQmxvY2soImZhbHNlIElGX0FDTVBFUSIpOwotICAgICAgICBicmFuY2godGVzdCwgaWZUcnVlLCBpZkZhbHNlLCBjdXJyZW50QmxvY2ssIGlmVHJ1ZUluZm8pOwotICAgICAgICBjdXJyZW50QmxvY2sgPSBpZkZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBJRl9BQ01QTkUgOiB7Ci0gICAgICAgIFZhbHVlICp2YWwyID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlICp2YWwxID0gcG9wKCk7Ci0gICAgICAgIHVpbnQzMiB0bXAgPSBpOwotICAgICAgICBPcGluZm8mIGlmVHJ1ZUluZm8gPSBvcGNvZGVJbmZvc1t0bXAgKyByZWFkZXIucmVhZFMyKCldOwotICAgICAgICBpICs9IDI7Ci0gICAgICAgIEJhc2ljQmxvY2sqIGlmVHJ1ZSA9IGlmVHJ1ZUluZm8ubmV3QmxvY2s7Ci0gICAgICAgIGxsdm06OlZhbHVlKiB0ZXN0ID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwxLCB2YWwyLCAiIik7Ci0gICAgICAgIEJhc2ljQmxvY2sqIGlmRmFsc2UgPSBjcmVhdGVCYXNpY0Jsb2NrKCJmYWxzZSBJRl9BQ01QTkUiKTsKLSAgICAgICAgYnJhbmNoKHRlc3QsIGlmVHJ1ZSwgaWZGYWxzZSwgY3VycmVudEJsb2NrLCBpZlRydWVJbmZvKTsKLSAgICAgICAgY3VycmVudEJsb2NrID0gaWZGYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgR09UTyA6IHsKLSAgICAgICAgdWludDMyIHRtcCA9IGk7Ci0gICAgICAgIGJyYW5jaChvcGNvZGVJbmZvc1t0bXAgKyByZWFkZXIucmVhZFMyKCldLAotICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgICAgICAgaSArPSAyOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBKU1IgOiB7Ci0gICAgICAgIHVpbnQzMiB0bXAgPSBpOwotICAgICAgICB1aW50MzIgaW5kZXggPSBqc3JJbmRleCB8IDE7Ci0gICAgICAgIGpzckluZGV4ICs9IDI7Ci0gICAgICAgIFZhbHVlKiBleHByID0gQ29uc3RhbnRFeHByOjpnZXRJbnRUb1B0cigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50NjRUeSgqbGx2bUNvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCAoaW5kZXgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPkphdmFPYmplY3RUeXBlKTsKLSAgICAgICAgcHVzaChleHByLCBmYWxzZSk7Ci0gICAgICAgIGJyYW5jaChvcGNvZGVJbmZvc1t0bXAgKyByZWFkZXIucmVhZFMyKCldLCBjdXJyZW50QmxvY2spOwotICAgICAgICBpICs9IDI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIFJFVCA6IHsKLSAgICAgICAgdWludDggbG9jYWwgPSByZWFkZXIucmVhZFUxKCk7Ci0gICAgICAgIGkgKz0gMTsKLSAgICAgICAgVmFsdWUqIF92YWwgPSBuZXcgTG9hZEluc3QoCi0gICAgICAgICAgICBvYmplY3RMb2NhbHNbbG9jYWxdLCAiIiwgVGhlQ29tcGlsZXItPnVzZUNvb3BlcmF0aXZlR0MoKSwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgVmFsdWUqIHZhbCA9IG5ldyBQdHJUb0ludEluc3QoX3ZhbCwgVHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgU3dpdGNoSW5zdCogaW5zdCA9IFN3aXRjaEluc3Q6OkNyZWF0ZSh2YWwsIGpzcnNbMF0sIGpzcnMuc2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgICAgICAgCi0gICAgICAgIHVpbnQzMiBpbmRleCA9IDA7Ci0gICAgICAgIGZvciAoc3RkOjp2ZWN0b3I8QmFzaWNCbG9jayo+OjppdGVyYXRvciBpID0ganNycy5iZWdpbigpLCAKLSAgICAgICAgICAgIGUgPSBqc3JzLmVuZCgpOyBpIT0gZTsgKytpLCBpbmRleCArPSAyKSB7Ci0gICAgICAgICAgaW5zdC0+YWRkQ2FzZShDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSwgaW5kZXggfCAxKSwgKmkpOwotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgVEFCTEVTV0lUQ0ggOiB7Ci0gICAgICAgIHVpbnQzMiB0bXAgPSBpOwotICAgICAgICB1aW50MzIgcmVzdGUgPSAoaSArIDEpICYgMzsKLSAgICAgICAgdWludDMyIGZpbGxlZCA9IHJlc3RlID8gICg0IC0gcmVzdGUpIDogMDsKLSAgICAgICAgaSArPSBmaWxsZWQ7Ci0gICAgICAgIHJlYWRlci5jdXJzb3IgKz0gZmlsbGVkOwotICAgICAgICBPcGluZm8mIGRlZiA9IG9wY29kZUluZm9zW3RtcCArIHJlYWRlci5yZWFkVTQoKV07Ci0gICAgICAgIGkgKz0gNDsKLQotICAgICAgICBzaW50MzIgbG93ID0gcmVhZGVyLnJlYWRTNCgpOwotICAgICAgICBpICs9IDQ7Ci0gICAgICAgIHNpbnQzMiBoaWdoID0gcmVhZGVyLnJlYWRTNCgpICsgMTsKLSAgICAgICAgaSArPSA0OwotICAgICAgICAKLSAgICAgICAgVmFsdWUqIGluZGV4ID0gcG9wKCk7IAotICAgICAgICAKLSAgICAgICAgY29uc3QgbGx2bTo6VHlwZSogdHlwZSA9IGluZGV4LT5nZXRUeXBlKCk7Ci0gICAgICAgIGZvciAoc2ludDMyIGN1ciA9IGxvdzsgY3VyIDwgaGlnaDsgKytjdXIpIHsKLSAgICAgICAgICBWYWx1ZSogY21wID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX0VRLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldCh0eXBlLCBjdXIpLCBpbmRleCwgIiIpOwotICAgICAgICAgIEJhc2ljQmxvY2sqIGZhbHNlQmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJjb250aW51ZSB0YWJsZXN3aXRjaCIpOwotICAgICAgICAgIE9waW5mbyYgaW5mbyA9IG9wY29kZUluZm9zW3RtcCArIHJlYWRlci5yZWFkVTQoKV07Ci0gICAgICAgICAgaSArPSA0OwotICAgICAgICAgIGJyYW5jaChjbXAsIGluZm8ubmV3QmxvY2ssIGZhbHNlQmxvY2ssIGN1cnJlbnRCbG9jaywgaW5mbyk7Ci0gICAgICAgICAgY3VycmVudEJsb2NrID0gZmFsc2VCbG9jazsKLSAgICAgICAgfQotICAgICAgIAotICAgICAgICAKLSAgICAgICAgYnJhbmNoKGRlZiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgaSA9IHRtcCArIDEyICsgZmlsbGVkICsgKChoaWdoIC0gbG93KSA8PCAyKTsgCi0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgTE9PS1VQU1dJVENIIDogewotICAgICAgICB1aW50MzIgdG1wID0gaTsKLSAgICAgICAgdWludDMyIGZpbGxlZCA9ICgzIC0gaSkgJiAzOwotICAgICAgICBpICs9IGZpbGxlZDsKLSAgICAgICAgcmVhZGVyLmN1cnNvciArPSBmaWxsZWQ7Ci0gICAgICAgIE9waW5mbyYgZGVmID0gb3Bjb2RlSW5mb3NbdG1wICsgcmVhZGVyLnJlYWRVNCgpXTsKLSAgICAgICAgaSArPSA0OwotICAgICAgICB1aW50MzIgbmJzID0gcmVhZGVyLnJlYWRVNCgpOwotICAgICAgICBpICs9IDQ7Ci0gICAgICAgIAotICAgICAgICBWYWx1ZSoga2V5ID0gcG9wKCk7Ci0gICAgICAgIGZvciAodWludDMyIGN1ciA9IDA7IGN1ciA8IG5iczsgKytjdXIpIHsKLSAgICAgICAgICBWYWx1ZSogdmFsID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KCpsbHZtQ29udGV4dCksIHJlYWRlci5yZWFkVTQoKSk7Ci0gICAgICAgICAgaSArPSA0OwotICAgICAgICAgIFZhbHVlKiBjbXAgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfRVEsIHZhbCwga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIpOwotICAgICAgICAgIEJhc2ljQmxvY2sqIGZhbHNlQmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJjb250aW51ZSBsb29rdXBzd2l0Y2giKTsKLSAgICAgICAgICBPcGluZm8mIGluZm8gPSBvcGNvZGVJbmZvc1t0bXAgKyByZWFkZXIucmVhZFU0KCldOwotICAgICAgICAgIGkgKz0gNDsKLSAgICAgICAgICBicmFuY2goY21wLCBpbmZvLm5ld0Jsb2NrLCBmYWxzZUJsb2NrLCBjdXJyZW50QmxvY2ssIGluZm8pOwotICAgICAgICAgIGN1cnJlbnRCbG9jayA9IGZhbHNlQmxvY2s7Ci0gICAgICAgIH0KLSAgICAgICAgYnJhbmNoKGRlZiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgaSA9IHRtcCArIDggKyBmaWxsZWQgKyAobmJzIDw8IDMpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgSVJFVFVSTiA6IHsKLSAgICAgICAgVmFsdWUqIHZhbCA9IHBvcCgpOwotICAgICAgICBhc3NlcnQodmFsLT5nZXRUeXBlKCktPmlzSW50ZWdlclR5KCkpOwotICAgICAgICBjb252ZXJ0VmFsdWUodmFsLCBlbmROb2RlLT5nZXRUeXBlKCksIGN1cnJlbnRCbG9jaywgZmFsc2UpOwotICAgICAgICBlbmROb2RlLT5hZGRJbmNvbWluZyh2YWwsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShlbmRCbG9jaywgY3VycmVudEJsb2NrKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIExSRVRVUk4gOgotICAgICAgICBwb3AoKTsgLy8gcmVtb3ZlIHRoZSAwIG9uIHRoZSBzdGFjawotICAgICAgICBlbmROb2RlLT5hZGRJbmNvbWluZyhwb3AoKSwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKGVuZEJsb2NrLCBjdXJyZW50QmxvY2spOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBGUkVUVVJOIDoKLSAgICAgICAgZW5kTm9kZS0+YWRkSW5jb21pbmcocG9wKCksIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShlbmRCbG9jaywgY3VycmVudEJsb2NrKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRFJFVFVSTiA6Ci0gICAgICAgIHBvcCgpOyAvLyByZW1vdmUgdGhlIDAgb24gdGhlIHN0YWNrCi0gICAgICAgIGVuZE5vZGUtPmFkZEluY29taW5nKHBvcCgpLCBjdXJyZW50QmxvY2spOwotICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoZW5kQmxvY2ssIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgCi0gICAgICBjYXNlIEFSRVRVUk4gOgotICAgICAgICBlbmROb2RlLT5hZGRJbmNvbWluZyhwb3AoKSwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKGVuZEJsb2NrLCBjdXJyZW50QmxvY2spOwotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBSRVRVUk4gOiB7Ci0gICAgICAgIC8vIFByZXZlbnQgYSBqYXZhYyBidWcuCi0gICAgICAgIGlmIChlbmROb2RlICE9IDApIHsKLSAgICAgICAgICBlbmROb2RlLT5hZGRJbmNvbWluZyhDb25zdGFudDo6Z2V0TnVsbFZhbHVlKGVuZE5vZGUtPmdldFR5cGUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgICAgICAgfQotICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoZW5kQmxvY2ssIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIEdFVFNUQVRJQyA6IHsKLSAgICAgICAgdWludDE2IGluZGV4ID0gcmVhZGVyLnJlYWRVMigpOwotICAgICAgICBpICs9IDI7Ci0gICAgICAgIGdldFN0YXRpY0ZpZWxkKGluZGV4KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgUFVUU1RBVElDIDogewotICAgICAgICB1aW50MTYgaW5kZXggPSByZWFkZXIucmVhZFUyKCk7Ci0gICAgICAgIGkgKz0gMjsKLSAgICAgICAgc2V0U3RhdGljRmllbGQoaW5kZXgpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBHRVRGSUVMRCA6IHsKLSAgICAgICAgdWludDE2IGluZGV4ID0gcmVhZGVyLnJlYWRVMigpOwotICAgICAgICBpICs9IDI7Ci0gICAgICAgIGdldFZpcnR1YWxGaWVsZChpbmRleCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIFBVVEZJRUxEIDogewotICAgICAgICB1aW50MTYgaW5kZXggPSByZWFkZXIucmVhZFUyKCk7Ci0gICAgICAgIGkgKz0gMjsKLSAgICAgICAgc2V0VmlydHVhbEZpZWxkKGluZGV4KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgSU5WT0tFVklSVFVBTCA6IHsKLSAgICAgICAgdWludDE2IGluZGV4ID0gcmVhZGVyLnJlYWRVMigpOwotICAgICAgICBpICs9IDI7Ci0gICAgICAgIGludm9rZVZpcnR1YWwoaW5kZXgpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBJTlZPS0VTUEVDSUFMIDogewotICAgICAgICB1aW50MTYgaW5kZXggPSByZWFkZXIucmVhZFUyKCk7Ci0gICAgICAgIGkgKz0gMjsKLSAgICAgICAgaW52b2tlU3BlY2lhbChpbmRleCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIElOVk9LRVNUQVRJQyA6IHsKLSAgICAgICAgdWludDE2IGluZGV4ID0gcmVhZGVyLnJlYWRVMigpOwotICAgICAgICBpICs9IDI7Ci0gICAgICAgIGludm9rZVN0YXRpYyhpbmRleCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIElOVk9LRUlOVEVSRkFDRSA6IHsKLSAgICAgICAgdWludDE2IGluZGV4ID0gcmVhZGVyLnJlYWRVMigpOwotICAgICAgICBpICs9IDI7Ci0gICAgICAgIGludm9rZUludGVyZmFjZShpbmRleCk7Ci0gICAgICAgIGkgKz0gMjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgTkVXIDogewotICAgICAgICB1aW50MTYgaW5kZXggPSByZWFkZXIucmVhZFUyKCk7Ci0gICAgICAgIGkgKz0gMjsKLSAgICAgICAgaW52b2tlTmV3KGluZGV4KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgTkVXQVJSQVkgOgotICAgICAgY2FzZSBBTkVXQVJSQVkgOiB7Ci0gICAgICAgIAotICAgICAgICBDb25zdGFudCogc2l6ZUVsZW1lbnQgPSAwOwotICAgICAgICBWYWx1ZSogVGhlVlQgPSAwOwotICAgICAgICBWYWx1ZSogdmFsQ2wgPSAwOwotICAgICAgICBVc2VyQ2xhc3NBcnJheSogZGNsID0gMDsKLQotICAgICAgICBpZiAoYnl0ZWNvZGUgPT0gTkVXQVJSQVkpIHsKLSAgICAgICAgICB1aW50OCBpZCA9IHJlYWRlci5yZWFkVTEoKTsKLSAgICAgICAgICBpICs9IDE7Ci0gICAgICAgICAgdWludDggY2hhcklkID0gYXJyYXlUeXBlKGNvbXBpbGluZ01ldGhvZCwgaWQpOwotCi0gICAgICAgICAgZGNsID0gdXBjYWxscy0+Z2V0QXJyYXlDbGFzcyhpZCk7Ci0gICAgICAgICAgdmFsQ2wgPSBUaGVDb21waWxlci0+Z2V0TmF0aXZlQ2xhc3MoZGNsKTsKLQotICAgICAgICAgIExMVk1Bc3Nlc3NvckluZm8mIExBSSA9IFRoZUNvbXBpbGVyLT5Bc3Nlc3NvckluZm9bY2hhcklkXTsKLSAgICAgICAgICBzaXplRWxlbWVudCA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExBSS5sb2dTaXplSW5CeXRlc0NvbnN0YW50KTsKLSAgICAgICAgICBpZiAoVGhlQ29tcGlsZXItPmlzU3RhdGljQ29tcGlsaW5nKCkgJiYKLSAgICAgICAgICAgICAgdmFsQ2wtPmdldFR5cGUoKSAhPSBpbnRyaW5zaWNzLT5KYXZhQ2xhc3NBcnJheVR5cGUpIHsKLSAgICAgICAgICAgIHZhbENsID0gbmV3IExvYWRJbnN0KHZhbENsLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgICAgIFRoZVZUID0gQ2FsbEluc3Q6OkNyZWF0ZShpbnRyaW5zaWNzLT5HZXRWVEZyb21DbGFzc0FycmF5RnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsQ2wsICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBUaGVWVCA9IFRoZUNvbXBpbGVyLT5nZXRWaXJ0dWFsVGFibGUoZGNsLT52aXJ0dWFsVlQpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB1aW50MTYgaW5kZXggPSByZWFkZXIucmVhZFUyKCk7Ci0gICAgICAgICAgaSArPSAyOwotICAgICAgICAgIENvbW1vbkNsYXNzKiBjbCA9Ci0gICAgICAgICAgICBjb21waWxpbmdDbGFzcy0+Y3RwSW5mby0+Z2V0TWV0aG9kQ2xhc3NJZkxvYWRlZChpbmRleCk7IAotCi0gICAgICAgICAgaWYgKGNsICYmICghY2wtPmlzQ2xhc3MoKSB8fCBjbC0+YXNDbGFzcygpLT5pc1Jlc29sdmVkKCkpKSB7Ci0gICAgICAgICAgICBKbmp2bUNsYXNzTG9hZGVyKiBKQ0wgPSBjbC0+Y2xhc3NMb2FkZXI7Ci0gICAgICAgICAgICBjb25zdCBVVEY4KiBhcnJheU5hbWUgPSBKQ0wtPmNvbnN0cnVjdEFycmF5TmFtZSgxLCBjbC0+bmFtZSk7Ci0gICAgICAgICAgCi0gICAgICAgICAgICBkY2wgPSBKQ0wtPmNvbnN0cnVjdEFycmF5KGFycmF5TmFtZSk7Ci0gICAgICAgICAgICB2YWxDbCA9IFRoZUNvbXBpbGVyLT5nZXROYXRpdmVDbGFzcyhkY2wpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBJZiB3ZSdyZSBzdGF0aWMgY29tcGlsaW5nIGFuZCB0aGUgY2xhc3MgaXMgbm90IGEgY2xhc3Mgd2UKLSAgICAgICAgICAgIC8vIGFyZSBjb21waWxpbmcsIHRoZSByZXN1bHQgb2YgZ2V0TmF0aXZlQ2xhc3MgaXMgYSBwb2ludGVyIHRvCi0gICAgICAgICAgICAvLyB0aGUgY2xhc3MuIExvYWQgaXQuCi0gICAgICAgICAgICBpZiAoVGhlQ29tcGlsZXItPmlzU3RhdGljQ29tcGlsaW5nKCkgJiYgCi0gICAgICAgICAgICAgICAgdmFsQ2wtPmdldFR5cGUoKSAhPSBpbnRyaW5zaWNzLT5KYXZhQ2xhc3NBcnJheVR5cGUpIHsKLSAgICAgICAgICAgICAgdmFsQ2wgPSBuZXcgTG9hZEluc3QodmFsQ2wsICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICAgICAgICBUaGVWVCA9IENhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+R2V0VlRGcm9tQ2xhc3NBcnJheUZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsQ2wsICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgVGhlVlQgPSBUaGVDb21waWxlci0+Z2V0VmlydHVhbFRhYmxlKGRjbC0+dmlydHVhbFZUKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb25zdCBsbHZtOjpUeXBlKiBUeSA9IAotICAgICAgICAgICAgICBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKGludHJpbnNpY3MtPlZUVHlwZSk7Ci0gICAgICAgICAgICBWYWx1ZSogYXJnc1szXT0geyBUaGVDb21waWxlci0+Z2V0TmF0aXZlQ2xhc3MoY29tcGlsaW5nQ2xhc3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KCpsbHZtQ29udGV4dCksIGluZGV4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50OjpnZXROdWxsVmFsdWUoVHkpIH07Ci0gICAgICAgICAgICBUaGVWVCA9IENhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+R2V0QXJyYXlDbGFzc0Z1bmN0aW9uLCBhcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgKyAzLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBzaXplRWxlbWVudCA9IGludHJpbnNpY3MtPmNvbnN0YW50UHRyTG9nU2l6ZTsKLSAgICAgICAgfQotICAgICAgICBWYWx1ZSogYXJnMSA9IHBvcEFzSW50KCk7Ci0KLSAgICAgICAgaWYgKFRoZUNvbXBpbGVyLT5oYXNFeGNlcHRpb25zRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgVmFsdWUqIGNtcCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9TTFQsIGFyZzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sICIiKTsKLQotICAgICAgICAgIEJhc2ljQmxvY2sqIEJCMSA9IGNyZWF0ZUJhc2ljQmxvY2soIiIpOwotICAgICAgICAgIEJhc2ljQmxvY2sqIEJCMiA9IGNyZWF0ZUJhc2ljQmxvY2soIiIpOwotCi0gICAgICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKEJCMSwgQkIyLCBjbXAsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgICAgY3VycmVudEJsb2NrID0gQkIxOwotICAgICAgICAgIHRocm93RXhjZXB0aW9uKGludHJpbnNpY3MtPk5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uRnVuY3Rpb24sIGFyZzEpOwotICAgICAgICAgIGN1cnJlbnRCbG9jayA9IEJCMjsKLSAgICAgICAgCi0gICAgICAgICAgY21wID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX1NHVCwgYXJnMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmluc2ljcy0+TWF4QXJyYXlTaXplQ29uc3RhbnQsICIiKTsKLQotICAgICAgICAgIEJCMSA9IGNyZWF0ZUJhc2ljQmxvY2soIiIpOwotICAgICAgICAgIEJCMiA9IGNyZWF0ZUJhc2ljQmxvY2soIiIpOwotCi0gICAgICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKEJCMSwgQkIyLCBjbXAsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgICAgY3VycmVudEJsb2NrID0gQkIxOwotICAgICAgICAgIHRocm93RXhjZXB0aW9uKGludHJpbnNpY3MtPk91dE9mTWVtb3J5RXJyb3JGdW5jdGlvbiwgYXJnMSk7Ci0gICAgICAgICAgY3VycmVudEJsb2NrID0gQkIyOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBWYWx1ZSogbXVsdCA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVTaGwoYXJnMSwgc2l6ZUVsZW1lbnQsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgICAgICAgVmFsdWUqIHNpemUgPQotICAgICAgICAgIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBZGQoaW50cmluc2ljcy0+SmF2YUFycmF5U2l6ZUNvbnN0YW50LCBtdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIFRoZVZUID0gbmV3IEJpdENhc3RJbnN0KFRoZVZULCBpbnRyaW5zaWNzLT5wdHJUeXBlLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgSW5zdHJ1Y3Rpb24qIHJlcyA9IGludm9rZShpbnRyaW5zaWNzLT5BbGxvY2F0ZUZ1bmN0aW9uLCBzaXplLCBUaGVWVCwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgICAgICAgVmFsdWUqIGNhc3QgPSBuZXcgQml0Q2FzdEluc3QocmVzLCBpbnRyaW5zaWNzLT5KYXZhQXJyYXlUeXBlLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLQotICAgICAgICAvLyBTZXQgdGhlIHNpemUKLSAgICAgICAgVmFsdWUqIGdlcDRbMl0gPSB7IGludHJpbnNpY3MtPmNvbnN0YW50WmVybywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPkphdmFBcnJheVNpemVPZmZzZXRDb25zdGFudCB9OwotICAgICAgICBWYWx1ZSogR0VQID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShjYXN0LCBnZXA0LCBnZXA0ICsgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIAotICAgICAgICBhcmcxID0gbmV3IEludFRvUHRySW5zdChhcmcxLCBpbnRyaW5zaWNzLT5wdHJUeXBlLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgbmV3IFN0b3JlSW5zdChhcmcxLCBHRVAsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgCi0gICAgICAgIGFkZEhpZ2hMZXZlbFR5cGUocmVzLCBkY2wgPyBkY2wgOiB1cGNhbGxzLT5BcnJheU9mT2JqZWN0KTsKLSAgICAgICAgcmVzID0gbmV3IEJpdENhc3RJbnN0KHJlcywgaW50cmluc2ljcy0+SmF2YU9iamVjdFR5cGUsICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICBwdXNoKHJlcywgZmFsc2UsIGRjbCA/IGRjbCA6IHVwY2FsbHMtPkFycmF5T2ZPYmplY3QpOwotCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIEFSUkFZTEVOR1RIIDogewotICAgICAgICBWYWx1ZSogdmFsID0gcG9wKCk7Ci0gICAgICAgIEpJVFZlcmlmeU51bGwodmFsKTsKLSAgICAgICAgcHVzaChhcnJheVNpemUodmFsKSwgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBBVEhST1cgOiB7Ci0gICAgICAgIGxsdm06OlZhbHVlKiBhcmcgPSBwb3AoKTsKLSAgICAgICAgdGhyb3dFeGNlcHRpb24oYXJnKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgQ0hFQ0tDQVNUIDoKLSAgICAgICAgaWYgKCFUaGVDb21waWxlci0+aGFzRXhjZXB0aW9uc0VuYWJsZWQoKSkgewotICAgICAgICAgIGkgKz0gMjsKLSAgICAgICAgICByZWFkZXIuY3Vyc29yICs9IDI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgY2FzZSBJTlNUQU5DRU9GIDogewotICAgICAgICAKLSAgICAgICAgYm9vbCBjaGVja2Nhc3QgPSAoYnl0ZWNvZGUgPT0gQ0hFQ0tDQVNUKTsKLSAgICAgICAgCi0gICAgICAgIEJhc2ljQmxvY2sqIGV4Y2VwdGlvbkNoZWNrY2FzdCA9IDA7Ci0gICAgICAgIEJhc2ljQmxvY2sqIGVuZENoZWNrY2FzdCA9IDA7Ci0KLSAgICAgICAgdWludDE2IGluZGV4ID0gcmVhZGVyLnJlYWRVMigpOwotICAgICAgICBpICs9IDI7Ci0gICAgICAgIFVzZXJDb21tb25DbGFzcyogY2wgPSAwOwotICAgICAgICBWYWx1ZSogY2xWYXIgPSBnZXRSZXNvbHZlZENvbW1vbkNsYXNzKGluZGV4LCB0cnVlLCAmY2wpOwotICAgICAgICBWYWx1ZSogb2JqID0gdG9wKCk7Ci0gICAgICAgIFZhbHVlKiBhcmdzWzJdID0geyBvYmosIGNsVmFyIH07Ci0gICAgICAgIFZhbHVlKiBjbXAgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfRVEsIG9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5KYXZhT2JqZWN0TnVsbENvbnN0YW50LCAiIik7Ci0gICAgICAgIEJhc2ljQmxvY2sqIGVuZEJsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygiZW5kIHR5cGUgY29tcGFyZSIpOwotICAgICAgICBQSElOb2RlKiBub2RlID0gUEhJTm9kZTo6Q3JlYXRlKFR5cGU6OmdldEludDFUeSgqbGx2bUNvbnRleHQpLCAiIiwgZW5kQmxvY2spOwotICAgICAgICAKLSAgICAgICAgaWYgKGNoZWNrY2FzdCkgewotICAgICAgICAgIGV4Y2VwdGlvbkNoZWNrY2FzdCA9IGNyZWF0ZUJhc2ljQmxvY2soImZhbHNlIGNoZWNrY2FzdCIpOwotCi0gICAgICAgIAotICAgICAgICAgIGVuZENoZWNrY2FzdCA9IGNyZWF0ZUJhc2ljQmxvY2soIm51bGwgY2hlY2tjYXN0Iik7Ci0gICAgICAgICAgQmFzaWNCbG9jayogaWZGYWxzZSA9IGNyZWF0ZUJhc2ljQmxvY2soIm5vbiBudWxsIGNoZWNrY2FzdCIpOwotCi0gICAgICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKGVuZENoZWNrY2FzdCwgaWZGYWxzZSwgY21wLCBjdXJyZW50QmxvY2spOwotICAgICAgICAgIGN1cnJlbnRCbG9jayA9IGV4Y2VwdGlvbkNoZWNrY2FzdDsKLSAgICAgICAgICB0aHJvd0V4Y2VwdGlvbihpbnRyaW5zaWNzLT5DbGFzc0Nhc3RFeGNlcHRpb25GdW5jdGlvbiwgYXJncywgMik7Ci0gICAgICAgICAgY3VycmVudEJsb2NrID0gaWZGYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2UgdHlwZSBjb21wYXJlIik7Ci0gICAgICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKGVuZEJsb2NrLCBpZkZhbHNlLCBjbXAsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgICAgbm9kZS0+YWRkSW5jb21pbmcoQ29uc3RhbnRJbnQ6OmdldEZhbHNlKCpsbHZtQ29udGV4dCksIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgICAgY3VycmVudEJsb2NrID0gaWZGYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIFZhbHVlKiBUaGVWVCA9IDA7Ci0gICAgICAgIGlmICghY2wgfHwgVGhlQ29tcGlsZXItPmlzU3RhdGljQ29tcGlsaW5nKCkpIHsKLSAgICAgICAgICBUaGVWVCA9IENhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+R2V0VlRGcm9tQ29tbW9uQ2xhc3NGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xWYXIsICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFRoZVZUID0gVGhlQ29tcGlsZXItPmdldFZpcnR1YWxUYWJsZShjbC0+dmlydHVhbFZUKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotICAgICAgICBWYWx1ZSogb2JqVlQgPSBDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPkdldFZURnVuY3Rpb24sIG9iaiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICAgICAgICBWYWx1ZSogY2xhc3NBcmdzWzJdID0geyBvYmpWVCwgVGhlVlQgfTsKLSAgICAgICAgIAotICAgICAgICBWYWx1ZSogcmVzID0gMDsKLSAgICAgICAgaWYgKGNsKSB7Ci0gICAgICAgICAgaWYgKGNsLT5pc1NlY29uZGFyeUNsYXNzKCkpIHsKLSAgICAgICAgICAgIHJlcyA9IENhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+SXNTZWNvbmRhcnlDbGFzc0Z1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0FyZ3MsIGNsYXNzQXJncyArIDIsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBWYWx1ZSogaW5EaXNwbGF5ID0gQ2FsbEluc3Q6OkNyZWF0ZShpbnRyaW5zaWNzLT5HZXREaXNwbGF5RnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpWVCwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHVpbnQzMiBkZXB0aCA9IGNsLT52aXJ0dWFsVlQtPmRlcHRoOwotICAgICAgICAgICAgQ29uc3RhbnRJbnQqIENJID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KCpsbHZtQ29udGV4dCksIGRlcHRoKTsKLSAgICAgICAgICAgIFZhbHVlKiBkaXNwbGF5QXJnc1syXSA9IHsgaW5EaXNwbGF5LCBDSSB9OwotICAgICAgICAgICAgVmFsdWUqIFZUSW5EaXNwbGF5ID0gCi0gICAgICAgICAgICAgIENhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+R2V0VlRJbkRpc3BsYXlGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5QXJncywgZGlzcGxheUFyZ3MgKyAyLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICAgICAgICAgICAgIAotICAgICAgICAgICAgcmVzID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX0VRLCBWVEluRGlzcGxheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVWVCwgIiIpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXMgPSBDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPklzQXNzaWduYWJsZUZyb21GdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzQXJncywgY2xhc3NBcmdzICsgMiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICAgICAgICB9Ci0KLSAgICAgICAgbm9kZS0+YWRkSW5jb21pbmcocmVzLCBjdXJyZW50QmxvY2spOwotICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoZW5kQmxvY2ssIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIGN1cnJlbnRCbG9jayA9IGVuZEJsb2NrOwotCi0gICAgICAgIGlmIChjaGVja2Nhc3QpIHsKLSAgICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoZW5kQ2hlY2tjYXN0LCBleGNlcHRpb25DaGVja2Nhc3QsIG5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgICAgY3VycmVudEJsb2NrID0gZW5kQ2hlY2tjYXN0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHBvcCgpOwotICAgICAgICAgIHB1c2gobmV3IFpFeHRJbnN0KG5vZGUsIFR5cGU6OmdldEludDMyVHkoKmxsdm1Db250ZXh0KSwgIiIsIGN1cnJlbnRCbG9jayksCi0gICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBNT05JVE9SRU5URVIgOiB7Ci0gICAgICAgIFZhbHVlKiBvYmogPSBwb3AoKTsKLSAgICAgICAgSklUVmVyaWZ5TnVsbChvYmopOwotICAgICAgICBtb25pdG9yRW50ZXIob2JqKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgTU9OSVRPUkVYSVQgOiB7Ci0gICAgICAgIFZhbHVlKiBvYmogPSBwb3AoKTsKLSAgICAgICAgSklUVmVyaWZ5TnVsbChvYmopOwotICAgICAgICBtb25pdG9yRXhpdChvYmopOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBNVUxUSUFORVdBUlJBWSA6IHsKLSAgICAgICAgdWludDE2IGluZGV4ID0gcmVhZGVyLnJlYWRVMigpOwotICAgICAgICBpICs9IDI7Ci0gICAgICAgIHVpbnQ4IGRpbSA9IHJlYWRlci5yZWFkVTEoKTsKLSAgICAgICAgaSArPSAxOwotICAgICAgICAKLSAgICAgICAgVXNlckNvbW1vbkNsYXNzKiBkY2wgPSAwOyAKLSAgICAgICAgVmFsdWUqIHZhbENsID0gZ2V0UmVzb2x2ZWRDb21tb25DbGFzcyhpbmRleCwgdHJ1ZSwgJmRjbCk7Ci0gICAgICAgIFZhbHVlKiogYXJncyA9IChWYWx1ZSoqKWFsbG9jYXRvci5BbGxvY2F0ZShzaXplb2YoVmFsdWUqKSAqIChkaW0gKyAyKSk7Ci0gICAgICAgIGFyZ3NbMF0gPSB2YWxDbDsKLSAgICAgICAgYXJnc1sxXSA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeSgqbGx2bUNvbnRleHQpLCBkaW0pOwotCi0gICAgICAgIGZvciAoaW50IGN1ciA9IGRpbSArIDE7IGN1ciA+PSAyOyAtLWN1cikKLSAgICAgICAgICBhcmdzW2N1cl0gPSBwb3AoKTsKLSAgICAgICAgCi0gICAgICAgIHN0ZDo6dmVjdG9yPFZhbHVlKj4gQXJnczsKLSAgICAgICAgZm9yIChzaW50MzIgdiA9IDA7IHYgPCBkaW0gKyAyOyArK3YpIHsKLSAgICAgICAgICBBcmdzLnB1c2hfYmFjayhhcmdzW3ZdKTsKLSAgICAgICAgfQotICAgICAgICBwdXNoKGludm9rZShpbnRyaW5zaWNzLT5NdWx0aUNhbGxOZXdGdW5jdGlvbiwgQXJncywgIiIsIGN1cnJlbnRCbG9jayksCi0gICAgICAgICAgICAgZmFsc2UsIGRjbCA/IGRjbCA6IHVwY2FsbHMtPkFycmF5T2ZPYmplY3QpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBXSURFIDoKLSAgICAgICAgd2lkZSA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIElGTlVMTCA6IHsKLSAgICAgICAgdWludDMyIHRtcCA9IGk7Ci0gICAgICAgIGxsdm06OlZhbHVlKiB2YWwgPSBwb3AoKTsKLSAgICAgICAgQ29uc3RhbnQqIG5pbCA9IENvbnN0YW50OjpnZXROdWxsVmFsdWUodmFsLT5nZXRUeXBlKCkpOwotICAgICAgICBsbHZtOjpWYWx1ZSogdGVzdCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9FUSwgdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWwsICIiKTsKLSAgICAgICAgQmFzaWNCbG9jayogaWZGYWxzZSA9IGNyZWF0ZUJhc2ljQmxvY2soInRydWUgSUZOVUxMIik7Ci0gICAgICAgIE9waW5mbyYgaWZUcnVlSW5mbyA9IG9wY29kZUluZm9zW3RtcCArIHJlYWRlci5yZWFkUzIoKV07Ci0gICAgICAgIGkgKz0gMjsKLSAgICAgICAgQmFzaWNCbG9jayogaWZUcnVlID0gaWZUcnVlSW5mby5uZXdCbG9jazsKLSAgICAgICAgYnJhbmNoKHRlc3QsIGlmVHJ1ZSwgaWZGYWxzZSwgY3VycmVudEJsb2NrLCBpZlRydWVJbmZvKTsKLSAgICAgICAgY3VycmVudEJsb2NrID0gaWZGYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgSUZOT05OVUxMIDogewotICAgICAgICB1aW50MzIgdG1wID0gaTsKLSAgICAgICAgbGx2bTo6VmFsdWUqIHZhbCA9IHBvcCgpOwotICAgICAgICBDb25zdGFudCogbmlsID0gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZSh2YWwtPmdldFR5cGUoKSk7Ci0gICAgICAgIGxsdm06OlZhbHVlKiB0ZXN0ID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX05FLCB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbCwgIiIpOwotICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2UgSUZOT05OVUxMIik7Ci0gICAgICAgIE9waW5mbyYgaWZUcnVlSW5mbyA9IG9wY29kZUluZm9zW3RtcCArIHJlYWRlci5yZWFkUzIoKV07Ci0gICAgICAgIGkgKz0gMjsKLSAgICAgICAgQmFzaWNCbG9jayogaWZUcnVlID0gaWZUcnVlSW5mby5uZXdCbG9jazsKLSAgICAgICAgYnJhbmNoKHRlc3QsIGlmVHJ1ZSwgaWZGYWxzZSwgY3VycmVudEJsb2NrLCBpZlRydWVJbmZvKTsKLSAgICAgICAgY3VycmVudEJsb2NrID0gaWZGYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGRlZmF1bHQgOiB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiSSBoYXZlbid0IHZlcmlmaWVkIHlvdXIgY2xhc3MgZmlsZSBhbmQgaXQncyBtYWxmb3JtZWQ6IgotICAgICAgICAgICAgICAgICAgICAiIHVua25vd24gYnl0ZWNvZGUgJWQgaW4gJXMuJXNcbiEiLCBieXRlY29kZSwKLSAgICAgICAgICAgICAgICAgICAgVVRGOEJ1ZmZlcihjb21waWxpbmdDbGFzcy0+bmFtZSkuY1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICBVVEY4QnVmZmVyKGNvbXBpbGluZ01ldGhvZC0+bmFtZSkuY1N0cmluZygpKTsKLSAgICAgICAgYWJvcnQoKTsKLSAgICAgIH0KLSAgICB9IAotICB9Ci19Ci0KLXZvaWQgSmF2YUpJVDo6ZXhwbG9yZU9wY29kZXMoUmVhZGVyJiByZWFkZXIsIHVpbnQzMiBjb2RlTGVuZ3RoKSB7Ci0gIGJvb2wgd2lkZSA9IGZhbHNlOwotICB1aW50MzIgc3RhcnQgPSByZWFkZXIuY3Vyc29yOwotICBmb3IodWludDMyIGkgPSAwOyBpIDwgY29kZUxlbmd0aDsgKytpKSB7Ci0gICAgcmVhZGVyLmN1cnNvciA9IHN0YXJ0ICsgaTsKLSAgICB1aW50OCBieXRlY29kZSA9IHJlYWRlci5yZWFkVTEoKTsKLSAgICBQUklOVF9ERUJVRyhKTkpWTV9DT01QSUxFLCAxLCBDT0xPUl9OT1JNQUwsICJcdFthdCAlNWRdICUtNWQgIiwgaSwKLSAgICAgICAgICAgICAgICBieXRlY29kZSk7Ci0gICAgUFJJTlRfREVCVUcoSk5KVk1fQ09NUElMRSwgMSwgTElHSFRfQkxVRSwgImV4cGxvcmluZyAiKTsKLSAgICBQUklOVF9ERUJVRyhKTkpWTV9DT01QSUxFLCAxLCBMSUdIVF9DWUFOLCBPcGNvZGVOYW1lc1tieXRlY29kZV0pOwotICAgIFBSSU5UX0RFQlVHKEpOSlZNX0NPTVBJTEUsIDEsIExJR0hUX0JMVUUsICJcbiIpOwotICAgIAotICAgIHN3aXRjaCAoYnl0ZWNvZGUpIHsKLSAgICAgCi0gICAgICBjYXNlIE5PUCA6Ci0gICAgICBjYXNlIEFDT05TVF9OVUxMIDogCi0gICAgICBjYXNlIElDT05TVF9NMSA6Ci0gICAgICBjYXNlIElDT05TVF8wIDoKLSAgICAgIGNhc2UgSUNPTlNUXzEgOgotICAgICAgY2FzZSBJQ09OU1RfMiA6Ci0gICAgICBjYXNlIElDT05TVF8zIDoKLSAgICAgIGNhc2UgSUNPTlNUXzQgOgotICAgICAgY2FzZSBJQ09OU1RfNSA6Ci0gICAgICBjYXNlIExDT05TVF8wIDoKLSAgICAgIGNhc2UgTENPTlNUXzEgOgotICAgICAgY2FzZSBGQ09OU1RfMCA6Ci0gICAgICBjYXNlIEZDT05TVF8xIDogCi0gICAgICBjYXNlIEZDT05TVF8yIDoKLSAgICAgIGNhc2UgRENPTlNUXzAgOgotICAgICAgY2FzZSBEQ09OU1RfMSA6IGJyZWFrOwotCi0gICAgICBjYXNlIEJJUFVTSCA6ICsraTsgYnJlYWs7Ci0gICAgICAKLSAgICAgIGNhc2UgU0lQVVNIIDogaSArPSAyOyBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBMREMgOiArK2k7IGJyZWFrOwotCi0gICAgICBjYXNlIExEQ19XIDogCi0gICAgICBjYXNlIExEQzJfVyA6IGkgKz0gMjsgYnJlYWs7Ci0KLSAgICAgIGNhc2UgSUxPQUQgOgotICAgICAgY2FzZSBMTE9BRCA6Ci0gICAgICBjYXNlIEZMT0FEIDoKLSAgICAgIGNhc2UgRExPQUQgOgotICAgICAgY2FzZSBBTE9BRCA6Ci0gICAgICAgIGkgKz0gV0NBTEMoMSwgd2lkZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgCi0gICAgICBjYXNlIElMT0FEXzAgOgotICAgICAgY2FzZSBJTE9BRF8xIDoKLSAgICAgIGNhc2UgSUxPQURfMiA6Ci0gICAgICBjYXNlIElMT0FEXzMgOgotICAgICAgY2FzZSBMTE9BRF8wIDoKLSAgICAgIGNhc2UgTExPQURfMSA6Ci0gICAgICBjYXNlIExMT0FEXzIgOgotICAgICAgY2FzZSBMTE9BRF8zIDoKLSAgICAgIGNhc2UgRkxPQURfMCA6Ci0gICAgICBjYXNlIEZMT0FEXzEgOgotICAgICAgY2FzZSBGTE9BRF8yIDoKLSAgICAgIGNhc2UgRkxPQURfMyA6Ci0gICAgICBjYXNlIERMT0FEXzAgOgotICAgICAgY2FzZSBETE9BRF8xIDoKLSAgICAgIGNhc2UgRExPQURfMiA6Ci0gICAgICBjYXNlIERMT0FEXzMgOgotICAgICAgY2FzZSBBTE9BRF8wIDoKLSAgICAgIGNhc2UgQUxPQURfMSA6Ci0gICAgICBjYXNlIEFMT0FEXzIgOgotICAgICAgY2FzZSBBTE9BRF8zIDoKLSAgICAgIGNhc2UgSUFMT0FEIDoKLSAgICAgIGNhc2UgTEFMT0FEIDoKLSAgICAgIGNhc2UgRkFMT0FEIDoKLSAgICAgIGNhc2UgREFMT0FEIDoKLSAgICAgIGNhc2UgQUFMT0FEIDoKLSAgICAgIGNhc2UgQkFMT0FEIDoKLSAgICAgIGNhc2UgQ0FMT0FEIDoKLSAgICAgIGNhc2UgU0FMT0FEIDogYnJlYWs7Ci0KLSAgICAgIGNhc2UgSVNUT1JFIDoKLSAgICAgIGNhc2UgTFNUT1JFIDoKLSAgICAgIGNhc2UgRlNUT1JFIDoKLSAgICAgIGNhc2UgRFNUT1JFIDoKLSAgICAgIGNhc2UgQVNUT1JFIDoKLSAgICAgICAgaSArPSBXQ0FMQygxLCB3aWRlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICAgIGNhc2UgSVNUT1JFXzAgOgotICAgICAgY2FzZSBJU1RPUkVfMSA6Ci0gICAgICBjYXNlIElTVE9SRV8yIDoKLSAgICAgIGNhc2UgSVNUT1JFXzMgOgotICAgICAgY2FzZSBMU1RPUkVfMCA6Ci0gICAgICBjYXNlIExTVE9SRV8xIDoKLSAgICAgIGNhc2UgTFNUT1JFXzIgOgotICAgICAgY2FzZSBMU1RPUkVfMyA6Ci0gICAgICBjYXNlIEZTVE9SRV8wIDoKLSAgICAgIGNhc2UgRlNUT1JFXzEgOgotICAgICAgY2FzZSBGU1RPUkVfMiA6Ci0gICAgICBjYXNlIEZTVE9SRV8zIDoKLSAgICAgIGNhc2UgRFNUT1JFXzAgOgotICAgICAgY2FzZSBEU1RPUkVfMSA6Ci0gICAgICBjYXNlIERTVE9SRV8yIDoKLSAgICAgIGNhc2UgRFNUT1JFXzMgOgotICAgICAgY2FzZSBBU1RPUkVfMCA6Ci0gICAgICBjYXNlIEFTVE9SRV8xIDoKLSAgICAgIGNhc2UgQVNUT1JFXzIgOgotICAgICAgY2FzZSBBU1RPUkVfMyA6Ci0gICAgICBjYXNlIElBU1RPUkUgOgotICAgICAgY2FzZSBMQVNUT1JFIDoKLSAgICAgIGNhc2UgRkFTVE9SRSA6Ci0gICAgICBjYXNlIERBU1RPUkUgOgotICAgICAgY2FzZSBBQVNUT1JFIDoKLSAgICAgIGNhc2UgQkFTVE9SRSA6Ci0gICAgICBjYXNlIENBU1RPUkUgOgotICAgICAgY2FzZSBTQVNUT1JFIDoKLSAgICAgIGNhc2UgUE9QIDoKLSAgICAgIGNhc2UgUE9QMiA6Ci0gICAgICBjYXNlIERVUCA6Ci0gICAgICBjYXNlIERVUF9YMSA6Ci0gICAgICBjYXNlIERVUF9YMiA6Ci0gICAgICBjYXNlIERVUDIgOgotICAgICAgY2FzZSBEVVAyX1gxIDoKLSAgICAgIGNhc2UgRFVQMl9YMiA6Ci0gICAgICBjYXNlIFNXQVAgOgotICAgICAgY2FzZSBJQUREIDoKLSAgICAgIGNhc2UgTEFERCA6Ci0gICAgICBjYXNlIEZBREQgOgotICAgICAgY2FzZSBEQUREIDoKLSAgICAgIGNhc2UgSVNVQiA6Ci0gICAgICBjYXNlIExTVUIgOgotICAgICAgY2FzZSBGU1VCIDoKLSAgICAgIGNhc2UgRFNVQiA6Ci0gICAgICBjYXNlIElNVUwgOgotICAgICAgY2FzZSBMTVVMIDoKLSAgICAgIGNhc2UgRk1VTCA6Ci0gICAgICBjYXNlIERNVUwgOgotICAgICAgY2FzZSBJRElWIDoKLSAgICAgIGNhc2UgTERJViA6Ci0gICAgICBjYXNlIEZESVYgOgotICAgICAgY2FzZSBERElWIDoKLSAgICAgIGNhc2UgSVJFTSA6Ci0gICAgICBjYXNlIExSRU0gOgotICAgICAgY2FzZSBGUkVNIDoKLSAgICAgIGNhc2UgRFJFTSA6Ci0gICAgICBjYXNlIElORUcgOgotICAgICAgY2FzZSBMTkVHIDoKLSAgICAgIGNhc2UgRk5FRyA6Ci0gICAgICBjYXNlIERORUcgOgotICAgICAgY2FzZSBJU0hMIDoKLSAgICAgIGNhc2UgTFNITCA6Ci0gICAgICBjYXNlIElTSFIgOgotICAgICAgY2FzZSBMU0hSIDoKLSAgICAgIGNhc2UgSVVTSFIgOgotICAgICAgY2FzZSBMVVNIUiA6Ci0gICAgICBjYXNlIElBTkQgOgotICAgICAgY2FzZSBMQU5EIDoKLSAgICAgIGNhc2UgSU9SIDoKLSAgICAgIGNhc2UgTE9SIDoKLSAgICAgIGNhc2UgSVhPUiA6Ci0gICAgICBjYXNlIExYT1IgOiBicmVhazsKLQotICAgICAgY2FzZSBJSU5DIDoKLSAgICAgICAgaSArPSBXQ0FMQygyLCB3aWRlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICAgIGNhc2UgSTJMIDoKLSAgICAgIGNhc2UgSTJGIDoKLSAgICAgIGNhc2UgSTJEIDoKLSAgICAgIGNhc2UgTDJJIDoKLSAgICAgIGNhc2UgTDJGIDoKLSAgICAgIGNhc2UgTDJEIDoKLSAgICAgIGNhc2UgRjJJIDoKLSAgICAgIGNhc2UgRjJMIDoKLSAgICAgIGNhc2UgRjJEIDoKLSAgICAgIGNhc2UgRDJJIDoKLSAgICAgIGNhc2UgRDJMIDoKLSAgICAgIGNhc2UgRDJGIDoKLSAgICAgIGNhc2UgSTJCIDoKLSAgICAgIGNhc2UgSTJDIDoKLSAgICAgIGNhc2UgSTJTIDoKLSAgICAgIGNhc2UgTENNUCA6Ci0gICAgICBjYXNlIEZDTVBMIDoKLSAgICAgIGNhc2UgRkNNUEcgOgotICAgICAgY2FzZSBEQ01QTCA6Ci0gICAgICBjYXNlIERDTVBHIDogYnJlYWs7Ci0KLSAgICAgIGNhc2UgSUZFUSA6Ci0gICAgICBjYXNlIElGTkUgOgotICAgICAgY2FzZSBJRkxUIDoKLSAgICAgIGNhc2UgSUZHRSA6Ci0gICAgICBjYXNlIElGR1QgOgotICAgICAgY2FzZSBJRkxFIDoKLSAgICAgIGNhc2UgSUZfSUNNUEVRIDoKLSAgICAgIGNhc2UgSUZfSUNNUE5FIDoKLSAgICAgIGNhc2UgSUZfSUNNUExUIDoKLSAgICAgIGNhc2UgSUZfSUNNUEdFIDoKLSAgICAgIGNhc2UgSUZfSUNNUEdUIDoKLSAgICAgIGNhc2UgSUZfSUNNUExFIDoKLSAgICAgIGNhc2UgSUZfQUNNUEVRIDoKLSAgICAgIGNhc2UgSUZfQUNNUE5FIDoKLSAgICAgIGNhc2UgR09UTyA6IHsKLSAgICAgICAgdWludDMyIHRtcCA9IGk7Ci0gICAgICAgIHVpbnQxNiBpbmRleCA9IHRtcCArIHJlYWRlci5yZWFkVTIoKTsKLSAgICAgICAgaSArPSAyOwotICAgICAgICBpZiAoIShvcGNvZGVJbmZvc1tpbmRleF0ubmV3QmxvY2spKQotICAgICAgICAgIG9wY29kZUluZm9zW2luZGV4XS5uZXdCbG9jayA9IGNyZWF0ZUJhc2ljQmxvY2soIkdPVE8gb3IgSUYqIik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIEpTUiA6IHsKLSAgICAgICAgdWludDMyIHRtcCA9IGk7Ci0gICAgICAgIHVpbnQxNiBpbmRleCA9IHRtcCArIHJlYWRlci5yZWFkVTIoKTsKLSAgICAgICAgaSArPSAyOwotICAgICAgICBpZiAoIShvcGNvZGVJbmZvc1tpbmRleF0ubmV3QmxvY2spKSB7Ci0gICAgICAgICAgQmFzaWNCbG9jayogYmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJKU1IiKTsKLSAgICAgICAgICBvcGNvZGVJbmZvc1tpbmRleF0ubmV3QmxvY2sgPSBibG9jazsKLSAgICAgICAgfQotICAgICAgICBpZiAoIShvcGNvZGVJbmZvc1t0bXAgKyAzXS5uZXdCbG9jaykpIHsKLSAgICAgICAgICBCYXNpY0Jsb2NrKiBibG9jayA9IGNyZWF0ZUJhc2ljQmxvY2soIkpTUjIiKTsKLSAgICAgICAgICBqc3JzLnB1c2hfYmFjayhibG9jayk7Ci0gICAgICAgICAgb3Bjb2RlSW5mb3NbdG1wICsgM10ubmV3QmxvY2sgPSBibG9jazsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBqc3JzLnB1c2hfYmFjayhvcGNvZGVJbmZvc1t0bXAgKyAzXS5uZXdCbG9jayk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgUkVUIDogKytpOyBicmVhazsKLQotICAgICAgY2FzZSBUQUJMRVNXSVRDSCA6IHsKLSAgICAgICAgdWludDMyIHRtcCA9IGk7Ci0gICAgICAgIHVpbnQzMiByZXN0ZSA9IChpICsgMSkgJiAzOwotICAgICAgICB1aW50MzIgZmlsbGVkID0gcmVzdGUgPyAoNCAtIHJlc3RlKSA6IDA7IAotICAgICAgICBpICs9IGZpbGxlZDsKLSAgICAgICAgcmVhZGVyLmN1cnNvciArPSBmaWxsZWQ7Ci0gICAgICAgIHVpbnQzMiBpbmRleCA9IHRtcCArIHJlYWRlci5yZWFkVTQoKTsKLSAgICAgICAgaSArPSA0OwotICAgICAgICBpZiAoIShvcGNvZGVJbmZvc1tpbmRleF0ubmV3QmxvY2spKSB7Ci0gICAgICAgICAgQmFzaWNCbG9jayogYmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJ0YWJsZXN3aXRjaCIpOwotICAgICAgICAgIG9wY29kZUluZm9zW2luZGV4XS5uZXdCbG9jayA9IGJsb2NrOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQzMiBsb3cgPSByZWFkZXIucmVhZFU0KCk7Ci0gICAgICAgIGkgKz0gNDsKLSAgICAgICAgdWludDMyIGhpZ2ggPSByZWFkZXIucmVhZFU0KCkgKyAxOwotICAgICAgICBpICs9IDQ7Ci0gICAgICAgIHVpbnQzMiBkZXBsID0gaGlnaCAtIGxvdzsKLSAgICAgICAgZm9yICh1aW50MzIgY3VyID0gMDsgY3VyIDwgZGVwbDsgKytjdXIpIHsKLSAgICAgICAgICB1aW50MzIgaW5kZXgyID0gdG1wICsgcmVhZGVyLnJlYWRVNCgpOwotICAgICAgICAgIGkgKz0gNDsKLSAgICAgICAgICBpZiAoIShvcGNvZGVJbmZvc1tpbmRleDJdLm5ld0Jsb2NrKSkgewotICAgICAgICAgICAgQmFzaWNCbG9jayogYmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJ0YWJsZXN3aXRjaCIpOwotICAgICAgICAgICAgb3Bjb2RlSW5mb3NbaW5kZXgyXS5uZXdCbG9jayA9IGJsb2NrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpID0gdG1wICsgMTIgKyBmaWxsZWQgKyAoZGVwbCA8PCAyKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgTE9PS1VQU1dJVENIIDogewotICAgICAgICB1aW50MzIgdG1wID0gaTsKLSAgICAgICAgdWludDMyIGZpbGxlZCA9ICgzIC0gaSkgJiAzOwotICAgICAgICBpICs9IGZpbGxlZDsKLSAgICAgICAgcmVhZGVyLmN1cnNvciArPSBmaWxsZWQ7Ci0gICAgICAgIHVpbnQzMiBpbmRleCA9IHRtcCArIHJlYWRlci5yZWFkVTQoKTsKLSAgICAgICAgaSArPSA0OwotICAgICAgICBpZiAoIShvcGNvZGVJbmZvc1tpbmRleF0ubmV3QmxvY2spKSB7Ci0gICAgICAgICAgQmFzaWNCbG9jayogYmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJ0YWJsZXN3aXRjaCIpOwotICAgICAgICAgIG9wY29kZUluZm9zW2luZGV4XS5uZXdCbG9jayA9IGJsb2NrOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQzMiBuYnMgPSByZWFkZXIucmVhZFU0KCk7Ci0gICAgICAgIGkgKz0gNDsKLSAgICAgICAgZm9yICh1aW50MzIgY3VyID0gMDsgY3VyIDwgbmJzOyArK2N1cikgewotICAgICAgICAgIGkgKz0gNDsKLSAgICAgICAgICByZWFkZXIuY3Vyc29yICs9IDQ7Ci0gICAgICAgICAgdWludDMyIGluZGV4MiA9IHRtcCArIHJlYWRlci5yZWFkVTQoKTsKLSAgICAgICAgICBpICs9IDQ7Ci0gICAgICAgICAgaWYgKCEob3Bjb2RlSW5mb3NbaW5kZXgyXS5uZXdCbG9jaykpIHsKLSAgICAgICAgICAgIEJhc2ljQmxvY2sqIGJsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygidGFibGVzd2l0Y2giKTsKLSAgICAgICAgICAgIG9wY29kZUluZm9zW2luZGV4Ml0ubmV3QmxvY2sgPSBibG9jazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGkgPSB0bXAgKyA4ICsgZmlsbGVkICsgKG5icyA8PCAzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgSVJFVFVSTiA6Ci0gICAgICBjYXNlIExSRVRVUk4gOgotICAgICAgY2FzZSBGUkVUVVJOIDoKLSAgICAgIGNhc2UgRFJFVFVSTiA6Ci0gICAgICBjYXNlIEFSRVRVUk4gOgotICAgICAgY2FzZSBSRVRVUk4gOiBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBHRVRTVEFUSUMgOgotICAgICAgY2FzZSBQVVRTVEFUSUMgOgotICAgICAgY2FzZSBHRVRGSUVMRCA6Ci0gICAgICBjYXNlIFBVVEZJRUxEIDoKLSAgICAgIGNhc2UgSU5WT0tFVklSVFVBTCA6Ci0gICAgICBjYXNlIElOVk9LRVNQRUNJQUwgOgotICAgICAgY2FzZSBJTlZPS0VTVEFUSUMgOgotICAgICAgICBpICs9IDI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgCi0gICAgICBjYXNlIElOVk9LRUlOVEVSRkFDRSA6Ci0gICAgICAgIGkgKz0gNDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgTkVXIDoKLSAgICAgICAgaSArPSAyOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBORVdBUlJBWSA6Ci0gICAgICAgICsraTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICAgIGNhc2UgQU5FV0FSUkFZIDoKLSAgICAgICAgaSArPSAyOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBBUlJBWUxFTkdUSCA6Ci0gICAgICBjYXNlIEFUSFJPVyA6IGJyZWFrOwotCi0gICAgICBjYXNlIENIRUNLQ0FTVCA6Ci0gICAgICAgIGkgKz0gMjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgSU5TVEFOQ0VPRiA6Ci0gICAgICAgIGkgKz0gMjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICAgIGNhc2UgTU9OSVRPUkVOVEVSIDoKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgTU9OSVRPUkVYSVQgOgotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBNVUxUSUFORVdBUlJBWSA6Ci0gICAgICAgIGkgKz0gMzsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgV0lERSA6Ci0gICAgICAgIHdpZGUgPSB0cnVlOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBJRk5VTEwgOgotICAgICAgY2FzZSBJRk5PTk5VTEwgOiB7Ci0gICAgICAgIHVpbnQzMiB0bXAgPSBpOwotICAgICAgICB1aW50MTYgaW5kZXggPSB0bXAgKyByZWFkZXIucmVhZFUyKCk7Ci0gICAgICAgIGkgKz0gMjsKLSAgICAgICAgaWYgKCEob3Bjb2RlSW5mb3NbaW5kZXhdLm5ld0Jsb2NrKSkKLSAgICAgICAgICBvcGNvZGVJbmZvc1tpbmRleF0ubmV3QmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJ0cnVlIElGKk5VTEwiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLQotICAgICAgZGVmYXVsdCA6IHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJJIGhhdmVuJ3QgdmVyaWZpZWQgeW91ciBjbGFzcyBmaWxlIGFuZCBpdCdzIG1hbGZvcm1lZDoiCi0gICAgICAgICAgICAgICAgICAgICIgdW5rbm93biBieXRlY29kZSAlZCBpbiAlcy4lcyFcbiIsIGJ5dGVjb2RlLAotICAgICAgICAgICAgICAgICAgICBVVEY4QnVmZmVyKGNvbXBpbGluZ0NsYXNzLT5uYW1lKS5jU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgIFVURjhCdWZmZXIoY29tcGlsaW5nTWV0aG9kLT5uYW1lKS5jU3RyaW5nKCkpOwotICAgICAgICBhYm9ydCgpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL0ozL0NvbXBpbGVyL0phdmFMTFZNQ29tcGlsZXIuY3BwIGIvdm1raXQvbGliL0ozL0NvbXBpbGVyL0phdmFMTFZNQ29tcGlsZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzI5ZjAwLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9KMy9Db21waWxlci9KYXZhTExWTUNvbXBpbGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vLz09PS0tLS0tLS0tIEphdmFMTFZNQ29tcGlsZXIuY3BwIC0gQSBMTFZNIENvbXBpbGVyIGZvciBKMyAtLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgImxsdm0vTExWTUNvbnRleHQuaCIKLSNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgotI2luY2x1ZGUgImxsdm0vUGFzc01hbmFnZXIuaCIKLSNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BQYXNzLmgiCi0jaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgotCi0jaW5jbHVkZSAibXZtL0pJVC5oIgotCi0jaW5jbHVkZSAiSmF2YUNsYXNzLmgiCi0jaW5jbHVkZSAiSmF2YUpJVC5oIgotCi0jaW5jbHVkZSAiajMvSmF2YUxMVk1Db21waWxlci5oIgotCi11c2luZyBuYW1lc3BhY2UgajM7Ci11c2luZyBuYW1lc3BhY2UgbGx2bTsKLQotSmF2YUxMVk1Db21waWxlcjo6SmF2YUxMVk1Db21waWxlcihjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSA6Ci0gIFRoZU1vZHVsZShuZXcgbGx2bTo6TW9kdWxlKHN0ciwgKihuZXcgTExWTUNvbnRleHQoKSkpKSwKLSAgRGVidWdGYWN0b3J5KG5ldyBESUZhY3RvcnkoKlRoZU1vZHVsZSkpLAotICBKYXZhSW50cmluc2ljcyhUaGVNb2R1bGUpIHsKLQotICBlbmFibGVkRXhjZXB0aW9uID0gdHJ1ZTsKLSNpZmRlZiBXSVRIX0xMVk1fR0NDCi0gIGNvb3BlcmF0aXZlR0MgPSB0cnVlOwotI2Vsc2UKLSAgY29vcGVyYXRpdmVHQyA9IGZhbHNlOwotI2VuZGlmCi0gIGluaXRpYWxpc2VBc3Nlc3NvckluZm8oKTsKLX0KLSAgCi12b2lkIEphdmFMTFZNQ29tcGlsZXI6OnJlc29sdmVWaXJ0dWFsQ2xhc3MoQ2xhc3MqIGNsKSB7Ci0gIC8vIExvY2sgaGVyZSBiZWNhdXNlIHdlIG1heSBiZSBjYWxsZWQgYnkgYSBjbGFzcyByZXNvbHZlcgotICBtdm06Ok12bU1vZHVsZTo6cHJvdGVjdElSKCk7Ci0gIExMVk1DbGFzc0luZm8qIExDSSA9IChMTFZNQ2xhc3NJbmZvKilnZXRDbGFzc0luZm8oY2wpOwotICBMQ0ktPmdldFZpcnR1YWxUeXBlKCk7Ci0gIG12bTo6TXZtTW9kdWxlOjp1bnByb3RlY3RJUigpOwotfQotCi12b2lkIEphdmFMTFZNQ29tcGlsZXI6OnJlc29sdmVTdGF0aWNDbGFzcyhDbGFzcyogY2wpIHsKLSAgLy8gTG9jayBoZXJlIGJlY2F1c2Ugd2UgbWF5IGJlIGNhbGxlZCBieSBhIGNsYXNzIGluaXRpYWxpemVyCi0gIG12bTo6TXZtTW9kdWxlOjpwcm90ZWN0SVIoKTsKLSAgTExWTUNsYXNzSW5mbyogTENJID0gKExMVk1DbGFzc0luZm8qKWdldENsYXNzSW5mbyhjbCk7Ci0gIExDSS0+Z2V0U3RhdGljVHlwZSgpOwotICBtdm06Ok12bU1vZHVsZTo6dW5wcm90ZWN0SVIoKTsKLX0KLQotRnVuY3Rpb24qIEphdmFMTFZNQ29tcGlsZXI6OmdldE1ldGhvZChKYXZhTWV0aG9kKiBtZXRoKSB7Ci0gIHJldHVybiBnZXRNZXRob2RJbmZvKG1ldGgpLT5nZXRNZXRob2QoKTsKLX0KLQotRnVuY3Rpb24qIEphdmFMTFZNQ29tcGlsZXI6OnBhcnNlRnVuY3Rpb24oSmF2YU1ldGhvZCogbWV0aCkgewotICBMTFZNTWV0aG9kSW5mbyogTE1JID0gZ2V0TWV0aG9kSW5mbyhtZXRoKTsKLSAgRnVuY3Rpb24qIGZ1bmMgPSBMTUktPmdldE1ldGhvZCgpOwotICAKLSAgLy8gV2UgYXJlIGppdHRpbmcuIFRha2UgdGhlIGxvY2suCi0gIG12bTo6TXZtTW9kdWxlOjpwcm90ZWN0SVIoKTsKLSAgaWYgKGZ1bmMtPmdldExpbmthZ2UoKSA9PSBHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxXZWFrTGlua2FnZSkgewotICAgIEphdmFKSVQgaml0KHRoaXMsIG1ldGgsIGZ1bmMpOwotICAgIGlmIChpc05hdGl2ZShtZXRoLT5hY2Nlc3MpKSB7Ci0gICAgICBqaXQubmF0aXZlQ29tcGlsZSgpOwotICAgICAgbXZtOjpNdm1Nb2R1bGU6OnJ1blBhc3NlcyhmdW5jLCBKYXZhTmF0aXZlRnVuY3Rpb25QYXNzZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICBqaXQuamF2YUNvbXBpbGUoKTsKLSAgICAgIG12bTo6TXZtTW9kdWxlOjpydW5QYXNzZXMoZnVuYywgSmF2YUZ1bmN0aW9uUGFzc2VzKTsKLSAgICB9Ci0gICAgZnVuYy0+c2V0TGlua2FnZShHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxMaW5rYWdlKTsKLSAgfQotICBtdm06Ok12bU1vZHVsZTo6dW5wcm90ZWN0SVIoKTsKLQotICByZXR1cm4gZnVuYzsKLX0KLQotSmF2YU1ldGhvZCogSmF2YUxMVk1Db21waWxlcjo6Z2V0SmF2YU1ldGhvZChjb25zdCBsbHZtOjpGdW5jdGlvbiYgRikgewotICBmdW5jdGlvbl9pdGVyYXRvciBFID0gZnVuY3Rpb25zLmVuZCgpOwotICBmdW5jdGlvbl9pdGVyYXRvciBJID0gZnVuY3Rpb25zLmZpbmQoJkYpOwotICBpZiAoSSA9PSBFKSByZXR1cm4gMDsKLSAgcmV0dXJuIEktPnNlY29uZDsKLX0KLQotTUROb2RlKiBKYXZhTExWTUNvbXBpbGVyOjpHZXREYmdTdWJwcm9ncmFtKEphdmFNZXRob2QqIG1ldGgpIHsKLSAgaWYgKGdldE1ldGhvZEluZm8obWV0aCktPmdldERiZ1N1YnByb2dyYW0oKSA9PSBOVUxMKSB7Ci0gICAgTUROb2RlKiBub2RlID0gRGVidWdGYWN0b3J5LT5DcmVhdGVTdWJwcm9ncmFtKERJRGVzY3JpcHRvcigpLCAiIiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCBESUZpbGUoKSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElUeXBlKCksIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgRGJnSW5mb3MuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKG5vZGUsIG1ldGgpKTsKLSAgICBnZXRNZXRob2RJbmZvKG1ldGgpLT5zZXREYmdTdWJwcm9ncmFtKG5vZGUpOwotICB9Ci0gIHJldHVybiBnZXRNZXRob2RJbmZvKG1ldGgpLT5nZXREYmdTdWJwcm9ncmFtKCk7Ci19Ci0KLUphdmFMTFZNQ29tcGlsZXI6On5KYXZhTExWTUNvbXBpbGVyKCkgewotICBMTFZNQ29udGV4dCogQ29udGV4dCA9ICYoVGhlTW9kdWxlLT5nZXRDb250ZXh0KCkpOwotICBkZWxldGUgVGhlTW9kdWxlOwotICBkZWxldGUgRGVidWdGYWN0b3J5OwotICBkZWxldGUgSmF2YUZ1bmN0aW9uUGFzc2VzOwotICBkZWxldGUgSmF2YU5hdGl2ZUZ1bmN0aW9uUGFzc2VzOwotICBkZWxldGUgQ29udGV4dDsKLX0KLQotbmFtZXNwYWNlIG12bSB7Ci0gIGxsdm06OkZ1bmN0aW9uUGFzcyogY3JlYXRlRXNjYXBlQW5hbHlzaXNQYXNzKCk7Ci0gIGxsdm06Okxvb3BQYXNzKiBjcmVhdGVMb29wU2FmZVBvaW50c1Bhc3MoKTsKLX0KLQotbmFtZXNwYWNlIGozIHsKLSAgbGx2bTo6RnVuY3Rpb25QYXNzKiBjcmVhdGVMb3dlckNvbnN0YW50Q2FsbHNQYXNzKEphdmFMTFZNQ29tcGlsZXIqIEkpOwotfQotCi12b2lkIEphdmFMTFZNQ29tcGlsZXI6OmFkZEphdmFQYXNzZXMoKSB7Ci0gIEphdmFOYXRpdmVGdW5jdGlvblBhc3NlcyA9IG5ldyBGdW5jdGlvblBhc3NNYW5hZ2VyKFRoZU1vZHVsZSk7Ci0gIEphdmFOYXRpdmVGdW5jdGlvblBhc3Nlcy0+YWRkKG5ldyBUYXJnZXREYXRhKFRoZU1vZHVsZSkpOwotICAvLyBMb3dlciBjb25zdGFudCBjYWxscyB0byBsb3dlciB0aGluZ3MgbGlrZSBnZXRDbGFzcyB1c2VkCi0gIC8vIG9uIHN5bmNocm9uaXplZCBtZXRob2RzLgotICBKYXZhTmF0aXZlRnVuY3Rpb25QYXNzZXMtPmFkZChjcmVhdGVMb3dlckNvbnN0YW50Q2FsbHNQYXNzKHRoaXMpKTsKLSAgCi0gIEphdmFGdW5jdGlvblBhc3NlcyA9IG5ldyBGdW5jdGlvblBhc3NNYW5hZ2VyKFRoZU1vZHVsZSk7Ci0gIGlmIChjb29wZXJhdGl2ZUdDKQotICAgIEphdmFGdW5jdGlvblBhc3Nlcy0+YWRkKG12bTo6Y3JlYXRlTG9vcFNhZmVQb2ludHNQYXNzKCkpOwotICAvLyBBZGQgb3RoZXIgcGFzc2VzIGFmdGVyIHRoZSBsb29wIHBhc3MsIGJlY2F1c2Ugc2FmZXBvaW50cyBtYXkgbW92ZSBvYmplY3RzLgotICAvLyBNb3Zpbmcgb2JqZWN0cyBkaXNhYmxlIG1hbnkgb3B0aW1pemF0aW9ucy4KLSAgbXZtOjpNdm1Nb2R1bGU6OmFkZENvbW1hbmRMaW5lUGFzc2VzKEphdmFGdW5jdGlvblBhc3Nlcyk7Ci0KLSAgLy8gUmUtZW5hYmxlIHRoaXMgd2hlbiB0aGUgcG9pbnRlcnMgaW4gc3RhY2stYWxsb2NhdGVkIG9iamVjdHMgY2FuCi0gIC8vIGJlIGdpdmVuIHRvIHRoZSBHQy4KLSAgLy9KYXZhRnVuY3Rpb25QYXNzZXMtPmFkZChtdm06OmNyZWF0ZUVzY2FwZUFuYWx5c2lzUGFzcygpKTsKLSAgSmF2YUZ1bmN0aW9uUGFzc2VzLT5hZGQoY3JlYXRlTG93ZXJDb25zdGFudENhbGxzUGFzcyh0aGlzKSk7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvQ29tcGlsZXIvTExWTUluZm8uY3BwIGIvdm1raXQvbGliL0ozL0NvbXBpbGVyL0xMVk1JbmZvLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzExZDhiMS4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvSjMvQ29tcGlsZXIvTExWTUluZm8uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzY1ICswLDAgQEAKLS8vPT09LS0tIExMVk1JbmZvLmNwcCAtIEltcGxlbWVudGF0aW9uIG9mIExMVk0gaW5mbyBvYmplY3RzIGZvciBKMy0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSAibGx2bS9CYXNpY0Jsb2NrLmgiCi0jaW5jbHVkZSAibGx2bS9DYWxsaW5nQ29udi5oIgotI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCi0jaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKLSNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NdXRleEd1YXJkLmgiCi0jaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgotCi0jaW5jbHVkZSAibXZtL0dDLmgiCi0jaW5jbHVkZSAibXZtL0pJVC5oIgotCi0jaW5jbHVkZSAiSmF2YUNvbnN0YW50UG9vbC5oIgotI2luY2x1ZGUgIkphdmFTdHJpbmcuaCIKLSNpbmNsdWRlICJKYXZhVGhyZWFkLmgiCi0jaW5jbHVkZSAiSmF2YVR5cGVzLmgiCi0jaW5jbHVkZSAiSmF2YVVwY2FsbHMuaCIKLSNpbmNsdWRlICJKbmp2bS5oIgotI2luY2x1ZGUgIlJlYWRlci5oIgotCi0jaW5jbHVkZSAiajMvSmF2YUxMVk1Db21waWxlci5oIgotI2luY2x1ZGUgImozL0xMVk1JbmZvLmgiCi0KLSNpbmNsdWRlIDxjc3RkaW8+Ci0KLXVzaW5nIG5hbWVzcGFjZSBqMzsKLXVzaW5nIG5hbWVzcGFjZSBsbHZtOwotCi1jb25zdCBUeXBlKiBMTFZNQ2xhc3NJbmZvOjpnZXRWaXJ0dWFsVHlwZSgpIHsKLSAgaWYgKCF2aXJ0dWFsVHlwZSkgewotICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGxsdm06OlR5cGUqPiBmaWVsZHM7Ci0gICAgY29uc3QgVGFyZ2V0RGF0YSogdGFyZ2V0RGF0YSA9IG12bTo6TXZtTW9kdWxlOjpUaGVUYXJnZXREYXRhOwotICAgIGNvbnN0IFN0cnVjdExheW91dCogc2wgPSAwOwotICAgIGNvbnN0IFN0cnVjdFR5cGUqIHN0cnVjdFR5cGUgPSAwOwotICAgIExMVk1Db250ZXh0JiBjb250ZXh0ID0gQ29tcGlsZXItPmdldExMVk1Nb2R1bGUoKS0+Z2V0Q29udGV4dCgpOwotCi0gICAgaWYgKGNsYXNzRGVmLT5zdXBlcikgewotICAgICAgTExWTUNsYXNzSW5mbyogQ0xJID0gQ29tcGlsZXItPmdldENsYXNzSW5mbyhjbGFzc0RlZi0+c3VwZXIpOwotICAgICAgY29uc3QgbGx2bTo6VHlwZSogVHkgPSBDTEktPmdldFZpcnR1YWxUeXBlKCktPmdldENvbnRhaW5lZFR5cGUoMCk7Ci0gICAgICBmaWVsZHMucHVzaF9iYWNrKFR5KTsKLSAgICAKLSAgICAgIGZvciAodWludDMyIGkgPSAwOyBpIDwgY2xhc3NEZWYtPm5iVmlydHVhbEZpZWxkczsgKytpKSB7Ci0gICAgICAgIEphdmFGaWVsZCYgZmllbGQgPSBjbGFzc0RlZi0+dmlydHVhbEZpZWxkc1tpXTsKLSAgICAgICAgVHlwZWRlZiogdHlwZSA9IGZpZWxkLmdldFNpZ25hdHVyZSgpOwotICAgICAgICBMTFZNQXNzZXNzb3JJbmZvJiBMQUkgPSBDb21waWxlci0+Z2V0VHlwZWRlZkluZm8odHlwZSk7Ci0gICAgICAgIGZpZWxkcy5wdXNoX2JhY2soTEFJLmxsdm1UeXBlKTsKLSAgICAgIH0KLSAgICAKLSAgICAKLSAgICAgIHN0cnVjdFR5cGUgPSBTdHJ1Y3RUeXBlOjpnZXQoY29udGV4dCwgZmllbGRzLCBmYWxzZSk7Ci0gICAgICB2aXJ0dWFsVHlwZSA9IFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoc3RydWN0VHlwZSk7Ci0gICAgICBzbCA9IHRhcmdldERhdGEtPmdldFN0cnVjdExheW91dChzdHJ1Y3RUeXBlKTsKLSAgICAKLSAgICB9IGVsc2UgewotICAgICAgdmlydHVhbFR5cGUgPSBDb21waWxlci0+Z2V0SW50cmluc2ljcygpLT5KYXZhT2JqZWN0VHlwZTsKLSAgICAgIGFzc2VydCh2aXJ0dWFsVHlwZSAmJiAiaW50cmluc2ljcyBub3QgaW5pdGFsaXplZCIpOwotICAgICAgc3RydWN0VHlwZSA9IGR5bl9jYXN0PGNvbnN0IFN0cnVjdFR5cGU+KHZpcnR1YWxUeXBlLT5nZXRDb250YWluZWRUeXBlKDApKTsKLSAgICAgIHNsID0gdGFyZ2V0RGF0YS0+Z2V0U3RydWN0TGF5b3V0KHN0cnVjdFR5cGUpOwotICAgICAgCi0gICAgfQotICAgIAotICAgIHVpbnQ2NCBzaXplID0gbXZtOjpNdm1Nb2R1bGU6OmdldFR5cGVTaXplKHN0cnVjdFR5cGUpOwotICAgIHZpcnR1YWxTaXplQ29uc3RhbnQgPSBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoY29udGV4dCksIHNpemUpOwotICAgIAotICAgIC8vIFRPRE86IHB1dCB0aGF0IGVsc2V3aGVyZS4KLSAgICBpZiAoQ29tcGlsZXIgPT0gY2xhc3NEZWYtPmNsYXNzTG9hZGVyLT5nZXRDb21waWxlcigpKSB7IAotICAgICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBjbGFzc0RlZi0+bmJWaXJ0dWFsRmllbGRzOyArK2kpIHsKLSAgICAgICAgSmF2YUZpZWxkJiBmaWVsZCA9IGNsYXNzRGVmLT52aXJ0dWFsRmllbGRzW2ldOwotICAgICAgICBmaWVsZC5wdHJPZmZzZXQgPSBzbC0+Z2V0RWxlbWVudE9mZnNldChpICsgMSk7Ci0gICAgICAgIGZpZWxkLm51bSA9IGkgKyAxOwotICAgICAgfQotICAgIAotICAgICAgY2xhc3NEZWYtPnZpcnR1YWxTaXplID0gKHVpbnQzMilzaXplOwotICAgICAgY2xhc3NEZWYtPmFsaWdubWVudCA9IHNsLT5nZXRBbGlnbm1lbnQoKTsKLSAgIAotICAgICAgQ29tcGlsZXItPm1ha2VWVChjbGFzc0RlZik7Ci0gICAgICBDb21waWxlci0+bWFrZUlNVChjbGFzc0RlZik7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHZpcnR1YWxUeXBlOwotfQotCi1jb25zdCBUeXBlKiBMTFZNQ2xhc3NJbmZvOjpnZXRTdGF0aWNUeXBlKCkgewotICAKLSAgaWYgKCFzdGF0aWNUeXBlKSB7Ci0gICAgQ2xhc3MqIGNsID0gKENsYXNzKiljbGFzc0RlZjsKLSAgICBzdGQ6OnZlY3Rvcjxjb25zdCBsbHZtOjpUeXBlKj4gZmllbGRzOwotICAgIAotICAgIExMVk1Db250ZXh0JiBjb250ZXh0ID0gQ29tcGlsZXItPmdldExMVk1Nb2R1bGUoKS0+Z2V0Q29udGV4dCgpOwotCi0gICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBjbGFzc0RlZi0+bmJTdGF0aWNGaWVsZHM7ICsraSkgewotICAgICAgSmF2YUZpZWxkJiBmaWVsZCA9IGNsYXNzRGVmLT5zdGF0aWNGaWVsZHNbaV07Ci0gICAgICBUeXBlZGVmKiB0eXBlID0gZmllbGQuZ2V0U2lnbmF0dXJlKCk7Ci0gICAgICBMTFZNQXNzZXNzb3JJbmZvJiBMQUkgPSBDb21waWxlci0+Z2V0VHlwZWRlZkluZm8odHlwZSk7Ci0gICAgICBmaWVsZHMucHVzaF9iYWNrKExBSS5sbHZtVHlwZSk7Ci0gICAgfQotICAKLSAgICBTdHJ1Y3RUeXBlKiBzdHJ1Y3RUeXBlID0gU3RydWN0VHlwZTo6Z2V0KGNvbnRleHQsIGZpZWxkcywgZmFsc2UpOwotICAgIHN0YXRpY1R5cGUgPSBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKHN0cnVjdFR5cGUpOwotICAgIGNvbnN0IFRhcmdldERhdGEqIHRhcmdldERhdGEgPSBtdm06Ok12bU1vZHVsZTo6VGhlVGFyZ2V0RGF0YTsKLSAgICBjb25zdCBTdHJ1Y3RMYXlvdXQqIHNsID0gdGFyZ2V0RGF0YS0+Z2V0U3RydWN0TGF5b3V0KHN0cnVjdFR5cGUpOwotICAgIAotICAgIC8vIFRPRE86IHB1dCB0aGF0IGVsc2V3aGVyZS4KLSAgICBpZiAoQ29tcGlsZXIgPT0gY2xhc3NEZWYtPmNsYXNzTG9hZGVyLT5nZXRDb21waWxlcigpKSB7IAotICAgICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBjbGFzc0RlZi0+bmJTdGF0aWNGaWVsZHM7ICsraSkgewotICAgICAgICBKYXZhRmllbGQmIGZpZWxkID0gY2xhc3NEZWYtPnN0YXRpY0ZpZWxkc1tpXTsKLSAgICAgICAgZmllbGQubnVtID0gaTsKLSAgICAgICAgZmllbGQucHRyT2Zmc2V0ID0gc2wtPmdldEVsZW1lbnRPZmZzZXQoaSk7Ci0gICAgICB9Ci0gICAgCi0gICAgICB1aW50NjQgc2l6ZSA9IG12bTo6TXZtTW9kdWxlOjpnZXRUeXBlU2l6ZShzdHJ1Y3RUeXBlKTsKLSAgICAgIGNsLT5zdGF0aWNTaXplID0gc2l6ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHN0YXRpY1R5cGU7Ci19Ci0KLQotVmFsdWUqIExMVk1DbGFzc0luZm86OmdldFZpcnR1YWxTaXplKCkgewotICBpZiAoIXZpcnR1YWxTaXplQ29uc3RhbnQpIHsKLSAgICBnZXRWaXJ0dWFsVHlwZSgpOwotICAgIGFzc2VydCh2aXJ0dWFsU2l6ZUNvbnN0YW50ICYmICJObyBzaXplIGZvciBhIGNsYXNzPyIpOwotICB9Ci0gIHJldHVybiB2aXJ0dWFsU2l6ZUNvbnN0YW50OwotfQotCi1leHRlcm4gbGx2bTo6Y2w6Om9wdDxib29sPiBFbWl0RGVidWdJbmZvOwotCi1GdW5jdGlvbiogTExWTU1ldGhvZEluZm86OmdldE1ldGhvZCgpIHsKLSAgaWYgKCFtZXRob2RGdW5jdGlvbikgewotICAgIG12bTo6VGhyZWFkQWxsb2NhdG9yIGFsbG9jYXRvcjsKLSAgICBKbmp2bUNsYXNzTG9hZGVyKiBKQ0wgPSBtZXRob2REZWYtPmNsYXNzRGVmLT5jbGFzc0xvYWRlcjsKLSAgICBpZiAoQ29tcGlsZXItPmVtaXRGdW5jdGlvbk5hbWUoKSB8fCBFbWl0RGVidWdJbmZvKSB7Ci0gICAgICBjb25zdCBVVEY4KiBqbmlDb25zQ2xOYW1lID0gbWV0aG9kRGVmLT5jbGFzc0RlZi0+bmFtZTsKLSAgICAgIGNvbnN0IFVURjgqIGpuaUNvbnNOYW1lID0gbWV0aG9kRGVmLT5uYW1lOwotICAgICAgY29uc3QgVVRGOCogam5pQ29uc1R5cGUgPSBtZXRob2REZWYtPnR5cGU7Ci0gICAgICBzaW50MzIgY2xlbiA9IGpuaUNvbnNDbE5hbWUtPnNpemU7Ci0gICAgICBzaW50MzIgbW5sZW4gPSBqbmlDb25zTmFtZS0+c2l6ZTsKLSAgICAgIHNpbnQzMiBtdGxlbiA9IGpuaUNvbnNUeXBlLT5zaXplOwotCi0gICAgICBjaGFyKiBidWYgPSAoY2hhciopYWxsb2NhdG9yLkFsbG9jYXRlKAotICAgICAgICAgIDMgKyBKTklfTkFNRV9QUkVfTEVOICsgMSArICgobW5sZW4gKyBjbGVuICsgbXRsZW4pIDw8IDMpKTsKLSAgICAgIAotICAgICAgYm9vbCBqMyA9IGZhbHNlOwotICAgICAgaWYgKGlzTmF0aXZlKG1ldGhvZERlZi0+YWNjZXNzKSkgewotICAgICAgICAvLyBWZXJpZnkgaWYgaXQncyBkZWZpbmVkIGJ5IEpuSlZNCi0gICAgICAgIEpDTC0+bmF0aXZlTG9va3VwKG1ldGhvZERlZiwgajMsIGJ1Zik7Ci0gICAgICB9Ci0KLSAgICAgIG1ldGhvZERlZi0+am5pQ29uc0Zyb21NZXRoT3ZlcmxvYWRlZChidWYgKyAxKTsKLSAgICAgIG1lbWNweShidWYsICJKbkpWTSIsIDUpOwotCi0gICAgICBtZXRob2RGdW5jdGlvbiA9IEZ1bmN0aW9uOjpDcmVhdGUoZ2V0RnVuY3Rpb25UeXBlKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhbHVlOjpFeHRlcm5hbFdlYWtMaW5rYWdlLCBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGlsZXItPmdldExMVk1Nb2R1bGUoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1ldGhvZEZ1bmN0aW9uID0gRnVuY3Rpb246OkNyZWF0ZShnZXRGdW5jdGlvblR5cGUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFsdWU6OkV4dGVybmFsV2Vha0xpbmthZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIENvbXBpbGVyLT5nZXRMTFZNTW9kdWxlKCkpOwotICAgIH0KLSAgICAKLSAgICBtZXRob2RGdW5jdGlvbi0+c2V0R0MoInZta2l0Iik7Ci0gICAgCi0gICAgQ29tcGlsZXItPmZ1bmN0aW9ucy5pbnNlcnQoc3RkOjptYWtlX3BhaXIobWV0aG9kRnVuY3Rpb24sIG1ldGhvZERlZikpOwotICAgIGlmIChDb21waWxlciAhPSBKQ0wtPmdldENvbXBpbGVyKCkgJiYgbWV0aG9kRGVmLT5jb2RlKSB7Ci0gICAgICBDb21waWxlci0+c2V0TWV0aG9kKG1ldGhvZEZ1bmN0aW9uLCBtZXRob2REZWYtPmNvZGUsIG1ldGhvZEZ1bmN0aW9uLT5nZXROYW1lKCkuZGF0YSgpKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG1ldGhvZEZ1bmN0aW9uOwotfQotCi1jb25zdCBGdW5jdGlvblR5cGUqIExMVk1NZXRob2RJbmZvOjpnZXRGdW5jdGlvblR5cGUoKSB7Ci0gIGlmICghZnVuY3Rpb25UeXBlKSB7Ci0gICAgU2lnbmRlZiogc2lnbiA9IG1ldGhvZERlZi0+Z2V0U2lnbmF0dXJlKCk7Ci0gICAgTExWTVNpZ25hdHVyZUluZm8qIExTSSA9IENvbXBpbGVyLT5nZXRTaWduYXR1cmVJbmZvKHNpZ24pOwotICAgIGFzc2VydChMU0kpOwotICAgIGlmIChpc1N0YXRpYyhtZXRob2REZWYtPmFjY2VzcykpIHsKLSAgICAgIGZ1bmN0aW9uVHlwZSA9IExTSS0+Z2V0U3RhdGljVHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBmdW5jdGlvblR5cGUgPSBMU0ktPmdldFZpcnR1YWxUeXBlKCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmdW5jdGlvblR5cGU7Ci19Ci0KLUNvbnN0YW50KiBMTFZNTWV0aG9kSW5mbzo6Z2V0T2Zmc2V0KCkgewotICBpZiAoIW9mZnNldENvbnN0YW50KSB7Ci0gICAgTExWTUNvbnRleHQmIGNvbnRleHQgPSBDb21waWxlci0+Z2V0TExWTU1vZHVsZSgpLT5nZXRDb250ZXh0KCk7Ci0gICAgCi0gICAgQ29tcGlsZXItPnJlc29sdmVWaXJ0dWFsQ2xhc3MobWV0aG9kRGVmLT5jbGFzc0RlZik7Ci0gICAgb2Zmc2V0Q29uc3RhbnQgPSBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoY29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZERlZi0+b2Zmc2V0KTsKLSAgfQotICByZXR1cm4gb2Zmc2V0Q29uc3RhbnQ7Ci19Ci0KLUNvbnN0YW50KiBMTFZNRmllbGRJbmZvOjpnZXRPZmZzZXQoKSB7Ci0gIGlmICghb2Zmc2V0Q29uc3RhbnQpIHsKLSAgICBMTFZNQ29udGV4dCYgY29udGV4dCA9IENvbXBpbGVyLT5nZXRMTFZNTW9kdWxlKCktPmdldENvbnRleHQoKTsKLSAgICAKLSAgICBpZiAoaXNTdGF0aWMoZmllbGREZWYtPmFjY2VzcykpIHsKLSAgICAgIENvbXBpbGVyLT5yZXNvbHZlU3RhdGljQ2xhc3MoZmllbGREZWYtPmNsYXNzRGVmKTsgCi0gICAgfSBlbHNlIHsKLSAgICAgIENvbXBpbGVyLT5yZXNvbHZlVmlydHVhbENsYXNzKGZpZWxkRGVmLT5jbGFzc0RlZik7IAotICAgIH0KLSAgICAKLSAgICBvZmZzZXRDb25zdGFudCA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShjb250ZXh0KSwgZmllbGREZWYtPm51bSk7Ci0gIH0KLSAgcmV0dXJuIG9mZnNldENvbnN0YW50OwotfQotCi1jb25zdCBsbHZtOjpGdW5jdGlvblR5cGUqIExMVk1TaWduYXR1cmVJbmZvOjpnZXRWaXJ0dWFsVHlwZSgpIHsKLSBpZiAoIXZpcnR1YWxUeXBlKSB7Ci0gICAgLy8gTG9jayBoZXJlIGJlY2F1c2Ugd2UgYXJlIGNhbGxlZCBieSBhcmJpdHJhcnkgY29kZQotICAgIG12bTo6TXZtTW9kdWxlOjpwcm90ZWN0SVIoKTsKLSAgICBzdGQ6OnZlY3Rvcjxjb25zdCBsbHZtOjpUeXBlKj4gbGx2bUFyZ3M7Ci0gICAgdWludDMyIHNpemUgPSBzaWduYXR1cmUtPm5iQXJndW1lbnRzOwotICAgIFR5cGVkZWYqIGNvbnN0KiBhcmd1bWVudHMgPSBzaWduYXR1cmUtPmdldEFyZ3VtZW50c1R5cGUoKTsKLQotICAgIGxsdm1BcmdzLnB1c2hfYmFjayhDb21waWxlci0+Z2V0SW50cmluc2ljcygpLT5KYXZhT2JqZWN0VHlwZSk7Ci0KLSAgICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgVHlwZWRlZiogdHlwZSA9IGFyZ3VtZW50c1tpXTsKLSAgICAgIExMVk1Bc3Nlc3NvckluZm8mIExBSSA9IENvbXBpbGVyLT5nZXRUeXBlZGVmSW5mbyh0eXBlKTsKLSAgICAgIGxsdm1BcmdzLnB1c2hfYmFjayhMQUkubGx2bVR5cGUpOwotICAgIH0KLQotICAgIExMVk1Bc3Nlc3NvckluZm8mIExBSSA9Ci0gICAgICBDb21waWxlci0+Z2V0VHlwZWRlZkluZm8oc2lnbmF0dXJlLT5nZXRSZXR1cm5UeXBlKCkpOwotICAgIHZpcnR1YWxUeXBlID0gRnVuY3Rpb25UeXBlOjpnZXQoTEFJLmxsdm1UeXBlLCBsbHZtQXJncywgZmFsc2UpOwotICAgIG12bTo6TXZtTW9kdWxlOjp1bnByb3RlY3RJUigpOwotICB9Ci0gIHJldHVybiB2aXJ0dWFsVHlwZTsKLX0KLQotY29uc3QgbGx2bTo6RnVuY3Rpb25UeXBlKiBMTFZNU2lnbmF0dXJlSW5mbzo6Z2V0U3RhdGljVHlwZSgpIHsKLSBpZiAoIXN0YXRpY1R5cGUpIHsKLSAgICAvLyBMb2NrIGhlcmUgYmVjYXVzZSB3ZSBhcmUgY2FsbGVkIGJ5IGFyYml0cmFyeSBjb2RlCi0gICAgbXZtOjpNdm1Nb2R1bGU6OnByb3RlY3RJUigpOwotICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGxsdm06OlR5cGUqPiBsbHZtQXJnczsKLSAgICB1aW50MzIgc2l6ZSA9IHNpZ25hdHVyZS0+bmJBcmd1bWVudHM7Ci0gICAgVHlwZWRlZiogY29uc3QqIGFyZ3VtZW50cyA9IHNpZ25hdHVyZS0+Z2V0QXJndW1lbnRzVHlwZSgpOwotCi0gICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgIFR5cGVkZWYqIHR5cGUgPSBhcmd1bWVudHNbaV07Ci0gICAgICBMTFZNQXNzZXNzb3JJbmZvJiBMQUkgPSBDb21waWxlci0+Z2V0VHlwZWRlZkluZm8odHlwZSk7Ci0gICAgICBsbHZtQXJncy5wdXNoX2JhY2soTEFJLmxsdm1UeXBlKTsKLSAgICB9Ci0KLSAgICBMTFZNQXNzZXNzb3JJbmZvJiBMQUkgPQotICAgICAgQ29tcGlsZXItPmdldFR5cGVkZWZJbmZvKHNpZ25hdHVyZS0+Z2V0UmV0dXJuVHlwZSgpKTsKLSAgICBzdGF0aWNUeXBlID0gRnVuY3Rpb25UeXBlOjpnZXQoTEFJLmxsdm1UeXBlLCBsbHZtQXJncywgZmFsc2UpOwotICAgIG12bTo6TXZtTW9kdWxlOjp1bnByb3RlY3RJUigpOwotICB9Ci0gIHJldHVybiBzdGF0aWNUeXBlOwotfQotCi1jb25zdCBsbHZtOjpGdW5jdGlvblR5cGUqIExMVk1TaWduYXR1cmVJbmZvOjpnZXROYXRpdmVUeXBlKCkgewotICBpZiAoIW5hdGl2ZVR5cGUpIHsKLSAgICAvLyBMb2NrIGhlcmUgYmVjYXVzZSB3ZSBhcmUgY2FsbGVkIGJ5IGFyYml0cmFyeSBjb2RlCi0gICAgbXZtOjpNdm1Nb2R1bGU6OnByb3RlY3RJUigpOwotICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGxsdm06OlR5cGUqPiBsbHZtQXJnczsKLSAgICB1aW50MzIgc2l6ZSA9IHNpZ25hdHVyZS0+bmJBcmd1bWVudHM7Ci0gICAgVHlwZWRlZiogY29uc3QqIGFyZ3VtZW50cyA9IHNpZ25hdHVyZS0+Z2V0QXJndW1lbnRzVHlwZSgpOwotICAgCi0gICAgY29uc3QgbGx2bTo6VHlwZSogVHkgPQotICAgICAgUG9pbnRlclR5cGU6OmdldFVucXVhbChDb21waWxlci0+Z2V0SW50cmluc2ljcygpLT5KYXZhT2JqZWN0VHlwZSk7Ci0KLSAgICBsbHZtQXJncy5wdXNoX2JhY2soQ29tcGlsZXItPmdldEludHJpbnNpY3MoKS0+cHRyVHlwZSk7Ci0gICAgbGx2bUFyZ3MucHVzaF9iYWNrKFR5KTsgLy8gQ2xhc3MKLQotICAgIGZvciAodWludDMyIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICBUeXBlZGVmKiB0eXBlID0gYXJndW1lbnRzW2ldOwotICAgICAgTExWTUFzc2Vzc29ySW5mbyYgTEFJID0gQ29tcGlsZXItPmdldFR5cGVkZWZJbmZvKHR5cGUpOwotICAgICAgY29uc3QgbGx2bTo6VHlwZSogVHkgPSBMQUkubGx2bVR5cGU7Ci0gICAgICBpZiAoVHkgPT0gQ29tcGlsZXItPmdldEludHJpbnNpY3MoKS0+SmF2YU9iamVjdFR5cGUpIHsKLSAgICAgICAgbGx2bUFyZ3MucHVzaF9iYWNrKExBSS5sbHZtVHlwZVB0cik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBsbHZtQXJncy5wdXNoX2JhY2soTEFJLmxsdm1UeXBlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBMTFZNQXNzZXNzb3JJbmZvJiBMQUkgPQotICAgICAgQ29tcGlsZXItPmdldFR5cGVkZWZJbmZvKHNpZ25hdHVyZS0+Z2V0UmV0dXJuVHlwZSgpKTsKLSAgICBjb25zdCBsbHZtOjpUeXBlKiBSZXRUeXBlID0KLSAgICAgIExBSS5sbHZtVHlwZSA9PSBDb21waWxlci0+Z2V0SW50cmluc2ljcygpLT5KYXZhT2JqZWN0VHlwZSA/Ci0gICAgICAgIExBSS5sbHZtVHlwZVB0ciA6IExBSS5sbHZtVHlwZTsKLSAgICBuYXRpdmVUeXBlID0gRnVuY3Rpb25UeXBlOjpnZXQoUmV0VHlwZSwgbGx2bUFyZ3MsIGZhbHNlKTsKLSAgICBtdm06Ok12bU1vZHVsZTo6dW5wcm90ZWN0SVIoKTsKLSAgfQotICByZXR1cm4gbmF0aXZlVHlwZTsKLX0KLQotCi1GdW5jdGlvbiogTExWTVNpZ25hdHVyZUluZm86OmNyZWF0ZUZ1bmN0aW9uQ2FsbEJ1Zihib29sIHZpcnQpIHsKLSAgCi0gIHN0ZDo6dmVjdG9yPFZhbHVlKj4gQXJnczsKLQotICBMTFZNQ29udGV4dCYgY29udGV4dCA9IENvbXBpbGVyLT5nZXRMTFZNTW9kdWxlKCktPmdldENvbnRleHQoKTsKLSAgSjNJbnRyaW5zaWNzJiBJbnRyaW5zaWNzID0gKkNvbXBpbGVyLT5nZXRJbnRyaW5zaWNzKCk7Ci0gIEZ1bmN0aW9uKiByZXMgPSAwOwotICBpZiAoQ29tcGlsZXItPmlzU3RhdGljQ29tcGlsaW5nKCkpIHsKLSAgICBtdm06OlRocmVhZEFsbG9jYXRvciBhbGxvY2F0b3I7Ci0gICAgY29uc3QgY2hhciogdHlwZSA9IHZpcnQgPyAidmlydHVhbF9idWYiIDogInN0YXRpY19idWYiOwotICAgIGNoYXIqIGJ1ZiA9IChjaGFyKilhbGxvY2F0b3IuQWxsb2NhdGUoCi0gICAgICAgIChzaWduYXR1cmUtPmtleU5hbWUtPnNpemUgPDwgMSkgKyAxICsgMTEpOwotICAgIHNpZ25hdHVyZS0+bmF0aXZlTmFtZShidWYsIHR5cGUpOwotICAgIHJlcyA9IEZ1bmN0aW9uOjpDcmVhdGUodmlydCA/IGdldFZpcnR1YWxCdWZUeXBlKCkgOiBnZXRTdGF0aWNCdWZUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxMaW5rYWdlLCBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDb21waWxlci0+Z2V0TExWTU1vZHVsZSgpKTsKLSAgCi0KLSAgfSBlbHNlIHsKLSAgICByZXMgPSBGdW5jdGlvbjo6Q3JlYXRlKHZpcnQgPyBnZXRWaXJ0dWFsQnVmVHlwZSgpIDogZ2V0U3RhdGljQnVmVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDb21waWxlci0+Z2V0TExWTU1vZHVsZSgpKTsKLSAgfQotCi0gIEJhc2ljQmxvY2sqIGN1cnJlbnRCbG9jayA9IEJhc2ljQmxvY2s6OkNyZWF0ZShjb250ZXh0LCAiZW50ZXIiLCByZXMpOwotICBGdW5jdGlvbjo6YXJnX2l0ZXJhdG9yIGkgPSByZXMtPmFyZ19iZWdpbigpOwotICBWYWx1ZSAqb2JqLCAqcHRyLCAqZnVuYzsKLQotICArK2k7Ci0gIGZ1bmMgPSBpOwotICArK2k7Ci0gIGlmICh2aXJ0KSB7Ci0gICAgb2JqID0gaTsKLSAgICArK2k7Ci0gICAgQXJncy5wdXNoX2JhY2sob2JqKTsKLSAgfQotICBwdHIgPSBpOwotICAKLSAgVHlwZWRlZiogY29uc3QqIGFyZ3VtZW50cyA9IHNpZ25hdHVyZS0+Z2V0QXJndW1lbnRzVHlwZSgpOwotICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IHNpZ25hdHVyZS0+bmJBcmd1bWVudHM7ICsraSkgewotICAKLSAgICBMTFZNQXNzZXNzb3JJbmZvJiBMQUkgPSBDb21waWxlci0+Z2V0VHlwZWRlZkluZm8oYXJndW1lbnRzW2ldKTsKLSAgICBWYWx1ZSogYXJnID0gbmV3IExvYWRJbnN0KHB0ciwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgCi0gICAgaWYgKGFyZ3VtZW50c1tpXS0+aXNSZWZlcmVuY2UoKSkgewotICAgICAgYXJnID0gbmV3IEludFRvUHRySW5zdChhcmcsIEludHJpbnNpY3MuSmF2YU9iamVjdFR5cGUsICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgVmFsdWUqIGNtcCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9FUSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50cmluc2ljcy5KYXZhT2JqZWN0TnVsbENvbnN0YW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcsICIiKTsKLSAgICAgIEJhc2ljQmxvY2sqIGVuZEJsb2NrID0gQmFzaWNCbG9jazo6Q3JlYXRlKGNvbnRleHQsICJlbmQiLCByZXMpOwotICAgICAgQmFzaWNCbG9jayogbG9hZEJsb2NrID0gQmFzaWNCbG9jazo6Q3JlYXRlKGNvbnRleHQsICJsb2FkIiwgcmVzKTsKLSAgICAgIFBISU5vZGUqIG5vZGUgPSBQSElOb2RlOjpDcmVhdGUoSW50cmluc2ljcy5KYXZhT2JqZWN0VHlwZSwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZEJsb2NrKTsKLSAgICAgIG5vZGUtPmFkZEluY29taW5nKEludHJpbnNpY3MuSmF2YU9iamVjdE51bGxDb25zdGFudCwgY3VycmVudEJsb2NrKTsKLSAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShlbmRCbG9jaywgbG9hZEJsb2NrLCBjbXAsIGN1cnJlbnRCbG9jayk7Ci0gICAgICBjdXJyZW50QmxvY2sgPSBsb2FkQmxvY2s7Ci0gICAgICBhcmcgPSBuZXcgQml0Q2FzdEluc3QoYXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoSW50cmluc2ljcy5KYXZhT2JqZWN0VHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICBhcmcgPSBuZXcgTG9hZEluc3QoYXJnLCAiIiwgZmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0gICAgICBub2RlLT5hZGRJbmNvbWluZyhhcmcsIGN1cnJlbnRCbG9jayk7Ci0gICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoZW5kQmxvY2ssIGN1cnJlbnRCbG9jayk7Ci0gICAgICBjdXJyZW50QmxvY2sgPSBlbmRCbG9jazsKLSAgICAgIGFyZyA9IG5vZGU7Ci0gICAgfSBlbHNlIGlmIChhcmd1bWVudHNbaV0tPmlzRmxvYXQoKSkgewotICAgICAgYXJnID0gbmV3IFRydW5jSW5zdChhcmcsIENvbXBpbGVyLT5Bc3Nlc3NvckluZm9bSV9JTlRdLmxsdm1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgIGFyZyA9IG5ldyBCaXRDYXN0SW5zdChhcmcsIExBSS5sbHZtVHlwZSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgfSBlbHNlIGlmIChhcmd1bWVudHNbaV0tPmlzRG91YmxlKCkpIHsKLSAgICAgIGFyZyA9IG5ldyBCaXRDYXN0SW5zdChhcmcsIExBSS5sbHZtVHlwZSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgfSBlbHNlIGlmICghYXJndW1lbnRzW2ldLT5pc0xvbmcoKSl7Ci0gICAgICBhcmcgPSBuZXcgVHJ1bmNJbnN0KGFyZywgTEFJLmxsdm1UeXBlLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICB9Ci0gICAgQXJncy5wdXNoX2JhY2soYXJnKTsKLSAgICBwdHIgPSBHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlKHB0ciwgSW50cmluc2ljcy5jb25zdGFudE9uZSwiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gIH0KLQotICBWYWx1ZSogdmFsID0gQ2FsbEluc3Q6OkNyZWF0ZShmdW5jLCBBcmdzLmJlZ2luKCksIEFyZ3MuZW5kKCksICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICBpZiAoIXNpZ25hdHVyZS0+Z2V0UmV0dXJuVHlwZSgpLT5pc1ZvaWQoKSkgewotICAgIFJldHVybkluc3Q6OkNyZWF0ZShjb250ZXh0LCB2YWwsIGN1cnJlbnRCbG9jayk7Ci0gIH0gZWxzZSB7Ci0gICAgUmV0dXJuSW5zdDo6Q3JlYXRlKGNvbnRleHQsIGN1cnJlbnRCbG9jayk7Ci0gIH0KLSAgCi0gIHJlcy0+c2V0R0MoInZta2l0Iik7Ci0KLSAgcmV0dXJuIHJlczsKLX0KLQotRnVuY3Rpb24qIExMVk1TaWduYXR1cmVJbmZvOjpjcmVhdGVGdW5jdGlvbkNhbGxBUChib29sIHZpcnQpIHsKLSAgCi0gIHN0ZDo6dmVjdG9yPFZhbHVlKj4gQXJnczsKLSAgCi0gIEozSW50cmluc2ljcyYgSW50cmluc2ljcyA9ICpDb21waWxlci0+Z2V0SW50cmluc2ljcygpOwotICBzdGQ6OnN0cmluZyBuYW1lOwotICBpZiAoQ29tcGlsZXItPmlzU3RhdGljQ29tcGlsaW5nKCkpIHsKLSAgICBuYW1lICs9IFVURjhCdWZmZXIoc2lnbmF0dXJlLT5rZXlOYW1lKS5jU3RyaW5nKCk7Ci0gICAgbmFtZSArPSB2aXJ0ID8gInZpcnR1YWxfYXAiIDogInN0YXRpY19hcCI7Ci0gIH0gZWxzZSB7Ci0gICAgbmFtZSA9ICIiOwotICB9Ci0KLSAgRnVuY3Rpb24qIHJlcyA9IEZ1bmN0aW9uOjpDcmVhdGUodmlydCA/IGdldFZpcnR1YWxCdWZUeXBlKCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RhdGljQnVmVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxWYWx1ZTo6SW50ZXJuYWxMaW5rYWdlLCBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21waWxlci0+Z2V0TExWTU1vZHVsZSgpKTsKLSAgTExWTUNvbnRleHQmIGNvbnRleHQgPSBDb21waWxlci0+Z2V0TExWTU1vZHVsZSgpLT5nZXRDb250ZXh0KCk7Ci0gIAotICBCYXNpY0Jsb2NrKiBjdXJyZW50QmxvY2sgPSBCYXNpY0Jsb2NrOjpDcmVhdGUoY29udGV4dCwgImVudGVyIiwgcmVzKTsKLSAgRnVuY3Rpb246OmFyZ19pdGVyYXRvciBpID0gcmVzLT5hcmdfYmVnaW4oKTsKLSAgVmFsdWUgKm9iaiwgKmFwLCAqZnVuYzsKLQotICArK2k7Ci0gIGZ1bmMgPSBpOwotICArK2k7Ci0gIGlmICh2aXJ0KSB7Ci0gICAgb2JqID0gaTsKLSAgICBBcmdzLnB1c2hfYmFjayhvYmopOwotICAgICsraTsKLSAgfQotICBhcCA9IGk7Ci0KLSAgVHlwZWRlZiogY29uc3QqIGFyZ3VtZW50cyA9IHNpZ25hdHVyZS0+Z2V0QXJndW1lbnRzVHlwZSgpOwotICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IHNpZ25hdHVyZS0+bmJBcmd1bWVudHM7ICsraSkgewotICAgIExMVk1Bc3Nlc3NvckluZm8mIExBSSA9IENvbXBpbGVyLT5nZXRUeXBlZGVmSW5mbyhhcmd1bWVudHNbaV0pOwotICAgIFZhbHVlKiBhcmcgPSBuZXcgVkFBcmdJbnN0KGFwLCBMQUkubGx2bVR5cGUsICIiLCBjdXJyZW50QmxvY2spOwotICAgIGlmIChhcmd1bWVudHNbaV0tPmlzUmVmZXJlbmNlKCkpIHsKLSAgICAgIGFyZyA9IG5ldyBJbnRUb1B0ckluc3QoYXJnLCBJbnRyaW5zaWNzLkphdmFPYmplY3RUeXBlLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgIFZhbHVlKiBjbXAgPSBuZXcgSUNtcEluc3QoKmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfRVEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpY3MuSmF2YU9iamVjdE51bGxDb25zdGFudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCAiIik7Ci0gICAgICBCYXNpY0Jsb2NrKiBlbmRCbG9jayA9IEJhc2ljQmxvY2s6OkNyZWF0ZShjb250ZXh0LCAiZW5kIiwgcmVzKTsKLSAgICAgIEJhc2ljQmxvY2sqIGxvYWRCbG9jayA9IEJhc2ljQmxvY2s6OkNyZWF0ZShjb250ZXh0LCAibG9hZCIsIHJlcyk7Ci0gICAgICBQSElOb2RlKiBub2RlID0gUEhJTm9kZTo6Q3JlYXRlKEludHJpbnNpY3MuSmF2YU9iamVjdFR5cGUsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRCbG9jayk7Ci0gICAgICBub2RlLT5hZGRJbmNvbWluZyhJbnRyaW5zaWNzLkphdmFPYmplY3ROdWxsQ29uc3RhbnQsIGN1cnJlbnRCbG9jayk7Ci0gICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoZW5kQmxvY2ssIGxvYWRCbG9jaywgY21wLCBjdXJyZW50QmxvY2spOwotICAgICAgY3VycmVudEJsb2NrID0gbG9hZEJsb2NrOwotICAgICAgYXJnID0gbmV3IEJpdENhc3RJbnN0KGFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKEludHJpbnNpY3MuSmF2YU9iamVjdFR5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgYXJnID0gbmV3IExvYWRJbnN0KGFyZywgIiIsIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgICAgbm9kZS0+YWRkSW5jb21pbmcoYXJnLCBjdXJyZW50QmxvY2spOwotICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKGVuZEJsb2NrLCBjdXJyZW50QmxvY2spOwotICAgICAgY3VycmVudEJsb2NrID0gZW5kQmxvY2s7Ci0gICAgICBhcmcgPSBub2RlOwotICAgIH0KLSAgICBBcmdzLnB1c2hfYmFjayhhcmcpOwotICB9Ci0KLSAgVmFsdWUqIHZhbCA9IENhbGxJbnN0OjpDcmVhdGUoZnVuYywgQXJncy5iZWdpbigpLCBBcmdzLmVuZCgpLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgaWYgKCFzaWduYXR1cmUtPmdldFJldHVyblR5cGUoKS0+aXNWb2lkKCkpIHsKLSAgICBSZXR1cm5JbnN0OjpDcmVhdGUoY29udGV4dCwgdmFsLCBjdXJyZW50QmxvY2spOwotICB9IGVsc2UgewotICAgIFJldHVybkluc3Q6OkNyZWF0ZShjb250ZXh0LCBjdXJyZW50QmxvY2spOwotICB9Ci0gIAotICByZXMtPnNldEdDKCJ2bWtpdCIpOwotICAKLSAgcmV0dXJuIHJlczsKLX0KLQotRnVuY3Rpb24qIExMVk1TaWduYXR1cmVJbmZvOjpjcmVhdGVGdW5jdGlvblN0dWIoYm9vbCBzcGVjaWFsLCBib29sIHZpcnQpIHsKLSAgCi0gIHN0ZDo6dmVjdG9yPFZhbHVlKj4gQXJnczsKLSAgc3RkOjp2ZWN0b3I8VmFsdWUqPiBGdW5jdGlvbkFyZ3M7Ci0gIHN0ZDo6dmVjdG9yPFZhbHVlKj4gVGVtcEFyZ3M7Ci0gIAotICBKM0ludHJpbnNpY3MmIEludHJpbnNpY3MgPSAqQ29tcGlsZXItPmdldEludHJpbnNpY3MoKTsKLSAgc3RkOjpzdHJpbmcgbmFtZTsKLSAgaWYgKENvbXBpbGVyLT5pc1N0YXRpY0NvbXBpbGluZygpKSB7Ci0gICAgbmFtZSArPSBVVEY4QnVmZmVyKHNpZ25hdHVyZS0+a2V5TmFtZSkuY1N0cmluZygpOwotICAgIG5hbWUgKz0gdmlydCA/ICJ2aXJ0dWFsX3N0dWIiIDogc3BlY2lhbCA/ICJzcGVjaWFsX3N0dWIiIDogInN0YXRpY19zdHViIjsKLSAgfSBlbHNlIHsKLSAgICBuYW1lID0gIiI7Ci0gIH0KLQotICBGdW5jdGlvbiogc3R1YiA9IEZ1bmN0aW9uOjpDcmVhdGUoKHZpcnQgfHwgc3BlY2lhbCkgPyBnZXRWaXJ0dWFsVHlwZSgpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RhdGljVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxWYWx1ZTo6SW50ZXJuYWxMaW5rYWdlLCBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21waWxlci0+Z2V0TExWTU1vZHVsZSgpKTsKLSAgTExWTUNvbnRleHQmIGNvbnRleHQgPSBDb21waWxlci0+Z2V0TExWTU1vZHVsZSgpLT5nZXRDb250ZXh0KCk7Ci0gIAotICBCYXNpY0Jsb2NrKiBjdXJyZW50QmxvY2sgPSBCYXNpY0Jsb2NrOjpDcmVhdGUoY29udGV4dCwgImVudGVyIiwgc3R1Yik7Ci0gIEJhc2ljQmxvY2sqIGVuZEJsb2NrID0gQmFzaWNCbG9jazo6Q3JlYXRlKGNvbnRleHQsICJlbmQiLCBzdHViKTsKLSAgQmFzaWNCbG9jayogY2FsbEJsb2NrID0gQmFzaWNCbG9jazo6Q3JlYXRlKGNvbnRleHQsICJjYWxsIiwgc3R1Yik7Ci0gIFBISU5vZGUqIG5vZGUgPSBOVUxMOwotICBpZiAoIXNpZ25hdHVyZS0+Z2V0UmV0dXJuVHlwZSgpLT5pc1ZvaWQoKSkgewotICAgIG5vZGUgPSBQSElOb2RlOjpDcmVhdGUoc3R1Yi0+Z2V0UmV0dXJuVHlwZSgpLCAiIiwgZW5kQmxvY2spOwotICB9Ci0gICAgCi0KLSAgZm9yIChGdW5jdGlvbjo6YXJnX2l0ZXJhdG9yIGFyZyA9IHN0dWItPmFyZ19iZWdpbigpOwotICAgICAgIGFyZyAhPSBzdHViLT5hcmdfZW5kKCk7ICsrYXJnKSB7Ci0gICAgVmFsdWUqIHRlbXAgPSBhcmc7Ci0gICAgaWYgKENvbXBpbGVyLT51c2VDb29wZXJhdGl2ZUdDKCkgJiYKLSAgICAgICAgYXJnLT5nZXRUeXBlKCkgPT0gSW50cmluc2ljcy5KYXZhT2JqZWN0VHlwZSkgewotICAgICAgdGVtcCA9IG5ldyBBbGxvY2FJbnN0KEludHJpbnNpY3MuSmF2YU9iamVjdFR5cGUsICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgbmV3IFN0b3JlSW5zdChhcmcsIHRlbXAsICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgVmFsdWUqIEdDQXJnc1syXSA9IHsKLSAgICAgICAgbmV3IEJpdENhc3RJbnN0KHRlbXAsIEludHJpbnNpY3MucHRyUHRyVHlwZSwgIiIsIGN1cnJlbnRCbG9jayksCi0gICAgICAgIEludHJpbnNpY3MuY29uc3RhbnRQdHJOdWxsCi0gICAgICB9OwotICAgICAgICAKLSAgICAgIENhbGxJbnN0OjpDcmVhdGUoSW50cmluc2ljcy5sbHZtX2djX2djcm9vdCwgR0NBcmdzLCBHQ0FyZ3MgKyAyLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgICB9Ci0gICAgCi0gICAgVGVtcEFyZ3MucHVzaF9iYWNrKHRlbXApOwotICB9Ci0KLSAgaWYgKHZpcnQpIHsKLSAgICBpZiAoQ29tcGlsZXItPnVzZUNvb3BlcmF0aXZlR0MoKSkgewotICAgICAgQXJncy5wdXNoX2JhY2sobmV3IExvYWRJbnN0KFRlbXBBcmdzWzBdLCAiIiwgZmFsc2UsIGN1cnJlbnRCbG9jaykpOwotICAgIH0gZWxzZSB7Ci0gICAgICBBcmdzLnB1c2hfYmFjayhUZW1wQXJnc1swXSk7Ci0gICAgfQotICB9Ci0KLSAgVmFsdWUqIHZhbCA9IENhbGxJbnN0OjpDcmVhdGUodmlydCA/IEludHJpbnNpY3MuUmVzb2x2ZVZpcnR1YWxTdHViRnVuY3Rpb24gOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsID8gSW50cmluc2ljcy5SZXNvbHZlU3BlY2lhbFN0dWJGdW5jdGlvbjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpY3MuUmVzb2x2ZVN0YXRpY1N0dWJGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJncy5iZWdpbigpLCBBcmdzLmVuZCgpLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgCi0gIENvbnN0YW50KiBudWxsVmFsdWUgPSBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKHZhbC0+Z2V0VHlwZSgpKTsKLSAgVmFsdWUqIGNtcCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6SUNNUF9FUSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsVmFsdWUsIHZhbCwgIiIpOwotICBCcmFuY2hJbnN0OjpDcmVhdGUoZW5kQmxvY2ssIGNhbGxCbG9jaywgY21wLCBjdXJyZW50QmxvY2spOwotICBpZiAobm9kZSkgbm9kZS0+YWRkSW5jb21pbmcoQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShub2RlLT5nZXRUeXBlKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLQotICBjdXJyZW50QmxvY2sgPSBjYWxsQmxvY2s7Ci0gIFZhbHVlKiBGdW5jID0gbmV3IEJpdENhc3RJbnN0KHZhbCwgc3R1Yi0+Z2V0VHlwZSgpLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgCi0gIGludCBpID0gMDsKLSAgZm9yIChGdW5jdGlvbjo6YXJnX2l0ZXJhdG9yIGFyZyA9IHN0dWItPmFyZ19iZWdpbigpOwotICAgICAgIGFyZyAhPSBzdHViLT5hcmdfZW5kKCk7ICsrYXJnLCArK2kpIHsKLSAgICBWYWx1ZSogdGVtcCA9IGFyZzsKLSAgICBpZiAoQ29tcGlsZXItPnVzZUNvb3BlcmF0aXZlR0MoKSAmJgotICAgICAgICBhcmctPmdldFR5cGUoKSA9PSBJbnRyaW5zaWNzLkphdmFPYmplY3RUeXBlKSB7Ci0gICAgICB0ZW1wID0gbmV3IExvYWRJbnN0KFRlbXBBcmdzW2ldLCAiIiwgZmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0gICAgfQotICAgIEZ1bmN0aW9uQXJncy5wdXNoX2JhY2sodGVtcCk7Ci0gIH0KLSAgVmFsdWUqIHJlcyA9IENhbGxJbnN0OjpDcmVhdGUoRnVuYywgRnVuY3Rpb25BcmdzLmJlZ2luKCksIEZ1bmN0aW9uQXJncy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIGlmIChub2RlKSBub2RlLT5hZGRJbmNvbWluZyhyZXMsIGN1cnJlbnRCbG9jayk7Ci0gIEJyYW5jaEluc3Q6OkNyZWF0ZShlbmRCbG9jaywgY3VycmVudEJsb2NrKTsKLQotICBjdXJyZW50QmxvY2sgPSBlbmRCbG9jazsKLSAgaWYgKG5vZGUpIHsKLSAgICBSZXR1cm5JbnN0OjpDcmVhdGUoY29udGV4dCwgbm9kZSwgY3VycmVudEJsb2NrKTsKLSAgfSBlbHNlIHsKLSAgICBSZXR1cm5JbnN0OjpDcmVhdGUoY29udGV4dCwgY3VycmVudEJsb2NrKTsKLSAgfQotICAKLSAgc3R1Yi0+c2V0R0MoInZta2l0Iik7Ci0gIAotICByZXR1cm4gc3R1YjsKLX0KLQotY29uc3QgUG9pbnRlclR5cGUqIExMVk1TaWduYXR1cmVJbmZvOjpnZXRTdGF0aWNQdHJUeXBlKCkgewotICBpZiAoIXN0YXRpY1B0clR5cGUpIHsKLSAgICBzdGF0aWNQdHJUeXBlID0gUG9pbnRlclR5cGU6OmdldFVucXVhbChnZXRTdGF0aWNUeXBlKCkpOwotICB9Ci0gIHJldHVybiBzdGF0aWNQdHJUeXBlOwotfQotCi1jb25zdCBQb2ludGVyVHlwZSogTExWTVNpZ25hdHVyZUluZm86OmdldFZpcnR1YWxQdHJUeXBlKCkgewotICBpZiAoIXZpcnR1YWxQdHJUeXBlKSB7Ci0gICAgdmlydHVhbFB0clR5cGUgPSBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKGdldFZpcnR1YWxUeXBlKCkpOwotICB9Ci0gIHJldHVybiB2aXJ0dWFsUHRyVHlwZTsKLX0KLQotY29uc3QgUG9pbnRlclR5cGUqIExMVk1TaWduYXR1cmVJbmZvOjpnZXROYXRpdmVQdHJUeXBlKCkgewotICBpZiAoIW5hdGl2ZVB0clR5cGUpIHsKLSAgICBuYXRpdmVQdHJUeXBlID0gUG9pbnRlclR5cGU6OmdldFVucXVhbChnZXROYXRpdmVUeXBlKCkpOwotICB9Ci0gIHJldHVybiBuYXRpdmVQdHJUeXBlOwotfQotCi0KLWNvbnN0IEZ1bmN0aW9uVHlwZSogTExWTVNpZ25hdHVyZUluZm86OmdldFZpcnR1YWxCdWZUeXBlKCkgewotICBpZiAoIXZpcnR1YWxCdWZUeXBlKSB7Ci0gICAgLy8gTG9jayBoZXJlIGJlY2F1c2Ugd2UgYXJlIGNhbGxlZCBieSBhcmJpdHJhcnkgY29kZQotICAgIG12bTo6TXZtTW9kdWxlOjpwcm90ZWN0SVIoKTsKLSAgICBzdGQ6OnZlY3Rvcjxjb25zdCBsbHZtOjpUeXBlKj4gQXJnczsKLSAgICBBcmdzLnB1c2hfYmFjayhDb21waWxlci0+Z2V0SW50cmluc2ljcygpLT5Db25zdGFudFBvb2xUeXBlKTsgLy8gY3RwCi0gICAgQXJncy5wdXNoX2JhY2soZ2V0VmlydHVhbFB0clR5cGUoKSk7Ci0gICAgQXJncy5wdXNoX2JhY2soQ29tcGlsZXItPmdldEludHJpbnNpY3MoKS0+SmF2YU9iamVjdFR5cGUpOwotICAgIEFyZ3MucHVzaF9iYWNrKENvbXBpbGVyLT5Bc3Nlc3NvckluZm9bSV9MT05HXS5sbHZtVHlwZVB0cik7Ci0gICAgTExWTUFzc2Vzc29ySW5mbyYgTEFJID0KLSAgICAgIENvbXBpbGVyLT5nZXRUeXBlZGVmSW5mbyhzaWduYXR1cmUtPmdldFJldHVyblR5cGUoKSk7Ci0gICAgdmlydHVhbEJ1ZlR5cGUgPSBGdW5jdGlvblR5cGU6OmdldChMQUkubGx2bVR5cGUsIEFyZ3MsIGZhbHNlKTsKLSAgICBtdm06Ok12bU1vZHVsZTo6dW5wcm90ZWN0SVIoKTsKLSAgfQotICByZXR1cm4gdmlydHVhbEJ1ZlR5cGU7Ci19Ci0KLWNvbnN0IEZ1bmN0aW9uVHlwZSogTExWTVNpZ25hdHVyZUluZm86OmdldFN0YXRpY0J1ZlR5cGUoKSB7Ci0gIGlmICghc3RhdGljQnVmVHlwZSkgewotICAgIC8vIExvY2sgaGVyZSBiZWNhdXNlIHdlIGFyZSBjYWxsZWQgYnkgYXJiaXRyYXJ5IGNvZGUKLSAgICBtdm06Ok12bU1vZHVsZTo6cHJvdGVjdElSKCk7Ci0gICAgc3RkOjp2ZWN0b3I8Y29uc3QgbGx2bTo6VHlwZSo+IEFyZ3M7Ci0gICAgQXJncy5wdXNoX2JhY2soQ29tcGlsZXItPmdldEludHJpbnNpY3MoKS0+Q29uc3RhbnRQb29sVHlwZSk7IC8vIGN0cAotICAgIEFyZ3MucHVzaF9iYWNrKGdldFN0YXRpY1B0clR5cGUoKSk7Ci0gICAgQXJncy5wdXNoX2JhY2soQ29tcGlsZXItPkFzc2Vzc29ySW5mb1tJX0xPTkddLmxsdm1UeXBlUHRyKTsKLSAgICBMTFZNQXNzZXNzb3JJbmZvJiBMQUkgPQotICAgICAgQ29tcGlsZXItPmdldFR5cGVkZWZJbmZvKHNpZ25hdHVyZS0+Z2V0UmV0dXJuVHlwZSgpKTsKLSAgICBzdGF0aWNCdWZUeXBlID0gRnVuY3Rpb25UeXBlOjpnZXQoTEFJLmxsdm1UeXBlLCBBcmdzLCBmYWxzZSk7Ci0gICAgbXZtOjpNdm1Nb2R1bGU6OnVucHJvdGVjdElSKCk7Ci0gIH0KLSAgcmV0dXJuIHN0YXRpY0J1ZlR5cGU7Ci19Ci0KLUZ1bmN0aW9uKiBMTFZNU2lnbmF0dXJlSW5mbzo6Z2V0VmlydHVhbEJ1ZigpIHsKLSAgLy8gTG9jayBoZXJlIGJlY2F1c2Ugd2UgYXJlIGNhbGxlZCBieSBhcmJpdHJhcnkgY29kZS4gQWxzbyBwdXQgdGhhdCBoZXJlCi0gIC8vIGJlY2F1c2Ugd2UgYXJlIHdhaXRpbmcgb24gdmlydHVhbEJ1ZkZ1bmN0aW9uIHRvIGhhdmUgYW4gYWRkcmVzcy4KLSAgbXZtOjpNdm1Nb2R1bGU6OnByb3RlY3RJUigpOwotICBpZiAoIXZpcnR1YWxCdWZGdW5jdGlvbikgewotICAgIHZpcnR1YWxCdWZGdW5jdGlvbiA9IGNyZWF0ZUZ1bmN0aW9uQ2FsbEJ1Zih0cnVlKTsKLSAgICBzaWduYXR1cmUtPnNldFZpcnR1YWxDYWxsQnVmKENvbXBpbGVyLT5HZW5lcmF0ZVN0dWIodmlydHVhbEJ1ZkZ1bmN0aW9uKSk7Ci0gIH0KLSAgbXZtOjpNdm1Nb2R1bGU6OnVucHJvdGVjdElSKCk7Ci0gIHJldHVybiB2aXJ0dWFsQnVmRnVuY3Rpb247Ci19Ci0KLUZ1bmN0aW9uKiBMTFZNU2lnbmF0dXJlSW5mbzo6Z2V0VmlydHVhbEFQKCkgewotICAvLyBMb2NrIGhlcmUgYmVjYXVzZSB3ZSBhcmUgY2FsbGVkIGJ5IGFyYml0cmFyeSBjb2RlLiBBbHNvIHB1dCB0aGF0IGhlcmUKLSAgLy8gYmVjYXVzZSB3ZSBhcmUgd2FpdGluZyBvbiB2aXJ0dWFsQVBGdW5jdGlvbiB0byBoYXZlIGFuIGFkZHJlc3MuCi0gIG12bTo6TXZtTW9kdWxlOjpwcm90ZWN0SVIoKTsKLSAgaWYgKCF2aXJ0dWFsQVBGdW5jdGlvbikgewotICAgIHZpcnR1YWxBUEZ1bmN0aW9uID0gY3JlYXRlRnVuY3Rpb25DYWxsQVAodHJ1ZSk7Ci0gICAgc2lnbmF0dXJlLT5zZXRWaXJ0dWFsQ2FsbEFQKENvbXBpbGVyLT5HZW5lcmF0ZVN0dWIodmlydHVhbEFQRnVuY3Rpb24pKTsKLSAgfQotICBtdm06Ok12bU1vZHVsZTo6dW5wcm90ZWN0SVIoKTsKLSAgcmV0dXJuIHZpcnR1YWxBUEZ1bmN0aW9uOwotfQotCi1GdW5jdGlvbiogTExWTVNpZ25hdHVyZUluZm86OmdldFN0YXRpY0J1ZigpIHsKLSAgLy8gTG9jayBoZXJlIGJlY2F1c2Ugd2UgYXJlIGNhbGxlZCBieSBhcmJpdHJhcnkgY29kZS4gQWxzbyBwdXQgdGhhdCBoZXJlCi0gIC8vIGJlY2F1c2Ugd2UgYXJlIHdhaXRpbmcgb24gc3RhdGljQnVmRnVuY3Rpb24gdG8gaGF2ZSBhbiBhZGRyZXNzLgotICBtdm06Ok12bU1vZHVsZTo6cHJvdGVjdElSKCk7Ci0gIGlmICghc3RhdGljQnVmRnVuY3Rpb24pIHsKLSAgICBzdGF0aWNCdWZGdW5jdGlvbiA9IGNyZWF0ZUZ1bmN0aW9uQ2FsbEJ1ZihmYWxzZSk7Ci0gICAgc2lnbmF0dXJlLT5zZXRTdGF0aWNDYWxsQnVmKENvbXBpbGVyLT5HZW5lcmF0ZVN0dWIoc3RhdGljQnVmRnVuY3Rpb24pKTsKLSAgfQotICBtdm06Ok12bU1vZHVsZTo6dW5wcm90ZWN0SVIoKTsKLSAgcmV0dXJuIHN0YXRpY0J1ZkZ1bmN0aW9uOwotfQotCi1GdW5jdGlvbiogTExWTVNpZ25hdHVyZUluZm86OmdldFN0YXRpY0FQKCkgewotICAvLyBMb2NrIGhlcmUgYmVjYXVzZSB3ZSBhcmUgY2FsbGVkIGJ5IGFyYml0cmFyeSBjb2RlLiBBbHNvIHB1dCB0aGF0IGhlcmUKLSAgLy8gYmVjYXVzZSB3ZSBhcmUgd2FpdGluZyBvbiBzdGF0aWNBUEZ1bmN0aW9uIHRvIGhhdmUgYW4gYWRkcmVzcy4KLSAgbXZtOjpNdm1Nb2R1bGU6OnByb3RlY3RJUigpOwotICBpZiAoIXN0YXRpY0FQRnVuY3Rpb24pIHsKLSAgICBzdGF0aWNBUEZ1bmN0aW9uID0gY3JlYXRlRnVuY3Rpb25DYWxsQVAoZmFsc2UpOwotICAgIHNpZ25hdHVyZS0+c2V0U3RhdGljQ2FsbEFQKENvbXBpbGVyLT5HZW5lcmF0ZVN0dWIoc3RhdGljQVBGdW5jdGlvbikpOwotICB9Ci0gIG12bTo6TXZtTW9kdWxlOjp1bnByb3RlY3RJUigpOwotICByZXR1cm4gc3RhdGljQVBGdW5jdGlvbjsKLX0KLQotRnVuY3Rpb24qIExMVk1TaWduYXR1cmVJbmZvOjpnZXRTdGF0aWNTdHViKCkgewotICAvLyBMb2NrIGhlcmUgYmVjYXVzZSB3ZSBhcmUgY2FsbGVkIGJ5IGFyYml0cmFyeSBjb2RlLiBBbHNvIHB1dCB0aGF0IGhlcmUKLSAgLy8gYmVjYXVzZSB3ZSBhcmUgd2FpdGluZyBvbiBzdGF0aWNTdHViRnVuY3Rpb24gdG8gaGF2ZSBhbiBhZGRyZXNzLgotICBtdm06Ok12bU1vZHVsZTo6cHJvdGVjdElSKCk7Ci0gIGlmICghc3RhdGljU3R1YkZ1bmN0aW9uKSB7Ci0gICAgc3RhdGljU3R1YkZ1bmN0aW9uID0gY3JlYXRlRnVuY3Rpb25TdHViKGZhbHNlLCBmYWxzZSk7Ci0gICAgc2lnbmF0dXJlLT5zZXRTdGF0aWNDYWxsU3R1YihDb21waWxlci0+R2VuZXJhdGVTdHViKHN0YXRpY1N0dWJGdW5jdGlvbikpOwotICB9Ci0gIG12bTo6TXZtTW9kdWxlOjp1bnByb3RlY3RJUigpOwotICByZXR1cm4gc3RhdGljU3R1YkZ1bmN0aW9uOwotfQotCi1GdW5jdGlvbiogTExWTVNpZ25hdHVyZUluZm86OmdldFNwZWNpYWxTdHViKCkgewotICAvLyBMb2NrIGhlcmUgYmVjYXVzZSB3ZSBhcmUgY2FsbGVkIGJ5IGFyYml0cmFyeSBjb2RlLiBBbHNvIHB1dCB0aGF0IGhlcmUKLSAgLy8gYmVjYXVzZSB3ZSBhcmUgd2FpdGluZyBvbiBzcGVjaWFsU3R1YkZ1bmN0aW9uIHRvIGhhdmUgYW4gYWRkcmVzcy4KLSAgbXZtOjpNdm1Nb2R1bGU6OnByb3RlY3RJUigpOwotICBpZiAoIXNwZWNpYWxTdHViRnVuY3Rpb24pIHsKLSAgICBzcGVjaWFsU3R1YkZ1bmN0aW9uID0gY3JlYXRlRnVuY3Rpb25TdHViKHRydWUsIGZhbHNlKTsKLSAgICBzaWduYXR1cmUtPnNldFNwZWNpYWxDYWxsU3R1YihDb21waWxlci0+R2VuZXJhdGVTdHViKHNwZWNpYWxTdHViRnVuY3Rpb24pKTsKLSAgfQotICBtdm06Ok12bU1vZHVsZTo6dW5wcm90ZWN0SVIoKTsKLSAgcmV0dXJuIHNwZWNpYWxTdHViRnVuY3Rpb247Ci19Ci0KLUZ1bmN0aW9uKiBMTFZNU2lnbmF0dXJlSW5mbzo6Z2V0VmlydHVhbFN0dWIoKSB7Ci0gIC8vIExvY2sgaGVyZSBiZWNhdXNlIHdlIGFyZSBjYWxsZWQgYnkgYXJiaXRyYXJ5IGNvZGUuIEFsc28gcHV0IHRoYXQgaGVyZQotICAvLyBiZWNhdXNlIHdlIGFyZSB3YWl0aW5nIG9uIHZpcnR1YWxTdHViRnVuY3Rpb24gdG8gaGF2ZSBhbiBhZGRyZXNzLgotICBtdm06Ok12bU1vZHVsZTo6cHJvdGVjdElSKCk7Ci0gIGlmICghdmlydHVhbFN0dWJGdW5jdGlvbikgewotICAgIHZpcnR1YWxTdHViRnVuY3Rpb24gPSBjcmVhdGVGdW5jdGlvblN0dWIoZmFsc2UsIHRydWUpOwotICAgIHNpZ25hdHVyZS0+c2V0VmlydHVhbENhbGxTdHViKENvbXBpbGVyLT5HZW5lcmF0ZVN0dWIodmlydHVhbFN0dWJGdW5jdGlvbikpOwotICB9Ci0gIG12bTo6TXZtTW9kdWxlOjp1bnByb3RlY3RJUigpOwotICByZXR1cm4gdmlydHVhbFN0dWJGdW5jdGlvbjsKLX0KLQotdm9pZCBKYXZhTExWTUNvbXBpbGVyOjppbml0aWFsaXNlQXNzZXNzb3JJbmZvKCkgewotICBBc3Nlc3NvckluZm9bSV9WT0lEXS5sbHZtVHlwZSA9IFR5cGU6OmdldFZvaWRUeShnZXRMTFZNQ29udGV4dCgpKTsKLSAgQXNzZXNzb3JJbmZvW0lfVk9JRF0ubGx2bVR5cGVQdHIgPSAwOwotICBBc3Nlc3NvckluZm9bSV9WT0lEXS5sb2dTaXplSW5CeXRlc0NvbnN0YW50ID0gMDsKLSAgCi0gIEFzc2Vzc29ySW5mb1tJX0JPT0xdLmxsdm1UeXBlID0gVHlwZTo6Z2V0SW50OFR5KGdldExMVk1Db250ZXh0KCkpOwotICBBc3Nlc3NvckluZm9bSV9CT09MXS5sbHZtVHlwZVB0ciA9Ci0gICAgUG9pbnRlclR5cGU6OmdldFVucXVhbChUeXBlOjpnZXRJbnQ4VHkoZ2V0TExWTUNvbnRleHQoKSkpOwotICBBc3Nlc3NvckluZm9bSV9CT09MXS5sb2dTaXplSW5CeXRlc0NvbnN0YW50ID0gMDsKLSAgCi0gIEFzc2Vzc29ySW5mb1tJX0JZVEVdLmxsdm1UeXBlID0gVHlwZTo6Z2V0SW50OFR5KGdldExMVk1Db250ZXh0KCkpOwotICBBc3Nlc3NvckluZm9bSV9CWVRFXS5sbHZtVHlwZVB0ciA9Ci0gICAgUG9pbnRlclR5cGU6OmdldFVucXVhbChUeXBlOjpnZXRJbnQ4VHkoZ2V0TExWTUNvbnRleHQoKSkpOwotICBBc3Nlc3NvckluZm9bSV9CWVRFXS5sb2dTaXplSW5CeXRlc0NvbnN0YW50ID0gMDsKLSAgCi0gIEFzc2Vzc29ySW5mb1tJX1NIT1JUXS5sbHZtVHlwZSA9IFR5cGU6OmdldEludDE2VHkoZ2V0TExWTUNvbnRleHQoKSk7Ci0gIEFzc2Vzc29ySW5mb1tJX1NIT1JUXS5sbHZtVHlwZVB0ciA9Ci0gICAgUG9pbnRlclR5cGU6OmdldFVucXVhbChUeXBlOjpnZXRJbnQxNlR5KGdldExMVk1Db250ZXh0KCkpKTsKLSAgQXNzZXNzb3JJbmZvW0lfU0hPUlRdLmxvZ1NpemVJbkJ5dGVzQ29uc3RhbnQgPSAxOwotICAKLSAgQXNzZXNzb3JJbmZvW0lfQ0hBUl0ubGx2bVR5cGUgPSBUeXBlOjpnZXRJbnQxNlR5KGdldExMVk1Db250ZXh0KCkpOwotICBBc3Nlc3NvckluZm9bSV9DSEFSXS5sbHZtVHlwZVB0ciA9Ci0gICAgUG9pbnRlclR5cGU6OmdldFVucXVhbChUeXBlOjpnZXRJbnQxNlR5KGdldExMVk1Db250ZXh0KCkpKTsKLSAgQXNzZXNzb3JJbmZvW0lfQ0hBUl0ubG9nU2l6ZUluQnl0ZXNDb25zdGFudCA9IDE7Ci0gIAotICBBc3Nlc3NvckluZm9bSV9JTlRdLmxsdm1UeXBlID0gVHlwZTo6Z2V0SW50MzJUeShnZXRMTFZNQ29udGV4dCgpKTsKLSAgQXNzZXNzb3JJbmZvW0lfSU5UXS5sbHZtVHlwZVB0ciA9Ci0gICAgUG9pbnRlclR5cGU6OmdldFVucXVhbChUeXBlOjpnZXRJbnQzMlR5KGdldExMVk1Db250ZXh0KCkpKTsKLSAgQXNzZXNzb3JJbmZvW0lfSU5UXS5sb2dTaXplSW5CeXRlc0NvbnN0YW50ID0gMjsKLSAgCi0gIEFzc2Vzc29ySW5mb1tJX0ZMT0FUXS5sbHZtVHlwZSA9IFR5cGU6OmdldEZsb2F0VHkoZ2V0TExWTUNvbnRleHQoKSk7Ci0gIEFzc2Vzc29ySW5mb1tJX0ZMT0FUXS5sbHZtVHlwZVB0ciA9Ci0gICAgUG9pbnRlclR5cGU6OmdldFVucXVhbChUeXBlOjpnZXRGbG9hdFR5KGdldExMVk1Db250ZXh0KCkpKTsKLSAgQXNzZXNzb3JJbmZvW0lfRkxPQVRdLmxvZ1NpemVJbkJ5dGVzQ29uc3RhbnQgPSAyOwotICAKLSAgQXNzZXNzb3JJbmZvW0lfTE9OR10ubGx2bVR5cGUgPSBUeXBlOjpnZXRJbnQ2NFR5KGdldExMVk1Db250ZXh0KCkpOwotICBBc3Nlc3NvckluZm9bSV9MT05HXS5sbHZtVHlwZVB0ciA9Ci0gICAgUG9pbnRlclR5cGU6OmdldFVucXVhbChUeXBlOjpnZXRJbnQ2NFR5KGdldExMVk1Db250ZXh0KCkpKTsKLSAgQXNzZXNzb3JJbmZvW0lfTE9OR10ubG9nU2l6ZUluQnl0ZXNDb25zdGFudCA9IDM7Ci0gIAotICBBc3Nlc3NvckluZm9bSV9ET1VCTEVdLmxsdm1UeXBlID0gVHlwZTo6Z2V0RG91YmxlVHkoZ2V0TExWTUNvbnRleHQoKSk7Ci0gIEFzc2Vzc29ySW5mb1tJX0RPVUJMRV0ubGx2bVR5cGVQdHIgPQotICAgIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVHlwZTo6Z2V0RG91YmxlVHkoZ2V0TExWTUNvbnRleHQoKSkpOwotICBBc3Nlc3NvckluZm9bSV9ET1VCTEVdLmxvZ1NpemVJbkJ5dGVzQ29uc3RhbnQgPSAzOwotICAKLSAgQXNzZXNzb3JJbmZvW0lfVEFCXS5sbHZtVHlwZSA9IEphdmFJbnRyaW5zaWNzLkphdmFPYmplY3RUeXBlOwotICBBc3Nlc3NvckluZm9bSV9UQUJdLmxsdm1UeXBlUHRyID0KLSAgICBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKEFzc2Vzc29ySW5mb1tJX1RBQl0ubGx2bVR5cGUpOwotICBBc3Nlc3NvckluZm9bSV9UQUJdLmxvZ1NpemVJbkJ5dGVzQ29uc3RhbnQgPSBzaXplb2YoSmF2YU9iamVjdCopID09IDggPyAzIDogMjsKLSAgCi0gIEFzc2Vzc29ySW5mb1tJX1JFRl0ubGx2bVR5cGUgPSBBc3Nlc3NvckluZm9bSV9UQUJdLmxsdm1UeXBlOwotICBBc3Nlc3NvckluZm9bSV9SRUZdLmxsdm1UeXBlUHRyID0gQXNzZXNzb3JJbmZvW0lfVEFCXS5sbHZtVHlwZVB0cjsKLSAgQXNzZXNzb3JJbmZvW0lfUkVGXS5sb2dTaXplSW5CeXRlc0NvbnN0YW50ID0gc2l6ZW9mKEphdmFPYmplY3QqKSA9PSA4ID8gMyA6IDI7Ci19Ci0KLUxMVk1Bc3Nlc3NvckluZm8mIEphdmFMTFZNQ29tcGlsZXI6OmdldFR5cGVkZWZJbmZvKGNvbnN0IFR5cGVkZWYqIHR5cGUpIHsKLSAgcmV0dXJuIEFzc2Vzc29ySW5mb1t0eXBlLT5nZXRLZXkoKS0+ZWxlbWVudHNbMF1dOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL0ozL0NvbXBpbGVyL0xMVk1NYXRlcmlhbGl6ZXIuY3BwIGIvdm1raXQvbGliL0ozL0NvbXBpbGVyL0xMVk1NYXRlcmlhbGl6ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2Y3NWFlLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9KMy9Db21waWxlci9MTFZNTWF0ZXJpYWxpemVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vLz09PS0tLS0tLS0tIExMVk1NYXRlcmlhbGl6ZXIuY3BwIC0gTExWTSBNYXRlcmlhbGl6ZXIgZm9yIEozIC0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCi0jaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKLSNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9FeGVjdXRpb25FbmdpbmUuaCIKLQotI2luY2x1ZGUgIm12bS9KSVQuaCIKLQotI2luY2x1ZGUgIkphdmFBY2Nlc3MuaCIKLSNpbmNsdWRlICJKYXZhQ2xhc3MuaCIKLSNpbmNsdWRlICJKYXZhQ29uc3RhbnRQb29sLmgiCi0jaW5jbHVkZSAiSmF2YVRocmVhZC5oIgotI2luY2x1ZGUgIkphdmFUeXBlcy5oIgotI2luY2x1ZGUgIkpuanZtLmgiCi0KLSNpbmNsdWRlICJqMy9KM0ludHJpbnNpY3MuaCIKLSNpbmNsdWRlICJqMy9MTFZNTWF0ZXJpYWxpemVyLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBsbHZtOwotdXNpbmcgbmFtZXNwYWNlIGozOwotCi0KLUphdmFMTFZNTGF6eUpJVENvbXBpbGVyOjpKYXZhTExWTUxhenlKSVRDb21waWxlcihjb25zdCBzdGQ6OnN0cmluZyYgTW9kdWxlSUQpCi0gICAgOiBKYXZhSklUQ29tcGlsZXIoTW9kdWxlSUQpIHsKLSAgVGhlTWF0ZXJpYWxpemVyID0gbmV3IExMVk1NYXRlcmlhbGl6ZXIoVGhlTW9kdWxlLCB0aGlzKTsKLSAgZXhlY3V0aW9uRW5naW5lLT5EaXNhYmxlTGF6eUNvbXBpbGF0aW9uKGZhbHNlKTsgICAKLX0KLQotSmF2YUxMVk1MYXp5SklUQ29tcGlsZXI6On5KYXZhTExWTUxhenlKSVRDb21waWxlcigpIHsKLSAgLy8gVGhlIG1vZHVsZSBhbHJlYWR5IGRlc3Ryb3lzIHRoZSBtYXRlcmlhbGl6ZXIuCi19Ci0KLXZvaWQqIEphdmFMTFZNTGF6eUpJVENvbXBpbGVyOjpsb2FkTWV0aG9kKHZvaWQqIGhhbmRsZSwgY29uc3QgY2hhciogc3ltYm9sKSB7Ci0gIEZ1bmN0aW9uKiBGID0gbXZtOjpNdm1Nb2R1bGU6Omdsb2JhbE1vZHVsZS0+Z2V0RnVuY3Rpb24oc3ltYm9sKTsKLSAgaWYgKEYpIHsKLSAgICB2b2lkKiByZXMgPSBleGVjdXRpb25FbmdpbmUtPmdldFBvaW50ZXJUb0Z1bmN0aW9uT3JTdHViKEYpOwotICAgIHJldHVybiByZXM7Ci0gIH0KLQotICByZXR1cm4gSmF2YUNvbXBpbGVyOjpsb2FkTWV0aG9kKGhhbmRsZSwgc3ltYm9sKTsKLX0KLQotdWludHB0cl90IEphdmFMTFZNTGF6eUpJVENvbXBpbGVyOjpnZXRQb2ludGVyT3JTdHViKEphdmFNZXRob2QmIG1ldGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpZGUpIHsKLSAgTExWTU1ldGhvZEluZm8qIExNSSA9IGdldE1ldGhvZEluZm8oJm1ldGgpOwotICBGdW5jdGlvbiogZnVuYyA9IExNSS0+Z2V0TWV0aG9kKCk7Ci0gIHJldHVybiAodWludHB0cl90KWV4ZWN1dGlvbkVuZ2luZS0+Z2V0UG9pbnRlclRvRnVuY3Rpb25PclN0dWIoZnVuYyk7Ci19Ci0KLXN0YXRpYyBKYXZhTWV0aG9kKiBzdGF0aWNMb29rdXAoQ2FsbGJhY2tJbmZvJiBGKSB7Ci0gIENsYXNzKiBjYWxsZXIgPSBGLmNsOwotICB1aW50MTYgaW5kZXggPSBGLmluZGV4OyAKLSAgYm9vbCBpc1N0YXRpYyA9IEYuc3RhdDsKLSAgSmF2YUNvbnN0YW50UG9vbCogY3RwSW5mbyA9IGNhbGxlci0+Z2V0Q29uc3RhbnRQb29sKCk7Ci0KLSAgQ29tbW9uQ2xhc3MqIGNsID0gMDsKLSAgY29uc3QgVVRGOCogdXRmOCA9IDA7Ci0gIFNpZ25kZWYqIHNpZ24gPSAwOwotCi0gIGN0cEluZm8tPnJlc29sdmVNZXRob2QoaW5kZXgsIGNsLCB1dGY4LCBzaWduKTsKLSAgVXNlckNsYXNzKiBsb29rdXAgPSBjbC0+aXNBcnJheSgpID8gY2wtPnN1cGVyIDogY2wtPmFzQ2xhc3MoKTsKLSAgSmF2YU1ldGhvZCogbWV0aCA9IGxvb2t1cC0+bG9va3VwTWV0aG9kKHV0ZjgsIHNpZ24tPmtleU5hbWUsIGlzU3RhdGljLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0KLSAgYXNzZXJ0KGxvb2t1cC0+aXNJbml0aWFsaXppbmcoKSAmJiAiQ2xhc3Mgbm90IHJlYWR5Iik7Ci0gCi0gIHJldHVybiBtZXRoOwotfQotCi0KLVZhbHVlKiBKYXZhTExWTUxhenlKSVRDb21waWxlcjo6YWRkQ2FsbGJhY2soQ2xhc3MqIGNsLCB1aW50MTYgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpZ25kZWYqIHNpZ24sIGJvb2wgc3RhdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayogaW5zZXJ0KSB7Ci0gIAotICBGdW5jdGlvbiogRiA9IDA7Ci0gIExMVk1TaWduYXR1cmVJbmZvKiBMU0kgPSBnZXRTaWduYXR1cmVJbmZvKHNpZ24pOwotICBtdm06OlRocmVhZEFsbG9jYXRvciBhbGxvY2F0b3I7Ci0gIAotICBjb25zdCBVVEY4KiBuYW1lID0gY2wtPm5hbWU7Ci0gIGNoYXIqIGtleSA9IChjaGFyKilhbGxvY2F0b3IuQWxsb2NhdGUobmFtZS0+c2l6ZSArIDE2KTsKLSAgZm9yIChzaW50MzIgaSA9IDA7IGkgPCBuYW1lLT5zaXplOyArK2kpCi0gICAga2V5W2ldID0gbmFtZS0+ZWxlbWVudHNbaV07Ci0gIHNwcmludGYoa2V5ICsgbmFtZS0+c2l6ZSwgIiVkIiwgaW5kZXgpOwotICBGID0gVGhlTW9kdWxlLT5nZXRGdW5jdGlvbihrZXkpOwotICBpZiAoRikgcmV0dXJuIEY7Ci0gIAotICBjb25zdCBGdW5jdGlvblR5cGUqIHR5cGUgPSBzdGF0ID8gTFNJLT5nZXRTdGF0aWNUeXBlKCkgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExTSS0+Z2V0VmlydHVhbFR5cGUoKTsKLSAgCi0gIEYgPSBGdW5jdGlvbjo6Q3JlYXRlKHR5cGUsIEdsb2JhbFZhbHVlOjpFeHRlcm5hbFdlYWtMaW5rYWdlLCBrZXksIFRoZU1vZHVsZSk7Ci0gIAotICBDYWxsYmFja0luZm8gQShjbCwgaW5kZXgsIHN0YXQpOwotICBjYWxsYmFja3MuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKEYsIEEpKTsKLSAgCi0gIHJldHVybiBGOwotfQotCi0KLWJvb2wgTExWTU1hdGVyaWFsaXplcjo6TWF0ZXJpYWxpemUoR2xvYmFsVmFsdWUgKkdWLCBzdGQ6OnN0cmluZyAqRXJySW5mbykgewotICAKLSAgRnVuY3Rpb24qIEYgPSBkeW5fY2FzdDxGdW5jdGlvbj4oR1YpOwotICBhc3NlcnQoRiAmJiAiTm90IGEgZnVuY3Rpb24iKTsKLSAgaWYgKEYtPmdldExpbmthZ2UoKSA9PSBHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxMaW5rYWdlKSByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gVGhlIGNhbGxlciBvZiBtYXRlcmlhbGl6ZUZ1bmN0aW9uICptdXN0KiBhbHdheXMgaG9sZCB0aGUgSklUIGxvY2suCi0gIC8vIEJlY2F1c2Ugd2UgYXJlIG1hdGVyaWFsaXppbmcgYSBmdW5jdGlvbiBoZXJlLCB3ZSBtdXN0IHJlbGVhc2UgdGhlCi0gIC8vIEpJVCBsb2NrIGFuZCBnZXQgdGhlIGdsb2JhbCB2bWtpdCBsb2NrIHRvIGJlIHRocmVhZC1zYWZlLgotICAvLyBUaGlzIHByZXZlbnRzIGppdHRpbmcgdGhlIGZ1bmN0aW9uIHdoaWxlIHNvbWVvbmUgZWxzZSBpcyBkb2luZyBpdC4KLSAgQ29tcC0+ZXhlY3V0aW9uRW5naW5lLT5sb2NrLnJlbGVhc2UoKTsgCi0gIG12bTo6TXZtTW9kdWxlOjpwcm90ZWN0SVIoKTsKLQotICAvLyBEb24ndCB1c2UgaGFzTm90QmVlblJlYWRGcm9tQml0Y29kZTogbWF0ZXJpYWxpemVGdW5jdGlvbiBpcyBjYWxsZWQKLSAgLy8gYnkgdGhlIHBhc3MgbWFuYWdlciwgYW5kIHdlIGRvbid0IHdhbnQgYW5vdGhlciB0aHJlYWQgdG8gSklUIHRoZQotICAvLyBmdW5jdGlvbiB3aGlsZSBhbGwgcGFzc2VzIGhhdmUgbm90IGJlZW4gcnVuLgotICBpZiAoIShGLT5pc0RlY2xhcmF0aW9uKCkpKSB7Ci0gICAgbXZtOjpNdm1Nb2R1bGU6OnVucHJvdGVjdElSKCk7Ci0gICAgLy8gVE9ETzogSXMgdGhpcyBzdGlsbCB2YWxpZD8KLSAgICAvLyBSZWFjcXVpcmUgYW5kIGdvIGJhY2sgdG8gdGhlIEpJVCBmdW5jdGlvbi4KLSAgICAvLyBtdm06Ok12bU1vZHVsZTo6ZXhlY3V0aW9uRW5naW5lLT5sb2NrLmFjcXVpcmUoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoQ29tcC0+ZXhlY3V0aW9uRW5naW5lLT5nZXRQb2ludGVyVG9HbG9iYWxJZkF2YWlsYWJsZShGKSkgewotICAgIG12bTo6TXZtTW9kdWxlOjp1bnByb3RlY3RJUigpOyAKLSAgICAvLyBUT0RPOiBJcyB0aGlzIHN0aWxsIHZhbGlkPwotICAgIC8vIFJlYWNxdWlyZSBhbmQgZ28gYmFjayB0byB0aGUgSklUIGZ1bmN0aW9uLgotICAgIC8vIG12bTo6TXZtTW9kdWxlOjpleGVjdXRpb25FbmdpbmUtPmxvY2suYWNxdWlyZSgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgSmF2YU1ldGhvZCogbWV0aCA9IENvbXAtPmdldEphdmFNZXRob2QoKkYpOwotICAKLSAgaWYgKCFtZXRoKSB7Ci0gICAgLy8gSXQncyBhIGNhbGxiYWNrCi0gICAgSmF2YUxMVk1MYXp5SklUQ29tcGlsZXI6OmNhbGxiYWNrX2l0ZXJhdG9yIEkgPSBDb21wLT5jYWxsYmFja3MuZmluZChGKTsKLSAgICBhc3NlcnQoSSAhPSBDb21wLT5jYWxsYmFja3MuZW5kKCkgJiYgIk5vIGNhbGxiYWNrcyBmb3VuZCIpOwotICAgIG1ldGggPSBzdGF0aWNMb29rdXAoSS0+c2Vjb25kKTsKLSAgfQotICAKLSAgdm9pZCogdmFsID0gbWV0aC0+Y29tcGlsZWRQdHIoKTsKLQotICBpZiAoaXNWaXJ0dWFsKG1ldGgtPmFjY2VzcykpIHsKLSAgICBMTFZNTWV0aG9kSW5mbyogTE1JID0gQ29tcC0+Z2V0TWV0aG9kSW5mbyhtZXRoKTsKLSAgICB1aW50NjRfdCBvZmZzZXQgPSBkeW5fY2FzdDxDb25zdGFudEludD4oTE1JLT5nZXRPZmZzZXQoKSktPmdldFpFeHRWYWx1ZSgpOwotICAgIGFzc2VydChtZXRoLT5jbGFzc0RlZi0+aXNSZXNvbHZlZCgpICYmICJDbGFzcyBub3QgcmVzb2x2ZWQiKTsKLSAgICBhc3NlcnQobWV0aC0+Y2xhc3NEZWYtPmlzSW5pdGlhbGl6aW5nKCkgJiYgIkNsYXNzIG5vdCByZWFkeSIpOwotICAgIGFzc2VydChtZXRoLT5jbGFzc0RlZi0+dmlydHVhbFZUICYmICJDbGFzcyBoYXMgbm8gVlQiKTsKLSAgICBhc3NlcnQobWV0aC0+Y2xhc3NEZWYtPnZpcnR1YWxUYWJsZVNpemUgPiBvZmZzZXQgJiYgCi0gICAgICAgICJUaGUgbWV0aG9kJ3Mgb2Zmc2V0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgdmlydHVhbCB0YWJsZSBzaXplIik7Ci0gICAgKCh2b2lkKiopbWV0aC0+Y2xhc3NEZWYtPnZpcnR1YWxWVClbb2Zmc2V0XSA9IHZhbDsKLSAgfSBlbHNlIHsKLSAgICBhc3NlcnQobWV0aC0+Y2xhc3NEZWYtPmlzSW5pdGlhbGl6aW5nKCkgJiYgIkNsYXNzIG5vdCByZWFkeSIpOwotICB9Ci0KLSAgbXZtOjpNdm1Nb2R1bGU6OnVucHJvdGVjdElSKCk7Ci0gIAotICAvLyBUT0RPOiBJcyB0aGlzIHN0aWxsIHZhbGlkPwotICAvLyBSZWFjcXVpcmUgdG8gZ28gYmFjayB0byB0aGUgSklUIGZ1bmN0aW9uLgotICAvLyBtdm06Ok12bU1vZHVsZTo6ZXhlY3V0aW9uRW5naW5lLT5sb2NrLmFjcXVpcmUoKTsKLSAgCi0gIGlmIChGLT5pc0RlY2xhcmF0aW9uKCkpCi0gICAgQ29tcC0+ZXhlY3V0aW9uRW5naW5lLT51cGRhdGVHbG9iYWxNYXBwaW5nKEYsIHZhbCk7Ci0gIAotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgTExWTU1hdGVyaWFsaXplcjo6aXNNYXRlcmlhbGl6YWJsZShjb25zdCBsbHZtOjpHbG9iYWxWYWx1ZSogR1YpIGNvbnN0IHsKLSAgcmV0dXJuIEdWLT5nZXRMaW5rYWdlKCkgPT0gR2xvYmFsVmFsdWU6OkV4dGVybmFsV2Vha0xpbmthZ2U7Ci19Ci0KLQotTExWTU1hdGVyaWFsaXplcjo6TExWTU1hdGVyaWFsaXplcigKLSAgICBsbHZtOjpNb2R1bGUqIG0sIEphdmFMTFZNTGF6eUpJVENvbXBpbGVyKiBDKSB7Ci0gIENvbXAgPSBDOwotICBUaGVNb2R1bGUgPSBtOwotICBtLT5zZXRNYXRlcmlhbGl6ZXIodGhpcyk7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvQ29tcGlsZXIvTG93ZXJDb25zdGFudENhbGxzLmNwcCBiL3Zta2l0L2xpYi9KMy9Db21waWxlci9Mb3dlckNvbnN0YW50Q2FsbHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmRmZDc5Li4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9KMy9Db21waWxlci9Mb3dlckNvbnN0YW50Q2FsbHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzExICswLDAgQEAKLS8vPT09LS0tLS0gTG93ZXJDb25zdGFudENhbGxzLmNwcCAtIENoYW5nZXMgYXJyYXlMZW5ndGggY2FsbHMgIC0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKLSNpbmNsdWRlICJsbHZtL0dsb2JhbFZhcmlhYmxlLmgiCi0jaW5jbHVkZSAibGx2bS9QYXNzLmgiCi0jaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgotI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NhbGxTaXRlLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCi0KLSNpbmNsdWRlICJKYXZhQ2xhc3MuaCIKLSNpbmNsdWRlICJqMy9KYXZhTExWTUNvbXBpbGVyLmgiCi0jaW5jbHVkZSAiajMvSjNJbnRyaW5zaWNzLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBsbHZtOwotCi1uYW1lc3BhY2UgajMgewotCi0gIGNsYXNzIExvd2VyQ29uc3RhbnRDYWxscyA6IHB1YmxpYyBGdW5jdGlvblBhc3MgewotICBwdWJsaWM6Ci0gICAgc3RhdGljIGNoYXIgSUQ7Ci0gICAgSmF2YUxMVk1Db21waWxlciogVGhlQ29tcGlsZXI7Ci0gICAgTG93ZXJDb25zdGFudENhbGxzKEphdmFMTFZNQ29tcGlsZXIqIENvbXBpbGVyKSA6IEZ1bmN0aW9uUGFzcyhJRCksCi0gICAgICBUaGVDb21waWxlcihDb21waWxlcikgeyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRik7Ci0gIHByaXZhdGU6Ci0gIH07Ci0gIGNoYXIgTG93ZXJDb25zdGFudENhbGxzOjpJRCA9IDA7Ci0KLSNpZiAwCi0gIHN0YXRpYyBSZWdpc3RlclBhc3M8TG93ZXJDb25zdGFudENhbGxzPiBYKCJMb3dlckNvbnN0YW50Q2FsbHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTG93ZXIgQ29uc3RhbnQgY2FsbHMiKTsKLSNlbmRpZgotCi0KLXN0YXRpYyBWYWx1ZSogZ2V0VENNKEozSW50cmluc2ljcyogaW50cmluc2ljcywgVmFsdWUqIEFyZywgSW5zdHJ1Y3Rpb24qIENJKSB7Ci0gIFZhbHVlKiBHRVBbMl0gPSB7IGludHJpbnNpY3MtPmNvbnN0YW50WmVybywKLSAgICAgICAgICAgICAgICAgICAgaW50cmluc2ljcy0+T2Zmc2V0VGFza0NsYXNzTWlycm9ySW5DbGFzc0NvbnN0YW50IH07Ci0gIFZhbHVlKiBUQ01BcnJheSA9IEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUoQXJnLCBHRVAsIEdFUCArIDIsICIiLCBDSSk7Ci0gIAotICBWYWx1ZSogR0VQMlsyXSA9IHsgaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCBpbnRyaW5zaWNzLT5jb25zdGFudFplcm8gfTsKLQotICBWYWx1ZSogVENNID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShUQ01BcnJheSwgR0VQMiwgR0VQMiArIDIsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSSk7Ci0gIHJldHVybiBUQ007Ci0KLX0KLQotc3RhdGljIFZhbHVlKiBnZXREZWxlZ2F0ZWUoSjNJbnRyaW5zaWNzKiBpbnRyaW5zaWNzLCBWYWx1ZSogQXJnLCBJbnN0cnVjdGlvbiogQ0kpIHsKLSAgVmFsdWUqIEdFUFsyXSA9IHsgaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLAotICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5jb25zdGFudFplcm8gfTsKLSAgVmFsdWUqIFRDTUFycmF5ID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShBcmcsIEdFUCwgR0VQICsgMiwgIiIsIENJKTsKLSAgCi0gIFZhbHVlKiBHRVAyWzJdID0geyBpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sIGludHJpbnNpY3MtPmNvbnN0YW50WmVybyB9OwotCi0gIFZhbHVlKiBUQ00gPSBHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlKFRDTUFycmF5LCBHRVAyLCBHRVAyICsgMiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENJKTsKLSAgcmV0dXJuIG5ldyBMb2FkSW5zdChUQ00sICIiLCBDSSk7Ci0KLX0KLQotYm9vbCBMb3dlckNvbnN0YW50Q2FsbHM6OnJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24mIEYpIHsKLSAgTExWTUNvbnRleHQqIENvbnRleHQgPSAmRi5nZXRDb250ZXh0KCk7Ci0gIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOwotICBKM0ludHJpbnNpY3MqIGludHJpbnNpY3MgPSBUaGVDb21waWxlci0+Z2V0SW50cmluc2ljcygpOwotICBKYXZhTWV0aG9kKiBtZXRoID0gVGhlQ29tcGlsZXItPmdldEphdmFNZXRob2QoRik7Ci0gIGFzc2VydChtZXRoICYmICJNZXRob2Qgbm90IHJlZ2lzdGVyZWQiKTsKLSAgZm9yIChGdW5jdGlvbjo6aXRlcmF0b3IgQkkgPSBGLmJlZ2luKCksIEJFID0gRi5lbmQoKTsgQkkgIT0gQkU7IEJJKyspIHsgCi0gICAgQmFzaWNCbG9jayAqQ3VyID0gQkk7IAotICAgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgSUkgPSBDdXItPmJlZ2luKCksIElFID0gQ3VyLT5lbmQoKTsgSUkgIT0gSUU7KSB7Ci0gICAgICBJbnN0cnVjdGlvbiAqSSA9IElJOwotICAgICAgSUkrKzsKLQotICAgICAgaWYgKElDbXBJbnN0KiBDbXAgPSBkeW5fY2FzdDxJQ21wSW5zdD4oSSkpIHsKLSAgICAgICAgaWYgKENtcC0+Z2V0T3BlcmFuZCgxKSA9PSBpbnRyaW5zaWNzLT5KYXZhT2JqZWN0TnVsbENvbnN0YW50KSB7Ci0gICAgICAgICAgVmFsdWUqIEFyZyA9IENtcC0+Z2V0T3BlcmFuZCgwKTsKLSAgICAgICAgICBpZiAoaXNWaXJ0dWFsKG1ldGgtPmFjY2VzcykgJiYgQXJnID09IEYuYXJnX2JlZ2luKCkpIHsKLSAgICAgICAgICAgIENoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgQ21wLT5yZXBsYWNlQWxsVXNlc1dpdGgoQ29uc3RhbnRJbnQ6OmdldEZhbHNlKCpDb250ZXh0KSk7Ci0gICAgICAgICAgICBDbXAtPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgCi0gICAgICAgICAgSW5zdHJ1Y3Rpb24qIEluc0FyZyA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihBcmcpOyAKLSAgICAgICAgICBpZiAoSW5zQXJnICE9IE5VTEwgJiYKLSAgICAgICAgICAgICAgKEluc0FyZy0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkNhbGwgfHwKLSAgICAgICAgICAgICAgIEluc0FyZy0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246Okludm9rZSkpIHsgCi0gICAgICAgICAgICBDYWxsU2l0ZSBDYShBcmcpOwotICAgICAgICAgICAgaWYgKENhLmdldENhbGxlZFZhbHVlKCkgPT0gaW50cmluc2ljcy0+QWxsb2NhdGVGdW5jdGlvbikgewotICAgICAgICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgQ21wLT5yZXBsYWNlQWxsVXNlc1dpdGgoQ29uc3RhbnRJbnQ6OmdldEZhbHNlKCpDb250ZXh0KSk7Ci0gICAgICAgICAgICAgIENtcC0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAKLSAgICAgIC8vIFJlbW92ZSB1c2VsZXNzIEFsbG9jYSdzLCB1c3VhbGx5IHVzZWQgZm9yIHN0YWNrcyBvciB0ZW1wb3JhcnkgdmFsdWVzLgotICAgICAgLy8gVGhlIG9wdGltaXplcnMgbWF5IGhhdmUgcmVuZGVyZWQgdGhlbSB1c2VsZXNzLgotICAgICAgaWYgKEFsbG9jYUluc3QqIEFJID0gZHluX2Nhc3Q8QWxsb2NhSW5zdD4oSSkpIHsKLSAgICAgICAgYm9vbCBUb0RlbGV0ZSA9IHRydWU7Ci0gICAgICAgIGZvciAoVmFsdWU6OnVzZV9pdGVyYXRvciBVSSA9IEFJLT51c2VfYmVnaW4oKSwgVUUgPSBBSS0+dXNlX2VuZCgpOwotICAgICAgICAgICAgIFVJICE9IFVFOyArK1VJKSB7Ci0gICAgICAgICAgaWYgKGR5bl9jYXN0PFN0b3JlSW5zdD4oKlVJKSkgY29udGludWU7Ci0gICAgICAgICAgaWYgKEJpdENhc3RJbnN0KiBCSSA9IGR5bl9jYXN0PEJpdENhc3RJbnN0PigqVUkpKSB7Ci0gICAgICAgICAgICBpZiAoQkktPmhhc09uZVVzZSgpKSB7Ci0gICAgICAgICAgICAgIEluc3RydWN0aW9uKiB1c2UgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oKihCSS0+dXNlX2JlZ2luKCkpKTsKLSAgICAgICAgICAgICAgaWYgKHVzZSAhPSBOVUxMICYmCi0gICAgICAgICAgICAgICAgICAodXNlLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6Q2FsbCB8fAotICAgICAgICAgICAgICAgICAgIHVzZS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246Okludm9rZSkpIHsgCi0gICAgICAgICAgICAgICAgQ2FsbFNpdGUgQ2FsbCh1c2UpOwotICAgICAgICAgICAgICAgIGlmIChDYWxsLmdldENhbGxlZEZ1bmN0aW9uKCkgPT0gaW50cmluc2ljcy0+bGx2bV9nY19nY3Jvb3QpIHsKLSAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBUb0RlbGV0ZSA9IGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoVG9EZWxldGUpIHsKLSAgICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgVUkgPSBBSS0+dXNlX2JlZ2luKCksIFVFID0gQUktPnVzZV9lbmQoKTsKLSAgICAgICAgICAgICAgIFVJICE9IFVFOykgewotICAgICAgICAgICAgVmFsdWUqIFRlbXAgPSAqVUk7Ci0gICAgICAgICAgICArK1VJOwotICAgICAgICAgICAgaWYgKFN0b3JlSW5zdCogU0kgPSBkeW5fY2FzdDxTdG9yZUluc3Q+KFRlbXApKSB7Ci0gICAgICAgICAgICAgIGlmIChkeW5fY2FzdDxJbnN0cnVjdGlvbj4oSUkpID09IFNJKSArK0lJOwotICAgICAgICAgICAgICBTSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEJpdENhc3RJbnN0KiBCSSA9IGR5bl9jYXN0PEJpdENhc3RJbnN0PihUZW1wKSkgewotICAgICAgICAgICAgICBDYWxsU2l0ZSBDYWxsKCooQkktPnVzZV9iZWdpbigpKSk7Ci0gICAgICAgICAgICAgIEluc3RydWN0aW9uKiBDSSA9IENhbGwuZ2V0SW5zdHJ1Y3Rpb24oKTsKLSAgICAgICAgICAgICAgaWYgKGR5bl9jYXN0PEluc3RydWN0aW9uPihJSSkgPT0gQ0kpICsrSUk7Ci0gICAgICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgICAgICAgaWYgKGR5bl9jYXN0PEluc3RydWN0aW9uPihJSSkgPT0gQkkpICsrSUk7Ci0gICAgICAgICAgICAgIEJJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgQUktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgLy8gTWFrZSBzdXJlIGFsbCBMb2FkcyBvbiBvYmplY3RzIGFyZSB2b2xhdGlsZSB0byBjb29wZXJhdGUgd2l0aCB0aGUgR0MuCi0gICAgICBpZiAoTG9hZEluc3QqIExJID0gZHluX2Nhc3Q8TG9hZEluc3Q+KEkpKSB7Ci0gICAgICAgIGlmIChMSS0+Z2V0VHlwZSgpID09IGludHJpbnNpY3MtPkphdmFPYmplY3RUeXBlICYmCi0gICAgICAgICAgICBkeW5fY2FzdDxBbGxvY2FJbnN0PihMSS0+Z2V0UG9pbnRlck9wZXJhbmQoKSkgIT0gTlVMTCkgewotICAgICAgICAgIGlmIChUaGVDb21waWxlci0+dXNlQ29vcGVyYXRpdmVHQygpKSB7Ci0gICAgICAgICAgICBhc3NlcnQoTEktPmlzVm9sYXRpbGUoKSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFzc2VydCghTEktPmlzVm9sYXRpbGUoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICgoSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkNhbGwgfHwKLSAgICAgICAgICAgSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246Okludm9rZSkpIHsgCi0gICAgICAgIEluc3RydWN0aW9uKiBDSSA9IEk7Ci0gICAgICAgIENhbGxTaXRlIENhbGwoSSk7Ci0gICAgICAgIFZhbHVlKiBWID0gQ2FsbC5nZXRDYWxsZWRWYWx1ZSgpOwotICAgICAgICBpZiAoViA9PSBpbnRyaW5zaWNzLT5BcnJheUxlbmd0aEZ1bmN0aW9uKSB7Ci0gICAgICAgICAgQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgVmFsdWUqIHZhbCA9IENhbGwuZ2V0QXJndW1lbnQoMCk7IC8vIGdldCB0aGUgYXJyYXkKLSAgICAgICAgICBWYWx1ZSogYXJyYXkgPSBuZXcgQml0Q2FzdEluc3QodmFsLCBpbnRyaW5zaWNzLT5KYXZhQXJyYXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgQ0kpOwotICAgICAgICAgIFZhbHVlKiBhcmdzWzJdID0geyBpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5KYXZhQXJyYXlTaXplT2Zmc2V0Q29uc3RhbnQgfTsKLSAgICAgICAgICBWYWx1ZSogcHRyID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShhcnJheSwgYXJncywgYXJncyArIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIENJKTsKLSAgICAgICAgICBWYWx1ZSogbG9hZCA9IG5ldyBMb2FkSW5zdChwdHIsICIiLCBDSSk7Ci0gICAgICAgICAgbG9hZCA9IG5ldyBQdHJUb0ludEluc3QobG9hZCwgVHlwZTo6Z2V0SW50MzJUeSgqQ29udGV4dCksICIiLCBDSSk7Ci0gICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChsb2FkKTsKLSAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoViA9PSBpbnRyaW5zaWNzLT5HZXRWVEZ1bmN0aW9uKSB7Ci0gICAgICAgICAgQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgVmFsdWUqIHZhbCA9IENhbGwuZ2V0QXJndW1lbnQoMCk7IC8vIGdldCB0aGUgb2JqZWN0Ci0gICAgICAgICAgVmFsdWUqIGluZGV4ZXNbMl0gPSB7IGludHJpbnNpY3MtPmNvbnN0YW50WmVybywgaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvIH07Ci0gICAgICAgICAgVmFsdWUqIFZUUHRyID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZSh2YWwsIGluZGV4ZXMsIGluZGV4ZXMgKyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIENJKTsKLSAgICAgICAgICBWYWx1ZSogVlQgPSBuZXcgTG9hZEluc3QoVlRQdHIsICIiLCBDSSk7Ci0gICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChWVCk7Ci0gICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICB9IGVsc2UgaWYgKFYgPT0gaW50cmluc2ljcy0+R2V0SU1URnVuY3Rpb24pIHsKLSAgICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICBWYWx1ZSogdmFsID0gQ2FsbC5nZXRBcmd1bWVudCgwKTsgLy8gZ2V0IHRoZSBWVAotICAgICAgICAgIFZhbHVlKiBpbmRleGVzWzJdID0geyBpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPk9mZnNldElNVEluVlRDb25zdGFudCB9OwotICAgICAgICAgIFZhbHVlKiBJTVRQdHIgPSBHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlKHZhbCwgaW5kZXhlcywgaW5kZXhlcyArIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIENJKTsKLSAgICAgICAgICBWYWx1ZSogSU1UID0gbmV3IExvYWRJbnN0KElNVFB0ciwgIiIsIENJKTsKLSAgICAgICAgICBJTVQgPSBuZXcgQml0Q2FzdEluc3QoSU1ULCBDSS0+Z2V0VHlwZSgpLCAiIiwgQ0kpOwotICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgoSU1UKTsKLSAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoViA9PSBpbnRyaW5zaWNzLT5HZXRDbGFzc0Z1bmN0aW9uKSB7Ci0gICAgICAgICAgQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgVmFsdWUqIHZhbCA9IENhbGwuZ2V0QXJndW1lbnQoMCk7IC8vIGdldCB0aGUgb2JqZWN0Ci0gICAgICAgICAgVmFsdWUqIGFyZ3MyWzJdID0geyBpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5KYXZhT2JqZWN0VlRPZmZzZXRDb25zdGFudCB9OwotICAgICAgICAgIFZhbHVlKiBWVFB0ciA9IEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUodmFsLCBhcmdzMiwgYXJnczIgKyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIENJKTsKLSAgICAgICAgICBWYWx1ZSogVlQgPSBuZXcgTG9hZEluc3QoVlRQdHIsICIiLCBDSSk7Ci0gICAgICAgICAgVmFsdWUqIGFyZ3MzWzJdID0geyBpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5PZmZzZXRDbGFzc0luVlRDb25zdGFudCB9OwotCi0gICAgICAgICAgVmFsdWUqIGNsUHRyID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShWVCwgYXJnczMsIGFyZ3MzICsgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCBDSSk7Ci0gICAgICAgICAgVmFsdWUqIGNsID0gbmV3IExvYWRJbnN0KGNsUHRyLCAiIiwgQ0kpOwotICAgICAgICAgIGNsID0gbmV3IEJpdENhc3RJbnN0KGNsLCBpbnRyaW5zaWNzLT5KYXZhQ29tbW9uQ2xhc3NUeXBlLCAiIiwgQ0kpOwotCi0gICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChjbCk7Ci0gICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICB9IGVsc2UgaWYgKFYgPT0gaW50cmluc2ljcy0+R2V0VlRGcm9tQ2xhc3NGdW5jdGlvbikgewotICAgICAgICAgIENoYW5nZWQgPSB0cnVlOwotICAgICAgICAgIAotICAgICAgICAgIFZhbHVlKiB2YWwgPSBDYWxsLmdldEFyZ3VtZW50KDApOwotICAgICAgICAgIFZhbHVlKiBpbmRleGVzWzNdID0geyBpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5PZmZzZXRWVEluQ2xhc3NDb25zdGFudCB9OwotICAgICAgICAgIFZhbHVlKiBWVFB0ciA9IEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUodmFsLCBpbmRleGVzLCBpbmRleGVzICsgMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCBDSSk7Ci0gICAgICAgICAgVmFsdWUqIFZUID0gbmV3IExvYWRJbnN0KFZUUHRyLCAiIiwgQ0kpOwotICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgoVlQpOwotICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgfSBlbHNlIGlmIChWID09IGludHJpbnNpY3MtPkdldFZURnJvbUNvbW1vbkNsYXNzRnVuY3Rpb24pIHsKLSAgICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAKLSAgICAgICAgICBWYWx1ZSogdmFsID0gQ2FsbC5nZXRBcmd1bWVudCgwKTsKLSAgICAgICAgICBWYWx1ZSogaW5kZXhlc1syXSA9IHsgaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmluc2ljcy0+T2Zmc2V0VlRJbkNsYXNzQ29uc3RhbnQgfTsKLSAgICAgICAgICBWYWx1ZSogVlRQdHIgPSBHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlKHZhbCwgaW5kZXhlcywgaW5kZXhlcyArIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgQ0kpOwotICAgICAgICAgIFZhbHVlKiBWVCA9IG5ldyBMb2FkSW5zdChWVFB0ciwgIiIsIENJKTsKLSAgICAgICAgICBDSS0+cmVwbGFjZUFsbFVzZXNXaXRoKFZUKTsKLSAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoViA9PSBpbnRyaW5zaWNzLT5HZXRWVEZyb21DbGFzc0FycmF5RnVuY3Rpb24pIHsKLSAgICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAKLSAgICAgICAgICBWYWx1ZSogdmFsID0gQ2FsbC5nZXRBcmd1bWVudCgwKTsKLSAgICAgICAgICBWYWx1ZSogaW5kZXhlc1szXSA9IHsgaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPk9mZnNldFZUSW5DbGFzc0NvbnN0YW50IH07Ci0gICAgICAgICAgVmFsdWUqIFZUUHRyID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZSh2YWwsIGluZGV4ZXMsIGluZGV4ZXMgKyAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIENJKTsKLSAgICAgICAgICBWYWx1ZSogVlQgPSBuZXcgTG9hZEluc3QoVlRQdHIsICIiLCBDSSk7Ci0gICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChWVCk7Ci0gICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICB9IGVsc2UgaWYgKFYgPT0gaW50cmluc2ljcy0+R2V0QmFzZUNsYXNzVlRGcm9tVlRGdW5jdGlvbikgewotICAgICAgICAgIENoYW5nZWQgPSB0cnVlOwotICAgICAgICAgIAotICAgICAgICAgIFZhbHVlKiB2YWwgPSBDYWxsLmdldEFyZ3VtZW50KDApOwotICAgICAgICAgIFZhbHVlKiBpbmRleGVzWzJdID0geyBpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPk9mZnNldEJhc2VDbGFzc1ZUSW5WVENvbnN0YW50IH07Ci0gICAgICAgICAgVmFsdWUqIFZUUHRyID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZSh2YWwsIGluZGV4ZXMsIGluZGV4ZXMgKyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIENJKTsKLSAgICAgICAgICBWYWx1ZSogVlQgPSBuZXcgTG9hZEluc3QoVlRQdHIsICIiLCBDSSk7Ci0gICAgICAgICAgVlQgPSBuZXcgQml0Q2FzdEluc3QoVlQsIGludHJpbnNpY3MtPlZUVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICBDSS0+cmVwbGFjZUFsbFVzZXNXaXRoKFZUKTsKLSAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoViA9PSBpbnRyaW5zaWNzLT5HZXRPYmplY3RTaXplRnJvbUNsYXNzRnVuY3Rpb24pIHsKLSAgICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAKLSAgICAgICAgICBWYWx1ZSogdmFsID0gQ2FsbC5nZXRBcmd1bWVudCgwKTsgCi0gICAgICAgICAgVmFsdWUqIGluZGV4ZXNbMl0gPSB7IGludHJpbnNpY3MtPmNvbnN0YW50WmVybywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJpbnNpY3MtPk9mZnNldE9iamVjdFNpemVJbkNsYXNzQ29uc3RhbnQgfTsKLSAgICAgICAgICBWYWx1ZSogU2l6ZVB0ciA9IEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUodmFsLCBpbmRleGVzLCBpbmRleGVzICsgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIENJKTsKLSAgICAgICAgICBWYWx1ZSogU2l6ZSA9IG5ldyBMb2FkSW5zdChTaXplUHRyLCAiIiwgQ0kpOwotICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgoU2l6ZSk7Ci0gICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICB9IGVsc2UgaWYgKFYgPT0gaW50cmluc2ljcy0+R2V0RGVwdGhGdW5jdGlvbikgewotICAgICAgICAgIENoYW5nZWQgPSB0cnVlOwotICAgICAgICAgIFZhbHVlKiB2YWwgPSBDYWxsLmdldEFyZ3VtZW50KDApOyAKLSAgICAgICAgICBWYWx1ZSogaW5kZXhlc1syXSA9IHsgaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5PZmZzZXREZXB0aEluVlRDb25zdGFudCB9OwotICAgICAgICAgIFZhbHVlKiBEZXB0aFB0ciA9IEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUodmFsLCBpbmRleGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhlcyArIDIsICIiLCBDSSk7Ci0gICAgICAgICAgVmFsdWUqIERlcHRoID0gbmV3IExvYWRJbnN0KERlcHRoUHRyLCAiIiwgQ0kpOwotICAgICAgICAgIERlcHRoID0gbmV3IFB0clRvSW50SW5zdChEZXB0aCwgVHlwZTo6Z2V0SW50MzJUeSgqQ29udGV4dCksICIiLCBDSSk7Ci0gICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChEZXB0aCk7Ci0gICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICB9IGVsc2UgaWYgKFYgPT0gaW50cmluc2ljcy0+R2V0RGlzcGxheUZ1bmN0aW9uKSB7Ci0gICAgICAgICAgQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgVmFsdWUqIHZhbCA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgVmFsdWUqIGluZGV4ZXNbMl0gPSB7IGludHJpbnNpY3MtPmNvbnN0YW50WmVybywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmluc2ljcy0+T2Zmc2V0RGlzcGxheUluVlRDb25zdGFudCB9OwotICAgICAgICAgIFZhbHVlKiBEaXNwbGF5UHRyID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZSh2YWwsIGluZGV4ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ZXMgKyAyLCAiIiwgQ0kpOwotICAgICAgICAgIGNvbnN0IGxsdm06OlR5cGUqIFR5ID0gUG9pbnRlclR5cGU6OmdldFVucXVhbChpbnRyaW5zaWNzLT5WVFR5cGUpOwotICAgICAgICAgIERpc3BsYXlQdHIgPSBuZXcgQml0Q2FzdEluc3QoRGlzcGxheVB0ciwgVHksICIiLCBDSSk7Ci0gICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChEaXNwbGF5UHRyKTsKLSAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoViA9PSBpbnRyaW5zaWNzLT5HZXRWVEluRGlzcGxheUZ1bmN0aW9uKSB7Ci0gICAgICAgICAgQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgVmFsdWUqIHZhbCA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgVmFsdWUqIGRlcHRoID0gQ2FsbC5nZXRBcmd1bWVudCgxKTsKLSAgICAgICAgICBWYWx1ZSogQ2xhc3NQdHIgPSBHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlKHZhbCwgZGVwdGgsICIiLCBDSSk7Ci0gICAgICAgICAgVmFsdWUqIENsYXNzID0gbmV3IExvYWRJbnN0KENsYXNzUHRyLCAiIiwgQ0kpOwotICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgoQ2xhc3MpOwotICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgfSBlbHNlIGlmIChWID09IGludHJpbnNpY3MtPkdldENsYXNzRGVsZWdhdGVlRnVuY3Rpb24pIHsKLSAgICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICBCYXNpY0Jsb2NrKiBOQkIgPSBJSS0+Z2V0UGFyZW50KCktPnNwbGl0QmFzaWNCbG9jayhJSSk7Ci0gICAgICAgICAgSS0+Z2V0UGFyZW50KCktPmdldFRlcm1pbmF0b3IoKS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgVmFsdWUqIERlbCA9IGdldERlbGVnYXRlZShpbnRyaW5zaWNzLCBDYWxsLmdldEFyZ3VtZW50KDApLCBDSSk7Ci0gICAgICAgICAgVmFsdWUqIGNtcCA9IG5ldyBJQ21wSW5zdChDSSwgSUNtcEluc3Q6OklDTVBfRVEsIERlbCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWNzLT5KYXZhT2JqZWN0TnVsbENvbnN0YW50LCAiIik7Ci0gICAgICAgICAgCi0gICAgICAgICAgQmFzaWNCbG9jayogTm9EZWxlZ2F0ZWUgPSBCYXNpY0Jsb2NrOjpDcmVhdGUoKkNvbnRleHQsICJObyBkZWxlZ2F0ZWUiLCAmRik7Ci0gICAgICAgICAgQmFzaWNCbG9jayogRGVsZWdhdGVlT0sgPSBCYXNpY0Jsb2NrOjpDcmVhdGUoKkNvbnRleHQsICJEZWxlZ2F0ZWUgT0siLCAmRik7Ci0gICAgICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKE5vRGVsZWdhdGVlLCBEZWxlZ2F0ZWVPSywgY21wLCBDSSk7Ci0gICAgICAgICAgUEhJTm9kZSogcGhpID0gUEhJTm9kZTo6Q3JlYXRlKGludHJpbnNpY3MtPkphdmFPYmplY3RUeXBlLCAiIiwgRGVsZWdhdGVlT0spOwotICAgICAgICAgIHBoaS0+YWRkSW5jb21pbmcoRGVsLCBDSS0+Z2V0UGFyZW50KCkpOwotICAgICAgICAgIAotICAgICAgICAgIEluc3RydWN0aW9uKiBSZXMgPSBDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPlJ1bnRpbWVEZWxlZ2F0ZWVGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsLmdldEFyZ3VtZW50KDApLCAiIiwgTm9EZWxlZ2F0ZWUpOwotICAgICAgICAgIFJlcy0+c2V0RGVidWdMb2MoQ0ktPmdldERlYnVnTG9jKCkpOwotICAgICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShEZWxlZ2F0ZWVPSywgTm9EZWxlZ2F0ZWUpOwotICAgICAgICAgIHBoaS0+YWRkSW5jb21pbmcoUmVzLCBOb0RlbGVnYXRlZSk7Ci0KLSAgICAgICAgICBDSS0+cmVwbGFjZUFsbFVzZXNXaXRoKHBoaSk7Ci0gICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShOQkIsIERlbGVnYXRlZU9LKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgIAotICAgICAgICB9IGVsc2UgaWYgKFYgPT0gaW50cmluc2ljcy0+SW5pdGlhbGlzYXRpb25DaGVja0Z1bmN0aW9uKSB7Ci0gICAgICAgICAgQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgCi0gICAgICAgICAgQmFzaWNCbG9jayogTkJCID0gMDsKLSAgICAgICAgICBpZiAoQ0ktPmdldFBhcmVudCgpLT5nZXRUZXJtaW5hdG9yKCkgIT0gQ0kpIHsKLSAgICAgICAgICAgIE5CQiA9IElJLT5nZXRQYXJlbnQoKS0+c3BsaXRCYXNpY0Jsb2NrKElJKTsKLSAgICAgICAgICAgIENJLT5nZXRQYXJlbnQoKS0+Z2V0VGVybWluYXRvcigpLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgSW52b2tlSW5zdCogSW52b2tlID0gZHluX2Nhc3Q8SW52b2tlSW5zdD4oQ0kpOwotICAgICAgICAgICAgYXNzZXJ0KEludm9rZSAmJiAiTGFzdCBpbnN0cnVjdGlvbiBpcyBub3QgYW4gaW52b2tlIik7Ci0gICAgICAgICAgICBOQkIgPSBJbnZva2UtPmdldE5vcm1hbERlc3QoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAKLSAgICAgICAgICBWYWx1ZSogQ2wgPSBDYWxsLmdldEFyZ3VtZW50KDApOyAKLSAgICAgICAgICBWYWx1ZSogVENNID0gZ2V0VENNKGludHJpbnNpY3MsIENhbGwuZ2V0QXJndW1lbnQoMCksIENJKTsKLSAgICAgICAgICBWYWx1ZSogR0VQWzJdID0gCi0gICAgICAgICAgICB7IGludHJpbnNpY3MtPmNvbnN0YW50WmVybywKLSAgICAgICAgICAgICAgaW50cmluc2ljcy0+T2Zmc2V0SW5pdGlhbGl6ZWRJblRhc2tDbGFzc01pcnJvckNvbnN0YW50IH07Ci0gICAgICAgICAgVmFsdWUqIFN0YXR1c1B0ciA9IEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUoVENNLCBHRVAsIEdFUCArIDIsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENJKTsKLSAgICAgICAgICAKLSAgICAgICAgICBWYWx1ZSogdGVzdCA9IG5ldyBMb2FkSW5zdChTdGF0dXNQdHIsICIiLCBDSSk7Ci0gICAgICAgICAgCi0gICAgICAgICAgQmFzaWNCbG9jayogdHJ1ZUNsID0gQmFzaWNCbG9jazo6Q3JlYXRlKCpDb250ZXh0LCAiSW5pdGlhbGl6ZWQiLCAmRik7Ci0gICAgICAgICAgQmFzaWNCbG9jayogZmFsc2VDbCA9IEJhc2ljQmxvY2s6OkNyZWF0ZSgqQ29udGV4dCwgIlVuaW5pdGlhbGl6ZWQiLCAmRik7Ci0gICAgICAgICAgUEhJTm9kZSogbm9kZSA9IGxsdm06OlBISU5vZGU6OkNyZWF0ZShpbnRyaW5zaWNzLT5KYXZhQ2xhc3NUeXBlLCAiIiwgdHJ1ZUNsKTsKLSAgICAgICAgICBub2RlLT5hZGRJbmNvbWluZyhDbCwgQ0ktPmdldFBhcmVudCgpKTsKLSAgICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUodHJ1ZUNsLCBmYWxzZUNsLCB0ZXN0LCBDSSk7Ci0gIAotICAgICAgICAgIAotICAgICAgICAgIEluc3RydWN0aW9uKiByZXMgPSAwOwotICAgICAgICAgIGlmIChJbnZva2VJbnN0KiBJbnZva2UgPSBkeW5fY2FzdDxJbnZva2VJbnN0PihDSSkpIHsKLSAgICAgICAgICAgIFZhbHVlKiBBcmdzWzFdID0geyBDbCB9OwotICAgICAgICAgICAgQmFzaWNCbG9jayogVUkgPSBJbnZva2UtPmdldFVud2luZERlc3QoKTsKLQotICAgICAgICAgICAgcmVzID0gSW52b2tlSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPkluaXRpYWxpc2VDbGFzc0Z1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWVDbCwgVUksIEFyZ3MsIEFyZ3MgKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCBmYWxzZUNsKTsKLQotICAgICAgICAgICAgLy8gRm9yIHNvbWUgcmVhc29uLCBhbiBMTFZNIHBhc3MgbWF5IGFkZCBQSEkgbm9kZXMgdG8gdGhlCi0gICAgICAgICAgICAvLyBleGNlcHRpb24gZGVzdGluYXRpb24uCi0gICAgICAgICAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciBUZW1wID0gVUktPmdldEluc3RMaXN0KCkuYmVnaW4oKTsKLSAgICAgICAgICAgIHdoaWxlIChQSElOb2RlKiBQSEkgPSBkeW5fY2FzdDxQSElOb2RlPihUZW1wKSkgewotICAgICAgICAgICAgICBWYWx1ZSogVmFsID0gUEhJLT5nZXRJbmNvbWluZ1ZhbHVlRm9yQmxvY2soQ0ktPmdldFBhcmVudCgpKTsKLSAgICAgICAgICAgICAgUEhJLT5yZW1vdmVJbmNvbWluZ1ZhbHVlKENJLT5nZXRQYXJlbnQoKSwgZmFsc2UpOwotICAgICAgICAgICAgICBQSEktPmFkZEluY29taW5nKFZhbCwgZmFsc2VDbCk7Ci0gICAgICAgICAgICAgIFRlbXArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQW5kIGhlcmUgd2Ugc2V0IHRoZSBwaGkgbm9kZXMgb2YgdGhlIG5vcm1hbCBkZXN0IG9mIHRoZSBJbnZva2UKLSAgICAgICAgICAgIC8vIGluc3RydWN0aW9uLiBUaGUgcGhpIG5vZGVzIGhhdmUgbm93IHRoZSB0cnVlQ2wgYXMgYmFzaWMgYmxvY2suCi0gICAgICAgICAgICBUZW1wID0gTkJCLT5nZXRJbnN0TGlzdCgpLmJlZ2luKCk7Ci0gICAgICAgICAgICB3aGlsZSAoUEhJTm9kZSogUEhJID0gZHluX2Nhc3Q8UEhJTm9kZT4oVGVtcCkpIHsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbCA9IFBISS0+Z2V0SW5jb21pbmdWYWx1ZUZvckJsb2NrKENJLT5nZXRQYXJlbnQoKSk7Ci0gICAgICAgICAgICAgIFBISS0+cmVtb3ZlSW5jb21pbmdWYWx1ZShDSS0+Z2V0UGFyZW50KCksIGZhbHNlKTsKLSAgICAgICAgICAgICAgUEhJLT5hZGRJbmNvbWluZyhWYWwsIHRydWVDbCk7Ci0gICAgICAgICAgICAgIFRlbXArKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXMgPSBDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPkluaXRpYWxpc2VDbGFzc0Z1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbCwgIiIsIGZhbHNlQ2wpOwotICAgICAgICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKHRydWVDbCwgZmFsc2VDbCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJlcy0+c2V0RGVidWdMb2MoQ0ktPmdldERlYnVnTG9jKCkpOwotICAgICAgICAgIAotICAgICAgICAgIG5vZGUtPmFkZEluY29taW5nKHJlcywgZmFsc2VDbCk7Ci0KLQotICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgobm9kZSk7Ci0gICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShOQkIsIHRydWVDbCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSBpZiAoViA9PSBpbnRyaW5zaWNzLT5HZXRDb25zdGFudFBvb2xBdEZ1bmN0aW9uKSB7Ci0gICAgICAgICAgRnVuY3Rpb24qIHJlc29sdmVyID0gZHluX2Nhc3Q8RnVuY3Rpb24+KENhbGwuZ2V0QXJndW1lbnQoMCkpOwotICAgICAgICAgIGFzc2VydChyZXNvbHZlciAmJiAiV3JvbmcgdXNlIG9mIEdldENvbnN0YW50UG9vbEF0Iik7Ci0gICAgICAgICAgY29uc3QgVHlwZSogcmV0dXJuVHlwZSA9IHJlc29sdmVyLT5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgICAgVmFsdWUqIENUUCA9IENhbGwuZ2V0QXJndW1lbnQoMSk7Ci0gICAgICAgICAgVmFsdWUqIEluZGV4ID0gQ2FsbC5nZXRBcmd1bWVudCgzKTsKLSAgICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICBCYXNpY0Jsb2NrKiBOQkIgPSAwOwotICAgICAgICAgIGlmIChDSS0+Z2V0UGFyZW50KCktPmdldFRlcm1pbmF0b3IoKSAhPSBDSSkgewotICAgICAgICAgICAgTkJCID0gSUktPmdldFBhcmVudCgpLT5zcGxpdEJhc2ljQmxvY2soSUkpOwotICAgICAgICAgICAgQ0ktPmdldFBhcmVudCgpLT5nZXRUZXJtaW5hdG9yKCktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBJbnZva2VJbnN0KiBJbnZva2UgPSBkeW5fY2FzdDxJbnZva2VJbnN0PihDSSk7Ci0gICAgICAgICAgICBhc3NlcnQoSW52b2tlICYmICJMYXN0IGluc3RydWN0aW9uIGlzIG5vdCBhbiBpbnZva2UiKTsKLSAgICAgICAgICAgIE5CQiA9IEludm9rZS0+Z2V0Tm9ybWFsRGVzdCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBWYWx1ZSogaW5kZXhlcyA9IEluZGV4OwotICAgICAgICAgIFZhbHVlKiBhcmcxID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShDVFAsIGluZGV4ZXMsICIiLCBDSSk7Ci0gICAgICAgICAgYXJnMSA9IG5ldyBMb2FkSW5zdChhcmcxLCAiIiwgZmFsc2UsIENJKTsKLSAgICAgICAgICBWYWx1ZSogdGVzdCA9IG5ldyBJQ21wSW5zdChDSSwgSUNtcEluc3Q6OklDTVBfRVEsIGFyZzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmluc2ljcy0+Y29uc3RhbnRQdHJOdWxsLCAiIik7Ci0gCi0gICAgICAgICAgQmFzaWNCbG9jayogdHJ1ZUNsID0gQmFzaWNCbG9jazo6Q3JlYXRlKCpDb250ZXh0LCAiQ3RwIE9LIiwgJkYpOwotICAgICAgICAgIEJhc2ljQmxvY2sqIGZhbHNlQ2wgPSBCYXNpY0Jsb2NrOjpDcmVhdGUoKkNvbnRleHQsICJDdHAgTm90IE9LIiwgJkYpOwotICAgICAgICAgIFBISU5vZGUqIG5vZGUgPSBsbHZtOjpQSElOb2RlOjpDcmVhdGUocmV0dXJuVHlwZSwgIiIsIHRydWVDbCk7Ci0gICAgICAgICAgbm9kZS0+YWRkSW5jb21pbmcoYXJnMSwgQ0ktPmdldFBhcmVudCgpKTsKLSAgICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoZmFsc2VDbCwgdHJ1ZUNsLCB0ZXN0LCBDSSk7Ci0gIAotICAgICAgICAgIHN0ZDo6dmVjdG9yPFZhbHVlKj4gQXJnczsKLSAgICAgICAgICB1bnNpZ25lZCBBcmdTaXplID0gQ2FsbC5hcmdfc2l6ZSgpLCBpID0gMTsKLSAgICAgICAgICB3aGlsZSAoKytpIDwgQXJnU2l6ZSkgewotICAgICAgICAgICAgQXJncy5wdXNoX2JhY2soQ2FsbC5nZXRBcmd1bWVudChpKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIEluc3RydWN0aW9uKiByZXMgPSAwOwotICAgICAgICAgIGlmIChJbnZva2VJbnN0KiBJbnZva2UgPSBkeW5fY2FzdDxJbnZva2VJbnN0PihDSSkpIHsKLSAgICAgICAgICAgIEJhc2ljQmxvY2sqIFVJID0gSW52b2tlLT5nZXRVbndpbmREZXN0KCk7Ci0gICAgICAgICAgICByZXMgPSBJbnZva2VJbnN0OjpDcmVhdGUocmVzb2x2ZXIsIHRydWVDbCwgVUksIEFyZ3MuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdzLmVuZCgpLCAiIiwgZmFsc2VDbCk7Ci0KLSAgICAgICAgICAgIC8vIEZvciBzb21lIHJlYXNvbiwgYW4gTExWTSBwYXNzIG1heSBhZGQgUEhJIG5vZGVzIHRvIHRoZQotICAgICAgICAgICAgLy8gZXhjZXB0aW9uIGRlc3RpbmF0aW9uLgotICAgICAgICAgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgVGVtcCA9IFVJLT5nZXRJbnN0TGlzdCgpLmJlZ2luKCk7Ci0gICAgICAgICAgICB3aGlsZSAoUEhJTm9kZSogUEhJID0gZHluX2Nhc3Q8UEhJTm9kZT4oVGVtcCkpIHsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbCA9IFBISS0+Z2V0SW5jb21pbmdWYWx1ZUZvckJsb2NrKENJLT5nZXRQYXJlbnQoKSk7Ci0gICAgICAgICAgICAgIFBISS0+cmVtb3ZlSW5jb21pbmdWYWx1ZShDSS0+Z2V0UGFyZW50KCksIGZhbHNlKTsKLSAgICAgICAgICAgICAgUEhJLT5hZGRJbmNvbWluZyhWYWwsIGZhbHNlQ2wpOwotICAgICAgICAgICAgICBUZW1wKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEFuZCBoZXJlIHdlIHNldCB0aGUgcGhpIG5vZGVzIG9mIHRoZSBub3JtYWwgZGVzdCBvZiB0aGUgSW52b2tlCi0gICAgICAgICAgICAvLyBpbnN0cnVjdGlvbi4gVGhlIHBoaSBub2RlcyBoYXZlIG5vdyB0aGUgdHJ1ZUNsIGFzIGJhc2ljIGJsb2NrLgotICAgICAgICAgICAgVGVtcCA9IE5CQi0+Z2V0SW5zdExpc3QoKS5iZWdpbigpOwotICAgICAgICAgICAgd2hpbGUgKFBISU5vZGUqIFBISSA9IGR5bl9jYXN0PFBISU5vZGU+KFRlbXApKSB7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwgPSBQSEktPmdldEluY29taW5nVmFsdWVGb3JCbG9jayhDSS0+Z2V0UGFyZW50KCkpOwotICAgICAgICAgICAgICBQSEktPnJlbW92ZUluY29taW5nVmFsdWUoQ0ktPmdldFBhcmVudCgpLCBmYWxzZSk7Ci0gICAgICAgICAgICAgIFBISS0+YWRkSW5jb21pbmcoVmFsLCB0cnVlQ2wpOwotICAgICAgICAgICAgICBUZW1wKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzID0gQ2FsbEluc3Q6OkNyZWF0ZShyZXNvbHZlciwgQXJncy5iZWdpbigpLCBBcmdzLmVuZCgpLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2VDbCk7Ci0gICAgICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUodHJ1ZUNsLCBmYWxzZUNsKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgcmVzLT5zZXREZWJ1Z0xvYyhDSS0+Z2V0RGVidWdMb2MoKSk7Ci0gICAgICAgICAgbm9kZS0+YWRkSW5jb21pbmcocmVzLCBmYWxzZUNsKTsKLQotICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgobm9kZSk7Ci0gICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShOQkIsIHRydWVDbCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSBpZiAoViA9PSBpbnRyaW5zaWNzLT5HZXRBcnJheUNsYXNzRnVuY3Rpb24pIHsKLSAgICAgICAgICBjb25zdCBsbHZtOjpUeXBlKiBUeSA9IFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoaW50cmluc2ljcy0+VlRUeXBlKTsKLSAgICAgICAgICBDb25zdGFudCogbnVsbFZhbHVlID0gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShUeSk7Ci0gICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhbHJlYWR5IHByb2NlZWQgdGhpcyBjYWxsLgotICAgICAgICAgIGlmIChDYWxsLmdldEFyZ3VtZW50KDIpID09IG51bGxWYWx1ZSkgeyAKLSAgICAgICAgICAgIEJhc2ljQmxvY2sqIE5CQiA9IElJLT5nZXRQYXJlbnQoKS0+c3BsaXRCYXNpY0Jsb2NrKElJKTsKLSAgICAgICAgICAgIEktPmdldFBhcmVudCgpLT5nZXRUZXJtaW5hdG9yKCktPmVyYXNlRnJvbVBhcmVudCgpOwotCi0gICAgICAgICAgICBDb25zdGFudCogaW5pdCA9IENvbnN0YW50OjpnZXROdWxsVmFsdWUoaW50cmluc2ljcy0+VlRUeXBlKTsKLSAgICAgICAgICAgIEdsb2JhbFZhcmlhYmxlKiBHViA9IAotICAgICAgICAgICAgICBuZXcgR2xvYmFsVmFyaWFibGUoKihGLmdldFBhcmVudCgpKSwgaW50cmluc2ljcy0+VlRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIEdsb2JhbFZhbHVlOjpFeHRlcm5hbExpbmthZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0LCAiIik7Ci0KLSAgICAgICAgICAgIFZhbHVlKiBMb2FkZWRHViA9IG5ldyBMb2FkSW5zdChHViwgIiIsIENJKTsKLSAgICAgICAgICAgIFZhbHVlKiBjbXAgPSBuZXcgSUNtcEluc3QoQ0ksIElDbXBJbnN0OjpJQ01QX0VRLCBMb2FkZWRHViwgaW5pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIpOwotCi0gICAgICAgICAgICBCYXNpY0Jsb2NrKiBPS0Jsb2NrID0gQmFzaWNCbG9jazo6Q3JlYXRlKCpDb250ZXh0LCAiIiwgJkYpOwotICAgICAgICAgICAgQmFzaWNCbG9jayogTm90T0tCbG9jayA9IEJhc2ljQmxvY2s6OkNyZWF0ZSgqQ29udGV4dCwgIiIsICZGKTsKLSAgICAgICAgICAgIFBISU5vZGUqIG5vZGUgPSBQSElOb2RlOjpDcmVhdGUoaW50cmluc2ljcy0+VlRUeXBlLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0tCbG9jayk7Ci0gICAgICAgICAgICBub2RlLT5hZGRJbmNvbWluZyhMb2FkZWRHViwgQ0ktPmdldFBhcmVudCgpKTsKLQotICAgICAgICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKE5vdE9LQmxvY2ssIE9LQmxvY2ssIGNtcCwgQ0kpOwotCi0gICAgICAgICAgICBWYWx1ZSogYXJnc1szXSA9IHsgQ2FsbC5nZXRBcmd1bWVudCgwKSwgQ2FsbC5nZXRBcmd1bWVudCgxKSwgR1YgfTsKLSAgICAgICAgICAgIEluc3RydWN0aW9uKiByZXMgPSBDYWxsSW5zdDo6Q3JlYXRlKGludHJpbnNpY3MtPkdldEFycmF5Q2xhc3NGdW5jdGlvbiwgYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgKyAzLCAiIiwgTm90T0tCbG9jayk7Ci0gICAgICAgICAgICByZXMtPnNldERlYnVnTG9jKENJLT5nZXREZWJ1Z0xvYygpKTsKLSAgICAgICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShPS0Jsb2NrLCBOb3RPS0Jsb2NrKTsKLSAgICAgICAgICAgIG5vZGUtPmFkZEluY29taW5nKHJlcywgTm90T0tCbG9jayk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgobm9kZSk7Ci0gICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoTkJCLCBPS0Jsb2NrKTsKLSAgICAgICAgICAgIENoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKFYgPT0gaW50cmluc2ljcy0+Rm9yY2VJbml0aWFsaXNhdGlvbkNoZWNrRnVuY3Rpb24gfHwKLSAgICAgICAgICAgICAgICAgICBWID09IGludHJpbnNpY3MtPkZvcmNlTG9hZGVkQ2hlY2tGdW5jdGlvbiApIHsKLSAgICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoViA9PSBpbnRyaW5zaWNzLT5HZXRGaW5hbEludDhGaWVsZEZ1bmN0aW9uIHx8Ci0gICAgICAgICAgICAgICAgICAgViA9PSBpbnRyaW5zaWNzLT5HZXRGaW5hbEludDE2RmllbGRGdW5jdGlvbiB8fAotICAgICAgICAgICAgICAgICAgIFYgPT0gaW50cmluc2ljcy0+R2V0RmluYWxJbnQzMkZpZWxkRnVuY3Rpb24gfHwKLSAgICAgICAgICAgICAgICAgICBWID09IGludHJpbnNpY3MtPkdldEZpbmFsTG9uZ0ZpZWxkRnVuY3Rpb24gfHwKLSAgICAgICAgICAgICAgICAgICBWID09IGludHJpbnNpY3MtPkdldEZpbmFsRmxvYXRGaWVsZEZ1bmN0aW9uIHx8Ci0gICAgICAgICAgICAgICAgICAgViA9PSBpbnRyaW5zaWNzLT5HZXRGaW5hbERvdWJsZUZpZWxkRnVuY3Rpb24pIHsKLSAgICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICBWYWx1ZSogdmFsID0gQ2FsbC5nZXRBcmd1bWVudCgwKTsKLSAgICAgICAgICBWYWx1ZSogcmVzID0gbmV3IExvYWRJbnN0KHZhbCwgIiIsIENJKTsKLSAgICAgICAgICBDSS0+cmVwbGFjZUFsbFVzZXNXaXRoKHJlcyk7Ci0gICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICB9IGVsc2UgaWYgKFYgPT0gaW50cmluc2ljcy0+SXNBc3NpZ25hYmxlRnJvbUZ1bmN0aW9uKSB7Ci0gICAgICAgICAgQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgVmFsdWUqIFZUMSA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgVmFsdWUqIFZUMiA9IENhbGwuZ2V0QXJndW1lbnQoMSk7Ci0gICAgICAgICAgCi0gICAgICAgICAgQmFzaWNCbG9jayogRW5kQmxvY2sgPSBJSS0+Z2V0UGFyZW50KCktPnNwbGl0QmFzaWNCbG9jayhJSSk7Ci0gICAgICAgICAgSS0+Z2V0UGFyZW50KCktPmdldFRlcm1pbmF0b3IoKS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgQmFzaWNCbG9jayogQ3VyRW5kQmxvY2sgPSBCYXNpY0Jsb2NrOjpDcmVhdGUoKkNvbnRleHQsICIiLCAmRik7Ci0gICAgICAgICAgQmFzaWNCbG9jayogRmFpbGVkQmxvY2sgPSBCYXNpY0Jsb2NrOjpDcmVhdGUoKkNvbnRleHQsICIiLCAmRik7Ci0gICAgICAgICAgUEhJTm9kZSogbm9kZSA9IFBISU5vZGU6OkNyZWF0ZShUeXBlOjpnZXRJbnQxVHkoKkNvbnRleHQpLCAiIiwgQ3VyRW5kQmxvY2spOwotCi0gICAgICAgICAgQ29uc3RhbnRJbnQqIENDID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KCpDb250ZXh0KSwKLSAgICAgICAgICAgICAgSmF2YVZpcnR1YWxUYWJsZTo6Z2V0T2Zmc2V0SW5kZXgoKSk7Ci0gICAgICAgICAgVmFsdWUqIGluZGljZXNbMl0gPSB7IGludHJpbnNpY3MtPmNvbnN0YW50WmVybywgQ0MgfTsKLSAgICAgICAgICBWYWx1ZSogT2Zmc2V0ID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShWVDIsIGluZGljZXMsIGluZGljZXMgKyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCBDSSk7Ci0gICAgICAgICAgT2Zmc2V0ID0gbmV3IExvYWRJbnN0KE9mZnNldCwgIiIsIGZhbHNlLCBDSSk7Ci0gICAgICAgICAgT2Zmc2V0ID0gbmV3IFB0clRvSW50SW5zdChPZmZzZXQsIFR5cGU6OmdldEludDMyVHkoKkNvbnRleHQpLCAiIiwgQ0kpOwotICAgICAgICAgIGluZGljZXNbMV0gPSBPZmZzZXQ7Ci0gICAgICAgICAgVmFsdWUqIEN1clZUID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShWVDEsIGluZGljZXMsIGluZGljZXMgKyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIENJKTsKLSAgICAgICAgICBDdXJWVCA9IG5ldyBMb2FkSW5zdChDdXJWVCwgIiIsIGZhbHNlLCBDSSk7Ci0gICAgICAgICAgQ3VyVlQgPSBuZXcgQml0Q2FzdEluc3QoQ3VyVlQsIGludHJpbnNpY3MtPlZUVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAKLSAgICAgICAgICBJbnN0cnVjdGlvbiogcmVzID0KLSAgICAgICAgICAgIG5ldyBJQ21wSW5zdChDSSwgSUNtcEluc3Q6OklDTVBfRVEsIEN1clZULCBWVDIsICIiKTsKLQotICAgICAgICAgIG5vZGUtPmFkZEluY29taW5nKENvbnN0YW50SW50OjpnZXRUcnVlKCpDb250ZXh0KSwgQ0ktPmdldFBhcmVudCgpKTsKLSAgICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoQ3VyRW5kQmxvY2ssIEZhaWxlZEJsb2NrLCByZXMsIENJKTsKLQotICAgICAgICAgIFZhbHVlKiBBcmdzWzJdID0geyBWVDEsIFZUMiB9OwotICAgICAgICAgIHJlcyA9IENhbGxJbnN0OjpDcmVhdGUoaW50cmluc2ljcy0+SXNTZWNvbmRhcnlDbGFzc0Z1bmN0aW9uLCBBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJncyArIDIsICIiLCBGYWlsZWRCbG9jayk7Ci0gICAgICAgICAgcmVzLT5zZXREZWJ1Z0xvYyhDSS0+Z2V0RGVidWdMb2MoKSk7Ci0gICAgICAgICAKLSAgICAgICAgICBub2RlLT5hZGRJbmNvbWluZyhyZXMsIEZhaWxlZEJsb2NrKTsKLSAgICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoQ3VyRW5kQmxvY2ssIEZhaWxlZEJsb2NrKTsKLQotICAgICAgICAgIC8vIEJyYW5jaCB0byB0aGUgbmV4dCBibG9jay4KLSAgICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoRW5kQmxvY2ssIEN1ckVuZEJsb2NrKTsKLSAgICAgICAgICAKLSAgICAgICAgICAvLyBXZSBjYW4gbm93IHJlcGxhY2UgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uLgotICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgobm9kZSk7Ci0gICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgIAotICAgICAgICAgIC8vIFJlYW5hbHlzZSB0aGUgY3VycmVudCBibG9jay4KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICB9IGVsc2UgaWYgKFYgPT0gaW50cmluc2ljcy0+SXNTZWNvbmRhcnlDbGFzc0Z1bmN0aW9uKSB7Ci0gICAgICAgICAgQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgVmFsdWUqIFZUMSA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgVmFsdWUqIFZUMiA9IENhbGwuZ2V0QXJndW1lbnQoMSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICBCYXNpY0Jsb2NrKiBFbmRCbG9jayA9IElJLT5nZXRQYXJlbnQoKS0+c3BsaXRCYXNpY0Jsb2NrKElJKTsKLSAgICAgICAgICBJLT5nZXRQYXJlbnQoKS0+Z2V0VGVybWluYXRvcigpLT5lcmFzZUZyb21QYXJlbnQoKTsKLQotCi0gICAgICAgICAgQmFzaWNCbG9jayogUHJlaGVhZGVyID0gQmFzaWNCbG9jazo6Q3JlYXRlKCpDb250ZXh0LCAicHJlaGVhZGVyIiwgJkYpOwotICAgICAgICAgIEJhc2ljQmxvY2sqIEJCNCA9IEJhc2ljQmxvY2s6OkNyZWF0ZSgqQ29udGV4dCwgIkJCNCIsICZGKTsKLSAgICAgICAgICBCYXNpY0Jsb2NrKiBCQjUgPSBCYXNpY0Jsb2NrOjpDcmVhdGUoKkNvbnRleHQsICJCQjUiLCAmRik7Ci0gICAgICAgICAgQmFzaWNCbG9jayogQkI2ID0gQmFzaWNCbG9jazo6Q3JlYXRlKCpDb250ZXh0LCAiQkI2IiwgJkYpOwotICAgICAgICAgIEJhc2ljQmxvY2sqIEJCNyA9IEJhc2ljQmxvY2s6OkNyZWF0ZSgqQ29udGV4dCwgIkJCNyIsICZGKTsKLSAgICAgICAgICBCYXNpY0Jsb2NrKiBCQjkgPSBCYXNpY0Jsb2NrOjpDcmVhdGUoKkNvbnRleHQsICJCQjkiLCAmRik7Ci0gICAgICAgICAgY29uc3QgVHlwZSogVHkgPSBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKGludHJpbnNpY3MtPlZUVHlwZSk7Ci0gICAgICAgICAgCi0gICAgICAgICAgUEhJTm9kZSogcmVzRndkID0gUEhJTm9kZTo6Q3JlYXRlKFR5cGU6OmdldEludDMyVHkoKkNvbnRleHQpLCAiIiwgQkI3KTsKLSAgIAotICAgICAgICAgIC8vIFRoaXMgY29ycmVzcG9uZHMgdG86Ci0gICAgICAgICAgLy8gICAgaWYgKFZUMS5jYWNoZSA9PSBWVDIgfHwgVlQxID09IFZUMikgZ290byBlbmQgd2l0aCB0cnVlOwotICAgICAgICAgIC8vICAgIGVsc2UgZ290byBoZWFkZXJMb29wOwotICAgICAgICAgIENvbnN0YW50SW50KiBjYWNoZUluZGV4ID0gCi0gICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoKkNvbnRleHQpLCBKYXZhVmlydHVhbFRhYmxlOjpnZXRDYWNoZUluZGV4KCkpOwotICAgICAgICAgIFZhbHVlKiBpbmRpY2VzWzJdID0geyBpbnRyaW5zaWNzLT5jb25zdGFudFplcm8sIGNhY2hlSW5kZXggfTsKLSAgICAgICAgICBJbnN0cnVjdGlvbiogQ2FjaGVQdHIgPSAKLSAgICAgICAgICAgIEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUoVlQxLCBpbmRpY2VzLCBpbmRpY2VzICsgMiwgIiIsIENJKTsKLSAgICAgICAgICBDYWNoZVB0ciA9IG5ldyBCaXRDYXN0SW5zdChDYWNoZVB0ciwgVHksICIiLCBDSSk7Ci0gICAgICAgICAgVmFsdWUqIENhY2hlID0gbmV3IExvYWRJbnN0KENhY2hlUHRyLCAiIiwgZmFsc2UsIENJKTsKLSAgICAgICAgICBJQ21wSW5zdCogY21wMSA9IG5ldyBJQ21wSW5zdChDSSwgSUNtcEluc3Q6OklDTVBfRVEsIENhY2hlLCBWVDIsICIiKTsKLSAgICAgICAgICBJQ21wSW5zdCogY21wMiA9IG5ldyBJQ21wSW5zdChDSSwgSUNtcEluc3Q6OklDTVBfRVEsIFZUMSwgVlQyLCAiIik7Ci0gICAgICAgICAgQmluYXJ5T3BlcmF0b3IqIE9yID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZShJbnN0cnVjdGlvbjo6T3IsIGNtcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXAyLCAiIiwgQ0kpOwotICAgICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShCQjksIFByZWhlYWRlciwgT3IsIENJKTsKLSAgICAKLSAgICAgICAgICAvLyBGaXJzdCB0ZXN0IGZhaWxlZC4gR28gaW50byB0aGUgbG9vcC4gVGhlIFByZWhlYWRlciBsb29rcyBsaWtlIHRoaXM6Ci0gICAgICAgICAgLy8gaGVhZGVyTG9vcDoKLSAgICAgICAgICAvLyAgICB0eXBlcyA9IFZUMS0+c2Vjb25kYXJ5VHlwZXM7Ci0gICAgICAgICAgLy8gICAgc2l6ZSA9IFZUMS0+bmJTZWNvbmRhcnlUeXBlczsKLSAgICAgICAgICAvLyAgICBpID0gMDsKLSAgICAgICAgICAvLyAgICBnb3RvIHRlc3Q7Ci0gICAgICAgICAgQ29uc3RhbnRJbnQqIHNpemVJbmRleCA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeSgqQ29udGV4dCksIAotICAgICAgICAgICAgICBKYXZhVmlydHVhbFRhYmxlOjpnZXROdW1TZWNvbmRhcnlUeXBlc0luZGV4KCkpOwotICAgICAgICAgIGluZGljZXNbMV0gPSBzaXplSW5kZXg7Ci0gICAgICAgICAgSW5zdHJ1Y3Rpb24qIFNpemUgPSBHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlKFZUMSwgaW5kaWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNlcyArIDIsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVoZWFkZXIpOwotICAgICAgICAgIFNpemUgPSBuZXcgTG9hZEluc3QoU2l6ZSwgIiIsIGZhbHNlLCBQcmVoZWFkZXIpOwotICAgICAgICAgIFNpemUgPSBuZXcgUHRyVG9JbnRJbnN0KFNpemUsIFR5cGU6OmdldEludDMyVHkoKkNvbnRleHQpLCAiIiwgUHJlaGVhZGVyKTsKLSAgICAKLSAgICAgICAgICBDb25zdGFudEludCogc2Vjb25kYXJ5VHlwZXNJbmRleCA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeSgqQ29udGV4dCksIAotICAgICAgICAgICAgICBKYXZhVmlydHVhbFRhYmxlOjpnZXRTZWNvbmRhcnlUeXBlc0luZGV4KCkpOwotICAgICAgICAgIGluZGljZXNbMV0gPSBzZWNvbmRhcnlUeXBlc0luZGV4OwotICAgICAgICAgIEluc3RydWN0aW9uKiBzZWNvbmRhcnlUeXBlcyA9IAotICAgICAgICAgICAgR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShWVDEsIGluZGljZXMsIGluZGljZXMgKyAyLCAiIiwgUHJlaGVhZGVyKTsKLSAgICAgICAgICBzZWNvbmRhcnlUeXBlcyA9IG5ldyBMb2FkSW5zdChzZWNvbmRhcnlUeXBlcywgIiIsIGZhbHNlLCBQcmVoZWFkZXIpOwotICAgICAgICAgIHNlY29uZGFyeVR5cGVzID0gbmV3IEJpdENhc3RJbnN0KHNlY29uZGFyeVR5cGVzLCBUeSwgIiIsIFByZWhlYWRlcik7Ci0gICAgICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKEJCNywgUHJlaGVhZGVyKTsKLSAgICAKLSAgICAgICAgICAvLyBIZXJlIGlzIHRoZSB0ZXN0IGlmIHRoZSBjdXJyZW50IHNlY29uZGFyeSB0eXBlIGlzIFZUMi4KLSAgICAgICAgICAvLyB0ZXN0OgotICAgICAgICAgIC8vICAgQ3VyVlQgPSB0eXBlc1tpXTsKLSAgICAgICAgICAvLyAgIGlmIChDdXJWVCA9PSBWVDIpIGdvdG8gdXBkYXRlIGNhY2hlOwotICAgICAgICAgIC8vICAgZXN0IGdvdG8gaW5jOwotICAgICAgICAgIEluc3RydWN0aW9uKiBDdXJWVCA9IEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUoc2Vjb25kYXJ5VHlwZXMsIHJlc0Z3ZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCBCQjQpOwotICAgICAgICAgIEN1clZUID0gbmV3IExvYWRJbnN0KEN1clZULCAiIiwgZmFsc2UsIEJCNCk7Ci0gICAgICAgICAgY21wMSA9IG5ldyBJQ21wSW5zdCgqQkI0LCBJQ21wSW5zdDo6SUNNUF9FUSwgQ3VyVlQsIFZUMiwgIiIpOwotICAgICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShCQjUsIEJCNiwgY21wMSwgQkI0KTsKLSAgICAKLSAgICAgICAgICAvLyBJbmNyZW1lbnQgaSBpZiB0aGUgcHJldmlvdXMgdGVzdCBmYWlsZWQKLSAgICAgICAgICAvLyBpbmM6Ci0gICAgICAgICAgLy8gICAgKytpOwotICAgICAgICAgIC8vICAgIGdvdG8gZW5kTG9vcFRlc3Q7Ci0gICAgICAgICAgQmluYXJ5T3BlcmF0b3IqIEluZFZhciA9IAotICAgICAgICAgICAgQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFkZChyZXNGd2QsIGludHJpbnNpY3MtPmNvbnN0YW50T25lLCAiIiwgQkI2KTsKLSAgICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoQkI3LCBCQjYpOwotICAgIAotICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHdlIGhhdmVuJ3QgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBsb29wOgotICAgICAgICAgIC8vIGVuZExvb3BUZXN0OgotICAgICAgICAgIC8vICAgIGlmIChpIDwgc2l6ZSkgZ290byB0ZXN0Ci0gICAgICAgICAgLy8gICAgZWxzZSBnb3RvIGVuZCB3aXRoIGZhbHNlCi0gICAgICAgICAgcmVzRndkLT5yZXNlcnZlT3BlcmFuZFNwYWNlKDIpOwotICAgICAgICAgIHJlc0Z3ZC0+YWRkSW5jb21pbmcoaW50cmluc2ljcy0+Y29uc3RhbnRaZXJvLCBQcmVoZWFkZXIpOwotICAgICAgICAgIHJlc0Z3ZC0+YWRkSW5jb21pbmcoSW5kVmFyLCBCQjYpOwotICAgIAotICAgICAgICAgIGNtcDEgPSBuZXcgSUNtcEluc3QoKkJCNywgSUNtcEluc3Q6OklDTVBfU0dULCBTaXplLCByZXNGd2QsICIiKTsKLSAgICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoQkI0LCBCQjksIGNtcDEsIEJCNyk7Ci0gICAKLSAgICAgICAgICAvLyBVcGRhdGUgdGhlIGNhY2hlIGlmIHRoZSByZXN1bHQgaXMgZm91bmQuCi0gICAgICAgICAgLy8gdXBkYXRlQ2FjaGU6Ci0gICAgICAgICAgLy8gICAgVlQxLT5jYWNoZSA9IHJlc3VsdAotICAgICAgICAgIC8vICAgIGdvdG8gZW5kIHdpdGggdHJ1ZQotICAgICAgICAgIG5ldyBTdG9yZUluc3QoVlQyLCBDYWNoZVB0ciwgZmFsc2UsIEJCNSk7Ci0gICAgICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKEJCOSwgQkI1KTsKLQotICAgICAgICAgIC8vIEZpbmFsIGJsb2NrLCB0aGF0IGdldHMgdGhlIHJlc3VsdC4KLSAgICAgICAgICBQSElOb2RlKiBub2RlID0gUEhJTm9kZTo6Q3JlYXRlKFR5cGU6OmdldEludDFUeSgqQ29udGV4dCksICIiLCBCQjkpOwotICAgICAgICAgIG5vZGUtPnJlc2VydmVPcGVyYW5kU3BhY2UoMyk7Ci0gICAgICAgICAgbm9kZS0+YWRkSW5jb21pbmcoQ29uc3RhbnRJbnQ6OmdldFRydWUoKkNvbnRleHQpLCBDSS0+Z2V0UGFyZW50KCkpOwotICAgICAgICAgIG5vZGUtPmFkZEluY29taW5nKENvbnN0YW50SW50OjpnZXRGYWxzZSgqQ29udGV4dCksIEJCNyk7Ci0gICAgICAgICAgbm9kZS0+YWRkSW5jb21pbmcoQ29uc3RhbnRJbnQ6OmdldFRydWUoKkNvbnRleHQpLCBCQjUpOwotICAgIAotICAgICAgICAgIC8vIERvbid0IGZvcmdldCB0byBqdW1wIHRvIHRoZSBuZXh0IGJsb2NrLgotICAgICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShFbmRCbG9jaywgQkI5KTsKLSAgIAotICAgICAgICAgIC8vIFdlIGNhbiBub3cgcmVwbGFjZSB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KLSAgICAgICAgICBDSS0+cmVwbGFjZUFsbFVzZXNXaXRoKG5vZGUpOwotICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLQotICAgICAgICAgIC8vIEFuZCByZWFuYWx5c2UgdGhlIGN1cnJlbnQgYmxvY2suCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gQ2hhbmdlZDsKLX0KLQotCi1GdW5jdGlvblBhc3MqIGNyZWF0ZUxvd2VyQ29uc3RhbnRDYWxsc1Bhc3MoSmF2YUxMVk1Db21waWxlciogQ29tcGlsZXIpIHsKLSAgcmV0dXJuIG5ldyBMb3dlckNvbnN0YW50Q2FsbHMoQ29tcGlsZXIpOwotfQotCi19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvQ29tcGlsZXIvTWFrZWZpbGUgYi92bWtpdC9saWIvSjMvQ29tcGlsZXIvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNWI1ZjUuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL0ozL0NvbXBpbGVyL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyM9PT0tIGxpYi9KbkpWTS9Db21waWxlci9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKLSMgCi0jICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLSMKLSMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0jIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLSMgCi0jIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIwotTEVWRUwgPSAuLi8uLi8uLgotCi1pbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbmZpZwotCi1pZmVxICgkKFdJVEhfTExWTV9HQ0MpLCAxKQotICBNT0RVTEVfTkFNRSA9IEozQ29tcGlsZXIKLWVsc2UKLSAgTElCUkFSWU5BTUUgPSBKM0NvbXBpbGVyCi1lbmRpZgotCi1FWFRSQV9ESVNUID0gRXhjZXB0aW9uc0NoZWNrLmluYyBFeGNlcHRpb25zRHdhcmYuaW5jCi0KLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KLQotQ1hYLkZsYWdzICs9IC1JJChQUk9KX09CSl9ESVIpLy4uL0xMVk1SdW50aW1lIC1JJChQUk9KX1NSQ19ESVIpLy4uL0NsYXNzcGF0aCAkKENMQVNTUEFUSF9GTEFHUykgLUkkKFBST0pfU1JDX0RJUikvLi4vVk1Db3JlCi0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9KMy9JSnZtL0J1bmRsZVRlcm1pbmF0aW9uLmNwcCBiL3Zta2l0L2xpYi9KMy9JSnZtL0J1bmRsZVRlcm1pbmF0aW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVjNzVkMy4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvSjMvSUp2bS9CdW5kbGVUZXJtaW5hdGlvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotI2lmZGVmIFNFUlZJQ0UKLQotI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL0V4ZWN1dGlvbkVuZ2luZS5oIgotI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEpJVEluZm8uaCIKLQotI2luY2x1ZGUgIi4uL2xpYi9FeGVjdXRpb25FbmdpbmUvSklUL0pJVC5oIgotCi0jaW5jbHVkZSAiSmF2YVRocmVhZC5oIgotI2luY2x1ZGUgIkphdmFKSVQuaCIKLSNpbmNsdWRlICJKbmp2bS5oIgotI2luY2x1ZGUgIm12bS9WaXJ0dWFsTWFjaGluZS5oIgotI2luY2x1ZGUgIm12bS9UaHJlYWRzL0NvbmQuaCIKLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9Mb2Nrcy5oIgotI2luY2x1ZGUgIm12bS9KSVQuaCIKLQotI2luY2x1ZGUgInNpZ25hbC5oIgotCi11c2luZyBuYW1lc3BhY2Ugam5qdm07Ci0KLSNpZiBkZWZpbmVkKF9fTUFDSF9fKSAmJiAhZGVmaW5lZChfX2kzODZfXykKLSNkZWZpbmUgRlJBTUVfSVAoZnApIChmcFsyXSkKLSNlbHNlCi0jZGVmaW5lIEZSQU1FX0lQKGZwKSAoZnBbMV0pCi0jZW5kaWYKLQotCi0KLXN0YXRpYyB2b2lkIHRocm93SW5saW5lU3RvcHBlZEJ1bmRsZUV4Y2VwdGlvbigpIHsKLSAgdm9pZCoqIGFkZHIgPSAodm9pZCoqKV9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOwotICBKYXZhVGhyZWFkKiB0aCA9IEphdmFUaHJlYWQ6OmdldCgpOwotICBGUkFNRV9JUChhZGRyKSA9ICh2b2lkKiopdGgtPnJlcGxhY2VkRUlQc1stLXRoLT5laXBJbmRleF07Ci0gIHRoLT50aHJvd0V4Y2VwdGlvbih0aC0+U2VydmljZUV4Y2VwdGlvbik7Ci19Ci0KLXN0YXRpYyB2b2lkIHRocm93U3RvcHBlZEJ1bmRsZUV4Y2VwdGlvbigpIHsKLSAgSmF2YVRocmVhZCogdGggPSBKYXZhVGhyZWFkOjpnZXQoKTsKLSAgdGgtPnRocm93RXhjZXB0aW9uKHRoLT5TZXJ2aWNlRXhjZXB0aW9uKTsKLX0KLQotCi1zdGF0aWMgbXZtOjpMb2NrTm9ybWFsIGxvY2s7Ci1zdGF0aWMgbXZtOjpDb25kIGNvbmQ7Ci1zdGF0aWMgbXZtOjpUaHJlYWQqIGluaXRpYXRvciA9IDA7Ci1zdGF0aWMgYm9vbCBGaW5pc2hlZCA9IHRydWU7Ci0KLXZvaWQgdGVybWluYXRpb25IYW5kbGVyKGludCkgewotICB2b2lkKiogYWRkciA9ICh2b2lkKiopX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCk7Ci0gIG12bTo6VGhyZWFkKiB0aCA9IG12bTo6VGhyZWFkOjpnZXQoKTsKLSAgSm5qdm1DbGFzc0xvYWRlciogc3RvcHBlZEJ1bmRsZSA9IAotICAgIChKbmp2bUNsYXNzTG9hZGVyKikodGgtPnN0b3BwaW5nU2VydmljZS0+Q1UpOwotICB2b2lkKiBiYXNlU1AgPSB0aC0+YmFzZVNQOwotICBib29sIGluU3RhY2sgPSBmYWxzZTsKLSAgd2hpbGUgKGFkZHIgJiYgYWRkciA8IGJhc2VTUCAmJiBhZGRyIDwgYWRkclswXSkgewotICAgIGFkZHIgPSAodm9pZCoqKWFkZHJbMF07Ci0gICAgdm9pZCoqIHB0ciA9ICh2b2lkKiopRlJBTUVfSVAoYWRkcik7Ci0gICAgSmF2YU1ldGhvZCogbWV0aCA9IEphdmFKSVQ6OklQVG9KYXZhTWV0aG9kKHB0cik7Ci0gICAgaWYgKG1ldGgpIHsKLSAgICAgIGlmIChtZXRoLT5jbGFzc0RlZi0+Y2xhc3NMb2FkZXIgPT0gc3RvcHBlZEJ1bmRsZSkgewotICAgICAgICBpblN0YWNrID0gdHJ1ZTsKLSAgICAgICAgSmF2YVRocmVhZCogdGggPSBKYXZhVGhyZWFkOjpnZXQoKTsKLSAgICAgICAgdGgtPnJlcGxhY2VkRUlQc1t0aC0+ZWlwSW5kZXgrK10gPSBGUkFNRV9JUChhZGRyKTsKLSAgICAgICAgRlJBTUVfSVAoYWRkcikgPSAodm9pZCoqKSh1aW50cHRyX3QpdGhyb3dJbmxpbmVTdG9wcGVkQnVuZGxlRXhjZXB0aW9uOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIElmIHRoZSBtYWxpY2lvdXMgYnVuZGxlIGlzIGluIHRoZSBzdGFjaywgaW50ZXJydXB0IHRoZSB0aHJlYWQuCi0gIGlmIChpblN0YWNrKSB7Ci0gICAgSmF2YVRocmVhZCogdGggPSBKYXZhVGhyZWFkOjpnZXQoKTsKLSAgICB0aC0+bG9jay5sb2NrKCk7Ci0gICAgdGgtPmludGVycnVwdEZsYWcgPSAxOwotCi0gICAgLy8gaGVyZSB3ZSBjb3VsZCBhbHNvIHJhaXNlIGEgc2lnbmFsIGZvciBpbnRlcnJ1cHRpbmcgSS9PCi0gICAgaWYgKHRoLT5zdGF0ZSA9PSBKYXZhVGhyZWFkOjpTdGF0ZVdhaXRpbmcpIHsKLSAgICAgIHRoLT5zdGF0ZSA9IEphdmFUaHJlYWQ6OlN0YXRlSW50ZXJydXB0ZWQ7Ci0gICAgICB0aC0+dmFyY29uZC5zaWduYWwoKTsKLSAgICB9Ci0gIAotICAgIHRoLT5sb2NrLnVubG9jaygpOwotCi0gIH0KLQotICBpZiAobXZtOjpUaHJlYWQ6OmdldCgpICE9IGluaXRpYXRvcikgewotICAgIGxvY2subG9jaygpOwotICAgIHdoaWxlICghRmluaXNoZWQpCi0gICAgICBjb25kLndhaXQoJmxvY2spOwotICAgIGxvY2sudW5sb2NrKCk7Ci0gIH0KLX0KLQotCi0KLXZvaWQgSm5qdm06OnN0b3BTZXJ2aWNlKCkgewotICAKLSAgbG9jay5sb2NrKCk7Ci0gIHdoaWxlICghRmluaXNoZWQpCi0gICAgY29uZC53YWl0KCZsb2NrKTsKLQotICBGaW5pc2hlZCA9IGZhbHNlOwotICBsb2NrLnVubG9jaygpOwotCi0gIEpuanZtQ2xhc3NMb2FkZXIqIGJ1bmRsZSA9IChKbmp2bUNsYXNzTG9hZGVyKilDVTsKLSAgYnVuZGxlLT5nZXRJc29sYXRlKCktPnN0YXR1cyA9IDE7Ci0gIG12bTo6VGhyZWFkKiB0aCA9IG12bTo6VGhyZWFkOjpnZXQoKTsKLSAgdGgtPnN0b3BwaW5nU2VydmljZSA9IHRoaXM7Ci0gIGluaXRpYXRvciA9IHRoOwotICBmb3IobXZtOjpUaHJlYWQqIGN1ciA9IChtdm06OlRocmVhZCopdGgtPm5leHQoKTsgY3VyICE9IHRoOwotICAgICAgY3VyID0gKG12bTo6VGhyZWFkKiljdXItPm5leHQoKSkgewotICAgIG12bTo6VmlydHVhbE1hY2hpbmUqIGV4ZWN1dGluZ1ZNID0gY3VyLT5NeVZNOwotICAgIGFzc2VydChleGVjdXRpbmdWTSAmJiAiVGhyZWFkIHdpdGggbm8gVk0hIik7Ci0gICAgY3VyLT5zdG9wcGluZ1NlcnZpY2UgPSB0aGlzOwotICAgIHVpbnQzMiByZXMgPSBjdXItPmtpbGwoU0lHVVNSMSk7Ci0gICAgYXNzZXJ0KHJlcyA9PSAwKTsKLQotICB9Ci0gIAotICAvLyBJIGhhdmUgdG8gZG8gaXQgdG9vIQotICB0ZXJtaW5hdGlvbkhhbmRsZXIoMCk7Ci0gICAKLSAgbGx2bTo6VGFyZ2V0SklUSW5mbyYgVEpJID0gCi0gICAgKChsbHZtOjpKSVQqKW12bTo6TXZtTW9kdWxlOjpleGVjdXRpb25FbmdpbmUpLT5nZXRKSVRJbmZvKCk7Ci0gIGZvciAoQ2xhc3NNYXA6Oml0ZXJhdG9yIGkgPSBidW5kbGUtPmdldENsYXNzZXMoKS0+bWFwLmJlZ2luKCksIAotICAgICAgIGUgPSBidW5kbGUtPmdldENsYXNzZXMoKS0+bWFwLmVuZCgpOyBpIT0gZTsgKytpKSB7Ci0gICAgQ2xhc3MqIGNsID0gaS0+c2Vjb25kLT5hc0NsYXNzKCk7Ci0KLSAgICBpZiAoY2wpIHsKLSAgICAgIGZvciAodWludDMyIGkgPSAwOyBpIDwgY2wtPm5iVmlydHVhbE1ldGhvZHM7ICsraSkgewotICAgICAgICBpZiAoY2wtPnZpcnR1YWxNZXRob2RzW2ldLmNvZGUpIHsKLSAgICAgICAgICBUSkkucmVwbGFjZU1hY2hpbmVDb2RlRm9yRnVuY3Rpb24oY2wtPnZpcnR1YWxNZXRob2RzW2ldLmNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopKHVpbnRwdHJfdCl0aHJvd1N0b3BwZWRCdW5kbGVFeGNlcHRpb24pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgCi0gICAgICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IGNsLT5uYlN0YXRpY01ldGhvZHM7ICsraSkgewotICAgICAgICBpZiAoY2wtPnN0YXRpY01ldGhvZHNbaV0uY29kZSkgewotICAgICAgICAgIFRKSS5yZXBsYWNlTWFjaGluZUNvZGVGb3JGdW5jdGlvbihjbC0+c3RhdGljTWV0aG9kc1tpXS5jb2RlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikodWludHB0cl90KXRocm93U3RvcHBlZEJ1bmRsZUV4Y2VwdGlvbik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBsb2NrLmxvY2soKTsKLSAgRmluaXNoZWQgPSB0cnVlOwotICBjb25kLmJyb2FkY2FzdCgpOwotICBsb2NrLnVubG9jaygpOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9KMy9JSnZtL01ha2VmaWxlIGIvdm1raXQvbGliL0ozL0lKdm0vTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNjdlMjkuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL0ozL0lKdm0vTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIz09PS0gbGliL0puSlZNL1ZNQ29yZS9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIwotIyAKLSMgICAgICAgICAgICAgICAgICAgICBUaGUgdm1raXQgcHJvamVjdAotIwotIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLSMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotIyAKLSMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCi1MRVZFTCA9IC4uLy4uLy4uCi0KLUxJQlJBUllOQU1FID0gSUp2bQotCi1pbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbmZpZwotCi1pbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgotCi1DWFguRmxhZ3MgKz0gLUkkKFBST0pfT0JKX0RJUikvLi4vQ2xhc3NwYXRoIC1JJChQUk9KX09CSl9ESVIpLy4uL0xMVk1SdW50aW1lIC1JJChQUk9KX1NSQ19ESVIpLy4uL0NsYXNzcGF0aCAkKENMQVNTUEFUSF9GTEFHUykgLUkkKFBST0pfU1JDX0RJUikvLi4vLi4vLi4vaW5jbHVkZS9qbmp2bQotCi1pZmVxICgkKElTT0xBVEVfQlVJTEQpLCAxKQotICBDWFguRmxhZ3MgKz0gLUkkKFBST0pfU1JDX0RJUikvLi4vSXNvbGF0ZQotZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9KMy9Jc29sYXRlL0lzb2xhdGVDb21tb25DbGFzcy5jcHAgYi92bWtpdC9saWIvSjMvSXNvbGF0ZS9Jc29sYXRlQ29tbW9uQ2xhc3MuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjJmODBhLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9KMy9Jc29sYXRlL0lzb2xhdGVDb21tb25DbGFzcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotLy89PT0tLS0gSXNvbGF0ZUNvbW1vbkNsYXNzLmNwcCAtIFVzZXIgdmlzaWJsZSBjbGFzc2VzIHdpdGggaXNvbGF0ZXMgLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKbkpWTQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0KLSNpbmNsdWRlICJJc29sYXRlU2hhcmVkTG9hZGVyLmgiCi0jaW5jbHVkZSAiSmF2YUFsbG9jYXRvci5oIgotI2luY2x1ZGUgIkphdmFDbGFzcy5oIgotI2luY2x1ZGUgIkphdmFUaHJlYWQuaCIKLSNpbmNsdWRlICJKYXZhVXBjYWxscy5oIgotI2luY2x1ZGUgIkpuanZtLmgiCi0jaW5jbHVkZSAiSm5qdm1Nb2R1bGUuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGpuanZtOwotCi1Vc2VyQ29tbW9uQ2xhc3M6OlVzZXJDb21tb25DbGFzcygpIHsKLSAgdGhpcy0+bG9ja1ZhciA9IG12bTo6TG9jazo6YWxsb2NSZWN1cnNpdmUoKTsKLSAgdGhpcy0+Y29uZFZhciA9IG12bTo6Q29uZDo6YWxsb2NDb25kKCk7Ci0gIHRoaXMtPnN0YXR1cyA9IGxvYWRlZDsKLX0KLQotVXNlckNsYXNzOjpVc2VyQ2xhc3MoSm5qdm1DbGFzc0xvYWRlciogSkNMLCBjb25zdCBVVEY4KiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgQXJyYXlVSW50OCogYnl0ZXMpIHsKLSAgQ2xhc3MqIGNsID0gSm5qdm1TaGFyZWRMb2FkZXI6OnNoYXJlZExvYWRlci0+Y29uc3RydWN0U2hhcmVkQ2xhc3MobmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMpOwotICBpZiAoIWNsKSB7Ci0gICAgY2wgPSBhbGxvY2F0b3JfbmV3KEpDTC0+YWxsb2NhdG9yLCBDbGFzcykoSkNMLCBuYW1lLCBieXRlcyk7Ci0gIH0KLQotICBjbGFzc0RlZiA9IGNsOwotICBjbGFzc0xvYWRlciA9IEpDTDsKLSAgZGVsZWdhdGVlID0gMDsKLSAgc3RhdGljSW5zdGFuY2UgPSAwOwotICBjdHBJbmZvID0gMDsKLX0KLQotVXNlckNsYXNzQXJyYXk6OlVzZXJDbGFzc0FycmF5KEpuanZtQ2xhc3NMb2FkZXIqIEpDTCwgY29uc3QgVVRGOCogbmFtZSkgewotICBDbGFzc0FycmF5KiBjbCA9IEpuanZtU2hhcmVkTG9hZGVyOjpzaGFyZWRMb2FkZXItPmNvbnN0cnVjdFNoYXJlZENsYXNzQXJyYXkobmFtZSk7Ci0gIGlmICghY2wpIHsKLSAgICBjbCA9IGFsbG9jYXRvcl9uZXcoSkNMLT5hbGxvY2F0b3IsIENsYXNzQXJyYXkpKEpDTCwgbmFtZSk7Ci0gIH0KLSAgY2xhc3NEZWYgPSBjbDsKLSAgY2xhc3NMb2FkZXIgPSBKQ0w7Ci0gIGRlbGVnYXRlZSA9IDA7Ci0gIF9iYXNlQ2xhc3MgPSAwOwotICBfZnVuY3MgPSAwOwotICBzdXBlciA9IEpDTC0+Ym9vdHN0cmFwTG9hZGVyLT5TdXBlckFycmF5OwotICBpbnRlcmZhY2VzID0gSkNMLT5ib290c3RyYXBMb2FkZXItPkludGVyZmFjZXNBcnJheTsKLSAgZGVwdGggPSAxOwotICBkaXNwbGF5ID0gKFVzZXJDb21tb25DbGFzcyoqKW1hbGxvYygyICogc2l6ZW9mKFVzZXJDb21tb25DbGFzcyopKTsKLSAgZGlzcGxheVswXSA9IHN1cGVyOwotICBkaXNwbGF5WzFdID0gdGhpczsKLX0KLQotVXNlckNsYXNzUHJpbWl0aXZlOjpVc2VyQ2xhc3NQcmltaXRpdmUoSm5qdm1DbGFzc0xvYWRlciogSkNMLCBjb25zdCBVVEY4KiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIG5iKSB7Ci0gIENsYXNzUHJpbWl0aXZlKiBjbCA9IAotICAgIEpuanZtU2hhcmVkTG9hZGVyOjpzaGFyZWRMb2FkZXItPmNvbnN0cnVjdFNoYXJlZENsYXNzUHJpbWl0aXZlKG5hbWUsIG5iKTsKLSAgaWYgKCFjbCkgewotICAgIGNsID0gbmV3IENsYXNzUHJpbWl0aXZlKEpDTCwgbmFtZSwgbmIpOwotICB9Ci0gIGNsYXNzRGVmID0gY2w7Ci0gIGNsYXNzTG9hZGVyID0gSkNMOwotICBkZWxlZ2F0ZWUgPSAwOwotICBkaXNwbGF5ID0gKFVzZXJDb21tb25DbGFzcyoqKW1hbGxvYyhzaXplb2YoVXNlckNvbW1vbkNsYXNzKikpOwotICBkaXNwbGF5WzBdID0gdGhpczsKLSAgdmlydHVhbFNpemUgPSBuYjsKLSAgc3RhdHVzID0gcmVhZHk7Ci19Ci0KLXZvaWQgVXNlckNvbW1vbkNsYXNzOjpyZXNvbHZlQ2xhc3MoKSB7Ci0gIGlmIChzdGF0dXMgPCByZXNvbHZlZCkgewotICAgIGFjcXVpcmUoKTsKLSAgICBpZiAoc3RhdHVzID49IHJlc29sdmVkKSB7Ci0gICAgICByZWxlYXNlKCk7Ci0gICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gbG9hZGVkKSB7Ci0gICAgICBpZiAoaXNBcnJheSgpKSB7Ci0gICAgICAgIFVzZXJDbGFzc0FycmF5KiBhcnJheUNsID0gKFVzZXJDbGFzc0FycmF5Kil0aGlzOwotICAgICAgICBVc2VyQ29tbW9uQ2xhc3MqIGJhc2VDbGFzcyA9ICBhcnJheUNsLT5iYXNlQ2xhc3MoKTsKLSAgICAgICAgYmFzZUNsYXNzLT5yZXNvbHZlQ2xhc3MoKTsKLSAgICAgICAgc3RhdHVzID0gcmVzb2x2ZWQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBVc2VyQ2xhc3MqIGNsID0gKFVzZXJDbGFzcyopdGhpczsKLSAgICAgICAgQ2xhc3MqIGRlZiA9IChDbGFzcyopY2xhc3NEZWY7Ci0gICAgICAgIGlmIChjbGFzc0RlZi0+c3RhdHVzIDwgcmVzb2x2ZWQpIHsKLSAgICAgICAgICBjbGFzc0RlZi0+YWNxdWlyZSgpOwotICAgICAgICAgIGlmIChjbGFzc0RlZi0+c3RhdHVzID09IGxvYWRlZCkgewotICAgICAgICAgICAgZGVmLT5yZWFkQ2xhc3MoKTsKLSAgICAgICAgICAgIGRlZi0+c3RhdHVzID0gY2xhc3NSZWFkOwotICAgICAgICAgICAgc3RhdHVzID0gY2xhc3NSZWFkOwotICAgICAgICAgICAgY2wtPmN0cEluZm8gPSAKLSAgICAgICAgICAgICAgbmV3KGNsYXNzTG9hZGVyLT5hbGxvY2F0b3IsIGRlZi0+Y3RwSW5mby0+Y3RwU2l6ZSkgVXNlckNvbnN0YW50UG9vbChjbCk7Ci0gICAgICAgICAgICBjbC0+bG9hZFBhcmVudHMoKTsKLSAgICAgICAgICAgIGlmIChjbC0+c3VwZXIpCi0gICAgICAgICAgICAgIGRlZi0+c3VwZXIgPSBjbC0+c3VwZXItPmNsYXNzRGVmOwotICAgICAgICAgICAgZm9yIChzdGQ6OnZlY3RvcjxVc2VyQ2xhc3MqPjo6aXRlcmF0b3IgaSA9IGludGVyZmFjZXMuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgZSA9IGludGVyZmFjZXMuZW5kKCk7IGkgIT0gZTsgKytpKSB7Ci0gICAgICAgICAgICAgIGRlZi0+aW50ZXJmYWNlcy5wdXNoX2JhY2soKENsYXNzKikoKCppKS0+Y2xhc3NEZWYpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZi0+c3RhdHVzID0gcHJlcGFyZWQ7Ci0gICAgICAgICAgICBzdGF0dXMgPSBwcmVwYXJlZDsKLSAgICAgICAgICAgIGRlZi0+Y2xhc3NMb2FkZXItPlRoZU1vZHVsZS0+cmVzb2x2ZVZpcnR1YWxDbGFzcyhkZWYpOwotICAgICAgICAgICAgdmlydHVhbFNpemUgPSBkZWYtPnZpcnR1YWxTaXplOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB1aW50NjQgdnRTaXplID0gZGVmLT52aXJ0dWFsVGFibGVTaXplICogc2l6ZW9mKHZvaWQqKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdmlydHVhbFZUID0gKFZpcnR1YWxUYWJsZSopbWFsbG9jKDIgKiB2dFNpemUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQqKSgodWludDY0KXZpcnR1YWxWVCArIHZ0U2l6ZSksIGRlZi0+dmlydHVhbFZULCB2dFNpemUpOwotICAgICAgICAgICAgaWYgKHN1cGVyKSB7Ci0gICAgICAgICAgICAgIG1lbWNweSh2aXJ0dWFsVlQsICh2b2lkKikoKHVpbnQ2NClzdXBlci0+dmlydHVhbFZUIC0gdnRTaXplKSwKLSAgICAgICAgICAgICAgICAgICAgIHZ0U2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHZpcnR1YWxWVCA9IChWaXJ0dWFsVGFibGUqKSgodWludDY0KXZpcnR1YWxWVCArIHZ0U2l6ZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoQ29tbW9uQ2xhc3M6Om1ldGhvZF9pdGVyYXRvciBpID0gZGVmLT52aXJ0dWFsTWV0aG9kcy5iZWdpbigpLAotICAgICAgICAgICAgICAgICBlID0gZGVmLT52aXJ0dWFsTWV0aG9kcy5lbmQoKTsgaSAhPSBlOyArK2kpIHsKLSAgICAgICAgICAgICAgaWYgKGktPnNlY29uZC0+b2Zmc2V0ID4gMCkgewotICAgICAgICAgICAgICAgICgodm9pZCoqKXZpcnR1YWxWVClbLShpLT5zZWNvbmQtPm9mZnNldCldID0gY3RwSW5mbzsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBkZWYtPnN0YXR1cyA9IHJlc29sdmVkOwotICAgICAgICAgICAgc3RhdHVzID0gcmVzb2x2ZWQ7Ci0gICAgICAgICAgICBjbGFzc0RlZi0+YnJvYWRjYXN0Q2xhc3MoKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd2hpbGUgKGNsYXNzRGVmLT5zdGF0dXMgPCByZXNvbHZlZCkgewotICAgICAgICAgICAgICBjbGFzc0RlZi0+d2FpdENsYXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGNsYXNzRGVmLT5yZWxlYXNlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgY2wtPmN0cEluZm8gPSAKLSAgICAgICAgICAgIG5ldyhjbGFzc0xvYWRlci0+YWxsb2NhdG9yLCBkZWYtPmN0cEluZm8tPmN0cFNpemUpIFVzZXJDb25zdGFudFBvb2woY2wpOwotICAgICAgICAgIHJlbGVhc2UoKTsKLSAgICAgICAgICBzdGF0dXMgPSBjbGFzc1JlYWQsCi0gICAgICAgICAgY2wtPmxvYWRQYXJlbnRzKCk7Ci0gICAgICAgICAgc3RhdHVzID0gcmVzb2x2ZWQ7Ci0gICAgICAgICAgYnJvYWRjYXN0Q2xhc3MoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmVsZWFzZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICB3aGlsZSAoc3RhdHVzIDwgcmVzb2x2ZWQpIHsKLSAgICAgICAgd2FpdENsYXNzKCk7Ci0gICAgICB9Ci0gICAgICByZWxlYXNlKCk7Ci0gICAgfQotICB9Ci19Ci0KLVVzZXJDbGFzcyogVXNlckNvbW1vbkNsYXNzOjpsb29rdXBDbGFzc0Zyb21NZXRob2QoSmF2YU1ldGhvZCogbWV0aCkgewotICBVc2VyQ2xhc3MqIHJlcyA9IDA7Ci0gIGxvb2t1cE1ldGhvZERvbnRUaHJvdyhtZXRoLT5uYW1lLCBtZXRoLT50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgaXNTdGF0aWMobWV0aC0+YWNjZXNzKSwgdHJ1ZSwgcmVzKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotVXNlckNvbW1vbkNsYXNzKiBVc2VyQ29tbW9uQ2xhc3M6OmdldFVzZXJDbGFzcyhDb21tb25DbGFzcyogY2wpIHsKLSAgZnByaW50ZihzdGRlcnIsICJpbXBsZW1lbnQgbWUiKTsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotVXNlckNvbW1vbkNsYXNzKiBVc2VyQ29uc3RhbnRQb29sOjppc0NsYXNzTG9hZGVkKHVpbnQzMiBlbnRyeSkgewotICBKYXZhQ29uc3RhbnRQb29sKiBjdHBJbmZvID0gZ2V0U2hhcmVkUG9vbCgpOwotICBpZiAoISAoKGVudHJ5ID4gMCkgJiYgKGVudHJ5IDwgY3RwSW5mby0+Y3RwU2l6ZSkgJiYgCi0gICAgICAgIGN0cEluZm8tPnR5cGVBdChlbnRyeSkgPT0gSmF2YUNvbnN0YW50UG9vbDo6Q29uc3RhbnRDbGFzcykpIHsKLSAgICBKYXZhVGhyZWFkOjpnZXQoKS0+aXNvbGF0ZS0+Y2xhc3NGb3JtYXRFcnJvcigKLSAgICAgICAgICAgICAgImJhZCBjb25zdGFudCBwb29sIG51bWJlciBmb3IgY2xhc3MgYXQgZW50cnkgJWQiLCBlbnRyeSk7Ci0gIH0KLSAgcmV0dXJuIChVc2VyQ29tbW9uQ2xhc3MqKWN0cFJlc1tlbnRyeV07Ci19Ci0KLVVzZXJDb21tb25DbGFzcyogVXNlckNvbnN0YW50UG9vbDo6bG9hZENsYXNzKHVpbnQzMiBpbmRleCkgewotICBVc2VyQ29tbW9uQ2xhc3MqIHRlbXAgPSBpc0NsYXNzTG9hZGVkKGluZGV4KTsKLSAgaWYgKCF0ZW1wKSB7Ci0gICAgSmF2YUNvbnN0YW50UG9vbCogY3RwSW5mbyA9IGdldFNoYXJlZFBvb2woKTsKLSAgICBKbmp2bUNsYXNzTG9hZGVyKiBsb2FkZXIgPSBnZXRDbGFzcygpLT5jbGFzc0xvYWRlcjsKLSAgICBjb25zdCBVVEY4KiBuYW1lID0gY3RwSW5mby0+VVRGOEF0KGN0cEluZm8tPmN0cERlZltpbmRleF0pOwotICAgIGlmIChuYW1lLT5lbGVtZW50c1swXSA9PSBBc3Nlc3NvckRlc2M6OklfVEFCKSB7Ci0gICAgICB0ZW1wID0gbG9hZGVyLT5jb25zdHJ1Y3RBcnJheShuYW1lKTsKLSAgICAgIHRlbXAtPnJlc29sdmVDbGFzcygpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBQdXQgaW50byBjdHBSZXMgYmVjYXVzZSB0aGVyZSBpcyBvbmx5IG9uZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2xhc3MKLSAgICAgIHRlbXAgPSBsb2FkZXItPmxvYWROYW1lKG5hbWUsIHRydWUsIGZhbHNlKTsKLSAgICB9Ci0gICAgY3RwUmVzW2luZGV4XSA9IHRlbXA7Ci0gICAgY3RwSW5mby0+Y3RwUmVzW2luZGV4XSA9IHRlbXAtPmNsYXNzRGVmOwotICB9Ci0gIHJldHVybiB0ZW1wOwotfQotCi12b2lkIFVzZXJDb25zdGFudFBvb2w6OnJlc29sdmVNZXRob2QodWludDMyIGluZGV4LCBVc2VyQ29tbW9uQ2xhc3MqJiBjbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVVEY4KiYgdXRmOCwgU2lnbmRlZiomIHNpZ24pIHsKLSAgSmF2YUNvbnN0YW50UG9vbCogY3RwSW5mbyA9IGdldFNoYXJlZFBvb2woKTsKLSAgc2ludDMyIGVudHJ5ID0gY3RwSW5mby0+Y3RwRGVmW2luZGV4XTsKLSAgc2ludDMyIG50SW5kZXggPSBlbnRyeSAmIDB4RkZGRjsKLSAgc2lnbiA9IChTaWduZGVmKiljdHBJbmZvLT5jdHBSZXNbbnRJbmRleF07Ci0gIGFzc2VydChzaWduICYmICJObyBjYWNoZWQgc2lnbmF0dXJlIGFmdGVyIEpJVHRpbmciKTsKLSAgdXRmOCA9IGN0cEluZm8tPlVURjhBdChjdHBJbmZvLT5jdHBEZWZbbnRJbmRleF0gPj4gMTYpOwotICBjbCA9IGxvYWRDbGFzcyhlbnRyeSA+PiAxNik7Ci0gIGFzc2VydChjbCAmJiBjbC0+aXNSZXNvbHZlZCgpICYmICJObyByZXNvbHZlZCBjbGFzcyB3aGVuIHJlc29sdmluZyBtZXRob2QiKTsKLX0KLSAgCi12b2lkIFVzZXJDb25zdGFudFBvb2w6OnJlc29sdmVGaWVsZCh1aW50MzIgaW5kZXgsIFVzZXJDb21tb25DbGFzcyomIGNsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVVRGOComIHV0ZjgsIFR5cGVkZWYqJiBzaWduKSB7Ci0gIEphdmFDb25zdGFudFBvb2wqIGN0cEluZm8gPSBnZXRTaGFyZWRQb29sKCk7Ci0gIHNpbnQzMiBlbnRyeSA9IGN0cEluZm8tPmN0cERlZltpbmRleF07Ci0gIHNpbnQzMiBudEluZGV4ID0gZW50cnkgJiAweEZGRkY7Ci0gIHNpZ24gPSAoVHlwZWRlZiopY3RwSW5mby0+Y3RwUmVzW250SW5kZXhdOwotICBhc3NlcnQoc2lnbiAmJiAiTm8gY2FjaGVkIFR5cGVkZWYgYWZ0ZXIgSklUdGluZyIpOwotICB1dGY4ID0gY3RwSW5mby0+VVRGOEF0KGN0cEluZm8tPmN0cERlZltudEluZGV4XSA+PiAxNik7Ci0gIGNsID0gbG9hZENsYXNzKGVudHJ5ID4+IDE2KTsKLSAgYXNzZXJ0KGNsICYmIGNsLT5pc1Jlc29sdmVkKCkgJiYgIk5vIHJlc29sdmVkIGNsYXNzIHdoZW4gcmVzb2x2aW5nIGZpZWxkIik7Ci19Ci0KLXZvaWQqIFVzZXJDb25zdGFudFBvb2w6Om9wZXJhdG9yIG5ldyhzaXplX3Qgc3osIEphdmFBbGxvY2F0b3IqIGFsbG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBzaXplKXsKLSAgcmV0dXJuIGFsbG9jLT5hbGxvY2F0ZU9iamVjdChzeiArIHNpemUgKiBzaXplb2Yodm9pZCopLCBWVCk7Ci19Ci0KLVVzZXJDbGFzc1ByaW1pdGl2ZSogQXNzZXNzb3JEZXNjOjpnZXRQcmltaXRpdmVDbGFzcygpIGNvbnN0IHsKLSAgSm5qdm0qIHZtID0gSmF2YVRocmVhZDo6Z2V0KCktPmlzb2xhdGU7Ci0gIGlmIChudW1JZCA+IFZPSURfSUQgJiYgbnVtSWQgPCBBUlJBWV9JRCkgewotICAgIFVzZXJDbGFzc0FycmF5KiBhcnJheUNsID0gdm0tPmFycmF5Q2xhc3Nlc1tudW1JZF07Ci0gICAgVXNlckNsYXNzUHJpbWl0aXZlKiBjbCA9IChVc2VyQ2xhc3NQcmltaXRpdmUqKWFycmF5Q2wtPl9iYXNlQ2xhc3M7Ci0gICAgYXNzZXJ0KGNsICYmICJQcmltaXRpdmUgYXJyYXkgY2xhc3MgZG9lcyBub3QgaGF2ZSBhIHByaW1pdGl2ZS4iKTsKLSAgICByZXR1cm4gY2w7Ci0gIH0gZWxzZSBpZiAobnVtSWQgPT0gVk9JRF9JRCkgewotICAgIHJldHVybiB2bS0+dXBjYWxscy0+T2ZWb2lkOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1Vc2VyQ2xhc3NBcnJheSogQXNzZXNzb3JEZXNjOjpnZXRBcnJheUNsYXNzKCkgY29uc3QgewotICBKbmp2bSogdm0gPSBKYXZhVGhyZWFkOjpnZXQoKS0+aXNvbGF0ZTsKLSAgVXNlckNsYXNzQXJyYXkqIGFycmF5Q2wgPSB2bS0+YXJyYXlDbGFzc2VzW251bUlkXTsKLSAgcmV0dXJuIGFycmF5Q2w7Ci19Ci0KLUphdmFNZXRob2QqIFVzZXJDb21tb25DbGFzczo6bG9va3VwTWV0aG9kRG9udFRocm93KGNvbnN0IFVURjgqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVVEY4KiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1N0YXRpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVjdXJzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJDbGFzcyomIG1ldGhvZENsKSB7Ci0gIAotICBDb21tb25DbGFzczo6RmllbGRDbXAgQ0MobmFtZSwgdHlwZSk7Ci0gIENvbW1vbkNsYXNzOjptZXRob2RfbWFwKiBtYXAgPSBpc1N0YXRpYyA/IGdldFN0YXRpY01ldGhvZHMoKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZpcnR1YWxNZXRob2RzKCk7Ci0gIENvbW1vbkNsYXNzOjptZXRob2RfaXRlcmF0b3IgRW5kID0gbWFwLT5lbmQoKTsKLSAgQ29tbW9uQ2xhc3M6Om1ldGhvZF9pdGVyYXRvciBJID0gbWFwLT5maW5kKENDKTsKLSAgaWYgKEkgIT0gRW5kKSB7Ci0gICAgbWV0aG9kQ2wgPSAoVXNlckNsYXNzKil0aGlzOwotICAgIHJldHVybiBJLT5zZWNvbmQ7Ci0gIH0KLSAgCi0gIEphdmFNZXRob2QgKmN1ciA9IDA7Ci0gIAotICBpZiAocmVjdXJzZSkgewotICAgIGlmIChzdXBlcikgY3VyID0gc3VwZXItPmxvb2t1cE1ldGhvZERvbnRUaHJvdyhuYW1lLCB0eXBlLCBpc1N0YXRpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzZSwgbWV0aG9kQ2wpOwotICAgIGlmIChjdXIpIHJldHVybiBjdXI7Ci0KLSAgICBpZiAoaXNTdGF0aWMpIHsKLSAgICAgIHN0ZDo6dmVjdG9yPFVzZXJDbGFzcyo+KiBpbnRlcmZhY2VzID0gZ2V0SW50ZXJmYWNlcygpOwotICAgICAgZm9yIChzdGQ6OnZlY3RvcjxVc2VyQ2xhc3MqPjo6aXRlcmF0b3IgaSA9IGludGVyZmFjZXMtPmJlZ2luKCksCi0gICAgICAgICAgIGUgPSBpbnRlcmZhY2VzLT5lbmQoKTsgaSE9IGU7IGkrKykgewotICAgICAgICBjdXIgPSAoKmkpLT5sb29rdXBNZXRob2REb250VGhyb3cobmFtZSwgdHlwZSwgaXNTdGF0aWMsIHJlY3Vyc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RDbCk7Ci0gICAgICAgIGlmIChjdXIpIHJldHVybiBjdXI7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLUphdmFNZXRob2QqIFVzZXJDb21tb25DbGFzczo6bG9va3VwTWV0aG9kKGNvbnN0IFVURjgqIG5hbWUsIGNvbnN0IFVURjgqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU3RhdGljLCBib29sIHJlY3Vyc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyQ2xhc3MqJiBtZXRob2RDbCkgewotICBKYXZhTWV0aG9kKiByZXMgPSBsb29rdXBNZXRob2REb250VGhyb3cobmFtZSwgdHlwZSwgaXNTdGF0aWMsIHJlY3Vyc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RDbCk7Ci0gIGlmICghcmVzKSB7Ci0gICAgSmF2YVRocmVhZDo6Z2V0KCktPmlzb2xhdGUtPm5vU3VjaE1ldGhvZEVycm9yKHRoaXMtPmNsYXNzRGVmLCBuYW1lKTsKLSAgfQotICByZXR1cm4gcmVzOwotfQotCi1KYXZhRmllbGQqCi1Vc2VyQ29tbW9uQ2xhc3M6Omxvb2t1cEZpZWxkRG9udFRocm93KGNvbnN0IFVURjgqIG5hbWUsIGNvbnN0IFVURjgqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdGF0aWMsIGJvb2wgcmVjdXJzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckNvbW1vbkNsYXNzKiYgZGVmaW5pbmdDbGFzcykgewotCi0gIENvbW1vbkNsYXNzOjpGaWVsZENtcCBDQyhuYW1lLCB0eXBlKTsKLSAgQ29tbW9uQ2xhc3M6OmZpZWxkX21hcCogbWFwID0gaXNTdGF0aWMgPyBnZXRTdGF0aWNGaWVsZHMoKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmlydHVhbEZpZWxkcygpOwotICBDb21tb25DbGFzczo6ZmllbGRfaXRlcmF0b3IgRW5kID0gbWFwLT5lbmQoKTsKLSAgQ29tbW9uQ2xhc3M6OmZpZWxkX2l0ZXJhdG9yIEkgPSBtYXAtPmZpbmQoQ0MpOwotICBpZiAoSSAhPSBFbmQpIHsKLSAgICBkZWZpbmluZ0NsYXNzID0gdGhpczsKLSAgICByZXR1cm4gSS0+c2Vjb25kOwotICB9Ci0gIAotICBKYXZhRmllbGQgKmN1ciA9IDA7Ci0KLSAgaWYgKHJlY3Vyc2UpIHsKLSAgICBpZiAoc3VwZXIpIGN1ciA9IHN1cGVyLT5sb29rdXBGaWVsZERvbnRUaHJvdyhuYW1lLCB0eXBlLCBpc1N0YXRpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNlLCBkZWZpbmluZ0NsYXNzKTsKLSAgICBpZiAoY3VyKSByZXR1cm4gY3VyOwotCi0gICAgaWYgKGlzU3RhdGljKSB7Ci0gICAgICBzdGQ6OnZlY3RvcjxVc2VyQ2xhc3MqPiogaW50ZXJmYWNlcyA9IGdldEludGVyZmFjZXMoKTsKLSAgICAgIGZvciAoc3RkOjp2ZWN0b3I8VXNlckNsYXNzKj46Oml0ZXJhdG9yIGkgPSBpbnRlcmZhY2VzLT5iZWdpbigpLAotICAgICAgICAgICBlID0gaW50ZXJmYWNlcy0+ZW5kKCk7IGkhPSBlOyBpKyspIHsKLSAgICAgICAgY3VyID0gKCppKS0+bG9va3VwRmllbGREb250VGhyb3cobmFtZSwgdHlwZSwgaXNTdGF0aWMsIHJlY3Vyc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluaW5nQ2xhc3MpOwotICAgICAgICBpZiAoY3VyKSByZXR1cm4gY3VyOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybiAwOwotfQotCi1KYXZhRmllbGQqIFVzZXJDb21tb25DbGFzczo6bG9va3VwRmllbGQoY29uc3QgVVRGOCogbmFtZSwgY29uc3QgVVRGOCogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU3RhdGljLCBib29sIHJlY3Vyc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckNvbW1vbkNsYXNzKiYgZGVmaW5pbmdDbGFzcykgewotICAKLSAgSmF2YUZpZWxkKiByZXMgPSBsb29rdXBGaWVsZERvbnRUaHJvdyhuYW1lLCB0eXBlLCBpc1N0YXRpYywgcmVjdXJzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmluZ0NsYXNzKTsKLSAgaWYgKCFyZXMpIHsKLSAgICBKYXZhVGhyZWFkOjpnZXQoKS0+aXNvbGF0ZS0+bm9TdWNoRmllbGRFcnJvcih0aGlzLT5jbGFzc0RlZiwgbmFtZSk7Ci0gIH0KLSAgcmV0dXJuIHJlczsKLX0KLQotdm9pZCBVc2VyQ29uc3RhbnRQb29sOjpwcmludChtdm06OlByaW50QnVmZmVyKiBidWYpIGNvbnN0IHsKLSAgYnVmLT53cml0ZSgiVXNlciBjb25zdGFudCBwb29sIG9mIDwiKTsKLSAgZ2V0Q2xhc3MoKS0+Y2xhc3NEZWYtPnByaW50KGJ1Zik7Ci0gIGJ1Zi0+d3JpdGUoIj4iKTsKLX0KLQotdm9pZCBVc2VyQ29tbW9uQ2xhc3M6OnByaW50KG12bTo6UHJpbnRCdWZmZXIqIGJ1ZikgY29uc3QgewotICBidWYtPndyaXRlKCJVc2VyIGNsYXNzIG9mIDwiKTsKLSAgY2xhc3NEZWYtPnByaW50KGJ1Zik7Ci0gIGJ1Zi0+d3JpdGUoIj4iKTsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9KMy9Jc29sYXRlL0lzb2xhdGVDb21tb25DbGFzcy5oIGIvdm1raXQvbGliL0ozL0lzb2xhdGUvSXNvbGF0ZUNvbW1vbkNsYXNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYWEyOTQuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL0ozL0lzb2xhdGUvSXNvbGF0ZUNvbW1vbkNsYXNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MzkgKzAsMCBAQAotLy89PT0tLS0tIElzb2xhdGVDb21tb25DbGFzcy5oIC0gVXNlciB2aXNpYmxlIGNsYXNzZXMgd2l0aCBpc29sYXRlcyAtLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpuSlZNCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgSk5KVk1fSkFWQV9DTEFTU19ICi0jZXJyb3IgIk5ldmVyIHVzZSA8SXNvbGF0ZUNvbW1vbkNsYXNzLmg+IGRpcmVjdGx5LCBidXQgaW5jbHVkZSA8SmF2YUNsYXNzLmg+IgotI2VuZGlmCi0KLSNpZm5kZWYgSVNPTEFURV9DT01NT05fQ0xBU1NfSAotI2RlZmluZSBJU09MQVRFX0NPTU1PTl9DTEFTU19ICi0KLSNpbmNsdWRlICJtdm0vT2JqZWN0LmgiCi0KLSNpbmNsdWRlICJKYXZhQ29uc3RhbnRQb29sLmgiCi0KLW5hbWVzcGFjZSBqbmp2bSB7Ci0KLWNsYXNzIEFycmF5VUludDg7Ci1jbGFzcyBBc3Nlc3NvckRlc2M7Ci1jbGFzcyBDb21tb25DbGFzczsKLWNsYXNzIENsYXNzOwotY2xhc3MgQ2xhc3NBcnJheTsKLWNsYXNzIENsYXNzUHJpbWl0aXZlOwotY2xhc3MgSmF2YUNvbnN0YW50UG9vbDsKLWNsYXNzIEphdmFGaWVsZDsKLWNsYXNzIEphdmFNZXRob2Q7Ci1jbGFzcyBKYXZhT2JqZWN0OwotY2xhc3MgSm5qdm07Ci1jbGFzcyBKbmp2bUNsYXNzTG9hZGVyOwotY2xhc3MgVXNlckNsYXNzOwotY2xhc3MgVXNlckNsYXNzQXJyYXk7Ci1jbGFzcyBVc2VyQ29uc3RhbnRQb29sOwotY2xhc3MgVVRGODsKLWVudW0gSmF2YVN0YXRlOwotCi1jbGFzcyBVc2VyQ29tbW9uQ2xhc3MgOiBwdWJsaWMgbXZtOjpPYmplY3QgewotcHVibGljOgotICAKLSAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vIERvIG5vdCByZW9yZGVyIHRoZXNlIGZpZWxkcyBvciBhZGQgbmV3IG9uZXMhIHRoZSBMTFZNIHJ1bnRpbWUgYXNzdW1lcyB0aGF0Ci0vLyBjbGFzc2VzIGhhdmUgdGhlIGZvbGxvd2luZyBiZWdpbm5pbmcgbGF5b3V0LgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSAgCi0gIC8vLyB2aXJ0dWFsU2l6ZSAtIFRoZSBzaXplIG9mIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLiBBcnJheSBjbGFzc2VzIGRvCi0gIC8vLyBub3QgbmVlZCB0aGlzIGluZm9ybWF0aW9uLCBidXQgdG8gc2ltcGxpZnkgYWNjZXNzaW5nIHRoaXMgZmllbGQgaW4KLSAgLy8vIHRoZSBKSVQsIHdlIHB1dCB0aGlzIGluIGhlcmUuCi0gIC8vLyAKLSAgdWludDMyIHZpcnR1YWxTaXplOwotCi0gIC8vLyB2aXJ0dWFsVlQgLSBUaGUgdmlydHVhbCB0YWJsZSBvZiBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcy4gTGlrZSB0aGUKLSAgLy8vIHZpcnR1YWxTaXplIGZpZWxkLCBhcnJheSBjbGFzc2VzIGRvIG5vdCBuZWVkIHRoaXMgaW5mb3JtYXRpb24uIEJ1dCB3ZQotICAvLy8gc2ltcGxpZnkgSklUIGdlbmVyYXRpb24gdG8gc2V0IGl0IGhlcmUuCi0gIC8vLwotICBWaXJ0dWFsVGFibGUqIHZpcnR1YWxWVDsKLSAgCi0gIC8vLyBkaXNwbGF5IC0gVGhlIGNsYXNzIGhpZXJhcmNoeSBvZiBzdXBlcnMgZm9yIHRoaXMgY2xhc3MuIEFycmF5IGNsYXNzZXMKLSAgLy8vIGRvIG5vdCBuZWVkIGl0LgotICAvLy8KLSAgVXNlckNvbW1vbkNsYXNzKiogZGlzcGxheTsKLSAgCi0gIC8vLyBkZXB0aCAtIFRoZSBkZXB0aCBvZiB0aGlzIGNsYXNzIGluIGl0cyBjbGFzcyBoaWVyYXJjaHkuIAotICAvLy8gZGlzcGxheVtkZXB0aF0gY29udGFpbnMgdGhlIGNsYXNzLiBBcnJheSBjbGFzc2VzIGRvIG5vdCBuZWVkIGl0LgotICAvLy8KLSAgdWludDMyIGRlcHRoOwotCi0gIC8vLyBzdGF0dXMgLSBUaGUgbG9hZGluZy9yZXNvbHZlL2luaXRpYWxpemF0aW9uIHN0YXRlIG9mIHRoZSBjbGFzcy4KLSAgLy8vCi0gIEphdmFTdGF0ZSBzdGF0dXM7Ci0gIAotICAvLy8gY3RwSW5mbyAtIFRoZSBwcml2YXRlIGNvbnN0YW50IHBvb2wgb2YgdGhpcyBjbGFzcy4KLSAgLy8vCi0gIFVzZXJDb25zdGFudFBvb2wqIGN0cEluZm87Ci0gIAotICBKYXZhT2JqZWN0KiBzdGF0aWNJbnN0YW5jZTsKLQotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyBOZXcgZmllbGRzIGNhbiBiZSBhZGRlZCBmcm9tIG5vdywgb3IgcmVvcmRlcmVkLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vIAotCi0gIEpuanZtQ2xhc3NMb2FkZXIqIGNsYXNzTG9hZGVyOwotICBKYXZhT2JqZWN0KiBkZWxlZ2F0ZWU7Ci0gIENvbW1vbkNsYXNzKiBjbGFzc0RlZjsKLSAgVXNlckNsYXNzKiBzdXBlcjsKLSAgc3RkOjp2ZWN0b3I8VXNlckNsYXNzKj4gaW50ZXJmYWNlczsKLQotICBib29sIGluaGVyaXROYW1lKGNvbnN0IFVURjgqIFRuYW1lKTsKLSAgYm9vbCBpc09mVHlwZU5hbWUoY29uc3QgVVRGOCogbmFtZSk7Ci0gIGJvb2wgaXNBc3NpZ25hYmxlRnJvbShVc2VyQ29tbW9uQ2xhc3MqIGNsKTsKLSAgCi0gIC8vLyBzdWJjbGFzc09mIC0gSWYgdGhpcyBjbGFzcyBpcyBhIHJlZ3VsYXIgY2xhc3MsIGlzIGl0IGEgc3ViY2xhc3Mgb2YgdGhlCi0gIC8vLyBnaXZlbiBjbGFzcz8KLSAgLy8vCi0gIGJvb2wgc3ViY2xhc3NPZihVc2VyQ29tbW9uQ2xhc3MqIGNsKTsKLQotICBib29sIGlzQXJyYXkoKSB7Ci0gICAgcmV0dXJuIGNsYXNzRGVmLT5pc0FycmF5KCk7Ci0gIH0KLSAgYm9vbCBpc1ByaW1pdGl2ZSgpIHsKLSAgICByZXR1cm4gY2xhc3NEZWYtPmlzUHJpbWl0aXZlKCk7Ci0gIH0KLQotICBib29sIGlzSW50ZXJmYWNlKCkgewotICAgIHJldHVybiBjbGFzc0RlZi0+aXNJbnRlcmZhY2UoKTsKLSAgfQotCi0gIGJvb2wgaXNSZWFkeSgpIHsKLSAgICByZXR1cm4gc3RhdHVzID49IGluQ2xpbml0OwotICB9Ci0gIAotICBib29sIGlzUmVzb2x2ZWQoKSB7Ci0gICAgcmV0dXJuIHN0YXR1cyA+PSByZXNvbHZlZDsKLSAgfQotCi0gIHVpbnQ4IGdldEFjY2VzcygpIHsKLSAgICByZXR1cm4gY2xhc3NEZWYtPmFjY2VzczsKLSAgfQotCi0gIGNvbnN0IFVURjgqIGdldE5hbWUoKSB7Ci0gICAgcmV0dXJuIGNsYXNzRGVmLT5uYW1lOwotICB9Ci0KLSAgdm9pZCBnZXREZWNsYXJlZENvbnN0cnVjdG9ycyhzdGQ6OnZlY3RvcjxKYXZhTWV0aG9kKj4mIHJlcywgYm9vbCBwdWJsaWNPbmx5KSB7Ci0gICAgY2xhc3NEZWYtPmdldERlY2xhcmVkQ29uc3RydWN0b3JzKHJlcywgcHVibGljT25seSk7Ci0gIH0KLQotICB2b2lkIGdldERlY2xhcmVkRmllbGRzKHN0ZDo6dmVjdG9yPEphdmFGaWVsZCo+JiByZXMsIGJvb2wgcHVibGljT25seSkgewotICAgIGNsYXNzRGVmLT5nZXREZWNsYXJlZEZpZWxkcyhyZXMsIHB1YmxpY09ubHkpOwotICB9Ci0KLSAgdm9pZCBnZXREZWNsYXJlZE1ldGhvZHMoc3RkOjp2ZWN0b3I8SmF2YU1ldGhvZCo+JiByZXMsIGJvb2wgcHVibGljT25seSkgewotICAgIGNsYXNzRGVmLT5nZXREZWNsYXJlZE1ldGhvZHMocmVzLCBwdWJsaWNPbmx5KTsKLSAgfQotICAKLSAgdm9pZCBpbml0aWFsaXNlQ2xhc3MoSm5qdm0qIHZtKTsKLSAgSmF2YU9iamVjdCogZ2V0Q2xhc3NEZWxlZ2F0ZWUoSm5qdm0qIHZtLCBKYXZhT2JqZWN0KiBwZCA9IDApOwotCi0gIHZvaWQgcmVzb2x2ZUNsYXNzKCk7Ci0KLSAgVXNlckNsYXNzKiBnZXRTdXBlcigpIHsKLSAgICByZXR1cm4gc3VwZXI7Ci0gIH0KLQotICBzdGQ6OnZlY3RvcjxVc2VyQ2xhc3MqPiogZ2V0SW50ZXJmYWNlcygpIHsKLSAgICByZXR1cm4gJmludGVyZmFjZXM7Ci0gIH0KLQotICBDb21tb25DbGFzczo6ZmllbGRfbWFwKiBnZXRTdGF0aWNGaWVsZHMoKSB7Ci0gICAgcmV0dXJuIGNsYXNzRGVmLT5nZXRTdGF0aWNGaWVsZHMoKTsKLSAgfQotICAKLSAgQ29tbW9uQ2xhc3M6OmZpZWxkX21hcCogZ2V0VmlydHVhbEZpZWxkcygpIHsKLSAgICByZXR1cm4gY2xhc3NEZWYtPmdldFZpcnR1YWxGaWVsZHMoKTsKLSAgfQotICAKLSAgQ29tbW9uQ2xhc3M6Om1ldGhvZF9tYXAqIGdldFN0YXRpY01ldGhvZHMoKSB7Ci0gICAgcmV0dXJuIGNsYXNzRGVmLT5nZXRTdGF0aWNNZXRob2RzKCk7Ci0gIH0KLSAgCi0gIENvbW1vbkNsYXNzOjptZXRob2RfbWFwKiBnZXRWaXJ0dWFsTWV0aG9kcygpIHsKLSAgICByZXR1cm4gY2xhc3NEZWYtPmdldFZpcnR1YWxNZXRob2RzKCk7Ci0gIH0KLSAgCi0gIHZvaWQgcmVzb2x2ZVN0YXRpY0NsYXNzKCkgewotICAgICgoQ2xhc3MqKWNsYXNzRGVmKS0+cmVzb2x2ZVN0YXRpY0NsYXNzKCk7Ci0gIH0KLQotCi0gIEphdmFNZXRob2QqIGxvb2t1cE1ldGhvZERvbnRUaHJvdyhjb25zdCBVVEY4KiBuYW1lLCBjb25zdCBVVEY4KiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1N0YXRpYywgYm9vbCByZWN1cnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckNsYXNzKiYgbWV0aG9kQ2wpOwotCi0gIEphdmFNZXRob2QqIGxvb2t1cE1ldGhvZChjb25zdCBVVEY4KiBuYW1lLCBjb25zdCBVVEY4KiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1N0YXRpYywgYm9vbCByZWN1cnNlLCBVc2VyQ2xhc3MqJiBtZXRob2RDbCk7Ci0KLSAgSmF2YUZpZWxkKiBsb29rdXBGaWVsZChjb25zdCBVVEY4KiBuYW1lLCBjb25zdCBVVEY4KiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdGF0aWMsIGJvb2wgcmVjdXJzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyQ29tbW9uQ2xhc3MqJiBmaWVsZENsKTsKLSAgCi0gIEphdmFGaWVsZCogbG9va3VwRmllbGREb250VGhyb3coY29uc3QgVVRGOCogbmFtZSwgY29uc3QgVVRGOCogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU3RhdGljLCBib29sIHJlY3Vyc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckNvbW1vbkNsYXNzKiYgZmllbGRDbCk7Ci0gIAotICAKLSAgdWludDMyIGdldFZpcnR1YWxTaXplKCkgewotICAgIHJldHVybiB2aXJ0dWFsU2l6ZTsKLSAgfQotCi0gIFZpcnR1YWxUYWJsZSogZ2V0VmlydHVhbFZUKCkgewotICAgIHJldHVybiB2aXJ0dWFsVlQ7Ci0gIH0KLQotICB2b2lkIHNldEludGVyZmFjZXMoc3RkOjp2ZWN0b3I8VXNlckNsYXNzKj4gSXMpIHsKLSAgICBpbnRlcmZhY2VzID0gSXM7Ci0gIH0KLQotICB2b2lkIHNldFN1cGVyKFVzZXJDbGFzcyogUykgewotICAgIHN1cGVyID0gUzsKLSAgfQotCi0gIGJvb2wgaW5zdGFudGlhdGlvbk9mQXJyYXkoVXNlckNsYXNzQXJyYXkqIGNsKTsKLSAgYm9vbCBpbXBsZW1lbnRzKFVzZXJDb21tb25DbGFzcyogY2wpOwotCi0gIC8vLyBjb25zdHJ1Y3RNZXRob2QgLSBBZGQgYSBuZXcgbWV0aG9kIGluIHRoaXMgY2xhc3MgbWV0aG9kIG1hcC4KLSAgLy8vCi0gIEphdmFNZXRob2QqIGNvbnN0cnVjdE1ldGhvZChjb25zdCBVVEY4KiBuYW1lLCBjb25zdCBVVEY4KiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIGFjY2VzcykgewotICAgIHJldHVybiBjbGFzc0RlZi0+Y29uc3RydWN0TWV0aG9kKG5hbWUsIHR5cGUsIGFjY2Vzcyk7Ci0gIH0KLSAgCi0gIC8vLyBjb25zdHJ1Y3RGaWVsZCAtIEFkZCBhIG5ldyBmaWVsZCBpbiB0aGlzIGNsYXNzIGZpZWxkIG1hcC4KLSAgLy8vCi0gIEphdmFGaWVsZCogY29uc3RydWN0RmllbGQoY29uc3QgVVRGOCogbmFtZSwgY29uc3QgVVRGOCogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgYWNjZXNzKSB7Ci0gICAgcmV0dXJuIGNsYXNzRGVmLT5jb25zdHJ1Y3RGaWVsZChuYW1lLCB0eXBlLCBhY2Nlc3MpOwotICB9Ci0KLQotICBVc2VyQ2xhc3MqIGxvb2t1cENsYXNzRnJvbU1ldGhvZChKYXZhTWV0aG9kKiBtZXRoKTsKLSAgVXNlckNvbW1vbkNsYXNzKiBnZXRVc2VyQ2xhc3MoQ29tbW9uQ2xhc3MqIGNsKTsKLSAgCi0gIC8vLyBsb2NrVmFyIC0gV2hlbiBtdWx0aXBsZSB0aHJlYWRzIHdhbnQgdG8gaW5pdGlhbGl6ZSBhIGNsYXNzLAotICAvLy8gdGhleSBtdXN0IGJlIHN5bmNocm9uaXplZCBzbyB0aGF0IGl0IGlzIG9ubHkgcGVyZm9ybWVkIG9uY2UKLSAgLy8vIGZvciBhIGdpdmVuIGNsYXNzLgotICBtdm06OkxvY2sqIGxvY2tWYXI7Ci0KLSAgLy8vIGNvbmRWYXIgLSBVc2VkIHRvIHdha2UgdGhyZWFkcyB3YWl0aW5nIG9uIHRoZSBpbml0aWFsaXphdGlvbgotICAvLy8gcHJvY2VzcyBvZiB0aGlzIGNsYXNzLCBkb25lIGJ5IGFub3RoZXIgdGhyZWFkLgotICBtdm06OkNvbmQqIGNvbmRWYXI7Ci0KLSAgLy8vIGFjcXVpcmUgLSBBY3F1aXJlIHRoaXMgY2xhc3MgbG9jay4KLSAgLy8vCi0gIHZvaWQgYWNxdWlyZSgpIHsKLSAgICBsb2NrVmFyLT5sb2NrKCk7Ci0gIH0KLSAgCi0gIC8vLyByZWxlYXNlIC0gUmVsZWFzZSB0aGlzIGNsYXNzIGxvY2suCi0gIC8vLwotICB2b2lkIHJlbGVhc2UoKSB7Ci0gICAgbG9ja1Zhci0+dW5sb2NrKCk7ICAKLSAgfQotICAKLSAgICAvLy8gd2FpdENsYXNzIC0gV2FpdCBmb3IgdGhlIGNsYXNzIHRvIGJlIGxvYWRlZC9pbml0aWFsaXplZC9yZXNvbHZlZC4KLSAgLy8vCi0gIHZvaWQgd2FpdENsYXNzKCkgewotICAgIGNvbmRWYXItPndhaXQobG9ja1Zhcik7Ci0gIH0KLSAgCi0gIC8vLyBicm9hZGNhc3RDbGFzcyAtIFVuYmxvY2sgdGhyZWFkcyB0aGF0IHdlcmUgd2FpdGluZyBvbiB0aGUgY2xhc3MgYmVpbmcKLSAgLy8vIGxvYWRlZC9pbml0aWFsaXplZC9yZXNvbHZlZC4KLSAgLy8vCi0gIHZvaWQgYnJvYWRjYXN0Q2xhc3MoKSB7Ci0gICAgY29uZFZhci0+YnJvYWRjYXN0KCk7ICAKLSAgfQotCi0gIC8vLyBvd25lckNsYXNzIC0gSXMgdGhlIGN1cnJlbnQgdGhyZWFkIHRoZSBvd25lciBvZiB0aGlzIHRocmVhZD8KLSAgLy8vCi0gIGJvb2wgb3duZXJDbGFzcygpIHsKLSAgICByZXR1cm4gbXZtOjpMb2NrOjpzZWxmT3duZXIobG9ja1Zhcik7ICAgIAotICB9Ci0KLSAgY29uc3QgVVRGOCogZ2V0U3VwZXJVVEY4KCl7Ci0gICAgcmV0dXJuIGNsYXNzRGVmLT5zdXBlclVURjg7Ci0gIH0KLQotICBzdGQ6OnZlY3Rvcjxjb25zdCBVVEY4Kj4qIGdldEludGVyZmFjZXNVVEY4KCl7Ci0gICAgcmV0dXJuICZjbGFzc0RlZi0+aW50ZXJmYWNlc1VURjg7Ci0gIH0KLSAgCi0gIFVzZXJDb21tb25DbGFzcygpOwotICAKLSAgdmlydHVhbCB2b2lkIHByaW50KG12bTo6UHJpbnRCdWZmZXIgKmJ1ZikgY29uc3Q7Ci19OwotCi1jbGFzcyBVc2VyQ2xhc3MgOiBwdWJsaWMgVXNlckNvbW1vbkNsYXNzIHsKLXB1YmxpYzoKLSAgc3RhdGljIFZpcnR1YWxUYWJsZSogVlQ7Ci0gIAotICB2aXJ0dWFsIHZvaWQgVFJBQ0VSOwotCi0gIFVzZXJDbGFzcyhKbmp2bUNsYXNzTG9hZGVyKiBKQ0wsIGNvbnN0IFVURjgqIG5hbWUsIEFycmF5VUludDgqIGJ5dGVzKTsKLSAgVXNlckNsYXNzKCkge30KLQotICBKYXZhT2JqZWN0KiBkb05ldyhKbmp2bSogdm0pOwotICAKLSAgc3RkOjp2ZWN0b3I8VXNlckNsYXNzKj4gaW5uZXJDbGFzc2VzOwotICBVc2VyQ2xhc3MqIG91dGVyQ2xhc3M7Ci0KLSAgc3RkOjp2ZWN0b3I8VXNlckNsYXNzKj4qIGdldElubmVyQ2xhc3NlcygpIHsKLSAgICByZXR1cm4gJmlubmVyQ2xhc3NlczsKLSAgfQotCi0gIFVzZXJDbGFzcyogZ2V0T3V0ZXJDbGFzcygpIHsKLSAgICByZXR1cm4gb3V0ZXJDbGFzczsKLSAgfQotICAKLSAgYm9vbCBpbm5lck91dGVyUmVzb2x2ZWQ7Ci0KLSAgdm9pZCByZXNvbHZlSW5uZXJPdXRlckNsYXNzZXMoKTsKLSAgCi0gIHZvaWQgc2V0SW5uZXJBY2Nlc3ModWludDMyIGFjY2VzcykgewotICAgICgoQ2xhc3MqKWNsYXNzRGVmKS0+c2V0SW5uZXJBY2Nlc3MoYWNjZXNzKTsKLSAgfQotCi0gIEphdmFPYmplY3QqIGdldFN0YXRpY0luc3RhbmNlKCkgewotICAgIHJldHVybiBzdGF0aWNJbnN0YW5jZTsKLSAgfQotCi0gIHZvaWQgc2V0U3RhdGljSW5zdGFuY2UoSmF2YU9iamVjdCogb2JqKSB7Ci0gICAgc3RhdGljSW5zdGFuY2UgPSBvYmo7Ci0gIH0KLSAgCi0gIFVzZXJDb25zdGFudFBvb2wqIGdldENvbnN0YW50UG9vbCgpIHsKLSAgICByZXR1cm4gY3RwSW5mbzsKLSAgfQotCi0gIHVpbnQzMiBnZXRTdGF0aWNTaXplKCkgewotICAgIHJldHVybiAoKENsYXNzKiljbGFzc0RlZiktPmdldFN0YXRpY1NpemUoKTsKLSAgfQotCi0gIFZpcnR1YWxUYWJsZSogZ2V0U3RhdGljVlQoKSB7Ci0gICAgcmV0dXJuICgoQ2xhc3MqKWNsYXNzRGVmKS0+Z2V0U3RhdGljVlQoKTsKLSAgfQotICAKLSAgLy8vIGxvYWRQYXJlbnRzIC0gTG9hZHMgYW5kIHJlc29sdmVzIHRoZSBwYXJlbnRzLCBpLmUuIHN1cGVyIGFuZCBpbnRlcmZhcmNlcywKLSAgLy8vIG9mIHRoZSBjbGFzcy4KLSAgLy8vCi0gIHZvaWQgbG9hZFBhcmVudHMoKTsKLQotICBBdHRyaWJ1dCogbG9va3VwQXR0cmlidXQoY29uc3QgVVRGOCogQXR0KSB7Ci0gICAgcmV0dXJuICgoQ2xhc3MqKWNsYXNzRGVmKS0+bG9va3VwQXR0cmlidXQoQXR0KTsKLSAgfQotCi0gIEFycmF5VUludDgqIGdldEJ5dGVzKCkgewotICAgIHJldHVybiAoKENsYXNzKiljbGFzc0RlZiktPmJ5dGVzOwotICB9Ci19OwotCi1jbGFzcyBVc2VyQ2xhc3NBcnJheSA6IHB1YmxpYyBVc2VyQ29tbW9uQ2xhc3MgewotcHVibGljOgotICBzdGF0aWMgVmlydHVhbFRhYmxlKiBWVDsKLSAgVXNlckNvbW1vbkNsYXNzKiBfYmFzZUNsYXNzOwotICBBc3Nlc3NvckRlc2MqIF9mdW5jczsKLQotICB2aXJ0dWFsIHZvaWQgVFJBQ0VSOwotICBVc2VyQ2xhc3NBcnJheShKbmp2bUNsYXNzTG9hZGVyKiBKQ0wsIGNvbnN0IFVURjgqIG5hbWUpOwotICBVc2VyQ2xhc3NBcnJheSgpIHt9Ci0gIAotICB2b2lkIHJlc29sdmVDb21wb25lbnQoKTsKLQotICBVc2VyQ29tbW9uQ2xhc3MqIGJhc2VDbGFzcygpIHsKLSAgICBpZiAoX2Jhc2VDbGFzcyA9PSAwKQotICAgICAgcmVzb2x2ZUNvbXBvbmVudCgpOwotICAgIHJldHVybiBfYmFzZUNsYXNzOwotICB9Ci0KLSAgQXNzZXNzb3JEZXNjKiBmdW5jcygpIHsKLSAgICBpZiAoX2Z1bmNzID09IDApCi0gICAgICByZXNvbHZlQ29tcG9uZW50KCk7Ci0gICAgcmV0dXJuIF9mdW5jczsKLSAgfQotfTsKLQotY2xhc3MgVXNlckNsYXNzUHJpbWl0aXZlIDogcHVibGljIFVzZXJDb21tb25DbGFzcyB7Ci0gIHN0YXRpYyBWaXJ0dWFsVGFibGUqIFZUOwotcHVibGljOgotICAKLSAgdmlydHVhbCB2b2lkIFRSQUNFUjsKLSAgVXNlckNsYXNzUHJpbWl0aXZlKEpuanZtQ2xhc3NMb2FkZXIqIEpDTCwgY29uc3QgVVRGOCogbmFtZSwgdWludDMyIG5iKTsKLX07Ci0KLWNsYXNzIFVzZXJDb25zdGFudFBvb2wgOiBwdWJsaWMgbXZtOjpPYmplY3QgewotcHVibGljOgotICAKLSAgc3RhdGljIFZpcnR1YWxUYWJsZSogVlQ7Ci0gIC8vLyBjdHBSZXMgLSBPYmplY3RzIHJlc29sdmVkIGR5bmFtaWNhbGx5LCBlLmcuIFVURjhzLCBjbGFzc2VzLCBtZXRob2RzLAotICAvLy8gZmllbGRzLCBzdHJpbmdzLgotICAvLy8KLSAgdm9pZCogIGN0cFJlc1sxXTsgCi0gIAotICAvLy8gcmVzb2x2ZU1ldGhvZCAtIFJlc29sdmUgdGhlIGNsYXNzIGFuZCB0aGUgc2lnbmF0dXJlIG9mIHRoZSBtZXRob2QuIE1heQotICAvLy8gcGVyZm9ybSBjbGFzcyBsb2FkaW5nLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBqdXN0IGluIHRpbWUsIGllIHdoZW4KLSAgLy8vIHRoZSBtZXRob2QgY2FsbCBpcyBhY3R1YWxseSBtYWRlIGFuZCBub3QgeWV0IHJlc29sdmVkLgotICAvLy8KLSAgdm9pZCByZXNvbHZlTWV0aG9kKHVpbnQzMiBpbmRleCwgVXNlckNvbW1vbkNsYXNzKiYgY2wsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBVVEY4KiYgdXRmOCwgU2lnbmRlZiomIHNpZ24pOwotICAKLSAgLy8vIHJlc29sdmVGaWVsZCAtIFJlc29sdmUgdGhlIGNsYXNzIGFuZCBzaWduYXR1cmUgb2YgdGhlIGZpZWxkLiBNYXkKLSAgLy8vIHBlcmZvcm0gY2xhc3MgbG9hZGluZy4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQganVzdCBpbiB0aW1lLCBpZSB3aGVuCi0gIC8vLyB0aGUgZmllbGQgaXMgYWNjZXNzZWQgYW5kIG5vdCB5ZXQgcmVzb2x2ZWQuCi0gIC8vLwotICB2b2lkIHJlc29sdmVGaWVsZCh1aW50MzIgaW5kZXgsIFVzZXJDb21tb25DbGFzcyomIGNsLCBjb25zdCBVVEY4KiYgdXRmOCwKLSAgICAgICAgICAgICAgICAgICAgVHlwZWRlZiomIHNpZ24pOwotICAKLSAgVXNlckNsYXNzKiBnZXRDbGFzcygpIGNvbnN0IHsKLSAgICByZXR1cm4gKFVzZXJDbGFzcyopY3RwUmVzWzBdOwotICB9Ci0KLSAgSmF2YUNvbnN0YW50UG9vbCogZ2V0U2hhcmVkUG9vbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gKChDbGFzcyopKGdldENsYXNzKCktPmNsYXNzRGVmKSktPmN0cEluZm87Ci0gIH0KLQotICAvLy8gVVRGOEF0IC0gR2V0IHRoZSBVVEY4IHJlZmVyZW5jZWQgZnJvbSB0aGlzIHN0cmluZyBlbnRyeS4KLSAgLy8vCi0gIGNvbnN0IFVURjgqIFVURjhBdEZvclN0cmluZyh1aW50MzIgZW50cnkpIGNvbnN0IHsKLSAgICByZXR1cm4gZ2V0U2hhcmVkUG9vbCgpLT5VVEY4QXRGb3JTdHJpbmcoZW50cnkpOwotICB9Ci0KLSAgLy8vIGxvYWRDbGFzcyAtIExvYWRzIHRoZSBjbGFzcyBhbmQgcmV0dXJucyBpdC4gVGhpcyBpcyBjYWxsZWQganVzdCBpbiB0aW1lLCAKLSAgLy8vIGllIHdoZW4gdGhlIGNsYXNzIHdpbGwgYmUgdXNlZCBhbmQgbm90IHlldCByZXNvbHZlZC4KLSAgLy8vCi0gIFVzZXJDb21tb25DbGFzcyogbG9hZENsYXNzKHVpbnQzMiBpbmRleCk7Ci0KLSAgdm9pZCogb3BlcmF0b3IgbmV3KHNpemVfdCBzeiwgSmF2YUFsbG9jYXRvciogYWxsb2MsIHVpbnQzMiBzaXplKTsKLSAgCi0gIFVzZXJDb25zdGFudFBvb2woKXt9Ci0KLSAgVXNlckNvbnN0YW50UG9vbChVc2VyQ2xhc3MqIGNsKSB7Ci0gICAgY3RwUmVzWzBdID0gY2w7Ci0gIH0KLQotICBVc2VyQ29tbW9uQ2xhc3MqIGlzQ2xhc3NMb2FkZWQodWludDMyIGVudHJ5KTsKLQotICB2aXJ0dWFsIHZvaWQgcHJpbnQobXZtOjpQcmludEJ1ZmZlciAqYnVmKSBjb25zdDsKLQotfTsKLQotfSAvLyBlbmQgbmFtZXNwYWNlIGpuanZtCi0KLSNlbmRpZiAvLyBKTkpWTV9DTEFTU19JU09MQVRFX0gKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9KMy9Jc29sYXRlL0lzb2xhdGVTaGFyZWRMb2FkZXIuY3BwIGIvdm1raXQvbGliL0ozL0lzb2xhdGUvSXNvbGF0ZVNoYXJlZExvYWRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlOGU4ODQuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL0ozL0lzb2xhdGUvSXNvbGF0ZVNoYXJlZExvYWRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLz09PS0tLS0gSXNvbGF0ZVNoYXJlZExvYWRlci5jcHAgLSBTaGFyZWQgbG9hZGVyIGZvciBpc29sYXRlcyAtLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSm5KVk0KLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgIklzb2xhdGVTaGFyZWRMb2FkZXIuaCIKLSNpbmNsdWRlICJKYXZhQWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAiSmF2YUNsYXNzLmgiCi0jaW5jbHVkZSAiSm5qdm1DbGFzc0xvYWRlci5oIgotI2luY2x1ZGUgIkpuanZtTW9kdWxlLmgiCi0jaW5jbHVkZSAiSm5qdm1Nb2R1bGVQcm92aWRlci5oIgotI2luY2x1ZGUgIkxvY2tlZE1hcC5oIgotCi11c2luZyBuYW1lc3BhY2Ugam5qdm07Ci0KLUpuanZtU2hhcmVkTG9hZGVyKiBKbmp2bVNoYXJlZExvYWRlcjo6c2hhcmVkTG9hZGVyOwotCi1Kbmp2bVNoYXJlZExvYWRlciogSm5qdm1TaGFyZWRMb2FkZXI6OmNyZWF0ZVNoYXJlZExvYWRlcigpIHsKLSAgCi0gIEpuanZtU2hhcmVkTG9hZGVyKiBKQ0wgPSBnY19uZXcoSm5qdm1TaGFyZWRMb2FkZXIpKCk7Ci0gIEpDTC0+VGhlTW9kdWxlID0gbmV3IEpuanZtTW9kdWxlKCJCb290c3RyYXAgSm5KVk0iKTsKLSAgSkNMLT5UaGVNb2R1bGVQcm92aWRlciA9IG5ldyBKbmp2bU1vZHVsZVByb3ZpZGVyKEpDTC0+VGhlTW9kdWxlKTsKLSAgCi0gIEpDTC0+YWxsb2NhdG9yID0gbmV3IEphdmFBbGxvY2F0b3IoKTsKLSAgCi0gIEpDTC0+aGFzaFVURjggPSBuZXcgVVRGOE1hcChKQ0wtPmFsbG9jYXRvciwgMCk7Ci0gIEpDTC0+Y2xhc3NlcyA9IGFsbG9jYXRvcl9uZXcoYWxsb2NhdG9yLCBDbGFzc01hcCkoKTsKLSAgSkNMLT5uYW1lQ2xhc3NlcyA9IG5ldyBTaGFyZWRDbGFzc05hbWVNYXAoKTsKLSAgSkNMLT5ieXRlQ2xhc3NlcyA9IGFsbG9jYXRvcl9uZXcoYWxsb2NhdG9yLCBTaGFyZWRDbGFzc0J5dGVNYXApKCk7Ci0gIEpDTC0+amF2YVR5cGVzID0gbmV3IFR5cGVNYXAoKTsgCi0gIEpDTC0+amF2YVNpZ25hdHVyZXMgPSBuZXcgU2lnbk1hcCgpOyAKLSAgCi0gIHJldHVybiBKQ0w7Ci19Ci0KLUNsYXNzKiBKbmp2bVNoYXJlZExvYWRlcjo6Y29uc3RydWN0U2hhcmVkQ2xhc3MoY29uc3QgVVRGOCogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlVSW50OCogYnl0ZXMpIHsKLSAgYnl0ZUNsYXNzZXMtPmxvY2stPmxvY2soKTsKLSAgU2hhcmVkQ2xhc3NCeXRlTWFwOjppdGVyYXRvciBFbmQgPSBieXRlQ2xhc3Nlcy0+bWFwLmVuZCgpOwotICBTaGFyZWRDbGFzc0J5dGVNYXA6Oml0ZXJhdG9yIEkgPSBieXRlQ2xhc3Nlcy0+bWFwLmZpbmQoYnl0ZXMpOwotICBDbGFzcyogcmVzID0gMDsKLSAgaWYgKEkgPT0gRW5kKSB7Ci0gICAgcmVzID0gbmV3IENsYXNzKHRoaXMsIG5hbWUsIGJ5dGVzKTsKLSAgICBieXRlQ2xhc3Nlcy0+bWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihieXRlcywgcmVzKSk7Ci0gIH0gZWxzZSB7Ci0gICAgcmVzID0gKChDbGFzcyopKEktPnNlY29uZCkpOwotICB9Ci0gIGJ5dGVDbGFzc2VzLT5sb2NrLT51bmxvY2soKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotQ2xhc3NBcnJheSogSm5qdm1TaGFyZWRMb2FkZXI6OmNvbnN0cnVjdFNoYXJlZENsYXNzQXJyYXkoY29uc3QgVVRGOCogbmFtZSkgewotICBuYW1lQ2xhc3Nlcy0+bG9jay0+bG9jaygpOwotICBTaGFyZWRDbGFzc05hbWVNYXA6Oml0ZXJhdG9yIEVuZCA9IG5hbWVDbGFzc2VzLT5tYXAuZW5kKCk7Ci0gIFNoYXJlZENsYXNzTmFtZU1hcDo6aXRlcmF0b3IgSSA9IG5hbWVDbGFzc2VzLT5tYXAuZmluZChuYW1lKTsKLSAgQ2xhc3NBcnJheSogcmVzID0gMDsKLSAgaWYgKEkgPT0gRW5kKSB7Ci0gICAgcmVzID0gbmV3IENsYXNzQXJyYXkodGhpcywgbmFtZSk7Ci0gICAgbmFtZUNsYXNzZXMtPm1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIobmFtZSwgcmVzKSk7Ci0gIH0gZWxzZSB7Ci0gICAgcmVzID0gKChDbGFzc0FycmF5KikoSS0+c2Vjb25kKSk7Ci0gIH0KLSAgbmFtZUNsYXNzZXMtPmxvY2stPnVubG9jaygpOwotICByZXR1cm4gcmVzOwotfQotCi1DbGFzc1ByaW1pdGl2ZSoKLUpuanZtU2hhcmVkTG9hZGVyOjpjb25zdHJ1Y3RTaGFyZWRDbGFzc1ByaW1pdGl2ZShjb25zdCBVVEY4KiBuYW1lLCB1aW50MzIgbmIpIHsKLSAgbmFtZUNsYXNzZXMtPmxvY2stPmxvY2soKTsKLSAgU2hhcmVkQ2xhc3NOYW1lTWFwOjppdGVyYXRvciBFbmQgPSBuYW1lQ2xhc3Nlcy0+bWFwLmVuZCgpOwotICBTaGFyZWRDbGFzc05hbWVNYXA6Oml0ZXJhdG9yIEkgPSBuYW1lQ2xhc3Nlcy0+bWFwLmZpbmQobmFtZSk7Ci0gIENsYXNzUHJpbWl0aXZlKiByZXMgPSAwOwotICBpZiAoSSA9PSBFbmQpIHsKLSAgICByZXMgPSBuZXcgQ2xhc3NQcmltaXRpdmUodGhpcywgbmFtZSwgbmIpOwotICAgIG5hbWVDbGFzc2VzLT5tYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKG5hbWUsIHJlcykpOwotICB9IGVsc2UgewotICAgIHJlcyA9ICgoQ2xhc3NQcmltaXRpdmUqKShJLT5zZWNvbmQpKTsKLSAgfQotICBuYW1lQ2xhc3Nlcy0+bG9jay0+dW5sb2NrKCk7Ci0gIHJldHVybiByZXM7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvSXNvbGF0ZS9Jc29sYXRlU2hhcmVkTG9hZGVyLmggYi92bWtpdC9saWIvSjMvSXNvbGF0ZS9Jc29sYXRlU2hhcmVkTG9hZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNWE0N2QuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL0ozL0lzb2xhdGUvSXNvbGF0ZVNoYXJlZExvYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy89PT0tLS0tIElzb2xhdGVTaGFyZWRMb2FkZXIuaCAtIFNoYXJlZCBsb2FkZXIgZm9yIGlzb2xhdGVzIC0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpuSlZNCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgSVNPTEFURV9TSEFSRURfTE9BREVSX0gKLSNkZWZpbmUgSVNPTEFURV9TSEFSRURfTE9BREVSX0gKLQotI2luY2x1ZGUgIkpuanZtQ2xhc3NMb2FkZXIuaCIKLSNpbmNsdWRlICJTaGFyZWRNYXBzLmgiCi0KLW5hbWVzcGFjZSBqbmp2bSB7Ci0KLWNsYXNzIEpuanZtU2hhcmVkTG9hZGVyIDogcHVibGljIEpuanZtQ2xhc3NMb2FkZXIgewotcHJpdmF0ZToKLSAgCi0gIC8vLyBpbnRlcm5hbExvYWQgLSBMb2FkIHRoZSBjbGFzcyB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAvLy8KLSAgdmlydHVhbCBVc2VyQ2xhc3MqIGludGVybmFsTG9hZChjb25zdCBVVEY4KiB1dGY4KSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJEb24ndCB1c2UgbWUiKTsKLSAgICBhYm9ydCgpOwotICB9Ci0gIAotICBTaGFyZWRDbGFzc0J5dGVNYXAqIGJ5dGVDbGFzc2VzOwotICBTaGFyZWRDbGFzc05hbWVNYXAqIG5hbWVDbGFzc2VzOwotCi1wdWJsaWM6Ci0gIAotICAvLy8gVlQgLSBUaGUgdmlydHVhbCB0YWJsZSBvZiB0aGlzIGNsYXNzLgotICAvLy8KLSAgc3RhdGljIFZpcnR1YWxUYWJsZSogVlQ7Ci0gIAotICB2aXJ0dWFsIHZvaWQgVFJBQ0VSOwotCi0gIC8vLyBjb25zdHJ1Y3RTaGFyZWRDbGFzcyAtIENyZWF0ZSBhIHNoYXJlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2xhc3MuCi0gIC8vLyBJZiB0d28gY2xhc3NlcyBoYXZlIHRoZSBzYW1lIG5hbWUgYnV0IG5vdCB0aGUgc2FtZSBhcnJheSBvZiBieXRlcywgCi0gIC8vLyByYWlzZSBhbiBleGNlcHRpb24uCi0gIC8vLwotICBDbGFzcyogY29uc3RydWN0U2hhcmVkQ2xhc3MoY29uc3QgVVRGOCogbmFtZSwgQXJyYXlVSW50OCogYnl0ZXMpOwotICBDbGFzc0FycmF5KiBjb25zdHJ1Y3RTaGFyZWRDbGFzc0FycmF5KGNvbnN0IFVURjgqIG5hbWUpOwotICBDbGFzc1ByaW1pdGl2ZSogY29uc3RydWN0U2hhcmVkQ2xhc3NQcmltaXRpdmUoY29uc3QgVVRGOCogbmFtZSwgdWludDMyIG5iKTsKLQotICBzdGF0aWMgSm5qdm1TaGFyZWRMb2FkZXIqIGNyZWF0ZVNoYXJlZExvYWRlcigpOwotCi0gIHN0YXRpYyBKbmp2bVNoYXJlZExvYWRlciogc2hhcmVkTG9hZGVyOwotfTsKLQotfSAvLyBlbmQgbmFtZXNwYWNlIGpuanZtCi0KLSNlbmRpZiAvL0lTT0xBVEVfU0hBUkVEX0xPQURFUl9ICmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvSXNvbGF0ZS9NYWtlZmlsZSBiL3Zta2l0L2xpYi9KMy9Jc29sYXRlL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWJkYmQ4Li4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9KMy9Jc29sYXRlL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyM9PT0tIGxpYi9KbkpWTS9DbGFzc3BhdGgvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKLSMgCi0jICAgICAgICAgICAgICAgICAgICAgVGhlIHZta2l0IHByb2plY3QKLSMKLSMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0jIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLSMgCi0jIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIwotTEVWRUwgPSAuLi8uLi8uLgotCi1MSUJSQVJZTkFNRSA9IElzb2xhdGUKLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCi0KLUNYWC5GbGFncyArPSAtSS4uL1ZNQ29yZQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL0ozL0lzb2xhdGUvU2hhcmVkTWFwcy5oIGIvdm1raXQvbGliL0ozL0lzb2xhdGUvU2hhcmVkTWFwcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzI1MDMxLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9KMy9Jc29sYXRlL1NoYXJlZE1hcHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8vPT09LS0tLS0tLSBTaGFyZWRNYXBzLmggLSBNYXBzIGZvciB0aGUgc2hhcmVkIGNsYXNzIGxvYWRlciAtLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKbkpWTQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJMb2NrZWRNYXAuaCIKLQotI2lmbmRlZiBJU09MQVRFX0pOSlZNX1NIQVJFRF9NQVBTX0gKLSNkZWZpbmUgSVNPTEFURV9KTkpWTV9TSEFSRURfTUFQU19ICi0KLW5hbWVzcGFjZSBqbmp2bSB7Ci0KLQotc3RydWN0IGx0YXJyYXkgewotIGJvb2wgb3BlcmF0b3IoKShjb25zdCBBcnJheVVJbnQ4KiBhMSwgY29uc3QgQXJyYXlVSW50OCogYTIpIHsKLSAgaWYgKGExLT5zaXplIDwgYTItPnNpemUpIHJldHVybiB0cnVlOwotICAgIGVsc2UgaWYgKGExLT5zaXplID4gYTItPnNpemUpIHJldHVybiBmYWxzZTsKLSAgICBlbHNlIHJldHVybiBtZW1jbXAoKGNvbnN0IGNoYXIqKWExLT5lbGVtZW50cywgKGNvbnN0IGNoYXIqKWEyLT5lbGVtZW50cywgCi0gICAgICAgICAgICAgICAgICAgICAgIGExLT5zaXplICogc2l6ZW9mKHVpbnQ4KSkgPCAwOwotIH0KLX07Ci0KLQotY2xhc3MgU2hhcmVkQ2xhc3NCeXRlTWFwIDogCi0gICAgcHVibGljIExvY2tlZE1hcDxjb25zdCBBcnJheVVJbnQ4KiwgQ2xhc3MqLCBsdGFycmF5LCBKbmp2bUNsYXNzTG9hZGVyKiA+IHsKLXB1YmxpYzoKLSAgc3RhdGljIFZpcnR1YWxUYWJsZSogVlQ7Ci0gIAotICBTaGFyZWRDbGFzc0J5dGVNYXAoKSB7Ci0gICAgbG9jayA9IG12bTo6TG9jazo6YWxsb2NOb3JtYWwoKTsKLSAgfQotCi0gIH5TaGFyZWRDbGFzc0J5dGVNYXAoKSB7Ci0gICAgZGVsZXRlIGxvY2s7Ci0gIH0KLSAgCi0gIHZpcnR1YWwgdm9pZCBUUkFDRVI7Ci19OwotCi0KLWNsYXNzIFNoYXJlZENsYXNzTmFtZU1hcCA6IAotICAgIHB1YmxpYyBMb2NrZWRNYXA8Y29uc3QgVVRGOCosIENvbW1vbkNsYXNzKiwgbHR1dGY4LCBKbmp2bUNsYXNzTG9hZGVyKiA+IHsKLXB1YmxpYzoKLSAgCi0gIFNoYXJlZENsYXNzTmFtZU1hcCgpIHsKLSAgICBsb2NrID0gbXZtOjpMb2NrOjphbGxvY05vcm1hbCgpOwotICB9Ci0KLSAgflNoYXJlZENsYXNzTmFtZU1hcCgpIHsKLSAgICBkZWxldGUgbG9jazsKLSAgfQotCi19OwotCi19IC8vIGVuZCBuYW1lc3BhY2Ugam5qdm0KLQotI2VuZGlmIC8vSVNPTEFURV9KTkpWTV9TSEFSRURfTUFQU19ICmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvSXNvbGF0ZS9WaXJ0dWFsVGFibGVzLmNwcCBiL3Zta2l0L2xpYi9KMy9Jc29sYXRlL1ZpcnR1YWxUYWJsZXMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWE2NTVmLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9KMy9Jc29sYXRlL1ZpcnR1YWxUYWJsZXMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy89PT0tLS0gVmlydHVhbFRhYmxlcy5jcHAgLSBWaXJ0dWFsIG1ldGhvZHMgZm9yIElzb2xhdGUgb2JqZWN0cyAtLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSAiU2hhcmVkTWFwcy5oIgotI2luY2x1ZGUgIklzb2xhdGVTaGFyZWRMb2FkZXIuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGpuanZtOwotCi0jZGVmaW5lIElOSVQoWCkgVmlydHVhbFRhYmxlKiBYOjpWVCA9IDAKLQotICBJTklUKEpuanZtU2hhcmVkTG9hZGVyKTsKLSAgSU5JVChTaGFyZWRDbGFzc0J5dGVNYXApOwotICBJTklUKFVzZXJDbGFzcyk7Ci0gIElOSVQoVXNlckNsYXNzQXJyYXkpOwotICBJTklUKFVzZXJDb25zdGFudFBvb2wpOwotCi0jdW5kZWYgSU5JVAotCi12b2lkIFVzZXJDbGFzczo6VFJBQ0VSIHsKLSAgY2xhc3NMb2FkZXItPk1BUktfQU5EX1RSQUNFOwotICBkZWxlZ2F0ZWUtPk1BUktfQU5EX1RSQUNFOwotICBzdGF0aWNJbnN0YW5jZS0+TUFSS19BTkRfVFJBQ0U7Ci0gIGN0cEluZm8tPk1BUktfQU5EX1RSQUNFOwotfQotCi12b2lkIFVzZXJDbGFzc1ByaW1pdGl2ZTo6VFJBQ0VSIHsKLSAgY2xhc3NMb2FkZXItPk1BUktfQU5EX1RSQUNFOwotICBkZWxlZ2F0ZWUtPk1BUktfQU5EX1RSQUNFOwotfQotCi12b2lkIFVzZXJDbGFzc0FycmF5OjpUUkFDRVIgewotICBjbGFzc0xvYWRlci0+TUFSS19BTkRfVFJBQ0U7Ci0gIGRlbGVnYXRlZS0+TUFSS19BTkRfVFJBQ0U7Ci19Ci0KLXZvaWQgU2hhcmVkQ2xhc3NCeXRlTWFwOjpUUkFDRVIgewotICBmb3IgKGl0ZXJhdG9yIGkgPSBtYXAuYmVnaW4oKSwgZSA9IG1hcC5lbmQoKTsgaSE9IGU7ICsraSkgewotICAgIGktPmZpcnN0LT5NQVJLX0FORF9UUkFDRTsKLSAgfQotfQotCi12b2lkIEpuanZtU2hhcmVkTG9hZGVyOjpUUkFDRVIgewotICBieXRlQ2xhc3Nlcy0+TUFSS19BTkRfVFJBQ0U7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvTExWTVJ1bnRpbWUvTWFrZWZpbGUgYi92bWtpdC9saWIvSjMvTExWTVJ1bnRpbWUvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNWYzZmYuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL0ozL0xMVk1SdW50aW1lL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyM9PT0tIGxpYi9KbkpWTS9MTFZNUnVudGltZS9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKLSMgCi0jICAgICAgICAgICAgICAgICAgICAgVGhlIHZta2l0IHByb2plY3QKLSMKLSMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0jIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLSMgCi0jIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIwotTEVWRUwgPSAuLi8uLi8uLgotCi1pbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbmZpZwotCi1WTUtJVF9SVU5USU1FID0gJChQUk9KX1NSQ19ESVIpLy4uLy4uL012bS9Db21waWxlci9MTFZNUnVudGltZS5nZW4ubGwgXAotCQkJCQkJCQkkKFBST0pfU1JDX0RJUikvajMtcnVudGltZS5sbAotCi1CVUlMVF9TT1VSQ0VTID0gTExWTVJ1bnRpbWUuaW5jCi0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvTExWTVJ1bnRpbWUvajMtcnVudGltZS5sbCBiL3Zta2l0L2xpYi9KMy9MTFZNUnVudGltZS9qMy1ydW50aW1lLmxsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTdmYTcyLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9KMy9MTFZNUnVudGltZS9qMy1ydW50aW1lLmxsCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ci07Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsgVHlwZSBkZWZpbml0aW9ucyA7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OwotOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKLQotOzs7IFRoZSByb290IG9mIGFsbCBKYXZhIE9iamVjdHM6IGEgVlQgYW5kIGEgbG9jay4KLSVKYXZhT2JqZWN0ID0gdHlwZSB7ICVWVCosIGk4KiB9Ci0KLTs7OyBUeXBlcyBmb3IgSmF2YSBhcnJheXMuIEEgc2l6ZSBvZiAwIG1lYW5zIGFuIHVuZGVmaW5lZCBzaXplLgotJUphdmFBcnJheSA9IHR5cGUgeyAlSmF2YU9iamVjdCwgaTgqIH0KLSVBcnJheURvdWJsZSA9IHR5cGUgeyAlSmF2YU9iamVjdCwgaTgqLCBbMCB4IGRvdWJsZV0gfQotJUFycmF5RmxvYXQgPSB0eXBlIHsgJUphdmFPYmplY3QsIGk4KiwgWzAgeCBmbG9hdF0gfQotJUFycmF5TG9uZyA9IHR5cGUgeyAlSmF2YU9iamVjdCwgaTgqLCBbMCB4IGk2NF0gfQotJUFycmF5T2JqZWN0ID0gdHlwZSB7ICVKYXZhT2JqZWN0LCBpOCosIFswIHggJUphdmFPYmplY3QqXSB9Ci0lQXJyYXlTSW50MTYgPSB0eXBlIHsgJUphdmFPYmplY3QsIGk4KiwgWzAgeCBpMTZdIH0KLSVBcnJheVNJbnQzMiA9IHR5cGUgeyAlSmF2YU9iamVjdCwgaTgqLCBbMCB4IGkzMl0gfQotJUFycmF5U0ludDggPSB0eXBlIHsgJUphdmFPYmplY3QsIGk4KiwgWzAgeCBpOF0gfQotJUFycmF5VUludDE2ID0gdHlwZSB7ICVKYXZhT2JqZWN0LCBpOCosIFswIHggaTE2XSB9Ci0lQXJyYXlVSW50MzIgPSB0eXBlIHsgJUphdmFPYmplY3QsIGk4KiwgWzAgeCBpMzJdIH0KLSVBcnJheVVJbnQ4ID0gdHlwZSB7ICVKYXZhT2JqZWN0LCBpOCosIFswIHggaThdIH0KLQotOzs7IFRoZSB0YXNrIGNsYXNzIG1pcnJvci4KLTs7OyBGaWVsZCAxOiBUaGUgY2xhc3Mgc3RhdGUKLTs7OyBGaWVsZCAyOiBUaGUgaW5pdGlhbGl6YXRpb24gc3RhdGUKLTs7OyBGaWVsZCAzOiBUaGUgc3RhdGljIGluc3RhbmNlCi0lVGFza0NsYXNzTWlycm9yID0gdHlwZSB7IGk4LCBpMSwgaTgqIH0KLQotOzs7IFRoZSBKYXZhIFRocmVhZAotOzs7IEZpZWxkIDE6IFZNVGhyZWFkRGF0YSBwYXJlbnQKLTs7OyBGaWVsZCAyOiB2b2lkKiAgICAgICAgam5pRW52Ci0lSmF2YVRocmVhZCA9IHR5cGUgeyAlVk1UaHJlYWREYXRhLCBpOCogfQotCi0lSmF2YUNvbnN0YW50UG9vbCA9IHR5cGUgeyAlSmF2YUNsYXNzKiwgaTMyLCBpOCosIGkzMiosIGk4KiogfQotCi0lQXR0cmlidXQgPSB0eXBlIHsgJVVURjgqLCBpMzIsIGkzMiB9Ci0KLSVVVEY4ID0gdHlwZSB7ICVKYXZhT2JqZWN0LCBpOCosIFswIHggaTE2XSB9Ci0KLQotJUphdmFGaWVsZCA9IHR5cGUgeyBpOCosIGkxNiwgJVVURjgqLCAlVVRGOCosICVBdHRyaWJ1dCosIGkxNiwgJUphdmFDbGFzcyosIGkzMiwKLSAgICAgICAgICAgICAgICAgICAgaTE2IH0KLQotJUNvZGVMaW5lSW5mbyA9IHR5cGUgeyBpOCosICVKYXZhTWV0aG9kKiwgJUNvZGVMaW5lSW5mbyogfQotCi0lSmF2YU1ldGhvZCA9IHR5cGUgeyBpOCosIGkxNiwgJUF0dHJpYnV0KiwgaTE2LCAlSmF2YUNsYXNzKiwKLSAgICAgICAgICAgICAgICAgICAgICVVVEY4KiwgJVVURjgqLCBpOCwgaTgqLCAlQ29kZUxpbmVJbmZvKiwgaTE2LCBpMzIgfQotCi0lSmF2YUNsYXNzUHJpbWl0aXZlID0gdHlwZSB7ICVKYXZhQ29tbW9uQ2xhc3MsIGkzMiB9Ci0lSmF2YUNsYXNzQXJyYXkgPSB0eXBlIHsgJUphdmFDb21tb25DbGFzcywgJUphdmFDb21tb25DbGFzcyogfQotCi0lSmF2YUNvbW1vbkNsYXNzID0gdHlwZSB7IFsxIHggJUphdmFPYmplY3QqXSwgaTE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAlSmF2YUNsYXNzKiosIGkxNiwgJVVURjgqLCAlSmF2YUNsYXNzKiwgaTgqLCAlVlQqIH0KLQotJUphdmFDbGFzcyA9IHR5cGUgeyAlSmF2YUNvbW1vbkNsYXNzLCBpMzIsIGkzMiwgWzEgeCAlVGFza0NsYXNzTWlycm9yXSwKLSAgICAgICAgICAgICAgICAgICAgJUphdmFGaWVsZCosIGkxNiwgJUphdmFGaWVsZCosIGkxNiwgJUphdmFNZXRob2QqLCBpMTYsCi0gICAgICAgICAgICAgICAgICAgICVKYXZhTWV0aG9kKiwgaTE2LCBpOCosICVBcnJheVVJbnQ4KiwgaTgqLCAlQXR0cmlidXQqLAotICAgICAgICAgICAgICAgICAgICBpMTYsICVKYXZhQ2xhc3MqKiwgaTE2LCAlSmF2YUNsYXNzKiwgaTE2LCBpOCwgaTgsIGkzMiwgaTMyIH0KLQotOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKLTs7Ozs7IENvbnN0YW50IGNhbGxzIGZvciBKbmp2bSBydW50aW1lIGludGVybmFsIG9iamVjdHMgZmllbGQgYWNjZXNzZXMgOzs7Ozs7Ozs7Ci07Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OwotCi07OzsgajNSdW50aW1lSW5pdGlhbGlzZUNsYXNzIC0gSW5pdGlhbGlzZXMgdGhlIGNsYXNzLgotZGVjbGFyZSAlSmF2YUNsYXNzKiBAajNSdW50aW1lSW5pdGlhbGlzZUNsYXNzKCVKYXZhQ2xhc3MqKQotCi07OzsgYXJyYXlMZW5ndGggLSBHZXQgdGhlIGxlbmd0aCBvZiBhbiBhcnJheS4KLWRlY2xhcmUgaTMyIEBhcnJheUxlbmd0aCglSmF2YU9iamVjdCopIHJlYWRub25lIAotCi07OzsgZ2V0VlQgLSBHZXQgdGhlIFZUIG9mIHRoZSBvYmplY3QuCi1kZWNsYXJlICVWVCogQGdldFZUKCVKYXZhT2JqZWN0KikgcmVhZG5vbmUgCi0KLTs7OyBnZXRJTVQgLSBHZXQgdGhlIElNVCBvZiB0aGUgVlQuCi1kZWNsYXJlICVWVCogQGdldElNVCglVlQqKSByZWFkbm9uZSAKLQotOzs7IGdldENsYXNzIC0gR2V0IHRoZSBjbGFzcyBvZiBhbiBvYmplY3QuCi1kZWNsYXJlICVKYXZhQ29tbW9uQ2xhc3MqIEBnZXRDbGFzcyglSmF2YU9iamVjdCopIHJlYWRub25lIAotCi07OzsgZ2V0TG9jayAtIEdldCB0aGUgbG9jayBvZiBhbiBvYmplY3QuCi1kZWNsYXJlIGk4KiBAZ2V0TG9jayglSmF2YU9iamVjdCopCi0KLTs7OyBnZXRWVEZyb21Db21tb25DbGFzcyAtIEdldCB0aGUgVlQgb2YgYSBjbGFzcyBmcm9tIGl0cyBydW50aW1lCi07OzsgcmVwcmVzZW50YXRpb24uCi1kZWNsYXJlICVWVCogQGdldFZURnJvbUNvbW1vbkNsYXNzKCVKYXZhQ29tbW9uQ2xhc3MqKSByZWFkbm9uZSAKLQotOzs7IGdldFZURnJvbUNsYXNzIC0gR2V0IHRoZSBWVCBvZiBhIGNsYXNzIGZyb20gaXRzIHJ1bnRpbWUgcmVwcmVzZW50YXRpb24uCi1kZWNsYXJlICVWVCogQGdldFZURnJvbUNsYXNzKCVKYXZhQ2xhc3MqKSByZWFkbm9uZSAKLQotOzs7IGdldFZURnJvbUNsYXNzQXJyYXkgLSBHZXQgdGhlIFZUIG9mIGFuIGFycmF5IGNsYXNzIGZyb20gaXRzIHJ1bnRpbWUKLTs7OyByZXByZXNlbnRhdGlvbi4KLWRlY2xhcmUgJVZUKiBAZ2V0VlRGcm9tQ2xhc3NBcnJheSglSmF2YUNsYXNzQXJyYXkqKSByZWFkbm9uZSAKLQotOzs7IGdldE9iamVjdFNpemVGcm9tQ2xhc3MgLSBHZXQgdGhlIHNpemUgb2YgYSBjbGFzcyBmcm9tIGl0cyBydW50aW1lCi07OzsgcmVwcmVzZW50YXRpb24uCi1kZWNsYXJlIGkzMiBAZ2V0T2JqZWN0U2l6ZUZyb21DbGFzcyglSmF2YUNsYXNzKikgcmVhZG5vbmUgCi0KLTs7OyBnZXRCYXNlQ2xhc3NWVEZyb21WVCAtIEdldCB0aGUgVlQgb2YgdGhlIGJhc2UgY2xhc3Mgb2YgYW4gYXJyYXksIG9yIHRoZQotOzs7IFZUIG9mIHRoZSBhcnJheSBjbGFzcyBvZiBhIHJlZ3VsYXIgY2xhc3MuCi1kZWNsYXJlICVWVCogQGdldEJhc2VDbGFzc1ZURnJvbVZUKCVWVCopIHJlYWRub25lCi0KLTs7OyBnZXREaXNwbGF5IC0gR2V0IHRoZSBkaXNwbGF5IGFycmF5IG9mIHRoaXMgVlQuCi1kZWNsYXJlICVWVCoqIEBnZXREaXNwbGF5KCVWVCopIHJlYWRub25lIAotCi07OzsgZ2V0VlRJbkRpc3BsYXkgLSBHZXQgdGhlIHN1cGVyIGNsYXNzIGF0IHRoZSBnaXZlbiBvZmZzZXQuCi1kZWNsYXJlICVWVCogQGdldFZUSW5EaXNwbGF5KCVWVCoqLCBpMzIpIHJlYWRub25lIAotCi07OzsgZ2V0RGVwdGggLSBHZXQgdGhlIGRlcHRoIG9mIHRoZSBWVC4KLWRlY2xhcmUgaTMyIEBnZXREZXB0aCglVlQqKSByZWFkbm9uZSAKLQotOzs7IGdldFN0YXRpY0luc3RhbmNlIC0gR2V0IHRoZSBzdGF0aWMgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLWRlY2xhcmUgaTgqIEBnZXRTdGF0aWNJbnN0YW5jZSglSmF2YUNsYXNzKikgcmVhZG5vbmUgCi0KLQotOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKLTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OyBHZW5lcmljIFJ1bnRpbWUgbWV0aG9kcyA7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ci07Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OwotCi07OzsgajNJbnRlcmZhY2VMb29rdXAgLSBVc2VkIGZvciBpbnRlcmZhY2UgY2FsbHMuCi1kZWNsYXJlIGk4KiBAajNJbnRlcmZhY2VMb29rdXAoJUphdmFDbGFzcyosIGkzMiwgLi4uKQotCi07OzsgajNNdWx0aUNhbGxOZXcgLSBBbGxvY2F0ZSBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMuIFRoaXMgd2lsbCBnbyB0bwotOzs7IGFsbG9jYXRpb24gc3BlY2lmaWMgbWV0aG9kcy4KLWRlY2xhcmUgJUphdmFPYmplY3QqIEBqM011bHRpQ2FsbE5ldyglSmF2YUNvbW1vbkNsYXNzKiwgaTMyLCAuLi4pCi0KLTs7OyBpbml0aWFsaXNhdGlvbkNoZWNrIC0gQ2hlY2tzIGlmIHRoZSBjbGFzcyBoYXMgYmVlbiBpbml0aWFsaXplZCBhbmQgCi07OzsgaW5pdGlhbGl6ZXMgaWYgbm90LiBUaGlzIGlzIHVzZWQgZm9yIGluaXRpYWxpemF0aW9uIGJhcnJpZXJzIGluIGFuIGlzb2xhdGUKLTs7OyBlbnZpcm9ubWVudCwgYW5kIGluIHNvbWUgc3BlY2lmaWMgc2NlbmFyaW8gaW4gYSBzaW5nbGUgZW52aXJvbm1lbnQuCi1kZWNsYXJlICVKYXZhQ2xhc3MqIEBpbml0aWFsaXNhdGlvbkNoZWNrKCVKYXZhQ2xhc3MqKSByZWFkbm9uZSAKLQotOzs7IGZvcmNlSW5pdGlhbGlzYXRpb25DaGVjayAtIEZvcmNlIHRvIGNoZWNrIGluaXRpYWxpemF0aW9uLiBUaGUgZGlmZmVyZW5jZQotOzs7IGJldHdlZW4gdGhpcyBmdW5jdGlvbiBhbmQgdGhlIGluaXRpYWxpc2F0aW9uQ2hlY2sgZnVuY3Rpb24gaXMgdGhhdCB0aGUKLTs7OyBsYXR0ZXIgaXMgcmVhZG5vbmUgYW5kIGNhbiB0aHVzIGJlIHJlbW92ZWQuIFRoaXMgZnVuY3Rpb24gaXMgcmVtb3ZlZAotOzs7IGJ5IEpuanZtIGFmdGVyIHRoZSBHVk4gcGFzcywgdGhlcmVmb3JlIGl0IGRvZXMgbm90IGhhdmUgYW4gYWN0dWFsCi07OzsgaW1wbGVtZW50YXRpb24uCi1kZWNsYXJlIHZvaWQgQGZvcmNlSW5pdGlhbGlzYXRpb25DaGVjayglSmF2YUNsYXNzKikKLQotOzs7IGZvcmNlTG9hZGVkQ2hlY2sgLSBGb3JjZSB0byBjaGVjayBpZiB0aGUgY2xhc3Mgd2FzIGxvYWRlZC4gU2luY2Ugd2UgZG8KLTs7OyBub3Qgd2FudCB0byBydW4gSmF2YSBjb2RlIGluIGEgY2FsbGJhY2ssIHdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoZSBjbGFzcwotOzs7IG9mIHRoZSBtZXRob2QgdGhhdCB3ZSB3YW50IHRvIGNvbXBpbGUgaXMgbG9hZGVkLiBUaGlzIGlzIHVzZWQgZm9yCi07OzsgdGhlIGludm9rZXNwZWNpYWwgYnl0ZWNvZGUuCi1kZWNsYXJlIHZvaWQgQGZvcmNlTG9hZGVkQ2hlY2soJUphdmFDb21tb25DbGFzcyopCi0KLTs7OyBnZXRDb25zdGFudFBvb2xBdCAtIEdldCB0aGUgdmFsdWUgaW4gdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhpcyBjbGFzcy4KLTs7OyBUaGlzIGZ1bmN0aW9uIGlzIHJlbW92ZWQgYnkgSm5qdm0gYWZ0ZXIgdGhlIEdWbiBwYXNzLCB0aGVyZWZvcmUgaXQgZG9lcwotOzs7IG5vdCBoYXZlIGFuIGFjdHVhbCBpbXBsZW1lbnRhdGlvbi4KLWRlY2xhcmUgaTgqIEBnZXRDb25zdGFudFBvb2xBdChpOCogKCVKYXZhQ2xhc3MqLCBpMzIsIC4uLikqLCBpOCoqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVKYXZhQ2xhc3MqLCBpMzIsIC4uLikgcmVhZG5vbmUKLQotOzs7IGozVmlydHVhbFRhYmxlTG9va3VwIC0gTG9vayB1cCB0aGUgb2Zmc2V0IGluIGEgdmlydHVhbCB0YWJsZSBvZiBhCi07Ozsgc3BlY2lmaWMgZnVuY3Rpb24uCi1kZWNsYXJlIGkzMiBAajNWaXJ0dWFsVGFibGVMb29rdXAoJUphdmFDbGFzcyosIGkzMiwgaTMyKiwgJUphdmFPYmplY3QqKQotCi07OzsgajNDbGFzc0xvb2t1cCAtIExvb2sgdXAgYSBzcGVjaWZpYyBjbGFzcy4gVGhlIGZ1bmN0aW9uIHRha2VzIGEgY2xhc3MgYW5kCi07OzsgYW4gaW5kZXggdG8gbG9va3VwIGluIHRoZSBjb25zdGFudCBwb29sIGFuZCByZXR1cm5zIGFuZCBzdG9yZXMgaXQgaW4gdGhlCi07OzsgY29uc3RhbnQgcG9vbCBjYWNoZS4KLWRlY2xhcmUgaTgqIEBqM0NsYXNzTG9va3VwKCVKYXZhQ2xhc3MqLCBpMzIsIC4uLikKLQotOzs7IGozVmlydHVhbEZpZWxkTG9va3VwIC0gTG9vayB1cCBhIHNwZWNpZmljIHZpcnR1YWwgZmllbGQuCi1kZWNsYXJlIGk4KiBAajNWaXJ0dWFsRmllbGRMb29rdXAoJUphdmFDbGFzcyosIGkzMiwgLi4uKQotCi07OzsgajNTdGF0aWNGaWVsZExvb2t1cCAtIExvb2sgdXAgYSBzcGVjaWZpYyBzdGF0aWMgZmllbGQuCi1kZWNsYXJlIGk4KiBAajNTdGF0aWNGaWVsZExvb2t1cCglSmF2YUNsYXNzKiwgaTMyLCAuLi4pCi0KLTs7OyBqM1N0cmluZ0xvb2t1cCAtIEdldCBhIHBvaW50ZXIgb24gYSBzdHJpbmcuCi1kZWNsYXJlIGk4KiBAajNTdHJpbmdMb29rdXAoJUphdmFDbGFzcyosIGkzMiwgLi4uKSByZWFkbm9uZQotCi07OzsgajNKYXZhT2JqZWN0QXF1aXJlIC0gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBzdGFydGluZyBhIHN5bmNocm9uaXplZAotOzs7IGJsb2NrIG9yIG1ldGhvZC4KLWRlY2xhcmUgdm9pZCBAajNKYXZhT2JqZWN0QXF1aXJlKCVKYXZhT2JqZWN0KikKLQotOzs7IGozSmF2YU9iamVjdFJlbGVhc2UgLSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGxlYXZpbmcgYSBzeW5jaHJvbml6ZWQKLTs7OyBibG9jayBvciBtZXRob2QuCi1kZWNsYXJlIHZvaWQgQGozSmF2YU9iamVjdFJlbGVhc2UoJUphdmFPYmplY3QqKQotCi07OzsgaXNBc3NpZ25hYmxlRnJvbSAtIFJldHVybnMgaWYgYSB0eXBlIGlzIGEgc3VidHlwZSBvZiBhbm90aGVyIHR5cGUuCi1kZWNsYXJlIGkxIEBpc0Fzc2lnbmFibGVGcm9tKCVWVCosICVWVCopIHJlYWRub25lCi0KLTs7OyBpc1NlY29uZGFyeUNsYXNzIC0gUmV0dXJucyBpZiBhIHR5cGUgaXMgYSBzZWNvbmRhcnkgc3VwZXIgdHlwZSBvZgotOzs7IGFub3RoZXIgdHlwZS4KLWRlY2xhcmUgaTEgQGlzU2Vjb25kYXJ5Q2xhc3MoJVZUKiwgJVZUKikgcmVhZG5vbmUKLQotOzs7IGdldENsYXNzRGVsZWdhdGVlIC0gUmV0dXJucyB0aGUgamF2YS9sYW5nL0NsYXNzIHJlcHJlc2VudGF0aW9uIG9mIHRoZQotOzs7IGNsYXNzLiBUaGlzIG1ldGhvZCBpcyBsb3dlcmVkIHRvIHRoZSBHRVAgdG8gdGhlIGNsYXNzIGRlbGVnYXRlZSBpbgotOzs7IHRoZSBjb21tb24gY2xhc3MuCi1kZWNsYXJlICVKYXZhT2JqZWN0KiBAZ2V0Q2xhc3NEZWxlZ2F0ZWUoJUphdmFDb21tb25DbGFzcyopCi0KLTs7OyBqM1J1bnRpbWVEZWxlZ2F0ZWUgLSBSZXR1cm5zIHRoZSBqYXZhL2xhbmcvQ2xhc3MgcmVwcmVzZW50YXRpb24gb2YgdGhlCi07OzsgY2xhc3MuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpZiB0aGUgY2xhc3MgZGVsZWdhdGVlIGhhcyBub3QgYmVlbiBjcmVhdGVkCi07OzsgeWV0LgotZGVjbGFyZSAlSmF2YU9iamVjdCogQGozUnVudGltZURlbGVnYXRlZSglSmF2YUNvbW1vbkNsYXNzKikKLQotOzs7IGozR2V0QXJyYXlDbGFzcyAtIEdldCB0aGUgYXJyYXkgdXNlciBjbGFzcyBvZiB0aGUgdXNlciBjbGFzcy4KLWRlY2xhcmUgJVZUKiBAajNHZXRBcnJheUNsYXNzKCVKYXZhQ2xhc3MqLCBpMzIsICVWVCoqKSByZWFkbm9uZQotCi1kZWNsYXJlIGk4IEBnZXRGaW5hbEludDhGaWVsZChpOCopIHJlYWRub25lCi1kZWNsYXJlIGkxNiBAZ2V0RmluYWxJbnQxNkZpZWxkKGkxNiopIHJlYWRub25lCi1kZWNsYXJlIGkzMiBAZ2V0RmluYWxJbnQzMkZpZWxkKGkzMiopIHJlYWRub25lCi1kZWNsYXJlIGk2NCBAZ2V0RmluYWxMb25nRmllbGQoaTY0KikgcmVhZG5vbmUKLWRlY2xhcmUgZG91YmxlIEBnZXRGaW5hbERvdWJsZUZpZWxkKGRvdWJsZSopIHJlYWRub25lCi1kZWNsYXJlIGZsb2F0IEBnZXRGaW5hbEZsb2F0RmllbGQoZmxvYXQqKSByZWFkbm9uZQotCi1kZWNsYXJlIGk4KiBAajNSZXNvbHZlVmlydHVhbFN0dWIoJUphdmFPYmplY3QqKQotZGVjbGFyZSBpOCogQGozUmVzb2x2ZVNwZWNpYWxTdHViKCkKLWRlY2xhcmUgaTgqIEBqM1Jlc29sdmVTdGF0aWNTdHViKCkKLWRlY2xhcmUgaTgqIEBqM1Jlc29sdmVJbnRlcmZhY2UoJUphdmFPYmplY3QqLCAlSmF2YU1ldGhvZCosIGkzMikKLQotOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKLTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7IEV4Y2VwdGlvbiBtZXRob2RzIDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ci07Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OwotCi1kZWNsYXJlICVKYXZhT2JqZWN0KiBAajNOdWxsUG9pbnRlckV4Y2VwdGlvbigpCi1kZWNsYXJlICVKYXZhT2JqZWN0KiBAajNDbGFzc0Nhc3RFeGNlcHRpb24oJUphdmFPYmplY3QqLCAlSmF2YUNvbW1vbkNsYXNzKikKLWRlY2xhcmUgJUphdmFPYmplY3QqIEBqM0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oJUphdmFPYmplY3QqLCBpMzIpCi1kZWNsYXJlICVKYXZhT2JqZWN0KiBAajNOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbihpMzIpCi1kZWNsYXJlICVKYXZhT2JqZWN0KiBAajNPdXRPZk1lbW9yeUVycm9yKGkzMikKLWRlY2xhcmUgJUphdmFPYmplY3QqIEBqM1N0YWNrT3ZlcmZsb3dFcnJvcigpCi1kZWNsYXJlICVKYXZhT2JqZWN0KiBAajNBcnJheVN0b3JlRXhjZXB0aW9uKCVWVCosICVWVCopCi1kZWNsYXJlICVKYXZhT2JqZWN0KiBAajNBcml0aG1ldGljRXhjZXB0aW9uKCkKLWRlY2xhcmUgdm9pZCBAajNUaHJvd0V4Y2VwdGlvbiglSmF2YU9iamVjdCopCi1kZWNsYXJlIHZvaWQgQGozVGhyb3dFeGNlcHRpb25Gcm9tSklUKCkKLQotZGVjbGFyZSB2b2lkIEBqM0VuZEpOSShpMzIqKikKLWRlY2xhcmUgdm9pZCBAajNTdGFydEpOSShpMzIqLCBpMzIqKiwgaTgqKQotCi0KLTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ci07Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OyBEZWJ1Z2dpbmcgbWV0aG9kcyA7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OwotOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKLQotZGVjbGFyZSB2b2lkIEBqM1ByaW50RXhlY3V0aW9uKGkzMiwgaTMyLCAlSmF2YU1ldGhvZCopCi1kZWNsYXJlIHZvaWQgQGozUHJpbnRNZXRob2RTdGFydCglSmF2YU1ldGhvZCopCi1kZWNsYXJlIHZvaWQgQGozUHJpbnRNZXRob2RFbmQoJUphdmFNZXRob2QqKQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL0ozL01ha2VmaWxlIGIvdm1raXQvbGliL0ozL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Zjk1MWQ2Li4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9KMy9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjPT09LSBsaWIvSm5KVk0vTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCi0jIAotIyAgICAgICAgICAgICAgICAgICAgIFRoZSB2bWtpdCBwcm9qZWN0Ci0jCi0jIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0jIAotIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKLUxFVkVMID0gLi4vLi4KLQotRElSUyA9IExMVk1SdW50aW1lIFZNQ29yZSBDbGFzc3BhdGggQ29tcGlsZXIKLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb25maWcKLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCi0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9KMy9SRUFETUUudHh0IGIvdm1raXQvbGliL0ozL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZDRiNzcuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL0ozL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi1HTlUgQ2xhc3NwYXRoCi1DdXJyZW50IHZlcnNpb24gMC45Ny4yLiBVc2UgZWNqIHRvIGNvbXBpbGUgQ2xhc3NwYXRoLgotCi0gIGEgLSB1bnppcCBjbGFzc3BhdGgKLSAgICAgIHRhciAteHpmIGNsYXNzcGF0aC0wLjk3LjIKLSAgYiAtIGNvbXBpbGUgY2xhc3NwYXRoCi0gICAgICBjZCBjbGFzc3BhdGgtMC45Ny4yCi0gICAgICAuL2NvbmZpZ3VyZSAtLWRpc2FibGUtcGx1Z2luIC0tZGlzYWJsZS1leGFtcGxlcyAmJiBtYWtlCi0KLUlNUE9SVEFOVDogZm9yIGxvY2FsIHVzZQotY2QgY2xhc3NwYXRoLXgueS9saWI7Ci1sbiAtcyAuLi9uYXRpdmUvam5pL2d0ay1wZWVyLy5saWJzL2xpYmd0a3BlZXIuc287Ci1sbiAtcyAuLi9uYXRpdmUvam5pL2djb25mLXBlZXIvLmxpYnMvbGliZ2NvbmZwZWVyLnNvOwotbG4gLXMgLi4vbmF0aXZlL2puaS9qYXZhLWlvLy5saWJzL2xpYmphdmFpby5zbzsKLWxuIC1zIC4uL25hdGl2ZS9qbmkvamF2YS1sYW5nLy5saWJzL2xpYmphdmFsYW5ncmVmbGVjdC5zbzsKLWxuIC1zIC4uL25hdGl2ZS9qbmkvamF2YS1sYW5nLy5saWJzL2xpYmphdmFsYW5nLnNvOwotbG4gLXMgLi4vbmF0aXZlL2puaS9qYXZhLW5ldC8ubGlicy9saWJqYXZhbmV0LnNvOwotbG4gLXMgLi4vbmF0aXZlL2puaS9qYXZhLW5pby8ubGlicy9saWJqYXZhbmlvLnNvOwotbG4gLXMgLi4vbmF0aXZlL2puaS9qYXZhLXV0aWwvLmxpYnMvbGliamF2YXV0aWwuc287Ci0KLU9yIGZvciBEYXJ3aW4KLWxuIC1zIC4uL25hdGl2ZS9qbmkvZ3RrLXBlZXIvLmxpYnMvbGliZ3RrcGVlci5keWxpYjsKLWxuIC1zIC4uL25hdGl2ZS9qbmkvZ2NvbmYtcGVlci8ubGlicy9saWJnY29uZnBlZXIuZHlsaWI7Ci1sbiAtcyAuLi9uYXRpdmUvam5pL2phdmEtaW8vLmxpYnMvbGliamF2YWlvLmR5bGliOwotbG4gLXMgLi4vbmF0aXZlL2puaS9qYXZhLWxhbmcvLmxpYnMvbGliamF2YWxhbmdyZWZsZWN0LmR5bGliOwotbG4gLXMgLi4vbmF0aXZlL2puaS9qYXZhLWxhbmcvLmxpYnMvbGliamF2YWxhbmcuZHlsaWI7Ci1sbiAtcyAuLi9uYXRpdmUvam5pL2phdmEtbmV0Ly5saWJzL2xpYmphdmFuZXQuZHlsaWI7Ci1sbiAtcyAuLi9uYXRpdmUvam5pL2phdmEtbmlvLy5saWJzL2xpYmphdmFuaW8uZHlsaWI7Ci1sbiAtcyAuLi9uYXRpdmUvam5pL2phdmEtdXRpbC8ubGlicy9saWJqYXZhdXRpbC5keWxpYjsKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9KMy9WTUNvcmUvSk5JUmVmZXJlbmNlcy5oIGIvdm1raXQvbGliL0ozL1ZNQ29yZS9KTklSZWZlcmVuY2VzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNGU4MzMuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL0ozL1ZNQ29yZS9KTklSZWZlcmVuY2VzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vLz09PS0tLS0tLS0tLSBKTklSZWZlcmVuY2VzLmNwcCAtIE1hbmFnZW1lbnQgb2YgSk5JIHJlZmVyZW5jZXMgLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2lmbmRlZiBKTklfUkVGRVJFTkNFU19ICi0jZGVmaW5lIEpOSV9SRUZFUkVOQ0VTX0gKLQotI2luY2x1ZGUgIm12bS9BbGxvY2F0b3IuaCIKLQotbmFtZXNwYWNlIGozIHsKLQotY2xhc3MgSmF2YU9iamVjdDsKLWNsYXNzIEphdmFUaHJlYWQ7Ci0KLSNkZWZpbmUgTUFYSU1VTV9SRUZFUkVOQ0VTIDEwMAotCi1jbGFzcyBKTklMb2NhbFJlZmVyZW5jZXMgewotICBmcmllbmQgY2xhc3MgSmF2YVRocmVhZDsKLQotcHJpdmF0ZToKLSAgSk5JTG9jYWxSZWZlcmVuY2VzKiBwcmV2OwotICB1aW50MzJfdCBsZW5ndGg7Ci0JbXZtOjpnYyogbG9jYWxSZWZlcmVuY2VzW01BWElNVU1fUkVGRVJFTkNFU107Ci0KLXB1YmxpYzoKLSAgCi0gIEpOSUxvY2FsUmVmZXJlbmNlcygpIHsKLSAgICBwcmV2ID0gMDsKLSAgICBsZW5ndGggPSAwOwotICB9Ci0KLQltdm06OmdjKiogYWRkSk5JUmVmZXJlbmNlKEphdmFUaHJlYWQqIHRoLCBtdm06OmdjKiBvYmopOwotCi0gIHZvaWQgcmVtb3ZlSk5JUmVmZXJlbmNlcyhKYXZhVGhyZWFkKiB0aCwgdWludDMyX3QgbnVtKTsKLQotfTsKLQotY2xhc3MgSk5JR2xvYmFsUmVmZXJlbmNlcyB7Ci0gIGZyaWVuZCBjbGFzcyBKbmp2bTsKLQotcHJpdmF0ZToKLSAgSk5JR2xvYmFsUmVmZXJlbmNlcyogbmV4dDsKLSAgSk5JR2xvYmFsUmVmZXJlbmNlcyogcHJldjsKLSAgdWludDMyX3QgbGVuZ3RoOwotICB1aW50MzJfdCBjb3VudDsKLSAgSmF2YU9iamVjdCogZ2xvYmFsUmVmZXJlbmNlc1tNQVhJTVVNX1JFRkVSRU5DRVNdOwotCi0KLXB1YmxpYzoKLSAgSk5JR2xvYmFsUmVmZXJlbmNlcygpIHsKLSAgICBuZXh0ID0gMDsKLSAgICBwcmV2ID0gMDsKLSAgICBsZW5ndGggPSAwOwotICAgIGNvdW50ID0gMDsKLSAgfQotCi0gIEphdmFPYmplY3QqKiBhZGRKTklSZWZlcmVuY2UoSmF2YU9iamVjdCogb2JqKSB7Ci0gICAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgICBpZiAobGVuZ3RoID09IE1BWElNVU1fUkVGRVJFTkNFUykgewotICAgICAgaWYgKCFuZXh0KSB7Ci0gICAgICAgIG5leHQgPSBuZXcgSk5JR2xvYmFsUmVmZXJlbmNlcygpOwotICAgICAgICBuZXh0LT5wcmV2ID0gdGhpczsKLSAgICAgIH0KLSAgICAgIHJldHVybiBuZXh0LT5hZGRKTklSZWZlcmVuY2Uob2JqKTsKLSAgICB9IGVsc2UgewotICAgICAgKytjb3VudDsKLSAgICAgIGdsb2JhbFJlZmVyZW5jZXNbbGVuZ3RoXSA9IG9iajsKLSAgICAgIHJldHVybiAmZ2xvYmFsUmVmZXJlbmNlc1tsZW5ndGgrK107Ci0gICAgfQotICB9Ci0KLSAgdm9pZCByZW1vdmVKTklSZWZlcmVuY2UoSmF2YU9iamVjdCoqIG9iaikgewotICAgIGlmICgoKHVpbnRwdHJfdClvYmogPj0gKHVpbnRwdHJfdClnbG9iYWxSZWZlcmVuY2VzKSAmJgotICAgICAgICAoKHVpbnRwdHJfdClvYmopIDwgKHVpbnRwdHJfdCkoZ2xvYmFsUmVmZXJlbmNlcyArIE1BWElNVU1fUkVGRVJFTkNFUykpIHsKLSAgICAgICpvYmogPSAwOwotICAgICAgLS1jb3VudDsKLSAgICB9IGVsc2UgewotICAgICAgYXNzZXJ0KG5leHQgJiYgIk5vIGdsb2JhbCByZWZlcmVuY2UgbG9jYXRlZCB0aGVyZSIpOwotICAgICAgbmV4dC0+cmVtb3ZlSk5JUmVmZXJlbmNlKG9iaik7Ci0gICAgfQotICB9Ci19OwotCi19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL0ozL1ZNQ29yZS9KYXZhQWNjZXNzLmggYi92bWtpdC9saWIvSjMvVk1Db3JlL0phdmFBY2Nlc3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI1Mzc4OC4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvSjMvVk1Db3JlL0phdmFBY2Nlc3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0gSmF2YUFjY2Vzcy5oIC0gSmF2YSBhY2Nlc3MgZGVzY3JpcHRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vIFRoaXMgZmlsZSBkZWZpbmVzIG1hY3JvcyBhbmQgZnVuY3Rpb25zIGZvciBrbm93aW5nIGFuZCBjaGVja2luZyB0aGUgYWNjZXNzCi0vLyB0eXBlIG9mIEphdmEgY2xhc3MsIGZpZWxkcyBvciBtZXRob2RzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgSk5KVk1fSkFWQV9BQ0NFU1NfSAotI2RlZmluZSBKTkpWTV9KQVZBX0FDQ0VTU19ICi0KLW5hbWVzcGFjZSBqMyB7Ci0KLSNkZWZpbmUgQUNDX1BVQkxJQyAgICAgICAweDAwMDEKLSNkZWZpbmUgQUNDX1BSSVZBVEUgICAgICAweDAwMDIKLSNkZWZpbmUgQUNDX1BST1RFQ1RFRCAgICAweDAwMDQKLSNkZWZpbmUgQUNDX1ZJUlRVQUwgICAgICAweDAwMDAKLSNkZWZpbmUgQUNDX1NUQVRJQyAgICAgICAweDAwMDgKLSNkZWZpbmUgQUNDX0ZJTkFMICAgICAgICAweDAwMTAKLSNkZWZpbmUgQUNDX1NZTkNIUk9OSVpFRCAweDAwMjAKLSNkZWZpbmUgQUNDX1NVUEVSICAgICAgICAweDAwMjAKLSNkZWZpbmUgQUNDX1ZPTEFUSUxFICAgICAweDAwNDAKLSNkZWZpbmUgQUNDX1RSQU5TSUVOVCAgICAweDAwODAKLSNkZWZpbmUgQUNDX05BVElWRSAgICAgICAweDAxMDAKLSNkZWZpbmUgQUNDX0lOVEVSRkFDRSAgICAweDAyMDAKLSNkZWZpbmUgQUNDX0FCU1RSQUNUICAgICAweDA0MDAKLSNkZWZpbmUgQUNDX1NUUklDVCAgICAgICAweDA4MDAKLSNkZWZpbmUgQUNDX1NZTlRIRVRJQyAgICAweDEwMDAKLQotI2RlZmluZSBKTkpWTV9DTEFTUyAgICAgIDB4MTAwMAotI2RlZmluZSBKTkpWTV9BUlJBWSAgICAgIDB4MjAwMAotI2RlZmluZSBKTkpWTV9QUklNSVRJVkUgIDB4NDAwMAotCi0jZGVmaW5lIE1LX1ZFUklGSUVSKG5hbWUsIGZsYWcpICAgICAgICAgICAgICAgICAgIFwKLSAgaW5saW5lIGJvb2wgbmFtZSh1bnNpZ25lZCBpbnQgcGFyYW0pIHsgICAgICAgICAgXAotICAgIHJldHVybiAoZmxhZyAmIHBhcmFtKSAhPSAwOyAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQotTUtfVkVSSUZJRVIoaXNTdGF0aWMsICAgICBBQ0NfU1RBVElDKQotTUtfVkVSSUZJRVIoaXNOYXRpdmUsICAgICBBQ0NfTkFUSVZFKQotTUtfVkVSSUZJRVIoaXNJbnRlcmZhY2UsICBBQ0NfSU5URVJGQUNFKQotTUtfVkVSSUZJRVIoaXNTeW5jaHJvLCAgICBBQ0NfU1lOQ0hST05JWkVEKQotTUtfVkVSSUZJRVIoaXNQdWJsaWMsICAgICBBQ0NfUFVCTElDKQotTUtfVkVSSUZJRVIoaXNQcml2YXRlLCAgICBBQ0NfUFJJVkFURSkKLU1LX1ZFUklGSUVSKGlzQWJzdHJhY3QsICAgQUNDX0FCU1RSQUNUKQotTUtfVkVSSUZJRVIoaXNQcm90ZWN0ZWQsICBBQ0NfUFJPVEVDVEVEKQotTUtfVkVSSUZJRVIoaXNGaW5hbCwgICAgICBBQ0NfRklOQUwpCi1NS19WRVJJRklFUihpc1N1cGVyLCAgICAgIEFDQ19TVVBFUikKLU1LX1ZFUklGSUVSKGlzU3ludGhldGljLCAgQUNDX1NZTlRIRVRJQykKLQotCi1pbmxpbmUgYm9vbCBpc1ZpcnR1YWwodW5zaWduZWQgaW50IHBhcmFtKSB7Ci0gICAgcmV0dXJuICEoQUNDX1NUQVRJQyAmIHBhcmFtKTsKLX0KLQotTUtfVkVSSUZJRVIoaXNDbGFzcywgICAgICBKTkpWTV9DTEFTUykKLU1LX1ZFUklGSUVSKGlzUHJpbWl0aXZlLCAgSk5KVk1fUFJJTUlUSVZFKQotTUtfVkVSSUZJRVIoaXNBcnJheSwgICAgICBKTkpWTV9BUlJBWSkKLQotCi0jdW5kZWYgTUtfVkVSSUZJRVIKLQotfSAvLyBlbmQgbmFtZXNwYWNlIGozCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL0ozL1ZNQ29yZS9KYXZhQXJyYXkuY3BwIGIvdm1raXQvbGliL0ozL1ZNQ29yZS9KYXZhQXJyYXkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjcwMzRhLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9KMy9WTUNvcmUvSmF2YUFycmF5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0gSmF2YUFycmF5LmNwcCAtIEphdmEgYXJyYXlzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSA8Y3N0ZGFyZz4KLSNpbmNsdWRlIDxjc3RkbGliPgotCi0jaW5jbHVkZSAiSmF2YUFycmF5LmgiCi0jaW5jbHVkZSAiSmF2YUNsYXNzLmgiCi0jaW5jbHVkZSAiSmF2YU9iamVjdC5oIgotI2luY2x1ZGUgIkphdmFUeXBlcy5oIgotI2luY2x1ZGUgIkpuanZtLmgiCi0jaW5jbHVkZSAiSmF2YVRocmVhZC5oIgotI2luY2x1ZGUgIkphdmFVcGNhbGxzLmgiCi0jaW5jbHVkZSAiTG9ja2VkTWFwLmgiCi0KLQotdXNpbmcgbmFtZXNwYWNlIGozOwotCi0vLy8gVGhpcyB2YWx1ZSBpcyB0aGUgc2FtZSB2YWx1ZSB0aGFuIElCTSdzIEpWTS4KLWNvbnN0IHNpbnQzMiBKYXZhQXJyYXk6Ok1heEFycmF5U2l6ZSA9IDI2ODQzNTQ1NTsKLQotLy8vIFRoZSBKVk0gZGVmaW5lcyBjb25zdGFudHMgZm9yIHJlZmVyZW5jaW5nIGFycmF5cyBvZiBwcmltaXRpdmUgdHlwZXMuCi1jb25zdCB1bnNpZ25lZCBpbnQgSmF2YUFycmF5OjpUX0JPT0xFQU4gPSA0OwotY29uc3QgdW5zaWduZWQgaW50IEphdmFBcnJheTo6VF9DSEFSID0gNTsKLWNvbnN0IHVuc2lnbmVkIGludCBKYXZhQXJyYXk6OlRfRkxPQVQgPSA2OwotY29uc3QgdW5zaWduZWQgaW50IEphdmFBcnJheTo6VF9ET1VCTEUgPSA3OwotY29uc3QgdW5zaWduZWQgaW50IEphdmFBcnJheTo6VF9CWVRFID0gODsKLWNvbnN0IHVuc2lnbmVkIGludCBKYXZhQXJyYXk6OlRfU0hPUlQgPSA5OwotY29uc3QgdW5zaWduZWQgaW50IEphdmFBcnJheTo6VF9JTlQgPSAxMDsKLWNvbnN0IHVuc2lnbmVkIGludCBKYXZhQXJyYXk6OlRfTE9ORyA9IDExOwpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL0ozL1ZNQ29yZS9KYXZhQXJyYXkuaCBiL3Zta2l0L2xpYi9KMy9WTUNvcmUvSmF2YUFycmF5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1Zjc4YWUuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL0ozL1ZNQ29yZS9KYXZhQXJyYXkuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tIEphdmFBcnJheS5oIC0gSmF2YSBhcnJheXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgSmF2YSBhcnJheXMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2lmbmRlZiBKTkpWTV9KQVZBX0FSUkFZX0gKLSNkZWZpbmUgSk5KVk1fSkFWQV9BUlJBWV9ICi0KLSNpbmNsdWRlICJtdm0vQWxsb2NhdG9yLmgiCi0KLSNpbmNsdWRlICJ0eXBlcy5oIgotCi0jaW5jbHVkZSAiSmF2YU9iamVjdC5oIgotCi0jaW5jbHVkZSAiVVRGOC5oIgotCi1uYW1lc3BhY2UgajMgewotCi1jbGFzcyBDbGFzc0FycmF5OwotY2xhc3MgQ29tbW9uQ2xhc3M7Ci1jbGFzcyBKYXZhT2JqZWN0OwotY2xhc3MgSm5qdm07Ci0KLS8vLyBUSmF2YUFycmF5IC0gVGVtcGxhdGUgY2xhc3MgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IHJlYWwgYXJyYXlzLiBBbGwgYXJyYXlzCi0vLy8gIGhhdmUgYSBjb25zdGFudCBzaXplIGFuZCBhbiBhcnJheSBvZiBlbGVtZW50LiBXaGVuIEpuSlZNIGFsbG9jYXRlcyBhbgotLy8vICBpbnN0YW50aWF0aW9uIG9mIHRoaXMgY2xhc3MsIGl0IGFsbG9jYXRlcyB3aXRoIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGlzCi0vLy8gIGFycmF5LiBIZW5jZSBpbnN0YW50aWF0aW9uIG9mIFRKYXZhQXJyYXlzIGhhdmUgYSBsYXlvdXQgb2YgCi0vLy8gIHtKYXZhT2JqZWN0LCBzaXplLCBbMCAqIFRdfS4KLXRlbXBsYXRlIDxjbGFzcyBUPgotY2xhc3MgVEphdmFBcnJheSA6IHB1YmxpYyBKYXZhT2JqZWN0IHsKLXB1YmxpYzoKLSAgLy8vIHNpemUgLSBUaGUgKGNvbnN0YW50KSBzaXplIG9mIHRoZSBhcnJheS4KLSAgc3NpemVfdCBzaXplOwotCi0gIC8vLyBlbGVtZW50cyAtIEVsZW1lbnRzIG9mIHRoaXMgYXJyYXkuIFRoZSBzaXplIGhlcmUgaXMgZGlmZmVyZW50IHRoYW4gdGhlCi0gIC8vLyBhY3R1YWwgc2l6ZSBvZiB0aGUgSmF2YSBhcnJheS4gVGhpcyBpcyB0byBmYWNpbGl0YXRlIEphdmEgYXJyYXkgYWNjZXNzZXMKLSAgLy8vIGluIEpuSlZNIGNvZGUuIFRoZSBzaXplIHNob3VsZCBiZSBzZXQgdG8gemVybywgYnV0IHRoaXMgaXMgaW52YWxpZCBDOTkuCi0gIFQgZWxlbWVudHNbMV07Ci0KLXB1YmxpYzoKLSAgc3RhdGljIGludDMyX3QgZ2V0U2l6ZShjb25zdCBUSmF2YUFycmF5KiBzZWxmKSB7Ci0gICAgbGx2bV9nY3Jvb3Qoc2VsZiwgMCk7Ci0gICAgcmV0dXJuIHNlbGYtPnNpemU7Ci0gIH0KLSAgCi0gIHN0YXRpYyBUIGdldEVsZW1lbnQoY29uc3QgVEphdmFBcnJheSogc2VsZiwgdWludDMyX3QgaSkgewotICAgIGxsdm1fZ2Nyb290KHNlbGYsIDApOwotICAgIHJldHVybiBzZWxmLT5lbGVtZW50c1tpXTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIHNldEVsZW1lbnQoVEphdmFBcnJheSogc2VsZiwgVCB2YWx1ZSwgdWludDMyX3QgaSkgewotICAgIGxsdm1fZ2Nyb290KHNlbGYsIDApOwotICAgIHNlbGYtPmVsZW1lbnRzW2ldID0gdmFsdWU7Ci0gIH0KLQotICBzdGF0aWMgY29uc3QgVCogZ2V0RWxlbWVudHMoY29uc3QgVEphdmFBcnJheSogc2VsZikgewotICAgIGxsdm1fZ2Nyb290KHNlbGYsIDApOwotICAgIHJldHVybiBzZWxmLT5lbGVtZW50czsKLSAgfQotCi0gIHN0YXRpYyBUKiBnZXRFbGVtZW50cyhUSmF2YUFycmF5KiBzZWxmKSB7Ci0gICAgbGx2bV9nY3Jvb3Qoc2VsZiwgMCk7Ci0gICAgcmV0dXJuIHNlbGYtPmVsZW1lbnRzOwotICB9Ci0KLSAgZnJpZW5kIGNsYXNzIEphdmFBcnJheTsKLX07Ci0KLWNsYXNzIEFycmF5T2JqZWN0IDogcHVibGljIEphdmFPYmplY3QgewotcHVibGljOgotICAvLy8gc2l6ZSAtIFRoZSAoY29uc3RhbnQpIHNpemUgb2YgdGhlIGFycmF5LgotICBzc2l6ZV90IHNpemU7Ci0KLSAgLy8vIGVsZW1lbnRzIC0gRWxlbWVudHMgb2YgdGhpcyBhcnJheS4gVGhlIHNpemUgaGVyZSBpcyBkaWZmZXJlbnQgdGhhbiB0aGUKLSAgLy8vIGFjdHVhbCBzaXplIG9mIHRoZSBKYXZhIGFycmF5LiBUaGlzIGlzIHRvIGZhY2lsaXRhdGUgSmF2YSBhcnJheSBhY2Nlc3NlcwotICAvLy8gaW4gSm5KVk0gY29kZS4gVGhlIHNpemUgc2hvdWxkIGJlIHNldCB0byB6ZXJvLCBidXQgdGhpcyBpcyBpbnZhbGlkIEM5OS4KLSAgSmF2YU9iamVjdCogZWxlbWVudHNbMV07Ci0KLXB1YmxpYzoKLSAgc3RhdGljIGludDMyX3QgZ2V0U2l6ZShjb25zdCBBcnJheU9iamVjdCogc2VsZikgewotICAgIGxsdm1fZ2Nyb290KHNlbGYsIDApOwotICAgIHJldHVybiBzZWxmLT5zaXplOwotICB9Ci0gIAotICBzdGF0aWMgSmF2YU9iamVjdCogZ2V0RWxlbWVudChjb25zdCBBcnJheU9iamVjdCogc2VsZiwgdWludDMyX3QgaSkgewotICAgIGxsdm1fZ2Nyb290KHNlbGYsIDApOwotICAgIHJldHVybiBzZWxmLT5lbGVtZW50c1tpXTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIHNldEVsZW1lbnQoQXJyYXlPYmplY3QqIHNlbGYsIEphdmFPYmplY3QqIHZhbHVlLCB1aW50MzJfdCBpKSB7Ci0gICAgbGx2bV9nY3Jvb3Qoc2VsZiwgMCk7Ci0gICAgbGx2bV9nY3Jvb3QodmFsdWUsIDApOwotICAgIGlmICh2YWx1ZSAhPSBOVUxMKSBhc3NlcnQodmFsdWUtPmdldFZpcnR1YWxUYWJsZSgpKTsKLSAgICBzZWxmLT5lbGVtZW50c1tpXSA9IHZhbHVlOwotICB9Ci0KLSAgc3RhdGljIEphdmFPYmplY3QqKiBnZXRFbGVtZW50cyhBcnJheU9iamVjdCogc2VsZikgewotICAgIGxsdm1fZ2Nyb290KHNlbGYsIDApOwotICAgIHJldHVybiBzZWxmLT5lbGVtZW50czsKLSAgfQotfTsKLQotLy8vIEluc3RhbnRpYXRpb24gb2YgdGhlIFRKYXZhQXJyYXkgY2xhc3MgZm9yIEphdmEgYXJyYXlzLgotI2RlZmluZSBBUlJBWUNMQVNTKG5hbWUsIGVsbXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNsYXNzIG5hbWUgOiBwdWJsaWMgVEphdmFBcnJheTxlbG10PiB7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi1BUlJBWUNMQVNTKEFycmF5VUludDgsICB1aW50OCk7Ci1BUlJBWUNMQVNTKEFycmF5U0ludDgsICBzaW50OCk7Ci1BUlJBWUNMQVNTKEFycmF5VUludDE2LCB1aW50MTYpOwotQVJSQVlDTEFTUyhBcnJheVNJbnQxNiwgc2ludDE2KTsKLUFSUkFZQ0xBU1MoQXJyYXlVSW50MzIsIHVpbnQzMik7Ci1BUlJBWUNMQVNTKEFycmF5U0ludDMyLCBzaW50MzIpOwotQVJSQVlDTEFTUyhBcnJheUxvbmcsICAgc2ludDY0KTsKLUFSUkFZQ0xBU1MoQXJyYXlGbG9hdCwgIGZsb2F0KTsKLUFSUkFZQ0xBU1MoQXJyYXlEb3VibGUsIGRvdWJsZSk7Ci1BUlJBWUNMQVNTKEFycmF5UHRyLCB2b2lkKik7Ci0KLSN1bmRlZiBBUlJBWUNMQVNTCi0KLS8vLyBKYXZhQXJyYXkgLSBUaGlzIGNsYXNzIGlzIGp1c3QgYSBwbGFjZWhvbGRlciBmb3IgY29uc3RhbnRzLgotY2xhc3MgSmF2YUFycmF5IHsKLXB1YmxpYzoKLSAgLy8vIE1heEFycmF5U2l6ZSAtIFRoZSBtYXhpbXVtIHNpemUgYSBKYXZhIGFycmF5IGNhbiBoYXZlLiBBbGxvY2F0aW5nIGFuCi0gIC8vLyBhcnJheSB3aXRoIGEgYmlnZ2VyIHNpemUgdGhhbiBNYXhBcnJheVNpemUgcmFpc2VzIGFuIG91dCBvZiBtZW1vcnkKLSAgLy8vIGVycm9yLgotICBzdGF0aWMgY29uc3Qgc2ludDMyIE1heEFycmF5U2l6ZTsKLSAgCi0gIC8vLyBKVk0gcmVwcmVzZW50YXRpb24gb2YgSmF2YSBhcnJheXMgb2YgcHJpbWl0aXZlIHR5cGVzLgotICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IFRfQk9PTEVBTjsKLSAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBUX0NIQVI7Ci0gIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgVF9GTE9BVDsKLSAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBUX0RPVUJMRTsKLSAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBUX0JZVEU7Ci0gIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgVF9TSE9SVDsKLSAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBUX0lOVDsKLSAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBUX0xPTkc7Ci0KLSAgc3RhdGljIHZvaWQgc2V0U2l6ZShKYXZhT2JqZWN0KiBhcnJheSwgaW50IHNpemUpIHsKLSAgICBsbHZtX2djcm9vdChhcnJheSwgMCk7Ci0gICAgKChBcnJheVVJbnQ4KilhcnJheSktPnNpemUgPSBzaXplOwotICB9Ci0KLSAgc3RhdGljIHNpbnQzMiBnZXRTaXplKGNvbnN0IEphdmFPYmplY3QqIGFycmF5KSB7Ci0gICAgbGx2bV9nY3Jvb3QoYXJyYXksIDApOwotICAgIHJldHVybiAoKGNvbnN0IEFycmF5VUludDgqKWFycmF5KS0+c2l6ZTsKLSAgfQotCi0gIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyKiBnZXRFbGVtZW50cyhjb25zdCBKYXZhT2JqZWN0KiBhcnJheSkgewotICAgIGxsdm1fZ2Nyb290KGFycmF5LCAwKTsKLSAgICByZXR1cm4gKChjb25zdCBBcnJheVVJbnQ4KilhcnJheSktPmVsZW1lbnRzOwotICB9Ci0KLSAgc3RhdGljIHVuc2lnbmVkIGNoYXIqIGdldEVsZW1lbnRzKEphdmFPYmplY3QqIGFycmF5KSB7Ci0gICAgbGx2bV9nY3Jvb3QoYXJyYXksIDApOwotICAgIHJldHVybiAoKEFycmF5VUludDgqKWFycmF5KS0+ZWxlbWVudHM7Ci0gIH0KLX07Ci0KLX0gLy8gZW5kIG5hbWVzcGFjZSBqMwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9KMy9WTUNvcmUvSmF2YUNsYXNzLmNwcCBiL3Zta2l0L2xpYi9KMy9WTUNvcmUvSmF2YUNsYXNzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFkOGI1Mi4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvSjMvVk1Db3JlL0phdmFDbGFzcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzg4ICswLDAgQEAKLS8vPT09LS0tLS0tLS0gSmF2YUNsYXNzLmNwcCAtIEphdmEgY2xhc3MgcmVwcmVzZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2RlZmluZSBKTkpWTV9MT0FEIDAKLQotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAidHlwZXMuaCIKLQotI2luY2x1ZGUgIkNsYXNzcGF0aFJlZmxlY3QuaCIKLSNpbmNsdWRlICJKYXZhQXJyYXkuaCIKLSNpbmNsdWRlICJKYXZhQ2xhc3MuaCIKLSNpbmNsdWRlICJKYXZhQ29tcGlsZXIuaCIKLSNpbmNsdWRlICJKYXZhQ29uc3RhbnRQb29sLmgiCi0jaW5jbHVkZSAiSmF2YU9iamVjdC5oIgotI2luY2x1ZGUgIkphdmFUaHJlYWQuaCIKLSNpbmNsdWRlICJKYXZhVHlwZXMuaCIKLSNpbmNsdWRlICJKYXZhVXBjYWxscy5oIgotI2luY2x1ZGUgIkpuanZtLmgiCi0jaW5jbHVkZSAiTG9ja2VkTWFwLmgiCi0jaW5jbHVkZSAiUmVhZGVyLmgiCi0KLSNpbmNsdWRlIDxjc3RyaW5nPgotCi11c2luZyBuYW1lc3BhY2UgajM7Ci0KLWNvbnN0IFVURjgqIEF0dHJpYnV0Ojphbm5vdGF0aW9uc0F0dHJpYnV0ID0gMDsKLWNvbnN0IFVURjgqIEF0dHJpYnV0Ojpjb2RlQXR0cmlidXQgPSAwOwotY29uc3QgVVRGOCogQXR0cmlidXQ6OmV4Y2VwdGlvbnNBdHRyaWJ1dCA9IDA7Ci1jb25zdCBVVEY4KiBBdHRyaWJ1dDo6Y29uc3RhbnRBdHRyaWJ1dCA9IDA7Ci1jb25zdCBVVEY4KiBBdHRyaWJ1dDo6bGluZU51bWJlclRhYmxlQXR0cmlidXQgPSAwOwotY29uc3QgVVRGOCogQXR0cmlidXQ6OmlubmVyQ2xhc3Nlc0F0dHJpYnV0ID0gMDsKLWNvbnN0IFVURjgqIEF0dHJpYnV0Ojpzb3VyY2VGaWxlQXR0cmlidXQgPSAwOwotCi1DbGFzcyogQ2xhc3NBcnJheTo6U3VwZXJBcnJheTsKLUNsYXNzKiogQ2xhc3NBcnJheTo6SW50ZXJmYWNlc0FycmF5OwotCi1leHRlcm4gIkMiIHZvaWQgSmF2YU9iamVjdFRyYWNlcihKYXZhT2JqZWN0Kik7Ci1leHRlcm4gIkMiIHZvaWQgQXJyYXlPYmplY3RUcmFjZXIoSmF2YU9iamVjdCopOwotZXh0ZXJuICJDIiB2b2lkIFJlZ3VsYXJPYmplY3RUcmFjZXIoSmF2YU9iamVjdCopOwotZXh0ZXJuICJDIiB2b2lkIFJlZmVyZW5jZU9iamVjdFRyYWNlcihKYXZhT2JqZWN0Kik7Ci0KLUF0dHJpYnV0OjpBdHRyaWJ1dChjb25zdCBVVEY4KiBuYW1lLCB1aW50MzIgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgIHVpbnQzMiBvZmZzZXQpIHsKLSAgCi0gIHRoaXMtPnN0YXJ0ICAgID0gb2Zmc2V0OwotICB0aGlzLT5uYmIgICAgICA9IGxlbmd0aDsKLSAgdGhpcy0+bmFtZSAgICAgPSBuYW1lOwotfQotCi1BdHRyaWJ1dCogQ2xhc3M6Omxvb2t1cEF0dHJpYnV0KGNvbnN0IFVURjgqIGtleSApIHsKLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBuYkF0dHJpYnV0czsgKytpKSB7Ci0gICAgQXR0cmlidXQqIGN1ciA9ICYoYXR0cmlidXRzW2ldKTsKLSAgICBpZiAoY3VyLT5uYW1lLT5lcXVhbHMoa2V5KSkgcmV0dXJuIGN1cjsKLSAgfQotCi0gIHJldHVybiAwOwotfQotCi1BdHRyaWJ1dCogSmF2YUZpZWxkOjpsb29rdXBBdHRyaWJ1dChjb25zdCBVVEY4KiBrZXkgKSB7Ci0gIGZvciAodWludDMyIGkgPSAwOyBpIDwgbmJBdHRyaWJ1dHM7ICsraSkgewotICAgIEF0dHJpYnV0KiBjdXIgPSAmKGF0dHJpYnV0c1tpXSk7Ci0gICAgaWYgKGN1ci0+bmFtZS0+ZXF1YWxzKGtleSkpIHJldHVybiBjdXI7Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotQXR0cmlidXQqIEphdmFNZXRob2Q6Omxvb2t1cEF0dHJpYnV0KGNvbnN0IFVURjgqIGtleSApIHsKLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBuYkF0dHJpYnV0czsgKytpKSB7Ci0gICAgQXR0cmlidXQqIGN1ciA9ICYoYXR0cmlidXRzW2ldKTsKLSAgICBpZiAoY3VyLT5uYW1lLT5lcXVhbHMoa2V5KSkgcmV0dXJuIGN1cjsKLSAgfQotCi0gIHJldHVybiAwOwotfQotCi1Db21tb25DbGFzczo6fkNvbW1vbkNsYXNzKCkgewotfQotCi1DbGFzczo6fkNsYXNzKCkgewotICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IG5iQXR0cmlidXRzOyArK2kpIHsKLSAgICBBdHRyaWJ1dCogY3VyID0gJihhdHRyaWJ1dHNbaV0pOwotICAgIGN1ci0+fkF0dHJpYnV0KCk7Ci0gICAgY2xhc3NMb2FkZXItPmFsbG9jYXRvci5EZWFsbG9jYXRlKGN1cik7Ci0gIH0KLSAgCi0gIGZvciAodWludDMyIGkgPSAwOyBpIDwgbmJTdGF0aWNGaWVsZHM7ICsraSkgewotICAgIEphdmFGaWVsZCogY3VyID0gJihzdGF0aWNGaWVsZHNbaV0pOwotICAgIGN1ci0+fkphdmFGaWVsZCgpOwotICAgIGNsYXNzTG9hZGVyLT5hbGxvY2F0b3IuRGVhbGxvY2F0ZShjdXIpOwotICB9Ci0gIAotICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IG5iVmlydHVhbEZpZWxkczsgKytpKSB7Ci0gICAgSmF2YUZpZWxkKiBjdXIgPSAmKHZpcnR1YWxGaWVsZHNbaV0pOwotICAgIGN1ci0+fkphdmFGaWVsZCgpOwotICAgIGNsYXNzTG9hZGVyLT5hbGxvY2F0b3IuRGVhbGxvY2F0ZShjdXIpOwotICB9Ci0gIAotICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IG5iVmlydHVhbE1ldGhvZHM7ICsraSkgewotICAgIEphdmFNZXRob2QqIGN1ciA9ICYodmlydHVhbE1ldGhvZHNbaV0pOwotICAgIGN1ci0+fkphdmFNZXRob2QoKTsKLSAgICBjbGFzc0xvYWRlci0+YWxsb2NhdG9yLkRlYWxsb2NhdGUoY3VyKTsKLSAgfQotICAKLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBuYlN0YXRpY01ldGhvZHM7ICsraSkgewotICAgIEphdmFNZXRob2QqIGN1ciA9ICYoc3RhdGljTWV0aG9kc1tpXSk7Ci0gICAgY3VyLT5+SmF2YU1ldGhvZCgpOwotICAgIGNsYXNzTG9hZGVyLT5hbGxvY2F0b3IuRGVhbGxvY2F0ZShjdXIpOwotICB9Ci0gCi0gIGlmIChjdHBJbmZvKSB7Ci0gICAgY3RwSW5mby0+fkphdmFDb25zdGFudFBvb2woKTsKLSAgICBjbGFzc0xvYWRlci0+YWxsb2NhdG9yLkRlYWxsb2NhdGUoY3RwSW5mbyk7Ci0gIH0KLQotICBjbGFzc0xvYWRlci0+YWxsb2NhdG9yLkRlYWxsb2NhdGUoSXNvbGF0ZUluZm8pOwotICAKLSAgLy8gQ3VycmVudGx5LCBvbmx5IHJlZ3VsYXIgY2xhc3NlcyBoYXZlIGEgaGVhcCBhbGxvY2F0ZWQgdmlydHVhbFZULgotICAvLyBBcnJheSBjbGFzc2VzIGhhdmUgYSBDKysgYWxsb2NhdGVkIHZpcnR1YWxWVCBhbmQgcHJpbWl0aXZlIGNsYXNzZXMKLSAgLy8gZG8gbm90IGhhdmUgYSB2aXJ0dWFsVlQuCi0gIGNsYXNzTG9hZGVyLT5hbGxvY2F0b3IuRGVhbGxvY2F0ZSh2aXJ0dWFsVlQpOwotfQotCi1KYXZhRmllbGQ6On5KYXZhRmllbGQoKSB7Ci0gIGZvciAodWludDMyIGkgPSAwOyBpIDwgbmJBdHRyaWJ1dHM7ICsraSkgewotICAgIEF0dHJpYnV0KiBjdXIgPSAmKGF0dHJpYnV0c1tpXSk7Ci0gICAgY3VyLT5+QXR0cmlidXQoKTsKLSAgICBjbGFzc0RlZi0+Y2xhc3NMb2FkZXItPmFsbG9jYXRvci5EZWFsbG9jYXRlKGN1cik7Ci0gIH0KLX0KLQotSmF2YU1ldGhvZDo6fkphdmFNZXRob2QoKSB7Ci0gIAotICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IG5iQXR0cmlidXRzOyArK2kpIHsKLSAgICBBdHRyaWJ1dCogY3VyID0gJihhdHRyaWJ1dHNbaV0pOwotICAgIGN1ci0+fkF0dHJpYnV0KCk7Ci0gICAgY2xhc3NEZWYtPmNsYXNzTG9hZGVyLT5hbGxvY2F0b3IuRGVhbGxvY2F0ZShjdXIpOwotICB9Ci0gIAotfQotCi1Vc2VyQ2xhc3NQcmltaXRpdmUqIENvbW1vbkNsYXNzOjp0b1ByaW1pdGl2ZSgpIGNvbnN0IHsKLQlKbmp2bSogdm0gPSBjbGFzc0xvYWRlci0+dm07Ci0gIGlmICh0aGlzID09IHZtLT51cGNhbGxzLT52b2lkQ2xhc3MpIHsKLSAgICByZXR1cm4gdm0tPnVwY2FsbHMtPk9mVm9pZDsKLSAgfSBlbHNlIGlmICh0aGlzID09IHZtLT51cGNhbGxzLT5pbnRDbGFzcykgewotICAgIHJldHVybiB2bS0+dXBjYWxscy0+T2ZJbnQ7Ci0gIH0gZWxzZSBpZiAodGhpcyA9PSB2bS0+dXBjYWxscy0+c2hvcnRDbGFzcykgewotICAgIHJldHVybiB2bS0+dXBjYWxscy0+T2ZTaG9ydDsKLSAgfSBlbHNlIGlmICh0aGlzID09IHZtLT51cGNhbGxzLT5jaGFyQ2xhc3MpIHsKLSAgICByZXR1cm4gdm0tPnVwY2FsbHMtPk9mQ2hhcjsKLSAgfSBlbHNlIGlmICh0aGlzID09IHZtLT51cGNhbGxzLT5kb3VibGVDbGFzcykgewotICAgIHJldHVybiB2bS0+dXBjYWxscy0+T2ZEb3VibGU7Ci0gIH0gZWxzZSBpZiAodGhpcyA9PSB2bS0+dXBjYWxscy0+Ynl0ZUNsYXNzKSB7Ci0gICAgcmV0dXJuIHZtLT51cGNhbGxzLT5PZkJ5dGU7Ci0gIH0gZWxzZSBpZiAodGhpcyA9PSB2bS0+dXBjYWxscy0+Ym9vbENsYXNzKSB7Ci0gICAgcmV0dXJuIHZtLT51cGNhbGxzLT5PZkJvb2w7Ci0gIH0gZWxzZSBpZiAodGhpcyA9PSB2bS0+dXBjYWxscy0+bG9uZ0NsYXNzKSB7Ci0gICAgcmV0dXJuIHZtLT51cGNhbGxzLT5PZkxvbmc7Ci0gIH0gZWxzZSBpZiAodGhpcyA9PSB2bS0+dXBjYWxscy0+ZmxvYXRDbGFzcykgewotICAgIHJldHVybiB2bS0+dXBjYWxscy0+T2ZGbG9hdDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gMDsKLSAgfQotfQotCi0KLVVzZXJDbGFzc1ByaW1pdGl2ZSogCi1DbGFzc1ByaW1pdGl2ZTo6Ynl0ZUlkVG9QcmltaXRpdmUoY2hhciBpZCwgQ2xhc3NwYXRoKiB1cGNhbGxzKSB7Ci0gIHN3aXRjaCAoaWQpIHsKLSAgICBjYXNlIElfRkxPQVQgOgotICAgICAgcmV0dXJuIHVwY2FsbHMtPk9mRmxvYXQ7Ci0gICAgY2FzZSBJX0lOVCA6Ci0gICAgICByZXR1cm4gdXBjYWxscy0+T2ZJbnQ7Ci0gICAgY2FzZSBJX1NIT1JUIDoKLSAgICAgIHJldHVybiB1cGNhbGxzLT5PZlNob3J0OwotICAgIGNhc2UgSV9DSEFSIDoKLSAgICAgIHJldHVybiB1cGNhbGxzLT5PZkNoYXI7Ci0gICAgY2FzZSBJX0RPVUJMRSA6Ci0gICAgICByZXR1cm4gdXBjYWxscy0+T2ZEb3VibGU7Ci0gICAgY2FzZSBJX0JZVEUgOgotICAgICAgcmV0dXJuIHVwY2FsbHMtPk9mQnl0ZTsKLSAgICBjYXNlIElfQk9PTCA6Ci0gICAgICByZXR1cm4gdXBjYWxscy0+T2ZCb29sOwotICAgIGNhc2UgSV9MT05HIDoKLSAgICAgIHJldHVybiB1cGNhbGxzLT5PZkxvbmc7Ci0gICAgY2FzZSBJX1ZPSUQgOgotICAgICAgcmV0dXJuIHVwY2FsbHMtPk9mVm9pZDsKLSAgICBkZWZhdWx0IDoKLSAgICAgIHJldHVybiAwOwotICB9Ci19Ci0KLUNvbW1vbkNsYXNzOjpDb21tb25DbGFzcyhKbmp2bUNsYXNzTG9hZGVyKiBsb2FkZXIsIGNvbnN0IFVURjgqIG4pIHsKLSAgbmFtZSA9IG47Ci0gIGNsYXNzTG9hZGVyID0gbG9hZGVyOwotICBuYkludGVyZmFjZXMgPSAwOwotICBpbnRlcmZhY2VzID0gMDsKLSAgYWNjZXNzID0gMDsKLSAgc3VwZXIgPSAwOwotICBtZW1zZXQoZGVsZWdhdGVlLCAwLCBzaXplb2YoSmF2YU9iamVjdCopICogTlJfSVNPTEFURVMpOwotfQotCi1DbGFzc1ByaW1pdGl2ZTo6Q2xhc3NQcmltaXRpdmUoSm5qdm1DbGFzc0xvYWRlciogbG9hZGVyLCBjb25zdCBVVEY4KiBuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBuYikgOiAKLSAgQ29tbW9uQ2xhc3MobG9hZGVyLCBuKSB7Ci0gCi0gIHVpbnQzMiBzaXplID0gSmF2YVZpcnR1YWxUYWJsZTo6Z2V0QmFzZVNpemUoKTsKLSAgdmlydHVhbFZUID0gbmV3KGxvYWRlci0+YWxsb2NhdG9yLCBzaXplKSBKYXZhVmlydHVhbFRhYmxlKHRoaXMpOwotICBhY2Nlc3MgPSBBQ0NfQUJTVFJBQ1QgfCBBQ0NfRklOQUwgfCBBQ0NfUFVCTElDIHwgSk5KVk1fUFJJTUlUSVZFOwotICBsb2dTaXplID0gbmI7Ci19Ci0KLUNsYXNzOjpDbGFzcyhKbmp2bUNsYXNzTG9hZGVyKiBsb2FkZXIsIGNvbnN0IFVURjgqIG4sIENsYXNzQnl0ZXMqIEIpIDogCi0gICAgQ29tbW9uQ2xhc3MobG9hZGVyLCBuKSB7Ci0gIHZpcnR1YWxWVCA9IDA7Ci0gIGJ5dGVzID0gQjsKLSAgc3VwZXIgPSAwOwotICBjdHBJbmZvID0gMDsKLSAgb3V0ZXJDbGFzcyA9IDA7Ci0gIGlubmVyT3V0ZXJSZXNvbHZlZCA9IGZhbHNlOwotICBuYklubmVyQ2xhc3NlcyA9IDA7Ci0gIG5iVmlydHVhbE1ldGhvZHMgPSAwOwotICBuYlN0YXRpY01ldGhvZHMgPSAwOwotICBuYlN0YXRpY0ZpZWxkcyA9IDA7Ci0gIG5iVmlydHVhbEZpZWxkcyA9IDA7Ci0gIHZpcnR1YWxNZXRob2RzID0gMDsKLSAgc3RhdGljTWV0aG9kcyA9IDA7Ci0gIHZpcnR1YWxGaWVsZHMgPSAwOwotICBzdGF0aWNGaWVsZHMgPSAwOwotICBvd25lckNsYXNzID0gMDsKLSAgaW5uZXJBY2Nlc3MgPSAwOwotICBhY2Nlc3MgPSBKTkpWTV9DTEFTUzsKLSAgbWVtc2V0KElzb2xhdGVJbmZvLCAwLCBzaXplb2YoVGFza0NsYXNzTWlycm9yKSAqIE5SX0lTT0xBVEVTKTsKLX0KLQotQ2xhc3NBcnJheTo6Q2xhc3NBcnJheShKbmp2bUNsYXNzTG9hZGVyKiBsb2FkZXIsIGNvbnN0IFVURjgqIG4sCi0gICAgICAgICAgICAgICAgICAgICAgIFVzZXJDb21tb25DbGFzcyogYmFzZSkgOiBDb21tb25DbGFzcyhsb2FkZXIsIG4pIHsKLSAgX2Jhc2VDbGFzcyA9IGJhc2U7Ci0gIHN1cGVyID0gQ2xhc3NBcnJheTo6U3VwZXJBcnJheTsKLSAgaW50ZXJmYWNlcyA9IENsYXNzQXJyYXk6OkludGVyZmFjZXNBcnJheTsKLSAgbmJJbnRlcmZhY2VzID0gMjsKLSAgCi0gIHVpbnQzMiBzaXplID0gSmF2YVZpcnR1YWxUYWJsZTo6Z2V0QmFzZVNpemUoKTsKLSAgdmlydHVhbFZUID0gbmV3KGxvYWRlci0+YWxsb2NhdG9yLCBzaXplKSBKYXZhVmlydHVhbFRhYmxlKHRoaXMpOwotICAKLSAgYWNjZXNzID0gQUNDX0ZJTkFMIHwgQUNDX0FCU1RSQUNUIHwgQUNDX1BVQkxJQyB8IEpOSlZNX0FSUkFZOwotfQotCi1KYXZhT2JqZWN0KiBVc2VyQ2xhc3NBcnJheTo6ZG9OZXcoc2ludDMyIG4pIHsKLSAgSmF2YU9iamVjdCogcmVzID0gTlVMTDsKLSAgbGx2bV9nY3Jvb3QocmVzLCAwKTsKLSAgaWYgKG4gPCAwKSB7Ci0gICAgY2xhc3NMb2FkZXItPnZtLT5uZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbihuKTsKLSAgfSBlbHNlIGlmIChuID4gSmF2YUFycmF5OjpNYXhBcnJheVNpemUpIHsKLSAgICBjbGFzc0xvYWRlci0+dm0tPm91dE9mTWVtb3J5RXJyb3IoKTsKLSAgfQotICBVc2VyQ29tbW9uQ2xhc3MqIGNsID0gYmFzZUNsYXNzKCk7Ci0gIHVpbnQzMiBsb2dTaXplID0gY2wtPmlzUHJpbWl0aXZlKCkgPyAKLSAgICBjbC0+YXNQcmltaXRpdmVDbGFzcygpLT5sb2dTaXplIDogKHNpemVvZihKYXZhT2JqZWN0KikgPT0gOCA/IDMgOiAyKTsKLQltdm06OlZpcnR1YWxUYWJsZSogVlQgPSB2aXJ0dWFsVlQ7Ci0gIHVpbnQzMiBzaXplID0gc2l6ZW9mKEphdmFPYmplY3QpICsgc2l6ZW9mKHNzaXplX3QpICsgKG4gPDwgbG9nU2l6ZSk7Ci0gIHJlcyA9IChKYXZhT2JqZWN0Kiltdm06OmdjOjpvcGVyYXRvciBuZXcoc2l6ZSwgVlQpOwotICBKYXZhQXJyYXk6OnNldFNpemUocmVzLCBuKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotdm9pZCogSmF2YU1ldGhvZDo6Y29tcGlsZWRQdHIoKSB7Ci0gIGlmIChjb2RlICE9IDApIAotCQlyZXR1cm4gY29kZTsKLSAgZWxzZQotICAgIGNvZGUgPSBjbGFzc0RlZi0+Y2xhc3NMb2FkZXItPmdldENvbXBpbGVyKCktPm1hdGVyaWFsaXplRnVuY3Rpb24odGhpcyk7Ci0gIAotICByZXR1cm4gY29kZTsKLX0KLQotdm9pZCBKYXZhTWV0aG9kOjpzZXROYXRpdmUoKSB7Ci0gIGFjY2VzcyB8PSBBQ0NfTkFUSVZFOwotfQotCi12b2lkIEphdmFWaXJ0dWFsVGFibGU6OnNldE5hdGl2ZVRyYWNlcih1aW50cHRyX3QgcHRyLCBjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIHRyYWNlciA9IHB0cjsKLX0KLQotdm9pZCBKYXZhVmlydHVhbFRhYmxlOjpzZXROYXRpdmVEZXN0cnVjdG9yKHVpbnRwdHJfdCBwdHIsIGNvbnN0IGNoYXIqIG5hbWUpIHsKLQlpZiAoIWNsLT5jbGFzc0xvYWRlci0+Z2V0Q29tcGlsZXIoKS0+aXNTdGF0aWNDb21waWxpbmcoKSkgewotCSAgZGVzdHJ1Y3RvciA9IHB0cjsKLSAgCW9wZXJhdG9yRGVsZXRlID0gcHRyOwotCX0KLX0KLQotSmF2YU1ldGhvZCogQ2xhc3M6Omxvb2t1cEludGVyZmFjZU1ldGhvZERvbnRUaHJvdyhjb25zdCBVVEY4KiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVVEY4KiB0eXBlKSB7Ci0gIEphdmFNZXRob2QqIGN1ciA9IGxvb2t1cE1ldGhvZERvbnRUaHJvdyhuYW1lLCB0eXBlLCBmYWxzZSwgZmFsc2UsIDApOwotICBpZiAoY3VyID09IE5VTEwpIHsKLSAgICBmb3IgKHVpbnQxNiBpID0gMDsgaSA8IG5iSW50ZXJmYWNlczsgKytpKSB7Ci0gICAgICBDbGFzcyogSSA9IGludGVyZmFjZXNbaV07Ci0gICAgICBjdXIgPSBJLT5sb29rdXBJbnRlcmZhY2VNZXRob2REb250VGhyb3cobmFtZSwgdHlwZSk7Ci0gICAgICBpZiAoY3VyKSByZXR1cm4gY3VyOwotICAgIH0KLSAgfQotICBpZiAoY3VyID09IE5VTEwgJiYgc3VwZXIgIT0gTlVMTCkgewotICAgIGN1ciA9IHN1cGVyLT5sb29rdXBJbnRlcmZhY2VNZXRob2REb250VGhyb3cobmFtZSwgdHlwZSk7Ci0gIH0KLSAgcmV0dXJuIGN1cjsKLX0KLQotSmF2YU1ldGhvZCogQ2xhc3M6Omxvb2t1cFNwZWNpYWxNZXRob2REb250VGhyb3coY29uc3QgVVRGOCogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVURjgqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyogY3VycmVudCkgewotICBKYXZhTWV0aG9kKiBtZXRoID0gbG9va3VwTWV0aG9kRG9udFRocm93KG5hbWUsIHR5cGUsIGZhbHNlLCB0cnVlLCBOVUxMKTsKLQotICBpZiAobWV0aCAmJgotICAgICAgaXNTdXBlcihjdXJyZW50LT5hY2Nlc3MpICYmCi0gICAgICBjdXJyZW50ICE9IG1ldGgtPmNsYXNzRGVmICYmCi0gICAgICBtZXRoLT5jbGFzc0RlZi0+aXNBc3NpZ25hYmxlRnJvbShjdXJyZW50KSAmJgotICAgICAgIW5hbWUtPmVxdWFscyhjbGFzc0xvYWRlci0+dm0tPnVwY2FsbHMtPmluaXROYW1lKSkgewotICAgIG1ldGggPSBjdXJyZW50LT5zdXBlci0+bG9va3VwTWV0aG9kRG9udFRocm93KG5hbWUsIHR5cGUsIGZhbHNlLCB0cnVlLCBOVUxMKTsKLSAgfQotCi0gIHJldHVybiBtZXRoOwotfQotCi1KYXZhTWV0aG9kKiBDbGFzczo6bG9va3VwTWV0aG9kRG9udFRocm93KGNvbnN0IFVURjgqIG5hbWUsIGNvbnN0IFVURjgqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdGF0aWMsIGJvb2wgcmVjdXJzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MqKiBtZXRob2RDbCkgewotICAKLSAgSmF2YU1ldGhvZCogbWV0aG9kcyA9IDA7Ci0gIHVpbnQzMiBuYiA9IDA7Ci0gIGlmIChpc1N0YXRpYykgewotICAgIG1ldGhvZHMgPSBnZXRTdGF0aWNNZXRob2RzKCk7Ci0gICAgbmIgPSBuYlN0YXRpY01ldGhvZHM7Ci0gIH0gZWxzZSB7Ci0gICAgbWV0aG9kcyA9IGdldFZpcnR1YWxNZXRob2RzKCk7Ci0gICAgbmIgPSBuYlZpcnR1YWxNZXRob2RzOwotICB9Ci0gIAotICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IG5iOyArK2kpIHsKLSAgICBKYXZhTWV0aG9kJiByZXMgPSBtZXRob2RzW2ldOwotICAgIGlmIChyZXMubmFtZS0+ZXF1YWxzKG5hbWUpICYmIHJlcy50eXBlLT5lcXVhbHModHlwZSkpIHsKLSAgICAgIGlmIChtZXRob2RDbCkgKm1ldGhvZENsID0gKENsYXNzKil0aGlzOwotICAgICAgcmV0dXJuICZyZXM7Ci0gICAgfQotICB9Ci0KLSAgSmF2YU1ldGhvZCAqY3VyID0gMDsKLSAgCi0gIGlmIChyZWN1cnNlKSB7Ci0gICAgaWYgKHN1cGVyKSBjdXIgPSBzdXBlci0+bG9va3VwTWV0aG9kRG9udFRocm93KG5hbWUsIHR5cGUsIGlzU3RhdGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNlLCBtZXRob2RDbCk7Ci0gICAgaWYgKGN1cikgcmV0dXJuIGN1cjsKLSAgICBpZiAoaXNTdGF0aWMpIHsKLSAgICAgIGZvciAodWludDE2IGkgPSAwOyBpIDwgbmJJbnRlcmZhY2VzOyArK2kpIHsKLSAgICAgICAgQ2xhc3MqIEkgPSBpbnRlcmZhY2VzW2ldOwotICAgICAgICBjdXIgPSBJLT5sb29rdXBNZXRob2REb250VGhyb3cobmFtZSwgdHlwZSwgaXNTdGF0aWMsIHJlY3Vyc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RDbCk7Ci0gICAgICAgIGlmIChjdXIpIHJldHVybiBjdXI7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLUphdmFNZXRob2QqIENsYXNzOjpsb29rdXBNZXRob2QoY29uc3QgVVRGOCogbmFtZSwgY29uc3QgVVRGOCogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1N0YXRpYywgYm9vbCByZWN1cnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyoqIG1ldGhvZENsKSB7Ci0gIEphdmFNZXRob2QqIHJlcyA9IGxvb2t1cE1ldGhvZERvbnRUaHJvdyhuYW1lLCB0eXBlLCBpc1N0YXRpYywgcmVjdXJzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZENsKTsKLSAgaWYgKCFyZXMpIHsKLSAgICBjbGFzc0xvYWRlci0+dm0tPm5vU3VjaE1ldGhvZEVycm9yKHRoaXMsIG5hbWUpOwotICB9Ci0gIHJldHVybiByZXM7Ci19Ci0KLUphdmFNZXRob2QqIENsYXNzOjpsb29rdXBJbnRlcmZhY2VNZXRob2QoY29uc3QgVVRGOCogbmFtZSwgY29uc3QgVVRGOCogdHlwZSkgewotICBKYXZhTWV0aG9kKiByZXMgPSBsb29rdXBJbnRlcmZhY2VNZXRob2REb250VGhyb3cobmFtZSwgdHlwZSk7Ci0KLSAgaWYgKCFyZXMpIHsKLSAgICBjbGFzc0xvYWRlci0+dm0tPm5vU3VjaE1ldGhvZEVycm9yKHRoaXMsIG5hbWUpOwotICB9Ci0gIHJldHVybiByZXM7Ci19Ci0KLUphdmFGaWVsZCoKLUNsYXNzOjpsb29rdXBGaWVsZERvbnRUaHJvdyhjb25zdCBVVEY4KiBuYW1lLCBjb25zdCBVVEY4KiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdGF0aWMsIGJvb2wgcmVjdXJzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyoqIGRlZmluaW5nQ2xhc3MpIHsKLSAgSmF2YUZpZWxkKiBmaWVsZHMgPSAwOwotICB1aW50MzIgbmIgPSAwOwotICBpZiAoaXNTdGF0aWMpIHsKLSAgICBmaWVsZHMgPSBnZXRTdGF0aWNGaWVsZHMoKTsKLSAgICBuYiA9IG5iU3RhdGljRmllbGRzOwotICB9IGVsc2UgewotICAgIGZpZWxkcyA9IGdldFZpcnR1YWxGaWVsZHMoKTsKLSAgICBuYiA9IG5iVmlydHVhbEZpZWxkczsKLSAgfQotICAKLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBuYjsgKytpKSB7Ci0gICAgSmF2YUZpZWxkJiByZXMgPSBmaWVsZHNbaV07Ci0gICAgaWYgKHJlcy5uYW1lLT5lcXVhbHMobmFtZSkgJiYgcmVzLnR5cGUtPmVxdWFscyh0eXBlKSkgewotICAgICAgaWYgKGRlZmluaW5nQ2xhc3MpICpkZWZpbmluZ0NsYXNzID0gdGhpczsKLSAgICAgIHJldHVybiAmcmVzOwotICAgIH0KLSAgfQotCi0gIEphdmFGaWVsZCAqY3VyID0gMDsKLQotICBpZiAocmVjdXJzZSkgewotICAgIGlmIChzdXBlcikgY3VyID0gc3VwZXItPmxvb2t1cEZpZWxkRG9udFRocm93KG5hbWUsIHR5cGUsIGlzU3RhdGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2UsIGRlZmluaW5nQ2xhc3MpOwotICAgIGlmIChjdXIpIHJldHVybiBjdXI7Ci0gICAgaWYgKGlzU3RhdGljKSB7Ci0gICAgICBmb3IgKHVpbnQxNiBpID0gMDsgaSA8IG5iSW50ZXJmYWNlczsgKytpKSB7Ci0gICAgICAgIENsYXNzKiBJID0gaW50ZXJmYWNlc1tpXTsKLSAgICAgICAgY3VyID0gSS0+bG9va3VwRmllbGREb250VGhyb3cobmFtZSwgdHlwZSwgaXNTdGF0aWMsIHJlY3Vyc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluaW5nQ2xhc3MpOwotICAgICAgICBpZiAoY3VyKSByZXR1cm4gY3VyOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybiAwOwotfQotCi1KYXZhRmllbGQqIENsYXNzOjpsb29rdXBGaWVsZChjb25zdCBVVEY4KiBuYW1lLCBjb25zdCBVVEY4KiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1N0YXRpYywgYm9vbCByZWN1cnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MqKiBkZWZpbmluZ0NsYXNzKSB7Ci0gIAotICBKYXZhRmllbGQqIHJlcyA9IGxvb2t1cEZpZWxkRG9udFRocm93KG5hbWUsIHR5cGUsIGlzU3RhdGljLCByZWN1cnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluaW5nQ2xhc3MpOwotICBpZiAoIXJlcykgewotICAgIGNsYXNzTG9hZGVyLT52bS0+bm9TdWNoRmllbGRFcnJvcih0aGlzLCBuYW1lKTsKLSAgfQotICByZXR1cm4gcmVzOwotfQotCi1KYXZhT2JqZWN0KiBVc2VyQ2xhc3M6OmRvTmV3KCkgewotICBKYXZhT2JqZWN0KiByZXMgPSBOVUxMOwotICBsbHZtX2djcm9vdChyZXMsIDApOwotICBhc3NlcnQodGhpcyAmJiAiTm8gY2xhc3Mgd2hlbiBhbGxvY2F0aW5nLiIpOwotICBhc3NlcnQoKHRoaXMtPmlzSW5pdGlhbGl6aW5nKCkgfHwgCi0gICAgICAgICAgY2xhc3NMb2FkZXItPmdldENvbXBpbGVyKCktPmlzU3RhdGljQ29tcGlsaW5nKCkgfHwKLSAgICAgICAgICB0aGlzID09IGNsYXNzTG9hZGVyLT5ib290c3RyYXBMb2FkZXItPnVwY2FsbHMtPm5ld0NsYXNzKQotICAgICAgICAgJiYgIlVuaW5pdGlhbGl6ZWQgY2xhc3Mgd2hlbiBhbGxvY2F0aW5nLiIpOwotICBhc3NlcnQoZ2V0VmlydHVhbFZUKCkgJiYgIk5vIFZUXG4iKTsKLSAgcmVzID0gKEphdmFPYmplY3QqKW12bTo6Z2M6Om9wZXJhdG9yIG5ldyhnZXRWaXJ0dWFsU2l6ZSgpLCBnZXRWaXJ0dWFsVlQoKSk7Ci0KLSAgcmV0dXJuIHJlczsKLX0KLQotYm9vbCBVc2VyQ29tbW9uQ2xhc3M6OmluaGVyaXROYW1lKGNvbnN0IHVpbnQxNiogYnVmLCB1aW50MzIgbGVuKSB7Ci0gIGlmIChnZXROYW1lKCktPmVxdWFscyhidWYsIGxlbikpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlICBpZiAoaXNQcmltaXRpdmUoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlIGlmIChzdXBlcikgewotICAgIGlmIChnZXRTdXBlcigpLT5pbmhlcml0TmFtZShidWYsIGxlbikpIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IG5iSW50ZXJmYWNlczsgKytpKSB7Ci0gICAgaWYgKGludGVyZmFjZXNbaV0tPmluaGVyaXROYW1lKGJ1ZiwgbGVuKSkgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIFVzZXJDb21tb25DbGFzczo6aXNPZlR5cGVOYW1lKGNvbnN0IFVURjgqIFRuYW1lKSB7Ci0gIGlmIChpbmhlcml0TmFtZShUbmFtZS0+ZWxlbWVudHMsIFRuYW1lLT5zaXplKSkgewotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgaWYgKGlzQXJyYXkoKSkgewotICAgIFVzZXJDb21tb25DbGFzcyogY3VyUyA9IHRoaXM7Ci0gICAgdWludDMyIHByb2YgPSAwOwotICAgIHVpbnQzMiBsZW4gPSBUbmFtZS0+c2l6ZTsKLSAgICBib29sIHJlcyA9IHRydWU7Ci0gICAgCi0gICAgd2hpbGUgKHJlcyAmJiBUbmFtZS0+ZWxlbWVudHNbcHJvZl0gPT0gSV9UQUIpIHsKLSAgICAgIFVzZXJDb21tb25DbGFzcyogY2wgPSAoKFVzZXJDbGFzc0FycmF5KiljdXJTKS0+YmFzZUNsYXNzKCk7Ci0gICAgICArK3Byb2Y7Ci0gICAgICBpZiAoY2wtPmlzQ2xhc3MoKSkgY2wtPmFzQ2xhc3MoKS0+cmVzb2x2ZUNsYXNzKCk7Ci0gICAgICByZXMgPSBjdXJTLT5pc0FycmF5KCkgJiYgY2wgJiYgKHByb2YgPCBsZW4pOwotICAgICAgY3VyUyA9IGNsOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gKFRuYW1lLT5lbGVtZW50c1twcm9mXSA9PSBJX1JFRikgJiYgIAotICAgICAgKHJlcyAmJiBjdXJTLT5pbmhlcml0TmFtZSgmKFRuYW1lLT5lbGVtZW50c1twcm9mICsgMV0pLCBsZW4gLSAxKSk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWJvb2wgVXNlckNvbW1vbkNsYXNzOjppc0Fzc2lnbmFibGVGcm9tKFVzZXJDb21tb25DbGFzcyogY2wpIHsKLSAgYXNzZXJ0KHZpcnR1YWxWVCAmJiBjbC0+dmlydHVhbFZUKTsKLSAgcmV0dXJuIHZpcnR1YWxWVC0+aXNTdWJ0eXBlT2YoY2wtPnZpcnR1YWxWVCk7Ci19Ci0KLWJvb2wgSmF2YVZpcnR1YWxUYWJsZTo6aXNTdWJ0eXBlT2YoSmF2YVZpcnR1YWxUYWJsZSogb3RoZXJWVCkgewotIAotICBhc3NlcnQodGhpcyk7Ci0gIGFzc2VydChvdGhlclZUKTsKLSAgaWYgKG90aGVyVlQgPT0gKChKYXZhVmlydHVhbFRhYmxlKiopdGhpcylbb3RoZXJWVC0+b2Zmc2V0XSkgcmV0dXJuIHRydWU7Ci0gIGVsc2UgaWYgKG90aGVyVlQtPm9mZnNldCAhPSBnZXRDYWNoZUluZGV4KCkpIHJldHVybiBmYWxzZTsKLSAgZWxzZSBpZiAodGhpcyA9PSBvdGhlclZUKSByZXR1cm4gdHJ1ZTsKLSAgZWxzZSB7Ci0gICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBuYlNlY29uZGFyeVR5cGVzOyArK2kpIHsKLSAgICAgIGlmIChzZWNvbmRhcnlUeXBlc1tpXSA9PSBvdGhlclZUKSB7Ci0gICAgICAgIGNhY2hlID0gb3RoZXJWVDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBKYXZhRmllbGQ6OkluaXROdWxsU3RhdGljRmllbGQoKSB7Ci0gIAotICBUeXBlZGVmKiB0eXBlID0gZ2V0U2lnbmF0dXJlKCk7Ci0gIHZvaWQqIG9iaiA9IGNsYXNzRGVmLT5nZXRTdGF0aWNJbnN0YW5jZSgpOwotICBpZiAoIXR5cGUtPmlzUHJpbWl0aXZlKCkpIHsKLSAgICAoKEphdmFPYmplY3QqKikoKHVpbnQ2NClvYmogKyBwdHJPZmZzZXQpKVswXSA9IE5VTEw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgUHJpbWl0aXZlVHlwZWRlZiogcHJpbSA9IChQcmltaXRpdmVUeXBlZGVmKil0eXBlOwotICBpZiAocHJpbS0+aXNMb25nKCkpIHsKLSAgICAoKHNpbnQ2NCopKCh1aW50NjQpb2JqICsgcHRyT2Zmc2V0KSlbMF0gPSAwOwotICB9IGVsc2UgaWYgKHByaW0tPmlzSW50KCkpIHsKLSAgICAoKHNpbnQzMiopKCh1aW50NjQpb2JqICsgcHRyT2Zmc2V0KSlbMF0gPSAwOwotICB9IGVsc2UgaWYgKHByaW0tPmlzQ2hhcigpKSB7Ci0gICAgKCh1aW50MTYqKSgodWludDY0KW9iaiArIHB0ck9mZnNldCkpWzBdID0gMDsKLSAgfSBlbHNlIGlmIChwcmltLT5pc1Nob3J0KCkpIHsKLSAgICAoKHNpbnQxNiopKCh1aW50NjQpb2JqICsgcHRyT2Zmc2V0KSlbMF0gPSAwOwotICB9IGVsc2UgaWYgKHByaW0tPmlzQnl0ZSgpKSB7Ci0gICAgKChzaW50OCopKCh1aW50NjQpb2JqICsgcHRyT2Zmc2V0KSlbMF0gPSAwOwotICB9IGVsc2UgaWYgKHByaW0tPmlzQm9vbCgpKSB7Ci0gICAgKCh1aW50OCopKCh1aW50NjQpb2JqICsgcHRyT2Zmc2V0KSlbMF0gPSAwOwotICB9IGVsc2UgaWYgKHByaW0tPmlzRG91YmxlKCkpIHsKLSAgICAoKGRvdWJsZSopKCh1aW50NjQpb2JqICsgcHRyT2Zmc2V0KSlbMF0gPSAwLjA7Ci0gIH0gZWxzZSBpZiAocHJpbS0+aXNGbG9hdCgpKSB7Ci0gICAgKChmbG9hdCopKCh1aW50NjQpb2JqICsgcHRyT2Zmc2V0KSlbMF0gPSAwLjA7Ci0gIH0gZWxzZSB7Ci0gICAgYWJvcnQoKTsKLSAgfQotfQotCi12b2lkIEphdmFGaWVsZDo6SW5pdFN0YXRpY0ZpZWxkKHVpbnQ2NCB2YWwpIHsgCi0gIFR5cGVkZWYqIHR5cGUgPSBnZXRTaWduYXR1cmUoKTsKLSAgdm9pZCogb2JqID0gY2xhc3NEZWYtPmdldFN0YXRpY0luc3RhbmNlKCk7Ci0gIGFzc2VydCh0eXBlLT5pc1ByaW1pdGl2ZSgpICYmICJOb24gcHJpbWl0aXZlIGZpZWxkIik7Ci0gIFByaW1pdGl2ZVR5cGVkZWYqIHByaW0gPSAoUHJpbWl0aXZlVHlwZWRlZiopdHlwZTsKLSAgaWYgKHByaW0tPmlzTG9uZygpKSB7Ci0gICAgKChzaW50NjQqKSgodWludDY0KW9iaiArIHB0ck9mZnNldCkpWzBdID0gdmFsOwotICB9IGVsc2UgaWYgKHByaW0tPmlzSW50KCkpIHsKLSAgICAoKHNpbnQzMiopKCh1aW50NjQpb2JqICsgcHRyT2Zmc2V0KSlbMF0gPSAoc2ludDMyKXZhbDsKLSAgfSBlbHNlIGlmIChwcmltLT5pc0NoYXIoKSkgewotICAgICgodWludDE2KikoKHVpbnQ2NClvYmogKyBwdHJPZmZzZXQpKVswXSA9ICh1aW50MTYpdmFsOwotICB9IGVsc2UgaWYgKHByaW0tPmlzU2hvcnQoKSkgewotICAgICgoc2ludDE2KikoKHVpbnQ2NClvYmogKyBwdHJPZmZzZXQpKVswXSA9IChzaW50MTYpdmFsOwotICB9IGVsc2UgaWYgKHByaW0tPmlzQnl0ZSgpKSB7Ci0gICAgKChzaW50OCopKCh1aW50NjQpb2JqICsgcHRyT2Zmc2V0KSlbMF0gPSAoc2ludDgpdmFsOwotICB9IGVsc2UgaWYgKHByaW0tPmlzQm9vbCgpKSB7Ci0gICAgKCh1aW50OCopKCh1aW50NjQpb2JqICsgcHRyT2Zmc2V0KSlbMF0gPSAodWludDgpdmFsOwotICB9IGVsc2UgewotICAgIC8vIFNob3VsZCBuZXZlciBiZSBoZXJlLgotICAgIGFib3J0KCk7Ci0gIH0KLX0KLQotdm9pZCBKYXZhRmllbGQ6OkluaXRTdGF0aWNGaWVsZChKYXZhT2JqZWN0KiB2YWwpIHsKLSAgbGx2bV9nY3Jvb3QodmFsLCAwKTsKLSAgdm9pZCogb2JqID0gY2xhc3NEZWYtPmdldFN0YXRpY0luc3RhbmNlKCk7Ci0gICgoSmF2YU9iamVjdCoqKSgodWludDY0KW9iaiArIHB0ck9mZnNldCkpWzBdID0gdmFsOwotfQotCi12b2lkIEphdmFGaWVsZDo6SW5pdFN0YXRpY0ZpZWxkKGRvdWJsZSB2YWwpIHsKLSAgdm9pZCogb2JqID0gY2xhc3NEZWYtPmdldFN0YXRpY0luc3RhbmNlKCk7Ci0gICgoZG91YmxlKikoKHVpbnQ2NClvYmogKyBwdHJPZmZzZXQpKVswXSA9IHZhbDsKLX0KLQotdm9pZCBKYXZhRmllbGQ6OkluaXRTdGF0aWNGaWVsZChmbG9hdCB2YWwpIHsKLSAgdm9pZCogb2JqID0gY2xhc3NEZWYtPmdldFN0YXRpY0luc3RhbmNlKCk7Ci0gICgoZmxvYXQqKSgodWludDY0KW9iaiArIHB0ck9mZnNldCkpWzBdID0gdmFsOwotfQotCi12b2lkIEphdmFGaWVsZDo6SW5pdFN0YXRpY0ZpZWxkKCkgewotICBjb25zdCBUeXBlZGVmKiB0eXBlID0gZ2V0U2lnbmF0dXJlKCk7Ci0gIEF0dHJpYnV0KiBhdHRyaWJ1dCA9IGxvb2t1cEF0dHJpYnV0KEF0dHJpYnV0Ojpjb25zdGFudEF0dHJpYnV0KTsKLQotICBpZiAoIWF0dHJpYnV0KSB7Ci0gICAgSW5pdE51bGxTdGF0aWNGaWVsZCgpOwotICB9IGVsc2UgewotICAgIFJlYWRlciByZWFkZXIoYXR0cmlidXQsIGNsYXNzRGVmLT5ieXRlcyk7Ci0gICAgSmF2YUNvbnN0YW50UG9vbCAqIGN0cEluZm8gPSBjbGFzc0RlZi0+Y3RwSW5mbzsKLSAgICB1aW50MTYgaWR4ID0gcmVhZGVyLnJlYWRVMigpOwotICAgIGlmICh0eXBlLT5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQlKbmp2bSogdm0gPSBjbGFzc0RlZi0+Y2xhc3NMb2FkZXItPnZtOwotICAgICAgVXNlckNvbW1vbkNsYXNzKiBjbCA9IHR5cGUtPmFzc29jQ2xhc3Modm0tPmJvb3RzdHJhcExvYWRlcik7Ci0gICAgICBpZiAoY2wgPT0gdm0tPnVwY2FsbHMtPk9mTG9uZykgewotICAgICAgICBJbml0U3RhdGljRmllbGQoKHVpbnQ2NCljdHBJbmZvLT5Mb25nQXQoaWR4KSk7Ci0gICAgICB9IGVsc2UgaWYgKGNsID09IHZtLT51cGNhbGxzLT5PZkRvdWJsZSkgewotICAgICAgICBJbml0U3RhdGljRmllbGQoY3RwSW5mby0+RG91YmxlQXQoaWR4KSk7Ci0gICAgICB9IGVsc2UgaWYgKGNsID09IHZtLT51cGNhbGxzLT5PZkZsb2F0KSB7Ci0gICAgICAgIEluaXRTdGF0aWNGaWVsZChjdHBJbmZvLT5GbG9hdEF0KGlkeCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgSW5pdFN0YXRpY0ZpZWxkKCh1aW50NjQpY3RwSW5mby0+SW50ZWdlckF0KGlkeCkpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNSZWZlcmVuY2UoKSl7Ci0gICAgICBjb25zdCBVVEY4KiB1dGY4ID0gY3RwSW5mby0+VVRGOEF0KGN0cEluZm8tPmN0cERlZltpZHhdKTsKLSAgICAgIEluaXRTdGF0aWNGaWVsZCgoSmF2YU9iamVjdCopY3RwSW5mby0+cmVzb2x2ZVN0cmluZyh1dGY4LCBpZHgpKTsKLSAgICB9IGVsc2UgewotICAgICAgZnByaW50ZihzdGRlcnIsICJJIGhhdmVuJ3QgdmVyaWZpZWQgeW91ciBjbGFzcyBmaWxlIGFuZCBpdCdzIG1hbGZvcm1lZDoiCi0gICAgICAgICAgICAgICAgICAgICAgIiB1bmtub3duIGNvbnN0YW50ICVzIVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICBVVEY4QnVmZmVyKHR5cGUtPmtleU5hbWUpLmNTdHJpbmcoKSk7Ci0gICAgICBhYm9ydCgpOwotICAgIH0KLSAgfSAKLX0KLQotdm9pZCogVXNlckNsYXNzOjphbGxvY2F0ZVN0YXRpY0luc3RhbmNlKCkgewotI2lmZGVmIFVTRV9HQ19CT0VITQotICB2b2lkKiB2YWwgPSBHQ19NQUxMT0MoZ2V0U3RhdGljU2l6ZSgpKTsKLSNlbHNlCi0gIHZvaWQqIHZhbCA9IGNsYXNzTG9hZGVyLT5hbGxvY2F0b3IuQWxsb2NhdGUoZ2V0U3RhdGljU2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdGF0aWMgaW5zdGFuY2UiKTsKLSNlbmRpZgotICBzZXRTdGF0aWNJbnN0YW5jZSh2YWwpOwotICByZXR1cm4gdmFsOwotfQotCi0KLXZvaWQgSmF2YU1ldGhvZDo6aW5pdGlhbGlzZShDbGFzcyogY2wsIGNvbnN0IFVURjgqIE4sIGNvbnN0IFVURjgqIFQsIHVpbnQxNiBBKSB7Ci0gIG5hbWUgPSBOOwotICB0eXBlID0gVDsKLSAgY2xhc3NEZWYgPSBjbDsKLSAgX3NpZ25hdHVyZSA9IDA7Ci0gIGNvZGUgPSAwOwotICBhY2Nlc3MgPSBBOwotICBjYW5CZUlubGluZWQgPSBmYWxzZTsKLSAgb2Zmc2V0ID0gMDsKLSAgY29kZUluZm8gPSBOVUxMOwotfQotCi12b2lkIEphdmFGaWVsZDo6aW5pdGlhbGlzZShDbGFzcyogY2wsIGNvbnN0IFVURjgqIE4sIGNvbnN0IFVURjgqIFQsIHVpbnQxNiBBKSB7Ci0gIG5hbWUgPSBOOwotICB0eXBlID0gVDsKLSAgY2xhc3NEZWYgPSBjbDsKLSAgX3NpZ25hdHVyZSA9IDA7Ci0gIHB0ck9mZnNldCA9IDA7Ci0gIGFjY2VzcyA9IEE7Ci19Ci0KLXZvaWQgQ2xhc3M6OnJlYWRQYXJlbnRzKFJlYWRlciYgcmVhZGVyKSB7Ci0gIHVpbnQxNiBzdXBlckVudHJ5ID0gcmVhZGVyLnJlYWRVMigpOwotICBpZiAoc3VwZXJFbnRyeSkgewotICAgIGNvbnN0IFVURjgqIHN1cGVyVVRGOCA9IGN0cEluZm8tPnJlc29sdmVDbGFzc05hbWUoc3VwZXJFbnRyeSk7Ci0gICAgc3VwZXIgPSBjbGFzc0xvYWRlci0+bG9hZE5hbWUoc3VwZXJVVEY4LCBmYWxzZSwgdHJ1ZSwgTlVMTCk7Ci0gIH0KLQotICB1aW50MTYgbmJJID0gcmVhZGVyLnJlYWRVMigpOwotCi0gIGludGVyZmFjZXMgPSAoQ2xhc3MqKikKLSAgICBjbGFzc0xvYWRlci0+YWxsb2NhdG9yLkFsbG9jYXRlKG5iSSAqIHNpemVvZihDbGFzcyopLCAiSW50ZXJmYWNlcyIpOwotICAKLSAgLy8gRG8gbm90IHNldCBuYkludGVyZmFjZXMgeWV0LCB3ZSBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIEdDCi0gIC8vIGluIGFub24tY29vcGVyYXRpdmUgZW52aXJvbm1lbnQuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgbmJJOyBpKyspIHsKLSAgICBjb25zdCBVVEY4KiBuYW1lID0gY3RwSW5mby0+cmVzb2x2ZUNsYXNzTmFtZShyZWFkZXIucmVhZFUyKCkpOwotICAgIGludGVyZmFjZXNbaV0gPSBjbGFzc0xvYWRlci0+bG9hZE5hbWUobmFtZSwgZmFsc2UsIHRydWUsIE5VTEwpOwotICB9Ci0gIG5iSW50ZXJmYWNlcyA9IG5iSTsKLQotfQotCi12b2lkIGludGVybmFsTG9hZEV4Y2VwdGlvbnMoSmF2YU1ldGhvZCYgbWV0aCkgewotICAKLSAgQXR0cmlidXQqIGNvZGVBdHQgPSBtZXRoLmxvb2t1cEF0dHJpYnV0KEF0dHJpYnV0Ojpjb2RlQXR0cmlidXQpOwotICAgCi0gIGlmIChjb2RlQXR0KSB7Ci0gICAgUmVhZGVyIHJlYWRlcihjb2RlQXR0LCBtZXRoLmNsYXNzRGVmLT5ieXRlcyk7Ci0gICAgLy91aW50MTYgbWF4U3RhY2sgPQotICAgIHJlYWRlci5yZWFkVTIoKTsKLSAgICAvL3VpbnQxNiBtYXhMb2NhbHMgPSAKLSAgICByZWFkZXIucmVhZFUyKCk7Ci0gICAgdWludDE2IGNvZGVMZW4gPSByZWFkZXIucmVhZFU0KCk7Ci0gIAotICAgIHJlYWRlci5zZWVrKGNvZGVMZW4sIFJlYWRlcjo6U2Vla0N1cik7Ci0KLSAgICB1aW50MTYgbmJlID0gcmVhZGVyLnJlYWRVMigpOwotICAgIGZvciAodWludDE2IGkgPSAwOyBpIDwgbmJlOyArK2kpIHsKLSAgICAgIC8vc3RhcnRwYyA9IAotICAgICAgcmVhZGVyLnJlYWRVMigpOwotICAgICAgLy9lbmRwYz0KLSAgICAgIHJlYWRlci5yZWFkVTIoKTsKLSAgICAgIC8vaGFuZGxlcnBjID0KLSAgICAgIHJlYWRlci5yZWFkVTIoKTsKLQotICAgICAgdWludDE2IGNhdGNoZSA9IHJlYWRlci5yZWFkVTIoKTsKLSAgICAgIGlmIChjYXRjaGUpIG1ldGguY2xhc3NEZWYtPmN0cEluZm8tPmxvYWRDbGFzcyhjYXRjaGUsIGZhbHNlKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBVc2VyQ2xhc3M6OmxvYWRFeGNlcHRpb25zKCkgewotICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IG5iVmlydHVhbE1ldGhvZHM7ICsraSkKLSAgICBpbnRlcm5hbExvYWRFeGNlcHRpb25zKHZpcnR1YWxNZXRob2RzW2ldKTsKLSAgCi0gIGZvciAodWludDMyIGkgPSAwOyBpIDwgbmJTdGF0aWNNZXRob2RzOyArK2kpCi0gICAgaW50ZXJuYWxMb2FkRXhjZXB0aW9ucyhzdGF0aWNNZXRob2RzW2ldKTsKLX0KLQotQXR0cmlidXQqIENsYXNzOjpyZWFkQXR0cmlidXRzKFJlYWRlciYgcmVhZGVyLCB1aW50MTYmIHNpemUpIHsKLSAgdWludDE2IG5iYSA9IHJlYWRlci5yZWFkVTIoKTsKLSAKLSAgQXR0cmlidXQqIGF0dHJpYnV0cyA9IG5ldyhjbGFzc0xvYWRlci0+YWxsb2NhdG9yLCAiQXR0cmlidXRzIikgQXR0cmlidXRbbmJhXTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IG5iYTsgaSsrKSB7Ci0gICAgY29uc3QgVVRGOCogYXR0TmFtZSA9IGN0cEluZm8tPlVURjhBdChyZWFkZXIucmVhZFUyKCkpOwotICAgIHVpbnQzMiBhdHRMZW4gPSByZWFkZXIucmVhZFU0KCk7Ci0gICAgQXR0cmlidXQmIGF0dCA9IGF0dHJpYnV0c1tpXTsKLSAgICBhdHQuc3RhcnQgPSByZWFkZXIuY3Vyc29yOwotICAgIGF0dC5uYmIgPSBhdHRMZW47Ci0gICAgYXR0Lm5hbWUgPSBhdHROYW1lOwotICAgIHJlYWRlci5zZWVrKGF0dExlbiwgUmVhZGVyOjpTZWVrQ3VyKTsKLSAgfQotCi0gIHNpemUgPSBuYmE7Ci0gIHJldHVybiBhdHRyaWJ1dHM7Ci19Ci0KLXZvaWQgQ2xhc3M6OnJlYWRGaWVsZHMoUmVhZGVyJiByZWFkZXIpIHsKLSAgdWludDE2IG5iRmllbGRzID0gcmVhZGVyLnJlYWRVMigpOwotICB2aXJ0dWFsRmllbGRzID0gbmV3IChjbGFzc0xvYWRlci0+YWxsb2NhdG9yLCAiRmllbGRzIikgSmF2YUZpZWxkW25iRmllbGRzXTsKLSAgc3RhdGljRmllbGRzID0gdmlydHVhbEZpZWxkcyArIG5iRmllbGRzOwotICBmb3IgKGludCBpID0gMDsgaSA8IG5iRmllbGRzOyBpKyspIHsKLSAgICB1aW50MTYgYWNjZXNzID0gcmVhZGVyLnJlYWRVMigpOwotICAgIGNvbnN0IFVURjgqIG5hbWUgPSBjdHBJbmZvLT5VVEY4QXQocmVhZGVyLnJlYWRVMigpKTsKLSAgICBjb25zdCBVVEY4KiB0eXBlID0gY3RwSW5mby0+VVRGOEF0KHJlYWRlci5yZWFkVTIoKSk7Ci0gICAgSmF2YUZpZWxkKiBmaWVsZCA9IDA7Ci0gICAgaWYgKGlzU3RhdGljKGFjY2VzcykpIHsKLSAgICAgIC0tc3RhdGljRmllbGRzOwotICAgICAgZmllbGQgPSAmKHN0YXRpY0ZpZWxkc1swXSk7Ci0gICAgICBmaWVsZC0+aW5pdGlhbGlzZSh0aGlzLCBuYW1lLCB0eXBlLCBhY2Nlc3MpOwotICAgICAgKytuYlN0YXRpY0ZpZWxkczsKLSAgICB9IGVsc2UgewotICAgICAgZmllbGQgPSAmKHZpcnR1YWxGaWVsZHNbbmJWaXJ0dWFsRmllbGRzXSk7Ci0gICAgICBmaWVsZC0+aW5pdGlhbGlzZSh0aGlzLCBuYW1lLCB0eXBlLCBhY2Nlc3MpOwotICAgICAgKytuYlZpcnR1YWxGaWVsZHM7Ci0gICAgfQotICAgIGZpZWxkLT5hdHRyaWJ1dHMgPSByZWFkQXR0cmlidXRzKHJlYWRlciwgZmllbGQtPm5iQXR0cmlidXRzKTsKLSAgfQotfQotCi12b2lkIENsYXNzOjpmaWxsSU1UKHN0ZDo6c2V0PEphdmFNZXRob2QqPiogbWV0aHMpIHsKLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBuYkludGVyZmFjZXM7ICsraSkgewotICAgIGludGVyZmFjZXNbaV0tPmZpbGxJTVQobWV0aHMpOwotICB9Ci0KLSAgaWYgKHN1cGVyICE9IE5VTEwpIHsKLSAgICBzdXBlci0+ZmlsbElNVChtZXRocyk7Ci0gIH0KLQotICAvLyBTcGVjaWZpY2F0aW9uIHNheXMgdGhhdCBhbiBpbnZva2VpbnRlcmZhY2UgYWxzbyBsb29rcyBhdCBqLmwuT2JqZWN0LgotICBpZiAoaXNJbnRlcmZhY2UoKSB8fCAoc3VwZXIgPT0gTlVMTCkpIHsKLSAgICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IG5iVmlydHVhbE1ldGhvZHM7ICsraSkgewotICAgICAgSmF2YU1ldGhvZCYgbWV0aCA9IHZpcnR1YWxNZXRob2RzW2ldOwotICAgICAgdWludDMyX3QgaW5kZXggPSBJbnRlcmZhY2VNZXRob2RUYWJsZTo6Z2V0SW5kZXgobWV0aC5uYW1lLCBtZXRoLnR5cGUpOwotICAgICAgbWV0aHNbaW5kZXhdLmluc2VydCgmbWV0aCk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ2xhc3M6Om1ha2VWVCgpIHsKLSAgaWYgKHN1cGVyID09IE5VTEwpIHsKLSAgICB2aXJ0dWFsVGFibGVTaXplID0gSmF2YVZpcnR1YWxUYWJsZTo6Z2V0Rmlyc3RKYXZhTWV0aG9kSW5kZXgoKTsKLSAgfSBlbHNlICB7Ci0gICAgdmlydHVhbFRhYmxlU2l6ZSA9IHN1cGVyLT52aXJ0dWFsVGFibGVTaXplOwotICB9Ci0gIAotICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IG5iVmlydHVhbE1ldGhvZHM7ICsraSkgewotICAgIEphdmFNZXRob2QmIG1ldGggPSB2aXJ0dWFsTWV0aG9kc1tpXTsKLSAgICBpZiAobWV0aC5uYW1lLT5lcXVhbHMoY2xhc3NMb2FkZXItPnZtLT51cGNhbGxzLT5maW5hbGl6ZSkgJiYKLSAgICAgICAgbWV0aC50eXBlLT5lcXVhbHMoY2xhc3NMb2FkZXItPnZtLT51cGNhbGxzLT5jbGluaXRUeXBlKSkgewotICAgICAgbWV0aC5vZmZzZXQgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICBKYXZhTWV0aG9kKiBwYXJlbnQgPSBzdXBlcj8gCi0gICAgICAgIHN1cGVyLT5sb29rdXBNZXRob2REb250VGhyb3cobWV0aC5uYW1lLCBtZXRoLnR5cGUsIGZhbHNlLCB0cnVlLCAwKSA6Ci0gICAgICAgIDA7Ci0KLSAgICAgIHVpbnQ2NF90IG9mZnNldCA9IDA7Ci0gICAgICBpZiAoIXBhcmVudCkgewotICAgICAgICBvZmZzZXQgPSB2aXJ0dWFsVGFibGVTaXplKys7Ci0gICAgICAgIG1ldGgub2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb2Zmc2V0ID0gcGFyZW50LT5vZmZzZXQ7Ci0gICAgICAgIG1ldGgub2Zmc2V0ID0gcGFyZW50LT5vZmZzZXQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgbXZtOjpCdW1wUHRyQWxsb2NhdG9yJiBhbGxvY2F0b3IgPSBjbGFzc0xvYWRlci0+YWxsb2NhdG9yOwotICB2aXJ0dWFsVlQgPSBuZXcoYWxsb2NhdG9yLCB2aXJ0dWFsVGFibGVTaXplKSBKYXZhVmlydHVhbFRhYmxlKHRoaXMpOwotfQotCi1zdGF0aWMgdm9pZCBjb21wdXRlTWlyYW5kYU1ldGhvZHMoQ2xhc3MqIGN1cnJlbnQsCi0gICAgQ2xhc3MqIGJhc2VDbGFzcywgc3RkOjp2ZWN0b3I8SmF2YU1ldGhvZCo+JiBtaXJhbmRhTWV0aG9kcykgewotICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IGN1cnJlbnQtPm5iSW50ZXJmYWNlczsgaSsrKSB7Ci0gICAgQ2xhc3MqIEkgPSBjdXJyZW50LT5pbnRlcmZhY2VzW2ldOwotCQkvLyBUT0RPOiBBdCB0aGlzIHBvaW50LCB0aGUgaW50ZXJmYWNlIG1heSBoYXZlIG5vdCBiZWVuIHJlYWQsIHNvIHRoZXJlCi0JCS8vIGlzIG5vIG1ldGhvZHMgeWV0LgotICAgIGZvciAodWludDMyIGogPSAwOyBqIDwgSS0+bmJWaXJ0dWFsTWV0aG9kczsgaisrKSB7Ci0gICAgICBKYXZhTWV0aG9kJiBvcmlnID0gSS0+dmlydHVhbE1ldGhvZHNbal07Ci0gICAgICBKYXZhTWV0aG9kKiBtZXRoID0gYmFzZUNsYXNzLT5sb29rdXBNZXRob2REb250VGhyb3cob3JpZy5uYW1lLCBvcmlnLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHRydWUsIDApOwotICAgICAgaWYgKG1ldGggPT0gTlVMTCkgewotICAgICAgICBtaXJhbmRhTWV0aG9kcy5wdXNoX2JhY2soJm9yaWcpOwotICAgICAgfQotICAgIH0KLSAgICBjb21wdXRlTWlyYW5kYU1ldGhvZHMoSSwgYmFzZUNsYXNzLCBtaXJhbmRhTWV0aG9kcyk7Ci0gIH0KLX0KLQotdm9pZCBDbGFzczo6cmVhZE1ldGhvZHMoUmVhZGVyJiByZWFkZXIpIHsKLSAgdWludDE2IG5iTWV0aG9kcyA9IHJlYWRlci5yZWFkVTIoKTsKLSAgbXZtOjpUaHJlYWRBbGxvY2F0b3IgYWxsb2NhdG9yOwotICBpZiAoaXNBYnN0cmFjdChhY2Nlc3MpKSB7Ci0gICAgdmlydHVhbE1ldGhvZHMgPSAoSmF2YU1ldGhvZCopCi0gICAgICBhbGxvY2F0b3IuQWxsb2NhdGUobmJNZXRob2RzICogc2l6ZW9mKEphdmFNZXRob2QpKTsKLSAgfSBlbHNlIHsKLSAgICB2aXJ0dWFsTWV0aG9kcyA9Ci0gICAgICBuZXcoY2xhc3NMb2FkZXItPmFsbG9jYXRvciwgIk1ldGhvZHMiKSBKYXZhTWV0aG9kW25iTWV0aG9kc107Ci0gIH0KLSAgc3RhdGljTWV0aG9kcyA9IHZpcnR1YWxNZXRob2RzICsgbmJNZXRob2RzOwotICBmb3IgKGludCBpID0gMDsgaSA8IG5iTWV0aG9kczsgaSsrKSB7Ci0gICAgdWludDE2IGFjY2VzcyA9IHJlYWRlci5yZWFkVTIoKTsKLSAgICBjb25zdCBVVEY4KiBuYW1lID0gY3RwSW5mby0+VVRGOEF0KHJlYWRlci5yZWFkVTIoKSk7Ci0gICAgY29uc3QgVVRGOCogdHlwZSA9IGN0cEluZm8tPlVURjhBdChyZWFkZXIucmVhZFUyKCkpOwotICAgIEphdmFNZXRob2QqIG1ldGggPSAwOwotICAgIGlmIChpc1N0YXRpYyhhY2Nlc3MpKSB7Ci0gICAgICAtLXN0YXRpY01ldGhvZHM7Ci0gICAgICBtZXRoID0gJihzdGF0aWNNZXRob2RzWzBdKTsKLSAgICAgIG1ldGgtPmluaXRpYWxpc2UodGhpcywgbmFtZSwgdHlwZSwgYWNjZXNzKTsKLSAgICAgICsrbmJTdGF0aWNNZXRob2RzOwotICAgIH0gZWxzZSB7Ci0gICAgICBtZXRoID0gJih2aXJ0dWFsTWV0aG9kc1tuYlZpcnR1YWxNZXRob2RzXSk7Ci0gICAgICBtZXRoLT5pbml0aWFsaXNlKHRoaXMsIG5hbWUsIHR5cGUsIGFjY2Vzcyk7Ci0gICAgICArK25iVmlydHVhbE1ldGhvZHM7Ci0gICAgfQotICAgIG1ldGgtPmF0dHJpYnV0cyA9IHJlYWRBdHRyaWJ1dHMocmVhZGVyLCBtZXRoLT5uYkF0dHJpYnV0cyk7Ci0gIH0KLQotICBpZiAoaXNBYnN0cmFjdChhY2Nlc3MpKSB7Ci0gICAgc3RkOjp2ZWN0b3I8SmF2YU1ldGhvZCo+IG1pcmFuZGFNZXRob2RzOwotICAgIGNvbXB1dGVNaXJhbmRhTWV0aG9kcyh0aGlzLCB0aGlzLCBtaXJhbmRhTWV0aG9kcyk7Ci0gICAgdWludDMyIHNpemUgPSBtaXJhbmRhTWV0aG9kcy5zaXplKCk7Ci0gICAgbmJNZXRob2RzICs9IHNpemU7Ci0gICAgSmF2YU1ldGhvZCogcmVhbE1ldGhvZHMgPQotICAgICAgbmV3KGNsYXNzTG9hZGVyLT5hbGxvY2F0b3IsICJNZXRob2RzIikgSmF2YU1ldGhvZFtuYk1ldGhvZHNdOwotICAgIG1lbWNweShyZWFsTWV0aG9kcyArIHNpemUsIHZpcnR1YWxNZXRob2RzLAotICAgICAgICAgICBzaXplb2YoSmF2YU1ldGhvZCkgKiAobmJNZXRob2RzIC0gc2l6ZSkpOwotICAgIG5iVmlydHVhbE1ldGhvZHMgKz0gc2l6ZTsKLSAgICBzdGF0aWNNZXRob2RzID0gcmVhbE1ldGhvZHMgKyBuYlZpcnR1YWxNZXRob2RzOwotICAgIGlmIChzaXplICE9IDApIHsKLSAgICAgIGludCBqID0gMDsKLSAgICAgIGZvciAoc3RkOjp2ZWN0b3I8SmF2YU1ldGhvZCo+OjppdGVyYXRvciBpID0gbWlyYW5kYU1ldGhvZHMuYmVnaW4oKSwKLSAgICAgICAgICAgZSA9IG1pcmFuZGFNZXRob2RzLmVuZCgpOyBpICE9IGU7IGkrKykgewotICAgICAgICBKYXZhTWV0aG9kKiBjdXIgPSAqaTsKLSAgICAgICAgcmVhbE1ldGhvZHNbaisrXS5pbml0aWFsaXNlKHRoaXMsIGN1ci0+bmFtZSwgY3VyLT50eXBlLCBjdXItPmFjY2Vzcyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHZpcnR1YWxNZXRob2RzID0gcmVhbE1ldGhvZHM7Ci0gIH0KLX0KLQotdm9pZCBDbGFzczo6cmVhZENsYXNzKCkgewotCi0gIGFzc2VydChnZXRJbml0aWFsaXphdGlvblN0YXRlKCkgPT0gbG9hZGVkICYmICJXcm9uZyBpbml0IHN0YXRlIik7Ci0gIAotICBQUklOVF9ERUJVRyhKTkpWTV9MT0FELCAwLCBDT0xPUl9OT1JNQUwsICI7ICIsIDApOwotICBQUklOVF9ERUJVRyhKTkpWTV9MT0FELCAwLCBMSUdIVF9HUkVFTiwgInJlYWRpbmcgIiwgMCk7Ci0gIFBSSU5UX0RFQlVHKEpOSlZNX0xPQUQsIDAsIENPTE9SX05PUk1BTCwgIiVzXG4iLCBtdm06OlByaW50QnVmZmVyKHRoaXMpLmNTdHJpbmcoKSk7Ci0KLSAgUmVhZGVyIHJlYWRlcihieXRlcyk7Ci0gIHVpbnQzMiBtYWdpYyA9IHJlYWRlci5yZWFkVTQoKTsKLSAgYXNzZXJ0KG1hZ2ljID09IEpuanZtOjpNYWdpYyAmJiAiSSd2ZSBjcmVhdGVkIGEgY2xhc3MgYnV0IG1hZ2ljIGlzIG5vIGdvb2QhIik7Ci0KLSAgLyogdWludDE2IG1pbm9yID0gKi8gcmVhZGVyLnJlYWRVMigpOwotICAvKiB1aW50MTYgbWFqb3IgPSAqLyByZWFkZXIucmVhZFUyKCk7Ci0gIHVpbnQzMiBjdHBTaXplID0gcmVhZGVyLnJlYWRVMigpOwotICBjdHBJbmZvID0gbmV3KGNsYXNzTG9hZGVyLT5hbGxvY2F0b3IsIGN0cFNpemUpIEphdmFDb25zdGFudFBvb2wodGhpcywgcmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RwU2l6ZSk7Ci0gIGFjY2VzcyB8PSAocmVhZGVyLnJlYWRVMigpICYgMHgwRkZGKTsKLSAgCi0gIGlmICghaXNQdWJsaWMoYWNjZXNzKSkgYWNjZXNzIHw9IEFDQ19QUklWQVRFOwotCi0gIGNvbnN0IFVURjgqIHRoaXNDbGFzc05hbWUgPSAKLSAgICBjdHBJbmZvLT5yZXNvbHZlQ2xhc3NOYW1lKHJlYWRlci5yZWFkVTIoKSk7Ci0gIAotICBpZiAoISh0aGlzQ2xhc3NOYW1lLT5lcXVhbHMobmFtZSkpKSB7Ci0gICAgY2xhc3NMb2FkZXItPnZtLT5ub0NsYXNzRGVmRm91bmRFcnJvcih0aGlzLCB0aGlzQ2xhc3NOYW1lKTsKLSAgfQotCi0gIHJlYWRQYXJlbnRzKHJlYWRlcik7Ci0gIHJlYWRGaWVsZHMocmVhZGVyKTsKLSAgcmVhZE1ldGhvZHMocmVhZGVyKTsKLSAgYXR0cmlidXRzID0gcmVhZEF0dHJpYnV0cyhyZWFkZXIsIG5iQXR0cmlidXRzKTsKLX0KLQotdm9pZCBVc2VyQ2xhc3M6OnJlc29sdmVQYXJlbnRzKCkgewotICBpZiAoc3VwZXIgIT0gTlVMTCkgewotICAgIHN1cGVyLT5yZXNvbHZlQ2xhc3MoKTsKLSAgfQotCi0gIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuYkludGVyZmFjZXM7IGkrKykKLSAgICBpbnRlcmZhY2VzW2ldLT5yZXNvbHZlQ2xhc3MoKTsgCi19Ci0KLXZvaWQgQ2xhc3M6OnJlc29sdmVDbGFzcygpIHsKLSAgaWYgKGlzUmVzb2x2ZWQoKSB8fCBpc0Vycm9uZW91cygpKSByZXR1cm47Ci0gIHJlc29sdmVQYXJlbnRzKCk7Ci0gIGxvYWRFeGNlcHRpb25zKCk7Ci0gIC8vIERvIGEgY29tcGFyZSBhbmQgc3dhcCBpbiBjYXNlIGFub3RoZXIgdGhyZWFkIGluaXRpYWxpemVkIHRoZSBjbGFzcy4KLSAgX19zeW5jX3ZhbF9jb21wYXJlX2FuZF9zd2FwKAotICAgICAgJihnZXRDdXJyZW50VGFza0NsYXNzTWlycm9yKCkuc3RhdHVzKSwgbG9hZGVkLCByZXNvbHZlZCk7Ci0gIGFzc2VydChpc1Jlc29sdmVkKCkgfHwgaXNFcnJvbmVvdXMoKSk7Ci19Ci0KLXZvaWQgVXNlckNsYXNzOjpyZXNvbHZlSW5uZXJPdXRlckNsYXNzZXMoKSB7Ci0gIGlmICghaW5uZXJPdXRlclJlc29sdmVkKSB7Ci0gICAgQXR0cmlidXQqIGF0dHJpYnV0ID0gbG9va3VwQXR0cmlidXQoQXR0cmlidXQ6OmlubmVyQ2xhc3Nlc0F0dHJpYnV0KTsKLSAgICBpZiAoYXR0cmlidXQgIT0gMCkgewotICAgICAgUmVhZGVyIHJlYWRlcihhdHRyaWJ1dCwgYnl0ZXMpOwotICAgICAgdWludDE2IG5iaSA9IHJlYWRlci5yZWFkVTIoKTsKLSAgICAgIGZvciAodWludDE2IGkgPSAwOyBpIDwgbmJpOyArK2kpIHsKLSAgICAgICAgdWludDE2IGlubmVyID0gcmVhZGVyLnJlYWRVMigpOwotICAgICAgICB1aW50MTYgb3V0ZXIgPSByZWFkZXIucmVhZFUyKCk7Ci0gICAgICAgIHVpbnQxNiBpbm5lck5hbWUgPSByZWFkZXIucmVhZFUyKCk7Ci0gICAgICAgIHVpbnQxNiBhY2Nlc3NGbGFncyA9IHJlYWRlci5yZWFkVTIoKTsKLSAgICAgICAgVXNlckNsYXNzKiBjbElubmVyID0gMDsKLSAgICAgICAgVXNlckNsYXNzKiBjbE91dGVyID0gMDsKLSAgICAgICAgaWYgKGlubmVyKSBjbElubmVyID0gKFVzZXJDbGFzcyopY3RwSW5mby0+bG9hZENsYXNzKGlubmVyKTsKLSAgICAgICAgaWYgKG91dGVyKSBjbE91dGVyID0gKFVzZXJDbGFzcyopY3RwSW5mby0+bG9hZENsYXNzKG91dGVyKTsKLQotICAgICAgICBpZiAoY2xJbm5lciA9PSB0aGlzKSB7Ci0gICAgICAgICAgb3V0ZXJDbGFzcyA9IGNsT3V0ZXI7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2xPdXRlciA9PSB0aGlzKSB7Ci0gICAgICAgICAgaWYgKCFpbm5lckNsYXNzZXMpIHsKLSAgICAgICAgICAgIGlubmVyQ2xhc3NlcyA9IChDbGFzcyoqKQotICAgICAgICAgICAgICBjbGFzc0xvYWRlci0+YWxsb2NhdG9yLkFsbG9jYXRlKG5iaSAqIHNpemVvZihDbGFzcyopLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbm5lciBjbGFzc2VzIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNsSW5uZXItPnNldElubmVyQWNjZXNzKGFjY2Vzc0ZsYWdzKTsKLSAgICAgICAgICBpZiAoIWlubmVyTmFtZSkgaXNBbm9ueW1vdXMgPSB0cnVlOwotICAgICAgICAgIGlubmVyQ2xhc3Nlc1tuYklubmVyQ2xhc3NlcysrXSA9IGNsSW5uZXI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaW5uZXJPdXRlclJlc29sdmVkID0gdHJ1ZTsKLSAgfQotfQotCi1zdGF0aWMgSmF2YU9iamVjdCogZ2V0Q2xhc3NUeXBlKEpuanZtQ2xhc3NMb2FkZXIqIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZWRlZiogdHlwZSkgewotICBVc2VyQ29tbW9uQ2xhc3MqIHJlcyA9IHR5cGUtPmFzc29jQ2xhc3MobG9hZGVyKTsKLSAgYXNzZXJ0KHJlcyAmJiAiTm8gYXNzb2NpYXRlZCBjbGFzcyIpOwotICByZXR1cm4gcmVzLT5nZXRDbGFzc0RlbGVnYXRlZSgpOwotfQotCi1BcnJheU9iamVjdCogSmF2YU1ldGhvZDo6Z2V0UGFyYW1ldGVyVHlwZXMoSm5qdm1DbGFzc0xvYWRlciogbG9hZGVyKSB7Ci0gIAotICBBcnJheU9iamVjdCogcmVzID0gTlVMTDsKLSAgSmF2YU9iamVjdCogZGVsZWdhdGVlID0gTlVMTDsKLSAgbGx2bV9nY3Jvb3QocmVzLCAwKTsKLSAgbGx2bV9nY3Jvb3QoZGVsZWdhdGVlLCAwKTsKLSAgCi0gIFNpZ25kZWYqIHNpZ24gPSBnZXRTaWduYXR1cmUoKTsKLSAgVHlwZWRlZiogY29uc3QqIGFyZ3VtZW50cyA9IHNpZ24tPmdldEFyZ3VtZW50c1R5cGUoKTsKLSAgcmVzID0gKEFycmF5T2JqZWN0Kilsb2FkZXItPnZtLT51cGNhbGxzLT5jbGFzc0FycmF5Q2xhc3MtPmRvTmV3KHNpZ24tPm5iQXJndW1lbnRzKTsKLQotICBmb3IgKHVpbnQzMiBpbmRleCA9IDA7IGluZGV4IDwgc2lnbi0+bmJBcmd1bWVudHM7ICsraW5kZXgpIHsKLSAgICBkZWxlZ2F0ZWUgPSBnZXRDbGFzc1R5cGUobG9hZGVyLCBhcmd1bWVudHNbaW5kZXhdKTsKLSAgICBBcnJheU9iamVjdDo6c2V0RWxlbWVudChyZXMsIGRlbGVnYXRlZSwgaW5kZXgpOwotICB9Ci0KLSAgcmV0dXJuIHJlczsKLQotfQotCi1KYXZhT2JqZWN0KiBKYXZhTWV0aG9kOjpnZXRSZXR1cm5UeXBlKEpuanZtQ2xhc3NMb2FkZXIqIGxvYWRlcikgewotICBUeXBlZGVmKiByZXQgPSBnZXRTaWduYXR1cmUoKS0+Z2V0UmV0dXJuVHlwZSgpOwotICByZXR1cm4gZ2V0Q2xhc3NUeXBlKGxvYWRlciwgcmV0KTsKLX0KLQotQXJyYXlPYmplY3QqIEphdmFNZXRob2Q6OmdldEV4Y2VwdGlvblR5cGVzKEpuanZtQ2xhc3NMb2FkZXIqIGxvYWRlcikgewotICAKLSAgQXJyYXlPYmplY3QqIHJlcyA9IE5VTEw7Ci0gIEphdmFPYmplY3QqIGRlbGVnYXRlZSA9IE5VTEw7Ci0gIGxsdm1fZ2Nyb290KHJlcywgMCk7Ci0gIGxsdm1fZ2Nyb290KGRlbGVnYXRlZSwgMCk7Ci0gIAotICBBdHRyaWJ1dCogZXhjZXB0aW9uQXR0ID0gbG9va3VwQXR0cmlidXQoQXR0cmlidXQ6OmV4Y2VwdGlvbnNBdHRyaWJ1dCk7Ci0gIEpuanZtKiB2bSA9IGxvYWRlci0+dm07Ci0gIGlmIChleGNlcHRpb25BdHQgPT0gMCkgewotICAgIHJldHVybiAoQXJyYXlPYmplY3QqKXZtLT51cGNhbGxzLT5jbGFzc0FycmF5Q2xhc3MtPmRvTmV3KDApOwotICB9IGVsc2UgewotICAgIFVzZXJDb25zdGFudFBvb2wqIGN0cCA9IGNsYXNzRGVmLT5nZXRDb25zdGFudFBvb2woKTsKLSAgICBSZWFkZXIgcmVhZGVyKGV4Y2VwdGlvbkF0dCwgY2xhc3NEZWYtPmJ5dGVzKTsKLSAgICB1aW50MTYgbmJlID0gcmVhZGVyLnJlYWRVMigpOwotICAgIHJlcyA9IChBcnJheU9iamVjdCopdm0tPnVwY2FsbHMtPmNsYXNzQXJyYXlDbGFzcy0+ZG9OZXcobmJlKTsKLQotICAgIGZvciAodWludDE2IGkgPSAwOyBpIDwgbmJlOyArK2kpIHsKLSAgICAgIHVpbnQxNiBpZHggPSByZWFkZXIucmVhZFUyKCk7Ci0gICAgICBVc2VyQ29tbW9uQ2xhc3MqIGNsID0gY3RwLT5sb2FkQ2xhc3MoaWR4KTsKLSAgICAgIGFzc2VydChjbC0+YXNDbGFzcygpICYmICJXcm9uZyBleGNlcHRpb24gdHlwZSIpOwotICAgICAgY2wtPmFzQ2xhc3MoKS0+cmVzb2x2ZUNsYXNzKCk7Ci0gICAgICBkZWxlZ2F0ZWUgPSBjbC0+Z2V0Q2xhc3NEZWxlZ2F0ZWUoKTsKLSAgICAgIEFycmF5T2JqZWN0OjpzZXRFbGVtZW50KHJlcywgZGVsZWdhdGVlLCBpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlczsKLSAgfQotfQotCi1KYXZhT2JqZWN0KiBDb21tb25DbGFzczo6c2V0RGVsZWdhdGVlKEphdmFPYmplY3QqIHZhbCkgewotICBKYXZhT2JqZWN0KiBwcmV2ID0gTlVMTDsKLSAgbGx2bV9nY3Jvb3QodmFsLCAwKTsKLSAgbGx2bV9nY3Jvb3QocHJldiwgMCk7Ci0gIHByZXYgPSAoSmF2YU9iamVjdCopX19zeW5jX3ZhbF9jb21wYXJlX2FuZF9zd2FwKCYoZGVsZWdhdGVlWzBdKSwgTlVMTCwgdmFsKTsKLQotICBpZiAoIXByZXYpIHJldHVybiB2YWw7Ci0gIGVsc2UgcmV0dXJuIHByZXY7Ci19Ci0KLQotCi1Vc2VyQ29tbW9uQ2xhc3MqIFVzZXJDb21tb25DbGFzczo6cmVzb2x2ZWRJbXBsQ2xhc3MoSmF2YU9iamVjdCogY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb0NsaW5pdCkgewotCi0gIGxsdm1fZ2Nyb290KGNsYXp6LCAwKTsKLQotICBVc2VyQ29tbW9uQ2xhc3MqIGNsID0gSmF2YU9iamVjdENsYXNzOjpnZXRDbGFzcygoSmF2YU9iamVjdENsYXNzKiljbGF6eik7Ci0gIGFzc2VydChjbCAmJiAiTm8gY2xhc3MgaW4gQ2xhc3Mgb2JqZWN0Iik7Ci0gIGlmIChjbC0+aXNDbGFzcygpKSB7Ci0gICAgY2wtPmFzQ2xhc3MoKS0+cmVzb2x2ZUNsYXNzKCk7Ci0gICAgaWYgKGRvQ2xpbml0KSBjbC0+YXNDbGFzcygpLT5pbml0aWFsaXNlQ2xhc3MoKTsKLSAgfQotICByZXR1cm4gY2w7Ci19Ci0KLXZvaWQgSmF2YU1ldGhvZDo6am5pQ29uc0Zyb21NZXRoKGNoYXIqIGJ1ZiwgY29uc3QgVVRGOCogam5pQ29uc0NsTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVURjgqIGpuaUNvbnNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVVRGOCogam5pQ29uc1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN5bnRoZXRpYykgewotICBzaW50MzIgY2xlbiA9IGpuaUNvbnNDbE5hbWUtPnNpemU7Ci0gIHNpbnQzMiBtbmxlbiA9IGpuaUNvbnNOYW1lLT5zaXplOwotCi0gIHVpbnQzMiBjdXIgPSAwOwotICBjaGFyKiBwdHIgPSAmKGJ1ZltKTklfTkFNRV9QUkVfTEVOXSk7Ci0gIAotICBtZW1jcHkoYnVmLCBKTklfTkFNRV9QUkUsIEpOSV9OQU1FX1BSRV9MRU4pOwotICAKLSAgZm9yIChzaW50MzIgaSA9MDsgaSA8IGNsZW47ICsraSkgewotICAgIGN1ciA9IGpuaUNvbnNDbE5hbWUtPmVsZW1lbnRzW2ldOwotICAgIGlmIChjdXIgPT0gJy8nKSBwdHJbMF0gPSAnXyc7Ci0gICAgZWxzZSBpZiAoY3VyID09ICdfJykgewotICAgICAgcHRyWzBdID0gJ18nOwotICAgICAgcHRyWzFdID0gJzEnOwotICAgICAgKytwdHI7Ci0gICAgfQotICAgIGVsc2UgcHRyWzBdID0gKHVpbnQ4KWN1cjsKLSAgICArK3B0cjsKLSAgfQotICAKLSAgcHRyWzBdID0gJ18nOwotICArK3B0cjsKLSAgCi0gIGZvciAoc2ludDMyIGkgPTA7IGkgPCBtbmxlbjsgKytpKSB7Ci0gICAgY3VyID0gam5pQ29uc05hbWUtPmVsZW1lbnRzW2ldOwotICAgIGlmIChjdXIgPT0gJy8nKSB7Ci0gICAgICBwdHJbMF0gPSAnXyc7Ci0gICAgICArK3B0cjsKLSAgICB9IGVsc2UgaWYgKGN1ciA9PSAnXycpIHsKLSAgICAgIHB0clswXSA9ICdfJzsKLSAgICAgIHB0clsxXSA9ICcxJzsKLSAgICAgIHB0ciArPSAyOwotICAgIH0gZWxzZSBpZiAoY3VyID09ICc8JykgewotICAgICAgcHRyWzBdID0gJ18nOwotICAgICAgcHRyWzFdID0gJzAnOwotICAgICAgcHRyWzJdID0gJzAnOwotICAgICAgcHRyWzNdID0gJzAnOwotICAgICAgcHRyWzRdID0gJzMnOwotICAgICAgcHRyWzVdID0gJ0MnOwotICAgICAgcHRyICs9IDY7Ci0gICAgfSBlbHNlIGlmIChjdXIgPT0gJz4nKSB7Ci0gICAgICBwdHJbMF0gPSAnXyc7Ci0gICAgICBwdHJbMV0gPSAnMCc7Ci0gICAgICBwdHJbMl0gPSAnMCc7Ci0gICAgICBwdHJbM10gPSAnMCc7Ci0gICAgICBwdHJbNF0gPSAnMyc7Ci0gICAgICBwdHJbNV0gPSAnRSc7Ci0gICAgICBwdHIgKz0gNjsKLSAgICB9IGVsc2UgewotICAgICAgcHRyWzBdID0gKHVpbnQ4KWN1cjsKLSAgICAgICsrcHRyOwotICAgIH0KLSAgfSAKLSAgcHRyWzBdID0gMDsKLX0KLQotdm9pZCBKYXZhTWV0aG9kOjpqbmlDb25zRnJvbU1ldGhPdmVybG9hZGVkKGNoYXIqIGJ1ZiwgY29uc3QgVVRGOCogam5pQ29uc0NsTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVVEY4KiBqbmlDb25zTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVVEY4KiBqbmlDb25zVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN5bnRoZXRpYykgewotICBzaW50MzIgY2xlbiA9IGpuaUNvbnNDbE5hbWUtPnNpemU7Ci0gIHNpbnQzMiBtbmxlbiA9IGpuaUNvbnNOYW1lLT5zaXplOwotCi0gIHVpbnQzMiBjdXIgPSAwOwotICBjaGFyKiBwdHIgPSAmKGJ1ZltKTklfTkFNRV9QUkVfTEVOXSk7Ci0gIAotICBtZW1jcHkoYnVmLCBKTklfTkFNRV9QUkUsIEpOSV9OQU1FX1BSRV9MRU4pOwotICAKLSAgZm9yIChzaW50MzIgaSA9MDsgaSA8IGNsZW47ICsraSkgewotICAgIGN1ciA9IGpuaUNvbnNDbE5hbWUtPmVsZW1lbnRzW2ldOwotICAgIGlmIChjdXIgPT0gJy8nKSB7Ci0gICAgICBwdHJbMF0gPSAnXyc7Ci0gICAgICArK3B0cjsKLSAgICB9IGVsc2UgaWYgKGN1ciA9PSAnXycpIHsKLSAgICAgIHB0clswXSA9ICdfJzsKLSAgICAgIHB0clsxXSA9ICcxJzsKLSAgICAgIHB0ciArPSAyOwotICAgIH0gZWxzZSBpZiAoY3VyID09ICckJykgewotICAgICAgcHRyWzBdID0gJ18nOwotICAgICAgcHRyWzFdID0gJzAnOwotICAgICAgcHRyWzJdID0gJzAnOwotICAgICAgcHRyWzNdID0gJzAnOwotICAgICAgcHRyWzRdID0gJzInOwotICAgICAgcHRyWzVdID0gJzQnOwotICAgICAgcHRyICs9IDY7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHB0clswXSA9ICh1aW50OCljdXI7Ci0gICAgICArK3B0cjsKLSAgICB9Ci0gIH0KLSAgCi0gIHB0clswXSA9ICdfJzsKLSAgKytwdHI7Ci0KLSAgZm9yIChzaW50MzIgaSA9MDsgaSA8IG1ubGVuOyArK2kpIHsKLSAgICBjdXIgPSBqbmlDb25zTmFtZS0+ZWxlbWVudHNbaV07Ci0gICAgaWYgKGN1ciA9PSAnLycpIHB0clswXSA9ICdfJzsKLSAgICBlbHNlIGlmIChjdXIgPT0gJ18nKSB7Ci0gICAgICBwdHJbMF0gPSAnXyc7Ci0gICAgICBwdHJbMV0gPSAnMSc7Ci0gICAgICBwdHIgKz0gMjsKLSAgICB9IGVsc2UgaWYgKGN1ciA9PSAnPCcpIHsKLSAgICAgIHB0clswXSA9ICdfJzsKLSAgICAgIHB0clsxXSA9ICcwJzsKLSAgICAgIHB0clsyXSA9ICcwJzsKLSAgICAgIHB0clszXSA9ICcwJzsKLSAgICAgIHB0cls0XSA9ICczJzsKLSAgICAgIHB0cls1XSA9ICdDJzsKLSAgICAgIHB0ciArPSA2OwotICAgIH0gZWxzZSBpZiAoY3VyID09ICc+JykgewotICAgICAgcHRyWzBdID0gJ18nOwotICAgICAgcHRyWzFdID0gJzAnOwotICAgICAgcHRyWzJdID0gJzAnOwotICAgICAgcHRyWzNdID0gJzAnOwotICAgICAgcHRyWzRdID0gJzMnOwotICAgICAgcHRyWzVdID0gJ0UnOwotICAgICAgcHRyICs9IDY7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHB0clswXSA9ICh1aW50OCljdXI7Ci0gICAgICArK3B0cjsKLSAgICB9Ci0gIH0KLSAgCi0gIHNpbnQzMiBpID0gMDsKLSAgd2hpbGUgKGkgPCBqbmlDb25zVHlwZS0+c2l6ZSkgewotICAgIGNoYXIgYyA9IGpuaUNvbnNUeXBlLT5lbGVtZW50c1tpKytdOwotICAgIGlmIChjID09IElfUEFSRykgewotICAgICAgcHRyWzBdID0gJ18nOwotICAgICAgcHRyWzFdID0gJ18nOwotICAgICAgcHRyICs9IDI7Ci0gICAgfSBlbHNlIGlmIChjID09ICcvJykgewotICAgICAgcHRyWzBdID0gJ18nOwotICAgICAgKytwdHI7Ci0gICAgfSBlbHNlIGlmIChjID09ICdfJykgewotICAgICAgcHRyWzBdID0gJ18nOwotICAgICAgcHRyWzFdID0gJzEnOwotICAgICAgcHRyICs9IDI7Ci0gICAgfSBlbHNlIGlmIChjID09ICckJykgewotICAgICAgcHRyWzBdID0gJ18nOwotICAgICAgcHRyWzFdID0gJzAnOwotICAgICAgcHRyWzJdID0gJzAnOwotICAgICAgcHRyWzNdID0gJzAnOwotICAgICAgcHRyWzRdID0gJzInOwotICAgICAgcHRyWzVdID0gJzQnOwotICAgICAgcHRyICs9IDY7Ci0gICAgfSBlbHNlIGlmIChjID09IElfRU5EX1JFRikgewotICAgICAgcHRyWzBdID0gJ18nOwotICAgICAgcHRyWzFdID0gJzInOwotICAgICAgcHRyICs9IDI7Ci0gICAgfSBlbHNlIGlmIChjID09IElfVEFCKSB7Ci0gICAgICBwdHJbMF0gPSAnXyc7Ci0gICAgICBwdHJbMV0gPSAnMyc7Ci0gICAgICBwdHIgKz0gMjsKLSAgICB9IGVsc2UgaWYgKGMgPT0gSV9QQVJEKSB7Ci0gICAgICBicmVhazsKLSAgICB9IGVsc2UgewotICAgICAgcHRyWzBdID0gYzsKLSAgICAgICsrcHRyOwotICAgIH0KLSAgfQotCi0gIGlmIChzeW50aGV0aWMpIHsKLSAgICBwdHJbMF0gPSAnUyc7Ci0gICAgKytwdHI7Ci0gIH0KLSAgcHRyWzBdID0gMDsKLQotfQotCi1ib29sIFVzZXJDbGFzczo6aXNOYXRpdmVPdmVybG9hZGVkKEphdmFNZXRob2QqIG1ldGgpIHsKLSAgCi0gIGZvciAodWludDMyIGkgPSAwOyBpIDwgbmJWaXJ0dWFsTWV0aG9kczsgKytpKSB7Ci0gICAgSmF2YU1ldGhvZCYgY3VyID0gdmlydHVhbE1ldGhvZHNbaV07Ci0gICAgaWYgKCZjdXIgIT0gbWV0aCAmJiBpc05hdGl2ZShjdXIuYWNjZXNzKSAmJiBjdXIubmFtZS0+ZXF1YWxzKG1ldGgtPm5hbWUpKQotICAgICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIGZvciAodWludDMyIGkgPSAwOyBpIDwgbmJTdGF0aWNNZXRob2RzOyArK2kpIHsKLSAgICBKYXZhTWV0aG9kJiBjdXIgPSBzdGF0aWNNZXRob2RzW2ldOwotICAgIGlmICgmY3VyICE9IG1ldGggJiYgaXNOYXRpdmUoY3VyLmFjY2VzcykgJiYgY3VyLm5hbWUtPmVxdWFscyhtZXRoLT5uYW1lKSkKLSAgICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLUFycmF5VUludDE2KiBKYXZhTWV0aG9kOjp0b1N0cmluZygpIGNvbnN0IHsKLSAgIAotICBKbmp2bSogdm0gPSBjbGFzc0RlZi0+Y2xhc3NMb2FkZXItPnZtOwotICB1aW50MzIgc2l6ZSA9IGNsYXNzRGVmLT5uYW1lLT5zaXplICsgbmFtZS0+c2l6ZSArIHR5cGUtPnNpemUgKyAxOwotICBBcnJheVVJbnQxNiogcmVzID0gKEFycmF5VUludDE2Kil2bS0+dXBjYWxscy0+QXJyYXlPZkNoYXItPmRvTmV3KHNpemUpOwotICBsbHZtX2djcm9vdChyZXMsIDApOwotCi0gIHVpbnQzMiBpID0gMDsKLSAKLSAgZm9yIChzaW50MzIgaiA9IDA7IGogPCBjbGFzc0RlZi0+bmFtZS0+c2l6ZTsgKytqKSB7Ci0gICAgaWYgKGNsYXNzRGVmLT5uYW1lLT5lbGVtZW50c1tqXSA9PSAnLycpIHsKLSAgICAgIEFycmF5VUludDE2OjpzZXRFbGVtZW50KHJlcywgJy4nLCBpKTsKLSAgICB9IGVsc2UgewotICAgICAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQocmVzLCBjbGFzc0RlZi0+bmFtZS0+ZWxlbWVudHNbal0sIGkpOwotICAgIH0KLSAgICBpKys7Ci0gIH0KLQotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChyZXMsICcuJywgaSk7Ci0gIGkrKzsKLSAgCi0gIGZvciAoc2ludDMyIGogPSAwOyBqIDwgbmFtZS0+c2l6ZTsgKytqKSB7Ci0gICAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQocmVzLCBuYW1lLT5lbGVtZW50c1tqXSwgaSk7Ci0gICAgaSsrOwotICB9Ci0gIAotICBmb3IgKHNpbnQzMiBqID0gMDsgaiA8IHR5cGUtPnNpemU7ICsraikgewotICAgIEFycmF5VUludDE2OjpzZXRFbGVtZW50KHJlcywgdHlwZS0+ZWxlbWVudHNbal0sIGkpOwotICAgIGkrKzsKLSAgfQotCi0gIHJldHVybiByZXM7Ci19Ci0KLWJvb2wgVXNlckNsYXNzOjpuZWVkc0luaXRpYWxpc2F0aW9uQ2hlY2soKSB7Ci0gIAotICBpZiAoaXNSZWFkeSgpKSByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHN1cGVyICYmIHN1cGVyLT5uZWVkc0luaXRpYWxpc2F0aW9uQ2hlY2soKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAobmJTdGF0aWNGaWVsZHMpIHJldHVybiB0cnVlOwotCi0gIEphdmFNZXRob2QqIG1ldGggPSAKLSAgICBsb29rdXBNZXRob2REb250VGhyb3coY2xhc3NMb2FkZXItPnZtLT51cGNhbGxzLT5jbGluaXROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0xvYWRlci0+dm0tPnVwY2FsbHMtPmNsaW5pdFR5cGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBmYWxzZSwgMCk7Ci0gIAotICBpZiAobWV0aCkgcmV0dXJuIHRydWU7Ci0KLSAgc2V0SW5pdGlhbGl6YXRpb25TdGF0ZShyZWFkeSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBDbGFzc0FycmF5Ojppbml0aWFsaXNlVlQoQ2xhc3MqIGphdmFMYW5nT2JqZWN0KSB7Ci0KLSAgQ2xhc3NBcnJheTo6U3VwZXJBcnJheSA9IGphdmFMYW5nT2JqZWN0OwotICBKbmp2bUNsYXNzTG9hZGVyKiBKQ0wgPSBqYXZhTGFuZ09iamVjdC0+Y2xhc3NMb2FkZXI7Ci0gIENsYXNzcGF0aCogdXBjYWxscyA9IEpDTC0+dm0tPnVwY2FsbHM7Ci0gIAotICBhc3NlcnQoamF2YUxhbmdPYmplY3QtPnZpcnR1YWxWVC0+aW5pdCAmJiAKLSAgICAgICAgICJJbml0aWFsaXppbmcgYXJyYXkgVlQgYmVmb3JlIEphdmFPYmplY3RWVCIpOwotICAKLSAgLy8gTG9hZCBhbmQgcmVzb2x2ZSBpbnRlcmZhY2VzIG9mIGFycmF5IGNsYXNzZXMuIFdlIHJlc29sdmUgdGhlbSBub3cKLSAgLy8gc28gdGhhdCB0aGUgc2Vjb25kYXJ5IHR5cGUgbGlzdCBvZiBhcnJheSBWVHMgY2FuIHJlZmVyZW5jZSB0aGVtLgotICBDbGFzc0FycmF5OjpJbnRlcmZhY2VzQXJyYXlbMF0gPSAKLSAgICBKQ0wtPmxvYWROYW1lKEpDTC0+YXNjaWl6Q29uc3RydWN0VVRGOCgiamF2YS9sYW5nL0Nsb25lYWJsZSIpLAotICAgICAgICAgICAgICAgICAgdHJ1ZSwgZmFsc2UsIE5VTEwpOwotICAKLSAgQ2xhc3NBcnJheTo6SW50ZXJmYWNlc0FycmF5WzFdID0gCi0gICAgSkNMLT5sb2FkTmFtZShKQ0wtPmFzY2lpekNvbnN0cnVjdFVURjgoImphdmEvaW8vU2VyaWFsaXphYmxlIiksCi0gICAgICAgICAgICAgICAgICB0cnVlLCBmYWxzZSwgTlVMTCk7Ci0gICAKLSAgLy8gTG9hZCBiYXNlIGFycmF5IGNsYXNzZXMgdGhhdCBKbkpWTSBpbnRlcm5hbGx5IHVzZXMuIE5vdyB0aGF0IHRoZSBpbnRlcmZhY2VzCi0gIC8vIGhhdmUgYmVlbiBsb2FkZWQsIHRoZSBzZWNvbmRhcnkgdHlwZSBjYW4gYmUgc2FmZWx5IGNyZWF0ZWQuCi0gIHVwY2FsbHMtPkFycmF5T2ZPYmplY3QgPSAKLSAgICBKQ0wtPmNvbnN0cnVjdEFycmF5KEpDTC0+YXNjaWl6Q29uc3RydWN0VVRGOCgiW0xqYXZhL2xhbmcvT2JqZWN0OyIpKTsKLSAgCi0gIHVwY2FsbHMtPkFycmF5T2ZTdHJpbmcgPSAKLSAgICBKQ0wtPmNvbnN0cnVjdEFycmF5KEpDTC0+YXNjaWl6Q29uc3RydWN0VVRGOCgiW0xqYXZhL2xhbmcvU3RyaW5nOyIpKTsKLSAgCi0gIC8vIFVwZGF0ZSBuYXRpdmUgYXJyYXkgY2xhc3Nlcy4gQSBmZXcgdGhpbmdzIGhhdmUgbm90IGJlZW4gc2V0IHByb3Blcmx5Ci0gIC8vIHdoZW4gbG9hZGluZyB0aGVzZSBjbGFzc2VzIGJlY2F1c2UgamF2YS5sYW5nLk9iamVjdCBhbmQgamF2YS5sYW5nLk9iamVjdFtdCi0gIC8vIHdlcmUgbm90IGxvYWRlZCB5ZXQuIENvcnJlY3QgdGhhdCBub3cgYnkgdXBkYXRpbmcgdGhlc2UgY2xhc3Nlcy4KLSAgI2RlZmluZSBDT1BZKENMQVNTKSBcCi0gICAgbWVtY3B5KENMQVNTLT52aXJ0dWFsVlQtPmdldEZpcnN0SmF2YU1ldGhvZCgpLCBcCi0gICAgICAgICAgIGphdmFMYW5nT2JqZWN0LT52aXJ0dWFsVlQtPmdldEZpcnN0SmF2YU1ldGhvZCgpLCBcCi0gICAgICAgICAgIHNpemVvZih1aW50cHRyX3QpICogSmF2YVZpcnR1YWxUYWJsZTo6Z2V0TnVtSmF2YU1ldGhvZHMoKSk7IFwKLSAgICBDTEFTUy0+c3VwZXIgPSBqYXZhTGFuZ09iamVjdDsgXAotICAgIENMQVNTLT52aXJ0dWFsVlQtPmRpc3BsYXlbMF0gPSBqYXZhTGFuZ09iamVjdC0+dmlydHVhbFZUOyBcCi0gICAgQ0xBU1MtPnZpcnR1YWxWVC0+c2Vjb25kYXJ5VHlwZXMgPSBcCi0gICAgICB1cGNhbGxzLT5BcnJheU9mT2JqZWN0LT52aXJ0dWFsVlQtPnNlY29uZGFyeVR5cGVzOyBcCi0KLSAgICBDT1BZKHVwY2FsbHMtPkFycmF5T2ZCb29sKQotICAgIENPUFkodXBjYWxscy0+QXJyYXlPZkJ5dGUpCi0gICAgQ09QWSh1cGNhbGxzLT5BcnJheU9mQ2hhcikKLSAgICBDT1BZKHVwY2FsbHMtPkFycmF5T2ZTaG9ydCkKLSAgICBDT1BZKHVwY2FsbHMtPkFycmF5T2ZJbnQpCi0gICAgQ09QWSh1cGNhbGxzLT5BcnJheU9mRmxvYXQpCi0gICAgQ09QWSh1cGNhbGxzLT5BcnJheU9mRG91YmxlKQotICAgIENPUFkodXBjYWxscy0+QXJyYXlPZkxvbmcpCi0KLSN1bmRlZiBDT1BZCi0gCi19Ci0KLUphdmFWaXJ0dWFsVGFibGU6OkphdmFWaXJ0dWFsVGFibGUoQ2xhc3MqIEMpIHsKLQl2bSA9IEMtPmNsYXNzTG9hZGVyLT52bTsKLQotICBpZiAoQy0+c3VwZXIpIHsKLQotICAgIENsYXNzKiByZWZlcmVuY2VDbGFzcyA9IAotCQkJQy0+Y2xhc3NMb2FkZXItPnZtLT51cGNhbGxzLT5uZXdSZWZlcmVuY2U7Ci0gICAgaWYgKHJlZmVyZW5jZUNsYXNzICE9IE5VTEwgJiYgQy0+c3VwZXItPmlzQXNzaWduYWJsZUZyb20ocmVmZXJlbmNlQ2xhc3MpKSB7Ci0gICAgICB0cmFjZXIgPSAodWludHB0cl90KVJlZmVyZW5jZU9iamVjdFRyYWNlcjsKLSAgICB9IGVsc2UgewotICAgICAgdHJhY2VyID0gKHVpbnRwdHJfdClSZWd1bGFyT2JqZWN0VHJhY2VyOwotICAgIH0KLSAgICBkZXN0cnVjdG9yID0gMDsKLSAgICBvcGVyYXRvckRlbGV0ZSA9IDA7Ci0gICAgCi0gICAgLy8gU2V0IElNVC4KLSAgICBpZiAoIWlzQWJzdHJhY3QoQy0+YWNjZXNzKSkgewotICAgICAgSU1UID0gbmV3IChDLT5jbGFzc0xvYWRlci0+YWxsb2NhdG9yLCAiSU1UIikgSW50ZXJmYWNlTWV0aG9kVGFibGUoKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gU2V0IHRoZSBjbGFzcyBvZiB0aGlzIFZULgotICAgIGNsID0gQzsKLSAgICAKLSAgICAvLyBTZXQgZGVwdGggYW5kIGRpc3BsYXkgZm9yIGZhc3QgZHluYW1pYyB0eXBlIGNoZWNraW5nLgotICAgIEphdmFWaXJ0dWFsVGFibGUqIHN1cGVyVlQgPSBDLT5zdXBlci0+dmlydHVhbFZUOyAKLSAgICBhc3NlcnQoc3VwZXJWVCAmJiAiU3VwZXIgaGFzIG5vIFZUIik7Ci0gICAgZGVwdGggPSBzdXBlclZULT5kZXB0aCArIDE7Ci0gICAgbmJTZWNvbmRhcnlUeXBlcyA9IHN1cGVyVlQtPm5iU2Vjb25kYXJ5VHlwZXMgKyBjbC0+bmJJbnRlcmZhY2VzOwotCi0gICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBjbC0+bmJJbnRlcmZhY2VzOyArK2kpIHsKLSAgICAgIG5iU2Vjb25kYXJ5VHlwZXMgKz0gY2wtPmludGVyZmFjZXNbaV0tPnZpcnR1YWxWVC0+bmJTZWNvbmRhcnlUeXBlczsKLSAgICB9Ci0gICAgCi0gICAgdWludDMyIGxlbmd0aCA9IGdldERpc3BsYXlMZW5ndGgoKSA8IGRlcHRoID8gZ2V0RGlzcGxheUxlbmd0aCgpIDogZGVwdGg7Ci0gICAgbWVtY3B5KGRpc3BsYXksIHN1cGVyVlQtPmRpc3BsYXksIGxlbmd0aCAqIHNpemVvZihKYXZhVmlydHVhbFRhYmxlKikpOyAKLSAgICB1aW50MzIgb3V0T2ZEZXB0aCA9IDA7Ci0gICAgaWYgKEMtPmlzSW50ZXJmYWNlKCkpIHsKLSAgICAgIG9mZnNldCA9IGdldENhY2hlSW5kZXgoKTsKLSAgICB9IGVsc2UgaWYgKGRlcHRoIDwgZ2V0RGlzcGxheUxlbmd0aCgpKSB7Ci0gICAgICBkaXNwbGF5W2RlcHRoXSA9IHRoaXM7Ci0gICAgICBvZmZzZXQgPSBnZXRDYWNoZUluZGV4KCkgKyBkZXB0aCArIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG9mZnNldCA9IGdldENhY2hlSW5kZXgoKTsKLSAgICAgICsrbmJTZWNvbmRhcnlUeXBlczsKLSAgICAgIG91dE9mRGVwdGggPSAxOwotICAgIH0KLQotICAgIG12bTo6QnVtcFB0ckFsbG9jYXRvciYgYWxsb2NhdG9yID0gQy0+Y2xhc3NMb2FkZXItPmFsbG9jYXRvcjsKLSAgICBzZWNvbmRhcnlUeXBlcyA9IChKYXZhVmlydHVhbFRhYmxlKiopCi0gICAgICBhbGxvY2F0b3IuQWxsb2NhdGUoc2l6ZW9mKEphdmFWaXJ0dWFsVGFibGUqKSAqIG5iU2Vjb25kYXJ5VHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIlNlY29uZGFyeSB0eXBlcyIpOyAgCi0gICAgCi0gICAgaWYgKG91dE9mRGVwdGgpIHsKLSAgICAgIHNlY29uZGFyeVR5cGVzWzBdID0gdGhpczsKLSAgICB9Ci0KLSAgICBpZiAoc3VwZXJWVC0+bmJTZWNvbmRhcnlUeXBlcykgewotICAgICAgbWVtY3B5KHNlY29uZGFyeVR5cGVzICsgb3V0T2ZEZXB0aCwgc3VwZXJWVC0+c2Vjb25kYXJ5VHlwZXMsCi0gICAgICAgICAgICAgc2l6ZW9mKEphdmFWaXJ0dWFsVGFibGUqKSAqIHN1cGVyVlQtPm5iU2Vjb25kYXJ5VHlwZXMpOwotICAgIH0KLQotICAgIGZvciAodWludDMyIGkgPSAwOyBpIDwgY2wtPm5iSW50ZXJmYWNlczsgKytpKSB7Ci0gICAgICBKYXZhVmlydHVhbFRhYmxlKiBjdXIgPSBjbC0+aW50ZXJmYWNlc1tpXS0+dmlydHVhbFZUOwotICAgICAgYXNzZXJ0KGN1ciAmJiAiSW50ZXJmYWNlIG5vdCByZXNvbHZlZCFcbiIpOwotICAgICAgdWludDMyIGluZGV4ID0gc3VwZXJWVC0+bmJTZWNvbmRhcnlUeXBlcyArIG91dE9mRGVwdGggKyBpOwotICAgICAgc2Vjb25kYXJ5VHlwZXNbaW5kZXhdID0gY3VyOwotICAgIH0KLSAgIAotICAgIHVpbnQzMiBsYXN0SW5kZXggPSBzdXBlclZULT5uYlNlY29uZGFyeVR5cGVzICsgY2wtPm5iSW50ZXJmYWNlcyArCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRPZkRlcHRoOwotCi0gICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBjbC0+bmJJbnRlcmZhY2VzOyArK2kpIHsKLSAgICAgIEphdmFWaXJ0dWFsVGFibGUqIGN1ciA9IGNsLT5pbnRlcmZhY2VzW2ldLT52aXJ0dWFsVlQ7Ci0gICAgICBtZW1jcHkoc2Vjb25kYXJ5VHlwZXMgKyBsYXN0SW5kZXgsIGN1ci0+c2Vjb25kYXJ5VHlwZXMsCi0gICAgICAgICAgICAgc2l6ZW9mKEphdmFWaXJ0dWFsVGFibGUqKSAqIGN1ci0+bmJTZWNvbmRhcnlUeXBlcyk7Ci0gICAgICBsYXN0SW5kZXggKz0gY3VyLT5uYlNlY29uZGFyeVR5cGVzOwotICAgIH0KLQotICB9IGVsc2UgewotICAgIC8vIFNldCB0aGUgdHJhY2VyLCBkZXN0cnVjdG9yIGFuZCBkZWxldGUuCi0gICAgdHJhY2VyID0gKHVpbnRwdHJfdClKYXZhT2JqZWN0VHJhY2VyOwotICAgIGRlc3RydWN0b3IgPSAwOwotICAgIG9wZXJhdG9yRGVsZXRlID0gMDsKLSAgICAKLSAgICAvLyBTZXQgdGhlIGNsYXNzIG9mIHRoaXMgVlQuCi0gICAgY2wgPSBDOwotICAgIAotICAgIC8vIFNldCBkZXB0aCBhbmQgZGlzcGxheSBmb3IgZmFzdCBkeW5hbWljIHR5cGUgY2hlY2tpbmcuCi0gICAgLy8gamF2YS5sYW5nLk9iamVjdCBkb2VzIG5vdCBoYXZlIGFueSBzZWNvbmRhcnkgdHlwZXMuCi0gICAgb2Zmc2V0ID0gZ2V0Q2FjaGVJbmRleCgpICsgMTsKLSAgICBkZXB0aCA9IDA7Ci0gICAgZGlzcGxheVswXSA9IHRoaXM7Ci0gICAgZGVzdHJ1Y3RvciA9IDA7Ci0gICAgbmJTZWNvbmRhcnlUeXBlcyA9IDA7Ci0gIH0KLX0KLSAgCi1KYXZhVmlydHVhbFRhYmxlOjpKYXZhVmlydHVhbFRhYmxlKENsYXNzQXJyYXkqIEMpIHsKLQl2bSA9IEMtPmNsYXNzTG9hZGVyLT52bTsKLSAgCi0gIGlmIChDLT5iYXNlQ2xhc3MoKS0+aXNDbGFzcygpKQotICAgIEMtPmJhc2VDbGFzcygpLT5hc0NsYXNzKCktPnJlc29sdmVDbGFzcygpOwotCi0gIGlmICghQy0+YmFzZUNsYXNzKCktPmlzUHJpbWl0aXZlKCkpIHsKLSAgICBiYXNlQ2xhc3NWVCA9IEMtPmJhc2VDbGFzcygpLT52aXJ0dWFsVlQ7Ci0KLSAgICAvLyBDb3B5IHRoZSBzdXBlciBWVCBpbnRvIHRoZSBjdXJyZW50IFZULgotICAgIHVpbnQzMiBzaXplID0gKGdldEJhc2VTaXplKCkgLSBnZXRGaXJzdEphdmFNZXRob2RJbmRleCgpKTsKLSAgICBtZW1jcHkodGhpcy0+Z2V0Rmlyc3RKYXZhTWV0aG9kKCksCi0gICAgICAgICAgIEMtPnN1cGVyLT52aXJ0dWFsVlQtPmdldEZpcnN0SmF2YU1ldGhvZCgpLAotICAgICAgICAgICBzaXplICogc2l6ZW9mKHVpbnRwdHJfdCkpOwotICAgIHRyYWNlciA9ICh1aW50cHRyX3QpQXJyYXlPYmplY3RUcmFjZXI7Ci0gICAgCi0gICAgLy8gU2V0IHRoZSBjbGFzcyBvZiB0aGlzIFZULgotICAgIGNsID0gQzsKLQotICAgIC8vIFNldCBkZXB0aCBhbmQgZGlzcGxheSBmb3IgZmFzdCBkeW5hbWljIHR5cGUgY2hlY2tpbmcuCi0gICAgSm5qdm1DbGFzc0xvYWRlciogSkNMID0gY2wtPmNsYXNzTG9hZGVyOwotICAgIENsYXNzcGF0aCogdXBjYWxscyA9IEpDTC0+dm0tPnVwY2FsbHM7Ci0gICAgCi0gICAgaWYgKHVwY2FsbHMtPkFycmF5T2ZPYmplY3QpIHsKLSAgICAgIFVzZXJDb21tb25DbGFzcyogYmFzZSA9IEMtPmJhc2VDbGFzcygpOwotICAgICAgdWludDMyIGRpbSA9IDE7Ci0gICAgICB3aGlsZSAoYmFzZS0+aXNBcnJheSgpKSB7Ci0gICAgICAgIGJhc2UgPSBiYXNlLT5hc0FycmF5Q2xhc3MoKS0+YmFzZUNsYXNzKCk7Ci0gICAgICAgICsrZGltOwotICAgICAgfQotICAgICAKLSAgICAgIGJvb2wgbmV3U2Vjb25kYXJ5VHlwZXMgPSBmYWxzZTsKLSAgICAgIGJvb2wgaW50ZiA9IGJhc2UtPmlzSW50ZXJmYWNlKCk7Ci0gICAgICBDbGFzc0FycmF5KiBzdXBlciA9IDA7Ci0gICAgICAKLSAgICAgIGlmIChiYXNlLT5pc1ByaW1pdGl2ZSgpKSB7Ci0gICAgICAgIC8vIElmIHRoZSBiYXNlIGNsYXNzIGlzIHByaW1pdGl2ZSwgdGhlbiB0aGUgc3VwZXIgaXMgb25lCi0gICAgICAgIC8vIGRpbWVuc2lvbiBiZWxvdywgZS5nLiB0aGUgc3VwZXIgb2YgaW50W11bXSBpcyBPYmplY3RbXS4KLSAgICAgICAgLS1kaW07Ci0gICAgICAgIGNvbnN0IFVURjgqIHN1cGVyTmFtZSA9IEpDTC0+Y29uc3RydWN0QXJyYXlOYW1lKGRpbSwgQy0+c3VwZXItPm5hbWUpOwotICAgICAgICBzdXBlciA9IEpDTC0+Y29uc3RydWN0QXJyYXkoc3VwZXJOYW1lKTsKLSAgICAgIH0gZWxzZSBpZiAoYmFzZSA9PSBDLT5zdXBlcikgewotICAgICAgICAvLyBJZiB0aGUgYmFzZSBjbGFzcyBpcyBqYXZhLmxhbmcuT2JqZWN0LCB0aGVuIHRoZSBzdXBlciBpcyBvbmUKLSAgICAgICAgLy8gZGltZW5zaW9uIGJlbG93LCBlLmcuIHRoZSBzdXBlciBvZiBPYmplY3RbXVtdIGlzIE9iamVjdFtdLgotICAgICAgICAvLyBBbHNvLCB0aGUgY2xhc3MgaXMgdGhlIGZpcnN0IGNsYXNzIGluIHRoZSBkaW1lbnNpb24gaGllcmFyY2h5LAotICAgICAgICAvLyBzbyBpdCBtdXN0IGNyZWF0ZSBhIG5ldyBzZWNvbmRhcnkgdHlwZSBsaXN0LgotICAgICAgICAtLWRpbTsKLSAgICAgICAgbmV3U2Vjb25kYXJ5VHlwZXMgPSB0cnVlOwotICAgICAgICBzdXBlciA9IEMtPmJhc2VDbGFzcygpLT5hc0FycmF5Q2xhc3MoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIElmIHRoZSBiYXNlIGNsYXNzIGlzIGFueSBvdGhlciBjbGFzcywgaW50ZXJmYWNlIG9yIG5vdCwKLSAgICAgICAgLy8gdGhlIHN1cGVyIGlzIG9mIHRoZSBkaW1lbnNpb24gb2YgdGhlIGN1cnJlbnQgYXJyYXkgY2xhc3MsCi0gICAgICAgIC8vIGFuZCB3aG9zZSBiYXNlIGNsYXNzIGlzIHRoZSBzdXBlciBvZiB0aGlzIGJhc2UgY2xhc3MuCi0gICAgICAgIGNvbnN0IFVURjgqIHN1cGVyTmFtZSA9IEpDTC0+Y29uc3RydWN0QXJyYXlOYW1lKGRpbSwgYmFzZS0+c3VwZXItPm5hbWUpOwotICAgICAgICBKbmp2bUNsYXNzTG9hZGVyKiBzdXBlckxvYWRlciA9IGJhc2UtPnN1cGVyLT5jbGFzc0xvYWRlcjsKLSAgICAgICAgc3VwZXIgPSBzdXBlckxvYWRlci0+Y29uc3RydWN0QXJyYXkoc3VwZXJOYW1lKTsKLSAgICAgIH0KLSAgICAKLSAgICAgIGFzc2VydChzdXBlciAmJiAiTm8gc3VwZXIgZm91bmQiKTsKLSAgICAgIEphdmFWaXJ0dWFsVGFibGUqIHN1cGVyVlQgPSBzdXBlci0+dmlydHVhbFZUOwotICAgICAgZGVwdGggPSBzdXBlclZULT5kZXB0aCArIDE7Ci0gICAgICAKLSAgICAgIC8vIFJlY29yZCBpZiB3ZSBuZWVkIHRvIGFkZCB0aGUgc3VwZXIgaW4gdGhlIGxpc3Qgb2Ygc2Vjb25kYXJ5IHR5cGVzLgotICAgICAgdWludDMyIGFkZFN1cGVyID0gMDsKLQotICAgICAgdWludDMyIGxlbmd0aCA9IGdldERpc3BsYXlMZW5ndGgoKSA8IGRlcHRoID8gZ2V0RGlzcGxheUxlbmd0aCgpIDogZGVwdGg7Ci0gICAgICBtZW1jcHkoZGlzcGxheSwgc3VwZXJWVC0+ZGlzcGxheSwgbGVuZ3RoICogc2l6ZW9mKEphdmFWaXJ0dWFsVGFibGUqKSk7IAotICAgICAgaWYgKGRlcHRoIDwgZ2V0RGlzcGxheUxlbmd0aCgpICYmICFpbnRmKSB7Ci0gICAgICAgIGRpc3BsYXlbZGVwdGhdID0gdGhpczsKLSAgICAgICAgb2Zmc2V0ID0gZ2V0Q2FjaGVJbmRleCgpICsgZGVwdGggKyAxOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb2Zmc2V0ID0gZ2V0Q2FjaGVJbmRleCgpOwotICAgICAgICAvLyBXZSBhZGQgdGhlIHN1cGVyIGlmIHRoZSBjdXJyZW50IGNsYXNzIGlzIGFuIGludGVyZmFjZSBvciBpZiB0aGUgc3VwZXIKLSAgICAgICAgLy8gY2xhc3MgaXMgb3V0IG9mIGRlcHRoLgotICAgICAgICBpZiAoaW50ZiB8fCBkZXB0aCAhPSBnZXREaXNwbGF5TGVuZ3RoKCkpIGFkZFN1cGVyID0gMTsKLSAgICAgIH0KLSAgICAgICAgCi0gICAgICBtdm06OkJ1bXBQdHJBbGxvY2F0b3ImIGFsbG9jYXRvciA9IEpDTC0+YWxsb2NhdG9yOwotCi0gICAgICBpZiAoIW5ld1NlY29uZGFyeVR5cGVzKSB7Ci0gICAgICAgIGlmIChiYXNlLT5uYkludGVyZmFjZXMgfHwgYWRkU3VwZXIpIHsKLSAgICAgICAgICAvLyBJZiB0aGUgYmFzZSBjbGFzcyBpbXBsZW1lbnRzIGludGVyZmFjZXMsIHdlIG11c3QgYWxzbyBhZGQgdGhlCi0gICAgICAgICAgLy8gYXJyYXlzIG9mIHRoZXNlIGludGVyZmFjZXMsIG9mIHRoZSBzYW1lIGRpbWVuc2lvbiB0aGFuIHRoaXMgYXJyYXkKLSAgICAgICAgICAvLyBjbGFzcyBhbmQgYWRkIHRoZW0gdG8gdGhlIHNlY29uZGFyeSB0eXBlcyBsaXN0LgotICAgICAgICAgIG5iU2Vjb25kYXJ5VHlwZXMgPSBiYXNlLT5uYkludGVyZmFjZXMgKyBzdXBlclZULT5uYlNlY29uZGFyeVR5cGVzICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkU3VwZXI7Ci0gICAgICAgICAgc2Vjb25kYXJ5VHlwZXMgPSAoSmF2YVZpcnR1YWxUYWJsZSoqKQotICAgICAgICAgICAgYWxsb2NhdG9yLkFsbG9jYXRlKHNpemVvZihKYXZhVmlydHVhbFRhYmxlKikgKiBuYlNlY29uZGFyeVR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZWNvbmRhcnkgdHlwZXMiKTsKLSAgICAgICAgIAotICAgICAgICAgIC8vIFB1dCB0aGUgc3VwZXIgaW4gdGhlIGxpc3Qgb2Ygc2Vjb25kYXJ5IHR5cGVzLgotICAgICAgICAgIGlmIChhZGRTdXBlcikgc2Vjb25kYXJ5VHlwZXNbMF0gPSBzdXBlclZUOwotCi0gICAgICAgICAgLy8gQ29weSB0aGUgbGlzdCBvZiBzZWNvbmRhcnkgdHlwZXMgb2YgdGhlIHN1cGVyLgotICAgICAgICAgIG1lbWNweShzZWNvbmRhcnlUeXBlcyArIGFkZFN1cGVyLCBzdXBlclZULT5zZWNvbmRhcnlUeXBlcywKLSAgICAgICAgICAgICAgICAgc3VwZXJWVC0+bmJTZWNvbmRhcnlUeXBlcyAqIHNpemVvZihKYXZhVmlydHVhbFRhYmxlKikpOwotICAgICAgICAKLSAgICAgICAgICAvLyBBZGQgb3VyIG93biBzZWNvbmRhcnkgdHlwZXM6IHRoZSBpbnRlcmZhY2VzIG9mIHRoZSBiYXNlIGNsYXNzIHB1dAotICAgICAgICAgIC8vIGluIHRoZSBkaW1lbnNpb24gb2YgdGhlIGN1cnJlbnQgYXJyYXkgY2xhc3MuCi0gICAgICAgICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBiYXNlLT5uYkludGVyZmFjZXM7ICsraSkgewotICAgICAgICAgICAgY29uc3QgVVRGOCogbmFtZSA9IAotICAgICAgICAgICAgICBKQ0wtPmNvbnN0cnVjdEFycmF5TmFtZShkaW0sIGJhc2UtPmludGVyZmFjZXNbaV0tPm5hbWUpOwotICAgICAgICAgICAgQ2xhc3NBcnJheSogaW50ZXJmYWNlID0gSkNMLT5jb25zdHJ1Y3RBcnJheShuYW1lKTsKLSAgICAgICAgICAgIEphdmFWaXJ0dWFsVGFibGUqIEN1clZUID0gaW50ZXJmYWNlLT52aXJ0dWFsVlQ7Ci0gICAgICAgICAgICBzZWNvbmRhcnlUeXBlc1tpICsgc3VwZXJWVC0+bmJTZWNvbmRhcnlUeXBlcyArIGFkZFN1cGVyXSA9IEN1clZUOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBJZiB0aGUgc3VwZXIgaXMgbm90IGEgc2Vjb25kYXJ5IHR5cGUgYW5kIHRoZSBiYXNlIGNsYXNzIGRvZXMgbm90Ci0gICAgICAgICAgLy8gaW1wbGVtZW50IGFueSBpbnRlcmZhY2UsIHdlIGNhbiByZXVzZSB0aGUgbGlzdCBvZiBzZWNvbmRhcnkgdHlwZXMKLSAgICAgICAgICAvLyBvZiBzdXBlci4KLSAgICAgICAgICBuYlNlY29uZGFyeVR5cGVzID0gc3VwZXJWVC0+bmJTZWNvbmRhcnlUeXBlczsKLSAgICAgICAgICBzZWNvbmRhcnlUeXBlcyA9IHN1cGVyVlQtPnNlY29uZGFyeVR5cGVzOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotCi0gICAgICAgIC8vIFRoaXMgaXMgYW4gT2JqZWN0Wy4uLi5dIGFycmF5IGNsYXNzLiBJdCB3aWxsIGNyZWF0ZSB0aGUgbGlzdCBvZgotICAgICAgICAvLyBzZWNvbmRhcnkgdHlwZXMgYW5kIGFsbCBhcnJheSBjbGFzc2VzIG9mIHRoZSBzYW1lIGRpbWVuc2lvbiB3aG9zZQotICAgICAgICAvLyBiYXNlIGNsYXNzIGRvZXMgbm90IGhhdmUgaW50ZXJmYWNlcyBwb2ludCB0byB0aGlzIGFycmF5LgotCi0gICAgICAgIC8vIElmIHdlJ3JlIHN1cGVyaW9yIHRoYW4gdGhlIGRpc3BsYXkgbGltaXQsIHdlIG11c3QgbWFrZSByb29tIGZvciBvbmUKLSAgICAgICAgLy8gc2xvdCB0aGF0IHdpbGwgY29udGFpbiB0aGUgY3VycmVudCBWVC4KLSAgICAgICAgdWludDMyIG91dE9mRGVwdGggPSAwOwotICAgICAgICBpZiAoZGVwdGggPj0gZ2V0RGlzcGxheUxlbmd0aCgpKSBvdXRPZkRlcHRoID0gMTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydChjbC0+bmJJbnRlcmZhY2VzID09IDIgJiYgIkFycmF5cyBoYXZlIG1vcmUgdGhhbiAyIGludGVyZmFjZT8iKTsKLQotICAgICAgICAvLyBUaGUgbGlzdCBvZiBzZWNvbmRhcnkgdHlwZXMgaXMgY29tcG9zZWQgb2Y6Ci0gICAgICAgIC8vICgxKSBUaGUgbGlzdCBvZiBzZWNvbmRhcnkgdHlwZXMgb2Ygc3VwZXIgYXJyYXkuCi0gICAgICAgIC8vICgyKSBUaGUgYXJyYXkgb2YgaW5oZXJpdGVkIGludGVyZmFjZXMgd2l0aCB0aGUgc2FtZSBkaW1lbnNpb25zLgotICAgICAgICAvLyAoMykgVGhpcyBWVCwgaWYgaXRzIGRlcHRoIGlzIHN1cGVyaW9yIHRoYW4gdGhlIGRpc3BsYXkgc2l6ZS4KLSAgICAgICAgbmJTZWNvbmRhcnlUeXBlcyA9IHN1cGVyVlQtPm5iU2Vjb25kYXJ5VHlwZXMgKyAyICsgb3V0T2ZEZXB0aDsKLQotICAgICAgICBzZWNvbmRhcnlUeXBlcyA9IChKYXZhVmlydHVhbFRhYmxlKiopCi0gICAgICAgICAgYWxsb2NhdG9yLkFsbG9jYXRlKHNpemVvZihKYXZhVmlydHVhbFRhYmxlKikgKiBuYlNlY29uZGFyeVR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2Vjb25kYXJ5IHR5cGVzIik7Ci0gICAgICAgIAotICAgICAgICAvLyBGaXJzdCwgY29weSB0aGUgbGlzdCBvZiBzZWNvbmRhcnkgdHlwZXMgZnJvbSBzdXBlciBhcnJheS4KLSAgICAgICAgbWVtY3B5KHNlY29uZGFyeVR5cGVzICsgb3V0T2ZEZXB0aCwgc3VwZXJWVC0+c2Vjb25kYXJ5VHlwZXMsCi0gICAgICAgICAgICAgICBzdXBlclZULT5uYlNlY29uZGFyeVR5cGVzICogc2l6ZW9mKEphdmFWaXJ0dWFsVGFibGUqKSk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIGRlcHRoIGlzIHN1cGVyaW9yIHRoYW4gdGhlIGRpc3BsYXkgc2l6ZSwgcHV0IHRoZSBjdXJyZW50IFZUCi0gICAgICAgIC8vIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QuCi0gICAgICAgIGlmIChvdXRPZkRlcHRoKSBzZWNvbmRhcnlUeXBlc1swXSA9IHRoaXM7Ci0gICAgICAgIAotICAgICAgICAvLyBMb2FkIENsb25lYWJsZVsuLi5dIGFuZCBTZXJpYWxpemFibGVbLi4uXQotICAgICAgICBjb25zdCBVVEY4KiBuYW1lID0gSkNMLT5jb25zdHJ1Y3RBcnJheU5hbWUoZGltLCBjbC0+aW50ZXJmYWNlc1swXS0+bmFtZSk7Ci0gICAgICAgIENsYXNzQXJyYXkqIGZpcnN0SW50ZXJmYWNlID0gSkNMLT5jb25zdHJ1Y3RBcnJheShuYW1lKTsKLSAgICAgICAgbmFtZSA9IEpDTC0+Y29uc3RydWN0QXJyYXlOYW1lKGRpbSwgY2wtPmludGVyZmFjZXNbMV0tPm5hbWUpOwotICAgICAgICBDbGFzc0FycmF5KiBzZWNvbmRJbnRlcmZhY2UgPSBKQ0wtPmNvbnN0cnVjdEFycmF5KG5hbWUpOwotCi0gICAgICAgIHVpbnQzMiBpbmRleCA9IHN1cGVyVlQtPm5iU2Vjb25kYXJ5VHlwZXMgKyBvdXRPZkRlcHRoOwotCi0gICAgICAgIC8vIFB1dCBDbG9uZWFibGVbLi4uXSBhbmQgU2VyaWFsaXphYmxlWy4uLl0gYXQgdGhlIGVuZCBvZiB0aGUgbGlzdC4KLSAgICAgICAgc2Vjb25kYXJ5VHlwZXNbaW5kZXhdID0gZmlyc3RJbnRlcmZhY2UtPnZpcnR1YWxWVDsKLSAgICAgICAgc2Vjb25kYXJ5VHlwZXNbaW5kZXggKyAxXSA9IHNlY29uZEludGVyZmFjZS0+dmlydHVhbFZUOwotCi0gICAgICAgIC8vIElmIHRoZSBkZXB0aCBpcyBncmVhdGVyIHRoYW4gdGhlIGRpc3BsYXkgc2l6ZSwgCi0gICAgICAgIC8vIENsb25lYWJsZVsuLi5dIGFuZCBTZXJpYWxpemFibGVbLi4uXSBoYXZlIHRoZWlyIG93biBsaXN0IG9mCi0gICAgICAgIC8vIHNlY29uZGFyeSB0eXBlcywgYW5kIHdlIG11c3QgdGhlcmVmb3JlIHRlbGwgdGhlbSB0aGF0IHRoZXkKLSAgICAgICAgLy8gaW1wbGVtZW50IHRoZW1zZWx2ZXMuCi0gICAgICAgIC8vIElmIHRoZSBkZXB0aCBpcyBsZXNzIHRoYW4gdGhhbiB0aGUgZGlzcGxheSBzaXplLCB0aGVyZSBpcyBub3RoaW5nCi0gICAgICAgIC8vIHRvIGRvOiB0aGUgYXJyYXkgb2Ygc2Vjb25kYXJ5IHR5cGVzIGhhcyBiZWVuIGNyZWF0ZWQgYmVmb3JlIGxvYWRpbmcKLSAgICAgICAgLy8gdGhlIGludGVyZmFjZSBhcnJheXMsIHNvIHRoZSBpbnRlcmZhY2UgYXJyYXlzIGFscmVhZHkgcmVmZXJlbmNlCi0gICAgICAgIC8vIHRoZSBhcnJheS4KLSAgICAgICAgaWYgKG91dE9mRGVwdGgpIHsKLSAgICAgICAgICBmaXJzdEludGVyZmFjZS0+dmlydHVhbFZULT5zZWNvbmRhcnlUeXBlc1tpbmRleF0gPQotICAgICAgICAgICAgZmlyc3RJbnRlcmZhY2UtPnZpcnR1YWxWVDsKLSAgICAgICAgICBmaXJzdEludGVyZmFjZS0+dmlydHVhbFZULT5zZWNvbmRhcnlUeXBlc1tpbmRleCArIDFdID0KLSAgICAgICAgICAgIHNlY29uZEludGVyZmFjZS0+dmlydHVhbFZUOwotICAgICAgICAgIHNlY29uZEludGVyZmFjZS0+dmlydHVhbFZULT5zZWNvbmRhcnlUeXBlc1tpbmRleF0gPQotICAgICAgICAgICAgZmlyc3RJbnRlcmZhY2UtPnZpcnR1YWxWVDsKLSAgICAgICAgICBzZWNvbmRJbnRlcmZhY2UtPnZpcnR1YWxWVC0+c2Vjb25kYXJ5VHlwZXNbaW5kZXggKyAxXSA9Ci0gICAgICAgICAgICBzZWNvbmRJbnRlcmZhY2UtPnZpcnR1YWxWVDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFRoaXMgaXMgamF2YS5sYW5nLk9iamVjdFtdLgotICAgICAgZGVwdGggPSAxOwotICAgICAgZGlzcGxheVswXSA9IEMtPnN1cGVyLT52aXJ0dWFsVlQ7Ci0gICAgICBkaXNwbGF5WzFdID0gdGhpczsKLSAgICAgIG9mZnNldCA9IGdldENhY2hlSW5kZXgoKSArIDI7Ci0gICAgICBuYlNlY29uZGFyeVR5cGVzID0gMjsKLSAgICAgIAotICAgICAgbXZtOjpCdW1wUHRyQWxsb2NhdG9yJiBhbGxvY2F0b3IgPSBKQ0wtPmFsbG9jYXRvcjsKLSAgICAgIHNlY29uZGFyeVR5cGVzID0gKEphdmFWaXJ0dWFsVGFibGUqKikKLSAgICAgICAgYWxsb2NhdG9yLkFsbG9jYXRlKHNpemVvZihKYXZhVmlydHVhbFRhYmxlKikgKiBuYlNlY29uZGFyeVR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlY29uZGFyeSB0eXBlcyIpOwotCi0gICAgICAvLyBUaGUgaW50ZXJmYWNlcyBoYXZlIGFscmVhZHkgYmVlbiByZXNvbHZlZC4KLSAgICAgIHNlY29uZGFyeVR5cGVzWzBdID0gY2wtPmludGVyZmFjZXNbMF0tPnZpcnR1YWxWVDsKLSAgICAgIHNlY29uZGFyeVR5cGVzWzFdID0gY2wtPmludGVyZmFjZXNbMV0tPnZpcnR1YWxWVDsKLSAgICB9Ci0KLSAgfSBlbHNlIHsKLSAgICAvLyBTZXQgdGhlIHRyYWNlciwgZGVzdHJ1Y3RvciBhbmQgZGVsZXRlCi0gICAgdHJhY2VyID0gKHVpbnRwdHJfdClKYXZhT2JqZWN0VHJhY2VyOwotICAgIGRlc3RydWN0b3IgPSAwOwotICAgIG9wZXJhdG9yRGVsZXRlID0gMDsKLSAgICAKLSAgICAvLyBTZXQgdGhlIGNsYXNzIG9mIHRoaXMgVlQuCi0gICAgY2wgPSBDOwotICAgIAotICAgIC8vIFNldCBkZXB0aCBhbmQgZGlzcGxheSBmb3IgZmFzdCBkeW5hbWljIHR5cGUgY2hlY2tpbmcuIFNpbmNlCi0gICAgLy8gSmF2YU9iamVjdCBoYXMgbm90IGJlZW4gbG9hZGVkIHlldCwgZG9uJ3QgdXNlIHN1cGVyLgotICAgIGRlcHRoID0gMTsKLSAgICBkaXNwbGF5WzBdID0gMDsKLSAgICBkaXNwbGF5WzFdID0gdGhpczsKLSAgICBuYlNlY29uZGFyeVR5cGVzID0gMjsKLSAgICBvZmZzZXQgPSBnZXRDYWNoZUluZGV4KCkgKyAyOwotCi0gICAgLy8gVGhlIGxpc3Qgb2Ygc2Vjb25kYXJ5IHR5cGVzIGhhcyBub3QgYmVlbiBhbGxvY2F0ZWQgeWV0IGJ5Ci0gICAgLy8gamF2YS5sYW5nLk9iamVjdFtdLiBUaGUgaW5pdGlhbGlzZVZUIGZ1bmN0aW9uIHdpbGwgdXBkYXRlIHRoZSBjdXJyZW50Ci0gICAgLy8gYXJyYXkgdG8gcG9pbnQgdG8gamF2YS5sYW5nLk9iamVjdFtdJ3Mgc2Vjb25kYXJ5IGxpc3QuCi0gIH0KLX0KLQotCi1KYXZhVmlydHVhbFRhYmxlOjpKYXZhVmlydHVhbFRhYmxlKENsYXNzUHJpbWl0aXZlKiBDKSB7Ci0gIC8vIE9ubHkgdXNlZCBmb3Igc3VidHlwZSBjaGVja2luZwotCXZtID0gQy0+Y2xhc3NMb2FkZXItPnZtOwotICBjbCA9IEM7Ci0gIGRlcHRoID0gMDsKLSAgZGlzcGxheVswXSA9IHRoaXM7Ci0gIG5iU2Vjb25kYXJ5VHlwZXMgPSAwOwotICBvZmZzZXQgPSBnZXRDYWNoZUluZGV4KCkgKyAxOwotfQotCi12b2lkIEFubm90YXRpb25SZWFkZXI6OnJlYWRBbm5vdGF0aW9uKCkgewotICB1aW50MTYgdHlwZUluZGV4ID0gcmVhZGVyLnJlYWRVMigpOwotICB1aW50MTYgbnVtUGFpcnMgPSByZWFkZXIucmVhZFUyKCk7Ci0KLSAgZm9yICh1aW50MTYgaiA9IDA7IGogPCBudW1QYWlyczsgKytqKSB7Ci0gICAgLyogdWludDE2IG5hbWVJbmRleCA9ICovIHJlYWRlci5yZWFkVTIoKTsKLSAgICByZWFkRWxlbWVudFZhbHVlKCk7Ci0gIH0KLSAgQW5ub3RhdGlvbk5hbWVJbmRleCA9IHR5cGVJbmRleDsKLX0KLQotdm9pZCBBbm5vdGF0aW9uUmVhZGVyOjpyZWFkRWxlbWVudFZhbHVlKCkgewotICB1aW50OCB0YWcgPSByZWFkZXIucmVhZFUxKCk7Ci0gIGlmICgodGFnID09ICdCJykgfHwgKHRhZyA9PSAnQycpIHx8ICh0YWcgPT0gJ0QnKSB8fCAodGFnID09ICdGJykgfHwKLSAgICAgICh0YWcgPT0gJ0onKSB8fCAodGFnID09ICdTJykgfHwgKHRhZyA9PSAnSScpIHx8ICh0YWcgPT0gJ1onKSB8fCAKLSAgICAgICh0YWcgPT0gJ3MnKSkgewotICAgIC8qIHVpbnQxNiBjb25zdFZhbHVlID0gKi8gcmVhZGVyLnJlYWRVMigpOwotICB9IGVsc2UgaWYgKHRhZyA9PSAnZScpIHsKLSAgICAvKiB1aW50MTYgdHlwZU5hbWUgPSAqLyByZWFkZXIucmVhZFUyKCk7Ci0gICAgLyogdWludDE2IGNvbnN0TmFtZSA9ICovIHJlYWRlci5yZWFkVTIoKTsKLSAgfSBlbHNlIGlmICh0YWcgPT0gJ2MnKSB7Ci0gICAgLyogdWludDE2IGNsYXNzSW5mb0luZGV4ID0gKi8gcmVhZGVyLnJlYWRVMigpOwotICB9IGVsc2UgaWYgKHRhZyA9PSAnQCcpIHsKLSAgICByZWFkQW5ub3RhdGlvbigpOwotICB9IGVsc2UgaWYgKHRhZyA9PSAnWycpIHsKLSAgICB1aW50MTYgbnVtVmFsdWVzID0gcmVhZGVyLnJlYWRVMigpOwotICAgIGZvciAodWludDMyIGkgPSAwOyBpIDwgbnVtVmFsdWVzOyArK2kpIHsKLSAgICAgIHJlYWRFbGVtZW50VmFsdWUoKTsKLSAgICB9Ci0gIH0KLX0KLQotQ29kZUxpbmVJbmZvKiBKYXZhTWV0aG9kOjpsb29rdXBDb2RlTGluZUluZm8odWludHB0cl90IGlwKSB7Ci0gIGZvcih1aW50MTYgaSA9IDA7IGkgPCBjb2RlSW5mb0xlbmd0aDsgKytpKSB7Ci0gICAgaWYgKGNvZGVJbmZvW2ldLmFkZHJlc3MgPT0gaXApIHsKLSAgICAgIHJldHVybiAmKGNvZGVJbmZvW2ldKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXVpbnQxNiBKYXZhTWV0aG9kOjpsb29rdXBMaW5lTnVtYmVyKHVpbnRwdHJfdCBpcCkgewotICBmb3IodWludDE2IGkgPSAwOyBpIDwgY29kZUluZm9MZW5ndGg7ICsraSkgewotICAgIGlmIChjb2RlSW5mb1tpXS5hZGRyZXNzID09IGlwKSB7Ci0gICAgICBBdHRyaWJ1dCogY29kZUF0dCA9IGxvb2t1cEF0dHJpYnV0KEF0dHJpYnV0Ojpjb2RlQXR0cmlidXQpOyAgICAgIAotICAgICAgaWYgKGNvZGVBdHQgPT0gTlVMTCkgcmV0dXJuIDA7Ci0gICAgICBSZWFkZXIgcmVhZGVyKGNvZGVBdHQsIGNsYXNzRGVmLT5ieXRlcyk7Ci0gICAgICByZWFkZXIucmVhZFUyKCk7IC8vIG1heF9zdGFjawotICAgICAgcmVhZGVyLnJlYWRVMigpOyAvLyBtYXhfbG9jYWxzOwotICAgICAgdWludDMyX3QgY29kZUxlbmd0aCA9IHJlYWRlci5yZWFkVTQoKTsKLSAgICAgIHJlYWRlci5zZWVrKGNvZGVMZW5ndGgsIFJlYWRlcjo6U2Vla0N1cik7Ci0gICAgICB1aW50MTZfdCBleGNlcHRpb25UYWJsZUxlbmd0aCA9IHJlYWRlci5yZWFkVTIoKTsKLSAgICAgIHJlYWRlci5zZWVrKDggKiBleGNlcHRpb25UYWJsZUxlbmd0aCwgUmVhZGVyOjpTZWVrQ3VyKTsKLSAgICAgIHVpbnQxNl90IG5iYSA9IHJlYWRlci5yZWFkVTIoKTsKLSAgICAgIGZvciAodWludDE2IGF0dCA9IDA7IGF0dCA8IG5iYTsgKythdHQpIHsKLSAgICAgICAgY29uc3QgVVRGOCogYXR0TmFtZSA9IGNsYXNzRGVmLT5jdHBJbmZvLT5VVEY4QXQocmVhZGVyLnJlYWRVMigpKTsKLSAgICAgICAgdWludDMyIGF0dExlbiA9IHJlYWRlci5yZWFkVTQoKTsKLSAgICAgICAgaWYgKGF0dE5hbWUtPmVxdWFscyhBdHRyaWJ1dDo6bGluZU51bWJlclRhYmxlQXR0cmlidXQpKSB7Ci0gICAgICAgICAgdWludDE2X3QgbGluZUxlbmd0aCA9IHJlYWRlci5yZWFkVTIoKTsKLSAgICAgICAgICB1aW50MTZfdCBjdXJyZW50TGluZSA9IDA7Ci0gICAgICAgICAgZm9yICh1aW50MTYgaiA9IDA7IGogPCBsaW5lTGVuZ3RoOyArK2opIHsKLSAgICAgICAgICAgIHVpbnQxNiBwYyA9IHJlYWRlci5yZWFkVTIoKTsKLSAgICAgICAgICAgIGlmIChwYyA+IGNvZGVJbmZvW2ldLmJ5dGVjb2RlSW5kZXggKyAxKSByZXR1cm4gY3VycmVudExpbmU7Ci0gICAgICAgICAgICBjdXJyZW50TGluZSA9IHJlYWRlci5yZWFkVTIoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIGN1cnJlbnRMaW5lOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJlYWRlci5zZWVrKGF0dExlbiwgUmVhZGVyOjpTZWVrQ3VyKTsgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gMDsKLX0KLQotdWludDE2IEphdmFNZXRob2Q6Omxvb2t1cEN0cEluZGV4KHVpbnRwdHJfdCBpcCkgewotICBmb3IodWludDE2IGkgPSAwOyBpIDwgY29kZUluZm9MZW5ndGg7ICsraSkgewotICAgIGlmIChjb2RlSW5mb1tpXS5hZGRyZXNzID09IGlwKSB7Ci0gICAgICBBdHRyaWJ1dCogY29kZUF0dCA9IGxvb2t1cEF0dHJpYnV0KEF0dHJpYnV0Ojpjb2RlQXR0cmlidXQpOwotICAgICAgUmVhZGVyIHJlYWRlcihjb2RlQXR0LCBjbGFzc0RlZi0+Ynl0ZXMpOwotICAgICAgcmVhZGVyLmN1cnNvciA9IHJlYWRlci5jdXJzb3IgKyAyICsgMiArIDQgKyBjb2RlSW5mb1tpXS5ieXRlY29kZUluZGV4ICsgMTsKLSAgICAgIHJldHVybiByZWFkZXIucmVhZFUyKCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiAwOwotfQotCi12b2lkIENsYXNzOjphY3F1aXJlKCkgewotICBKYXZhT2JqZWN0KiBkZWxlZ2F0ZWUgPSBOVUxMOwotICBsbHZtX2djcm9vdChkZWxlZ2F0ZWUsIDApOwotICBkZWxlZ2F0ZWUgPSBnZXRDbGFzc0RlbGVnYXRlZSgpOwotICBKYXZhT2JqZWN0OjphY3F1aXJlKGRlbGVnYXRlZSk7Ci19Ci0gIAotdm9pZCBDbGFzczo6cmVsZWFzZSgpIHsKLSAgSmF2YU9iamVjdCogZGVsZWdhdGVlID0gTlVMTDsKLSAgbGx2bV9nY3Jvb3QoZGVsZWdhdGVlLCAwKTsKLSAgZGVsZWdhdGVlID0gZ2V0Q2xhc3NEZWxlZ2F0ZWUoKTsKLSAgSmF2YU9iamVjdDo6cmVsZWFzZShkZWxlZ2F0ZWUpOwotfQotCi12b2lkIENsYXNzOjp3YWl0Q2xhc3MoKSB7Ci0gIEphdmFPYmplY3QqIGRlbGVnYXRlZSA9IE5VTEw7Ci0gIGxsdm1fZ2Nyb290KGRlbGVnYXRlZSwgMCk7Ci0gIGRlbGVnYXRlZSA9IGdldENsYXNzRGVsZWdhdGVlKCk7Ci0gIEphdmFPYmplY3Q6OndhaXQoZGVsZWdhdGVlKTsKLX0KLSAgCi12b2lkIENsYXNzOjpicm9hZGNhc3RDbGFzcygpIHsKLSAgSmF2YU9iamVjdCogZGVsZWdhdGVlID0gTlVMTDsKLSAgbGx2bV9nY3Jvb3QoZGVsZWdhdGVlLCAwKTsKLSAgZGVsZWdhdGVlID0gZ2V0Q2xhc3NEZWxlZ2F0ZWUoKTsKLSAgSmF2YU9iamVjdDo6bm90aWZ5QWxsKGRlbGVnYXRlZSk7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvVk1Db3JlL0phdmFDbGFzcy5oIGIvdm1raXQvbGliL0ozL1ZNQ29yZS9KYXZhQ2xhc3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE0MjkyNS4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvSjMvVk1Db3JlL0phdmFDbGFzcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI4NyArMCwwIEBACi0vLz09PS0tLS0tLS0tIEphdmFDbGFzcy5oIC0gSmF2YSBjbGFzcyByZXByZXNlbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIEpOSlZNX0pBVkFfQ0xBU1NfSAotI2RlZmluZSBKTkpWTV9KQVZBX0NMQVNTX0gKLQotCi0jaW5jbHVkZSAidHlwZXMuaCIKLQotI2luY2x1ZGUgIm12bS9BbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJtdm0vTWV0aG9kSW5mby5oIgotI2luY2x1ZGUgIm12bS9UaHJlYWRzL0NvbmQuaCIKLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9Mb2Nrcy5oIgotCi0jaW5jbHVkZSAiSmF2YUFjY2Vzcy5oIgotI2luY2x1ZGUgIkphdmFPYmplY3QuaCIKLSNpbmNsdWRlICJKbmp2bUNsYXNzTG9hZGVyLmgiCi0jaW5jbHVkZSAiSm5qdm1Db25maWcuaCIKLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8c2V0PgotCi1uYW1lc3BhY2UgajMgewotCi1jbGFzcyBBcnJheU9iamVjdDsKLWNsYXNzIEFycmF5VUludDg7Ci1jbGFzcyBBcnJheVVJbnQxNjsKLWNsYXNzIENsYXNzOwotY2xhc3MgQ2xhc3NBcnJheTsKLWNsYXNzIENsYXNzQnl0ZXM7Ci1jbGFzcyBKYXZhQXJyYXk7Ci1jbGFzcyBKYXZhQ29uc3RhbnRQb29sOwotY2xhc3MgSmF2YUZpZWxkOwotY2xhc3MgSmF2YU1ldGhvZDsKLWNsYXNzIEphdmFPYmplY3Q7Ci1jbGFzcyBKYXZhVmlydHVhbFRhYmxlOwotY2xhc3MgUmVhZGVyOwotY2xhc3MgU2lnbmRlZjsKLWNsYXNzIFR5cGVkZWY7Ci0KLQotLy8vIEphdmFTdGF0ZSAtIExpc3Qgb2Ygc3RhdGVzIGEgSmF2YSBjbGFzcyBjYW4gaGF2ZS4gQSBjbGFzcyBpcyByZWFkeSB0byBiZQotLy8vIHVzZWQgKGkuZSBhbGxvY2F0aW5nIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MsIGNhbGxpbmcgbWV0aG9kcyBvZiB0aGUgY2xhc3MKLS8vLyBhbmQgYWNjZXNzaW5nIHN0YXRpYyBmaWVsZHMgb2YgdGhlIGNsYXNzKSB3aGVuIGl0IGlzIGluIHRoZSByZWFkeSBzdGF0ZS4KLS8vLwotI2RlZmluZSBsb2FkZWQgMCAgICAgICAvLy8gVGhlIC5jbGFzcyBmaWxlIGhhcyBiZWVuIGZvdW5kLgotI2RlZmluZSByZXNvbHZpbmcgMSAgICAvLy8gVGhlIC5jbGFzcyBmaWxlIGlzIGJlaW5nIHJlc29sdmVkLgotI2RlZmluZSByZXNvbHZlZCAyICAgICAvLy8gVGhlIGNsYXNzIGhhcyBiZWVuIHJlc29sdmVkLgotI2RlZmluZSB2bWpjIDMgICAgICAgICAvLy8gVGhlIGNsYXNzIGlzIGRlZmluZWQgaW4gYSBzaGFyZWQgbGlicmFyeS4KLSNkZWZpbmUgaW5DbGluaXQgNCAgICAgLy8vIFRoZSBjbGFzcyBpcyBjbGluaXRpbmcuCi0jZGVmaW5lIHJlYWR5IDUgICAgICAgIC8vLyBUaGUgY2xhc3MgaXMgcmVhZHkgdG8gYmUgdXNlZC4KLSNkZWZpbmUgZXJyb25lb3VzIDYgICAgLy8vIFRoZSBjbGFzcyBpcyBpbiBhbiBlcnJvbmVvdXMgc3RhdGUuCi0KLQotY2xhc3MgQW5ub3RhdGlvblJlYWRlciB7Ci1wdWJsaWM6Ci0gIFJlYWRlciYgcmVhZGVyOwotICBDbGFzcyogY2w7Ci0gIHVpbnQxNiBBbm5vdGF0aW9uTmFtZUluZGV4OwotCi0gIEFubm90YXRpb25SZWFkZXIoUmVhZGVyJiBSLCBDbGFzcyogQykgOiByZWFkZXIoUiksIGNsKEMpLAotICAgIEFubm90YXRpb25OYW1lSW5kZXgoMCkge30KLSAgdm9pZCByZWFkQW5ub3RhdGlvbigpOwotICB2b2lkIHJlYWRFbGVtZW50VmFsdWUoKTsKLX07Ci0KLS8vLyBBdHRyaWJ1dCAtIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBKVk0gYXR0cmlidXRlcyB0byBKYXZhIGNsYXNzLCBtZXRob2RzIGFuZAotLy8vIGZpZWxkcyBsb2NhdGVkIGluIHRoZSAuY2xhc3MgZmlsZS4KLS8vLwotY2xhc3MgQXR0cmlidXQgOiBwdWJsaWMgbXZtOjpQZXJtYW5lbnRPYmplY3QgewotcHVibGljOgotICAKLSAgLy8vIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXQuIFRoZXNlIGFyZSBzcGVjaWZpZWQgaW4gdGhlIEpWTSBib29rLgotICAvLy8gRXhwZXJpbWVudGFsIGF0dHJpYnV0ZXMgZXhpc3QsIGJ1dCB0aGUgSm5KVk0gZG9lcyBub3IgcGFyc2UgdGhlbS4KLSAgLy8vCi0gIGNvbnN0IFVURjgqIG5hbWU7Ci0KLSAgLy8vIHN0YXJ0IC0gVGhlIG9mZnNldCBpbiB0aGUgY2xhc3Mgb2YgdGhpcyBhdHRyaWJ1dC4KLSAgLy8vCi0gIHVpbnQzMiBzdGFydDsKLQotICAvLy8gbmJiIC0gVGhlIHNpemUgb2YgdGhlIGF0dHJpYnV0LgotICAvLy8KLSAgdWludDMyIG5iYjsKLQotICAvLy8gQXR0cmlidXQgLSBDcmVhdGUgYW4gYXR0cmlidXQgYXQgdGhlIGdpdmVuIGxlbmd0aCBhbmQgb2Zmc2V0LgotICAvLy8KLSAgQXR0cmlidXQoY29uc3QgVVRGOCogbmFtZSwgdWludDMyIGxlbmd0aCwgdWludDMyIG9mZnNldCk7Ci0gIEF0dHJpYnV0KCkge30KLQotICAvLy8gY29kZUF0dHJpYnV0IC0gVGhlICJDb2RlIiBKVk0gYXR0cmlidXQuIFRoaXMgaXMgYSBtZXRob2QgYXR0cmlidXQgZm9yCi0gIC8vLyBmaW5kaW5nIHRoZSBieXRlY29kZSBvZiBhIG1ldGhvZCBpbiB0aGUgLmNsYXNzIGZpbGUuCi0gIC8vCi0gIHN0YXRpYyBjb25zdCBVVEY4KiBjb2RlQXR0cmlidXQ7Ci0gIAotICAvLy8gYW5ub3RhdGlvbnNBdHRyaWJ1dCAtIFRoZSAiUnVudGltZVZpc2libGVBbm5vdGF0aW9ucyIgSlZNIGF0dHJpYnV0LgotICAvLy8gVGhpcyBpcyBhIG1ldGhvZCBhdHRyaWJ1dCBmb3IgZ2V0dGluZyB0aGUgcnVudGltZSBhbm5vdGF0aW9ucy4KLSAgLy8KLSAgc3RhdGljIGNvbnN0IFVURjgqIGFubm90YXRpb25zQXR0cmlidXQ7Ci0KLSAgLy8vIGV4Y2VwdGlvbnNBdHRyaWJ1dCAtIFRoZSAiRXhjZXB0aW9ucyIgYXR0cmlidXQuIFRoaXMgaXMgYSBtZXRob2QKLSAgLy8vIGF0dHJpYnV0IGZvciBmaW5kaW5nIHRoZSBleGNlcHRpb24gdGFibGUgb2YgYSBtZXRob2QgaW4gdGhlIC5jbGFzcwotICAvLy8gZmlsZS4KLSAgLy8vCi0gIHN0YXRpYyBjb25zdCBVVEY4KiBleGNlcHRpb25zQXR0cmlidXQ7Ci0KLSAgLy8vIGNvbnN0YW50QXR0cmlidXQgLSBUaGUgIkNvbnN0YW50VmFsdWUiIGF0dHJpYnV0LiBUaGlzIGlzIGEgZmllbGQgYXR0cmlidXQKLSAgLy8vIHdoZW4gdGhlIGZpZWxkIGhhcyBhIHN0YXRpYyBjb25zdGFudCB2YWx1ZS4KLSAgLy8vCi0gIHN0YXRpYyBjb25zdCBVVEY4KiBjb25zdGFudEF0dHJpYnV0OwotCi0gIC8vLyBsaW5lTnVtYmVyVGFibGVBdHRyaWJ1dCAtIFRoZSAiTGluZU51bWJlclRhYmxlIiBhdHRyaWJ1dC4gVGhpcyBpcyB1c2VkCi0gIC8vLyBmb3IgY29ycmVzcG9uZGluZyBKVk0gYnl0ZWNvZGUgdG8gc291cmNlIGxpbmUgaW4gdGhlIC5qYXZhIGZpbGUuCi0gIC8vLwotICBzdGF0aWMgY29uc3QgVVRGOCogbGluZU51bWJlclRhYmxlQXR0cmlidXQ7Ci0KLSAgLy8vIGlubmVyQ2xhc3NBdHRyaWJ1dCAtIFRoZSAiSW5uZXJDbGFzc2VzIiBhdHRyaWJ1dC4gVGhpcyBpcyBhIGNsYXNzIGF0dHJpYnV0Ci0gIC8vLyBmb3Iga25vd2luZyB0aGUgaW5uZXIvb3V0ZXIgaW5mb3JtYXRpb25zIG9mIGEgSmF2YSBjbGFzcy4KLSAgLy8vCi0gIHN0YXRpYyBjb25zdCBVVEY4KiBpbm5lckNsYXNzZXNBdHRyaWJ1dDsKLQotICAvLy8gc291cmNlRmlsZUF0dHJpYnV0IC0gVGhlICJTb3VyY2VGaWxlIiBhdHRyaWJ1dC4gVGhpcyBpcyBhIGNsYXNzIGF0dHJpYnV0Ci0gIC8vLyBhbmQgZ2l2ZXMgdGhlIGNvcnJlc3BvbmRhbmNlIGJldHdlZW4gYSBjbGFzcyBhbmQgdGhlIG5hbWUgb2YgaXRzIEphdmEKLSAgLy8vIGZpbGUuCi0gIC8vLwotICBzdGF0aWMgY29uc3QgVVRGOCogc291cmNlRmlsZUF0dHJpYnV0OwotICAKLX07Ci0KLS8vLyBUYXNrQ2xhc3NNaXJyb3IgLSBUaGUgaXNvbGF0ZSBzcGVjaWZpYyBjbGFzcyBpbmZvcm1hdGlvbjogdGhlIGluaXRpYWxpemF0aW9uCi0vLy8gc3RhdGUgYW5kIHRoZSBzdGF0aWMgaW5zdGFuY2UuIEluIGEgbm9uLWlzb2xhdGUgZW52aXJvbm1lbnQsIHRoZXJlIGlzIG9ubHkKLS8vLyBvbmUgaW5zdGFuY2Ugb2YgYSBUYXNrQ2xhc3NNaXJyb3IgcGVyIENsYXNzLgotY2xhc3MgVGFza0NsYXNzTWlycm9yIHsKLXB1YmxpYzoKLSAgCi0gIC8vLyBzdGF0dXMgLSBUaGUgc3RhdGUuCi0gIC8vLwotICB1aW50OCBzdGF0dXM7Ci0KLSAgLy8vIGluaXRpYWxpemVkIC0gSXMgdGhlIGNsYXNzIGluaXRpYWxpemVkPwotICBib29sIGluaXRpYWxpemVkOwotCi0gIC8vLyBzdGF0aWNJbnN0YW5jZSAtIE1lbW9yeSB0aGF0IGhvbGRzIHRoZSBzdGF0aWMgdmFyaWFibGVzIG9mIHRoZSBjbGFzcy4KLSAgLy8vCi0gIHZvaWQqIHN0YXRpY0luc3RhbmNlOwotfTsKLQotLy8vIENvbW1vbkNsYXNzIC0gVGhpcyBjbGFzcyBpcyB0aGUgcm9vdCBjbGFzcyBvZiBhbGwgSmF2YSBjbGFzc2VzLiBJdCBpcwotLy8vIEdDLWFsbG9jYXRlZCBiZWNhdXNlIENvbW1vbkNsYXNzZXMgaGF2ZSB0byBiZSB0cmFjZWFibGUuIEEgamF2YS9sYW5nL0NsYXNzCi0vLy8gb2JqZWN0IHRoYXQgc3RheXMgaW4gbWVtb3J5IGhhcyBhIHJlZmVyZW5jZSB0byB0aGUgY2xhc3MuIFNhbWUgZm9yCi0vLy8gc3VwZXIgb3IgaW50ZXJmYWNlcy4KLS8vLwotY2xhc3MgQ29tbW9uQ2xhc3MgOiBwdWJsaWMgbXZtOjpQZXJtYW5lbnRPYmplY3QgewotcHVibGljOgotICAKLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gSWYgeW91IHdhbnQgdG8gYWRkIG5ldyBmaWVsZHMgb3IgbW9kaWZ5IHRoZSB0eXBlcyBvZiBmaWVsZHMsIHlvdSBtdXN0IGFsc28KLS8vIGNoYW5nZSB0aGVpciBMTFZNIHJlcHJlc2VudGF0aW9uIGluIExMVk1SdW50aW1lL3J1bnRpbWUtKi5sbCwgYW5kIHRoZWlyCi0vLyBvZmZzZXRzIGluIEpuanZtTW9kdWxlLmNwcC4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotIAotICAvLy8gZGVsZWdhdGVlcyAtIFRoZSBqYXZhL2xhbmcvQ2xhc3MgZGVsZWdhdGVlLgotICAvLy8KLSAgSmF2YU9iamVjdCogZGVsZWdhdGVlW05SX0lTT0xBVEVTXTsKLQotICAvLy8gYWNjZXNzIC0ge3B1YmxpYywgcHJpdmF0ZSwgcHJvdGVjdGVkfS4KLSAgLy8vCi0gIHVpbnQxNiBhY2Nlc3M7Ci0gIAotICAvLy8gaW50ZXJmYWNlcyAtIFRoZSBpbnRlcmZhY2VzIHRoaXMgY2xhc3MgaW1wbGVtZW50cy4KLSAgLy8vCi0gIENsYXNzKiogaW50ZXJmYWNlczsgCi0gIHVpbnQxNiBuYkludGVyZmFjZXM7Ci0gIAotICAvLy8gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjbGFzcy4KLSAgLy8vCi0gIGNvbnN0IFVURjgqIG5hbWU7Ci0gICAKLSAgLy8vIHN1cGVyIC0gVGhlIHBhcmVudCBvZiB0aGlzIGNsYXNzLgotICAvLy8KLSAgQ2xhc3MgKiBzdXBlcjsKLSAgIAotICAvLy8gY2xhc3NMb2FkZXIgLSBUaGUgSm5qdm0gY2xhc3MgbG9hZGVyIHRoYXQgbG9hZGVkIHRoZSBjbGFzcy4KLSAgLy8vCi0gIEpuanZtQ2xhc3NMb2FkZXIqIGNsYXNzTG9hZGVyOwotICAKLSAgLy8vIHZpcnR1YWxWVCAtIFRoZSB2aXJ0dWFsIHRhYmxlIG9mIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLgotICAvLy8KLSAgSmF2YVZpcnR1YWxUYWJsZSogdmlydHVhbFZUOwotICAKLQotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyBFbmQgZmllbGQgZGVjbGFyYXRpb24uCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotICBib29sIGlzU2Vjb25kYXJ5Q2xhc3MoKSB7Ci0gICAgcmV0dXJuIHZpcnR1YWxWVC0+b2Zmc2V0ID09IEphdmFWaXJ0dWFsVGFibGU6OmdldENhY2hlSW5kZXgoKTsKLSAgfQotCi0gIC8vIEFzc2Vzc29yIG1ldGhvZHMuCi0gIHVpbnQzMiBnZXRBY2Nlc3MoKSBjb25zdCAgICAgIHsgcmV0dXJuIGFjY2VzczsgfQotICBDbGFzcyoqIGdldEludGVyZmFjZXMoKSBjb25zdCB7IHJldHVybiBpbnRlcmZhY2VzOyB9Ci0gIGNvbnN0IFVURjgqIGdldE5hbWUoKSBjb25zdCAgIHsgcmV0dXJuIG5hbWU7IH0KLSAgQ2xhc3MqIGdldFN1cGVyKCkgY29uc3QgICAgICAgeyByZXR1cm4gc3VwZXI7IH0KLSAgCi0gIC8vLyBpc0FycmF5IC0gSXMgdGhlIGNsYXNzIGFuIGFycmF5IGNsYXNzPwotICAvLy8KLSAgYm9vbCBpc0FycmF5KCkgY29uc3QgewotICAgIHJldHVybiBqMzo6aXNBcnJheShhY2Nlc3MpOwotICB9Ci0gIAotICAvLy8gaXNQcmltaXRpdmUgLSBJcyB0aGUgY2xhc3MgYSBwcmltaXRpdmUgY2xhc3M/Ci0gIC8vLwotICBib29sIGlzUHJpbWl0aXZlKCkgY29uc3QgewotICAgIHJldHVybiBqMzo6aXNQcmltaXRpdmUoYWNjZXNzKTsKLSAgfQotICAKLSAgLy8vIGlzSW50ZXJmYWNlIC0gSXMgdGhlIGNsYXNzIGFuIGludGVyZmFjZT8KLSAgLy8vCi0gIGJvb2wgaXNJbnRlcmZhY2UoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGozOjppc0ludGVyZmFjZShhY2Nlc3MpOwotICB9Ci0gIAotICAvLy8gaXNDbGFzcyAtIElzIHRoZSBjbGFzcyBhIHJlYWwsIGluc3RhbnRpYWJsZSBjbGFzcz8KLSAgLy8vCi0gIGJvb2wgaXNDbGFzcygpIGNvbnN0IHsKLSAgICByZXR1cm4gajM6OmlzQ2xhc3MoYWNjZXNzKTsKLSAgfQotCi0gIC8vLyBhc0NsYXNzIC0gUmV0dXJucyB0aGUgY2xhc3MgYXMgYSB1c2VyLWRlZmluZWQgY2xhc3MKLSAgLy8vIGlmIGl0IGlzIG5vdCBhIHByaW1pdGl2ZSBvciBhbiBhcnJheS4KLSAgLy8vCi0gIFVzZXJDbGFzcyogYXNDbGFzcygpIHsKLSAgICBpZiAoaXNDbGFzcygpKSByZXR1cm4gKFVzZXJDbGFzcyopdGhpczsKLSAgICByZXR1cm4gMDsKLSAgfQotICAKLSAgLy8vIGFzQ2xhc3MgLSBSZXR1cm5zIHRoZSBjbGFzcyBhcyBhIHVzZXItZGVmaW5lZCBjbGFzcwotICAvLy8gaWYgaXQgaXMgbm90IGEgcHJpbWl0aXZlIG9yIGFuIGFycmF5LgotICAvLy8KLSAgY29uc3QgVXNlckNsYXNzKiBhc0NsYXNzKCkgY29uc3QgewotICAgIGlmIChpc0NsYXNzKCkpIHJldHVybiAoY29uc3QgVXNlckNsYXNzKil0aGlzOwotICAgIHJldHVybiAwOwotICB9Ci0gIAotICAvLy8gYXNQcmltaXRpdmVDbGFzcyAtIFJldHVybnMgdGhlIGNsYXNzIGlmIGl0J3MgYSBwcmltaXRpdmUgY2xhc3MuCi0gIC8vLwotICBVc2VyQ2xhc3NQcmltaXRpdmUqIGFzUHJpbWl0aXZlQ2xhc3MoKSB7Ci0gICAgaWYgKGlzUHJpbWl0aXZlKCkpIHJldHVybiAoVXNlckNsYXNzUHJpbWl0aXZlKil0aGlzOwotICAgIHJldHVybiAwOwotICB9Ci0gIAotICBjb25zdCBVc2VyQ2xhc3NQcmltaXRpdmUqIGFzUHJpbWl0aXZlQ2xhc3MoKSBjb25zdCB7Ci0gICAgaWYgKGlzUHJpbWl0aXZlKCkpIHJldHVybiAoY29uc3QgVXNlckNsYXNzUHJpbWl0aXZlKil0aGlzOwotICAgIHJldHVybiAwOwotICB9Ci0gIAotICAvLy8gYXNBcnJheUNsYXNzIC0gUmV0dXJucyB0aGUgY2xhc3MgaWYgaXQncyBhbiBhcnJheSBjbGFzcy4KLSAgLy8vCi0gIFVzZXJDbGFzc0FycmF5KiBhc0FycmF5Q2xhc3MoKSB7Ci0gICAgaWYgKGlzQXJyYXkoKSkgcmV0dXJuIChVc2VyQ2xhc3NBcnJheSopdGhpczsKLSAgICByZXR1cm4gMDsKLSAgfQotICAKLSAgY29uc3QgVXNlckNsYXNzQXJyYXkqIGFzQXJyYXlDbGFzcygpIGNvbnN0IHsKLSAgICBpZiAoaXNBcnJheSgpKSByZXR1cm4gKGNvbnN0IFVzZXJDbGFzc0FycmF5Kil0aGlzOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8vIHRyYWNlciAtIFRoZSB0cmFjZXIgb2YgdGhpcyBHQy1hbGxvY2F0ZWQgY2xhc3MuCi0gIC8vLwotICB2b2lkIHRyYWNlcih1aW50cHRyX3QgY2xvc3VyZSk7Ci0gIAotICAvLy8gaW5oZXJpdE5hbWUgLSBEb2VzIHRoaXMgY2xhc3MgaW4gaXRzIGNsYXNzIGhpZXJhcmNoeSBpbmhlcml0cwotICAvLy8gdGhlIGdpdmVuIG5hbWU/IEVxdWFsaXR5IGlzIG9uIHRoZSBuYW1lLiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHRha2UKLSAgLy8vIGludG8gYWNjb3VudCBhcnJheSBjbGFzc2VzLgotICAvLy8KLSAgYm9vbCBpbmhlcml0TmFtZShjb25zdCB1aW50MTYqIGJ1ZiwgdWludDMyIGxlbik7Ci0KLSAgLy8vIGlzT2ZUeXBlTmFtZSAtIERvZXMgdGhpcyBjbGFzcyBpbmhlcml0cyB0aGUgZ2l2ZW4gbmFtZT8gRXF1YWxpdHkgaXMgb24KLSAgLy8vIHRoZSBuYW1lLiBUaGlzIGZ1bmN0aW9uIHRha2VzIGludG8gYWNjb3VudCBhcnJheSBjbGFzc2VzLgotICAvLy8KLSAgYm9vbCBpc09mVHlwZU5hbWUoY29uc3QgVVRGOCogVG5hbWUpOwotCi0gIC8vLyBpc0Fzc2lnbmFibGVGcm9tIC0gSXMgdGhpcyBjbGFzcyBhc3NpZ25hYmxlIGZyb20gdGhlIGdpdmVuIGNsYXNzPyBUaGUKLSAgLy8vIGNsYXNzZXMgbWF5IGJlIG9mIGFueSB0eXBlLgotICAvLy8KLSAgYm9vbCBpc0Fzc2lnbmFibGVGcm9tKENvbW1vbkNsYXNzKiBjbCk7Ci0KLSAgLy8vIGdldENsYXNzRGVsZWdhdGVlIC0gUmV0dXJuIHRoZSBqYXZhL2xhbmcvQ2xhc3MgcmVwcmVzZW50YXRpb24gb2YgdGhpcwotICAvLy8gY2xhc3MuCi0gIC8vLwotICBKYXZhT2JqZWN0KiBnZXRDbGFzc0RlbGVnYXRlZShKYXZhT2JqZWN0KiBwZCA9IE5VTEwpOwotICAKLSAgLy8vIGdldENsYXNzRGVsZWdhdGVlUHRyIC0gUmV0dXJuIGEgcG9pbnRlciBvbiB0aGUgamF2YS9sYW5nL0NsYXNzCi0gIC8vLyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNsYXNzLiBVc2VkIGZvciBKTkkuCi0gIC8vLwotICBKYXZhT2JqZWN0KiBjb25zdCogZ2V0Q2xhc3NEZWxlZ2F0ZWVQdHIoSmF2YU9iamVjdCogcGQgPSBOVUxMKTsKLSAgCi0gIC8vLyBDb21tb25DbGFzcyAtIENyZWF0ZSBhIGNsYXNzIHdpdGggdGggZ2l2ZW4gbmFtZS4KLSAgLy8vCi0gIENvbW1vbkNsYXNzKEpuanZtQ2xhc3NMb2FkZXIqIGxvYWRlciwgY29uc3QgVVRGOCogbmFtZSk7Ci0gIAotICAvLy8gfkNvbW1vbkNsYXNzIC0gRnJlZSBtZW1vcnkgdXNlZCBieSB0aGlzIGNsYXNzLCBhbmQgcmVtb3ZlIGl0IGZyb20KLSAgLy8vIG1ldGFkYXRhLgotICAvLy8KLSAgfkNvbW1vbkNsYXNzKCk7Ci0KLSAgLy8vIHNldEludGVyZmFjZXMgLSBTZXQgdGhlIGludGVyZmFjZXMgb2YgdGhlIGNsYXNzLgotICAvLy8KLSAgdm9pZCBzZXRJbnRlcmZhY2VzKENsYXNzKiogSSkgewotICAgIGludGVyZmFjZXMgPSBJOwotICB9Ci0gCi0gIC8vLyB0b1ByaW1pdGl2ZSAtIFJldHVybnMgdGhlIHByaW1pdGl2ZSBjbGFzcyB3aGljaCByZXByZXNlbnRzCi0gIC8vLyB0aGlzIGNsYXNzLCBpZSB2b2lkIGZvciBqYXZhL2xhbmcvVm9pZC4KLSAgLy8vCi0gIFVzZXJDbGFzc1ByaW1pdGl2ZSogdG9QcmltaXRpdmUoKSBjb25zdDsKLSAKLSAgLy8vIGdldEludGVybmFsIC0gUmV0dXJuIHRoZSBjbGFzcy4KLSAgLy8vCi0gIENvbW1vbkNsYXNzKiBnZXRJbnRlcm5hbCgpIHsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotIAotICAvLy8gc2V0RGVsZWdhdGVlIC0gU2V0IHRoZSBqYXZhL2xhbmcvQ2xhc3Mgb2JqZWN0IG9mIHRoaXMgY2xhc3MuCi0gIC8vLwotICBKYXZhT2JqZWN0KiBzZXREZWxlZ2F0ZWUoSmF2YU9iamVjdCogdmFsKTsKLQotICAvLy8gZ2V0RGVsZWdhdGVlIC0gR2V0IHRoZSBqYXZhL2xhbmcvQ2xhc3Mgb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIGNsYXNzLgotICAvLy8KLSAgSmF2YU9iamVjdCogZ2V0RGVsZWdhdGVlKCkgY29uc3QgewotICAgIHJldHVybiBkZWxlZ2F0ZWVbMF07Ci0gIH0KLSAgCi0gIC8vLyBnZXREZWxlZ2F0ZWUgLSBHZXQgYSBwb2ludGVyIG9uIHRoZSBqYXZhL2xhbmcvQ2xhc3Mgb2JqZWN0Ci0gIC8vLyByZXByZXNlbnRpbmcgdGhpcyBjbGFzcy4KLSAgLy8vCi0gIEphdmFPYmplY3QqIGNvbnN0KiBnZXREZWxlZ2F0ZWVQdHIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGRlbGVnYXRlZTsKLSAgfQotICAKLSAgLy8vIHJlc29sdmVkSW1wbENsYXNzIC0gUmV0dXJuIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUKLSAgLy8vIGphdmEubGFuZy5DbGFzcyBvYmplY3QuIFRoZSBjbGFzcyBtdXN0IGJlIHJlc29sdmVkLgotICAvLwotICBzdGF0aWMgVXNlckNvbW1vbkNsYXNzKiByZXNvbHZlZEltcGxDbGFzcyhKYXZhT2JqZWN0KiBkZWxlZ2F0ZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG9DbGluaXQpOwotI2lmZGVmIFVTRV9HQ19CT0VITQotICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHN6LCBtdm06OkJ1bXBQdHJBbGxvY2F0b3ImIGFsbG9jYXRvcikgewotICAgIHJldHVybiBHQ19NQUxMT0Moc3opOwotICB9Ci0jZW5kaWYKLQotfTsKLQotLy8vIENsYXNzUHJpbWl0aXZlIC0gVGhpcyBjbGFzcyByZXByZXNlbnRzIGludGVybmFsIGNsYXNzZXMgZm9yIHByaW1pdGl2ZQotLy8vIHR5cGVzLCBlLmcuIGphdmEvbGFuZy9JbnRlZ2VyLlRZUEUuCi0vLy8KLWNsYXNzIENsYXNzUHJpbWl0aXZlIDogcHVibGljIENvbW1vbkNsYXNzIHsKLXB1YmxpYzoKLSAgCi0gIC8vLyBsb2dTaXplIC0gVGhlIGxvZyBzaXplIG9mIHRoaXMgY2xhc3MsIGVnIDIgZm9yIGludC4KLSAgLy8vCi0gIHVpbnQzMiBsb2dTaXplOwotICAKLSAgCi0gIC8vLyBDbGFzc1ByaW1pdGl2ZSAtIENvbnN0cnVjdHMgYSBwcmltaXRpdmUgY2xhc3MuIE9ubHkgY2FsbGVkIGF0IGJvb3QKLSAgLy8vIHRpbWUuCi0gIC8vLwotICBDbGFzc1ByaW1pdGl2ZShKbmp2bUNsYXNzTG9hZGVyKiBsb2FkZXIsIGNvbnN0IFVURjgqIG5hbWUsIHVpbnQzMiBuYik7Ci0KLSAgLy8vIGJ5dGVJZFRvUHJpbWl0aXZlIC0gR2V0IHRoZSBwcmltaXRpdmUgY2xhc3MgZnJvbSBpdHMgYnl0ZSByZXByZXNlbnRhdGlvbiwKLSAgLy8vIGllIGludCBmb3IgSS4KLSAgLy8vCi0gIHN0YXRpYyBVc2VyQ2xhc3NQcmltaXRpdmUqIGJ5dGVJZFRvUHJpbWl0aXZlKGNoYXIgaWQsIENsYXNzcGF0aCogdXBjYWxscyk7Ci0gIAotfTsKLQotCi0vLy8gQ2xhc3MgLSBUaGlzIGNsYXNzIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBKYXZhIHJlZ3VsYXIgY2xhc3NlcyAoaS5lIG5vdAotLy8vIGFycmF5IG9yIHByaW1pdGl2ZSkuIFRoZXNlcyBjbGFzc2VzIGhhdmUgYSBjb25zdGFudCBwb29sLgotLy8vCi1jbGFzcyBDbGFzcyA6IHB1YmxpYyBDb21tb25DbGFzcyB7Ci0KLXB1YmxpYzoKLSAgCi0gIC8vLyB2aXJ0dWFsU2l6ZSAtIFRoZSBzaXplIG9mIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLgotICAvLy8gCi0gIHVpbnQzMiB2aXJ0dWFsU2l6ZTsKLQotICAvLy8gYWxpZ21lbnQgLSBBbGlnbm1lbnQgb2YgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuCi0gIC8vLwotICB1aW50MzIgYWxpZ25tZW50OwotCi0gIC8vLyBJc29sYXRlSW5mbyAtIFBlciBpc29sYXRlIGluZm9ybWF0aW9ucyBmb3Igc3RhdGljIGluc3RhbmNlcyBhbmQKLSAgLy8vIGluaXRpYWxpemF0aW9uIHN0YXRlLgotICAvLy8KLSAgVGFza0NsYXNzTWlycm9yIElzb2xhdGVJbmZvW05SX0lTT0xBVEVTXTsKLSAgIAotICAvLy8gdmlydHVhbEZpZWxkcyAtIExpc3Qgb2YgYWxsIHRoZSB2aXJ0dWFsIGZpZWxkcyBkZWZpbmVkIGluIHRoaXMgY2xhc3MuCi0gIC8vLyBUaGlzIGRvZXMgbm90IGNvbnRhaW4gbm9uLXJlZGVmaW5lZCBzdXBlciBmaWVsZHMuCi0gIEphdmFGaWVsZCogdmlydHVhbEZpZWxkczsKLSAgCi0gIC8vLyBuYlZpcnR1YWxGaWVsZHMgLSBUaGUgbnVtYmVyIG9mIHZpcnR1YWwgZmllbGRzLgotICAvLy8KLSAgdWludDE2IG5iVmlydHVhbEZpZWxkczsKLQotICAvLy8gc3RhdGljRmllbGRzIC0gTGlzdCBvZiBhbGwgdGhlIHN0YXRpYyBmaWVsZHMgZGVmaW5lZCBpbiB0aGlzIGNsYXNzLgotICAvLy8KLSAgSmF2YUZpZWxkKiBzdGF0aWNGaWVsZHM7Ci0KLSAgLy8vIG5iU3RhdGljRmllbGRzIC0gVGhlIG51bWJlciBvZiBzdGF0aWMgZmllbGRzLgotICAvLy8KLSAgdWludDE2IG5iU3RhdGljRmllbGRzOwotICAKLSAgLy8vIHZpcnR1YWxNZXRob2RzIC0gTGlzdCBvZiBhbGwgdGhlIHZpcnR1YWwgbWV0aG9kcyBkZWZpbmVkIGJ5IHRoaXMgY2xhc3MuCi0gIC8vLyBUaGlzIGRvZXMgbm90IGNvbnRhaW4gbm9uLXJlZGVmaW5lZCBzdXBlciBtZXRob2RzLgotICBKYXZhTWV0aG9kKiB2aXJ0dWFsTWV0aG9kczsKLQotICAvLy8gbmJWaXJ0dWFsTWV0aG9kcyAtIFRoZSBudW1iZXIgb2YgdmlydHVhbCBtZXRob2RzLgotICAvLy8KLSAgdWludDE2IG5iVmlydHVhbE1ldGhvZHM7Ci0gIAotICAvLy8gc3RhdGljTWV0aG9kcyAtIExpc3Qgb2YgYWxsIHRoZSBzdGF0aWMgbWV0aG9kcyBkZWZpbmVkIGJ5IHRoaXMgY2xhc3MuCi0gIC8vLwotICBKYXZhTWV0aG9kKiBzdGF0aWNNZXRob2RzOwotCi0gIC8vLyBuYlN0YXRpY01ldGhvZHMgLSBUaGUgbnVtYmVyIG9mIHN0YXRpYyBtZXRob2RzLgotICAvLy8KLSAgdWludDE2IG5iU3RhdGljTWV0aG9kczsKLSAgCi0gIC8vLyBvd25lckNsYXNzIC0gV2hvIGlzIGluaXRpYWxpemluZyB0aGlzIGNsYXNzLgotICAvLy8KLSAgbXZtOjpUaHJlYWQqIG93bmVyQ2xhc3M7Ci0gIAotICAvLy8gYnl0ZXMgLSBUaGUgLmNsYXNzIGZpbGUgb2YgdGhpcyBjbGFzcy4KLSAgLy8vCi0gIENsYXNzQnl0ZXMqIGJ5dGVzOwotCi0gIC8vLyBjdHBJbmZvIC0gVGhlIGNvbnN0YW50IHBvb2wgaW5mbyBvZiB0aGlzIGNsYXNzLgotICAvLy8KLSAgSmF2YUNvbnN0YW50UG9vbCogY3RwSW5mbzsKLQotICAvLy8gYXR0cmlidXRzIC0gSlZNIGF0dHJpYnV0ZXMgb2YgdGhpcyBjbGFzcy4KLSAgLy8vCi0gIEF0dHJpYnV0KiBhdHRyaWJ1dHM7Ci0KLSAgLy8vIG5iQXR0cmlidXRzIC0gVGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzLgotICAvLy8KLSAgdWludDE2IG5iQXR0cmlidXRzOwotICAKLSAgLy8vIGlubmVyQ2xhc3NlcyAtIFRoZSBpbm5lciBjbGFzc2VzIG9mIHRoaXMgY2xhc3MuCi0gIC8vLwotICBDbGFzcyoqIGlubmVyQ2xhc3NlczsKLSAgCi0gIC8vLyBuYklubmVyQ2xhc3NlcyAtIFRoZSBudW1iZXIgb2YgaW5uZXIgY2xhc3Nlcy4KLSAgLy8vCi0gIHVpbnQxNiBuYklubmVyQ2xhc3NlczsKLQotICAvLy8gb3V0ZXJDbGFzcyAtIFRoZSBvdXRlciBjbGFzcywgaWYgdGhpcyBjbGFzcyBpcyBhbiBpbm5lciBjbGFzcy4KLSAgLy8vCi0gIENsYXNzKiBvdXRlckNsYXNzOwotICAKLSAgLy8vIGlubmVyQWNjZXNzIC0gVGhlIGFjY2VzcyBvZiB0aGlzIGNsYXNzLCBpZiB0aGlzIGNsYXNzIGlzIGFuIGlubmVyIGNsYXNzLgotICAvLy8KLSAgdWludDE2IGlubmVyQWNjZXNzOwotCi0gIC8vLyBpbm5lck91dGVyUmVzb2x2ZWQgLSBJcyB0aGUgaW5uZXIvb3V0ZXIgcmVzb2x1dGlvbiBkb25lPwotICAvLy8KLSAgYm9vbCBpbm5lck91dGVyUmVzb2x2ZWQ7Ci0gIAotICAvLy8gaXNBbm9ueW1vdXMgLSBJcyB0aGUgY2xhc3MgYW4gYW5vbnltb3VzIGNsYXNzPwotICAvLy8KLSAgYm9vbCBpc0Fub255bW91czsKLQotICAvLy8gdmlydHVhbFRhYmxlU2l6ZSAtIFRoZSBzaXplIG9mIHRoZSB2aXJ0dWFsIHRhYmxlIG9mIHRoaXMgY2xhc3MuCi0gIC8vLwotICB1aW50MzIgdmlydHVhbFRhYmxlU2l6ZTsKLSAgCi0gIC8vLyBzdGF0aWNTaXplIC0gVGhlIHNpemUgb2YgdGhlIHN0YXRpYyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAvLy8KLSAgdWludDMyIHN0YXRpY1NpemU7Ci0KLSAgLy8vIGdldFZpcnR1YWxTaXplIC0gR2V0IHRoZSB2aXJ0dWFsIHNpemUgb2YgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuCi0gIC8vLwotICB1aW50MzIgZ2V0VmlydHVhbFNpemUoKSBjb25zdCB7IHJldHVybiB2aXJ0dWFsU2l6ZTsgfQotICAKLSAgLy8vIGdldFZpcnR1YWxWVCAtIEdldCB0aGUgdmlydHVhbCBWVCBvZiBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcy4KLSAgLy8vCi0gIEphdmFWaXJ0dWFsVGFibGUqIGdldFZpcnR1YWxWVCgpIGNvbnN0IHsgcmV0dXJuIHZpcnR1YWxWVDsgfQotCi0gIC8vLyBnZXRPd25lckNsYXNzIC0gR2V0IHRoZSB0aHJlYWQgdGhhdCBpcyBjdXJyZW50bHkgaW5pdGlhbGl6aW5nIHRoZSBjbGFzcy4KLSAgLy8vCi0gIG12bTo6VGhyZWFkKiBnZXRPd25lckNsYXNzKCkgY29uc3QgewotICAgIHJldHVybiBvd25lckNsYXNzOwotICB9Ci0KLSAgLy8vIHNldE93bmVyQ2xhc3MgLSBTZXQgdGhlIHRocmVhZCB0aGF0IGlzIGN1cnJlbnRseSBpbml0aWFsaXppbmcgdGhlIGNsYXNzLgotICAvLy8KLSAgdm9pZCBzZXRPd25lckNsYXNzKG12bTo6VGhyZWFkKiB0aCkgewotICAgIG93bmVyQ2xhc3MgPSB0aDsKLSAgfQotIAotICAvLy8gZ2V0T3V0ZXJDbGFzcyAtIEdldCB0aGUgY2xhc3MgdGhhdCBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGlzIGNsYXNzLgotICAvLy8KLSAgQ2xhc3MqIGdldE91dGVyQ2xhc3MoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG91dGVyQ2xhc3M7Ci0gIH0KLQotICAvLy8gZ2V0SW5udGVyQ2xhc3NlcyAtIEdldCB0aGUgY2xhc3NlcyB0aGF0IHRoaXMgY2xhc3MgZGVmaW5lcy4KLSAgLy8vCi0gIENsYXNzKiogZ2V0SW5uZXJDbGFzc2VzKCkgY29uc3QgewotICAgIHJldHVybiBpbm5lckNsYXNzZXM7Ci0gIH0KLQotICAvLy8gbG9va3VwTWV0aG9kRG9udFRocm93IC0gTG9va3VwIGEgbWV0aG9kIGluIHRoZSBtZXRob2QgbWFwIG9mIHRoaXMgY2xhc3MuCi0gIC8vLyBEbyBub3QgdGhyb3cgaWYgdGhlIG1ldGhvZCBpcyBub3QgZm91bmQuCi0gIC8vLwotICBKYXZhTWV0aG9kKiBsb29rdXBNZXRob2REb250VGhyb3coY29uc3QgVVRGOCogbmFtZSwgY29uc3QgVVRGOCogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdGF0aWMsIGJvb2wgcmVjdXJzZSwgQ2xhc3MqKiBjbCk7Ci0gIAotICAvLy8gbG9va3VwSW50ZXJmYWNlTWV0aG9kRG9udFRocm93IC0gTG9va3VwIGEgbWV0aG9kIGluIHRoZSBpbnRlcmZhY2VzIG9mCi0gIC8vLyB0aGlzIGNsYXNzLgotICAvLy8gRG8gbm90IHRocm93IGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotICAvLy8KLSAgSmF2YU1ldGhvZCogbG9va3VwSW50ZXJmYWNlTWV0aG9kRG9udFRocm93KGNvbnN0IFVURjgqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVVEY4KiB0eXBlKTsKLSAgCi0gIC8vLyBsb29rdXBTcGVjaWFsTWV0aG9kRG9udFRocm93IC0gTG9va3VwIGEgbWV0aG9kIGZvbGxvd2luZyB0aGUKLSAgLy8vIGludm9rZXNwZWNpYWwgc3BlY2lmaWNhdGlvbi4KLSAgLy8vIERvIG5vdCB0aHJvdyBpZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZC4KLSAgLy8vCi0gIEphdmFNZXRob2QqIGxvb2t1cFNwZWNpYWxNZXRob2REb250VGhyb3coY29uc3QgVVRGOCogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVVEY4KiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzKiBjdXJyZW50KTsKLSAgCi0gIC8vLyBsb29rdXBNZXRob2QgLSBMb29rdXAgYSBtZXRob2QgYW5kIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBub3QgZm91bmQuCi0gIC8vLwotICBKYXZhTWV0aG9kKiBsb29rdXBNZXRob2QoY29uc3QgVVRGOCogbmFtZSwgY29uc3QgVVRGOCogdHlwZSwgYm9vbCBpc1N0YXRpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVjdXJzZSwgQ2xhc3MqKiBjbCk7Ci0gIAotICAvLy8gbG9va3VwSW50ZXJmYWNlTWV0aG9kRG9udFRocm93IC0gTG9va3VwIGEgbWV0aG9kIGluIHRoZSBpbnRlcmZhY2VzIG9mCi0gIC8vLyB0aGlzIGNsYXNzLgotICAvLy8gVGhyb3dzIGEgTWV0aG9kTm90Rm91bmRFcnJvciBpZiB0aGUgbWV0aG9kIGNhbiBub3QgbmUgZm91bmQuCi0gIC8vLwotICBKYXZhTWV0aG9kKiBsb29rdXBJbnRlcmZhY2VNZXRob2QoY29uc3QgVVRGOCogbmFtZSwgY29uc3QgVVRGOCogdHlwZSk7Ci0KLSAgLy8vIGxvb2t1cEZpZWxkRG9udFRocm93IC0gTG9va3VwIGEgZmllbGQgaW4gdGhlIGZpZWxkIG1hcCBvZiB0aGlzIGNsYXNzLiBEbwotICAvLy8gbm90IHRocm93IGlmIHRoZSBmaWVsZCBpcyBub3QgZm91bmQuCi0gIC8vLwotICBKYXZhRmllbGQqIGxvb2t1cEZpZWxkRG9udFRocm93KGNvbnN0IFVURjgqIG5hbWUsIGNvbnN0IFVURjgqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1N0YXRpYywgYm9vbCByZWN1cnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzKiogZGVmaW5pbmdDbGFzcyk7Ci0gIAotICAvLy8gbG9va3VwRmllbGQgLSBMb29rdXAgYSBmaWVsZCBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIG5vdCBmb3VuZC4KLSAgLy8vCi0gIEphdmFGaWVsZCogbG9va3VwRmllbGQoY29uc3QgVVRGOCogbmFtZSwgY29uc3QgVVRGOCogdHlwZSwgYm9vbCBpc1N0YXRpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlY3Vyc2UsIENsYXNzKiogZGVmaW5pbmdDbGFzcyk7Ci0gICAKLSAgLy8vIEFzc2Vzc29yIG1ldGhvZHMuCi0gIEphdmFGaWVsZCogZ2V0U3RhdGljRmllbGRzKCkgY29uc3QgICAgeyByZXR1cm4gc3RhdGljRmllbGRzOyB9Ci0gIEphdmFGaWVsZCogZ2V0VmlydHVhbEZpZWxkcygpIGNvbnN0ICAgeyByZXR1cm4gdmlydHVhbEZpZWxkczsgfQotICBKYXZhTWV0aG9kKiBnZXRTdGF0aWNNZXRob2RzKCkgY29uc3QgIHsgcmV0dXJuIHN0YXRpY01ldGhvZHM7IH0KLSAgSmF2YU1ldGhvZCogZ2V0VmlydHVhbE1ldGhvZHMoKSBjb25zdCB7IHJldHVybiB2aXJ0dWFsTWV0aG9kczsgfQotCi0gIAotICAvLy8gc2V0SW5uZXJBY2Nlc3MgLSBTZXQgdGhlIGFjY2VzcyBmbGFncyBvZiB0aGlzIGlubmVyIGNsYXNzLgotICAvLy8KLSAgdm9pZCBzZXRJbm5lckFjY2Vzcyh1aW50MTYgYWNjZXNzKSB7Ci0gICAgaW5uZXJBY2Nlc3MgPSBhY2Nlc3M7Ci0gIH0KLSAgIAotICAvLy8gZ2V0U3RhdGljU2l6ZSAtIEdldCB0aGUgc2l6ZSBvZiB0aGUgc3RhdGljIGluc3RhbmNlLgotICAvLy8KLSAgdWludDMyIGdldFN0YXRpY1NpemUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0YXRpY1NpemU7Ci0gIH0KLSAgCi0gIC8vLyBkb05ldyAtIEFsbG9jYXRlcyBhIEphdmEgb2JqZWN0IHdob3NlIGNsYXNzIGlzIHRoaXMgY2xhc3MuCi0gIC8vLwotICBKYXZhT2JqZWN0KiBkb05ldygpOwotICAKLSAgLy8vIHRyYWNlciAtIFRyYWNlciBmdW5jdGlvbiBvZiBpbnN0YW5jZXMgb2YgQ2xhc3MuCi0gIC8vLwotICB2b2lkIHRyYWNlcih1aW50cHRyX3QgY2xvc3VyZSk7Ci0gIAotICB+Q2xhc3MoKTsKLSAgQ2xhc3MoKTsKLSAgCi0gIC8vLyBsb29rdXBBdHRyaWJ1dCAtIExvb2sgdXAgYSBKVk0gYXR0cmlidXQgb2YgdGhpcyBjbGFzcy4KLSAgLy8vCi0gIEF0dHJpYnV0KiBsb29rdXBBdHRyaWJ1dChjb25zdCBVVEY4KiBrZXkpOwotICAKLSAgLy8vIGFsbG9jYXRlU3RhdGljSW5zdGFuY2UgLSBBbGxvY2F0ZSB0aGUgc3RhdGljIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0gIC8vLwotICB2b2lkKiBhbGxvY2F0ZVN0YXRpY0luc3RhbmNlKCk7Ci0gIAotICAvLy8gQ2xhc3MgLSBDcmVhdGUgYSBjbGFzcyBpbiB0aGUgZ2l2ZW4gdmlydHVhbCBtYWNoaW5lIGFuZCB3aXRoIHRoZSBnaXZlbgotICAvLy8gbmFtZS4KLSAgQ2xhc3MoSm5qdm1DbGFzc0xvYWRlciogbG9hZGVyLCBjb25zdCBVVEY4KiBuYW1lLCBDbGFzc0J5dGVzKiBieXRlcyk7Ci0gIAotICAvLy8gcmVhZFBhcmVudHMgLSBSZWFkcyB0aGUgcGFyZW50cywgaS5lLiBzdXBlciBhbmQgaW50ZXJmYWNlcywgb2YgdGhlIGNsYXNzLgotICAvLy8KLSAgdm9pZCByZWFkUGFyZW50cyhSZWFkZXImIHJlYWRlcik7Ci0KLSAgLy8vIGxvYWRFeGNlcHRpb25zIC0gTG9hZHMgYW5kIHJlc29sdmVzIHRoZSBleGNlcHRpb24gY2xhc3NlcyB1c2VkIGluIGNhdGNoIAotICAvLy8gY2xhdXNlcyBvZiBtZXRob2RzIGRlZmluZWQgaW4gdGhpcyBjbGFzcy4KLSAgLy8vCi0gIHZvaWQgbG9hZEV4Y2VwdGlvbnMoKTsKLQotICAvLy8gcmVhZEF0dHJpYnV0cyAtIFJlYWRzIHRoZSBhdHRyaWJ1dHMgb2YgdGhlIGNsYXNzLgotICAvLy8KLSAgQXR0cmlidXQqIHJlYWRBdHRyaWJ1dHMoUmVhZGVyJiByZWFkZXIsIHVpbnQxNiYgc2l6ZSk7Ci0KLSAgLy8vIHJlYWRGaWVsZHMgLSBSZWFkcyB0aGUgZmllbGRzIG9mIHRoZSBjbGFzcy4KLSAgLy8vCi0gIHZvaWQgcmVhZEZpZWxkcyhSZWFkZXImIHJlYWRlcik7Ci0KLSAgLy8vIHJlYWRNZXRob2RzIC0gUmVhZHMgdGhlIG1ldGhvZHMgb2YgdGhlIGNsYXNzLgotICAvLy8KLSAgdm9pZCByZWFkTWV0aG9kcyhSZWFkZXImIHJlYWRlcik7Ci0gIAotICAvLy8gcmVhZENsYXNzIC0gUmVhZHMgdGhlIGNsYXNzLgotICAvLy8KLSAgdm9pZCByZWFkQ2xhc3MoKTsKLSAKLSAgLy8vIGdldENvbnN0YW50UG9vbCAtIEdldCB0aGUgY29uc3RhbnQgcG9vbCBvZiB0aGUgY2xhc3MuCi0gIC8vLwotICBKYXZhQ29uc3RhbnRQb29sKiBnZXRDb25zdGFudFBvb2woKSBjb25zdCB7Ci0gICAgcmV0dXJuIGN0cEluZm87Ci0gIH0KLQotICAvLy8gZ2V0Qnl0ZXMgLSBHZXQgdGhlIGJ5dGVzIG9mIHRoZSBjbGFzcyBmaWxlLgotICAvLy8KLSAgQ2xhc3NCeXRlcyogZ2V0Qnl0ZXMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGJ5dGVzOwotICB9Ci0gIAotICAvLy8gcmVzb2x2ZUlubmVyT3V0ZXJDbGFzc2VzIC0gUmVzb2x2ZSB0aGUgaW5uZXIvb3V0ZXIgaW5mb3JtYXRpb24uCi0gIC8vLwotICB2b2lkIHJlc29sdmVJbm5lck91dGVyQ2xhc3NlcygpOwotCi0gIC8vLyByZXNvbHZlQ2xhc3MgLSBJZiB0aGUgY2xhc3MgaGFzIG5vdCBiZWVuIHJlc29sdmVkIHlldCwgcmVzb2x2ZSBpdC4KLSAgLy8vCi0gIHZvaWQgcmVzb2x2ZUNsYXNzKCk7Ci0gIHZvaWQgcmVzb2x2ZVBhcmVudHMoKTsKLQotICAvLy8gaW5pdGlhbGlzZUNsYXNzIC0gSWYgdGhlIGNsYXNzIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQsCi0gIC8vLyBpbml0aWFsaXplIGl0LgotICAvLy8KLSAgdm9pZCBpbml0aWFsaXNlQ2xhc3MoKTsKLSAgCi0gIC8vLyBhY3F1aXJlIC0gQWNxdWlyZSB0aGlzIGNsYXNzIGxvY2suCi0gIC8vLwotICB2b2lkIGFjcXVpcmUoKTsKLSAgCi0gIC8vLyByZWxlYXNlIC0gUmVsZWFzZSB0aGlzIGNsYXNzIGxvY2suCi0gIC8vLwotICB2b2lkIHJlbGVhc2UoKTsKLQotICAvLy8gd2FpdENsYXNzIC0gV2FpdCBmb3IgdGhlIGNsYXNzIHRvIGJlIGxvYWRlZC9pbml0aWFsaXplZC9yZXNvbHZlZC4KLSAgLy8vCi0gIHZvaWQgd2FpdENsYXNzKCk7Ci0gIAotICAvLy8gYnJvYWRjYXN0Q2xhc3MgLSBVbmJsb2NrIHRocmVhZHMgdGhhdCB3ZXJlIHdhaXRpbmcgb24gdGhlIGNsYXNzIGJlaW5nCi0gIC8vLyBsb2FkZWQvaW5pdGlhbGl6ZWQvcmVzb2x2ZWQuCi0gIC8vLwotICB2b2lkIGJyb2FkY2FzdENsYXNzKCk7Ci0gIAotICAvLy8gZ2V0Q3VycmVudFRhc2tDbGFzc01pcnJvciAtIEdldCB0aGUgY2xhc3MgdGFzayBtaXJyb3Igb2YgdGhlIGV4ZWN1dGluZwotICAvLy8gaXNvbGF0ZS4KLSAgLy8vCi0gIFRhc2tDbGFzc01pcnJvciYgZ2V0Q3VycmVudFRhc2tDbGFzc01pcnJvcigpIHsKLSAgICByZXR1cm4gSXNvbGF0ZUluZm9bMF07Ci0gIH0KLSAgCi0gIC8vLyBpc1JlYWR5Rm9yQ29tcGlsYXRpb24gLSBDYW4gdGhpcyBjbGFzcyBiZSBpbmxpbmVkIHdoZW4gSklUaW5nPwotICAvLy8KLSAgYm9vbCBpc1JlYWR5Rm9yQ29tcGlsYXRpb24oKSB7Ci0gICAgcmV0dXJuIGlzUmVhZHkoKTsKLSAgfQotICAKLSAgLy8vIHNldFJlc29sdmVkIC0gU2V0IHRoZSBzdGF0dXMgb2YgdGhlIGNsYXNzIGFzIHJlc29sdmVkLgotICAvLy8KLSAgdm9pZCBzZXRSZXNvbHZlZCgpIHsKLSAgICBnZXRDdXJyZW50VGFza0NsYXNzTWlycm9yKCkuc3RhdHVzID0gcmVzb2x2ZWQ7Ci0gIH0KLSAgCi0gIC8vLyBzZXRFcnJvbmVvdXMgLSBTZXQgdGhlIGNsYXNzIGFzIGVycm9uZW91cy4KLSAgLy8vCi0gIHZvaWQgc2V0RXJyb25lb3VzKCkgewotICAgIGdldEN1cnJlbnRUYXNrQ2xhc3NNaXJyb3IoKS5zdGF0dXMgPSBlcnJvbmVvdXM7Ci0gIH0KLSAgCi0gIC8vLyBzZXRJc1Jlc29sdmluZyAtIFRoZSBjbGFzcyBmaWxlIGlzIGJlaW5nIHJlc29sdmVkLgotICAvLy8KLSAgdm9pZCBzZXRJc1Jlc29sdmluZygpIHsKLSAgICBnZXRDdXJyZW50VGFza0NsYXNzTWlycm9yKCkuc3RhdHVzID0gcmVzb2x2aW5nOwotICB9Ci0gIAotICAvLy8gZ2V0U3RhdGljSW5zdGFuY2UgLSBHZXQgdGhlIG1lbW9yeSB0aGF0IGhvbGRzIHN0YXRpYyB2YXJpYWJsZXMuCi0gIC8vLwotICB2b2lkKiBnZXRTdGF0aWNJbnN0YW5jZSgpIHsKLSAgICByZXR1cm4gZ2V0Q3VycmVudFRhc2tDbGFzc01pcnJvcigpLnN0YXRpY0luc3RhbmNlOwotICB9Ci0gIAotICAvLy8gc2V0U3RhdGljSW5zdGFuY2UgLSBTZXQgdGhlIG1lbW9yeSB0aGF0IGhvbGRzIHN0YXRpYyB2YXJpYWJsZXMuCi0gIC8vLwotICB2b2lkIHNldFN0YXRpY0luc3RhbmNlKHZvaWQqIHZhbCkgewotICAgIGdldEN1cnJlbnRUYXNrQ2xhc3NNaXJyb3IoKS5zdGF0aWNJbnN0YW5jZSA9IHZhbDsKLSAgfQotICAKLSAgLy8vIGdldEluaXRpYWxpemF0aW9uU3RhdGUgLSBHZXQgdGhlIHN0YXRlIG9mIHRoZSBjbGFzcy4KLSAgLy8vCi0gIHVpbnQ4IGdldEluaXRpYWxpemF0aW9uU3RhdGUoKSB7Ci0gICAgcmV0dXJuIGdldEN1cnJlbnRUYXNrQ2xhc3NNaXJyb3IoKS5zdGF0dXM7Ci0gIH0KLQotICAvLy8gc2V0SW5pdGlhbGl6YXRpb25TdGF0ZSAtIFNldCB0aGUgc3RhdGUgb2YgdGhlIGNsYXNzLgotICAvLy8KLSAgdm9pZCBzZXRJbml0aWFsaXphdGlvblN0YXRlKHVpbnQ4IHN0KSB7Ci0gICAgVGFza0NsYXNzTWlycm9yJiBUQ00gPSBnZXRDdXJyZW50VGFza0NsYXNzTWlycm9yKCk7Ci0gICAgVENNLnN0YXR1cyA9IHN0OwotICAgIGlmIChzdCA9PSByZWFkeSkgVENNLmluaXRpYWxpemVkID0gdHJ1ZTsKLSAgfQotICAKLSAgLy8vIGlzUmVhZHkgLSBIYXMgdGhpcyBjbGFzcyBiZWVuIGluaXRpYWxpemVkPwotICAvLy8KLSAgYm9vbCBpc1JlYWR5KCkgewotICAgIHJldHVybiBnZXRDdXJyZW50VGFza0NsYXNzTWlycm9yKCkuc3RhdHVzID09IHJlYWR5OwotICB9Ci0gIAotICAvLy8gaXNJbml0aWFsaXppbmcgLSBJcyB0aGUgY2xhc3MgY3VycmVudGx5IGJlaW5nIGluaXRpYWxpemVkPwotICAvLy8KLSAgYm9vbCBpc0luaXRpYWxpemluZygpIHsKLSAgICByZXR1cm4gZ2V0Q3VycmVudFRhc2tDbGFzc01pcnJvcigpLnN0YXR1cyA+PSBpbkNsaW5pdDsKLSAgfQotICAKLSAgLy8vIGlzUmVzb2x2ZWQgLSBIYXMgdGhpcyBjbGFzcyBiZWVuIHJlc29sdmVkPwotICAvLy8KLSAgYm9vbCBpc1Jlc29sdmVkKCkgewotICAgIHVpbnQ4IHN0YXQgPSBnZXRDdXJyZW50VGFza0NsYXNzTWlycm9yKCkuc3RhdHVzOwotICAgIHJldHVybiAoc3RhdCA+PSByZXNvbHZlZCAmJiBzdGF0ICE9IGVycm9uZW91cyk7Ci0gIH0KLSAgCi0gIC8vLyBpc0Vycm9uZW91cyAtIElzIHRoZSBjbGFzcyBpbiBhbiBlcnJvbmVvdXMgc3RhdGUuCi0gIC8vLwotICBib29sIGlzRXJyb25lb3VzKCkgewotICAgIHJldHVybiBnZXRDdXJyZW50VGFza0NsYXNzTWlycm9yKCkuc3RhdHVzID09IGVycm9uZW91czsKLSAgfQotCi0gIC8vLyBpc1Jlc29sdmluZyAtIElzIHRoZSBjbGFzcyBjdXJyZW50bHkgYmVpbmcgcmVzb2x2ZWQ/Ci0gIC8vLwotICBib29sIGlzUmVzb2x2aW5nKCkgewotICAgIHJldHVybiBnZXRDdXJyZW50VGFza0NsYXNzTWlycm9yKCkuc3RhdHVzID09IHJlc29sdmluZzsKLSAgfQotCi0gIC8vLyBpc05hdGl2ZU92ZXJsb2FkZWQgLSBJcyB0aGUgbWV0aG9kIG92ZXJsb2FkZWQgd2l0aCBhIG5hdGl2ZSBmdW5jdGlvbj8KLSAgLy8vCi0gIGJvb2wgaXNOYXRpdmVPdmVybG9hZGVkKEphdmFNZXRob2QqIG1ldGgpOwotCi0gIC8vLyBuZWVkc0luaXRpYWxpc2F0aW9uQ2hlY2sgLSBEb2VzIHRoZSBtZXRob2QgbmVlZCBhbiBpbml0aWFsaXNhdGlvbiBjaGVjaz8KLSAgLy8vCi0gIGJvb2wgbmVlZHNJbml0aWFsaXNhdGlvbkNoZWNrKCk7Ci0KLSAgLy8vIGZpbGxJTVQgLSBGaWxsIHRoZSB2ZWN0b3Igd2l0aCB2ZWN0b3JzIG9mIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBJTVQKLSAgLy8vIGluZGV4LgotICAvLy8KLSAgdm9pZCBmaWxsSU1UKHN0ZDo6c2V0PEphdmFNZXRob2QqPiogbWV0aHMpOwotCi0gIC8vLyBtYWtlVlQgLSBDcmVhdGUgdGhlIHZpcnR1YWwgdGFibGUgb2YgdGhpcyBjbGFzcy4KLSAgLy8vCi0gIHZvaWQgbWFrZVZUKCk7Ci0KLX07Ci0KLS8vLyBDbGFzc0FycmF5IC0gVGhpcyBjbGFzcyByZXByZXNlbnRzIEphdmEgYXJyYXkgY2xhc3Nlcy4KLS8vLwotY2xhc3MgQ2xhc3NBcnJheSA6IHB1YmxpYyBDb21tb25DbGFzcyB7Ci0KLXB1YmxpYzoKLSAgCi0gIC8vLyBfYmFzZUNsYXNzIC0gVGhlIGJhc2UgY2xhc3Mgb2YgdGhlIGFycmF5LgotICAvLy8KLSAgQ29tbW9uQ2xhc3MqICBfYmFzZUNsYXNzOwotCi0gIC8vLyBiYXNlQ2xhc3MgLSBHZXQgdGhlIGJhc2UgY2xhc3Mgb2YgdGhpcyBhcnJheSBjbGFzcy4KLSAgLy8vCi0gIENvbW1vbkNsYXNzKiBiYXNlQ2xhc3MoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9iYXNlQ2xhc3M7Ci0gIH0KLQotICAvLy8gZG9OZXcgLSBBbGxvY2F0ZSBhIG5ldyBhcnJheSBpbiB0aGUgZ2l2ZW4gdm0uCi0gIC8vLwotICBKYXZhT2JqZWN0KiBkb05ldyhzaW50MzIgbik7Ci0KLSAgLy8vIENsYXNzQXJyYXkgLSBDb25zdHJ1Y3QgYSBKYXZhIGFycmF5IGNsYXNzIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gIC8vLwotICBDbGFzc0FycmF5KEpuanZtQ2xhc3NMb2FkZXIqIGxvYWRlciwgY29uc3QgVVRGOCogbmFtZSwKLSAgICAgICAgICAgICBVc2VyQ29tbW9uQ2xhc3MqIGJhc2VDbGFzcyk7Ci0gIAotICAvLy8gU3VwZXJBcnJheSAtIFRoZSBzdXBlciBvZiBjbGFzcyBhcnJheXMuIE5hbWVseSBqYXZhL2xhbmcvT2JqZWN0LgotICAvLy8KLSAgc3RhdGljIENsYXNzKiBTdXBlckFycmF5OwotCi0gIC8vLyBJbnRlcmZhY2VzQXJyYXkgLSBUaGUgbGlzdCBvZiBpbnRlcmZhY2VzIGZvciBhcnJheSBjbGFzc2VzLgotICAvLy8KLSAgc3RhdGljIENsYXNzKiogSW50ZXJmYWNlc0FycmF5OwotCi0gIC8vLyBpbml0aWFsaXNlVlQgLSBJbml0aWFsaXNlIHRoZSBwcmltaXRpdmUgYW5kIHJlZmVyZW5jZSBhcnJheSBWVC4KLSAgLy8vIHN1cGVyIGlzIHRoZSBqYXZhL2xhbmcvT2JqZWN0IGNsYXNzLgotICAvLy8KLSAgc3RhdGljIHZvaWQgaW5pdGlhbGlzZVZUKENsYXNzKiBqYXZhTGFuZ09iamVjdCk7Ci0gIAotfTsKLQotY2xhc3MgQ29kZUxpbmVJbmZvIDogcHVibGljIG12bTo6UGVybWFuZW50T2JqZWN0IHsKLXB1YmxpYzoKLSAgdWludHB0cl90IGFkZHJlc3M7Ci0gIHVpbnQxNiBieXRlY29kZUluZGV4OwotICAvLyBUT0RPOiBVc2UgdGhlc2UgZmllbGRzIHdoZW4gaW5saW5pbmcuCi0gIEphdmFNZXRob2QqIGV4ZWN1dGluZ01ldGhvZDsKLSAgLy8gVGhlIGNvZGUgd2hlcmUgdGhlIGlubGluZWQgbWV0aG9kIHN0YXJ0cy4KLSAgQ29kZUxpbmVJbmZvKiBpbmxpbmVMb2NhdGlvbjsKLX07Ci0KLS8vLyBKYXZhTWV0aG9kIC0gVGhpcyBjbGFzcyByZXByZXNlbnRzIEphdmEgbWV0aG9kcy4KLS8vLwotY2xhc3MgSmF2YU1ldGhvZCA6IHB1YmxpYyBtdm06OlBlcm1hbmVudE9iamVjdCB7Ci1wcml2YXRlOgotCi0gIC8vLyBfc2lnbmF0dXJlIC0gVGhlIHNpZ25hdHVyZSBvZiB0aGlzIG1ldGhvZC4gTnVsbCBpZiBub3QgcmVzb2x2ZWQuCi0gIC8vLwotICBTaWduZGVmKiBfc2lnbmF0dXJlOwotCi1wdWJsaWM6Ci0gIAotICBlbnVtIFR5cGUgewotICAgIFN0YXRpYywKLSAgICBTcGVjaWFsLAotICAgIEludGVyZmFjZSwKLSAgICBWaXJ0dWFsCi0gIH07Ci0KLSAgLy8vIGNvbnN0cnVjdE1ldGhvZCAtIENyZWF0ZSBhIG5ldyBtZXRob2QuCi0gIC8vLwotICB2b2lkIGluaXRpYWxpc2UoQ2xhc3MqIGNsLCBjb25zdCBVVEY4KiBuYW1lLCBjb25zdCBVVEY4KiB0eXBlLCB1aW50MTYgYWNjZXNzKTsKLSAgIAotICAvLy8gY29tcGlsZWRQdHIgLSBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjb21waWxlZCBjb2RlIG9mIHRoaXMgSmF2YSBtZXRob2QsCi0gIC8vLyBjb21waWxpbmcgaXQgaWYgbmVjZXNzYXJ5LgotICAvLy8KLSAgdm9pZCogY29tcGlsZWRQdHIoKTsKLQotICAvLy8gc2V0TmF0aXZlIC0gU2V0IHRoZSBtZXRob2QgYXMgbmF0aXZlLgotICAvLy8KLSAgdm9pZCBzZXROYXRpdmUoKTsKLSAgCi0gIC8vLyBKYXZhTWV0aG9kIC0gRGVsZXRlIHRoZSBtZXRob2QgYXMgd2VsbCBhcyB0aGUgY2FjaGUgZW52ZWxvcHBlcyBhbmQKLSAgLy8vIGF0dHJpYnV0ZXMgb2YgdGhlIG1ldGhvZC4KLSAgLy8vCi0gIH5KYXZhTWV0aG9kKCk7Ci0KLSAgLy8vIGFjY2VzcyAtIEphdmEgYWNjZXNzIHR5cGUgb2YgdGhpcyBtZXRob2QgKGUuZy4gcHJpdmF0ZSwgcHVibGljLi4uKS4KLSAgLy8vCi0gIHVpbnQxNiBhY2Nlc3M7Ci0KLSAgLy8vIGF0dHJpYnV0cyAtIExpc3Qgb2YgSmF2YSBhdHRyaWJ1dHMgb2YgdGhpcyBtZXRob2QuCi0gIC8vLwotICBBdHRyaWJ1dCogYXR0cmlidXRzOwotICAKLSAgLy8vIG5iQXR0cmlidXRzIC0gVGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzLgotICAvLy8KLSAgdWludDE2IG5iQXR0cmlidXRzOwotCi0gIC8vLyBjbGFzc0RlZiAtIFRoZSBKYXZhIGNsYXNzIHdoZXJlIHRoZSBtZXRob2QgaXMgZGVmaW5lZC4KLSAgLy8vCi0gIENsYXNzKiBjbGFzc0RlZjsKLQotICAvLy8gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QuCi0gIC8vLwotICBjb25zdCBVVEY4KiBuYW1lOwotCi0gIC8vLyB0eXBlIC0gVGhlIFVURjggc2lnbmF0dXJlIG9mIHRoZSBtZXRob2QuCi0gIC8vLwotICBjb25zdCBVVEY4KiB0eXBlOwotCi0gIC8vLyBjYW5CZUlubGluZWQgLSBDYW4gdGhlIG1ldGhvZCBiZSBpbmxpbmVkPwotICAvLy8KLSAgYm9vbCBjYW5CZUlubGluZWQ7Ci0KLSAgLy8vIGNvZGUgLSBQb2ludGVyIHRvIHRoZSBjb21waWxlZCBjb2RlIG9mIHRoaXMgbWV0aG9kLgotICAvLy8KLSAgdm9pZCogY29kZTsKLSAKLSAgLy8vIGNvZGVJbmZvIC0gQXJyYXkgb2YgQ29kZUxpbmVJbmZvIG9iamVjdHMuCi0gIC8vLwotICBDb2RlTGluZUluZm8qIGNvZGVJbmZvOwotCi0gIC8vLyBjb2RlSW5mb0xlbmd0aCAtIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjb2RlSW5mbyBmaWVsZC4KLSAgLy8vCi0gIHVpbnQxNiBjb2RlSW5mb0xlbmd0aDsKLQotICAvLy8gb2Zmc2V0IC0gVGhlIGluZGV4IG9mIHRoZSBtZXRob2QgaW4gdGhlIHZpcnR1YWwgdGFibGUuCi0gIC8vLwotICB1aW50MzIgb2Zmc2V0OwotCi0gIC8vLyBsb29rdXBBdHRyaWJ1dCAtIExvb2sgdXAgYW4gYXR0cmlidXQgaW4gdGhlIG1ldGhvZCdzIGF0dHJpYnV0cy4gUmV0dXJucwotICAvLy8gbnVsbCBpZiB0aGUgYXR0cmlidXQgaXMgbm90IGZvdW5kLgotICAvLy8KLSAgQXR0cmlidXQqIGxvb2t1cEF0dHJpYnV0KGNvbnN0IFVURjgqIGtleSk7Ci0KLSAgLy8vIGxvb2t1cExpbmVOdW1iZXIgLSBGaW5kIHRoZSBsaW5lIG51bWJlciBiYXNlZCBvbiB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24KLSAgLy8vIHBvaW50ZXIuCi0gIC8vLwotICB1aW50MTYgbG9va3VwTGluZU51bWJlcih1aW50cHRyX3QgaXApOwotICAKLSAgLy8vIGxvb2t1cEN0cEluZGV4IC0gTG9va3VwIHRoZSBjb25zdGFudCBwb29sIGluZGV4IHBvaW50ZWQgYnkgdGhlIG9wY29kZQotICAvLy8gcmVsYXRlZCB0byB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gcG9pbnRlci4KLSAgLy8vCi0gIHVpbnQxNiBsb29rdXBDdHBJbmRleCh1aW50cHRyX3QgaXApOwotICAKLSAgLy8vIGxvb2t1cENvZGVMaW5lSW5mbyAtIExvb2t1cCB0aGUgY29kZSBsaW5lIGluZm8gcmVsYXRlZCB0byB0aGUgZ2l2ZW4KLSAgLy8vIGluc3RydWN0aW9uIHBvaW50ZXIuCi0gIC8vLwotICBDb2RlTGluZUluZm8qIGxvb2t1cENvZGVMaW5lSW5mbyh1aW50cHRyX3QgaXApOwotCi0gIC8vLyBnZXRTaWduYXR1cmUgLSBHZXQgdGhlIHNpZ25hdHVyZSBvZiB0aGVzIG1ldGhvZCwgcmVzb2x2aW5nIGl0IGlmCi0gIC8vLyBuZWNlc3NhcnkuCi0gIC8vLwotICBTaWduZGVmKiBnZXRTaWduYXR1cmUoKSB7Ci0gICAgaWYoIV9zaWduYXR1cmUpCi0gICAgICBfc2lnbmF0dXJlID0gY2xhc3NEZWYtPmNsYXNzTG9hZGVyLT5jb25zdHJ1Y3RTaWduKHR5cGUpOwotICAgIHJldHVybiBfc2lnbmF0dXJlOwotICB9Ci0gIAotICAvLy8gdG9TdHJpbmcgLSBSZXR1cm4gYW4gYXJyYXkgb2YgY2hhcnMsIHN1aXRhYmxlIGZvciBjcmVhdGluZyBhIHN0cmluZy4KLSAgLy8vCi0gIEFycmF5VUludDE2KiB0b1N0cmluZygpIGNvbnN0OwotICAKLSAgLy8vIGpuaUNvbnNGcm9tTWV0aCAtIENvbnN0cnVjdCB0aGUgSk5JIG5hbWUgb2YgdGhpcyBtZXRob2QgYXMgaWYKLSAgLy8vIHRoZXJlIGlzIG5vIG90aGVyIGZ1bmN0aW9uIGluIHRoZSBjbGFzcyB3aXRoIHRoZSBzYW1lIG5hbWUuCi0gIC8vLwotICB2b2lkIGpuaUNvbnNGcm9tTWV0aChjaGFyKiBidWYpIGNvbnN0IHsKLSAgICBqbmlDb25zRnJvbU1ldGgoYnVmLCBjbGFzc0RlZi0+bmFtZSwgbmFtZSwgdHlwZSwgaXNTeW50aGV0aWMoYWNjZXNzKSk7Ci0gIH0KLQotICAvLy8gam5pQ29uc0Zyb21NZXRoT3ZlcmxvYWRlZCAtIENvbnN0cnVjdCB0aGUgSk5JIG5hbWUgb2YgdGhpcyBtZXRob2QKLSAgLy8vIGFzIGlmIGl0cyBuYW1lIGlzIG92ZXJsb2FkZWQgaW4gdGhlIGNsYXNzLgotICAvLy8KLSAgdm9pZCBqbmlDb25zRnJvbU1ldGhPdmVybG9hZGVkKGNoYXIqIGJ1ZikgY29uc3QgewotICAgIGpuaUNvbnNGcm9tTWV0aE92ZXJsb2FkZWQoYnVmLCBjbGFzc0RlZi0+bmFtZSwgbmFtZSwgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU3ludGhldGljKGFjY2VzcykpOwotICB9Ci0gIAotICAvLy8gam5pQ29uc0Zyb21NZXRoIC0gQ29uc3RydWN0IHRoZSBub24tb3ZlcmxvYWRlZCBKTkkgbmFtZSB3aXRoCi0gIC8vLyB0aGUgZ2l2ZW4gbmFtZSBhbmQgdHlwZS4KLSAgLy8vCi0gIHN0YXRpYyB2b2lkIGpuaUNvbnNGcm9tTWV0aChjaGFyKiBidWYsIGNvbnN0IFVURjgqIGNsTmFtZSwgY29uc3QgVVRGOCogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVURjgqIHNpZ24sIGJvb2wgc3ludGhldGljKTsKLQotICAvLy8gam5pQ29uc0Zyb21NZXRoT3ZlcmxvYWRlZCAtIENvbnN0cnVjdCB0aGUgb3ZlcmxvYWRlZCBKTkkgbmFtZSB3aXRoCi0gIC8vLyB0aGUgZ2l2ZW4gbmFtZSBhbmQgdHlwZS4KLSAgLy8vCi0gIHN0YXRpYyB2b2lkIGpuaUNvbnNGcm9tTWV0aE92ZXJsb2FkZWQoY2hhciogYnVmLCBjb25zdCBVVEY4KiBjbE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVVRGOCogbmFtZSwgY29uc3QgVVRGOCogc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN5bnRoZXRpYyk7Ci0gIAotICAvLy8gZ2V0UGFyYW1ldGVyVHlwZXMgLSBHZXQgdGhlIGphdmEubGFuZy5DbGFzcyBvZiB0aGUgcGFyYW1ldGVycyBvZgotICAvLy8gdGhlIG1ldGhvZCwgd2l0aCB0aGUgZ2l2ZW4gY2xhc3MgbG9hZGVyLgotICAvLy8KLSAgQXJyYXlPYmplY3QqIGdldFBhcmFtZXRlclR5cGVzKEpuanZtQ2xhc3NMb2FkZXIqIGxvYWRlcik7Ci0KLSAgLy8vIGdldEV4Y2VwdGlvblR5cGVzIC0gR2V0IHRoZSBqYXZhLmxhbmcuQ2xhc3Mgb2YgdGhlIGV4Y2VwdGlvbnMgb2YgdGhlCi0gIC8vLyBtZXRob2QsIHdpdGggdGhlIGdpdmVuIGNsYXNzIGxvYWRlci4KLSAgLy8vCi0gIEFycmF5T2JqZWN0KiBnZXRFeGNlcHRpb25UeXBlcyhKbmp2bUNsYXNzTG9hZGVyKiBsb2FkZXIpOwotCi0gIC8vLyBnZXRSZXR1cm5UeXBlIC0gR2V0IHRoZSBqYXZhLmxhbmcuQ2xhc3Mgb2YgdGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kLAotICAvLy8gd2l0aCB0aGUgZ2l2ZW4gY2xhc3MgbG9hZGVyLgotICAvLy8KLSAgSmF2YU9iamVjdCogZ2V0UmV0dXJuVHlwZShKbmp2bUNsYXNzTG9hZGVyKiBsb2FkZXIpOwotICAKLQotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyBVcGNhbGxzIGZyb20gSm5KVk0gY29kZSB0byBKYXZhIGNvZGUuIAotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0gIAotICAvLy8gVGhpcyBjbGFzcyBvZiBtZXRob2RzIHRha2VzIGEgdmFyaWFibGUgYXJndW1lbnQgbGlzdC4KLSAgdWludDMyIGludm9rZUludFNwZWNpYWxBUChVc2VyQ2xhc3MqLCBKYXZhT2JqZWN0KiBvYmosIHZhX2xpc3QgYXApCi0gICAgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSk7Ci0gIGZsb2F0IGludm9rZUZsb2F0U3BlY2lhbEFQKFVzZXJDbGFzcyosIEphdmFPYmplY3QqIG9iaiwgdmFfbGlzdCBhcCkKLSAgICBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsKLSAgZG91YmxlIGludm9rZURvdWJsZVNwZWNpYWxBUChVc2VyQ2xhc3MqLCBKYXZhT2JqZWN0KiBvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcCkgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSk7Ci0gIHNpbnQ2NCBpbnZva2VMb25nU3BlY2lhbEFQKFVzZXJDbGFzcyosIEphdmFPYmplY3QqIG9iaiwgdmFfbGlzdCBhcCkKLSAgICBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsKLSAgSmF2YU9iamVjdCogaW52b2tlSmF2YU9iamVjdFNwZWNpYWxBUChVc2VyQ2xhc3MqLCBKYXZhT2JqZWN0KiBvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcCkgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSk7Ci0gIAotICB1aW50MzIgaW52b2tlSW50VmlydHVhbEFQKFVzZXJDbGFzcyosIEphdmFPYmplY3QqIG9iaiwgdmFfbGlzdCBhcCkKLSAgICBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsKLSAgZmxvYXQgaW52b2tlRmxvYXRWaXJ0dWFsQVAoVXNlckNsYXNzKiwgSmF2YU9iamVjdCogb2JqLCB2YV9saXN0IGFwKQotICAgIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpOwotICBkb3VibGUgaW52b2tlRG91YmxlVmlydHVhbEFQKFVzZXJDbGFzcyosIEphdmFPYmplY3QqIG9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFwKSBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsKLSAgc2ludDY0IGludm9rZUxvbmdWaXJ0dWFsQVAoVXNlckNsYXNzKiwgSmF2YU9iamVjdCogb2JqLCB2YV9saXN0IGFwKQotICAgIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpOwotICBKYXZhT2JqZWN0KiBpbnZva2VKYXZhT2JqZWN0VmlydHVhbEFQKFVzZXJDbGFzcyosIEphdmFPYmplY3QqIG9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFwKSBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsKLSAgCi0gIHVpbnQzMiBpbnZva2VJbnRTdGF0aWNBUChVc2VyQ2xhc3MqLCB2YV9saXN0IGFwKQotICAgIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpOwotICBmbG9hdCBpbnZva2VGbG9hdFN0YXRpY0FQKFVzZXJDbGFzcyosIHZhX2xpc3QgYXApCi0gICAgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSk7Ci0gIGRvdWJsZSBpbnZva2VEb3VibGVTdGF0aWNBUChVc2VyQ2xhc3MqLCB2YV9saXN0IGFwKQotICAgIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpOwotICBzaW50NjQgaW52b2tlTG9uZ1N0YXRpY0FQKFVzZXJDbGFzcyosIHZhX2xpc3QgYXApCi0gICAgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSk7Ci0gIEphdmFPYmplY3QqIGludm9rZUphdmFPYmplY3RTdGF0aWNBUChVc2VyQ2xhc3MqLCB2YV9saXN0IGFwKQotICAgIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpOwotCi0gIC8vLyBUaGlzIGNsYXNzIG9mIG1ldGhvZHMgdGFrZXMgYSBidWZmZXIgd2hpY2ggY29udGFpbiB0aGUgYXJndW1lbnRzIG9mIHRoZQotICAvLy8gY2FsbC4KLSAgdWludDMyIGludm9rZUludFNwZWNpYWxCdWYoVXNlckNsYXNzKiwgSmF2YU9iamVjdCogb2JqLCB2b2lkKiBidWYpCi0gICAgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSk7Ci0gIGZsb2F0IGludm9rZUZsb2F0U3BlY2lhbEJ1ZihVc2VyQ2xhc3MqLCBKYXZhT2JqZWN0KiBvYmosIHZvaWQqIGJ1ZikKLSAgICBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsKLSAgZG91YmxlIGludm9rZURvdWJsZVNwZWNpYWxCdWYoVXNlckNsYXNzKiwgSmF2YU9iamVjdCogb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWYpIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpOwotICBzaW50NjQgaW52b2tlTG9uZ1NwZWNpYWxCdWYoVXNlckNsYXNzKiwgSmF2YU9iamVjdCogb2JqLCB2b2lkKiBidWYpCi0gICAgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSk7Ci0gIEphdmFPYmplY3QqIGludm9rZUphdmFPYmplY3RTcGVjaWFsQnVmKFVzZXJDbGFzcyosIEphdmFPYmplY3QqIG9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmKSBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsKLSAgCi0gIHVpbnQzMiBpbnZva2VJbnRWaXJ0dWFsQnVmKFVzZXJDbGFzcyosIEphdmFPYmplY3QqIG9iaiwgdm9pZCogYnVmKQotICAgIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpOwotICBmbG9hdCBpbnZva2VGbG9hdFZpcnR1YWxCdWYoVXNlckNsYXNzKiwgSmF2YU9iamVjdCogb2JqLCB2b2lkKiBidWYpCi0gICAgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSk7Ci0gIGRvdWJsZSBpbnZva2VEb3VibGVWaXJ0dWFsQnVmKFVzZXJDbGFzcyosIEphdmFPYmplY3QqIG9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmKSBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsKLSAgc2ludDY0IGludm9rZUxvbmdWaXJ0dWFsQnVmKFVzZXJDbGFzcyosIEphdmFPYmplY3QqIG9iaiwgdm9pZCogYnVmKQotICAgIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpOwotICBKYXZhT2JqZWN0KiBpbnZva2VKYXZhT2JqZWN0VmlydHVhbEJ1ZihVc2VyQ2xhc3MqLCBKYXZhT2JqZWN0KiBvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZikgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSk7Ci0gIAotICB1aW50MzIgaW52b2tlSW50U3RhdGljQnVmKFVzZXJDbGFzcyosIHZvaWQqIGJ1ZikKLSAgICBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsKLSAgZmxvYXQgaW52b2tlRmxvYXRTdGF0aWNCdWYoVXNlckNsYXNzKiwgdm9pZCogYnVmKQotICAgIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpOwotICBkb3VibGUgaW52b2tlRG91YmxlU3RhdGljQnVmKFVzZXJDbGFzcyosIHZvaWQqIGJ1ZikKLSAgICBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsKLSAgc2ludDY0IGludm9rZUxvbmdTdGF0aWNCdWYoVXNlckNsYXNzKiwgdm9pZCogYnVmKQotICAgIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpOwotICBKYXZhT2JqZWN0KiBpbnZva2VKYXZhT2JqZWN0U3RhdGljQnVmKFVzZXJDbGFzcyosIHZvaWQqIGJ1ZikKLSAgICBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsKLQotICAvLy8gVGhpcyBjbGFzcyBvZiBtZXRob2RzIGlzIHZhcmlhZGljLgotICB1aW50MzIgaW52b2tlSW50U3BlY2lhbChVc2VyQ2xhc3MqLCBKYXZhT2JqZWN0KiBvYmosIC4uLikKLSAgICBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsKLSAgZmxvYXQgaW52b2tlRmxvYXRTcGVjaWFsKFVzZXJDbGFzcyosIEphdmFPYmplY3QqIG9iaiwgLi4uKQotICAgIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpOwotICBkb3VibGUgaW52b2tlRG91YmxlU3BlY2lhbChVc2VyQ2xhc3MqLCBKYXZhT2JqZWN0KiBvYmosIC4uLikKLSAgICBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsKLSAgc2ludDY0IGludm9rZUxvbmdTcGVjaWFsKFVzZXJDbGFzcyosIEphdmFPYmplY3QqIG9iaiwgLi4uKQotICAgIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpOwotICBKYXZhT2JqZWN0KiBpbnZva2VKYXZhT2JqZWN0U3BlY2lhbChVc2VyQ2xhc3MqLCBKYXZhT2JqZWN0KiBvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLikgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSk7Ci0gIAotICB1aW50MzIgaW52b2tlSW50VmlydHVhbChVc2VyQ2xhc3MqLCBKYXZhT2JqZWN0KiBvYmosIC4uLikKLSAgICBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsKLSAgZmxvYXQgaW52b2tlRmxvYXRWaXJ0dWFsKFVzZXJDbGFzcyosIEphdmFPYmplY3QqIG9iaiwgLi4uKQotICAgIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpOwotICBkb3VibGUgaW52b2tlRG91YmxlVmlydHVhbChVc2VyQ2xhc3MqLCBKYXZhT2JqZWN0KiBvYmosIC4uLikKLSAgICBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsKLSAgc2ludDY0IGludm9rZUxvbmdWaXJ0dWFsKFVzZXJDbGFzcyosIEphdmFPYmplY3QqIG9iaiwgLi4uKQotICAgIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpOwotICBKYXZhT2JqZWN0KiBpbnZva2VKYXZhT2JqZWN0VmlydHVhbChVc2VyQ2xhc3MqLCBKYXZhT2JqZWN0KiBvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLikgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSk7Ci0gIAotICB1aW50MzIgaW52b2tlSW50U3RhdGljKFVzZXJDbGFzcyosIC4uLikKLSAgICBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsKLSAgZmxvYXQgaW52b2tlRmxvYXRTdGF0aWMoVXNlckNsYXNzKiwgLi4uKQotICAgIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpOwotICBkb3VibGUgaW52b2tlRG91YmxlU3RhdGljKFVzZXJDbGFzcyosIC4uLikKLSAgICBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsKLSAgc2ludDY0IGludm9rZUxvbmdTdGF0aWMoVXNlckNsYXNzKiwgLi4uKQotICAgIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpOwotICBKYXZhT2JqZWN0KiBpbnZva2VKYXZhT2JqZWN0U3RhdGljKFVzZXJDbGFzcyosIC4uLikKLSAgICBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKTsKLSAgCi0gICNkZWZpbmUgSk5JX05BTUVfUFJFICJKYXZhXyIKLSAgI2RlZmluZSBKTklfTkFNRV9QUkVfTEVOIDUKLSAgCi19OwotCi0vLy8gSmF2YUZpZWxkIC0gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgSmF2YSBmaWVsZC4KLS8vLwotY2xhc3MgSmF2YUZpZWxkICA6IHB1YmxpYyBtdm06OlBlcm1hbmVudE9iamVjdCB7Ci1wcml2YXRlOgotICAvLy8gX3NpZ25hdHVyZSAtIFRoZSBzaWduYXR1cmUgb2YgdGhlIGZpZWxkLiBOdWxsIGlmIG5vdCByZXNvbHZlZC4KLSAgLy8vCi0gIFR5cGVkZWYqIF9zaWduYXR1cmU7Ci0gIAotICAvLy8gSW5pdEZpZWxkIC0gU2V0IGFuIGluaXRpYWwgdmFsdWUgdG8gdGhlIGZpZWxkLgotICAvLy8KLSAgdm9pZCBJbml0U3RhdGljRmllbGQodWludDY0IHZhbCk7Ci0gIHZvaWQgSW5pdFN0YXRpY0ZpZWxkKEphdmFPYmplY3QqIHZhbCk7Ci0gIHZvaWQgSW5pdFN0YXRpY0ZpZWxkKGRvdWJsZSB2YWwpOwotICB2b2lkIEluaXRTdGF0aWNGaWVsZChmbG9hdCB2YWwpOwotICB2b2lkIEluaXROdWxsU3RhdGljRmllbGQoKTsKLQotcHVibGljOgotICAKLSAgLy8vIGNvbnN0cnVjdEZpZWxkIC0gQ3JlYXRlIGEgbmV3IGZpZWxkLgotICAvLy8KLSAgdm9pZCBpbml0aWFsaXNlKENsYXNzKiBjbCwgY29uc3QgVVRGOCogbmFtZSwgY29uc3QgVVRGOCogdHlwZSwgdWludDE2IGFjY2Vzcyk7Ci0KLSAgLy8vIH5KYXZhRmllbGQgLSBEZXN0cm95IHRoZSBmaWVsZCBhcyB3ZWxsIGFzIGl0cyBhdHRyaWJ1dGVzLgotICAvLy8KLSAgfkphdmFGaWVsZCgpOwotCi0gIC8vLyBhY2Nlc3MgLSBUaGUgSmF2YSBhY2Nlc3MgdHlwZSBvZiB0aGlzIGZpZWxkIChlLmcuIHB1YmxpYywgcHJpdmF0ZSkuCi0gIC8vLwotICB1aW50MTYgYWNjZXNzOwotCi0gIC8vLyBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGZpZWxkLgotICAvLy8KLSAgY29uc3QgVVRGOCogbmFtZTsKLQotICAvLy8gdHlwZSAtIFRoZSBVVEY4IHR5cGUgbmFtZSBvZiB0aGUgZmllbGQuCi0gIC8vLwotICBjb25zdCBVVEY4KiB0eXBlOwotCi0gIC8vLyBhdHRyaWJ1dHMgLSBMaXN0IG9mIEphdmEgYXR0cmlidXRzIGZvciB0aGlzIGZpZWxkLgotICAvLy8KLSAgQXR0cmlidXQqIGF0dHJpYnV0czsKLSAgCi0gIC8vLyBuYkF0dHJpYnV0cyAtIFRoZSBudW1iZXIgb2YgYXR0cmlidXRlcy4KLSAgLy8vCi0gIHVpbnQxNiBuYkF0dHJpYnV0czsKLQotICAvLy8gY2xhc3NEZWYgLSBUaGUgY2xhc3Mgd2hlcmUgdGhlIGZpZWxkIGlzIGRlZmluZWQuCi0gIC8vLwotICBDbGFzcyogY2xhc3NEZWY7Ci0KLSAgLy8vIHB0ck9mZnNldCAtIFRoZSBvZmZzZXQgb2YgdGhlIGZpZWxkIHdoZW4gdGhlIG9iamVjdCBjb250YWluaW5nCi0gIC8vLyB0aGUgZmllbGQgaXMgY2FzdGVkIHRvIGFuIGFycmF5IG9mIGJ5dGVzLgotICAvLy8KLSAgdWludDMyIHB0ck9mZnNldDsKLSAgCi0gIC8vLyBudW0gLSBUaGUgaW5kZXggb2YgdGhlIGZpZWxkIGluIHRoZSBmaWVsZCBsaXN0LgotICAvLy8KLSAgdWludDE2IG51bTsKLSAgCi0gIC8vLyBnZXRTaWduYXR1cmUgLSBHZXQgdGhlIHNpZ25hdHVyZSBvZiB0aGlzIGZpZWxkLCByZXNvbHZpbmcgaXQgaWYKLSAgLy8vIG5lY2Vzc2FyeS4KLSAgLy8vCi0gIFR5cGVkZWYqIGdldFNpZ25hdHVyZSgpIHsKLSAgICBpZighX3NpZ25hdHVyZSkKLSAgICAgIF9zaWduYXR1cmUgPSBjbGFzc0RlZi0+Y2xhc3NMb2FkZXItPmNvbnN0cnVjdFR5cGUodHlwZSk7Ci0gICAgcmV0dXJuIF9zaWduYXR1cmU7Ci0gIH0KLQotICAvLy8gSW5pdFN0YXRpY0ZpZWxkIC0gSW5pdCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGluIHRoZSBnaXZlbiBvYmplY3QuIFRoaXMgaXMKLSAgLy8vIHVzZWQgZm9yIHN0YXRpYyBmaWVsZHMgd2hpY2ggaGF2ZSBhIGRlZmF1bHQgdmFsdWUuCi0gIC8vLwotICB2b2lkIEluaXRTdGF0aWNGaWVsZCgpOwotCi0gIC8vLyBsb29rdXBBdHRyaWJ1dCAtIExvb2sgdXAgdGhlIGF0dHJpYnV0IGluIHRoZSBmaWVsZCdzIGxpc3Qgb2YgYXR0cmlidXRzLgotICAvLy8KLSAgQXR0cmlidXQqIGxvb2t1cEF0dHJpYnV0KGNvbnN0IFVURjgqIGtleSk7Ci0KLSAgSmF2YU9iamVjdCoqIGdldFN0YXRpY09iamVjdEZpZWxkUHRyKCkgewotICAgIGFzc2VydChjbGFzc0RlZi0+aXNSZXNvbHZlZCgpKTsKLSAgICByZXR1cm4gKEphdmFPYmplY3QqKikoKHVpbnQ2NCljbGFzc0RlZi0+Z2V0U3RhdGljSW5zdGFuY2UoKSArIHB0ck9mZnNldCk7Ci0gIH0KLQotICBKYXZhT2JqZWN0KiogZ2V0SW5zdGFuY2VPYmplY3RGaWVsZFB0cihKYXZhT2JqZWN0KiBvYmopIHsKLSAgICBsbHZtX2djcm9vdChvYmosIDApOwotICAgIHJldHVybiAoSmF2YU9iamVjdCoqKSgodWludDY0KW9iaiArIHB0ck9mZnNldCk7Ci0gIH0KLQotICAvLy8gZ2V0U3RhdGljKkZpZWxkIC0gR2V0IGEgc3RhdGljIGZpZWxkLgotICAvLy8KLSAgI2RlZmluZSBHRVRTVEFUSUNGSUVMRChUWVBFLCBUWVBFX05BTUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFRZUEUgZ2V0U3RhdGljIyNUWVBFX05BTUUjI0ZpZWxkKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGFzc2VydChjbGFzc0RlZi0+aXNSZXNvbHZlZCgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB2b2lkKiBwdHIgPSAodm9pZCopKCh1aW50NjQpY2xhc3NEZWYtPmdldFN0YXRpY0luc3RhbmNlKCkgKyBwdHJPZmZzZXQpOyBcCi0gICAgcmV0dXJuICgoVFlQRSopcHRyKVswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSAgLy8vIHNldFN0YXRpYypGaWVsZCAtIFNldCBhIGZpZWxkIG9mIGFuIG9iamVjdC4KLSAgLy8vCi0gICNkZWZpbmUgU0VUU1RBVElDRklFTEQoVFlQRSwgVFlQRV9OQU1FKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkIHNldFN0YXRpYyMjVFlQRV9OQU1FIyNGaWVsZChUWVBFIHZhbCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhc3NlcnQoY2xhc3NEZWYtPmlzUmVzb2x2ZWQoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdm9pZCogcHRyID0gKHZvaWQqKSgodWludDY0KWNsYXNzRGVmLT5nZXRTdGF0aWNJbnN0YW5jZSgpICsgcHRyT2Zmc2V0KTsgXAotICAgICgoVFlQRSopcHRyKVswXSA9IHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0gIC8vLyBnZXRJbnN0YW5jZSpGaWVsZCAtIEdldCBhbiBpbnN0YW5jZSBmaWVsZC4KLSAgLy8vCi0gICNkZWZpbmUgR0VUSU5TVEFOQ0VGSUVMRChUWVBFLCBUWVBFX05BTUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBUWVBFIGdldEluc3RhbmNlIyNUWVBFX05BTUUjI0ZpZWxkKEphdmFPYmplY3QqIG9iaikgeyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsbHZtX2djcm9vdChvYmosIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXNzZXJ0KGNsYXNzRGVmLT5pc1Jlc29sdmVkKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHZvaWQqIHB0ciA9ICh2b2lkKikoKHVpbnQ2NClvYmogKyBwdHJPZmZzZXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gKChUWVBFKilwdHIpWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotICAvLy8gc2V0SW5zdGFuY2UqRmllbGQgLSBTZXQgYW4gaW5zdGFuY2UgZmllbGQuCi0gIC8vLwotICAjZGVmaW5lIFNFVElOU1RBTkNFRklFTEQoVFlQRSwgVFlQRV9OQU1FKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCBzZXRJbnN0YW5jZSMjVFlQRV9OQU1FIyNGaWVsZChKYXZhT2JqZWN0KiBvYmosIFRZUEUgdmFsKSB7ICAgICAgICAgICBcCi0gICAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGFzc2VydChjbGFzc0RlZi0+aXNSZXNvbHZlZCgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB2b2lkKiBwdHIgPSAodm9pZCopKCh1aW50NjQpb2JqICsgcHRyT2Zmc2V0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKChUWVBFKilwdHIpWzBdID0gdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSAgI2RlZmluZSBNS19BU1NFU1NPUlMoVFlQRSwgVFlQRV9OQU1FKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgR0VUU1RBVElDRklFTEQoVFlQRSwgVFlQRV9OQU1FKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFNFVFNUQVRJQ0ZJRUxEKFRZUEUsIFRZUEVfTkFNRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBHRVRJTlNUQU5DRUZJRUxEKFRZUEUsIFRZUEVfTkFNRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgU0VUSU5TVEFOQ0VGSUVMRChUWVBFLCBUWVBFX05BTUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCi0gIE1LX0FTU0VTU09SUyhmbG9hdCwgRmxvYXQpOwotICBNS19BU1NFU1NPUlMoZG91YmxlLCBEb3VibGUpOwotICBNS19BU1NFU1NPUlModWludDgsIEludDgpOwotICBNS19BU1NFU1NPUlModWludDE2LCBJbnQxNik7Ci0gIE1LX0FTU0VTU09SUyh1aW50MzIsIEludDMyKTsKLSAgTUtfQVNTRVNTT1JTKHNpbnQ2NCwgTG9uZyk7Ci0KLSAgSmF2YU9iamVjdCogZ2V0U3RhdGljT2JqZWN0RmllbGQoKSB7Ci0gICAgYXNzZXJ0KGNsYXNzRGVmLT5pc1Jlc29sdmVkKCkpOwotICAgIHZvaWQqIHB0ciA9ICh2b2lkKikoKHVpbnQ2NCljbGFzc0RlZi0+Z2V0U3RhdGljSW5zdGFuY2UoKSArIHB0ck9mZnNldCk7Ci0gICAgcmV0dXJuICgoSmF2YU9iamVjdCoqKXB0cilbMF07Ci0gIH0KLQotICB2b2lkIHNldFN0YXRpY09iamVjdEZpZWxkKEphdmFPYmplY3QqIHZhbCkgewotICAgIGxsdm1fZ2Nyb290KHZhbCwgMCk7Ci0gICAgaWYgKHZhbCAhPSBOVUxMKSBhc3NlcnQodmFsLT5nZXRWaXJ0dWFsVGFibGUoKSk7Ci0gICAgYXNzZXJ0KGNsYXNzRGVmLT5pc1Jlc29sdmVkKCkpOwotICAgIHZvaWQqIHB0ciA9ICh2b2lkKikoKHVpbnQ2NCljbGFzc0RlZi0+Z2V0U3RhdGljSW5zdGFuY2UoKSArIHB0ck9mZnNldCk7Ci0gICAgKChKYXZhT2JqZWN0KiopcHRyKVswXSA9IHZhbDsKLSAgfQotCi0gIEphdmFPYmplY3QqIGdldEluc3RhbmNlT2JqZWN0RmllbGQoSmF2YU9iamVjdCogb2JqKSB7Ci0gICAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgICBhc3NlcnQoY2xhc3NEZWYtPmlzUmVzb2x2ZWQoKSk7Ci0gICAgdm9pZCogcHRyID0gKHZvaWQqKSgodWludDY0KW9iaiArIHB0ck9mZnNldCk7Ci0gICAgcmV0dXJuICgoSmF2YU9iamVjdCoqKXB0cilbMF07Ci0gIH0KLQotICB2b2lkIHNldEluc3RhbmNlT2JqZWN0RmllbGQoSmF2YU9iamVjdCogb2JqLCBKYXZhT2JqZWN0KiB2YWwpIHsKLSAgICBsbHZtX2djcm9vdChvYmosIDApOwotICAgIGxsdm1fZ2Nyb290KHZhbCwgMCk7Ci0gICAgaWYgKHZhbCAhPSBOVUxMKSBhc3NlcnQodmFsLT5nZXRWaXJ0dWFsVGFibGUoKSk7Ci0gICAgYXNzZXJ0KGNsYXNzRGVmLT5pc1Jlc29sdmVkKCkpOwotICAgIHZvaWQqIHB0ciA9ICh2b2lkKikoKHVpbnQ2NClvYmogKyBwdHJPZmZzZXQpOwotICAgICgoSmF2YU9iamVjdCoqKXB0cilbMF0gPSB2YWw7Ci0gIH0KLSAgCi0gIGJvb2wgaXNSZWZlcmVuY2UoKSB7Ci0gICAgdWludDE2IHZhbCA9IHR5cGUtPmVsZW1lbnRzWzBdOwotICAgIHJldHVybiAodmFsID09ICdbJyB8fCB2YWwgPT0gJ0wnKTsKLSAgfQotCi19OwotCi0KLX0gLy8gZW5kIG5hbWVzcGFjZSBqMwotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL0ozL1ZNQ29yZS9KYXZhQ29uc3RhbnRQb29sLmNwcCBiL3Zta2l0L2xpYi9KMy9WTUNvcmUvSmF2YUNvbnN0YW50UG9vbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMjlkNGEuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL0ozL1ZNQ29yZS9KYXZhQ29uc3RhbnRQb29sLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUzOSArMCwwIEBACi0vLz09PS0tLSBKYXZhQ29uc3RhbnRQb29sLmNwcCAtIEphdmEgY29uc3RhbnQgcG9vbCBkZWZpbml0aW9uIC0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jZGVmaW5lIEpOSlZNX0xPQUQgMAotCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci0jaW5jbHVkZSA8Y3N0ZGlvPgotI2luY2x1ZGUgPGNzdGRsaWI+Ci0KLSNpbmNsdWRlICJkZWJ1Zy5oIgotCi0jaW5jbHVkZSAiSmF2YUFjY2Vzcy5oIgotI2luY2x1ZGUgIkphdmFBcnJheS5oIgotI2luY2x1ZGUgIkphdmFDbGFzcy5oIgotI2luY2x1ZGUgIkphdmFDb21waWxlci5oIgotI2luY2x1ZGUgIkphdmFDb25zdGFudFBvb2wuaCIKLSNpbmNsdWRlICJKbmp2bS5oIgotI2luY2x1ZGUgIkphdmFUaHJlYWQuaCIKLSNpbmNsdWRlICJKYXZhVHlwZXMuaCIKLSNpbmNsdWRlICJMb2NrZWRNYXAuaCIKLSNpbmNsdWRlICJSZWFkZXIuaCIKLSNpbmNsdWRlICJKbmp2bUNsYXNzTG9hZGVyLmgiCi0gCi11c2luZyBuYW1lc3BhY2UgajM7Ci0KLWNvbnN0IHVpbnQzMiBKYXZhQ29uc3RhbnRQb29sOjpDb25zdGFudFVURjggPSAxOwotY29uc3QgdWludDMyIEphdmFDb25zdGFudFBvb2w6OkNvbnN0YW50SW50ZWdlciA9IDM7Ci1jb25zdCB1aW50MzIgSmF2YUNvbnN0YW50UG9vbDo6Q29uc3RhbnRGbG9hdCA9IDQ7Ci1jb25zdCB1aW50MzIgSmF2YUNvbnN0YW50UG9vbDo6Q29uc3RhbnRMb25nID0gNTsKLWNvbnN0IHVpbnQzMiBKYXZhQ29uc3RhbnRQb29sOjpDb25zdGFudERvdWJsZSA9IDY7Ci1jb25zdCB1aW50MzIgSmF2YUNvbnN0YW50UG9vbDo6Q29uc3RhbnRDbGFzcyA9IDc7Ci1jb25zdCB1aW50MzIgSmF2YUNvbnN0YW50UG9vbDo6Q29uc3RhbnRTdHJpbmcgPSA4OwotY29uc3QgdWludDMyIEphdmFDb25zdGFudFBvb2w6OkNvbnN0YW50RmllbGRyZWYgPSA5OwotY29uc3QgdWludDMyIEphdmFDb25zdGFudFBvb2w6OkNvbnN0YW50TWV0aG9kcmVmID0gMTA7Ci1jb25zdCB1aW50MzIgSmF2YUNvbnN0YW50UG9vbDo6Q29uc3RhbnRJbnRlcmZhY2VNZXRob2RyZWYgPSAxMTsKLWNvbnN0IHVpbnQzMiBKYXZhQ29uc3RhbnRQb29sOjpDb25zdGFudE5hbWVBbmRUeXBlID0gMTI7Ci0KLQotc3RhdGljIHVpbnQzMiB1bmltcGxlbWVudGVkKEphdmFDb25zdGFudFBvb2wqIGN0cCwgUmVhZGVyJiByZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIGluZGV4KSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiVW5pbXBsZW1lbnRlZCBpbiBjb25zdGFudCBwb29sOiAlZFxuIiwgaW5kZXgpOwotICBhYm9ydCgpOwotICByZXR1cm4gMTsKLX0KLQotCi11aW50MzIgSmF2YUNvbnN0YW50UG9vbDo6Q3RwUmVhZGVyQ2xhc3MoSmF2YUNvbnN0YW50UG9vbCogY3RwLCBSZWFkZXImIHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIGluZGV4KSB7Ci0gIHVpbnQxNiBlbnRyeSA9IHJlYWRlci5yZWFkVTIoKTsKLSAgY3RwLT5jdHBEZWZbaW5kZXhdID0gZW50cnk7Ci0gIFBSSU5UX0RFQlVHKEpOSlZNX0xPQUQsIDMsIENPTE9SX05PUk1BTCwgIjsgWyU1ZF0gPGNsYXNzPlx0XHR1dGY4IGlzIGF0ICVkXG4iLCBlLAotICAgICAgICAgICAgICBlbnRyeSk7Ci0gIHJldHVybiAxOwotfQotICAKLXVpbnQzMiBKYXZhQ29uc3RhbnRQb29sOjpDdHBSZWFkZXJJbnRlZ2VyKEphdmFDb25zdGFudFBvb2wqIGN0cCwgUmVhZGVyJiByZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIGluZGV4KSB7Ci0gIHVpbnQzMiB2YWwgPSByZWFkZXIucmVhZFU0KCk7Ci0gIGN0cC0+Y3RwRGVmW2luZGV4XSA9IHZhbDsKLSAgUFJJTlRfREVCVUcoSk5KVk1fTE9BRCwgMywgQ09MT1JfTk9STUFMLCAiOyBbJTVkXSA8Y2xhc3M+XHRpbnRlZ2VyOiAlZFxuIiwgZSwKLSAgICAgICAgICAgICAgdmFsKTsKLSAgcmV0dXJuIDE7Ci19Ci0gIAotdWludDMyIEphdmFDb25zdGFudFBvb2w6OkN0cFJlYWRlckZsb2F0KEphdmFDb25zdGFudFBvb2wqIGN0cCwgUmVhZGVyJiByZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBpbmRleCkgeyAKLSAgdWludDMyIHZhbCA9IHJlYWRlci5yZWFkVTQoKTsKLSAgY3RwLT5jdHBEZWZbaW5kZXhdID0gdmFsOwotICBQUklOVF9ERUJVRyhKTkpWTV9MT0FELCAzLCBDT0xPUl9OT1JNQUwsICI7IFslNWRdIDxjbGFzcz5cdGZsb2F0OiAlZFxuIiwgZSwKLSAgICAgICAgICAgICAgdmFsKTsKLSAgcmV0dXJuIDE7Ci19Ci0gIAotdWludDMyIEphdmFDb25zdGFudFBvb2w6OkN0cFJlYWRlclVURjgoSmF2YUNvbnN0YW50UG9vbCogY3RwLCBSZWFkZXImIHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgaW5kZXgpIHsgCi0gIGN0cC0+Y3RwRGVmW2luZGV4XSA9IHJlYWRlci5jdXJzb3I7Ci0gIHVpbnQxNiBsZW4gPSByZWFkZXIucmVhZFUyKCk7Ci0gIHJlYWRlci5jdXJzb3IgKz0gbGVuOwotICByZXR1cm4gMTsKLX0KLSAgCi11aW50MzIgSmF2YUNvbnN0YW50UG9vbDo6Q3RwUmVhZGVyTmFtZUFuZFR5cGUoSmF2YUNvbnN0YW50UG9vbCogY3RwLCBSZWFkZXImIHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIGluZGV4KSB7Ci0gIHVpbnQzMiBlbnRyeSA9IHJlYWRlci5yZWFkVTQoKTsKLSAgY3RwLT5jdHBEZWZbaW5kZXhdID0gZW50cnk7Ci0gIFBSSU5UX0RFQlVHKEpOSlZNX0xPQUQsIDMsIENPTE9SX05PUk1BTCwgCi0gICAgICAgICAgICAgICI7IFslNWRdIDxuYW1lL3R5cGU+XHRuYW1lIGlzIGF0ICVkLCB0eXBlIGlzIGF0ICVkXG4iLCBpbmRleCwKLSAgICAgICAgICAgICAgKGVudHJ5ID4+IDE2KSwgKGVudHJ5ICYgMHhmZmZmKSk7Ci0gIHJldHVybiAxOwotfQotICAKLXVpbnQzMiBKYXZhQ29uc3RhbnRQb29sOjpDdHBSZWFkZXJGaWVsZHJlZihKYXZhQ29uc3RhbnRQb29sKiBjdHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGVyJiByZWFkZXIsIHVpbnQzMiBpbmRleCkgewotCi0gIHVpbnQzMiBlbnRyeSA9IHJlYWRlci5yZWFkVTQoKTsKLSAgY3RwLT5jdHBEZWZbaW5kZXhdID0gZW50cnk7Ci0gIFBSSU5UX0RFQlVHKEpOSlZNX0xPQUQsIDMsIENPTE9SX05PUk1BTCwgCi0gICAgICAgICAgICAgICI7IFslNWRdIDxmaWVsZHJlZj5cdGNsYXNzIGlzIGF0ICVkLCBuYW1lL3R5cGUgaXMgYXQgJWRcbiIsIGluZGV4LAotICAgICAgICAgICAgICAoZW50cnkgPj4gMTYpLCAoZW50cnkgJiAweGZmZmYpKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXVpbnQzMiBKYXZhQ29uc3RhbnRQb29sOjpDdHBSZWFkZXJTdHJpbmcoSmF2YUNvbnN0YW50UG9vbCogY3RwLCBSZWFkZXImIHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIGluZGV4KSB7Ci0gIHVpbnQxNiBlbnRyeSA9IHJlYWRlci5yZWFkVTIoKTsKLSAgY3RwLT5jdHBEZWZbaW5kZXhdID0gZW50cnk7Ci0gIFBSSU5UX0RFQlVHKEpOSlZNX0xPQUQsIDMsIENPTE9SX05PUk1BTCwgIjsgWyU1ZF0gPHN0cmluZz5cdHV0ZjggaXMgYXQgJWRcbiIsCi0gICAgICAgICAgICAgIGluZGV4LCBlbnRyeSk7Ci0gIHJldHVybiAxOwotfQotICAKLXVpbnQzMiBKYXZhQ29uc3RhbnRQb29sOjpDdHBSZWFkZXJNZXRob2RyZWYoSmF2YUNvbnN0YW50UG9vbCogY3RwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkZXImIHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIGluZGV4KSB7Ci0gIHVpbnQzMiBlbnRyeSA9IHJlYWRlci5yZWFkVTQoKTsKLSAgY3RwLT5jdHBEZWZbaW5kZXhdID0gZW50cnk7Ci0gIFBSSU5UX0RFQlVHKEpOSlZNX0xPQUQsIDMsIENPTE9SX05PUk1BTCwgCi0gICAgICAgICAgICAgICI7IFslNWRdIDxtZXRob2RyZWY+XHRjbGFzcyBpcyBhdCAlZCwgbmFtZS90eXBlIGlzIGF0ICVkXG4iLAotICAgICAgICAgICAgICBpbmRleCwgKGVudHJ5ID4+IDE2KSwgKGVudHJ5ICYgMHhmZmZmKSk7Ci0gIHJldHVybiAxOwotfQotCi11aW50MzIgSmF2YUNvbnN0YW50UG9vbDo6Q3RwUmVhZGVySW50ZXJmYWNlTWV0aG9kcmVmKEphdmFDb25zdGFudFBvb2wqIGN0cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGVyJiByZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBpbmRleCkgewotICB1aW50MzIgZW50cnkgPSByZWFkZXIucmVhZFU0KCk7Ci0gIGN0cC0+Y3RwRGVmW2luZGV4XSA9IGVudHJ5OwotICBQUklOVF9ERUJVRyhKTkpWTV9MT0FELCAzLCBDT0xPUl9OT1JNQUwsIAotICAgICAgICAiOyBbJTVkXSA8SW50ZXJmYWNlIHhtZXRob2RyZWY+XHRjbGFzcyBpcyBhdCAlZCwgbmFtZS90eXBlIGlzIGF0ICVkXG4iLAotICAgICAgICBpbmRleCwgKGVudHJ5ID4+IDE2KSwgKGVudHJ5ICYgMHhmZmZmKSk7Ci0gIHJldHVybiAxOwotfQotICAKLXVpbnQzMiBKYXZhQ29uc3RhbnRQb29sOjpDdHBSZWFkZXJMb25nKEphdmFDb25zdGFudFBvb2wqIGN0cCwgUmVhZGVyJiByZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgaW5kZXgpIHsKLSAgY3RwLT5jdHBEZWZbaW5kZXggKyAxXSA9IHJlYWRlci5yZWFkVTQoKTsKLSAgY3RwLT5jdHBEZWZbaW5kZXhdID0gcmVhZGVyLnJlYWRVNCgpOwotICBQUklOVF9ERUJVRyhKTkpWTV9MT0FELCAzLCBDT0xPUl9OT1JNQUwsICI7IFslNWRdIDxsb25nPiVkICVkXG4iLCBpbmRleCwKLSAgICAgICAgICAgICAgY3RwRGVmW2VdLCBjdHBEZWZbZSArIDFdKTsKLSAgcmV0dXJuIDI7Ci19Ci0KLXVpbnQzMiBKYXZhQ29uc3RhbnRQb29sOjpDdHBSZWFkZXJEb3VibGUoSmF2YUNvbnN0YW50UG9vbCogY3RwLCBSZWFkZXImIHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIGluZGV4KSB7Ci0gIGN0cC0+Y3RwRGVmW2luZGV4ICsgMV0gPSByZWFkZXIucmVhZFU0KCk7Ci0gIGN0cC0+Y3RwRGVmW2luZGV4XSA9IHJlYWRlci5yZWFkVTQoKTsKLSAgUFJJTlRfREVCVUcoSk5KVk1fTE9BRCwgMywgQ09MT1JfTk9STUFMLCAiOyBbJTVkXSA8ZG91YmxlPiVkICVkXG4iLCBpbmRleCwKLSAgICAgICAgICAgICAgY3RwLT5jdHBEZWZbaW5kZXhdLCBjdHAtPmN0cERlZltpbmRleCArIDFdKTsKLSAgcmV0dXJuIDI7Ci19Ci0KLQotdm9pZCoKLUphdmFDb25zdGFudFBvb2w6Om9wZXJhdG9yIG5ldyhzaXplX3Qgc3osIG12bTo6QnVtcFB0ckFsbG9jYXRvciYgYWxsb2NhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBjdHBTaXplKSB7Ci0gIHVpbnQzMiBzaXplID0gc3ogKyBjdHBTaXplICogKHNpemVvZih2b2lkKikgKyBzaXplb2Yoc2ludDMyKSArIHNpemVvZih1aW50OCkpOwotICByZXR1cm4gYWxsb2NhdG9yLkFsbG9jYXRlKHNpemUsICJDb25zdGFudCBwb29sIik7Ci19Ci0KLUphdmFDb25zdGFudFBvb2w6OkphdmFDb25zdGFudFBvb2woQ2xhc3MqIGNsLCBSZWFkZXImIHJlYWRlciwgdWludDMyIHNpemUpIHsKLSAgY3RwU2l6ZSA9IHNpemU7Ci0gIGNsYXNzRGVmID0gY2w7Ci0gIAotICBjdHBUeXBlICA9ICh1aW50OCopKCh1aW50NjQpdGhpcyArIHNpemVvZihKYXZhQ29uc3RhbnRQb29sKSk7Ci0gIGN0cERlZiAgID0gKHNpbnQzMiopKCh1aW50NjQpY3RwVHlwZSArIGN0cFNpemUgKiBzaXplb2YodWludDgpKTsKLSAgY3RwUmVzICAgPSAodm9pZCoqKSgodWludDY0KWN0cERlZiArIGN0cFNpemUgKiBzaXplb2Yoc2ludDMyKSk7Ci0KLSAgbWVtc2V0KGN0cFR5cGUsIDAsIAotICAgICAgICAgY3RwU2l6ZSAqIChzaXplb2YodWludDgpICsgc2l6ZW9mKHNpbnQzMikgKyBzaXplb2Yodm9pZCopKSk7Ci0KLSAgdWludDMyIGN1ciA9IDE7Ci0gIHdoaWxlIChjdXIgPCBjdHBTaXplKSB7Ci0gICAgdWludDggY3VyVHlwZSA9IHJlYWRlci5yZWFkVTEoKTsKLSAgICBjdHBUeXBlW2N1cl0gPSBjdXJUeXBlOwotICAgIGN1ciArPSAoKGZ1bmNzUmVhZGVyW2N1clR5cGVdKSh0aGlzLCByZWFkZXIsIGN1cikpOwotICB9Ci19Ci0KLWNvbnN0IFVURjgqIEphdmFDb25zdGFudFBvb2w6OlVURjhBdCh1aW50MzIgZW50cnkpIHsKLSAgaWYgKCEoKGVudHJ5ID4gMCkgJiYgKGVudHJ5IDwgY3RwU2l6ZSkgJiYgdHlwZUF0KGVudHJ5KSA9PSBDb25zdGFudFVURjgpKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJNYWxmb3JtZWQgY2xhc3MgJXNcbiIsCi0gICAgICAgICAgICBVVEY4QnVmZmVyKGNsYXNzRGVmLT5uYW1lKS5jU3RyaW5nKCkpOwotICAgIGFib3J0KCk7Ci0gIH0KLSAgCi0gIGlmICghY3RwUmVzW2VudHJ5XSkgewotICAgIG12bTo6VGhyZWFkQWxsb2NhdG9yIGFsbG9jYXRvcjsKLSAgICBSZWFkZXIgcmVhZGVyKGNsYXNzRGVmLT5ieXRlcywgY3RwRGVmW2VudHJ5XSk7Ci0gICAgdWludDMyIGxlbiA9IHJlYWRlci5yZWFkVTIoKTsKLSAgICB1aW50MTYqIGJ1ZiA9ICh1aW50MTYqKWFsbG9jYXRvci5BbGxvY2F0ZShsZW4gKiBzaXplb2YodWludDE2KSk7Ci0gICAgdWludDMyIG4gPSAwOwotICAgIHVpbnQzMiBpID0gMDsKLSAgCi0gICAgd2hpbGUgKGkgPCBsZW4pIHsKLSAgICAgIHVpbnQzMiBjdXIgPSByZWFkZXIucmVhZFUxKCk7Ci0gICAgICBpZiAoY3VyICYgMHg4MCkgewotICAgICAgICB1aW50MzIgeSA9IHJlYWRlci5yZWFkVTEoKTsKLSAgICAgICAgaWYgKGN1ciAmIDB4MjApIHsKLSAgICAgICAgICB1aW50MzIgeiA9IHJlYWRlci5yZWFkVTEoKTsKLSAgICAgICAgICBjdXIgPSAoKGN1ciAmIDB4MEYpIDw8IDEyKSArCi0gICAgICAgICAgICAgICAgKCh5ICYgMHgzRikgPDwgNikgKwotICAgICAgICAgICAgICAgICh6ICYgMHgzRik7Ci0gICAgICAgICAgaSArPSAzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGN1ciA9ICgoY3VyICYgMHgxRikgPDwgNikgKwotICAgICAgICAgICAgICAgICh5ICYgMHgzRik7Ci0gICAgICAgICAgaSArPSAyOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICArK2k7Ci0gICAgICB9Ci0gICAgICBidWZbbl0gPSAoKHVpbnQxNiljdXIpOwotICAgICAgKytuOwotICAgIH0KLSAgCi0gICAgSm5qdm1DbGFzc0xvYWRlciogbG9hZGVyID0gY2xhc3NEZWYtPmNsYXNzTG9hZGVyOwotICAgIGNvbnN0IFVURjgqIHV0ZjggPSBsb2FkZXItPmhhc2hVVEY4LT5sb29rdXBPckNyZWF0ZVJlYWRlcihidWYsIG4pOwotICAgIGN0cFJlc1tlbnRyeV0gPSBjb25zdF9jYXN0PFVURjgqPih1dGY4KTsKLSAgCi0gICAgUFJJTlRfREVCVUcoSk5KVk1fTE9BRCwgMywgQ09MT1JfTk9STUFMLCAiOyBbJTVkXSA8dXRmOD5cdFx0XCIlc1wiXG4iLAotICAgICAgICAgICAgICAgIGVudHJ5LCBVVEY4QnVmZmVyKHV0ZjgpLT5jU3RyaW5nKCkpOwotCi0gIH0KLSAgcmV0dXJuIChjb25zdCBVVEY4KiljdHBSZXNbZW50cnldOwotfQotCi1mbG9hdCBKYXZhQ29uc3RhbnRQb29sOjpGbG9hdEF0KHVpbnQzMiBlbnRyeSkgewotICBpZiAoISgoZW50cnkgPiAwKSAmJiAoZW50cnkgPCBjdHBTaXplKSAmJiB0eXBlQXQoZW50cnkpID09IENvbnN0YW50RmxvYXQpKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJNYWxmb3JtZWQgY2xhc3MgJXNcbiIsCi0gICAgICAgICAgICBVVEY4QnVmZmVyKGNsYXNzRGVmLT5uYW1lKS5jU3RyaW5nKCkpOwotICAgIGFib3J0KCk7Ci0gIH0KLSAgcmV0dXJuICgoZmxvYXQqKWN0cERlZilbZW50cnldOwotfQotCi1zaW50MzIgSmF2YUNvbnN0YW50UG9vbDo6SW50ZWdlckF0KHVpbnQzMiBlbnRyeSkgewotICBpZiAoISgoZW50cnkgPiAwKSAmJiAoZW50cnkgPCBjdHBTaXplKSAmJiB0eXBlQXQoZW50cnkpID09IENvbnN0YW50SW50ZWdlcikpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIk1hbGZvcm1lZCBjbGFzcyAlc1xuIiwKLSAgICAgICAgICAgIFVURjhCdWZmZXIoY2xhc3NEZWYtPm5hbWUpLmNTdHJpbmcoKSk7Ci0gICAgYWJvcnQoKTsKLSAgfQotICByZXR1cm4gKChzaW50MzIqKWN0cERlZilbZW50cnldOwotfQotCi1zaW50NjQgSmF2YUNvbnN0YW50UG9vbDo6TG9uZ0F0KHVpbnQzMiBlbnRyeSkgewotICBpZiAoISgoZW50cnkgPiAwKSAmJiAoZW50cnkgPCBjdHBTaXplKSAmJiB0eXBlQXQoZW50cnkpID09IENvbnN0YW50TG9uZykpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIk1hbGZvcm1lZCBjbGFzcyAlc1xuIiwKLSAgICAgICAgICAgIFVURjhCdWZmZXIoY2xhc3NEZWYtPm5hbWUpLmNTdHJpbmcoKSk7Ci0gICAgYWJvcnQoKTsKLSAgfQotICByZXR1cm4gUmVhZGVyOjpyZWFkTG9uZyhjdHBEZWZbZW50cnldLCBjdHBEZWZbZW50cnkgKyAxXSk7Ci19Ci0KLWRvdWJsZSBKYXZhQ29uc3RhbnRQb29sOjpEb3VibGVBdCh1aW50MzIgZW50cnkpIHsKLSAgaWYgKCEoKGVudHJ5ID4gMCkgJiYgKGVudHJ5IDwgY3RwU2l6ZSkgJiYgdHlwZUF0KGVudHJ5KSA9PSBDb25zdGFudERvdWJsZSkpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIk1hbGZvcm1lZCBjbGFzcyAlc1xuIiwKLSAgICAgICAgICAgIFVURjhCdWZmZXIoY2xhc3NEZWYtPm5hbWUpLmNTdHJpbmcoKSk7Ci0gICAgYWJvcnQoKTsKLSAgfQotICByZXR1cm4gUmVhZGVyOjpyZWFkRG91YmxlKGN0cERlZltlbnRyeV0sIGN0cERlZltlbnRyeSArIDFdKTsKLX0KLQotQ29tbW9uQ2xhc3MqIEphdmFDb25zdGFudFBvb2w6OmlzQ2xhc3NMb2FkZWQodWludDMyIGVudHJ5KSB7Ci0gIGlmICghKChlbnRyeSA+IDApICYmIChlbnRyeSA8IGN0cFNpemUpICYmICB0eXBlQXQoZW50cnkpID09IENvbnN0YW50Q2xhc3MpKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJNYWxmb3JtZWQgY2xhc3MgJXNcbiIsCi0gICAgICAgICAgICBVVEY4QnVmZmVyKGNsYXNzRGVmLT5uYW1lKS5jU3RyaW5nKCkpOwotICAgIGFib3J0KCk7Ci0gIH0KLSAgcmV0dXJuIChDb21tb25DbGFzcyopY3RwUmVzW2VudHJ5XTsKLX0KLQotY29uc3QgVVRGOCogSmF2YUNvbnN0YW50UG9vbDo6cmVzb2x2ZUNsYXNzTmFtZSh1aW50MzIgaW5kZXgpIHsKLSAgQ29tbW9uQ2xhc3MqIGNsID0gaXNDbGFzc0xvYWRlZChpbmRleCk7Ci0gIGlmIChjbCkgcmV0dXJuIGNsLT5uYW1lOwotICBlbHNlIHJldHVybiBVVEY4QXQoY3RwRGVmW2luZGV4XSk7Ci19Ci0KLUNvbW1vbkNsYXNzKiBKYXZhQ29uc3RhbnRQb29sOjpsb2FkQ2xhc3ModWludDMyIGluZGV4LCBib29sIHJlc29sdmUpIHsKLSAgQ29tbW9uQ2xhc3MqIHRlbXAgPSBpc0NsYXNzTG9hZGVkKGluZGV4KTsKLSAgaWYgKCF0ZW1wKSB7Ci0gICAgSm5qdm1DbGFzc0xvYWRlciogbG9hZGVyID0gY2xhc3NEZWYtPmNsYXNzTG9hZGVyOwotICAgIGNvbnN0IFVURjgqIG5hbWUgPSBVVEY4QXQoY3RwRGVmW2luZGV4XSk7Ci0gICAgaWYgKG5hbWUtPmVsZW1lbnRzWzBdID09IElfVEFCKSB7Ci0gICAgICB0ZW1wID0gbG9hZGVyLT5jb25zdHJ1Y3RBcnJheShuYW1lKTsKLSAgICB9IGVsc2UgewotICAgICAgdGVtcCA9IGxvYWRlci0+bG9hZE5hbWUobmFtZSwgcmVzb2x2ZSwgZmFsc2UsIE5VTEwpOwotICAgIH0gCi0gICAgY3RwUmVzW2luZGV4XSA9IHRlbXA7Ci0gIH0KLSAgcmV0dXJuIHRlbXA7Ci19Ci0KLUNvbW1vbkNsYXNzKiBKYXZhQ29uc3RhbnRQb29sOjpnZXRNZXRob2RDbGFzc0lmTG9hZGVkKHVpbnQzMiBpbmRleCkgewotICBDb21tb25DbGFzcyogdGVtcCA9IGlzQ2xhc3NMb2FkZWQoaW5kZXgpOwotICBpZiAoIXRlbXApIHsKLSAgICBKbmp2bUNsYXNzTG9hZGVyKiBsb2FkZXIgPSBjbGFzc0RlZi0+Y2xhc3NMb2FkZXI7Ci0gICAgYXNzZXJ0KGxvYWRlciAmJiAiQ2xhc3MgaGFzIG5vIGxvYWRlcj8iKTsKLSAgICBjb25zdCBVVEY4KiBuYW1lID0gVVRGOEF0KGN0cERlZltpbmRleF0pOwotICAgIHRlbXAgPSBsb2FkZXItPmxvb2t1cENsYXNzT3JBcnJheShuYW1lKTsKLSAgfQotCi0gIGlmICghdGVtcCAmJiBjbGFzc0RlZi0+Y2xhc3NMb2FkZXItPmdldENvbXBpbGVyKCktPmlzU3RhdGljQ29tcGlsaW5nKCkpIHsKLSAgICB0ZW1wID0gbG9hZENsYXNzKGluZGV4KTsKLSAgfQotICByZXR1cm4gdGVtcDsKLX0KLQotVHlwZWRlZiogSmF2YUNvbnN0YW50UG9vbDo6cmVzb2x2ZU5hbWVBbmRUeXBlKHVpbnQzMiBpbmRleCkgewotICB2b2lkKiByZXMgPSBjdHBSZXNbaW5kZXhdOwotICBpZiAoIXJlcykgewotICAgIGlmICh0eXBlQXQoaW5kZXgpICE9IENvbnN0YW50TmFtZUFuZFR5cGUpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiTWFsZm9ybWVkIGNsYXNzICVzXG4iLAotICAgICAgICAgICAgICBVVEY4QnVmZmVyKGNsYXNzRGVmLT5uYW1lKS5jU3RyaW5nKCkpOwotICAgICAgYWJvcnQoKTsKLSAgICB9Ci0gICAgc2ludDMyIGVudHJ5ID0gY3RwRGVmW2luZGV4XTsKLSAgICBjb25zdCBVVEY4KiB0eXBlID0gVVRGOEF0KGVudHJ5ICYgMHhGRkZGKTsKLSAgICBUeXBlZGVmKiBzaWduID0gY2xhc3NEZWYtPmNsYXNzTG9hZGVyLT5jb25zdHJ1Y3RUeXBlKHR5cGUpOwotICAgIGN0cFJlc1tpbmRleF0gPSBzaWduOwotICAgIHJldHVybiBzaWduOwotICB9Ci0gIHJldHVybiAoVHlwZWRlZiopcmVzOwotfQotCi1TaWduZGVmKiBKYXZhQ29uc3RhbnRQb29sOjpyZXNvbHZlTmFtZUFuZFNpZ24odWludDMyIGluZGV4KSB7Ci0gIHZvaWQqIHJlcyA9IGN0cFJlc1tpbmRleF07Ci0gIGlmICghcmVzKSB7Ci0gICAgaWYgKHR5cGVBdChpbmRleCkgIT0gQ29uc3RhbnROYW1lQW5kVHlwZSkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJNYWxmb3JtZWQgY2xhc3MgJXNcbiIsCi0gICAgICAgICAgICAgIFVURjhCdWZmZXIoY2xhc3NEZWYtPm5hbWUpLmNTdHJpbmcoKSk7Ci0gICAgICBhYm9ydCgpOwotICAgIH0KLSAgICBzaW50MzIgZW50cnkgPSBjdHBEZWZbaW5kZXhdOwotICAgIGNvbnN0IFVURjgqIHR5cGUgPSBVVEY4QXQoZW50cnkgJiAweEZGRkYpOwotICAgIFNpZ25kZWYqIHNpZ24gPSBjbGFzc0RlZi0+Y2xhc3NMb2FkZXItPmNvbnN0cnVjdFNpZ24odHlwZSk7Ci0gICAgY3RwUmVzW2luZGV4XSA9IHNpZ247Ci0gICAgcmV0dXJuIHNpZ247Ci0gIH0KLSAgcmV0dXJuIChTaWduZGVmKilyZXM7Ci19Ci0KLVR5cGVkZWYqIEphdmFDb25zdGFudFBvb2w6OmluZm9PZkZpZWxkKHVpbnQzMiBpbmRleCkgewotICBpZiAodHlwZUF0KGluZGV4KSAhPSBDb25zdGFudEZpZWxkcmVmKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJNYWxmb3JtZWQgY2xhc3MgJXNcbiIsCi0gICAgICAgICAgICBVVEY4QnVmZmVyKGNsYXNzRGVmLT5uYW1lKS5jU3RyaW5nKCkpOwotICAgIGFib3J0KCk7Ci0gIH0KLQotICByZXR1cm4gcmVzb2x2ZU5hbWVBbmRUeXBlKGN0cERlZltpbmRleF0gJiAweEZGRkYpOwotfQotCi12b2lkIEphdmFDb25zdGFudFBvb2w6OmluZm9PZk1ldGhvZCh1aW50MzIgaW5kZXgsIHVpbnQzMiBhY2Nlc3MsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uQ2xhc3MqJiBjbCwgSmF2YU1ldGhvZComIG1ldGgpIHsKLSAgdWludDggaWQgPSB0eXBlQXQoaW5kZXgpOwotICBpZiAoaWQgIT0gQ29uc3RhbnRNZXRob2RyZWYgJiYgaWQgIT0gQ29uc3RhbnRJbnRlcmZhY2VNZXRob2RyZWYpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIk1hbGZvcm1lZCBjbGFzcyAlc1xuIiwgVVRGOEJ1ZmZlcihjbGFzc0RlZi0+bmFtZSkuY1N0cmluZygpKTsKLSAgICBhYm9ydCgpOwotICB9Ci0gIAotICBTaWduZGVmKiBzaWduID0gcmVzb2x2ZU5hbWVBbmRTaWduKGN0cERlZltpbmRleF0gJiAweEZGRkYpOwotICBzaW50MzIgZW50cnkgPSBjdHBEZWZbaW5kZXhdOwotICBzaW50MzIgbnRJbmRleCA9IGVudHJ5ICYgMHhGRkZGOwotICBjb25zdCBVVEY4KiB1dGY4ID0gVVRGOEF0KGN0cERlZltudEluZGV4XSA+PiAxNik7Ci0gIGNsID0gZ2V0TWV0aG9kQ2xhc3NJZkxvYWRlZChlbnRyeSA+PiAxNik7Ci0gIGlmIChjbCkgewotICAgIENsYXNzKiBsb29rdXAgPSBjbC0+aXNBcnJheSgpID8gY2wtPnN1cGVyIDogY2wtPmFzQ2xhc3MoKTsKLSAgICBpZiAobG9va3VwLT5pc1Jlc29sdmVkKCkpIHsKLSAgICAKLSAgICAgIC8vIGxvb2t1cCB0aGUgbWV0aG9kCi0gICAgICBtZXRoID0gbG9va3VwLT5sb29rdXBNZXRob2REb250VGhyb3codXRmOCwgc2lnbi0+a2V5TmFtZSwgaXNTdGF0aWMoYWNjZXNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgMCk7Ci0gICAgICAvLyBPSywgdGhpcyBpcyByYXJlLCBidXQgdGhlIEphdmEgYnl0ZWNvZGUgbWF5IGRvIGFuIGludm9rZXZpcnR1YWwgb24gYW4KLSAgICAgIC8vIGludGVyZmFjZSBtZXRob2QuIExvb2t1cCB0aGUgbWV0aG9kIGFzIGlmIGl0IHdhcyBzdGF0aWMuCi0gICAgICAvLyBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciB0YWtpbmcgYW55IGFjdGlvbiBpZiB0aGUgbWV0aG9kIGlzCi0gICAgICAvLyBhbiBpbnRlcmZhY2UgbWV0aG9kLgotICAgICAgaWYgKCFtZXRoKSB7Ci0gICAgICAgIG1ldGggPSBsb29rdXAtPmxvb2t1cEludGVyZmFjZU1ldGhvZERvbnRUaHJvdyh1dGY4LCBzaWduLT5rZXlOYW1lKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdWludDMyIEphdmFDb25zdGFudFBvb2w6OmdldENsYXNzSW5kZXhGcm9tTWV0aG9kKHVpbnQzMiBpbmRleCkgewotICBzaW50MzIgZW50cnkgPSBjdHBEZWZbaW5kZXhdOwotICByZXR1cm4gKHVpbnQzMikoZW50cnkgPj4gMTYpOwotfQotCi0KLXZvaWQgSmF2YUNvbnN0YW50UG9vbDo6bmFtZU9mU3RhdGljT3JTcGVjaWFsTWV0aG9kKHVpbnQzMiBpbmRleCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVVRGOComIGNsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVURjgqJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpZ25kZWYqJiBzaWduKSB7Ci0gIHVpbnQ4IGlkID0gdHlwZUF0KGluZGV4KTsKLSAgaWYgKGlkICE9IENvbnN0YW50TWV0aG9kcmVmICYmIGlkICE9IENvbnN0YW50SW50ZXJmYWNlTWV0aG9kcmVmKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJNYWxmb3JtZWQgY2xhc3MgJXNcbiIsCi0gICAgICAgICAgICBVVEY4QnVmZmVyKGNsYXNzRGVmLT5uYW1lKS5jU3RyaW5nKCkpOwotICAgIGFib3J0KCk7Ci0gIH0KLSAgCi0gIHNpZ24gPSByZXNvbHZlTmFtZUFuZFNpZ24oY3RwRGVmW2luZGV4XSAmIDB4RkZGRik7Ci0gIHNpbnQzMiBlbnRyeSA9IGN0cERlZltpbmRleF07Ci0gIHNpbnQzMiBudEluZGV4ID0gZW50cnkgJiAweEZGRkY7Ci0gIG5hbWUgPSBVVEY4QXQoY3RwRGVmW250SW5kZXhdID4+IDE2KTsKLSAgY2wgPSByZXNvbHZlQ2xhc3NOYW1lKGVudHJ5ID4+IDE2KTsKLX0KLQotSmF2YU1ldGhvZCogSmF2YUNvbnN0YW50UG9vbDo6aW5mb09mU3RhdGljT3JTcGVjaWFsTWV0aG9kKHVpbnQzMiBpbmRleCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIGFjY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaWduZGVmKiBzaWduKSB7Ci0gIHVpbnQ4IGlkID0gdHlwZUF0KGluZGV4KTsKLSAgaWYgKGlkICE9IENvbnN0YW50TWV0aG9kcmVmICYmIGlkICE9IENvbnN0YW50SW50ZXJmYWNlTWV0aG9kcmVmKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJNYWxmb3JtZWQgY2xhc3MgJXNcbiIsCi0gICAgICAgICAgICBVVEY4QnVmZmVyKGNsYXNzRGVmLT5uYW1lKS5jU3RyaW5nKCkpOwotICAgIGFib3J0KCk7Ci0gIH0KLSAgCi0gIHNpbnQzMiBlbnRyeSA9IGN0cERlZltpbmRleF07Ci0gIHNpbnQzMiBudEluZGV4ID0gZW50cnkgJiAweEZGRkY7Ci0gIGNvbnN0IFVURjgqIHV0ZjggPSBVVEY4QXQoY3RwRGVmW250SW5kZXhdID4+IDE2KTsKLSAgQ29tbW9uQ2xhc3MqIGNsID0gZ2V0TWV0aG9kQ2xhc3NJZkxvYWRlZChlbnRyeSA+PiAxNik7Ci0gIEphdmFNZXRob2QqIG1ldGggPSAwOwotICBpZiAoY2wpIHsKLSAgICBDbGFzcyogbG9va3VwID0gY2wtPmlzQXJyYXkoKSA/IGNsLT5zdXBlciA6IGNsLT5hc0NsYXNzKCk7Ci0gICAgaWYgKGxvb2t1cC0+aXNSZXNvbHZlZCgpKSB7Ci0gICAgICAvLyBsb29rdXAgdGhlIG1ldGhvZAotICAgICAgaWYgKGlzU3RhdGljKGFjY2VzcykpIHsKLSAgICAgICAgbWV0aCA9IGxvb2t1cC0+bG9va3VwTWV0aG9kRG9udFRocm93KHV0ZjgsIHNpZ24tPmtleU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCB0cnVlLCAwKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG1ldGggPSBsb29rdXAtPmxvb2t1cFNwZWNpYWxNZXRob2REb250VGhyb3codXRmOCwgc2lnbi0+a2V5TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0RlZik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICByZXR1cm4gbWV0aDsKLX0KLQotCi1TaWduZGVmKiBKYXZhQ29uc3RhbnRQb29sOjppbmZvT2ZJbnRlcmZhY2VPclZpcnR1YWxNZXRob2QodWludDMyIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVURjgqJiBuYW1lKSB7Ci0KLSAgdWludDggaWQgPSB0eXBlQXQoaW5kZXgpOwotICBpZiAoaWQgIT0gQ29uc3RhbnRNZXRob2RyZWYgJiYgaWQgIT0gQ29uc3RhbnRJbnRlcmZhY2VNZXRob2RyZWYpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIk1hbGZvcm1lZCBjbGFzcyAlc1xuIiwKLSAgICAgICAgICAgIFVURjhCdWZmZXIoY2xhc3NEZWYtPm5hbWUpLmNTdHJpbmcoKSk7Ci0gICAgYWJvcnQoKTsKLSAgfQotICAKLSAgc2ludDMyIGVudHJ5ID0gY3RwRGVmW2luZGV4XTsKLSAgc2ludDMyIG50SW5kZXggPSBlbnRyeSAmIDB4RkZGRjsKLSAgU2lnbmRlZiogc2lnbiA9IHJlc29sdmVOYW1lQW5kU2lnbihudEluZGV4KTsgCi0gIG5hbWUgPSBVVEY4QXQoY3RwRGVmW250SW5kZXhdID4+IDE2KTsKLSAgcmV0dXJuIHNpZ247Ci19Ci0KLXZvaWQgSmF2YUNvbnN0YW50UG9vbDo6cmVzb2x2ZU1ldGhvZCh1aW50MzIgaW5kZXgsIENvbW1vbkNsYXNzKiYgY2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVVRGOComIHV0ZjgsIFNpZ25kZWYqJiBzaWduKSB7Ci0gIHNpbnQzMiBlbnRyeSA9IGN0cERlZltpbmRleF07Ci0gIHNpbnQzMiBudEluZGV4ID0gZW50cnkgJiAweEZGRkY7Ci0gIHNpZ24gPSAoU2lnbmRlZiopY3RwUmVzW250SW5kZXhdOwotICBhc3NlcnQoc2lnbiAmJiAiTm8gY2FjaGVkIHNpZ25hdHVyZSBhZnRlciBKSVR0aW5nIik7Ci0gIHV0ZjggPSBVVEY4QXQoY3RwRGVmW250SW5kZXhdID4+IDE2KTsKLSAgY2wgPSBsb2FkQ2xhc3MoZW50cnkgPj4gMTYpOwotICBhc3NlcnQoY2wgJiYgIk5vIGNsYXNzIGFmdGVyIGxvYWRDbGFzcyIpOwotICBhc3NlcnQoKGNsLT5pc0NsYXNzKCkgJiYgY2wtPmFzQ2xhc3MoKS0+aXNSZXNvbHZlZCgpKSAmJiAKLSAgICAgICAgICJDbGFzcyBub3QgcmVzb2x2ZWQgYWZ0ZXIgbG9hZENsYXNzIik7Ci19Ci0gIAotdm9pZCBKYXZhQ29uc3RhbnRQb29sOjpyZXNvbHZlRmllbGQodWludDMyIGluZGV4LCBDb21tb25DbGFzcyomIGNsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVVRGOComIHV0ZjgsIFR5cGVkZWYqJiBzaWduKSB7Ci0gIHNpbnQzMiBlbnRyeSA9IGN0cERlZltpbmRleF07Ci0gIHNpbnQzMiBudEluZGV4ID0gZW50cnkgJiAweEZGRkY7Ci0gIHNpZ24gPSAoVHlwZWRlZiopY3RwUmVzW250SW5kZXhdOwotICBhc3NlcnQoc2lnbiAmJiAiTm8gY2FjaGVkIFR5cGVkZWYgYWZ0ZXIgSklUdGluZyIpOwotICB1dGY4ID0gVVRGOEF0KGN0cERlZltudEluZGV4XSA+PiAxNik7Ci0gIGNsID0gbG9hZENsYXNzKGVudHJ5ID4+IDE2KTsKLSAgYXNzZXJ0KGNsICYmICJObyBjbGFzcyBhZnRlciBsb2FkQ2xhc3MiKTsKLSAgYXNzZXJ0KChjbC0+aXNDbGFzcygpICYmIGNsLT5hc0NsYXNzKCktPmlzUmVzb2x2ZWQoKSkgJiYgCi0gICAgICAgICAiQ2xhc3Mgbm90IHJlc29sdmVkIGFmdGVyIGxvYWRDbGFzcyIpOwotfQotCi1KYXZhRmllbGQqIEphdmFDb25zdGFudFBvb2w6Omxvb2t1cEZpZWxkKHVpbnQzMiBpbmRleCwgYm9vbCBzdGF0KSB7Ci0gIHNpbnQzMiBlbnRyeSA9IGN0cERlZltpbmRleF07Ci0gIHNpbnQzMiBudEluZGV4ID0gZW50cnkgJiAweEZGRkY7Ci0gIFR5cGVkZWYqIHNpZ24gPSAoVHlwZWRlZiopY3RwUmVzW250SW5kZXhdOwotICBjb25zdCBVVEY4KiB1dGY4ID0gVVRGOEF0KGN0cERlZltudEluZGV4XSA+PiAxNik7Ci0gIENvbW1vbkNsYXNzKiBjbCA9IGdldE1ldGhvZENsYXNzSWZMb2FkZWQoZW50cnkgPj4gMTYpOwotICBpZiAoY2wpIHsKLSAgICBDbGFzcyogbG9va3VwID0gY2wtPmlzQXJyYXkoKSA/IGNsLT5zdXBlciA6IGNsLT5hc0NsYXNzKCk7Ci0gICAgaWYgKGxvb2t1cC0+aXNSZXNvbHZlZCgpKSB7Ci0gICAgICBKYXZhRmllbGQqIGZpZWxkID0gbG9va3VwLT5sb29rdXBGaWVsZERvbnRUaHJvdyh1dGY4LCBzaWduLT5rZXlOYW1lLCBzdGF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgMCk7Ci0gICAgICAvLyBkb24ndCB0aHJvdyBpZiBubyBmaWVsZCwgdGhlIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBqdXN0IGluIHRpbWUgIAotICAgICAgaWYgKGZpZWxkKSB7Ci0gICAgICAgIGlmICghc3RhdCkgewotICAgICAgICAgIGN0cFJlc1tpbmRleF0gPSAodm9pZCopZmllbGQtPnB0ck9mZnNldDsKLSAgICAgICAgfSBlbHNlIGlmIChsb29rdXAtPmlzUmVhZHkoKSkgewotICAgICAgICAgIHZvaWQqIFMgPSBmaWVsZC0+Y2xhc3NEZWYtPmdldFN0YXRpY0luc3RhbmNlKCk7Ci0gICAgICAgICAgY3RwUmVzW2luZGV4XSA9ICh2b2lkKikoKHVpbnQ2NClTICsgZmllbGQtPnB0ck9mZnNldCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBmaWVsZDsKLSAgICB9Ci0gIH0gCi0gIHJldHVybiAwOwotfQotCi1KYXZhU3RyaW5nKiBKYXZhQ29uc3RhbnRQb29sOjpyZXNvbHZlU3RyaW5nKGNvbnN0IFVURjgqIHV0ZjgsIHVpbnQxNiBpbmRleCkgewotICBKYXZhU3RyaW5nKiBzdHIgPSBOVUxMOwotICBsbHZtX2djcm9vdChzdHIsIDApOwotICBzdHIgPSBjbGFzc0RlZi0+Y2xhc3NMb2FkZXItPnZtLT5pbnRlcm5hbFVURjhUb1N0cih1dGY4KTsKLSAgcmV0dXJuIHN0cjsKLX0KLQotSmF2YUNvbnN0YW50UG9vbDo6Y3RwUmVhZGVyIEphdmFDb25zdGFudFBvb2w6OmZ1bmNzUmVhZGVyWzE2XSA9IHsKLSAgdW5pbXBsZW1lbnRlZCwKLSAgQ3RwUmVhZGVyVVRGOCwKLSAgdW5pbXBsZW1lbnRlZCwKLSAgQ3RwUmVhZGVySW50ZWdlciwKLSAgQ3RwUmVhZGVyRmxvYXQsCi0gIEN0cFJlYWRlckxvbmcsCi0gIEN0cFJlYWRlckRvdWJsZSwKLSAgQ3RwUmVhZGVyQ2xhc3MsCi0gIEN0cFJlYWRlclN0cmluZywKLSAgQ3RwUmVhZGVyRmllbGRyZWYsCi0gIEN0cFJlYWRlck1ldGhvZHJlZiwKLSAgQ3RwUmVhZGVySW50ZXJmYWNlTWV0aG9kcmVmLAotICBDdHBSZWFkZXJOYW1lQW5kVHlwZSwKLSAgdW5pbXBsZW1lbnRlZCwKLSAgdW5pbXBsZW1lbnRlZCwKLSAgdW5pbXBsZW1lbnRlZAotfTsKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9KMy9WTUNvcmUvSmF2YUNvbnN0YW50UG9vbC5oIGIvdm1raXQvbGliL0ozL1ZNQ29yZS9KYXZhQ29uc3RhbnRQb29sLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNjVlYzcuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL0ozL1ZNQ29yZS9KYXZhQ29uc3RhbnRQb29sLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLy89PT0tLS0gSmF2YUNvbnN0YW50UG9vbC5oIC0gSmF2YSBjb25zdGFudCBwb29sIGRlZmluaXRpb24gLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgSk5KVk1fSkFWQV9DT05TVEFOVF9QT09MX0gKLSNkZWZpbmUgSk5KVk1fSkFWQV9DT05TVEFOVF9QT09MX0gKLQotI2luY2x1ZGUgIm12bS9BbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJ0eXBlcy5oIgotCi0jaW5jbHVkZSAiVVRGOC5oIgotCi1uYW1lc3BhY2UgajMgewotCi1jbGFzcyBDbGFzczsKLWNsYXNzIENvbW1vbkNsYXNzOwotY2xhc3MgSmF2YUZpZWxkOwotY2xhc3MgSmF2YU1ldGhvZDsKLWNsYXNzIEphdmFTdHJpbmc7Ci1jbGFzcyBSZWFkZXI7Ci1jbGFzcyBTaWduZGVmOwotY2xhc3MgVHlwZWRlZjsKLQotLy8vIEphdmFDb25zdGFudFBvb2wgLSBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBKYXZhIGNvbnN0YW50IHBvb2wsIGEgcGxhY2Ugd2hlcmUKLS8vLyBhIEphdmEgY2xhc3MgbWFrZXMgZXh0ZXJuYWwgcmVmZXJlbmNlcyBzdWNoIGFzIGNsYXNzZXMgYW5kIG1ldGhvZHMgYW5kCi0vLy8gc3RvcmVzIGNvbnN0YW50cyBzdWNoIGFzIGludGVnZXJzIG9yIFVURjhzLgotY2xhc3MgSmF2YUNvbnN0YW50UG9vbCA6IHB1YmxpYyBtdm06OlBlcm1hbmVudE9iamVjdCB7Ci1wdWJsaWM6Ci0gIAotICAvLy8gY2xhc3NEZWYgLSBUaGUgb3duaW5nIGNsYXNzIG9mIHRoaXMgY29uc3RhbnQgcG9vbC4KLSAgLy8vCi0gIENsYXNzKiAgY2xhc3NEZWY7Ci0gIAotICAvLy8gY3RwU2l6ZSAtIFRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY29uc3RhbnQgcG9vbC4KLSAgLy8vCi0gIHVpbnQzMiBjdHBTaXplOwotCi0gIC8vLyBjdHBUeXBlIC0gVGhlIHR5cGVzIG9mIHRoZSBjb25zdGFudCBwb29sIGVudHJpZXMuCi0gIC8vLwotICB1aW50OCogIGN0cFR5cGU7Ci0KLSAgLy8vIGN0cERlZiAtIFRoZSB2YWx1ZXMgb2YgdGhlIGNvbnN0YW50IHBvb2wgZW50cmllczogbWF5IGJlIGNvbnN0YW50cyBvcgotICAvLy8gcmVmZXJlbmNlcyB0byBvdGhlciBlbnRyaWVzLgotICAvLy8KLSAgc2ludDMyKiBjdHBEZWY7Ci0gIAotICAvLy8gY3RwUmVzIC0gT2JqZWN0cyByZXNvbHZlZCBkeW5hbWljYWxseSwgZS5nLiBVVEY4cywgY2xhc3NlcywgbWV0aG9kcywKLSAgLy8vIGZpZWxkcywgc3RyaW5nIHBvaW50ZXJzLgotICAvLy8KLSAgdm9pZCoqICBjdHBSZXM7Ci0gIAotICAvLy8gb3BlcmF0b3IgbmV3IC0gUmVkZWZpbmUgdGhlIG9wZXJhdG9yIHRvIGFsbG9jYXRlIHRoZSBhcnJheXMgb2YgYQotICAvLy8gY29uc3RhbnQgcG9vbCBpbmxpbmUuCi0gIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qgc3osIG12bTo6QnVtcFB0ckFsbG9jYXRvciYgYWxsb2NhdG9yLAotICAgICAgICAgICAgICAgICAgICAgdWludDMyIGN0cFNpemUpOwotCi0gIC8vLyBDdHBSZWFkZXJDbGFzcyAtIFJlYWRzIGEgY2xhc3MgZW50cnkuCi0gIHN0YXRpYyB1aW50MzIgQ3RwUmVhZGVyQ2xhc3MoSmF2YUNvbnN0YW50UG9vbCogY3RwLCBSZWFkZXImIHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgaW5kZXgpOwotICAKLSAgLy8vIEN0cFJlYWRlckludGVnZXIgLSBSZWFkcyBhbiBpbnRlZ2VyIGVudHJ5LgotICBzdGF0aWMgdWludDMyIEN0cFJlYWRlckludGVnZXIoSmF2YUNvbnN0YW50UG9vbCogY3RwLCBSZWFkZXImIHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBpbmRleCk7Ci0gIAotICAvLy8gQ3RwUmVhZGVyRmxvYXQgLSBSZWFkcyBhIGZsb2F0IGVudHJ5LgotICBzdGF0aWMgdWludDMyIEN0cFJlYWRlckZsb2F0KEphdmFDb25zdGFudFBvb2wqIGN0cCwgUmVhZGVyJiByZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIGluZGV4KTsKLSAgCi0gIC8vLyBDdHBSZWFkZXJDbGFzcyAtIFJlYWRzIGFuIFVURjggZW50cnkuCi0gIHN0YXRpYyB1aW50MzIgQ3RwUmVhZGVyVVRGOChKYXZhQ29uc3RhbnRQb29sKiBjdHAsIFJlYWRlciYgcmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIGluZGV4KTsKLSAgCi0gIC8vLyBDdHBSZWFkZXJOYW1lQW5kVHlwZSAtIFJlYWRzIGEgbmFtZS9zaWduYXR1cmUgZW50cnkuCi0gIHN0YXRpYyB1aW50MzIgQ3RwUmVhZGVyTmFtZUFuZFR5cGUoSmF2YUNvbnN0YW50UG9vbCogY3RwLCBSZWFkZXImIHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgaW5kZXgpOwotICAKLSAgLy8vIEN0cFJlYWRlckZpZWxkcmVmIC0gUmVhZHMgYSBmaWVsZCBlbnRyeS4KLSAgc3RhdGljIHVpbnQzMiBDdHBSZWFkZXJGaWVsZHJlZihKYXZhQ29uc3RhbnRQb29sKiBjdHAsIFJlYWRlciYgcmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBpbmRleCk7Ci0gIAotICAvLy8gQ3RwUmVhZGVyU3RyaW5nIC0gUmVhZHMgYSBzdHJpbmcgZW50cnkuCi0gIHN0YXRpYyB1aW50MzIgQ3RwUmVhZGVyU3RyaW5nKEphdmFDb25zdGFudFBvb2wqIGN0cCwgUmVhZGVyJiByZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBpbmRleCk7Ci0gIAotICAvLy8gQ3RwUmVhZGVyTWV0aG9kcmVmIC0gUmVhZHMgYSBtZXRob2QgZW50cnkuCi0gIHN0YXRpYyB1aW50MzIgQ3RwUmVhZGVyTWV0aG9kcmVmKEphdmFDb25zdGFudFBvb2wqIGN0cCwgUmVhZGVyJiByZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBpbmRleCk7Ci0gIAotICAvLy8gQ3RwUmVhZGVySW50ZXJmYWNlTWV0aG9kcmVmIC0gUmVhZHMgYSBtZXRob2Qgb2YgYW4gaW50ZXJmYWNlIGVudHJ5LgotICBzdGF0aWMgdWludDMyIEN0cFJlYWRlckludGVyZmFjZU1ldGhvZHJlZihKYXZhQ29uc3RhbnRQb29sKiBjdHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRlciYgcmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgaW5kZXgpOwotICAgCi0gIC8vLyBDdHBSZWFkZXJMb25nIC0gUmVhZHMgYSBsb25nIGVudHJ5LgotICBzdGF0aWMgdWludDMyIEN0cFJlYWRlckxvbmcoSmF2YUNvbnN0YW50UG9vbCogY3RwLCBSZWFkZXImIHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBpbmRleCk7Ci0gIAotICAvLy8gQ3RwUmVhZGVyQ2xhc3MgLSBSZWFkcyBhIGRvdWJsZSBlbnRyeS4KLSAgc3RhdGljIHVpbnQzMiBDdHBSZWFkZXJEb3VibGUoSmF2YUNvbnN0YW50UG9vbCogY3RwLCBSZWFkZXImIHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIGluZGV4KTsKLQotICBzdGF0aWMgY29uc3QgdWludDMyIENvbnN0YW50VVRGODsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMiBDb25zdGFudEludGVnZXI7Ci0gIHN0YXRpYyBjb25zdCB1aW50MzIgQ29uc3RhbnRGbG9hdDsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMiBDb25zdGFudExvbmc7Ci0gIHN0YXRpYyBjb25zdCB1aW50MzIgQ29uc3RhbnREb3VibGU7Ci0gIHN0YXRpYyBjb25zdCB1aW50MzIgQ29uc3RhbnRDbGFzczsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMiBDb25zdGFudFN0cmluZzsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMiBDb25zdGFudEZpZWxkcmVmOwotICBzdGF0aWMgY29uc3QgdWludDMyIENvbnN0YW50TWV0aG9kcmVmOwotICBzdGF0aWMgY29uc3QgdWludDMyIENvbnN0YW50SW50ZXJmYWNlTWV0aG9kcmVmOwotICBzdGF0aWMgY29uc3QgdWludDMyIENvbnN0YW50TmFtZUFuZFR5cGU7Ci0KLSAgdHlwZWRlZiB1aW50MzIgKCpjdHBSZWFkZXIpKEphdmFDb25zdGFudFBvb2wqLCBSZWFkZXImLCB1aW50MzIpOwotCi0gIC8vLyBmdW5jc1JlYWRlciAtIEFycmF5IG9mIEN0cFJlYWRlciogZnVuY3Rpb25zLgotICAvLy8KLSAgc3RhdGljIGN0cFJlYWRlciBmdW5jc1JlYWRlclsxNl07Ci0KLSAgLy8vIGlzQVN0YXRpY0NhbGwgLSBJcyB0aGUgbmFtZS90eXBlIGF0IHRoZSBnaXZlbiBlbnRyeSBhIHJlZmVyZW5jZSB0byBhCi0gIC8vLyBzdGF0aWMgbWV0aG9kPwotICBib29sIGlzQVN0YXRpY0NhbGwodWludDMyIGluZGV4KSB7Ci0gICAgcmV0dXJuIChjdHBUeXBlW2luZGV4XSAmIDB4ODApICE9IDA7ICAgIAotICB9Ci0gIAotICAvLy8gbWFya0FzU3RhdGljQ2FsbCAtIFNldCB0aGUgbmFtZS90eXBlIGVudHJ5IGFzIGEgcmVmZXJlbmNlIHRvIGEgc3RhdGljCi0gIC8vLyBtZXRob2QuCi0gIHZvaWQgbWFya0FzU3RhdGljQ2FsbCh1aW50MzIgaW5kZXgpIHsKLSAgICBjdHBUeXBlW2luZGV4XSB8PSAweDgwOwotICB9Ci0KLSAgLy8vIHR5cGVBdCAtIEdldCB0aGUgY29uc3RhbnQgcG9vbCB0eXBlIG9mIHRoZSBnaXZlbiBlbnRyeS4KLSAgLy8vCi0gIHVpbnQ4IHR5cGVBdCh1aW50MzIgaW5kZXgpIHsKLSAgICByZXR1cm4gY3RwVHlwZVtpbmRleF0gJiAweDdGOyAgICAKLSAgfQotICAKLSAgLy8vIFVURjhBdCAtIEdldCB0aGUgVVRGOCBhdCB0aGUgZ2l2ZW4gZW50cnkuCi0gIC8vLwotICBjb25zdCBVVEY4KiBVVEY4QXQodWludDMyIGVudHJ5KTsKLSAgCi0gIC8vLyBVVEY4QXQgLSBHZXQgdGhlIFVURjggcmVmZXJlbmNlZCBmcm9tIHRoaXMgc3RyaW5nIGVudHJ5LgotICAvLy8KLSAgY29uc3QgVVRGOCogVVRGOEF0Rm9yU3RyaW5nKHVpbnQzMiBlbnRyeSkgewotICAgIHJldHVybiBVVEY4QXQoY3RwRGVmW2VudHJ5XSk7Ci0gIH0KLQotICAvLy8gRmxvYXRBdCAtIEdldCB0aGUgZmxvYXQgYXQgdGhlIGdpdmVuIGVudHJ5LgotICAvLy8KLSAgZmxvYXQgRmxvYXRBdCh1aW50MzIgZW50cnkpOwotCi0gIC8vLyBJbnRlZ2VyQXQgLSBHZXQgdGhlIGludCBhdCB0aGUgZ2l2ZW4gZW50cnkuCi0gIC8vLwotICBzaW50MzIgSW50ZWdlckF0KHVpbnQzMiBlbnRyeSk7Ci0KLSAgLy8vIExvbmdBdCAtIEdldCB0aGUgbG9uZyBhdCB0aGUgZ2l2ZW4gZW50cnkuCi0gIC8vLwotICBzaW50NjQgTG9uZ0F0KHVpbnQzMiBlbnRyeSk7Ci0KLSAgLy8vIERvdWJsZUF0IC0gR2V0IHRoZSBkb3VibGUgYXQgdGhlIGdpdmVuIGVudHJ5LgotICAvLy8KLSAgZG91YmxlIERvdWJsZUF0KHVpbnQzMiBlbnRyeSk7Ci0KLSAgLy8vIGlzQ2xhc3NMb2FkZWQgLSBJcyB0aGUgY2xhc3MgYXQgdGhlIGdpdmVuIGVudHJ5IGFscmVhZHkgbG9hZGVkPwotICAvLy8KLSAgQ29tbW9uQ2xhc3MqIGlzQ2xhc3NMb2FkZWQodWludDMyIGluZGV4KTsKLQotICAvLy8gcmVzb2x2ZUNsYXNzTmFtZSAtIEdldCB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgcmVmZXJlbmNlZCBhbmQgcmV0dXJucwotICAvLy8gaXQuCi0gIC8vLwotICBjb25zdCBVVEY4KiByZXNvbHZlQ2xhc3NOYW1lKHVpbnQzMiBpbmRleCk7Ci0gCi0gIC8vLyByZXNvbHZlTmFtZUFuZFR5cGUgLSBSZXNvbHZlIHRoZSBuYW1lL3R5cGUgYXQgdGhlIGdpdmVuIGluZGV4LAotICAvLy8gYW5kIHJldHVybnMgdGhlIHR5cGUuCi0gIFR5cGVkZWYqIHJlc29sdmVOYW1lQW5kVHlwZSh1aW50MzIgaW5kZXgpOwotCi0gIC8vLyByZXNvbHZlTmFtZUFuZFNpZ24gLSBSZXNvbHZlIHRoZSBuYW1lL3NpZ24gYXQgdGhlIGdpdmVuIGluZGV4LAotICAvLy8gYW5kIHJldHVybnMgdGhlIHNpZ25hdHVyZS4KLSAgU2lnbmRlZiogcmVzb2x2ZU5hbWVBbmRTaWduKHVpbnQzMiBpbmRleCk7Ci0KLSAgLy8vIGluZm9PZkludGVyZmFjZU9yVmlydHVhbE1ldGhvZCAtIEdldCB0aGUgc2lnbmF0dXJlIG9mIHRoZSBtZXRob2QKLSAgLy8vIHJlZmVyZW5jZWQgYXQgdGhlIGdpdmVuIGVudHJ5LgotICBTaWduZGVmKiBpbmZvT2ZJbnRlcmZhY2VPclZpcnR1YWxNZXRob2QodWludDMyIGluZGV4LCBjb25zdCBVVEY4KiYgbmFtZSk7Ci0KLSAgLy8vIGluZm9PZlN0YXRpY09yU3BlY2lhbE1ldGhvZCAtIEdldCB0aGUgSmF2YU1ldGhvZCBvZiBhIG5vbi12aXJ0dWFsCi0gIC8vLyBtZXRob2QuIFJldHVybiBudWxsIGlmIG5vdCBsb2FkZWQgeWV0LgotICAvLy8KLSAgSmF2YU1ldGhvZCogaW5mb09mU3RhdGljT3JTcGVjaWFsTWV0aG9kKHVpbnQzMiBpbmRleCwgdWludDMyIGFjY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpZ25kZWYqIHNpZ24pOwotICAKLSAgCi0gIC8vLyBuYW1lT2ZTdGF0aWNPclNwZWNpYWxNZXRob2QgLSBHZXQgdGhlIG5hbWUgYW5kIHRoZSBzaWduYXR1cmUKLSAgLy8vIG9mIGEgbm9uLXZpcnR1YWwgbWV0aG9kLgotICAvLy8KLSAgdm9pZCBuYW1lT2ZTdGF0aWNPclNwZWNpYWxNZXRob2QodWludDMyIGluZGV4LCBjb25zdCBVVEY4KiYgY2wsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVVEY4KiYgbmFtZSwgU2lnbmRlZiomIHNpZ24pOwotICAKLSAgLy8vIGdldENsYXNzSW5kZXhGcm9tTWV0aG9kIC0gR2V0IHRoZSBlbnRyeSBvZiB0aGUgY2xhc3MgdGhhdCBvd25zCi0gIC8vLyB0aGUgcmVmZXJlbmNlZCBtZXRob2QuCi0gIC8vLwotICB1aW50MzIgZ2V0Q2xhc3NJbmRleEZyb21NZXRob2QodWludDMyIGluZGV4KTsKLQotICAvLy8gZ2V0TWV0aG9kQ2xhc3NJZkxvYWRlZCAtIFJldHVybnMgdGhlIGNsYXNzIG9mIHRoZSBnaXZlbiBtZXRob2QgaWYKLSAgLy8vIGxvYWRlZCwgbnVsbCBpZiBub3QuCi0gIENvbW1vbkNsYXNzKiBnZXRNZXRob2RDbGFzc0lmTG9hZGVkKHVpbnQzMiBpbmRleCk7Ci0gCi0gIC8vLyBpbmZvT2ZGaWVsZCAtIEdldCB0aGUgVHlwZWRlZiByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmllbGQgcmVmZXJlbmNlZAotICAvLy8gYXQgdGhlIGdpdmVuIGVudHJ5LiBUaGlzIGRvZXMgbm90IGludm9sdmUgYW55IGNsYXNzIGxvYWRpbmcuCi0gIC8vLwotICBUeXBlZGVmKiBpbmZvT2ZGaWVsZCh1aW50MzIgaW5kZXgpOwotICAKLSAgLy8vIGluZm9PZk1ldGhvZCAtIEdldCB0aGUgc2lnbmF0dXJlIG9mIHRoZSBtZXRob2QgcmVmZXJlbmNlZCBhdCB0aGUgZ2l2ZW4KLSAgLy8vIGVudHJ5IGFuZCB0cnkgdG8gZmluZCB0aGUgbWV0aG9kLiBUaGlzIGRvZXMgbm90IGludm9sdmUgYW55IGNsYXNzCi0gIC8vLyBsb2FkaW5nLgotICAvLy8KLSAgdm9pZCBpbmZvT2ZNZXRob2QodWludDMyIGluZGV4LCB1aW50MzIgYWNjZXNzLCBDb21tb25DbGFzcyomIGNsLAotICAgICAgICAgICAgICAgICAgICBKYXZhTWV0aG9kKiYgbWV0aCk7IAotIAotICAvLy8gbG9va3VwRmllbGQgLSBMb29rdXAgdGhlIGZpZWxkIGF0IHRoZSBnaXZlbiBlbnRyeS4KLSAgLy8vCi0gIEphdmFGaWVsZCogbG9va3VwRmllbGQodWludDMyIGluZGV4LCBib29sIHN0YXQpOwotICAKLSAgLy8vIHJlc29sdmVTdHJpbmcgLSBHZXQgdGhlIHN0cmluZyByZWZlcmVuY2VkIGF0IHRoZSBnaXZlbgotICAvLy8gaW5kZXggZnJvbSB0aGUgVVRGOC4KLSAgSmF2YVN0cmluZyogcmVzb2x2ZVN0cmluZyhjb25zdCBVVEY4KiB1dGY4LCB1aW50MTYgaW5kZXgpOwotICAKLSAgLy8vIHJlc29sdmVNZXRob2QgLSBSZXNvbHZlIHRoZSBjbGFzcyBhbmQgdGhlIHNpZ25hdHVyZSBvZiB0aGUgbWV0aG9kLiBNYXkKLSAgLy8vIHBlcmZvcm0gY2xhc3MgbG9hZGluZy4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQganVzdCBpbiB0aW1lLCBpZSB3aGVuCi0gIC8vLyB0aGUgbWV0aG9kIGNhbGwgaXMgYWN0dWFsbHkgbWFkZSBhbmQgbm90IHlldCByZXNvbHZlZC4KLSAgLy8vCi0gIHZvaWQgcmVzb2x2ZU1ldGhvZCh1aW50MzIgaW5kZXgsIENvbW1vbkNsYXNzKiYgY2wsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBVVEY4KiYgdXRmOCwgU2lnbmRlZiomIHNpZ24pOwotICAKLSAgLy8vIHJlc29sdmVGaWVsZCAtIFJlc29sdmUgdGhlIGNsYXNzIGFuZCBzaWduYXR1cmUgb2YgdGhlIGZpZWxkLiBNYXkKLSAgLy8vIHBlcmZvcm0gY2xhc3MgbG9hZGluZy4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQganVzdCBpbiB0aW1lLCBpZSB3aGVuCi0gIC8vLyB0aGUgZmllbGQgaXMgYWNjZXNzZWQgYW5kIG5vdCB5ZXQgcmVzb2x2ZWQuCi0gIC8vLwotICB2b2lkIHJlc29sdmVGaWVsZCh1aW50MzIgaW5kZXgsIENvbW1vbkNsYXNzKiYgY2wsIGNvbnN0IFVURjgqJiB1dGY4LAotICAgICAgICAgICAgICAgICAgICBUeXBlZGVmKiYgc2lnbik7Ci0gIAotICAvLy8gbG9hZENsYXNzIC0gTG9hZHMgdGhlIGNsYXNzIGFuZCByZXR1cm5zIGl0LiBUaGlzIGlzIGNhbGxlZCBqdXN0IGluIHRpbWUsIAotICAvLy8gaWUgd2hlbiB0aGUgY2xhc3Mgd2lsbCBiZSB1c2VkIGFuZCBub3QgeWV0IHJlc29sdmVkLCBhbmQgYWxzbyBmb3IKLSAgLy8vIGxvYWRpbmcgZXhjZXB0aW9ucyB3aGVuIEpJVHRpbmcgY2F0Y2ggY2xhdXNlcy4KLSAgLy8vCi0gIENvbW1vbkNsYXNzKiBsb2FkQ2xhc3ModWludDMyIGluZGV4LCBib29sIHJlc29sdmUgPSB0cnVlKTsKLQotICAvLy8gSmF2YUNvbnN0YW50UG9vbCAtIFJlYWRzIHRoZSBieXRlY29kZSBvZiB0aGUgY2xhc3MgdG8gZ2V0Ci0gIC8vLyB0aGUgaW5pdGlhbCB0eXBlcyBhbmQgY29uc3RhbnRzIGRlZmluaXRpb25zLgotICAvLy8KLSAgSmF2YUNvbnN0YW50UG9vbChDbGFzcyosIFJlYWRlciYgcmVhZGVyLCB1aW50MzIgY3RwU2l6ZSk7Ci0KLSAgLy8vIH5KYXZhQ29uc3RhbnRQb29sIC0gRGVsZXRlIHRoZSBjb25zdGFudCBwb29sLgotICAvLy8KLSAgfkphdmFDb25zdGFudFBvb2woKSB7fQotfTsKLQotfSAvLyBlbmQgbmFtZXNwYWNlIGozCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL0ozL1ZNQ29yZS9KYXZhTWV0YUpJVC5jcHAgYi92bWtpdC9saWIvSjMvVk1Db3JlL0phdmFNZXRhSklULmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFkYjhiMi4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvSjMvVk1Db3JlL0phdmFNZXRhSklULmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vLz09PS0tLS0tIEphdmFNZXRhSklULmNwcCAtIENhbGluZyBKYXZhIG1ldGhvZHMgZnJvbSBuYXRpdmUgY29kZSAtLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgPGNzdGRhcmc+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxqbmkuaD4KLQotI2luY2x1ZGUgImRlYnVnLmgiCi0KLSNpbmNsdWRlICJKYXZhQ2xhc3MuaCIKLSNpbmNsdWRlICJKYXZhT2JqZWN0LmgiCi0jaW5jbHVkZSAiSmF2YVRocmVhZC5oIgotI2luY2x1ZGUgIkphdmFUeXBlcy5oIgotI2luY2x1ZGUgIkphdmFVcGNhbGxzLmgiCi0jaW5jbHVkZSAiSm5qdm0uaCIKLQotdXNpbmcgbmFtZXNwYWNlIGozOwotCi0KLSNkZWZpbmUgcmVhZEFyZ3MoYnVmLCBzaWduYXR1cmUsIGFwLCBqbmkpIHsgXAotICBqdmFsdWUqIGJ1ZmZlciA9IChqdmFsdWUqKWJ1ZjsgXAotICBUeXBlZGVmKiBjb25zdCogYXJndW1lbnRzID0gc2lnbmF0dXJlLT5nZXRBcmd1bWVudHNUeXBlKCk7IFwKLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBzaWduYXR1cmUtPm5iQXJndW1lbnRzOyArK2kpIHsgXAotICAgIGNvbnN0IFR5cGVkZWYqIHR5cGUgPSBhcmd1bWVudHNbaV07XAotICAgIGlmICh0eXBlLT5pc1ByaW1pdGl2ZSgpKSB7XAotICAgICAgY29uc3QgUHJpbWl0aXZlVHlwZWRlZiogcHJpbSA9IChjb25zdCBQcmltaXRpdmVUeXBlZGVmKil0eXBlO1wKLSAgICAgIGlmIChwcmltLT5pc0xvbmcoKSkge1wKLSAgICAgICAgYnVmZmVyW2ldLmogPSB2YV9hcmcoYXAsIHNpbnQ2NCk7XAotICAgICAgfSBlbHNlIGlmIChwcmltLT5pc0ludCgpKXsgXAotICAgICAgICBidWZmZXJbaV0uaSA9IHZhX2FyZyhhcCwgc2ludDMyKTtcCi0gICAgICB9IGVsc2UgaWYgKHByaW0tPmlzQ2hhcigpKSB7IFwKLSAgICAgICAgYnVmZmVyW2ldLmMgPSB2YV9hcmcoYXAsIHVpbnQzMik7XAotICAgICAgfSBlbHNlIGlmIChwcmltLT5pc1Nob3J0KCkpIHsgXAotICAgICAgICBidWZmZXJbaV0ucyA9IHZhX2FyZyhhcCwgc2ludDMyKTtcCi0gICAgICB9IGVsc2UgaWYgKHByaW0tPmlzQnl0ZSgpKSB7IFwKLSAgICAgICAgYnVmZmVyW2ldLmIgPSB2YV9hcmcoYXAsIHNpbnQzMik7XAotICAgICAgfSBlbHNlIGlmIChwcmltLT5pc0Jvb2woKSkgeyBcCi0gICAgICAgIGJ1ZmZlcltpXS56ID0gdmFfYXJnKGFwLCB1aW50MzIpO1wKLSAgICAgIH0gZWxzZSBpZiAocHJpbS0+aXNGbG9hdCgpKSB7XAotICAgICAgICBidWZmZXJbaV0uZiA9IChmbG9hdCl2YV9hcmcoYXAsIGRvdWJsZSk7XAotICAgICAgfSBlbHNlIGlmIChwcmltLT5pc0RvdWJsZSgpKSB7XAotICAgICAgICBidWZmZXJbaV0uZCA9IHZhX2FyZyhhcCwgZG91YmxlKTtcCi0gICAgICB9IGVsc2Uge1wKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCBoYXBwZW4iKTtcCi0gICAgICAgIGFib3J0KCk7XAotICAgICAgfVwKLSAgICB9IGVsc2V7XAotICAgICAgYnVmZmVyW2ldLmwgPSByZWludGVycHJldF9jYXN0PGpvYmplY3Q+KHZhX2FyZyhhcCwgSmF2YU9iamVjdCoqKSk7XAotICAgIH1cCi0gIH1cCi19Ci0gIAotI2lmIGRlZmluZWQoRFdBUkZfRVhDRVBUSU9OUykKLQotI2RlZmluZSBET19UUlkgdHJ5IHsKLSNkZWZpbmUgRE9fQ0FUQ0ggfSBjYXRjaCguLi4pIHsgdGgtPnRocm93RnJvbUphdmEoKTsgfSBcCi0KLSNlbHNlCi0KLSNkZWZpbmUgRE9fVFJZCi0jZGVmaW5lIERPX0NBVENIIGlmICh0aC0+bXV0LT5nZXRQZW5kaW5nRXhjZXB0aW9uKCkpIHsgdGgtPnRocm93RnJvbUphdmEoKTsgfQotCi0jZW5kaWYKLQotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vIFdlIGRvIG5vdCBuZWVkIHRvIGhhdmUgc3BlY2lhbCBjYXJlIG9uIHRoZSBHQy1wb2ludGVycyBpbiB0aGUgYnVmZmVyCi0vLyBtYW5pcHVsYXRlZCBpbiB0aGVzZSBmdW5jdGlvbnMgYmVjYXVzZSB0aGUgb2JqZWN0cyBpbiB0aGUgYnVmZmVyIGFyZQotLy8gYWRkcmVzc2VkIGFuZCBuZXZlciBzdG9yZWQgZGlyZWN0bHkuCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWYgMSAvLyBWQV9BUkdTIGRvIG5vdCB3b3JrIG9uIGFsbCBwbGF0Zm9ybXMgZm9yIExMVk0uCi0jZGVmaW5lIElOVk9LRV9BUChUWVBFLCBUWVBFX05BTUUsIEZVTkNfVFlQRV9WSVJUVUFMX0FQLCBGVU5DX1RZUEVfU1RBVElDX0FQLCBGVU5DX1RZUEVfVklSVFVBTF9CVUYsIEZVTkNfVFlQRV9TVEFUSUNfQlVGKSBcCi1cCi1UWVBFIEphdmFNZXRob2Q6Omludm9rZSMjVFlQRV9OQU1FIyNWaXJ0dWFsQVAoVXNlckNsYXNzKiBjbCwgSmF2YU9iamVjdCogb2JqLCB2YV9saXN0IGFwKSB7IFwKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsgXAotICB2ZXJpZnlOdWxsKG9iaik7IFwKLSAgU2lnbmRlZiogc2lnbiA9IGdldFNpZ25hdHVyZSgpOyBcCi0gIG12bTo6VGhyZWFkQWxsb2NhdG9yIGFsbG9jYXRvcjsgXAotICBqdmFsdWUqIGJ1ZiA9IChqdmFsdWUqKWFsbG9jYXRvci5BbGxvY2F0ZShzaWduLT5uYkFyZ3VtZW50cyAqIHNpemVvZihqdmFsdWUpKTsgXAotICByZWFkQXJncyhidWYsIHNpZ24sIGFwLCBqbmkpOyBcCi0gIHJldHVybiBpbnZva2UjI1RZUEVfTkFNRSMjVmlydHVhbEJ1ZihjbCwgb2JqLCBidWYpOyBcCi19XAotXAotVFlQRSBKYXZhTWV0aG9kOjppbnZva2UjI1RZUEVfTkFNRSMjU3BlY2lhbEFQKFVzZXJDbGFzcyogY2wsIEphdmFPYmplY3QqIG9iaiwgdmFfbGlzdCBhcCkge1wKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsgXAotICB2ZXJpZnlOdWxsKG9iaik7IFwKLSAgU2lnbmRlZiogc2lnbiA9IGdldFNpZ25hdHVyZSgpOyBcCi0gIG12bTo6VGhyZWFkQWxsb2NhdG9yIGFsbG9jYXRvcjsgXAotICBqdmFsdWUqIGJ1ZiA9IChqdmFsdWUqKWFsbG9jYXRvci5BbGxvY2F0ZShzaWduLT5uYkFyZ3VtZW50cyAqIHNpemVvZihqdmFsdWUpKTsgXAotICByZWFkQXJncyhidWYsIHNpZ24sIGFwLCBqbmkpOyBcCi0gIHJldHVybiBpbnZva2UjI1RZUEVfTkFNRSMjU3BlY2lhbEJ1ZihjbCwgb2JqLCBidWYpOyBcCi19XAotXAotVFlQRSBKYXZhTWV0aG9kOjppbnZva2UjI1RZUEVfTkFNRSMjU3RhdGljQVAoVXNlckNsYXNzKiBjbCwgdmFfbGlzdCBhcCkge1wKLSAgU2lnbmRlZiogc2lnbiA9IGdldFNpZ25hdHVyZSgpOyBcCi0gIG12bTo6VGhyZWFkQWxsb2NhdG9yIGFsbG9jYXRvcjsgXAotICBqdmFsdWUqIGJ1ZiA9IChqdmFsdWUqKWFsbG9jYXRvci5BbGxvY2F0ZShzaWduLT5uYkFyZ3VtZW50cyAqIHNpemVvZihqdmFsdWUpKTsgXAotICByZWFkQXJncyhidWYsIHNpZ24sIGFwLCBqbmkpOyBcCi0gIHJldHVybiBpbnZva2UjI1RZUEVfTkFNRSMjU3RhdGljQnVmKGNsLCBidWYpOyBcCi19Ci0KLSNlbHNlCi0KLSNkZWZpbmUgSU5WT0tFX0FQKFRZUEUsIFRZUEVfTkFNRSwgRlVOQ19UWVBFX1ZJUlRVQUxfQVAsIEZVTkNfVFlQRV9TVEFUSUNfQVAsIEZVTkNfVFlQRV9WSVJUVUFMX0JVRiwgRlVOQ19UWVBFX1NUQVRJQ19CVUYpIFwKLVRZUEUgSmF2YU1ldGhvZDo6aW52b2tlIyNUWVBFX05BTUUjI1ZpcnR1YWxBUChVc2VyQ2xhc3MqIGNsLCBKYXZhT2JqZWN0KiBvYmosIHZhX2xpc3QgYXApIHsgXAotICBsbHZtX2djcm9vdChvYmosIDApOyBcCi0gIHZlcmlmeU51bGwob2JqKTsgXAotICBVc2VyQ2xhc3MqIG9iakNsID0gSmF2YU9iamVjdDo6Z2V0Q2xhc3Mob2JqKS0+aXNBcnJheSgpID8gSmF2YU9iamVjdDo6Z2V0Q2xhc3Mob2JqKS0+c3VwZXIgOiBKYXZhT2JqZWN0OjpnZXRDbGFzcyhvYmopLT5hc0NsYXNzKCk7IFwKLSAgaWYgKG9iakNsID09IGNsYXNzRGVmIHx8IGlzRmluYWwoYWNjZXNzKSkgeyBcCi0gICAgbWV0aCA9IHRoaXM7IFwKLSAgfSBlbHNlIHsgXAotICAgIG1ldGggPSBvYmpDbC0+bG9va3VwTWV0aG9kRG9udFRocm93KG5hbWUsIHR5cGUsIGZhbHNlLCB0cnVlLCAmY2wpOyBcCi0gIH0gXAotICBhc3NlcnQobWV0aCAmJiAiTm8gbWV0aG9kIGZvdW5kIik7IFwKLSAgdm9pZCogZnVuYyA9IG1ldGgtPmNvbXBpbGVkUHRyKCk7IFwKLSAgU2lnbmRlZiogc2lnbiA9IGdldFNpZ25hdHVyZSgpOyBcCi0gIEZVTkNfVFlQRV9WSVJUVUFMX0FQIGNhbGwgPSAoRlVOQ19UWVBFX1ZJUlRVQUxfQVApc2lnbi0+Z2V0VmlydHVhbENhbGxBUCgpOyBcCi0gIEphdmFUaHJlYWQqIHRoID0gSmF2YVRocmVhZDo6Z2V0KCk7IFwKLSAgdGgtPnN0YXJ0SmF2YSgpOyBcCi0gIFRZUEUgcmVzID0gMDsgXAotICBET19UUlkgXAotICByZXMgPSBjYWxsKGNsLT5nZXRDb25zdGFudFBvb2woKSwgZnVuYywgb2JqLCBhcCk7XAotICBET19DQVRDSCBcCi0gIHRoLT5lbmRKYXZhKCk7IFwKLSAgcmV0dXJuIHJlczsgXAotfVwKLVwKLVRZUEUgSmF2YU1ldGhvZDo6aW52b2tlIyNUWVBFX05BTUUjI1NwZWNpYWxBUChVc2VyQ2xhc3MqIGNsLCBKYXZhT2JqZWN0KiBvYmosIHZhX2xpc3QgYXApIHtcCi0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7IFwKLSAgdmVyaWZ5TnVsbChvYmopO1wKLSAgdm9pZCogZnVuYyA9IHRoaXMtPmNvbXBpbGVkUHRyKCk7XAotICBTaWduZGVmKiBzaWduID0gZ2V0U2lnbmF0dXJlKCk7IFwKLSAgRlVOQ19UWVBFX1ZJUlRVQUxfQVAgY2FsbCA9IChGVU5DX1RZUEVfVklSVFVBTF9BUClzaWduLT5nZXRWaXJ0dWFsQ2FsbEFQKCk7IFwKLSAgSmF2YVRocmVhZCogdGggPSBKYXZhVGhyZWFkOjpnZXQoKTsgXAotICB0aC0+c3RhcnRKYXZhKCk7IFwKLSAgVFlQRSByZXMgPSAwOyBcCi0gIERPX1RSWSBcCi0gIHJlcyA9IGNhbGwoY2wtPmdldENvbnN0YW50UG9vbCgpLCBmdW5jLCBvYmosIGFwKTtcCi0gIERPX0NBVENIIFwKLSAgdGgtPmVuZEphdmEoKTsgXAotICByZXR1cm4gcmVzOyBcCi19XAotXAotVFlQRSBKYXZhTWV0aG9kOjppbnZva2UjI1RZUEVfTkFNRSMjU3RhdGljQVAoVXNlckNsYXNzKiBjbCwgdmFfbGlzdCBhcCkge1wKLSAgaWYgKCFjbC0+aXNSZWFkeSgpKSB7IFwKLSAgICBjbC0+cmVzb2x2ZUNsYXNzKCk7IFwKLSAgICBjbC0+aW5pdGlhbGlzZUNsYXNzKCk7IFwKLSAgfSBcCi0gIFwKLSAgdm9pZCogZnVuYyA9IHRoaXMtPmNvbXBpbGVkUHRyKCk7XAotICBTaWduZGVmKiBzaWduID0gZ2V0U2lnbmF0dXJlKCk7IFwKLSAgRlVOQ19UWVBFX1NUQVRJQ19BUCBjYWxsID0gKEZVTkNfVFlQRV9TVEFUSUNfQVApc2lnbi0+Z2V0U3RhdGljQ2FsbEFQKCk7IFwKLSAgSmF2YVRocmVhZCogdGggPSBKYXZhVGhyZWFkOjpnZXQoKTsgXAotICB0aC0+c3RhcnRKYXZhKCk7IFwKLSAgVFlQRSByZXMgPSAwOyBcCi0gIERPX1RSWSBcCi0gIHJlcyA9IGNhbGwoY2wtPmdldENvbnN0YW50UG9vbCgpLCBmdW5jLCBhcCk7XAotICBET19DQVRDSCBcCi0gIHRoLT5lbmRKYXZhKCk7IFwKLSAgcmV0dXJuIHJlczsgXAotfQotCi0jZW5kaWYKLQotI2RlZmluZSBJTlZPS0VfQlVGKFRZUEUsIFRZUEVfTkFNRSwgRlVOQ19UWVBFX1ZJUlRVQUxfQVAsIEZVTkNfVFlQRV9TVEFUSUNfQVAsIEZVTkNfVFlQRV9WSVJUVUFMX0JVRiwgRlVOQ19UWVBFX1NUQVRJQ19CVUYpIFwKLVRZUEUgSmF2YU1ldGhvZDo6aW52b2tlIyNUWVBFX05BTUUjI1ZpcnR1YWxCdWYoVXNlckNsYXNzKiBjbCwgSmF2YU9iamVjdCogb2JqLCB2b2lkKiBidWYpIHtcCi0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7IFwKLSAgdmVyaWZ5TnVsbChvYmopO1wKLSAgU2lnbmRlZiogc2lnbiA9IGdldFNpZ25hdHVyZSgpOyBcCi0gIFVzZXJDbGFzcyogb2JqQ2wgPSBKYXZhT2JqZWN0OjpnZXRDbGFzcyhvYmopLT5pc0FycmF5KCkgPyBKYXZhT2JqZWN0OjpnZXRDbGFzcyhvYmopLT5zdXBlciA6IEphdmFPYmplY3Q6OmdldENsYXNzKG9iaiktPmFzQ2xhc3MoKTsgXAotICBKYXZhTWV0aG9kKiBtZXRoID0gTlVMTDsgXAotICBpZiAob2JqQ2wgPT0gY2xhc3NEZWYgfHwgaXNGaW5hbChhY2Nlc3MpKSB7IFwKLSAgICBtZXRoID0gdGhpczsgXAotICB9IGVsc2UgeyBcCi0gICAgbWV0aCA9IG9iakNsLT5sb29rdXBNZXRob2REb250VGhyb3cobmFtZSwgdHlwZSwgZmFsc2UsIHRydWUsICZjbCk7IFwKLSAgfSBcCi0gIGFzc2VydChtZXRoICYmICJObyBtZXRob2QgZm91bmQiKTsgXAotICBhc3NlcnQob2JqQ2wtPmlzQXNzaWduYWJsZUZyb20obWV0aC0+Y2xhc3NEZWYpICYmICJXcm9uZyB0eXBlIik7IFwKLSAgdm9pZCogZnVuYyA9IG1ldGgtPmNvbXBpbGVkUHRyKCk7IFwKLSAgRlVOQ19UWVBFX1ZJUlRVQUxfQlVGIGNhbGwgPSAoRlVOQ19UWVBFX1ZJUlRVQUxfQlVGKXNpZ24tPmdldFZpcnR1YWxDYWxsQnVmKCk7IFwKLSAgSmF2YVRocmVhZCogdGggPSBKYXZhVGhyZWFkOjpnZXQoKTsgXAotICB0aC0+c3RhcnRKYXZhKCk7IFwKLSAgVFlQRSByZXMgPSAwOyBcCi0gIERPX1RSWSBcCi0gIHJlcyA9IGNhbGwoY2wtPmdldENvbnN0YW50UG9vbCgpLCBmdW5jLCBvYmosIGJ1Zik7XAotICBET19DQVRDSCBcCi0gIHRoLT5lbmRKYXZhKCk7IFwKLSAgcmV0dXJuIHJlczsgXAotfVwKLVRZUEUgSmF2YU1ldGhvZDo6aW52b2tlIyNUWVBFX05BTUUjI1NwZWNpYWxCdWYoVXNlckNsYXNzKiBjbCwgSmF2YU9iamVjdCogb2JqLCB2b2lkKiBidWYpIHtcCi0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7IFwKLSAgdmVyaWZ5TnVsbChvYmopO1wKLSAgdm9pZCogZnVuYyA9IHRoaXMtPmNvbXBpbGVkUHRyKCk7XAotICBTaWduZGVmKiBzaWduID0gZ2V0U2lnbmF0dXJlKCk7IFwKLSAgRlVOQ19UWVBFX1ZJUlRVQUxfQlVGIGNhbGwgPSAoRlVOQ19UWVBFX1ZJUlRVQUxfQlVGKXNpZ24tPmdldFZpcnR1YWxDYWxsQnVmKCk7IFwKLSAgSmF2YVRocmVhZCogdGggPSBKYXZhVGhyZWFkOjpnZXQoKTsgXAotICB0aC0+c3RhcnRKYXZhKCk7IFwKLSAgVFlQRSByZXMgPSAwOyBcCi0gIERPX1RSWSBcCi0gIHJlcyA9IGNhbGwoY2wtPmdldENvbnN0YW50UG9vbCgpLCBmdW5jLCBvYmosIGJ1Zik7XAotICBET19DQVRDSCBcCi0gIHRoLT5lbmRKYXZhKCk7IFwKLSAgcmV0dXJuIHJlczsgXAotfVwKLVwKLVRZUEUgSmF2YU1ldGhvZDo6aW52b2tlIyNUWVBFX05BTUUjI1N0YXRpY0J1ZihVc2VyQ2xhc3MqIGNsLCB2b2lkKiBidWYpIHtcCi0gIGlmICghY2wtPmlzUmVhZHkoKSkgeyBcCi0gICAgY2wtPnJlc29sdmVDbGFzcygpOyBcCi0gICAgY2wtPmluaXRpYWxpc2VDbGFzcygpOyBcCi0gIH0gXAotICBcCi0gIHZvaWQqIGZ1bmMgPSB0aGlzLT5jb21waWxlZFB0cigpO1wKLSAgU2lnbmRlZiogc2lnbiA9IGdldFNpZ25hdHVyZSgpOyBcCi0gIEZVTkNfVFlQRV9TVEFUSUNfQlVGIGNhbGwgPSAoRlVOQ19UWVBFX1NUQVRJQ19CVUYpc2lnbi0+Z2V0U3RhdGljQ2FsbEJ1ZigpOyBcCi0gIEphdmFUaHJlYWQqIHRoID0gSmF2YVRocmVhZDo6Z2V0KCk7IFwKLSAgdGgtPnN0YXJ0SmF2YSgpOyBcCi0gIFRZUEUgcmVzID0gMDsgXAotICBET19UUlkgXAotICByZXMgPSBjYWxsKGNsLT5nZXRDb25zdGFudFBvb2woKSwgZnVuYywgYnVmKTtcCi0gIERPX0NBVENIIFwKLSAgdGgtPmVuZEphdmEoKTsgXAotICByZXR1cm4gcmVzOyBcCi19XAotCi0jZGVmaW5lIElOVk9LRV9WQShUWVBFLCBUWVBFX05BTUUsIEZVTkNfVFlQRV9WSVJUVUFMX0FQLCBGVU5DX1RZUEVfU1RBVElDX0FQLCBGVU5DX1RZUEVfVklSVFVBTF9CVUYsIEZVTkNfVFlQRV9TVEFUSUNfQlVGKSBcCi1UWVBFIEphdmFNZXRob2Q6Omludm9rZSMjVFlQRV9OQU1FIyNWaXJ0dWFsKFVzZXJDbGFzcyogY2wsIEphdmFPYmplY3QqIG9iaiwgLi4uKSB7IFwKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsgXAotICB2YV9saXN0IGFwO1wKLSAgdmFfc3RhcnQoYXAsIG9iaik7XAotICBUWVBFIHJlcyA9IGludm9rZSMjVFlQRV9OQU1FIyNWaXJ0dWFsQVAoY2wsIG9iaiwgYXApO1wKLSAgdmFfZW5kKGFwKTsgXAotICByZXR1cm4gcmVzOyBcCi19XAotXAotVFlQRSBKYXZhTWV0aG9kOjppbnZva2UjI1RZUEVfTkFNRSMjU3BlY2lhbChVc2VyQ2xhc3MqIGNsLCBKYXZhT2JqZWN0KiBvYmosIC4uLikge1wKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsgXAotICB2YV9saXN0IGFwO1wKLSAgdmFfc3RhcnQoYXAsIG9iaik7XAotICBUWVBFIHJlcyA9IGludm9rZSMjVFlQRV9OQU1FIyNTcGVjaWFsQVAoY2wsIG9iaiwgYXApO1wKLSAgdmFfZW5kKGFwKTsgXAotICByZXR1cm4gcmVzOyBcCi19XAotXAotVFlQRSBKYXZhTWV0aG9kOjppbnZva2UjI1RZUEVfTkFNRSMjU3RhdGljKFVzZXJDbGFzcyogY2wsIC4uLikge1wKLSAgdmFfbGlzdCBhcDtcCi0gIHZhX3N0YXJ0KGFwLCBjbCk7XAotICBUWVBFIHJlcyA9IGludm9rZSMjVFlQRV9OQU1FIyNTdGF0aWNBUChjbCwgYXApO1wKLSAgdmFfZW5kKGFwKTsgXAotICByZXR1cm4gcmVzOyBcCi19XAotCi0jZGVmaW5lIElOVk9LRShUWVBFLCBUWVBFX05BTUUsIEZVTkNfVFlQRV9WSVJUVUFMX0FQLCBGVU5DX1RZUEVfU1RBVElDX0FQLCBGVU5DX1RZUEVfVklSVFVBTF9CVUYsIEZVTkNfVFlQRV9TVEFUSUNfQlVGKSBcCi0gIElOVk9LRV9BUChUWVBFLCBUWVBFX05BTUUsIEZVTkNfVFlQRV9WSVJUVUFMX0FQLCBGVU5DX1RZUEVfU1RBVElDX0FQLCBGVU5DX1RZUEVfVklSVFVBTF9CVUYsIEZVTkNfVFlQRV9TVEFUSUNfQlVGKSBcCi0gIElOVk9LRV9CVUYoVFlQRSwgVFlQRV9OQU1FLCBGVU5DX1RZUEVfVklSVFVBTF9BUCwgRlVOQ19UWVBFX1NUQVRJQ19BUCwgRlVOQ19UWVBFX1ZJUlRVQUxfQlVGLCBGVU5DX1RZUEVfU1RBVElDX0JVRikgXAotICBJTlZPS0VfVkEoVFlQRSwgVFlQRV9OQU1FLCBGVU5DX1RZUEVfVklSVFVBTF9BUCwgRlVOQ19UWVBFX1NUQVRJQ19BUCwgRlVOQ19UWVBFX1ZJUlRVQUxfQlVGLCBGVU5DX1RZUEVfU1RBVElDX0JVRikKLQotdHlwZWRlZiB1aW50MzIgKCp1aW50MzJfdmlydHVhbF9hcCkoVXNlckNvbnN0YW50UG9vbCosIHZvaWQqLCBKYXZhT2JqZWN0KiwgdmFfbGlzdCk7Ci10eXBlZGVmIHNpbnQ2NCAoKnNpbnQ2NF92aXJ0dWFsX2FwKShVc2VyQ29uc3RhbnRQb29sKiwgdm9pZCosIEphdmFPYmplY3QqLCB2YV9saXN0KTsKLXR5cGVkZWYgZmxvYXQgICgqZmxvYXRfdmlydHVhbF9hcCkoVXNlckNvbnN0YW50UG9vbCosIHZvaWQqLCBKYXZhT2JqZWN0KiwgdmFfbGlzdCk7Ci10eXBlZGVmIGRvdWJsZSAoKmRvdWJsZV92aXJ0dWFsX2FwKShVc2VyQ29uc3RhbnRQb29sKiwgdm9pZCosIEphdmFPYmplY3QqLCB2YV9saXN0KTsKLXR5cGVkZWYgSmF2YU9iamVjdCogKCpvYmplY3RfdmlydHVhbF9hcCkoVXNlckNvbnN0YW50UG9vbCosIHZvaWQqLCBKYXZhT2JqZWN0KiwgdmFfbGlzdCk7Ci0KLXR5cGVkZWYgdWludDMyICgqdWludDMyX3N0YXRpY19hcCkoVXNlckNvbnN0YW50UG9vbCosIHZvaWQqLCB2YV9saXN0KTsKLXR5cGVkZWYgc2ludDY0ICgqc2ludDY0X3N0YXRpY19hcCkoVXNlckNvbnN0YW50UG9vbCosIHZvaWQqLCB2YV9saXN0KTsKLXR5cGVkZWYgZmxvYXQgICgqZmxvYXRfc3RhdGljX2FwKShVc2VyQ29uc3RhbnRQb29sKiwgdm9pZCosIHZhX2xpc3QpOwotdHlwZWRlZiBkb3VibGUgKCpkb3VibGVfc3RhdGljX2FwKShVc2VyQ29uc3RhbnRQb29sKiwgdm9pZCosIHZhX2xpc3QpOwotdHlwZWRlZiBKYXZhT2JqZWN0KiAoKm9iamVjdF9zdGF0aWNfYXApKFVzZXJDb25zdGFudFBvb2wqLCB2b2lkKiwgdmFfbGlzdCk7Ci0KLXR5cGVkZWYgdWludDMyICgqdWludDMyX3ZpcnR1YWxfYnVmKShVc2VyQ29uc3RhbnRQb29sKiwgdm9pZCosIEphdmFPYmplY3QqLCB2b2lkKik7Ci10eXBlZGVmIHNpbnQ2NCAoKnNpbnQ2NF92aXJ0dWFsX2J1ZikoVXNlckNvbnN0YW50UG9vbCosIHZvaWQqLCBKYXZhT2JqZWN0Kiwgdm9pZCopOwotdHlwZWRlZiBmbG9hdCAgKCpmbG9hdF92aXJ0dWFsX2J1ZikoVXNlckNvbnN0YW50UG9vbCosIHZvaWQqLCBKYXZhT2JqZWN0Kiwgdm9pZCopOwotdHlwZWRlZiBkb3VibGUgKCpkb3VibGVfdmlydHVhbF9idWYpKFVzZXJDb25zdGFudFBvb2wqLCB2b2lkKiwgSmF2YU9iamVjdCosIHZvaWQqKTsKLXR5cGVkZWYgSmF2YU9iamVjdCogKCpvYmplY3RfdmlydHVhbF9idWYpKFVzZXJDb25zdGFudFBvb2wqLCB2b2lkKiwgSmF2YU9iamVjdCosIHZvaWQqKTsKLQotdHlwZWRlZiB1aW50MzIgKCp1aW50MzJfc3RhdGljX2J1ZikoVXNlckNvbnN0YW50UG9vbCosIHZvaWQqLCB2b2lkKik7Ci10eXBlZGVmIHNpbnQ2NCAoKnNpbnQ2NF9zdGF0aWNfYnVmKShVc2VyQ29uc3RhbnRQb29sKiwgdm9pZCosIHZvaWQqKTsKLXR5cGVkZWYgZmxvYXQgICgqZmxvYXRfc3RhdGljX2J1ZikoVXNlckNvbnN0YW50UG9vbCosIHZvaWQqLCB2b2lkKik7Ci10eXBlZGVmIGRvdWJsZSAoKmRvdWJsZV9zdGF0aWNfYnVmKShVc2VyQ29uc3RhbnRQb29sKiwgdm9pZCosIHZvaWQqKTsKLXR5cGVkZWYgSmF2YU9iamVjdCogKCpvYmplY3Rfc3RhdGljX2J1ZikoVXNlckNvbnN0YW50UG9vbCosIHZvaWQqLCB2b2lkKik7Ci0KLUlOVk9LRSh1aW50MzIsIEludCwgdWludDMyX3ZpcnR1YWxfYXAsIHVpbnQzMl9zdGF0aWNfYXAsIHVpbnQzMl92aXJ0dWFsX2J1ZiwgdWludDMyX3N0YXRpY19idWYpCi1JTlZPS0Uoc2ludDY0LCBMb25nLCBzaW50NjRfdmlydHVhbF9hcCwgc2ludDY0X3N0YXRpY19hcCwgc2ludDY0X3ZpcnR1YWxfYnVmLCBzaW50NjRfc3RhdGljX2J1ZikKLUlOVk9LRShmbG9hdCwgIEZsb2F0LCBmbG9hdF92aXJ0dWFsX2FwLCAgZmxvYXRfc3RhdGljX2FwLCAgZmxvYXRfdmlydHVhbF9idWYsICBmbG9hdF9zdGF0aWNfYnVmKQotSU5WT0tFKGRvdWJsZSwgRG91YmxlLCBkb3VibGVfdmlydHVhbF9hcCwgZG91YmxlX3N0YXRpY19hcCwgZG91YmxlX3ZpcnR1YWxfYnVmLCBkb3VibGVfc3RhdGljX2J1ZikKLUlOVk9LRShKYXZhT2JqZWN0KiwgSmF2YU9iamVjdCwgb2JqZWN0X3ZpcnR1YWxfYXAsIG9iamVjdF9zdGF0aWNfYXAsIG9iamVjdF92aXJ0dWFsX2J1Ziwgb2JqZWN0X3N0YXRpY19idWYpCmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvVk1Db3JlL0phdmFPYmplY3QuY3BwIGIvdm1raXQvbGliL0ozL1ZNQ29yZS9KYXZhT2JqZWN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMxZjU0Ni4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvSjMvVk1Db3JlL0phdmFPYmplY3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0gSmF2YU9iamVjdC5jcHAgLSBKYXZhIG9iamVjdCBkZWZpbml0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSAibXZtL1RocmVhZHMvTG9ja3MuaCIKLQotI2luY2x1ZGUgIkphdmFDbGFzcy5oIgotI2luY2x1ZGUgIkphdmFPYmplY3QuaCIKLSNpbmNsdWRlICJKYXZhVGhyZWFkLmgiCi0jaW5jbHVkZSAiSmF2YVR5cGVzLmgiCi0jaW5jbHVkZSAiSmF2YVVwY2FsbHMuaCIKLSNpbmNsdWRlICJKbmp2bS5oIgotCi0jaW5jbHVkZSA8am5pLmg+Ci0jaW5jbHVkZSAiZGVidWcuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGozOwotCi1zdGF0aWMgY29uc3QgaW50IGhhc2hDb2RlSW5jcmVtZW50ID0gbXZtOjpHQ0JpdE1hc2sgKyAxOwotdWludDE2X3QgSmF2YU9iamVjdDo6aGFzaENvZGVHZW5lcmF0b3IgPSBoYXNoQ29kZUluY3JlbWVudDsKLXN0YXRpYyBjb25zdCB1aW50NjRfdCBIYXNoTWFzayA9ICgoMSA8PCBtdm06Okhhc2hCaXRzKSAtIDEpIDw8IG12bTo6R0NCaXRzOwotCi0KLS8vLyBoYXNoQ29kZSAtIFJldHVybiB0aGUgaGFzaCBjb2RlIG9mIHRoaXMgb2JqZWN0LgotdWludDMyX3QgSmF2YU9iamVjdDo6aGFzaENvZGUoSmF2YU9iamVjdCogc2VsZikgewotICBsbHZtX2djcm9vdChzZWxmLCAwKTsKLSAgaWYgKCFtdm06Ok1vdmVzT2JqZWN0KSByZXR1cm4gKHVpbnQzMl90KShsb25nKXNlbGY7Ci0gIGFzc2VydChIYXNoTWFzayAhPSAwKTsKLSAgYXNzZXJ0KG12bTo6SGFzaEJpdHMgIT0gMCk7Ci0KLSAgdWludHB0cl90IGhlYWRlciA9IHNlbGYtPmhlYWRlcjsKLSAgdWludHB0cl90IEdDQml0cyA9IGhlYWRlciAmIG12bTo6R0NCaXRNYXNrOwotICB1aW50cHRyX3QgdmFsID0gaGVhZGVyICYgSGFzaE1hc2s7Ci0gIGlmICh2YWwgIT0gMCkgewotICAgIHJldHVybiB2YWwgXiAodWludHB0cl90KWdldENsYXNzKHNlbGYpOwotICB9Ci0gIHZhbCA9IGhhc2hDb2RlR2VuZXJhdG9yOwotICBoYXNoQ29kZUdlbmVyYXRvciArPSBoYXNoQ29kZUluY3JlbWVudDsKLSAgdmFsID0gdmFsICYgSGFzaE1hc2s7Ci0gIGlmICh2YWwgPT0gMCkgewotICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgaW4gdGhlIHNhbWUgdGltZSwgYSB0aHJlYWQgaXMgaW4gdGhpcyBtZXRob2QgYW5kCi0gICAgLy8gZ2V0cyB0aGUgc2FtZSBoYXNoIGNvZGUgdmFsdWUgdGhhbiB0aGlzIHRocmVhZC4gVGhpcyBpcyBmaW5lLgotICAgIHZhbCA9IGhhc2hDb2RlSW5jcmVtZW50OwotICAgIGhhc2hDb2RlR2VuZXJhdG9yICs9IGhhc2hDb2RlSW5jcmVtZW50OwotICB9Ci0gIGFzc2VydCh2YWwgPiBtdm06OkdDQml0TWFzayk7Ci0gIGFzc2VydCh2YWwgPD0gSGFzaE1hc2spOwotCi0gIGRvIHsKLSAgICBoZWFkZXIgPSBzZWxmLT5oZWFkZXI7Ci0gICAgaWYgKChoZWFkZXIgJiBIYXNoTWFzaykgIT0gMCkgYnJlYWs7Ci0gICAgdWludHB0cl90IG5ld0hlYWRlciA9IGhlYWRlciB8IHZhbDsKLSAgICBhc3NlcnQoKG5ld0hlYWRlciAmIH5IYXNoTWFzaykgPT0gaGVhZGVyKTsKLSAgICBfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAoJihzZWxmLT5oZWFkZXIpLCBoZWFkZXIsIG5ld0hlYWRlcik7Ci0gIH0gd2hpbGUgKHRydWUpOwotCi0gIGFzc2VydCgoc2VsZi0+aGVhZGVyICYgSGFzaE1hc2spICE9IDApOwotICBhc3NlcnQoR0NCaXRzID09IChzZWxmLT5oZWFkZXIgJiBtdm06OkdDQml0TWFzaykpOwotICByZXR1cm4gKHNlbGYtPmhlYWRlciAmIEhhc2hNYXNrKSBeICh1aW50cHRyX3QpZ2V0Q2xhc3Moc2VsZik7Ci19Ci0KLQotdm9pZCBKYXZhT2JqZWN0Ojp3YWl0SW50ZXJuKAotICAgIEphdmFPYmplY3QqIHNlbGYsIHN0cnVjdCB0aW1ldmFsKiBpbmZvLCBib29sIHRpbWVkKSB7Ci0gIGxsdm1fZ2Nyb290KHNlbGYsIDApOwotICBKYXZhVGhyZWFkKiB0aHJlYWQgPSBKYXZhVGhyZWFkOjpnZXQoKTsKLSAgbXZtOjpMb2NrU3lzdGVtJiB0YWJsZSA9IHRocmVhZC0+Z2V0SlZNKCktPmxvY2tTeXN0ZW07Ci0KLSAgaWYgKCFvd25lcihzZWxmKSkgewotICAgIHRocmVhZC0+Z2V0SlZNKCktPmlsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24oc2VsZik7Ci0gICAgVU5SRUFDSEFCTEUoKTsKLSAgfQotCi0gIGJvb2wgaW50ZXJydXB0ZWQgPSB0aHJlYWQtPmxvY2tpbmdUaHJlYWQud2FpdChzZWxmLCB0YWJsZSwgaW5mbywgdGltZWQpOwotCi0gIGlmIChpbnRlcnJ1cHRlZCkgewotICAgIHRocmVhZC0+Z2V0SlZNKCktPmludGVycnVwdGVkRXhjZXB0aW9uKHNlbGYpOwotICAgIFVOUkVBQ0hBQkxFKCk7Ci0gIH0KLX0KLQotdm9pZCBKYXZhT2JqZWN0Ojp3YWl0KEphdmFPYmplY3QqIHNlbGYpIHsKLSAgbGx2bV9nY3Jvb3Qoc2VsZiwgMCk7Ci0gIHdhaXRJbnRlcm4oc2VsZiwgTlVMTCwgZmFsc2UpOwotfQotCi12b2lkIEphdmFPYmplY3Q6OnRpbWVkV2FpdChKYXZhT2JqZWN0KiBzZWxmLCBzdHJ1Y3QgdGltZXZhbCYgaW5mbykgewotICBsbHZtX2djcm9vdChzZWxmLCAwKTsKLSAgd2FpdEludGVybihzZWxmLCAmaW5mbywgdHJ1ZSk7Ci19Ci0KLXZvaWQgSmF2YU9iamVjdDo6bm90aWZ5KEphdmFPYmplY3QqIHNlbGYpIHsKLSAgbGx2bV9nY3Jvb3Qoc2VsZiwgMCk7Ci0gIEphdmFUaHJlYWQqIHRocmVhZCA9IEphdmFUaHJlYWQ6OmdldCgpOwotICBtdm06OkxvY2tTeXN0ZW0mIHRhYmxlID0gdGhyZWFkLT5nZXRKVk0oKS0+bG9ja1N5c3RlbTsKLQotICBpZiAoIW93bmVyKHNlbGYpKSB7Ci0gICAgdGhyZWFkLT5nZXRKVk0oKS0+aWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbihzZWxmKTsKLSAgICBVTlJFQUNIQUJMRSgpOwotICB9Ci0gIHRocmVhZC0+bG9ja2luZ1RocmVhZC5ub3RpZnkoc2VsZiwgdGFibGUpOwotfQotCi12b2lkIEphdmFPYmplY3Q6Om5vdGlmeUFsbChKYXZhT2JqZWN0KiBzZWxmKSB7Ci0gIGxsdm1fZ2Nyb290KHNlbGYsIDApOwotICBKYXZhVGhyZWFkKiB0aHJlYWQgPSBKYXZhVGhyZWFkOjpnZXQoKTsKLSAgbXZtOjpMb2NrU3lzdGVtJiB0YWJsZSA9IHRocmVhZC0+Z2V0SlZNKCktPmxvY2tTeXN0ZW07Ci0KLSAgaWYgKCFvd25lcihzZWxmKSkgewotICAgIHRocmVhZC0+Z2V0SlZNKCktPmlsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24oc2VsZik7Ci0gICAgVU5SRUFDSEFCTEUoKTsKLSAgfQotICB0aHJlYWQtPmxvY2tpbmdUaHJlYWQubm90aWZ5QWxsKHNlbGYsIHRhYmxlKTsKLX0KLQotdm9pZCBKYXZhT2JqZWN0OjpvdmVyZmxvd1RoaW5Mb2NrKEphdmFPYmplY3QqIHNlbGYpIHsKLSAgbGx2bV9nY3Jvb3Qoc2VsZiwgMCk7Ci0gIG12bTo6VGhpbkxvY2s6Om92ZXJmbG93VGhpbkxvY2soc2VsZiwgc2VsZi0+Z2V0SlZNKCktPmxvY2tTeXN0ZW0pOwotfQotCi12b2lkIEphdmFPYmplY3Q6OmFjcXVpcmUoSmF2YU9iamVjdCogc2VsZikgewotICBsbHZtX2djcm9vdChzZWxmLCAwKTsKLSAgbXZtOjpUaGluTG9jazo6YWNxdWlyZShzZWxmLCBzZWxmLT5nZXRKVk0oKS0+bG9ja1N5c3RlbSk7Ci19Ci0KLXZvaWQgSmF2YU9iamVjdDo6cmVsZWFzZShKYXZhT2JqZWN0KiBzZWxmKSB7Ci0gIGxsdm1fZ2Nyb290KHNlbGYsIDApOwotICBtdm06OlRoaW5Mb2NrOjpyZWxlYXNlKHNlbGYsIHNlbGYtPmdldEpWTSgpLT5sb2NrU3lzdGVtKTsKLX0KLQotYm9vbCBKYXZhT2JqZWN0Ojpvd25lcihKYXZhT2JqZWN0KiBzZWxmKSB7Ci0gIGxsdm1fZ2Nyb290KHNlbGYsIDApOwotICByZXR1cm4gbXZtOjpUaGluTG9jazo6b3duZXIoc2VsZiwgc2VsZi0+Z2V0SlZNKCktPmxvY2tTeXN0ZW0pOwotfQotCi12b2lkIEphdmFPYmplY3Q6OmRlY2Fwc3VsZVByaW1pdGl2ZShKYXZhT2JqZWN0KiBvYmosIGp2YWx1ZSogYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZWRlZiogc2lnbmF0dXJlKSB7Ci0KLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLQotCUpuanZtKiB2bSA9IG9iai0+Z2V0SlZNKCk7Ci0KLSAgaWYgKCFzaWduYXR1cmUtPmlzUHJpbWl0aXZlKCkpIHsKLSAgICBpZiAob2JqICYmICEoZ2V0Q2xhc3Mob2JqKS0+aXNPZlR5cGVOYW1lKHNpZ25hdHVyZS0+Z2V0TmFtZSgpKSkpIHsKLSAgICAgIHZtLT5pbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIndyb25nIHR5cGUgYXJndW1lbnQiKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotICB9IGVsc2UgaWYgKG9iaiA9PSBOVUxMKSB7Ci0gICAgdm0tPmlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiIik7Ci0gIH0gZWxzZSB7Ci0gICAgVXNlckNvbW1vbkNsYXNzKiBjbCA9IGdldENsYXNzKG9iaik7Ci0gICAgVXNlckNsYXNzUHJpbWl0aXZlKiB2YWx1ZSA9IGNsLT50b1ByaW1pdGl2ZSgpOwotICAgIGNvbnN0IFByaW1pdGl2ZVR5cGVkZWYqIHByaW0gPSAoY29uc3QgUHJpbWl0aXZlVHlwZWRlZiopc2lnbmF0dXJlOwotCi0gICAgaWYgKHZhbHVlID09IDApIHsKLSAgICAgIHZtLT5pbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIiIpOwotICAgIH0KLSAgICAKLSAgICBpZiAocHJpbS0+aXNTaG9ydCgpKSB7Ci0gICAgICBpZiAodmFsdWUgPT0gdm0tPnVwY2FsbHMtPk9mU2hvcnQpIHsKLSAgICAgICAgKCpidWYpLnMgPSB2bS0+dXBjYWxscy0+c2hvcnRWYWx1ZS0+Z2V0SW5zdGFuY2VJbnQxNkZpZWxkKG9iaik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gdm0tPnVwY2FsbHMtPk9mQnl0ZSkgewotICAgICAgICAoKmJ1ZikucyA9IChzaW50MTYpdm0tPnVwY2FsbHMtPmJ5dGVWYWx1ZS0+Z2V0SW5zdGFuY2VJbnQ4RmllbGQob2JqKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdm0tPmlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiIik7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChwcmltLT5pc0J5dGUoKSkgewotICAgICAgaWYgKHZhbHVlID09IHZtLT51cGNhbGxzLT5PZkJ5dGUpIHsKLSAgICAgICAgKCpidWYpLmIgPSB2bS0+dXBjYWxscy0+Ynl0ZVZhbHVlLT5nZXRJbnN0YW5jZUludDhGaWVsZChvYmopOwotICAgICAgICByZXR1cm47Ci0gICAgICB9IGVsc2UgewotICAgICAgICB2bS0+aWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCIiKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHByaW0tPmlzQm9vbCgpKSB7Ci0gICAgICBpZiAodmFsdWUgPT0gdm0tPnVwY2FsbHMtPk9mQm9vbCkgewotICAgICAgICAoKmJ1ZikueiA9IHZtLT51cGNhbGxzLT5ib29sVmFsdWUtPmdldEluc3RhbmNlSW50OEZpZWxkKG9iaik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHZtLT5pbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIiIpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocHJpbS0+aXNJbnQoKSkgewotICAgICAgaWYgKHZhbHVlID09IHZtLT51cGNhbGxzLT5PZkludCkgewotICAgICAgICAoKmJ1ZikuaSA9IHZtLT51cGNhbGxzLT5pbnRWYWx1ZS0+Z2V0SW5zdGFuY2VJbnQzMkZpZWxkKG9iaik7Ci0gICAgICB9IGVsc2UgaWYgKHZhbHVlID09IHZtLT51cGNhbGxzLT5PZkJ5dGUpIHsKLSAgICAgICAgKCpidWYpLmkgPSAoc2ludDMyKXZtLT51cGNhbGxzLT5ieXRlVmFsdWUtPmdldEluc3RhbmNlSW50OEZpZWxkKG9iaik7Ci0gICAgICB9IGVsc2UgaWYgKHZhbHVlID09IHZtLT51cGNhbGxzLT5PZkNoYXIpIHsKLSAgICAgICAgKCpidWYpLmkgPSAodWludDMyKXZtLT51cGNhbGxzLT5jaGFyVmFsdWUtPmdldEluc3RhbmNlSW50MTZGaWVsZChvYmopOwotICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSB2bS0+dXBjYWxscy0+T2ZTaG9ydCkgewotICAgICAgICAoKmJ1ZikuaSA9IChzaW50MzIpdm0tPnVwY2FsbHMtPnNob3J0VmFsdWUtPmdldEluc3RhbmNlSW50MTZGaWVsZChvYmopOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdm0tPmlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiIik7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChwcmltLT5pc0NoYXIoKSkgewotICAgICAgaWYgKHZhbHVlID09IHZtLT51cGNhbGxzLT5PZkNoYXIpIHsKLSAgICAgICAgKCpidWYpLmMgPSAodWludDE2KXZtLT51cGNhbGxzLT5jaGFyVmFsdWUtPmdldEluc3RhbmNlSW50MTZGaWVsZChvYmopOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdm0tPmlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiIik7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChwcmltLT5pc0Zsb2F0KCkpIHsKLSAgICAgIGlmICh2YWx1ZSA9PSB2bS0+dXBjYWxscy0+T2ZGbG9hdCkgewotICAgICAgICAoKmJ1ZikuZiA9IChmbG9hdCl2bS0+dXBjYWxscy0+ZmxvYXRWYWx1ZS0+Z2V0SW5zdGFuY2VGbG9hdEZpZWxkKG9iaik7Ci0gICAgICB9IGVsc2UgaWYgKHZhbHVlID09IHZtLT51cGNhbGxzLT5PZkJ5dGUpIHsKLSAgICAgICAgKCpidWYpLmYgPSAoZmxvYXQpKHNpbnQzMil2bS0+dXBjYWxscy0+Ynl0ZVZhbHVlLT5nZXRJbnN0YW5jZUludDhGaWVsZChvYmopOwotICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSB2bS0+dXBjYWxscy0+T2ZDaGFyKSB7Ci0gICAgICAgICgqYnVmKS5mID0gKGZsb2F0KSh1aW50MzIpdm0tPnVwY2FsbHMtPmNoYXJWYWx1ZS0+Z2V0SW5zdGFuY2VJbnQxNkZpZWxkKG9iaik7Ci0gICAgICB9IGVsc2UgaWYgKHZhbHVlID09IHZtLT51cGNhbGxzLT5PZlNob3J0KSB7Ci0gICAgICAgICgqYnVmKS5mID0gKGZsb2F0KShzaW50MzIpdm0tPnVwY2FsbHMtPnNob3J0VmFsdWUtPmdldEluc3RhbmNlSW50MTZGaWVsZChvYmopOwotICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSB2bS0+dXBjYWxscy0+T2ZJbnQpIHsKLSAgICAgICAgKCpidWYpLmYgPSAoZmxvYXQpKHNpbnQzMil2bS0+dXBjYWxscy0+aW50VmFsdWUtPmdldEluc3RhbmNlSW50MzJGaWVsZChvYmopOwotICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSB2bS0+dXBjYWxscy0+T2ZMb25nKSB7Ci0gICAgICAgICgqYnVmKS5mID0gKGZsb2F0KXZtLT51cGNhbGxzLT5sb25nVmFsdWUtPmdldEluc3RhbmNlTG9uZ0ZpZWxkKG9iaik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB2bS0+aWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCIiKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKHByaW0tPmlzRG91YmxlKCkpIHsKLSAgICAgIGlmICh2YWx1ZSA9PSB2bS0+dXBjYWxscy0+T2ZEb3VibGUpIHsKLSAgICAgICAgKCpidWYpLmQgPSAoZG91YmxlKXZtLT51cGNhbGxzLT5kb3VibGVWYWx1ZS0+Z2V0SW5zdGFuY2VEb3VibGVGaWVsZChvYmopOwotICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSB2bS0+dXBjYWxscy0+T2ZGbG9hdCkgewotICAgICAgICAoKmJ1ZikuZCA9IChkb3VibGUpdm0tPnVwY2FsbHMtPmZsb2F0VmFsdWUtPmdldEluc3RhbmNlRmxvYXRGaWVsZChvYmopOwotICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSB2bS0+dXBjYWxscy0+T2ZCeXRlKSB7Ci0gICAgICAgICgqYnVmKS5kID0gKGRvdWJsZSkoc2ludDY0KXZtLT51cGNhbGxzLT5ieXRlVmFsdWUtPmdldEluc3RhbmNlSW50OEZpZWxkKG9iaik7Ci0gICAgICB9IGVsc2UgaWYgKHZhbHVlID09IHZtLT51cGNhbGxzLT5PZkNoYXIpIHsKLSAgICAgICAgKCpidWYpLmQgPSAoZG91YmxlKSh1aW50NjQpdm0tPnVwY2FsbHMtPmNoYXJWYWx1ZS0+Z2V0SW5zdGFuY2VJbnQxNkZpZWxkKG9iaik7Ci0gICAgICB9IGVsc2UgaWYgKHZhbHVlID09IHZtLT51cGNhbGxzLT5PZlNob3J0KSB7Ci0gICAgICAgICgqYnVmKS5kID0gKGRvdWJsZSkoc2ludDE2KXZtLT51cGNhbGxzLT5zaG9ydFZhbHVlLT5nZXRJbnN0YW5jZUludDE2RmllbGQob2JqKTsKLSAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gdm0tPnVwY2FsbHMtPk9mSW50KSB7Ci0gICAgICAgICgqYnVmKS5kID0gKGRvdWJsZSkoc2ludDMyKXZtLT51cGNhbGxzLT5pbnRWYWx1ZS0+Z2V0SW5zdGFuY2VJbnQzMkZpZWxkKG9iaik7Ci0gICAgICB9IGVsc2UgaWYgKHZhbHVlID09IHZtLT51cGNhbGxzLT5PZkxvbmcpIHsKLSAgICAgICAgKCpidWYpLmQgPSAoZG91YmxlKShzaW50NjQpdm0tPnVwY2FsbHMtPmxvbmdWYWx1ZS0+Z2V0SW5zdGFuY2VMb25nRmllbGQob2JqKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHZtLT5pbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIiIpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAocHJpbS0+aXNMb25nKCkpIHsKLSAgICAgIGlmICh2YWx1ZSA9PSB2bS0+dXBjYWxscy0+T2ZCeXRlKSB7Ci0gICAgICAgICgqYnVmKS5qID0gKHNpbnQ2NCl2bS0+dXBjYWxscy0+Ynl0ZVZhbHVlLT5nZXRJbnN0YW5jZUludDhGaWVsZChvYmopOwotICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSB2bS0+dXBjYWxscy0+T2ZDaGFyKSB7Ci0gICAgICAgICgqYnVmKS5qID0gKHNpbnQ2NCkodWludDY0KXZtLT51cGNhbGxzLT5jaGFyVmFsdWUtPmdldEluc3RhbmNlSW50MTZGaWVsZChvYmopOwotICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSB2bS0+dXBjYWxscy0+T2ZTaG9ydCkgewotICAgICAgICAoKmJ1ZikuaiA9IChzaW50NjQpdm0tPnVwY2FsbHMtPnNob3J0VmFsdWUtPmdldEluc3RhbmNlSW50MTZGaWVsZChvYmopOwotICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSB2bS0+dXBjYWxscy0+T2ZJbnQpIHsKLSAgICAgICAgKCpidWYpLmogPSAoc2ludDY0KXZtLT51cGNhbGxzLT5pbnRWYWx1ZS0+Z2V0SW5zdGFuY2VJbnQzMkZpZWxkKG9iaik7Ci0gICAgICB9IGVsc2UgaWYgKHZhbHVlID09IHZtLT51cGNhbGxzLT5PZkxvbmcpIHsKLSAgICAgICAgKCpidWYpLmogPSAoc2ludDY0KXZtLT51cGNhbGxzLT5pbnRWYWx1ZS0+Z2V0SW5zdGFuY2VMb25nRmllbGQob2JqKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHZtLT5pbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIiIpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotICAvLyBjYW4gbm90IGJlIGhlcmUKLSAgcmV0dXJuOwotfQotCi1ib29sIEphdmFPYmplY3Q6Omluc3RhbmNlT2YoSmF2YU9iamVjdCogc2VsZiwgVXNlckNvbW1vbkNsYXNzKiBjbCkgewotICBsbHZtX2djcm9vdChzZWxmLCAwKTsKLSAgaWYgKHNlbGYgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOwotICBlbHNlIHJldHVybiBnZXRDbGFzcyhzZWxmKS0+aXNBc3NpZ25hYmxlRnJvbShjbCk7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvVk1Db3JlL0phdmFPYmplY3QuaCBiL3Zta2l0L2xpYi9KMy9WTUNvcmUvSmF2YU9iamVjdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDEyMzhlLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9KMy9WTUNvcmUvSmF2YU9iamVjdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzA4ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0gSmF2YU9iamVjdC5oIC0gSmF2YSBvYmplY3QgZGVmaW5pdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgSk5KVk1fSkFWQV9PQkpFQ1RfSAotI2RlZmluZSBKTkpWTV9KQVZBX09CSkVDVF9ICi0KLSNpbmNsdWRlICJtdm0vQWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAibXZtL0dDLmgiCi0jaW5jbHVkZSAibXZtL1VURjguaCIKLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9Mb2Nrcy5oIgotI2luY2x1ZGUgIm12bS9UaHJlYWRzL1RocmVhZC5oIgotCi0jaW5jbHVkZSAidHlwZXMuaCIKLQotI2luY2x1ZGUgIkpuanZtQ29uZmlnLmgiCi0KLXVuaW9uIGp2YWx1ZTsKLQotbmFtZXNwYWNlIGozIHsKLQotY2xhc3MgSmF2YU9iamVjdDsKLWNsYXNzIEphdmFUaHJlYWQ7Ci1jbGFzcyBKbmp2bTsKLWNsYXNzIFR5cGVkZWY7Ci1jbGFzcyBVc2VyQ29tbW9uQ2xhc3M7Ci0KLWNsYXNzIEludGVyZmFjZU1ldGhvZFRhYmxlIDogcHVibGljIG12bTo6UGVybWFuZW50T2JqZWN0IHsKLXB1YmxpYzoKLQlzdGF0aWMgY29uc3QgdWludDMyX3QgTnVtSW5kZXhlcyA9IDI5OwotCXVpbnRwdHJfdCBjb250ZW50c1tOdW1JbmRleGVzXTsKLQotICBzdGF0aWMgdWludDMyX3QgZ2V0SW5kZXgoY29uc3QgbXZtOjpVVEY4KiBuYW1lLCBjb25zdCBtdm06OlVURjgqIHR5cGUpIHsKLSAgICByZXR1cm4gKG5hbWUtPmhhc2goKSArIHR5cGUtPmhhc2goKSkgJSBOdW1JbmRleGVzOwotICB9Ci19OwotCi0vLy8gSmF2YVZpcnR1YWxUYWJsZSAtIFRoaXMgY2xhc3MgaXMgdGhlIHZpcnR1YWwgdGFibGUgb2YgaW5zdGFuY2VzIG9mCi0vLy8gSmF2YSBjbGFzc2VzLiBCZXNpZGVzIGhvbGRpbmcgZnVuY3Rpb24gcG9pbnRlcnMgZm9yIHZpcnR1YWwgY2FsbHMsCi0vLy8gaXQgY29udGFpbnMgYSBidW5jaCBvZiBpbmZvcm1hdGlvbiB1c2VmdWwgZm9yIGZhc3QgZHluYW1pYyB0eXBlIGNoZWNraW5nLgotLy8vIFRoZXNlIGFyZSBwbGFjZWQgaGVyZSBmb3IgZmFzdCBhY2Nlc3Mgb2YgaW5mb3JtYXRpb24gZnJvbSBhIEphdmEgb2JqZWN0Ci0vLy8gKHRoYXQgb25seSBwb2ludHMgdG8gdGhlIFZULCBub3QgdGhlIGNsYXNzKS4KLS8vLwotY2xhc3MgSmF2YVZpcnR1YWxUYWJsZSA6IHB1YmxpYyBtdm06OlZpcnR1YWxUYWJsZSB7Ci1wdWJsaWM6Ci0KLSAgLy8vIGNsIC0gVGhlIGNsYXNzIHdoaWNoIGRlZmluZWQgdGhpcyB2aXJ0dWFsIHRhYmxlLgotICAvLy8KLSAgQ29tbW9uQ2xhc3MqIGNsOwotCi0gIC8vLyBkZXB0aCAtIFRoZSBzdXBlciBoaWVyYXJjaHkgZGVwdGggb2YgdGhlIGNsYXNzLgotICAvLy8KLSAgc2l6ZV90IGRlcHRoOwotCi0gIC8vLyBvZmZzZXQgLSBPZmZzZXQgaW4gdGhlIHZpcnR1YWwgdGFibGUgd2hlcmUgdGhpcyB2aXJ0dWFsCi0gIC8vLyB0YWJsZSBtYXkgYmUgcG9pbnRlZC4gVGhlIG9mZnNldCBpcyB0aGUgY2FjaGUgaWYgdGhlIGNsYXNzCi0gIC8vLyBpcyBhbiBpbnRlcmZhY2Ugb3IgZGVwdGggaXMgdG9vIGJpZywgb3IgYW4gb2Zmc2V0IGluIHRoZSBkaXNwbGF5LgotICAvLy8KLSAgc2l6ZV90IG9mZnNldDsKLQotICAvLy8gY2FjaGUgLSBUaGUgY2FjaGVkIHJlc3VsdCBmb3IgYmV0dGVyIHR5cGUgY2hlY2tzIG9uIHNlY29uZGFyeSB0eXBlcy4KLSAgLy8vCi0gIEphdmFWaXJ0dWFsVGFibGUqIGNhY2hlOwotCi0gIC8vLyBkaXNwbGF5IC0gQXJyYXkgb2Ygc3VwZXIgY2xhc3Nlcy4KLSAgLy8vCi0gIEphdmFWaXJ0dWFsVGFibGUqIGRpc3BsYXlbOF07Ci0KLSAgLy8vIG5iU2Vjb25kYXJ5VHlwZXMgLSBUaGUgbGVuZ3RoIG9mIHRoZSBzZWNvbmRhcnkgdHlwZSBsaXN0LgotICAvLy8KLSAgc2l6ZV90IG5iU2Vjb25kYXJ5VHlwZXM7Ci0KLSAgLy8vIHNlY29uZGFyeVR5cGVzIC0gVGhlIGxpc3Qgb2Ygc2Vjb25kYXJ5IHR5cGVzIG9mIHRoaXMgdHlwZS4gVGhlc2UKLSAgLy8vIGFyZSB0aGUgaW50ZXJmYWNlIGFuZCBhbGwgdGhlIHN1cGVycyB3aG9zZSBkZXB0aCBpcyB0b28gYmlnLgotICAvLy8KLSAgSmF2YVZpcnR1YWxUYWJsZSoqIHNlY29uZGFyeVR5cGVzOwotCi0gIC8vLyBiYXNlQ2xhc3NWVCAtIEhvbGRzIHRoZSBiYXNlIGNsYXNzIFZUIG9mIGFuIGFycmF5LiBVc2VkIGZvciBBQVNUT1JFCi0gIC8vLyBjaGVja3MuCi0gIC8vLwotICBKYXZhVmlydHVhbFRhYmxlKiBiYXNlQ2xhc3NWVDsKLQotICAvLy8gSU1UIC0gVGhlIGludGVyZmFjZSBtZXRob2QgdGFibGUuCi0gIC8vLwotICBJbnRlcmZhY2VNZXRob2RUYWJsZSogSU1UOwotCi0gIC8vLyBKYXZhIG1ldGhvZHMgZm9yIHRoZSB2aXJ0dWFsIHRhYmxlIGZ1bmN0aW9ucy4KLSAgdWludHB0cl90IGluaXQ7Ci0gIHVpbnRwdHJfdCBlcXVhbHM7Ci0gIHVpbnRwdHJfdCBoYXNoQ29kZTsKLSAgdWludHB0cl90IHRvU3RyaW5nOwotICB1aW50cHRyX3QgY2xvbmU7Ci0gIHVpbnRwdHJfdCBnZXRDbGFzczsKLSAgdWludHB0cl90IG5vdGlmeTsKLSAgdWludHB0cl90IG5vdGlmeUFsbDsKLSAgdWludHB0cl90IHdhaXRJbmRlZmluaXRlbHk7Ci0gIHVpbnRwdHJfdCB3YWl0TXM7Ci0gIHVpbnRwdHJfdCB3YWl0TXNOczsKLSAgdWludHB0cl90IHZpcnR1YWxNZXRob2RzWzFdOwotCi0gIC8vLyBvcGVyYXRvciBuZXcgLSBBbGxvY2F0ZXMgYSBKYXZhVmlydHVhbFRhYmxlIHdpdGggdGhlIGdpdmVuIHNpemUuIFRoZQotICAvLy8gc2l6ZSBtdXN0IGNvbnRhaW4gdGhlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHR5cGUgY2hlY2tpbmcsIGFzIHdlbGwKLSAgLy8vIGFzIHRoZSBmdW5jdGlvbiBwb2ludGVycy4KLSAgLy8vCi0gIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qgc3osIG12bTo6QnVtcFB0ckFsbG9jYXRvciYgYWxsb2NhdG9yLAotICAgICAgICAgICAgICAgICAgICAgdWludDMyIG5iTWV0aG9kcykgewotICAgIHJldHVybiBhbGxvY2F0b3IuQWxsb2NhdGUoc2l6ZW9mKHVpbnRwdHJfdCkgKiAobmJNZXRob2RzKSwgIlZpcnR1YWwgdGFibGUiKTsKLSAgfQotCi0gIC8vLyBKYXZhVmlydHVhbFRhYmxlIC0gQ3JlYXRlIEphdmFWaXJ0dWFsVGFibGUgb2JqZWN0cyBmb3IgY2xhc3NlcywgYXJyYXkKLSAgLy8vIGNsYXNzZXMgYW5kIHByaW1pdGl2ZSBjbGFzc2VzLgotICAvLy8KLSAgSmF2YVZpcnR1YWxUYWJsZShDbGFzcyogQyk7Ci0gIEphdmFWaXJ0dWFsVGFibGUoQ2xhc3NBcnJheSogQyk7Ci0gIEphdmFWaXJ0dWFsVGFibGUoQ2xhc3NQcmltaXRpdmUqIEMpOwotCi0KLSAgLy8vIGdldEZpcnN0SmF2YU1ldGhvZCAtIEdldCB0aGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGZpcnN0IEphdmEgbWV0aG9kCi0gIC8vLyAoPGluaXQ+KS4KLSAgLy8vCi0gIHVpbnRwdHJfdCogZ2V0Rmlyc3RKYXZhTWV0aG9kKCkgewotICAgIHJldHVybiAmaW5pdDsKLSAgfQotICAKLSAgLy8vIGdldEZpcnN0SmF2YU1ldGhvZEluZGV4IC0gR2V0IHRoZSB3b3JkIG9mZnNldCBvZiB0aGUgZmlyc3QgSmF2YSBtZXRob2QuCi0gIC8vLwotICBzdGF0aWMgdWludDMyX3QgZ2V0Rmlyc3RKYXZhTWV0aG9kSW5kZXgoKSB7Ci0gICAgcmV0dXJuIG51bWJlck9mQmFzZUZ1bmN0aW9ucygpICsgMTY7Ci0gIH0KLSAgIAotICAvLy8gZ2V0QmFzZVNpemUgLSBHZXQgdGhlIHNpemUgb2YgdGhlIGphdmEubGFuZy5PYmplY3QgdmlydHVhbCB0YWJsZS4KLSAgLy8vCi0gIHN0YXRpYyB1aW50MzJfdCBnZXRCYXNlU2l6ZSgpIHsKLSAgICByZXR1cm4gbnVtYmVyT2ZCYXNlRnVuY3Rpb25zKCkgKyAyNzsKLSAgfQotICAKLSAgLy8vIGdldE51bUphdmFNZXRob2RzIC0gR2V0IHRoZSBudW1iZXIgb2YgbWV0aG9kcyBvZiB0aGUgamF2YS5sYW5nLk9iamVjdAotICAvLy8gY2xhc3MuCi0gIC8vLwotICBzdGF0aWMgdWludDMyX3QgZ2V0TnVtSmF2YU1ldGhvZHMoKSB7Ci0gICAgcmV0dXJuIDExOwotICB9Ci0KLSAgLy8vIGdldERpc3BsYXlMZW5ndGggLSBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgZGlzcGxheSAocHJpbWFyeSB0eXBlKSBhcnJheS4KLSAgLy8vCi0gIHN0YXRpYyB1aW50MzJfdCBnZXREaXNwbGF5TGVuZ3RoKCkgewotICAgIHJldHVybiA4OwotICB9Ci0gIAotICAvLy8gZ2V0Q2xhc3NJbmRleCAtIEdldCB0aGUgd29yZCBvZmZzZXQgb2YgdGhlIGNsYXNzLgotICAvLy8KLSAgc3RhdGljIHVpbnQzMl90IGdldENsYXNzSW5kZXgoKSB7Ci0gICAgcmV0dXJuIG51bWJlck9mQmFzZUZ1bmN0aW9ucygpOwotICB9Ci0gIAotICAvLy8gZ2V0RGVwdGhJbmRleCAtIEdldCB0aGUgd29yZCBvZmZzZXQgb2YgdGhlIGRlcHRoLgotICAvLy8KLSAgc3RhdGljIHVpbnQzMl90IGdldERlcHRoSW5kZXgoKSB7Ci0gICAgcmV0dXJuIG51bWJlck9mQmFzZUZ1bmN0aW9ucygpICsgMTsKLSAgfQotICAKLSAgLy8vIGdldE9mZnNldEluZGV4IC0gR2V0IHRoZSB3b3JkIG9mZnNldCBvZiB0aGUgdHlwZSBjYWNoZS4KLSAgLy8vCi0gIHN0YXRpYyB1aW50MzJfdCBnZXRPZmZzZXRJbmRleCgpIHsKLSAgICByZXR1cm4gbnVtYmVyT2ZCYXNlRnVuY3Rpb25zKCkgKyAyOwotICB9Ci0gIAotICAvLy8gZ2V0Q2FjaGVJbmRleCAtIEdldCB0aGUgd29yZCBvZmZzZXQgb2YgdGhlIHR5cGUgY2FjaGUuCi0gIC8vLwotICBzdGF0aWMgdWludDMyX3QgZ2V0Q2FjaGVJbmRleCgpIHsKLSAgICByZXR1cm4gbnVtYmVyT2ZCYXNlRnVuY3Rpb25zKCkgKyAzOwotICB9Ci0gIAotICAvLy8gZ2V0RGlzcGxheUluZGV4IC0gR2V0IHRoZSB3b3JkIG9mZnNldCBvZiB0aGUgZGlzcGxheS4KLSAgLy8vCi0gIHN0YXRpYyB1aW50MzJfdCBnZXREaXNwbGF5SW5kZXgoKSB7Ci0gICAgcmV0dXJuIG51bWJlck9mQmFzZUZ1bmN0aW9ucygpICsgNDsKLSAgfQotICAKLSAgLy8vIGdldE51bVNlY29uZGFyeVR5cGVzSW5kZXggLSBHZXQgdGhlIHdvcmQgb2Zmc2V0IG9mIHRoZSBudW1iZXIgb2YKLSAgLy8vIHNlY29uZGFyeSB0eXBlcy4KLSAgLy8vCi0gIHN0YXRpYyB1aW50MzJfdCBnZXROdW1TZWNvbmRhcnlUeXBlc0luZGV4KCkgewotICAgIHJldHVybiBudW1iZXJPZkJhc2VGdW5jdGlvbnMoKSArIDEyOwotICB9Ci0gIAotICAvLy8gZ2V0U2Vjb25kYXJ5VHlwZXNJbmRleCAtIEdldCB0aGUgd29yZCBvZmZzZXQgb2YgdGhlIHNlY29uZGFyeSB0eXBlcwotICAvLy8gbGlzdC4KLSAgLy8vCi0gIHN0YXRpYyB1aW50MzJfdCBnZXRTZWNvbmRhcnlUeXBlc0luZGV4KCkgewotICAgIHJldHVybiBudW1iZXJPZkJhc2VGdW5jdGlvbnMoKSArIDEzOwotICB9Ci0gIAotICAvLy8gZ2V0QmFzZUNsYXNzSW5kZXggLSBHZXQgdGhlIHdvcmQgb2Zmc2V0IG9mIHRoZSBiYXNlIGNsYXNzLgotICAvLy8KLSAgc3RhdGljIHVpbnQzMl90IGdldEJhc2VDbGFzc0luZGV4KCkgewotICAgIHJldHVybiBudW1iZXJPZkJhc2VGdW5jdGlvbnMoKSArIDE0OwotICB9Ci0gICAKLSAgLy8vIGdldElNVEluZGV4IC0gR2V0IHRoZSB3b3JkIG9mZnNldCBvZiB0aGUgSU1ULgotICAvLy8KLSAgc3RhdGljIHVpbnQzMl90IGdldElNVEluZGV4KCkgewotICAgIHJldHVybiBudW1iZXJPZkJhc2VGdW5jdGlvbnMoKSArIDE1OwotICB9Ci0gICAKLSAgLy8vIGlzU3VidHlwZU9mIC0gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBWVCBpcyBhIHN1YnR5cGUgb2YgdGhlIHRoaXMKLSAgLy8vIFZULgotICAvLy8KLSAgYm9vbCBpc1N1YnR5cGVPZihKYXZhVmlydHVhbFRhYmxlKiBWVCk7Ci0KLSAgLy8vIHNldE5hdGl2ZVRyYWNlciAtIFNldCB0aGUgdHJhY2VyIG9mIHRoaXMgdmlydHVhbCB0YWJsZSBhcyBhIG1ldGhvZAotICAvLy8gZGVmaW5lZCBieSBKbkpWTS4KLSAgLy8vCi0gIHZvaWQgc2V0TmF0aXZlVHJhY2VyKHVpbnRwdHJfdCB0cmFjZXIsIGNvbnN0IGNoYXIqIG5hbWUpOwotICAKLSAgLy8vIHNldE5hdGl2ZURlc3RydWN0b3IgLSBTZXQgdGhlIGRlc3RydWN0b3Igb2YgdGhpcyB2aXJ0dWFsIHRhYmxlIGFzIGEgbWV0aG9kCi0gIC8vLyBkZWZpbmVkIGJ5IEpuSlZNLgotICAvLy8KLSAgdm9pZCBzZXROYXRpdmVEZXN0cnVjdG9yKHVpbnRwdHJfdCB0cmFjZXIsIGNvbnN0IGNoYXIqIG5hbWUpOwotCi19OwotCi0KLS8vLyBKYXZhT2JqZWN0IC0gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgSmF2YSBvYmplY3QuCi0vLy8KLWNsYXNzIEphdmFPYmplY3QgOiBwdWJsaWMgbXZtOjpnYyB7Ci1wcml2YXRlOgotICAKLSAgLy8vIHdhaXRJbnRlcm4gLSBpbnRlcm5hbCB3YWl0IG9uIGEgbW9uaXRvcgotICAvLy8KLSAgc3RhdGljIHZvaWQgd2FpdEludGVybihKYXZhT2JqZWN0KiBzZWxmLCBzdHJ1Y3QgdGltZXZhbCAqaW5mbywgYm9vbCB0aW1lZCk7Ci0gIAotcHVibGljOgotCi0JSm5qdm0qIGdldEpWTSgpIHsgcmV0dXJuIChKbmp2bSopZ2V0VmlydHVhbFRhYmxlKCktPnZtOyB9Ci0KLSAgLy8vIGdldENsYXNzIC0gUmV0dXJucyB0aGUgY2xhc3Mgb2YgdGhpcyBvYmplY3QuCi0gIC8vLwotICBzdGF0aWMgVXNlckNvbW1vbkNsYXNzKiBnZXRDbGFzcyhjb25zdCBKYXZhT2JqZWN0KiBzZWxmKSB7Ci0gICAgbGx2bV9nY3Jvb3Qoc2VsZiwgMCk7Ci0gICAgcmV0dXJuICgoSmF2YVZpcnR1YWxUYWJsZSopc2VsZi0+Z2V0VmlydHVhbFRhYmxlKCkpLT5jbDsKLSAgfQotICAKLSAgLy8vIGluc3RhbmNlT2YgLSBJcyB0aGlzIG9iamVjdCdzIGNsYXNzIG9mIHR5cGUgdGhlIGdpdmVuIGNsYXNzPwotICAvLy8KLSAgc3RhdGljIGJvb2wgaW5zdGFuY2VPZihKYXZhT2JqZWN0KiBzZWxmLCBVc2VyQ29tbW9uQ2xhc3MqIGNsKTsKLQotICAvLy8gd2FpdCAtIEphdmEgd2FpdC4gTWFrZXMgdGhlIGN1cnJlbnQgdGhyZWFkIHdhaXRpbmcgb24gYSBtb25pdG9yLgotICAvLy8KLSAgc3RhdGljIHZvaWQgd2FpdChKYXZhT2JqZWN0KiBzZWxmKTsKLQotICAvLy8gdGltZWRXYWl0IC0gSmF2YSB0aW1lZCB3YWl0LiBNYWtlcyB0aGUgY3VycmVudCB0aHJlYWQgd2FpdGluZyBvbiBhCi0gIC8vLyBtb25pdG9yIGZvciB0aGUgZ2l2ZW4gYW1vdW50IG9mIHRpbWUuCi0gIC8vLwotICBzdGF0aWMgdm9pZCB0aW1lZFdhaXQoSmF2YU9iamVjdCogc2VsZiwgc3RydWN0IHRpbWV2YWwgJmluZm8pOwotICAKLSAgLy8vIG5vdGlmeSAtIEphdmEgbm90aWZ5LiBOb3RpZmllcyBhIHRocmVhZCBmcm9tIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlCi0gIC8vLyBtb25pdG9yLgotICAvLy8KLSAgc3RhdGljIHZvaWQgbm90aWZ5KEphdmFPYmplY3QqIHNlbGYpOwotICAKLSAgLy8vIG5vdGlmeUFsbCAtIEphdmEgbm90aWZ5QWxsLiBOb3RpZmllcyBhbGwgdGhyZWFkcyBmcm9tIHRoZSBhdmFpbGFiaWxpdHkgb2YKLSAgLy8vIHRoZSBtb25pdG9yLgotICAvLy8KLSAgc3RhdGljIHZvaWQgbm90aWZ5QWxsKEphdmFPYmplY3QqIHNlbGYpOwotIAotICAvLy8gb3ZlcmZsb3dUaGluTG9jayAtIE5vdGlmeSB0aGF0IHRoZSB0aGluIGxvY2sgaGFzIG92ZXJmbG93ZWQuCi0gIC8vLwotICBzdGF0aWMgdm9pZCBvdmVyZmxvd1RoaW5Mb2NrKEphdmFPYmplY3QqIHNlbGYpOwotCi0gIC8vLyBhY3F1aXJlIC0gQWNxdWlyZSB0aGUgbG9jayBvbiB0aGlzIG9iamVjdC4KLSAgc3RhdGljIHZvaWQgYWNxdWlyZShKYXZhT2JqZWN0KiBzZWxmKTsKLQotICAvLy8gcmVsZWFzZSAtIFJlbGVhc2UgdGhlIGxvY2sgb24gdGhpcyBvYmplY3QKLSAgc3RhdGljIHZvaWQgcmVsZWFzZShKYXZhT2JqZWN0KiBzZWxmKTsKLQotICAvLy8gb3duZXIgLSBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIHRoZSBvd25lciBvZiB0aGlzIG9iamVjdCdzCi0gIC8vLyBsb2NrLgotICBzdGF0aWMgYm9vbCBvd25lcihKYXZhT2JqZWN0KiBzZWxmKTsKLQotI2lmZGVmIFNJR1NFR1ZfVEhST1dfTlVMTAotICAjZGVmaW5lIHZlcmlmeU51bGwob2JqKSB7fQotI2Vsc2UKLSAgI2RlZmluZSB2ZXJpZnlOdWxsKG9iaikgXAotICAgIGlmIChvYmogPT0gTlVMTCkgSmF2YVRocmVhZDo6Z2V0KCktPmdldEpWTSgpLT5udWxsUG9pbnRlckV4Y2VwdGlvbigpOwotI2VuZGlmCi0gIAotICAvLy8gZGVjYXBzdWxlUHJpbWl0aXZlIC0gQmFzZWQgb24gdGhlIHNpZ25hdHVyZSBhcmd1bWVudCwgZGVjYXBzdWxlCi0gIC8vLyBvYmogYXMgYSBwcmltaXRpdmUgYW5kIHB1dCBpdCBpbiB0aGUgYnVmZmVyLgotICAvLy8KLSAgc3RhdGljIHZvaWQgZGVjYXBzdWxlUHJpbWl0aXZlKEphdmFPYmplY3QqIHNlbGYsIGp2YWx1ZSogYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZWRlZiogc2lnbmF0dXJlKTsKLQotICBzdGF0aWMgdWludDE2X3QgaGFzaENvZGVHZW5lcmF0b3I7Ci0KLSAgLy8vIGhhc2hDb2RlIC0gUmV0dXJuIHRoZSBoYXNoIGNvZGUgb2YgdGhpcyBvYmplY3QuCi0gIHN0YXRpYyB1aW50MzJfdCBoYXNoQ29kZShKYXZhT2JqZWN0KiBzZWxmKTsKLX07Ci0KLQotfSAvLyBlbmQgbmFtZXNwYWNlIGozCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL0ozL1ZNQ29yZS9KYXZhUnVudGltZUpJVC5jcHAgYi92bWtpdC9saWIvSjMvVk1Db3JlL0phdmFSdW50aW1lSklULmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlYmQxZi4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvSjMvVk1Db3JlL0phdmFSdW50aW1lSklULmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc0MCArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tIEphdmFSdW50aW1lSklULmNwcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy89PT0gLS0tLSBSdW50aW1lIGZ1bmN0aW9ucyBjYWxsZWQgYnkgY29kZSBjb21waWxlZCBieSB0aGUgSklUIC0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLQotI2luY2x1ZGUgIkNsYXNzcGF0aFJlZmxlY3QuaCIKLSNpbmNsdWRlICJKYXZhQXJyYXkuaCIKLSNpbmNsdWRlICJKYXZhQ2xhc3MuaCIKLSNpbmNsdWRlICJKYXZhQ29uc3RhbnRQb29sLmgiCi0jaW5jbHVkZSAiSmF2YVN0cmluZy5oIgotI2luY2x1ZGUgIkphdmFUaHJlYWQuaCIKLSNpbmNsdWRlICJKYXZhVHlwZXMuaCIKLSNpbmNsdWRlICJKYXZhVXBjYWxscy5oIgotI2luY2x1ZGUgIkpuanZtLmgiCi0KLSNpbmNsdWRlICJqMy9PcGNvZGVOYW1lcy5kZWYiCi0KLSNpbmNsdWRlIDxjc3RkYXJnPgotCi11c2luZyBuYW1lc3BhY2UgajM7Ci0KLWV4dGVybiAiQyIgdm9pZCogajNJbnRlcmZhY2VMb29rdXAoVXNlckNsYXNzKiBjYWxsZXIsIHVpbnQzMiBpbmRleCkgewotCi0gIHZvaWQqIHJlcyA9IDA7Ci0KLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigxKQotICAKLSAgVXNlckNvbnN0YW50UG9vbCogY3RwSW5mbyA9IGNhbGxlci0+Z2V0Q29uc3RhbnRQb29sKCk7Ci0gIGlmIChjdHBJbmZvLT5jdHBSZXNbaW5kZXhdKSB7Ci0gICAgcmVzID0gY3RwSW5mby0+Y3RwUmVzW2luZGV4XTsKLSAgfSBlbHNlIHsKLSAgICBVc2VyQ29tbW9uQ2xhc3MqIGNsID0gMDsKLSAgICBjb25zdCBVVEY4KiB1dGY4ID0gMDsKLSAgICBTaWduZGVmKiBzaWduID0gMDsKLSAgCi0gICAgY3RwSW5mby0+cmVzb2x2ZU1ldGhvZChpbmRleCwgY2wsIHV0ZjgsIHNpZ24pOwotICAgIGFzc2VydChjbC0+aXNDbGFzcygpICYmIGlzSW50ZXJmYWNlKGNsLT5hY2Nlc3MpICYmICJXcm9uZyB0eXBlIG9mIG1ldGhvZCIpOwotICAgIHJlcyA9IGNsLT5hc0NsYXNzKCktPmxvb2t1cEludGVyZmFjZU1ldGhvZCh1dGY4LCBzaWduLT5rZXlOYW1lKTsKLSAgICAKLSAgICBjdHBJbmZvLT5jdHBSZXNbaW5kZXhdID0gKHZvaWQqKXJlczsKLSAgfQotICAKLSAgICAKLSAgRU5EX05BVElWRV9FWENFUFRJT04KLQotICAvLyBTaW5jZSB0aGUgZnVuY3Rpb24gaXMgbWFya2VkIHJlYWRub25lLCBMTFZNIG1heSBtb3ZlIGl0IGFmdGVyIHRoZQotICAvLyBleGNlcHRpb24gY2hlY2suIFRoZXJlZm9yZSwgd2UgdHJpY2sgTExWTSB0byBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZQotICAvLyBmdW5jdGlvbi4KLSNkZWZpbmUgaGFja19jaGVjayh0eXBlKQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCQltdm06OmdjKiBvYmogPSBtdm06OlRocmVhZDo6Z2V0KCktPmdldFBlbmRpbmdFeGNlcHRpb24oKTsJCQkJCVwKLQkJaWYgKG9iaikgcmV0dXJuICh0eXBlKW9iajsKLQotCWhhY2tfY2hlY2sodm9pZCopOwotCi0gIHJldHVybiByZXM7Ci19Ci0KLS8vIFRocm93cyBpZiB0aGUgZmllbGQgaXMgbm90IGZvdW5kLgotZXh0ZXJuICJDIiB2b2lkKiBqM1ZpcnR1YWxGaWVsZExvb2t1cChVc2VyQ2xhc3MqIGNhbGxlciwgdWludDMyIGluZGV4KSB7Ci0gIAotICB2b2lkKiByZXMgPSAwOwotICAKLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigxKQotCi0gIFVzZXJDb25zdGFudFBvb2wqIGN0cEluZm8gPSBjYWxsZXItPmdldENvbnN0YW50UG9vbCgpOwotICBpZiAoY3RwSW5mby0+Y3RwUmVzW2luZGV4XSkgewotICAgIHJlcyA9IGN0cEluZm8tPmN0cFJlc1tpbmRleF07Ci0gIH0gZWxzZSB7Ci0gIAotICAgIFVzZXJDb21tb25DbGFzcyogY2wgPSAwOwotICAgIGNvbnN0IFVURjgqIHV0ZjggPSAwOwotICAgIFR5cGVkZWYqIHNpZ24gPSAwOwotICAKLSAgICBjdHBJbmZvLT5yZXNvbHZlRmllbGQoaW5kZXgsIGNsLCB1dGY4LCBzaWduKTsKLSAKLSAgICBVc2VyQ2xhc3MqIGxvb2t1cCA9IGNsLT5pc0FycmF5KCkgPyBjbC0+c3VwZXIgOiBjbC0+YXNDbGFzcygpOwotICAgIEphdmFGaWVsZCogZmllbGQgPSBsb29rdXAtPmxvb2t1cEZpZWxkKHV0ZjgsIHNpZ24tPmtleU5hbWUsIGZhbHNlLCB0cnVlLCAwKTsKLSAgCi0gICAgY3RwSW5mby0+Y3RwUmVzW2luZGV4XSA9ICh2b2lkKilmaWVsZC0+cHRyT2Zmc2V0OwotICAKLSAgICByZXMgPSAodm9pZCopZmllbGQtPnB0ck9mZnNldDsKLSAgfQotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLQloYWNrX2NoZWNrKHZvaWQqKTsKLQotICByZXR1cm4gcmVzOwotfQotCi0vLyBUaHJvd3MgaWYgdGhlIGZpZWxkIG9yIGl0cyBjbGFzcyBpcyBub3QgZm91bmQuCi1leHRlcm4gIkMiIHZvaWQqIGozU3RhdGljRmllbGRMb29rdXAoVXNlckNsYXNzKiBjYWxsZXIsIHVpbnQzMiBpbmRleCkgewotICAKLSAgdm9pZCogcmVzID0gMDsKLSAgCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMSkKLSAgCi0gIFVzZXJDb25zdGFudFBvb2wqIGN0cEluZm8gPSBjYWxsZXItPmdldENvbnN0YW50UG9vbCgpOwotICAKLSAgaWYgKGN0cEluZm8tPmN0cFJlc1tpbmRleF0pIHsKLSAgICByZXMgPSBjdHBJbmZvLT5jdHBSZXNbaW5kZXhdOwotICB9IGVsc2UgewotICAKLSAgICBVc2VyQ29tbW9uQ2xhc3MqIGNsID0gMDsKLSAgICBVc2VyQ2xhc3MqIGZpZWxkQ2wgPSAwOwotICAgIGNvbnN0IFVURjgqIHV0ZjggPSAwOwotICAgIFR5cGVkZWYqIHNpZ24gPSAwOwotICAKLSAgICBjdHBJbmZvLT5yZXNvbHZlRmllbGQoaW5kZXgsIGNsLCB1dGY4LCBzaWduKTsKLSAKLSAgICBhc3NlcnQoY2wtPmFzQ2xhc3MoKSAmJiAiTG9va3VwIGEgZmllbGQgb2Ygc29tZXRoaW5nIG5vdCBhbiBhcnJheSIpOwotICAgIEphdmFGaWVsZCogZmllbGQgPSBjbC0+YXNDbGFzcygpLT5sb29rdXBGaWVsZCh1dGY4LCBzaWduLT5rZXlOYW1lLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAmZmllbGRDbCk7Ci0gICAgCi0gICAgZmllbGRDbC0+aW5pdGlhbGlzZUNsYXNzKCk7Ci0gICAgdm9pZCogb2JqID0gKChVc2VyQ2xhc3MqKWZpZWxkQ2wpLT5nZXRTdGF0aWNJbnN0YW5jZSgpOwotICAKLSAgICBhc3NlcnQob2JqICYmICJObyBzdGF0aWMgaW5zdGFuY2UgaW4gc3RhdGljIGZpZWxkIGxvb2t1cCIpOwotICAKLSAgICB2b2lkKiBwdHIgPSAodm9pZCopKCh1aW50NjQpb2JqICsgZmllbGQtPnB0ck9mZnNldCk7Ci0gICAgY3RwSW5mby0+Y3RwUmVzW2luZGV4XSA9IHB0cjsKLSAgIAotICAgIHJlcyA9IHB0cjsKLSAgfQotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLQloYWNrX2NoZWNrKHZvaWQqKTsKLQotICByZXR1cm4gcmVzOwotfQotCi0jaWZuZGVmIFdJVEhPVVRfVlRBQkxFCi0vLyBUaHJvd3MgaWYgdGhlIG1ldGhvZCBpcyBub3QgZm91bmQuCi1leHRlcm4gIkMiIHVpbnQzMiBqM1ZpcnR1YWxUYWJsZUxvb2t1cChVc2VyQ2xhc3MqIGNhbGxlciwgdWludDMyIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyKiBvZmZzZXQsIEphdmFPYmplY3QqIG9iaikgewotICBsbHZtX2djcm9vdChvYmosIDApOwotICB1aW50MzIgcmVzID0gMDsKLSAgCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMSkKLSAgICAKLSAgVXNlckNvbW1vbkNsYXNzKiBjbCA9IDA7Ci0gIGNvbnN0IFVURjgqIHV0ZjggPSAwOwotICBTaWduZGVmKiBzaWduID0gMDsKLSAgCi0gIGNhbGxlci0+Z2V0Q29uc3RhbnRQb29sKCktPnJlc29sdmVNZXRob2QoaW5kZXgsIGNsLCB1dGY4LCBzaWduKTsKLSAgVXNlckNsYXNzKiBsb29rdXAgPSBjbC0+aXNBcnJheSgpID8gY2wtPnN1cGVyIDogY2wtPmFzQ2xhc3MoKTsKLSAgSmF2YU1ldGhvZCogZG1ldGggPSBsb29rdXAtPmxvb2t1cE1ldGhvZERvbnRUaHJvdyh1dGY4LCBzaWduLT5rZXlOYW1lLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAwKTsKLSAgaWYgKCFkbWV0aCkgewotICAgIGFzc2VydCgoSmF2YU9iamVjdDo6Z2V0Q2xhc3Mob2JqKS0+aXNDbGFzcygpICYmIAotICAgICAgICAgICAgSmF2YU9iamVjdDo6Z2V0Q2xhc3Mob2JqKS0+YXNDbGFzcygpLT5pc0luaXRpYWxpemluZygpKSAmJgotICAgICAgICAgICAiQ2xhc3Mgbm90IHJlYWR5IGluIGEgdmlydHVhbCBsb29rdXAuIik7Ci0gICAgLy8gQXJnLCB0aGUgYnl0ZWNvZGUgaXMgYnVnZ3khIFBlcmZvcm0gdGhlIGxvb2t1cCBvbiB0aGUgb2JqZWN0IGNsYXNzCi0gICAgLy8gYW5kIGRvIG5vdCB1cGRhdGUgb2Zmc2V0LgotICAgIGxvb2t1cCA9IEphdmFPYmplY3Q6OmdldENsYXNzKG9iaiktPmlzQXJyYXkoKSA/Ci0gICAgICBKYXZhT2JqZWN0OjpnZXRDbGFzcyhvYmopLT5zdXBlciA6IAotICAgICAgSmF2YU9iamVjdDo6Z2V0Q2xhc3Mob2JqKS0+YXNDbGFzcygpOwotICAgIGRtZXRoID0gbG9va3VwLT5sb29rdXBNZXRob2QodXRmOCwgc2lnbi0+a2V5TmFtZSwgZmFsc2UsIHRydWUsIDApOwotICB9IGVsc2UgewotICAgICpvZmZzZXQgPSBkbWV0aC0+b2Zmc2V0OwotICB9Ci0KLSAgYXNzZXJ0KGRtZXRoLT5jbGFzc0RlZi0+aXNJbml0aWFsaXppbmcoKSAmJiAKLSAgICAgICAgICJDbGFzcyBub3QgcmVhZHkgaW4gYSB2aXJ0dWFsIGxvb2t1cC4iKTsKLQotICByZXMgPSBkbWV0aC0+b2Zmc2V0OwotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLSAgcmV0dXJuIHJlczsKLX0KLSNlbmRpZgotCi0vLyBUaHJvd3MgaWYgdGhlIGNsYXNzIGlzIG5vdCBmb3VuZC4KLWV4dGVybiAiQyIgdm9pZCogajNDbGFzc0xvb2t1cChVc2VyQ2xhc3MqIGNhbGxlciwgdWludDMyIGluZGV4KSB7IAotICAKLSAgdm9pZCogcmVzID0gMDsKLSAgCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMSkKLSAgIAotICBVc2VyQ29uc3RhbnRQb29sKiBjdHBJbmZvID0gY2FsbGVyLT5nZXRDb25zdGFudFBvb2woKTsKLSAgVXNlckNvbW1vbkNsYXNzKiBjbCA9IGN0cEluZm8tPmxvYWRDbGFzcyhpbmRleCk7Ci0gIC8vIFdlIGNhbiBub3QgaW5pdGlhbGl6ZSBoZXJlLCBiZWNhdXNlIGJ5dGVjb2RlcyBzdWNoIGFzIENIRUNLQ0FTVAotICAvLyBvciBjbGFzc2VzIHVzZWQgaW4gY2F0Y2ggY2xhdXNlcyBkbyBub3QgdHJpZ2dlciBjbGFzcyBpbml0aWFsaXphdGlvbi4KLSAgLy8gVGhpcyBpcyByZWFsbHkgc2FkLCBiZWNhdXNlIHdlIG5lZWQgdG8gaW5zZXJ0IGNsYXNzIGluaXRpYWxpemF0aW9uIGNoZWNrcwotICAvLyBpbiB0aGUgTExWTSBjb2RlLgotICBhc3NlcnQoY2wgJiYgIk5vIGNsIGFmdGVyIGNsYXNzIGxvb2t1cCIpOwotICByZXMgPSAodm9pZCopY2w7Ci0gCi0gIC8vIENyZWF0ZSB0aGUgYXJyYXkgY2xhc3MsIGluIGNhc2Ugd2UgY29tZSBmcm9tIGEgQU5FV0FSUkFZLgotICBpZiAoY2wtPmlzQ2xhc3MoKSAmJiAhY2wtPnZpcnR1YWxWVC0+YmFzZUNsYXNzVlQpIHsgCi0gICAgY29uc3QgVVRGOCogYXJyYXlOYW1lID0KLSAgICAgIGNsLT5jbGFzc0xvYWRlci0+Y29uc3RydWN0QXJyYXlOYW1lKDEsIGNsLT5nZXROYW1lKCkpOwotICAgIGNsLT52aXJ0dWFsVlQtPmJhc2VDbGFzc1ZUID0KLSAgICAgIGNsLT5jbGFzc0xvYWRlci0+Y29uc3RydWN0QXJyYXkoYXJyYXlOYW1lKS0+dmlydHVhbFZUOwotICB9Ci0KLSAgRU5EX05BVElWRV9FWENFUFRJT04KLSAgCi0KLQloYWNrX2NoZWNrKHZvaWQqKTsKLQotICByZXR1cm4gcmVzOwotfQotCi0vLyBDYWxscyBKYXZhIGNvZGUuCi0vLyBUaHJvd3MgaWYgaW5pdGlhbGl6aW5nIHRoZSBjbGFzcyB0aHJvd3MgYW4gZXhjZXB0aW9uLgotZXh0ZXJuICJDIiBVc2VyQ29tbW9uQ2xhc3MqIGozUnVudGltZUluaXRpYWxpc2VDbGFzcyhVc2VyQ2xhc3MqIGNsKSB7Ci0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMSkKLSAKLSAgY2wtPnJlc29sdmVDbGFzcygpOwotICBjbC0+aW5pdGlhbGlzZUNsYXNzKCk7Ci0gIAotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotCi0JaGFja19jaGVjayhVc2VyQ29tbW9uQ2xhc3MqKTsKLQotICByZXR1cm4gY2w7Ci19Ci0KLS8vIENhbGxzIEphdmEgY29kZS4KLWV4dGVybiAiQyIgSmF2YU9iamVjdCogajNSdW50aW1lRGVsZWdhdGVlKFVzZXJDb21tb25DbGFzcyogY2wpIHsKLSAgSmF2YU9iamVjdCogcmVzID0gMDsKLSAgbGx2bV9nY3Jvb3QocmVzLCAwKTsKLQotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDEpCi0gIHJlcyA9IGNsLT5nZXRDbGFzc0RlbGVnYXRlZSgpOwotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotICAKLQloYWNrX2NoZWNrKEphdmFPYmplY3QqKTsKLQotICByZXR1cm4gcmVzOwotfQotCi0vLyBUaHJvd3MgaWYgb25lIG9mIHRoZSBkaW1lbnNpb24gaXMgbmVnYXRpdmUuCi1KYXZhT2JqZWN0KiBtdWx0aUNhbGxOZXdJbnRlcm4oVXNlckNsYXNzQXJyYXkqIGNsLCB1aW50MzIgbGVuLCBzaW50MzIqIGRpbXMpIHsKLSAgYXNzZXJ0KGxlbiA+IDAgJiYgIk5lZ2F0aXZlIHNpemUgZ2l2ZW4gYnkgVk1LaXQiKTsKLSAKLSAgSmF2YU9iamVjdCogX3JlcyA9IGNsLT5kb05ldyhkaW1zWzBdKTsKLSAgQXJyYXlPYmplY3QqIHJlcyA9IE5VTEw7Ci0gIEphdmFPYmplY3QqIHRlbXAgPSBOVUxMOwotICBsbHZtX2djcm9vdChfcmVzLCAwKTsKLSAgbGx2bV9nY3Jvb3QocmVzLCAwKTsKLSAgbGx2bV9nY3Jvb3QodGVtcCwgMCk7Ci0KLSAgaWYgKGxlbiA+IDEpIHsKLSAgICByZXMgPSAoQXJyYXlPYmplY3QqKV9yZXM7Ci0gICAgVXNlckNvbW1vbkNsYXNzKiBfYmFzZSA9IGNsLT5iYXNlQ2xhc3MoKTsKLSAgICBhc3NlcnQoX2Jhc2UtPmlzQXJyYXkoKSAmJiAiQmFzZSBjbGFzcyBub3QgYW4gYXJyYXkiKTsKLSAgICBVc2VyQ2xhc3NBcnJheSogYmFzZSA9IChVc2VyQ2xhc3NBcnJheSopX2Jhc2U7Ci0gICAgaWYgKGRpbXNbMF0gPiAwKSB7Ci0gICAgICBmb3IgKHNpbnQzMiBpID0gMDsgaSA8IGRpbXNbMF07ICsraSkgewotICAgICAgICB0ZW1wID0gbXVsdGlDYWxsTmV3SW50ZXJuKGJhc2UsIChsZW4gLSAxKSwgJmRpbXNbMV0pOwotICAgICAgICBBcnJheU9iamVjdDo6c2V0RWxlbWVudChyZXMsIHRlbXAsIGkpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBmb3IgKHVpbnQzMiBpID0gMTsgaSA8IGxlbjsgKytpKSB7Ci0gICAgICAgIHNpbnQzMiBwID0gZGltc1tpXTsKLSAgICAgICAgaWYgKHAgPCAwKSB7Ci0gICAgICAgICAgY2wtPmNsYXNzTG9hZGVyLT52bS0+bmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24ocCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIF9yZXM7Ci19Ci0KLS8vIFRocm93cyBpZiBvbmUgb2YgdGhlIGRpbWVuc2lvbiBpcyBuZWdhdGl2ZS4KLWV4dGVybiAiQyIgSmF2YU9iamVjdCogajNNdWx0aUNhbGxOZXcoVXNlckNsYXNzQXJyYXkqIGNsLCB1aW50MzIgbGVuLCAuLi4pIHsKLSAgSmF2YU9iamVjdCogcmVzID0gMDsKLSAgbGx2bV9nY3Jvb3QocmVzLCAwKTsKLQotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDEpCi0KLSAgdmFfbGlzdCBhcDsKLSAgdmFfc3RhcnQoYXAsIGxlbik7Ci0gIG12bTo6VGhyZWFkQWxsb2NhdG9yIGFsbG9jYXRvcjsKLSAgc2ludDMyKiBkaW1zID0gKHNpbnQzMiopYWxsb2NhdG9yLkFsbG9jYXRlKHNpemVvZihzaW50MzIpICogbGVuKTsKLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBsZW47ICsraSl7Ci0gICAgZGltc1tpXSA9IHZhX2FyZyhhcCwgaW50KTsKLSAgfQotICByZXMgPSBtdWx0aUNhbGxOZXdJbnRlcm4oY2wsIGxlbiwgZGltcyk7Ci0JCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLSAgcmV0dXJuIHJlczsKLX0KLQotLy8gVGhyb3dzIGlmIHRoZSBjbGFzcyBjYW4gbm90IGJlIHJlc29sdmVkLgotZXh0ZXJuICJDIiBKYXZhVmlydHVhbFRhYmxlKiBqM0dldEFycmF5Q2xhc3MoVXNlckNsYXNzKiBjYWxsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhVmlydHVhbFRhYmxlKiogVlQpIHsKLSAgSmF2YVZpcnR1YWxUYWJsZSogcmVzID0gMDsKLSAgYXNzZXJ0KFZUICYmICJJbmNvcnJlY3QgY2FsbCB0byBqM0dldEFycmF5Q2xhc3MiKTsKLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigxKQotICAKLSAgVXNlckNvbnN0YW50UG9vbCogY3RwSW5mbyA9IGNhbGxlci0+Z2V0Q29uc3RhbnRQb29sKCk7Ci0gIFVzZXJDb21tb25DbGFzcyogY2wgPSBjdHBJbmZvLT5sb2FkQ2xhc3MoaW5kZXgpOwotICAKLSAgSm5qdm1DbGFzc0xvYWRlciogSkNMID0gY2wtPmNsYXNzTG9hZGVyOwotICBpZiAoY2wtPmFzQ2xhc3MoKSkgY2wtPmFzQ2xhc3MoKS0+cmVzb2x2ZUNsYXNzKCk7Ci0gIGNvbnN0IFVURjgqIGFycmF5TmFtZSA9IEpDTC0+Y29uc3RydWN0QXJyYXlOYW1lKDEsIGNsLT5nZXROYW1lKCkpOwotICAKLSAgcmVzID0gSkNMLT5jb25zdHJ1Y3RBcnJheShhcnJheU5hbWUpLT52aXJ0dWFsVlQ7Ci0gICpWVCA9IHJlczsKLQotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotCi0JaGFja19jaGVjayhKYXZhVmlydHVhbFRhYmxlKik7Ci0KLSAgcmV0dXJuIHJlczsKLX0KLQotLy8gRG9lcyBub3QgY2FsbCBKYXZhIGNvZGUuIENhbiBub3QgeWllbGQgYSBHQy4KLWV4dGVybiAiQyIgdm9pZCBqM0VuZEpOSSh1aW50MzIqKiBvbGRMUk4pIHsKLSAgSmF2YVRocmVhZCogdGggPSBKYXZhVGhyZWFkOjpnZXQoKTsKLSAgCi0gIC8vIFdlJ3JlIGdvaW5nIGJhY2sgdG8gSmF2YQotICB0aC0+ZW5kSk5JKCk7Ci0gIAotICAvLyBVcGRhdGUgdGhlIG51bWJlciBvZiByZWZlcmVuY2VzLgotICB0aC0+Y3VycmVudEFkZGVkUmVmZXJlbmNlcyA9ICpvbGRMUk47Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCogajNTdGFydEpOSSh1aW50MzIqIGxvY2FsUmVmZXJlbmNlc051bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIqKiBvbGRMb2NhbFJlZmVyZW5jZXNOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXZtOjpLbm93bkZyYW1lKiBGcmFtZSkgCi0gIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSk7Ci0KLS8vIE5ldmVyIHRocm93cy4gRG9lcyBub3QgY2FsbCBKYXZhIGNvZGUuIENhbiBub3QgeWllZCBhIEdDLgotZXh0ZXJuICJDIiB2b2lkKiBqM1N0YXJ0Sk5JKHVpbnQzMiogbG9jYWxSZWZlcmVuY2VzTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMioqIG9sZExvY2FsUmVmZXJlbmNlc051bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdm06Oktub3duRnJhbWUqIEZyYW1lKSB7Ci0KLQltdm06OlRocmVhZCogbXV0ID0gbXZtOjpUaHJlYWQ6OmdldCgpOwotICBKYXZhVGhyZWFkKiB0aCAgID0gSmF2YVRocmVhZDo6ajNUaHJlYWQobXV0KTsKLSAKLSAgKm9sZExvY2FsUmVmZXJlbmNlc051bWJlciA9IHRoLT5jdXJyZW50QWRkZWRSZWZlcmVuY2VzOwotICB0aC0+Y3VycmVudEFkZGVkUmVmZXJlbmNlcyA9IGxvY2FsUmVmZXJlbmNlc051bWJlcjsKLSAgdGgtPnN0YXJ0Sk5JKCk7Ci0gIG11dC0+c3RhcnRVbmtub3duRnJhbWUoKkZyYW1lKTsKLSAgbXV0LT5lbnRlclVuY29vcGVyYXRpdmVDb2RlKCk7Ci0gIGFzc2VydChtdXQtPmdldExhc3RTUCgpID09IG11dC0+bGFzdEtub3duRnJhbWUtPmN1cnJlbnRGUCk7Ci0KLSAgcmV0dXJuIEZyYW1lLT5jdXJyZW50RlA7Ci19Ci0KLS8vIE5ldmVyIHRocm93cy4KLWV4dGVybiAiQyIgdm9pZCBqM0phdmFPYmplY3RBcXVpcmUoSmF2YU9iamVjdCogb2JqKSB7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gIEphdmFPYmplY3Q6OmFjcXVpcmUob2JqKTsKLX0KLQotLy8gTmV2ZXIgdGhyb3dzLgotZXh0ZXJuICJDIiB2b2lkIGozSmF2YU9iamVjdFJlbGVhc2UoSmF2YU9iamVjdCogb2JqKSB7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gIEphdmFPYmplY3Q6OnJlbGVhc2Uob2JqKTsKLX0KLQotLy8gRG9lcyBub3QgY2FsbCBhbnkgSmF2YSBjb2RlLiBDYW4gbm90IHlpZWxkIGEgR0MuCi1leHRlcm4gIkMiIHZvaWQgajNUaHJvd0V4Y2VwdGlvbihKYXZhT2JqZWN0KiBvYmopIHsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgcmV0dXJuIG12bTo6VGhyZWFkOjpnZXQoKS0+c2V0UGVuZGluZ0V4Y2VwdGlvbihvYmopLT50aHJvd0l0KCk7Ci19Ci0KLS8vIENyZWF0ZXMgYSBKYXZhIG9iamVjdCBhbmQgdGhlbiB0aHJvd3MgaXQuCi1leHRlcm4gIkMiIEphdmFPYmplY3QqIGozTnVsbFBvaW50ZXJFeGNlcHRpb24oKSB7Ci0gIEphdmFPYmplY3QgKmV4YyA9IDA7Ci0gIGxsdm1fZ2Nyb290KGV4YywgMCk7Ci0gIEphdmFUaHJlYWQgKnRoID0gSmF2YVRocmVhZDo6Z2V0KCk7Ci0KLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigxKQotICAKLSAgZXhjID0gdGgtPmdldEpWTSgpLT5DcmVhdGVOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLQl0aC0+bXV0LT5zZXRQZW5kaW5nRXhjZXB0aW9uKGV4Yyk7Ci0JdGgtPnRocm93RnJvbU5hdGl2ZSgpOwotCi0gIHJldHVybiBleGM7Ci19Ci0KLS8vIENyZWF0ZXMgYSBKYXZhIG9iamVjdCBhbmQgdGhlbiB0aHJvd3MgaXQuCi1leHRlcm4gIkMiIEphdmFPYmplY3QqIGozTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24oc2ludDMyIHZhbCkgewotICBKYXZhT2JqZWN0ICpleGMgPSAwOwotICBsbHZtX2djcm9vdChleGMsIDApOwotICBKYXZhVGhyZWFkICp0aCA9IEphdmFUaHJlYWQ6OmdldCgpOwotCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMSkKLSAgCi0gIGV4YyA9IHRoLT5nZXRKVk0oKS0+Q3JlYXRlTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24oKTsKLQotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotCi0JdGgtPm11dC0+c2V0UGVuZGluZ0V4Y2VwdGlvbihleGMpOwotCXRoLT50aHJvd0Zyb21OYXRpdmUoKTsKLQotICByZXR1cm4gZXhjOwotfQotCi0vLyBDcmVhdGVzIGEgSmF2YSBvYmplY3QgYW5kIHRoZW4gdGhyb3dzIGl0LgotZXh0ZXJuICJDIiBKYXZhT2JqZWN0KiBqM091dE9mTWVtb3J5RXJyb3Ioc2ludDMyIHZhbCkgewotICBKYXZhT2JqZWN0ICpleGMgPSAwOwotICBsbHZtX2djcm9vdChleGMsIDApOwotICBKYXZhVGhyZWFkICp0aCA9IEphdmFUaHJlYWQ6OmdldCgpOwotCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMSkKLSAgCi0gIGV4YyA9IHRoLT5nZXRKVk0oKS0+Q3JlYXRlT3V0T2ZNZW1vcnlFcnJvcigpOwotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLQl0aC0+bXV0LT5zZXRQZW5kaW5nRXhjZXB0aW9uKGV4Yyk7Ci0JdGgtPnRocm93RnJvbU5hdGl2ZSgpOwotCi0gIHJldHVybiBleGM7Ci19Ci0KLS8vIENyZWF0ZXMgYSBKYXZhIG9iamVjdCBhbmQgdGhlbiB0aHJvd3MgaXQuCi1leHRlcm4gIkMiIEphdmFPYmplY3QqIGozU3RhY2tPdmVyZmxvd0Vycm9yKCkgewotICBKYXZhT2JqZWN0ICpleGMgPSAwOwotICBsbHZtX2djcm9vdChleGMsIDApOwotICBKYXZhVGhyZWFkICp0aCA9IEphdmFUaHJlYWQ6OmdldCgpOwotCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMSkKLSAgCi0gIGV4YyA9IHRoLT5nZXRKVk0oKS0+Q3JlYXRlU3RhY2tPdmVyZmxvd0Vycm9yKCk7Ci0KLSAgRU5EX05BVElWRV9FWENFUFRJT04KLQotCXRoLT5tdXQtPnNldFBlbmRpbmdFeGNlcHRpb24oZXhjKTsKLQl0aC0+dGhyb3dGcm9tTmF0aXZlKCk7Ci0KLSAgcmV0dXJuIGV4YzsKLX0KLQotLy8gQ3JlYXRlcyBhIEphdmEgb2JqZWN0IGFuZCB0aGVuIHRocm93cyBpdC4KLWV4dGVybiAiQyIgSmF2YU9iamVjdCogajNBcml0aG1ldGljRXhjZXB0aW9uKCkgewotICBKYXZhT2JqZWN0ICpleGMgPSAwOwotICBsbHZtX2djcm9vdChleGMsIDApOwotICBKYXZhVGhyZWFkICp0aCA9IEphdmFUaHJlYWQ6OmdldCgpOwotCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMSkKLSAgCi0gIGV4YyA9IHRoLT5nZXRKVk0oKS0+Q3JlYXRlQXJpdGhtZXRpY0V4Y2VwdGlvbigpOwotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLQl0aC0+bXV0LT5zZXRQZW5kaW5nRXhjZXB0aW9uKGV4Yyk7Ci0JdGgtPnRocm93RnJvbU5hdGl2ZSgpOwotCi0gIHJldHVybiBleGM7Ci19Ci0KLS8vIENyZWF0ZXMgYSBKYXZhIG9iamVjdCBhbmQgdGhlbiB0aHJvd3MgaXQuCi1leHRlcm4gIkMiIEphdmFPYmplY3QqIGozQ2xhc3NDYXN0RXhjZXB0aW9uKEphdmFPYmplY3QqIG9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckNvbW1vbkNsYXNzKiBjbCkgewotICBKYXZhT2JqZWN0ICpleGMgPSAwOwotICBsbHZtX2djcm9vdChvYmosIDApOwotICBsbHZtX2djcm9vdChleGMsIDApOwotICAKLSAgSmF2YVRocmVhZCAqdGggPSBKYXZhVGhyZWFkOjpnZXQoKTsKLQotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDEpCi0gIAotICBleGMgPSB0aC0+Z2V0SlZNKCktPkNyZWF0ZUNsYXNzQ2FzdEV4Y2VwdGlvbihvYmosIGNsKTsKLQotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotCi0JdGgtPm11dC0+c2V0UGVuZGluZ0V4Y2VwdGlvbihleGMpOwotCXRoLT50aHJvd0Zyb21OYXRpdmUoKTsKLQotICByZXR1cm4gZXhjOwotfQotCi0vLyBDcmVhdGVzIGEgSmF2YSBvYmplY3QgYW5kIHRoZW4gdGhyb3dzIGl0LgotZXh0ZXJuICJDIiBKYXZhT2JqZWN0KiBqM0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oSmF2YU9iamVjdCogb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ludDMyIGluZGV4KSB7Ci0gIEphdmFPYmplY3QgKmV4YyA9IDA7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gIGxsdm1fZ2Nyb290KGV4YywgMCk7Ci0gIAotICBKYXZhVGhyZWFkICp0aCA9IEphdmFUaHJlYWQ6OmdldCgpOwotCi0gIEJFR0lOX05BVElWRV9FWENFUFRJT04oMSkKLSAgCi0gIGV4YyA9IHRoLT5nZXRKVk0oKS0+Q3JlYXRlSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihpbmRleCk7Ci0KLSAgRU5EX05BVElWRV9FWENFUFRJT04KLQotCXRoLT5tdXQtPnNldFBlbmRpbmdFeGNlcHRpb24oZXhjKTsKLQl0aC0+dGhyb3dGcm9tTmF0aXZlKCk7Ci0gIAotICByZXR1cm4gZXhjOwotfQotCi0vLyBDcmVhdGVzIGEgSmF2YSBvYmplY3QgYW5kIHRoZW4gdGhyb3dzIGl0LgotZXh0ZXJuICJDIiBKYXZhT2JqZWN0KiBqM0FycmF5U3RvcmVFeGNlcHRpb24oSmF2YVZpcnR1YWxUYWJsZSogVlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhVmlydHVhbFRhYmxlKiBWVDIpIHsKLSAgSmF2YU9iamVjdCAqZXhjID0gMDsKLSAgbGx2bV9nY3Jvb3QoZXhjLCAwKTsKLSAgSmF2YVRocmVhZCAqdGggPSBKYXZhVGhyZWFkOjpnZXQoKTsKLQotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDEpCi0gIGV4YyA9IHRoLT5nZXRKVk0oKS0+Q3JlYXRlQXJyYXlTdG9yZUV4Y2VwdGlvbihWVCk7Ci0KLSAgRU5EX05BVElWRV9FWENFUFRJT04KLQotCXRoLT5tdXQtPnNldFBlbmRpbmdFeGNlcHRpb24oZXhjKTsKLQl0aC0+dGhyb3dGcm9tTmF0aXZlKCk7Ci0gIAotICByZXR1cm4gZXhjOwotfQotCi0vLyBDcmVhdGUgYW4gZXhjZXB0aW9uIHRoZW4gdGhyb3dzIGl0LgotZXh0ZXJuICJDIiB2b2lkIGozVGhyb3dFeGNlcHRpb25Gcm9tSklUKCkgewotICBKYXZhT2JqZWN0ICpleGMgPSAwOwotICBsbHZtX2djcm9vdChleGMsIDApOwotICBKYXZhVGhyZWFkICp0aCA9IEphdmFUaHJlYWQ6OmdldCgpOwotICAKLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigxKQotCi0gIEphdmFNZXRob2QqIG1ldGggPSB0aC0+Z2V0Q2FsbGluZ01ldGhvZExldmVsKDApOwotICBleGMgPSB0aC0+Z2V0SlZNKCktPkNyZWF0ZVVuc2F0aXNmaWVkTGlua0Vycm9yKG1ldGgpOwotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLQl0aC0+bXV0LT5zZXRQZW5kaW5nRXhjZXB0aW9uKGV4Yyk7Ci0JdGgtPnRocm93RnJvbU5hdGl2ZSgpOwotICAKLX0KLQotZXh0ZXJuICJDIiB2b2lkKiBqM1N0cmluZ0xvb2t1cChVc2VyQ2xhc3MqIGNsLCB1aW50MzIgaW5kZXgpIHsKLSAgCi0gIEphdmFTdHJpbmcqKiBzdHIgPSAwOwotICAKLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigxKQotICAKLSAgVXNlckNvbnN0YW50UG9vbCogY3RwSW5mbyA9IGNsLT5nZXRDb25zdGFudFBvb2woKTsKLSAgY29uc3QgVVRGOCogdXRmOCA9IGN0cEluZm8tPlVURjhBdChjdHBJbmZvLT5jdHBEZWZbaW5kZXhdKTsKLSAgc3RyID0gY2wtPmNsYXNzTG9hZGVyLT5VVEY4VG9TdHIodXRmOCk7Ci0gIGN0cEluZm8tPmN0cFJlc1tpbmRleF0gPSBzdHI7Ci0gIAotICBFTkRfTkFUSVZFX0VYQ0VQVElPTgotCi0gIHJldHVybiAodm9pZCopc3RyOwotfQotCi1leHRlcm4gIkMiIHZvaWQqIGozUmVzb2x2ZVZpcnR1YWxTdHViKEphdmFPYmplY3QqIG9iaikgewotICBsbHZtX2djcm9vdChvYmosIDApOwotCW12bTo6VGhyZWFkICptdXQgPSBtdm06OlRocmVhZDo6Z2V0KCk7Ci0gIFVzZXJDb21tb25DbGFzcyogY2wgPSBKYXZhT2JqZWN0OjpnZXRDbGFzcyhvYmopOwotICB2b2lkKiByZXN1bHQgPSBOVUxMOwotICAKLSAgQkVHSU5fTkFUSVZFX0VYQ0VQVElPTigxKQotCi0gIC8vIExvb2t1cCB0aGUgY2FsbGVyIG9mIHRoaXMgY2xhc3MuCi0gIG12bTo6U3RhY2tXYWxrZXIgV2Fsa2VyKG11dCk7Ci0gICsrV2Fsa2VyOyAvLyBSZW1vdmUgdGhlIHN0dWIuCi0gIG12bTo6TWV0aG9kSW5mbyogTUkgPSBXYWxrZXIuZ2V0KCk7Ci0gIGFzc2VydChNSS0+aXNIaWdoTGV2ZWxNZXRob2QoKSAmJiAiV3Jvbmcgc3RhY2sgdHJhY2UiKTsKLSAgSmF2YU1ldGhvZCogbWV0aCA9IChKYXZhTWV0aG9kKilNSS0+TWV0YUluZm87Ci0gIHZvaWQqIGlwID0gKldhbGtlcjsKLQotICAvLyBMb29rdXAgdGhlIG1ldGhvZCBpbmZvIGluIHRoZSBjb25zdGFudCBwb29sIG9mIHRoZSBjYWxsZXIuCi0gIHVpbnQxNiBjdHBJbmRleCA9IG1ldGgtPmxvb2t1cEN0cEluZGV4KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihpcCkpOwotICBhc3NlcnQoY3RwSW5kZXggJiYgIk5vIGNvbnN0YW50IHBvb2wgaW5kZXgiKTsKLSAgSmF2YUNvbnN0YW50UG9vbCogY3RwSW5mbyA9IG1ldGgtPmNsYXNzRGVmLT5nZXRDb25zdGFudFBvb2woKTsKLSAgQ29tbW9uQ2xhc3MqIGN0cENsID0gMDsKLSAgY29uc3QgVVRGOCogdXRmOCA9IDA7Ci0gIFNpZ25kZWYqIHNpZ24gPSAwOwotICBKYXZhTWV0aG9kKiBvcmlnTWV0aCA9IDA7Ci0gIGN0cEluZm8tPmluZm9PZk1ldGhvZChjdHBJbmRleCwgQUNDX1ZJUlRVQUwsIGN0cENsLCBvcmlnTWV0aCk7Ci0KLSAgY3RwSW5mby0+cmVzb2x2ZU1ldGhvZChjdHBJbmRleCwgY3RwQ2wsIHV0ZjgsIHNpZ24pOwotICBhc3NlcnQoY2wtPmlzQXNzaWduYWJsZUZyb20oY3RwQ2wpICYmICJXcm9uZyBjYWxsIG9iamVjdCIpOwotICBVc2VyQ2xhc3MqIGxvb2t1cCA9IGNsLT5pc0FycmF5KCkgPyBjbC0+c3VwZXIgOiBjbC0+YXNDbGFzcygpOwotICBKYXZhTWV0aG9kKiBWaXJ0ID0gbG9va3VwLT5sb29rdXBNZXRob2QodXRmOCwgc2lnbi0+a2V5TmFtZSwgZmFsc2UsIHRydWUsIDApOwotCi0gIC8vIENvbXBpbGUgdGhlIGZvdW5kIG1ldGhvZC4KLSAgcmVzdWx0ID0gVmlydC0+Y29tcGlsZWRQdHIoKTsKLQotICAvLyBVcGRhdGUgdGhlIHZpcnR1YWwgdGFibGUuCi0gIGFzc2VydChsb29rdXAtPmlzUmVzb2x2ZWQoKSAmJiAiQ2xhc3Mgbm90IHJlc29sdmVkIik7Ci0gIGFzc2VydChsb29rdXAtPmlzSW5pdGlhbGl6aW5nKCkgJiYgIkNsYXNzIG5vdCByZWFkeSIpOwotICBhc3NlcnQobG9va3VwLT52aXJ0dWFsVlQgJiYgIkNsYXNzIGhhcyBubyBWVCIpOwotICBhc3NlcnQobG9va3VwLT52aXJ0dWFsVGFibGVTaXplID4gVmlydC0+b2Zmc2V0ICYmIAotICAgICAgICAgIlRoZSBtZXRob2QncyBvZmZzZXQgaXMgZ3JlYXRlciB0aGFuIHRoZSB2aXJ0dWFsIHRhYmxlIHNpemUiKTsKLSAgKCh2b2lkKiopb2JqLT5nZXRWaXJ0dWFsVGFibGUoKSlbVmlydC0+b2Zmc2V0XSA9IHJlc3VsdDsKLSAgCi0gIGlmIChpc0ludGVyZmFjZShvcmlnTWV0aC0+Y2xhc3NEZWYtPmFjY2VzcykpIHsKLSAgICBJbnRlcmZhY2VNZXRob2RUYWJsZSogSU1UID0gY2wtPnZpcnR1YWxWVC0+SU1UOwotICAgIHVpbnQzMl90IGluZGV4ID0gSW50ZXJmYWNlTWV0aG9kVGFibGU6OmdldEluZGV4KFZpcnQtPm5hbWUsIFZpcnQtPnR5cGUpOwotICAgIGlmICgoSU1ULT5jb250ZW50c1tpbmRleF0gJiAxKSA9PSAwKSB7Ci0gICAgICBJTVQtPmNvbnRlbnRzW2luZGV4XSA9ICh1aW50cHRyX3QpcmVzdWx0OwotICAgIH0gZWxzZSB7IAotICAgICAgSmF2YU1ldGhvZCogSW1ldGggPSAKLSAgICAgICAgY3RwQ2wtPmFzQ2xhc3MoKS0+bG9va3VwSW50ZXJmYWNlTWV0aG9kRG9udFRocm93KHV0ZjgsIHNpZ24tPmtleU5hbWUpOwotICAgICAgYXNzZXJ0KEltZXRoICYmICJNZXRob2Qgbm90IGluIGhpZXJhcmNoeT8iKTsKLSAgICAgIHVpbnRwdHJfdCogdGFibGUgPSAodWludHB0cl90KikoSU1ULT5jb250ZW50c1tpbmRleF0gJiB+MSk7Ci0gICAgICB1aW50MzIgaSA9IDA7Ci0gICAgICB3aGlsZSAodGFibGVbaV0gIT0gKHVpbnRwdHJfdClJbWV0aCkgeyBpICs9IDI7IH0KLSAgICAgIHRhYmxlW2kgKyAxXSA9ICh1aW50cHRyX3QpcmVzdWx0OwotICAgIH0KLSAgfQotCi0gIEVORF9OQVRJVkVfRVhDRVBUSU9OCi0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotZXh0ZXJuICJDIiB2b2lkKiBqM1Jlc29sdmVTdGF0aWNTdHViKCkgewotCW12bTo6VGhyZWFkICptdXQgPSBtdm06OlRocmVhZDo6Z2V0KCk7Ci0gIHZvaWQqIHJlc3VsdCA9IE5VTEw7Ci0gIAotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDEpCi0KLSAgLy8gTG9va3VwIHRoZSBjYWxsZXIgb2YgdGhpcyBjbGFzcy4KLSAgbXZtOjpTdGFja1dhbGtlciBXYWxrZXIobXV0KTsKLSAgKytXYWxrZXI7IC8vIFJlbW92ZSB0aGUgc3R1Yi4KLSAgbXZtOjpNZXRob2RJbmZvKiBNSSA9IFdhbGtlci5nZXQoKTsKLSAgYXNzZXJ0KE1JLT5pc0hpZ2hMZXZlbE1ldGhvZCgpICYmICJXcm9uZyBzdGFjayB0cmFjZSIpOwotICBKYXZhTWV0aG9kKiBjYWxsZXIgPSAoSmF2YU1ldGhvZCopTUktPk1ldGFJbmZvOwotICB2b2lkKiBpcCA9ICpXYWxrZXI7Ci0KLSAgLy8gTG9va3VwIHRoZSBtZXRob2QgaW5mbyBpbiB0aGUgY29uc3RhbnQgcG9vbCBvZiB0aGUgY2FsbGVyLgotICB1aW50MTYgY3RwSW5kZXggPSBjYWxsZXItPmxvb2t1cEN0cEluZGV4KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihpcCkpOwotICBhc3NlcnQoY3RwSW5kZXggJiYgIk5vIGNvbnN0YW50IHBvb2wgaW5kZXgiKTsKLSAgSmF2YUNvbnN0YW50UG9vbCogY3RwSW5mbyA9IGNhbGxlci0+Y2xhc3NEZWYtPmdldENvbnN0YW50UG9vbCgpOwotICBDb21tb25DbGFzcyogY2wgPSAwOwotICBjb25zdCBVVEY4KiB1dGY4ID0gMDsKLSAgU2lnbmRlZiogc2lnbiA9IDA7Ci0KLSAgY3RwSW5mby0+cmVzb2x2ZU1ldGhvZChjdHBJbmRleCwgY2wsIHV0ZjgsIHNpZ24pOwotICBVc2VyQ2xhc3MqIGxvb2t1cCA9IGNsLT5pc0FycmF5KCkgPyBjbC0+c3VwZXIgOiBjbC0+YXNDbGFzcygpOwotICBhc3NlcnQobG9va3VwLT5pc0luaXRpYWxpemluZygpICYmICJDbGFzcyBub3QgcmVhZHkiKTsKLSAgSmF2YU1ldGhvZCogY2FsbGVlID0gbG9va3VwLT5sb29rdXBNZXRob2QodXRmOCwgc2lnbi0+a2V5TmFtZSwgdHJ1ZSwgdHJ1ZSwgMCk7Ci0KLSAgLy8gQ29tcGlsZSB0aGUgZm91bmQgbWV0aG9kLgotICByZXN1bHQgPSBjYWxsZWUtPmNvbXBpbGVkUHRyKCk7Ci0gICAgCi0gIC8vIFVwZGF0ZSB0aGUgZW50cnkgaW4gdGhlIGNvbnN0YW50IHBvb2wuCi0gIGN0cEluZm8tPmN0cFJlc1tjdHBJbmRleF0gPSByZXN1bHQ7Ci0KLSAgRU5EX05BVElWRV9FWENFUFRJT04KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi1leHRlcm4gIkMiIHZvaWQqIGozUmVzb2x2ZVNwZWNpYWxTdHViKCkgewotCW12bTo6VGhyZWFkICptdXQgPSBtdm06OlRocmVhZDo6Z2V0KCk7Ci0gIHZvaWQqIHJlc3VsdCA9IE5VTEw7Ci0gIAotICBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKDEpCi0KLSAgLy8gTG9va3VwIHRoZSBjYWxsZXIgb2YgdGhpcyBjbGFzcy4KLSAgbXZtOjpTdGFja1dhbGtlciBXYWxrZXIobXV0KTsKLSAgKytXYWxrZXI7IC8vIFJlbW92ZSB0aGUgc3R1Yi4KLSAgbXZtOjpNZXRob2RJbmZvKiBNSSA9IFdhbGtlci5nZXQoKTsKLSAgYXNzZXJ0KE1JLT5pc0hpZ2hMZXZlbE1ldGhvZCgpICYmICJXcm9uZyBzdGFjayB0cmFjZSIpOwotICBKYXZhTWV0aG9kKiBjYWxsZXIgPSAoSmF2YU1ldGhvZCopTUktPk1ldGFJbmZvOwotICB2b2lkKiBpcCA9ICpXYWxrZXI7Ci0KLSAgLy8gTG9va3VwIHRoZSBtZXRob2QgaW5mbyBpbiB0aGUgY29uc3RhbnQgcG9vbCBvZiB0aGUgY2FsbGVyLgotICB1aW50MTYgY3RwSW5kZXggPSBjYWxsZXItPmxvb2t1cEN0cEluZGV4KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihpcCkpOwotICBhc3NlcnQoY3RwSW5kZXggJiYgIk5vIGNvbnN0YW50IHBvb2wgaW5kZXgiKTsKLSAgSmF2YUNvbnN0YW50UG9vbCogY3RwSW5mbyA9IGNhbGxlci0+Y2xhc3NEZWYtPmdldENvbnN0YW50UG9vbCgpOwotICBDb21tb25DbGFzcyogY2wgPSAwOwotICBjb25zdCBVVEY4KiB1dGY4ID0gMDsKLSAgU2lnbmRlZiogc2lnbiA9IDA7Ci0KLSAgY3RwSW5mby0+cmVzb2x2ZU1ldGhvZChjdHBJbmRleCwgY2wsIHV0ZjgsIHNpZ24pOwotICBVc2VyQ2xhc3MqIGxvb2t1cCA9IGNsLT5pc0FycmF5KCkgPyBjbC0+c3VwZXIgOiBjbC0+YXNDbGFzcygpOwotICBhc3NlcnQobG9va3VwLT5pc0luaXRpYWxpemluZygpICYmICJDbGFzcyBub3QgcmVhZHkiKTsKLSAgSmF2YU1ldGhvZCogY2FsbGVlID0KLSAgICBsb29rdXAtPmxvb2t1cFNwZWNpYWxNZXRob2REb250VGhyb3codXRmOCwgc2lnbi0+a2V5TmFtZSwgY2FsbGVyLT5jbGFzc0RlZik7Ci0gIAotICBpZiAoIWNhbGxlZSkgewotCQljbC0+Y2xhc3NMb2FkZXItPnZtLT5ub1N1Y2hNZXRob2RFcnJvcihsb29rdXAsIHV0ZjgpOwotICB9Ci0KLSAgLy8gQ29tcGlsZSB0aGUgZm91bmQgbWV0aG9kLgotICByZXN1bHQgPSBjYWxsZWUtPmNvbXBpbGVkUHRyKCk7Ci0gICAgCi0gIC8vIFVwZGF0ZSB0aGUgZW50cnkgaW4gdGhlIGNvbnN0YW50IHBvb2wuCi0gIGN0cEluZm8tPmN0cFJlc1tjdHBJbmRleF0gPSByZXN1bHQ7Ci0KLSAgRU5EX05BVElWRV9FWENFUFRJT04KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBEb2VzIG5vdCB0aHJvdyBhbiBleGNlcHRpb24uCi1leHRlcm4gIkMiIHZvaWQqIGozUmVzb2x2ZUludGVyZmFjZShKYXZhT2JqZWN0KiBvYmosIEphdmFNZXRob2QqIG1ldGgsIHVpbnQzMl90IGluZGV4KSB7Ci0gIHVpbnRwdHJfdCByZXN1bHQgPSBOVUxMOwotICBJbnRlcmZhY2VNZXRob2RUYWJsZSogSU1UID0gSmF2YU9iamVjdDo6Z2V0Q2xhc3Mob2JqKS0+dmlydHVhbFZULT5JTVQ7Ci0gIGFzc2VydChKYXZhT2JqZWN0OjppbnN0YW5jZU9mKG9iaiwgbWV0aC0+Y2xhc3NEZWYpKTsKLSAgYXNzZXJ0KG1ldGgtPmNsYXNzRGVmLT5pc0ludGVyZmFjZSgpIHx8Ci0gICAgICAobWV0aC0+Y2xhc3NEZWYgPT0gbWV0aC0+Y2xhc3NEZWYtPmNsYXNzTG9hZGVyLT5ib290c3RyYXBMb2FkZXItPnVwY2FsbHMtPk9mT2JqZWN0KSk7Ci0gIGFzc2VydChpbmRleCA9PSBJbnRlcmZhY2VNZXRob2RUYWJsZTo6Z2V0SW5kZXgobWV0aC0+bmFtZSwgbWV0aC0+dHlwZSkpOwotICBpZiAoKElNVC0+Y29udGVudHNbaW5kZXhdICYgMSkgPT0gMCkgewotICAgIHJlc3VsdCA9IElNVC0+Y29udGVudHNbaW5kZXhdOwotICB9IGVsc2UgewotICAgIHVpbnRwdHJfdCogdGFibGUgPSAodWludHB0cl90KikoSU1ULT5jb250ZW50c1tpbmRleF0gJiB+MSk7Ci0gICAgdWludDMyIGkgPSAwOwotICAgIHdoaWxlICh0YWJsZVtpXSAhPSAodWludHB0cl90KW1ldGggJiYgdGFibGVbaV0gIT0gMCkgeyBpICs9IDI7IH0KLSAgICBhc3NlcnQodGFibGVbaV0gIT0gMCk7Ci0gICAgcmVzdWx0ID0gdGFibGVbaSArIDFdOwotICB9Ci0gIGFzc2VydCgocmVzdWx0ICE9IDApICYmICJCYWQgSU1UIik7Ci0gIHJldHVybiAodm9pZCopcmVzdWx0OwotfQotCi1leHRlcm4gIkMiIHZvaWQgajNQcmludE1ldGhvZFN0YXJ0KEphdmFNZXRob2QqIG1ldGgpIHsKLSAgZnByaW50ZihzdGRlcnIsICJbJXBdIGV4ZWN1dGluZyAlcy4lc1xuIiwgKHZvaWQqKW12bTo6VGhyZWFkOjpnZXQoKSwKLSAgICAgICAgICBVVEY4QnVmZmVyKG1ldGgtPmNsYXNzRGVmLT5uYW1lKS5jU3RyaW5nKCksCi0gICAgICAgICAgVVRGOEJ1ZmZlcihtZXRoLT5uYW1lKS5jU3RyaW5nKCkpOwotfQotCi1leHRlcm4gIkMiIHZvaWQgajNQcmludE1ldGhvZEVuZChKYXZhTWV0aG9kKiBtZXRoKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiWyVwXSByZXR1cm4gZnJvbSAlcy4lc1xuIiwgKHZvaWQqKW12bTo6VGhyZWFkOjpnZXQoKSwKLSAgICAgICAgICBVVEY4QnVmZmVyKG1ldGgtPmNsYXNzRGVmLT5uYW1lKS5jU3RyaW5nKCksCi0gICAgICAgICAgVVRGOEJ1ZmZlcihtZXRoLT5uYW1lKS5jU3RyaW5nKCkpOwotfQotCi1leHRlcm4gIkMiIHZvaWQgajNQcmludEV4ZWN1dGlvbih1aW50MzIgb3Bjb2RlLCB1aW50MzIgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhTWV0aG9kKiBtZXRoKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiWyVwXSBleGVjdXRpbmcgJXMuJXMgJXMgYXQgJWRcbiIsICh2b2lkKiltdm06OlRocmVhZDo6Z2V0KCksCi0gICAgICAgICBVVEY4QnVmZmVyKG1ldGgtPmNsYXNzRGVmLT5uYW1lKS5jU3RyaW5nKCksCi0gICAgICAgICBVVEY4QnVmZmVyKG1ldGgtPm5hbWUpLmNTdHJpbmcoKSwKLSAgICAgICAgIE9wY29kZU5hbWVzW29wY29kZV0sIGluZGV4KTsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9KMy9WTUNvcmUvSmF2YVN0cmluZy5jcHAgYi92bWtpdC9saWIvSjMvVk1Db3JlL0phdmFTdHJpbmcuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmIwZGU5Li4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9KMy9WTUNvcmUvSmF2YVN0cmluZy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLy89PT0tLSBKYXZhU3RyaW5nLmNwcCAtIEludGVybmFsIGNvcnJlc3BvbmRhbmNlIHdpdGggSmF2YSBTdHJpbmdzIC0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJKYXZhQXJyYXkuaCIKLSNpbmNsdWRlICJKYXZhQ2xhc3MuaCIKLSNpbmNsdWRlICJKYXZhU3RyaW5nLmgiCi0jaW5jbHVkZSAiSmF2YVRocmVhZC5oIgotI2luY2x1ZGUgIkphdmFVcGNhbGxzLmgiCi0jaW5jbHVkZSAiSm5qdm0uaCIKLSNpbmNsdWRlICJMb2NrZWRNYXAuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGozOwotCi1KYXZhVmlydHVhbFRhYmxlKiBKYXZhU3RyaW5nOjppbnRlcm5TdHJpbmdWVCA9IDA7Ci0KLUphdmFTdHJpbmcqIEphdmFTdHJpbmc6OnN0cmluZ0R1cChjb25zdCBBcnJheVVJbnQxNiomIF9hcnJheSwgSm5qdm0qIHZtKSB7Ci0gIAotICBKYXZhU3RyaW5nKiByZXMgPSAwOwotICBjb25zdCBBcnJheVVJbnQxNiogYXJyYXkgPSBfYXJyYXk7Ci0gIGxsdm1fZ2Nyb290KGFycmF5LCAwKTsKLSAgbGx2bV9nY3Jvb3QocmVzLCAwKTsKLQotICBVc2VyQ2xhc3MqIGNsID0gdm0tPnVwY2FsbHMtPm5ld1N0cmluZzsKLSAgcmVzID0gKEphdmFTdHJpbmcqKWNsLT5kb05ldygpOwotICAKLSAgLy8gSXQncyBhIGhhc2hlZCBzdHJpbmcsIHNldCB0aGUgZGVzdHJ1Y3RvciBzbyB0aGF0IHRoZSBzdHJpbmcKLSAgLy8gcmVtb3ZlcyBpdHNlbGYgZnJvbSB0aGUgdm0gc3RyaW5nIG1hcC4gRG8gdGhpcyBvbmx5IGlmCi0gIC8vIGludGVyblN0cmluZ1ZUIGV4aXN0cyAoaW4gY2FzZSBvZiBBT1QpLgotICBpZiAoaW50ZXJuU3RyaW5nVlQpIHJlcy0+c2V0VmlydHVhbFRhYmxlKGludGVyblN0cmluZ1ZUKTsKLQotICAvLyBObyBuZWVkIHRvIGNhbGwgdGhlIEphdmEgZnVuY3Rpb246IGJvdGggdGhlIEphdmEgZnVuY3Rpb24gYW5kCi0gIC8vIHRoaXMgZnVuY3Rpb24gZG8gdGhlIHNhbWUgdGhpbmcuCi0gIEphdmFTdHJpbmc6OnNldFZhbHVlKHJlcywgYXJyYXkpOwotICByZXMtPmNvdW50ID0gQXJyYXlVSW50MTY6OmdldFNpemUoYXJyYXkpOwotICByZXMtPm9mZnNldCA9IDA7Ci0gIHJlcy0+Y2FjaGVkSGFzaENvZGUgPSAwOwotICByZXR1cm4gcmVzOwotfQotCi1jaGFyKiBKYXZhU3RyaW5nOjpzdHJUb0FzY2lpeihKYXZhU3RyaW5nKiBzZWxmKSB7Ci0gIGNvbnN0IEFycmF5VUludDE2KiB2YWx1ZSA9IE5VTEw7Ci0gIGxsdm1fZ2Nyb290KHNlbGYsIDApOwotICBsbHZtX2djcm9vdCh2YWx1ZSwgMCk7Ci0gIHZhbHVlID0gSmF2YVN0cmluZzo6Z2V0VmFsdWUoc2VsZik7Ci0gIGNoYXIqIGJ1ZiA9IG5ldyBjaGFyW3NlbGYtPmNvdW50ICsgMV07IAotICBmb3IgKHNpbnQzMiBpID0gMDsgaSA8IHNlbGYtPmNvdW50OyArK2kpIHsKLSAgICBidWZbaV0gPSBBcnJheVVJbnQxNjo6Z2V0RWxlbWVudCh2YWx1ZSwgaSArIHNlbGYtPm9mZnNldCk7Ci0gIH0KLSAgYnVmW3NlbGYtPmNvdW50XSA9ICAwOyAKLSAgcmV0dXJuIGJ1ZjsKLX0KLQotY2hhciogSmF2YVN0cmluZzo6c3RyVG9Bc2NpaXooSmF2YVN0cmluZyogc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12bTo6VGhyZWFkQWxsb2NhdG9yKiBhbGxvY2F0b3IpIHsKLSAgY29uc3QgQXJyYXlVSW50MTYqIHZhbHVlID0gTlVMTDsKLSAgbGx2bV9nY3Jvb3Qoc2VsZiwgMCk7Ci0gIGxsdm1fZ2Nyb290KHZhbHVlLCAwKTsKLSAgdmFsdWUgPSBKYXZhU3RyaW5nOjpnZXRWYWx1ZShzZWxmKTsKLSAgY2hhciogYnVmID0gKGNoYXIqKWFsbG9jYXRvci0+QWxsb2NhdGUoKHNlbGYtPmNvdW50ICsgMSkgKiBzaXplb2YoY2hhcikpOwotICBmb3IgKHNpbnQzMiBpID0gMDsgaSA8IHNlbGYtPmNvdW50OyArK2kpIHsKLSAgICBidWZbaV0gPSBBcnJheVVJbnQxNjo6Z2V0RWxlbWVudCh2YWx1ZSwgaSArIHNlbGYtPm9mZnNldCk7Ci0gIH0KLSAgYnVmW3NlbGYtPmNvdW50XSA9ICAwOyAKLSAgcmV0dXJuIGJ1ZjsKLX0KLQotY29uc3QgQXJyYXlVSW50MTYqIEphdmFTdHJpbmc6OnN0clRvQXJyYXkoSmF2YVN0cmluZyogc2VsZiwgSm5qdm0qIHZtKSB7Ci0gIEFycmF5VUludDE2KiBhcnJheSA9IE5VTEw7Ci0gIGNvbnN0IEFycmF5VUludDE2KiB2YWx1ZSA9IE5VTEw7Ci0gIGxsdm1fZ2Nyb290KHNlbGYsIDApOwotICBsbHZtX2djcm9vdChhcnJheSwgMCk7Ci0gIGxsdm1fZ2Nyb290KHZhbHVlLCAwKTsKLSAgdmFsdWUgPSBKYXZhU3RyaW5nOjpnZXRWYWx1ZShzZWxmKTsKLQotICBhc3NlcnQoZ2V0VmFsdWUoc2VsZikgJiYgIlN0cmluZyB3aXRob3V0IGFuIGFycmF5PyIpOwotICBpZiAoc2VsZi0+b2Zmc2V0IHx8IChzZWxmLT5jb3VudCAhPSBBcnJheVVJbnQxNjo6Z2V0U2l6ZShnZXRWYWx1ZShzZWxmKSkpKSB7Ci0gICAgYXJyYXkgPSAoQXJyYXlVSW50MTYqKXZtLT51cGNhbGxzLT5BcnJheU9mQ2hhci0+ZG9OZXcoc2VsZi0+Y291bnQpOwotICAgIGZvciAoc2ludDMyIGkgPSAwOyBpIDwgc2VsZi0+Y291bnQ7IGkrKykgewotICAgICAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQoCi0gICAgICAgICAgYXJyYXksIEFycmF5VUludDE2OjpnZXRFbGVtZW50KHZhbHVlLCBpICsgc2VsZi0+b2Zmc2V0KSwgaSk7Ci0gICAgfQotICAgIHJldHVybiBhcnJheTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLX0KLQotdm9pZCBKYXZhU3RyaW5nOjpzdHJpbmdEZXN0cnVjdG9yKEphdmFTdHJpbmcqIHN0cikgewotICBjb25zdCBBcnJheVVJbnQxNiogdmFsdWUgPSBOVUxMOwotICBsbHZtX2djcm9vdChzdHIsIDApOwotICBsbHZtX2djcm9vdCh2YWx1ZSwgMCk7Ci0gIHZhbHVlID0gSmF2YVN0cmluZzo6Z2V0VmFsdWUoc3RyKTsKLSAgCi0gIEpuanZtKiB2bSA9IHN0ci0+Z2V0SlZNKCk7Ci0gIGFzc2VydCh2bSAmJiAiTm8gdm0gd2hlbiBkZXN0cm95aW5nIGEgc3RyaW5nIik7Ci0gIGlmICh2YWx1ZSAhPSBOVUxMKSB2bS0+aGFzaFN0ci5yZW1vdmVVbmxvY2tlZCh2YWx1ZSwgc3RyKTsKLX0KLQotSmF2YVN0cmluZyogSmF2YVN0cmluZzo6aW50ZXJuYWxUb0phdmEoY29uc3QgVVRGOCogbmFtZSwgSm5qdm0qIHZtKSB7Ci0gIAotICBBcnJheVVJbnQxNiogYXJyYXkgPSAwOwotICBsbHZtX2djcm9vdChhcnJheSwgMCk7Ci0KLSAgYXJyYXkgPSAoQXJyYXlVSW50MTYqKXZtLT51cGNhbGxzLT5BcnJheU9mQ2hhci0+ZG9OZXcobmFtZS0+c2l6ZSk7Ci0gIAotICBmb3IgKHNpbnQzMiBpID0gMDsgaSA8IG5hbWUtPnNpemU7IGkrKykgewotICAgIHVpbnQxNiBjdXIgPSBuYW1lLT5lbGVtZW50c1tpXTsKLSAgICBpZiAoY3VyID09ICcvJykgewotICAgICAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQoYXJyYXksICcuJywgaSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFycmF5VUludDE2OjpzZXRFbGVtZW50KGFycmF5LCBjdXIsIGkpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB2bS0+Y29uc3RydWN0U3RyaW5nKGFycmF5KTsKLX0KLQotY29uc3QgVVRGOCogSmF2YVN0cmluZzo6amF2YVRvSW50ZXJuYWwoY29uc3QgSmF2YVN0cmluZyogc2VsZiwgVVRGOE1hcCogbWFwKSB7Ci0gIGNvbnN0IEFycmF5VUludDE2KiB2YWx1ZSA9IE5VTEw7Ci0gIGxsdm1fZ2Nyb290KHNlbGYsIDApOwotICBsbHZtX2djcm9vdCh2YWx1ZSwgMCk7Ci0gIHZhbHVlID0gSmF2YVN0cmluZzo6Z2V0VmFsdWUoc2VsZik7Ci0gCi0gIG12bTo6VGhyZWFkQWxsb2NhdG9yIGFsbG9jYXRvcjsgCi0gIHVpbnQxNiogamF2YSA9ICh1aW50MTYqKWFsbG9jYXRvci5BbGxvY2F0ZShzZWxmLT5jb3VudCAqIHNpemVvZih1aW50MTYpKTsKLQotICBmb3IgKHNpbnQzMiBpID0gMDsgaSA8IHNlbGYtPmNvdW50OyArK2kpIHsKLSAgICB1aW50MTYgY3VyID0gQXJyYXlVSW50MTY6OmdldEVsZW1lbnQodmFsdWUsIHNlbGYtPm9mZnNldCArIGkpOwotICAgIGlmIChjdXIgPT0gJy4nKSBqYXZhW2ldID0gJy8nOwotICAgIGVsc2UgamF2YVtpXSA9IGN1cjsKLSAgfQotICAKLSAgY29uc3QgVVRGOCogcmVzID0gbWFwLT5sb29rdXBPckNyZWF0ZVJlYWRlcihqYXZhLCBzZWxmLT5jb3VudCk7Ci0gIHJldHVybiByZXM7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvVk1Db3JlL0phdmFTdHJpbmcuaCBiL3Zta2l0L2xpYi9KMy9WTUNvcmUvSmF2YVN0cmluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDFiMWU0Li4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9KMy9WTUNvcmUvSmF2YVN0cmluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy89PT0tLS0gSmF2YVN0cmluZy5oIC0gSW50ZXJuYWwgY29ycmVzcG9uZGFuY2Ugd2l0aCBKYXZhIFN0cmluZ3MgLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgSk5KVk1fSkFWQV9TVFJJTkdfSAotI2RlZmluZSBKTkpWTV9KQVZBX1NUUklOR19ICi0KLSNpbmNsdWRlICJ0eXBlcy5oIgotCi0jaW5jbHVkZSAiSmF2YU9iamVjdC5oIgotI2luY2x1ZGUgIlVURjguaCIKLQotbmFtZXNwYWNlIGozIHsKLQotY2xhc3MgQXJyYXlVSW50MTY7Ci1jbGFzcyBKbmp2bTsKLQotY2xhc3MgSmF2YVN0cmluZyA6IHB1YmxpYyBKYXZhT2JqZWN0IHsKLXB1YmxpYzoKLSAgLy8gQ0xBU1NQQVRIIEZJRUxEUyEhCi0gIGNvbnN0IEFycmF5VUludDE2KiB2YWx1ZTsKLSAgc2ludDMyIGNvdW50OwotICBzaW50MzIgY2FjaGVkSGFzaENvZGU7Ci0gIHNpbnQzMiBvZmZzZXQ7Ci0KLSAgc3RhdGljIHZvaWQgc2V0VmFsdWUoSmF2YVN0cmluZyogc2VsZiwgY29uc3QgQXJyYXlVSW50MTYqIGFycmF5KSB7Ci0gICAgbGx2bV9nY3Jvb3Qoc2VsZiwgMCk7Ci0gICAgbGx2bV9nY3Jvb3QoYXJyYXksIDApOwotICAgIHNlbGYtPnZhbHVlID0gYXJyYXk7Ci0gIH0KLSAgc3RhdGljIGNvbnN0IEFycmF5VUludDE2KiBnZXRWYWx1ZShjb25zdCBKYXZhU3RyaW5nKiBzZWxmKSB7Ci0gICAgbGx2bV9nY3Jvb3Qoc2VsZiwgMCk7Ci0gICAgcmV0dXJuIHNlbGYtPnZhbHVlOwotICB9Ci0gIAotICBzdGF0aWMgSmF2YVN0cmluZyogc3RyaW5nRHVwKGNvbnN0IEFycmF5VUludDE2KiYgYXJyYXksIEpuanZtKiB2bSk7Ci0KLSAgLy8vIGludGVybmFsVG9KYXZhIC0gQ3JlYXRlcyBhIGNvcHkgb2YgdGhlIFVURjggYXQgaXRzIGdpdmVuIG9mZnNldCBhbmQgc2l6ZQotICAvLy8gd2l0aCBhbGwgaXRzICcuJyByZXBsYWNlZCBieSAnLycuIFRoZSBKVk0gYnl0ZWNvZGUgcmVmZXJlbmNlIGNsYXNzZXMgaW4KLSAgLy8vIHBhY2thZ2VzIHdpdGggdGhlICcuJyBhcyB0aGUgc2VwYXJhdGluZyBjaGFyYWN0ZXIuIFRoZSBKVk0gbGFuZ3VhZ2UgdXNlcwotICAvLy8gdGhlICcvJyBjaGFyYWN0ZXIuIFJldHVybnMgYSBKYXZhIFN0cmluZy4KLSAgLy8vCi0gIHN0YXRpYyBKYXZhU3RyaW5nKiBpbnRlcm5hbFRvSmF2YShjb25zdCBVVEY4KiB1dGY4LCBKbmp2bSogdm0pOwotCi0gIHN0YXRpYyB2b2lkIHN0cmluZ0Rlc3RydWN0b3IoSmF2YVN0cmluZyopOwotICBzdGF0aWMgY2hhciogc3RyVG9Bc2NpaXooSmF2YVN0cmluZyogc2VsZik7Ci0gIHN0YXRpYyBjaGFyKiBzdHJUb0FzY2lpeihKYXZhU3RyaW5nKiBzZWxmLCBtdm06OlRocmVhZEFsbG9jYXRvciogYWxsb2NhdG9yKTsKLSAgc3RhdGljIGNvbnN0IEFycmF5VUludDE2KiBzdHJUb0FycmF5KEphdmFTdHJpbmcqIHNlbGYsIEpuanZtKiB2bSk7Ci0KLSAgLy8vIGphdmFUb0ludGVybmFsIC0gUmVwbGFjZXMgYWxsICcvJyBpbnRvICcuJy4KLSAgc3RhdGljIGNvbnN0IFVURjgqIGphdmFUb0ludGVybmFsKGNvbnN0IEphdmFTdHJpbmcqIHNlbGYsIFVURjhNYXAqIG1hcCk7Ci0KLSAgc3RhdGljIEphdmFWaXJ0dWFsVGFibGUqIGludGVyblN0cmluZ1ZUOwotfTsKLQotfSAvLyBlbmQgbmFtZXNwYWNlIGozCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL0ozL1ZNQ29yZS9KYXZhVGhyZWFkLmNwcCBiL3Zta2l0L2xpYi9KMy9WTUNvcmUvSmF2YVRocmVhZC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOTlhMTIuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL0ozL1ZNQ29yZS9KYXZhVGhyZWFkLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLz09PS0tLS0tLS0tLSBKYXZhVGhyZWFkLmNwcCAtIEphdmEgdGhyZWFkIGRlc2NyaXB0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgIm12bS9UaHJlYWRzL0xvY2tzLmgiCi0jaW5jbHVkZSAibXZtL1RocmVhZHMvVGhyZWFkLmgiCi0KLSNpbmNsdWRlICJKYXZhQ2xhc3MuaCIKLSNpbmNsdWRlICJKYXZhT2JqZWN0LmgiCi0jaW5jbHVkZSAiSmF2YVRocmVhZC5oIgotI2luY2x1ZGUgIkphdmFVcGNhbGxzLmgiCi0jaW5jbHVkZSAiSm5qdm0uaCIKLQotCi11c2luZyBuYW1lc3BhY2UgajM7Ci0KLUphdmFUaHJlYWQ6OkphdmFUaHJlYWQoSm5qdm0qIHZtLCBtdm06OlRocmVhZCogbXV0KSA6IG12bTo6Vk1UaHJlYWREYXRhKHZtLCBtdXQpIHsKLSAgam5pRW52ID0gdm0tPmpuaUVudjsKLSAgbG9jYWxKTklSZWZzID0gbmV3IEpOSUxvY2FsUmVmZXJlbmNlcygpOwotICBjdXJyZW50QWRkZWRSZWZlcmVuY2VzID0gTlVMTDsKLSAgamF2YVRocmVhZCA9IE5VTEw7Ci0gIHZtVGhyZWFkID0gTlVMTDsKLX0KLQotSmF2YVRocmVhZCogSmF2YVRocmVhZDo6ajNUaHJlYWQobXZtOjpUaHJlYWQqIG11dCkgewotCXJldHVybiAoSmF2YVRocmVhZCopbXV0LT52bURhdGE7Ci19Ci0KLUphdmFUaHJlYWQqIEphdmFUaHJlYWQ6OmFzc29jaWF0ZShKbmp2bSogdm0sIG12bTo6VGhyZWFkKiBtdXQpIHsKLQlKYXZhVGhyZWFkICp0aCAgID0gbmV3IEphdmFUaHJlYWQodm0sIG11dCk7Ci0JbXV0LT5hbGxWbXNEYXRhW3ZtLT52bUlEXSA9IHRoOwotCW11dC0+YXR0YWNoKHZtKTsKLQlyZXR1cm4gdGg7Ci19Ci0KLQotdm9pZCBKYXZhVGhyZWFkOjppbml0aWFsaXNlKEphdmFPYmplY3QqIHRocmVhZCwgSmF2YU9iamVjdCogdm10aCkgewotICBsbHZtX2djcm9vdCh0aHJlYWQsIDApOwotICBsbHZtX2djcm9vdCh2bXRoLCAwKTsKLSAgamF2YVRocmVhZCA9IHRocmVhZDsKLSAgdm1UaHJlYWQgPSB2bXRoOwotfQotCi1KYXZhVGhyZWFkOjp+SmF2YVRocmVhZCgpIHsKLSAgZGVsZXRlIGxvY2FsSk5JUmVmczsKLX0KLQotdm9pZCBKYXZhVGhyZWFkOjpzdGFydEpOSSgpIHsKLSAgLy8gSW50ZXJlc3RpbmcsIGJ1dCBubyBuZWVkIHRvIGRvIGFueXRoaW5nLgotfQotCi12b2lkIEphdmFUaHJlYWQ6OmVuZEpOSSgpIHsKLSAgbG9jYWxKTklSZWZzLT5yZW1vdmVKTklSZWZlcmVuY2VzKHRoaXMsICpjdXJyZW50QWRkZWRSZWZlcmVuY2VzKTsKLSAgbXV0LT5lbmRVbmtub3duRnJhbWUoKTsKLSAgIAotICAvLyBHbyBiYWNrIHRvIGNvb3BlcmF0aXZlIG1vZGUuCi0gIG11dC0+bGVhdmVVbmNvb3BlcmF0aXZlQ29kZSgpOwotfQotCi11aW50MzIgSmF2YVRocmVhZDo6Z2V0SmF2YUZyYW1lQ29udGV4dCh2b2lkKiogYnVmZmVyKSB7Ci0gIG12bTo6U3RhY2tXYWxrZXIgV2Fsa2VyKG11dCk7Ci0gIHVpbnQzMiBpID0gMDsKLQotICB3aGlsZSAobXZtOjpNZXRob2RJbmZvKiBNSSA9IFdhbGtlci5nZXQoKSkgewotICAgIGlmIChNSS0+aXNIaWdoTGV2ZWxNZXRob2QoKSkgewotICAgICAgSmF2YU1ldGhvZCogTSA9IChKYXZhTWV0aG9kKilNSS0+TWV0YUluZm87Ci0gICAgICBidWZmZXJbaSsrXSA9IE07Ci0gICAgfQotICAgICsrV2Fsa2VyOwotICB9Ci0gIHJldHVybiBpOwotfQotCi1KYXZhTWV0aG9kKiBKYXZhVGhyZWFkOjpnZXRDYWxsaW5nTWV0aG9kTGV2ZWwodWludDMyIGxldmVsKSB7Ci0gIG12bTo6U3RhY2tXYWxrZXIgV2Fsa2VyKG11dCk7Ci0gIHVpbnQzMiBpbmRleCA9IDA7Ci0KLSAgd2hpbGUgKG12bTo6TWV0aG9kSW5mbyogTUkgPSBXYWxrZXIuZ2V0KCkpIHsKLSAgICBpZiAoTUktPmlzSGlnaExldmVsTWV0aG9kKCkpIHsKLSAgICAgIGlmIChpbmRleCA9PSBsZXZlbCkgewotICAgICAgICByZXR1cm4gKEphdmFNZXRob2QqKU1JLT5NZXRhSW5mbzsKLSAgICAgIH0KLSAgICAgICsraW5kZXg7Ci0gICAgfQotICAgICsrV2Fsa2VyOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1Vc2VyQ2xhc3MqIEphdmFUaHJlYWQ6OmdldENhbGxpbmdDbGFzc0xldmVsKHVpbnQzMiBsZXZlbCkgewotICBKYXZhTWV0aG9kKiBtZXRoID0gZ2V0Q2FsbGluZ01ldGhvZExldmVsKGxldmVsKTsKLSAgaWYgKG1ldGgpIHJldHVybiBtZXRoLT5jbGFzc0RlZjsKLSAgcmV0dXJuIDA7Ci19Ci0KLUphdmFPYmplY3QqIEphdmFUaHJlYWQ6OmdldE5vbk51bGxDbGFzc0xvYWRlcigpIHsKLSAgCi0gIEphdmFPYmplY3QqIG9iaiA9IDA7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gIAotICBtdm06OlN0YWNrV2Fsa2VyIFdhbGtlcihtdXQpOwotCi0gIHdoaWxlIChtdm06Ok1ldGhvZEluZm8qIE1JID0gV2Fsa2VyLmdldCgpKSB7Ci0gICAgaWYgKE1JLT5pc0hpZ2hMZXZlbE1ldGhvZCgpID09IDEpIHsKLSAgICAgIEphdmFNZXRob2QqIG1ldGggPSAoSmF2YU1ldGhvZCopTUktPk1ldGFJbmZvOwotICAgICAgSm5qdm1DbGFzc0xvYWRlciogbG9hZGVyID0gbWV0aC0+Y2xhc3NEZWYtPmNsYXNzTG9hZGVyOwotICAgICAgb2JqID0gbG9hZGVyLT5nZXRKYXZhQ2xhc3NMb2FkZXIoKTsKLSAgICAgIGlmIChvYmopIHJldHVybiBvYmo7Ci0gICAgfQotICAgICsrV2Fsa2VyOwotICB9Ci0gIHJldHVybiAwOwotfQotCi0KLXZvaWQgSmF2YVRocmVhZDo6cHJpbnRKYXZhQmFja3RyYWNlKCkgewotICBtdm06OlN0YWNrV2Fsa2VyIFdhbGtlcihtdXQpOwotCi0gIHdoaWxlIChtdm06Ok1ldGhvZEluZm8qIE1JID0gV2Fsa2VyLmdldCgpKSB7Ci0gICAgaWYgKE1JLT5pc0hpZ2hMZXZlbE1ldGhvZCgpKQotICAgICAgTUktPnByaW50KFdhbGtlci5pcCwgV2Fsa2VyLmFkZHIpOwotICAgICsrV2Fsa2VyOwotICB9Ci19Ci0KLW12bTo6Z2MqKiBKTklMb2NhbFJlZmVyZW5jZXM6OmFkZEpOSVJlZmVyZW5jZShKYXZhVGhyZWFkKiB0aCwgbXZtOjpnYyogb2JqKSB7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gIAotICBpZiAobGVuZ3RoID09IE1BWElNVU1fUkVGRVJFTkNFUykgewotICAgIEpOSUxvY2FsUmVmZXJlbmNlcyogbmV4dCA9IG5ldyBKTklMb2NhbFJlZmVyZW5jZXMoKTsKLSAgICB0aC0+bG9jYWxKTklSZWZzID0gbmV4dDsKLSAgICBuZXh0LT5wcmV2ID0gdGhpczsKLSAgICByZXR1cm4gbmV4dC0+YWRkSk5JUmVmZXJlbmNlKHRoLCBvYmopOwotICB9IGVsc2UgewotICAgIGxvY2FsUmVmZXJlbmNlc1tsZW5ndGhdID0gb2JqOwotICAgIHJldHVybiAmbG9jYWxSZWZlcmVuY2VzW2xlbmd0aCsrXTsKLSAgfQotfQotCi12b2lkIEpOSUxvY2FsUmVmZXJlbmNlczo6cmVtb3ZlSk5JUmVmZXJlbmNlcyhKYXZhVGhyZWFkKiB0aCwgdWludDMyX3QgbnVtKSB7Ci0gICAgCi0gIGlmICh0aC0+bG9jYWxKTklSZWZzICE9IHRoaXMpIHsKLSAgICBkZWxldGUgdGgtPmxvY2FsSk5JUmVmczsKLSAgICB0aC0+bG9jYWxKTklSZWZzID0gdGhpczsKLSAgfQotCi0gIGlmIChudW0gPiBsZW5ndGgpIHsKLSAgICBhc3NlcnQocHJldiAmJiAiTm8gcHJldiBhbmQgZGVsZXRpbmcgdG9vIG11Y2ggbG9jYWwgcmVmZXJlbmNlcyIpOwotICAgIHByZXYtPnJlbW92ZUpOSVJlZmVyZW5jZXModGgsIG51bSAtIGxlbmd0aCk7Ci0gIH0gZWxzZSB7Ci0gICAgbGVuZ3RoIC09IG51bTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL0ozL1ZNQ29yZS9KYXZhVGhyZWFkLmggYi92bWtpdC9saWIvSjMvVk1Db3JlL0phdmFUaHJlYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTExZDg1OS4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvSjMvVk1Db3JlL0phdmFUaHJlYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tIEphdmFUaHJlYWQuaCAtIEphdmEgdGhyZWFkIGRlc2NyaXB0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2lmbmRlZiBKTkpWTV9KQVZBX1RIUkVBRF9ICi0jZGVmaW5lIEpOSlZNX0pBVkFfVEhSRUFEX0gKLQotI2luY2x1ZGUgIm12bS9UaHJlYWRzL0NvbmQuaCIKLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9Mb2Nrcy5oIgotI2luY2x1ZGUgIm12bS9UaHJlYWRzL09iamVjdExvY2tzLmgiCi0jaW5jbHVkZSAibXZtL1RocmVhZHMvVGhyZWFkLmgiCi0KLSNpbmNsdWRlICJNdXRhdG9yVGhyZWFkLmgiCi0KLSNpbmNsdWRlICJKYXZhT2JqZWN0LmgiCi0jaW5jbHVkZSAiSk5JUmVmZXJlbmNlcy5oIgotCi1uYW1lc3BhY2UgajMgewotCi1jbGFzcyBDbGFzczsKLWNsYXNzIEphdmFNZXRob2Q7Ci1jbGFzcyBKYXZhT2JqZWN0OwotY2xhc3MgSm5qdm07Ci0KLQotI2RlZmluZSBCRUdJTl9OQVRJVkVfRVhDRVBUSU9OKGxldmVsKQkJCQkJCVwKLSAgSmF2YVRocmVhZCogX190aCA9IEphdmFUaHJlYWQ6OmdldCgpOwkJCQkJXAotICBUUlkgewotCi0jZGVmaW5lIEVORF9OQVRJVkVfRVhDRVBUSU9OCQkJCQkJCQkJCVwKLSAgfSBDQVRDSCB7CQkJCQkJCQkJCQkJCQkJCQkJCVwKLSAgICBfX3RoLT50aHJvd0Zyb21OYXRpdmUoKTsJCQkJCQkJCQkJXAotICB9IEVORF9DQVRDSDsKLQotI2RlZmluZSBCRUdJTl9KTklfRVhDRVBUSU9OCQkJCQkJCQkJCQkJCQlcCi0gIG12bTo6VGhyZWFkKiBtdXQgPSBtdm06OlRocmVhZDo6Z2V0KCk7CQkJCQkJCVwKLSAgdm9pZCogU1AgPSBtdXQtPmdldExhc3RTUCgpOwkJCQkJCQkJCQkJCVwKLSAgbXV0LT5sZWF2ZVVuY29vcGVyYXRpdmVDb2RlKCk7CQkJCQkJCQkJCQlcCi0gIG12bTo6S25vd25GcmFtZSBGcmFtZTsJCQkJCQkJCQkJCQkJCQlcCi0gIG11dC0+c3RhcnRLbm93bkZyYW1lKEZyYW1lKTsJCQkJCQkJCQkJCQlcCi0gIFRSWSB7Ci0KLSNkZWZpbmUgRU5EX0pOSV9FWENFUFRJT04JCQkJCQkJCQkJCQkJXAotICB9IENBVENIIHsJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJSmF2YVRocmVhZDo6ajNUaHJlYWQobXV0KS0+dGhyb3dGcm9tSk5JKFNQKTsJXAotICB9IEVORF9DQVRDSDsKLQotI2RlZmluZSBSRVRVUk5fRlJPTV9KTkkoYSkgewkJCQkJCQkJCQkJXAotCQltdXQtPmVuZEtub3duRnJhbWUoKTsJCQkJCQkJCQkJCQkJXAotCQltdXQtPmVudGVyVW5jb29wZXJhdGl2ZUNvZGUoU1ApOwkJCQkJCQlcCi0JCXJldHVybiAoYSk7IH0JCQkJCQkJCQkJCQkJCQkJCVwKLQotI2RlZmluZSBSRVRVUk5fVk9JRF9GUk9NX0pOSSB7CQkJCQkJCQkJCVwKLQkJbXV0LT5lbmRLbm93bkZyYW1lKCk7CQkJCQkJCQkJCQkJCVwKLQkJbXV0LT5lbnRlclVuY29vcGVyYXRpdmVDb2RlKFNQKTsJCQkJCQkJXAotCQlyZXR1cm47IH0JCQkJCQkJCQkJCQkJCQkJCQkJXAotCi0vLy8gSmF2YVRocmVhZCAtIFRoaXMgY2xhc3MgaXMgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEgSmF2YSB0aHJlYWQuCi0vLy8gSXQgbWFpbnRhaW5zIHRocmVhZC1zcGVjaWZpYyBpbmZvcm1hdGlvbiBzdWNoIGFzIGl0cyBzdGF0ZSwgdGhlIGN1cnJlbnQKLS8vLyBleGNlcHRpb24gaWYgdGhlcmUgaXMgb25lLCB0aGUgbGF5b3V0IG9mIHRoZSBzdGFjaywgZXRjLgotLy8vCi1jbGFzcyBKYXZhVGhyZWFkIDogcHVibGljIG12bTo6Vk1UaHJlYWREYXRhIHsKLXB1YmxpYzoKLSAgCi0gIC8vLyBqbmlFbnYgLSBUaGUgSk5JIGVudmlyb25tZW50IG9mIHRoZSB0aHJlYWQuCi0gIC8vLwotICB2b2lkKiBqbmlFbnY7Ci0KLSAgLy8vIGphdmFUaHJlYWQgLSBUaGUgSmF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHRocmVhZC4KLSAgLy8vCi0gIEphdmFPYmplY3QqIGphdmFUaHJlYWQ7Ci0KLSAgLy8vIHZtVGhyZWFkIC0gVGhlIFZNVGhyZWFkIG9iamVjdCBvZiB0aGlzIHRocmVhZC4KLSAgLy8vCi0gIEphdmFPYmplY3QqIHZtVGhyZWFkOwotCi0gIG12bTo6TG9ja2luZ1RocmVhZCBsb2NraW5nVGhyZWFkOwotICAKLSAgLy8vIGN1cnJlbnRBZGRlZFJlZmVyZW5jZXMgLSBDdXJyZW50IG51bWJlciBvZiBhZGRlZCBsb2NhbCByZWZlcmVuY2VzLgotICAvLy8KLSAgdWludDMyX3QqIGN1cnJlbnRBZGRlZFJlZmVyZW5jZXM7Ci0KLSAgLy8vIGxvY2FsSk5JUmVmcyAtIExpc3Qgb2YgbG9jYWwgSk5JIHJlZmVyZW5jZXMuCi0gIC8vLwotICBKTklMb2NhbFJlZmVyZW5jZXMqIGxvY2FsSk5JUmVmczsKLQotCW12bTo6Z2MqKiBwdXNoSk5JUmVmKG12bTo6Z2MqIG9iaikgewotICAgIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gICAgaWYgKCFvYmopIHJldHVybiAwOwotICAgCi0gICAgKysoKmN1cnJlbnRBZGRlZFJlZmVyZW5jZXMpOwotICAgIHJldHVybiBsb2NhbEpOSVJlZnMtPmFkZEpOSVJlZmVyZW5jZSh0aGlzLCBvYmopOwotCi0gIH0KLQotICAvLy8gdHJhY2VyIC0gVHJhY2VzIEdDLW9iamVjdHMgcG9pbnRlZCBieSB0aGlzIHRocmVhZCBvYmplY3QuCi0gIC8vLwotICB2aXJ0dWFsIHZvaWQgdHJhY2VyKHVpbnRwdHJfdCBjbG9zdXJlKTsKLQotICAvLy8gSmF2YVRocmVhZCAtIEVtcHR5IGNvbnN0cnVjdG9yLCB1c2VkIHRvIGdldCB0aGUgVlQuCi0gIC8vLwotICBKYXZhVGhyZWFkKCkgOiBtdm06OlZNVGhyZWFkRGF0YSgwLCAwKSB7Ci0gIH0KLQotICAvLy8gfkphdmFUaHJlYWQgLSBEZWxldGUgYW55IHBvdGVudGlhbCBtYWxsb2MnZWQgb2JqZWN0cyB1c2VkIGJ5IHRoaXMgdGhyZWFkLgotICAvLy8KLSAgfkphdmFUaHJlYWQoKTsKLQotcHJpdmF0ZToKLSAgLy8vIEphdmFUaHJlYWQgLSBDcmVhdGVzIGEgSmF2YSB0aHJlYWQuIAotICAvLy8KLSAgSmF2YVRocmVhZChKbmp2bSogdm0sIG12bTo6VGhyZWFkKm11dCk7Ci0KLXB1YmxpYzoKLSAgLy8vIGFzc29jaWF0ZSAtIEFzc29jaWF0ZSBhIGphdmEgdGhyZWFkIHRvIHRoZSBtdXRhdG9yCi0gIC8vLwotCXN0YXRpYyBKYXZhVGhyZWFkKiBhc3NvY2lhdGUoSm5qdm0qIHZtLCBtdm06OlRocmVhZCogbXV0KTsKLQotICAvLy8gajNUaHJlYWQgLSBnaXZlcyB0aGUgSmF2YVRocmVhZCBhc3NvY2lhdGVkIHdpdGggdGhlIG11dGF0b3IgdGhyZWFkCi0gIC8vLwotCXN0YXRpYyBKYXZhVGhyZWFkKiAgajNUaHJlYWQobXZtOjpUaHJlYWQqIG11dCk7Ci0KLSAgLy8vIGluaXRpYWxpc2UgLSBpbml0aWFsaXNlIHRoZSB0aHJlYWQKLSAgLy8vCi0gIHZvaWQgaW5pdGlhbGlzZShKYXZhT2JqZWN0KiB0aHJlYWQsIEphdmFPYmplY3QqIHZtdGgpOwotICAKLSAgLy8vIGdldCAtIEdldCB0aGUgY3VycmVudCB0aHJlYWQgYXMgYSBKMyBvYmplY3QuCi0gIC8vLwotICBzdGF0aWMgSmF2YVRocmVhZCogZ2V0KCkgewotICAgIHJldHVybiBqM1RocmVhZChtdm06OlRocmVhZDo6Z2V0KCkpOwotICB9Ci0KLSAgLy8vIGdldEpWTSAtIEdldCB0aGUgSmF2YSBWTSBpbiB3aGljaCB0aGlzIHRocmVhZCBleGVjdXRlcy4KLSAgLy8vCi0gIEpuanZtKiBnZXRKVk0oKSB7Ci0gICAgcmV0dXJuIChKbmp2bSopdm07Ci0gIH0KLQotICAvLy8gY3VycmVudFRocmVhZCAtIFJldHVybiB0aGUgY3VycmVudCB0aHJlYWQgYXMgYSBKYXZhIG9iamVjdC4KLSAgLy8vCi0gIEphdmFPYmplY3QqIGN1cnJlbnRUaHJlYWQoKSB7Ci0gICAgcmV0dXJuIGphdmFUaHJlYWQ7Ci0gIH0KLQotICAvLy8gdGhyb3dGcm9tSk5JIC0gVGhyb3cgYW4gZXhjZXB0aW9uIGFmdGVyIGV4ZWN1dGluZyBKTkkgY29kZS4KLSAgLy8vCi0gIHZvaWQgdGhyb3dGcm9tSk5JKHZvaWQqIFNQKSB7Ci0gICAgbXV0LT5lbmRLbm93bkZyYW1lKCk7Ci0gICAgbXV0LT5lbnRlclVuY29vcGVyYXRpdmVDb2RlKFNQKTsKLSAgfQotICAKLSAgLy8vIHRocm93RnJvbU5hdGl2ZSAtIFRocm93IGFuIGV4Y2VwdGlvbiBhZnRlciBleGVjdXRpbmcgTmF0aXZlIGNvZGUuCi0gIC8vLwotICB2b2lkIHRocm93RnJvbU5hdGl2ZSgpIHsKLSNpZmRlZiBEV0FSRl9FWENFUFRJT05TCi0gICAgbXV0LT50aHJvd0l0KCk7Ci0jZW5kaWYKLSAgfQotICAKLSAgLy8vIHRocm93RnJvbUphdmEgLSBUaHJvdyBhbiBleGNlcHRpb24gYWZ0ZXIgZXhlY3V0aW5nIEphdmEgY29kZS4KLSAgLy8vCi0gIHZvaWQgdGhyb3dGcm9tSmF2YSgpIHsKLSAgICBtdXQtPnRocm93SXQoKTsKLSAgfQotCi0gIC8vLyBzdGFydEphdmEgLSBJbnRlcmVzdGluZywgYnV0IGFjdHVhbGx5IGRvZXMgbm90aGluZyA6KQotICB2b2lkIHN0YXJ0SmF2YSgpIHt9Ci0gIAotICAvLy8gZW5kSmF2YSAtIEludGVyZXN0aW5nLCBidXQgYWN0dWFsbHkgZG9lcyBub3RoaW5nIDopCi0gIHZvaWQgZW5kSmF2YSgpIHt9Ci0KLSAgLy8vIHN0YXJ0Sk5JIC0gUmVjb3JkIHRoYXQgd2UgYXJlIGVudGVyaW5nIG5hdGl2ZSBjb2RlLgotICAvLy8KLSAgdm9pZCBzdGFydEpOSSgpOwotCi0gIHZvaWQgZW5kSk5JKCk7Ci0KLSAgLy8vIGdldENhbGxpbmdNZXRob2QgLSBHZXQgdGhlIEphdmEgbWV0aG9kIGluIHRoZSBzdGFjayBhdCB0aGUgc3BlY2lmaWVkCi0gIC8vLyBsZXZlbC4KLSAgLy8vCi0gIEphdmFNZXRob2QqIGdldENhbGxpbmdNZXRob2RMZXZlbCh1aW50MzIgbGV2ZWwpOwotICAKLSAgLy8vIGdldENhbGxpbmdDbGFzc0xldmVsIC0gR2V0IHRoZSBKYXZhIG1ldGhvZCBpbiB0aGUgc3RhY2sgYXQgdGhlCi0gIC8vLyBzcGVjaWZpZWQgbGV2ZWwuCi0gIC8vLwotICBVc2VyQ2xhc3MqIGdldENhbGxpbmdDbGFzc0xldmVsKHVpbnQzMiBsZXZlbCk7Ci0gIAotICAvLy8gZ2V0Tm9uTnVsbENsYXNzTG9hZGVyIC0gR2V0IHRoZSBmaXJzdCBub24tbnVsbCBjbGFzcyBsb2FkZXIgb24gdGhlCi0gIC8vLyBzdGFjay4KLSAgLy8vCi0gIEphdmFPYmplY3QqIGdldE5vbk51bGxDbGFzc0xvYWRlcigpOwotICAgIAotICAvLy8gcHJpbnRKYXZhQmFja3RyYWNlIC0gUHJpbnRzIHRoZSBiYWNrdHJhY2Ugb2YgdGhpcyB0aHJlYWQuIE9ubHkgcHJpbnRzCi0gIC8vLyB0aGUgSmF2YSBtZXRob2RzIG9uIHRoZSBzdGFjay4KLSAgLy8vCi0gIHZvaWQgcHJpbnRKYXZhQmFja3RyYWNlKCk7Ci0KLSAgLy8vIGdldEphdmFGcmFtZUNvbnRleHQgLSBGaWxsIHRoZSBidWZmZXIgd2l0aCBKYXZhIG1ldGhvZHMgY3VycmVudGx5IG9uCi0gIC8vLyB0aGUgc3RhY2suCi0gIC8vLwotICB1aW50MzIgZ2V0SmF2YUZyYW1lQ29udGV4dCh2b2lkKiogYnVmZmVyKTsKLX07Ci0KLX0gLy8gZW5kIG5hbWVzcGFjZSBqMwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9KMy9WTUNvcmUvSmF2YVR5cGVzLmNwcCBiL3Zta2l0L2xpYi9KMy9WTUNvcmUvSmF2YVR5cGVzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MwYzA5YS4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvSjMvVk1Db3JlL0phdmFUeXBlcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tIEphdmFUeXBlcy5jcHAgLSBKYXZhIHByaW1pdGl2ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJKYXZhQXJyYXkuaCIKLSNpbmNsdWRlICJKYXZhQ2xhc3MuaCIKLSNpbmNsdWRlICJKYXZhQ29tcGlsZXIuaCIKLSNpbmNsdWRlICJKYXZhVHlwZXMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGozOwotCi1Vc2VyQ29tbW9uQ2xhc3MqIEFycmF5VHlwZWRlZjo6YXNzb2NDbGFzcyhKbmp2bUNsYXNzTG9hZGVyKiBsb2FkZXIpIGNvbnN0IHsKLSAgcmV0dXJuIGxvYWRlci0+Y29uc3RydWN0QXJyYXkoa2V5TmFtZSk7Ci19Ci0KLVVzZXJDb21tb25DbGFzcyogT2JqZWN0VHlwZWRlZjo6YXNzb2NDbGFzcyhKbmp2bUNsYXNzTG9hZGVyKiBsb2FkZXIpIGNvbnN0IHsKLSAgcmV0dXJuIGxvYWRlci0+bG9hZE5hbWUocHNldWRvQXNzb2NDbGFzc05hbWUsIGZhbHNlLCB0cnVlLCBOVUxMKTsKLX0KLQotVXNlckNvbW1vbkNsYXNzKiBPYmplY3RUeXBlZGVmOjpmaW5kQXNzb2NDbGFzcyhKbmp2bUNsYXNzTG9hZGVyKiBsb2FkZXIpIGNvbnN0IHsKLSAgcmV0dXJuIGxvYWRlci0+bG9va3VwQ2xhc3NPckFycmF5KHBzZXVkb0Fzc29jQ2xhc3NOYW1lKTsKLX0KLQotVXNlckNvbW1vbkNsYXNzKiBBcnJheVR5cGVkZWY6OmZpbmRBc3NvY0NsYXNzKEpuanZtQ2xhc3NMb2FkZXIqIGxvYWRlcikgY29uc3QgewotICByZXR1cm4gbG9hZGVyLT5sb29rdXBDbGFzc09yQXJyYXkoa2V5TmFtZSk7Ci19Ci0KLVNpZ25kZWY6OlNpZ25kZWYoY29uc3QgVVRGOCogbmFtZSwgSm5qdm1DbGFzc0xvYWRlciogbG9hZGVyLAotICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxUeXBlZGVmKj4mIGFyZ3MsIFR5cGVkZWYqIHJldCkgewotICAKLSAgYXJndW1lbnRzWzBdID0gcmV0OwotICBUeXBlZGVmKiogbXlBcmdzID0gJihhcmd1bWVudHNbMV0pOwotICBuYkFyZ3VtZW50cyA9IGFyZ3Muc2l6ZSgpOwotICB1aW50MzIgaW5kZXggPSAwOwotICBmb3IgKHN0ZDo6dmVjdG9yPFR5cGVkZWYqPjo6aXRlcmF0b3IgaSA9IGFyZ3MuYmVnaW4oKSwgZSA9IGFyZ3MuZW5kKCk7Ci0gICAgICAgaSAhPSBlOyArK2kpIHsKLSAgICBteUFyZ3NbaW5kZXgrK10gPSAqaTsKLSAgfQotICBpbml0aWFsTG9hZGVyID0gbG9hZGVyOwotICBrZXlOYW1lID0gbmFtZTsKLSAgX3ZpcnR1YWxDYWxsQnVmID0gMDsKLSAgX3N0YXRpY0NhbGxCdWYgPSAwOwotICBfdmlydHVhbENhbGxBUCA9IDA7Ci0gIF9zdGF0aWNDYWxsQVAgPSAwOwotICAKLX0KLQotT2JqZWN0VHlwZWRlZjo6T2JqZWN0VHlwZWRlZihjb25zdCBVVEY4KiBuYW1lLCBVVEY4TWFwKiBtYXApIHsKLSAga2V5TmFtZSA9IG5hbWU7Ci0gIHBzZXVkb0Fzc29jQ2xhc3NOYW1lID0gbmFtZS0+ZXh0cmFjdChtYXAsIDEsIG5hbWUtPnNpemUgLSAxKTsKLX0KLQotaW50cHRyX3QgU2lnbmRlZjo6c3RhdGljQ2FsbEJ1ZigpIHsKLSAgaWYgKCFfc3RhdGljQ2FsbEJ1ZikgewotICAgIG12bTo6VGhyZWFkQWxsb2NhdG9yIGFsbG9jYXRvcjsKLSAgICBjaGFyKiBidWYgPSAoY2hhciopYWxsb2NhdG9yLkFsbG9jYXRlKChrZXlOYW1lLT5zaXplIDw8IDEpICsgMSArIDExKTsKLSAgICBuYXRpdmVOYW1lKGJ1ZiwgInN0YXRpY19idWYiKTsKLSAgICBib29sIHVudXNlZCA9IGZhbHNlOwotICAgIGludHB0cl90IHJlcyA9IGluaXRpYWxMb2FkZXItPmxvYWRJbkxpYihidWYsIHVudXNlZCk7Ci0gICAgaWYgKHJlcykgewotICAgICAgX3N0YXRpY0NhbGxCdWYgPSByZXM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluaXRpYWxMb2FkZXItPmdldENvbXBpbGVyKCktPnN0YXRpY0NhbGxCdWYodGhpcyk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBfc3RhdGljQ2FsbEJ1ZjsKLX0KLQotaW50cHRyX3QgU2lnbmRlZjo6dmlydHVhbENhbGxCdWYoKSB7Ci0gIGlmICghX3ZpcnR1YWxDYWxsQnVmKSB7Ci0gICAgbXZtOjpUaHJlYWRBbGxvY2F0b3IgYWxsb2NhdG9yOwotICAgIGNoYXIqIGJ1ZiA9IChjaGFyKilhbGxvY2F0b3IuQWxsb2NhdGUoKGtleU5hbWUtPnNpemUgPDwgMSkgKyAxICsgMTEpOwotICAgIG5hdGl2ZU5hbWUoYnVmLCAidmlydHVhbF9idWYiKTsKLSAgICBib29sIHVudXNlZCA9IGZhbHNlOwotICAgIGludHB0cl90IHJlcyA9IGluaXRpYWxMb2FkZXItPmxvYWRJbkxpYihidWYsIHVudXNlZCk7Ci0gICAgaWYgKHJlcykgeyAKLSAgICAgIF92aXJ0dWFsQ2FsbEJ1ZiA9IHJlczsKLSAgICB9IGVsc2UgewotICAgICAgaW5pdGlhbExvYWRlci0+Z2V0Q29tcGlsZXIoKS0+dmlydHVhbENhbGxCdWYodGhpcyk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBfdmlydHVhbENhbGxCdWY7Ci19Ci0KLWludHB0cl90IFNpZ25kZWY6OnN0YXRpY0NhbGxBUCgpIHsKLSAgaWYgKCFfc3RhdGljQ2FsbEFQKSB7Ci0gICAgbXZtOjpUaHJlYWRBbGxvY2F0b3IgYWxsb2NhdG9yOwotICAgIGNoYXIqIGJ1ZiA9IChjaGFyKilhbGxvY2F0b3IuQWxsb2NhdGUoKGtleU5hbWUtPnNpemUgPDwgMSkgKyAxICsgMTEpOwotICAgIG5hdGl2ZU5hbWUoYnVmLCAic3RhdGljX2FwIik7Ci0gICAgYm9vbCB1bnVzZWQgPSBmYWxzZTsKLSAgICBpbnRwdHJfdCByZXMgPSBpbml0aWFsTG9hZGVyLT5sb2FkSW5MaWIoYnVmLCB1bnVzZWQpOwotICAgIGlmIChyZXMpIHsKLSAgICAgIF9zdGF0aWNDYWxsQVAgPSByZXM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluaXRpYWxMb2FkZXItPmdldENvbXBpbGVyKCktPnN0YXRpY0NhbGxBUCh0aGlzKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIF9zdGF0aWNDYWxsQVA7Ci19Ci0KLWludHB0cl90IFNpZ25kZWY6OnZpcnR1YWxDYWxsQVAoKSB7Ci0gIGlmICghX3ZpcnR1YWxDYWxsQVApIHsKLSAgICBtdm06OlRocmVhZEFsbG9jYXRvciBhbGxvY2F0b3I7Ci0gICAgY2hhciogYnVmID0gKGNoYXIqKWFsbG9jYXRvci5BbGxvY2F0ZSgoa2V5TmFtZS0+c2l6ZSA8PCAxKSArIDEgKyAxMSk7Ci0gICAgbmF0aXZlTmFtZShidWYsICJ2aXJ0dWFsX2FwIik7Ci0gICAgYm9vbCB1bnVzZWQgPSBmYWxzZTsKLSAgICBpbnRwdHJfdCByZXMgPSBpbml0aWFsTG9hZGVyLT5sb2FkSW5MaWIoYnVmLCB1bnVzZWQpOwotICAgIGlmIChyZXMpIHsKLSAgICAgIF92aXJ0dWFsQ2FsbEFQID0gcmVzOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbml0aWFsTG9hZGVyLT5nZXRDb21waWxlcigpLT52aXJ0dWFsQ2FsbEFQKHRoaXMpOwotICAgIH0KLSAgfQotICByZXR1cm4gX3ZpcnR1YWxDYWxsQVA7Ci19Ci0KLWludHB0cl90IFNpZ25kZWY6OnZpcnR1YWxDYWxsU3R1YigpIHsKLSAgaWYgKCFfdmlydHVhbENhbGxBUCkgewotICAgIG12bTo6VGhyZWFkQWxsb2NhdG9yIGFsbG9jYXRvcjsKLSAgICBjaGFyKiBidWYgPSAoY2hhciopYWxsb2NhdG9yLkFsbG9jYXRlKChrZXlOYW1lLT5zaXplIDw8IDEpICsgMSArIDExKTsKLSAgICBuYXRpdmVOYW1lKGJ1ZiwgInZpcnR1YWxfc3R1YiIpOwotICAgIGJvb2wgdW51c2VkID0gZmFsc2U7Ci0gICAgaW50cHRyX3QgcmVzID0gaW5pdGlhbExvYWRlci0+bG9hZEluTGliKGJ1ZiwgdW51c2VkKTsKLSAgICBpZiAocmVzKSB7Ci0gICAgICBfdmlydHVhbENhbGxTdHViID0gcmVzOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbml0aWFsTG9hZGVyLT5nZXRDb21waWxlcigpLT52aXJ0dWFsQ2FsbFN0dWIodGhpcyk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBfdmlydHVhbENhbGxTdHViOwotfQotCi1pbnRwdHJfdCBTaWduZGVmOjpzcGVjaWFsQ2FsbFN0dWIoKSB7Ci0gIGlmICghX3NwZWNpYWxDYWxsU3R1YikgewotICAgIG12bTo6VGhyZWFkQWxsb2NhdG9yIGFsbG9jYXRvcjsKLSAgICBjaGFyKiBidWYgPSAoY2hhciopYWxsb2NhdG9yLkFsbG9jYXRlKChrZXlOYW1lLT5zaXplIDw8IDEpICsgMSArIDExKTsKLSAgICBuYXRpdmVOYW1lKGJ1ZiwgInNwZWNpYWxfc3R1YiIpOwotICAgIGJvb2wgdW51c2VkID0gZmFsc2U7Ci0gICAgaW50cHRyX3QgcmVzID0gaW5pdGlhbExvYWRlci0+bG9hZEluTGliKGJ1ZiwgdW51c2VkKTsKLSAgICBpZiAocmVzKSB7Ci0gICAgICBfc3BlY2lhbENhbGxTdHViID0gcmVzOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbml0aWFsTG9hZGVyLT5nZXRDb21waWxlcigpLT5zcGVjaWFsQ2FsbFN0dWIodGhpcyk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBfc3BlY2lhbENhbGxTdHViOwotfQotCi1pbnRwdHJfdCBTaWduZGVmOjpzdGF0aWNDYWxsU3R1YigpIHsKLSAgaWYgKCFfc3RhdGljQ2FsbFN0dWIpIHsKLSAgICBtdm06OlRocmVhZEFsbG9jYXRvciBhbGxvY2F0b3I7Ci0gICAgY2hhciogYnVmID0gKGNoYXIqKWFsbG9jYXRvci5BbGxvY2F0ZSgoa2V5TmFtZS0+c2l6ZSA8PCAxKSArIDEgKyAxMSk7Ci0gICAgbmF0aXZlTmFtZShidWYsICJzdGF0aWNfc3R1YiIpOwotICAgIGJvb2wgdW51c2VkID0gZmFsc2U7Ci0gICAgaW50cHRyX3QgcmVzID0gaW5pdGlhbExvYWRlci0+bG9hZEluTGliKGJ1ZiwgdW51c2VkKTsKLSAgICBpZiAocmVzKSB7Ci0gICAgICBfc3RhdGljQ2FsbFN0dWIgPSByZXM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluaXRpYWxMb2FkZXItPmdldENvbXBpbGVyKCktPnN0YXRpY0NhbGxTdHViKHRoaXMpOwotICAgIH0KLSAgfQotICByZXR1cm4gX3N0YXRpY0NhbGxTdHViOwotfQotCi12b2lkIFNpZ25kZWY6Om5hdGl2ZU5hbWUoY2hhciogcHRyLCBjb25zdCBjaGFyKiBleHQpIGNvbnN0IHsKLSAgc2ludDMyIGkgPSAwOwotICB3aGlsZSAoaSA8IGtleU5hbWUtPnNpemUpIHsKLSAgICBjaGFyIGMgPSBrZXlOYW1lLT5lbGVtZW50c1tpKytdOwotICAgIGlmIChjID09IElfUEFSRykgewotICAgICAgcHRyWzBdID0gJ18nOwotICAgICAgcHRyWzFdID0gJ18nOwotICAgICAgcHRyICs9IDI7Ci0gICAgfSBlbHNlIGlmIChjID09ICcvJykgewotICAgICAgcHRyWzBdID0gJ18nOwotICAgICAgKytwdHI7Ci0gICAgfSBlbHNlIGlmIChjID09ICdfJykgewotICAgICAgcHRyWzBdID0gJ18nOwotICAgICAgcHRyWzFdID0gJzEnOwotICAgICAgcHRyICs9IDI7Ci0gICAgfSBlbHNlIGlmIChjID09IElfRU5EX1JFRikgewotICAgICAgcHRyWzBdID0gJ18nOwotICAgICAgcHRyWzFdID0gJzInOwotICAgICAgcHRyICs9IDI7Ci0gICAgfSBlbHNlIGlmIChjID09IElfVEFCKSB7Ci0gICAgICBwdHJbMF0gPSAnXyc7Ci0gICAgICBwdHJbMV0gPSAnMyc7Ci0gICAgICBwdHIgKz0gMjsKLSAgICB9IGVsc2UgaWYgKGMgPT0gSV9QQVJEKSB7Ci0gICAgICBicmVhazsKLSAgICB9IGVsc2UgewotICAgICAgcHRyWzBdID0gYzsKLSAgICAgICsrcHRyOwotICAgIH0KLSAgfQotCi0gIGFzc2VydChleHQgJiYgIkkgbmVlZCBhbiBleHRlbnNpb24iKTsKLSAgbWVtY3B5KHB0ciwgZXh0LCBzdHJsZW4oZXh0KSArIDEpOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL0ozL1ZNQ29yZS9KYXZhVHlwZXMuaCBiL3Zta2l0L2xpYi9KMy9WTUNvcmUvSmF2YVR5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YWNmN2EuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL0ozL1ZNQ29yZS9KYXZhVHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzOCArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLS0tLSBKYXZhVHlwZXMuaCAtIEphdmEgcHJpbWl0aXZlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgSk5KVk1fSkFWQV9UWVBFU19ICi0jZGVmaW5lIEpOSlZNX0pBVkFfVFlQRVNfSAotCi0jaW5jbHVkZSAidHlwZXMuaCIKLQotI2luY2x1ZGUgIm12bS9BbGxvY2F0b3IuaCIKLQotI2luY2x1ZGUgIkpuanZtQ2xhc3NMb2FkZXIuaCIKLQotbmFtZXNwYWNlIGozIHsKLQotY2xhc3MgVXNlckNvbW1vbkNsYXNzOwotY2xhc3MgSm5qdm1DbGFzc0xvYWRlcjsKLWNsYXNzIFVzZXJDbGFzc1ByaW1pdGl2ZTsKLQotI2RlZmluZSBWT0lEX0lEIDAKLSNkZWZpbmUgQk9PTF9JRCAxCi0jZGVmaW5lIEJZVEVfSUQgMgotI2RlZmluZSBDSEFSX0lEIDMKLSNkZWZpbmUgU0hPUlRfSUQgNAotI2RlZmluZSBJTlRfSUQgNQotI2RlZmluZSBGTE9BVF9JRCA2Ci0jZGVmaW5lIExPTkdfSUQgNwotI2RlZmluZSBET1VCTEVfSUQgOAotI2RlZmluZSBPQkpFQ1RfSUQgOQotI2RlZmluZSBBUlJBWV9JRCAxMAotI2RlZmluZSBOVU1fQVNTRVNTT1JTIDExCi0KLXN0YXRpYyBjb25zdCBjaGFyIElfVEFCID0gJ1snOwotc3RhdGljIGNvbnN0IGNoYXIgSV9FTkRfUkVGID0gJzsnOwotc3RhdGljIGNvbnN0IGNoYXIgSV9QQVJHID0gJygnOwotc3RhdGljIGNvbnN0IGNoYXIgSV9QQVJEID0gJyknOwotc3RhdGljIGNvbnN0IGNoYXIgSV9CWVRFID0gJ0InOwotc3RhdGljIGNvbnN0IGNoYXIgSV9DSEFSID0gJ0MnOwotc3RhdGljIGNvbnN0IGNoYXIgSV9ET1VCTEUgPSAnRCc7Ci1zdGF0aWMgY29uc3QgY2hhciBJX0ZMT0FUID0gJ0YnOwotc3RhdGljIGNvbnN0IGNoYXIgSV9JTlQgPSAnSSc7Ci1zdGF0aWMgY29uc3QgY2hhciBJX0xPTkcgPSAnSic7Ci1zdGF0aWMgY29uc3QgY2hhciBJX1JFRiA9ICdMJzsKLXN0YXRpYyBjb25zdCBjaGFyIElfU0hPUlQgPSAnUyc7Ci1zdGF0aWMgY29uc3QgY2hhciBJX1ZPSUQgPSAnVic7Ci1zdGF0aWMgY29uc3QgY2hhciBJX0JPT0wgPSAnWic7Ci1zdGF0aWMgY29uc3QgY2hhciBJX1NFUCA9ICcvJzsKLQotLy8vIFR5cGVkZWYgLSBFYWNoIGNsYXNzIGhhcyBhIFR5cGVkZWYgcmVwcmVzZW50YXRpb24uIEEgVHlwZWRlZiBpcyBhbHNvIGEgY2xhc3MKLS8vLyB3aGljaCBoYXMgbm90IGJlZW4gbG9hZGVkIHlldC4gVHlwZWRlZnMgYXJlIGhhc2hlZCBvbiB0aGUgbmFtZSBvZiB0aGUgY2xhc3MuCi0vLy8gSGFzaGluZyBpcyBmb3IgbWVtb3J5IHB1cnBvc2VzLCBub3QgZm9yIGNvbXBhcmlzb24uCi0vLy8KLWNsYXNzIFR5cGVkZWYgOiBwdWJsaWMgbXZtOjpQZXJtYW5lbnRPYmplY3QgewotcHVibGljOgotICAKLSAgLy8vIGtleU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgVHlwZWRlZi4gSXQgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGEgY2xhc3MKLSAgLy8vIGluIGEgSmF2YSBzaWduYXR1cmUsIGUuZy4gIkxqYXZhL2xhbmcvT2JqZWN0OyIuCi0gIC8vLwotICBjb25zdCBVVEY4KiBrZXlOYW1lOwotICAKLSAgLy8vIGFzc29jQ2xhc3MgLSBHaXZlbiB0aGUgbG9hZGVkLCB0cnkgdG8gbG9hZCB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcwotICAvLy8gVHlwZWRlZi4KLSAgLy8vCi0gIHZpcnR1YWwgVXNlckNvbW1vbkNsYXNzKiBhc3NvY0NsYXNzKEpuanZtQ2xhc3NMb2FkZXIqIGxvYWRlcikgY29uc3QgPSAwOwotICAKLSAgdmlydHVhbCBVc2VyQ29tbW9uQ2xhc3MqIGZpbmRBc3NvY0NsYXNzKEpuanZtQ2xhc3NMb2FkZXIqIGxvYWRlcikgY29uc3QgewotICAgIHJldHVybiBhc3NvY0NsYXNzKGxvYWRlcik7Ci0gIH0KLQotICAvLy8gdHJhY2UgLSBEb2VzIHRoaXMgdHlwZSBuZWVkIHRvIGJlIHRyYWNlZCBieSB0aGUgR0M/Ci0gIC8vLwotICB2aXJ0dWFsIGJvb2wgdHJhY2UoKSBjb25zdCA9IDA7Ci0gIAotICAvLy8gaXNQcmltaXRpdmUgLSBJcyB0aGlzIHR5cGUgYSBwcmltaXRpdmUgdHlwZT8KLSAgLy8vCi0gIHZpcnR1YWwgYm9vbCBpc1ByaW1pdGl2ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIC8vLyBpc1JlZmVyZW5jZSAtIElzIHRoaXMgdHlwZSBhIHJlZmVyZW5jZSB0eXBlPwotICAvLy8KLSAgdmlydHVhbCBib29sIGlzUmVmZXJlbmNlKCkgY29uc3QgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICAvLy8gaXNVbnNpZ25lZCAtIElzIHRoaXMgdHlwZSB1bnNpZ25lZD8KLSAgLy8vCi0gIHZpcnR1YWwgYm9vbCBpc1Vuc2lnbmVkKCkgY29uc3QgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgdmlydHVhbCBib29sIGlzVm9pZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgaXNMb25nKCkgY29uc3QgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHZpcnR1YWwgYm9vbCBpc0ludCgpIGNvbnN0IHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgaXNDaGFyKCkgY29uc3QgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHZpcnR1YWwgYm9vbCBpc1Nob3J0KCkgY29uc3QgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHZpcnR1YWwgYm9vbCBpc0J5dGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdmlydHVhbCBib29sIGlzQm9vbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgaXNGbG9hdCgpIGNvbnN0IHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgaXNEb3VibGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8vIGdldE5hbWUgLSBHZXQgdGhlIG5hbWUgb2YgdGhlIHR5cGUsIGkuZS4gamF2YS5sYW5nLlN0cmluZyBvcgotICAvLy8gSS4KLSAgdmlydHVhbCBjb25zdCBVVEY4KiBnZXROYW1lKCkgY29uc3QgewotICAgIHJldHVybiBrZXlOYW1lOwotICB9Ci0KLSAgLy8vIGdldEtleSAtIEdldCB0aGUgbmFtZSBvZiB0aGUgdHlwZSwgaS5lLiBMamF2YS9sYW5nL1N0cmluZzsgb3IKLSAgLy8vIEkuCi0gIGNvbnN0IFVURjgqIGdldEtleSgpIGNvbnN0IHsKLSAgICByZXR1cm4ga2V5TmFtZTsKLSAgfQotICAKLSAgdmlydHVhbCB+VHlwZWRlZigpIHt9Ci19OwotCi1jbGFzcyBQcmltaXRpdmVUeXBlZGVmIDogcHVibGljIFR5cGVkZWYgewotcHJpdmF0ZToKLSAgVXNlckNsYXNzUHJpbWl0aXZlKiBwcmltOwotICBib29sIHVuc2lnbjsKLSAgY2hhciBjaGFySWQ7Ci0gIAotcHVibGljOgotICAKLSAgdmlydHVhbCBib29sIHRyYWNlKCkgY29uc3QgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgdmlydHVhbCBib29sIGlzUHJpbWl0aXZlKCkgY29uc3QgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICB2aXJ0dWFsIGJvb2wgaXNSZWZlcmVuY2UoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdmlydHVhbCBib29sIGlzVW5zaWduZWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHVuc2lnbjsKLSAgfQotCi0gIHZpcnR1YWwgVXNlckNvbW1vbkNsYXNzKiBhc3NvY0NsYXNzKEpuanZtQ2xhc3NMb2FkZXIqIGxvYWRlcikgY29uc3QgewotICAgIHJldHVybiAoVXNlckNvbW1vbkNsYXNzKilwcmltOwotICB9Ci0KLSAgUHJpbWl0aXZlVHlwZWRlZihjb25zdCBVVEY4KiBuYW1lLCBVc2VyQ2xhc3NQcmltaXRpdmUqIGNsLCBib29sIHUsIGNoYXIgaSkgewotICAgIGtleU5hbWUgPSBuYW1lOwotICAgIHByaW0gPSBjbDsKLSAgICB1bnNpZ24gPSB1OwotICAgIGNoYXJJZCA9IGk7Ci0gIH0KLSAgCi0gIHZpcnR1YWwgYm9vbCBpc1ZvaWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNoYXJJZCA9PSBJX1ZPSUQ7Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgaXNMb25nKCkgY29uc3QgewotICAgIHJldHVybiBjaGFySWQgPT0gSV9MT05HOwotICB9Ci0KLSAgdmlydHVhbCBib29sIGlzSW50KCkgY29uc3QgewotICAgIHJldHVybiBjaGFySWQgPT0gSV9JTlQ7Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgaXNDaGFyKCkgY29uc3QgewotICAgIHJldHVybiBjaGFySWQgPT0gSV9DSEFSOwotICB9Ci0KLSAgdmlydHVhbCBib29sIGlzU2hvcnQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNoYXJJZCA9PSBJX1NIT1JUOwotICB9Ci0KLSAgdmlydHVhbCBib29sIGlzQnl0ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gY2hhcklkID09IElfQllURTsKLSAgfQotCi0gIHZpcnR1YWwgYm9vbCBpc0Jvb2woKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNoYXJJZCA9PSBJX0JPT0w7Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgaXNGbG9hdCgpIGNvbnN0IHsKLSAgICByZXR1cm4gY2hhcklkID09IElfRkxPQVQ7Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgaXNEb3VibGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNoYXJJZCA9PSBJX0RPVUJMRTsKLSAgfQotICAKLX07Ci0KLWNsYXNzIEFycmF5VHlwZWRlZiA6IHB1YmxpYyBUeXBlZGVmIHsKLXB1YmxpYzoKLSAgCi0gIHZpcnR1YWwgYm9vbCB0cmFjZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZpcnR1YWwgVXNlckNvbW1vbkNsYXNzKiBhc3NvY0NsYXNzKEpuanZtQ2xhc3NMb2FkZXIqIGxvYWRlcikgY29uc3Q7Ci0gIHZpcnR1YWwgVXNlckNvbW1vbkNsYXNzKiBmaW5kQXNzb2NDbGFzcyhKbmp2bUNsYXNzTG9hZGVyKiBsb2FkZXIpIGNvbnN0OwotCi0gIEFycmF5VHlwZWRlZihjb25zdCBVVEY4KiBuYW1lKSB7Ci0gICAga2V5TmFtZSA9IG5hbWU7Ci0gIH0KLX07Ci0KLWNsYXNzIE9iamVjdFR5cGVkZWYgOiBwdWJsaWMgVHlwZWRlZiB7Ci1wcml2YXRlOgotICAvLy8gcHNldWRvQXNzb2NDbGFzc05hbWUgLSBUaGUgcmVhbCBuYW1lIG9mIHRoZSBjbGFzcyB0aGlzIFR5cGVkZWYKLSAgLy8vIHJlcHJlc2VudHMsIGUuZy4gImphdmEvbGFuZy9PYmplY3QiCi0gIC8vLwotICBjb25zdCBVVEY4KiBwc2V1ZG9Bc3NvY0NsYXNzTmFtZTsKLQotcHVibGljOgotICB2aXJ0dWFsIGJvb2wgdHJhY2UoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIHZpcnR1YWwgVXNlckNvbW1vbkNsYXNzKiBhc3NvY0NsYXNzKEpuanZtQ2xhc3NMb2FkZXIqIGxvYWRlcikgY29uc3Q7Ci0gIHZpcnR1YWwgVXNlckNvbW1vbkNsYXNzKiBmaW5kQXNzb2NDbGFzcyhKbmp2bUNsYXNzTG9hZGVyKiBsb2FkZXIpIGNvbnN0OwotCi0gIE9iamVjdFR5cGVkZWYoY29uc3QgVVRGOCpuYW1lLCBVVEY4TWFwKiBtYXApOwotICAKLSAgdmlydHVhbCBjb25zdCBVVEY4KiBnZXROYW1lKCkgY29uc3QgewotICAgIHJldHVybiBwc2V1ZG9Bc3NvY0NsYXNzTmFtZTsKLSAgfQotCi19OwotCi0KLS8vLyBTaWduZGVmIC0gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgSmF2YSBzaWduYXR1cmUuIEVhY2ggSmF2YSBtZXRob2QgaGFzIGEKLS8vLyBKYXZhIHNpZ25hdHVyZS4gU2lnbmRlZnMgYXJlIGhhc2hlZCBmb3IgbWVtb3J5IHB1cnBvc2VzLCBub3QgZXF1YWxpdHkKLS8vLyBwdXJwb3Nlcy4KLS8vLwotY2xhc3MgU2lnbmRlZiA6IHB1YmxpYyBtdm06OlBlcm1hbmVudE9iamVjdCB7Ci1wcml2YXRlOgotICAKLSAgLy8vIF9zdGF0aWNDYWxsQnVmIC0gQSBkeW5hbWljYWxseSBnZW5lcmF0ZWQgbWV0aG9kIHdoaWNoIGNhbGxzIGEgc3RhdGljIEphdmEKLSAgLy8vIGZ1bmN0aW9uIHdpdGggdGhlIHNwZWNpZmljIHNpZ25hdHVyZSBhbmQgcmVjZWl2ZSB0aGUgYXJndW1lbnRzIGluIGEKLSAgLy8vIGJ1ZmZlci4KLSAgLy8vCi0gIGludHB0cl90IF9zdGF0aWNDYWxsQnVmOwotICBpbnRwdHJfdCBzdGF0aWNDYWxsQnVmKCk7Ci0KLSAgLy8vIF92aXJ0dWFsQ2FsbEJ1ZiAtIEEgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIG1ldGhvZCB3aGljaCBjYWxscyBhIHZpcnR1YWwKLSAgLy8vIEphdmEgZnVuY3Rpb24gd2l0aCB0aGUgc3BlY2lmaWMgc2lnbmF0dXJlIGFuZCByZWNlaXZlIHRoZSBhcmd1bWVudHMgaW4gYQotICAvLy8gYnVmZmVyLgotICAvLy8KLSAgaW50cHRyX3QgX3ZpcnR1YWxDYWxsQnVmOwotICBpbnRwdHJfdCB2aXJ0dWFsQ2FsbEJ1ZigpOwotICAKLSAgLy8vIF9zdGF0aWNDYWxsQVAgLSBBIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBtZXRob2Qgd2hpY2ggY2FsbHMgYSBzdGF0aWMgSmF2YQotICAvLy8gZnVuY3Rpb24gd2l0aCB0aGUgc3BlY2lmaWMgc2lnbmF0dXJlIGFuZCByZWNlaXZlIHRoZSBhcmd1bWVudHMgaW4gYQotICAvLy8gdmFyaWFibGUgYXJndW1lbnQgaGFuZGxlLgotICAvLy8KLSAgaW50cHRyX3QgX3N0YXRpY0NhbGxBUDsKLSAgaW50cHRyX3Qgc3RhdGljQ2FsbEFQKCk7Ci0gIAotICAvLy8gX3ZpcnR1YWxDYWxsQnVmIC0gQSBkeW5hbWljYWxseSBnZW5lcmF0ZWQgbWV0aG9kIHdoaWNoIGNhbGxzIGEgdmlydHVhbAotICAvLy8gSmF2YSBmdW5jdGlvbiB3aXRoIHRoZSBzcGVjaWZpYyBzaWduYXR1cmUgYW5kIHJlY2VpdmUgdGhlIGFyZ3VtZW50cyBpbiBhCi0gIC8vLyB2YXJpYWJsZSBhcmd1bWVudCBoYW5kbGUuCi0gIC8vLwotICBpbnRwdHJfdCBfdmlydHVhbENhbGxBUDsgCi0gIGludHB0cl90IHZpcnR1YWxDYWxsQVAoKTsKLSAgCi0gIGludHB0cl90IF92aXJ0dWFsQ2FsbFN0dWI7IAotICBpbnRwdHJfdCB2aXJ0dWFsQ2FsbFN0dWIoKTsKLSAgCi0gIGludHB0cl90IF9zcGVjaWFsQ2FsbFN0dWI7Ci0gIGludHB0cl90IHNwZWNpYWxDYWxsU3R1YigpOwotICAKLSAgaW50cHRyX3QgX3N0YXRpY0NhbGxTdHViOyAKLSAgaW50cHRyX3Qgc3RhdGljQ2FsbFN0dWIoKTsKLSAgCi1wdWJsaWM6Ci0KLSAgLy8vIGluaXRpYWxMb2FkZXIgLSBUaGUgbG9hZGVyIHRoYXQgZmlyc3QgbG9hZGVkIHRoaXMgc2lnbmRlZi4KLSAgLy8vCi0gIEpuanZtQ2xhc3NMb2FkZXIqIGluaXRpYWxMb2FkZXI7Ci0KLSAgLy8vIGtleU5hbWUgLSBUaGUgSmF2YSBuYW1lIG9mIHRoZSBzaWduYXR1cmUsIGUuZy4gIigpViIuCi0gIC8vLwotICBjb25zdCBVVEY4KiBrZXlOYW1lOwotICAKLSAgLy8vIG5hdGl2ZU5hbWUgLSBHZXQgYSBuYXRpdmUgbmFtZSBmb3IgY2FsbGJhY2tzIGVtaXR0ZWQgQU9ULgotICAvLy8KLSAgdm9pZCBuYXRpdmVOYW1lKGNoYXIqIGJ1ZiwgY29uc3QgY2hhciogZXh0KSBjb25zdDsKLQotICAvLy8gU2lnbmRlZiAtIENyZWF0ZSBhIG5ldyBTaWduZGVmLgotICAvLy8KLSAgU2lnbmRlZihjb25zdCBVVEY4KiBuYW1lLCBKbmp2bUNsYXNzTG9hZGVyKiBsb2FkZXIsCi0gICAgICAgICAgc3RkOjp2ZWN0b3I8VHlwZWRlZio+JiBhcmdzLCBUeXBlZGVmKiByZXQpOwotICAKLSAgLy8vIG9wZXJhdG9yIG5ldyAtIFJlZGVmaW5lcyB0aGUgbmV3IG9wZXJhdG9yIG9mIHRoaXMgY2xhc3MgdG8gYWxsb2NhdGUKLSAgLy8vIHRoZSBhcmd1bWVudHMgaW4gdGhlIG9iamVjdCBpdHNlbGYuCi0gIC8vLwotICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHN6LCBtdm06OkJ1bXBQdHJBbGxvY2F0b3ImIGFsbG9jYXRvciwKLSAgICAgICAgICAgICAgICAgICAgIHNpbnQzMiBzaXplKSB7Ci0gICAgcmV0dXJuIGFsbG9jYXRvci5BbGxvY2F0ZShzaXplb2YoU2lnbmRlZikgKyBzaXplICogc2l6ZW9mKFR5cGVkZWYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNpZ25kZWYiKTsKLSAgfQotCi0gIAotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyBJbmxpbmUgY2FsbHMgdG8gZ2V0IHRoZSBkeW5hbWljYWxseSBnZW5lcmF0ZWQgZnVuY3Rpb25zIHRvIGNhbGwgSmF2YQotLy8gZnVuY3Rpb25zLiBOb3RlIHRoYXQgdGhpcyBjYWxscyB0aGUgSklULgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSAgaW50cHRyX3QgZ2V0U3RhdGljQ2FsbEJ1ZigpIHsKLSAgICBpZighX3N0YXRpY0NhbGxCdWYpIHJldHVybiBzdGF0aWNDYWxsQnVmKCk7Ci0gICAgcmV0dXJuIF9zdGF0aWNDYWxsQnVmOwotICB9Ci0KLSAgaW50cHRyX3QgZ2V0VmlydHVhbENhbGxCdWYoKSB7Ci0gICAgaWYoIV92aXJ0dWFsQ2FsbEJ1ZikgcmV0dXJuIHZpcnR1YWxDYWxsQnVmKCk7Ci0gICAgcmV0dXJuIF92aXJ0dWFsQ2FsbEJ1ZjsKLSAgfQotICAKLSAgaW50cHRyX3QgZ2V0U3RhdGljQ2FsbEFQKCkgewotICAgIGlmICghX3N0YXRpY0NhbGxBUCkgcmV0dXJuIHN0YXRpY0NhbGxBUCgpOwotICAgIHJldHVybiBfc3RhdGljQ2FsbEFQOwotICB9Ci0KLSAgaW50cHRyX3QgZ2V0VmlydHVhbENhbGxBUCgpIHsKLSAgICBpZiAoIV92aXJ0dWFsQ2FsbEFQKSByZXR1cm4gdmlydHVhbENhbGxBUCgpOwotICAgIHJldHVybiBfdmlydHVhbENhbGxBUDsKLSAgfQotICAKLSAgaW50cHRyX3QgZ2V0VmlydHVhbENhbGxTdHViKCkgewotICAgIGlmICghX3ZpcnR1YWxDYWxsU3R1YikgcmV0dXJuIHZpcnR1YWxDYWxsU3R1YigpOwotICAgIHJldHVybiBfdmlydHVhbENhbGxTdHViOwotICB9Ci0gIAotICBpbnRwdHJfdCBnZXRTcGVjaWFsQ2FsbFN0dWIoKSB7Ci0gICAgaWYgKCFfc3BlY2lhbENhbGxTdHViKSByZXR1cm4gc3BlY2lhbENhbGxTdHViKCk7Ci0gICAgcmV0dXJuIF9zcGVjaWFsQ2FsbFN0dWI7Ci0gIH0KLSAgCi0gIGludHB0cl90IGdldFN0YXRpY0NhbGxTdHViKCkgewotICAgIGlmICghX3N0YXRpY0NhbGxTdHViKSByZXR1cm4gc3RhdGljQ2FsbFN0dWIoKTsKLSAgICByZXR1cm4gX3N0YXRpY0NhbGxTdHViOwotICB9Ci0gIAotICB2b2lkIHNldFN0YXRpY0NhbGxCdWYodm9pZCogY29kZSkgewotICAgIF9zdGF0aWNDYWxsQnVmID0gKGludHB0cl90KWNvZGU7Ci0gIH0KLQotICB2b2lkIHNldFZpcnR1YWxDYWxsQnVmKHZvaWQqIGNvZGUpIHsKLSAgICBfdmlydHVhbENhbGxCdWYgPSAoaW50cHRyX3QpY29kZTsKLSAgfQotICAKLSAgdm9pZCBzZXRTdGF0aWNDYWxsQVAodm9pZCogY29kZSkgewotICAgIF9zdGF0aWNDYWxsQVAgPSAoaW50cHRyX3QpY29kZTsKLSAgfQotCi0gIHZvaWQgc2V0VmlydHVhbENhbGxBUCh2b2lkKiBjb2RlKSB7Ci0gICAgX3ZpcnR1YWxDYWxsQVAgPSAoaW50cHRyX3QpY29kZTsKLSAgfQotICAKLSAgdm9pZCBzZXRWaXJ0dWFsQ2FsbFN0dWIodm9pZCogY29kZSkgewotICAgIF92aXJ0dWFsQ2FsbFN0dWIgPSAoaW50cHRyX3QpY29kZTsKLSAgfQotICAKLSAgdm9pZCBzZXRTcGVjaWFsQ2FsbFN0dWIodm9pZCogY29kZSkgewotICAgIF9zcGVjaWFsQ2FsbFN0dWIgPSAoaW50cHRyX3QpY29kZTsKLSAgfQotICAKLSAgdm9pZCBzZXRTdGF0aWNDYWxsU3R1Yih2b2lkKiBjb2RlKSB7Ci0gICAgX3N0YXRpY0NhbGxTdHViID0gKGludHB0cl90KWNvZGU7Ci0gIH0KLQotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyBFbmQgb2YgaW5saW5lZCBtZXRob2RzIG9mIGdldHRpbmcgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIGZ1bmN0aW9ucy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotICAgIAotICAvLy8gbmJBcmd1bWVudHMgLSBUaGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiB0aGUgc2lnbmF0dXJlLiAKLSAgLy8vCi0gIHVpbnQzMiBuYkFyZ3VtZW50czsKLSAgCi0gIC8vLyBnZXRSZXR1cm5UeXBlIC0gR2V0IHRoZSB0eXBlIG9mIHRoZSByZXR1cm4gb2YgdGhpcyBzaWduYXR1cmUuCi0gIC8vLwotICBUeXBlZGVmKiBnZXRSZXR1cm5UeXBlKCkgY29uc3QgewotICAgIHJldHVybiBhcmd1bWVudHNbMF07Ci0gIH0KLQotICAvLy8gZ2V0QXJndW1lbnRzVHlwZSAtIEdldCB0aGUgbGlzdCBvZiBhcmd1bWVudHMgb2YgdGhpcyBzaWduYXR1cmUuCi0gIC8vLwotICBUeXBlZGVmKiBjb25zdCogZ2V0QXJndW1lbnRzVHlwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gJihhcmd1bWVudHNbMV0pOwotICB9Ci0KLXByaXZhdGU6Ci0gIAotICAvLy8gYXJndW1lbnRzIC0gVGhlIGxpc3Qgb2YgYXJndW1lbnRzIG9mIHRoZSBzaWduYXR1cmUuIEZpcnN0IGlzIHRoZSByZXR1cm4KLSAgLy8vIHR5cGUuCi0gIC8vLwotICBUeXBlZGVmKiBhcmd1bWVudHNbMV07Ci0KLSAgICAKLX07Ci0KLQotfSAvLyBlbmQgbmFtZXNwYWNlIGozCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL0ozL1ZNQ29yZS9KbmkuY3BwIGIvdm1raXQvbGliL0ozL1ZNQ29yZS9KbmkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTc4M2EyLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9KMy9WTUNvcmUvSm5pLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM5NDIgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLS0tIEpuaS5jcHAgLSBKbmkgaW50ZXJmYWNlIGZvciBKMyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSA8am5pLmg+Ci0KLSNpbmNsdWRlICJDbGFzc3BhdGhSZWZsZWN0LmgiCi0jaW5jbHVkZSAiSmF2YUFycmF5LmgiCi0jaW5jbHVkZSAiSmF2YUNsYXNzLmgiCi0jaW5jbHVkZSAiSmF2YU9iamVjdC5oIgotI2luY2x1ZGUgIkphdmFTdHJpbmcuaCIKLSNpbmNsdWRlICJKYXZhVGhyZWFkLmgiCi0jaW5jbHVkZSAiSmF2YVR5cGVzLmgiCi0jaW5jbHVkZSAiSmF2YVVwY2FsbHMuaCIKLSNpbmNsdWRlICJKbmp2bS5oIgotCi0KLXVzaW5nIG5hbWVzcGFjZSBqMzsKLQotSm5qdm0qIG15Vk0oSk5JRW52KiBlbnYpIHsKLSAgcmV0dXJuIEphdmFUaHJlYWQ6OmdldCgpLT5nZXRKVk0oKTsKLX0KLQotVXNlckNsYXNzKiBnZXRDbGFzc0Zyb21TdGF0aWNNZXRob2QoSmF2YU1ldGhvZCogbWV0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFPYmplY3QqIGNsYXp6KSB7Ci0gIGxsdm1fZ2Nyb290KGNsYXp6LCAwKTsKLSAgcmV0dXJuIG1ldGgtPmNsYXNzRGVmOwotfQotCi1zdGF0aWMgVXNlckNsYXNzKiBnZXRDbGFzc0Zyb21WaXJ0dWFsTWV0aG9kKEphdmFNZXRob2QqIG1ldGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJDb21tb25DbGFzcyogY2wpIHsKLSAgcmV0dXJuIG1ldGgtPmNsYXNzRGVmOwotfQotCi1leHRlcm4gIkMiIGNvbnN0IHN0cnVjdCBKTklJbnZva2VJbnRlcmZhY2VfIEpOSV9KYXZhVk1UYWJsZTsKLWV4dGVybiAiQyIgc3RydWN0IEpOSU5hdGl2ZUludGVyZmFjZV8gSk5JX0pOSUVudlRhYmxlOwotCi1qaW50IEdldFZlcnNpb24oSk5JRW52ICplbnYpIHsKLSAgcmV0dXJuIEpOSV9WRVJTSU9OXzFfNDsKLX0KLQotCi1qY2xhc3MgRGVmaW5lQ2xhc3MoSk5JRW52ICplbnYsIGNvbnN0IGNoYXIgKm5hbWUsIGpvYmplY3QgbG9hZGVyLAotCQkJCSAgIGNvbnN0IGpieXRlICpidWYsIGpzaXplIGJ1ZkxlbikgewotICBmcHJpbnRmKHN0ZGVyciwgIkltcGxlbWVudCBtZVxuIik7IGFib3J0KCk7Ci0gIHJldHVybiAwOwotfQotCi0KLWpjbGFzcyBGaW5kQ2xhc3MoSk5JRW52ICplbnYsIGNvbnN0IGNoYXIgKmFzY2lpeikgewotICAKLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotCi0gIEpuanZtQ2xhc3NMb2FkZXIqIGxvYWRlciA9IDA7Ci0gIEphdmFUaHJlYWQqIHRoID0gSmF2YVRocmVhZDo6Z2V0KCk7Ci0gIFVzZXJDbGFzcyogY3VycmVudENsYXNzID0gdGgtPmdldENhbGxpbmdDbGFzc0xldmVsKDApOwotICBpZiAoY3VycmVudENsYXNzKSBsb2FkZXIgPSBjdXJyZW50Q2xhc3MtPmNsYXNzTG9hZGVyOwotICBlbHNlIGxvYWRlciA9IG15Vk0oZW52KS0+YXBwQ2xhc3NMb2FkZXI7Ci0KLSAgVXNlckNvbW1vbkNsYXNzKiBjbCA9IGxvYWRlci0+bG9hZENsYXNzRnJvbUFzY2lpeihhc2NpaXosIHRydWUsIHRydWUpOwotICBpZiAoY2wgJiYgY2wtPmFzQ2xhc3MoKSkgewotICAgIGFzc2VydChjbC0+YXNDbGFzcygpLT5pc1Jlc29sdmVkKCkpOwotICAgIGNsLT5hc0NsYXNzKCktPmluaXRpYWxpc2VDbGFzcygpOwotICB9Ci0gIGpjbGFzcyByZXMgPSAoamNsYXNzKWNsLT5nZXRDbGFzc0RlbGVnYXRlZVB0cigpOwotICBSRVRVUk5fRlJPTV9KTkkocmVzKTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICBSRVRVUk5fRlJPTV9KTkkoMCk7Ci19Ci0gIAotCi1qbWV0aG9kSUQgRnJvbVJlZmxlY3RlZE1ldGhvZChKTklFbnYgKmVudiwgam9iamVjdCBtZXRob2QpIHsKLSAgCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAKLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuIAotICBKYXZhT2JqZWN0KiBtZXRoID0gKihKYXZhT2JqZWN0KiopbWV0aG9kOwotICBsbHZtX2djcm9vdChtZXRoLCAwKTsKLQotICBVc2VyQ29tbW9uQ2xhc3MqIGNsID0gSmF2YU9iamVjdDo6Z2V0Q2xhc3MobWV0aCk7Ci0gIEpuanZtKiB2bSA9IGNsLT5jbGFzc0xvYWRlci0+dm07Ci0gIENsYXNzcGF0aCogdXBjYWxscyA9IHZtLT51cGNhbGxzOwotICBpZiAoY2wgPT0gdXBjYWxscy0+bmV3Q29uc3RydWN0b3IpICB7Ci0gICAgam1ldGhvZElEIHJlcyA9IChqbWV0aG9kSUQpSmF2YU9iamVjdE1ldGhvZDo6Z2V0SW50ZXJuYWxNZXRob2QoKEphdmFPYmplY3RNZXRob2QqKW1ldGgpOwotICAgIFJFVFVSTl9GUk9NX0pOSShyZXMpOwotICB9IGVsc2UgaWYgKGNsID09IHVwY2FsbHMtPm5ld01ldGhvZCkgewotICAgIGptZXRob2RJRCByZXMgPSAoam1ldGhvZElEKUphdmFPYmplY3RDb25zdHJ1Y3Rvcjo6Z2V0SW50ZXJuYWxNZXRob2QoKEphdmFPYmplY3RDb25zdHJ1Y3RvciopbWV0aCk7Ci0gICAgUkVUVVJOX0ZST01fSk5JKHJlcyk7Ci0gIH0KLSAgCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIAotICBSRVRVUk5fRlJPTV9KTkkoMCk7Ci19Ci0KLQotamNsYXNzIEdldFN1cGVyY2xhc3MoSk5JRW52ICplbnYsIGpjbGFzcyBzdWIpIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOyBhYm9ydCgpOwotICByZXR1cm4gMDsKLX0KLSAgCi0gCi1qYm9vbGVhbiBJc0Fzc2lnbmFibGVGcm9tKEpOSUVudiAqZW52LCBqY2xhc3MgX3N1YiwgamNsYXNzIF9zdXApIHsKLSAgCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAKLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEphdmFPYmplY3QqIHN1YiA9ICooSmF2YU9iamVjdCoqKV9zdWI7Ci0gIEphdmFPYmplY3QqIHN1cCA9ICooSmF2YU9iamVjdCoqKV9zdXA7Ci0gIGxsdm1fZ2Nyb290KHN1YiwgMCk7Ci0gIGxsdm1fZ2Nyb290KHN1cCwgMCk7Ci0gIAotICBVc2VyQ29tbW9uQ2xhc3MqIGNsMiA9IAotICAgIFVzZXJDb21tb25DbGFzczo6cmVzb2x2ZWRJbXBsQ2xhc3Moc3VwLCBmYWxzZSk7Ci0gIFVzZXJDb21tb25DbGFzcyogY2wxID0gCi0gICAgVXNlckNvbW1vbkNsYXNzOjpyZXNvbHZlZEltcGxDbGFzcyhzdWIsIGZhbHNlKTsKLQotICBqYm9vbGVhbiByZXMgPSAoamJvb2xlYW4pY2wxLT5pc0Fzc2lnbmFibGVGcm9tKGNsMik7Ci0gIFJFVFVSTl9GUk9NX0pOSShyZXMpOwotICAKLSAgRU5EX0pOSV9FWENFUFRJT04KLQotICBSRVRVUk5fRlJPTV9KTkkoZmFsc2UpOwotfQotCi0KLWppbnQgVGhyb3coSk5JRW52ICplbnYsIGp0aHJvd2FibGUgb2JqKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotamludCBUaHJvd05ldyhKTklFbnYqIGVudiwgamNsYXNzIF9DbCwgY29uc3QgY2hhciAqbXNnKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gCi0gIC8vIExvY2FsIG9iamVjdCByZWZlcmVuY2VzLgotICBKYXZhT2JqZWN0KiBDbCA9ICooSmF2YU9iamVjdCoqKV9DbDsKLSAgSmF2YU9iamVjdCogcmVzID0gMDsKLSAgSmF2YVN0cmluZyogc3RyID0gMDsKLSAgbGx2bV9nY3Jvb3QoQ2wsIDApOwotICBsbHZtX2djcm9vdChyZXMsIDApOwotICBsbHZtX2djcm9vdChzdHIsIDApOwotICAKLSAgdmVyaWZ5TnVsbChDbCk7Ci0gIFVzZXJDb21tb25DbGFzcyogY2wgPSBVc2VyQ29tbW9uQ2xhc3M6OnJlc29sdmVkSW1wbENsYXNzKENsLCB0cnVlKTsKLSAgaWYgKCFjbC0+aXNDbGFzcygpKSBSRVRVUk5fRlJPTV9KTkkoMCk7Ci0KLSAgSm5qdm0qIHZtID0gY2wtPmNsYXNzTG9hZGVyLT52bTsKLSAgCi0gIFVzZXJDbGFzcyogcmVhbENsID0gY2wtPmFzQ2xhc3MoKTsKLSAgcmVzID0gcmVhbENsLT5kb05ldygpOwotICBKYXZhTWV0aG9kKiBpbml0ID0gcmVhbENsLT5sb29rdXBNZXRob2Qodm0tPnVwY2FsbHMtPmluaXROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0tPnVwY2FsbHMtPmluaXRFeGNlcHRpb25TaWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSwgMCk7Ci0gIHN0ciA9IHZtLT5hc2NpaXpUb1N0cihtc2cpOwotICBpbml0LT5pbnZva2VJbnRTcGVjaWFsKHJlYWxDbCwgcmVzLCAmc3RyKTsKLQltdXQtPnNldFBlbmRpbmdFeGNlcHRpb24ocmVzKTsKLSAgCi0gIFJFVFVSTl9GUk9NX0pOSSgxKTsKLSAgCi0gIEVORF9KTklfRVhDRVBUSU9OCi0KLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLWp0aHJvd2FibGUgRXhjZXB0aW9uT2NjdXJyZWQoSk5JRW52ICplbnYpIHsKLSAgCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLQotCW12bTo6Z2MqIG9iaiA9IG11dC0+Z2V0UGVuZGluZ0V4Y2VwdGlvbigpOwotICBsbHZtX2djcm9vdChvYmosIDApOwotICBpZiAob2JqID09IE5VTEwpIFJFVFVSTl9GUk9NX0pOSShOVUxMKTsKLSAganRocm93YWJsZSByZXMgPSAoanRocm93YWJsZSlKYXZhVGhyZWFkOjpqM1RocmVhZChtdXQpLT5wdXNoSk5JUmVmKG9iaik7Ci0gIFJFVFVSTl9GUk9NX0pOSShyZXMpOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0KLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLXZvaWQgRXhjZXB0aW9uRGVzY3JpYmUoSk5JRW52ICplbnYpIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotfQotCi0KLXZvaWQgRXhjZXB0aW9uQ2xlYXIoSk5JRW52ICplbnYpIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOyAKLSAgYWJvcnQoKTsKLX0KLQotCi12b2lkIEZhdGFsRXJyb3IoSk5JRW52ICplbnYsIGNvbnN0IGNoYXIgKm1zZykgewotICBmcHJpbnRmKHN0ZGVyciwgIkltcGxlbWVudCBtZVxuIik7Ci0gIGFib3J0KCk7Ci19Ci0KLQotamludCBQdXNoTG9jYWxGcmFtZShKTklFbnYqIGVudiwgamludCBjYXBhY2l0eSkgewotICBmcHJpbnRmKHN0ZGVyciwgIkltcGxlbWVudCBtZVxuIik7Ci0gIGFib3J0KCk7Ci0gIHJldHVybiAwOwotfQotCi1qb2JqZWN0IFBvcExvY2FsRnJhbWUoSk5JRW52KiBlbnYsIGpvYmplY3QgcmVzdWx0KSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotdm9pZCBEZWxldGVMb2NhbFJlZihKTklFbnYgKmVudiwgam9iamVjdCBsb2NhbFJlZikgewotfQotCi0KLWpib29sZWFuIElzU2FtZU9iamVjdChKTklFbnYgKmVudiwgam9iamVjdCByZWYxLCBqb2JqZWN0IHJlZjIpIHsKLSAgCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLQotICBKYXZhT2JqZWN0KiBSZWYxID0gKihKYXZhT2JqZWN0KiopcmVmMTsKLSAgSmF2YU9iamVjdCogUmVmMiA9ICooSmF2YU9iamVjdCoqKXJlZjI7Ci0gIGxsdm1fZ2Nyb290KFJlZjEsIDApOwotICBsbHZtX2djcm9vdChSZWYyLCAwKTsKLQotICBSRVRVUk5fRlJPTV9KTkkoUmVmMSA9PSBSZWYyKTsKLSAgCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIFJFVFVSTl9GUk9NX0pOSShmYWxzZSk7Ci19Ci0KLQotam9iamVjdCBOZXdMb2NhbFJlZihKTklFbnYgKmVudiwgam9iamVjdCByZWYpIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotICByZXR1cm4gMDsKLX0KLQotCi1qaW50IEVuc3VyZUxvY2FsQ2FwYWNpdHkoSk5JRW52KiBlbnYsIGppbnQgY2FwYWNpdHkpIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotICByZXR1cm4gMDsKLX0KLQotCi1qb2JqZWN0IEFsbG9jT2JqZWN0KEpOSUVudiAqZW52LCBqY2xhc3MgX2NsYXp6KSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gCi0gIC8vIExvY2FsIG9iamVjdCByZWZlcmVuY2VzLiAgCi0gIEphdmFPYmplY3QqIGNsYXp6ID0gKihKYXZhT2JqZWN0KiopX2NsYXp6OwotICBKYXZhT2JqZWN0KiByZXMgPSAwOwotICBsbHZtX2djcm9vdChjbGF6eiwgMCk7Ci0gIGxsdm1fZ2Nyb290KHJlcywgMCk7Ci0KLSAgSmF2YVRocmVhZCogdGggPSBKYXZhVGhyZWFkOjpnZXQoKTsKLQotICBVc2VyQ29tbW9uQ2xhc3MqIGNsID0gVXNlckNvbW1vbkNsYXNzOjpyZXNvbHZlZEltcGxDbGFzcyhjbGF6eiwgdHJ1ZSk7Ci0gIGlmICghY2wtPmlzQ2xhc3MoKSkgUkVUVVJOX0ZST01fSk5JKDApOwotCi0gIC8vIFN0b3JlIGxvY2FsIHJlZmVyZW5jZQotICByZXMgPSBjbC0+YXNDbGFzcygpLT5kb05ldygpOwotIAotICBqb2JqZWN0IHJldCA9IChqb2JqZWN0KXRoLT5wdXNoSk5JUmVmKHJlcyk7Ci0gIFJFVFVSTl9GUk9NX0pOSShyZXQpOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIFJFVFVSTl9GUk9NX0pOSSgwKTsKLX0KLQotCi1qb2JqZWN0IE5ld09iamVjdChKTklFbnYgKmVudiwgamNsYXNzIF9jbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAKLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMKLSAgSmF2YU9iamVjdCogY2xhenogPSAqKEphdmFPYmplY3QqKilfY2xheno7Ci0gIEphdmFPYmplY3QqIHJlcyA9IDA7Ci0gIGxsdm1fZ2Nyb290KGNsYXp6LCAwKTsKLSAgbGx2bV9nY3Jvb3QocmVzLCAwKTsKLSAgCi0gIEphdmFNZXRob2QqIG1ldGggPSAoSmF2YU1ldGhvZCopbWV0aG9kSUQ7Ci0gIEphdmFUaHJlYWQqIHRoID0gSmF2YVRocmVhZDo6Z2V0KCk7Ci0gIFVzZXJDb21tb25DbGFzcyogY2wgPSBVc2VyQ29tbW9uQ2xhc3M6OnJlc29sdmVkSW1wbENsYXNzKGNsYXp6LCB0cnVlKTsKLSAgaWYgKCFjbC0+aXNDbGFzcygpKSBSRVRVUk5fRlJPTV9KTkkoMCk7Ci0gIAotICAvLyBTdG9yZSBsb2NhbCByZWZlcmVuY2UKLSAgcmVzID0gY2wtPmFzQ2xhc3MoKS0+ZG9OZXcoKTsKLQotICB2YV9saXN0IGFwOwotICB2YV9zdGFydChhcCwgbWV0aG9kSUQpOwotICBtZXRoLT5pbnZva2VJbnRTcGVjaWFsQVAoY2wtPmFzQ2xhc3MoKSwgcmVzLCBhcCk7Ci0gIHZhX2VuZChhcCk7Ci0gCi0gIGpvYmplY3QgcmV0ID0gKGpvYmplY3QpdGgtPnB1c2hKTklSZWYocmVzKTsKLSAgUkVUVVJOX0ZST01fSk5JKHJldCk7Ci0gIAotICBFTkRfSk5JX0VYQ0VQVElPTgotICBSRVRVUk5fRlJPTV9KTkkoMCk7Ci19Ci0KLQotam9iamVjdCBOZXdPYmplY3RWKEpOSUVudiogZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotICByZXR1cm4gMDsKLX0KLQotam9iamVjdCBOZXdPYmplY3RBKEpOSUVudiogZW52LCBqY2xhc3MgX2NsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgY29uc3QganZhbHVlICphcmdzKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICAvLyBMb2NhbCBvYmplY3QgcmVmZXJlbmNlcwotICBKYXZhT2JqZWN0KiBjbGF6eiA9ICooSmF2YU9iamVjdCoqKV9jbGF6ejsKLSAgSmF2YU9iamVjdCogcmVzID0gMDsKLSAgbGx2bV9nY3Jvb3QoY2xhenosIDApOwotICBsbHZtX2djcm9vdChyZXMsIDApOwotCi0gIEphdmFUaHJlYWQqIHRoID0gSmF2YVRocmVhZDo6Z2V0KCk7Ci0gIEphdmFNZXRob2QqIG1ldGggPSAoSmF2YU1ldGhvZCopbWV0aG9kSUQ7Ci0gIFVzZXJDb21tb25DbGFzcyogY2wgPSBVc2VyQ29tbW9uQ2xhc3M6OnJlc29sdmVkSW1wbENsYXNzKGNsYXp6LCB0cnVlKTsKLSAgCi0gIC8vIFN0b3JlIGxvY2FsIHJlZmVyZW5jZQotICByZXMgPSBjbC0+YXNDbGFzcygpLT5kb05ldygpOwotCi0gIG1ldGgtPmludm9rZUludFNwZWNpYWxCdWYoY2wtPmFzQ2xhc3MoKSwgcmVzLCAodm9pZCopYXJncyk7Ci0KLSAgam9iamVjdCByZXQgPSAoam9iamVjdCl0aC0+cHVzaEpOSVJlZihyZXMpOwotICBSRVRVUk5fRlJPTV9KTkkocmV0KTsKLSAgCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIFJFVFVSTl9GUk9NX0pOSSgwKTsKLX0KLQotCi1qY2xhc3MgR2V0T2JqZWN0Q2xhc3MoSk5JRW52ICplbnYsIGpvYmplY3QgX29iaikgewotICAKLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotCi0gIC8vIExvY2FsIG9iamVjdCByZWZlcmVuY2VzCi0gIEphdmFPYmplY3QqIG9iaiA9ICooSmF2YU9iamVjdCoqKV9vYmo7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0KLSAgLy8gU3RvcmUgbG9jYWwgcmVmZXJlbmNlCi0gIGpjbGFzcyByZXMgPSAoamNsYXNzKUphdmFPYmplY3Q6OmdldENsYXNzKG9iaiktPmdldENsYXNzRGVsZWdhdGVlUHRyKCk7Ci0gIFJFVFVSTl9GUk9NX0pOSShyZXMpOwotICAKLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLWpib29sZWFuIElzSW5zdGFuY2VPZihKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eikgewotICBmcHJpbnRmKHN0ZGVyciwgIkltcGxlbWVudCBtZVxuIik7Ci0gIGFib3J0KCk7Ci0gIHJldHVybiAwOwotfQotCi0KLWpmaWVsZElEIEZyb21SZWZsZWN0ZWRGaWVsZChKTklFbnYqIGVudiwgam9iamVjdCBmaWVsZCkgewotICBmcHJpbnRmKHN0ZGVyciwgIkltcGxlbWVudCBtZVxuIik7Ci0gIGFib3J0KCk7Ci0gIHJldHVybiAwOwotfQotCi0KLWpvYmplY3QgVG9SZWZsZWN0ZWRNZXRob2QoSk5JRW52KiBlbnYsIGpjbGFzcyBjbHMsIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYm9vbGVhbiBpc1N0YXRpYykgewotICBmcHJpbnRmKHN0ZGVyciwgIkltcGxlbWVudCBtZVxuIik7Ci0gIGFib3J0KCk7Ci0gIHJldHVybiAwOwotfQotCi0KLWpvYmplY3QgVG9SZWZsZWN0ZWRGaWVsZChKTklFbnYqIGVudiwgamNsYXNzIGNscywgamZpZWxkSUQgZmllbGRJRCwKLQkJCSBqYm9vbGVhbiBpc1N0YXRpYykgewotICBmcHJpbnRmKHN0ZGVyciwgIkltcGxlbWVudCBtZVxuIik7Ci0gIGFib3J0KCk7Ci0gIHJldHVybiAwOwotfQotCi0KLWptZXRob2RJRCBHZXRNZXRob2RJRChKTklFbnYqIGVudiwgamNsYXNzIF9jbGF6eiwgY29uc3QgY2hhciAqYW5hbWUsCi0JCSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmF0eXBlKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gCi0gIC8vIExvY2FsIG9iamVjdCByZWZlcmVuY2VzLgotICBKYXZhT2JqZWN0KiBjbGF6eiA9ICooSmF2YU9iamVjdCoqKV9jbGF6ejsKLSAgbGx2bV9nY3Jvb3QoY2xhenosIDApOwotCi0gIFVzZXJDb21tb25DbGFzcyogY2wgPSBVc2VyQ29tbW9uQ2xhc3M6OnJlc29sdmVkSW1wbENsYXNzKGNsYXp6LCB0cnVlKTsKLQotICBVc2VyQ2xhc3MqIHJlYWxDbCA9IGNsLT5pc0NsYXNzKCkgPyBjbC0+YXNDbGFzcygpIDogY2wtPnN1cGVyOwotCi0gIGNvbnN0IFVURjgqIG5hbWUgPSBjbC0+Y2xhc3NMb2FkZXItPmhhc2hVVEY4LT5sb29rdXBBc2NpaXooYW5hbWUpOwotICBpZiAobmFtZSkgewotICAgIGNvbnN0IFVURjgqIHR5cGUgPSBjbC0+Y2xhc3NMb2FkZXItPmhhc2hVVEY4LT5sb29rdXBBc2NpaXooYXR5cGUpOwotICAgIGlmICh0eXBlKSB7Ci0gICAgICBKYXZhTWV0aG9kKiBtZXRoID0gcmVhbENsLT5sb29rdXBNZXRob2QobmFtZSwgdHlwZSwgZmFsc2UsIHRydWUsIDApOwotICAgICAgUkVUVVJOX0ZST01fSk5JKChqbWV0aG9kSUQpbWV0aCk7Ci0gICAgfQotICB9Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLWpvYmplY3QgQ2FsbE9iamVjdE1ldGhvZChKTklFbnYgKmVudiwgam9iamVjdCBfb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLQotICB2ZXJpZnlOdWxsKF9vYmopOwotCi0gIHZhX2xpc3QgYXA7Ci0gIHZhX3N0YXJ0KGFwLCBtZXRob2RJRCk7Ci0gIAotICAvLyBMb2NhbCBvYmplY3QgcmVmZXJlbmNlcy4KLSAgSmF2YU9iamVjdCogb2JqID0gKihKYXZhT2JqZWN0KiopX29iajsKLSAgSmF2YU9iamVjdCogcmVzID0gMDsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgbGx2bV9nY3Jvb3QocmVzLCAwKTsKLSAgCi0gIEphdmFNZXRob2QqIG1ldGggPSAoSmF2YU1ldGhvZCopbWV0aG9kSUQ7Ci0gIEphdmFUaHJlYWQqIHRoID0gSmF2YVRocmVhZDo6Z2V0KCk7Ci0gIFVzZXJDbGFzcyogY2wgPSBnZXRDbGFzc0Zyb21WaXJ0dWFsTWV0aG9kKG1ldGgsIEphdmFPYmplY3Q6OmdldENsYXNzKG9iaikpOwotICAKLSAgcmVzID0gbWV0aC0+aW52b2tlSmF2YU9iamVjdFZpcnR1YWxBUChjbCwgb2JqLCBhcCk7Ci0gIHZhX2VuZChhcCk7Ci0KLSAgam9iamVjdCByZXQgPSAoam9iamVjdCl0aC0+cHVzaEpOSVJlZihyZXMpOwotICBSRVRVUk5fRlJPTV9KTkkocmV0KTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICBSRVRVUk5fRlJPTV9KTkkoMCk7Ci19Ci0KLQotam9iamVjdCBDYWxsT2JqZWN0TWV0aG9kVihKTklFbnYgKmVudiwgam9iamVjdCBfb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncykgewotICAKLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgdmVyaWZ5TnVsbChfb2JqKTsKLSAKLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEphdmFPYmplY3QqIG9iaiA9ICooSmF2YU9iamVjdCoqKV9vYmo7Ci0gIEphdmFPYmplY3QqIHJlcyA9IDA7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gIGxsdm1fZ2Nyb290KHJlcywgMCk7Ci0gIAotICBKYXZhTWV0aG9kKiBtZXRoID0gKEphdmFNZXRob2QqKW1ldGhvZElEOwotICBKYXZhVGhyZWFkKiB0aCA9IEphdmFUaHJlYWQ6OmdldCgpOwotICBVc2VyQ2xhc3MqIGNsID0gZ2V0Q2xhc3NGcm9tVmlydHVhbE1ldGhvZChtZXRoLCBKYXZhT2JqZWN0OjpnZXRDbGFzcyhvYmopKTsKLSAgCi0gIC8vIFN0b3JlIGxvY2FsIHJlZmVyZW5jZS4KLSAgcmVzID0gbWV0aC0+aW52b2tlSmF2YU9iamVjdFZpcnR1YWxBUChjbCwgb2JqLCBhcmdzKTsKLSAgCi0gIGpvYmplY3QgcmV0ID0gKGpvYmplY3QpdGgtPnB1c2hKTklSZWYocmVzKTsKLSAgUkVUVVJOX0ZST01fSk5JKHJldCk7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgCi0gIFJFVFVSTl9GUk9NX0pOSSgwKTsKLX0KLQotCi1qb2JqZWN0IENhbGxPYmplY3RNZXRob2RBKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqdmFsdWUgKiBhcmdzKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotamJvb2xlYW4gQ2FsbEJvb2xlYW5NZXRob2QoSk5JRW52ICplbnYsIGpvYmplY3QgX29iaiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLQotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICB2ZXJpZnlOdWxsKF9vYmopOwotICAKLSAgdmFfbGlzdCBhcDsKLSAgdmFfc3RhcnQoYXAsIG1ldGhvZElEKTsKLSAgCi0gIC8vIExvY2FsIG9iamVjdCByZWZlcmVuY2VzLiAgCi0gIEphdmFPYmplY3QqIHNlbGYgPSAqKEphdmFPYmplY3QqKilfb2JqOwotICBsbHZtX2djcm9vdChzZWxmLCAwKTsKLQotICBKYXZhTWV0aG9kKiBtZXRoID0gKEphdmFNZXRob2QqKW1ldGhvZElEOwotICBVc2VyQ2xhc3MqIGNsID0KLSAgICAgIGdldENsYXNzRnJvbVZpcnR1YWxNZXRob2QobWV0aCwgSmF2YU9iamVjdDo6Z2V0Q2xhc3Moc2VsZikpOwotICAKLSAgdWludDMyIHJlcyA9IG1ldGgtPmludm9rZUludFZpcnR1YWxBUChjbCwgc2VsZiwgYXApOwotICB2YV9lbmQoYXApOwotCi0gIFJFVFVSTl9GUk9NX0pOSShyZXMpOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIFJFVFVSTl9GUk9NX0pOSSgwKTsKLX0KLQotCi1qYm9vbGVhbiBDYWxsQm9vbGVhbk1ldGhvZFYoSk5JRW52ICplbnYsIGpvYmplY3QgX29iaiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncykgewotICAKLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgdmVyaWZ5TnVsbChfb2JqKTsKLSAgCi0gIC8vIExvY2FsIG9iamVjdCByZWZlcmVuY2VzLgotICBKYXZhT2JqZWN0KiBvYmogPSAqKEphdmFPYmplY3QqKilfb2JqOwotICBsbHZtX2djcm9vdChvYmosIDApOwotICAKLSAgSmF2YU1ldGhvZCogbWV0aCA9IChKYXZhTWV0aG9kKiltZXRob2RJRDsKLSAgVXNlckNsYXNzKiBjbCA9IGdldENsYXNzRnJvbVZpcnR1YWxNZXRob2QobWV0aCwgSmF2YU9iamVjdDo6Z2V0Q2xhc3Mob2JqKSk7Ci0gIGpib29sZWFuIHJlcyA9IChqYm9vbGVhbiltZXRoLT5pbnZva2VJbnRWaXJ0dWFsQVAoY2wsIG9iaiwgYXJncyk7Ci0gIFJFVFVSTl9GUk9NX0pOSShyZXMpOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIAotICBSRVRVUk5fRlJPTV9KTkkoMCk7Ci19Ci0KLQotamJvb2xlYW4gQ2FsbEJvb2xlYW5NZXRob2RBKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotICByZXR1cm4gMDsKLX0KLQotCi1qYnl0ZSBDYWxsQnl0ZU1ldGhvZChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWpieXRlIENhbGxCeXRlTWV0aG9kVihKTklFbnYgKmVudiwgam9iamVjdCBfb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gCi0gIHZlcmlmeU51bGwoX29iaik7Ci0gIAotICAvLyBMb2NhbCBvYmplY3QgcmVmZXJlbmNlcy4KLSAgSmF2YU9iamVjdCogb2JqID0gKihKYXZhT2JqZWN0KiopX29iajsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLQotICBKYXZhTWV0aG9kKiBtZXRoID0gKEphdmFNZXRob2QqKW1ldGhvZElEOwotICBVc2VyQ2xhc3MqIGNsID0gZ2V0Q2xhc3NGcm9tVmlydHVhbE1ldGhvZChtZXRoLCBKYXZhT2JqZWN0OjpnZXRDbGFzcyhvYmopKTsKLSAgamJ5dGUgcmVzID0gKGpieXRlKW1ldGgtPmludm9rZUludFZpcnR1YWxBUChjbCwgb2JqLCBhcmdzKTsKLSAgUkVUVVJOX0ZST01fSk5JKHJlcyk7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgCi0gIFJFVFVSTl9GUk9NX0pOSSgwKTsKLX0KLQotCi1qYnl0ZSBDYWxsQnl0ZU1ldGhvZEEoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QganZhbHVlICphcmdzKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotamNoYXIgQ2FsbENoYXJNZXRob2QoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICBmcHJpbnRmKHN0ZGVyciwgIkltcGxlbWVudCBtZVxuIik7Ci0gIGFib3J0KCk7Ci0gIHJldHVybiAwOwotfQotCi0KLWpjaGFyIENhbGxDaGFyTWV0aG9kVihKTklFbnYgKmVudiwgam9iamVjdCBfb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICB2ZXJpZnlOdWxsKF9vYmopOwotICAKLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEphdmFPYmplY3QqIG9iaiA9ICooSmF2YU9iamVjdCoqKV9vYmo7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gCi0gIEphdmFNZXRob2QqIG1ldGggPSAoSmF2YU1ldGhvZCopbWV0aG9kSUQ7Ci0gIFVzZXJDbGFzcyogY2wgPSBnZXRDbGFzc0Zyb21WaXJ0dWFsTWV0aG9kKG1ldGgsIEphdmFPYmplY3Q6OmdldENsYXNzKG9iaikpOwotICBqY2hhciByZXMgPSAoamNoYXIpbWV0aC0+aW52b2tlSW50VmlydHVhbEFQKGNsLCBvYmosIGFyZ3MpOwotICBSRVRVUk5fRlJPTV9KTkkocmVzKTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICAKLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLWpjaGFyIENhbGxDaGFyTWV0aG9kQShKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqdmFsdWUgKmFyZ3MpIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotICByZXR1cm4gMDsKLX0KLQotCi1qc2hvcnQgQ2FsbFNob3J0TWV0aG9kKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotICByZXR1cm4gMDsKLX0KLQotCi1qc2hvcnQgQ2FsbFNob3J0TWV0aG9kVihKTklFbnYgKmVudiwgam9iamVjdCBfb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsKLSAgCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgCi0gIHZlcmlmeU51bGwoX29iaik7Ci0gIAotICAvLyBMb2NhbCBvYmplY3QgcmVmZXJlbmNlcy4KLSAgSmF2YU9iamVjdCogb2JqID0gKihKYXZhT2JqZWN0KiopX29iajsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgCi0gIEphdmFNZXRob2QqIG1ldGggPSAoSmF2YU1ldGhvZCopbWV0aG9kSUQ7Ci0gIFVzZXJDbGFzcyogY2wgPSBnZXRDbGFzc0Zyb21WaXJ0dWFsTWV0aG9kKG1ldGgsIEphdmFPYmplY3Q6OmdldENsYXNzKG9iaikpOwotICBqc2hvcnQgcmVzID0gKGpzaG9ydCltZXRoLT5pbnZva2VJbnRWaXJ0dWFsQVAoY2wsIG9iaiwgYXJncyk7Ci0gIFJFVFVSTl9GUk9NX0pOSShyZXMpOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIAotICBSRVRVUk5fRlJPTV9KTkkoMCk7Ci19Ci0KLQotanNob3J0IENhbGxTaG9ydE1ldGhvZEEoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqdmFsdWUgKmFyZ3MpIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotICByZXR1cm4gMDsKLX0KLQotCi0KLWppbnQgQ2FsbEludE1ldGhvZChKTklFbnYgKmVudiwgam9iamVjdCBfb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgCi0gIHZlcmlmeU51bGwoX29iaik7Ci0gIAotICB2YV9saXN0IGFwOwotICB2YV9zdGFydChhcCwgbWV0aG9kSUQpOwotICAKLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEphdmFPYmplY3QqIG9iaiA9ICooSmF2YU9iamVjdCoqKV9vYmo7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0KLSAgSmF2YU1ldGhvZCogbWV0aCA9IChKYXZhTWV0aG9kKiltZXRob2RJRDsKLSAgVXNlckNsYXNzKiBjbCA9IGdldENsYXNzRnJvbVZpcnR1YWxNZXRob2QobWV0aCwgSmF2YU9iamVjdDo6Z2V0Q2xhc3Mob2JqKSk7Ci0gIAotICB1aW50MzIgcmVzID0gbWV0aC0+aW52b2tlSW50VmlydHVhbEFQKGNsLCBvYmosIGFwKTsKLSAgdmFfZW5kKGFwKTsKLSAgCi0gIFJFVFVSTl9GUk9NX0pOSShyZXMpOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIFJFVFVSTl9GUk9NX0pOSSgwKTsKLX0KLQotCi1qaW50IENhbGxJbnRNZXRob2RWKEpOSUVudiAqZW52LCBqb2JqZWN0IF9vYmosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICB2ZXJpZnlOdWxsKF9vYmopOwotICAKLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEphdmFPYmplY3QqIG9iaiA9ICooSmF2YU9iamVjdCoqKV9vYmo7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gIAotICBKYXZhTWV0aG9kKiBtZXRoID0gKEphdmFNZXRob2QqKW1ldGhvZElEOwotICBVc2VyQ2xhc3MqIGNsID0gZ2V0Q2xhc3NGcm9tVmlydHVhbE1ldGhvZChtZXRoLCBKYXZhT2JqZWN0OjpnZXRDbGFzcyhvYmopKTsKLSAgCi0gIGppbnQgcmVzID0gKGppbnQpbWV0aC0+aW52b2tlSW50VmlydHVhbEFQKGNsLCBvYmosIGFyZ3MpOwotICBSRVRVUk5fRlJPTV9KTkkocmVzKTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICAKLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLWppbnQgQ2FsbEludE1ldGhvZEEoSk5JRW52ICplbnYsIGpvYmplY3QgX29iaiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICBjb25zdCBqdmFsdWUgKmFyZ3MpIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotICByZXR1cm4gMDsKLX0KLQotCi0KLWpsb25nIENhbGxMb25nTWV0aG9kKEpOSUVudiAqZW52LCBqb2JqZWN0IF9vYmosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotamxvbmcgQ2FsbExvbmdNZXRob2RWKEpOSUVudiAqZW52LCBqb2JqZWN0IF9vYmosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsKLSAgCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgCi0gIHZlcmlmeU51bGwoX29iaik7Ci0gIAotICAvLyBMb2NhbCBvYmplY3QgcmVmZXJlbmNlcy4KLSAgSmF2YU9iamVjdCogb2JqID0gKihKYXZhT2JqZWN0KiopX29iajsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgCi0gIEphdmFNZXRob2QqIG1ldGggPSAoSmF2YU1ldGhvZCopbWV0aG9kSUQ7Ci0gIFVzZXJDbGFzcyogY2wgPSBnZXRDbGFzc0Zyb21WaXJ0dWFsTWV0aG9kKG1ldGgsIEphdmFPYmplY3Q6OmdldENsYXNzKG9iaikpOwotICBqbG9uZyByZXMgPSAoamxvbmcpbWV0aC0+aW52b2tlTG9uZ1ZpcnR1YWxBUChjbCwgb2JqLCBhcmdzKTsKLSAgUkVUVVJOX0ZST01fSk5JKHJlcyk7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgCi0gIFJFVFVSTl9GUk9NX0pOSSgwKTsKLX0KLQotCi1qbG9uZyBDYWxsTG9uZ01ldGhvZEEoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QganZhbHVlICphcmdzKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotCi1qZmxvYXQgQ2FsbEZsb2F0TWV0aG9kKEpOSUVudiAqZW52LCBqb2JqZWN0IF9vYmosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICB2ZXJpZnlOdWxsKF9vYmopOwotICAKLSAgdmFfbGlzdCBhcDsKLSAgdmFfc3RhcnQoYXAsIG1ldGhvZElEKTsKLSAgCi0gIC8vIExvY2FsIG9iamVjdCByZWZlcmVuY2VzLgotICBKYXZhT2JqZWN0KiBvYmogPSAqKEphdmFPYmplY3QqKilfb2JqOwotICBsbHZtX2djcm9vdChvYmosIDApOwotCi0gIEphdmFNZXRob2QqIG1ldGggPSAoSmF2YU1ldGhvZCopbWV0aG9kSUQ7Ci0gIFVzZXJDbGFzcyogY2wgPSBnZXRDbGFzc0Zyb21WaXJ0dWFsTWV0aG9kKG1ldGgsIEphdmFPYmplY3Q6OmdldENsYXNzKG9iaikpOwotICBqZmxvYXQgcmVzID0gbWV0aC0+aW52b2tlRmxvYXRWaXJ0dWFsQVAoY2wsIG9iaiwgYXApOwotICB2YV9lbmQoYXApOwotICBSRVRVUk5fRlJPTV9KTkkocmVzKTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTjsKLSAgUkVUVVJOX0ZST01fSk5JKDAuMCk7Ci19Ci0KLQotamZsb2F0IENhbGxGbG9hdE1ldGhvZFYoSk5JRW52ICplbnYsIGpvYmplY3QgX29iaiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gCi0gIHZlcmlmeU51bGwoX29iaik7Ci0gIAotICAvLyBMb2NhbCBvYmplY3QgcmVmZXJlbmNlcy4KLSAgSmF2YU9iamVjdCogb2JqID0gKihKYXZhT2JqZWN0KiopX29iajsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgCi0gIEphdmFNZXRob2QqIG1ldGggPSAoSmF2YU1ldGhvZCopbWV0aG9kSUQ7Ci0gIFVzZXJDbGFzcyogY2wgPSBnZXRDbGFzc0Zyb21WaXJ0dWFsTWV0aG9kKG1ldGgsIEphdmFPYmplY3Q6OmdldENsYXNzKG9iaikpOwotICBqZmxvYXQgcmVzID0gKGpmbG9hdCltZXRoLT5pbnZva2VGbG9hdFZpcnR1YWxBUChjbCwgb2JqLCBhcmdzKTsKLSAgUkVUVVJOX0ZST01fSk5JKHJlcyk7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgCi0gIFJFVFVSTl9GUk9NX0pOSSgwLjBmKTsKLX0KLQotCi1qZmxvYXQgQ2FsbEZsb2F0TWV0aG9kQShKTklFbnYgKmVudiwgam9iamVjdCBfb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqdmFsdWUgKmFyZ3MpIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotICByZXR1cm4gMDsKLX0KLQotCi0KLWpkb3VibGUgQ2FsbERvdWJsZU1ldGhvZChKTklFbnYgKmVudiwgam9iamVjdCBfb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAKLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgdmVyaWZ5TnVsbChfb2JqKTsKLSAgCi0gIHZhX2xpc3QgYXA7Ci0gIHZhX3N0YXJ0KGFwLCBtZXRob2RJRCk7Ci0gIAotICAvLyBMb2NhbCBvYmplY3QgcmVmZXJlbmNlcy4KLSAgSmF2YU9iamVjdCogb2JqID0gKihKYXZhT2JqZWN0KiopX29iajsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLQotICBKYXZhTWV0aG9kKiBtZXRoID0gKEphdmFNZXRob2QqKW1ldGhvZElEOwotICBVc2VyQ2xhc3MqIGNsID0gZ2V0Q2xhc3NGcm9tVmlydHVhbE1ldGhvZChtZXRoLCBKYXZhT2JqZWN0OjpnZXRDbGFzcyhvYmopKTsKLSAgamRvdWJsZSByZXMgPSBtZXRoLT5pbnZva2VEb3VibGVWaXJ0dWFsQVAoY2wsIG9iaiwgYXApOwotICB2YV9lbmQoYXApOwotICBSRVRVUk5fRlJPTV9KTkkocmVzKTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICBSRVRVUk5fRlJPTV9KTkkoMC4wKTsKLX0KLQotCi1qZG91YmxlIENhbGxEb3VibGVNZXRob2RWKEpOSUVudiAqZW52LCBqb2JqZWN0IF9vYmosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICB2ZXJpZnlOdWxsKF9vYmopOwotICAKLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEphdmFPYmplY3QqIG9iaiA9ICooSmF2YU9iamVjdCoqKV9vYmo7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gIAotICBKYXZhTWV0aG9kKiBtZXRoID0gKEphdmFNZXRob2QqKW1ldGhvZElEOwotICBVc2VyQ2xhc3MqIGNsID0gZ2V0Q2xhc3NGcm9tVmlydHVhbE1ldGhvZChtZXRoLCBKYXZhT2JqZWN0OjpnZXRDbGFzcyhvYmopKTsKLSAgamRvdWJsZSByZXMgPSAoamRvdWJsZSltZXRoLT5pbnZva2VEb3VibGVWaXJ0dWFsQVAoY2wsIG9iaiwgYXJncyk7Ci0gIFJFVFVSTl9GUk9NX0pOSShyZXMpOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIFJFVFVSTl9GUk9NX0pOSSgwLjApOwotCi19Ci0KLQotamRvdWJsZSBDYWxsRG91YmxlTWV0aG9kQShKTklFbnYgKmVudiwgam9iamVjdCBfb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGp2YWx1ZSAqYXJncykgewotICBmcHJpbnRmKHN0ZGVyciwgIkltcGxlbWVudCBtZVxuIik7Ci0gIGFib3J0KCk7Ci0gIHJldHVybiAwOwotfQotCi0KLQotdm9pZCBDYWxsVm9pZE1ldGhvZChKTklFbnYgKmVudiwgam9iamVjdCBfb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAKLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotCi0gIHZlcmlmeU51bGwoX29iaik7Ci0KLSAgdmFfbGlzdCBhcDsKLSAgdmFfc3RhcnQoYXAsIG1ldGhvZElEKTsKLQotICAvLyBMb2NhbCBvYmplY3QgcmVmZXJlbmNlcy4KLSAgSmF2YU9iamVjdCogb2JqID0gKihKYXZhT2JqZWN0KiopX29iajsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLQotICBKYXZhTWV0aG9kKiBtZXRoID0gKEphdmFNZXRob2QqKW1ldGhvZElEOwotICBVc2VyQ2xhc3MqIGNsID0gZ2V0Q2xhc3NGcm9tVmlydHVhbE1ldGhvZChtZXRoLCBKYXZhT2JqZWN0OjpnZXRDbGFzcyhvYmopKTsKLSAgbWV0aC0+aW52b2tlSW50VmlydHVhbEFQKGNsLCBvYmosIGFwKTsKLSAgdmFfZW5kKGFwKTsKLQotICBSRVRVUk5fVk9JRF9GUk9NX0pOSTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICAKLSAgUkVUVVJOX1ZPSURfRlJPTV9KTkk7Ci19Ci0KLQotdm9pZCBDYWxsVm9pZE1ldGhvZFYoSk5JRW52ICplbnYsIGpvYmplY3QgX29iaiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICB2ZXJpZnlOdWxsKF9vYmopOwotICAKLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEphdmFPYmplY3QqIG9iaiA9ICooSmF2YU9iamVjdCoqKV9vYmo7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0KLSAgSmF2YU1ldGhvZCogbWV0aCA9IChKYXZhTWV0aG9kKiltZXRob2RJRDsKLSAgVXNlckNsYXNzKiBjbCA9IGdldENsYXNzRnJvbVZpcnR1YWxNZXRob2QobWV0aCwgSmF2YU9iamVjdDo6Z2V0Q2xhc3Mob2JqKSk7Ci0gIG1ldGgtPmludm9rZUludFZpcnR1YWxBUChjbCwgb2JqLCBhcmdzKTsKLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIAotICBSRVRVUk5fVk9JRF9GUk9NX0pOSTsKLX0KLQotCi12b2lkIENhbGxWb2lkTWV0aG9kQShKTklFbnYgKmVudiwgam9iamVjdCBfb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBqdmFsdWUgKmFyZ3MpIHsKLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotCi0gIHZlcmlmeU51bGwoX29iaik7Ci0KLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEphdmFPYmplY3QqIG9iaiA9ICooSmF2YU9iamVjdCoqKV9vYmo7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0KLSAgSmF2YU1ldGhvZCogbWV0aCA9IChKYXZhTWV0aG9kKiltZXRob2RJRDsKLSAgVXNlckNsYXNzKiBjbCA9IGdldENsYXNzRnJvbVZpcnR1YWxNZXRob2QobWV0aCwgSmF2YU9iamVjdDo6Z2V0Q2xhc3Mob2JqKSk7Ci0gIAotICBtZXRoLT5pbnZva2VJbnRWaXJ0dWFsQnVmKGNsLCBvYmosICh2b2lkKilhcmdzKTsKLQotICBSRVRVUk5fVk9JRF9GUk9NX0pOSTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICAKLSAgUkVUVVJOX1ZPSURfRlJPTV9KTkk7Ci19Ci0KLQotCi1qb2JqZWN0IENhbGxOb252aXJ0dWFsT2JqZWN0TWV0aG9kKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICBmcHJpbnRmKHN0ZGVyciwgIkltcGxlbWVudCBtZVxuIik7Ci0gIGFib3J0KCk7Ci0gIHJldHVybiAwOwotfQotCi0KLWpvYmplY3QgQ2FsbE5vbnZpcnR1YWxPYmplY3RNZXRob2RWKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotICByZXR1cm4gMDsKLX0KLQotCi1qb2JqZWN0IENhbGxOb252aXJ0dWFsT2JqZWN0TWV0aG9kQShKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotCi1qYm9vbGVhbiBDYWxsTm9udmlydHVhbEJvb2xlYW5NZXRob2QoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotICByZXR1cm4gMDsKLX0KLQotCi1qYm9vbGVhbiBDYWxsTm9udmlydHVhbEJvb2xlYW5NZXRob2RWKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncykgewotICBmcHJpbnRmKHN0ZGVyciwgIkltcGxlbWVudCBtZVxuIik7Ci0gIGFib3J0KCk7Ci0gIHJldHVybiAwOwotfQotCi0KLWpib29sZWFuIENhbGxOb252aXJ0dWFsQm9vbGVhbk1ldGhvZEEoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotamJ5dGUgQ2FsbE5vbnZpcnR1YWxCeXRlTWV0aG9kKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotamJ5dGUgQ2FsbE5vbnZpcnR1YWxCeXRlTWV0aG9kViAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncykgewotICBmcHJpbnRmKHN0ZGVyciwgIkltcGxlbWVudCBtZVxuIik7Ci0gIGFib3J0KCk7Ci0gIHJldHVybiAwOwotfQotCi0KLWpieXRlIENhbGxOb252aXJ0dWFsQnl0ZU1ldGhvZEEoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotCi1qY2hhciBDYWxsTm9udmlydHVhbENoYXJNZXRob2QoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotICByZXR1cm4gMDsKLX0KLQotCi1qY2hhciBDYWxsTm9udmlydHVhbENoYXJNZXRob2RWKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncykgewotICBmcHJpbnRmKHN0ZGVyciwgIkltcGxlbWVudCBtZVxuIik7Ci0gIGFib3J0KCk7Ci0gIHJldHVybiAwOwotfQotCi0KLWpjaGFyIENhbGxOb252aXJ0dWFsQ2hhck1ldGhvZEEoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotCi1qc2hvcnQgQ2FsbE5vbnZpcnR1YWxTaG9ydE1ldGhvZChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotanNob3J0IENhbGxOb252aXJ0dWFsU2hvcnRNZXRob2RWKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotanNob3J0IENhbGxOb252aXJ0dWFsU2hvcnRNZXRob2RBKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotCi1qaW50IENhbGxOb252aXJ0dWFsSW50TWV0aG9kKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICBmcHJpbnRmKHN0ZGVyciwgIkltcGxlbWVudCBtZVxuIik7Ci0gIGFib3J0KCk7Ci0gIHJldHVybiAwOwotfQotCi0KLWppbnQgQ2FsbE5vbnZpcnR1YWxJbnRNZXRob2RWKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotICByZXR1cm4gMDsKLX0KLQotCi1qaW50IENhbGxOb252aXJ0dWFsSW50TWV0aG9kQShKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotCi1qbG9uZyBDYWxsTm9udmlydHVhbExvbmdNZXRob2QoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotICByZXR1cm4gMDsKLX0KLQotCi1qbG9uZyBDYWxsTm9udmlydHVhbExvbmdNZXRob2RWKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncykgewotICBmcHJpbnRmKHN0ZGVyciwgIkltcGxlbWVudCBtZVxuIik7Ci0gIGFib3J0KCk7Ci0gIHJldHVybiAwOwotfQotCi0KLWpsb25nIENhbGxOb252aXJ0dWFsTG9uZ01ldGhvZEEoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotCi1qZmxvYXQgQ2FsbE5vbnZpcnR1YWxGbG9hdE1ldGhvZChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotamZsb2F0IENhbGxOb252aXJ0dWFsRmxvYXRNZXRob2RWKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotamZsb2F0IENhbGxOb252aXJ0dWFsRmxvYXRNZXRob2RBKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotCi1qZG91YmxlIENhbGxOb252aXJ0dWFsRG91YmxlTWV0aG9kKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICBmcHJpbnRmKHN0ZGVyciwgIkltcGxlbWVudCBtZVxuIik7Ci0gIGFib3J0KCk7Ci0gIHJldHVybiAwOwotfQotCi0KLWpkb3VibGUgQ2FsbE5vbnZpcnR1YWxEb3VibGVNZXRob2RWKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotICByZXR1cm4gMDsKLX0KLQotCi1qZG91YmxlIENhbGxOb252aXJ0dWFsRG91YmxlTWV0aG9kQShKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotCi12b2lkIENhbGxOb252aXJ0dWFsVm9pZE1ldGhvZChKTklFbnYgKmVudiwgam9iamVjdCBfb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAKLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgdmVyaWZ5TnVsbChfb2JqKTsKLSAgCi0gIHZhX2xpc3QgYXA7Ci0gIHZhX3N0YXJ0KGFwLCBtZXRob2RJRCk7Ci0gIAotICAvLyBMb2NhbCBvYmplY3QgcmVmZXJlbmNlcy4KLSAgSmF2YU9iamVjdCogb2JqID0gKihKYXZhT2JqZWN0KiopX29iajsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLQotICBKYXZhTWV0aG9kKiBtZXRoID0gKEphdmFNZXRob2QqKW1ldGhvZElEOwotICBVc2VyQ2xhc3MqIGNsID0gZ2V0Q2xhc3NGcm9tVmlydHVhbE1ldGhvZChtZXRoLCBKYXZhT2JqZWN0OjpnZXRDbGFzcyhvYmopKTsKLSAgbWV0aC0+aW52b2tlSW50U3BlY2lhbEFQKGNsLCBvYmosIGFwKTsKLSAgdmFfZW5kKGFwKTsKLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIAotICBSRVRVUk5fVk9JRF9GUk9NX0pOSTsKLX0KLQotCi12b2lkIENhbGxOb252aXJ0dWFsVm9pZE1ldGhvZFYoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotfQotCi0KLXZvaWQgQ2FsbE5vbnZpcnR1YWxWb2lkTWV0aG9kQShKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotfQotCi0KLWpmaWVsZElEIEdldEZpZWxkSUQoSk5JRW52ICplbnYsIGpjbGFzcyBfY2xhenosIGNvbnN0IGNoYXIgKmFuYW1lLAotCQkgICAgY29uc3QgY2hhciAqc2lnKSAgewotCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLQotICAvLyBMb2NhbCBvYmplY3QgcmVmZXJlbmNlcy4KLSAgSmF2YU9iamVjdCogY2xhenogPSAqKEphdmFPYmplY3QqKilfY2xheno7Ci0gIGxsdm1fZ2Nyb290KGNsYXp6LCAwKTsKLQotICBVc2VyQ29tbW9uQ2xhc3MqIGNsID0gVXNlckNvbW1vbkNsYXNzOjpyZXNvbHZlZEltcGxDbGFzcyhjbGF6eiwgdHJ1ZSk7Ci0KLSAgaWYgKGNsLT5pc0NsYXNzKCkpIHsKLSAgICBjb25zdCBVVEY4KiBuYW1lID0gY2wtPmNsYXNzTG9hZGVyLT5oYXNoVVRGOC0+bG9va3VwQXNjaWl6KGFuYW1lKTsKLSAgICBpZiAobmFtZSkgewotICAgICAgY29uc3QgVVRGOCogdHlwZSA9IGNsLT5jbGFzc0xvYWRlci0+aGFzaFVURjgtPmxvb2t1cEFzY2lpeihzaWcpOwotICAgICAgaWYgKHR5cGUpIHsKLSAgICAgICAgSmF2YUZpZWxkKiBmaWVsZCA9IGNsLT5hc0NsYXNzKCktPmxvb2t1cEZpZWxkKG5hbWUsIHR5cGUsIGZhbHNlLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgIFJFVFVSTl9GUk9NX0pOSSgoamZpZWxkSUQpZmllbGQpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgUkVUVVJOX0ZST01fSk5JKDApOwotCi19Ci0KLQotam9iamVjdCBHZXRPYmplY3RGaWVsZChKTklFbnYgKmVudiwgam9iamVjdCBfb2JqLCBqZmllbGRJRCBmaWVsZElEKSB7Ci0KLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEphdmFPYmplY3QqIG9iaiA9ICooSmF2YU9iamVjdCoqKV9vYmo7Ci0gIEphdmFPYmplY3QqIHJlcyA9IDA7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gIGxsdm1fZ2Nyb290KHJlcywgMCk7Ci0KLSAgSmF2YUZpZWxkKiBmaWVsZCA9IChKYXZhRmllbGQqKWZpZWxkSUQ7Ci0KLSAgLy8gU3RvcmUgbG9jYWwgcmVmZXJlbmNlLgotICByZXMgPSBmaWVsZC0+Z2V0SW5zdGFuY2VPYmplY3RGaWVsZChvYmopOwotCi0gIEphdmFUaHJlYWQqIHRoID0gSmF2YVRocmVhZDo6Z2V0KCk7Ci0gIGpvYmplY3QgcmV0ID0gKGpvYmplY3QpdGgtPnB1c2hKTklSZWYocmVzKTsKLSAgUkVUVVJOX0ZST01fSk5JKHJldCk7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLWpib29sZWFuIEdldEJvb2xlYW5GaWVsZChKTklFbnYgKmVudiwgam9iamVjdCBfb2JqLCBqZmllbGRJRCBmaWVsZElEKSB7Ci0KLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEphdmFPYmplY3QqIG9iaiA9ICooSmF2YU9iamVjdCoqKV9vYmo7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0KLSAgSmF2YUZpZWxkKiBmaWVsZCA9IChKYXZhRmllbGQqKWZpZWxkSUQ7Ci0gIHVpbnQ4IHJlcyA9ICh1aW50OClmaWVsZC0+Z2V0SW5zdGFuY2VJbnQ4RmllbGQob2JqKTsKLSAgUkVUVVJOX0ZST01fSk5JKHJlcyk7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLWpieXRlIEdldEJ5dGVGaWVsZChKTklFbnYgKmVudiwgam9iamVjdCBfb2JqLCBqZmllbGRJRCBmaWVsZElEKSB7Ci0KLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEphdmFPYmplY3QqIG9iaiA9ICooSmF2YU9iamVjdCoqKV9vYmo7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0KLSAgSmF2YUZpZWxkKiBmaWVsZCA9IChKYXZhRmllbGQqKWZpZWxkSUQ7Ci0gIHNpbnQ4IHJlcyA9IChzaW50OClmaWVsZC0+Z2V0SW5zdGFuY2VJbnQ4RmllbGQob2JqKTsKLSAgUkVUVVJOX0ZST01fSk5JKHJlcyk7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLWpjaGFyIEdldENoYXJGaWVsZChKTklFbnYgKmVudiwgam9iamVjdCBfb2JqLCBqZmllbGRJRCBmaWVsZElEKSB7Ci0KLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotCi0gIC8vIExvY2FsIG9iamVjdCByZWZlcmVuY2VzLgotICBKYXZhT2JqZWN0KiBvYmogPSAqKEphdmFPYmplY3QqKilfb2JqOwotICBsbHZtX2djcm9vdChvYmosIDApOwotICAKLSAgSmF2YUZpZWxkKiBmaWVsZCA9IChKYXZhRmllbGQqKWZpZWxkSUQ7Ci0gIHVpbnQxNiByZXMgPSAodWludDE2KWZpZWxkLT5nZXRJbnN0YW5jZUludDE2RmllbGQob2JqKTsKLSAgUkVUVVJOX0ZST01fSk5JKHJlcyk7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLWpzaG9ydCBHZXRTaG9ydEZpZWxkKEpOSUVudiAqZW52LCBqb2JqZWN0IF9vYmosIGpmaWVsZElEIGZpZWxkSUQpIHsKLQotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICAvLyBMb2NhbCBvYmplY3QgcmVmZXJlbmNlcy4KLSAgSmF2YU9iamVjdCogb2JqID0gKihKYXZhT2JqZWN0KiopX29iajsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLQotICBKYXZhRmllbGQqIGZpZWxkID0gKEphdmFGaWVsZCopZmllbGRJRDsKLSAgc2ludDE2IHJlcyA9IChzaW50MTYpZmllbGQtPmdldEluc3RhbmNlSW50MTZGaWVsZChvYmopOwotICBSRVRVUk5fRlJPTV9KTkkocmVzKTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICBSRVRVUk5fRlJPTV9KTkkoMCk7Ci19Ci0KLQotamludCBHZXRJbnRGaWVsZChKTklFbnYgKmVudiwgam9iamVjdCBfb2JqLCBqZmllbGRJRCBmaWVsZElEKSB7Ci0KLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEphdmFPYmplY3QqIG9iaiA9ICooSmF2YU9iamVjdCoqKV9vYmo7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0KLSAgSmF2YUZpZWxkKiBmaWVsZCA9IChKYXZhRmllbGQqKWZpZWxkSUQ7Ci0gIHNpbnQzMiByZXMgPSAoc2ludDMyKWZpZWxkLT5nZXRJbnN0YW5jZUludDMyRmllbGQob2JqKTsKLSAgUkVUVVJOX0ZST01fSk5JKHJlcyk7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLWpsb25nIEdldExvbmdGaWVsZChKTklFbnYgKmVudiwgam9iamVjdCBfb2JqLCBqZmllbGRJRCBmaWVsZElEKSB7Ci0KLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotCi0gIC8vIExvY2FsIG9iamVjdCByZWZlcmVuY2VzLgotICBKYXZhT2JqZWN0KiBvYmogPSAqKEphdmFPYmplY3QqKilfb2JqOwotICBsbHZtX2djcm9vdChvYmosIDApOwotICAKLSAgSmF2YUZpZWxkKiBmaWVsZCA9IChKYXZhRmllbGQqKWZpZWxkSUQ7Ci0gIHNpbnQ2NCByZXMgPSAoc2ludDY0KWZpZWxkLT5nZXRJbnN0YW5jZUxvbmdGaWVsZChvYmopOwotICBSRVRVUk5fRlJPTV9KTkkocmVzKTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICBSRVRVUk5fRlJPTV9KTkkoMCk7Ci19Ci0KLQotamZsb2F0IEdldEZsb2F0RmllbGQoSk5JRW52ICplbnYsIGpvYmplY3QgX29iaiwgamZpZWxkSUQgZmllbGRJRCkgewotCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgCi0gIC8vIExvY2FsIG9iamVjdCByZWZlcmVuY2VzLgotICBKYXZhT2JqZWN0KiBvYmogPSAqKEphdmFPYmplY3QqKilfb2JqOwotICBsbHZtX2djcm9vdChvYmosIDApOwotCi0gIEphdmFGaWVsZCogZmllbGQgPSAoSmF2YUZpZWxkKilmaWVsZElEOwotICBqZmxvYXQgcmVzID0gKGpmbG9hdClmaWVsZC0+Z2V0SW5zdGFuY2VGbG9hdEZpZWxkKG9iaik7Ci0gIFJFVFVSTl9GUk9NX0pOSShyZXMpOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIFJFVFVSTl9GUk9NX0pOSSgwKTsKLX0KLQotCi1qZG91YmxlIEdldERvdWJsZUZpZWxkKEpOSUVudiAqZW52LCBqb2JqZWN0IF9vYmosIGpmaWVsZElEIGZpZWxkSUQpIHsKLQotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0KLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEphdmFPYmplY3QqIG9iaiA9ICooSmF2YU9iamVjdCoqKV9vYmo7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gIAotICBKYXZhRmllbGQqIGZpZWxkID0gKEphdmFGaWVsZCopZmllbGRJRDsKLSAgamRvdWJsZSByZXMgPSAoamRvdWJsZSlmaWVsZC0+Z2V0SW5zdGFuY2VEb3VibGVGaWVsZChvYmopOwotICBSRVRVUk5fRlJPTV9KTkkocmVzKTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICBSRVRVUk5fRlJPTV9KTkkoMCk7Ci19Ci0KLQotdm9pZCBTZXRPYmplY3RGaWVsZChKTklFbnYgKmVudiwgam9iamVjdCBfb2JqLCBqZmllbGRJRCBmaWVsZElELCBqb2JqZWN0IF92YWx1ZSkgewotCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgCi0gIC8vIExvY2FsIG9iamVjdCByZWZlcmVuY2VzLgotICBKYXZhT2JqZWN0KiBvYmogPSAqKEphdmFPYmplY3QqKilfb2JqOwotICBKYXZhT2JqZWN0KiB2YWx1ZSA9ICooSmF2YU9iamVjdCoqKV92YWx1ZTsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgbGx2bV9nY3Jvb3QodmFsdWUsIDApOwotCi0gIEphdmFGaWVsZCogZmllbGQgPSAoSmF2YUZpZWxkKilmaWVsZElEOwotICBmaWVsZC0+c2V0SW5zdGFuY2VPYmplY3RGaWVsZChvYmosIHZhbHVlKTsKLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIAotICBSRVRVUk5fVk9JRF9GUk9NX0pOSTsKLX0KLQotCi12b2lkIFNldEJvb2xlYW5GaWVsZChKTklFbnYgKmVudiwgam9iamVjdCBfb2JqLCBqZmllbGRJRCBmaWVsZElELAotICAgICAgICAgICAgICAgICAgICAgamJvb2xlYW4gdmFsdWUpIHsKLQotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICAvLyBMb2NhbCBvYmplY3QgcmVmZXJlbmNlcy4KLSAgSmF2YU9iamVjdCogb2JqID0gKihKYXZhT2JqZWN0KiopX29iajsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLQotICBKYXZhRmllbGQqIGZpZWxkID0gKEphdmFGaWVsZCopZmllbGRJRDsKLSAgZmllbGQtPnNldEluc3RhbmNlSW50OEZpZWxkKG9iaiwgKHVpbnQ4KXZhbHVlKTsKLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIAotICBSRVRVUk5fVk9JRF9GUk9NX0pOSTsKLX0KLQotCi12b2lkIFNldEJ5dGVGaWVsZChKTklFbnYgKmVudiwgam9iamVjdCBfb2JqLCBqZmllbGRJRCBmaWVsZElELCBqYnl0ZSB2YWx1ZSkgewotCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgCi0gIC8vIExvY2FsIG9iamVjdCByZWZlcmVuY2VzLgotICBKYXZhT2JqZWN0KiBvYmogPSAqKEphdmFPYmplY3QqKilfb2JqOwotICBsbHZtX2djcm9vdChvYmosIDApOwotICAKLSAgSmF2YUZpZWxkKiBmaWVsZCA9IChKYXZhRmllbGQqKWZpZWxkSUQ7Ci0gIGZpZWxkLT5zZXRJbnN0YW5jZUludDhGaWVsZChvYmosICh1aW50OCl2YWx1ZSk7Ci0gIAotICBSRVRVUk5fVk9JRF9GUk9NX0pOSTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotfQotCi0KLXZvaWQgU2V0Q2hhckZpZWxkKEpOSUVudiAqZW52LCBqb2JqZWN0IF9vYmosIGpmaWVsZElEIGZpZWxkSUQsIGpjaGFyIHZhbHVlKSB7Ci0KLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotCi0gIC8vIExvY2FsIG9iamVjdCByZWZlcmVuY2VzLgotICBKYXZhT2JqZWN0KiBvYmogPSAqKEphdmFPYmplY3QqKilfb2JqOwotICBsbHZtX2djcm9vdChvYmosIDApOwotCi0gIEphdmFGaWVsZCogZmllbGQgPSAoSmF2YUZpZWxkKilmaWVsZElEOwotICBmaWVsZC0+c2V0SW5zdGFuY2VJbnQxNkZpZWxkKG9iaiwgKHVpbnQxNil2YWx1ZSk7Ci0gIAotICBSRVRVUk5fVk9JRF9GUk9NX0pOSTsKLSAgCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIAotICBSRVRVUk5fVk9JRF9GUk9NX0pOSTsKLX0KLQotCi12b2lkIFNldFNob3J0RmllbGQoSk5JRW52ICplbnYsIGpvYmplY3QgX29iaiwgamZpZWxkSUQgZmllbGRJRCwganNob3J0IHZhbHVlKSB7Ci0KLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotCi0gIC8vIExvY2FsIG9iamVjdCByZWZlcmVuY2VzLgotICBKYXZhT2JqZWN0KiBvYmogPSAqKEphdmFPYmplY3QqKilfb2JqOwotICBsbHZtX2djcm9vdChvYmosIDApOwotICAKLSAgSmF2YUZpZWxkKiBmaWVsZCA9IChKYXZhRmllbGQqKWZpZWxkSUQ7Ci0gIGZpZWxkLT5zZXRJbnN0YW5jZUludDE2RmllbGQob2JqLCAoc2ludDE2KXZhbHVlKTsKLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIAotICBSRVRVUk5fVk9JRF9GUk9NX0pOSTsKLX0KLQotCi12b2lkIFNldEludEZpZWxkKEpOSUVudiAqZW52LCBqb2JqZWN0IF9vYmosIGpmaWVsZElEIGZpZWxkSUQsIGppbnQgdmFsdWUpIHsKLQotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0KLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEphdmFPYmplY3QqIG9iaiA9ICooSmF2YU9iamVjdCoqKV9vYmo7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gIAotICBKYXZhRmllbGQqIGZpZWxkID0gKEphdmFGaWVsZCopZmllbGRJRDsKLSAgZmllbGQtPnNldEluc3RhbmNlSW50MzJGaWVsZChvYmosIChzaW50MzIpdmFsdWUpOwotICAKLSAgUkVUVVJOX1ZPSURfRlJPTV9KTkk7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotfQotCi0KLXZvaWQgU2V0TG9uZ0ZpZWxkKEpOSUVudiAqZW52LCBqb2JqZWN0IF9vYmosIGpmaWVsZElEIGZpZWxkSUQsIGpsb25nIHZhbHVlKSB7Ci0KLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotCi0gIC8vIExvY2FsIG9iamVjdCByZWZlcmVuY2VzLgotICBKYXZhT2JqZWN0KiBvYmogPSAqKEphdmFPYmplY3QqKilfb2JqOwotICBsbHZtX2djcm9vdChvYmosIDApOwotICAKLSAgSmF2YUZpZWxkKiBmaWVsZCA9IChKYXZhRmllbGQqKWZpZWxkSUQ7Ci0gIGZpZWxkLT5zZXRJbnN0YW5jZUxvbmdGaWVsZChvYmosIChzaW50NjQpdmFsdWUpOwotICAKLSAgUkVUVVJOX1ZPSURfRlJPTV9KTkk7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotfQotCi0KLXZvaWQgU2V0RmxvYXRGaWVsZChKTklFbnYgKmVudiwgam9iamVjdCBfb2JqLCBqZmllbGRJRCBmaWVsZElELCBqZmxvYXQgdmFsdWUpIHsKLQotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0KLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEphdmFPYmplY3QqIG9iaiA9ICooSmF2YU9iamVjdCoqKV9vYmo7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gIAotICBKYXZhRmllbGQqIGZpZWxkID0gKEphdmFGaWVsZCopZmllbGRJRDsKLSAgZmllbGQtPnNldEluc3RhbmNlRmxvYXRGaWVsZChvYmosIChmbG9hdCl2YWx1ZSk7Ci0gIAotICBSRVRVUk5fVk9JRF9GUk9NX0pOSTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICAKLSAgUkVUVVJOX1ZPSURfRlJPTV9KTkk7Ci19Ci0KLQotdm9pZCBTZXREb3VibGVGaWVsZChKTklFbnYgKmVudiwgam9iamVjdCBfb2JqLCBqZmllbGRJRCBmaWVsZElELCBqZG91YmxlIHZhbHVlKSB7Ci0KLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotCi0gIC8vIExvY2FsIG9iamVjdCByZWZlcmVuY2VzLgotICBKYXZhT2JqZWN0KiBvYmogPSAqKEphdmFPYmplY3QqKilfb2JqOwotICBsbHZtX2djcm9vdChvYmosIDApOwotICAKLSAgSmF2YUZpZWxkKiBmaWVsZCA9IChKYXZhRmllbGQqKWZpZWxkSUQ7Ci0gIGZpZWxkLT5zZXRJbnN0YW5jZURvdWJsZUZpZWxkKG9iaiwgKGZsb2F0KXZhbHVlKTsKLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIAotICBSRVRVUk5fVk9JRF9GUk9NX0pOSTsKLX0KLQotCi1qbWV0aG9kSUQgR2V0U3RhdGljTWV0aG9kSUQoSk5JRW52ICplbnYsIGpjbGFzcyBfY2xhenosIGNvbnN0IGNoYXIgKmFuYW1lLAotCQkJICAgIGNvbnN0IGNoYXIgKmF0eXBlKSB7Ci0KLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEphdmFPYmplY3QqIGNsYXp6ID0gKihKYXZhT2JqZWN0KiopX2NsYXp6OwotICBsbHZtX2djcm9vdChjbGF6eiwgMCk7Ci0gIAotICBVc2VyQ29tbW9uQ2xhc3MqIGNsID0gVXNlckNvbW1vbkNsYXNzOjpyZXNvbHZlZEltcGxDbGFzcyhjbGF6eiwgdHJ1ZSk7Ci0KLSAgaWYgKGNsLT5pc0NsYXNzKCkpIHsKLSAgICBjb25zdCBVVEY4KiBuYW1lID0gY2wtPmNsYXNzTG9hZGVyLT5oYXNoVVRGOC0+bG9va3VwQXNjaWl6KGFuYW1lKTsKLSAgICBpZiAobmFtZSkgewotICAgICAgY29uc3QgVVRGOCogdHlwZSA9IGNsLT5jbGFzc0xvYWRlci0+aGFzaFVURjgtPmxvb2t1cEFzY2lpeihhdHlwZSk7Ci0gICAgICBpZiAodHlwZSkgewotICAgICAgICBKYXZhTWV0aG9kKiBtZXRoID0gY2wtPmFzQ2xhc3MoKS0+bG9va3VwTWV0aG9kKG5hbWUsIHR5cGUsIHRydWUsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgIFJFVFVSTl9GUk9NX0pOSSgoam1ldGhvZElEKW1ldGgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIFJFVFVSTl9GUk9NX0pOSSgwKTsKLX0KLQotCi1qb2JqZWN0IENhbGxTdGF0aWNPYmplY3RNZXRob2QoSk5JRW52ICplbnYsIGpjbGFzcyBfY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pIHsKLSAgCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgCi0gIHZhX2xpc3QgYXA7Ci0gIHZhX3N0YXJ0KGFwLCBtZXRob2RJRCk7Ci0gCi0gIC8vIExvY2FsIG9iamVjdCByZWZlcmVuY2VzLgotICBKYXZhT2JqZWN0KiBjbGF6eiA9ICooSmF2YU9iamVjdCoqKV9jbGF6ejsKLSAgSmF2YU9iamVjdCogcmVzID0gMDsKLSAgbGx2bV9nY3Jvb3QoY2xhenosIDApOwotICBsbHZtX2djcm9vdChyZXMsIDApOwotCi0KLSAgSmF2YU1ldGhvZCogbWV0aCA9IChKYXZhTWV0aG9kKiltZXRob2RJRDsKLSAgSmF2YVRocmVhZCogdGggPSBKYXZhVGhyZWFkOjpnZXQoKTsKLSAgVXNlckNsYXNzKiBjbCA9IGdldENsYXNzRnJvbVN0YXRpY01ldGhvZChtZXRoLCBjbGF6eik7Ci0gIAotICAvLyBTdG9yZSBsb2NhbCByZWZlcmVuY2UuCi0gIHJlcyA9IG1ldGgtPmludm9rZUphdmFPYmplY3RTdGF0aWNBUChjbCwgYXApOwotICB2YV9lbmQoYXApOwotICAKLSAgam9iamVjdCByZXQgPSAoam9iamVjdCl0aC0+cHVzaEpOSVJlZihyZXMpOwotICBSRVRVUk5fRlJPTV9KTkkocmV0KTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICBSRVRVUk5fRlJPTV9KTkkoMCk7Ci19Ci0KLQotam9iamVjdCBDYWxsU3RhdGljT2JqZWN0TWV0aG9kVihKTklFbnYgKmVudiwgamNsYXNzIF9jbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncykgewotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICAvLyBMb2NhbCBvYmplY3QgcmVmZXJlbmNlcy4KLSAgSmF2YU9iamVjdCogY2xhenogPSAqKEphdmFPYmplY3QqKilfY2xheno7Ci0gIEphdmFPYmplY3QqIHJlcyA9IDA7Ci0gIGxsdm1fZ2Nyb290KGNsYXp6LCAwKTsKLSAgbGx2bV9nY3Jvb3QocmVzLCAwKTsKLSAgCi0gIEphdmFNZXRob2QqIG1ldGggPSAoSmF2YU1ldGhvZCopbWV0aG9kSUQ7Ci0gIEphdmFUaHJlYWQqIHRoID0gSmF2YVRocmVhZDo6Z2V0KCk7Ci0gIFVzZXJDbGFzcyogY2wgPSBnZXRDbGFzc0Zyb21TdGF0aWNNZXRob2QobWV0aCwgY2xhenopOwotICAKLSAgLy8gU3RvcmUgbG9jYWwgcmVmZXJlbmNlLgotICByZXMgPSBtZXRoLT5pbnZva2VKYXZhT2JqZWN0U3RhdGljQVAoY2wsIGFyZ3MpOwotCi0gIGpvYmplY3QgcmV0ID0gKGpvYmplY3QpdGgtPnB1c2hKTklSZWYocmVzKTsKLSAgUkVUVVJOX0ZST01fSk5JKHJldCk7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLWpvYmplY3QgQ2FsbFN0YXRpY09iamVjdE1ldGhvZEEoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqdmFsdWUgKmFyZ3MpIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotICByZXR1cm4gMDsKLX0KLQotCi1qYm9vbGVhbiBDYWxsU3RhdGljQm9vbGVhbk1ldGhvZChKTklFbnYgKmVudiwgamNsYXNzIF9jbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICB2YV9saXN0IGFwOwotICB2YV9zdGFydChhcCwgbWV0aG9kSUQpOwotICAKLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEphdmFPYmplY3QqIGNsYXp6ID0gKihKYXZhT2JqZWN0KiopX2NsYXp6OwotICBsbHZtX2djcm9vdChjbGF6eiwgMCk7Ci0gIAotICBKYXZhTWV0aG9kKiBtZXRoID0gKEphdmFNZXRob2QqKW1ldGhvZElEOwotICBVc2VyQ2xhc3MqIGNsID0gZ2V0Q2xhc3NGcm9tU3RhdGljTWV0aG9kKG1ldGgsIGNsYXp6KTsKLSAgdWludDMyIHJlcyA9IG1ldGgtPmludm9rZUludFN0YXRpY0FQKGNsLCBhcCk7Ci0gIHZhX2VuZChhcCk7Ci0gIFJFVFVSTl9GUk9NX0pOSShyZXMpOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIFJFVFVSTl9GUk9NX0pOSSgwKTsKLX0KLQotCi1qYm9vbGVhbiBDYWxsU3RhdGljQm9vbGVhbk1ldGhvZFYoSk5JRW52ICplbnYsIGpjbGFzcyBfY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsKLSAgCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgCi0gIC8vIExvY2FsIG9iamVjdCByZWZlcmVuY2VzLgotICBKYXZhT2JqZWN0KiBjbGF6eiA9ICooSmF2YU9iamVjdCoqKV9jbGF6ejsKLSAgbGx2bV9nY3Jvb3QoY2xhenosIDApOwotICAKLSAgSmF2YU1ldGhvZCogbWV0aCA9IChKYXZhTWV0aG9kKiltZXRob2RJRDsKLSAgVXNlckNsYXNzKiBjbCA9IGdldENsYXNzRnJvbVN0YXRpY01ldGhvZChtZXRoLCBjbGF6eik7Ci0gIGpib29sZWFuIHJlcyA9IChqYm9vbGVhbiltZXRoLT5pbnZva2VJbnRTdGF0aWNBUChjbCwgYXJncyk7Ci0gIFJFVFVSTl9GUk9NX0pOSShyZXMpOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIFJFVFVSTl9GUk9NX0pOSSgwKTsKLX0KLQotCi1qYm9vbGVhbiBDYWxsU3RhdGljQm9vbGVhbk1ldGhvZEEoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGp2YWx1ZSAqYXJncykgewotICBmcHJpbnRmKHN0ZGVyciwgIkltcGxlbWVudCBtZVxuIik7Ci0gIGFib3J0KCk7Ci0gIHJldHVybiAwOwotfQotCi0KLWpieXRlIENhbGxTdGF0aWNCeXRlTWV0aG9kKEpOSUVudiAqZW52LCBqY2xhc3MgX2NsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAKLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEphdmFPYmplY3QqIGNsYXp6ID0gKihKYXZhT2JqZWN0KiopX2NsYXp6OwotICBsbHZtX2djcm9vdChjbGF6eiwgMCk7Ci0gIAotICB2YV9saXN0IGFwOwotICB2YV9zdGFydChhcCwgbWV0aG9kSUQpOwotICBKYXZhTWV0aG9kKiBtZXRoID0gKEphdmFNZXRob2QqKW1ldGhvZElEOwotICBVc2VyQ2xhc3MqIGNsID0gZ2V0Q2xhc3NGcm9tU3RhdGljTWV0aG9kKG1ldGgsIGNsYXp6KTsKLSAgamJ5dGUgcmVzID0gKGpieXRlKSBtZXRoLT5pbnZva2VJbnRTdGF0aWNBUChjbCwgYXApOwotICB2YV9lbmQoYXApOwotICBSRVRVUk5fRlJPTV9KTkkocmVzKTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICBSRVRVUk5fRlJPTV9KTkkoMCk7Ci19Ci0KLQotamJ5dGUgQ2FsbFN0YXRpY0J5dGVNZXRob2RWKEpOSUVudiAqZW52LCBqY2xhc3MgX2NsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICAvLyBMb2NhbCBvYmplY3QgcmVmZXJlbmNlcy4KLSAgSmF2YU9iamVjdCogY2xhenogPSAqKEphdmFPYmplY3QqKilfY2xheno7Ci0gIGxsdm1fZ2Nyb290KGNsYXp6LCAwKTsKLSAgCi0gIEphdmFNZXRob2QqIG1ldGggPSAoSmF2YU1ldGhvZCopbWV0aG9kSUQ7Ci0gIFVzZXJDbGFzcyogY2wgPSBnZXRDbGFzc0Zyb21TdGF0aWNNZXRob2QobWV0aCwgY2xhenopOwotICBqYnl0ZSByZXMgPSAoamJ5dGUpbWV0aC0+aW52b2tlSW50U3RhdGljQVAoY2wsIGFyZ3MpOwotICBSRVRVUk5fRlJPTV9KTkkocmVzKTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICBSRVRVUk5fRlJPTV9KTkkoMCk7Ci19Ci0KLQotamJ5dGUgQ2FsbFN0YXRpY0J5dGVNZXRob2RBKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqdmFsdWUgKmFyZ3MpIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotICByZXR1cm4gMDsKLX0KLQotCi1qY2hhciBDYWxsU3RhdGljQ2hhck1ldGhvZChKTklFbnYgKmVudiwgamNsYXNzIF9jbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgCi0gIHZhX2xpc3QgYXA7Ci0gIHZhX3N0YXJ0KGFwLCBtZXRob2RJRCk7Ci0gIAotICAvLyBMb2NhbCBvYmplY3QgcmVmZXJlbmNlcy4KLSAgSmF2YU9iamVjdCogY2xhenogPSAqKEphdmFPYmplY3QqKilfY2xheno7Ci0gIGxsdm1fZ2Nyb290KGNsYXp6LCAwKTsKLSAgCi0gIEphdmFNZXRob2QqIG1ldGggPSAoSmF2YU1ldGhvZCopbWV0aG9kSUQ7Ci0gIFVzZXJDbGFzcyogY2wgPSBnZXRDbGFzc0Zyb21TdGF0aWNNZXRob2QobWV0aCwgY2xhenopOwotICBqY2hhciByZXMgPSAoamNoYXIpIG1ldGgtPmludm9rZUludFN0YXRpY0FQKGNsLCBhcCk7Ci0gIHZhX2VuZChhcCk7Ci0gIFJFVFVSTl9GUk9NX0pOSShyZXMpOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIFJFVFVSTl9GUk9NX0pOSSgwKTsKLX0KLQotCi1qY2hhciBDYWxsU3RhdGljQ2hhck1ldGhvZFYoSk5JRW52ICplbnYsIGpjbGFzcyBfY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsKLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEphdmFPYmplY3QqIGNsYXp6ID0gKihKYXZhT2JqZWN0KiopX2NsYXp6OwotICBsbHZtX2djcm9vdChjbGF6eiwgMCk7Ci0gIAotICBKYXZhTWV0aG9kKiBtZXRoID0gKEphdmFNZXRob2QqKW1ldGhvZElEOwotICBVc2VyQ2xhc3MqIGNsID0gZ2V0Q2xhc3NGcm9tU3RhdGljTWV0aG9kKG1ldGgsIGNsYXp6KTsKLSAgamNoYXIgcmVzID0gKGpjaGFyKW1ldGgtPmludm9rZUludFN0YXRpY0FQKGNsLCBhcmdzKTsKLSAgUkVUVVJOX0ZST01fSk5JKHJlcyk7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLWpjaGFyIENhbGxTdGF0aWNDaGFyTWV0aG9kQShKTklFbnYgKmVudiwgamNsYXNzIF9jbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGp2YWx1ZSAqYXJncykgewotICBmcHJpbnRmKHN0ZGVyciwgIkltcGxlbWVudCBtZVxuIik7Ci0gIGFib3J0KCk7Ci0gIHJldHVybiAwOwotfQotCi0KLWpzaG9ydCBDYWxsU3RhdGljU2hvcnRNZXRob2QoSk5JRW52ICplbnYsIGpjbGFzcyBfY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICB2YV9saXN0IGFwOwotICB2YV9zdGFydChhcCwgbWV0aG9kSUQpOwotICAKLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEphdmFPYmplY3QqIGNsYXp6ID0gKihKYXZhT2JqZWN0KiopX2NsYXp6OwotICBsbHZtX2djcm9vdChjbGF6eiwgMCk7Ci0gIAotICBKYXZhTWV0aG9kKiBtZXRoID0gKEphdmFNZXRob2QqKW1ldGhvZElEOwotICBVc2VyQ2xhc3MqIGNsID0gZ2V0Q2xhc3NGcm9tU3RhdGljTWV0aG9kKG1ldGgsIGNsYXp6KTsKLSAganNob3J0IHJlcyA9IChqc2hvcnQpIG1ldGgtPmludm9rZUludFN0YXRpY0FQKGNsLCBhcCk7Ci0gIHZhX2VuZChhcCk7Ci0gIFJFVFVSTl9GUk9NX0pOSShyZXMpOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIFJFVFVSTl9GUk9NX0pOSSgwKTsKLX0KLQotCi1qc2hvcnQgQ2FsbFN0YXRpY1Nob3J0TWV0aG9kVihKTklFbnYgKmVudiwgamNsYXNzIF9jbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICAvLyBMb2NhbCBvYmplY3QgcmVmZXJlbmNlcy4KLSAgSmF2YU9iamVjdCogY2xhenogPSAqKEphdmFPYmplY3QqKilfY2xheno7Ci0gIGxsdm1fZ2Nyb290KGNsYXp6LCAwKTsKLSAgCi0gIEphdmFNZXRob2QqIG1ldGggPSAoSmF2YU1ldGhvZCopbWV0aG9kSUQ7Ci0gIFVzZXJDbGFzcyogY2wgPSBnZXRDbGFzc0Zyb21TdGF0aWNNZXRob2QobWV0aCwgY2xhenopOwotICBqc2hvcnQgcmVzID0gKGpzaG9ydCltZXRoLT5pbnZva2VJbnRTdGF0aWNBUChjbCwgYXJncyk7Ci0gIFJFVFVSTl9GUk9NX0pOSShyZXMpOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIFJFVFVSTl9GUk9NX0pOSSgwKTsKLX0KLQotCi1qc2hvcnQgQ2FsbFN0YXRpY1Nob3J0TWV0aG9kQShKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqdmFsdWUgKmFyZ3MpIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotICByZXR1cm4gMDsKLX0KLQotCi1qaW50IENhbGxTdGF0aWNJbnRNZXRob2QoSk5JRW52ICplbnYsIGpjbGFzcyBfY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICB2YV9saXN0IGFwOwotICB2YV9zdGFydChhcCwgbWV0aG9kSUQpOwotICAKLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEphdmFPYmplY3QqIGNsYXp6ID0gKihKYXZhT2JqZWN0KiopX2NsYXp6OwotICBsbHZtX2djcm9vdChjbGF6eiwgMCk7Ci0gIAotICBKYXZhTWV0aG9kKiBtZXRoID0gKEphdmFNZXRob2QqKW1ldGhvZElEOwotICBVc2VyQ2xhc3MqIGNsID0gZ2V0Q2xhc3NGcm9tU3RhdGljTWV0aG9kKG1ldGgsIGNsYXp6KTsKLSAgamludCByZXMgPSAoamludCkgbWV0aC0+aW52b2tlSW50U3RhdGljQVAoY2wsIGFwKTsKLSAgdmFfZW5kKGFwKTsKLSAgUkVUVVJOX0ZST01fSk5JKHJlcyk7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLWppbnQgQ2FsbFN0YXRpY0ludE1ldGhvZFYoSk5JRW52ICplbnYsIGpjbGFzcyBfY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgCi0gIC8vIExvY2FsIG9iamVjdCByZWZlcmVuY2VzLgotICBKYXZhT2JqZWN0KiBjbGF6eiA9ICooSmF2YU9iamVjdCoqKV9jbGF6ejsKLSAgbGx2bV9nY3Jvb3QoY2xhenosIDApOwotICAKLSAgSmF2YU1ldGhvZCogbWV0aCA9IChKYXZhTWV0aG9kKiltZXRob2RJRDsKLSAgVXNlckNsYXNzKiBjbCA9IGdldENsYXNzRnJvbVN0YXRpY01ldGhvZChtZXRoLCBjbGF6eik7Ci0gIGppbnQgcmVzID0gKGppbnQpbWV0aC0+aW52b2tlSW50U3RhdGljQVAoY2wsIGFyZ3MpOwotICBSRVRVUk5fRlJPTV9KTkkocmVzKTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICAKLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLWppbnQgQ2FsbFN0YXRpY0ludE1ldGhvZEEoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqdmFsdWUgKmFyZ3MpIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotICByZXR1cm4gMDsKLX0KLQotCi1qbG9uZyBDYWxsU3RhdGljTG9uZ01ldGhvZChKTklFbnYgKmVudiwgamNsYXNzIF9jbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgCi0gIHZhX2xpc3QgYXA7Ci0gIHZhX3N0YXJ0KGFwLCBtZXRob2RJRCk7Ci0gIAotICAvLyBMb2NhbCBvYmplY3QgcmVmZXJlbmNlcy4KLSAgSmF2YU9iamVjdCogY2xhenogPSAqKEphdmFPYmplY3QqKilfY2xheno7Ci0gIGxsdm1fZ2Nyb290KGNsYXp6LCAwKTsKLSAgCi0gIEphdmFNZXRob2QqIG1ldGggPSAoSmF2YU1ldGhvZCopbWV0aG9kSUQ7Ci0gIFVzZXJDbGFzcyogY2wgPSBnZXRDbGFzc0Zyb21TdGF0aWNNZXRob2QobWV0aCwgY2xhenopOwotICBqbG9uZyByZXMgPSAoamxvbmcpIG1ldGgtPmludm9rZUxvbmdTdGF0aWNBUChjbCwgYXApOwotICB2YV9lbmQoYXApOwotICBSRVRVUk5fRlJPTV9KTkkocmVzKTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICBSRVRVUk5fRlJPTV9KTkkoMCk7Ci19Ci0KLQotamxvbmcgQ2FsbFN0YXRpY0xvbmdNZXRob2RWKEpOSUVudiAqZW52LCBqY2xhc3MgX2NsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0JCQkgICAgdmFfbGlzdCBhcmdzKSB7Ci0KLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEphdmFPYmplY3QqIGNsYXp6ID0gKihKYXZhT2JqZWN0KiopX2NsYXp6OwotICBsbHZtX2djcm9vdChjbGF6eiwgMCk7Ci0gIAotICBKYXZhTWV0aG9kKiBtZXRoID0gKEphdmFNZXRob2QqKW1ldGhvZElEOwotICBVc2VyQ2xhc3MqIGNsID0gZ2V0Q2xhc3NGcm9tU3RhdGljTWV0aG9kKG1ldGgsIGNsYXp6KTsKLSAgamxvbmcgcmVzID0gKGpsb25nKW1ldGgtPmludm9rZUxvbmdTdGF0aWNBUChjbCwgYXJncyk7Ci0gIFJFVFVSTl9GUk9NX0pOSShyZXMpOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIAotICBSRVRVUk5fRlJPTV9KTkkoMCk7Ci19Ci0KLQotamxvbmcgQ2FsbFN0YXRpY0xvbmdNZXRob2RBKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqdmFsdWUgKmFyZ3MpIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotICByZXR1cm4gMDsKLX0KLQotCi0KLWpmbG9hdCBDYWxsU3RhdGljRmxvYXRNZXRob2QoSk5JRW52ICplbnYsIGpjbGFzcyBfY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICB2YV9saXN0IGFwOwotICB2YV9zdGFydChhcCwgbWV0aG9kSUQpOwotICAKLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEphdmFPYmplY3QqIGNsYXp6ID0gKihKYXZhT2JqZWN0KiopX2NsYXp6OwotICBsbHZtX2djcm9vdChjbGF6eiwgMCk7Ci0gIAotICBKYXZhTWV0aG9kKiBtZXRoID0gKEphdmFNZXRob2QqKW1ldGhvZElEOwotICBVc2VyQ2xhc3MqIGNsID0gZ2V0Q2xhc3NGcm9tU3RhdGljTWV0aG9kKG1ldGgsIGNsYXp6KTsKLSAgamZsb2F0IHJlcyA9IChqZmxvYXQpIG1ldGgtPmludm9rZUZsb2F0U3RhdGljQVAoY2wsIGFwKTsKLSAgdmFfZW5kKGFwKTsKLSAgUkVUVVJOX0ZST01fSk5JKHJlcyk7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgUkVUVVJOX0ZST01fSk5JKDAuMGYpOwotfQotCi0KLWpmbG9hdCBDYWxsU3RhdGljRmxvYXRNZXRob2RWKEpOSUVudiAqZW52LCBqY2xhc3MgX2NsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsKLSAgCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgCi0gIC8vIExvY2FsIG9iamVjdCByZWZlcmVuY2VzLgotICBKYXZhT2JqZWN0KiBjbGF6eiA9ICooSmF2YU9iamVjdCoqKV9jbGF6ejsKLSAgbGx2bV9nY3Jvb3QoY2xhenosIDApOwotICAKLSAgSmF2YU1ldGhvZCogbWV0aCA9IChKYXZhTWV0aG9kKiltZXRob2RJRDsKLSAgVXNlckNsYXNzKiBjbCA9IGdldENsYXNzRnJvbVN0YXRpY01ldGhvZChtZXRoLCBjbGF6eik7Ci0gIGpmbG9hdCByZXMgPSAoamZsb2F0KW1ldGgtPmludm9rZUZsb2F0U3RhdGljQVAoY2wsIGFyZ3MpOwotICBSRVRVUk5fRlJPTV9KTkkocmVzKTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICAKLSAgUkVUVVJOX0ZST01fSk5JKDAuMGYpOwotfQotCi0KLWpmbG9hdCBDYWxsU3RhdGljRmxvYXRNZXRob2RBKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGp2YWx1ZSAqYXJncykgewotICBmcHJpbnRmKHN0ZGVyciwgIkltcGxlbWVudCBtZVxuIik7Ci0gIGFib3J0KCk7Ci0gIHJldHVybiAwOwotfQotCi0KLWpkb3VibGUgQ2FsbFN0YXRpY0RvdWJsZU1ldGhvZChKTklFbnYgKmVudiwgamNsYXNzIF9jbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLikgewotICAKLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgdmFfbGlzdCBhcDsKLSAgdmFfc3RhcnQoYXAsIG1ldGhvZElEKTsKLSAgCi0gIC8vIExvY2FsIG9iamVjdCByZWZlcmVuY2VzLgotICBKYXZhT2JqZWN0KiBjbGF6eiA9ICooSmF2YU9iamVjdCoqKV9jbGF6ejsKLSAgbGx2bV9nY3Jvb3QoY2xhenosIDApOwotICAKLSAgSmF2YU1ldGhvZCogbWV0aCA9IChKYXZhTWV0aG9kKiltZXRob2RJRDsKLSAgVXNlckNsYXNzKiBjbCA9IGdldENsYXNzRnJvbVN0YXRpY01ldGhvZChtZXRoLCBjbGF6eik7Ci0gIGpkb3VibGUgcmVzID0gKGpkb3VibGUpIG1ldGgtPmludm9rZURvdWJsZVN0YXRpY0FQKGNsLCBhcCk7Ci0gIHZhX2VuZChhcCk7Ci0gIFJFVFVSTl9GUk9NX0pOSShyZXMpOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIFJFVFVSTl9GUk9NX0pOSSgwLjApOwotfQotCi0KLWpkb3VibGUgQ2FsbFN0YXRpY0RvdWJsZU1ldGhvZFYoSk5JRW52ICplbnYsIGpjbGFzcyBfY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgCi0gIC8vIExvY2FsIG9iamVjdCByZWZlcmVuY2VzLgotICBKYXZhT2JqZWN0KiBjbGF6eiA9ICooSmF2YU9iamVjdCoqKV9jbGF6ejsKLSAgbGx2bV9nY3Jvb3QoY2xhenosIDApOwotICAKLSAgSmF2YU1ldGhvZCogbWV0aCA9IChKYXZhTWV0aG9kKiltZXRob2RJRDsKLSAgVXNlckNsYXNzKiBjbCA9IGdldENsYXNzRnJvbVN0YXRpY01ldGhvZChtZXRoLCBjbGF6eik7Ci0gIGpkb3VibGUgcmVzID0gKGpkb3VibGUpbWV0aC0+aW52b2tlRG91YmxlU3RhdGljQVAoY2wsIGFyZ3MpOwotICBSRVRVUk5fRlJPTV9KTkkocmVzKTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICAKLSAgUkVUVVJOX0ZST01fSk5JKDAuMCk7Ci19Ci0KLQotamRvdWJsZSBDYWxsU3RhdGljRG91YmxlTWV0aG9kQShKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGp2YWx1ZSAqYXJncykgewotICBmcHJpbnRmKHN0ZGVyciwgIkltcGxlbWVudCBtZVxuIik7Ci0gIGFib3J0KCk7Ci0gIHJldHVybiAwOwotfQotCi0KLXZvaWQgQ2FsbFN0YXRpY1ZvaWRNZXRob2QoSk5JRW52ICplbnYsIGpjbGFzcyBfY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICB2YV9saXN0IGFwOwotICB2YV9zdGFydChhcCwgbWV0aG9kSUQpOwotICAKLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEphdmFPYmplY3QqIGNsYXp6ID0gKihKYXZhT2JqZWN0KiopX2NsYXp6OwotICBsbHZtX2djcm9vdChjbGF6eiwgMCk7Ci0KLSAgSmF2YU1ldGhvZCogbWV0aCA9IChKYXZhTWV0aG9kKiltZXRob2RJRDsKLSAgVXNlckNsYXNzKiBjbCA9IGdldENsYXNzRnJvbVN0YXRpY01ldGhvZChtZXRoLCBjbGF6eik7Ci0gIG1ldGgtPmludm9rZUludFN0YXRpY0FQKGNsLCBhcCk7Ci0gIHZhX2VuZChhcCk7Ci0KLSAgUkVUVVJOX1ZPSURfRlJPTV9KTkk7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotfQotCi0KLXZvaWQgQ2FsbFN0YXRpY1ZvaWRNZXRob2RWKEpOSUVudiAqZW52LCBqY2xhc3MgX2NsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsKLSAgCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgCi0gIC8vIExvY2FsIG9iamVjdCByZWZlcmVuY2VzLgotICBKYXZhT2JqZWN0KiBjbGF6eiA9ICooSmF2YU9iamVjdCoqKV9jbGF6ejsKLSAgbGx2bV9nY3Jvb3QoY2xhenosIDApOwotICAKLSAgSmF2YU1ldGhvZCogbWV0aCA9IChKYXZhTWV0aG9kKiltZXRob2RJRDsKLSAgVXNlckNsYXNzKiBjbCA9IGdldENsYXNzRnJvbVN0YXRpY01ldGhvZChtZXRoLCBjbGF6eik7Ci0gIG1ldGgtPmludm9rZUludFN0YXRpY0FQKGNsLCBhcmdzKTsKLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIAotICBSRVRVUk5fVk9JRF9GUk9NX0pOSTsKLX0KLQotCi12b2lkIENhbGxTdGF0aWNWb2lkTWV0aG9kQShKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqdmFsdWUgKiBhcmdzKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLX0KLQotCi1qZmllbGRJRCBHZXRTdGF0aWNGaWVsZElEKEpOSUVudiAqZW52LCBqY2xhc3MgX2NsYXp6LCBjb25zdCBjaGFyICphbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc2lnKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICAvLyBMb2NhbCBvYmplY3QgcmVmZXJlbmNlcy4KLSAgSmF2YU9iamVjdCogY2xhenogPSAqKEphdmFPYmplY3QqKilfY2xheno7Ci0gIGxsdm1fZ2Nyb290KGNsYXp6LCAwKTsKLSAgCi0gIFVzZXJDb21tb25DbGFzcyogY2wgPSBVc2VyQ29tbW9uQ2xhc3M6OnJlc29sdmVkSW1wbENsYXNzKGNsYXp6LCB0cnVlKTsKLSAgCi0gIGlmIChjbC0+aXNDbGFzcygpKSB7Ci0gICAgY29uc3QgVVRGOCogbmFtZSA9IGNsLT5jbGFzc0xvYWRlci0+aGFzaFVURjgtPmxvb2t1cEFzY2lpeihhbmFtZSk7Ci0gICAgaWYgKG5hbWUpIHsKLSAgICAgIGNvbnN0IFVURjgqIHR5cGUgPSBjbC0+Y2xhc3NMb2FkZXItPmhhc2hVVEY4LT5sb29rdXBBc2NpaXooc2lnKTsKLSAgICAgIGlmICh0eXBlKSB7Ci0gICAgICAgIEphdmFGaWVsZCogZmllbGQgPSBjbC0+YXNDbGFzcygpLT5sb29rdXBGaWVsZChuYW1lLCB0eXBlLCB0cnVlLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgIFJFVFVSTl9GUk9NX0pOSSgoamZpZWxkSUQpZmllbGQpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIFJFVFVSTl9GUk9NX0pOSSgwKTsKLX0KLQotCi1qb2JqZWN0IEdldFN0YXRpY09iamVjdEZpZWxkKEpOSUVudiAqZW52LCBqY2xhc3MgX2NsYXp6LCBqZmllbGRJRCBmaWVsZElEKSB7Ci0KLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEphdmFPYmplY3QqIG9iaiA9IDA7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0KLSAgSmF2YVRocmVhZCogdGggPSBKYXZhVGhyZWFkOjpnZXQoKTsKLSAgSmF2YUZpZWxkKiBmaWVsZCA9IChKYXZhRmllbGQqKWZpZWxkSUQ7Ci0gIG9iaiA9IGZpZWxkLT5nZXRTdGF0aWNPYmplY3RGaWVsZCgpOwotICBqb2JqZWN0IHJlcyA9IChqb2JqZWN0KXRoLT5wdXNoSk5JUmVmKG9iaik7Ci0gIFJFVFVSTl9GUk9NX0pOSShyZXMpOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIFJFVFVSTl9GUk9NX0pOSSgwKTsKLX0KLQotCi1qYm9vbGVhbiBHZXRTdGF0aWNCb29sZWFuRmllbGQoSk5JRW52ICplbnYsIGpjbGFzcyBfY2xhenosIGpmaWVsZElEIGZpZWxkSUQpIHsKLSAgCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgCi0gIEphdmFGaWVsZCogZmllbGQgPSAoSmF2YUZpZWxkKilmaWVsZElEOwotICBqYm9vbGVhbiByZXMgPSAoamJvb2xlYW4pZmllbGQtPmdldFN0YXRpY0ludDhGaWVsZCgpOwotICBSRVRVUk5fRlJPTV9KTkkocmVzKTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICBSRVRVUk5fRlJPTV9KTkkoMCk7Ci19Ci0KLQotamJ5dGUgR2V0U3RhdGljQnl0ZUZpZWxkKEpOSUVudiAqZW52LCBqY2xhc3MgX2NsYXp6LCBqZmllbGRJRCBmaWVsZElEKSB7Ci0KLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgSmF2YUZpZWxkKiBmaWVsZCA9IChKYXZhRmllbGQqKWZpZWxkSUQ7Ci0gIGpieXRlIHJlcyA9IChqYnl0ZSlmaWVsZC0+Z2V0U3RhdGljSW50OEZpZWxkKCk7Ci0gIFJFVFVSTl9GUk9NX0pOSShyZXMpOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIFJFVFVSTl9GUk9NX0pOSSgwKTsKLX0KLQotCi1qY2hhciBHZXRTdGF0aWNDaGFyRmllbGQoSk5JRW52ICplbnYsIGpjbGFzcyBfY2xhenosIGpmaWVsZElEIGZpZWxkSUQpIHsKLQotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0KLSAgSmF2YUZpZWxkKiBmaWVsZCA9IChKYXZhRmllbGQqKWZpZWxkSUQ7Ci0gIGpjaGFyIHJlcyA9IChqY2hhcilmaWVsZC0+Z2V0U3RhdGljSW50MTZGaWVsZCgpOwotICBSRVRVUk5fRlJPTV9KTkkocmVzKTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICBSRVRVUk5fRlJPTV9KTkkoMCk7Ci19Ci0KLQotanNob3J0IEdldFN0YXRpY1Nob3J0RmllbGQoSk5JRW52ICplbnYsIGpjbGFzcyBfY2xhenosIGpmaWVsZElEIGZpZWxkSUQpIHsKLQotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0KLSAgSmF2YUZpZWxkKiBmaWVsZCA9IChKYXZhRmllbGQqKWZpZWxkSUQ7Ci0gIGpzaG9ydCByZXMgPSAoanNob3J0KWZpZWxkLT5nZXRTdGF0aWNJbnQxNkZpZWxkKCk7Ci0gIFJFVFVSTl9GUk9NX0pOSShyZXMpOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIFJFVFVSTl9GUk9NX0pOSSgwKTsKLX0KLQotCi1qaW50IEdldFN0YXRpY0ludEZpZWxkKEpOSUVudiAqZW52LCBqY2xhc3MgX2NsYXp6LCBqZmllbGRJRCBmaWVsZElEKSB7Ci0KLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotCi0gIEphdmFGaWVsZCogZmllbGQgPSAoSmF2YUZpZWxkKilmaWVsZElEOwotICBqaW50IHJlcyA9IChqaW50KWZpZWxkLT5nZXRTdGF0aWNJbnQzMkZpZWxkKCk7Ci0gIFJFVFVSTl9GUk9NX0pOSShyZXMpOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIFJFVFVSTl9GUk9NX0pOSSgwKTsKLX0KLQotCi1qbG9uZyBHZXRTdGF0aWNMb25nRmllbGQoSk5JRW52ICplbnYsIGpjbGFzcyBfY2xhenosIGpmaWVsZElEIGZpZWxkSUQpIHsKLQotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICBKYXZhRmllbGQqIGZpZWxkID0gKEphdmFGaWVsZCopZmllbGRJRDsKLSAgamxvbmcgcmVzID0gKGpsb25nKWZpZWxkLT5nZXRTdGF0aWNMb25nRmllbGQoKTsKLSAgUkVUVVJOX0ZST01fSk5JKHJlcyk7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLWpmbG9hdCBHZXRTdGF0aWNGbG9hdEZpZWxkKEpOSUVudiAqZW52LCBqY2xhc3MgX2NsYXp6LCBqZmllbGRJRCBmaWVsZElEKSB7Ci0KLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgSmF2YUZpZWxkKiBmaWVsZCA9IChKYXZhRmllbGQqKWZpZWxkSUQ7Ci0gIGpmbG9hdCByZXMgPSAoamZsb2F0KWZpZWxkLT5nZXRTdGF0aWNGbG9hdEZpZWxkKCk7Ci0gIFJFVFVSTl9GUk9NX0pOSShyZXMpOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIFJFVFVSTl9GUk9NX0pOSSgwKTsKLX0KLQotCi1qZG91YmxlIEdldFN0YXRpY0RvdWJsZUZpZWxkKEpOSUVudiAqZW52LCBqY2xhc3MgX2NsYXp6LCBqZmllbGRJRCBmaWVsZElEKSB7Ci0KLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotCi0gIEphdmFGaWVsZCogZmllbGQgPSAoSmF2YUZpZWxkKilmaWVsZElEOwotICBqZG91YmxlIHJlcyA9IChqZG91YmxlKWZpZWxkLT5nZXRTdGF0aWNEb3VibGVGaWVsZCgpOwotICBSRVRVUk5fRlJPTV9KTkkocmVzKTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICBSRVRVUk5fRlJPTV9KTkkoMCk7Ci19Ci0KLQotdm9pZCBTZXRTdGF0aWNPYmplY3RGaWVsZChKTklFbnYgKmVudiwgamNsYXNzIF9jbGF6eiwgamZpZWxkSUQgZmllbGRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgam9iamVjdCBfdmFsdWUpIHsKLQotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICAvLyBMb2NhbCBvYmplY3QgcmVmZXJlbmNlcy4KLSAgSmF2YU9iamVjdCogdmFsdWUgPSAqKEphdmFPYmplY3QqKilfdmFsdWU7Ci0gIGxsdm1fZ2Nyb290KHZhbHVlLCAwKTsKLQotICBKYXZhRmllbGQqIGZpZWxkID0gKEphdmFGaWVsZCopZmllbGRJRDsKLSAgZmllbGQtPnNldFN0YXRpY09iamVjdEZpZWxkKHZhbHVlKTsKLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotICAKLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotfQotCi0KLXZvaWQgU2V0U3RhdGljQm9vbGVhbkZpZWxkKEpOSUVudiAqZW52LCBqY2xhc3MgX2NsYXp6LCBqZmllbGRJRCBmaWVsZElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgamJvb2xlYW4gdmFsdWUpIHsKLSAgCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgCi0gIEphdmFGaWVsZCogZmllbGQgPSAoSmF2YUZpZWxkKilmaWVsZElEOwotICBmaWVsZC0+c2V0U3RhdGljSW50OEZpZWxkKCh1aW50OCl2YWx1ZSk7Ci0gIAotICBSRVRVUk5fVk9JRF9GUk9NX0pOSTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICAKLSAgUkVUVVJOX1ZPSURfRlJPTV9KTkk7Ci19Ci0KLQotdm9pZCBTZXRTdGF0aWNCeXRlRmllbGQoSk5JRW52ICplbnYsIGpjbGFzcyBfY2xhenosIGpmaWVsZElEIGZpZWxkSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBqYnl0ZSB2YWx1ZSkgewotCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLQotICBKYXZhRmllbGQqIGZpZWxkID0gKEphdmFGaWVsZCopZmllbGRJRDsKLSAgZmllbGQtPnNldFN0YXRpY0ludDhGaWVsZCgoc2ludDgpdmFsdWUpOwotICAKLSAgUkVUVVJOX1ZPSURfRlJPTV9KTkk7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotfQotCi0KLXZvaWQgU2V0U3RhdGljQ2hhckZpZWxkKEpOSUVudiAqZW52LCBqY2xhc3MgX2NsYXp6LCBqZmllbGRJRCBmaWVsZElELAotICAgICAgICAgICAgICAgICAgICAgICAgamNoYXIgdmFsdWUpIHsKLQotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICBKYXZhRmllbGQqIGZpZWxkID0gKEphdmFGaWVsZCopZmllbGRJRDsKLSAgZmllbGQtPnNldFN0YXRpY0ludDE2RmllbGQoKHVpbnQxNil2YWx1ZSk7Ci0gIAotICBSRVRVUk5fVk9JRF9GUk9NX0pOSTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICAKLSAgUkVUVVJOX1ZPSURfRlJPTV9KTkk7Ci19Ci0KLQotdm9pZCBTZXRTdGF0aWNTaG9ydEZpZWxkKEpOSUVudiAqZW52LCBqY2xhc3MgX2NsYXp6LCBqZmllbGRJRCBmaWVsZElELAotICAgICAgICAgICAgICAgICAgICAgICAgIGpzaG9ydCB2YWx1ZSkgewotCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgCi0gIEphdmFGaWVsZCogZmllbGQgPSAoSmF2YUZpZWxkKilmaWVsZElEOwotICBmaWVsZC0+c2V0U3RhdGljSW50MTZGaWVsZCgoc2ludDE2KXZhbHVlKTsKLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIAotICBSRVRVUk5fVk9JRF9GUk9NX0pOSTsKLX0KLQotCi12b2lkIFNldFN0YXRpY0ludEZpZWxkKEpOSUVudiAqZW52LCBqY2xhc3MgX2NsYXp6LCBqZmllbGRJRCBmaWVsZElELAotICAgICAgICAgICAgICAgICAgICAgICBqaW50IHZhbHVlKSB7Ci0KLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgSmF2YUZpZWxkKiBmaWVsZCA9IChKYXZhRmllbGQqKWZpZWxkSUQ7Ci0gIGZpZWxkLT5zZXRTdGF0aWNJbnQzMkZpZWxkKChzaW50MzIpdmFsdWUpOwotICAKLSAgUkVUVVJOX1ZPSURfRlJPTV9KTkk7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotfQotCi0KLXZvaWQgU2V0U3RhdGljTG9uZ0ZpZWxkKEpOSUVudiAqZW52LCBqY2xhc3MgX2NsYXp6LCBqZmllbGRJRCBmaWVsZElELAotICAgICAgICAgICAgICAgICAgICAgICAgamxvbmcgdmFsdWUpIHsKLQotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICBKYXZhRmllbGQqIGZpZWxkID0gKEphdmFGaWVsZCopZmllbGRJRDsKLSAgZmllbGQtPnNldFN0YXRpY0xvbmdGaWVsZCgoc2ludDY0KXZhbHVlKTsKLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIAotICBSRVRVUk5fVk9JRF9GUk9NX0pOSTsKLX0KLQotCi12b2lkIFNldFN0YXRpY0Zsb2F0RmllbGQoSk5JRW52ICplbnYsIGpjbGFzcyBfY2xhenosIGpmaWVsZElEIGZpZWxkSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0IHZhbHVlKSB7Ci0KLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgSmF2YUZpZWxkKiBmaWVsZCA9IChKYXZhRmllbGQqKWZpZWxkSUQ7Ci0gIGZpZWxkLT5zZXRTdGF0aWNGbG9hdEZpZWxkKChmbG9hdCl2YWx1ZSk7Ci0gIAotICBSRVRVUk5fVk9JRF9GUk9NX0pOSTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICAKLSAgUkVUVVJOX1ZPSURfRlJPTV9KTkk7Ci19Ci0KLQotdm9pZCBTZXRTdGF0aWNEb3VibGVGaWVsZChKTklFbnYgKmVudiwgamNsYXNzIF9jbGF6eiwgamZpZWxkSUQgZmllbGRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgamRvdWJsZSB2YWx1ZSkgewotCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgCi0gIEphdmFGaWVsZCogZmllbGQgPSAoSmF2YUZpZWxkKilmaWVsZElEOwotICBmaWVsZC0+c2V0U3RhdGljRG91YmxlRmllbGQoKGRvdWJsZSl2YWx1ZSk7Ci0gIAotICBSRVRVUk5fVk9JRF9GUk9NX0pOSTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotfQotCi0KLWpzdHJpbmcgTmV3U3RyaW5nKEpOSUVudiAqZW52LCBjb25zdCBqY2hhciAqYnVmLCBqc2l6ZSBsZW4pIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotICByZXR1cm4gMDsKLX0KLQotCi1qc2l6ZSBHZXRTdHJpbmdMZW5ndGgoSk5JRW52ICplbnYsIGpzdHJpbmcgc3RyKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotY29uc3QgamNoYXIgKkdldFN0cmluZ0NoYXJzKEpOSUVudiAqZW52LCBqc3RyaW5nIHN0ciwgamJvb2xlYW4gKmlzQ29weSkgewotICBmcHJpbnRmKHN0ZGVyciwgIkltcGxlbWVudCBtZVxuIik7Ci0gIGFib3J0KCk7Ci0gIHJldHVybiAwOwotfQotCi0KLXZvaWQgUmVsZWFzZVN0cmluZ0NoYXJzKEpOSUVudiAqZW52LCBqc3RyaW5nIHN0ciwgY29uc3QgamNoYXIgKmNoYXJzKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLX0KLQotCi1qc3RyaW5nIE5ld1N0cmluZ1VURihKTklFbnYgKmVudiwgY29uc3QgY2hhciAqYnl0ZXMpIHsKLQotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0KLSAgSmF2YU9iamVjdCogb2JqID0gTlVMTDsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLQotICBKYXZhVGhyZWFkKiB0aCA9IEphdmFUaHJlYWQ6OmdldCgpOwotICBKbmp2bSogdm0gPSB0aC0+Z2V0SlZNKCk7Ci0gIG9iaiA9IHZtLT5hc2NpaXpUb1N0cihieXRlcyk7Ci0gIGpzdHJpbmcgcmV0ID0gKGpzdHJpbmcpdGgtPnB1c2hKTklSZWYob2JqKTsKLSAgUkVUVVJOX0ZST01fSk5JKHJldCk7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLWpzaXplIEdldFN0cmluZ1VURkxlbmd0aCAoSk5JRW52ICplbnYsIGpzdHJpbmcgc3RyaW5nKSB7ICAgCi0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotY29uc3QgY2hhciAqR2V0U3RyaW5nVVRGQ2hhcnMoSk5JRW52ICplbnYsIGpzdHJpbmcgX3N0cmluZywgamJvb2xlYW4gKmlzQ29weSkgewotCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgCi0gIC8vIExvY2FsIG9iamVjdCByZWZlcmVuY2VzLgotICBKYXZhU3RyaW5nKiBzdHJpbmcgPSAqKEphdmFTdHJpbmcqKilfc3RyaW5nOwotICBsbHZtX2djcm9vdChzdHJpbmcsIDApOwotCi0gIGlmIChpc0NvcHkgIT0gMCkgKCppc0NvcHkpID0gdHJ1ZTsKLSAgY29uc3QgY2hhciogcmVzID0gSmF2YVN0cmluZzo6c3RyVG9Bc2NpaXooc3RyaW5nKTsKLSAgUkVUVVJOX0ZST01fSk5JKHJlcyk7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLXZvaWQgUmVsZWFzZVN0cmluZ1VURkNoYXJzKEpOSUVudiAqZW52LCBqc3RyaW5nIF9zdHJpbmcsIGNvbnN0IGNoYXIgKnV0ZikgewotICBkZWxldGVbXSB1dGY7Ci19Ci0KLQotanNpemUgR2V0QXJyYXlMZW5ndGgoSk5JRW52ICplbnYsIGphcnJheSBfYXJyYXkpIHsKLQotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICAvLyBMb2NhbCBvYmplY3QgcmVmZXJlbmNlcy4KLSAgSmF2YU9iamVjdCogYXJyYXkgPSAqKEphdmFPYmplY3QqKilfYXJyYXk7Ci0gIGxsdm1fZ2Nyb290KGFycmF5LCAwKTsKLQotICBSRVRVUk5fRlJPTV9KTkkoSmF2YUFycmF5OjpnZXRTaXplKGFycmF5KSk7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLWpvYmplY3RBcnJheSBOZXdPYmplY3RBcnJheShKTklFbnYgKmVudiwganNpemUgbGVuZ3RoLCBqY2xhc3MgX2VsZW1lbnRDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JqZWN0IF9pbml0aWFsRWxlbWVudCkgewotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICAvLyBMb2NhbCBvYmplY3QgcmVmZXJlbmNlcy4KLSAgSmF2YU9iamVjdCogZWxlbWVudENsYXNzID0gKihKYXZhT2JqZWN0KiopX2VsZW1lbnRDbGFzczsKLSAgSmF2YU9iamVjdCogaW5pdGlhbEVsZW1lbnQgPSBfaW5pdGlhbEVsZW1lbnQgPyAKLSAgICAqKEphdmFPYmplY3QqKilfaW5pdGlhbEVsZW1lbnQgOiAwOwotICBBcnJheU9iamVjdCogcmVzID0gMDsKLSAgbGx2bV9nY3Jvb3QoZWxlbWVudENsYXNzLCAwKTsKLSAgbGx2bV9nY3Jvb3QoaW5pdGlhbEVsZW1lbnQsIDApOwotICBsbHZtX2djcm9vdChyZXMsIDApOwotCi0gIEphdmFUaHJlYWQqIHRoID0gSmF2YVRocmVhZDo6Z2V0KCk7Ci0KLSAgaWYgKGxlbmd0aCA8IDApIHRoLT5nZXRKVk0oKS0+bmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24obGVuZ3RoKTsKLSAgCi0gIFVzZXJDb21tb25DbGFzcyogYmFzZSA9Ci0gICAgVXNlckNvbW1vbkNsYXNzOjpyZXNvbHZlZEltcGxDbGFzcyhlbGVtZW50Q2xhc3MsIHRydWUpOwotICBKbmp2bUNsYXNzTG9hZGVyKiBsb2FkZXIgPSBiYXNlLT5jbGFzc0xvYWRlcjsKLSAgY29uc3QgVVRGOCogbmFtZSA9IGJhc2UtPmdldE5hbWUoKTsKLSAgY29uc3QgVVRGOCogYXJyYXlOYW1lID0gbG9hZGVyLT5jb25zdHJ1Y3RBcnJheU5hbWUoMSwgbmFtZSk7Ci0gIFVzZXJDbGFzc0FycmF5KiBhcnJheSA9IGxvYWRlci0+Y29uc3RydWN0QXJyYXkoYXJyYXlOYW1lLCBiYXNlKTsKLSAgcmVzID0gKEFycmF5T2JqZWN0KilhcnJheS0+ZG9OZXcobGVuZ3RoKTsKLSAgCi0gIGlmIChpbml0aWFsRWxlbWVudCkgewotICAgIGZvciAoc2ludDMyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKLSAgICAgIEFycmF5T2JqZWN0OjpzZXRFbGVtZW50KHJlcywgaW5pdGlhbEVsZW1lbnQsIGkpOwotICAgIH0KLSAgfQotICAKLSAgam9iamVjdEFycmF5IHJldCA9IChqb2JqZWN0QXJyYXkpdGgtPnB1c2hKTklSZWYocmVzKTsKLSAgUkVUVVJOX0ZST01fSk5JKHJldCk7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLWpvYmplY3QgR2V0T2JqZWN0QXJyYXlFbGVtZW50KEpOSUVudiAqZW52LCBqb2JqZWN0QXJyYXkgX2FycmF5LCBqc2l6ZSBpbmRleCkgewotICAKLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEFycmF5T2JqZWN0KiBhcnJheSA9ICooQXJyYXlPYmplY3QqKilfYXJyYXk7Ci0gIEphdmFPYmplY3QqIHJlcyA9IDA7Ci0gIGxsdm1fZ2Nyb290KGFycmF5LCAwKTsKLSAgbGx2bV9nY3Jvb3QocmVzLCAwKTsKLSAgCi0gIEphdmFUaHJlYWQqIHRoID0gSmF2YVRocmVhZDo6Z2V0KCk7Ci0gIAotICBpZiAoaW5kZXggPj0gQXJyYXlPYmplY3Q6OmdldFNpemUoYXJyYXkpKSB7Ci0gICAgdGgtPmdldEpWTSgpLT5pbmRleE91dE9mQm91bmRzKGFycmF5LCBpbmRleCk7Ci0gIH0KLSAgCi0gIC8vIFN0b3JlIGxvY2FsIHJlZmVyZXJlbmNlLgotICByZXMgPSBBcnJheU9iamVjdDo6Z2V0RWxlbWVudChhcnJheSwgaW5kZXgpOwotICAKLSAgam9iamVjdCByZXQgPSAoam9iamVjdCl0aC0+cHVzaEpOSVJlZihyZXMpOwotICBSRVRVUk5fRlJPTV9KTkkocmV0KTsKLSAgCi0gIEVORF9KTklfRVhDRVBUSU9OCi0KLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLXZvaWQgU2V0T2JqZWN0QXJyYXlFbGVtZW50KEpOSUVudiAqZW52LCBqb2JqZWN0QXJyYXkgX2FycmF5LCBqc2l6ZSBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYmplY3QgX3ZhbCkgewotICAKLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEFycmF5T2JqZWN0KiBhcnJheSA9ICooQXJyYXlPYmplY3QqKilfYXJyYXk7Ci0gIEphdmFPYmplY3QqIHZhbCA9ICooSmF2YU9iamVjdCoqKV92YWw7Ci0gIGxsdm1fZ2Nyb290KGFycmF5LCAwKTsKLSAgbGx2bV9nY3Jvb3QodmFsLCAwKTsKLQotICBpZiAoaW5kZXggPj0gQXJyYXlPYmplY3Q6OmdldFNpemUoYXJyYXkpKSB7Ci0gICAgbXlWTShlbnYpLT5pbmRleE91dE9mQm91bmRzKGFycmF5LCBpbmRleCk7Ci0gIH0KLSAgCi0gIC8vIFN0b3JlIGdsb2JhbCByZWZlcmVuY2UuCi0gIEFycmF5T2JqZWN0OjpzZXRFbGVtZW50KGFycmF5LCB2YWwsIGluZGV4KTsKLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIAotICBSRVRVUk5fVk9JRF9GUk9NX0pOSTsKLX0KLQotCi1qYm9vbGVhbkFycmF5IE5ld0Jvb2xlYW5BcnJheShKTklFbnYgKmVudiwganNpemUgbGVuKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICBKYXZhT2JqZWN0KiByZXMgPSBOVUxMOwotICBsbHZtX2djcm9vdChyZXMsIDApOwotICAKLSAgSmF2YVRocmVhZCogdGggPSBKYXZhVGhyZWFkOjpnZXQoKTsKLSAgcmVzID0gdGgtPmdldEpWTSgpLT51cGNhbGxzLT5BcnJheU9mQm9vbC0+ZG9OZXcobGVuKTsKLSAgamJvb2xlYW5BcnJheSByZXQgPSAoamJvb2xlYW5BcnJheSl0aC0+cHVzaEpOSVJlZihyZXMpOwotICBSRVRVUk5fRlJPTV9KTkkocmV0KTsKLQotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIFJFVFVSTl9GUk9NX0pOSSgwKTsKLX0KLQotCi1qYnl0ZUFycmF5IE5ld0J5dGVBcnJheShKTklFbnYgKmVudiwganNpemUgbGVuKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICBKYXZhT2JqZWN0KiByZXMgPSBOVUxMOwotICBsbHZtX2djcm9vdChyZXMsIDApOwotCi0gIEphdmFUaHJlYWQqIHRoID0gSmF2YVRocmVhZDo6Z2V0KCk7Ci0gIHJlcyA9IHRoLT5nZXRKVk0oKS0+dXBjYWxscy0+QXJyYXlPZkJ5dGUtPmRvTmV3KGxlbik7Ci0gIGpieXRlQXJyYXkgcmV0ID0gKGpieXRlQXJyYXkpdGgtPnB1c2hKTklSZWYocmVzKTsKLSAgUkVUVVJOX0ZST01fSk5JKHJldCk7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLWpjaGFyQXJyYXkgTmV3Q2hhckFycmF5KEpOSUVudiAqZW52LCBqc2l6ZSBsZW4pIHsKLSAgCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLQotICBKYXZhT2JqZWN0KiByZXMgPSBOVUxMOwotICBsbHZtX2djcm9vdChyZXMsIDApOwotICAKLSAgSmF2YVRocmVhZCogdGggPSBKYXZhVGhyZWFkOjpnZXQoKTsKLSAgcmVzID0gdGgtPmdldEpWTSgpLT51cGNhbGxzLT5BcnJheU9mQ2hhci0+ZG9OZXcobGVuKTsKLSAgamNoYXJBcnJheSByZXQgPSAoamNoYXJBcnJheSl0aC0+cHVzaEpOSVJlZihyZXMpOwotICBSRVRVUk5fRlJPTV9KTkkocmV0KTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICBSRVRVUk5fRlJPTV9KTkkoMCk7Ci19Ci0KLQotanNob3J0QXJyYXkgTmV3U2hvcnRBcnJheShKTklFbnYgKmVudiwganNpemUgbGVuKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0KLSAgSmF2YU9iamVjdCogcmVzID0gTlVMTDsKLSAgbGx2bV9nY3Jvb3QocmVzLCAwKTsKLSAgCi0gIEphdmFUaHJlYWQqIHRoID0gSmF2YVRocmVhZDo6Z2V0KCk7Ci0gIHJlcyA9IHRoLT5nZXRKVk0oKS0+dXBjYWxscy0+QXJyYXlPZlNob3J0LT5kb05ldyhsZW4pOwotICBqc2hvcnRBcnJheSByZXQgPSAoanNob3J0QXJyYXkpdGgtPnB1c2hKTklSZWYocmVzKTsKLSAgUkVUVVJOX0ZST01fSk5JKHJldCk7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLWppbnRBcnJheSBOZXdJbnRBcnJheShKTklFbnYgKmVudiwganNpemUgbGVuKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0KLSAgSmF2YU9iamVjdCogcmVzID0gTlVMTDsKLSAgbGx2bV9nY3Jvb3QocmVzLCAwKTsKLSAgCi0gIEphdmFUaHJlYWQqIHRoID0gSmF2YVRocmVhZDo6Z2V0KCk7Ci0gIHJlcyA9IHRoLT5nZXRKVk0oKS0+dXBjYWxscy0+QXJyYXlPZkludC0+ZG9OZXcobGVuKTsKLSAgamludEFycmF5IHJldCA9IChqaW50QXJyYXkpdGgtPnB1c2hKTklSZWYocmVzKTsKLSAgUkVUVVJOX0ZST01fSk5JKHJldCk7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLWpsb25nQXJyYXkgTmV3TG9uZ0FycmF5KEpOSUVudiAqZW52LCBqc2l6ZSBsZW4pIHsKLSAgCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLQotICBKYXZhT2JqZWN0KiByZXMgPSBOVUxMOwotICBsbHZtX2djcm9vdChyZXMsIDApOwotICAKLSAgSmF2YVRocmVhZCogdGggPSBKYXZhVGhyZWFkOjpnZXQoKTsKLSAgcmVzID0gdGgtPmdldEpWTSgpLT51cGNhbGxzLT5BcnJheU9mTG9uZy0+ZG9OZXcobGVuKTsKLSAgamxvbmdBcnJheSByZXQgPSAoamxvbmdBcnJheSl0aC0+cHVzaEpOSVJlZihyZXMpOwotICBSRVRVUk5fRlJPTV9KTkkocmV0KTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICBSRVRVUk5fRlJPTV9KTkkoMCk7Ci19Ci0KLQotamZsb2F0QXJyYXkgTmV3RmxvYXRBcnJheShKTklFbnYgKmVudiwganNpemUgbGVuKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0KLSAgSmF2YU9iamVjdCogcmVzID0gTlVMTDsKLSAgbGx2bV9nY3Jvb3QocmVzLCAwKTsKLSAgCi0gIEphdmFUaHJlYWQqIHRoID0gSmF2YVRocmVhZDo6Z2V0KCk7Ci0gIHJlcyA9IHRoLT5nZXRKVk0oKS0+dXBjYWxscy0+QXJyYXlPZkZsb2F0LT5kb05ldyhsZW4pOwotICBqZmxvYXRBcnJheSByZXQgPSAoamZsb2F0QXJyYXkpdGgtPnB1c2hKTklSZWYocmVzKTsKLSAgUkVUVVJOX0ZST01fSk5JKHJldCk7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLWpkb3VibGVBcnJheSBOZXdEb3VibGVBcnJheShKTklFbnYgKmVudiwganNpemUgbGVuKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0KLSAgSmF2YU9iamVjdCogcmVzID0gTlVMTDsKLSAgbGx2bV9nY3Jvb3QocmVzLCAwKTsKLSAgCi0gIEphdmFUaHJlYWQqIHRoID0gSmF2YVRocmVhZDo6Z2V0KCk7Ci0gIHJlcyA9IHRoLT5nZXRKVk0oKS0+dXBjYWxscy0+QXJyYXlPZkRvdWJsZS0+ZG9OZXcobGVuKTsKLSAgamRvdWJsZUFycmF5IHJldCA9IChqZG91YmxlQXJyYXkpdGgtPnB1c2hKTklSZWYocmVzKTsKLSAgUkVUVVJOX0ZST01fSk5JKHJldCk7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLWpib29sZWFuKiBHZXRCb29sZWFuQXJyYXlFbGVtZW50cyhKTklFbnYgKmVudiwgamJvb2xlYW5BcnJheSBfYXJyYXksCi0JCQkJICAgICAgICAgICAgICAgICAgICAgICAgICBqYm9vbGVhbiAqaXNDb3B5KSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gCi0gIC8vIExvY2FsIG9iamVjdCByZWZlcmVuY2VzLgotICBBcnJheVVJbnQ4KiBhcnJheSA9ICooQXJyYXlVSW50OCoqKV9hcnJheTsKLSAgbGx2bV9nY3Jvb3QoYXJyYXksIDApOwotCi0gIGlmIChpc0NvcHkpICgqaXNDb3B5KSA9IHRydWU7Ci0KLSAgc2ludDMyIGxlbiA9IEFycmF5VUludDg6OmdldFNpemUoYXJyYXkpICogc2l6ZW9mKHVpbnQ4KTsKLSAgdm9pZCogYnVmZmVyID0gbWFsbG9jKGxlbik7Ci0gIG1lbWNweShidWZmZXIsIEFycmF5VUludDg6OmdldEVsZW1lbnRzKGFycmF5KSwgbGVuKTsKLQotICBSRVRVUk5fRlJPTV9KTkkoKGpib29sZWFuKilidWZmZXIpOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIFJFVFVSTl9GUk9NX0pOSSgwKTsKLX0KLQotCi1qYnl0ZSAqR2V0Qnl0ZUFycmF5RWxlbWVudHMoSk5JRW52ICplbnYsIGpieXRlQXJyYXkgX2FycmF5LCBqYm9vbGVhbiAqaXNDb3B5KSB7Ci0KLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotCi0gIC8vIExvY2FsIG9iamVjdCByZWZlcmVuY2VzLgotICBBcnJheVNJbnQ4KiBhcnJheSA9ICooQXJyYXlTSW50OCoqKV9hcnJheTsKLSAgbGx2bV9nY3Jvb3QoYXJyYXksIDApOwotCi0gIGlmIChpc0NvcHkpICgqaXNDb3B5KSA9IHRydWU7Ci0KLSAgc2ludDMyIGxlbiA9IEFycmF5U0ludDg6OmdldFNpemUoYXJyYXkpICogc2l6ZW9mKHVpbnQ4KTsKLSAgdm9pZCogYnVmZmVyID0gbWFsbG9jKGxlbik7Ci0gIG1lbWNweShidWZmZXIsIEFycmF5U0ludDg6OmdldEVsZW1lbnRzKGFycmF5KSwgbGVuKTsKLQotICBSRVRVUk5fRlJPTV9KTkkoKGpieXRlKilidWZmZXIpOwotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIFJFVFVSTl9GUk9NX0pOSSgwKTsKLX0KLQotCi1qY2hhciAqR2V0Q2hhckFycmF5RWxlbWVudHMoSk5JRW52ICplbnYsIGpjaGFyQXJyYXkgX2FycmF5LCBqYm9vbGVhbiAqaXNDb3B5KSB7Ci0KLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEFycmF5VUludDE2KiBhcnJheSA9ICooQXJyYXlVSW50MTYqKilfYXJyYXk7Ci0gIGxsdm1fZ2Nyb290KGFycmF5LCAwKTsKLQotICBpZiAoaXNDb3B5KSAoKmlzQ29weSkgPSB0cnVlOwotCi0gIHNpbnQzMiBsZW4gPSBBcnJheVVJbnQxNjo6Z2V0U2l6ZShhcnJheSkgKiBzaXplb2YodWludDE2KTsKLSAgdm9pZCogYnVmZmVyID0gbWFsbG9jKGxlbik7Ci0gIG1lbWNweShidWZmZXIsIEFycmF5VUludDE2OjpnZXRFbGVtZW50cyhhcnJheSksIGxlbik7Ci0KLSAgUkVUVVJOX0ZST01fSk5JKChqY2hhciopYnVmZmVyKTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICBSRVRVUk5fRlJPTV9KTkkoMCk7Ci19Ci0KLQotanNob3J0ICpHZXRTaG9ydEFycmF5RWxlbWVudHMoSk5JRW52ICplbnYsIGpzaG9ydEFycmF5IF9hcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpib29sZWFuICppc0NvcHkpIHsKLSAgCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgCi0gIC8vIExvY2FsIG9iamVjdCByZWZlcmVuY2VzLgotICBBcnJheVNJbnQxNiogYXJyYXkgPSAqKEFycmF5U0ludDE2KiopX2FycmF5OwotICBsbHZtX2djcm9vdChhcnJheSwgMCk7Ci0gIAotICBpZiAoaXNDb3B5KSAoKmlzQ29weSkgPSB0cnVlOwotCi0gIHNpbnQzMiBsZW4gPSBBcnJheVNJbnQxNjo6Z2V0U2l6ZShhcnJheSkgKiBzaXplb2Yoc2ludDE2KTsKLSAgdm9pZCogYnVmZmVyID0gbWFsbG9jKGxlbik7Ci0gIG1lbWNweShidWZmZXIsIEFycmF5U0ludDE2OjpnZXRFbGVtZW50cyhhcnJheSksIGxlbik7Ci0KLSAgUkVUVVJOX0ZST01fSk5JKChqc2hvcnQqKWJ1ZmZlcik7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLWppbnQgKkdldEludEFycmF5RWxlbWVudHMoSk5JRW52ICplbnYsIGppbnRBcnJheSBfYXJyYXksIGpib29sZWFuICppc0NvcHkpIHsKLQotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICAvLyBMb2NhbCBvYmplY3QgcmVmZXJlbmNlcy4KLSAgQXJyYXlTSW50MzIqIGFycmF5ID0gKihBcnJheVNJbnQzMioqKV9hcnJheTsKLSAgbGx2bV9nY3Jvb3QoYXJyYXksIDApOwotCi0gIGlmIChpc0NvcHkpICgqaXNDb3B5KSA9IHRydWU7Ci0KLSAgc2ludDMyIGxlbiA9IEFycmF5U0ludDMyOjpnZXRTaXplKGFycmF5KSAqIHNpemVvZihzaW50MzIpOwotICB2b2lkKiBidWZmZXIgPSBtYWxsb2MobGVuKTsKLSAgbWVtY3B5KGJ1ZmZlciwgQXJyYXlTSW50MzI6OmdldEVsZW1lbnRzKGFycmF5KSwgbGVuKTsKLQotICBSRVRVUk5fRlJPTV9KTkkoKGppbnQqKWJ1ZmZlcik7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLWpsb25nICpHZXRMb25nQXJyYXlFbGVtZW50cyhKTklFbnYgKmVudiwgamxvbmdBcnJheSBfYXJyYXksIGpib29sZWFuICppc0NvcHkpIHsKLQotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICAvLyBMb2NhbCBvYmplY3QgcmVmZXJlbmNlcy4KLSAgQXJyYXlMb25nKiBhcnJheSA9ICooQXJyYXlMb25nKiopX2FycmF5OwotICBsbHZtX2djcm9vdChhcnJheSwgMCk7Ci0KLSAgaWYgKGlzQ29weSkgKCppc0NvcHkpID0gdHJ1ZTsKLQotICBzaW50MzIgbGVuID0gQXJyYXlMb25nOjpnZXRTaXplKGFycmF5KSAqIHNpemVvZihzaW50NjQpOwotICB2b2lkKiBidWZmZXIgPSBtYWxsb2MobGVuKTsKLSAgbWVtY3B5KGJ1ZmZlciwgQXJyYXlMb25nOjpnZXRFbGVtZW50cyhhcnJheSksIGxlbik7Ci0KLSAgUkVUVVJOX0ZST01fSk5JKChqbG9uZyopYnVmZmVyKTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICBSRVRVUk5fRlJPTV9KTkkoMCk7Ci19Ci0KLQotamZsb2F0ICpHZXRGbG9hdEFycmF5RWxlbWVudHMoSk5JRW52ICplbnYsIGpmbG9hdEFycmF5IF9hcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpib29sZWFuICppc0NvcHkpIHsKLQotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICAvLyBMb2NhbCBvYmplY3QgcmVmZXJlbmNlcy4KLSAgQXJyYXlGbG9hdCogYXJyYXkgPSAqKEFycmF5RmxvYXQqKilfYXJyYXk7Ci0gIGxsdm1fZ2Nyb290KGFycmF5LCAwKTsKLQotICBpZiAoaXNDb3B5KSAoKmlzQ29weSkgPSB0cnVlOwotCi0gIHNpbnQzMiBsZW4gPSBBcnJheUZsb2F0OjpnZXRTaXplKGFycmF5KSAqIHNpemVvZihmbG9hdCk7Ci0gIHZvaWQqIGJ1ZmZlciA9IG1hbGxvYyhsZW4pOwotICBtZW1jcHkoYnVmZmVyLCBBcnJheUZsb2F0OjpnZXRFbGVtZW50cyhhcnJheSksIGxlbik7Ci0KLSAgUkVUVVJOX0ZST01fSk5JKChqZmxvYXQqKWJ1ZmZlcik7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLWpkb3VibGUgKkdldERvdWJsZUFycmF5RWxlbWVudHMoSk5JRW52ICplbnYsIGpkb3VibGVBcnJheSBfYXJyYXksCi0JCQkJamJvb2xlYW4gKmlzQ29weSkgewotICAKLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEFycmF5RG91YmxlKiBhcnJheSA9ICooQXJyYXlEb3VibGUqKilfYXJyYXk7Ci0gIGxsdm1fZ2Nyb290KGFycmF5LCAwKTsKLSAgCi0gIGlmIChpc0NvcHkpICgqaXNDb3B5KSA9IHRydWU7Ci0KLSAgc2ludDMyIGxlbiA9IEFycmF5RG91YmxlOjpnZXRTaXplKGFycmF5KSAqIHNpemVvZihkb3VibGUpOwotICB2b2lkKiBidWZmZXIgPSBtYWxsb2MobGVuKTsKLSAgbWVtY3B5KGJ1ZmZlciwgQXJyYXlEb3VibGU6OmdldEVsZW1lbnRzKGFycmF5KSwgbGVuKTsKLQotICBSRVRVUk5fRlJPTV9KTkkoKGpkb3VibGUqKWJ1ZmZlcik7Ci0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLXZvaWQgUmVsZWFzZUJvb2xlYW5BcnJheUVsZW1lbnRzKEpOSUVudiAqZW52LCBqYm9vbGVhbkFycmF5IF9hcnJheSwKLQkJCQkgamJvb2xlYW4gKmVsZW1zLCBqaW50IG1vZGUpIHsKLSAgCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgCi0gIEFycmF5VUludDgqIGFycmF5ID0gKihBcnJheVVJbnQ4KiopX2FycmF5OwotICBsbHZtX2djcm9vdChhcnJheSwgMCk7Ci0gIAotICBpZiAobW9kZSA9PSBKTklfQUJPUlQpIHsKLSAgICBmcmVlKGVsZW1zKTsKLSAgfSBlbHNlIHsKLSAgICBzaW50MzIgbGVuID0gQXJyYXlVSW50ODo6Z2V0U2l6ZShhcnJheSk7Ci0gICAgbWVtY3B5KEFycmF5VUludDg6OmdldEVsZW1lbnRzKGFycmF5KSwgZWxlbXMsIGxlbik7Ci0KLSAgICBpZiAobW9kZSA9PSAwKSBmcmVlKGVsZW1zKTsKLSAgfQotICAKLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotfQotCi0KLXZvaWQgUmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKEpOSUVudiAqZW52LCBqYnl0ZUFycmF5IF9hcnJheSwgamJ5dGUgKmVsZW1zLAotCQkJICAgICAgamludCBtb2RlKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0KLSAgQXJyYXlTSW50MTYqIGFycmF5ID0gKihBcnJheVNJbnQxNioqKV9hcnJheTsKLSAgbGx2bV9nY3Jvb3QoYXJyYXksIDApOwotICAKLSAgaWYgKG1vZGUgPT0gSk5JX0FCT1JUKSB7Ci0gICAgZnJlZShlbGVtcyk7Ci0gIH0gZWxzZSB7Ci0gICAgc2ludDMyIGxlbiA9IEFycmF5U0ludDE2OjpnZXRTaXplKGFycmF5KTsKLSAgICBtZW1jcHkoQXJyYXlTSW50MTY6OmdldEVsZW1lbnRzKGFycmF5KSwgZWxlbXMsIGxlbik7Ci0KLSAgICBpZiAobW9kZSA9PSAwKSBmcmVlKGVsZW1zKTsKLSAgfQotICAKLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotfQotCi0KLXZvaWQgUmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKEpOSUVudiAqZW52LCBqY2hhckFycmF5IF9hcnJheSwgamNoYXIgKmVsZW1zLAotCQkJICAgICAgamludCBtb2RlKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0KLSAgQXJyYXlVSW50MTYqIGFycmF5ID0gKihBcnJheVVJbnQxNioqKV9hcnJheTsKLSAgbGx2bV9nY3Jvb3QoYXJyYXksIDApOwotCi0gIGlmIChtb2RlID09IEpOSV9BQk9SVCkgewotICAgIGZyZWUoZWxlbXMpOwotICB9IGVsc2UgewotICAgIHNpbnQzMiBsZW4gPSBBcnJheVVJbnQxNjo6Z2V0U2l6ZShhcnJheSkgPDwgMTsKLSAgICBtZW1jcHkoQXJyYXlVSW50MTY6OmdldEVsZW1lbnRzKGFycmF5KSwgZWxlbXMsIGxlbik7Ci0KLSAgICBpZiAobW9kZSA9PSAwKSBmcmVlKGVsZW1zKTsKLSAgfQotICAKLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotfQotCi0KLXZvaWQgUmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhKTklFbnYgKmVudiwganNob3J0QXJyYXkgX2FycmF5LCBqc2hvcnQgKmVsZW1zLAotCQkJICAgICAgIGppbnQgbW9kZSkgewotICAKLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotCi0gIEFycmF5U0ludDE2KiBhcnJheSA9ICooQXJyYXlTSW50MTYqKilfYXJyYXk7Ci0gIGxsdm1fZ2Nyb290KGFycmF5LCAwKTsKLSAgCi0gIGlmIChtb2RlID09IEpOSV9BQk9SVCkgewotICAgIGZyZWUoZWxlbXMpOwotICB9IGVsc2UgewotICAgIHNpbnQzMiBsZW4gPSBBcnJheVNJbnQxNjo6Z2V0U2l6ZShhcnJheSkgPDwgMTsKLSAgICBtZW1jcHkoQXJyYXlTSW50MTY6OmdldEVsZW1lbnRzKGFycmF5KSwgZWxlbXMsIGxlbik7Ci0KLSAgICBpZiAobW9kZSA9PSAwKSBmcmVlKGVsZW1zKTsKLSAgfQotICAKLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotfQotCi0KLXZvaWQgUmVsZWFzZUludEFycmF5RWxlbWVudHMoSk5JRW52ICplbnYsIGppbnRBcnJheSBfYXJyYXksIGppbnQgKmVsZW1zLAotCQkJICAgICBqaW50IG1vZGUpIHsKLSAgCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgICAKLSAgQXJyYXlTSW50MzIqIGFycmF5ID0gKihBcnJheVNJbnQzMioqKV9hcnJheTsKLSAgbGx2bV9nY3Jvb3QoYXJyYXksIDApOwotICAKLSAgaWYgKG1vZGUgPT0gSk5JX0FCT1JUKSB7Ci0gICAgZnJlZShlbGVtcyk7Ci0gIH0gZWxzZSB7Ci0gICAgc2ludDMyIGxlbiA9IEFycmF5U0ludDMyOjpnZXRTaXplKGFycmF5KSA8PCAyOwotICAgIG1lbWNweShBcnJheVNJbnQzMjo6Z2V0RWxlbWVudHMoYXJyYXkpLCBlbGVtcywgbGVuKTsKLQotICAgIGlmIChtb2RlID09IDApIGZyZWUoZWxlbXMpOwotICB9Ci0gIAotICBFTkRfSk5JX0VYQ0VQVElPTgotICAKLSAgUkVUVVJOX1ZPSURfRlJPTV9KTkk7Ci19Ci0KLQotdm9pZCBSZWxlYXNlTG9uZ0FycmF5RWxlbWVudHMoSk5JRW52ICplbnYsIGpsb25nQXJyYXkgX2FycmF5LCBqbG9uZyAqZWxlbXMsCi0JCQkgICAgICBqaW50IG1vZGUpIHsKLSAgCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgICAKLSAgQXJyYXlMb25nKiBhcnJheSA9ICooQXJyYXlMb25nKiopX2FycmF5OwotICBsbHZtX2djcm9vdChhcnJheSwgMCk7Ci0gIAotICBpZiAobW9kZSA9PSBKTklfQUJPUlQpIHsKLSAgICBmcmVlKGVsZW1zKTsKLSAgfSBlbHNlIHsKLSAgICBzaW50MzIgbGVuID0gQXJyYXlMb25nOjpnZXRTaXplKGFycmF5KSA8PCAzOwotICAgIG1lbWNweShBcnJheUxvbmc6OmdldEVsZW1lbnRzKGFycmF5KSwgZWxlbXMsIGxlbik7Ci0KLSAgICBpZiAobW9kZSA9PSAwKSBmcmVlKGVsZW1zKTsKLSAgfQotICAKLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotfQotCi0KLXZvaWQgUmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhKTklFbnYgKmVudiwgamZsb2F0QXJyYXkgX2FycmF5LCBqZmxvYXQgKmVsZW1zLAotCQkJICAgICAgIGppbnQgbW9kZSkgewotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gICAgCi0gIEFycmF5RmxvYXQqIGFycmF5ID0gKihBcnJheUZsb2F0KiopX2FycmF5OwotICBsbHZtX2djcm9vdChhcnJheSwgMCk7Ci0gIAotICBpZiAobW9kZSA9PSBKTklfQUJPUlQpIHsKLSAgICBmcmVlKGVsZW1zKTsKLSAgfSBlbHNlIHsKLSAgICBzaW50MzIgbGVuID0gQXJyYXlGbG9hdDo6Z2V0U2l6ZShhcnJheSkgPDwgMjsKLSAgICBtZW1jcHkoQXJyYXlGbG9hdDo6Z2V0RWxlbWVudHMoYXJyYXkpLCBlbGVtcywgbGVuKTsKLQotICAgIGlmIChtb2RlID09IDApIGZyZWUoZWxlbXMpOwotICB9Ci0gIAotICBFTkRfSk5JX0VYQ0VQVElPTgotICAKLSAgUkVUVVJOX1ZPSURfRlJPTV9KTkk7Ci19Ci0KLQotdm9pZCBSZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhKTklFbnYgKmVudiwgamRvdWJsZUFycmF5IF9hcnJheSwKLQkJCQlqZG91YmxlICplbGVtcywgamludCBtb2RlKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gICAgCi0gIEFycmF5RG91YmxlKiBhcnJheSA9ICooQXJyYXlEb3VibGUqKilfYXJyYXk7Ci0gIGxsdm1fZ2Nyb290KGFycmF5LCAwKTsKLSAgCi0gIGlmIChtb2RlID09IEpOSV9BQk9SVCkgewotICAgIGZyZWUoZWxlbXMpOwotICB9IGVsc2UgewotICAgIHNpbnQzMiBsZW4gPSBBcnJheURvdWJsZTo6Z2V0U2l6ZShhcnJheSkgPDwgMzsKLSAgICBtZW1jcHkoQXJyYXlEb3VibGU6OmdldEVsZW1lbnRzKGFycmF5KSwgZWxlbXMsIGxlbik7Ci0KLSAgICBpZiAobW9kZSA9PSAwKSBmcmVlKGVsZW1zKTsKLSAgfQotICAKLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotfQotCi0KLXZvaWQgR2V0Qm9vbGVhbkFycmF5UmVnaW9uKEpOSUVudiAqZW52LCBqYm9vbGVhbkFycmF5IGFycmF5LCBqc2l6ZSBzdGFydCwKLQkJCSAgIGpzaXplIGxlbiwgamJvb2xlYW4gKmJ1ZikgewotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICBBcnJheVVJbnQ4KiBBcnJheSA9ICooQXJyYXlVSW50OCoqKWFycmF5OwotICBsbHZtX2djcm9vdChBcnJheSwgMCk7Ci0gIG1lbWNweShidWYsIEFycmF5VUludDg6OmdldEVsZW1lbnRzKEFycmF5KSArIHN0YXJ0LCBsZW4gKiBzaXplb2YodWludDgpKTsKLSAgCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIAotICBSRVRVUk5fVk9JRF9GUk9NX0pOSTsKLX0KLQotCi12b2lkIEdldEJ5dGVBcnJheVJlZ2lvbihKTklFbnYgKmVudiwgamJ5dGVBcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGxlbiwKLQkJCWpieXRlICpidWYpIHsKLSAgCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgCi0gIEFycmF5U0ludDgqIEFycmF5ID0gKihBcnJheVNJbnQ4KiopYXJyYXk7Ci0gIGxsdm1fZ2Nyb290KEFycmF5LCAwKTsKLSAgbWVtY3B5KGJ1ZiwgQXJyYXlTSW50ODo6Z2V0RWxlbWVudHMoQXJyYXkpICsgc3RhcnQsIGxlbiAqIHNpemVvZih1aW50OCkpOwotICAKLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotfQotCi0KLXZvaWQgR2V0Q2hhckFycmF5UmVnaW9uKEpOSUVudiAqZW52LCBqY2hhckFycmF5IGFycmF5LCBqc2l6ZSBzdGFydCwganNpemUgbGVuLAotCQkJamNoYXIgKmJ1ZikgewotICAKLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgQXJyYXlVSW50MTYqIEFycmF5ID0gKihBcnJheVVJbnQxNioqKWFycmF5OwotICBsbHZtX2djcm9vdChBcnJheSwgMCk7Ci0gIG1lbWNweShidWYsIEFycmF5VUludDE2OjpnZXRFbGVtZW50cyhBcnJheSkgKyBzdGFydCwgbGVuICogc2l6ZW9mKHVpbnQxNikpOwotICAKLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotfQotCi0KLXZvaWQgR2V0U2hvcnRBcnJheVJlZ2lvbihKTklFbnYgKmVudiwganNob3J0QXJyYXkgYXJyYXksIGpzaXplIHN0YXJ0LAotCQkJIGpzaXplIGxlbiwganNob3J0ICpidWYpIHsKLSAgCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgCi0gIEFycmF5U0ludDE2KiBBcnJheSA9ICooQXJyYXlTSW50MTYqKilhcnJheTsKLSAgbGx2bV9nY3Jvb3QoQXJyYXksIDApOwotICBtZW1jcHkoYnVmLCBBcnJheVNJbnQxNjo6Z2V0RWxlbWVudHMoQXJyYXkpICsgc3RhcnQsIGxlbiAqIHNpemVvZihzaW50MTYpKTsKLSAgCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIAotICBSRVRVUk5fVk9JRF9GUk9NX0pOSTsKLX0KLQotCi12b2lkIEdldEludEFycmF5UmVnaW9uKEpOSUVudiAqZW52LCBqaW50QXJyYXkgYXJyYXksIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sCi0JCSAgICAgICBqaW50ICpidWYpIHsKLSAgCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgCi0gIEFycmF5U0ludDMyKiBBcnJheSA9ICooQXJyYXlTSW50MzIqKilhcnJheTsKLSAgbGx2bV9nY3Jvb3QoQXJyYXksIDApOwotICBtZW1jcHkoYnVmLCBBcnJheVNJbnQzMjo6Z2V0RWxlbWVudHMoQXJyYXkpICsgc3RhcnQsIGxlbiAqIHNpemVvZihzaW50MzIpKTsKLSAgCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIAotICBSRVRVUk5fVk9JRF9GUk9NX0pOSTsKLX0KLQotCi12b2lkIEdldExvbmdBcnJheVJlZ2lvbihKTklFbnYgKmVudiwgamxvbmdBcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGxlbiwKLQkJICAgICAgICBqbG9uZyAqYnVmKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICBBcnJheUxvbmcqIEFycmF5ID0gKihBcnJheUxvbmcqKilhcnJheTsKLSAgbGx2bV9nY3Jvb3QoQXJyYXksIDApOwotICBtZW1jcHkoYnVmLCBBcnJheUxvbmc6OmdldEVsZW1lbnRzKEFycmF5KSArIHN0YXJ0LCBsZW4gKiBzaXplb2Yoc2ludDY0KSk7Ci0gIAotICBFTkRfSk5JX0VYQ0VQVElPTgotICAKLSAgUkVUVVJOX1ZPSURfRlJPTV9KTkk7Ci19Ci0KLQotdm9pZCBHZXRGbG9hdEFycmF5UmVnaW9uKEpOSUVudiAqZW52LCBqZmxvYXRBcnJheSBhcnJheSwganNpemUgc3RhcnQsCi0JCQkganNpemUgbGVuLCBqZmxvYXQgKmJ1ZikgewotICAKLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgQXJyYXlGbG9hdCogQXJyYXkgPSAqKEFycmF5RmxvYXQqKilhcnJheTsKLSAgbGx2bV9nY3Jvb3QoQXJyYXksIDApOwotICBtZW1jcHkoYnVmLCBBcnJheUZsb2F0OjpnZXRFbGVtZW50cyhBcnJheSkgKyBzdGFydCwgbGVuICogc2l6ZW9mKGZsb2F0KSk7Ci0gIAotICBFTkRfSk5JX0VYQ0VQVElPTgotICAKLSAgUkVUVVJOX1ZPSURfRlJPTV9KTkk7Ci19Ci0KLQotdm9pZCBHZXREb3VibGVBcnJheVJlZ2lvbihKTklFbnYgKmVudiwgamRvdWJsZUFycmF5IGFycmF5LCBqc2l6ZSBzdGFydCwKLQkJCSAganNpemUgbGVuLCBqZG91YmxlICpidWYpIHsKLSAgCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgCi0gIEFycmF5RG91YmxlKiBBcnJheSA9ICooQXJyYXlEb3VibGUqKilhcnJheTsKLSAgbGx2bV9nY3Jvb3QoQXJyYXksIDApOwotICBtZW1jcHkoYnVmLCBBcnJheURvdWJsZTo6Z2V0RWxlbWVudHMoQXJyYXkpICsgc3RhcnQsIGxlbiAqIHNpemVvZihkb3VibGUpKTsKLSAgCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIAotICBSRVRVUk5fVk9JRF9GUk9NX0pOSTsKLX0KLQotCi12b2lkIFNldEJvb2xlYW5BcnJheVJlZ2lvbihKTklFbnYgKmVudiwgamJvb2xlYW5BcnJheSBhcnJheSwganNpemUgc3RhcnQsCi0JCQkgICBqc2l6ZSBsZW4sIGNvbnN0IGpib29sZWFuICpidWYpIHsKLSAgCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgCi0gIEFycmF5VUludDgqIEFycmF5ID0gKihBcnJheVVJbnQ4KiopYXJyYXk7Ci0gIGxsdm1fZ2Nyb290KEFycmF5LCAwKTsKLSAgbWVtY3B5KEFycmF5VUludDg6OmdldEVsZW1lbnRzKEFycmF5KSArIHN0YXJ0LCBidWYsIGxlbiAqIHNpemVvZih1aW50OCkpOwotICAKLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotfQotCi0KLXZvaWQgU2V0Qnl0ZUFycmF5UmVnaW9uKEpOSUVudiAqZW52LCBqYnl0ZUFycmF5IGFycmF5LCBqc2l6ZSBzdGFydCwganNpemUgbGVuLAotCQkJICAgICAgICAgICAgICAgICAgY29uc3QgamJ5dGUgKmJ1ZikgewotICAKLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgQXJyYXlTSW50OCogQXJyYXkgPSAqKEFycmF5U0ludDgqKilhcnJheTsKLSAgbGx2bV9nY3Jvb3QoQXJyYXksIDApOwotICBtZW1jcHkoQXJyYXlTSW50ODo6Z2V0RWxlbWVudHMoQXJyYXkpICsgc3RhcnQsIGJ1ZiwgbGVuICogc2l6ZW9mKHNpbnQ4KSk7Ci0gIAotICBFTkRfSk5JX0VYQ0VQVElPTgotICAKLSAgUkVUVVJOX1ZPSURfRlJPTV9KTkk7Ci19Ci0KLQotdm9pZCBTZXRDaGFyQXJyYXlSZWdpb24oSk5JRW52ICplbnYsIGpjaGFyQXJyYXkgYXJyYXksIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sCi0JCQkgICAgICAgICAgICAgICAgICBjb25zdCBqY2hhciAqYnVmKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICBBcnJheVVJbnQxNiogQXJyYXkgPSAqKEFycmF5VUludDE2KiopYXJyYXk7Ci0gIGxsdm1fZ2Nyb290KEFycmF5LCAwKTsKLSAgbWVtY3B5KEFycmF5VUludDE2OjpnZXRFbGVtZW50cyhBcnJheSkgKyBzdGFydCwgYnVmLCBsZW4gKiBzaXplb2YodWludDE2KSk7Ci0gIAotICBFTkRfSk5JX0VYQ0VQVElPTgotICAKLSAgUkVUVVJOX1ZPSURfRlJPTV9KTkk7Ci19Ci0KLQotdm9pZCBTZXRTaG9ydEFycmF5UmVnaW9uKEpOSUVudiAqZW52LCBqc2hvcnRBcnJheSBhcnJheSwganNpemUgc3RhcnQsCi0JCQkgICAgICAgICAgICAgICAgICAganNpemUgbGVuLCBjb25zdCBqc2hvcnQgKmJ1ZikgewotICAKLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgQXJyYXlTSW50MTYqIEFycmF5ID0gKihBcnJheVNJbnQxNioqKWFycmF5OwotICBsbHZtX2djcm9vdChBcnJheSwgMCk7Ci0gIG1lbWNweShBcnJheVNJbnQxNjo6Z2V0RWxlbWVudHMoQXJyYXkpICsgc3RhcnQsIGJ1ZiwgbGVuICogc2l6ZW9mKHNpbnQxNikpOwotICAKLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotfQotCi0KLXZvaWQgU2V0SW50QXJyYXlSZWdpb24oSk5JRW52ICplbnYsIGppbnRBcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGxlbiwKLQkJICAgICAgICAgICAgICAgICAgIGNvbnN0IGppbnQgKmJ1ZikgewotICAKLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgQXJyYXlTSW50MzIqIEFycmF5ID0gKihBcnJheVNJbnQzMioqKWFycmF5OwotICBsbHZtX2djcm9vdChBcnJheSwgMCk7Ci0gIG1lbWNweShBcnJheVNJbnQzMjo6Z2V0RWxlbWVudHMoQXJyYXkpICsgc3RhcnQsIGJ1ZiwgbGVuICogc2l6ZW9mKHNpbnQzMikpOwotICAKLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotfQotCi0KLXZvaWQgU2V0TG9uZ0FycmF5UmVnaW9uKEpOSUVudiogZW52LCBqbG9uZ0FycmF5IGFycmF5LCBqc2l6ZSBzdGFydCwganNpemUgbGVuLAotCQkJICAgICAgICAgICAgICAgICAgY29uc3QgamxvbmcgKmJ1ZikgewotICAKLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgQXJyYXlMb25nKiBBcnJheSA9ICooQXJyYXlMb25nKiopYXJyYXk7Ci0gIGxsdm1fZ2Nyb290KEFycmF5LCAwKTsKLSAgbWVtY3B5KEFycmF5TG9uZzo6Z2V0RWxlbWVudHMoQXJyYXkpICsgc3RhcnQsIGJ1ZiwgbGVuICogc2l6ZW9mKHNpbnQ2NCkpOwotICAKLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotfQotCi0KLXZvaWQgU2V0RmxvYXRBcnJheVJlZ2lvbihKTklFbnYgKmVudiwgamZsb2F0QXJyYXkgYXJyYXksIGpzaXplIHN0YXJ0LAotCQkJICAgICAgICAgICAgICAgICAgIGpzaXplIGxlbiwgY29uc3QgamZsb2F0ICpidWYpIHsKLSAgCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgCi0gIEFycmF5RmxvYXQqIEFycmF5ID0gKihBcnJheUZsb2F0KiopYXJyYXk7Ci0gIGxsdm1fZ2Nyb290KEFycmF5LCAwKTsKLSAgbWVtY3B5KEFycmF5RmxvYXQ6OmdldEVsZW1lbnRzKEFycmF5KSArIHN0YXJ0LCBidWYsIGxlbiAqIHNpemVvZihmbG9hdCkpOwotICAKLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgCi0gIFJFVFVSTl9WT0lEX0ZST01fSk5JOwotfQotCi0KLXZvaWQgU2V0RG91YmxlQXJyYXlSZWdpb24oSk5JRW52ICplbnYsIGpkb3VibGVBcnJheSBhcnJheSwganNpemUgc3RhcnQsCi0JCQkgICAgICAgICAgICAgICAgICAgIGpzaXplIGxlbiwgY29uc3QgamRvdWJsZSAqYnVmKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICBBcnJheURvdWJsZSogQXJyYXkgPSAqKEFycmF5RG91YmxlKiopYXJyYXk7Ci0gIGxsdm1fZ2Nyb290KEFycmF5LCAwKTsKLSAgbWVtY3B5KEFycmF5RG91YmxlOjpnZXRFbGVtZW50cyhBcnJheSkgKyBzdGFydCwgYnVmLCBsZW4gKiBzaXplb2YoZG91YmxlKSk7Ci0gIAotICBFTkRfSk5JX0VYQ0VQVElPTgotICAKLSAgUkVUVVJOX1ZPSURfRlJPTV9KTkk7Ci19Ci0KLQotamludCBSZWdpc3Rlck5hdGl2ZXMoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgY29uc3QgSk5JTmF0aXZlTWV0aG9kICptZXRob2RzLAotCQkgICAgIGppbnQgbk1ldGhvZHMpIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotICByZXR1cm4gMDsKLX0KLQotCi1qaW50IFVucmVnaXN0ZXJOYXRpdmVzKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenopIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotICByZXR1cm4gMDsKLX0KLQotamludCBNb25pdG9yRW50ZXIoSk5JRW52ICplbnYsIGpvYmplY3QgX29iaikgewotICAKLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgSmF2YU9iamVjdCogT2JqID0gKihKYXZhT2JqZWN0KiopX29iajsKLSAgbGx2bV9nY3Jvb3QoT2JqLCAwKTsKLSAgCi0gIGlmIChPYmogIT0gTlVMTCkgewotICAgIEphdmFPYmplY3Q6OmFjcXVpcmUoT2JqKTsKLSAgICBSRVRVUk5fRlJPTV9KTkkoMCk7Ci0gIH0gZWxzZSB7Ci0gICAgUkVUVVJOX0ZST01fSk5JKC0xKTsKLSAgfQotCi0KLSAgRU5EX0pOSV9FWENFUFRJT04KLSAgUkVUVVJOX0ZST01fSk5JKC0xKTsKLX0KLQotCi1qaW50IE1vbml0b3JFeGl0KEpOSUVudiAqZW52LCBqb2JqZWN0IF9vYmopIHsKLQotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0KLSAgSmF2YU9iamVjdCogT2JqID0gKihKYXZhT2JqZWN0KiopX29iajsKLSAgbGx2bV9nY3Jvb3QoT2JqLCAwKTsKLSAKLSAgaWYgKE9iaiAhPSBOVUxMKSB7Ci0KLSAgICBpZiAoIUphdmFPYmplY3Q6Om93bmVyKE9iaikpIHsKLSAgICAgIG15Vk0oZW52KS0+aWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbihPYmopOyAgICAKLSAgICB9Ci0gIAotICAgIEphdmFPYmplY3Q6OnJlbGVhc2UoT2JqKTsKLSAgICBSRVRVUk5fRlJPTV9KTkkoMCk7Ci0gIH0gZWxzZSB7Ci0gICAgUkVUVVJOX0ZST01fSk5JKC0xKTsKLSAgfQotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIFJFVFVSTl9GUk9NX0pOSSgtMSk7Ci19Ci0KLQotamludCBHZXRKYXZhVk0oSk5JRW52ICplbnYsIEphdmFWTSAqKnZtKSB7Ci0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgKCp2bSkgPSAoSmF2YVZNKikodm9pZCopKCYobXlWTShlbnYpLT5qYXZhdm1FbnYpKTsKLSAgUkVUVVJOX0ZST01fSk5JKDApOwotICBFTkRfSk5JX0VYQ0VQVElPTgotICBSRVRVUk5fRlJPTV9KTkkoMCk7Ci19Ci0KLQotdm9pZCBHZXRTdHJpbmdSZWdpb24oSk5JRW52KiBlbnYsIGpzdHJpbmcgc3RyLCBqc2l6ZSBzdGFydCwganNpemUgbGVuLAotICAgICAgICAgICAgICAgICAgICAgamNoYXIgKmJ1ZikgewotICBmcHJpbnRmKHN0ZGVyciwgIkltcGxlbWVudCBtZVxuIik7Ci0gIGFib3J0KCk7Ci19Ci0KLQotdm9pZCBHZXRTdHJpbmdVVEZSZWdpb24oSk5JRW52KiBlbnYsIGpzdHJpbmcgc3RyLCBqc2l6ZSBzdGFydCwganNpemUgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYnVmKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLX0KLQotCi12b2lkICpHZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKEpOSUVudiAqZW52LCBqYXJyYXkgX2FycmF5LCBqYm9vbGVhbiAqaXNDb3B5KSB7Ci0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAgCi0gIEphdmFPYmplY3QqIGFycmF5ID0gKihKYXZhT2JqZWN0KiopX2FycmF5OwotICBsbHZtX2djcm9vdChhcnJheSwgMCk7Ci0KLSAgaWYgKGlzQ29weSkgKCppc0NvcHkpID0gdHJ1ZTsKLQotICBVc2VyQ2xhc3NBcnJheSogY2wgPSBKYXZhT2JqZWN0OjpnZXRDbGFzcyhhcnJheSktPmFzQXJyYXlDbGFzcygpOwotICB1aW50MzIgbG9nU2l6ZSA9IGNsLT5iYXNlQ2xhc3MoKS0+YXNQcmltaXRpdmVDbGFzcygpLT5sb2dTaXplOwotICBzaW50MzIgbGVuID0gSmF2YUFycmF5OjpnZXRTaXplKGFycmF5KSA8PCBsb2dTaXplOwotICB2b2lkKiBidWZmZXIgPSBtYWxsb2MobGVuKTsKLSAgbWVtY3B5KGJ1ZmZlciwgSmF2YUFycmF5OjpnZXRFbGVtZW50cyhhcnJheSksIGxlbik7Ci0KLSAgUkVUVVJOX0ZST01fSk5JKChqY2hhciopYnVmZmVyKTsKLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICBSRVRVUk5fRlJPTV9KTkkoMCk7Ci19Ci0KLQotdm9pZCBSZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChKTklFbnYgKmVudiwgamFycmF5IF9hcnJheSwgdm9pZCAqY2FycmF5LAotCQkJCSAgIGppbnQgbW9kZSkgewotICAKLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgSmF2YU9iamVjdCogYXJyYXkgPSAqKEphdmFPYmplY3QqKilfYXJyYXk7Ci0gIGxsdm1fZ2Nyb290KGFycmF5LCAwKTsKLQotICBpZiAobW9kZSA9PSBKTklfQUJPUlQpIHsKLSAgICBmcmVlKGNhcnJheSk7Ci0gIH0gZWxzZSB7Ci0gICAgVXNlckNsYXNzQXJyYXkqIGNsID0gSmF2YU9iamVjdDo6Z2V0Q2xhc3MoYXJyYXkpLT5hc0FycmF5Q2xhc3MoKTsKLSAgICB1aW50MzIgbG9nU2l6ZSA9IGNsLT5iYXNlQ2xhc3MoKS0+YXNQcmltaXRpdmVDbGFzcygpLT5sb2dTaXplOwotICAgIHNpbnQzMiBsZW4gPSBKYXZhQXJyYXk6OmdldFNpemUoYXJyYXkpIDw8IGxvZ1NpemU7Ci0gICAgbWVtY3B5KEphdmFBcnJheTo6Z2V0RWxlbWVudHMoYXJyYXkpLCBjYXJyYXksIGxlbik7Ci0KLSAgICBpZiAobW9kZSA9PSAwKSBmcmVlKGNhcnJheSk7Ci0gIH0KLSAgCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIAotICBSRVRVUk5fVk9JRF9GUk9NX0pOSTsKLX0KLQotCi1jb25zdCBqY2hhciAqR2V0U3RyaW5nQ3JpdGljYWwoSk5JRW52ICplbnYsIGpzdHJpbmcgc3RyaW5nLCBqYm9vbGVhbiAqaXNDb3B5KSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotdm9pZCBSZWxlYXNlU3RyaW5nQ3JpdGljYWwoSk5JRW52ICplbnYsIGpzdHJpbmcgc3RyaW5nLCBjb25zdCBqY2hhciAqY3N0cmluZykgewotICBmcHJpbnRmKHN0ZGVyciwgIkltcGxlbWVudCBtZVxuIik7Ci0gIGFib3J0KCk7Ci19Ci0KLQotandlYWsgTmV3V2Vha0dsb2JhbFJlZihKTklFbnYqIGVudiwgam9iamVjdCBvYmopIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotICByZXR1cm4gMDsKLX0KLQotCi12b2lkIERlbGV0ZVdlYWtHbG9iYWxSZWYoSk5JRW52KiBlbnYsIGp3ZWFrIHJlZikgewotICBmcHJpbnRmKHN0ZGVyciwgIkltcGxlbWVudCBtZVxuIik7Ci0gIGFib3J0KCk7Ci19Ci0KLQotam9iamVjdCBOZXdHbG9iYWxSZWYoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gICAgCi0gIEphdmFPYmplY3QqIE9iaiA9IE5VTEw7Ci0gIGxsdm1fZ2Nyb290KE9iaiwgMCk7Ci0gIAotICAvLyBMb2NhbCBvYmplY3QgcmVmZXJlbmNlcy4KLSAgaWYgKG9iaikgewotICAgIE9iaiA9ICooSmF2YU9iamVjdCoqKW9iajsKLSAgICBsbHZtX2djcm9vdChPYmosIDApOwotCi0gICAgSm5qdm0qIHZtID0gbXlWTShlbnYpOwotCi0gICAgdm0tPmdsb2JhbFJlZnNMb2NrLmxvY2soKTsKLSAgICBKYXZhT2JqZWN0KiogcmVzID0gdm0tPmdsb2JhbFJlZnMuYWRkSk5JUmVmZXJlbmNlKE9iaik7Ci0gICAgdm0tPmdsb2JhbFJlZnNMb2NrLnVubG9jaygpOwotCi0gICAgUkVUVVJOX0ZST01fSk5JKChqb2JqZWN0KXJlcyk7Ci0gIH0gZWxzZSB7Ci0gICAgUkVUVVJOX0ZST01fSk5JKDApOwotICB9Ci0gIAotICBFTkRfSk5JX0VYQ0VQVElPTgotICBSRVRVUk5fRlJPTV9KTkkoMCk7Ci19Ci0KLQotdm9pZCBEZWxldGVHbG9iYWxSZWYoSk5JRW52KiBlbnYsIGpvYmplY3QgZ2xvYmFsUmVmKSB7Ci0gIAotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotICBKbmp2bSogdm0gPSBteVZNKGVudik7Ci0gIHZtLT5nbG9iYWxSZWZzTG9jay5sb2NrKCk7Ci0gIHZtLT5nbG9iYWxSZWZzLnJlbW92ZUpOSVJlZmVyZW5jZSgoSmF2YU9iamVjdCoqKWdsb2JhbFJlZik7Ci0gIHZtLT5nbG9iYWxSZWZzTG9jay51bmxvY2soKTsKLSAgCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIAotICBSRVRVUk5fVk9JRF9GUk9NX0pOSTsKLX0KLQotCi1qYm9vbGVhbiBFeGNlcHRpb25DaGVjayhKTklFbnYgKmVudikgewotICBCRUdJTl9KTklfRVhDRVBUSU9OCi0gIAotCWlmIChtdXQtPmdldFBlbmRpbmdFeGNlcHRpb24oKSkgewotICAgIFJFVFVSTl9GUk9NX0pOSShKTklfVFJVRSk7Ci0gIH0gZWxzZSB7Ci0gICAgUkVUVVJOX0ZST01fSk5JKEpOSV9GQUxTRSk7Ci0gIH0KLSAgCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIFJFVFVSTl9GUk9NX0pOSShmYWxzZSk7Ci19Ci0KLQotam9iamVjdCBOZXdEaXJlY3RCeXRlQnVmZmVyKEpOSUVudiAqZW52LCB2b2lkICphZGRyZXNzLCBqbG9uZyBjYXBhY2l0eSkgewotICAKLSAgQkVHSU5fSk5JX0VYQ0VQVElPTgotICAKLSAgSmF2YU9iamVjdCogcmVzID0gMDsKLSAgSmF2YU9iamVjdCogcCA9IDA7Ci0gIGxsdm1fZ2Nyb290KHJlcywgMCk7Ci0gIGxsdm1fZ2Nyb290KHAsIDApOwotCi0gIEphdmFUaHJlYWQqIHRoID0gSmF2YVRocmVhZDo6Z2V0KCk7Ci0gIEpuanZtKiB2bSA9IHRoLT5nZXRKVk0oKTsKLSAgVXNlckNsYXNzKiBCQiA9IHZtLT51cGNhbGxzLT5uZXdEaXJlY3RCeXRlQnVmZmVyOwotCi0gIHJlcyA9IEJCLT5kb05ldygpOwotCi0jaWYgKF9fV09SRFNJWkUgPT0gMzIpCi0gIFVzZXJDbGFzcyogUFAgPSB2bS0+dXBjYWxscy0+bmV3UG9pbnRlcjMyOwotICBwID0gUFAtPmRvTmV3KCk7Ci0gIHZtLT51cGNhbGxzLT5kYXRhUG9pbnRlcjMyLT5zZXRJbnN0YW5jZUludDMyRmllbGQocCwgKHVpbnQzMilhZGRyZXNzKTsKLSNlbHNlCi0gIFVzZXJDbGFzcyogUFAgPSB2bS0+dXBjYWxscy0+bmV3UG9pbnRlcjY0OwotICBwID0gUFAtPmRvTmV3KCk7Ci0gIHZtLT51cGNhbGxzLT5kYXRhUG9pbnRlcjY0LT5zZXRJbnN0YW5jZUxvbmdGaWVsZChwLCAoamxvbmcpYWRkcmVzcyk7Ci0jZW5kaWYKLQotICB2bS0+dXBjYWxscy0+SW5pdERpcmVjdEJ5dGVCdWZmZXItPmludm9rZUludFNwZWNpYWwoQkIsIHJlcywgMCwgJnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzIpY2FwYWNpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzIpY2FwYWNpdHksIDApOwotCi0gIGpvYmplY3QgcmV0ID0gKGpvYmplY3QpdGgtPnB1c2hKTklSZWYocmVzKTsKLSAgUkVUVVJOX0ZST01fSk5JKHJldCk7Ci0gIAotICBFTkRfSk5JX0VYQ0VQVElPTgotICAKLSAgUkVUVVJOX0ZST01fSk5JKDApOwotfQotCi0KLXZvaWQgKkdldERpcmVjdEJ1ZmZlckFkZHJlc3MoSk5JRW52ICplbnYsIGpvYmplY3QgX2J1ZikgewotCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLSAKLSAgLy8gTG9jYWwgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIEphdmFPYmplY3QqIGJ1ZiA9ICooSmF2YU9iamVjdCoqKV9idWY7Ci0gIEphdmFPYmplY3QqIGFkZHJlc3MgPSAwOwotICBsbHZtX2djcm9vdChidWYsIDApOwotICBsbHZtX2djcm9vdChhZGRyZXNzLCAwKTsKLQotICBKbmp2bSogdm0gPSBteVZNKGVudik7Ci0gIGFkZHJlc3MgPSB2bS0+dXBjYWxscy0+YnVmZmVyQWRkcmVzcy0+Z2V0SW5zdGFuY2VPYmplY3RGaWVsZChidWYpOwotICBpZiAoYWRkcmVzcyAhPSAwKSB7Ci0jaWYgKF9fV09SRFNJWkUgPT0gMzIpCi0gICAgaW50IHJlcyA9IHZtLT51cGNhbGxzLT5kYXRhUG9pbnRlcjMyLT5nZXRJbnN0YW5jZUludDMyRmllbGQoYWRkcmVzcyk7Ci0jZWxzZQotICAgIGpsb25nIHJlcyA9IHZtLT51cGNhbGxzLT5kYXRhUG9pbnRlcjY0LT5nZXRJbnN0YW5jZUxvbmdGaWVsZChhZGRyZXNzKTsKLSNlbmRpZgotICAgIFJFVFVSTl9GUk9NX0pOSSgodm9pZCopcmVzKTsKLSAgfSBlbHNlIHsKLSAgICBSRVRVUk5fRlJPTV9KTkkoMCk7Ci0gIH0KLQotICBFTkRfSk5JX0VYQ0VQVElPTgotICBSRVRVUk5fRlJPTV9KTkkoMCk7Ci19Ci0KLQotamxvbmcgR2V0RGlyZWN0QnVmZmVyQ2FwYWNpdHkoSk5JRW52KiBlbnYsIGpvYmplY3QgYnVmKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWpvYmplY3RSZWZUeXBlIEdldE9iamVjdFJlZlR5cGUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIChqb2JqZWN0UmVmVHlwZSkwOwotfQotCi0KLQotamludCBEZXN0cm95SmF2YVZNKEphdmFWTSAqdm0pIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotICByZXR1cm4gMDsKLX0KLQotCi1qaW50IEF0dGFjaEN1cnJlbnRUaHJlYWQoSmF2YVZNICp2bSwgdm9pZCAqKmVudiwgdm9pZCAqdGhyX2FyZ3MpIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWVcbiIpOwotICBhYm9ydCgpOwotICByZXR1cm4gMDsKLX0KLQotCi1qaW50IERldGFjaEN1cnJlbnRUaHJlYWQoSmF2YVZNICp2bSkgewotICBmcHJpbnRmKHN0ZGVyciwgIkltcGxlbWVudCBtZVxuIik7Ci0gIGFib3J0KCk7Ci0gIHJldHVybiAwOwotfQotCi0KLWppbnQgR2V0RW52KEphdmFWTSAqdm0sIHZvaWQgKiplbnYsIGppbnQgdmVyc2lvbikgewotCi0gIEJFR0lOX0pOSV9FWENFUFRJT04KLQotICBKYXZhVGhyZWFkKiB0aCA9IEphdmFUaHJlYWQ6OmdldCgpOwotICBKYXZhT2JqZWN0KiBvYmogPSB0aC0+Y3VycmVudFRocmVhZCgpOwotICBsbHZtX2djcm9vdChvYmosIDApOwotCi0gIEpuanZtKiB2bSA9IHRoLT5nZXRKVk0oKTsKLSAgaWYgKG9iaiAhPSAwKSB7Ci0gICAgKCplbnYpID0gJih2bS0+am5pRW52KTsKLSAgICBSRVRVUk5fRlJPTV9KTkkoSk5JX09LKTsKLSAgfSBlbHNlIHsKLSAgICAoKmVudikgPSAwOwotICAgIFJFVFVSTl9GUk9NX0pOSShKTklfRURFVEFDSEVEKTsKLSAgfQotCi0gIEVORF9KTklfRVhDRVBUSU9OCi0gIFJFVFVSTl9GUk9NX0pOSSgwKTsKLX0KLQotCi0KLWppbnQgQXR0YWNoQ3VycmVudFRocmVhZEFzRGFlbW9uKEphdmFWTSAqdm0sIHZvaWQgKipwYXIxLCB2b2lkICpwYXIyKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lXG4iKTsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotY29uc3Qgc3RydWN0IEpOSUludm9rZUludGVyZmFjZV8gSk5JX0phdmFWTVRhYmxlID0gewotCU5VTEwsCi0JTlVMTCwKLQlOVUxMLAotCi0JRGVzdHJveUphdmFWTSwKLQlBdHRhY2hDdXJyZW50VGhyZWFkLAotCURldGFjaEN1cnJlbnRUaHJlYWQsCi0JR2V0RW52LAotCUF0dGFjaEN1cnJlbnRUaHJlYWRBc0RhZW1vbgotfTsKLQotCi1zdHJ1Y3QgSk5JTmF0aXZlSW50ZXJmYWNlXyBKTklfSk5JRW52VGFibGUgPSB7Ci0JTlVMTCwKLQlOVUxMLAotCU5VTEwsCi0JTlVMTCwgICAgCi0JJkdldFZlcnNpb24sCi0KLQkmRGVmaW5lQ2xhc3MsCi0JJkZpbmRDbGFzcywKLQkmRnJvbVJlZmxlY3RlZE1ldGhvZCwKLQkmRnJvbVJlZmxlY3RlZEZpZWxkLAotCSZUb1JlZmxlY3RlZE1ldGhvZCwKLQkmR2V0U3VwZXJjbGFzcywKLQkmSXNBc3NpZ25hYmxlRnJvbSwKLQkmVG9SZWZsZWN0ZWRGaWVsZCwKLQotCSZUaHJvdywKLQkmVGhyb3dOZXcsCi0JJkV4Y2VwdGlvbk9jY3VycmVkLAotCSZFeGNlcHRpb25EZXNjcmliZSwKLQkmRXhjZXB0aW9uQ2xlYXIsCi0JJkZhdGFsRXJyb3IsCi0JJlB1c2hMb2NhbEZyYW1lLAotCSZQb3BMb2NhbEZyYW1lLAotCi0JJk5ld0dsb2JhbFJlZiwKLQkmRGVsZXRlR2xvYmFsUmVmLAotCSZEZWxldGVMb2NhbFJlZiwKLQkmSXNTYW1lT2JqZWN0LAotCSZOZXdMb2NhbFJlZiwKLQkmRW5zdXJlTG9jYWxDYXBhY2l0eSwKLQotCSZBbGxvY09iamVjdCwKLQkmTmV3T2JqZWN0LAotCSZOZXdPYmplY3RWLAotCSZOZXdPYmplY3RBLAotCi0JJkdldE9iamVjdENsYXNzLAotCSZJc0luc3RhbmNlT2YsCi0KLQkmR2V0TWV0aG9kSUQsCi0KLQkmQ2FsbE9iamVjdE1ldGhvZCwKLQkmQ2FsbE9iamVjdE1ldGhvZFYsCi0JJkNhbGxPYmplY3RNZXRob2RBLAotCSZDYWxsQm9vbGVhbk1ldGhvZCwKLQkmQ2FsbEJvb2xlYW5NZXRob2RWLAotCSZDYWxsQm9vbGVhbk1ldGhvZEEsCi0JJkNhbGxCeXRlTWV0aG9kLAotCSZDYWxsQnl0ZU1ldGhvZFYsCi0JJkNhbGxCeXRlTWV0aG9kQSwKLQkmQ2FsbENoYXJNZXRob2QsCi0JJkNhbGxDaGFyTWV0aG9kViwKLQkmQ2FsbENoYXJNZXRob2RBLAotCSZDYWxsU2hvcnRNZXRob2QsCi0JJkNhbGxTaG9ydE1ldGhvZFYsCi0JJkNhbGxTaG9ydE1ldGhvZEEsCi0JJkNhbGxJbnRNZXRob2QsCi0JJkNhbGxJbnRNZXRob2RWLAotCSZDYWxsSW50TWV0aG9kQSwKLQkmQ2FsbExvbmdNZXRob2QsCi0JJkNhbGxMb25nTWV0aG9kViwKLQkmQ2FsbExvbmdNZXRob2RBLAotCSZDYWxsRmxvYXRNZXRob2QsCi0JJkNhbGxGbG9hdE1ldGhvZFYsCi0JJkNhbGxGbG9hdE1ldGhvZEEsCi0JJkNhbGxEb3VibGVNZXRob2QsCi0JJkNhbGxEb3VibGVNZXRob2RWLAotCSZDYWxsRG91YmxlTWV0aG9kQSwKLQkmQ2FsbFZvaWRNZXRob2QsCi0JJkNhbGxWb2lkTWV0aG9kViwKLQkmQ2FsbFZvaWRNZXRob2RBLAotCi0JJkNhbGxOb252aXJ0dWFsT2JqZWN0TWV0aG9kLAotCSZDYWxsTm9udmlydHVhbE9iamVjdE1ldGhvZFYsCi0JJkNhbGxOb252aXJ0dWFsT2JqZWN0TWV0aG9kQSwKLQkmQ2FsbE5vbnZpcnR1YWxCb29sZWFuTWV0aG9kLAotCSZDYWxsTm9udmlydHVhbEJvb2xlYW5NZXRob2RWLAotCSZDYWxsTm9udmlydHVhbEJvb2xlYW5NZXRob2RBLAotCSZDYWxsTm9udmlydHVhbEJ5dGVNZXRob2QsCi0JJkNhbGxOb252aXJ0dWFsQnl0ZU1ldGhvZFYsCi0JJkNhbGxOb252aXJ0dWFsQnl0ZU1ldGhvZEEsCi0JJkNhbGxOb252aXJ0dWFsQ2hhck1ldGhvZCwKLQkmQ2FsbE5vbnZpcnR1YWxDaGFyTWV0aG9kViwKLQkmQ2FsbE5vbnZpcnR1YWxDaGFyTWV0aG9kQSwKLQkmQ2FsbE5vbnZpcnR1YWxTaG9ydE1ldGhvZCwKLQkmQ2FsbE5vbnZpcnR1YWxTaG9ydE1ldGhvZFYsCi0JJkNhbGxOb252aXJ0dWFsU2hvcnRNZXRob2RBLAotCSZDYWxsTm9udmlydHVhbEludE1ldGhvZCwKLQkmQ2FsbE5vbnZpcnR1YWxJbnRNZXRob2RWLAotCSZDYWxsTm9udmlydHVhbEludE1ldGhvZEEsCi0JJkNhbGxOb252aXJ0dWFsTG9uZ01ldGhvZCwKLQkmQ2FsbE5vbnZpcnR1YWxMb25nTWV0aG9kViwKLQkmQ2FsbE5vbnZpcnR1YWxMb25nTWV0aG9kQSwKLQkmQ2FsbE5vbnZpcnR1YWxGbG9hdE1ldGhvZCwKLQkmQ2FsbE5vbnZpcnR1YWxGbG9hdE1ldGhvZFYsCi0JJkNhbGxOb252aXJ0dWFsRmxvYXRNZXRob2RBLAotCSZDYWxsTm9udmlydHVhbERvdWJsZU1ldGhvZCwKLQkmQ2FsbE5vbnZpcnR1YWxEb3VibGVNZXRob2RWLAotCSZDYWxsTm9udmlydHVhbERvdWJsZU1ldGhvZEEsCi0JJkNhbGxOb252aXJ0dWFsVm9pZE1ldGhvZCwKLQkmQ2FsbE5vbnZpcnR1YWxWb2lkTWV0aG9kViwKLQkmQ2FsbE5vbnZpcnR1YWxWb2lkTWV0aG9kQSwKLQotCSZHZXRGaWVsZElELAotCi0JJkdldE9iamVjdEZpZWxkLAotCSZHZXRCb29sZWFuRmllbGQsCi0JJkdldEJ5dGVGaWVsZCwKLQkmR2V0Q2hhckZpZWxkLAotCSZHZXRTaG9ydEZpZWxkLAotCSZHZXRJbnRGaWVsZCwKLQkmR2V0TG9uZ0ZpZWxkLAotCSZHZXRGbG9hdEZpZWxkLAotCSZHZXREb3VibGVGaWVsZCwKLQkmU2V0T2JqZWN0RmllbGQsCi0JJlNldEJvb2xlYW5GaWVsZCwKLQkmU2V0Qnl0ZUZpZWxkLAotCSZTZXRDaGFyRmllbGQsCi0JJlNldFNob3J0RmllbGQsCi0JJlNldEludEZpZWxkLAotCSZTZXRMb25nRmllbGQsCi0JJlNldEZsb2F0RmllbGQsCi0JJlNldERvdWJsZUZpZWxkLAotCi0JJkdldFN0YXRpY01ldGhvZElELAotCi0JJkNhbGxTdGF0aWNPYmplY3RNZXRob2QsCi0JJkNhbGxTdGF0aWNPYmplY3RNZXRob2RWLAotCSZDYWxsU3RhdGljT2JqZWN0TWV0aG9kQSwKLQkmQ2FsbFN0YXRpY0Jvb2xlYW5NZXRob2QsCi0JJkNhbGxTdGF0aWNCb29sZWFuTWV0aG9kViwKLQkmQ2FsbFN0YXRpY0Jvb2xlYW5NZXRob2RBLAotCSZDYWxsU3RhdGljQnl0ZU1ldGhvZCwKLQkmQ2FsbFN0YXRpY0J5dGVNZXRob2RWLAotCSZDYWxsU3RhdGljQnl0ZU1ldGhvZEEsCi0JJkNhbGxTdGF0aWNDaGFyTWV0aG9kLAotCSZDYWxsU3RhdGljQ2hhck1ldGhvZFYsCi0JJkNhbGxTdGF0aWNDaGFyTWV0aG9kQSwKLQkmQ2FsbFN0YXRpY1Nob3J0TWV0aG9kLAotCSZDYWxsU3RhdGljU2hvcnRNZXRob2RWLAotCSZDYWxsU3RhdGljU2hvcnRNZXRob2RBLAotCSZDYWxsU3RhdGljSW50TWV0aG9kLAotCSZDYWxsU3RhdGljSW50TWV0aG9kViwKLQkmQ2FsbFN0YXRpY0ludE1ldGhvZEEsCi0JJkNhbGxTdGF0aWNMb25nTWV0aG9kLAotCSZDYWxsU3RhdGljTG9uZ01ldGhvZFYsCi0JJkNhbGxTdGF0aWNMb25nTWV0aG9kQSwKLQkmQ2FsbFN0YXRpY0Zsb2F0TWV0aG9kLAotCSZDYWxsU3RhdGljRmxvYXRNZXRob2RWLAotCSZDYWxsU3RhdGljRmxvYXRNZXRob2RBLAotCSZDYWxsU3RhdGljRG91YmxlTWV0aG9kLAotCSZDYWxsU3RhdGljRG91YmxlTWV0aG9kViwKLQkmQ2FsbFN0YXRpY0RvdWJsZU1ldGhvZEEsCi0JJkNhbGxTdGF0aWNWb2lkTWV0aG9kLAotCSZDYWxsU3RhdGljVm9pZE1ldGhvZFYsCi0JJkNhbGxTdGF0aWNWb2lkTWV0aG9kQSwKLQotCSZHZXRTdGF0aWNGaWVsZElELAotCi0JJkdldFN0YXRpY09iamVjdEZpZWxkLAotCSZHZXRTdGF0aWNCb29sZWFuRmllbGQsCi0JJkdldFN0YXRpY0J5dGVGaWVsZCwKLQkmR2V0U3RhdGljQ2hhckZpZWxkLAotCSZHZXRTdGF0aWNTaG9ydEZpZWxkLAotCSZHZXRTdGF0aWNJbnRGaWVsZCwKLQkmR2V0U3RhdGljTG9uZ0ZpZWxkLAotCSZHZXRTdGF0aWNGbG9hdEZpZWxkLAotCSZHZXRTdGF0aWNEb3VibGVGaWVsZCwKLQkmU2V0U3RhdGljT2JqZWN0RmllbGQsCi0JJlNldFN0YXRpY0Jvb2xlYW5GaWVsZCwKLQkmU2V0U3RhdGljQnl0ZUZpZWxkLAotCSZTZXRTdGF0aWNDaGFyRmllbGQsCi0JJlNldFN0YXRpY1Nob3J0RmllbGQsCi0JJlNldFN0YXRpY0ludEZpZWxkLAotCSZTZXRTdGF0aWNMb25nRmllbGQsCi0JJlNldFN0YXRpY0Zsb2F0RmllbGQsCi0JJlNldFN0YXRpY0RvdWJsZUZpZWxkLAotCi0JJk5ld1N0cmluZywKLQkmR2V0U3RyaW5nTGVuZ3RoLAotCSZHZXRTdHJpbmdDaGFycywKLQkmUmVsZWFzZVN0cmluZ0NoYXJzLAotCi0JJk5ld1N0cmluZ1VURiwKLQkmR2V0U3RyaW5nVVRGTGVuZ3RoLAotCSZHZXRTdHJpbmdVVEZDaGFycywKLQkmUmVsZWFzZVN0cmluZ1VURkNoYXJzLAotCi0JJkdldEFycmF5TGVuZ3RoLAotCi0JJk5ld09iamVjdEFycmF5LAotCSZHZXRPYmplY3RBcnJheUVsZW1lbnQsCi0JJlNldE9iamVjdEFycmF5RWxlbWVudCwKLQotCSZOZXdCb29sZWFuQXJyYXksCi0JJk5ld0J5dGVBcnJheSwKLQkmTmV3Q2hhckFycmF5LAotCSZOZXdTaG9ydEFycmF5LAotCSZOZXdJbnRBcnJheSwKLQkmTmV3TG9uZ0FycmF5LAotCSZOZXdGbG9hdEFycmF5LAotCSZOZXdEb3VibGVBcnJheSwKLQotCSZHZXRCb29sZWFuQXJyYXlFbGVtZW50cywKLQkmR2V0Qnl0ZUFycmF5RWxlbWVudHMsCi0JJkdldENoYXJBcnJheUVsZW1lbnRzLAotCSZHZXRTaG9ydEFycmF5RWxlbWVudHMsCi0JJkdldEludEFycmF5RWxlbWVudHMsCi0JJkdldExvbmdBcnJheUVsZW1lbnRzLAotCSZHZXRGbG9hdEFycmF5RWxlbWVudHMsCi0JJkdldERvdWJsZUFycmF5RWxlbWVudHMsCi0KLQkmUmVsZWFzZUJvb2xlYW5BcnJheUVsZW1lbnRzLAotCSZSZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMsCi0JJlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cywKLQkmUmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cywKLQkmUmVsZWFzZUludEFycmF5RWxlbWVudHMsCi0JJlJlbGVhc2VMb25nQXJyYXlFbGVtZW50cywKLQkmUmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cywKLQkmUmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMsCi0KLQkmR2V0Qm9vbGVhbkFycmF5UmVnaW9uLAotCSZHZXRCeXRlQXJyYXlSZWdpb24sCi0JJkdldENoYXJBcnJheVJlZ2lvbiwKLQkmR2V0U2hvcnRBcnJheVJlZ2lvbiwKLQkmR2V0SW50QXJyYXlSZWdpb24sCi0JJkdldExvbmdBcnJheVJlZ2lvbiwKLQkmR2V0RmxvYXRBcnJheVJlZ2lvbiwKLQkmR2V0RG91YmxlQXJyYXlSZWdpb24sCi0JJlNldEJvb2xlYW5BcnJheVJlZ2lvbiwKLQkmU2V0Qnl0ZUFycmF5UmVnaW9uLAotCSZTZXRDaGFyQXJyYXlSZWdpb24sCi0JJlNldFNob3J0QXJyYXlSZWdpb24sCi0JJlNldEludEFycmF5UmVnaW9uLAotCSZTZXRMb25nQXJyYXlSZWdpb24sCi0JJlNldEZsb2F0QXJyYXlSZWdpb24sCi0JJlNldERvdWJsZUFycmF5UmVnaW9uLAotCi0JJlJlZ2lzdGVyTmF0aXZlcywKLQkmVW5yZWdpc3Rlck5hdGl2ZXMsCi0KLQkmTW9uaXRvckVudGVyLAotCSZNb25pdG9yRXhpdCwKLQotCSZHZXRKYXZhVk0sCi0KLQkvKiBuZXcgSk5JIDEuMiBmdW5jdGlvbnMgKi8KLQotCSZHZXRTdHJpbmdSZWdpb24sCi0JJkdldFN0cmluZ1VURlJlZ2lvbiwKLQotCSZHZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsLAotCSZSZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbCwKLQotCSZHZXRTdHJpbmdDcml0aWNhbCwKLQkmUmVsZWFzZVN0cmluZ0NyaXRpY2FsLAotCi0JJk5ld1dlYWtHbG9iYWxSZWYsCi0JJkRlbGV0ZVdlYWtHbG9iYWxSZWYsCi0KLQkmRXhjZXB0aW9uQ2hlY2ssCi0KLQkvKiBuZXcgSk5JIDEuNCBmdW5jdGlvbnMgKi8KLQotCSZOZXdEaXJlY3RCeXRlQnVmZmVyLAotCSZHZXREaXJlY3RCdWZmZXJBZGRyZXNzLAotCSZHZXREaXJlY3RCdWZmZXJDYXBhY2l0eSwKLQotICAvKiAtLS0tIEpOSSAxLjYgZnVuY3Rpb25zIC0tLS0gKi8KLSAgJkdldE9iamVjdFJlZlR5cGUKLX07CmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvVk1Db3JlL0puanZtLmNwcCBiL3Zta2l0L2xpYi9KMy9WTUNvcmUvSm5qdm0uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmY1ZTcwLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9KMy9WTUNvcmUvSm5qdm0uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0NiArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0gSm5qdm0uY3BwIC0gSmF2YSB2aXJ0dWFsIG1hY2hpbmUgZGVzY3JpcHRpb24gLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2RlZmluZSBKTkpWTV9MT0FEIDAKLQotI2luY2x1ZGUgPGNmbG9hdD4KLSNpbmNsdWRlIDxjbGltaXRzPgotI2luY2x1ZGUgPGNzdGRhcmc+Ci0jaW5jbHVkZSA8Y3N0ZGlvPgotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSAiZGVidWcuaCIKLQotI2luY2x1ZGUgIm12bS9UaHJlYWRzL1RocmVhZC5oIgotI2luY2x1ZGUgIm12bS9WTUtpdC5oIgotI2luY2x1ZGUgIm12bS9HQy5oIgotCi0jaW5jbHVkZSAiQ2xhc3NwYXRoUmVmbGVjdC5oIgotI2luY2x1ZGUgIkphdmFBcnJheS5oIgotI2luY2x1ZGUgIkphdmFDbGFzcy5oIgotI2luY2x1ZGUgIkphdmFDb21waWxlci5oIgotI2luY2x1ZGUgIkphdmFDb25zdGFudFBvb2wuaCIKLSNpbmNsdWRlICJKYXZhU3RyaW5nLmgiCi0jaW5jbHVkZSAiSmF2YVRocmVhZC5oIgotI2luY2x1ZGUgIkphdmFUeXBlcy5oIgotI2luY2x1ZGUgIkphdmFVcGNhbGxzLmgiCi0jaW5jbHVkZSAiSm5qdm0uaCIKLSNpbmNsdWRlICJMaW5rSmF2YVJ1bnRpbWUuaCIKLSNpbmNsdWRlICJMb2NrZWRNYXAuaCIKLSNpbmNsdWRlICJSZWFkZXIuaCIKLSNpbmNsdWRlICJaaXAuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGozOwotCi1jb25zdCBjaGFyKiBKbmp2bTo6ZGlyU2VwYXJhdG9yID0gIi8iOwotY29uc3QgY2hhciogSm5qdm06OmVudlNlcGFyYXRvciA9ICI6IjsKLWNvbnN0IHVuc2lnbmVkIGludCBKbmp2bTo6TWFnaWMgPSAweGNhZmViYWJlOwotCi0vLy8gaW5pdGlhbGlzZUNsYXNzIC0gSmF2YSBjbGFzcyBpbml0aWFsaXNhdGlvbi4gSmF2YSBzcGVjaWZpY2F0aW9uIMKnMi4xNy41LgotCi12b2lkIFVzZXJDbGFzczo6aW5pdGlhbGlzZUNsYXNzKCkgewotCW12bTo6Z2MqIGV4YyA9IE5VTEw7Ci0gIEphdmFPYmplY3QqIG9iaiA9IE5VTEw7Ci0JSmF2YU9iamVjdCogamV4YzsKLQkKLQlsbHZtX2djcm9vdChqZXhjLCAwKTsKLSAgbGx2bV9nY3Jvb3QoZXhjLCAwKTsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgCi0gIC8vIFByaW1pdGl2ZXMgYXJlIGluaXRpYWxpemVkIGF0IGJvb3QgdGltZSwgYXJyYXlzIGFyZSBpbml0aWFsaXplZCBkaXJlY3RseS4KLSAgCi0gIC8vIEFzc3VtZXMgdGhhdCB0aGUgQ2xhc3Mgb2JqZWN0IGhhcyBhbHJlYWR5IGJlZW4gdmVyaWZpZWQgYW5kIHByZXBhcmVkIGFuZAotICAvLyB0aGF0IHRoZSBDbGFzcyBvYmplY3QgY29udGFpbnMgc3RhdGUgdGhhdCBjYW4gaW5kaWNhdGUgb25lIG9mIGZvdXIKLSAgLy8gc2l0dWF0aW9uczoKLSAgLy8KLSAgLy8gICogVGhpcyBDbGFzcyBvYmplY3QgaXMgdmVyaWZpZWQgYW5kIHByZXBhcmVkIGJ1dCBub3QgaW5pdGlhbGl6ZWQuCi0gIC8vICAqIFRoaXMgQ2xhc3Mgb2JqZWN0IGlzIGJlaW5nIGluaXRpYWxpemVkIGJ5IHNvbWUgcGFydGljdWxhciB0aHJlYWQgVC4KLSAgLy8gICogVGhpcyBDbGFzcyBvYmplY3QgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UuCi0gIC8vICAqIFRoaXMgQ2xhc3Mgb2JqZWN0IGlzIGluIGFuIGVycm9uZW91cyBzdGF0ZSwgcGVyaGFwcyBiZWNhdXNlIHRoZQotICAvLyAgICB2ZXJpZmljYXRpb24gc3RlcCBmYWlsZWQgb3IgYmVjYXVzZSBpbml0aWFsaXphdGlvbiB3YXMgYXR0ZW1wdGVkIGFuZAotICAvLyAgICBmYWlsZWQuCi0KLSAgYXNzZXJ0KChpc1Jlc29sdmVkKCkgfHwgZ2V0T3duZXJDbGFzcygpIHx8IGlzUmVhZHkoKSB8fAotICAgICAgICAgaXNFcnJvbmVvdXMoKSkgJiYgIkNsYXNzIGluIHdyb25nIHN0YXRlIik7Ci0gIAotICBpZiAoZ2V0SW5pdGlhbGl6YXRpb25TdGF0ZSgpICE9IHJlYWR5KSB7Ci0gICAgCi0gICAgLy8gMS4gU3luY2hyb25pemUgb24gdGhlIENsYXNzIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGNsYXNzIG9yIAotICAgIC8vICAgIGludGVyZmFjZSB0byBiZSBpbml0aWFsaXplZC4gVGhpcyBpbnZvbHZlcyB3YWl0aW5nIHVudGlsIHRoZQotICAgIC8vICAgIGN1cnJlbnQgdGhyZWFkIGNhbiBvYnRhaW4gdGhlIGxvY2sgZm9yIHRoYXQgb2JqZWN0Ci0gICAgLy8gICAgKEphdmEgc3BlY2lmaWNhdGlvbiDCpzguMTMpLgotICAgIGFjcXVpcmUoKTsKLQkJbXZtOjpUaHJlYWQqIG11dCA9IG12bTo6VGhyZWFkOjpnZXQoKTsKLQotICAgIGlmIChnZXRJbml0aWFsaXphdGlvblN0YXRlKCkgPT0gaW5DbGluaXQpIHsKLSAgICAgIC8vIDIuIElmIGluaXRpYWxpemF0aW9uIGJ5IHNvbWUgb3RoZXIgdGhyZWFkIGlzIGluIHByb2dyZXNzIGZvciB0aGUKLSAgICAgIC8vICAgIGNsYXNzIG9yIGludGVyZmFjZSwgdGhlbiB3YWl0IG9uIHRoaXMgQ2xhc3Mgb2JqZWN0ICh3aGljaCAKLSAgICAgIC8vICAgIHRlbXBvcmFyaWx5IHJlbGVhc2VzIHRoZSBsb2NrKS4gV2hlbiB0aGUgY3VycmVudCB0aHJlYWQgYXdha2VucwotICAgICAgLy8gICAgZnJvbSB0aGUgd2FpdCwgcmVwZWF0IHRoaXMgc3RlcC4KLSAgICAgIGlmIChnZXRPd25lckNsYXNzKCkgIT0gbXV0KSB7Ci0gICAgICAgIHdoaWxlIChnZXRPd25lckNsYXNzKCkpIHsKLSAgICAgICAgICB3YWl0Q2xhc3MoKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gMy4gSWYgaW5pdGlhbGl6YXRpb24gaXMgaW4gcHJvZ3Jlc3MgZm9yIHRoZSBjbGFzcyBvciBpbnRlcmZhY2UgYnkKLSAgICAgICAgLy8gICAgdGhlIGN1cnJlbnQgdGhyZWFkLCB0aGVuIHRoaXMgbXVzdCBiZSBhIHJlY3Vyc2l2ZSByZXF1ZXN0IGZvciAKLSAgICAgICAgLy8gICAgaW5pdGlhbGl6YXRpb24uIFJlbGVhc2UgdGhlIGxvY2sgb24gdGhlIENsYXNzIG9iamVjdCBhbmQgY29tcGxldGUKLSAgICAgICAgLy8gICAgbm9ybWFsbHkuCi0gICAgICAgIHJlbGVhc2UoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0gCi0gICAgCi0gICAgLy8gNC4gSWYgdGhlIGNsYXNzIG9yIGludGVyZmFjZSBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLCB0aGVuIG5vIAotICAgIC8vICAgIGZ1cnRoZXIgYWN0aW9uIGlzIHJlcXVpcmVkLiBSZWxlYXNlIHRoZSBsb2NrIG9uIHRoZSBDbGFzcyBvYmplY3QKLSAgICAvLyAgICBhbmQgY29tcGxldGUgbm9ybWFsbHkuCi0gICAgaWYgKGdldEluaXRpYWxpemF0aW9uU3RhdGUoKSA9PSByZWFkeSkgewotICAgICAgcmVsZWFzZSgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICAvLyA1LiBJZiB0aGUgQ2xhc3Mgb2JqZWN0IGlzIGluIGFuIGVycm9uZW91cyBzdGF0ZSwgdGhlbiBpbml0aWFsaXphdGlvbiBpcwotICAgIC8vICAgIG5vdCBwb3NzaWJsZS4gUmVsZWFzZSB0aGUgbG9jayBvbiB0aGUgQ2xhc3Mgb2JqZWN0IGFuZCB0aHJvdyBhCi0gICAgLy8gICAgTm9DbGFzc0RlZkZvdW5kRXJyb3IuCi0gICAgaWYgKGlzRXJyb25lb3VzKCkpIHsKLSAgICAgIHJlbGVhc2UoKTsKLSAgICAgIGNsYXNzTG9hZGVyLT52bS0+bm9DbGFzc0RlZkZvdW5kRXJyb3IobmFtZSk7Ci0gICAgfQotCi0gICAgLy8gNi4gT3RoZXJ3aXNlLCByZWNvcmQgdGhlIGZhY3QgdGhhdCBpbml0aWFsaXphdGlvbiBvZiB0aGUgQ2xhc3Mgb2JqZWN0IGlzCi0gICAgLy8gICAgbm93IGluIHByb2dyZXNzIGJ5IHRoZSBjdXJyZW50IHRocmVhZCBhbmQgcmVsZWFzZSB0aGUgbG9jayBvbiB0aGUKLSAgICAvLyAgICBDbGFzcyBvYmplY3QuCi0gICAgc2V0T3duZXJDbGFzcyhtdXQpOwotICAgIGJvb2wgdm1qY2VkID0gKGdldEluaXRpYWxpemF0aW9uU3RhdGUoKSA9PSB2bWpjKTsKLSAgICBzZXRJbml0aWFsaXphdGlvblN0YXRlKGluQ2xpbml0KTsKLSAgICBVc2VyQ2xhc3MqIGNsID0gKFVzZXJDbGFzcyopdGhpczsKLSAgICAKLSAgICAvLyBTaW5nbGUgZW52aXJvbm1lbnQgYWxsb2NhdGVzIHRoZSBzdGF0aWMgaW5zdGFuY2UgZHVyaW5nIHJlc29sdXRpb24sIHNvCi0gICAgLy8gdGhhdCBjb21waWxlZCBjb2RlIGNhbiBhY2Nlc3MgaXQgZGlyZWN0bHkgKHdpdGggYW4gaW5pdGlhbGl6YXRpb24KLSAgICAvLyBjaGVjayBqdXN0IGJlZm9yZSB0aGUgYWNjZXNzKQotICAgIGlmICghY2wtPmdldFN0YXRpY0luc3RhbmNlKCkpIGNsLT5hbGxvY2F0ZVN0YXRpY0luc3RhbmNlKCk7Ci0KLSAgICByZWxlYXNlKCk7Ci0gIAotCi0gICAgLy8gNy4gTmV4dCwgaWYgdGhlIENsYXNzIG9iamVjdCByZXByZXNlbnRzIGEgY2xhc3MgcmF0aGVyIHRoYW4gYW4gaW50ZXJmYWNlLCAKLSAgICAvLyAgICBhbmQgdGhlIGRpcmVjdCBzdXBlcmNsYXNzIG9mIHRoaXMgY2xhc3MgaGFzIG5vdCB5ZXQgYmVlbiBpbml0aWFsaXplZCwKLSAgICAvLyAgICB0aGVuIHJlY3Vyc2l2ZWx5IHBlcmZvcm0gdGhpcyBlbnRpcmUgcHJvY2VkdXJlIGZvciB0aGUgdW5pbml0aWFsaXplZCAKLSAgICAvLyAgICBzdXBlcmNsYXNzLiBJZiB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGRpcmVjdCBzdXBlcmNsYXNzIGNvbXBsZXRlcyAKLSAgICAvLyAgICBhYnJ1cHRseSBiZWNhdXNlIG9mIGEgdGhyb3duIGV4Y2VwdGlvbiwgdGhlbiBsb2NrIHRoaXMgQ2xhc3Mgb2JqZWN0LCAKLSAgICAvLyAgICBsYWJlbCBpdCBlcnJvbmVvdXMsIG5vdGlmeSBhbGwgd2FpdGluZyB0aHJlYWRzLCByZWxlYXNlIHRoZSBsb2NrLCAKLSAgICAvLyAgICBhbmQgY29tcGxldGUgYWJydXB0bHksIHRocm93aW5nIHRoZSBzYW1lIGV4Y2VwdGlvbiB0aGF0IHJlc3VsdGVkIGZyb20gCi0gICAgLy8gICAgdGhlIGluaXRpYWxpemluZyB0aGUgc3VwZXJjbGFzcy4KLSAgICBVc2VyQ2xhc3MqIHN1cGVyID0gZ2V0U3VwZXIoKTsKLSAgICBpZiAoc3VwZXIpIHsKLSAgICAgIFRSWSB7Ci0gICAgICAgIHN1cGVyLT5pbml0aWFsaXNlQ2xhc3MoKTsKLSAgICAgIH0gQ0FUQ0ggewotICAgICAgICBhY3F1aXJlKCk7Ci0gICAgICAgIHNldEVycm9uZW91cygpOwotICAgICAgICBzZXRPd25lckNsYXNzKDApOwotICAgICAgICBicm9hZGNhc3RDbGFzcygpOwotICAgICAgICByZWxlYXNlKCk7Ci0gICAgICB9IEVORF9DQVRDSDsKLQotICAgICAgaWYgKG11dC0+Z2V0UGVuZGluZ0V4Y2VwdGlvbigpICE9IE5VTEwpIHsKLSAgICAgICAgbXV0LT50aHJvd0l0KCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gCi0gICAgLy8gOC4gTmV4dCwgZXhlY3V0ZSBlaXRoZXIgdGhlIGNsYXNzIHZhcmlhYmxlIGluaXRpYWxpemVycyBhbmQgc3RhdGljCi0gICAgLy8gICAgaW5pdGlhbGl6ZXJzIG9mIHRoZSBjbGFzcyBvciB0aGUgZmllbGQgaW5pdGlhbGl6ZXJzIG9mIHRoZSBpbnRlcmZhY2UsCi0gICAgLy8gICAgaW4gdGV4dHVhbCBvcmRlciwgYXMgdGhvdWdoIHRoZXkgd2VyZSBhIHNpbmdsZSBibG9jaywgZXhjZXB0IHRoYXQKLSAgICAvLyAgICBmaW5hbCBzdGF0aWMgdmFyaWFibGVzIGFuZCBmaWVsZHMgb2YgaW50ZXJmYWNlcyB3aG9zZSB2YWx1ZXMgYXJlIAotICAgIC8vICAgIGNvbXBpbGUtdGltZSBjb25zdGFudHMgYXJlIGluaXRpYWxpemVkIGZpcnN0LgotICAgIAotICAgIFBSSU5UX0RFQlVHKEpOSlZNX0xPQUQsIDAsIENPTE9SX05PUk1BTCwgIjsgIiwgMCk7Ci0gICAgUFJJTlRfREVCVUcoSk5KVk1fTE9BRCwgMCwgTElHSFRfR1JFRU4sICJjbGluaXQgIiwgMCk7Ci0gICAgUFJJTlRfREVCVUcoSk5KVk1fTE9BRCwgMCwgQ09MT1JfTk9STUFMLCAiJXNcbiIsIG12bTo6UHJpbnRTdHJpbmcodGhpcykuY1N0cmluZygpKTsKLQotCi0KLSAgICBpZiAoIXZtamNlZCkgewotICAgICAgSmF2YUZpZWxkKiBmaWVsZHMgPSBjbC0+Z2V0U3RhdGljRmllbGRzKCk7Ci0gICAgICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IGNsLT5uYlN0YXRpY0ZpZWxkczsgKytpKSB7Ci0gICAgICAgIGZpZWxkc1tpXS5Jbml0U3RhdGljRmllbGQoKTsKLSAgICAgIH0KLSAgICB9Ci0gIAotICAgICAgCi0JCQotICAgIEphdmFNZXRob2QqIG1ldGggPSBsb29rdXBNZXRob2REb250VGhyb3coY2xhc3NMb2FkZXItPnZtLT51cGNhbGxzLT5jbGluaXROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXItPnZtLT51cGNhbGxzLT5jbGluaXRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZmFsc2UsIDApOwotCi0gICAgaWYgKG1ldGgpIHsKLSAgICAgIFRSWSB7Ci0gICAgICAgIG1ldGgtPmludm9rZUludFN0YXRpYyhjbCk7Ci0gICAgICB9IENBVENIIHsKLSAgICAgICAgZXhjID0gbXV0LT5nZXRQZW5kaW5nRXhjZXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydChleGMgJiYgIm5vIGV4Y2VwdGlvbj8iKTsKLQkJCQltdXQtPmNsZWFyUGVuZGluZ0V4Y2VwdGlvbigpOwotICAgICAgfSBFTkRfQ0FUQ0g7Ci0gICAgfQotCi0gICAgLy8gOS4gSWYgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgaW5pdGlhbGl6ZXJzIGNvbXBsZXRlcyBub3JtYWxseSwgdGhlbiBsb2NrCi0gICAgLy8gICAgdGhpcyBDbGFzcyBvYmplY3QsIGxhYmVsIGl0IGZ1bGx5IGluaXRpYWxpemVkLCBub3RpZnkgYWxsIHdhaXRpbmcgCi0gICAgLy8gICAgdGhyZWFkcywgcmVsZWFzZSB0aGUgbG9jaywgYW5kIGNvbXBsZXRlIHRoaXMgcHJvY2VkdXJlIG5vcm1hbGx5LgotICAgIGlmICghZXhjKSB7Ci0gICAgICBhY3F1aXJlKCk7Ci0gICAgICBzZXRJbml0aWFsaXphdGlvblN0YXRlKHJlYWR5KTsKLSAgICAgIHNldE93bmVyQ2xhc3MoMCk7Ci0gICAgICBicm9hZGNhc3RDbGFzcygpOwotICAgICAgcmVsZWFzZSgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICAvLyAxMC4gT3RoZXJ3aXNlLCB0aGUgaW5pdGlhbGl6ZXJzIG11c3QgaGF2ZSBjb21wbGV0ZWQgYWJydXB0bHkgYnkKLSAgICAvLyAgICAgdGhyb3dpbmcgc29tZSBleGNlcHRpb24gRS4gSWYgdGhlIGNsYXNzIG9mIEUgaXMgbm90IEVycm9yIG9yIG9uZQotICAgIC8vICAgICBvZiBpdHMgc3ViY2xhc3NlcywgdGhlbiBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIAotICAgIC8vICAgICBFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IsIHdpdGggRSBhcyB0aGUgYXJndW1lbnQsIGFuZCB1c2UgdGhpcwotICAgIC8vICAgICBvYmplY3QgaW4gcGxhY2Ugb2YgRSBpbiB0aGUgZm9sbG93aW5nIHN0ZXAuIEJ1dCBpZiBhIG5ldyBpbnN0YW5jZSBvZgotICAgIC8vICAgICBFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IgY2Fubm90IGJlIGNyZWF0ZWQgYmVjYXVzZSBhbgotICAgIC8vICAgICBPdXRPZk1lbW9yeUVycm9yIG9jY3VycywgdGhlbiBpbnN0ZWFkIHVzZSBhbiBPdXRPZk1lbW9yeUVycm9yIG9iamVjdAotICAgIC8vICAgICBpbiBwbGFjZSBvZiBFIGluIHRoZSBmb2xsb3dpbmcgc3RlcC4KLQkJamV4YyA9IEpuanZtOjphc0phdmFFeGNlcHRpb24oZXhjKTsKLSAgICBpZiAoamV4YyAmJiBKYXZhT2JqZWN0OjpnZXRDbGFzcyhqZXhjKS0+aXNBc3NpZ25hYmxlRnJvbShjbGFzc0xvYWRlci0+dm0tPnVwY2FsbHMtPm5ld0V4Y2VwdGlvbikpIHsKLSAgICAgIENsYXNzcGF0aCogdXBjYWxscyA9IGNsYXNzTG9hZGVyLT52bS0+dXBjYWxsczsKLSAgICAgIFVzZXJDbGFzcyogY2xFeGNwID0gdXBjYWxscy0+RXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yOwotICAgICAgb2JqID0gY2xFeGNwLT5kb05ldygpOwotICAgICAgaWYgKG9iaiA9PSBOVUxMKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW1wbGVtZW50IG1lIik7Ci0gICAgICAgIGFib3J0KCk7Ci0gICAgICB9Ci0gICAgICBKYXZhTWV0aG9kKiBpbml0ID0gdXBjYWxscy0+RXJyb3JXaXRoRXhjcEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcjsKLSAgICAgIGluaXQtPmludm9rZUludFNwZWNpYWwoY2xFeGNwLCBvYmosICZleGMpOwotICAgICAgZXhjID0gb2JqOwotICAgIH0gCi0KLSAgICAvLyAxMS4gTG9jayB0aGUgQ2xhc3Mgb2JqZWN0LCBsYWJlbCBpdCBlcnJvbmVvdXMsIG5vdGlmeSBhbGwgd2FpdGluZwotICAgIC8vICAgICB0aHJlYWRzLCByZWxlYXNlIHRoZSBsb2NrLCBhbmQgY29tcGxldGUgdGhpcyBwcm9jZWR1cmUgYWJydXB0bHkKLSAgICAvLyAgICAgd2l0aCByZWFzb24gRSBvciBpdHMgcmVwbGFjZW1lbnQgYXMgZGV0ZXJtaW5lZCBpbiB0aGUgcHJldmlvdXMgc3RlcC4KLSAgICBhY3F1aXJlKCk7Ci0gICAgc2V0RXJyb25lb3VzKCk7Ci0gICAgc2V0T3duZXJDbGFzcygwKTsKLSAgICBicm9hZGNhc3RDbGFzcygpOwotICAgIHJlbGVhc2UoKTsKLSAgICBtdXQtPnNldFBlbmRpbmdFeGNlcHRpb24oZXhjKS0+dGhyb3dJdCgpOwotICAgIHJldHVybjsKLSAgfQotfQotICAgICAgCi12b2lkIEpuanZtOjplcnJvcldpdGhFeGNwKFVzZXJDbGFzcyogY2wsIEphdmFNZXRob2QqIGluaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEphdmFPYmplY3QqIGV4Y3ApIHsKLSAgSmF2YU9iamVjdCogb2JqID0gTlVMTDsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgbGx2bV9nY3Jvb3QoZXhjcCwgMCk7Ci0KLSAgb2JqID0gY2wtPmRvTmV3KCk7Ci0gIGluaXQtPmludm9rZUludFNwZWNpYWwoY2wsIG9iaiwgJmV4Y3ApOwotICBtdm06OlRocmVhZDo6Z2V0KCktPnNldFBlbmRpbmdFeGNlcHRpb24ob2JqKS0+dGhyb3dJdCgpOwotfQotCi1KYXZhT2JqZWN0KiBKbmp2bTo6Q3JlYXRlRXJyb3IoVXNlckNsYXNzKiBjbCwgSmF2YU1ldGhvZCogaW5pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhc2NpaXopIHsKLSAgSmF2YU9iamVjdCogb2JqID0gTlVMTDsKLSAgSmF2YVN0cmluZyogc3RyID0gTlVMTDsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgbGx2bV9nY3Jvb3Qoc3RyLCAwKTsKLSAgb2JqID0gY2wtPmRvTmV3KCk7Ci0KLSAgaWYgKGFzY2lpeikgc3RyID0gYXNjaWl6VG9TdHIoYXNjaWl6KTsKLQotICBpbml0LT5pbnZva2VJbnRTcGVjaWFsKGNsLCBvYmosICZzdHIpOwotICByZXR1cm4gb2JqOwotfQotCi1KYXZhT2JqZWN0KiBKbmp2bTo6Q3JlYXRlRXJyb3IoVXNlckNsYXNzKiBjbCwgSmF2YU1ldGhvZCogaW5pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhU3RyaW5nKiBzdHIpIHsKLSAgSmF2YU9iamVjdCogb2JqID0gTlVMTDsKLSAgbGx2bV9nY3Jvb3Qoc3RyLCAwKTsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgb2JqID0gY2wtPmRvTmV3KCk7Ci0gIGluaXQtPmludm9rZUludFNwZWNpYWwoY2wsIG9iaiwgJnN0cik7Ci0gIHJldHVybiBvYmo7Ci19Ci0KLXZvaWQgSm5qdm06OmVycm9yKFVzZXJDbGFzcyogY2wsIEphdmFNZXRob2QqIGluaXQsIEphdmFTdHJpbmcqIHN0cikgewotICBKYXZhT2JqZWN0KiBvYmogPSAwOwotICBsbHZtX2djcm9vdChvYmosIDApOwotICBsbHZtX2djcm9vdChzdHIsIDApOwotICBvYmogPSBDcmVhdGVFcnJvcihjbCwgaW5pdCwgc3RyKTsKLSAgbXZtOjpUaHJlYWQ6OmdldCgpLT5zZXRQZW5kaW5nRXhjZXB0aW9uKG9iaiktPnRocm93SXQoKTsKLX0KLQotdm9pZCBKbmp2bTo6YXJyYXlTdG9yZUV4Y2VwdGlvbigpIHsKLSAgZXJyb3IodXBjYWxscy0+QXJyYXlTdG9yZUV4Y2VwdGlvbiwKLSAgICAgICAgdXBjYWxscy0+SW5pdEFycmF5U3RvcmVFeGNlcHRpb24sIChKYXZhU3RyaW5nKikwKTsKLX0KLQotdm9pZCBKbmp2bTo6aW5kZXhPdXRPZkJvdW5kcyhjb25zdCBKYXZhT2JqZWN0KiBvYmosIHNpbnQzMiBlbnRyeSkgewotICBKYXZhU3RyaW5nKiBzdHIgPSBOVUxMOwotICBsbHZtX2djcm9vdChvYmosIDApOwotICBsbHZtX2djcm9vdChzdHIsIDApOwotICBzdHIgPSAoSmF2YVN0cmluZyopdXBjYWxscy0+SW50VG9TdHJpbmctPmludm9rZUphdmFPYmplY3RTdGF0aWMoCi0gICAgICB1cGNhbGxzLT5pbnRDbGFzcywgZW50cnksIDEwKTsKLSAgZXJyb3IodXBjYWxscy0+QXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLAotICAgICAgICB1cGNhbGxzLT5Jbml0QXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLCBzdHIpOwotfQotCi12b2lkIEpuanZtOjpuZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbihzaW50MzIgc2l6ZSkgewotICBKYXZhU3RyaW5nKiBzdHIgPSBOVUxMOwotICBsbHZtX2djcm9vdChzdHIsIDApOwotICBzdHIgPSAoSmF2YVN0cmluZyopCi0gICAgdXBjYWxscy0+SW50VG9TdHJpbmctPmludm9rZUphdmFPYmplY3RTdGF0aWModXBjYWxscy0+aW50Q2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgMTApOwotICBlcnJvcih1cGNhbGxzLT5OZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbiwKLSAgICAgICAgdXBjYWxscy0+SW5pdE5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uLCBzdHIpOwotfQotCi12b2lkIEpuanZtOjpudWxsUG9pbnRlckV4Y2VwdGlvbigpIHsKLSAgZXJyb3IodXBjYWxscy0+TnVsbFBvaW50ZXJFeGNlcHRpb24sCi0gICAgICAgIHVwY2FsbHMtPkluaXROdWxsUG9pbnRlckV4Y2VwdGlvbiwgKEphdmFTdHJpbmcqKTApOwotfQotCi1KYXZhT2JqZWN0KiBKbmp2bTo6Q3JlYXRlSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihzaW50MzIgZW50cnkpIHsKLSAgSmF2YVN0cmluZyogc3RyID0gTlVMTDsKLSAgbGx2bV9nY3Jvb3Qoc3RyLCAwKTsKLSAgc3RyID0gKEphdmFTdHJpbmcqKQotICAgIHVwY2FsbHMtPkludFRvU3RyaW5nLT5pbnZva2VKYXZhT2JqZWN0U3RhdGljKHVwY2FsbHMtPmludENsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LCAxMCk7Ci0gIHJldHVybiBDcmVhdGVFcnJvcih1cGNhbGxzLT5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICB1cGNhbGxzLT5Jbml0QXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLCBzdHIpOwotfQotCi1KYXZhT2JqZWN0KiBKbmp2bTo6Q3JlYXRlTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24oKSB7Ci0gIHJldHVybiBDcmVhdGVFcnJvcih1cGNhbGxzLT5OZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgIHVwY2FsbHMtPkluaXROZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgIChKYXZhU3RyaW5nKikwKTsKLX0KLQotSmF2YU9iamVjdCogSm5qdm06OkNyZWF0ZVVuc2F0aXNmaWVkTGlua0Vycm9yKEphdmFNZXRob2QqIG1ldGgpIHsKLSAgSmF2YVN0cmluZyogc3RyID0gTlVMTDsKLSAgbGx2bV9nY3Jvb3Qoc3RyLCAwKTsKLSAgc3RyID0gY29uc3RydWN0U3RyaW5nKG1ldGgtPnRvU3RyaW5nKCkpOwotICByZXR1cm4gQ3JlYXRlRXJyb3IodXBjYWxscy0+VW5zYXRpc2ZpZWRMaW5rRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICB1cGNhbGxzLT5Jbml0VW5zYXRpc2ZpZWRMaW5rRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICBzdHIpOwotfQotCi1KYXZhT2JqZWN0KiBKbmp2bTo6Q3JlYXRlQXJpdGhtZXRpY0V4Y2VwdGlvbigpIHsKLSAgSmF2YVN0cmluZyogc3RyID0gTlVMTDsKLSAgbGx2bV9nY3Jvb3Qoc3RyLCAwKTsKLSAgc3RyID0gYXNjaWl6VG9TdHIoIi8gYnkgemVybyIpOwotICByZXR1cm4gQ3JlYXRlRXJyb3IodXBjYWxscy0+QXJpdGhtZXRpY0V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgIHVwY2FsbHMtPkluaXRBcml0aG1ldGljRXhjZXB0aW9uLCBzdHIpOwotfQotCi1KYXZhT2JqZWN0KiBKbmp2bTo6Q3JlYXRlTnVsbFBvaW50ZXJFeGNlcHRpb24oKSB7Ci0gIHJldHVybiBDcmVhdGVFcnJvcih1cGNhbGxzLT5OdWxsUG9pbnRlckV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgIHVwY2FsbHMtPkluaXROdWxsUG9pbnRlckV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgIChKYXZhU3RyaW5nKikwKTsKLX0KLQotSmF2YU9iamVjdCogSm5qdm06OkNyZWF0ZU91dE9mTWVtb3J5RXJyb3IoKSB7Ci0gIEphdmFTdHJpbmcqIHN0ciA9IE5VTEw7Ci0gIGxsdm1fZ2Nyb290KHN0ciwgMCk7Ci0gIHN0ciA9IGFzY2lpelRvU3RyKCJKYXZhIGhlYXAgc3BhY2UiKTsKLSAgcmV0dXJuIENyZWF0ZUVycm9yKHVwY2FsbHMtPk91dE9mTWVtb3J5RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICB1cGNhbGxzLT5Jbml0T3V0T2ZNZW1vcnlFcnJvciwgc3RyKTsKLX0KLQotSmF2YU9iamVjdCogSm5qdm06OkNyZWF0ZVN0YWNrT3ZlcmZsb3dFcnJvcigpIHsKLSAgLy8gRG9uJ3QgY2FsbCBpbml0LCBvciBlbHNlIHdlJ2xsIGdldCBhIG5ldyBzdGFjayBvdmVyZmxvdyBlcnJvci4KLSAgSmF2YU9iamVjdCogb2JqID0gTlVMTDsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgb2JqID0gdXBjYWxscy0+U3RhY2tPdmVyZmxvd0Vycm9yLT5kb05ldygpOwotICBKYXZhT2JqZWN0VGhyb3dhYmxlOjpmaWxsSW5TdGFja1RyYWNlKChKYXZhT2JqZWN0VGhyb3dhYmxlKilvYmopOwotICByZXR1cm4gb2JqOwotfQotCi1KYXZhT2JqZWN0KiBKbmp2bTo6Q3JlYXRlQXJyYXlTdG9yZUV4Y2VwdGlvbihKYXZhVmlydHVhbFRhYmxlKiBWVCkgewotICBKYXZhU3RyaW5nKiBzdHIgPSBOVUxMOwotICBsbHZtX2djcm9vdChzdHIsIDApOwotICBpZiAoVlQgIT0gTlVMTCkgc3RyID0gSmF2YVN0cmluZzo6aW50ZXJuYWxUb0phdmEoVlQtPmNsLT5uYW1lLCB0aGlzKTsKLSAgcmV0dXJuIENyZWF0ZUVycm9yKHVwY2FsbHMtPkFycmF5U3RvcmVFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICB1cGNhbGxzLT5Jbml0QXJyYXlTdG9yZUV4Y2VwdGlvbiwgc3RyKTsKLX0KLQotSmF2YU9iamVjdCogSm5qdm06OkNyZWF0ZUNsYXNzQ2FzdEV4Y2VwdGlvbihKYXZhT2JqZWN0KiBvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJDb21tb25DbGFzcyogY2wpIHsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgcmV0dXJuIENyZWF0ZUVycm9yKHVwY2FsbHMtPkNsYXNzQ2FzdEV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgIHVwY2FsbHMtPkluaXRDbGFzc0Nhc3RFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAoSmF2YVN0cmluZyopMCk7Ci19Ci0KLUphdmFPYmplY3QqIEpuanZtOjpDcmVhdGVMaW5rYWdlRXJyb3IoY29uc3QgY2hhciogbXNnKSB7Ci0gIEphdmFTdHJpbmcqIHN0ciA9IE5VTEw7Ci0gIGxsdm1fZ2Nyb290KHN0ciwgMCk7Ci0gIHN0ciA9IGFzY2lpelRvU3RyKG1zZyk7Ci0gIHJldHVybiBDcmVhdGVFcnJvcih1cGNhbGxzLT5MaW5rYWdlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICB1cGNhbGxzLT5Jbml0TGlua2FnZUVycm9yLCBzdHIpOwotfQotCi12b2lkIEpuanZtOjppbGxlZ2FsQWNjZXNzRXhjZXB0aW9uKGNvbnN0IGNoYXIqIG1zZykgewotICBKYXZhU3RyaW5nKiBzdHIgPSBOVUxMOwotICBsbHZtX2djcm9vdChzdHIsIDApOwotICBzdHIgPSBhc2NpaXpUb1N0cihtc2cpOwotICBlcnJvcih1cGNhbGxzLT5JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLAotICAgICAgICB1cGNhbGxzLT5Jbml0SWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgc3RyKTsKLX0KLQotdm9pZCBKbmp2bTo6aWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbihjb25zdCBKYXZhT2JqZWN0KiBvYmopIHsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgZXJyb3IodXBjYWxscy0+SWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbiwKLSAgICAgICAgdXBjYWxscy0+SW5pdElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24sCi0gICAgICAgIChKYXZhU3RyaW5nKikwKTsKLX0KLQotdm9pZCBKbmp2bTo6aW50ZXJydXB0ZWRFeGNlcHRpb24oY29uc3QgSmF2YU9iamVjdCogb2JqKSB7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gIGVycm9yKHVwY2FsbHMtPkludGVycnVwdGVkRXhjZXB0aW9uLAotICAgICAgICB1cGNhbGxzLT5Jbml0SW50ZXJydXB0ZWRFeGNlcHRpb24sCi0gICAgICAgIChKYXZhU3RyaW5nKikwKTsKLX0KLQotCi12b2lkIEpuanZtOjppbml0aWFsaXplckVycm9yKGNvbnN0IEphdmFPYmplY3QqIGV4Y3ApIHsKLSAgbGx2bV9nY3Jvb3QoZXhjcCwgMCk7Ci0gIGVycm9yV2l0aEV4Y3AodXBjYWxscy0+RXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yLAotICAgICAgICAgICAgICAgIHVwY2FsbHMtPkVycm9yV2l0aEV4Y3BFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IsCi0gICAgICAgICAgICAgICAgZXhjcCk7Ci19Ci0KLXZvaWQgSm5qdm06Omludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oY29uc3QgSmF2YU9iamVjdCogZXhjcCkgewotICBsbHZtX2djcm9vdChleGNwLCAwKTsKLSAgZXJyb3JXaXRoRXhjcCh1cGNhbGxzLT5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotICAgICAgICAgICAgICAgIHVwY2FsbHMtPkVycm9yV2l0aEV4Y3BJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotICAgICAgICAgICAgICAgIGV4Y3ApOwotfQotCi12b2lkIEpuanZtOjpvdXRPZk1lbW9yeUVycm9yKCkgewotICBKYXZhU3RyaW5nKiBzdHIgPSBOVUxMOwotICBsbHZtX2djcm9vdChzdHIsIDApOwotICBzdHIgPSBhc2NpaXpUb1N0cigiSmF2YSBoZWFwIHNwYWNlIik7Ci0gIGVycm9yKHVwY2FsbHMtPk91dE9mTWVtb3J5RXJyb3IsCi0gICAgICAgIHVwY2FsbHMtPkluaXRPdXRPZk1lbW9yeUVycm9yLCBzdHIpOwotfQotCi12b2lkIEpuanZtOjppbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oY29uc3QgY2hhciogbXNnKSB7Ci0gIEphdmFTdHJpbmcqIHN0ciA9IE5VTEw7Ci0gIGxsdm1fZ2Nyb290KHN0ciwgMCk7Ci0gIHN0ciA9IGFzY2lpelRvU3RyKG1zZyk7Ci0gIGVycm9yKHVwY2FsbHMtPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwKLSAgICAgICAgdXBjYWxscy0+SW5pdElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgc3RyKTsKLX0KLQotdm9pZCBKbmp2bTo6Y2xhc3NDYXN0RXhjZXB0aW9uKEphdmFPYmplY3QqIG9iaiwgVXNlckNvbW1vbkNsYXNzKiBjbCkgewotICBsbHZtX2djcm9vdChvYmosIDApOwotICBlcnJvcih1cGNhbGxzLT5DbGFzc0Nhc3RFeGNlcHRpb24sCi0gICAgICAgIHVwY2FsbHMtPkluaXRDbGFzc0Nhc3RFeGNlcHRpb24sCi0gICAgICAgIChKYXZhU3RyaW5nKikwKTsKLX0KLQotdm9pZCBKbmp2bTo6bm9DbGFzc0RlZkZvdW5kRXJyb3IoSmF2YU9iamVjdCogb2JqKSB7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gIGVycm9yV2l0aEV4Y3AodXBjYWxscy0+Tm9DbGFzc0RlZkZvdW5kRXJyb3IsCi0gICAgICAgIHVwY2FsbHMtPkVycm9yV2l0aEV4Y3BOb0NsYXNzRGVmRm91bmRFcnJvciwgCi0gICAgICAgIG9iaik7Ci19Ci0KLXZvaWQgSm5qdm06Omluc3RhbnRpYXRpb25FeGNlcHRpb24oVXNlckNvbW1vbkNsYXNzKiBjbCkgewotICBKYXZhU3RyaW5nKiBzdHIgPSBOVUxMOwotICBsbHZtX2djcm9vdChzdHIsIDApOwotICBzdHIgPSBpbnRlcm5hbFVURjhUb1N0cihjbC0+bmFtZSk7Ci0gIGVycm9yKHVwY2FsbHMtPkluc3RhbnRpYXRpb25FeGNlcHRpb24sIHVwY2FsbHMtPkluaXRJbnN0YW50aWF0aW9uRXhjZXB0aW9uLAotICAgICAgICBzdHIpOwotfQotCi12b2lkIEpuanZtOjppbnN0YW50aWF0aW9uRXJyb3IoVXNlckNvbW1vbkNsYXNzKiBjbCkgewotICBKYXZhU3RyaW5nKiBzdHIgPSBOVUxMOwotICBsbHZtX2djcm9vdChzdHIsIDApOwotICBzdHIgPSBpbnRlcm5hbFVURjhUb1N0cihjbC0+bmFtZSk7Ci0gIGVycm9yKHVwY2FsbHMtPkluc3RhbnRpYXRpb25FcnJvciwgdXBjYWxscy0+SW5pdEluc3RhbnRpYXRpb25FcnJvciwgc3RyKTsKLX0KLSAgCi0KLUphdmFTdHJpbmcqIENyZWF0ZU5vU3VjaE1zZyhDb21tb25DbGFzcyogY2wsIGNvbnN0IFVURjgqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSm5qdm0qIHZtKSB7Ci0gIEFycmF5VUludDE2KiBtc2cgPSBOVUxMOwotICBKYXZhU3RyaW5nKiBzdHIgPSBOVUxMOwotICBsbHZtX2djcm9vdChtc2csIDApOwotICBsbHZtX2djcm9vdChzdHIsIDApOwotICBtc2cgPSAoQXJyYXlVSW50MTYqKQotICAgIHZtLT51cGNhbGxzLT5BcnJheU9mQ2hhci0+ZG9OZXcoMTkgKyBjbC0+bmFtZS0+c2l6ZSArIG5hbWUtPnNpemUpOwotCi0gIHVpbnQzMiBpID0gMDsKLQotCi0gIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJ3UnLCBpKTsgaSsrOwotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICduJywgaSk7IGkrKzsKLSAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCAnYScsIGkpOyBpKys7Ci0gIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJ2InLCBpKTsgaSsrOwotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICdsJywgaSk7IGkrKzsKLSAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCAnZScsIGkpOyBpKys7Ci0gIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJyAnLCBpKTsgaSsrOwotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICd0JywgaSk7IGkrKzsKLSAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCAnbycsIGkpOyBpKys7Ci0gIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJyAnLCBpKTsgaSsrOwotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICdmJywgaSk7IGkrKzsKLSAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCAnaScsIGkpOyBpKys7Ci0gIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJ24nLCBpKTsgaSsrOwotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICdkJywgaSk7IGkrKzsKLSAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCAnICcsIGkpOyBpKys7Ci0KLSAgZm9yIChzaW50MzIgaiA9IDA7IGogPCBuYW1lLT5zaXplOyArK2opIHsKLSAgICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csIG5hbWUtPmVsZW1lbnRzW2pdLCBpKTsKLSAgICBpKys7Ci0gIH0KLQotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICcgJywgaSk7IGkrKzsKLSAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCAnaScsIGkpOyBpKys7Ci0gIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJ24nLCBpKTsgaSsrOwotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICcgJywgaSk7IGkrKzsKLSAgCi0gIGZvciAoc2ludDMyIGogPSAwOyBqIDwgY2wtPm5hbWUtPnNpemU7ICsraikgewotICAgIGlmIChjbC0+bmFtZS0+ZWxlbWVudHNbal0gPT0gJy8nKSB7Ci0gICAgICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICcuJywgaSk7Ci0gICAgICBpKys7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgY2wtPm5hbWUtPmVsZW1lbnRzW2ldLCBpKTsKLSAgICAgIGkrKzsKLSAgICB9Ci0gIH0KLQotICBzdHIgPSB2bS0+Y29uc3RydWN0U3RyaW5nKG1zZyk7Ci0KLSAgcmV0dXJuIHN0cjsKLX0KLQotdm9pZCBKbmp2bTo6bm9TdWNoRmllbGRFcnJvcihDb21tb25DbGFzcyogY2wsIGNvbnN0IFVURjgqIG5hbWUpIHsgCi0gIEphdmFTdHJpbmcqIHN0ciA9IE5VTEw7Ci0gIGxsdm1fZ2Nyb290KHN0ciwgMCk7Ci0gIHN0ciA9IENyZWF0ZU5vU3VjaE1zZyhjbCwgbmFtZSwgdGhpcyk7Ci0gIGVycm9yKHVwY2FsbHMtPk5vU3VjaEZpZWxkRXJyb3IsCi0gICAgICAgIHVwY2FsbHMtPkluaXROb1N1Y2hGaWVsZEVycm9yLCBzdHIpOwotfQotCi12b2lkIEpuanZtOjpub1N1Y2hNZXRob2RFcnJvcihDb21tb25DbGFzcyogY2wsIGNvbnN0IFVURjgqIG5hbWUpIHsKLSAgSmF2YVN0cmluZyogc3RyID0gTlVMTDsKLSAgbGx2bV9nY3Jvb3Qoc3RyLCAwKTsKLSAgc3RyID0gQ3JlYXRlTm9TdWNoTXNnKGNsLCBuYW1lLCB0aGlzKTsKLSAgZXJyb3IodXBjYWxscy0+Tm9TdWNoTWV0aG9kRXJyb3IsCi0gICAgICAgIHVwY2FsbHMtPkluaXROb1N1Y2hNZXRob2RFcnJvciwgc3RyKTsKLX0KLQotdm9pZCBKbmp2bTo6YWJzdHJhY3RNZXRob2RFcnJvcihDb21tb25DbGFzcyogY2wsIGNvbnN0IFVURjgqIG5hbWUpIHsKLSAgSmF2YVN0cmluZyogc3RyID0gTlVMTDsKLSAgbGx2bV9nY3Jvb3Qoc3RyLCAwKTsKLSAgc3RyID0gQ3JlYXRlTm9TdWNoTXNnKGNsLCBuYW1lLCB0aGlzKTsKLSAgZXJyb3IodXBjYWxscy0+QWJzdHJhY3RNZXRob2RFcnJvciwKLSAgICAgICAgdXBjYWxscy0+SW5pdEFic3RyYWN0TWV0aG9kRXJyb3IsIHN0cik7Ci19Ci0KLUphdmFTdHJpbmcqIENyZWF0ZVVuYWJsZVRvTG9hZChjb25zdCBVVEY4KiBuYW1lLCBKbmp2bSogdm0pIHsKLSAgQXJyYXlVSW50MTYqIG1zZyA9IE5VTEw7Ci0gIEphdmFTdHJpbmcqIHN0ciA9IE5VTEw7Ci0gIGxsdm1fZ2Nyb290KG1zZywgMCk7Ci0gIGxsdm1fZ2Nyb290KHN0ciwgMCk7Ci0KLSAgbXNnID0gKEFycmF5VUludDE2Kil2bS0+dXBjYWxscy0+QXJyYXlPZkNoYXItPmRvTmV3KDE1ICsgbmFtZS0+c2l6ZSk7Ci0gIHVpbnQzMiBpID0gMDsKLQotCi0gIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJ3UnLCBpKTsgaSsrOwotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICduJywgaSk7IGkrKzsKLSAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCAnYScsIGkpOyBpKys7Ci0gIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJ2InLCBpKTsgaSsrOwotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICdsJywgaSk7IGkrKzsKLSAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCAnZScsIGkpOyBpKys7Ci0gIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJyAnLCBpKTsgaSsrOwotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICd0JywgaSk7IGkrKzsKLSAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCAnbycsIGkpOyBpKys7Ci0gIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJyAnLCBpKTsgaSsrOwotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICdsJywgaSk7IGkrKzsKLSAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCAnbycsIGkpOyBpKys7Ci0gIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJ2EnLCBpKTsgaSsrOwotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICdkJywgaSk7IGkrKzsKLSAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCAnICcsIGkpOyBpKys7Ci0KLSAgZm9yIChzaW50MzIgaiA9IDA7IGogPCBuYW1lLT5zaXplOyArK2opIHsKLSAgICBpZiAobmFtZS0+ZWxlbWVudHNbal0gPT0gJy8nKSB7Ci0gICAgICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICcuJywgaSk7IGkrKzsKLSAgICB9IGVsc2UgewotICAgICAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCBuYW1lLT5lbGVtZW50c1tpXSwgaSk7IGkrKzsKLSAgICB9Ci0gIH0KLQotICBzdHIgPSB2bS0+Y29uc3RydWN0U3RyaW5nKG1zZyk7Ci0KLSAgcmV0dXJuIHN0cjsKLX0KLQotSmF2YVN0cmluZyogQ3JlYXRlVW5hYmxlVG9Mb2FkKEphdmFTdHJpbmcqIG5hbWUsIEpuanZtKiB2bSkgewotICBKYXZhU3RyaW5nKiBzdHIgPSBOVUxMOwotICBBcnJheVVJbnQxNiogbXNnID0gTlVMTDsKLSAgbGx2bV9nY3Jvb3QobXNnLCAwKTsKLSAgbGx2bV9nY3Jvb3Qoc3RyLCAwKTsKLQotICBtc2cgPSAoQXJyYXlVSW50MTYqKXZtLT51cGNhbGxzLT5BcnJheU9mQ2hhci0+ZG9OZXcoMTUgKyBuYW1lLT5jb3VudCk7Ci0gIHVpbnQzMiBpID0gMDsKLQotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICd1JywgaSk7IGkrKzsKLSAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCAnbicsIGkpOyBpKys7Ci0gIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJ2EnLCBpKTsgaSsrOwotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICdiJywgaSk7IGkrKzsKLSAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCAnbCcsIGkpOyBpKys7Ci0gIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJ2UnLCBpKTsgaSsrOwotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICcgJywgaSk7IGkrKzsKLSAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCAndCcsIGkpOyBpKys7Ci0gIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJ28nLCBpKTsgaSsrOwotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICcgJywgaSk7IGkrKzsKLSAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCAnbCcsIGkpOyBpKys7Ci0gIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJ28nLCBpKTsgaSsrOwotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICdhJywgaSk7IGkrKzsKLSAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCAnZCcsIGkpOyBpKys7Ci0gIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJyAnLCBpKTsgaSsrOwotCi0gIGZvciAoc2ludDMyIGogPSBuYW1lLT5vZmZzZXQ7IGogPCBuYW1lLT5vZmZzZXQgKyBuYW1lLT5jb3VudDsgKytqKSB7Ci0gICAgaWYgKEFycmF5VUludDE2OjpnZXRFbGVtZW50KEphdmFTdHJpbmc6OmdldFZhbHVlKG5hbWUpLCBqKSA9PSAnLycpIHsKLSAgICAgIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJy4nLCBpKTsgaSsrOwotICAgIH0gZWxzZSB7Ci0gICAgICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csIEFycmF5VUludDE2OjpnZXRFbGVtZW50KEphdmFTdHJpbmc6OmdldFZhbHVlKG5hbWUpLCBqKSwgaSk7Ci0gICAgfQotICB9Ci0KLSAgc3RyID0gdm0tPmNvbnN0cnVjdFN0cmluZyhtc2cpOwotCi0gIHJldHVybiBzdHI7Ci19Ci0KLQotCi12b2lkIEpuanZtOjpub0NsYXNzRGVmRm91bmRFcnJvcihjb25zdCBVVEY4KiBuYW1lKSB7Ci0gIEphdmFTdHJpbmcqIHN0ciA9IE5VTEw7Ci0gIGxsdm1fZ2Nyb290KHN0ciwgMCk7Ci0gIHN0ciA9IENyZWF0ZVVuYWJsZVRvTG9hZChuYW1lLCB0aGlzKTsKLSAgZXJyb3IodXBjYWxscy0+Tm9DbGFzc0RlZkZvdW5kRXJyb3IsCi0gICAgICAgIHVwY2FsbHMtPkluaXROb0NsYXNzRGVmRm91bmRFcnJvciwgc3RyKTsKLX0KLQotdm9pZCBKbmp2bTo6Y2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihKYXZhU3RyaW5nKiBuYW1lKSB7Ci0gIEphdmFTdHJpbmcqIHN0ciA9IE5VTEw7Ci0gIGxsdm1fZ2Nyb290KHN0ciwgMCk7Ci0gIHN0ciA9IENyZWF0ZVVuYWJsZVRvTG9hZChuYW1lLCB0aGlzKTsKLSAgZXJyb3IodXBjYWxscy0+Q2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwKLSAgICAgICAgdXBjYWxscy0+SW5pdENsYXNzTm90Rm91bmRFeGNlcHRpb24sIHN0cik7Ci19Ci0KLXZvaWQgSm5qdm06Om5vQ2xhc3NEZWZGb3VuZEVycm9yKFVzZXJDbGFzcyogY2wsIGNvbnN0IFVURjgqIG5hbWUpIHsKLSAgQXJyYXlVSW50MTYqIG1zZyA9IE5VTEw7Ci0gIEphdmFTdHJpbmcqIHN0ciA9IE5VTEw7Ci0gIGxsdm1fZ2Nyb290KG1zZywgMCk7Ci0gIGxsdm1fZ2Nyb290KHN0ciwgMCk7Ci0KLSAgdWludDMyIHNpemUgPSAzNSArIG5hbWUtPnNpemUgKyBjbC0+bmFtZS0+c2l6ZTsKLSAgbXNnID0gKEFycmF5VUludDE2Kil1cGNhbGxzLT5BcnJheU9mQ2hhci0+ZG9OZXcoc2l6ZSk7Ci0gIHVpbnQzMiBpID0gMDsKLQotCi0gIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJ3QnLCBpKTsKLSAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCAncicsIGkpOwotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICd5JywgaSk7Ci0gIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJyAnLCBpKTsKLSAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCAndCcsIGkpOwotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICdvJywgaSk7Ci0gIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJyAnLCBpKTsKLSAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCAnbCcsIGkpOwotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICdvJywgaSk7Ci0gIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJ2EnLCBpKTsKLSAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCAnZCcsIGkpOwotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICcgJywgaSk7Ci0KLSAgZm9yIChzaW50MzIgaiA9IDA7IGogPCBjbC0+bmFtZS0+c2l6ZTsgKytqKSB7Ci0gICAgaWYgKGNsLT5uYW1lLT5lbGVtZW50c1tqXSA9PSAnLycpIHsKLSAgICAgIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJy4nLCBpKTsgaSsrOwotICAgIH0gZWxzZSB7Ci0gICAgICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csIGNsLT5uYW1lLT5lbGVtZW50c1tqXSwgaSk7IGkrKzsKLSAgICB9Ci0gIH0KLSAgCi0gIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJyAnLCBpKTsgaSsrOwotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICdhJywgaSk7IGkrKzsKLSAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCAnbicsIGkpOyBpKys7Ci0gIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJ2QnLCBpKTsgaSsrOwotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICcgJywgaSk7IGkrKzsKLSAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCAnZicsIGkpOyBpKys7Ci0gIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJ28nLCBpKTsgaSsrOwotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICd1JywgaSk7IGkrKzsKLSAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCAnbicsIGkpOyBpKys7Ci0gIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJ2QnLCBpKTsgaSsrOwotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICcgJywgaSk7IGkrKzsKLSAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCAnYycsIGkpOyBpKys7Ci0gIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJ2wnLCBpKTsgaSsrOwotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICdhJywgaSk7IGkrKzsKLSAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCAncycsIGkpOyBpKys7Ci0gIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJ3MnLCBpKTsgaSsrOwotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICcgJywgaSk7IGkrKzsKLSAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCAnbicsIGkpOyBpKys7Ci0gIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJ2EnLCBpKTsgaSsrOwotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICdtJywgaSk7IGkrKzsKLSAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCAnZScsIGkpOyBpKys7Ci0gIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgJ2QnLCBpKTsgaSsrOwotICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudChtc2csICcgJywgaSk7IGkrKzsKLSAgCi0gIGZvciAoc2ludDMyIGogPSAwOyBqIDwgbmFtZS0+c2l6ZTsgKytqKSB7Ci0gICAgaWYgKG5hbWUtPmVsZW1lbnRzW2pdID09ICcvJykgewotICAgICAgQXJyYXlVSW50MTY6OnNldEVsZW1lbnQobXNnLCAnLicsIGkpOyBpKys7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFycmF5VUludDE2OjpzZXRFbGVtZW50KG1zZywgbmFtZS0+ZWxlbWVudHNbal0sIGkpOyBpKys7Ci0gICAgfQotICB9Ci0gCi0gIGFzc2VydChpID09IHNpemUgJiYgIkFycmF5IG92ZXJmbG93Iik7Ci0KLSAgc3RyID0gY29uc3RydWN0U3RyaW5nKG1zZyk7Ci0gIGVycm9yKHVwY2FsbHMtPk5vQ2xhc3NEZWZGb3VuZEVycm9yLCB1cGNhbGxzLT5Jbml0Tm9DbGFzc0RlZkZvdW5kRXJyb3IsIHN0cik7Ci19Ci0KLQotdm9pZCBKbmp2bTo6Y2xhc3NGb3JtYXRFcnJvcihjb25zdCBjaGFyKiBtc2cpIHsKLSAgSmF2YVN0cmluZyogc3RyID0gTlVMTDsKLSAgbGx2bV9nY3Jvb3Qoc3RyLCAwKTsKLSAgc3RyID0gYXNjaWl6VG9TdHIobXNnKTsKLSAgZXJyb3IodXBjYWxscy0+Q2xhc3NGb3JtYXRFcnJvciwgdXBjYWxscy0+SW5pdENsYXNzRm9ybWF0RXJyb3IsIHN0cik7Ci19Ci0KLUphdmFTdHJpbmcqIEpuanZtOjppbnRlcm5hbFVURjhUb1N0cihjb25zdCBVVEY4KiB1dGY4KSB7Ci0gIEFycmF5VUludDE2KiB0bXAgPSBOVUxMOwotICBsbHZtX2djcm9vdCh0bXAsIDApOwotICB1aW50MzIgc2l6ZSA9IHV0ZjgtPnNpemU7Ci0gIHRtcCA9IChBcnJheVVJbnQxNiopdXBjYWxscy0+QXJyYXlPZkNoYXItPmRvTmV3KHNpemUpOwotICAKLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICBBcnJheVVJbnQxNjo6c2V0RWxlbWVudCh0bXAsIHV0ZjgtPmVsZW1lbnRzW2ldLCBpKTsKLSAgfQotICAKLSAgcmV0dXJuIGhhc2hTdHIubG9va3VwT3JDcmVhdGUoY29uc3RfY2FzdDxjb25zdCBBcnJheVVJbnQxNiomPih0bXApLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhU3RyaW5nOjpzdHJpbmdEdXApOwotfQotCi1KYXZhU3RyaW5nKiBKbmp2bTo6Y29uc3RydWN0U3RyaW5nKGNvbnN0IEFycmF5VUludDE2KiBhcnJheSkgeyAKLSAgSmF2YVN0cmluZyogcmVzID0gTlVMTDsKLSAgbGx2bV9nY3Jvb3QoYXJyYXksIDApOwotICBsbHZtX2djcm9vdChyZXMsIDApOwotICByZXMgPSBoYXNoU3RyLmxvb2t1cE9yQ3JlYXRlKGFycmF5LCB0aGlzLCBKYXZhU3RyaW5nOjpzdHJpbmdEdXApOwotICByZXR1cm4gcmVzOwotfQotCi1KYXZhU3RyaW5nKiBKbmp2bTo6YXNjaWl6VG9TdHIoY29uc3QgY2hhciogYXNjaWl6KSB7Ci0gIEFycmF5VUludDE2KiB2YXIgPSBOVUxMOwotICBsbHZtX2djcm9vdCh2YXIsIDApOwotICBhc3NlcnQoYXNjaWl6ICYmICJObyBhc2NpaXogZ2l2ZW4iKTsKLSAgdmFyID0gYXNjaWl6VG9BcnJheShhc2NpaXopOwotICByZXR1cm4gY29uc3RydWN0U3RyaW5nKHZhcik7Ci19Ci0KLXZvaWQgSm5qdm06OmFkZFByb3BlcnR5KGNoYXIqIGtleSwgY2hhciogdmFsdWUpIHsKLSAgcG9zdFByb3BlcnRpZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGtleSwgdmFsdWUpKTsKLX0KLQotLy8gTWltaWMgd2hhdCdzIGhhcHBlbmluZyBpbiBDbGFzc3BhdGggd2hlbiBjcmVhdGluZyBhIGphdmEubGFuZy5DbGFzcyBvYmplY3QuCi1KYXZhT2JqZWN0KiBVc2VyQ29tbW9uQ2xhc3M6OmdldENsYXNzRGVsZWdhdGVlKEphdmFPYmplY3QqIHBkKSB7Ci0gIEphdmFPYmplY3RDbGFzcyogZGVsZWdhdGVlID0gMDsKLSAgSmF2YU9iamVjdENsYXNzKiBiYXNlID0gMDsKLSAgbGx2bV9nY3Jvb3QocGQsIDApOwotICBsbHZtX2djcm9vdChkZWxlZ2F0ZWUsIDApOwotICBsbHZtX2djcm9vdChiYXNlLCAwKTsKLQotICBpZiAoZ2V0RGVsZWdhdGVlKCkgPT0gTlVMTCkgewotICAgIFVzZXJDbGFzcyogY2wgPSBjbGFzc0xvYWRlci0+dm0tPnVwY2FsbHMtPm5ld0NsYXNzOwotICAgIGRlbGVnYXRlZSA9IChKYXZhT2JqZWN0Q2xhc3MqKWNsLT5kb05ldygpOwotICAgIEphdmFPYmplY3RDbGFzczo6c2V0Q2xhc3MoZGVsZWdhdGVlLCB0aGlzKTsKLSAgICBpZiAocGQgPT0gTlVMTCAmJiBpc0FycmF5KCkpIHsKLSAgICAgIGJhc2UgPSAoSmF2YU9iamVjdENsYXNzKikKLSAgICAgICAgYXNBcnJheUNsYXNzKCktPmJhc2VDbGFzcygpLT5nZXRDbGFzc0RlbGVnYXRlZShwZCk7Ci0gICAgICBKYXZhT2JqZWN0Q2xhc3M6OnNldFByb3RlY3Rpb25Eb21haW4oCi0gICAgICAgIGRlbGVnYXRlZSwgSmF2YU9iamVjdENsYXNzOjpnZXRQcm90ZWN0aW9uRG9tYWluKGJhc2UpKTsKLSAgICB9IGVsc2UgewotICAgICAgSmF2YU9iamVjdENsYXNzOjpzZXRQcm90ZWN0aW9uRG9tYWluKGRlbGVnYXRlZSwgcGQpOwotICAgIH0KLSAgICBzZXREZWxlZ2F0ZWUoZGVsZWdhdGVlKTsKLSAgfQotICByZXR1cm4gZ2V0RGVsZWdhdGVlKCk7Ci19Ci0KLUphdmFPYmplY3QqIGNvbnN0KiBVc2VyQ29tbW9uQ2xhc3M6OmdldENsYXNzRGVsZWdhdGVlUHRyKEphdmFPYmplY3QqIHBkKSB7Ci0gIGxsdm1fZ2Nyb290KHBkLCAwKTsKLSAgLy8gTWFrZSBzdXJlIGl0J3MgY3JlYXRlZC4KLSAgZ2V0Q2xhc3NEZWxlZ2F0ZWUocGQpOwotICByZXR1cm4gZ2V0RGVsZWdhdGVlUHRyKCk7Ci19Ci0KLSNkZWZpbmUgUEFUSF9NQU5JRkVTVCAiTUVUQS1JTkYvTUFOSUZFU1QuTUYiCi0jZGVmaW5lIE1BSU5fQ0xBU1MgIk1haW4tQ2xhc3M6ICIKLSNkZWZpbmUgTUFJTl9MT1dFUl9DTEFTUyAiTWFpbi1jbGFzczogIgotI2RlZmluZSBQUkVNQUlOX0NMQVNTICJQcmVtYWluLUNsYXNzOiAiCi0jZGVmaW5lIEJPT1RfQ0xBU1NfUEFUSCAiQm9vdC1DbGFzcy1QYXRoOiAiCi0jZGVmaW5lIENBTl9SRURFRklORV9DTEFTU19QQVRIICJDYW4tUmVkZWZpbmUtQ2xhc3NlczogIgotCi0jZGVmaW5lIExFTkdUSF9NQUlOX0NMQVNTIDEyCi0jZGVmaW5lIExFTkdUSF9QUkVNQUlOX0NMQVNTIDE1Ci0jZGVmaW5lIExFTkdUSF9CT09UX0NMQVNTX1BBVEggMTcKLQotZXh0ZXJuICJDIiBzdHJ1Y3QgSk5JTmF0aXZlSW50ZXJmYWNlIEpOSV9KTklFbnZUYWJsZTsKLWV4dGVybiAiQyIgY29uc3Qgc3RydWN0IEpOSUludm9rZUludGVyZmFjZSBKTklfSmF2YVZNVGFibGU7Ci0KLXZvaWQgQ2xBcmd1bWVudHNJbmZvOjpqYXZhQWdlbnQoY2hhciogY3VyKSB7Ci0gIGFzc2VydCgwICYmICJpbXBsZW1lbnQgbWUiKTsKLX0KLQotZXh0ZXJuICJDIiBpbnQgc3lzX3N0cm5zdHIoY29uc3QgY2hhciAqaGF5c3RhY2ssIGNvbnN0IGNoYXIgKm5lZWRsZSkgewotICBjb25zdCBjaGFyKiByZXMgPSBzdHJzdHIoaGF5c3RhY2ssIG5lZWRsZSk7Ci0gIGlmIChyZXMpIHJldHVybiByZXMgLSBoYXlzdGFjazsKLSAgZWxzZSByZXR1cm4gLTE7IAotfQotCi0KLXN0YXRpYyBjaGFyKiBmaW5kSW5mb3JtYXRpb24oSm5qdm0qIHZtLCBDbGFzc0J5dGVzKiBtYW5pZmVzdCwgY29uc3QgY2hhciogZW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBsZW4pIHsKLSAgc2ludDMyIGluZGV4ID0gc3lzX3N0cm5zdHIoKGNoYXIqKW1hbmlmZXN0LT5lbGVtZW50cywgZW50cnkpOwotICBpZiAoaW5kZXggIT0gLTEpIHsKLSAgICBpbmRleCArPSBsZW47Ci0gICAgc2ludDMyIGVuZCA9IHN5c19zdHJuc3RyKChjaGFyKiltYW5pZmVzdC0+ZWxlbWVudHMgKyBpbmRleCwgIlxuIik7Ci0gICAgaWYgKGVuZCA9PSAtMSkgZW5kID0gbWFuaWZlc3QtPnNpemU7Ci0gICAgZWxzZSBlbmQgKz0gaW5kZXg7Ci0KLSAgICBzaW50MzIgbGVuZ3RoID0gZW5kIC0gaW5kZXggLSAxOwotICAgIGNoYXIqIG5hbWUgPSAoY2hhciopdm0tPmFsbG9jYXRvci5BbGxvY2F0ZShsZW5ndGggKyAxLCAiY2xhc3MgbmFtZSIpOwotICAgIG1lbWNweShuYW1lLCBtYW5pZmVzdC0+ZWxlbWVudHMgKyBpbmRleCwgbGVuZ3RoKTsKLSAgICBuYW1lW2xlbmd0aF0gPSAwOwotICAgIHJldHVybiBuYW1lOwotICB9IGVsc2UgewotICAgIHJldHVybiAwOwotICB9Ci19Ci0KLXZvaWQgQ2xBcmd1bWVudHNJbmZvOjpleHRyYWN0Q2xhc3NGcm9tSmFyKEpuanZtKiB2bSwgaW50IGFyZ2MsIGNoYXIqKiBhcmd2LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpKSB7Ci0gIENsYXNzQnl0ZXMqIGJ5dGVzID0gTlVMTDsKLSAgQ2xhc3NCeXRlcyogcmVzID0gTlVMTDsKLSAgamFyRmlsZSA9IGFyZ3ZbaV07Ci0KLSAgdm0tPnNldENsYXNzcGF0aChqYXJGaWxlKTsKLSAgCi0gIGJ5dGVzID0gUmVhZGVyOjpvcGVuRmlsZSh2bS0+Ym9vdHN0cmFwTG9hZGVyLCBqYXJGaWxlKTsKLQotICBpZiAoYnl0ZXMgPT0gTlVMTCkgewotICAgIHByaW50ZigiVW5hYmxlIHRvIGFjY2VzcyBqYXJmaWxlICVzXG4iLCBqYXJGaWxlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBtdm06OkJ1bXBQdHJBbGxvY2F0b3IgYWxsb2NhdG9yOwotICBaaXBBcmNoaXZlKiBhcmNoaXZlID0gbmV3KGFsbG9jYXRvciwgIlRlbXBaaXBBcmNoaXZlIikKLSAgICAgIFppcEFyY2hpdmUoYnl0ZXMsIGFsbG9jYXRvcik7Ci0gIGlmIChhcmNoaXZlLT5nZXRPZnNjZCgpICE9IC0xKSB7Ci0gICAgWmlwRmlsZSogZmlsZSA9IGFyY2hpdmUtPmdldEZpbGUoUEFUSF9NQU5JRkVTVCk7Ci0gICAgaWYgKGZpbGUgIT0gTlVMTCkgewotICAgICAgcmVzID0gbmV3IChhbGxvY2F0b3IsIGZpbGUtPnVjc2l6ZSkgQ2xhc3NCeXRlcyhmaWxlLT51Y3NpemUpOwotICAgICAgaW50IG9rID0gYXJjaGl2ZS0+cmVhZEZpbGUocmVzLCBmaWxlKTsKLSAgICAgIGlmIChvaykgewotICAgICAgICBjaGFyKiBtYWluQ2xhc3MgPSBmaW5kSW5mb3JtYXRpb24odm0sIHJlcywgTUFJTl9DTEFTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExFTkdUSF9NQUlOX0NMQVNTKTsKLSAgICAgICAgaWYgKG1haW5DbGFzcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgbWFpbkNsYXNzID0gZmluZEluZm9ybWF0aW9uKHZtLCByZXMsIE1BSU5fTE9XRVJfQ0xBU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExFTkdUSF9NQUlOX0NMQVNTKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWFpbkNsYXNzICE9IE5VTEwpIHsKLSAgICAgICAgICBjbGFzc05hbWUgPSBtYWluQ2xhc3M7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcHJpbnRmKCJObyBNYWluLUNsYXNzOiAgaW4gTWFuaWZlc3Qgb2YgYXJjaGl2ZSAlcy5cbiIsIGphckZpbGUpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIkNhbid0IGV4dHJhY3QgTWFuaWZlc3QgZmlsZSBmcm9tIGFyY2hpdmUgJXNcbiIsIGphckZpbGUpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBwcmludGYoIkNhbid0IGZpbmQgTWFuaWZlc3QgZmlsZSBpbiBhcmNoaXZlICVzXG4iLCBqYXJGaWxlKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJDYW4ndCBmaW5kIGFyY2hpdmUgJXNcbiIsIGphckZpbGUpOwotICB9Ci19Ci0KLXZvaWQgQ2xBcmd1bWVudHNJbmZvOjpueWkoKSB7Ci0gIGZwcmludGYoc3Rkb3V0LCAiTm90IHlldCBpbXBsZW1lbnRlZFxuIik7Ci19Ci0KLXZvaWQgQ2xBcmd1bWVudHNJbmZvOjpwcmludFZlcnNpb24oKSB7Ci0gIGZwcmludGYoc3Rkb3V0LCAiSjMgZm9yIEphdmEgMS4xIC0tIDEuNVxuIik7Ci19Ci0KLXZvaWQgQ2xBcmd1bWVudHNJbmZvOjpwcmludEluZm9ybWF0aW9uKCkgewotICBmcHJpbnRmKHN0ZG91dCwgCi0gICJVc2FnZTogajMgWy1vcHRpb25zXSBjbGFzcyBbYXJncy4uLl0gKHRvIGV4ZWN1dGUgYSBjbGFzcylcbiIKLSAgICJvciAgajMgWy1vcHRpb25zXSAtamFyIGphcmZpbGUgW2FyZ3MuLi5dXG4iCi0gICAgICAgICAgICIodG8gZXhlY3V0ZSBhIGphciBmaWxlKSB3aGVyZSBvcHRpb25zIGluY2x1ZGU6XG4iCi0gICAgIi1jcCA8Y2xhc3Mgc2VhcmNoIHBhdGggb2YgZGlyZWN0b3JpZXMgYW5kIHppcC9qYXIgZmlsZXM+XG4iCi0gICAgIi1jbGFzc3BhdGggPGNsYXNzIHNlYXJjaCBwYXRoIG9mIGRpcmVjdG9yaWVzIGFuZCB6aXAvamFyIGZpbGVzPlxuIgotICAgICIgICAgICAgICAgICAgIEEgOiBzZXBhcmF0ZWQgbGlzdCBvZiBkaXJlY3RvcmllcywgSkFSIGFyY2hpdmVzLFxuIgotICAgICIgICAgICAgICAgICAgIGFuZCBaSVAgYXJjaGl2ZXMgdG8gc2VhcmNoIGZvciBjbGFzcyBmaWxlcy5cbiIKLSAgICAiLUQ8bmFtZT49PHZhbHVlPlxuIgotICAgICIgICAgICAgICAgICAgIHNldCBhIHN5c3RlbSBwcm9wZXJ0eVxuIgotICAgICItdmVyYm9zZVs6Y2xhc3N8Z2N8am5pXVxuIgotICAgICIgICAgICAgICAgICAgIGVuYWJsZSB2ZXJib3NlIG91dHB1dFxuIgotICAgICItdmVyc2lvbiAgICAgIHByaW50IHByb2R1Y3QgdmVyc2lvbiBhbmQgZXhpdFxuIgotICAgICItdmVyc2lvbjo8dmFsdWU+XG4iCi0gICAgIiAgICAgICAgICAgICAgcmVxdWlyZSB0aGUgc3BlY2lmaWVkIHZlcnNpb24gdG8gcnVuXG4iCi0gICAgIi1zaG93dmVyc2lvbiAgcHJpbnQgcHJvZHVjdCB2ZXJzaW9uIGFuZCBjb250aW51ZVxuIgotICAgICItanJlLXJlc3RyaWN0LXNlYXJjaCB8IC1qcmUtbm8tcmVzdHJpY3Qtc2VhcmNoXG4iCi0gICAgIiAgICAgICAgICAgICAgaW5jbHVkZS9leGNsdWRlIHVzZXIgcHJpdmF0ZSBKUkVzIGluIHRoZSB2ZXJzaW9uIHNlYXJjaFxuIgotICAgICItPyAtaGVscCAgICAgIHByaW50IHRoaXMgaGVscCBtZXNzYWdlXG4iCi0gICAgIi1YICAgICAgICAgICAgcHJpbnQgaGVscCBvbiBub24tc3RhbmRhcmQgb3B0aW9uc1xuIgotICAgICItZWFbOjxwYWNrYWdlbmFtZT4uLi58OjxjbGFzc25hbWU+XVxuIgotICAgICItZW5hYmxlYXNzZXJ0aW9uc1s6PHBhY2thZ2VuYW1lPi4uLnw6PGNsYXNzbmFtZT5dXG4iCi0gICAgIiAgICAgICAgICAgICAgZW5hYmxlIGFzc2VydGlvbnNcbiIKLSAgICAiLWRhWzo8cGFja2FnZW5hbWU+Li4ufDo8Y2xhc3NuYW1lPl1cbiIKLSAgICAiLWRpc2FibGVhc3NlcnRpb25zWzo8cGFja2FnZW5hbWU+Li4ufDo8Y2xhc3NuYW1lPl1cbiIKLSAgICAiICAgICAgICAgICAgICBkaXNhYmxlIGFzc2VydGlvbnNcbiIKLSAgICAiLWVzYSB8IC1lbmFibGVzeXN0ZW1hc3NlcnRpb25zXG4iCi0gICAgIiAgICAgICAgICAgICAgZW5hYmxlIHN5c3RlbSBhc3NlcnRpb25zXG4iCi0gICAgIi1kc2EgfCAtZGlzYWJsZXN5c3RlbWFzc2VydGlvbnNcbiIKLSAgICAiICAgICAgICAgICAgICBkaXNhYmxlIHN5c3RlbSBhc3NlcnRpb25zXG4iCi0gICAgIi1hZ2VudGxpYjo8bGlibmFtZT5bPTxvcHRpb25zPl1cbiIKLSAgICAiICAgICAgICAgICAgICBsb2FkIG5hdGl2ZSBhZ2VudCBsaWJyYXJ5IDxsaWJuYW1lPiwgZS5nLiAtYWdlbnRsaWI6aHByb2ZcbiIKLSAgICAiICAgICAgICAgICAgICAgIHNlZSBhbHNvLCAtYWdlbnRsaWI6amR3cD1oZWxwIGFuZCAtYWdlbnRsaWI6aHByb2Y9aGVscFxuIgotICAgICItYWdlbnRwYXRoOjxwYXRobmFtZT5bPTxvcHRpb25zPl1cbiIKLSAgICAiICAgICAgICAgICAgICBsb2FkIG5hdGl2ZSBhZ2VudCBsaWJyYXJ5IGJ5IGZ1bGwgcGF0aG5hbWVcbiIKLSAgICAiLWphdmFhZ2VudDo8amFycGF0aD5bPTxvcHRpb25zPl1cbiIKLSAgICAiICAgICAgIGxvYWQgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZSBhZ2VudCwgc2VlIGphdmEubGFuZy5pbnN0cnVtZW50XG4iKTsKLX0KLQotdm9pZCBDbEFyZ3VtZW50c0luZm86OnJlYWRBcmdzKEpuanZtKiB2bSkgewotICBjbGFzc05hbWUgPSAwOwotICBhcHBBcmd1bWVudHNQb3MgPSAwOwotICBzaW50MzIgaSA9IDE7Ci0gIGlmIChpID09IGFyZ2MpIHByaW50SW5mb3JtYXRpb24oKTsKLSAgd2hpbGUgKGkgPCBhcmdjKSB7Ci0gICAgY2hhciogY3VyID0gYXJndltpXTsKLSAgICBpZiAoIShzdHJjbXAoY3VyLCAiLWNsYXNzcGF0aCIpKSkgewotICAgICAgKytpOwotICAgICAgaWYgKGkgPT0gYXJnYykgcHJpbnRJbmZvcm1hdGlvbigpOwotICAgICAgZWxzZSB2bS0+c2V0Q2xhc3NwYXRoKGFyZ3ZbaV0pOwotICAgIH0gZWxzZSBpZiAoIShzdHJjbXAoY3VyLCAiLWNwIikpKSB7Ci0gICAgICArK2k7Ci0gICAgICBpZiAoaSA9PSBhcmdjKSBwcmludEluZm9ybWF0aW9uKCk7Ci0gICAgICBlbHNlIHZtLT5zZXRDbGFzc3BhdGgoYXJndltpXSk7Ci0gICAgfSBlbHNlIGlmICghKHN0cm5jbXAoY3VyLCAiLUQiLCAyKSkpIHsKLSAgICAgIHVpbnQzMiBsZW4gPSBzdHJsZW4oY3VyKTsKLSAgICAgIGlmIChsZW4gPT0gMikgewotICAgICAgICBwcmludEluZm9ybWF0aW9uKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjaGFyKiBrZXkgPSAmY3VyWzJdOwotICAgICAgICBjaGFyKiB2YWx1ZSA9IHN0cmNocihrZXksICc9Jyk7Ci0gICAgICAgIGlmICghdmFsdWUpIHsKLSAgICAgICAgICBwcmludEluZm9ybWF0aW9uKCk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHZhbHVlWzBdID0gMDsKLSAgICAgICAgICB2bS0+YWRkUHJvcGVydHkoa2V5LCAmdmFsdWVbMV0pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICghKHN0cm5jbXAoY3VyLCAiLVhib290Y2xhc3NwYXRoOiIsIDE2KSkpIHsKLSAgICAgIHVpbnQzMiBsZW4gPSBzdHJsZW4oY3VyKTsKLSAgICAgIGlmIChsZW4gPT0gMTYpIHsKLSAgICAgICAgcHJpbnRJbmZvcm1hdGlvbigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY2hhciogcGF0aCA9ICZjdXJbMTZdOwotICAgICAgICB2bS0+Ym9vdHN0cmFwTG9hZGVyLT5hbmFseXNlQ2xhc3NwYXRoRW52KHBhdGgpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoIShzdHJjbXAoY3VyLCAiLWVuYWJsZWFzc2VydGlvbnMiKSkpIHsKLSAgICAgIG55aSgpOwotICAgIH0gZWxzZSBpZiAoIShzdHJjbXAoY3VyLCAiLWVhIikpKSB7Ci0gICAgICBueWkoKTsKLSAgICB9IGVsc2UgaWYgKCEoc3RyY21wKGN1ciwgIi1kaXNhYmxlYXNzZXJ0aW9ucyIpKSkgewotICAgICAgbnlpKCk7Ci0gICAgfSBlbHNlIGlmICghKHN0cmNtcChjdXIsICItZGEiKSkpIHsKLSAgICAgIG55aSgpOwotICAgIH0gZWxzZSBpZiAoIShzdHJjbXAoY3VyLCAiLWVuYWJsZXN5c3RlbWFzc2VydGlvbnMiKSkpIHsKLSAgICAgIG55aSgpOwotICAgIH0gZWxzZSBpZiAoIShzdHJjbXAoY3VyLCAiLWVzYSIpKSkgewotICAgICAgbnlpKCk7Ci0gICAgfSBlbHNlIGlmICghKHN0cmNtcChjdXIsICItZGlzYWJsZXN5c3RlbWFzc2VydGlvbnMiKSkpIHsKLSAgICAgIG55aSgpOwotICAgIH0gZWxzZSBpZiAoIShzdHJjbXAoY3VyLCAiLWRzYSIpKSkgewotICAgICAgbnlpKCk7Ci0gICAgfSBlbHNlIGlmICghKHN0cmNtcChjdXIsICItamFyIikpKSB7Ci0gICAgICArK2k7Ci0gICAgICBpZiAoaSA9PSBhcmdjKSB7Ci0gICAgICAgIHByaW50SW5mb3JtYXRpb24oKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGV4dHJhY3RDbGFzc0Zyb21KYXIodm0sIGFyZ2MsIGFyZ3YsIGkpOwotICAgICAgICBhcHBBcmd1bWVudHNQb3MgPSBpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICghKHN0cmNtcChjdXIsICItanJlLXJlc3RyaWN0LXJlc2VhcmNoIikpKSB7Ci0gICAgICBueWkoKTsKLSAgICB9IGVsc2UgaWYgKCEoc3RyY21wKGN1ciwgIi1qcmUtbm8tcmVzdHJpY3QtcmVzZWFyY2giKSkpIHsKLSAgICAgIG55aSgpOwotICAgIH0gZWxzZSBpZiAoIShzdHJjbXAoY3VyLCAiLW5vY2xhc3NnYyIpKSkgewotICAgICAgbnlpKCk7Ci0gICAgfSBlbHNlIGlmICghKHN0cmNtcChjdXIsICItbXMiKSkpIHsKLSAgICAgIG55aSgpOwotICAgIH0gZWxzZSBpZiAoIShzdHJjbXAoY3VyLCAiLW14IikpKSB7Ci0gICAgICBueWkoKTsKLSAgICB9IGVsc2UgaWYgKCEoc3RyY21wKGN1ciwgIi1zcyIpKSkgewotICAgICAgbnlpKCk7Ci0gICAgfSBlbHNlIGlmICghKHN0cmNtcChjdXIsICItdmVyYm9zZSIpKSkgewotICAgICAgbnlpKCk7Ci0gICAgfSBlbHNlIGlmICghKHN0cmNtcChjdXIsICItdmVyYm9zZTpjbGFzcyIpKSkgewotICAgICAgbnlpKCk7Ci0gICAgfSBlbHNlIGlmICghKHN0cmNtcChjdXIsICItdmVyYm9zZWdjIikpKSB7Ci0gICAgICBueWkoKTsKLSAgICB9IGVsc2UgaWYgKCEoc3RyY21wKGN1ciwgIi12ZXJib3NlOmdjIikpKSB7Ci0gICAgICBtdm06OkNvbGxlY3Rvcjo6dmVyYm9zZSA9IDE7Ci0gICAgfSBlbHNlIGlmICghKHN0cmNtcChjdXIsICItdmVyYm9zZTpqbmkiKSkpIHsKLSAgICAgIG55aSgpOwotICAgIH0gZWxzZSBpZiAoIShzdHJjbXAoY3VyLCAiLXZlcnNpb24iKSkpIHsKLSAgICAgIHByaW50VmVyc2lvbigpOwotICAgIH0gZWxzZSBpZiAoIShzdHJjbXAoY3VyLCAiLXNob3d2ZXJzaW9uIikpKSB7Ci0gICAgICBueWkoKTsKLSAgICB9IGVsc2UgaWYgKCEoc3RyY21wKGN1ciwgIi0/IikpKSB7Ci0gICAgICBwcmludEluZm9ybWF0aW9uKCk7Ci0gICAgfSBlbHNlIGlmICghKHN0cmNtcChjdXIsICItaGVscCIpKSkgewotICAgICAgcHJpbnRJbmZvcm1hdGlvbigpOwotICAgIH0gZWxzZSBpZiAoIShzdHJjbXAoY3VyLCAiLVgiKSkpIHsKLSAgICAgIG55aSgpOwotICAgIH0gZWxzZSBpZiAoIShzdHJjbXAoY3VyLCAiLWFnZW50bGliIikpKSB7Ci0gICAgICBueWkoKTsKLSAgICB9IGVsc2UgaWYgKCEoc3RyY21wKGN1ciwgIi1hZ2VudHBhdGgiKSkpIHsKLSAgICAgIG55aSgpOwotICAgIH0gZWxzZSBpZiAoY3VyWzBdID09ICctJykgewotICAgIH0gZWxzZSBpZiAoIShzdHJjbXAoY3VyLCAiLWphdmFhZ2VudCIpKSkgewotICAgICAgamF2YUFnZW50KGN1cik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNsYXNzTmFtZSA9IGN1cjsKLSAgICAgIGFwcEFyZ3VtZW50c1BvcyA9IGk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgICsraTsKLSAgfQotfQotCi0KLUpuanZtQ2xhc3NMb2FkZXIqIEpuanZtOjpsb2FkQXBwQ2xhc3NMb2FkZXIoKSB7Ci0gIEphdmFPYmplY3QqIGxvYWRlciA9IDA7Ci0gIGxsdm1fZ2Nyb290KGxvYWRlciwgMCk7Ci0gIAotICBpZiAoYXBwQ2xhc3NMb2FkZXIgPT0gTlVMTCkgewotICAgIFVzZXJDbGFzcyogY2wgPSB1cGNhbGxzLT5uZXdDbGFzc0xvYWRlcjsKLSAgICBsb2FkZXIgPSB1cGNhbGxzLT5nZXRTeXN0ZW1DbGFzc0xvYWRlci0+aW52b2tlSmF2YU9iamVjdFN0YXRpYyhjbCk7Ci0gICAgYXBwQ2xhc3NMb2FkZXIgPSBKbmp2bUNsYXNzTG9hZGVyOjpnZXRKbmp2bUxvYWRlckZyb21KYXZhT2JqZWN0KGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyk7Ci0gICAgaWYgKGFyZ3VtZW50c0luZm8uamFyRmlsZSkgewotICAgICAgYXBwQ2xhc3NMb2FkZXItPmxvYWRMaWJGcm9tSmFyKGFyZ3VtZW50c0luZm8uamFyRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHNJbmZvLmNsYXNzTmFtZSk7Ci0gICAgfSBlbHNlIGlmIChhcmd1bWVudHNJbmZvLmNsYXNzTmFtZSkgewotICAgICAgYXBwQ2xhc3NMb2FkZXItPmxvYWRMaWJGcm9tRmlsZShhcmd1bWVudHNJbmZvLmNsYXNzTmFtZSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBhcHBDbGFzc0xvYWRlcjsKLX0KLQotbXZtOjpWTVRocmVhZERhdGEqIEpuanZtOjpidWlsZFZNVGhyZWFkRGF0YShtdm06OlRocmVhZCogbXV0KSB7Ci0JSmF2YVRocmVhZCogdGggPSBKYXZhVGhyZWFkOjphc3NvY2lhdGUodGhpcywgbXV0KTsKLQl1cGNhbGxzLT5DcmVhdGVGb3JlaWduSmF2YVRocmVhZCh0aGlzLCB0aCk7Ci0JcmV0dXJuIHRoOwotfQotCi12b2lkIEpuanZtOjpsb2FkQm9vdHN0cmFwKCkgewotICBKYXZhT2JqZWN0KiBvYmogPSBOVUxMOwotICBKYXZhT2JqZWN0KiBqYXZhTG9hZGVyID0gTlVMTDsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgbGx2bV9nY3Jvb3QoamF2YUxvYWRlciwgMCk7Ci0gIEpuanZtQ2xhc3NMb2FkZXIqIGxvYWRlciA9IGJvb3RzdHJhcExvYWRlcjsKLSAgCi0gIC8vIEluaXRpYWxpc2UgdGhlIGJvb3RzdHJhcCBjbGFzcyBsb2FkZXIgaWYgaXQncyBub3QKLSAgLy8gZG9uZSBhbHJlYWR5LgotICBpZiAodXBjYWxscy0+bmV3U3RyaW5nID09IE5VTEwpIHsKLSAgICB1cGNhbGxzLT5wb3N0SW5pdGlhbGlzZUNsYXNzcGF0aChib290c3RyYXBMb2FkZXIpOwotICB9Ci0gIAotI2RlZmluZSBMT0FEX0NMQVNTKGNsKSBcCi0gIGNsLT5yZXNvbHZlQ2xhc3MoKTsgXAotICBjbC0+aW5pdGlhbGlzZUNsYXNzKCk7Ci0gIAotICAvLyBJZiBhIHN0cmluZyBiZWxvbmdzIHRvIHRoZSB2bSBoYXNobWFwLCB3ZSBtdXN0IHJlbW92ZSBpdCB3aGVuCi0gIC8vIGl0J3MgZGVzdHJveWVkLiBTbyB3ZSBkZWZpbmUgYSBuZXcgVlQgZm9yIHN0cmluZ3MgdGhhdCB3aWxsIGJlCi0gIC8vIHBsYWNlZCBpbiB0aGUgaGFzaG1hcC4gVGhpcyBWVCB3aWxsIGhhdmUgaXRzIGRlc3RydWN0b3Igc2V0IHNvCi0gIC8vIHRoYXQgdGhlIHN0cmluZyBpcyByZW1vdmVkIHdoZW4gZGVhbGxvY2F0ZWQuCi0gIHVwY2FsbHMtPm5ld1N0cmluZy0+cmVzb2x2ZUNsYXNzKCk7Ci0gIGlmIChKYXZhU3RyaW5nOjppbnRlcm5TdHJpbmdWVCA9PSBOVUxMKSB7Ci0gICAgSmF2YVZpcnR1YWxUYWJsZSogc3RyaW5nVlQgPSB1cGNhbGxzLT5uZXdTdHJpbmctPmdldFZpcnR1YWxWVCgpOwotICAgIHVpbnQzMiBzaXplID0gdXBjYWxscy0+bmV3U3RyaW5nLT52aXJ0dWFsVGFibGVTaXplICogc2l6ZW9mKHVpbnRwdHJfdCk7Ci0gICAgCi0gICAgSmF2YVN0cmluZzo6aW50ZXJuU3RyaW5nVlQgPSAKLSAgICAgIChKYXZhVmlydHVhbFRhYmxlKilib290c3RyYXBMb2FkZXItPmFsbG9jYXRvci5BbGxvY2F0ZShzaXplLCAiU3RyaW5nIFZUIik7Ci0KLSAgICBtZW1jcHkoSmF2YVN0cmluZzo6aW50ZXJuU3RyaW5nVlQsIHN0cmluZ1ZULCBzaXplKTsKLSAgICAKLSAgICBKYXZhU3RyaW5nOjppbnRlcm5TdHJpbmdWVC0+ZGVzdHJ1Y3RvciA9IAotICAgICAgKHVpbnRwdHJfdClKYXZhU3RyaW5nOjpzdHJpbmdEZXN0cnVjdG9yOwotCi0gICAgLy8gVGVsbCB0aGUgZmluYWxpemVyIHRoYXQgdGhpcyBpcyBhIG5hdGl2ZSBkZXN0cnVjdG9yLgotICAgIEphdmFTdHJpbmc6OmludGVyblN0cmluZ1ZULT5vcGVyYXRvckRlbGV0ZSA9IAotICAgICAgKHVpbnRwdHJfdClKYXZhU3RyaW5nOjpzdHJpbmdEZXN0cnVjdG9yOwotICB9Ci0gIHVwY2FsbHMtPm5ld1N0cmluZy0+aW5pdGlhbGlzZUNsYXNzKCk7Ci0KLSAgLy8gVGhlIGluaXRpYWxpemF0aW9uIGNvZGUgb2YgdGhlIGNsYXNzZXMgaW5pdGlhbGl6ZWQgYmVsb3cgbWF5IHJlcXVpcmUKLSAgLy8gdG8gZ2V0IHRoZSBKYXZhIHRocmVhZCwgc28gd2UgY3JlYXRlIHRoZSBKYXZhIHRocmVhZCBvYmplY3QgZmlyc3QuCi0JdXBjYWxscy0+SW5pdGlhbGl6ZVRocmVhZGluZyh0aGlzKTsKLSAgCi0gIExPQURfQ0xBU1ModXBjYWxscy0+bmV3Q2xhc3MpOwotICBMT0FEX0NMQVNTKHVwY2FsbHMtPm5ld0NvbnN0cnVjdG9yKTsKLSAgTE9BRF9DTEFTUyh1cGNhbGxzLT5uZXdGaWVsZCk7Ci0gIExPQURfQ0xBU1ModXBjYWxscy0+bmV3TWV0aG9kKTsKLSAgTE9BRF9DTEFTUyh1cGNhbGxzLT5uZXdWTVRocmVhZCk7Ci0gIExPQURfQ0xBU1ModXBjYWxscy0+bmV3U3RhY2tUcmFjZUVsZW1lbnQpOwotICBMT0FEX0NMQVNTKHVwY2FsbHMtPm5ld1ZNVGhyb3dhYmxlKTsKLSAgTE9BRF9DTEFTUyh1cGNhbGxzLT5ib29sQ2xhc3MpOwotICBMT0FEX0NMQVNTKHVwY2FsbHMtPmJ5dGVDbGFzcyk7Ci0gIExPQURfQ0xBU1ModXBjYWxscy0+Y2hhckNsYXNzKTsKLSAgTE9BRF9DTEFTUyh1cGNhbGxzLT5zaG9ydENsYXNzKTsKLSAgTE9BRF9DTEFTUyh1cGNhbGxzLT5pbnRDbGFzcyk7Ci0gIExPQURfQ0xBU1ModXBjYWxscy0+bG9uZ0NsYXNzKTsKLSAgTE9BRF9DTEFTUyh1cGNhbGxzLT5mbG9hdENsYXNzKTsKLSAgTE9BRF9DTEFTUyh1cGNhbGxzLT5kb3VibGVDbGFzcyk7Ci0gIExPQURfQ0xBU1ModXBjYWxscy0+SW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbik7Ci0gIExPQURfQ0xBU1ModXBjYWxscy0+QXJyYXlTdG9yZUV4Y2VwdGlvbik7Ci0gIExPQURfQ0xBU1ModXBjYWxscy0+Q2xhc3NDYXN0RXhjZXB0aW9uKTsKLSAgTE9BRF9DTEFTUyh1cGNhbGxzLT5JbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uKTsKLSAgTE9BRF9DTEFTUyh1cGNhbGxzLT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24pOwotICBMT0FEX0NMQVNTKHVwY2FsbHMtPkludGVycnVwdGVkRXhjZXB0aW9uKTsKLSAgTE9BRF9DTEFTUyh1cGNhbGxzLT5JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKTsKLSAgTE9BRF9DTEFTUyh1cGNhbGxzLT5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24pOwotICBMT0FEX0NMQVNTKHVwY2FsbHMtPk5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uKTsKLSAgTE9BRF9DTEFTUyh1cGNhbGxzLT5OdWxsUG9pbnRlckV4Y2VwdGlvbik7Ci0gIExPQURfQ0xBU1ModXBjYWxscy0+U2VjdXJpdHlFeGNlcHRpb24pOwotICBMT0FEX0NMQVNTKHVwY2FsbHMtPkNsYXNzRm9ybWF0RXJyb3IpOwotICBMT0FEX0NMQVNTKHVwY2FsbHMtPkNsYXNzQ2lyY3VsYXJpdHlFcnJvcik7Ci0gIExPQURfQ0xBU1ModXBjYWxscy0+Tm9DbGFzc0RlZkZvdW5kRXJyb3IpOwotICBMT0FEX0NMQVNTKHVwY2FsbHMtPlVuc3VwcG9ydGVkQ2xhc3NWZXJzaW9uRXJyb3IpOwotICBMT0FEX0NMQVNTKHVwY2FsbHMtPk5vU3VjaEZpZWxkRXJyb3IpOwotICBMT0FEX0NMQVNTKHVwY2FsbHMtPk5vU3VjaE1ldGhvZEVycm9yKTsKLSAgTE9BRF9DTEFTUyh1cGNhbGxzLT5JbnN0YW50aWF0aW9uRXJyb3IpOwotICBMT0FEX0NMQVNTKHVwY2FsbHMtPklsbGVnYWxBY2Nlc3NFcnJvcik7Ci0gIExPQURfQ0xBU1ModXBjYWxscy0+SWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbik7Ci0gIExPQURfQ0xBU1ModXBjYWxscy0+VmVyaWZ5RXJyb3IpOwotICBMT0FEX0NMQVNTKHVwY2FsbHMtPkV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcik7Ci0gIExPQURfQ0xBU1ModXBjYWxscy0+TGlua2FnZUVycm9yKTsKLSAgTE9BRF9DTEFTUyh1cGNhbGxzLT5BYnN0cmFjdE1ldGhvZEVycm9yKTsKLSAgTE9BRF9DTEFTUyh1cGNhbGxzLT5VbnNhdGlzZmllZExpbmtFcnJvcik7Ci0gIExPQURfQ0xBU1ModXBjYWxscy0+SW50ZXJuYWxFcnJvcik7Ci0gIExPQURfQ0xBU1ModXBjYWxscy0+T3V0T2ZNZW1vcnlFcnJvcik7Ci0gIExPQURfQ0xBU1ModXBjYWxscy0+U3RhY2tPdmVyZmxvd0Vycm9yKTsKLSAgTE9BRF9DTEFTUyh1cGNhbGxzLT5Vbmtub3duRXJyb3IpOwotICBMT0FEX0NMQVNTKHVwY2FsbHMtPkNsYXNzTm90Rm91bmRFeGNlcHRpb24pOyAKLSAgTE9BRF9DTEFTUyh1cGNhbGxzLT5Bcml0aG1ldGljRXhjZXB0aW9uKTsgCi0gIExPQURfQ0xBU1ModXBjYWxscy0+SW5zdGFudGlhdGlvbkV4Y2VwdGlvbik7Ci0gIExPQURfQ0xBU1ModXBjYWxscy0+U3lzdGVtQ2xhc3MpOwotI3VuZGVmIExPQURfQ0xBU1MKLQotICBsb2FkQXBwQ2xhc3NMb2FkZXIoKTsKLSAgb2JqID0gSmF2YVRocmVhZDo6Z2V0KCktPmN1cnJlbnRUaHJlYWQoKTsKLSAgamF2YUxvYWRlciA9IGFwcENsYXNzTG9hZGVyLT5nZXRKYXZhQ2xhc3NMb2FkZXIoKTsKLQotICB1cGNhbGxzLT5zZXRDb250ZXh0Q2xhc3NMb2FkZXItPmludm9rZUludFNwZWNpYWwodXBjYWxscy0+bmV3VGhyZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLCAmamF2YUxvYWRlcik7Ci0gIC8vIGxvYWQgYW5kIGluaXRpYWxpc2UgbWF0aCBzaW5jZSBpdCBpcyByZXNwb25zaWJsZSBmb3IgZGxvcGVuJ2luZyAKLSAgLy8gbGliamF2YWxhbmcuc28gYW5kIHdlIGFyZSBvcHRpbWl6aW5nIHNvbWUgbWF0aCBvcGVyYXRpb25zCi0gIFVzZXJDb21tb25DbGFzcyogbWF0aCA9IGxvYWRlci0+bG9hZE5hbWUoCi0gICAgICBsb2FkZXItPmFzY2lpekNvbnN0cnVjdFVURjgoImphdmEvbGFuZy9NYXRoIiksIHRydWUsIHRydWUsIE5VTEwpOwotICBtYXRoLT5hc0NsYXNzKCktPmluaXRpYWxpc2VDbGFzcygpOwotfQotCi12b2lkIEpuanZtOjpleGVjdXRlQ2xhc3MoY29uc3QgY2hhciogY2xhc3NOYW1lLCBBcnJheU9iamVjdCogYXJncykgewotCW12bTo6Z2MqIGV4YyA9IE5VTEw7Ci0gIEphdmFPYmplY3QqIG9iaiA9IE5VTEw7Ci0gIEphdmFPYmplY3QqIGdyb3VwID0gTlVMTDsKLSAgCi0gIGxsdm1fZ2Nyb290KGFyZ3MsIDApOwotICBsbHZtX2djcm9vdChleGMsIDApOwotICBsbHZtX2djcm9vdChvYmosIDApOwotICBsbHZtX2djcm9vdChncm91cCwgMCk7Ci0KLSAgVFJZIHsKLSAgICAvLyBGaXJzdCB0cnkgdG8gc2VlIGlmIHdlIGFyZSBhIHNlbGYtY29udGFpbmVkIGV4ZWN1dGFibGUuCi0gICAgVXNlckNsYXNzKiBjbCA9IGFwcENsYXNzTG9hZGVyLT5sb2FkQ2xhc3NGcm9tU2VsZihjbGFzc05hbWUpOwotICAgIAotICAgIC8vIElmIG5vdCwgbG9hZCB0aGUgY2xhc3MuCi0gICAgaWYgKGNsID09IE5VTEwpIHsKLSAgICAgIGNvbnN0IFVURjgqIG5hbWUgPSBhcHBDbGFzc0xvYWRlci0+YXNjaWl6Q29uc3RydWN0VVRGOChjbGFzc05hbWUpOwotICAgICAgY2wgPSAoVXNlckNsYXNzKilhcHBDbGFzc0xvYWRlci0+bG9hZE5hbWUobmFtZSwgdHJ1ZSwgdHJ1ZSwgTlVMTCk7Ci0gICAgfQotICAgIAotICAgIGNsLT5pbml0aWFsaXNlQ2xhc3MoKTsKLSAgCi0gICAgY29uc3QgVVRGOCogZnVuY1NpZ24gPSAKLSAgICAgIGFwcENsYXNzTG9hZGVyLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KCIoW0xqYXZhL2xhbmcvU3RyaW5nOylWIik7Ci0gICAgY29uc3QgVVRGOCogZnVuY05hbWUgPSBhcHBDbGFzc0xvYWRlci0+YXNjaWl6Q29uc3RydWN0VVRGOCgibWFpbiIpOwotICAgIEphdmFNZXRob2QqIG1ldGhvZCA9IGNsLT5sb29rdXBNZXRob2QoZnVuY05hbWUsIGZ1bmNTaWduLCB0cnVlLCB0cnVlLCAwKTsKLSAgICBpZiAoaXNQdWJsaWMobWV0aG9kLT5hY2Nlc3MpKSB7IAotICAgICAgbWV0aG9kLT5pbnZva2VJbnRTdGF0aWMobWV0aG9kLT5jbGFzc0RlZiwgJmFyZ3MpOwotICAgIH0gZWxzZSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIk1haW4gbWV0aG9kIG5vdCBwdWJsaWMuXG4iKTsKLSAgICB9Ci0gIH0gQ0FUQ0ggewotICB9IEVORF9DQVRDSDsKLQotCW12bTo6VGhyZWFkKiBtdXQgPSBtdm06OlRocmVhZDo6Z2V0KCk7Ci0gIGV4YyA9IG11dC0+Z2V0UGVuZGluZ0V4Y2VwdGlvbigpOwotCi0gIGlmIChleGMgIT0gTlVMTCkgewotICAgIEphdmFUaHJlYWQqIHRoICAgPSBKYXZhVGhyZWFkOjpnZXQoKTsKLSAgICBtdXQtPmNsZWFyUGVuZGluZ0V4Y2VwdGlvbigpOwotICAgIG9iaiA9IHRoLT5jdXJyZW50VGhyZWFkKCk7Ci0gICAgZ3JvdXAgPSB1cGNhbGxzLT5ncm91cC0+Z2V0SW5zdGFuY2VPYmplY3RGaWVsZChvYmopOwotICAgIFRSWSB7Ci0gICAgICB1cGNhbGxzLT51bmNhdWdodEV4Y2VwdGlvbi0+aW52b2tlSW50U3BlY2lhbCh1cGNhbGxzLT50aHJlYWRHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLCAmb2JqLCAmZXhjKTsKLSAgICB9IENBVENIIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiRXhjZXB0aW9uIGluIHRocmVhZCBcIm1haW5cIjogIgotICAgICAgICAgICAgICAgICAgICAgICJDYW4gbm90IHByaW50IHN0YWNrIHRyYWNlLlxuIik7Ci0gICAgfSBFTkRfQ0FUQ0g7Ci0gIH0KLX0KLQotdm9pZCBKbmp2bTo6ZXhlY3V0ZVByZW1haW4oY29uc3QgY2hhciogY2xhc3NOYW1lLCBKYXZhU3RyaW5nKiBhcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhT2JqZWN0KiBpbnN0cnVtZW50ZXIpIHsKLSAgbGx2bV9nY3Jvb3QoYXJncywgMCk7Ci0gIGxsdm1fZ2Nyb290KGluc3RydW1lbnRlciwgMCk7Ci0gIFRSWSB7Ci0gICAgY29uc3QgVVRGOCogbmFtZSA9IGFwcENsYXNzTG9hZGVyLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KGNsYXNzTmFtZSk7Ci0gICAgVXNlckNsYXNzKiBjbCA9IChVc2VyQ2xhc3MqKQotICAgICAgICBhcHBDbGFzc0xvYWRlci0+bG9hZE5hbWUobmFtZSwgdHJ1ZSwgdHJ1ZSwgTlVMTCk7Ci0gICAgY2wtPmluaXRpYWxpc2VDbGFzcygpOwotICAKLSAgICBjb25zdCBVVEY4KiBmdW5jU2lnbiA9IGFwcENsYXNzTG9hZGVyLT5hc2NpaXpDb25zdHJ1Y3RVVEY4KAotICAgICAgIihMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL2luc3RydW1lbnQvSW5zdHJ1bWVudGF0aW9uOylWIik7Ci0gICAgY29uc3QgVVRGOCogZnVuY05hbWUgPSBhcHBDbGFzc0xvYWRlci0+YXNjaWl6Q29uc3RydWN0VVRGOCgicHJlbWFpbiIpOwotICAgIEphdmFNZXRob2QqIG1ldGhvZCA9IGNsLT5sb29rdXBNZXRob2QoZnVuY05hbWUsIGZ1bmNTaWduLCB0cnVlLCB0cnVlLCAwKTsKLSAgCi0gICAgbWV0aG9kLT5pbnZva2VJbnRTdGF0aWMobWV0aG9kLT5jbGFzc0RlZiwgJmFyZ3MsICZpbnN0cnVtZW50ZXIpOwotICB9IElHTk9SRTsKLX0KLQotdm9pZCBKbmp2bTo6cnVuQXBwbGljYXRpb25JbXBsKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICBKYXZhU3RyaW5nKiBzdHIgPSBOVUxMOwotICBKYXZhT2JqZWN0KiBpbnN0cnVtZW50ZXIgPSBOVUxMOwotICBBcnJheU9iamVjdCogYXJncyA9IE5VTEw7Ci0JbXZtOjpnYyogZXhjID0gTlVMTDsKLQlKYXZhT2JqZWN0ICpqZXhjOwotCQotCWxsdm1fZ2Nyb290KGpleGMsIDApOwotICBsbHZtX2djcm9vdChzdHIsIDApOwotICBsbHZtX2djcm9vdChpbnN0cnVtZW50ZXIsIDApOwotICBsbHZtX2djcm9vdChhcmdzLCAwKTsKLSAgbGx2bV9nY3Jvb3QoZXhjLCAwKTsKLQotCUphdmFUaHJlYWQ6OmFzc29jaWF0ZSh0aGlzLCBtdm06OlRocmVhZDo6Z2V0KCkpOwotCi0gIGFyZ3VtZW50c0luZm8uYXJnYyA9IGFyZ2M7Ci0gIGFyZ3VtZW50c0luZm8uYXJndiA9IGFyZ3Y7Ci0KLSAgYm9vdHN0cmFwTG9hZGVyLT5hbmFseXNlQ2xhc3NwYXRoRW52KGJvb3RzdHJhcExvYWRlci0+Ym9vdENsYXNzcGF0aEVudik7Ci0gIGFyZ3VtZW50c0luZm8ucmVhZEFyZ3ModGhpcyk7Ci0gIGlmIChhcmd1bWVudHNJbmZvLmNsYXNzTmFtZSA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBpbnQgcG9zID0gYXJndW1lbnRzSW5mby5hcHBBcmd1bWVudHNQb3M7ICAKLSAgYXJndW1lbnRzSW5mby5hcmd2ID0gYXJndW1lbnRzSW5mby5hcmd2ICsgcG9zIC0gMTsKLSAgYXJndW1lbnRzSW5mby5hcmdjID0gYXJndW1lbnRzSW5mby5hcmdjIC0gcG9zICsgMTsKLQotICBUUlkgewotICAgIGxvYWRCb290c3RyYXAoKTsKLSAgfSBDQVRDSCB7Ci0gICAgZXhjID0gbXZtOjpUaHJlYWQ6OmdldCgpLT5nZXRQZW5kaW5nRXhjZXB0aW9uKCk7Ci0gIH0gRU5EX0NBVENIOwotCi0gIGlmIChleGMgIT0gTlVMTCkgewotCQlqZXhjID0gSm5qdm06OmFzSmF2YUV4Y2VwdGlvbihleGMpOwotICAgIGZwcmludGYoc3RkZXJyLCAiRXhjZXB0aW9uICVzIHdoaWxlIGJvb3RzdHJhcHBpbmcgVk0uIiwKLQkJCQkJCWV4YyA/IFVURjhCdWZmZXIoSmF2YU9iamVjdDo6Z2V0Q2xhc3MoamV4YyktPm5hbWUpLmNTdHJpbmcoKSA6ICIgZm9yZWlnbiBleGNlcHRpb24iKTsKLSAgfSBlbHNlIHsKLSAgICBDbEFyZ3VtZW50c0luZm8mIGluZm8gPSBhcmd1bWVudHNJbmZvOwotICAKLSAgICBpZiAoaW5mby5hZ2VudHMuc2l6ZSgpKSB7Ci0gICAgICBhc3NlcnQoMCAmJiAiaW1wbGVtZW50IG1lIik7Ci0gICAgICBpbnN0cnVtZW50ZXIgPSAwOy8vY3JlYXRlSW5zdHJ1bWVudGVyKCk7Ci0gICAgICBmb3IgKHN0ZDo6dmVjdG9yPCBzdGQ6OnBhaXI8Y2hhciosIGNoYXIqPiA+OjppdGVyYXRvciBpID0gCi0gICAgICAgICAgIGluZm8uYWdlbnRzLmJlZ2luKCksIGUgPSBpbmZvLmFnZW50cy5lbmQoKTsgaSE9IGU7ICsraSkgewotICAgICAgICBzdHIgPSBhc2NpaXpUb1N0cihpLT5zZWNvbmQpOwotICAgICAgICBleGVjdXRlUHJlbWFpbihpLT5maXJzdCwgc3RyLCBpbnN0cnVtZW50ZXIpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBVc2VyQ2xhc3NBcnJheSogYXJyYXkgPSB1cGNhbGxzLT5BcnJheU9mU3RyaW5nOwotICAgIGFyZ3MgPSAoQXJyYXlPYmplY3QqKWFycmF5LT5kb05ldyhpbmZvLmFyZ2MgLSAyKTsKLSAgICBmb3IgKGludCBpID0gMjsgaSA8IGluZm8uYXJnYzsgKytpKSB7Ci0gICAgICBBcnJheU9iamVjdDo6c2V0RWxlbWVudChhcmdzLCAoSmF2YU9iamVjdCopYXNjaWl6VG9TdHIoaW5mby5hcmd2W2ldKSwgaSAtIDIpOwotICAgIH0KLQotICAgIGV4ZWN1dGVDbGFzcyhpbmZvLmNsYXNzTmFtZSwgYXJncyk7Ci0gIH0KLX0KLQotSm5qdm06OkpuanZtKG12bTo6QnVtcFB0ckFsbG9jYXRvciYgQWxsb2MsIG12bTo6Vk1LaXQqIHZta2l0LCBKYXZhQ29tcGlsZXIqIENvbXAsIGJvb2wgZGxMb2FkKSA6IAotCVZpcnR1YWxNYWNoaW5lKEFsbG9jLCB2bWtpdCksIAotCWxvY2tTeXN0ZW0oQWxsb2MpIHsKLQotICBib290c3RyYXBMb2FkZXIgPSBuZXcoQWxsb2MsICJib290c3RyYXAgbG9hZGVyIikgSm5qdm1Cb290c3RyYXBMb2FkZXIoQWxsb2MsIHRoaXMsIENvbXApOwotICAKLSAgdXBjYWxscyA9IG5ldyhhbGxvY2F0b3IsICJDbGFzc3BhdGgiKSBDbGFzc3BhdGgoYm9vdHN0cmFwTG9hZGVyLCBkbExvYWQpOwotCi0JaW5pdGlhbGlzZUludGVybmFsVlRzKCk7Ci0KLSAgY2xhc3NwYXRoID0gZ2V0ZW52KCJDTEFTU1BBVEgiKTsKLSAgaWYgKCFjbGFzc3BhdGgpIGNsYXNzcGF0aCA9ICIuIjsKLSAgCi0gIGFwcENsYXNzTG9hZGVyID0gMDsKLSAgam5pRW52ID0gJkpOSV9KTklFbnZUYWJsZTsKLSAgamF2YXZtRW52ID0gJkpOSV9KYXZhVk1UYWJsZTsKLQotICB0aHJvd2FibGUgPSB1cGNhbGxzLT5uZXdUaHJvd2FibGU7Ci0KLSAgU3RyaW5nTGlzdCogZW5kID0gYm9vdHN0cmFwTG9hZGVyLT5zdHJpbmdzOwotICB3aGlsZSAoZW5kKSB7Ci0gICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBlbmQtPmxlbmd0aDsgKytpKSB7Ci0gICAgICBKYXZhU3RyaW5nKiBvYmogPSBlbmQtPnN0cmluZ3NbaV07Ci0gICAgICBoYXNoU3RyLmluc2VydChvYmopOwotICAgIH0KLSAgICBlbmQgPSBlbmQtPnByZXY7Ci0gIH0KLQotICBib290c3RyYXBMb2FkZXItPmluc2VydEFsbE1ldGhvZHNJblZNKCk7Ci19Ci0KLUpuanZtOjp+Sm5qdm0oKSB7Ci19Ci0KLUFycmF5VUludDE2KiBKbmp2bTo6YXNjaWl6VG9BcnJheShjb25zdCBjaGFyKiBhc2NpaXopIHsKLSAgQXJyYXlVSW50MTYqIHRtcCA9IE5VTEw7Ci0gIGxsdm1fZ2Nyb290KHRtcCwgMCk7Ci0KLSAgdWludDMyIHNpemUgPSBzdHJsZW4oYXNjaWl6KTsKLSAgdG1wID0gKEFycmF5VUludDE2Kil1cGNhbGxzLT5BcnJheU9mQ2hhci0+ZG9OZXcoc2l6ZSk7Ci0gIAotICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgIEFycmF5VUludDE2OjpzZXRFbGVtZW50KHRtcCwgYXNjaWl6W2ldLCBpKTsKLSAgfQotICByZXR1cm4gdG1wOwotfQotCi12b2lkIEpuanZtOjpmaW5hbGl6ZU9iamVjdChtdm06OmdjKiBfbykgewotCUphdmFPYmplY3QgKm9iaiA9IChKYXZhT2JqZWN0KilfbzsKLQotCWxsdm1fZ2Nyb290KF9vLCAwKTsKLQlsbHZtX2djcm9vdChvYmosIDApOwotCi0gIEphdmFNZXRob2QqIG1ldGggPSB1cGNhbGxzLT5GaW5hbGl6ZU9iamVjdDsKLSAgVXNlckNsYXNzKiBjbCA9IEphdmFPYmplY3Q6OmdldENsYXNzKG9iaiktPmFzQ2xhc3MoKTsKLSAgbWV0aC0+aW52b2tlSW50VmlydHVhbEJ1ZihjbCwgb2JqLCAwKTsKLX0KLQotbXZtOjpnYyoqIEpuanZtOjpnZXRSZWZlcmVudChtdm06OmdjKiBfb2JqKSB7Ci0gIGxsdm1fZ2Nyb290KF9vYmosIDApOwotICBKYXZhT2JqZWN0UmVmZXJlbmNlKiBvYmogPSAoSmF2YU9iamVjdFJlZmVyZW5jZSopX29iajsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgcmV0dXJuIChtdm06OmdjKiopSmF2YU9iamVjdFJlZmVyZW5jZTo6Z2V0UmVmZXJlbnRQdHIob2JqKTsKLX0KLQotdm9pZCBKbmp2bTo6c2V0UmVmZXJlbnQobXZtOjpnYyogX29iaiwgbXZtOjpnYyogdmFsKSB7Ci0gIGxsdm1fZ2Nyb290KF9vYmosIDApOwotICBKYXZhT2JqZWN0UmVmZXJlbmNlKiBvYmogPSAoSmF2YU9iamVjdFJlZmVyZW5jZSopX29iajsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgbGx2bV9nY3Jvb3QodmFsLCAwKTsKLSAgSmF2YU9iamVjdFJlZmVyZW5jZTo6c2V0UmVmZXJlbnQob2JqLCAoSmF2YU9iamVjdCopdmFsKTsKLX0KLQotYm9vbCBKbmp2bTo6ZW5xdWV1ZVJlZmVyZW5jZShtdm06OmdjKiBfb2JqKSB7Ci0gIEphdmFPYmplY3QqIG9iaiA9IChKYXZhT2JqZWN0Kilfb2JqOwotICBsbHZtX2djcm9vdChvYmosIDApOwotICBKYXZhTWV0aG9kKiBtZXRoID0gdXBjYWxscy0+RW5xdWV1ZVJlZmVyZW5jZTsKLSAgVXNlckNsYXNzKiBjbCA9IEphdmFPYmplY3Q6OmdldENsYXNzKG9iaiktPmFzQ2xhc3MoKTsKLSAgcmV0dXJuIChib29sKW1ldGgtPmludm9rZUludFNwZWNpYWxCdWYoY2wsIG9iaiwgMCk7Ci19Ci0gIAotc2l6ZV90IEpuanZtOjpnZXRPYmplY3RTaXplKG12bTo6Z2MqIG9iamVjdCkgewotICAvLyBUT0RPOiBiZWNhdXNlIHRoaXMgaXMgY2FsbGVkIGR1cmluZyBHQywgdGhlcmUgaXMgbm8gbmVlZCB0byBkbwotICAvLyBsbHZtX2djcm9vdC4gRm9yIGNsYXJpdHksIGl0IG1heSBiZSB1c2VmdWwgdG8gaGF2ZSBhIHNwZWNpYWwgdHlwZQotICAvLyBpbiB0aGlzIGNhc2UuCi0gIHNpemVfdCBzaXplID0gMDsKLSAgSmF2YU9iamVjdCogc3JjID0gKEphdmFPYmplY3QqKW9iamVjdDsKLSAgaWYgKFZNQ2xhc3NMb2FkZXI6OmlzVk1DbGFzc0xvYWRlcih0aGlzLCBzcmMpKSB7Ci0gICAgc2l6ZSA9IHNpemVvZihWTUNsYXNzTG9hZGVyKTsKLSAgfSBlbHNlIHsKLSAgICBDb21tb25DbGFzcyogY2wgPSBKYXZhT2JqZWN0OjpnZXRDbGFzcyhzcmMpOwotICAgIGlmIChjbC0+aXNBcnJheSgpKSB7Ci0gICAgICBVc2VyQ2xhc3NBcnJheSogYXJyYXkgPSBjbC0+YXNBcnJheUNsYXNzKCk7Ci0gICAgICBVc2VyQ29tbW9uQ2xhc3MqIGJhc2UgPSBhcnJheS0+YmFzZUNsYXNzKCk7Ci0gICAgICB1aW50MzIgbG9nU2l6ZSA9IGJhc2UtPmlzUHJpbWl0aXZlKCkgPyAKLSAgICAgICAgYmFzZS0+YXNQcmltaXRpdmVDbGFzcygpLT5sb2dTaXplIDogKHNpemVvZihKYXZhT2JqZWN0KikgPT0gOCA/IDMgOiAyKTsgCi0KLSAgICAgIHNpemUgPSBzaXplb2YoSmF2YU9iamVjdCkgKyBzaXplb2Yoc3NpemVfdCkgKyAKLSAgICAgICAgICAgICAgICAgICAgKEphdmFBcnJheTo6Z2V0U2l6ZShzcmMpIDw8IGxvZ1NpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBhc3NlcnQoY2wtPmlzQ2xhc3MoKSAmJiAiTm90IGEgY2xhc3MhIik7Ci0gICAgICBzaXplID0gY2wtPmFzQ2xhc3MoKS0+Z2V0VmlydHVhbFNpemUoKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLWNvbnN0IGNoYXIqIEpuanZtOjpnZXRPYmplY3RUeXBlTmFtZShtdm06OmdjKiBvYmplY3QpIHsKLSAgSmF2YU9iamVjdCogc3JjID0gKEphdmFPYmplY3QqKW9iamVjdDsKLSAgaWYgKFZNQ2xhc3NMb2FkZXI6OmlzVk1DbGFzc0xvYWRlcih0aGlzLCBzcmMpKSB7Ci0gICAgcmV0dXJuICJWTUNsYXNzTG9hZGVyIjsKLSAgfSBlbHNlIHsKLSAgICBDb21tb25DbGFzcyogY2wgPSBKYXZhT2JqZWN0OjpnZXRDbGFzcyhzcmMpOwotICAgIC8vIFRoaXMgY29kZSBpcyBvbmx5IHVzZWQgZm9yIGRlYnVnZ2luZyBvbiBhIGZhdGFsIGVycm9yLiBJdCBpcyBmaW5lIHRvCi0gICAgLy8gYWxsb2NhdGUgaW4gdGhlIEMrKyBoZWFwLgotICAgIHJldHVybiAobmV3IFVURjhCdWZmZXIoY2wtPm5hbWUpKS0+Y1N0cmluZygpOwotICB9Ci19Ci0KLS8vIEhlbHBlciBmdW5jdGlvbiB0byBydW4gSjMgd2l0aG91dCBKSVQuCi1leHRlcm4gIkMiIGludCBTdGFydEpuanZtV2l0aG91dEpJVChpbnQgYXJnYywgY2hhcioqIGFyZ3YsIGNoYXIqIG1haW5DbGFzcykgewotICBtdm06OkJ1bXBQdHJBbGxvY2F0b3IgQWxsb2NhdG9yOwotCi0JbXZtOjpWTUtpdCogdm1raXQgPSBuZXcoQWxsb2NhdG9yLCAiVk1LaXQiKSBtdm06OlZNS2l0KEFsbG9jYXRvcik7Ci0gCi0gIEphdmFDb21waWxlciogQ29tcCA9IG5ldyBKYXZhQ29tcGlsZXIoKTsKLQotICBKbmp2bSogdm0gPSBuZXcoQWxsb2NhdG9yLCAiVk0iKSBKbmp2bShBbGxvY2F0b3IsIHZta2l0LCBDb21wLCB0cnVlKTsKLQotICBtdm06OlRocmVhZEFsbG9jYXRvciB0aGFsbG9jYXRvcjsgCi0gIGNoYXIqKiBuZXdBcmd2ID0gKGNoYXIqKil0aGFsbG9jYXRvci5BbGxvY2F0ZSgoYXJnYyArIDEpICogc2l6ZW9mKGNoYXIqKSk7Ci0gIG1lbWNweShuZXdBcmd2ICsgMSwgYXJndiwgYXJnYyAqIHNpemVvZihjaGFyKikpOwotICBuZXdBcmd2WzBdID0gbmV3QXJndlsxXTsKLSAgbmV3QXJndlsxXSA9IG1haW5DbGFzczsKLQotICB2bS0+cnVuQXBwbGljYXRpb24oYXJnYyArIDEsIG5ld0FyZ3YpOwotCi0gIHZta2l0LT53YWl0Tm9uRGFlbW9uVGhyZWFkcygpOwotICAKLSAgcmV0dXJuIDA7IAotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL0ozL1ZNQ29yZS9Kbmp2bS5oIGIvdm1raXQvbGliL0ozL1ZNQ29yZS9Kbmp2bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDY1N2JjLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9KMy9WTUNvcmUvSm5qdm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0gSm5qdm0uaCAtIEphdmEgdmlydHVhbCBtYWNoaW5lIGRlc2NyaXB0aW9uIC0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2lmbmRlZiBKTkpWTV9KQVZBX1ZNX0gKLSNkZWZpbmUgSk5KVk1fSkFWQV9WTV9ICi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJ0eXBlcy5oIgotCi0jaW5jbHVkZSAibXZtL0FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm12bS9WaXJ0dWFsTWFjaGluZS5oIgotI2luY2x1ZGUgIm12bS9UaHJlYWRzL0NvbmQuaCIKLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9Mb2Nrcy5oIgotI2luY2x1ZGUgIm12bS9UaHJlYWRzL09iamVjdExvY2tzLmgiCi0KLSNpbmNsdWRlICJKbmp2bUNvbmZpZy5oIgotI2luY2x1ZGUgIkpOSVJlZmVyZW5jZXMuaCIKLSNpbmNsdWRlICJMb2NrZWRNYXAuaCIKLQotbmFtZXNwYWNlIG12bSB7Ci0JY2xhc3MgTXV0YXRvclRocmVhZDsKLX0KLQotbmFtZXNwYWNlIGozIHsKLQotY2xhc3MgQXJyYXlPYmplY3Q7Ci1jbGFzcyBDbGFzc3BhdGg7Ci1jbGFzcyBDb21tb25DbGFzczsKLWNsYXNzIEphdmFGaWVsZDsKLWNsYXNzIEphdmFNZXRob2Q7Ci1jbGFzcyBKYXZhT2JqZWN0OwotY2xhc3MgSmF2YVN0cmluZzsKLWNsYXNzIEphdmFUaHJlYWQ7Ci1jbGFzcyBKYXZhVmlydHVhbFRhYmxlOwotY2xhc3MgSm5qdm1Cb290c3RyYXBMb2FkZXI7Ci1jbGFzcyBKbmp2bUNsYXNzTG9hZGVyOwotY2xhc3MgUmVmZXJlbmNlVGhyZWFkOwotY2xhc3MgVXNlckNsYXNzOwotY2xhc3MgVXNlckNsYXNzQXJyYXk7Ci1jbGFzcyBVc2VyQ2xhc3NQcmltaXRpdmU7Ci1jbGFzcyBVc2VyQ29tbW9uQ2xhc3M7Ci0KLWNsYXNzIENsQXJndW1lbnRzSW5mbyB7Ci1wdWJsaWM6Ci0gIGludCBhcmdjOwotICBjaGFyKiogYXJndjsKLSAgdWludDMyIGFwcEFyZ3VtZW50c1BvczsKLSAgY2hhciogY2xhc3NOYW1lOwotICBjaGFyKiBqYXJGaWxlOwotICBzdGQ6OnZlY3Rvcjwgc3RkOjpwYWlyPGNoYXIqLCBjaGFyKj4gPiBhZ2VudHM7Ci0KLSAgdm9pZCByZWFkQXJncyhKbmp2bSAqdm0pOwotICB2b2lkIGV4dHJhY3RDbGFzc0Zyb21KYXIoSm5qdm0qIHZtLCBpbnQgYXJnYywgY2hhcioqIGFyZ3YsIGludCBpKTsKLSAgdm9pZCBqYXZhQWdlbnQoY2hhciogY3VyKTsKLQotICB2b2lkIHByaW50SW5mb3JtYXRpb24oKTsKLSAgdm9pZCBueWkoKTsKLSAgdm9pZCBwcmludFZlcnNpb24oKTsKLX07Ci0KLS8vLyBKbmp2bSAtIEEgSlZNLiBFYWNoIGV4ZWN1dGlvbiBvZiBhIHByb2dyYW0gYWxsb2NhdGVzIGEgSm5qdm0uCi0vLy8KLWNsYXNzIEpuanZtIDogcHVibGljIG12bTo6VmlydHVhbE1hY2hpbmUgewotICBmcmllbmQgY2xhc3MgSm5qdm1DbGFzc0xvYWRlcjsKLXB1YmxpYzoKLSAgLy8vIHRocm93YWJsZSAtIFRoZSBqYXZhL2xhbmcvVGhyb3dhYmxlIGNsYXNzLiBJbiBhbiBpc29sYXRlCi0gIC8vLyBlbnZpcm9ubWVudCwgZ2VuZXJhdGVkIGNvZGUgcmVmZXJlbmNlcyB0aGlzIGZpZWxkLgotICBVc2VyQ2xhc3MqIHRocm93YWJsZTsKLQotcHJpdmF0ZToKLQotICB2aXJ0dWFsIHNpemVfdCBnZXRPYmplY3RTaXplKG12bTo6Z2MqIG9iaik7Ci0gIHZpcnR1YWwgY29uc3QgY2hhciogZ2V0T2JqZWN0VHlwZU5hbWUobXZtOjpnYyogb2JqKTsKLQotICAvLy8gQ3JlYXRlRXJyb3IgLSBDcmVhdGVzIGEgSmF2YSBvYmplY3Qgb2YgdGhlIHNwZWNpZmllZCBleGNlcHRpb24gY2xhc3MKLSAgLy8vIGFuZCBjYWxsaW5nIGl0cyA8aW5pdD4gZnVuY3Rpb24uCi0gIC8vLwotICBKYXZhT2JqZWN0KiBDcmVhdGVFcnJvcihVc2VyQ2xhc3MqIGNsLCBKYXZhTWV0aG9kKiBtZXRoLCBjb25zdCBjaGFyKiBzdHIpOwotICBKYXZhT2JqZWN0KiBDcmVhdGVFcnJvcihVc2VyQ2xhc3MqIGNsLCBKYXZhTWV0aG9kKiBtZXRoLCBKYXZhU3RyaW5nKiBzdHIpOwotCi0gIC8vLyBlcnJvciAtIFRocm93cyBhbiBleGNlcHRpb24gaW4gdGhlIGV4ZWN1dGlvbiBvZiBhIEpWTSBmb3IgdGhlIHRocmVhZAotICAvLy8gdGhhdCBjYWxscyB0aGlzIGZ1bmN0aW9ucy4gVGhpcyBpcyB1c2VkIGludGVybmFsbHkgYnkgSm5qdm0gdG8gY29udHJvbAotICAvLy8gd2hpY2ggcGFpciBjbGFzcy9tZXRob2QgYXJlIHVzZWQuCi0gIC8vLwotICB2b2lkIGVycm9yKFVzZXJDbGFzcyogY2wsIEphdmFNZXRob2QqIG1ldGgsIEphdmFTdHJpbmcqKTsKLSAgCi0gIC8vLyBlcnJvcldpdGhFeGNwIC0gVGhyb3dzIGFuIGV4Y2VwdGlvbiB3aG9zZSBjYXVzZSBpcyB0aGUgSmF2YSBvYmplY3QgZXhjcC4KLSAgLy8vCi0gIHZvaWQgZXJyb3JXaXRoRXhjcChVc2VyQ2xhc3MqIGNsLCBKYXZhTWV0aG9kKiBtZXRoLCBjb25zdCBKYXZhT2JqZWN0KiBleGNwKTsKLSAgCi0gIC8vLyBsb2FkQXBwQ2xhc3NMb2FkZXIgLSBMb2FkcyB0aGUgYXBwbGljYXRpb24gY2xhc3MgbG9hZGVyLCBzbyB0aGF0IFZNS2l0Ci0gIC8vLyBrbm93bnMgd2hpY2ggbG9hZGVyIGhhcyB0byBsb2FkIHRoZSBtYWluIGNsYXNzLgotICAvLy8KLSAgSm5qdm1DbGFzc0xvYWRlciogbG9hZEFwcENsYXNzTG9hZGVyKCk7Ci0gIAotICAvLy8gZXhlY3V0ZUNsYXNzIC0gRXhlY3V0ZXMgaW4gdGhlIGdpdmVuIEpWTSB0aGlzIG1haW4gY2xhc3Mgd2l0aCB0aGUgZ2l2ZW4KLSAgLy8vIEphdmEgYXJncy4KLSAgLy8vCi0gIHZvaWQgZXhlY3V0ZUNsYXNzKGNvbnN0IGNoYXIqIGNsYXNzTmFtZSwgQXJyYXlPYmplY3QqIGFyZ3MpOwotCi0gIC8vLyBleGVjdXRlUHJlbWFpbiAtIEV4ZWN1dGVzIHRoZSBwcmVtYWluIGNsYXNzIGZvciB0aGUgamF2YS9sYW5nL2luc3RydW1lbnQKLSAgLy8vIGZlYXR1cmUuCi0gIC8vLwotICB2b2lkIGV4ZWN1dGVQcmVtYWluKGNvbnN0IGNoYXIqIGNsYXNzTmFtZSwgSmF2YVN0cmluZyogYXJncywKLSAgICAgICAgICAgICAgICAgICAgICBKYXZhT2JqZWN0KiBpbnN0cnVtZW50ZXIpOwotICAgCi0gIC8vLyBtYWluSmF2YVN0YXJ0IC0gU3RhcnRzIHRoZSBleGVjdXRpb24gb2YgdGhlIGFwcGxpY2F0aW9uIGluIGEgSmF2YSB0aHJlYWQuCi0gIC8vLwotICBzdGF0aWMgdm9pZCBtYWluSmF2YVN0YXJ0KG12bTo6VGhyZWFkKiB0aHJlYWQpOwotICAKLXB1YmxpYzoKLSAgCi0gIC8vLyB0cmFjZXIgLSBUcmFjZXMgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuCi0gIC8vLwotICB2aXJ0dWFsIHZvaWQgdHJhY2VyKHVpbnRwdHJfdCBjbG9zdXJlKTsKLSAgCi0gIC8vLyBkaXJTZXBhcmF0b3IgLSBEaXJlY3Rvcnkgc2VwYXJhdG9yIGZvciBmaWxlIHBhdGhzLCBlLmcuICdcJyBmb3Igd2luZG93cywKLSAgLy8vICcvJyBmb3IgVW5peC4KLSAgLy8vCi0gIHN0YXRpYyBjb25zdCBjaGFyKiBkaXJTZXBhcmF0b3I7Ci0KLSAgLy8vIGVudlNlcGFyYXRvciAtIFBhdGhzIHNlcGFyYXRvciBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBlLmcuICc6Jy4KLSAgLy8vCi0gIHN0YXRpYyBjb25zdCBjaGFyKiBlbnZTZXBhcmF0b3I7Ci0KLSAgLy8vIE1hZ2ljIC0gVGhlIG1hZ2ljIG51bWJlciBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggLmNsYXNzIGZpbGUuIDB4Y2FmZWJhYmUuCi0gIC8vLwotICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IE1hZ2ljOwotIAotICAvLy8gYm9vdHN0cmFMb2FkZXIgLSBCb290c3RyYXAgbG9hZGVyIGZvciBiYXNlIGNsYXNzZXMgb2YgdGhpcyB2aXJ0dWFsCi0gIC8vLyBtYWNoaW5lLgotICAvLy8KLSAgSm5qdm1Cb290c3RyYXBMb2FkZXIqIGJvb3RzdHJhcExvYWRlcjsKLQotICAvLy8gdXBjYWxscyAtIFVwY2FsbHMgdG8gY2FsbCBKYXZhIG1ldGhvZHMgYW5kIGFjY2VzcyBKYXZhIGZpZWxkcy4KLSAgLy8vCi0gIENsYXNzcGF0aCogdXBjYWxsczsKLSAgCi0gIC8vLyBsb2NrU3lzdGVtIC0gVGhlIGxvY2sgc3lzdGVtIHRvIGFsbG9jYXRlIGFuZCBtYW5hZ2UgSmF2YSBsb2Nrcy4KLSAgLy8vCi0gIG12bTo6TG9ja1N5c3RlbSBsb2NrU3lzdGVtOwotICAKLSAgLy8vIGFyZ3VtZW50c0luZm8gLSBUaGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBnaXZlbiB0byB0aGUgdm0KLSAgLy8vCi0gIENsQXJndW1lbnRzSW5mbyBhcmd1bWVudHNJbmZvOwotCi0gIC8vLyBqbmlFbnYgLSBUaGUgSk5JIGVudmlyb25tZW50IG9mIHRoaXMgSlZNLgotICAvLy8KLSAgdm9pZCogam5pRW52OwotCi0gIC8vLyBqYXZhdm1FbnYgLSBUaGUgSmF2YSBWTSBlbnZpcm9ubWVudCBvZiB0aGlzIEpWTS4KLSAgLy8vCi0gIGNvbnN0IHZvaWQqIGphdmF2bUVudjsKLQotICAvLy8gcG9zdFByb3BlcnRpZXMgLSBQcm9wZXJ0aWVzIHNldCBhdCBydW50aW1lIGFuZCBpbiBjb21tYW5kIGxpbmUuCi0gIC8vLwotICBzdGQ6OnZlY3Rvcjwgc3RkOjpwYWlyPGNoYXIqLCBjaGFyKj4gPiBwb3N0UHJvcGVydGllczsKLQotICAvLy8gY2xhc3NwYXRoIC0gVGhlIENMQVNTUEFUSCB2YWx1ZSwgb3IgdGhlIHBhdGhzIGdpdmVuIGluIGNvbW1hbmQgbGluZS4KLSAgLy8vCi0gIGNvbnN0IGNoYXIqIGNsYXNzcGF0aDsKLQotICAvLy8gZ2xvYmFsUmVmcyAtIEdsb2JhbCByZWZlcmVuY2VzIHRoYXQgSk5JIHdhbnRzIHRvIHByb3RlY3QuCi0gIC8vLwotICBKTklHbG9iYWxSZWZlcmVuY2VzIGdsb2JhbFJlZnM7Ci0KLSAgLy8vIGdsb2JhbFJlZnNMb2NrIC0gTG9jayBmb3IgYWRkaW5nIGEgbmV3IGdsb2JhbCByZWZlcmVuY2UuCi0gIC8vLwotICBtdm06OkxvY2tOb3JtYWwgZ2xvYmFsUmVmc0xvY2s7Ci0gIAotICAvLy8gYXBwQ2xhc3NMb2FkZXIgLSBUaGUgYm9vdHN0cmFwIGNsYXNzIGxvYWRlci4KLSAgLy8vCi0gIEpuanZtQ2xhc3NMb2FkZXIqIGFwcENsYXNzTG9hZGVyOwotCi0gIC8vLyBoYXNoU3RyIC0gSGFzaCBtYXAgb2YgamF2YS9sYW5nL1N0cmluZyBvYmplY3RzIGFsbG9jYXRlZCBieSB0aGlzIEpWTS4KLSAgLy8vCi0gIFN0cmluZ01hcCBoYXNoU3RyOwotCi0JbXZtOjpWaXJ0dWFsVGFibGUqIFZNQ2xhc3NMb2FkZXJfX1ZUOwotCi0Jdm9pZCBpbml0aWFsaXNlSW50ZXJuYWxWVHMoKTsKLXB1YmxpYzoKLSAgCi0gIC8vLyBDcmVhdGVFeGNlcHRpb25zIC0gVGhlc2UgYXJlIHRoZSBydW50aW1lIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IEphdmEgY29kZQotICAvLy8gY29tcGlsZWQgYnkgVk1LaXQuCi0gIC8vLwotICBKYXZhT2JqZWN0KiBDcmVhdGVOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICBKYXZhT2JqZWN0KiBDcmVhdGVPdXRPZk1lbW9yeUVycm9yKCk7Ci0gIEphdmFPYmplY3QqIENyZWF0ZUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oc2ludDMyIGVudHJ5KTsKLSAgSmF2YU9iamVjdCogQ3JlYXRlTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24oKTsKLSAgSmF2YU9iamVjdCogQ3JlYXRlQ2xhc3NDYXN0RXhjZXB0aW9uKEphdmFPYmplY3QqIG9iaiwgVXNlckNvbW1vbkNsYXNzKiBjbCk7Ci0gIEphdmFPYmplY3QqIENyZWF0ZUFyaXRobWV0aWNFeGNlcHRpb24oKTsKLSAgSmF2YU9iamVjdCogQ3JlYXRlU3RhY2tPdmVyZmxvd0Vycm9yKCk7Ci0gIEphdmFPYmplY3QqIENyZWF0ZUxpbmthZ2VFcnJvcihjb25zdCBjaGFyKiBtc2cpOwotICBKYXZhT2JqZWN0KiBDcmVhdGVBcnJheVN0b3JlRXhjZXB0aW9uKEphdmFWaXJ0dWFsVGFibGUqIFZUKTsKLSAgSmF2YU9iamVjdCogQ3JlYXRlVW5zYXRpc2ZpZWRMaW5rRXJyb3IoSmF2YU1ldGhvZCogbWV0aCk7Ci0gIAotICAvLy8gRXhjZXB0aW9ucyAtIFRoZXNlIGFyZSB0aGUgb25seSBleGNlcHRpb25zIFZNS2l0IHdpbGwgbWFrZS4KLSAgLy8vCi0gIHZvaWQgYXJyYXlTdG9yZUV4Y2VwdGlvbigpOwotICB2b2lkIGluZGV4T3V0T2ZCb3VuZHMoY29uc3QgSmF2YU9iamVjdCogb2JqLCBzaW50MzIgZW50cnkpOwotICB2b2lkIG5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uKGludCBzaXplKTsKLSAgdm9pZCBudWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICB2b2lkIGlsbGVnYWxBY2Nlc3NFeGNlcHRpb24oY29uc3QgY2hhciogbXNnKTsKLSAgdm9pZCBpbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uKGNvbnN0IEphdmFPYmplY3QqIG9iaik7Ci0gIHZvaWQgaW50ZXJydXB0ZWRFeGNlcHRpb24oY29uc3QgSmF2YU9iamVjdCogb2JqKTsKLSAgdm9pZCBpbml0aWFsaXplckVycm9yKGNvbnN0IEphdmFPYmplY3QqIGV4Y3ApOwotICB2b2lkIGludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oY29uc3QgSmF2YU9iamVjdCogb2JqKTsKLSAgdm9pZCBvdXRPZk1lbW9yeUVycm9yKCk7Ci0gIHZvaWQgbm9DbGFzc0RlZkZvdW5kRXJyb3IoSmF2YU9iamVjdCogb2JqKTsKLSAgdm9pZCBpbnN0YW50aWF0aW9uRXhjZXB0aW9uKFVzZXJDb21tb25DbGFzcyogY2wpOwotICB2b2lkIGluc3RhbnRpYXRpb25FcnJvcihVc2VyQ29tbW9uQ2xhc3MqIGNsKTsKLSAgdm9pZCBpbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oY29uc3QgY2hhciogbXNnKTsKLSAgdm9pZCBjbGFzc0Nhc3RFeGNlcHRpb24oSmF2YU9iamVjdCogb2JqLCBVc2VyQ29tbW9uQ2xhc3MqIGNsKTsKLSAgdm9pZCBub1N1Y2hGaWVsZEVycm9yKENvbW1vbkNsYXNzKiBjbCwgY29uc3QgVVRGOCogbmFtZSk7Ci0gIHZvaWQgbm9TdWNoTWV0aG9kRXJyb3IoQ29tbW9uQ2xhc3MqIGNsLCBjb25zdCBVVEY4KiBuYW1lKTsgCi0gIHZvaWQgYWJzdHJhY3RNZXRob2RFcnJvcihDb21tb25DbGFzcyogY2wsIGNvbnN0IFVURjgqIG5hbWUpOyAKLSAgdm9pZCBub0NsYXNzRGVmRm91bmRFcnJvcihjb25zdCBVVEY4KiBuYW1lKTsKLSAgdm9pZCBjbGFzc05vdEZvdW5kRXhjZXB0aW9uKEphdmFTdHJpbmcqIHN0cik7Ci0gIHZvaWQgbm9DbGFzc0RlZkZvdW5kRXJyb3IoVXNlckNsYXNzKiBjbCwgY29uc3QgVVRGOCogbmFtZSk7Ci0gIHZvaWQgY2xhc3NGb3JtYXRFcnJvcihjb25zdCBjaGFyKiBzdHIpOwotICAKLSAgLy8vIGFzY2lpelRvU3RyIC0gQ29uc3RydWN0cyBhIGphdmEvbGFuZy9TdHJpbmcgb2JqZWN0IGZyb20gdGhlIGdpdmVuIGFzY2lpei4KLSAgLy8vCi0gIEphdmFTdHJpbmcqIGFzY2lpelRvU3RyKGNvbnN0IGNoYXIqIGFzY2lpeik7Ci0KLSAgLy8vIFVURjhUb1N0ciAtIENvbnN0cnVjdHMgYSBqYXZhL2xhbmcvU3RyaW5nIG9iamVjdCBmcm9tIHRoZSBnaXZlbiBVVEY4LgotICAvLy8KLSAgSmF2YVN0cmluZyogY29uc3RydWN0U3RyaW5nKGNvbnN0IEFycmF5VUludDE2KiBhcnJheSk7Ci0gIAotICAvLy8gVVRGOFRvU3RyIC0gQ29uc3RydWN0cyBhIGphdmEvbGFuZy9TdHJpbmcgb2JqZWN0IGZyb20gdGhlIGdpdmVuIGludGVybmFsCi0gIC8vLyBVVEY4LCB0aHVzIGR1cGxpY2F0aW5nIHRoZSBVVEY4LgotICAvLy8KLSAgSmF2YVN0cmluZyogaW50ZXJuYWxVVEY4VG9TdHIoY29uc3QgVVRGOCogdXRmOCk7Ci0gICAgIAotICAvLy8gYXNjaWl6VG9VVEY4IC0gQ29uc3RydWN0cyBhbiBVVEY4IG91dCBvZiB0aGUgYXNjaWl6LgotICAvLy8KLSAgQXJyYXlVSW50MTYqIGFzY2lpelRvQXJyYXkoY29uc3QgY2hhciogYXNjaWl6KTsKLQotICAvLy8gZmluYWxpemVPYmplY3QgLSBpbnZva2UgdGhlIGZpbmFsaXplciBvZiBhIGphdmEgb2JqZWN0Ci0gIC8vLwotCXZpcnR1YWwgdm9pZCBmaW5hbGl6ZU9iamVjdChtdm06OmdjKiBvYmopOwotICAKLSAgLy8vIGdldFJlZmVyZW50UHRyIC0gcmV0dXJuIHRoZSByZWZlcmVudCBvZiBhIHJlZmVyZW5jZQotICAvLy8KLQl2aXJ0dWFsIG12bTo6Z2MqKiBnZXRSZWZlcmVudChtdm06OmdjKiByZWYpOwotCi0gIC8vLyBzZXRSZWZlcmVudFB0ciAtIHNldCB0aGUgcmVmZXJlbnQgb2YgYSByZWZlcmVuY2UKLSAgLy8vCi0JdmlydHVhbCB2b2lkIHNldFJlZmVyZW50KG12bTo6Z2MqIHJlZiwgbXZtOjpnYyogdmFsKTsKLQotICAvLy8gZW5xdWV1ZVJlZmVyZW5jZSAtIGVucXVldWUgdGhlIHJlZmVyZW5jZQotICAvLy8KLQl2aXJ0dWFsIGJvb2wgZW5xdWV1ZVJlZmVyZW5jZShtdm06OmdjKiBfb2JqKTsKLQotICAvLy8gfkpuanZtIC0gRGVzdHJveSB0aGUgSlZNLgotICAvLy8KLSAgfkpuanZtKCk7Ci0KLSAgLy8vIGFkZFByb3BlcnR5IC0gQWRkcyBhIG5ldyBwcm9wZXJ0eSBpbiB0aGUgcG9zdFByb3BlcnRpZXMgbWFwLgotICAvLy8KLSAgdm9pZCBhZGRQcm9wZXJ0eShjaGFyKiBrZXksIGNoYXIqIHZhbHVlKTsKLSAKLSAgLy8vIHNldENsYXNzcGF0aCAtIFNldHMgdGhlIGFwcGxpY2F0aW9uIGNsYXNzcGF0aCBmb3IgdGhlIEpWTS4KLSAgLy8vCi0gIHZvaWQgc2V0Q2xhc3NwYXRoKGNoYXIqIGNwKSB7Ci0gICAgY2xhc3NwYXRoID0gY3A7Ci0gIH0KLQotICAvLy8gSm5qdm0gLSBBbGxvY2F0ZXMgYSBuZXcgSlZNLgotICAvLy8KLSAgSm5qdm0obXZtOjpCdW1wUHRyQWxsb2NhdG9yJiBBbGxvYywgbXZtOjpWTUtpdCogdm1raXQsIEphdmFDb21waWxlciogQ29tcCwgYm9vbCBkbExvYWQpOwotCi0gIC8vLyBydW5BcHBsaWNhdGlvbkltcGwgLSBmdW5jdGlvbiBleGVjdXRlZCBpbiBhIHRocmVhZCBhZnRlciBhIGNhbGwgdG8gcnVuQXBwbGljYXRpb24KLQkvLy8KLSAgdmlydHVhbCB2b2lkIHJ1bkFwcGxpY2F0aW9uSW1wbChpbnQgYXJnYywgY2hhcioqIGFyZ3YpOwotICAKLQkvLy8gYnVpbGRWTVRocmVhZERhdGEgLSBhbGxvY2F0ZSBhIGphdmEgdGhyZWFkIGZvciB0aGUgdW5kZXJseWluZyBtdXRhdG9yLiBDYWxsZWQgd2hlbiB0aGUgamF2YSB0aHJlYWQgaXMgYSBmb3JlaWduIHRocmVhZC4KLQkvLy8KLQl2aXJ0dWFsIG12bTo6Vk1UaHJlYWREYXRhKiBidWlsZFZNVGhyZWFkRGF0YShtdm06OlRocmVhZCogbXV0KTsKLQotICAvLy8gbG9hZEJvb3RzdHJhcCAtIEJvb3RzdHJhcHMgdGhlIEpWTSwgZ2V0dGluZyB0aGUgY2xhc3MgbG9hZGVyLCBpbml0aWFsaXppbmcKLSAgLy8vIGJvb3RzdHJhcCBjbGFzc2VzIChlLmcuIGphdmEvbGFuZy9DbGFzcywgamF2YS9sYW5nL0V4Y2VwdGlvbikgYW5kCi0gIC8vLyBtYXBwaW5nIHRoZSBpbml0aWFsIHRocmVhZC4KLSAgLy8vCi0gIHZvaWQgbG9hZEJvb3RzdHJhcCgpOwotCi0JLy8gYXNqYXZhRXhjZXB0aW9uIC0gY29udmVydCBmcm9tIGdjIHRvIEphdmFPYmplY3QuIFdpbGwgYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgcG9pbnRzCi0JLy8gd2hlcmUgd2UgbXVzdCB0ZXN0IHRoZSBvcmlnaW5hbCB2bSBvZiB0aGUgZXhjZXB0aW9uCi0Jc3RhdGljIEphdmFPYmplY3QqIGFzSmF2YUV4Y2VwdGlvbihtdm06OmdjKiBvKSB7IGxsdm1fZ2Nyb290KG8sIDApOyByZXR1cm4gKEphdmFPYmplY3QqKW87IH0gCi19OwotCi19IC8vIGVuZCBuYW1lc3BhY2UgajMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvVk1Db3JlL0puanZtQ2xhc3NMb2FkZXIuY3BwIGIvdm1raXQvbGliL0ozL1ZNQ29yZS9Kbmp2bUNsYXNzTG9hZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VmMDg3Ny4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvSjMvVk1Db3JlL0puanZtQ2xhc3NMb2FkZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTA2OCArMCwwIEBACi0vLz09PS0tIEpuanZtQ2xhc3NMb2FkZXIuY3BwIC0gSm5qdm0gcmVwcmVzZW50YXRpb24gb2YgYSBjbGFzcyBsb2FkZXIgLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSA8Y2xpbWl0cz4KLSNpbmNsdWRlIDxjc3RkbGliPgotCi0vLyBmb3Igc3RycmNocgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0KLS8vIGZvciBkbG9wZW4gYW5kIGRsc3ltCi0jaW5jbHVkZSA8ZGxmY24uaD4gCi0KLS8vIGZvciBzdGF0LCBTX0lGTVQgYW5kIFNfSUZESVIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJtdm0vQWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAibXZtL1ZNS2l0LmgiCi0KLSNpbmNsdWRlICJDbGFzc3BhdGguaCIKLSNpbmNsdWRlICJDbGFzc3BhdGhSZWZsZWN0LmgiCi0jaW5jbHVkZSAiSmF2YUNsYXNzLmgiCi0jaW5jbHVkZSAiSmF2YUNvbXBpbGVyLmgiCi0jaW5jbHVkZSAiSmF2YUNvbnN0YW50UG9vbC5oIgotI2luY2x1ZGUgIkphdmFTdHJpbmcuaCIKLSNpbmNsdWRlICJKYXZhVGhyZWFkLmgiCi0jaW5jbHVkZSAiSmF2YVR5cGVzLmgiCi0jaW5jbHVkZSAiSmF2YVVwY2FsbHMuaCIKLSNpbmNsdWRlICJKbmp2bS5oIgotI2luY2x1ZGUgIkpuanZtQ2xhc3NMb2FkZXIuaCIKLSNpbmNsdWRlICJMb2NrZWRNYXAuaCIKLSNpbmNsdWRlICJSZWFkZXIuaCIKLSNpbmNsdWRlICJaaXAuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGozOwotCi10eXBlZGVmIHZvaWQgKCpzdGF0aWNfaW5pdF90KShKbmp2bUNsYXNzTG9hZGVyKik7Ci0KLUpuanZtQm9vdHN0cmFwTG9hZGVyOjpKbmp2bUJvb3RzdHJhcExvYWRlcihtdm06OkJ1bXBQdHJBbGxvY2F0b3ImIEFsbG9jLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJIEpuanZtKiB2bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhQ29tcGlsZXIqIENvbXApIDogCi0JSm5qdm1DbGFzc0xvYWRlcihBbGxvYywgdm0pIHsKLSAgCi0JVGhlQ29tcGlsZXIgPSBDb21wOwotICAKLSAgaGFzaFVURjggPSBuZXcoYWxsb2NhdG9yLCAiVVRGOE1hcCIpIFVURjhNYXAoYWxsb2NhdG9yKTsKLSAgY2xhc3NlcyA9IG5ldyhhbGxvY2F0b3IsICJDbGFzc01hcCIpIENsYXNzTWFwKCk7Ci0gIGphdmFUeXBlcyA9IG5ldyhhbGxvY2F0b3IsICJUeXBlTWFwIikgVHlwZU1hcCgpOyAKLSAgamF2YVNpZ25hdHVyZXMgPSBuZXcoYWxsb2NhdG9yLCAiU2lnbk1hcCIpIFNpZ25NYXAoKTsKLSAgc3RyaW5ncyA9IG5ldyhhbGxvY2F0b3IsICJTdHJpbmdMaXN0IikgU3RyaW5nTGlzdCgpOwotICAKLSAgYm9vdENsYXNzcGF0aEVudiA9IGdldGVudigiSk5KVk1fQk9PVENMQVNTUEFUSCIpOwotICBpZiAoIWJvb3RDbGFzc3BhdGhFbnYpIHsKLSAgICBib290Q2xhc3NwYXRoRW52ID0gR05VQ2xhc3NwYXRoR2xpYmo7Ci0gIH0KLSAgCi0gIGxpYkNsYXNzcGF0aEVudiA9IGdldGVudigiSk5KVk1fTElCQ0xBU1NQQVRIIik7Ci0gIGlmICghbGliQ2xhc3NwYXRoRW52KSB7Ci0gICAgbGliQ2xhc3NwYXRoRW52ID0gR05VQ2xhc3NwYXRoTGliczsKLSAgfQotfQotCi1Kbmp2bUNsYXNzTG9hZGVyOjpKbmp2bUNsYXNzTG9hZGVyKG12bTo6QnVtcFB0ckFsbG9jYXRvciYgQWxsb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFPYmplY3QqIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk1DbGFzc0xvYWRlciogdm1kYXRhLAotCQkJCQkJCQkJCQkJCQkJCQkgSm5qdm0qIHYpIDogYWxsb2NhdG9yKEFsbG9jKSB7Ci0gIGxsdm1fZ2Nyb290KGxvYWRlciwgMCk7Ci0gIGxsdm1fZ2Nyb290KHZtZGF0YSwgMCk7Ci0KLQl2bSA9IHY7Ci0KLSAgVGhlQ29tcGlsZXIgPSB2bS0+Ym9vdHN0cmFwTG9hZGVyLT5nZXRDb21waWxlcigpLT5DcmVhdGUoIkFwcGxpY2F0aXZlIGxvYWRlciIpOwotICAKLSAgaGFzaFVURjggPSBuZXcoYWxsb2NhdG9yLCAiVVRGOE1hcCIpIFVURjhNYXAoYWxsb2NhdG9yKTsKLSAgY2xhc3NlcyA9IG5ldyhhbGxvY2F0b3IsICJDbGFzc01hcCIpIENsYXNzTWFwKCk7Ci0gIGphdmFUeXBlcyA9IG5ldyhhbGxvY2F0b3IsICJUeXBlTWFwIikgVHlwZU1hcCgpOwotICBqYXZhU2lnbmF0dXJlcyA9IG5ldyhhbGxvY2F0b3IsICJTaWduTWFwIikgU2lnbk1hcCgpOwotICBzdHJpbmdzID0gbmV3KGFsbG9jYXRvciwgIlN0cmluZ0xpc3QiKSBTdHJpbmdMaXN0KCk7Ci0KLSAgdm1kYXRhLT5KQ0wgPSB0aGlzOwotICBqYXZhTG9hZGVyID0gbG9hZGVyOwotCi0gIEphdmFNZXRob2QqIG1ldGggPSB2bS0+dXBjYWxscy0+bG9hZEluQ2xhc3NMb2FkZXI7Ci0gIGxvYWRDbGFzc01ldGhvZCA9IAotICAgIEphdmFPYmplY3Q6OmdldENsYXNzKGxvYWRlciktPmFzQ2xhc3MoKS0+bG9va3VwTWV0aG9kRG9udFRocm93KAotICAgICAgICBtZXRoLT5uYW1lLCBtZXRoLT50eXBlLCBmYWxzZSwgdHJ1ZSwgJmxvYWRDbGFzcyk7Ci0gIGFzc2VydChsb2FkQ2xhc3MgJiYgIkxvYWRlciBkb2VzIG5vdCBoYXZlIGEgbG9hZENsYXNzIGZ1bmN0aW9uIik7Ci19Ci0KLXZvaWQgSm5qdm1DbGFzc0xvYWRlcjo6c2V0Q29tcGlsZXIoSmF2YUNvbXBpbGVyKiBDb21wKSB7Ci0gIC8vIFNldCB0aGUgbmV3IGNvbXBpbGVyLgotICBUaGVDb21waWxlciA9IENvbXA7Ci19Ci0KLUNsYXNzQnl0ZXMqIEpuanZtQm9vdHN0cmFwTG9hZGVyOjpvcGVuTmFtZShjb25zdCBVVEY4KiB1dGY4KSB7Ci0gIENsYXNzQnl0ZXMqIHJlcyA9IDA7Ci0gIG12bTo6VGhyZWFkQWxsb2NhdG9yIHRocmVhZEFsbG9jYXRvcjsKLQotICBjaGFyKiBhc2NpaXogPSAoY2hhciopdGhyZWFkQWxsb2NhdG9yLkFsbG9jYXRlKHV0ZjgtPnNpemUgKyAxKTsKLSAgZm9yIChzaW50MzIgaSA9IDA7IGkgPCB1dGY4LT5zaXplOyArK2kpIAotICAgIGFzY2lpeltpXSA9IHV0ZjgtPmVsZW1lbnRzW2ldOwotICBhc2NpaXpbdXRmOC0+c2l6ZV0gPSAwOwotICAKLSAgdWludDMyIGFsZW4gPSB1dGY4LT5zaXplOwotICAKLSAgZm9yIChzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj46Oml0ZXJhdG9yIGkgPSBib290Q2xhc3NwYXRoLmJlZ2luKCksCi0gICAgICAgZSA9IGJvb3RDbGFzc3BhdGguZW5kKCk7IGkgIT0gZTsgKytpKSB7Ci0gICAgY29uc3QgY2hhciogc3RyID0gKmk7Ci0gICAgdW5zaWduZWQgaW50IHN0ckxlbiA9IHN0cmxlbihzdHIpOwotICAgIGNoYXIqIGJ1ZiA9IChjaGFyKil0aHJlYWRBbGxvY2F0b3IuQWxsb2NhdGUoc3RyTGVuICsgYWxlbiArIDcpOwotCi0gICAgc3ByaW50ZihidWYsICIlcyVzLmNsYXNzIiwgc3RyLCBhc2NpaXopOwotICAgIHJlcyA9IFJlYWRlcjo6b3BlbkZpbGUodGhpcywgYnVmKTsKLSAgICBpZiAocmVzKSByZXR1cm4gcmVzOwotICB9Ci0KLSAgZm9yIChzdGQ6OnZlY3RvcjxaaXBBcmNoaXZlKj46Oml0ZXJhdG9yIGkgPSBib290QXJjaGl2ZXMuYmVnaW4oKSwKLSAgICAgICBlID0gYm9vdEFyY2hpdmVzLmVuZCgpOyBpICE9IGU7ICsraSkgewotICAgIAotICAgIFppcEFyY2hpdmUqIGFyY2hpdmUgPSAqaTsKLSAgICBjaGFyKiBidWYgPSAoY2hhciopdGhyZWFkQWxsb2NhdG9yLkFsbG9jYXRlKGFsZW4gKyA3KTsKLSAgICBzcHJpbnRmKGJ1ZiwgIiVzLmNsYXNzIiwgYXNjaWl6KTsKLSAgICByZXMgPSBSZWFkZXI6Om9wZW5aaXAodGhpcywgYXJjaGl2ZSwgYnVmKTsKLSAgICBpZiAocmVzKSByZXR1cm4gcmVzOwotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotVXNlckNsYXNzKiBKbmp2bUJvb3RzdHJhcExvYWRlcjo6aW50ZXJuYWxMb2FkKGNvbnN0IFVURjgqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb1Jlc29sdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YVN0cmluZyogc3RyTmFtZSkgewotICBDbGFzc0J5dGVzKiBieXRlcyA9IE5VTEw7Ci0gIGxsdm1fZ2Nyb290KHN0ck5hbWUsIDApOwotCi0gIFVzZXJDb21tb25DbGFzcyogY2wgPSBsb29rdXBDbGFzcyhuYW1lKTsKLSAgCi0gIGlmICghY2wpIHsKLSAgICBieXRlcyA9IG9wZW5OYW1lKG5hbWUpOwotICAgIGlmIChieXRlcyAhPSBOVUxMKSB7Ci0gICAgICBjbCA9IGNvbnN0cnVjdENsYXNzKG5hbWUsIGJ5dGVzKTsKLSAgICB9Ci0gIH0KLSAgCi0gIGlmIChjbCkgewotICAgIGFzc2VydCghY2wtPmlzQXJyYXkoKSk7Ci0gICAgaWYgKGRvUmVzb2x2ZSkgY2wtPmFzQ2xhc3MoKS0+cmVzb2x2ZUNsYXNzKCk7Ci0gIH0KLQotICByZXR1cm4gKFVzZXJDbGFzcyopY2w7Ci19Ci0KLVVzZXJDbGFzcyogSm5qdm1DbGFzc0xvYWRlcjo6aW50ZXJuYWxMb2FkKGNvbnN0IFVURjgqIG5hbWUsIGJvb2wgZG9SZXNvbHZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YVN0cmluZyogc3RyTmFtZSkgewotICBKYXZhT2JqZWN0KiBvYmogPSAwOwotICBsbHZtX2djcm9vdChzdHJOYW1lLCAwKTsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgCi0gIFVzZXJDb21tb25DbGFzcyogY2wgPSBsb29rdXBDbGFzcyhuYW1lKTsKLSAgCi0gIGlmICghY2wpIHsKLSAgICBVc2VyQ2xhc3MqIGZvckN0cCA9IGxvYWRDbGFzczsKLSAgICBpZiAoc3RyTmFtZSA9PSBOVUxMKSB7Ci0gICAgICBzdHJOYW1lID0gSmF2YVN0cmluZzo6aW50ZXJuYWxUb0phdmEobmFtZSwgdm0pOwotICAgIH0KLSAgICBvYmogPSBsb2FkQ2xhc3NNZXRob2QtPmludm9rZUphdmFPYmplY3RWaXJ0dWFsKGZvckN0cCwgamF2YUxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJOYW1lKTsKLSAgICBjbCA9IEphdmFPYmplY3RDbGFzczo6Z2V0Q2xhc3MoKChKYXZhT2JqZWN0Q2xhc3MqKW9iaikpOwotICB9Ci0gIAotICBpZiAoY2wpIHsKLSAgICBhc3NlcnQoIWNsLT5pc0FycmF5KCkpOwotICAgIGlmIChkb1Jlc29sdmUpIGNsLT5hc0NsYXNzKCktPnJlc29sdmVDbGFzcygpOwotICB9Ci0KLSAgcmV0dXJuIChVc2VyQ2xhc3MqKWNsOwotfQotCi1Vc2VyQ2xhc3MqIEpuanZtQ2xhc3NMb2FkZXI6OmxvYWROYW1lKGNvbnN0IFVURjgqIG5hbWUsIGJvb2wgZG9SZXNvbHZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvVGhyb3csIEphdmFTdHJpbmcqIHN0ck5hbWUpIHsKLSAgCi0gIGxsdm1fZ2Nyb290KHN0ck5hbWUsIDApOwotCi0gIFVzZXJDbGFzcyogY2wgPSBpbnRlcm5hbExvYWQobmFtZSwgZG9SZXNvbHZlLCBzdHJOYW1lKTsKLQotICBpZiAoIWNsICYmIGRvVGhyb3cpIHsKLSAgICBpZiAobmFtZS0+ZXF1YWxzKHZtLT51cGNhbGxzLT5Ob0NsYXNzRGVmRm91bmRFcnJvck5hbWUpKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBsb2FkIE5vQ2xhc3NEZWZGb3VuZEVycm9yIik7Ci0gICAgICBhYm9ydCgpOwotICAgIH0KLSAgICBpZiAoVGhlQ29tcGlsZXItPmlzU3RhdGljQ29tcGlsaW5nKCkpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGZpbmQgJXMsIG5lZWRlZCBmb3Igc3RhdGljIGNvbXBpbGluZ1xuIiwKLSAgICAgICAgICAgICAgVVRGOEJ1ZmZlcihuYW1lKS5jU3RyaW5nKCkpOwotICAgICAgYWJvcnQoKTsKLSAgICB9Ci0gICAgdm0tPm5vQ2xhc3NEZWZGb3VuZEVycm9yKG5hbWUpOwotICB9Ci0KLSAgaWYgKGNsICYmIGNsLT5jbGFzc0xvYWRlciAhPSB0aGlzKSB7Ci0gICAgY2xhc3Nlcy0+bG9jay5sb2NrKCk7Ci0gICAgQ2xhc3NNYXA6Oml0ZXJhdG9yIEVuZCA9IGNsYXNzZXMtPm1hcC5lbmQoKTsKLSAgICBDbGFzc01hcDo6aXRlcmF0b3IgSSA9IGNsYXNzZXMtPm1hcC5maW5kKGNsLT5uYW1lKTsKLSAgICBpZiAoSSA9PSBFbmQpCi0gICAgICBjbGFzc2VzLT5tYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNsLT5uYW1lLCBjbCkpOwotICAgIGNsYXNzZXMtPmxvY2sudW5sb2NrKCk7Ci0gIH0KLQotICByZXR1cm4gY2w7Ci19Ci0KLQotY29uc3QgVVRGOCogSm5qdm1DbGFzc0xvYWRlcjo6bG9va3VwQ29tcG9uZW50TmFtZShjb25zdCBVVEY4KiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEY4KiBob2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIHByaW0pIHsKLSAgdWludDMyIGxlbiA9IG5hbWUtPnNpemU7Ci0gIHVpbnQzMiBzdGFydCA9IDA7Ci0gIHVpbnQzMiBvcmlnTGVuID0gbGVuOwotICAKLSAgd2hpbGUgKHRydWUpIHsKLSAgICAtLWxlbjsKLSAgICBpZiAobGVuID09IDApIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0gZWxzZSB7Ci0gICAgICArK3N0YXJ0OwotICAgICAgaWYgKG5hbWUtPmVsZW1lbnRzW3N0YXJ0XSAhPSBJX1RBQikgewotICAgICAgICBpZiAobmFtZS0+ZWxlbWVudHNbc3RhcnRdID09IElfUkVGKSB7Ci0gICAgICAgICAgdWludDMyIHNpemUgPSAodWludDMyKW5hbWUtPnNpemU7Ci0gICAgICAgICAgaWYgKChzaXplID09IChzdGFydCArIDEpKSB8fCAoc2l6ZSA9PSAoc3RhcnQgKyAyKSkgfHwKLSAgICAgICAgICAgICAgKG5hbWUtPmVsZW1lbnRzW3N0YXJ0ICsgMV0gPT0gSV9UQUIpIHx8Ci0gICAgICAgICAgICAgIChuYW1lLT5lbGVtZW50c1tvcmlnTGVuIC0gMV0gIT0gSV9FTkRfUkVGKSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQxNiogYnVmID0gJihuYW1lLT5lbGVtZW50c1tzdGFydCArIDFdKTsKLSAgICAgICAgICAgIHVpbnQzMiBidWZMZW4gPSBsZW4gLSAyOwotICAgICAgICAgICAgY29uc3QgVVRGOCogY29tcG9uZW50TmFtZSA9IGhhc2hVVEY4LT5sb29rdXBSZWFkZXIoYnVmLCBidWZMZW4pOwotICAgICAgICAgICAgaWYgKCFjb21wb25lbnROYW1lICYmIGhvbGRlcikgewotICAgICAgICAgICAgICBob2xkZXItPnNpemUgPSBsZW4gLSAyOwotICAgICAgICAgICAgICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IGxlbiAtIDI7ICsraSkgewotICAgICAgICAgICAgICAgIGhvbGRlci0+ZWxlbWVudHNbaV0gPSBuYW1lLT5lbGVtZW50c1tzdGFydCArIDEgKyBpXTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBjb21wb25lbnROYW1lID0gaG9sZGVyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudE5hbWU7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHVpbnQxNiBjdXIgPSBuYW1lLT5lbGVtZW50c1tzdGFydF07Ci0gICAgICAgICAgaWYgKChjdXIgPT0gSV9CT09MIHx8IGN1ciA9PSBJX0JZVEUgfHwKLSAgICAgICAgICAgICAgIGN1ciA9PSBJX0NIQVIgfHwgY3VyID09IElfU0hPUlQgfHwKLSAgICAgICAgICAgICAgIGN1ciA9PSBJX0lOVCB8fCBjdXIgPT0gSV9GTE9BVCB8fCAKLSAgICAgICAgICAgICAgIGN1ciA9PSBJX0RPVUJMRSB8fCBjdXIgPT0gSV9MT05HKQotICAgICAgICAgICAgICAmJiAoKHVpbnQzMiluYW1lLT5zaXplKSA9PSBzdGFydCArIDEpIHsKLSAgICAgICAgICAgIHByaW0gPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybiAwOwotfQotCi1Vc2VyQ29tbW9uQ2xhc3MqIEpuanZtQ2xhc3NMb2FkZXI6Omxvb2t1cENsYXNzT3JBcnJheShjb25zdCBVVEY4KiBuYW1lKSB7Ci0gIFVzZXJDb21tb25DbGFzcyogdGVtcCA9IGxvb2t1cENsYXNzKG5hbWUpOwotICBpZiAodGVtcCkgcmV0dXJuIHRlbXA7Ci0KLSAgaWYgKHRoaXMgIT0gdm0tPmJvb3RzdHJhcExvYWRlcikgewotICAgIHRlbXAgPSB2bS0+Ym9vdHN0cmFwTG9hZGVyLT5sb29rdXBDbGFzc09yQXJyYXkobmFtZSk7Ci0gICAgaWYgKHRlbXApIHJldHVybiB0ZW1wOwotICB9Ci0gIAotICAKLSAgaWYgKG5hbWUtPmVsZW1lbnRzWzBdID09IElfVEFCKSB7Ci0gICAgYm9vbCBwcmltID0gZmFsc2U7Ci0gICAgY29uc3QgVVRGOCogY29tcG9uZW50TmFtZSA9IGxvb2t1cENvbXBvbmVudE5hbWUobmFtZSwgMCwgcHJpbSk7Ci0gICAgaWYgKHByaW0pIHJldHVybiBjb25zdHJ1Y3RBcnJheShuYW1lKTsKLSAgICBpZiAoY29tcG9uZW50TmFtZSkgewotICAgICAgVXNlckNvbW1vbkNsYXNzKiB0ZW1wID0gbG9va3VwQ2xhc3MoY29tcG9uZW50TmFtZSk7Ci0gICAgICBpZiAodGVtcCkgcmV0dXJuIGNvbnN0cnVjdEFycmF5KG5hbWUpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiAwOwotfQotCi1Vc2VyQ29tbW9uQ2xhc3MqIEpuanZtQ2xhc3NMb2FkZXI6OmxvYWRDbGFzc0Zyb21Vc2VyVVRGOChjb25zdCBVVEY4KiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb1Jlc29sdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvVGhyb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhU3RyaW5nKiBzdHJOYW1lKSB7Ci0gIGxsdm1fZ2Nyb290KHN0ck5hbWUsIDApOwotICAKLSAgaWYgKG5hbWUtPnNpemUgPT0gMCkgewotICAgIHJldHVybiAwOwotICB9IGVsc2UgaWYgKG5hbWUtPmVsZW1lbnRzWzBdID09IElfVEFCKSB7Ci0gICAgbXZtOjpUaHJlYWRBbGxvY2F0b3IgdGhyZWFkQWxsb2NhdG9yOwotICAgIGJvb2wgcHJpbSA9IGZhbHNlOwotICAgIFVURjgqIGhvbGRlciA9IChVVEY4Kil0aHJlYWRBbGxvY2F0b3IuQWxsb2NhdGUoCi0gICAgICAgIHNpemVvZihVVEY4KSArIG5hbWUtPnNpemUgKiBzaXplb2YodWludDE2KSk7Ci0gICAgaWYgKCFob2xkZXIpIHJldHVybiAwOwotICAgIAotICAgIGNvbnN0IFVURjgqIGNvbXBvbmVudE5hbWUgPSBsb29rdXBDb21wb25lbnROYW1lKG5hbWUsIGhvbGRlciwgcHJpbSk7Ci0gICAgaWYgKHByaW0pIHJldHVybiBjb25zdHJ1Y3RBcnJheShuYW1lKTsKLSAgICBpZiAoY29tcG9uZW50TmFtZSkgewotICAgICAgVXNlckNvbW1vbkNsYXNzKiB0ZW1wID0gbG9hZE5hbWUoY29tcG9uZW50TmFtZSwgZG9SZXNvbHZlLCBkb1Rocm93LCBOVUxMKTsKLSAgICAgIGlmICh0ZW1wKSByZXR1cm4gY29uc3RydWN0QXJyYXkobmFtZSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHJldHVybiBsb2FkTmFtZShuYW1lLCBkb1Jlc29sdmUsIGRvVGhyb3csIHN0ck5hbWUpOwotICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLVVzZXJDb21tb25DbGFzcyogSm5qdm1DbGFzc0xvYWRlcjo6bG9hZENsYXNzRnJvbUFzY2lpeihjb25zdCBjaGFyKiBhc2NpaXosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb1Jlc29sdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb1Rocm93KSB7Ci0gIGNvbnN0IFVURjgqIG5hbWUgPSBoYXNoVVRGOC0+bG9va3VwQXNjaWl6KGFzY2lpeik7Ci0gIG12bTo6VGhyZWFkQWxsb2NhdG9yIHRocmVhZEFsbG9jYXRvcjsKLSAgVXNlckNvbW1vbkNsYXNzKiByZXN1bHQgPSBOVUxMOwotICBpZiAoIW5hbWUpIG5hbWUgPSB2bS0+Ym9vdHN0cmFwTG9hZGVyLT5oYXNoVVRGOC0+bG9va3VwQXNjaWl6KGFzY2lpeik7Ci0gIGlmICghbmFtZSkgewotICAgIHVpbnQzMiBzaXplID0gc3RybGVuKGFzY2lpeik7Ci0gICAgVVRGOCogdGVtcCA9IChVVEY4Kil0aHJlYWRBbGxvY2F0b3IuQWxsb2NhdGUoCi0gICAgICAgIHNpemVvZihVVEY4KSArIHNpemUgKiBzaXplb2YodWludDE2KSk7Ci0gICAgdGVtcC0+c2l6ZSA9IHNpemU7Ci0KLSAgICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgdGVtcC0+ZWxlbWVudHNbaV0gPSBhc2NpaXpbaV07Ci0gICAgfQotICAgIG5hbWUgPSB0ZW1wOwotICB9Ci0gIAotICByZXN1bHQgPSBsb29rdXBDbGFzcyhuYW1lKTsKLSAgaWYgKChyZXN1bHQgPT0gTlVMTCkgJiYgKHRoaXMgIT0gdm0tPmJvb3RzdHJhcExvYWRlcikpIHsKLSAgICByZXN1bHQgPSB2bS0+Ym9vdHN0cmFwTG9hZGVyLT5sb29rdXBDbGFzc09yQXJyYXkobmFtZSk7Ci0gICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7Ci0gICAgICBpZiAocmVzdWx0LT5pc0NsYXNzKCkgJiYgZG9SZXNvbHZlKSB7Ci0gICAgICAgIHJlc3VsdC0+YXNDbGFzcygpLT5yZXNvbHZlQ2xhc3MoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICB9Ci0gCi0gIHJldHVybiBsb2FkQ2xhc3NGcm9tVXNlclVURjgobmFtZSwgZG9SZXNvbHZlLCBkb1Rocm93LCBOVUxMKTsKLX0KLQotCi1Vc2VyQ29tbW9uQ2xhc3MqIAotSm5qdm1DbGFzc0xvYWRlcjo6bG9hZENsYXNzRnJvbUphdmFTdHJpbmcoSmF2YVN0cmluZyogc3RyLCBib29sIGRvUmVzb2x2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG9UaHJvdykgewotICAKLSAgbGx2bV9nY3Jvb3Qoc3RyLCAwKTsKLSAgbXZtOjpUaHJlYWRBbGxvY2F0b3IgYWxsb2NhdG9yOyAKLSAgVVRGOCogbmFtZSA9IChVVEY4KilhbGxvY2F0b3IuQWxsb2NhdGUoc2l6ZW9mKFVURjgpICsgc3RyLT5jb3VudCAqIHNpemVvZih1aW50MTYpKTsKLSAKLSAgbmFtZS0+c2l6ZSA9IHN0ci0+Y291bnQ7Ci0gIGlmIChBcnJheVVJbnQxNjo6Z2V0RWxlbWVudChKYXZhU3RyaW5nOjpnZXRWYWx1ZShzdHIpLCBzdHItPm9mZnNldCkgIT0gSV9UQUIpIHsKLSAgICBmb3IgKHNpbnQzMiBpID0gMDsgaSA8IHN0ci0+Y291bnQ7ICsraSkgewotICAgICAgdWludDE2IGN1ciA9IEFycmF5VUludDE2OjpnZXRFbGVtZW50KEphdmFTdHJpbmc6OmdldFZhbHVlKHN0ciksIHN0ci0+b2Zmc2V0ICsgaSk7Ci0gICAgICBpZiAoY3VyID09ICcuJykgbmFtZS0+ZWxlbWVudHNbaV0gPSAnLyc7Ci0gICAgICBlbHNlIGlmIChjdXIgPT0gJy8nKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgICAgZWxzZSBuYW1lLT5lbGVtZW50c1tpXSA9IGN1cjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgZm9yIChzaW50MzIgaSA9IDA7IGkgPCBzdHItPmNvdW50OyArK2kpIHsKLSAgICAgIHVpbnQxNiBjdXIgPSBBcnJheVVJbnQxNjo6Z2V0RWxlbWVudChKYXZhU3RyaW5nOjpnZXRWYWx1ZShzdHIpLCBzdHItPm9mZnNldCArIGkpOwotICAgICAgaWYgKGN1ciA9PSAnLicpIHsKLSAgICAgICAgbmFtZS0+ZWxlbWVudHNbaV0gPSAnLyc7Ci0gICAgICB9IGVsc2UgaWYgKGN1ciA9PSAnLycpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBuYW1lLT5lbGVtZW50c1tpXSA9IGN1cjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgICAKLSAgVXNlckNvbW1vbkNsYXNzKiBjbHMgPSBsb2FkQ2xhc3NGcm9tVXNlclVURjgobmFtZSwgZG9SZXNvbHZlLCBkb1Rocm93LCBzdHIpOwotICByZXR1cm4gY2xzOwotfQotCi1Vc2VyQ29tbW9uQ2xhc3MqIEpuanZtQ2xhc3NMb2FkZXI6Omxvb2t1cENsYXNzRnJvbUphdmFTdHJpbmcoSmF2YVN0cmluZyogc3RyKSB7Ci0gIAotICBjb25zdCBBcnJheVVJbnQxNiogdmFsdWUgPSBOVUxMOwotICBsbHZtX2djcm9vdChzdHIsIDApOwotICBsbHZtX2djcm9vdCh2YWx1ZSwgMCk7Ci0gIHZhbHVlID0gSmF2YVN0cmluZzo6Z2V0VmFsdWUoc3RyKTsKLSAgbXZtOjpUaHJlYWRBbGxvY2F0b3IgYWxsb2NhdG9yOyAKLSAgCi0gIFVURjgqIG5hbWUgPSAoVVRGOCopYWxsb2NhdG9yLkFsbG9jYXRlKHNpemVvZihVVEY4KSArIHN0ci0+Y291bnQgKiBzaXplb2YodWludDE2KSk7Ci0gIG5hbWUtPnNpemUgPSBzdHItPmNvdW50OwotICBmb3IgKHNpbnQzMiBpID0gMDsgaSA8IHN0ci0+Y291bnQ7ICsraSkgewotICAgIHVpbnQxNiBjdXIgPSBBcnJheVVJbnQxNjo6Z2V0RWxlbWVudCh2YWx1ZSwgc3RyLT5vZmZzZXQgKyBpKTsKLSAgICBpZiAoY3VyID09ICcuJykgbmFtZS0+ZWxlbWVudHNbaV0gPSAnLyc7Ci0gICAgZWxzZSBuYW1lLT5lbGVtZW50c1tpXSA9IGN1cjsKLSAgfQotICBVc2VyQ29tbW9uQ2xhc3MqIGNscyA9IGxvb2t1cENsYXNzKG5hbWUpOwotICByZXR1cm4gY2xzOwotfQotCi1Vc2VyQ29tbW9uQ2xhc3MqIEpuanZtQ2xhc3NMb2FkZXI6Omxvb2t1cENsYXNzKGNvbnN0IFVURjgqIHV0ZjgpIHsKLSAgcmV0dXJuIGNsYXNzZXMtPmxvb2t1cCh1dGY4KTsKLX0KLQotVXNlckNvbW1vbkNsYXNzKiBKbmp2bUNsYXNzTG9hZGVyOjpsb2FkQmFzZUNsYXNzKGNvbnN0IFVURjgqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHN0YXJ0LCB1aW50MzIgbGVuKSB7Ci0gIAotICBpZiAobmFtZS0+ZWxlbWVudHNbc3RhcnRdID09IElfVEFCKSB7Ci0gICAgVXNlckNvbW1vbkNsYXNzKiBiYXNlQ2xhc3MgPSBsb2FkQmFzZUNsYXNzKG5hbWUsIHN0YXJ0ICsgMSwgbGVuIC0gMSk7Ci0gICAgSm5qdm1DbGFzc0xvYWRlciogbG9hZGVyID0gYmFzZUNsYXNzLT5jbGFzc0xvYWRlcjsKLSAgICBjb25zdCBVVEY4KiBhcnJheU5hbWUgPSBuYW1lLT5leHRyYWN0KGxvYWRlci0+aGFzaFVURjgsIHN0YXJ0LCBzdGFydCArIGxlbik7Ci0gICAgcmV0dXJuIGxvYWRlci0+Y29uc3RydWN0QXJyYXkoYXJyYXlOYW1lLCBiYXNlQ2xhc3MpOwotICB9IGVsc2UgaWYgKG5hbWUtPmVsZW1lbnRzW3N0YXJ0XSA9PSBJX1JFRikgewotICAgIGNvbnN0IFVURjgqIGNvbXBvbmVudE5hbWUgPSBuYW1lLT5leHRyYWN0KGhhc2hVVEY4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgMSwgc3RhcnQgKyBsZW4gLSAxKTsKLSAgICBVc2VyQ29tbW9uQ2xhc3MqIGNsID0gbG9hZE5hbWUoY29tcG9uZW50TmFtZSwgZmFsc2UsIHRydWUsIE5VTEwpOwotICAgIHJldHVybiBjbDsKLSAgfSBlbHNlIHsKLSAgICBDbGFzc3BhdGgqIHVwY2FsbHMgPSB2bS0+dXBjYWxsczsKLSAgICBVc2VyQ2xhc3NQcmltaXRpdmUqIHByaW0gPSAKLSAgICAgIFVzZXJDbGFzc1ByaW1pdGl2ZTo6Ynl0ZUlkVG9QcmltaXRpdmUobmFtZS0+ZWxlbWVudHNbc3RhcnRdLCB1cGNhbGxzKTsKLSAgICBhc3NlcnQocHJpbSAmJiAiTm8gcHJpbWl0aXZlIGZvdW5kIik7Ci0gICAgcmV0dXJuIHByaW07Ci0gIH0KLX0KLQotCi1Vc2VyQ2xhc3NBcnJheSogSm5qdm1DbGFzc0xvYWRlcjo6Y29uc3RydWN0QXJyYXkoY29uc3QgVVRGOCogbmFtZSkgewotICBDbGFzc0FycmF5KiByZXMgPSAoQ2xhc3NBcnJheSopbG9va3VwQ2xhc3MobmFtZSk7Ci0gIGlmIChyZXMpIHJldHVybiByZXM7Ci0KLSAgVXNlckNvbW1vbkNsYXNzKiBjbCA9IGxvYWRCYXNlQ2xhc3MobmFtZSwgMSwgbmFtZS0+c2l6ZSAtIDEpOwotICBhc3NlcnQoY2wgJiYgIm5vIGJhc2UgY2xhc3MgZm9yIGFuIGFycmF5Iik7Ci0gIEpuanZtQ2xhc3NMb2FkZXIqIGxkID0gY2wtPmNsYXNzTG9hZGVyOwotICByZXMgPSBsZC0+Y29uc3RydWN0QXJyYXkobmFtZSwgY2wpOwotICAKLSAgaWYgKHJlcyAmJiByZXMtPmNsYXNzTG9hZGVyICE9IHRoaXMpIHsKLSAgICBjbGFzc2VzLT5sb2NrLmxvY2soKTsKLSAgICBDbGFzc01hcDo6aXRlcmF0b3IgRW5kID0gY2xhc3Nlcy0+bWFwLmVuZCgpOwotICAgIENsYXNzTWFwOjppdGVyYXRvciBJID0gY2xhc3Nlcy0+bWFwLmZpbmQocmVzLT5uYW1lKTsKLSAgICBpZiAoSSA9PSBFbmQpCi0gICAgICBjbGFzc2VzLT5tYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHJlcy0+bmFtZSwgcmVzKSk7Ci0gICAgY2xhc3Nlcy0+bG9jay51bmxvY2soKTsKLSAgfQotICByZXR1cm4gcmVzOwotfQotCi1Vc2VyQ2xhc3MqIEpuanZtQ2xhc3NMb2FkZXI6OmNvbnN0cnVjdENsYXNzKGNvbnN0IFVURjgqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzQnl0ZXMqIGJ5dGVzKSB7Ci0JbXZtOjpnYyogZXhjcCA9IE5VTEw7Ci0gIGxsdm1fZ2Nyb290KGV4Y3AsIDApOwotICBVc2VyQ2xhc3MqIHJlcyA9IE5VTEw7Ci0gIGxvY2subG9jaygpOwotICBjbGFzc2VzLT5sb2NrLmxvY2soKTsKLSAgQ2xhc3NNYXA6Oml0ZXJhdG9yIEVuZCA9IGNsYXNzZXMtPm1hcC5lbmQoKTsKLSAgQ2xhc3NNYXA6Oml0ZXJhdG9yIEkgPSBjbGFzc2VzLT5tYXAuZmluZChuYW1lKTsKLSAgY2xhc3Nlcy0+bG9jay51bmxvY2soKTsKLSAgaWYgKEkgIT0gRW5kKSB7Ci0gICAgcmVzID0gKChVc2VyQ2xhc3MqKShJLT5zZWNvbmQpKTsKLSAgfSBlbHNlIHsKLSAgICBUUlkgewotICAgICAgY29uc3QgVVRGOCogaW50ZXJuYWxOYW1lID0gcmVhZGVyQ29uc3RydWN0VVRGOChuYW1lLT5lbGVtZW50cywgbmFtZS0+c2l6ZSk7Ci0gICAgICByZXMgPSBuZXcoYWxsb2NhdG9yLCAiQ2xhc3MiKSBVc2VyQ2xhc3ModGhpcywgaW50ZXJuYWxOYW1lLCBieXRlcyk7Ci0gICAgICByZXMtPnJlYWRDbGFzcygpOwotICAgICAgcmVzLT5tYWtlVlQoKTsKLSAgICAgIGdldENvbXBpbGVyKCktPnJlc29sdmVWaXJ0dWFsQ2xhc3MocmVzKTsKLSAgICAgIGdldENvbXBpbGVyKCktPnJlc29sdmVTdGF0aWNDbGFzcyhyZXMpOwotICAgICAgY2xhc3Nlcy0+bG9jay5sb2NrKCk7Ci0gICAgICBhc3NlcnQocmVzLT5nZXREZWxlZ2F0ZWUoKSA9PSBOVUxMKTsKLSAgICAgIGFzc2VydChyZXMtPmdldFN0YXRpY0luc3RhbmNlKCkgPT0gTlVMTCk7Ci0gICAgICBib29sIHN1Y2Nlc3MgPSBjbGFzc2VzLT5tYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGludGVybmFsTmFtZSwgcmVzKSkuc2Vjb25kOwotICAgICAgY2xhc3Nlcy0+bG9jay51bmxvY2soKTsKLSAgICAgIGFzc2VydChzdWNjZXNzICYmICJDb3VsZCBub3QgYWRkIGNsYXNzIGluIG1hcCIpOwotICAgIH0gQ0FUQ0ggewotCQkJbXZtOjpUaHJlYWQqIG11dCA9IG12bTo6VGhyZWFkOjpnZXQoKTsKLSAgICAgIGV4Y3AgPSBtdXQtPmdldFBlbmRpbmdFeGNlcHRpb24oKTsKLSAgICAgIG11dC0+Y2xlYXJQZW5kaW5nRXhjZXB0aW9uKCk7ICAgIAotICAgIH0gRU5EX0NBVENIOwotICB9Ci0gIGlmIChleGNwICE9IE5VTEwpIHsKLSAgICBtdm06OlRocmVhZDo6Z2V0KCktPnNldFBlbmRpbmdFeGNlcHRpb24oZXhjcCktPnRocm93SXQoKTsKLSAgfQotICBsb2NrLnVubG9jaygpOwotCi0gIGlmIChyZXMtPnN1cGVyID09IE5VTEwpIHsKLSAgICAvLyBqYXZhLmxhbmcuT2JqZWN0IGp1c3QgZ290IGNyZWF0ZWQsIGluaXRpYWxpc2UgVlRzIG9mIGFycmF5cy4KLSAgICBDbGFzc0FycmF5Ojppbml0aWFsaXNlVlQocmVzKTsKLSAgfQotICByZXR1cm4gcmVzOwotfQotCi1Vc2VyQ2xhc3NBcnJheSogSm5qdm1DbGFzc0xvYWRlcjo6Y29uc3RydWN0QXJyYXkoY29uc3QgVVRGOCogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyQ29tbW9uQ2xhc3MqIGJhc2VDbGFzcykgewotICBhc3NlcnQoYmFzZUNsYXNzICYmICJjb25zdHJ1Y3RpbmcgYW4gYXJyYXkgY2xhc3Mgd2l0aG91dCBhIGJhc2UgY2xhc3MiKTsKLSAgYXNzZXJ0KGJhc2VDbGFzcy0+Y2xhc3NMb2FkZXIgPT0gdGhpcyAmJiAKLSAgICAgICAgICJjb25zdHJ1Y3RpbmcgYW4gYXJyYXkgd2l0aCB3cm9uZyBsb2FkZXIiKTsKLSAgY2xhc3Nlcy0+bG9jay5sb2NrKCk7Ci0gIENsYXNzTWFwOjppdGVyYXRvciBFbmQgPSBjbGFzc2VzLT5tYXAuZW5kKCk7Ci0gIENsYXNzTWFwOjppdGVyYXRvciBJID0gY2xhc3Nlcy0+bWFwLmZpbmQobmFtZSk7Ci0gIFVzZXJDbGFzc0FycmF5KiByZXMgPSAwOwotICBpZiAoSSA9PSBFbmQpIHsKLSAgICBjb25zdCBVVEY4KiBpbnRlcm5hbE5hbWUgPSByZWFkZXJDb25zdHJ1Y3RVVEY4KG5hbWUtPmVsZW1lbnRzLCBuYW1lLT5zaXplKTsKLSAgICByZXMgPSBuZXcoYWxsb2NhdG9yLCAiQXJyYXkgY2xhc3MiKSBVc2VyQ2xhc3NBcnJheSh0aGlzLCBpbnRlcm5hbE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUNsYXNzKTsKLSAgICBjbGFzc2VzLT5tYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGludGVybmFsTmFtZSwgcmVzKSk7Ci0gIH0gZWxzZSB7Ci0gICAgcmVzID0gKChVc2VyQ2xhc3NBcnJheSopKEktPnNlY29uZCkpOwotICB9Ci0gIGNsYXNzZXMtPmxvY2sudW5sb2NrKCk7Ci0gIHJldHVybiByZXM7Ci19Ci0KLVR5cGVkZWYqIEpuanZtQ2xhc3NMb2FkZXI6OmludGVybmFsQ29uc3RydWN0VHlwZShjb25zdCBVVEY4KiBuYW1lKSB7Ci0gIHNob3J0IGludCBjdXIgPSBuYW1lLT5lbGVtZW50c1swXTsKLSAgVHlwZWRlZiogcmVzID0gMDsKLSAgc3dpdGNoIChjdXIpIHsKLSAgICBjYXNlIElfVEFCIDoKLSAgICAgIHJlcyA9IG5ldyhhbGxvY2F0b3IsICJBcnJheVR5cGVkZWYiKSBBcnJheVR5cGVkZWYobmFtZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElfUkVGIDoKLSAgICAgIHJlcyA9IG5ldyhhbGxvY2F0b3IsICJPYmplY3RUeXBlZGVmIikgT2JqZWN0VHlwZWRlZihuYW1lLCBoYXNoVVRGOCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIFVzZXJDbGFzc1ByaW1pdGl2ZSogY2wgPSAKLSAgICAgICAgdm0tPnVwY2FsbHMtPmdldFByaW1pdGl2ZUNsYXNzKChjaGFyKW5hbWUtPmVsZW1lbnRzWzBdKTsKLSAgICAgIGFzc2VydChjbCAmJiAiTm8gcHJpbWl0aXZlIik7Ci0gICAgICBib29sIHVuc2lnbiA9IChjbCA9PSB2bS0+dXBjYWxscy0+T2ZDaGFyIHx8IAotICAgICAgICAgICAgICAgICAgICAgY2wgPT0gdm0tPnVwY2FsbHMtPk9mQm9vbCk7Ci0gICAgICByZXMgPSBuZXcoYWxsb2NhdG9yLCAiUHJpbWl0aXZlVHlwZWRlZiIpIFByaW1pdGl2ZVR5cGVkZWYobmFtZSwgY2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduLCBjdXIpOwotICB9Ci0gIHJldHVybiByZXM7Ci19Ci0KLQotVHlwZWRlZiogSm5qdm1DbGFzc0xvYWRlcjo6Y29uc3RydWN0VHlwZShjb25zdCBVVEY4KiBuYW1lKSB7Ci0gIGphdmFUeXBlcy0+bG9jay5sb2NrKCk7Ci0gIFR5cGVkZWYqIHJlcyA9IGphdmFUeXBlcy0+bG9va3VwKG5hbWUpOwotICBpZiAocmVzID09IDApIHsKLSAgICByZXMgPSBpbnRlcm5hbENvbnN0cnVjdFR5cGUobmFtZSk7Ci0gICAgamF2YVR5cGVzLT5oYXNoKG5hbWUsIHJlcyk7Ci0gIH0KLSAgamF2YVR5cGVzLT5sb2NrLnVubG9jaygpOwotICByZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgdm9pZCB0eXBlRXJyb3IoY29uc3QgVVRGOCogbmFtZSwgc2hvcnQgaW50IGwpIHsKLSAgaWYgKGwgIT0gMCkgewotICAgIGZwcmludGYoc3RkZXJyLCAid3JvbmcgdHlwZSAlZCBpbiAlcyIsIGwsIFVURjhCdWZmZXIobmFtZSkuY1N0cmluZygpKTsKLSAgfSBlbHNlIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIndyb25nIHR5cGUgJXMiLCBVVEY4QnVmZmVyKG5hbWUpLmNTdHJpbmcoKSk7Ci0gIH0KLSAgYWJvcnQoKTsKLX0KLQotCi1zdGF0aWMgYm9vbCBhbmFseXNlSW50ZXJuKGNvbnN0IFVURjgqIG5hbWUsIHVpbnQzMiBwb3MsIHVpbnQzMiBtZXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzImIHJldCkgewotICBzaG9ydCBpbnQgY3VyID0gbmFtZS0+ZWxlbWVudHNbcG9zXTsKLSAgc3dpdGNoIChjdXIpIHsKLSAgICBjYXNlIElfUEFSRCA6Ci0gICAgICByZXQgPSBwb3MgKyAxOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBJX0JPT0wgOgotICAgICAgcmV0ID0gcG9zICsgMTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBjYXNlIElfQllURSA6Ci0gICAgICByZXQgPSBwb3MgKyAxOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGNhc2UgSV9DSEFSIDoKLSAgICAgIHJldCA9IHBvcyArIDE7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgY2FzZSBJX1NIT1JUIDoKLSAgICAgIHJldCA9IHBvcyArIDE7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgY2FzZSBJX0lOVCA6Ci0gICAgICByZXQgPSBwb3MgKyAxOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGNhc2UgSV9GTE9BVCA6Ci0gICAgICByZXQgPSBwb3MgKyAxOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGNhc2UgSV9ET1VCTEUgOgotICAgICAgcmV0ID0gcG9zICsgMTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBjYXNlIElfTE9ORyA6Ci0gICAgICByZXQgPSBwb3MgKyAxOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGNhc2UgSV9WT0lEIDoKLSAgICAgIHJldCA9IHBvcyArIDE7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgY2FzZSBJX1RBQiA6Ci0gICAgICBpZiAobWV0aCA9PSAxKSB7Ci0gICAgICAgIHBvcysrOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgd2hpbGUgKG5hbWUtPmVsZW1lbnRzWysrcG9zXSA9PSBJX1RBQikge30KLSAgICAgICAgYW5hbHlzZUludGVybihuYW1lLCBwb3MsIDEsIHBvcyk7Ci0gICAgICB9Ci0gICAgICByZXQgPSBwb3M7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgY2FzZSBJX1JFRiA6Ci0gICAgICBpZiAobWV0aCAhPSAyKSB7Ci0gICAgICAgIHdoaWxlIChuYW1lLT5lbGVtZW50c1srK3Bvc10gIT0gSV9FTkRfUkVGKSB7fQotICAgICAgfQotICAgICAgcmV0ID0gcG9zICsgMTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBkZWZhdWx0IDoKLSAgICAgIHR5cGVFcnJvcihuYW1lLCBjdXIpOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotU2lnbmRlZiogSm5qdm1DbGFzc0xvYWRlcjo6Y29uc3RydWN0U2lnbihjb25zdCBVVEY4KiBuYW1lKSB7Ci0gIGphdmFTaWduYXR1cmVzLT5sb2NrLmxvY2soKTsKLSAgU2lnbmRlZiogcmVzID0gamF2YVNpZ25hdHVyZXMtPmxvb2t1cChuYW1lKTsKLSAgaWYgKHJlcyA9PSAwKSB7Ci0gICAgc3RkOjp2ZWN0b3I8VHlwZWRlZio+IGJ1ZjsKLSAgICB1aW50MzIgbGVuID0gKHVpbnQzMiluYW1lLT5zaXplOwotICAgIHVpbnQzMiBwb3MgPSAxOwotICAgIHVpbnQzMiBwcmVkID0gMDsKLQotICAgIHdoaWxlIChwb3MgPCBsZW4pIHsKLSAgICAgIHByZWQgPSBwb3M7Ci0gICAgICBib29sIGVuZCA9IGFuYWx5c2VJbnRlcm4obmFtZSwgcG9zLCAwLCBwb3MpOwotICAgICAgaWYgKGVuZCkgYnJlYWs7Ci0gICAgICBlbHNlIHsKLSAgICAgICAgYnVmLnB1c2hfYmFjayhjb25zdHJ1Y3RUeXBlKG5hbWUtPmV4dHJhY3QoaGFzaFVURjgsIHByZWQsIHBvcykpKTsKLSAgICAgIH0gCi0gICAgfQotICAKLSAgICBpZiAocG9zID09IGxlbikgewotICAgICAgdHlwZUVycm9yKG5hbWUsIDApOwotICAgIH0KLSAgCi0gICAgYW5hbHlzZUludGVybihuYW1lLCBwb3MsIDAsIHByZWQpOwotCi0gICAgaWYgKHByZWQgIT0gbGVuKSB7Ci0gICAgICB0eXBlRXJyb3IobmFtZSwgMCk7Ci0gICAgfQotICAgIAotICAgIFR5cGVkZWYqIHJldCA9IGNvbnN0cnVjdFR5cGUobmFtZS0+ZXh0cmFjdChoYXNoVVRGOCwgcG9zLCBwcmVkKSk7Ci0gICAgCi0gICAgcmVzID0gbmV3KGFsbG9jYXRvciwgYnVmLnNpemUoKSkgU2lnbmRlZihuYW1lLCB0aGlzLCBidWYsIHJldCk7Ci0KLSAgICBqYXZhU2lnbmF0dXJlcy0+aGFzaChuYW1lLCByZXMpOwotICB9Ci0gIGphdmFTaWduYXR1cmVzLT5sb2NrLnVubG9jaygpOwotICByZXR1cm4gcmVzOwotfQotCi0KLUpuanZtQ2xhc3NMb2FkZXIqCi1Kbmp2bUNsYXNzTG9hZGVyOjpnZXRKbmp2bUxvYWRlckZyb21KYXZhT2JqZWN0KEphdmFPYmplY3QqIGpsb2FkZXIsIEpuanZtKiB2bSkgewotICAKLSAgVk1DbGFzc0xvYWRlciogdm1kYXRhID0gMDsKLSAgCi0gIGxsdm1fZ2Nyb290KGpsb2FkZXIsIDApOwotICBsbHZtX2djcm9vdCh2bWRhdGEsIDApOwotICAKLSAgaWYgKGpsb2FkZXIgPT0gTlVMTCkgcmV0dXJuIHZtLT5ib290c3RyYXBMb2FkZXI7Ci0gCi0gIEpuanZtQ2xhc3NMb2FkZXIqIEpDTCA9IDA7Ci0gIENsYXNzcGF0aCogdXBjYWxscyA9IHZtLT51cGNhbGxzOwotICB2bWRhdGEgPSAKLSAgICAoVk1DbGFzc0xvYWRlciopKHVwY2FsbHMtPnZtZGF0YUNsYXNzTG9hZGVyLT5nZXRJbnN0YW5jZU9iamVjdEZpZWxkKGpsb2FkZXIpKTsKLQotICBpZiAodm1kYXRhID09IE5VTEwpIHsKLSAgICBKYXZhT2JqZWN0OjphY3F1aXJlKGpsb2FkZXIpOwotICAgIHZtZGF0YSA9IAotICAgICAgKFZNQ2xhc3NMb2FkZXIqKSh1cGNhbGxzLT52bWRhdGFDbGFzc0xvYWRlci0+Z2V0SW5zdGFuY2VPYmplY3RGaWVsZChqbG9hZGVyKSk7Ci0gICAgaWYgKCF2bWRhdGEpIHsKLSAgICAgIHZtZGF0YSA9IFZNQ2xhc3NMb2FkZXI6OmFsbG9jYXRlKHZtKTsKLSAgICAgIG12bTo6QnVtcFB0ckFsbG9jYXRvciogQSA9IG5ldyBtdm06OkJ1bXBQdHJBbGxvY2F0b3IoKTsKLSAgICAgIEpDTCA9IG5ldygqQSwgIkNsYXNzIGxvYWRlciIpIEpuanZtQ2xhc3NMb2FkZXIoKkEsIGpsb2FkZXIsIHZtZGF0YSwgdm0pOwotICAgICAgdXBjYWxscy0+dm1kYXRhQ2xhc3NMb2FkZXItPnNldEluc3RhbmNlT2JqZWN0RmllbGQoamxvYWRlciwgKEphdmFPYmplY3QqKXZtZGF0YSk7Ci0gICAgfQotICAgIEphdmFPYmplY3Q6OnJlbGVhc2UoamxvYWRlcik7Ci0gIH0gZWxzZSB7Ci0gICAgSkNMID0gdm1kYXRhLT5nZXRDbGFzc0xvYWRlcigpOwotICAgIGFzc2VydChKQ0wtPmphdmFMb2FkZXIgPT0gamxvYWRlcik7Ci0gIH0KLQotICByZXR1cm4gSkNMOwotfQotCi1jb25zdCBVVEY4KiBKbmp2bUNsYXNzTG9hZGVyOjphc2NpaXpDb25zdHJ1Y3RVVEY4KGNvbnN0IGNoYXIqIGFzY2lpeikgewotICByZXR1cm4gaGFzaFVURjgtPmxvb2t1cE9yQ3JlYXRlQXNjaWl6KGFzY2lpeik7Ci19Ci0KLWNvbnN0IFVURjgqIEpuanZtQ2xhc3NMb2FkZXI6OnJlYWRlckNvbnN0cnVjdFVURjgoY29uc3QgdWludDE2KiBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBzaXplKSB7Ci0gIHJldHVybiBoYXNoVVRGOC0+bG9va3VwT3JDcmVhdGVSZWFkZXIoYnVmLCBzaXplKTsKLX0KLQotSm5qdm1DbGFzc0xvYWRlcjo6fkpuanZtQ2xhc3NMb2FkZXIoKSB7Ci0KLQltdm06OlRocmVhZDo6Z2V0KCktPnZta2l0LT5yZW1vdmVNZXRob2RJbmZvcyhUaGVDb21waWxlcik7Ci0KLSAgaWYgKGNsYXNzZXMpIHsKLSAgICBjbGFzc2VzLT5+Q2xhc3NNYXAoKTsKLSAgICBhbGxvY2F0b3IuRGVhbGxvY2F0ZShjbGFzc2VzKTsKLSAgfQotCi0gIGlmIChoYXNoVVRGOCkgewotICAgIGhhc2hVVEY4LT5+VVRGOE1hcCgpOwotICAgIGFsbG9jYXRvci5EZWFsbG9jYXRlKGhhc2hVVEY4KTsKLSAgfQotCi0gIGlmIChqYXZhVHlwZXMpIHsKLSAgICBqYXZhVHlwZXMtPn5UeXBlTWFwKCk7Ci0gICAgYWxsb2NhdG9yLkRlYWxsb2NhdGUoamF2YVR5cGVzKTsKLSAgfQotCi0gIGlmIChqYXZhU2lnbmF0dXJlcykgewotICAgIGphdmFTaWduYXR1cmVzLT5+U2lnbk1hcCgpOwotICAgIGFsbG9jYXRvci5EZWFsbG9jYXRlKGphdmFTaWduYXR1cmVzKTsKLSAgfQotCi0gIGZvciAoc3RkOjp2ZWN0b3I8dm9pZCo+OjppdGVyYXRvciBpID0gbmF0aXZlTGlicy5iZWdpbigpOyAKLSAgICAgICBpIDwgbmF0aXZlTGlicy5lbmQoKTsgKytpKSB7Ci0gICAgZGxjbG9zZSgqaSk7Ci0gIH0KLQotICBkZWxldGUgVGhlQ29tcGlsZXI7Ci0KLSAgLy8gRG9uJ3QgZGVsZXRlIHRoZSBhbGxvY2F0b3IuIFRoZSBjYWxsZXIgb2YgdGhpcyBtZXRob2QgbXVzdAotICAvLyBkZWxldGUgaXQgYWZ0ZXIgdGhlIGN1cnJlbnQgb2JqZWN0IGlzIGRlbGV0ZWQuCi19Ci0KLQotSm5qdm1Cb290c3RyYXBMb2FkZXI6On5Kbmp2bUJvb3RzdHJhcExvYWRlcigpIHsKLX0KLQotSmF2YVN0cmluZyoqIEpuanZtQ2xhc3NMb2FkZXI6OlVURjhUb1N0cihjb25zdCBVVEY4KiB2YWwpIHsKLSAgSmF2YVN0cmluZyogcmVzID0gTlVMTDsKLSAgbGx2bV9nY3Jvb3QocmVzLCAwKTsKLSAgcmVzID0gdm0tPmludGVybmFsVVRGOFRvU3RyKHZhbCk7Ci0gIHJldHVybiBzdHJpbmdzLT5hZGRTdHJpbmcodGhpcywgcmVzKTsKLX0KLQotdm9pZCBKbmp2bUJvb3RzdHJhcExvYWRlcjo6YW5hbHlzZUNsYXNzcGF0aEVudihjb25zdCBjaGFyKiBzdHIpIHsKLSAgQ2xhc3NCeXRlcyogYnl0ZXMgPSBOVUxMOwotICBtdm06OlRocmVhZEFsbG9jYXRvciB0aHJlYWRBbGxvY2F0b3I7Ci0gIGlmIChzdHIgIT0gMCkgewotICAgIHVuc2lnbmVkIGludCBsZW4gPSBzdHJsZW4oc3RyKTsKLSAgICBjaGFyKiBidWYgPSAoY2hhciopdGhyZWFkQWxsb2NhdG9yLkFsbG9jYXRlKChsZW4gKyAxKSAqIHNpemVvZihjaGFyKSk7Ci0gICAgY29uc3QgY2hhciogY3VyID0gc3RyOwotICAgIGludCB0b3AgPSAwOwotICAgIGNoYXIgYyA9IDE7Ci0gICAgd2hpbGUgKGMgIT0gMCkgewotICAgICAgd2hpbGUgKCgoYyA9IGN1clt0b3BdKSAhPSAwKSAmJiBjICE9IEpuanZtOjplbnZTZXBhcmF0b3JbMF0pIHsKLSAgICAgICAgdG9wKys7Ci0gICAgICB9Ci0gICAgICBpZiAodG9wICE9IDApIHsKLSAgICAgICAgbWVtY3B5KGJ1ZiwgY3VyLCB0b3ApOwotICAgICAgICBidWZbdG9wXSA9IDA7Ci0gICAgICAgIGNoYXIqIHJwID0gKGNoYXIqKXRocmVhZEFsbG9jYXRvci5BbGxvY2F0ZShQQVRIX01BWCk7Ci0gICAgICAgIG1lbXNldChycCwgMCwgUEFUSF9NQVgpOwotICAgICAgICBycCA9IHJlYWxwYXRoKGJ1ZiwgcnApOwotICAgICAgICBpZiAocnAgJiYgcnBbUEFUSF9NQVggLSAxXSA9PSAwICYmIHN0cmxlbihycCkgIT0gMCkgewotICAgICAgICAgIHN0cnVjdCBzdGF0IHN0OwotICAgICAgICAgIHN0YXQocnAsICZzdCk7Ci0gICAgICAgICAgaWYgKChzdC5zdF9tb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGVuID0gc3RybGVuKHJwKTsKLSAgICAgICAgICAgIGNoYXIqIHRlbXAgPSAoY2hhciopYWxsb2NhdG9yLkFsbG9jYXRlKGxlbiArIDIsICJCb290IGNsYXNzcGF0aCIpOwotICAgICAgICAgICAgbWVtY3B5KHRlbXAsIHJwLCBsZW4pOwotICAgICAgICAgICAgdGVtcFtsZW5dID0gSm5qdm06OmRpclNlcGFyYXRvclswXTsKLSAgICAgICAgICAgIHRlbXBbbGVuICsgMV0gPSAwOwotICAgICAgICAgICAgYm9vdENsYXNzcGF0aC5wdXNoX2JhY2sodGVtcCk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ5dGVzID0gUmVhZGVyOjpvcGVuRmlsZSh0aGlzLCBycCk7Ci0gICAgICAgICAgICBpZiAoYnl0ZXMpIHsKLSAgICAgICAgICAgICAgWmlwQXJjaGl2ZSAqYXJjaGl2ZSA9IG5ldyhhbGxvY2F0b3IsICJaaXBBcmNoaXZlIikKLSAgICAgICAgICAgICAgICBaaXBBcmNoaXZlKGJ5dGVzLCBhbGxvY2F0b3IpOwotICAgICAgICAgICAgICBpZiAoYXJjaGl2ZSkgewotICAgICAgICAgICAgICAgIGJvb3RBcmNoaXZlcy5wdXNoX2JhY2soYXJjaGl2ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gCi0gICAgICB9Ci0gICAgICBjdXIgPSBjdXIgKyB0b3AgKyAxOwotICAgICAgdG9wID0gMDsKLSAgICB9Ci0gIH0KLX0KLQotLy8gY29uc3RydWN0QXJyYXlOYW1lIGNhbiBhbGxvY2F0ZSB0aGUgVVRGOCBkaXJlY3RseSBpbiB0aGUgY2xhc3Nsb2FkZXIKLS8vIG1lbW9yeSBiZWNhdXNlIGl0IGlzIGNhbGxlZCBieSBzYWZlIHBsYWNlcywgaWUgb25seSB2YWxpZCBuYW1lcyBhcmUKLS8vIGNyZWF0ZWQuCi1jb25zdCBVVEY4KiBKbmp2bUNsYXNzTG9hZGVyOjpjb25zdHJ1Y3RBcnJheU5hbWUodWludDMyIHN0ZXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVURjgqIGNsYXNzTmFtZSkgewotICB1aW50MzIgbGVuID0gY2xhc3NOYW1lLT5zaXplOwotICB1aW50MzIgcG9zID0gc3RlcHM7Ci0gIGJvb2wgaXNUYWIgPSAoY2xhc3NOYW1lLT5lbGVtZW50c1swXSA9PSBJX1RBQiA/IHRydWUgOiBmYWxzZSk7Ci0gIHVpbnQzMiBuID0gc3RlcHMgKyBsZW4gKyAoaXNUYWIgPyAwIDogMik7Ci0gIG12bTo6VGhyZWFkQWxsb2NhdG9yIGFsbG9jYXRvcjsKLSAgdWludDE2KiBidWYgPSAodWludDE2KilhbGxvY2F0b3IuQWxsb2NhdGUobiAqIHNpemVvZih1aW50MTYpKTsKLSAgICAKLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBzdGVwczsgaSsrKSB7Ci0gICAgYnVmW2ldID0gSV9UQUI7Ci0gIH0KLQotICBpZiAoIWlzVGFiKSB7Ci0gICAgKytwb3M7Ci0gICAgYnVmW3N0ZXBzXSA9IElfUkVGOwotICB9Ci0KLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgIGJ1Zltwb3MgKyBpXSA9IGNsYXNzTmFtZS0+ZWxlbWVudHNbaV07Ci0gIH0KLQotICBpZiAoIWlzVGFiKSB7Ci0gICAgYnVmW24gLSAxXSA9IElfRU5EX1JFRjsKLSAgfQotCi0gIGNvbnN0IFVURjgqIHJlcyA9IHJlYWRlckNvbnN0cnVjdFVURjgoYnVmLCBuKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotaW50cHRyX3QgSm5qdm1DbGFzc0xvYWRlcjo6bG9hZEluTGliKGNvbnN0IGNoYXIqIGJ1ZiwgYm9vbCYgajMpIHsKLSAgdWludHB0cl90IHJlcyA9ICh1aW50cHRyX3QpVGhlQ29tcGlsZXItPmxvYWRNZXRob2QoU0VMRl9IQU5ETEUsIGJ1Zik7Ci0gIAotICBpZiAoIXJlcykgewotICAgIGZvciAoc3RkOjp2ZWN0b3I8dm9pZCo+OjppdGVyYXRvciBpID0gbmF0aXZlTGlicy5iZWdpbigpLAotICAgICAgICAgICAgICBlID0gbmF0aXZlTGlicy5lbmQoKTsgaSE9IGU7ICsraSkgewotICAgICAgcmVzID0gKHVpbnRwdHJfdClUaGVDb21waWxlci0+bG9hZE1ldGhvZCgoKmkpLCBidWYpOwotICAgICAgaWYgKHJlcykgYnJlYWs7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGozID0gdHJ1ZTsKLSAgfQotICAKLSAgaWYgKCFyZXMgJiYgdGhpcyAhPSB2bS0+Ym9vdHN0cmFwTG9hZGVyKQotICAgIHJlcyA9IHZtLT5ib290c3RyYXBMb2FkZXItPmxvYWRJbkxpYihidWYsIGozKTsKLQotICByZXR1cm4gKGludHB0cl90KXJlczsKLX0KLQotdm9pZCogSm5qdm1DbGFzc0xvYWRlcjo6bG9hZExpYihjb25zdCBjaGFyKiBidWYpIHsKLSAgdm9pZCogaGFuZGxlID0gZGxvcGVuKGJ1ZiwgUlRMRF9MQVpZIHwgUlRMRF9MT0NBTCk7Ci0gIGlmIChoYW5kbGUpIG5hdGl2ZUxpYnMucHVzaF9iYWNrKGhhbmRsZSk7Ci0gIHJldHVybiBoYW5kbGU7Ci19Ci0KLWludHB0cl90IEpuanZtQ2xhc3NMb2FkZXI6OmxvYWRJbkxpYihjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBoYW5kbGUpIHsKLSAgcmV0dXJuIChpbnRwdHJfdClUaGVDb21waWxlci0+bG9hZE1ldGhvZChoYW5kbGUsIG5hbWUpOwotfQotCi1pbnRwdHJfdCBKbmp2bUNsYXNzTG9hZGVyOjpuYXRpdmVMb29rdXAoSmF2YU1ldGhvZCogbWV0aCwgYm9vbCYgajMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogYnVmKSB7Ci0KLSAgbWV0aC0+am5pQ29uc0Zyb21NZXRoKGJ1Zik7Ci0gIGludHB0cl90IHJlcyA9IGxvYWRJbkxpYihidWYsIGozKTsKLSAgaWYgKCFyZXMpIHsKLSAgICBtZXRoLT5qbmlDb25zRnJvbU1ldGhPdmVybG9hZGVkKGJ1Zik7Ci0gICAgcmVzID0gbG9hZEluTGliKGJ1ZiwgajMpOwotICB9Ci0gIHJldHVybiByZXM7Ci19Ci0KLWNsYXNzIEphdmFTdGF0aWNNZXRob2RJbmZvIDogcHVibGljIG12bTo6Q2FtbE1ldGhvZEluZm8gewotcHVibGljOgotICB2aXJ0dWFsIHZvaWQgcHJpbnQodm9pZCogaXAsIHZvaWQqIGFkZHIpOwotICB2aXJ0dWFsIGJvb2wgaXNIaWdoTGV2ZWxNZXRob2QoKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIEphdmFTdGF0aWNNZXRob2RJbmZvKG12bTo6Q2FtbE1ldGhvZEluZm8qIHN1cGVyLCB2b2lkKiBpcCwgSmF2YU1ldGhvZCogTSkgOgotICAgIG12bTo6Q2FtbE1ldGhvZEluZm8oc3VwZXItPkNGKSB7Ci0gICAgTWV0YUluZm8gPSBNOwotICAgIE93bmVyID0gTS0+Y2xhc3NEZWYtPmNsYXNzTG9hZGVyLT5nZXRDb21waWxlcigpOwotICB9Ci19OwotCi12b2lkIEphdmFTdGF0aWNNZXRob2RJbmZvOjpwcmludCh2b2lkKiBpcCwgdm9pZCogYWRkcikgewotICB2b2lkKiBuZXdfaXAgPSBOVUxMOwotICBpZiAoaXApIG5ld19pcCA9IG12bTo6TWV0aG9kSW5mbzo6aXNTdHViKGlwLCBhZGRyKTsKLSAgSmF2YU1ldGhvZCogbWV0aCA9IChKYXZhTWV0aG9kKilNZXRhSW5mbzsKLSAgZnByaW50ZihzdGRlcnIsICI7ICVwIGluICVzLiVzIiwgbmV3X2lwLAotICAgICAgICAgIFVURjhCdWZmZXIobWV0aC0+Y2xhc3NEZWYtPm5hbWUpLmNTdHJpbmcoKSwKLSAgICAgICAgICBVVEY4QnVmZmVyKG1ldGgtPm5hbWUpLmNTdHJpbmcoKSk7Ci0gIGlmIChpcCAhPSBuZXdfaXApIGZwcmludGYoc3RkZXJyLCAiIChmcm9tIHN0dWIpIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKLX0KLQotdm9pZCBKbmp2bUNsYXNzTG9hZGVyOjppbnNlcnRBbGxNZXRob2RzSW5WTSgpIHsKLSAgZm9yIChDbGFzc01hcDo6aXRlcmF0b3IgaSA9IGNsYXNzZXMtPm1hcC5iZWdpbigpLCBlID0gY2xhc3Nlcy0+bWFwLmVuZCgpOwotICAgICAgIGkgIT0gZTsgKytpKSB7Ci0gICAgQ29tbW9uQ2xhc3MqIGNsID0gaS0+c2Vjb25kOwotICAgIGlmIChjbC0+aXNDbGFzcygpKSB7Ci0gICAgICBDbGFzcyogQyA9IGNsLT5hc0NsYXNzKCk7Ci0gICAgICAKLSAgICAgIGZvciAodWludDMyIGkgPSAwOyBpIDwgQy0+bmJWaXJ0dWFsTWV0aG9kczsgKytpKSB7Ci0gICAgICAgIEphdmFNZXRob2QmIG1ldGggPSBDLT52aXJ0dWFsTWV0aG9kc1tpXTsKLSAgICAgICAgaWYgKCFpc0Fic3RyYWN0KG1ldGguYWNjZXNzKSAmJiBtZXRoLmNvZGUpIHsKLSAgICAgICAgICBKYXZhU3RhdGljTWV0aG9kSW5mbyogTUkgPSBuZXcgKGFsbG9jYXRvciwgIkphdmFTdGF0aWNNZXRob2RJbmZvIikKLSAgICAgICAgICAgIEphdmFTdGF0aWNNZXRob2RJbmZvKDAsIG1ldGguY29kZSwgJm1ldGgpOwotICAgICAgICAgIHZtLT52bWtpdC0+RnVuY3Rpb25zQ2FjaGUuYWRkTWV0aG9kSW5mbyhNSSwgbWV0aC5jb2RlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IEMtPm5iU3RhdGljTWV0aG9kczsgKytpKSB7Ci0gICAgICAgIEphdmFNZXRob2QmIG1ldGggPSBDLT5zdGF0aWNNZXRob2RzW2ldOwotICAgICAgICBpZiAoIWlzQWJzdHJhY3QobWV0aC5hY2Nlc3MpICYmIG1ldGguY29kZSkgewotICAgICAgICAgIEphdmFTdGF0aWNNZXRob2RJbmZvKiBNSSA9IG5ldyAoYWxsb2NhdG9yLCAiSmF2YVN0YXRpY01ldGhvZEluZm8iKQotICAgICAgICAgICAgSmF2YVN0YXRpY01ldGhvZEluZm8oMCwgbWV0aC5jb2RlLCAmbWV0aCk7Ci0gICAgICAgICAgdm0tPnZta2l0LT5GdW5jdGlvbnNDYWNoZS5hZGRNZXRob2RJbmZvKE1JLCBtZXRoLmNvZGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgSm5qdm1DbGFzc0xvYWRlcjo6bG9hZExpYkZyb21KYXIoY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSkgewotCi0gIG12bTo6VGhyZWFkQWxsb2NhdG9yIHRocmVhZEFsbG9jYXRvcjsKLSAgY2hhciogc29OYW1lID0gKGNoYXIqKXRocmVhZEFsbG9jYXRvci5BbGxvY2F0ZSgKLSAgICAgIHN0cmxlbihuYW1lKSArIHN0cmxlbihEWUxEX0VYVEVOU0lPTikpOwotICBjb25zdCBjaGFyKiBwdHIgPSBzdHJyY2hyKG5hbWUsICcvJyk7Ci0gIHNwcmludGYoc29OYW1lLCAiJXMlcyIsIHB0ciA/IHB0ciArIDEgOiBuYW1lLCBEWUxEX0VYVEVOU0lPTik7Ci0gIHZvaWQqIGhhbmRsZSA9IGRsb3Blbihzb05hbWUsIFJUTERfTEFaWSB8IFJUTERfTE9DQUwpOwotICBpZiAoaGFuZGxlKSB7Ci0gICAgQ2xhc3MqIGNsID0gKENsYXNzKilkbHN5bShoYW5kbGUsIGZpbGUpOwotICAgIGlmIChjbCkgewotICAgICAgc3RhdGljX2luaXRfdCBpbml0ID0gKHN0YXRpY19pbml0X3QpKHVpbnRwdHJfdCljbC0+Y2xhc3NMb2FkZXI7Ci0gICAgICBhc3NlcnQoaW5pdCAmJiAiTG9hZGVkIHRoZSB3cm9uZyBsaWJyYXJ5Iik7Ci0gICAgICBpbml0KHRoaXMpOwotICAgICAgaW5zZXJ0QWxsTWV0aG9kc0luVk0oKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBKbmp2bUNsYXNzTG9hZGVyOjpsb2FkTGliRnJvbUZpbGUoY29uc3QgY2hhciogbmFtZSkgewotICBtdm06OlRocmVhZEFsbG9jYXRvciB0aHJlYWRBbGxvY2F0b3I7Ci0gIGFzc2VydChjbGFzc2VzLT5tYXAuc2l6ZSgpID09IDApOwotICBjaGFyKiBzb05hbWUgPSAoY2hhciopdGhyZWFkQWxsb2NhdG9yLkFsbG9jYXRlKAotICAgICAgc3RybGVuKG5hbWUpICsgc3RybGVuKERZTERfRVhURU5TSU9OKSk7Ci0gIHNwcmludGYoc29OYW1lLCAiJXMlcyIsIG5hbWUsIERZTERfRVhURU5TSU9OKTsKLSAgdm9pZCogaGFuZGxlID0gZGxvcGVuKHNvTmFtZSwgUlRMRF9MQVpZIHwgUlRMRF9MT0NBTCk7Ci0gIGlmIChoYW5kbGUpIHsKLSAgICBDbGFzcyogY2wgPSAoQ2xhc3MqKWRsc3ltKGhhbmRsZSwgbmFtZSk7Ci0gICAgaWYgKGNsKSB7Ci0gICAgICBzdGF0aWNfaW5pdF90IGluaXQgPSAoc3RhdGljX2luaXRfdCkodWludHB0cl90KWNsLT5jbGFzc0xvYWRlcjsKLSAgICAgIGluaXQodGhpcyk7Ci0gICAgICBpbnNlcnRBbGxNZXRob2RzSW5WTSgpOwotICAgIH0KLSAgfQotfQotCi1DbGFzcyogSm5qdm1DbGFzc0xvYWRlcjo6bG9hZENsYXNzRnJvbVNlbGYoY29uc3QgY2hhciogbmFtZSkgewotICBhc3NlcnQoY2xhc3Nlcy0+bWFwLnNpemUoKSA9PSAwKTsKLSAgQ2xhc3MqIGNsID0gKENsYXNzKilkbHN5bShTRUxGX0hBTkRMRSwgbmFtZSk7Ci0gIGlmIChjbCkgewotICAgIHN0YXRpY19pbml0X3QgaW5pdCA9IChzdGF0aWNfaW5pdF90KSh1aW50cHRyX3QpY2wtPmNsYXNzTG9hZGVyOwotICAgIGluaXQodGhpcyk7Ci0gICAgaW5zZXJ0QWxsTWV0aG9kc0luVk0oKTsKLSAgfQotICByZXR1cm4gY2w7Ci19Ci0KLQotLy8gRXh0ZXJuICJDIiBmdW5jdGlvbnMgY2FsbGVkIGJ5IHRoZSB2bWpjIHN0YXRpYyBpbnRpYWxpemVyLgotZXh0ZXJuICJDIiB2b2lkIHZtamNBZGRQcmVDb21waWxlZENsYXNzKEpuanZtQ2xhc3NMb2FkZXIqIEpDTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25DbGFzcyogY2wpIHsKLSAgY2wtPmNsYXNzTG9hZGVyID0gSkNMOwotCWNsLT52aXJ0dWFsVlQtPnZtID0gSkNMLT52bTsKLSAgCi0gIEpDTC0+aGFzaFVURjgtPmluc2VydChjbC0+bmFtZSk7Ci0KLSAgaWYgKGNsLT5pc0NsYXNzKCkpIHsKLSAgICBDbGFzcyogcmVhbENsID0gY2wtPmFzQ2xhc3MoKTsKLQkJLy8gVG8gYXZvaWQgZGF0YSBhbGlnbm1lbnQgaW4gdGhlIGxsdm0gYXNzZW1ibHkgZW1pdHRlciwgd2Ugc2V0IHRoZQotICAJLy8gc3RhdGljTWV0aG9kcyBhbmQgc3RhdGljRmllbGRzIGZpZWxkcyBoZXJlLgotICAgIHJlYWxDbC0+c3RhdGljTWV0aG9kcyA9IHJlYWxDbC0+dmlydHVhbE1ldGhvZHMgKyByZWFsQ2wtPm5iVmlydHVhbE1ldGhvZHM7Ci0gICAgcmVhbENsLT5zdGF0aWNGaWVsZHMgPSByZWFsQ2wtPnZpcnR1YWxGaWVsZHMgKyByZWFsQ2wtPm5iVmlydHVhbEZpZWxkczsKLSAgCWNsLT52aXJ0dWFsVlQtPnNldE5hdGl2ZVRyYWNlcihjbC0+dmlydHVhbFZULT50cmFjZXIsICIiKTsKLQotICAgIGZvciAodWludDMyIGkgPSAwOyBpPCByZWFsQ2wtPm5iU3RhdGljTWV0aG9kczsgKytpKSB7Ci0gICAgICBKYXZhTWV0aG9kJiBtZXRoID0gcmVhbENsLT5zdGF0aWNNZXRob2RzW2ldOwotICAgICAgSkNMLT5oYXNoVVRGOC0+aW5zZXJ0KG1ldGgubmFtZSk7Ci0gICAgICBKQ0wtPmhhc2hVVEY4LT5pbnNlcnQobWV0aC50eXBlKTsKLSAgICB9Ci0gICAgCi0gICAgZm9yICh1aW50MzIgaSA9IDA7IGk8IHJlYWxDbC0+bmJWaXJ0dWFsTWV0aG9kczsgKytpKSB7Ci0gICAgICBKYXZhTWV0aG9kJiBtZXRoID0gcmVhbENsLT52aXJ0dWFsTWV0aG9kc1tpXTsKLSAgICAgIEpDTC0+aGFzaFVURjgtPmluc2VydChtZXRoLm5hbWUpOwotICAgICAgSkNMLT5oYXNoVVRGOC0+aW5zZXJ0KG1ldGgudHlwZSk7Ci0gICAgfQotICAgIAotICAgIGZvciAodWludDMyIGkgPSAwOyBpPCByZWFsQ2wtPm5iU3RhdGljRmllbGRzOyArK2kpIHsKLSAgICAgIEphdmFGaWVsZCYgZmllbGQgPSByZWFsQ2wtPnN0YXRpY0ZpZWxkc1tpXTsKLSAgICAgIEpDTC0+aGFzaFVURjgtPmluc2VydChmaWVsZC5uYW1lKTsKLSAgICAgIEpDTC0+aGFzaFVURjgtPmluc2VydChmaWVsZC50eXBlKTsKLSAgICB9Ci0gICAgCi0gICAgZm9yICh1aW50MzIgaSA9IDA7IGk8IHJlYWxDbC0+bmJWaXJ0dWFsRmllbGRzOyArK2kpIHsKLSAgICAgIEphdmFGaWVsZCYgZmllbGQgPSByZWFsQ2wtPnZpcnR1YWxGaWVsZHNbaV07Ci0gICAgICBKQ0wtPmhhc2hVVEY4LT5pbnNlcnQoZmllbGQubmFtZSk7Ci0gICAgICBKQ0wtPmhhc2hVVEY4LT5pbnNlcnQoZmllbGQudHlwZSk7Ci0gICAgfQotICB9Ci0KLQlpZiAoIWNsLT5pc1ByaW1pdGl2ZSgpKQotCSAgSkNMLT5nZXRDbGFzc2VzKCktPm1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY2wtPm5hbWUsIGNsKSk7Ci0KLX0KLQotZXh0ZXJuICJDIiB2b2lkIHZtamNHZXRDbGFzc0FycmF5KEpuanZtQ2xhc3NMb2FkZXIqIEpDTCwgQ2xhc3NBcnJheSoqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVVEY4KiBuYW1lKSB7Ci0gIEpDTC0+aGFzaFVURjgtPmluc2VydChuYW1lKTsKLSAgKnB0ciA9IEpDTC0+Y29uc3RydWN0QXJyYXkobmFtZSk7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCB2bWpjQWRkVVRGOChKbmp2bUNsYXNzTG9hZGVyKiBKQ0wsIGNvbnN0IFVURjgqIHZhbCkgewotICBKQ0wtPmhhc2hVVEY4LT5pbnNlcnQodmFsKTsKLX0KLQotZXh0ZXJuICJDIiB2b2lkIHZtamNBZGRTdHJpbmcoSm5qdm1DbGFzc0xvYWRlciogSkNMLCBKYXZhU3RyaW5nKiB2YWwpIHsKLSAgSkNMLT5zdHJpbmdzLT5hZGRTdHJpbmcoSkNMLCB2YWwpOwotfQotCi1leHRlcm4gIkMiIGludHB0cl90IHZtamNOYXRpdmVMb2FkZXIoSmF2YU1ldGhvZCogbWV0aCkgewotICBib29sIGozID0gZmFsc2U7Ci0gIGNvbnN0IFVURjgqIGpuaUNvbnNDbE5hbWUgPSBtZXRoLT5jbGFzc0RlZi0+bmFtZTsKLSAgY29uc3QgVVRGOCogam5pQ29uc05hbWUgPSBtZXRoLT5uYW1lOwotICBjb25zdCBVVEY4KiBqbmlDb25zVHlwZSA9IG1ldGgtPnR5cGU7Ci0gIHNpbnQzMiBjbGVuID0gam5pQ29uc0NsTmFtZS0+c2l6ZTsKLSAgc2ludDMyIG1ubGVuID0gam5pQ29uc05hbWUtPnNpemU7Ci0gIHNpbnQzMiBtdGxlbiA9IGpuaUNvbnNUeXBlLT5zaXplOwotCi0gIG12bTo6VGhyZWFkQWxsb2NhdG9yIHRocmVhZEFsbG9jYXRvcjsKLSAgY2hhciogYnVmID0gKGNoYXIqKXRocmVhZEFsbG9jYXRvci5BbGxvY2F0ZSgKLSAgICAgIDMgKyBKTklfTkFNRV9QUkVfTEVOICsgMSArICgobW5sZW4gKyBjbGVuICsgbXRsZW4pIDw8IDMpKTsKLSAgaW50cHRyX3QgcmVzID0gbWV0aC0+Y2xhc3NEZWYtPmNsYXNzTG9hZGVyLT5uYXRpdmVMb29rdXAobWV0aCwgajMsIGJ1Zik7Ci0gIGFzc2VydChyZXMgJiYgIkNvdWxkIG5vdCBmaW5kIHJlcXVpcmVkIG5hdGl2ZSBtZXRob2QiKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotVk1DbGFzc0xvYWRlciogVk1DbGFzc0xvYWRlcjo6YWxsb2NhdGUoSm5qdm0gKnZtKSB7Ci0JVk1DbGFzc0xvYWRlciogcmVzID0gMDsKLQlsbHZtX2djcm9vdChyZXMsIDApOwotCXJlcyA9IChWTUNsYXNzTG9hZGVyKilnYzo6b3BlcmF0b3IgbmV3KHNpemVvZihWTUNsYXNzTG9hZGVyKSwgdm0tPlZNQ2xhc3NMb2FkZXJfX1ZUKTsKLQlyZXR1cm4gcmVzOwotfQotCi1ib29sIFZNQ2xhc3NMb2FkZXI6OmlzVk1DbGFzc0xvYWRlcihKbmp2bSAqdm0sIEphdmFPYmplY3QqIG9iaikgewotCWxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0JLy8gbm90IHNhZmU6IG11c3QgdmVyaWZ5IHRoYXQgb2JqIGJlbG9uZ3MgdG8gYSBqdm0KLQlyZXR1cm4gb2JqLT5nZXRWaXJ0dWFsVGFibGUoKSA9PSB2bS0+Vk1DbGFzc0xvYWRlcl9fVlQ7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBzdGF0aWNDYWxsYmFjaygpIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWUiKTsKLSAgYWJvcnQoKTsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9KMy9WTUNvcmUvSm5qdm1DbGFzc0xvYWRlci5oIGIvdm1raXQvbGliL0ozL1ZNQ29yZS9Kbmp2bUNsYXNzTG9hZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZTNmOWMuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL0ozL1ZNQ29yZS9Kbmp2bUNsYXNzTG9hZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MzggKzAsMCBAQAotLy89PT0tLSBKbmp2bUNsYXNzTG9hZGVyLmggLSBKbmp2bSByZXByZXNlbnRhdGlvbiBvZiBhIGNsYXNzIGxvYWRlciAtLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLQotI2lmbmRlZiBKTkpWTV9DTEFTU0xPQURFUl9ICi0jZGVmaW5lIEpOSlZNX0NMQVNTTE9BREVSX0gKLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJ0eXBlcy5oIgotCi0KLSNpbmNsdWRlICJtdm0vQWxsb2NhdG9yLmgiCi0KLSNpbmNsdWRlICJKYXZhT2JqZWN0LmgiCi0jaW5jbHVkZSAiSm5qdm1Db25maWcuaCIKLSNpbmNsdWRlICJVVEY4LmgiCi0KLW5hbWVzcGFjZSBqMyB7Ci0KLWNsYXNzIFVzZXJDbGFzczsKLWNsYXNzIFVzZXJDbGFzc0FycmF5OwotY2xhc3MgQ2xhc3NCeXRlczsKLWNsYXNzIENsYXNzTWFwOwotY2xhc3MgQ2xhc3NwYXRoOwotY2xhc3MgVXNlckNvbW1vbkNsYXNzOwotY2xhc3MgSmF2YUNvbXBpbGVyOwotY2xhc3MgSmF2YU1ldGhvZDsKLWNsYXNzIEphdmFPYmplY3Q7Ci1jbGFzcyBKYXZhU3RyaW5nOwotY2xhc3MgSm5qdm07Ci1jbGFzcyBKbmp2bUJvb3RzdHJhcExvYWRlcjsKLWNsYXNzIEpuanZtQ2xhc3NMb2FkZXI7Ci1jbGFzcyBTaWduZGVmOwotY2xhc3MgU2lnbk1hcDsKLWNsYXNzIFN0cmluZ0xpc3Q7Ci1jbGFzcyBUeXBlZGVmOwotY2xhc3MgVHlwZU1hcDsKLWNsYXNzIFZNQ2xhc3NMb2FkZXI7Ci1jbGFzcyBaaXBBcmNoaXZlOwotCi0KLS8vLyBKbmp2bUNsYXNzTG9hZGVyIC0gUnVudGltZSByZXByZXNlbnRhdGlvbiBvZiBhIGNsYXNzIGxvYWRlci4gSXQgY29udGFpbnMKLS8vLyBpdHMgb3duIHRhYmxlcyAoc2lnbmF0dXJlcywgVVRGOCwgdHlwZXMpIHdoaWNoIGFyZSBtYXBwZWQgdG8gYSBzaW5nbGUKLS8vLyB0YWJsZSBmb3Igbm9uLWlzb2xhdGUgZW52aXJvbm1lbnRzLgotLy8vCi1jbGFzcyBKbmp2bUNsYXNzTG9hZGVyIDogcHVibGljIG12bTo6UGVybWFuZW50T2JqZWN0IHsKLXB1YmxpYzoKLSAgLy8vIHZtIC0gbXkgdm0KLSAgLy8vCi0gIEpuanZtKiB2bTsKLQotcHJpdmF0ZToKLSAgLy8vIGphdmFMb2RlciAtIFRoZSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjbGFzcyBsb2FkZXIuIE51bGwgZm9yIHRoZQotICAvLy8gYm9vdHN0cmFwIGNsYXNzIGxvYWRlci4KLSAgLy8vCi0gIEphdmFPYmplY3QqIGphdmFMb2FkZXI7Ci0KLSAgLy8vIGludGVybmFsTG9hZCAtIExvYWQgdGhlIGNsYXNzIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gIC8vLwotICB2aXJ0dWFsIFVzZXJDbGFzcyogaW50ZXJuYWxMb2FkKGNvbnN0IFVURjgqIHV0ZjgsIGJvb2wgZG9SZXNvbHZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFTdHJpbmcqIHN0ck5hbWUpOwotICAKLSAgLy8vIGludGVybmFsQ29uc3RydWN0VHlwZSAtIEhhc2hlcyBhIFR5cGVkZWYsIGFuIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mCi0gIC8vLyBhIGNsYXNzIHN0aWxsIG5vdCBsb2FkZWQuCi0gIC8vLwotICBUeXBlZGVmKiBpbnRlcm5hbENvbnN0cnVjdFR5cGUoY29uc3QgVVRGOCAqIG5hbWUpOwotICAKLSAgLy8vIEpuanZtQ2xhc3NMb2FkZXIgLSBBbGxvY2F0ZSBhIHVzZXItZGVmaW5lZCBjbGFzcyBsb2FkZXIuIENhbGxlZCBvbgotICAvLy8gZmlyc3QgdXNlIG9mIGEgSmF2YSBjbGFzcyBsb2FkZXIuCi0gIC8vLwotICBKbmp2bUNsYXNzTG9hZGVyKG12bTo6QnVtcFB0ckFsbG9jYXRvciYgQWxsb2MsIEphdmFPYmplY3QqIGxvYWRlciwgVk1DbGFzc0xvYWRlciogdm1kYXRhLCBKbmp2bSogdm0pOwotCi0gIC8vLyBsb29rdXBDb21wb25lbnROYW1lIC0gVHJ5IHRvIGZpbmQgdGhlIGNvbXBvbmVudCBuYW1lIG9mIHRoZSBnaXZlbiBhcnJheQotICAvLy8gbmFtZS4gSWYgdGhlIGNvbXBvbmVudCBuYW1lIGlzIG5vdCBpbiB0aGUgdGFibGUgb2YgVVRGOHMgYW5kIGhvbGRlcgotICAvLy8gaXMgbnVsbCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgMC4KLSAgLy8vCi0gIGNvbnN0IFVURjgqIGxvb2t1cENvbXBvbmVudE5hbWUoY29uc3QgVVRGOCogbmFtZSwgVVRGOCogaG9sZGVyLCBib29sJiBwcmltKTsKLQotcHJvdGVjdGVkOgotICAKLQlmcmllbmQgY2xhc3MgSm5qdm07Ci0gIEpuanZtQ2xhc3NMb2FkZXIobXZtOjpCdW1wUHRyQWxsb2NhdG9yJiBBbGxvYywgSm5qdm0qIHYpIDogYWxsb2NhdG9yKEFsbG9jKSB7IHZtID0gdjsgfQotICAKLSAgLy8vIFRoZUNvbXBpbGVyIC0gVGhlIEphdmEgY29tcGlsZXIgZm9yIHRoaXMgY2xhc3MgbG9hZGVyLgotICAvLy8KLSAgSmF2YUNvbXBpbGVyKiBUaGVDb21waWxlcjsKLQotICAvLy8gY2xhc3NlcyAtIFRoZSBjbGFzc2VzIHRoaXMgY2xhc3MgbG9hZGVyIGhhcyBsb2FkZWQuCi0gIC8vLwotICBDbGFzc01hcCogY2xhc3NlczsKLSAgCi0gIC8vLyBqYXZhVHlwZXMgLSBUYWJsZXMgb2YgVHlwZWRlZiBkZWZpbmVkIGJ5IHRoaXMgY2xhc3MgbG9hZGVyLgotICAvLy8KLSAgVHlwZU1hcCogamF2YVR5cGVzOwotCi0gIC8vLyBqYXZhU2lnbmF0dXJlcyAtIFRhYmxlcyBvZiBTaWduZGVmIGRlZmluZWQgYnkgdGhpcyBjbGFzcyBsb2FkZXIuCi0gIC8vLwotICBTaWduTWFwKiBqYXZhU2lnbmF0dXJlczsKLQotICAvLy8gbG9jayAtIExvY2sgd2hlbiBsb2FkaW5nIGNsYXNzZXMuCi0gIC8vLwotICBtdm06OkxvY2tSZWN1cnNpdmUgbG9jazsKLQotcHVibGljOgotICAKLSAgLy8vIGFsbG9jYXRvciAtIFJlZmVyZW5jZSB0byB0aGUgbWVtb3J5IGFsbG9jYXRvciwgd2hpY2ggd2lsbCBhbGxvY2F0ZSBVVEY4cywKLSAgLy8vIHNpZ25hdHVyZXMgYW5kIHR5cGVzLgotICAvLy8KLSAgbXZtOjpCdW1wUHRyQWxsb2NhdG9yJiBhbGxvY2F0b3I7Ci0gCi0gIC8vLyBnZXRDbGFzc2VzIC0gUmV0dXJucyB0aGUgY2xhc3NlcyB0aGlzIGNsYXNzIGxvYWRlciBoYXMgbG9hZGVkLgotICAvLy8KLSAgQ2xhc3NNYXAqIGdldENsYXNzZXMoKSBjb25zdCB7IHJldHVybiBjbGFzc2VzOyB9Ci0gIAotICAvLy8gaGFzaFVURjggLSBUYWJsZXMgb2YgVVRGOHMgZGVmaW5lZCBieSB0aGlzIGNsYXNzIGxvYWRlci4KLSAgLy8vCi0gIFVURjhNYXAqIGhhc2hVVEY4OwotICAKLSAgLy8vIGdldENvbXBpbGVyIC0gR2V0IHRoZSBKYXZhIGNvbXBpbGVyIG9mIHRoaXMgY2xhc3MgbG9hZGVyLgotICAvLy8KLSAgSmF2YUNvbXBpbGVyKiBnZXRDb21waWxlcigpIGNvbnN0IHsgcmV0dXJuIFRoZUNvbXBpbGVyOyB9Ci0KLSAgLy8vIHNldENvbXBpbGVyIC0gU2V0IHRoZSBjb21waWxlciBvZiBjbGFzc2VzIGxvYWRlZCBieSB0aGlzIGNsYXNzIGxvYWRlci4KLSAgLy8vCi0gIHZvaWQgc2V0Q29tcGlsZXIoSmF2YUNvbXBpbGVyKiBDb21wKTsKLQotICAvLy8gdHJhY2VyIC0gVHJhY2VzIGEgSm5qdm1DbGFzc0xvYWRlciBmb3IgR0MuCi0gIC8vLwotICB2aXJ0dWFsIHZvaWQgdHJhY2VyKHVpbnRwdHJfdCBjbG9zdXJlKTsKLSAgCi0gIC8vLyBnZXRKbmp2bUxvYWRlckZyb21KYXZhT2JqZWN0IC0gUmV0dXJuIHRoZSBKbmp2bSBydW50aW1lIHJlcHJlc2VudGF0aW9uCi0gIC8vLyBvZiB0aGUgZ2l2ZW4gY2xhc3MgbG9hZGVyLgotICAvLy8KLSAgc3RhdGljIEpuanZtQ2xhc3NMb2FkZXIqIGdldEpuanZtTG9hZGVyRnJvbUphdmFPYmplY3QoSmF2YU9iamVjdCosIEpuanZtICp2bSk7Ci0gIAotICAvLy8gZ2V0SmF2YUNsYXNzTG9hZGVyIC0gUmV0dXJuIHRoZSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY2xhc3MgbG9hZGVyLgotICAvLy8KLSAgSmF2YU9iamVjdCogZ2V0SmF2YUNsYXNzTG9hZGVyKCkgY29uc3QgewotICAgIHJldHVybiBqYXZhTG9hZGVyOwotICB9Ci0gIAotICAvLy8gZ2V0SmF2YUNsYXNzTG9hZGVyUHRyIC0gUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgSmF2YSByZXByZXNlbnRhdGlvbiBvZgotICAvLy8gdGhpcyBjbGFzcyBsb2FkZXIuCi0gIC8vLwotICBKYXZhT2JqZWN0KiogZ2V0SmF2YUNsYXNzTG9hZGVyUHRyKCkgewotICAgIHJldHVybiAmamF2YUxvYWRlcjsKLSAgfQotICAKLSAgLy8vIGxvYWROYW1lIC0gTG9hZHMgdGhlIGNsYXNzIG9mIHRoZSBnaXZlbiBuYW1lLgotICAvLy8KLSAgVXNlckNsYXNzKiBsb2FkTmFtZShjb25zdCBVVEY4KiBuYW1lLCBib29sIGRvUmVzb2x2ZSwgYm9vbCBkb1Rocm93LAotICAgICAgICAgICAgICAgICAgICAgIEphdmFTdHJpbmcqIHN0ck5hbWUpOwotICAKLSAgLy8vIGxvYWRDbGFzc0Zyb21VVEY4IC0gTG9va3VwIGEgY2xhc3MgZnJvbSBhbiBVVEY4IG5hbWUgYW5kIGxvYWQgaXQuCi0gIC8vLwotICBVc2VyQ29tbW9uQ2xhc3MqIGxvYWRDbGFzc0Zyb21Vc2VyVVRGOChjb25zdCBVVEY4KiB1dGY4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvUmVzb2x2ZSwgYm9vbCBkb1Rocm93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhU3RyaW5nKiBzdHJOYW1lKTsKLSAgCi0gIC8vLyBsb2FkQ2xhc3NGcm9tQXNjaWl6IC0gTG9va3VwIGEgY2xhc3MgZnJvbSBhbiBhc2NpaXogbmFtZSBhbmQgbG9hZCBpdC4KLSAgLy8vCi0gIFVzZXJDb21tb25DbGFzcyogbG9hZENsYXNzRnJvbUFzY2lpeihjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb1Jlc29sdmUsIGJvb2wgZG9UaHJvdyk7Ci0gIAotICAvLy8gbG9hZENsYXNzRnJvbUphdmFTdHJpbmcgLSBMb29rdXAgYSBjbGFzcyBmcm9tIGEgSmF2YSBTdHJpbmcgYW5kIGxvYWQgaXQuCi0gIC8vLwotICBVc2VyQ29tbW9uQ2xhc3MqIGxvYWRDbGFzc0Zyb21KYXZhU3RyaW5nKEphdmFTdHJpbmcqIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvUmVzb2x2ZSwgYm9vbCBkb1Rocm93KTsKLSAgCi0gIC8vLyBsb29rdXBDbGFzc0Zyb21KYXZhU3RyaW5nIC0gRmluZHMgdGhlIGNsYXNzIG9mIHRoZSBnaXZlbiBzdHJpbmcgbmFtZSBpbgotICAvLy8gdGhlIGNsYXNzIGxvYWRlcidzIHRhYmxlLiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24sIGJlY2F1c2UgaXQKLSAgLy8vIGRvZXMgYW4gYWxsb2NhIGFuZCBpcyBjYWxsZWQgYnkgQ2xhc3NwYXRoIGZ1bmN0aW9ucy4KLSAgLy8vCi0gIFVzZXJDb21tb25DbGFzcyogbG9va3VwQ2xhc3NGcm9tSmF2YVN0cmluZyhKYXZhU3RyaW5nKiBzdHIpIAotICAgIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpOwotICAgCi0gIC8vLyBsb29rdXBDbGFzcyAtIEZpbmRzIHRoZSBjbGFzcyBvZiB0aGUgZ2l2ZW4gbmFtZSBpbiB0aGUgY2xhc3MgbG9hZGVyJ3MKLSAgLy8vIHRhYmxlLgotICAvLy8KLSAgVXNlckNvbW1vbkNsYXNzKiBsb29rdXBDbGFzcyhjb25zdCBVVEY4KiB1dGY4KTsKLSAgCi0gIC8vLyBsb29rdXBDbGFzc09yQXJyYXkgLSBGaW5kcyB0aGUgY2xhc3Mgb2YgdGhlIGdpdmVuIG5hbWUgaW4gdGhlIGNsYXNzCi0gIC8vLyBsb2FkZXIncyB0YWJsZS4gSWYgdGhlIGNsYXNzIGhhcyBub3QgYmVlbiBsb2FkZWQsIGFuZCBpZiBpdCdzIGFuCi0gIC8vLyBhcnJheSB3aG9zZSBiYXNlIGNsYXNzIGlzIGxvYWRlZCwgdGhlbiB0aGlzIGZ1bmN0aW9uIGxvYWRzIHRoZSBhcnJheSBjbGFzcwotICAvLy8gYW5kIHJldHVybnMgaXQuCi0gIC8vLwotICBVc2VyQ29tbW9uQ2xhc3MqIGxvb2t1cENsYXNzT3JBcnJheShjb25zdCBVVEY4KiB1dGY4KTsKLQotICAvLy8gY29uc3RydWN0QXJyYXkgLSBIYXNoZXMgYSBydW50aW1lIHJlcHJlc2VudGF0aW9uIG9mIGEgY2xhc3Mgd2l0aAotICAvLy8gdGhlIGdpdmVuIG5hbWUuCi0gIC8vLwotICBVc2VyQ2xhc3NBcnJheSogY29uc3RydWN0QXJyYXkoY29uc3QgVVRGOCogbmFtZSk7Ci0gIFVzZXJDbGFzc0FycmF5KiBjb25zdHJ1Y3RBcnJheShjb25zdCBVVEY4KiBuYW1lLCBVc2VyQ29tbW9uQ2xhc3MqIGJhc2UpOwotICAKLSAgVXNlckNvbW1vbkNsYXNzKiBsb2FkQmFzZUNsYXNzKGNvbnN0IFVURjgqIG5hbWUsIHVpbnQzMiBzdGFydCwgdWludDMyIGxlbik7Ci0KLSAgLy8vIGNvbnN0cnVjdENsYXNzIC0gSGFzaGVzIGEgcnVudGltZSByZXByZXNlbnRhdGlvbiBvZiBhIGNsYXNzIHdpdGgKLSAgLy8vIHRoZSBnaXZlbiBuYW1lLgotICAvLy8KLSAgVXNlckNsYXNzKiBjb25zdHJ1Y3RDbGFzcyhjb25zdCBVVEY4KiBuYW1lLCBDbGFzc0J5dGVzKiBieXRlcyk7Ci0gIAotICAvLy8gY29uc3RydWN0VHlwZSAtIEhhc2hlcyBhIFR5cGVkZWYsIGFuIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEgY2xhc3MKLSAgLy8vIHN0aWxsIG5vdCBsb2FkZWQuCi0gIC8vLwotICBUeXBlZGVmKiBjb25zdHJ1Y3RUeXBlKGNvbnN0IFVURjggKiBuYW1lKTsKLQotICAvLy8gY29uc3RydWN0U2lnbiAtIEhhc2hlcyBhIFNpZ25kZWYsIGEgbWV0aG9kIHNpZ25hdHVyZS4KLSAgLy8vCi0gIFNpZ25kZWYqIGNvbnN0cnVjdFNpZ24oY29uc3QgVVRGOCAqIG5hbWUpOwotICAKLSAgLy8vIGFzY2lpekNvbnN0cnVjdFVURjggLSBIYXNoZXMgYW4gVVRGOCBjcmVhdGVkIGZyb20gdGhlIGdpdmVuIGFzY2lpei4KLSAgLy8vCi0gIGNvbnN0IFVURjgqIGFzY2lpekNvbnN0cnVjdFVURjgoY29uc3QgY2hhciogYXNjaWl6KTsKLQotICAvLy8gcmVhZGVyQ29uc3RydWN0VVRGOCAtIEhhc2hlcyBhbiBVVEY4IGNyZWF0ZWQgZnJvbSB0aGUgZ2l2ZW4gVW5pY29kZQotICAvLy8gYnVmZmVyLgotICAvLy8KLSAgY29uc3QgVVRGOCogcmVhZGVyQ29uc3RydWN0VVRGOChjb25zdCB1aW50MTYqIGJ1ZiwgdWludDMyIHNpemUpOwotICAKLSAgLy8vIH5Kbmp2bUNsYXNzTG9hZGVyIC0gRGVzdHJveSB0aGUgbG9hZGVyOiBkZXN0cm95IHRoZSB0YWJsZXMsIEpJVCBtb2R1bGUgYW5kCi0gIC8vLyBtb2R1bGUgcHJvdmlkZXIuCi0gIC8vLwotICB2aXJ0dWFsIH5Kbmp2bUNsYXNzTG9hZGVyKCk7Ci0gIAotICAvLy8gbG9hZENsYXNzIC0gVGhlIHVzZXIgY2xhc3MgdGhhdCBkZWZpbmVzIHRoZSBsb2FkQ2xhc3MgbWV0aG9kLgotICAvLy8KLSAgVXNlckNsYXNzKiBsb2FkQ2xhc3M7Ci0KLSAgLy8vIGxvYWRDbGFzc01ldGhvZCAtIFRoZSBsb2FkQ2xhc3MgZGVmaW5lZCBieSB0aGlzIGNsYXNzIGxvYWRlci4KLSAgLy8vCi0gIEphdmFNZXRob2QqIGxvYWRDbGFzc01ldGhvZDsKLSAKLSAgLy8vIGNvbnN0cnVjdEFycmF5TmFtZSAtIENvbnN0cnVjdCBhbiBhcnJheSBuYW1lIGJhc2VkIG9uIGEgY2xhc3MgbmFtZQotICAvLy8gYW5kIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucy4KLSAgY29uc3QgVVRGOCogY29uc3RydWN0QXJyYXlOYW1lKHVpbnQzMiBzdGVwcywgY29uc3QgVVRGOCogY2xhc3NOYW1lKTsKLSAgCi0gIC8vLyBVVEY4VG9TdHIgLSBDb25zdHJ1Y3RzIGEgSmF2YSBzdHJpbmcgb3V0IG9mIHRoZSBVVEY4LgotICAvLy8KLSAgdmlydHVhbCBKYXZhU3RyaW5nKiogVVRGOFRvU3RyKGNvbnN0IFVURjgqIHV0ZjgpOwotCi0gIC8vLyBTdHJpbmdzIGhhc2hlZCBieSB0aGlzIGNsYXNzbG9hZGVyLgotICAvLy8KLSAgU3RyaW5nTGlzdCogc3RyaW5nczsKLSAgCi0gIC8vLyBuYXRpdmVMaWJzIC0gTmF0aXZlIGxpYnJhcmllcyAoZS5nLiAnLnNvJykgbG9hZGVkIGJ5IHRoaXMgY2xhc3MgbG9hZGVyLgotICAvLy8KLSAgc3RkOjp2ZWN0b3I8dm9pZCo+IG5hdGl2ZUxpYnM7Ci0KLSAgLy8vIGxvYWRJbkxpYiAtIExvYWRzIGEgbmF0aXZlIGZ1bmN0aW9uIG91dCBvZiB0aGUgbmF0aXZlIGxpYnJhcmllcyBsb2FkZWQKLSAgLy8vIGJ5IHRoaXMgY2xhc3MgbG9hZGVyLiBUaGUgbGFzdCBhcmd1bWVudCB0ZWxscyBpZiB0aGUgcmV0dXJuZWQgbWV0aG9kCi0gIC8vLyBpcyBkZWZpbmVkIGluIGozLgotICAvLy8KLSAgaW50cHRyX3QgbG9hZEluTGliKGNvbnN0IGNoYXIqIGJ1ZiwgYm9vbCYgajMpOwotCi0gIC8vLyBsb2FkSW5MaWIgLSBMb2FkcyBhIG5hdGl2ZSBmdW5jdGlvbiBvdXQgb2YgdGhlIGdpdmVuIG5hdGl2ZSBsaWJyYXJ5LgotICAvLy8KLSAgaW50cHRyX3QgbG9hZEluTGliKGNvbnN0IGNoYXIqIGJ1Ziwgdm9pZCogaGFuZGxlKTsKLQotICAvLy8gbG9hZExpYiAtIExvYWRzIHRoZSBsaWJyYXJ5IHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gIC8vLwotICB2b2lkKiBsb2FkTGliKGNvbnN0IGNoYXIqIGJ1Zik7Ci0KLSAgLy8vIG5hdGl2ZUxvb2t1cCAtIExvb2t1cCBpbiB0aGUgY2xhc3MgbG9hZGVyIGEgZnVuY3Rpb24gcG9pbnRlciBmb3IgdGhlCi0gIC8vLyBtZXRob2QuIEFsc28gc2V0IGluIHRoZSBqMyBwYXJhbWV0ZXIgaXMgdGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQgaW4KLSAgLy8vIEpuSlZNLgotICAvLy8KLSAgaW50cHRyX3QgbmF0aXZlTG9va3VwKEphdmFNZXRob2QqIG1ldGgsIGJvb2wmIGozLCBjaGFyKiBidWYpOwotCi0gIC8vLyBpbnNlcnRBbGxNZXRob2RzSW5WTSAtIEluc2VydCBhbGwgbWV0aG9kcyBkZWZpbmVkIGJ5IHRoaXMgY2xhc3MgbG9hZGVyCi0gIC8vLyBpbiB0aGUgVk0uCi0gIC8vLwotICB2b2lkIGluc2VydEFsbE1ldGhvZHNJblZNKCk7Ci0KLSAgLy8vIGxvYWRMaWJGcm9tSmFyIC0gVHJ5IHRvIGxvYWQgdGhlIHNoYXJlZCBsaWJyYXJ5IGNvbXBpbGVkIGJ5IHZtamMgd2l0aAotICAvLy8gdGhpcyBqYXIgZmlsZS4KLSAgLy8vCi0gIHZvaWQgbG9hZExpYkZyb21KYXIoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogZmlsZSk7Ci0KLSAgLy8vIGxvYWRMaWJGcm9tRmlsZSAtIFRyeSB0byBsb2FkIHRoZSBzaGFyZWQgbGlicmFyeSBjb21waWxlZCBieSB2bWpjIHdpdGgKLSAgLy8vIHRoaXMgY2xhc3MgZmlsZS4KLSAgLy8vCi0gIHZvaWQgbG9hZExpYkZyb21GaWxlKGNvbnN0IGNoYXIqIG5hbWUpOwotICAKLSAgLy8vIGxvYWRDbGFzc0Zyb21TZWxmIC0gTG9hZCB0aGUgbWFpbiBjbGFzcyBpZiB3ZSBhcmUgYW4gZXhlY3V0YWJsZS4KLSAgLy8vCi0gIENsYXNzKiBsb2FkQ2xhc3NGcm9tU2VsZihjb25zdCBjaGFyKiBuYW1lKTsKLQotICBmcmllbmQgY2xhc3MgQ2xhc3M7Ci19OwotCi0vLy8gSm5qdm1Cb290c3RyYXBMb2FkZXIgLSBUaGlzIGNsYXNzIGlzIGZvciB0aGUgYm9vdHN0cmFwIGNsYXNzIGxvYWRlciwgd2hpY2gKLS8vLyBsb2FkcyBiYXNlIGNsYXNzZXMsIGllIGdsaWJqLnppcCBvciBydC5qYXIgYW5kIC1YYm9vdGNsYXNzcGF0aC4KLS8vLwotY2xhc3MgSm5qdm1Cb290c3RyYXBMb2FkZXIgOiBwdWJsaWMgSm5qdm1DbGFzc0xvYWRlciB7Ci1wcml2YXRlOgotICAvLy8gaW50ZXJuYWxMb2FkIC0gTG9hZCB0aGUgY2xhc3Mgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgLy8vCi0gIHZpcnR1YWwgVXNlckNsYXNzKiBpbnRlcm5hbExvYWQoY29uc3QgVVRGOCogdXRmOCwgYm9vbCBkb1Jlc29sdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YVN0cmluZyogc3RyTmFtZSk7Ci0gICAgIAotICAvLy8gYm9vdENsYXNzcGF0aCAtIExpc3Qgb2YgcGF0aHMgZm9yIHRoZSBiYXNlIGNsYXNzZXMuCi0gIC8vLwotICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gYm9vdENsYXNzcGF0aDsKLQotICAvLy8gYm9vdEFyY2hpdmVzIC0gTGlzdCBvZiAuemlwIG9yIC5qYXIgZmlsZXMgdGhhdCBjb250YWluIGJhc2UgY2xhc3Nlcy4KLSAgLy8vCi0gIHN0ZDo6dmVjdG9yPFppcEFyY2hpdmUqPiBib290QXJjaGl2ZXM7Ci0gIAotICAvLy8gb3Blbk5hbWUgLSBPcGVucyBhIGZpbGUgb2YgdGhlIGdpdmVuIG5hbWUgYW5kIHJldHVybnMgaXQgYXMgYW4gYXJyYXkKLSAgLy8vIG9mIGJ5dGUuCi0gIC8vLwotICBDbGFzc0J5dGVzKiBvcGVuTmFtZShjb25zdCBVVEY4KiB1dGY4KTsKLSAgCi1wdWJsaWM6Ci0gIAotICAvLy8gdHJhY2VyIC0gVHJhY2VzIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLgotICAvLy8KLSAgdmlydHVhbCB2b2lkIHRyYWNlcih1aW50cHRyX3QgY2xvc3VyZSk7Ci0KLSAgLy8vIGxpYkNsYXNzcGF0aEVudiAtIFRoZSBwYXRocyBmb3IgZHluYW1pYyBsaWJyYXJpZXMgb2YgQ2xhc3NwYXRoLCBzZXBhcmF0ZWQKLSAgLy8vIGJ5ICc6Jy4KLSAgLy8vCi0gIGNvbnN0IGNoYXIqIGxpYkNsYXNzcGF0aEVudjsKLQotICAvLy8gYm9vdENsYXNzcGF0aEVudiAtIFRoZSBwYXRoIGZvciBiYXNlIGNsYXNzZXMsIHNlcGVyYXRlZCBieSAnLicuCi0gIC8vLwotICBjb25zdCBjaGFyKiBib290Q2xhc3NwYXRoRW52OwotCi0gIC8vLyBhbmFseXNlQ2xhc3NwYXRoRW52IC0gQW5hbHlzZSB0aGUgcGF0aHMgZm9yIGJhc2UgY2xhc3Nlcy4KLSAgLy8vCi0gIHZvaWQgYW5hbHlzZUNsYXNzcGF0aEVudihjb25zdCBjaGFyKik7Ci0gIAotICAvLy8gY3JlYXRlQm9vdHN0cmFwTG9hZGVyIC0gQ3JlYXRlcyB0aGUgYm9vdHN0cmFwIGxvYWRlciwgZmlyc3QgdGhpbmcKLSAgLy8vIHRvIGRvIGJlZm9yZSBhbnkgZXhlY3V0aW9uIG9mIGEgSlZNLiAKLSAgLy8vCi0gIEpuanZtQm9vdHN0cmFwTG9hZGVyKG12bTo6QnVtcFB0ckFsbG9jYXRvciYgQWxsb2MsIEpuanZtKiB2bSwgSmF2YUNvbXBpbGVyKiBDb21wKTsKLSAgCi0gIC8vLyBuYXRpdmVIYW5kbGUgLSBOb24tbnVsbCBoYW5kbGUgaWYgYm9vdCBjbGFzc2VzIHdlcmUgc3RhdGljIGNvbXBpbGVkIGluCi0gIC8vLyBhIGR5bmFtaWMgbGlicmFyeQotICAvLy8KLSAgdm9pZCogbmF0aXZlSGFuZGxlOwotCi0gIHZpcnR1YWwgfkpuanZtQm9vdHN0cmFwTG9hZGVyKCk7Ci0KLSAgZnJpZW5kIGNsYXNzIENsQXJndW1lbnRzSW5mbzsKLX07Ci0KLS8vLyBWTUNsYXNzTG9hZGVyIC0gVGhlIHZtZGF0YSBvYmplY3QgdGhhdCB3aWxsIGJlIHBsYWNlZCBpbiBhbmQgd2lsbCBvbmx5Ci0vLy8gYmUgcmVmZXJlbmNlZCBieSB0aGUgamF2YS5sYW5nLkNsYXNzbG9hZGVyIEphdmEgb2JqZWN0LiBIYXZpbmcgYQotLy8vIHNlcGFyYXRlIGNsYXNzIGJldHdlZW4gVk1DbGFzc0xvYWRlciBhbmQgSm5qdm1DbGFzc0xvYWRlciBhbGxvd3MgdG8KLS8vLyBoYXZlIGEgSm5qdm1DbGFzc0xvYWRlciBub24tR0Mgb2JqZWN0LiBBbHNvIHRoZSBmaW5hbGl6ZXIgb2YgdGhpcyBjbGFzcwotLy8vIHdpbGwgZGVsZXRlIHRoZSBpbnRlcm5hbCBjbGFzcyBsb2FkZXIgYW5kIHdlIGRvIG5vdCBoYXZlIHRvIGltcGxlbWVudAotLy8vIGhhY2tzIGluIHRoZSBqYXZhLmxhbmcuQ2xhc3Nsb2FkZXIgZmluYWxpemVyLgotY2xhc3MgVk1DbGFzc0xvYWRlciA6IHB1YmxpYyBKYXZhT2JqZWN0IHsKLXByaXZhdGU6Ci0gIAotICAvLy8gSkNMIC0gVGhlIGludGVybmFsIGNsYXNzIGxvYWRlci4KLSAgLy8vCi0gIEpuanZtQ2xhc3NMb2FkZXIqIEpDTDsKLQotcHVibGljOgotCi0gIC8vLyBBbGxvY2F0ZSBhIFZNQ2xhc3NMb2FkZXIKLSAgLy8vCi0gIHN0YXRpYyBWTUNsYXNzTG9hZGVyKiBhbGxvY2F0ZShKbmp2bSAqdm0pOwotCi0gIC8vLyBJcyB0aGUgb2JqZWN0IGEgVk1DbGFzc0xvYWRlciBvYmplY3Q/Ci0gIC8vLwotICBzdGF0aWMgYm9vbCBpc1ZNQ2xhc3NMb2FkZXIoSm5qdm0gKnZtLCBKYXZhT2JqZWN0KiBvYmopOwotCi0gIC8vLyBzdGF0aWNUcmFjZXIgLSBUcmFjZSB0aGUgaW50ZXJuYWwgY2xhc3MgbG9hZGVyLgotICAvLy8KLSAgc3RhdGljIHZvaWQgc3RhdGljVHJhY2VyKFZNQ2xhc3NMb2FkZXIqIG9iaiwgdWludHB0cl90IGNsb3N1cmUpIHsKLSAgICBsbHZtX2djcm9vdChvYmosIDApOwotICAgIGlmIChvYmotPkpDTCAhPSBOVUxMKSBvYmotPkpDTC0+dHJhY2VyKGNsb3N1cmUpOwotICB9Ci0KLSAgLy8vIH5WTUNsYXNzTG9hZGVyIC0gRGVsZXRlIHRoZSBpbnRlcm5hbCBjbGFzcyBsb2FkZXIuCi0gIC8vLwotICBzdGF0aWMgdm9pZCBzdGF0aWNEZXN0cnVjdG9yKFZNQ2xhc3NMb2FkZXIqIG9iaikgewotICAgIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gICAgaWYgKG9iai0+SkNMICE9IE5VTEwpIHsKLSAgICAgIG9iai0+SkNMLT5+Sm5qdm1DbGFzc0xvYWRlcigpOwotICAgICAgZGVsZXRlICYob2JqLT5KQ0wtPmFsbG9jYXRvcik7Ci0gICAgfQotICB9Ci0KLSAgLy8vIGdldENsYXNzTG9hZGVyIC0gR2V0IHRoZSBpbnRlcm5hbCBjbGFzcyBsb2FkZXIuCi0gIC8vLwotICBKbmp2bUNsYXNzTG9hZGVyKiBnZXRDbGFzc0xvYWRlcigpIHsKLSAgICByZXR1cm4gSkNMOwotICB9Ci0KLSAgZnJpZW5kIGNsYXNzIEpuanZtQ2xhc3NMb2FkZXI7Ci19OwotCi0jZGVmaW5lIE1BWElNVU1fU1RSSU5HUyAxMDAKLQotY2xhc3MgU3RyaW5nTGlzdCA6IHB1YmxpYyBtdm06OlBlcm1hbmVudE9iamVjdCB7Ci0gIGZyaWVuZCBjbGFzcyBKbmp2bUNsYXNzTG9hZGVyOwotICBmcmllbmQgY2xhc3MgSm5qdm07Ci0KLXByaXZhdGU6Ci0gIFN0cmluZ0xpc3QqIHByZXY7Ci0gIHVpbnQzMl90IGxlbmd0aDsKLSAgSmF2YVN0cmluZyogc3RyaW5nc1tNQVhJTVVNX1NUUklOR1NdOwotCi1wdWJsaWM6Ci0gIFN0cmluZ0xpc3QoKSB7Ci0gICAgcHJldiA9IDA7Ci0gICAgbGVuZ3RoID0gMDsKLSAgfQotCi0gIEphdmFTdHJpbmcqKiBhZGRTdHJpbmcoSm5qdm1DbGFzc0xvYWRlciogSkNMLCBKYXZhU3RyaW5nKiBvYmopIHsKLSAgICBsbHZtX2djcm9vdChvYmosIDApOwotICAgIGlmIChsZW5ndGggPT0gTUFYSU1VTV9TVFJJTkdTKSB7Ci0gICAgICBTdHJpbmdMaXN0KiBuZXh0ID0gbmV3KEpDTC0+YWxsb2NhdG9yLCAiU3RyaW5nTGlzdCIpIFN0cmluZ0xpc3QoKTsKLSAgICAgIG5leHQtPnByZXYgPSB0aGlzOwotICAgICAgSkNMLT5zdHJpbmdzID0gbmV4dDsKLSAgICAgIHJldHVybiBuZXh0LT5hZGRTdHJpbmcoSkNMLCBvYmopOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdHJpbmdzW2xlbmd0aF0gPSBvYmo7Ci0gICAgICByZXR1cm4gJnN0cmluZ3NbbGVuZ3RoKytdOwotICAgIH0KLSAgfQotfTsKLQotfSAvLyBlbmQgbmFtZXNwYWNlIGozCi0KLSNlbmRpZiAvLyBKTkpWTV9DTEFTU0xPQURFUl9ICmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvVk1Db3JlL0puanZtQ29uZmlnLmggYi92bWtpdC9saWIvSjMvVk1Db3JlL0puanZtQ29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZmJjNzguLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL0ozL1ZNQ29yZS9Kbmp2bUNvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tIEpuanZtQ29uZmlnLmggLSBKbmp2bSBjb25maWd1cmF0aW9uIGZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0KLSNpZm5kZWYgSk5KVk1fQ09ORklHX0gKLSNkZWZpbmUgSk5KVk1fQ09ORklHX0gKLQotbmFtZXNwYWNlIGozIHsKLQotY2xhc3MgQ2xhc3NBcnJheTsKLWNsYXNzIENsYXNzUHJpbWl0aXZlOwotY2xhc3MgQ2xhc3M7Ci1jbGFzcyBDb21tb25DbGFzczsKLWNsYXNzIEphdmFDb25zdGFudFBvb2w7Ci0KLSNkZWZpbmUgVXNlckNsYXNzQXJyYXkgQ2xhc3NBcnJheQotI2RlZmluZSBVc2VyQ2xhc3NQcmltaXRpdmUgQ2xhc3NQcmltaXRpdmUKLSNkZWZpbmUgVXNlckNsYXNzIENsYXNzCi0jZGVmaW5lIFVzZXJDb21tb25DbGFzcyBDb21tb25DbGFzcwotI2RlZmluZSBVc2VyQ29uc3RhbnRQb29sIEphdmFDb25zdGFudFBvb2wKLQotfQotI2RlZmluZSBJU09MQVRFX1NUQVRJQyBzdGF0aWMKLQotCi0jZGVmaW5lIE5SX0lTT0xBVEVTIDEKLQotI2VuZGlmIC8vIEpOSlZNX0NPTkZJR19ICmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvVk1Db3JlL0xpbmtKYXZhUnVudGltZS5oIGIvdm1raXQvbGliL0ozL1ZNQ29yZS9MaW5rSmF2YVJ1bnRpbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMxNzkxNi4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvSjMvVk1Db3JlL0xpbmtKYXZhUnVudGltZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpbmtKYXZhUnVudGltZS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLz09PSAtLS0tLS0tLS0tLS0tIFJlZmVyZW5jZSBhbGwgcnVudGltZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2lmbmRlZiBKTkpWTV9MSU5LX0pBVkFfUlVOVElNRV9ICi0jZGVmaW5lIEpOSlZNX0xJTktfSkFWQV9SVU5USU1FX0gKLQotCi1uYW1lc3BhY2UgajMgewotICBjbGFzcyBKYXZhT2JqZWN0OwotICBjbGFzcyBVc2VyQ2xhc3M7Ci0gIGNsYXNzIFVzZXJDbGFzc0FycmF5OwotICBjbGFzcyBVc2VyQ29tbW9uQ2xhc3M7Ci0gIGNsYXNzIFVzZXJDb25zdGFudFBvb2w7Ci0gIGNsYXNzIEphdmFWaXJ0dWFsVGFibGU7Ci0gIGNsYXNzIEphdmFNZXRob2Q7Ci0gIGNsYXNzIEpuanZtOwotfQotCi1uYW1lc3BhY2UgbXZtIHsKLSAgY2xhc3MgS25vd25GcmFtZTsKLX0KLQotdXNpbmcgbmFtZXNwYWNlIGozOwotCi1leHRlcm4gIkMiIHZvaWQqIGozSW50ZXJmYWNlTG9va3VwKFVzZXJDbGFzcyogY2FsbGVyLCB1aW50MzIgaW5kZXgpOwotZXh0ZXJuICJDIiB2b2lkKiBqM1ZpcnR1YWxGaWVsZExvb2t1cChVc2VyQ2xhc3MqIGNhbGxlciwgdWludDMyIGluZGV4KTsKLWV4dGVybiAiQyIgdm9pZCogajNTdGF0aWNGaWVsZExvb2t1cChVc2VyQ2xhc3MqIGNhbGxlciwgdWludDMyIGluZGV4KTsKLWV4dGVybiAiQyIgdm9pZCogajNWaXJ0dWFsVGFibGVMb29rdXAoVXNlckNsYXNzKiBjYWxsZXIsIHVpbnQzMiBpbmRleCwgLi4uKTsKLWV4dGVybiAiQyIgdm9pZCogajNTdHJpbmdMb29rdXAoVXNlckNsYXNzKiBjbCwgdWludDMyIGluZGV4KTsKLWV4dGVybiAiQyIgdm9pZCogajNDbGFzc0xvb2t1cChVc2VyQ2xhc3MqIGNhbGxlciwgdWludDMyIGluZGV4KTsKLWV4dGVybiAiQyIgVXNlckNvbW1vbkNsYXNzKiBqM1J1bnRpbWVJbml0aWFsaXNlQ2xhc3MoVXNlckNsYXNzKiBjbCk7Ci1leHRlcm4gIkMiIEphdmFPYmplY3QqIGozUnVudGltZURlbGVnYXRlZShVc2VyQ29tbW9uQ2xhc3MqIGNsKTsKLWV4dGVybiAiQyIgSmF2YUFycmF5KiBqM011bHRpQ2FsbE5ldyhVc2VyQ2xhc3NBcnJheSogY2wsIHVpbnQzMiBsZW4sIC4uLik7Ci1leHRlcm4gIkMiIFVzZXJDbGFzc0FycmF5KiBqM0dldEFycmF5Q2xhc3MoVXNlckNvbW1vbkNsYXNzKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyQ2xhc3NBcnJheSoqKTsKLWV4dGVybiAiQyIgdm9pZCBqM0VuZEpOSSh1aW50MzIqKik7Ci1leHRlcm4gIkMiIHZvaWQqIGozU3RhcnRKTkkodWludDMyKiwgdWludDMyKiosIG12bTo6S25vd25GcmFtZSopOwotZXh0ZXJuICJDIiB2b2lkIGozSmF2YU9iamVjdEFxdWlyZShKYXZhT2JqZWN0KiBvYmopOwotZXh0ZXJuICJDIiB2b2lkIGozSmF2YU9iamVjdFJlbGVhc2UoSmF2YU9iamVjdCogb2JqKTsKLWV4dGVybiAiQyIgdm9pZCBqM1Rocm93RXhjZXB0aW9uKEphdmFPYmplY3QqIG9iaik7Ci1leHRlcm4gIkMiIEphdmFPYmplY3QqIGozTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLWV4dGVybiAiQyIgSmF2YU9iamVjdCogajNOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbihzaW50MzIgdmFsKTsKLWV4dGVybiAiQyIgSmF2YU9iamVjdCogajNPdXRPZk1lbW9yeUVycm9yKHNpbnQzMiB2YWwpOwotZXh0ZXJuICJDIiBKYXZhT2JqZWN0KiBqM1N0YWNrT3ZlcmZsb3dFcnJvcigpOwotZXh0ZXJuICJDIiBKYXZhT2JqZWN0KiBqM0FyaXRobWV0aWNFeGNlcHRpb24oKTsKLWV4dGVybiAiQyIgSmF2YU9iamVjdCogajNDbGFzc0Nhc3RFeGNlcHRpb24oSmF2YU9iamVjdCogb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyQ29tbW9uQ2xhc3MqIGNsKTsKLWV4dGVybiAiQyIgSmF2YU9iamVjdCogajNJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKEphdmFPYmplY3QqIG9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbnQzMiBpbmRleCk7Ci1leHRlcm4gIkMiIEphdmFPYmplY3QqIGozQXJyYXlTdG9yZUV4Y2VwdGlvbihKYXZhVmlydHVhbFRhYmxlKiBWVCk7Ci1leHRlcm4gIkMiIHZvaWQgajNUaHJvd0V4Y2VwdGlvbkZyb21KSVQoKTsKLWV4dGVybiAiQyIgdm9pZCBqM1ByaW50TWV0aG9kU3RhcnQoSmF2YU1ldGhvZCogbWV0aCk7Ci1leHRlcm4gIkMiIHZvaWQgajNQcmludE1ldGhvZEVuZChKYXZhTWV0aG9kKiBtZXRoKTsKLWV4dGVybiAiQyIgdm9pZCBqM1ByaW50RXhlY3V0aW9uKHVpbnQzMiBvcGNvZGUsIHVpbnQzMiBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFNZXRob2QqIG1ldGgpOwotCi0KLW5hbWVzcGFjZSBmb3JjZV9saW5rZXIgewotICBzdHJ1Y3QgRm9yY2VSdW50aW1lTGlua2luZyB7Ci0gICAgRm9yY2VSdW50aW1lTGlua2luZygpIHsKLSAgICAgIC8vIFdlIG11c3QgcmVmZXJlbmNlIHRoZSBwYXNzZXMgaW4gc3VjaCBhIHdheSB0aGF0IGNvbXBpbGVycyB3aWxsIG5vdAotICAgICAgLy8gZGVsZXRlIGl0IGFsbCBhcyBkZWFkIGNvZGUsIGV2ZW4gd2l0aCB3aG9sZSBwcm9ncmFtIG9wdGltaXphdGlvbiwKLSAgICAgIC8vIHlldCBpcyBlZmZlY3RpdmVseSBhIE5PLU9QLiBBcyB0aGUgY29tcGlsZXIgaXNuJ3Qgc21hcnQgZW5vdWdoCi0gICAgICAvLyB0byBrbm93IHRoYXQgZ2V0ZW52KCkgbmV2ZXIgcmV0dXJucyAtMSwgdGhpcyB3aWxsIGRvIHRoZSBqb2IuCi0gICAgICBpZiAoc3RkOjpnZXRlbnYoImJhciIpICE9IChjaGFyKikgLTEpIAotICAgICAgICByZXR1cm47Ci0gICAgICAKLSAgICAgICh2b2lkKSBqM0ludGVyZmFjZUxvb2t1cCgwLCAwKTsKLSAgICAgICh2b2lkKSBqM1ZpcnR1YWxGaWVsZExvb2t1cCgwLCAwKTsKLSAgICAgICh2b2lkKSBqM1N0YXRpY0ZpZWxkTG9va3VwKDAsIDApOwotICAgICAgKHZvaWQpIGozVmlydHVhbFRhYmxlTG9va3VwKDAsIDApOwotICAgICAgKHZvaWQpIGozQ2xhc3NMb29rdXAoMCwgMCk7Ci0gICAgICAodm9pZCkgajNSdW50aW1lSW5pdGlhbGlzZUNsYXNzKDApOwotICAgICAgKHZvaWQpIGozUnVudGltZURlbGVnYXRlZSgwKTsKLSAgICAgICh2b2lkKSBqM011bHRpQ2FsbE5ldygwLCAwKTsKLSAgICAgICh2b2lkKSBqM0dldEFycmF5Q2xhc3MoMCwgMCk7Ci0gICAgICAodm9pZCkgajNFbmRKTkkoMCk7Ci0gICAgICAodm9pZCkgajNTdGFydEpOSSgwLCAwLCAwKTsKLSAgICAgICh2b2lkKSBqM0phdmFPYmplY3RBcXVpcmUoMCk7Ci0gICAgICAodm9pZCkgajNKYXZhT2JqZWN0UmVsZWFzZSgwKTsKLSAgICAgICh2b2lkKSBqM1Rocm93RXhjZXB0aW9uKDApOwotICAgICAgKHZvaWQpIGozTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgICh2b2lkKSBqM05lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uKDApOwotICAgICAgKHZvaWQpIGozT3V0T2ZNZW1vcnlFcnJvcigwKTsKLSAgICAgICh2b2lkKSBqM1N0YWNrT3ZlcmZsb3dFcnJvcigpOwotICAgICAgKHZvaWQpIGozQXJpdGhtZXRpY0V4Y2VwdGlvbigpOwotICAgICAgKHZvaWQpIGozQ2xhc3NDYXN0RXhjZXB0aW9uKDAsIDApOwotICAgICAgKHZvaWQpIGozSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigwLCAwKTsKLSAgICAgICh2b2lkKSBqM0FycmF5U3RvcmVFeGNlcHRpb24oMCk7Ci0gICAgICAodm9pZCkgajNUaHJvd0V4Y2VwdGlvbkZyb21KSVQoKTsKLSAgICAgICh2b2lkKSBqM1ByaW50TWV0aG9kU3RhcnQoMCk7Ci0gICAgICAodm9pZCkgajNQcmludE1ldGhvZEVuZCgwKTsKLSAgICAgICh2b2lkKSBqM1ByaW50RXhlY3V0aW9uKDAsIDAsIDApOwotICAgICAgKHZvaWQpIGozU3RyaW5nTG9va3VwKDAsIDApOwotICAgIH0KLSAgfSBGb3JjZVBhc3NMaW5raW5nOyAvLyBGb3JjZSBsaW5rIGJ5IGNyZWF0aW5nIGEgZ2xvYmFsIGRlZmluaXRpb24uCi19Ci0gIAotCi0KLSNlbmRpZiAvL0pOSlZNX0xJTktfSkFWQV9SVU5USU1FX0gKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9KMy9WTUNvcmUvTG9ja2VkTWFwLmNwcCBiL3Zta2l0L2xpYi9KMy9WTUNvcmUvTG9ja2VkTWFwLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZhNzhmMS4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvSjMvVk1Db3JlL0xvY2tlZE1hcC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vLz09PS0tLS0tLS0gTG9ja2VkTWFwLmNwcCAtIEltcGxlbWVudGF0aW9uIG9mIHRoZSBVVEY4IG1hcCAtLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgPG1hcD4KLQotI2luY2x1ZGUgIkphdmFBcnJheS5oIgotI2luY2x1ZGUgIkphdmFDbGFzcy5oIgotI2luY2x1ZGUgIkphdmFTdHJpbmcuaCIKLSNpbmNsdWRlICJKYXZhVHlwZXMuaCIKLSNpbmNsdWRlICJMb2NrZWRNYXAuaCIKLSNpbmNsdWRlICJaaXAuaCIKLQotI2luY2x1ZGUgPGNzdHJpbmc+Ci0KLXVzaW5nIG5hbWVzcGFjZSBqMzsKLQotdm9pZCBTdHJpbmdNYXA6Omluc2VydChKYXZhU3RyaW5nKiBzdHIpIHsKLSAgbGx2bV9nY3Jvb3Qoc3RyLCAwKTsKLSAgbWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihKYXZhU3RyaW5nOjpnZXRWYWx1ZShzdHIpLCBzdHIpKTsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9KMy9WTUNvcmUvTG9ja2VkTWFwLmggYi92bWtpdC9saWIvSjMvVk1Db3JlL0xvY2tlZE1hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmE5NjljLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9KMy9WTUNvcmUvTG9ja2VkTWFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLy89PT0tLS0tLS0tIExvY2tlZE1hcC5oIC0gQSB0aHJlYWQtc2FmZSBtYXAgaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhyZWFkLXNhZmUgbWFwcyB0aGF0IG11c3QgYmUgZGVhbGxvY2F0ZWQgYnkgdGhlIG93bmluZwotLy8gb2JqZWN0LiBGb3IgZXhhbXBsZSBhIGNsYXNzIGxvYWRlciBpcyByZXNwb25zaWJsZSBmb3IgZGVhbGxvY2F0aW5nIHRoZQotLy8gdHlwZXMgc3RvcmVkIGluIGEgVHlwZU1hcC4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIEpOSlZNX0xPQ0tFRF9NQVBfSAotI2RlZmluZSBKTkpWTV9MT0NLRURfTUFQX0gKLQotI2luY2x1ZGUgPG1hcD4KLQotI2luY2x1ZGUgPGNzdHJpbmc+Ci0KLSNpbmNsdWRlICJ0eXBlcy5oIgotCi0jaW5jbHVkZSAibXZtL0FsbG9jYXRvci5oIgotI2luY2x1ZGUgIm12bS9UaHJlYWRzL0xvY2tzLmgiCi0jaW5jbHVkZSAiVVRGOC5oIgotCi0jaW5jbHVkZSAiSmF2YUFycmF5LmgiIC8vIGZvciBjb21wYXJpbmcgVVRGOHMKLQotbmFtZXNwYWNlIGozIHsKLQotY2xhc3MgSmF2YVN0cmluZzsKLWNsYXNzIEpuanZtQ2xhc3NMb2FkZXI7Ci1jbGFzcyBTaWduZGVmOwotY2xhc3MgVHlwZWRlZjsKLWNsYXNzIFVzZXJDb21tb25DbGFzczsKLWNsYXNzIFVzZXJDbGFzc0FycmF5OwotCi1zdHJ1Y3QgbHR1dGY4Ci17Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBVVEY4KiBzMSwgY29uc3QgVVRGOCogczIpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gczEtPmxlc3NUaGFuKHMyKTsKLSAgfQotfTsKLQotc3RydWN0IGx0YXJyYXkxNgotewotICBib29sIG9wZXJhdG9yKCkoY29uc3QgQXJyYXlVSW50MTYqIHMxLCBjb25zdCBBcnJheVVJbnQxNiogczIpIGNvbnN0Ci0gIHsKLSAgICBsbHZtX2djcm9vdChzMSwgMCk7Ci0gICAgbGx2bV9nY3Jvb3QoczIsIDApOwotICAgIGlmIChBcnJheVVJbnQxNjo6Z2V0U2l6ZShzMSkgPCBBcnJheVVJbnQxNjo6Z2V0U2l6ZShzMikpIHJldHVybiB0cnVlOwotICAgIGVsc2UgaWYgKEFycmF5VUludDE2OjpnZXRTaXplKHMxKSA+IEFycmF5VUludDE2OjpnZXRTaXplKHMyKSkgcmV0dXJuIGZhbHNlOwotICAgIGVsc2UgcmV0dXJuIG1lbWNtcCgoY29uc3QgY2hhciopQXJyYXlVSW50MTY6OmdldEVsZW1lbnRzKHMxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIqKUFycmF5VUludDE2OjpnZXRFbGVtZW50cyhzMiksCi0gICAgICAgICAgICAgICAgICAgICAgIEFycmF5VUludDE2OjpnZXRTaXplKHMxKSAqIHNpemVvZih1aW50MTYpKSA8IDA7Ci0gIH0KLX07Ci0KLSAgY2xhc3MgTWFwTm9HQyB7Ci0gIHB1YmxpYzoKLSAgICBzdGF0aWMgdm9pZCBnY3Jvb3Qodm9pZCogdmFsLCB2b2lkKiB1bnVzZWQpIAotICAgICAgX19hdHRyaWJ1dGVfXyAoKGFsd2F5c19pbmxpbmUpKSB7fQotCi0gIH07ICAKLSAgCi0gIGNsYXNzIE1hcFdpdGhHQyB7Ci0gIHB1YmxpYzoKLSAgICBzdGF0aWMgdm9pZCBnY3Jvb3Qodm9pZCogdmFsLCB2b2lkKiB1bnVzZWQpIAotICAgICAgX19hdHRyaWJ1dGVfXyAoKGFsd2F5c19pbmxpbmUpKSB7Ci0gICAgICBsbHZtX2djcm9vdCh2YWwsIHVudXNlZCk7Ci0gICAgfSAgIAotICAgIAotICB9OyAgCi0KLQotdGVtcGxhdGU8Y2xhc3MgS2V5LCBjbGFzcyBDb250YWluZXIsIGNsYXNzIENvbXBhcmUsIGNsYXNzIE1ldGEsIGNsYXNzIFRMb2NrLAotICAgICAgICAgY2xhc3MgSXNHQz4KLWNsYXNzIExvY2tlZE1hcCA6IHB1YmxpYyBtdm06OlBlcm1hbmVudE9iamVjdCB7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjptYXA8Y29uc3QgS2V5LCBDb250YWluZXIsIENvbXBhcmU+OjppdGVyYXRvciBpdGVyYXRvcjsKLSAgdHlwZWRlZiBDb250YWluZXIgKCpmdW5jQ3JlYXRlKShLZXkmIFYsIE1ldGEgbWV0YSk7Ci0KLSAgVExvY2sgbG9jazsKLSAgc3RkOjptYXA8Y29uc3QgS2V5LCBDb250YWluZXIsIENvbXBhcmUsCi0gICAgICAgICAgIGdjX2FsbG9jYXRvcjxzdGQ6OnBhaXI8Y29uc3QgS2V5LCBDb250YWluZXI+ID4gPiBtYXA7Ci0gIAotICBpbmxpbmUgQ29udGFpbmVyIGxvb2t1cE9yQ3JlYXRlKEtleSYgViwgTWV0YSBtZXRhLCBmdW5jQ3JlYXRlIGZ1bmMpIHsKLSAgICBDb250YWluZXIgcmVzID0gMDsKLSAgICBJc0dDOjpnY3Jvb3QocmVzLCAwKTsKLSAgICBJc0dDOjpnY3Jvb3QoKHZvaWQqKVYsIDApOwotICAgIGxvY2subG9jaygpOwotICAgIGl0ZXJhdG9yIEVuZCA9IG1hcC5lbmQoKTsKLSAgICBpdGVyYXRvciBJID0gbWFwLmZpbmQoVik7Ci0gICAgaWYgKEkgPT0gRW5kKSB7Ci0gICAgICByZXMgPSBmdW5jKFYsIG1ldGEpOwotICAgICAgbWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihWLCByZXMpKTsKLSAgICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgICByZXR1cm4gcmVzOwotICAgIH0gZWxzZSB7Ci0gICAgICBsb2NrLnVubG9jaygpOwotICAgICAgcmV0dXJuICgoQ29udGFpbmVyKShJLT5zZWNvbmQpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIGlubGluZSB2b2lkIHJlbW92ZShLZXkgVikgewotICAgIElzR0M6Omdjcm9vdChWLCAwKTsKLSAgICBsb2NrLmxvY2soKTsKLSAgICBtYXAuZXJhc2UoVik7Ci0gICAgbG9jay51bmxvY2soKTsKLSAgfQotICAKLSAgaW5saW5lIHZvaWQgcmVtb3ZlKEtleSBWLCBDb250YWluZXIgQykgewotICAgIElzR0M6Omdjcm9vdChDLCAwKTsKLSAgICBJc0dDOjpnY3Jvb3QoViwgMCk7Ci0gICAgbG9jay5sb2NrKCk7Ci0gICAgcmVtb3ZlVW5sb2NrZWQoViwgQyk7IAotICAgIGxvY2sudW5sb2NrKCk7Ci0gIH0KLSAgCi0gIGlubGluZSB2b2lkIHJlbW92ZVVubG9ja2VkKEtleSBWLCBDb250YWluZXIgQykgewotICAgIElzR0M6Omdjcm9vdChDLCAwKTsKLSAgICBJc0dDOjpnY3Jvb3QoKHZvaWQqKVYsIDApOwotICAgIGl0ZXJhdG9yIEVuZCA9IG1hcC5lbmQoKTsKLSAgICBpdGVyYXRvciBJID0gbWFwLmZpbmQoVik7Ci0gICAgCi0gICAgaWYgKEkgIT0gRW5kICYmIEktPnNlY29uZCA9PSBDKQotICAgICAgICBtYXAuZXJhc2UoSSk7IAotICB9Ci0KLSAgaW5saW5lIENvbnRhaW5lciBsb29rdXAoS2V5IFYpIHsKLSAgICBJc0dDOjpnY3Jvb3QoKHZvaWQqKVYsIDApOwotICAgIGxvY2subG9jaygpOwotICAgIGl0ZXJhdG9yIEVuZCA9IG1hcC5lbmQoKTsKLSAgICBpdGVyYXRvciBJID0gbWFwLmZpbmQoVik7Ci0gICAgbG9jay51bmxvY2soKTsKLSAgICByZXR1cm4gSSAhPSBFbmQgPyAoKENvbnRhaW5lcikoSS0+c2Vjb25kKSkgOiAwOyAKLSAgfQotCi0gIGlubGluZSB2b2lkIGhhc2goS2V5IGssIENvbnRhaW5lciBjKSB7Ci0gICAgSXNHQzo6Z2Nyb290KGMsIDApOwotICAgIElzR0M6Omdjcm9vdChrLCAwKTsKLSAgICBsb2NrLmxvY2soKTsKLSAgICBtYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGssIGMpKTsKLSAgICBsb2NrLnVubG9jaygpOwotICB9Ci0KLSAgfkxvY2tlZE1hcCgpIHt9Ci19OwotCi1jbGFzcyBDbGFzc01hcCA6IAotICBwdWJsaWMgTG9ja2VkTWFwPGNvbnN0IFVURjgqLCBVc2VyQ29tbW9uQ2xhc3MqLCBsdHV0ZjgsIEpuanZtQ2xhc3NMb2FkZXIqLAotICAgICAgICAgICAgICAgICAgIG12bTo6TG9ja1JlY3Vyc2l2ZSwgTWFwTm9HQyA+IHsKLQotI2lmZGVmIFVTRV9HQ19CT0VITQotcHVibGljOgotICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHN6LCBtdm06OkJ1bXBQdHJBbGxvY2F0b3ImIGFsbG9jYXRvcikgewotICAgIHJldHVybiBHQ19NQUxMT0Moc3opOwotICB9Ci0jZW5kaWYKLX07Ci0KLWNsYXNzIFN0cmluZ01hcCA6Ci0gIHB1YmxpYyBMb2NrZWRNYXA8Y29uc3QgQXJyYXlVSW50MTYqLCBKYXZhU3RyaW5nKiwgbHRhcnJheTE2LCBKbmp2bSosCi0gICAgICAgICAgICAgICAgICAgbXZtOjpMb2NrTm9ybWFsLCBNYXBXaXRoR0M+IHsKLQotcHVibGljOgotICB2b2lkIGluc2VydChKYXZhU3RyaW5nKiBzdHIpOwotCi19OwotCi1jbGFzcyBUeXBlTWFwIDogcHVibGljIG12bTo6UGVybWFuZW50T2JqZWN0IHsKLXB1YmxpYzoKLSAgbXZtOjpMb2NrTm9ybWFsIGxvY2s7Ci0gIAotICBzdGQ6Om1hcDxjb25zdCBVVEY4KiwgVHlwZWRlZiosIGx0dXRmOD4gbWFwOwotICB0eXBlZGVmIHN0ZDo6bWFwPGNvbnN0IFVURjgqLCBUeXBlZGVmKiwgbHR1dGY4Pjo6aXRlcmF0b3IgaXRlcmF0b3I7Ci0gIAotICBpbmxpbmUgVHlwZWRlZiogbG9va3VwKGNvbnN0IFVURjgqIFYpIHsKLSAgICBpdGVyYXRvciBFbmQgPSBtYXAuZW5kKCk7Ci0gICAgaXRlcmF0b3IgSSA9IG1hcC5maW5kKFYpOwotICAgIHJldHVybiBJICE9IEVuZCA/IEktPnNlY29uZCA6IDA7IAotICB9Ci0KLSAgaW5saW5lIHZvaWQgaGFzaChjb25zdCBVVEY4KiBrLCBUeXBlZGVmKiBjKSB7Ci0gICAgbWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihrLCBjKSk7Ci0gIH0KLX07Ci0KLWNsYXNzIFNpZ25NYXAgOiBwdWJsaWMgbXZtOjpQZXJtYW5lbnRPYmplY3QgewotcHVibGljOgotICBtdm06OkxvY2tOb3JtYWwgbG9jazsKLSAgCi0gIHN0ZDo6bWFwPGNvbnN0IFVURjgqLCBTaWduZGVmKiwgbHR1dGY4PiBtYXA7Ci0gIHR5cGVkZWYgc3RkOjptYXA8Y29uc3QgVVRGOCosIFNpZ25kZWYqLCBsdHV0Zjg+OjppdGVyYXRvciBpdGVyYXRvcjsKLSAgCi0gIGlubGluZSBTaWduZGVmKiBsb29rdXAoY29uc3QgVVRGOCogVikgewotICAgIGl0ZXJhdG9yIEVuZCA9IG1hcC5lbmQoKTsKLSAgICBpdGVyYXRvciBJID0gbWFwLmZpbmQoVik7Ci0gICAgcmV0dXJuIEkgIT0gRW5kID8gSS0+c2Vjb25kIDogMDsgCi0gIH0KLQotICBpbmxpbmUgdm9pZCBoYXNoKGNvbnN0IFVURjgqIGssIFNpZ25kZWYqIGMpIHsKLSAgICBtYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGssIGMpKTsKLSAgfQotICAKLX07Ci0KLX0gLy8gZW5kIG5hbWVzcGFjZSBqMwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9KMy9WTUNvcmUvTWFrZWZpbGUgYi92bWtpdC9saWIvSjMvVk1Db3JlL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGY0YmNjLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9KMy9WTUNvcmUvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIz09PS0gbGliL0puSlZNL1ZNQ29yZS9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIwotIyAKLSMgICAgICAgICAgICAgICAgICAgICBUaGUgdm1raXQgcHJvamVjdAotIwotIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLSMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotIyAKLSMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCi1MRVZFTCA9IC4uLy4uLy4uCi0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29uZmlnCi0KLWlmZXEgKCQoV0lUSF9MTFZNX0dDQyksIDEpCi0gIE1PRFVMRV9OQU1FID0gSjMKLWVsc2UKLSAgTElCUkFSWU5BTUUgPSBKMwotZW5kaWYKLQotCi1pbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgotCi1DWFguRmxhZ3MgKz0gLUkkKFBST0pfT0JKX0RJUikvLi4vQ2xhc3NwYXRoIC1JJChQUk9KX09CSl9ESVIpLy4uL0xMVk1SdW50aW1lIC1JJChQUk9KX1NSQ19ESVIpLy4uL0NsYXNzcGF0aCAkKENMQVNTUEFUSF9GTEFHUykgLUkkKFBST0pfU1JDX0RJUikvLi4vLi4vLi4vaW5jbHVkZS9qMwotCmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvVk1Db3JlL1JlYWRlci5jcHAgYi92bWtpdC9saWIvSjMvVk1Db3JlL1JlYWRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NWU0ZDQuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL0ozL1ZNQ29yZS9SZWFkZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLS0gUmVhZGVyLmNwcCAtIE9wZW4gYW5kIHJlYWQgZmlsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlIDxjc3RkaW8+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLSNpbmNsdWRlICJKbmp2bUNsYXNzTG9hZGVyLmgiCi0jaW5jbHVkZSAiUmVhZGVyLmgiCi0jaW5jbHVkZSAiWmlwLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBqMzsKLQotY29uc3QgaW50IFJlYWRlcjo6U2Vla1NldCA9IFNFRUtfU0VUOwotY29uc3QgaW50IFJlYWRlcjo6U2Vla0N1ciA9IFNFRUtfQ1VSOwotY29uc3QgaW50IFJlYWRlcjo6U2Vla0VuZCA9IFNFRUtfRU5EOwotCi1DbGFzc0J5dGVzKiBSZWFkZXI6Om9wZW5GaWxlKEpuanZtQ2xhc3NMb2FkZXIqIGxvYWRlciwgY29uc3QgY2hhciogcGF0aCkgewotICBDbGFzc0J5dGVzKiByZXMgPSBOVUxMOwotICBGSUxFKiBmcCA9IGZvcGVuKHBhdGgsICJyIik7Ci0gIGlmIChmcCAhPSAwKSB7Ci0gICAgZnNlZWsoZnAsIDAsIFNlZWtFbmQpOwotICAgIGxvbmcgbmJiID0gZnRlbGwoZnApOwotICAgIGZzZWVrKGZwLCAwLCBTZWVrU2V0KTsKLSAgICByZXMgPSBuZXcgKGxvYWRlci0+YWxsb2NhdG9yLCBuYmIpIENsYXNzQnl0ZXMobmJiKTsKLSAgICBpZiAoZnJlYWQocmVzLT5lbGVtZW50cywgbmJiLCAxLCBmcCkgPT0gMCkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJmcmVhZCBlcnJvclxuIik7Ci0gICAgICBhYm9ydCgpOyAgCi0gICAgfQotICAgIGZjbG9zZShmcCk7Ci0gIH0KLSAgcmV0dXJuIHJlczsKLX0KLQotQ2xhc3NCeXRlcyogUmVhZGVyOjpvcGVuWmlwKEpuanZtQ2xhc3NMb2FkZXIqIGxvYWRlciwgWmlwQXJjaGl2ZSogYXJjaGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZSkgewotICBDbGFzc0J5dGVzKiByZXMgPSAwOwotICBaaXBGaWxlKiBmaWxlID0gYXJjaGl2ZS0+Z2V0RmlsZShmaWxlbmFtZSk7Ci0gIGlmIChmaWxlICE9IDApIHsKLSAgICByZXMgPSBuZXcgKGxvYWRlci0+YWxsb2NhdG9yLCBmaWxlLT51Y3NpemUpIENsYXNzQnl0ZXMoZmlsZS0+dWNzaXplKTsKLSAgICBpZiAoYXJjaGl2ZS0+cmVhZEZpbGUocmVzLCBmaWxlKSAhPSAwKSB7Ci0gICAgICByZXR1cm4gcmVzOwotICAgIH0KLSAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBSZWFkZXI6OnNlZWsodWludDMyIHBvcywgaW50IGZyb20pIHsKLSAgdWludDMyIG4gPSAwOwotICB1aW50MzIgc3RhcnQgPSBtaW47Ci0gIHVpbnQzMiBlbmQgPSBtYXg7Ci0gIAotICBpZiAoZnJvbSA9PSBTZWVrQ3VyKSBuID0gY3Vyc29yICsgcG9zOwotICBlbHNlIGlmIChmcm9tID09IFNlZWtTZXQpIG4gPSBzdGFydCArIHBvczsKLSAgZWxzZSBpZiAoZnJvbSA9PSBTZWVrRW5kKSBuID0gZW5kICsgcG9zOwotICAKLQotICBhc3NlcnQobiA+PSBzdGFydCAmJiBuIDw9IGVuZCAmJiAib3V0IG9mIHJhbmdlIik7Ci0KLSAgY3Vyc29yID0gbjsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9KMy9WTUNvcmUvUmVhZGVyLmggYi92bWtpdC9saWIvSjMvVk1Db3JlL1JlYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmQ5ODkwLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9KMy9WTUNvcmUvUmVhZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLS0tLSBSZWFkZXIuaCAtIE9wZW4gYW5kIHJlYWQgZmlsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgSk5KVk1fUkVBREVSX0gKLSNkZWZpbmUgSk5KVk1fUkVBREVSX0gKLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLSNpbmNsdWRlICJKYXZhQXJyYXkuaCIKLSNpbmNsdWRlICJKYXZhQ2xhc3MuaCIKLQotbmFtZXNwYWNlIGozIHsKLQotY2xhc3MgSm5qdm1Cb290c3RyYXBMb2FkZXI7Ci1jbGFzcyBKbmp2bUNsYXNzTG9hZGVyOwotY2xhc3MgWmlwQXJjaGl2ZTsKLQotCi1jbGFzcyBDbGFzc0J5dGVzIHsKLSBwdWJsaWM6Ci0gIENsYXNzQnl0ZXMoaW50IGwpIHsKLSAgICBzaXplID0gbDsKLSAgfQotCi0gIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qgc3osIG12bTo6QnVtcFB0ckFsbG9jYXRvciYgYWxsb2NhdG9yLCBpbnQgbikgewotICAgIHJldHVybiBhbGxvY2F0b3IuQWxsb2NhdGUoc2l6ZW9mKHVpbnQzMl90KSArIG4gKiBzaXplb2YodWludDhfdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2xhc3MgYnl0ZXMiKTsKLSAgfQotCi0gIHVpbnQzMl90IHNpemU7Ci0gIHVpbnQ4X3QgZWxlbWVudHNbMV07Ci19OwotCi1jbGFzcyBSZWFkZXIgewotcHVibGljOgotICAvLyBieXRlcyAtIFBvaW50ZXIgdG8gYSByZWZlcmVuY2UgYXJyYXkuIFRoZSBhcnJheSBpcyBub3QgbWFuaXB1bGF0ZWQgZGlyZWN0bHkKLSAgLy8gaW4gb3JkZXIgdG8gc3VwcG9ydCBjb3B5aW5nIEdDLgotICBDbGFzc0J5dGVzKiBieXRlczsKLSAgdWludDMyIG1pbjsKLSAgdWludDMyIGN1cnNvcjsKLSAgdWludDMyIG1heDsKLQotICBSZWFkZXIoQXR0cmlidXQqIGF0dHIsIENsYXNzQnl0ZXMqIGJ5dGVzKSB7Ci0gICAgdGhpcy0+Ynl0ZXMgPSBieXRlczsKLSAgICB0aGlzLT5jdXJzb3IgPSBhdHRyLT5zdGFydDsKLSAgICB0aGlzLT5taW4gPSBhdHRyLT5zdGFydDsKLSAgICB0aGlzLT5tYXggPSBhdHRyLT5zdGFydCArIGF0dHItPm5iYjsKLSAgfQotCi0gIFJlYWRlcihSZWFkZXImIHIsIHVpbnQzMiBuYmIpIHsKLSAgICBieXRlcyA9IHIuYnl0ZXM7Ci0gICAgY3Vyc29yID0gci5jdXJzb3I7Ci0gICAgbWluID0gci5taW47Ci0gICAgbWF4ID0gbWluICsgbmJiOwotICB9Ci0KLSAgc3RhdGljIGRvdWJsZSByZWFkRG91YmxlKGludCBmaXJzdCwgaW50IHNlY29uZCkgewotICAgIGludCB2YWx1ZXNbMl07Ci0gICAgZG91YmxlIHJlc1sxXTsKLSNpZiBkZWZpbmVkKF9fUFBDX18pCi0gICAgdmFsdWVzWzBdID0gc2Vjb25kOwotICAgIHZhbHVlc1sxXSA9IGZpcnN0OwotI2Vsc2UKLSAgICB2YWx1ZXNbMF0gPSBmaXJzdDsKLSAgICB2YWx1ZXNbMV0gPSBzZWNvbmQ7Ci0jZW5kaWYKLSAgICBtZW1jcHkocmVzLCB2YWx1ZXMsIDgpOyAKLSAgICByZXR1cm4gcmVzWzBdOwotICB9Ci0KLQotICBzdGF0aWMgc2ludDY0IHJlYWRMb25nKGludCBmaXJzdCwgaW50IHNlY29uZCkgewotICAgIGludCB2YWx1ZXNbMl07Ci0gICAgc2ludDY0IHJlc1sxXTsKLSNpZiBkZWZpbmVkKF9fUFBDX18pCi0gICAgdmFsdWVzWzBdID0gc2Vjb25kOwotICAgIHZhbHVlc1sxXSA9IGZpcnN0OwotI2Vsc2UKLSAgICB2YWx1ZXNbMF0gPSBmaXJzdDsKLSAgICB2YWx1ZXNbMV0gPSBzZWNvbmQ7Ci0jZW5kaWYKLSAgICBtZW1jcHkocmVzLCB2YWx1ZXMsIDgpOyAKLSAgICByZXR1cm4gcmVzWzBdOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IGludCBTZWVrU2V0OwotICBzdGF0aWMgY29uc3QgaW50IFNlZWtDdXI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgU2Vla0VuZDsKLQotICBzdGF0aWMgQ2xhc3NCeXRlcyogb3BlbkZpbGUoSm5qdm1DbGFzc0xvYWRlciogbG9hZGVyLCBjb25zdCBjaGFyKiBwYXRoKTsKLSAgc3RhdGljIENsYXNzQnl0ZXMqIG9wZW5aaXAoSm5qdm1DbGFzc0xvYWRlciogbG9hZGVyLCBaaXBBcmNoaXZlKiBhcmNoaXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZSk7Ci0gIAotICB1aW50OCByZWFkVTEoKSB7Ci0gICAgKytjdXJzb3I7Ci0gICAgcmV0dXJuIGJ5dGVzLT5lbGVtZW50c1tjdXJzb3IgLSAxXTsKLSAgfQotICAKLSAgc2ludDggcmVhZFMxKCkgewotICAgICsrY3Vyc29yOwotICAgIHJldHVybiBieXRlcy0+ZWxlbWVudHNbY3Vyc29yIC0gMV07Ci0gIH0KLSAgCi0gIHVpbnQxNiByZWFkVTIoKSB7Ci0gICAgdWludDE2IHRtcCA9ICgodWludDE2KShyZWFkVTEoKSkpIDw8IDg7Ci0gICAgcmV0dXJuIHRtcCB8ICgodWludDE2KShyZWFkVTEoKSkpOwotICB9Ci0gIAotICBzaW50MTYgcmVhZFMyKCkgewotICAgIHNpbnQxNiB0bXAgPSAoKHNpbnQxNikocmVhZFMxKCkpKSA8PCA4OwotICAgIHJldHVybiB0bXAgfCAoKHNpbnQxNikocmVhZFUxKCkpKTsKLSAgfQotICAKLSAgdWludDMyIHJlYWRVNCgpIHsKLSAgICB1aW50MzIgdG1wID0gKCh1aW50MzIpKHJlYWRVMigpKSkgPDwgMTY7Ci0gICAgcmV0dXJuIHRtcCB8ICgodWludDMyKShyZWFkVTIoKSkpOwotICB9Ci0gIAotICBzaW50MzIgcmVhZFM0KCkgewotICAgIHNpbnQzMiB0bXAgPSAoKHNpbnQzMikocmVhZFMyKCkpKSA8PCAxNjsKLSAgICByZXR1cm4gdG1wIHwgKChzaW50MzIpKHJlYWRVMigpKSk7Ci0gIH0KLQotICB1aW50NjQgcmVhZFU4KCkgewotICAgIHVpbnQ2NCB0bXAgPSAoKHVpbnQ2NCkocmVhZFU0KCkpKSA8PCAzMjsKLSAgICByZXR1cm4gdG1wIHwgKCh1aW50NjQpKHJlYWRVNCgpKSk7Ci0gIH0KLSAgCi0gIHNpbnQ2NCByZWFkUzgoKSB7Ci0gICAgc2ludDY0IHRtcCA9ICgoc2ludDY0KShyZWFkUzQoKSkpIDw8IDMyOwotICAgIHJldHVybiB0bXAgfCAoKHNpbnQ2NCkocmVhZFU0KCkpKTsKLSAgfQotCi0gIFJlYWRlcihDbGFzc0J5dGVzKiBhcnJheSwgdWludDMyIHN0YXJ0ID0gMCwgdWludDMyIGVuZCA9IDApIHsKLSAgICBpZiAoIWVuZCkgZW5kID0gYXJyYXktPnNpemU7Ci0gICAgdGhpcy0+Ynl0ZXMgPSBhcnJheTsKLSAgICB0aGlzLT5jdXJzb3IgPSBzdGFydDsKLSAgICB0aGlzLT5taW4gPSBzdGFydDsKLSAgICB0aGlzLT5tYXggPSBzdGFydCArIGVuZDsKLSAgfQotCi0gIAotICB1bnNpZ25lZCBpbnQgdGVsbCgpIHsKLSAgICByZXR1cm4gY3Vyc29yIC0gbWluOwotICB9Ci0gIAotICB2b2lkIHNlZWsodWludDMyIHBvcywgaW50IGZyb20pOwotCi19OwotCi19IC8vIGVuZCBuYW1lc3BhY2UgajMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvVk1Db3JlL1VURjguaCBiL3Zta2l0L2xpYi9KMy9WTUNvcmUvVVRGOC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjlkYTMyLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9KMy9WTUNvcmUvVVRGOC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tIFVURjguaCAtIFV0aWxpdGllcyBmb3IgVVRGOCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgX0pOSlZNX1VURjhfSF8KLSNkZWZpbmUgX0pOSlZNX1VURjhfSF8KLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLSNpbmNsdWRlICJtdm0vVVRGOC5oIgotI2luY2x1ZGUgIm12bS9QcmludEJ1ZmZlci5oIgotCi1uYW1lc3BhY2UgajMgewotCXVzaW5nIG12bTo6VVRGODsKLQl1c2luZyBtdm06OlVURjhNYXA7Ci0KLS8vLyBVVEY4QnVmZmVyIC0gSGVscGVyIGNsYXNzIHRvIGNyZWF0ZSBjaGFyKiBidWZmZXJzIHN1aXRhYmxlIGZvcgotLy8vIHByaW50Zi4KLS8vLwotY2xhc3MgVVRGOEJ1ZmZlciA6IHB1YmxpYyBtdm06OlByaW50QnVmZmVyIHsKLXB1YmxpYzoKLSAgLy8vIFVURjhCdWZmZXIgLSBDcmVhdGUgYSBidWZmZXIgd2l0aCB0aGUgZm9sbG93aW5nIFVURjguCi0gIFVURjhCdWZmZXIoY29uc3QgVVRGOCogdmFsKSA6IG12bTo6UHJpbnRCdWZmZXIodmFsKSB7fQotCi0gIC8vLyB0b0NvbXBpbGVOYW1lIC0gQ2hhbmdlIHRoZSB1dGY4IGZvbGxvd2luZyBKTkkgY29udmVudGlvbnMuCi0gIC8vLwotICBVVEY4QnVmZmVyKiB0b0NvbXBpbGVOYW1lKCkgewotCQljb25zdCBjaGFyICpidWZmZXIgPSBjU3RyaW5nKCk7Ci0gICAgdWludDMyIGxlbiA9IHN0cmxlbihidWZmZXIpOwotICAgIGNoYXIqIG5ld0J1ZmZlciA9IG5ldyBjaGFyWyhsZW4gPDwgMSkgKyAxXTsKLSAgICB1aW50MzIgaiA9IDA7Ci0gICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBsZW47ICsraSkgewotICAgICAgaWYgKGJ1ZmZlcltpXSA9PSAnLycpIHsKLSAgICAgICAgbmV3QnVmZmVyW2orK10gPSAnXyc7Ci0gICAgICB9IGVsc2UgaWYgKGJ1ZmZlcltpXSA9PSAnXycpIHsKLSAgICAgICAgbmV3QnVmZmVyW2orK10gPSAnXyc7Ci0gICAgICAgIG5ld0J1ZmZlcltqKytdID0gJzEnOwotICAgICAgfSBlbHNlIGlmIChidWZmZXJbaV0gPT0gJzsnKSB7Ci0gICAgICAgIG5ld0J1ZmZlcltqKytdID0gJ18nOwotICAgICAgICBuZXdCdWZmZXJbaisrXSA9ICcyJzsKLSAgICAgIH0gZWxzZSBpZiAoYnVmZmVyW2ldID09ICdbJykgewotICAgICAgICBuZXdCdWZmZXJbaisrXSA9ICdfJzsKLSAgICAgICAgbmV3QnVmZmVyW2orK10gPSAnMyc7Ci0gICAgICB9IGVsc2UgaWYgKGJ1ZmZlcltpXSA9PSAnJCcpIHsKLSAgICAgICAgbmV3QnVmZmVyW2orK10gPSAnXyc7Ci0gICAgICAgIG5ld0J1ZmZlcltqKytdID0gJzQnOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbmV3QnVmZmVyW2orK10gPSBidWZmZXJbaV07Ci0gICAgICB9Ci0gICAgfQotICAgIG5ld0J1ZmZlcltqXSA9IDA7Ci0JCXJlcGxhY2VXaXRoKG5ld0J1ZmZlcik7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLX07Ci0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvVk1Db3JlL1ZpcnR1YWxUYWJsZXMuY3BwIGIvdm1raXQvbGliL0ozL1ZNQ29yZS9WaXJ0dWFsVGFibGVzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxMGIxNC4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvSjMvVk1Db3JlL1ZpcnR1YWxUYWJsZXMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS8vPT09LS0tLS0tIFZpcnR1YWxUYWJsZXMuY3BwIC0gVmlydHVhbCBtZXRob2RzIGZvciBKMyBvYmplY3RzIC0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vIAotLy8gVGhpcyBmaWxlIGNvbnRhaW5zIEdDIHNwZWNpZmljIHRyYWNpbmcgZnVuY3Rpb25zLiBJdCBpcyB1c2VkIGJ5IHRoZQotLy8gR0NNbWFwMiBnYXJiYWdlIGNvbGxlY3RvciBhbmQgbWF5IGJlIG9mIHVzZSBmb3Igb3RoZXIgR0NzLiBCb2VobSBHQyBkb2VzCi0vLyBub3QgdXNlIHRoZXNlIGZ1bmN0aW9ucy4KLS8vCi0vLyBUaGUgZmlsZSBpcyBkaXZpZGVkIGludG8gZm91ciBwYXJ0czoKLS8vICgxKSBEZWNsYXJhdGlvbiBvZiBpbnRlcm5hbCBHQyBjbGFzc2VzLgotLy8gKDIpIFRyYWNpbmcgSmF2YSBvYmplY3RzOiByZWd1bGFyIG9iamVjdCwgbmF0aXZlIGFycmF5LCBvYmplY3QgYXJyYXkuCi0vLyAoMykgVHJhY2luZyBhIGNsYXNzIGxvYWRlciwgd2hpY2ggaW52b2x2ZXMgdHJhY2luZyB0aGUgSmF2YSBvYmplY3RzCi0vLyAgICAgcmVmZXJlbmNlZCBieSBjbGFzc2VzLgotLy8gKDQpIFRyYWNpbmcgdGhlIHJvb3RzIG9mIGEgcHJvZ3JhbTogdGhlIEpWTSBhbmQgdGhlIHRocmVhZHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgIkNsYXNzcGF0aFJlZmxlY3QuaCIKLSNpbmNsdWRlICJKYXZhQXJyYXkuaCIKLSNpbmNsdWRlICJKYXZhQ2xhc3MuaCIKLSNpbmNsdWRlICJKYXZhT2JqZWN0LmgiCi0jaW5jbHVkZSAiSmF2YVN0cmluZy5oIgotI2luY2x1ZGUgIkphdmFUaHJlYWQuaCIKLSNpbmNsdWRlICJKYXZhVXBjYWxscy5oIgotI2luY2x1ZGUgIkpuanZtLmgiCi0jaW5jbHVkZSAiSm5qdm1DbGFzc0xvYWRlci5oIgotI2luY2x1ZGUgIkxvY2tlZE1hcC5oIgotI2luY2x1ZGUgIlppcC5oIgotCi11c2luZyBuYW1lc3BhY2UgajM7Ci0KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLyBMaXN0IG9mIGNsYXNzZXMgdGhhdCB3aWxsIGJlIEdDLWFsbG9jYXRlZC4gT25lIHNob3VsZCB0cnkgdG8ga2VlcCB0aGlzCi0vLyBsaXN0IGFzIG1pbmltYWwgYXMgcG9zc2libGUsIGFuZCBhIEdDIGNsYXNzIG11c3QgYmUgZGVmaW5lZCBvbmx5IGlmCi0vLyBhYnNvbHV0ZWx5IG5lY2Vzc2FyeS4gSWYgdGhlcmUgaXMgYW4gZWFzeSB3YXkgdG8gYXZvaWQgaXQsIGRvIGl0ISBPbmx5Ci0vLyBKYXZhIGNsYXNzZXMgc2hvdWxkIGJlIEdDIGNsYXNzZXMuCi0vLyBIYXZpbmcgbWFueSBHQyBjbGFzc2VzIGdpdmVzIG1vcmUgd29yayB0byB0aGUgR0MgZm9yIHRoZSBzY2FubmluZyBwaGFzZQotLy8gYW5kIGZvciB0aGUgcmVsb2NhdGlvbiBwaGFzZSAoZm9yIGNvcHlpbmcgY29sbGVjdG9ycykuCi0vLwotLy8gSW4gSjMsIHRoZXJlIGlzIG9ubHkgb25lIGludGVybmFsIGdjIG9iamVjdCwgdGhlIGNsYXNzIGxvYWRlci4KLS8vIFdlIGRlY2lkZWQgdGhhdCB0aGlzIHdhcyB0aGUgYmVzdCBzb2x1dGlvbiBiZWNhdXNlCi0vLyBvdGhlcndpc2UgaXQgd291bGQgaW52b2x2ZSBoYWNrcyBvbiB0aGUgamF2YS5sYW5nLkNsYXNzbG9hZGVyIGNsYXNzLgotLy8gVGhlcmVmb3JlLCB3ZSBjcmVhdGUgYSBuZXcgR0MgY2xhc3Mgd2l0aCBhIGZpbmFsaXplIG1ldGhvZCB0aGF0IHdpbGwKLS8vIGRlbGV0ZSB0aGUgaW50ZXJuYWwgY2xhc3MgbG9hZGVyIHdoZW4gdGhlIEphdmEgb2JqZWN0IGNsYXNzIGxvYWRlciBpcwotLy8gbm90IHJlYWNoYWJsZSBhbnltb3JlLiBUaGlzIGFsc28gcmVsaWVzIG9uIHRoZSBqYXZhLmxhbmcuQ2xhc3Nsb2FkZXIgY2xhc3MKLS8vIHJlZmVyZW5jaW5nIGFuIG9iamVjdCBvZiB0eXBlIFZNQ2xhc3NMb2FkZXIgKHRoaXMgaXMgdGhlIGNhc2UgaW4gR05VCi0vLyBDbGFzc3BhdGggd2l0aCB0aGUgdm1kYXRhIGZpZWxkKS4KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLXZvaWQgSm5qdm06OmluaXRpYWxpc2VJbnRlcm5hbFZUcygpIHsKLQlWTUNsYXNzTG9hZGVyX19WVCA9IChtdm06OlZpcnR1YWxUYWJsZSopYWxsb2NhdG9yLkFsbG9jYXRlKHNpemVvZihtdm06OlZpcnR1YWxUYWJsZSksICJWaXJ0dWFsIHRhYmxlIik7Ci0JVk1DbGFzc0xvYWRlcl9fVlQtPmRlc3RydWN0b3IgICAgID0gKHVpbnRwdHJfdClWTUNsYXNzTG9hZGVyOjpzdGF0aWNEZXN0cnVjdG9yOwotCVZNQ2xhc3NMb2FkZXJfX1ZULT5vcGVyYXRvckRlbGV0ZSA9ICh1aW50cHRyX3QpVk1DbGFzc0xvYWRlcjo6c3RhdGljRGVzdHJ1Y3RvcjsKLQlWTUNsYXNzTG9hZGVyX19WVC0+dHJhY2VyICAgICAgICAgPSAodWludHB0cl90KVZNQ2xhc3NMb2FkZXI6OnN0YXRpY1RyYWNlcjsKLQlWTUNsYXNzTG9hZGVyX19WVC0+dm0gICAgICAgICAgICAgPSB0aGlzOwotfQotCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8gVHJhY2UgbWV0aG9kcyBmb3IgSmF2YSBvYmplY3RzLiBUaGVyZSBhcmUgZm91ciB0eXBlcyBvZiBvYmplY3RzOgotLy8gKDEpIGphdmEubGFuZy5PYmplY3QgYW5kIHByaW1pdGl2ZSBhcnJheXM6IG5vIG5lZWQgdG8gdHJhY2UgYW55dGhpbmcuCi0vLyAoMikgT2JqZWN0IHdob3NlIGNsYXNzIGlzIG5vdCBhbiBhcnJheTogbmVlZHMgdG8gdHJhY2UgdGhlIGNsYXNzbG9hZGVyLCBhbmQKLS8vICAgICBhbGwgdGhlIHZpcnR1YWwgZmllbGRzLgotLy8gKDMpIE9iamVjdCB3aG9zZSBjbGFzcyBpcyBhbiBhcnJheSBvZiBvYmplY3RzOiBuZWVkcyB0byB0cmFjZSB0aGUgY2xhc3MKLS8vICAgICBsb2FkZXIgYW5kIGFsbCBlbGVtZW50cyBpbiB0aGUgYXJyYXkuCi0vLyAoNCkgT2JqZWN0cyB0aGF0IGV4dGVuZCBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZTogbXVzdCB0cmFjZSB0aGUgY2xhc3MgbG9hZGVyCi0vLyAgICAgYW5kIGFsbCB0aGUgZmllbGRzIGV4Y2VwdCB0aGUgcmVmZXJlbnQuCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0vLy8gU2Nhbm5pbmcgamF2YS5sYW5nLk9iamVjdCBhbmQgcHJpbWl0aXZlIGFycmF5cy4KLWV4dGVybiAiQyIgdm9pZCBKYXZhT2JqZWN0VHJhY2VyKEphdmFPYmplY3QqIG9iaiwgdWludHB0cl90IGNsb3N1cmUpIHsKLX0KLQotLy8vIE1ldGhvZCBmb3Igc2Nhbm5pbmcgcmVndWxhciBvYmplY3RzLgotZXh0ZXJuICJDIiB2b2lkIFJlZ3VsYXJPYmplY3RUcmFjZXIoSmF2YU9iamVjdCogb2JqLCB1aW50cHRyX3QgY2xvc3VyZSkgewotICBDbGFzcyogY2wgPSBKYXZhT2JqZWN0OjpnZXRDbGFzcyhvYmopLT5hc0NsYXNzKCk7Ci0gIGFzc2VydChjbCAmJiAiTm90IGEgY2xhc3MgaW4gcmVndWxhciB0cmFjZXIiKTsKLSAgbXZtOjpDb2xsZWN0b3I6Om1hcmtBbmRUcmFjZVJvb3QoCi0gICAgICBjbC0+Y2xhc3NMb2FkZXItPmdldEphdmFDbGFzc0xvYWRlclB0cigpLCBjbG9zdXJlKTsKLQotICB3aGlsZSAoY2wtPnN1cGVyICE9IDApIHsKLSAgICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IGNsLT5uYlZpcnR1YWxGaWVsZHM7ICsraSkgewotICAgICAgSmF2YUZpZWxkJiBmaWVsZCA9IGNsLT52aXJ0dWFsRmllbGRzW2ldOwotICAgICAgaWYgKGZpZWxkLmlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgSmF2YU9iamVjdCoqIHB0ciA9IGZpZWxkLmdldEluc3RhbmNlT2JqZWN0RmllbGRQdHIob2JqKTsKLSAgICAgICAgbXZtOjpDb2xsZWN0b3I6Om1hcmtBbmRUcmFjZShvYmosIHB0ciwgY2xvc3VyZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNsID0gY2wtPnN1cGVyOwotICB9Ci19Ci0KLS8vLyBNZXRob2QgZm9yIHNjYW5uaW5nIGFuIGFycmF5IHdob3NlIGVsZW1lbnRzIGFyZSBKYXZhT2JqZWN0cy4gVGhpcyBtZXRob2QgaXMKLS8vLyBjYWxsZWQgZm9yIGFsbCBub24tbmF0aXZlIEphdmEgYXJyYXlzLgotZXh0ZXJuICJDIiB2b2lkIEFycmF5T2JqZWN0VHJhY2VyKEFycmF5T2JqZWN0KiBvYmosIHVpbnRwdHJfdCBjbG9zdXJlKSB7Ci0gIENvbW1vbkNsYXNzKiBjbCA9IEphdmFPYmplY3Q6OmdldENsYXNzKG9iaik7Ci0gIGFzc2VydChjbCAmJiAiTm8gY2xhc3MiKTsKLSAgbXZtOjpDb2xsZWN0b3I6Om1hcmtBbmRUcmFjZVJvb3QoCi0gICAgICBjbC0+Y2xhc3NMb2FkZXItPmdldEphdmFDbGFzc0xvYWRlclB0cigpLCBjbG9zdXJlKTsKLSAgCi0KLSAgZm9yIChzaW50MzIgaSA9IDA7IGkgPCBBcnJheU9iamVjdDo6Z2V0U2l6ZShvYmopOyBpKyspIHsKLSAgICBpZiAoQXJyYXlPYmplY3Q6OmdldEVsZW1lbnQob2JqLCBpKSAhPSBOVUxMKSB7Ci0gICAgICBtdm06OkNvbGxlY3Rvcjo6bWFya0FuZFRyYWNlKAotICAgICAgICAgIG9iaiwgQXJyYXlPYmplY3Q6OmdldEVsZW1lbnRzKG9iaikgKyBpLCBjbG9zdXJlKTsKLSAgICB9Ci0gIH0gCi19Ci0KLS8vLyBNZXRob2QgZm9yIHNjYW5uaW5nIEphdmEgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2Ugb2JqZWN0cy4KLWV4dGVybiAiQyIgdm9pZCBSZWZlcmVuY2VPYmplY3RUcmFjZXIoCi0gICAgSmF2YU9iamVjdFJlZmVyZW5jZSogb2JqLCB1aW50cHRyX3QgY2xvc3VyZSkgewotICBDbGFzcyogY2wgPSBKYXZhT2JqZWN0OjpnZXRDbGFzcyhvYmopLT5hc0NsYXNzKCk7Ci0gIGFzc2VydChjbCAmJiAiTm90IGEgY2xhc3MgaW4gcmVmZXJlbmNlIHRyYWNlciIpOwotICBtdm06OkNvbGxlY3Rvcjo6bWFya0FuZFRyYWNlUm9vdCgKLSAgICAgIGNsLT5jbGFzc0xvYWRlci0+Z2V0SmF2YUNsYXNzTG9hZGVyUHRyKCksIGNsb3N1cmUpOwotCi0gIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgd2hpbGUgKGNsLT5zdXBlciAhPSAwKSB7Ci0gICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBjbC0+bmJWaXJ0dWFsRmllbGRzOyArK2kpIHsKLSAgICAgIEphdmFGaWVsZCYgZmllbGQgPSBjbC0+dmlydHVhbEZpZWxkc1tpXTsKLSAgICAgIGlmIChmaWVsZC5pc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgIEphdmFPYmplY3QqKiBwdHIgPSBmaWVsZC5nZXRJbnN0YW5jZU9iamVjdEZpZWxkUHRyKG9iaik7Ci0gICAgICAgIGlmIChwdHIgIT0gSmF2YU9iamVjdFJlZmVyZW5jZTo6Z2V0UmVmZXJlbnRQdHIob2JqKSkgewotICAgICAgICAgIG12bTo6Q29sbGVjdG9yOjptYXJrQW5kVHJhY2Uob2JqLCBwdHIsIGNsb3N1cmUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjbCA9IGNsLT5zdXBlcjsKLSAgfQotICBhc3NlcnQoZm91bmQgJiYgIk5vIHJlZmVyZW50IGluIGEgcmVmZXJlbmNlIik7Ci19Ci0KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLyBTdXBwb3J0IGZvciBzY2FubmluZyBKYXZhIG9iamVjdHMgcmVmZXJlbmNlZCBieSBjbGFzc2VzLiBBbGwgY2xhc3NlcyBtdXN0Ci0vLyB0cmFjZToKLS8vICgxKSBUaGUgY2xhc3Nsb2FkZXIgb2YgdGhlIHBhcmVudHMgKHN1cGVyIGFuZCBpbnRlcmZhY2VzKSBhcyB3ZWxsIGFzIGl0cwotLy8gICAgIG93biBjbGFzcyBsb2FkZXIuCi0vLyAoMikgVGhlIGRlbGVnYXRlZSBvYmplY3QgKGphdmEubGFuZy5DbGFzcykgaWYgaXQgZXhpc3RzLgotLy8KLS8vIEFkZGl0aW9uYWx5LCBub24tcHJpbWl0aXZlIGFuZCBub24tYXJyYXkgY2xhc3NlcyBtdXN0IHRyYWNlOgotLy8gKDMpIFRoZSBzdGF0aWMgaW5zdGFuY2UuCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi12b2lkIENvbW1vbkNsYXNzOjp0cmFjZXIodWludHB0cl90IGNsb3N1cmUpIHsKLSAgCi0gIGlmIChzdXBlciAhPSBOVUxMICYmIHN1cGVyLT5jbGFzc0xvYWRlciAhPSBOVUxMKSB7Ci0gICAgSmF2YU9iamVjdCoqIE9iaiA9IHN1cGVyLT5jbGFzc0xvYWRlci0+Z2V0SmF2YUNsYXNzTG9hZGVyUHRyKCk7Ci0gICAgaWYgKCpPYmogIT0gTlVMTCkgbXZtOjpDb2xsZWN0b3I6Om1hcmtBbmRUcmFjZVJvb3QoT2JqLCBjbG9zdXJlKTsKLSAgCi0gICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBuYkludGVyZmFjZXM7ICsraSkgewotICAgICAgaWYgKGludGVyZmFjZXNbaV0tPmNsYXNzTG9hZGVyKSB7Ci0gICAgICAgIEphdmFPYmplY3QqKiBPYmogPSBpbnRlcmZhY2VzW2ldLT5jbGFzc0xvYWRlci0+Z2V0SmF2YUNsYXNzTG9hZGVyUHRyKCk7Ci0gICAgICAgIGlmICgqT2JqICE9IE5VTEwpIG12bTo6Q29sbGVjdG9yOjptYXJrQW5kVHJhY2VSb290KE9iaiwgY2xvc3VyZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKGNsYXNzTG9hZGVyICE9IE5VTEwpIHsKLSAgICBtdm06OkNvbGxlY3Rvcjo6bWFya0FuZFRyYWNlUm9vdCgKLSAgICAgICAgY2xhc3NMb2FkZXItPmdldEphdmFDbGFzc0xvYWRlclB0cigpLCBjbG9zdXJlKTsKLSAgfQotCi0gIGZvciAodWludDMyIGkgPSAwOyBpIDwgTlJfSVNPTEFURVM7ICsraSkgewotICAgIGlmIChkZWxlZ2F0ZWVbaV0gIT0gTlVMTCkgewotICAgICAgbXZtOjpDb2xsZWN0b3I6Om1hcmtBbmRUcmFjZVJvb3QoZGVsZWdhdGVlICsgaSwgY2xvc3VyZSk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ2xhc3M6OnRyYWNlcih1aW50cHRyX3QgY2xvc3VyZSkgewotICBDb21tb25DbGFzczo6dHJhY2VyKGNsb3N1cmUpOwotICAKLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBOUl9JU09MQVRFUzsgKytpKSB7Ci0gICAgVGFza0NsYXNzTWlycm9yICZNID0gSXNvbGF0ZUluZm9baV07Ci0gICAgaWYgKE0uc3RhdGljSW5zdGFuY2UgIT0gTlVMTCkgewotICAgICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBuYlN0YXRpY0ZpZWxkczsgKytpKSB7Ci0gICAgICAgIEphdmFGaWVsZCYgZmllbGQgPSBzdGF0aWNGaWVsZHNbaV07Ci0gICAgICAgIGlmIChmaWVsZC5pc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgSmF2YU9iamVjdCoqIHB0ciA9IGZpZWxkLmdldFN0YXRpY09iamVjdEZpZWxkUHRyKCk7Ci0gICAgICAgICAgbXZtOjpDb2xsZWN0b3I6Om1hcmtBbmRUcmFjZVJvb3QocHRyLCBjbG9zdXJlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8gU3VwcG9ydCBmb3Igc2Nhbm5pbmcgYSBjbGFzc2xvYWRlci4gQSBjbGFzc2xvYWRlciBtdXN0IHRyYWNlOgotLy8gKDEpIEFsbCB0aGUgY2xhc3NlcyBpdCBoYXMgbG9hZGVkIChsb2NhdGVkIGluIHRoZSBjbGFzc21hcCkuCi0vLyAoMikgQWxsIHRoZSBjbGFzcyBpdCBoYXMgaW5pdGlhdGVkIGxvYWRpbmcgYW5kIHRoZXJlZm9yZSByZWZlcmVuY2VzIChsb2NhdGVkCi0vLyAgICAgaW4gdGhlIGNsYXNzbWFwKS4KLS8vICgzKSBBbGwgdGhlIHN0cmluZ3MgcmVmZXJlbmNlZCBpbiBjbGFzcyBmaWxlcy4KLS8vCi0vLyBUaGUgY2xhc3MgbG9hZGVyIGRvZXMgbm90IG5lZWQgdG8gdHJhY2UgaXRzIGphdmEubGFuZy5DbGFzc2xvYWRlciBKYXZhIG9iamVjdAotLy8gYmVjYXVzZSBpZiB3ZSBlbmQgdXAgaGVyZSwgdGhpcyBtZWFucyB0aGF0IHRoZSBKYXZhIG9iamVjdCBpcyBhbHJlYWR5IGJlaW5nCi0vLyBzY2FubmVkLiBPbmx5IHRoZSBKYXZhIG9iamVjdCB0cmFjZXMgdGhlIGNsYXNzIGxvYWRlci4KLS8vCi0vLyBBZGRpdGlvbmFseSwgdGhlIGJvb3RzdHJhcCBsb2FkZXIgbXVzdCB0cmFjZToKLS8vICg0KSBUaGUgZGVsZWdhdGVlcyBvZiBuYXRpdmUgYXJyYXkgY2xhc3Nlcy4gU2luY2UgdGhlc2UgY2xhc3NlcyBhcmUgbm90IGluCi0vLyAgICAgdGhlIGNsYXNzIG1hcCBhbmQgdGhleSBhcmUgbm90IEdDLWFsbG9jYXRlZCwgd2UgbXVzdCB0cmFjZSB0aGUgb2JqZWN0cwotLy8gICAgIHJlZmVyZW5jZWQgYnkgdGhlIGRlbGVnYXRlZXMuCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi12b2lkIEpuanZtQ2xhc3NMb2FkZXI6OnRyYWNlcih1aW50cHRyX3QgY2xvc3VyZSkgewotICAKLSAgZm9yIChDbGFzc01hcDo6aXRlcmF0b3IgaSA9IGNsYXNzZXMtPm1hcC5iZWdpbigpLCBlID0gY2xhc3Nlcy0+bWFwLmVuZCgpOwotICAgICAgIGkhPSBlOyArK2kpIHsKLSAgICBDb21tb25DbGFzcyogY2wgPSBpLT5zZWNvbmQ7Ci0gICAgaWYgKGNsLT5pc0NsYXNzKCkpIGNsLT5hc0NsYXNzKCktPnRyYWNlcihjbG9zdXJlKTsKLSAgICBlbHNlIGNsLT50cmFjZXIoY2xvc3VyZSk7Ci0gIH0KLSAgCi0gIFN0cmluZ0xpc3QqIGVuZCA9IHN0cmluZ3M7Ci0gIHdoaWxlIChlbmQgIT0gTlVMTCkgewotICAgIGZvciAodWludDMyIGkgPSAwOyBpIDwgZW5kLT5sZW5ndGg7ICsraSkgewotICAgICAgSmF2YVN0cmluZyoqIG9iaiA9IGVuZC0+c3RyaW5ncyArIGk7Ci0gICAgICBtdm06OkNvbGxlY3Rvcjo6bWFya0FuZFRyYWNlUm9vdChvYmosIGNsb3N1cmUpOwotICAgIH0KLSAgICBlbmQgPSBlbmQtPnByZXY7Ci0gIH0KLSAgCi0gIG12bTo6Q29sbGVjdG9yOjptYXJrQW5kVHJhY2VSb290KCZqYXZhTG9hZGVyLCBjbG9zdXJlKTsKLX0KLQotdm9pZCBKbmp2bUJvb3RzdHJhcExvYWRlcjo6dHJhY2VyKHVpbnRwdHJfdCBjbG9zdXJlKSB7Ci0gCi0gIEpuanZtQ2xhc3NMb2FkZXI6OnRyYWNlcihjbG9zdXJlKTsKLX0KLQotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vIFN1cHBvcnQgZm9yIHNjYW5uaW5nIHRoZSByb290cyBvZiBhIHByb2dyYW06IEpWTSBhbmQgdGhyZWFkcy4gVGhlIEpWTQotLy8gbXVzdCB0cmFjZToKLS8vICgxKSBUaGUgYm9vdHN0cmFwIGNsYXNzIGxvYWRlcjogd2hlcmUgY29yZSBjbGFzc2VzIGxpdmUuCi0vLyAoMikgVGhlIGFwcGxpY2F0aXZlIGNsYXNzIGxvYWRlcjogdGhlIEpWTSBtYXkgYmUgdGhlIG9ueSBvbmUgcmVmZXJlbmNpbmcgaXQuCi0vLyAoMykgR2xvYmFsIHJlZmVyZW5jZXMgZnJvbSBKTkkuCi0vLwotLy8gVGhlIHRocmVhZHMgbXVzdCB0cmFjZToKLS8vICgxKSBUaGVpciBzdGFjayAoYWxyZWFkeSBkb25lIGJ5IHRoZSBHQyBpbiB0aGUgY2FzZSBvZiBHQ01tYXAyIG9yIEJvZWhtKQotLy8gKDIpIFRoZSBqYXZhLmxhbmcuVGhyZWFkIGRlbGVnYXRlLgotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotCi12b2lkIEpuanZtOjp0cmFjZXIodWludHB0cl90IGNsb3N1cmUpIHsKLSAgLy8gKDEpIFRyYWNlIHRoZSBib290cmFwIGxvYWRlci4KLSAgYm9vdHN0cmFwTG9hZGVyLT50cmFjZXIoY2xvc3VyZSk7Ci0gIAotICAvLyAoMikgVHJhY2UgdGhlIGFwcGxpY2F0aW9uIGNsYXNzIGxvYWRlci4KLSAgaWYgKGFwcENsYXNzTG9hZGVyICE9IE5VTEwpIHsKLSAgICBtdm06OkNvbGxlY3Rvcjo6bWFya0FuZFRyYWNlUm9vdCgKLSAgICAgICAgYXBwQ2xhc3NMb2FkZXItPmdldEphdmFDbGFzc0xvYWRlclB0cigpLCBjbG9zdXJlKTsKLSAgfQotICAKLSAgLy8gKDMpIFRyYWNlIEpOSSBnbG9iYWwgcmVmZXJlbmNlcy4KLSAgSk5JR2xvYmFsUmVmZXJlbmNlcyogc3RhcnQgPSAmZ2xvYmFsUmVmczsKLSAgd2hpbGUgKHN0YXJ0ICE9IE5VTEwpIHsKLSAgICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IHN0YXJ0LT5sZW5ndGg7ICsraSkgewotICAgICAgSmF2YU9iamVjdCoqIG9iaiA9IHN0YXJ0LT5nbG9iYWxSZWZlcmVuY2VzICsgaTsKLSAgICAgIG12bTo6Q29sbGVjdG9yOjptYXJrQW5kVHJhY2VSb290KG9iaiwgY2xvc3VyZSk7Ci0gICAgfQotICAgIHN0YXJ0ID0gc3RhcnQtPm5leHQ7Ci0gIH0KLSAgCi0gIC8vICg0KSBUcmFjZSB0aGUgaW50ZXJuZWQgc3RyaW5ncy4KLSAgZm9yIChTdHJpbmdNYXA6Oml0ZXJhdG9yIGkgPSBoYXNoU3RyLm1hcC5iZWdpbigpLCBlID0gaGFzaFN0ci5tYXAuZW5kKCk7Ci0gICAgICAgaSE9IGU7ICsraSkgewotICAgIEphdmFTdHJpbmcqKiBzdHIgPSAmKGktPnNlY29uZCk7Ci0gICAgbXZtOjpDb2xsZWN0b3I6Om1hcmtBbmRUcmFjZVJvb3Qoc3RyLCBjbG9zdXJlKTsKLSAgICBBcnJheVVJbnQxNioqIGtleSA9IGNvbnN0X2Nhc3Q8QXJyYXlVSW50MTYqKj4oJihpLT5maXJzdCkpOwotICAgIG12bTo6Q29sbGVjdG9yOjptYXJrQW5kVHJhY2VSb290KGtleSwgY2xvc3VyZSk7Ci0gIH0KLQotCS8vICg1KSBUcmFjZSB0aGUgZGVsZWdhdGVlcy4KLSNkZWZpbmUgVFJBQ0VfREVMRUdBVEVFKHByaW0pIFwKLSAgcHJpbS0+dHJhY2VyKGNsb3N1cmUpOwotCi0gIFRSQUNFX0RFTEVHQVRFRSh1cGNhbGxzLT5PZlZvaWQpOwotICBUUkFDRV9ERUxFR0FURUUodXBjYWxscy0+T2ZCb29sKTsKLSAgVFJBQ0VfREVMRUdBVEVFKHVwY2FsbHMtPk9mQnl0ZSk7Ci0gIFRSQUNFX0RFTEVHQVRFRSh1cGNhbGxzLT5PZkNoYXIpOwotICBUUkFDRV9ERUxFR0FURUUodXBjYWxscy0+T2ZTaG9ydCk7Ci0gIFRSQUNFX0RFTEVHQVRFRSh1cGNhbGxzLT5PZkludCk7Ci0gIFRSQUNFX0RFTEVHQVRFRSh1cGNhbGxzLT5PZkZsb2F0KTsKLSAgVFJBQ0VfREVMRUdBVEVFKHVwY2FsbHMtPk9mTG9uZyk7Ci0gIFRSQUNFX0RFTEVHQVRFRSh1cGNhbGxzLT5PZkRvdWJsZSk7Ci0jdW5kZWYgVFJBQ0VfREVMRUdBVEVFCi0gIAotICAvLyAoNikgVHJhY2UgdGhlIGxvY2tzIGFuZCB0aGVpciBhc3NvY2lhdGVkIG9iamVjdC4KLSAgdWludDMyIGkgPSAwOwotICBmb3IgKDsgaSA8IG12bTo6TG9ja1N5c3RlbTo6R2xvYmFsU2l6ZTsgaSsrKSB7Ci0gICAgbXZtOjpGYXRMb2NrKiogYXJyYXkgPSBsb2NrU3lzdGVtLkxvY2tUYWJsZVtpXTsKLSAgICBpZiAoYXJyYXkgPT0gTlVMTCkgYnJlYWs7Ci0gICAgdWludDMyIGogPSAwOwotICAgIGZvciAoOyBqIDwgbXZtOjpMb2NrU3lzdGVtOjpJbmRleFNpemU7IGorKykgewotICAgICAgaWYgKGFycmF5W2pdID09IE5VTEwpIGJyZWFrOwotICAgICAgbXZtOjpGYXRMb2NrKiBsb2NrID0gYXJyYXlbal07Ci0gICAgICBtdm06OkNvbGxlY3Rvcjo6bWFya0FuZFRyYWNlUm9vdChsb2NrLT5nZXRBc3NvY2lhdGVkT2JqZWN0UHRyKCksIGNsb3N1cmUpOwotICAgIH0KLSAgICBmb3IgKGogPSBqICsgMTsgaiA8IG12bTo6TG9ja1N5c3RlbTo6SW5kZXhTaXplOyBqKyspIHsKLSAgICAgIGFzc2VydChhcnJheVtqXSA9PSBOVUxMKTsKLSAgICB9Ci0gIH0KLSAgZm9yIChpID0gaSArIDE7IGkgPCBtdm06OkxvY2tTeXN0ZW06Okdsb2JhbFNpemU7IGkrKykgewotICAgIGFzc2VydChsb2NrU3lzdGVtLkxvY2tUYWJsZVtpXSA9PSBOVUxMKTsKLSAgfQotfQotCi12b2lkIEphdmFUaHJlYWQ6OnRyYWNlcih1aW50cHRyX3QgY2xvc3VyZSkgewotICBtdm06OkNvbGxlY3Rvcjo6bWFya0FuZFRyYWNlUm9vdCgmamF2YVRocmVhZCwgY2xvc3VyZSk7Ci0gIG12bTo6Q29sbGVjdG9yOjptYXJrQW5kVHJhY2VSb290KCZ2bVRocmVhZCwgY2xvc3VyZSk7Ci0gIAotICBKTklMb2NhbFJlZmVyZW5jZXMqIGVuZCA9IGxvY2FsSk5JUmVmczsKLSAgd2hpbGUgKGVuZCAhPSBOVUxMKSB7Ci0gICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBlbmQtPmxlbmd0aDsgKytpKSB7Ci0JCQltdm06OmdjKiogb2JqID0gZW5kLT5sb2NhbFJlZmVyZW5jZXMgKyBpOwotICAgICAgbXZtOjpDb2xsZWN0b3I6Om1hcmtBbmRUcmFjZVJvb3Qob2JqLCBjbG9zdXJlKTsKLSAgICB9Ci0gICAgZW5kID0gZW5kLT5wcmV2OwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvVk1Db3JlL1ppcC5jcHAgYi92bWtpdC9saWIvSjMvVk1Db3JlL1ppcC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMTAzNGMuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL0ozL1ZNQ29yZS9aaXAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0gWmlwLmNwcCAtIEludGVyZmFjZSB3aXRoIHpsaWIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSA8emxpYi5oPgotCi0jaW5jbHVkZSAibXZtL0FsbG9jYXRvci5oIgotCi0jaW5jbHVkZSAiSmF2YUFycmF5LmgiCi0jaW5jbHVkZSAiUmVhZGVyLmgiCi0jaW5jbHVkZSAiWmlwLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBqMzsKLQotWmlwQXJjaGl2ZTo6WmlwQXJjaGl2ZShDbGFzc0J5dGVzKiBieXRlcywgbXZtOjpCdW1wUHRyQWxsb2NhdG9yJiBBKSA6IGFsbG9jYXRvcihBKSB7Ci0gIHRoaXMtPmJ5dGVzID0gYnl0ZXM7Ci0gIGZpbmRPZnNjZCgpOwotICBpZiAob2ZzY2QgPiAtMSkgYWRkRmlsZXMoKTsKLX0KLQotWmlwRmlsZSogWmlwQXJjaGl2ZTo6Z2V0RmlsZShjb25zdCBjaGFyKiBmaWxlbmFtZSkgewotICB0YWJsZV9pdGVyYXRvciBFbmQgPSBmaWxldGFibGUuZW5kKCk7Ci0gIHRhYmxlX2l0ZXJhdG9yIEkgPSBmaWxldGFibGUuZmluZChmaWxlbmFtZSk7Ci0gIHJldHVybiBJICE9IEVuZCA/IEktPnNlY29uZCA6IDA7Ci19Ci0KLQotI2RlZmluZSBFTkRfQ0VOVFJBTF9ESVJFQ1RPUllfRklMRV9IRUFERVJfU0laRSAxOAotI2RlZmluZSBDRU5UUkFMX0RJUkVDVE9SWV9GSUxFX0hFQURFUl9TSVpFIDQyCi0jZGVmaW5lIExPQ0FMX0ZJTEVfSEVBREVSX1NJWkUgMjYKLQotI2RlZmluZSBDX0ZJTEVOQU1FX0xFTkdUSCAyNAotI2RlZmluZSBDX1VDU0laRSAyMAotI2RlZmluZSBDX0NTSVpFIDE2Ci0jZGVmaW5lIENfRVhUUkFfRklFTERfTEVOR1RIIDI2Ci0jZGVmaW5lIENfRklMRV9DT01NRU5UX0xFTkdUSCAyOAotI2RlZmluZSBDX1JPTEggMzgKLSNkZWZpbmUgQ19DT01QUkVTU0lPTl9NRVRIT0QgNgotCi0jZGVmaW5lIExfRklMRU5BTUVfTEVOR1RIIDIyCi0jZGVmaW5lIExfRVhUUkFfRklFTERfTEVOR1RIIDI0Ci0KLSNkZWZpbmUgRV9PRkZTRVRfU1RBUlRfQ0VOVFJBTF9ESVJFQ1RPUlkgMTIKLSNkZWZpbmUgSERSX0VORENFTlRSQUwgIlBLXDAwNVwwMDYiCi0jZGVmaW5lIEhEUl9DRU5UUkFMICJQS1wwMDFcMDAyIgotI2RlZmluZSBIRFJfTE9DQUwgIlBLXDAwM1wwMDQiCi0jZGVmaW5lIFBBVEhfU0VQQVJBVE9SICcvJwotI2RlZmluZSBaSVBfU1RPUkUgMAotI2RlZmluZSBaSVBfREVGTEFURSA4Ci0jZGVmaW5lIERFRl9XQklUUyAxNQotCi1zdGF0aWMgdWludDMyIHJlYWRFbmRpYW5EZXA0KFJlYWRlciYgcmVhZGVyKSB7Ci0gIHVpbnQ4IG9uZSA9IHJlYWRlci5yZWFkVTEoKTsKLSAgdWludDggdHdvID0gcmVhZGVyLnJlYWRVMSgpOwotICB1aW50OCB0aHJlZSA9IHJlYWRlci5yZWFkVTEoKTsKLSAgdWludDggZm91ciA9IHJlYWRlci5yZWFkVTEoKTsKLSAgcmV0dXJuIChvbmUgKyAodHdvIDw8IDgpICsgKHRocmVlIDw8IDE2KSArIChmb3VyIDw8IDI0KSk7Ci19Ci0KLXN0YXRpYyB1aW50MTYgcmVhZEVuZGlhbkRlcDIoUmVhZGVyJiByZWFkZXIpIHsKLSAgdWludDggb25lID0gcmVhZGVyLnJlYWRVMSgpOwotICB1aW50OCB0d28gPSByZWFkZXIucmVhZFUxKCk7Ci0gIHJldHVybiAob25lICsgKHR3byA8PCA4KSk7Ci19Ci0KLXZvaWQgWmlwQXJjaGl2ZTo6ZmluZE9mc2NkKCkgewotICBzaW50MzIgY3VyT2ZmcyA9IDA7Ci0gIHNpbnQzMiBtaW5PZmZzID0gMDsKLSAgc2ludDMyIHN0ID0gRU5EX0NFTlRSQUxfRElSRUNUT1JZX0ZJTEVfSEVBREVSX1NJWkUgKyA0OwotICAKLSAgUmVhZGVyIHJlYWRlcihieXRlcyk7Ci0gIGN1ck9mZnMgPSByZWFkZXIubWF4OwotICBpZiAoY3VyT2ZmcyA+PSAoNjU1MzUgKyBFTkRfQ0VOVFJBTF9ESVJFQ1RPUllfRklMRV9IRUFERVJfU0laRSArIDQpKSB7Ci0gICAgbWluT2ZmcyA9IGN1ck9mZnMgLSAoNjU1MzUgKyBFTkRfQ0VOVFJBTF9ESVJFQ1RPUllfRklMRV9IRUFERVJfU0laRSArIDQpOwotICB9IGVsc2UgewotICAgIG1pbk9mZnMgPSAwOwotICB9Ci0KLSAgd2hpbGUgKGN1ck9mZnMgPiBtaW5PZmZzKSB7Ci0gICAgc2ludDMyIHNlYXJjaFBvcyA9IDA7Ci0gICAgaWYgKGN1ck9mZnMgPj0gKDEwMjQgLSBzdCkpIHsKLSAgICAgIGN1ck9mZnMgPSBjdXJPZmZzIC0gKDEwMjQgLSBzdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGN1ck9mZnMgPSAwOwotICAgIH0KLSAgICByZWFkZXIuY3Vyc29yICs9IGN1ck9mZnM7Ci0KLSAgICBzaW50MzIgZGlmZiA9IHJlYWRlci5tYXggLSByZWFkZXIuY3Vyc29yOwotICAgIHNpbnQzMiB0ZW1wID0gcmVhZGVyLmN1cnNvcjsKLSAgICBpZiAoZGlmZiA+IDEwMjQpIHsKLSAgICAgIHNlYXJjaFBvcyA9IDEwMjQ7Ci0gICAgICByZWFkZXIuY3Vyc29yICs9IDEwMjQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNlYXJjaFBvcyA9IGRpZmY7Ci0gICAgICByZWFkZXIuY3Vyc29yID0gcmVhZGVyLm1heDsKLSAgICB9Ci0KLSAgICBpZiAoc2VhcmNoUG9zID49IHN0KSB7Ci0gICAgICBzaW50MzIgc2VhcmNoUHRyID0gdGVtcCArIChzZWFyY2hQb3MgLSBzdCk7Ci0gICAgICB3aGlsZSAoc2VhcmNoUHRyID4gdGVtcCkgewotICAgICAgICBpZiAoYnl0ZXMtPmVsZW1lbnRzW3NlYXJjaFB0cl0gPT0gJ1AnICYmIAotICAgICAgICAgICEobWVtY21wKGJ5dGVzLT5lbGVtZW50cyArIHNlYXJjaFB0ciwgSERSX0VORENFTlRSQUwsIDQpKSkgewotICAgICAgICAgIHNpbnQzMiBvZmZzZXQgPSBzZWFyY2hQdHIgKyA0ICsgRV9PRkZTRVRfU1RBUlRfQ0VOVFJBTF9ESVJFQ1RPUlk7Ci0gICAgICAgICAgcmVhZGVyLmN1cnNvciA9IG9mZnNldDsKLSAgICAgICAgICB0aGlzLT5vZnNjZCA9IHJlYWRFbmRpYW5EZXA0KHJlYWRlcik7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHRoaXMtPm9mc2NkID0gLTE7Ci19Ci0KLXZvaWQgWmlwQXJjaGl2ZTo6YWRkRmlsZXMoKSB7Ci0gIHNpbnQzMiB0ZW1wID0gb2ZzY2Q7Ci0gIAotICBSZWFkZXIgcmVhZGVyKGJ5dGVzKTsKLSAgcmVhZGVyLmN1cnNvciA9IHRlbXA7Ci0KLSAgd2hpbGUgKHRydWUpIHsKLSAgICBpZiAobWVtY21wKGJ5dGVzLT5lbGVtZW50cyArIHRlbXAsIEhEUl9DRU5UUkFMLCA0KSkgcmV0dXJuOwotICAgIFppcEZpbGUqIHB0ciA9IG5ldyhhbGxvY2F0b3IsICJaaXBGaWxlIikgWmlwRmlsZSgpOwotICAgIHJlYWRlci5jdXJzb3IgPSB0ZW1wICsgNCArIENfQ09NUFJFU1NJT05fTUVUSE9EOwotICAgIHB0ci0+Y29tcHJlc3Npb25NZXRob2QgPSByZWFkRW5kaWFuRGVwMihyZWFkZXIpOwotICAgIAotICAgIHJlYWRlci5jdXJzb3IgPSB0ZW1wICsgNCArIENfQ1NJWkU7Ci0gICAgCi0gICAgcHRyLT5jc2l6ZSA9IHJlYWRFbmRpYW5EZXA0KHJlYWRlcik7Ci0gICAgcHRyLT51Y3NpemUgPSByZWFkRW5kaWFuRGVwNChyZWFkZXIpOwotICAgIHB0ci0+ZmlsZW5hbWVMZW5ndGggPSByZWFkRW5kaWFuRGVwMihyZWFkZXIpOwotICAgIHB0ci0+ZXh0cmFGaWVsZExlbmd0aCA9IHJlYWRFbmRpYW5EZXAyKHJlYWRlcik7Ci0gICAgcHRyLT5maWxlQ29tbWVudExlbmd0aCA9IHJlYWRFbmRpYW5EZXAyKHJlYWRlcik7Ci0KLSAgICByZWFkZXIuY3Vyc29yID0gdGVtcCArIDQgKyBDX1JPTEg7Ci0gICAgcHRyLT5yb2xoID0gcmVhZEVuZGlhbkRlcDQocmVhZGVyKTsKLQotICAgIHRlbXAgPSB0ZW1wICsgNCArIENFTlRSQUxfRElSRUNUT1JZX0ZJTEVfSEVBREVSX1NJWkU7Ci0KLSAgICBpZiAoKHB0ci0+ZmlsZW5hbWVMZW5ndGggPiAxMDI0KSB8fCAKLSAgICAgICAgKHJlYWRlci5tYXggLSB0ZW1wKSA8IHB0ci0+ZmlsZW5hbWVMZW5ndGgpCi0gICAgICByZXR1cm47Ci0KLSAgICBwdHItPmZpbGVuYW1lID0gKGNoYXIqKWFsbG9jYXRvci5BbGxvY2F0ZShwdHItPmZpbGVuYW1lTGVuZ3RoICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWmlwIGZpbGUgbmFtZSIpOwotICAgIG1lbWNweShwdHItPmZpbGVuYW1lLCBieXRlcy0+ZWxlbWVudHMgKyB0ZW1wLAotICAgICAgICAgICBwdHItPmZpbGVuYW1lTGVuZ3RoKTsKLSAgICBwdHItPmZpbGVuYW1lW3B0ci0+ZmlsZW5hbWVMZW5ndGhdID0gMDsKLQotICAgIGlmIChwdHItPmZpbGVuYW1lW3B0ci0+ZmlsZW5hbWVMZW5ndGggLSAxXSAhPSBQQVRIX1NFUEFSQVRPUikgewotICAgICAgZmlsZXRhYmxlLmluc2VydChzdGQ6Om1ha2VfcGFpcihwdHItPmZpbGVuYW1lLCBwdHIpKTsKLSAgICB9Ci0KLSAgICB0ZW1wID0gdGVtcCArIHB0ci0+ZmlsZW5hbWVMZW5ndGggKyBwdHItPmV4dHJhRmllbGRMZW5ndGggKyAKLSAgICAgIHB0ci0+ZmlsZUNvbW1lbnRMZW5ndGg7Ci0gIH0KLX0KLQotc2ludDMyIFppcEFyY2hpdmU6OnJlYWRGaWxlKENsYXNzQnl0ZXMqIGFycmF5LCBjb25zdCBaaXBGaWxlKiBmaWxlKSB7Ci0gIHVpbnQzMiBieXRlc0xlZnQgPSAwOwotICB1aW50MzIgZmlsZW5hbWVMZW5ndGggPSAwOwotICB1aW50MzIgZXh0cmFGaWVsZExlbmd0aCA9IDA7Ci0gIHVpbnQzMiB0ZW1wID0gMDsKLQotICBSZWFkZXIgcmVhZGVyKGJ5dGVzKTsKLSAgcmVhZGVyLmN1cnNvciA9IGZpbGUtPnJvbGg7Ci0gIAotICBpZiAoIShtZW1jbXAoYnl0ZXMtPmVsZW1lbnRzICsgZmlsZS0+cm9saCwgSERSX0xPQ0FMLCA0KSkpIHsKLSAgICByZWFkZXIuY3Vyc29yICs9IDQ7Ci0gICAgdGVtcCA9IHJlYWRlci5jdXJzb3I7Ci0gICAgcmVhZGVyLmN1cnNvciArPSBMX0ZJTEVOQU1FX0xFTkdUSDsKLSAgICBmaWxlbmFtZUxlbmd0aCA9IHJlYWRFbmRpYW5EZXAyKHJlYWRlcik7Ci0gICAgZXh0cmFGaWVsZExlbmd0aCA9IHJlYWRFbmRpYW5EZXAyKHJlYWRlcik7Ci0KLSAgICByZWFkZXIuY3Vyc29yID0gCi0gICAgICB0ZW1wICsgZXh0cmFGaWVsZExlbmd0aCArIGZpbGVuYW1lTGVuZ3RoICsgTE9DQUxfRklMRV9IRUFERVJfU0laRTsKLQotICAgIGlmIChmaWxlLT5jb21wcmVzc2lvbk1ldGhvZCA9PSBaSVBfU1RPUkUpIHsKLSAgICAgIG1lbWNweShhcnJheS0+ZWxlbWVudHMsIGJ5dGVzLT5lbGVtZW50cyArIHJlYWRlci5jdXJzb3IsIGZpbGUtPnVjc2l6ZSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgaWYgKGZpbGUtPmNvbXByZXNzaW9uTWV0aG9kID09IFpJUF9ERUZMQVRFKSB7Ci0gICAgICB6X3N0cmVhbSBzdHJlOwotICAgICAgc2ludDMyIGVyciA9IDA7Ci0gICAgICAKLSAgICAgIGJ5dGVzTGVmdCA9IGZpbGUtPmNzaXplOwotICAgICAgc3RyZS5uZXh0X291dCA9IChCeXRlZiopYXJyYXktPmVsZW1lbnRzOwotICAgICAgc3RyZS5hdmFpbF9vdXQgPSBmaWxlLT51Y3NpemU7Ci0gICAgICBzdHJlLnphbGxvYyA9IDA7Ci0gICAgICBzdHJlLnpmcmVlID0gMDsKLQotICAgICAgZXJyID0gaW5mbGF0ZUluaXQyXygmc3RyZSwgLSBERUZfV0JJVFMsIHpsaWJfdmVyc2lvbiwgc2l6ZW9mKHpfc3RyZWFtKSk7Ci0gIAotICAgICAgaWYgKGVyciAhPSBaX09LKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotCi0gICAgICB3aGlsZSAoYnl0ZXNMZWZ0KSB7Ci0gICAgICAgIHVpbnQzMiBzaXplID0gMDsKLSAgICAgICAgc3RyZS5uZXh0X2luID0gYnl0ZXMtPmVsZW1lbnRzICsgcmVhZGVyLmN1cnNvcjsKLSAgICAgICAgaWYgKGJ5dGVzTGVmdCA+IDEwMjQpIHNpemUgPSAxMDI0OwotICAgICAgICBlbHNlIHNpemUgPSBieXRlc0xlZnQ7Ci0KLSAgICAgICAgdWludDMyIGRpZmYgPSByZWFkZXIubWF4IC0gcmVhZGVyLmN1cnNvcjsKLSAgICAgICAgaWYgKGRpZmYgPCBzaXplKSB7Ci0gICAgICAgICAgc3RyZS5hdmFpbF9pbiA9IGRpZmY7Ci0gICAgICAgICAgcmVhZGVyLmN1cnNvciA9IHJlYWRlci5tYXg7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3RyZS5hdmFpbF9pbiA9IHNpemU7Ci0gICAgICAgICAgcmVhZGVyLmN1cnNvciArPSBzaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJ5dGVzTGVmdCA+IHNpemUpIHsKLSAgICAgICAgICBlcnIgPSBpbmZsYXRlKCZzdHJlLCBaX1BBUlRJQUxfRkxVU0gpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGVyciA9IGluZmxhdGUoJnN0cmUsIFpfRklOSVNIKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJ5dGVzTGVmdCA9IGJ5dGVzTGVmdCAtIHNpemU7Ci0gICAgICB9Ci0KLSAgICAgIGluZmxhdGVFbmQoJnN0cmUpOwotCi0gICAgICBpZiAoKGVyciAhPSBaX1NUUkVBTV9FTkQpICYmIAotICAgICAgICAgIChieXRlc0xlZnQgfHwgZXJyICE9IFpfQlVGX0VSUk9SIHx8IHN0cmUuYXZhaWxfb3V0KSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvSjMvVk1Db3JlL1ppcC5oIGIvdm1raXQvbGliL0ozL1ZNQ29yZS9aaXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU3YWU4Ny4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvSjMvVk1Db3JlL1ppcC5oCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLS0tLSBaaXAuaCAtIEludGVyZmFjZSB3aXRoIHpsaWIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIEpOSlZNX1pJUF9ICi0jZGVmaW5lIEpOSlZNX1pJUF9ICi0KLSNpbmNsdWRlIDxtYXA+Ci0KLSNpbmNsdWRlICJtdm0vQWxsb2NhdG9yLmgiCi0KLW5hbWVzcGFjZSBqMyB7Ci0KLWNsYXNzIGNsYXNzQnl0ZXM7Ci1jbGFzcyBKbmp2bUJvb3RzdHJhcExvYWRlcjsKLQotc3RydWN0IFppcEZpbGUgOiBwdWJsaWMgbXZtOjpQZXJtYW5lbnRPYmplY3QgewotICBjaGFyKiBmaWxlbmFtZTsKLSAgaW50IHVjc2l6ZTsKLSAgaW50IGNzaXplOwotICB1aW50MzIgZmlsZW5hbWVMZW5ndGg7Ci0gIHVpbnQzMiBleHRyYUZpZWxkTGVuZ3RoOwotICB1aW50MzIgZmlsZUNvbW1lbnRMZW5ndGg7Ci0gIGludCByb2xoOwotICBpbnQgY29tcHJlc3Npb25NZXRob2Q7Ci19OwotCi0KLQotY2xhc3MgWmlwQXJjaGl2ZSA6IHB1YmxpYyBtdm06OlBlcm1hbmVudE9iamVjdCB7Ci0gIAotICBtdm06OkJ1bXBQdHJBbGxvY2F0b3ImIGFsbG9jYXRvcjsKLQotICBzdHJ1Y3QgbHRzdHIKLSAgewotICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIGNvbnN0Ci0gICAgewotICAgICAgcmV0dXJuIHN0cmNtcChzMSwgczIpIDwgMDsKLSAgICB9Ci0gIH07Ci0gIAotICBpbnQgb2ZzY2Q7Ci0KLXB1YmxpYzoKLSAgc3RkOjptYXA8Y29uc3QgY2hhciosIFppcEZpbGUqLCBsdHN0cj4gZmlsZXRhYmxlOwotICB0eXBlZGVmIHN0ZDo6bWFwPGNvbnN0IGNoYXIqLCBaaXBGaWxlKiwgbHRzdHI+OjppdGVyYXRvciB0YWJsZV9pdGVyYXRvcjsKLSAgQ2xhc3NCeXRlcyogYnl0ZXM7Ci0KLXByaXZhdGU6Ci0gIAotICB2b2lkIGZpbmRPZnNjZCgpOwotICB2b2lkIGFkZEZpbGVzKCk7Ci0gIAotICB2b2lkIHJlbW92ZSgpOwotCi1wdWJsaWM6Ci0gIAotICB+WmlwQXJjaGl2ZSgpIHsKLSAgICBmb3IgKHRhYmxlX2l0ZXJhdG9yIEkgPSBmaWxldGFibGUuYmVnaW4oKSwgRSA9IGZpbGV0YWJsZS5lbmQoKTsgSSAhPSBFOyAKLSAgICAgICAgICsrSSkgewotICAgICAgYWxsb2NhdG9yLkRlYWxsb2NhdGUoKHZvaWQqKUktPmZpcnN0KTsKLSAgICAgIEktPnNlY29uZC0+flppcEZpbGUoKTsKLSAgICAgIGFsbG9jYXRvci5EZWFsbG9jYXRlKCh2b2lkKilJLT5zZWNvbmQpOwotICAgIH0KLSAgfQotCi0gIGludCBnZXRPZnNjZCgpIHsgcmV0dXJuIG9mc2NkOyB9Ci0gIFppcEFyY2hpdmUoQ2xhc3NCeXRlcyogYnl0ZXMsIG12bTo6QnVtcFB0ckFsbG9jYXRvciYgYWxsb2NhdG9yKTsKLSAgWmlwRmlsZSogZ2V0RmlsZShjb25zdCBjaGFyKiBmaWxlbmFtZSk7Ci0gIGludCByZWFkRmlsZShDbGFzc0J5dGVzKiBhcnJheSwgY29uc3QgWmlwRmlsZSogZmlsZSk7Ci0KLX07Ci0KLX0gLy8gZW5kIG5hbWVzcGFjZSBqMwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9NYWtlZmlsZSBiL3Zta2l0L2xpYi9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQxOTE1Ny4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIz09PS0gbGliL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIwotIyAKLSMgICAgICAgICAgICAgICAgICAgICBUaGUgdm1raXQgcHJvamVjdAotIwotIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLSMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotIyAKLSMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCi1MRVZFTCA9IC4uCi0KLVBBUkFMTEVMX0RJUlMgPSBNdm0KLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb25maWcKLQotaWZlcSAoJChXSVRIX0ozKSwgMSkKLVBBUkFMTEVMX0RJUlMgKz0gSjMKLWVuZGlmCi0KLWlmZXEgKCQoV0lUSF9OMyksIDEpCi1QQVJBTExFTF9ESVJTICs9IE4zCi1lbmRpZgotCi1pZmVxICgkKFdJVEhfUDMpLCAxKQotUEFSQUxMRUxfRElSUyArPSBwMwotZW5kaWYKLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KLQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL012bS9BbGxvY2F0b3IvTWFrZWZpbGUgYi92bWtpdC9saWIvTXZtL0FsbG9jYXRvci9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIxY2UxMi4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTXZtL0FsbG9jYXRvci9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjPT09LSBsaWIvTXZtL0FsbG9jYXRvci9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCi0jIAotIyAgICAgICAgICAgICAgICAgICAgIFRoZSB2bWtpdCBwcm9qZWN0Ci0jCi0jIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0jIAotIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKLUxFVkVMID0gLi4vLi4vLi4KLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb25maWcKLQotaWZlcSAoJChXSVRIX0xMVk1fR0NDKSwgMSkKLSAgTU9EVUxFX05BTUUgPSBBbGxvY2F0b3IKLWVsc2UKLSAgTElCUkFSWU5BTUUgPSBBbGxvY2F0b3IKLWVuZGlmCi0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCi0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9Ndm0vQWxsb2NhdG9yL1JFQURNRS50eHQgYi92bWtpdC9saWIvTXZtL0FsbG9jYXRvci9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTgzZjUyLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9Ndm0vQWxsb2NhdG9yL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIE1pY3JvLVZNIEFsbG9jYXRvcgotIyBieSBDaGFybGVzIENs6W1lbnQsIGNvcnJlY3RlZCBieSBHYetsIFRob21hcy4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0KLUkgTWVtb3J5IGxheW91dAotICAxIEV4cG9uYW50aWFsIGFyZWEKLSAgMiBMaW5lYXIgYXJlYQotICAzIE1tYXAgYXJlYQotSUkgU3RydWN0dXJlCi0gIDEgUmVmZXJlbmNpbmcgbWVtb3J5IGNodW5rcwotICAyIEhhcnNoIHRhYmxlcwotSUlJIEludGVybmFsIG1lbW9yeSBtYW5hZ2VtZW50Ci0KLUkgTWVtb3J5IGxheW91dAotIy0tLS0tLS0tLS0tLS0tCi0KLUJhc2VkIG9uIHRoZSBzaXplIG9mIHRoZSBvYmplY3RzIHRvIGFsbG9jYXRlLCB0aGUgYWxsb2NhdG9yIGNob29zZXMgYmV0d2VlbgotdGhyZWUgZGlzdGluY3RzIGFyZWEuCi1pKSBUaGUgZXhwb25hbnRpYWwgYXJlYSBmb3Igb2JqZWN0cyBsZXNzIHRoYW4gbWF4X2V4cCBieXRlcwotaWkpIFRoZSBsaW5lYXIgYXJlYSBmb3IgeCBpbiBtYXhfZXhwIDwgeCA8IG1heF9saW4gYnl0ZXMKLWlpaSkgVGhlIG1tYXAgYXJlYSBmb3IgTElOIGJ5dGVzIDwgeAotCi1NYXhfZXhwIGFuZCBtYXhfbGluIGFyZSBhY3R1YWxseSBkZWZpbmVkIHRvIDMyIGFuZCA4MTkyIGJ5dGVzLgotCi1JLjEgRXhwb25hbnRpYWwgYXJlYToKLU9iamVjdHMgc3RvcmVkIGluIHRoYXQgYXJlYSBhcmUgYWxsb2NhdGVkIDJebiBieXRlcywgdGhlIHNtYWxsZXN0IHBvd2VyIG9mIHR3bwotaW4gd2hpY2ggdGhlIG9iamVjdCBjYW4gZml0LgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi18IFNpemUgdG8gYWxsb2NhdGUgfCByZXNlcnZlZCBzcGFjZSB8Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gMSAgICAgICAgICAgICAgICAgIDIKLSAyICAgICAgICAgICAgICAgICAgMgotIDMgICAgICAgICAgICAgICAgICA0Ci0gNCAgICAgICAgICAgICAgICAgIDQKLSB7NSw2LDcsOH0gICAgICAgICAgOAotIHs5LTE2fSAgICAgICAgICAgICAxNgotIHsxNy0zMn0gICAgICAgICAgICAzMgotCi0tPiBTaXplIG9mIGFsbG9jYXRlZCBjaHVuayBpbiB0aGlzIGFyZWEgZ3Jvd3MgZXhwb25hbnRpYWxseS4KLVdpdGggbWF4X2V4cCA9IDMyIGJ5dGVzCi0KLUkuMiBMaW5lYXIgYXJlYToKLUluIHRoZSBsaW5lYXIgYXJlYSwgdGhlIHNpemUgbmVlZGVkIHRvIGJlIGFsbG9jYXRlZCBpcyByb3VuZGVkIHRvIHRoZSBuZXh0Ci1tYXhfZXhwIG11bHRpcGxlLiBUaGlzIGlzIHRvIHJlZHVjZSBtZW1vcnkgbG9zcywgYXMgb3RoZXJ3aXNlLCB3aXRoIHRoZQotcHJldmlvdXMgdGVjaG5pcXVlIGFsbG9jYXRpbmcgMjYwIGJ5dGVzIHdvdWxkIGluZHVjZSB0byBvY2N1cHkgYSA1MTIgYnl0ZXMKLWFyZWEuCi0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICB8ICAzMiAgfCAgIDY0ICAgfCAgOTYgIHwgIDEyOCAgfCAgLi4uCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbWF4X2V4cCoxICAgICoyICAgICAgKjMgICAgICAqNAotCi0tPiBTaXplIG9mIGFsbG9jYXRlZCBjaHVuayBpbiB0aGlzIGFyZWEgZ3Jvd3MgbGluZWFybHkuCi0KLUkuMyBNbWFwIGFyZWE6Ci1Gb3Igb2JqZWN0cyBsYXJnZXIgdGhhbiAyXjEzICg4MTkyKSBieXRlcywgYSBudW1iZXIgb2YgcGh5c2ljYWwgcGFnZSBpcwotYXNzb2NpYXRlZCwgdGh1cyBhIG11bHRpcGxpZXIgb2YgNDA5NiBieXRlcy4KLQotCi1JSSBEZXNjcmlwdG9ycwotIy0tLS0tLS0tLS0tLS0KLQotSUkuMSBIYXNoIHRhYmxlczoKLQotSW4gb3JkZXIgdG8ga2VlcCB0cmFjayBvZiBhbGxvY2F0ZWQgbWVtb3J5IGFkcmVzc2VzLCB3ZSBuZWVkIHRvIHN0b3JlIHRoZQotYWRyZXNzZXMgdGhhdCB3ZSBhbGxvY2F0ZWQuIFRoaXMgaXMgYSByZXF1aXJlbWVudCBmb3IgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLCBhcwotdGhlIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgQyBBQkkgaW1wbGllcyB0aGF0IGEgbWVtb3J5IHJlZmVyZW5jZSBpcwotaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhIHZhbHVlLiBIZW5jZSwgZXZlcnkgcGFnZSBkZXNjcmlwdG9yIGlzIGluc2VydGVkIGluIGEKLWhhc2ggdGFibGUgd2hlbiBhbGxvY2F0ZWQuCi1UaGlzIGhhcyBhIGxpbWl0YXRpb24sIGFzIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBtYWtlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYQotdmFsdWUgaW4gdGhlIGhlYXAgdGhhdCB3b3VsZCBwb2ludCB0byBhbiBhY3R1YWwgYWxsb2NhdGVkIHNwYWNlIGluIG1lbW9yeSBpZgotdHJhbnNsYXRlZCBpbnRvIGEgcG9pbnRlci4KLQotCi1JSS4yIFJlZmVyZW5jaW5nIG1lbW9yeSBjaHVua3M6Ci1IZXJlIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhbiBhZHJlc3MgaW4gbWVtb3J5IDoKLQotICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVBvaW50ZXI6IHwgICAgVGFibGUgRW50cnkgICAgIHwgIFBhZ2UgRGVzY3JpcHRvciAgfCAgICAgICBJbmRleCAgICAgfAotICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICB8ICAgICBfXyAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgfCAgICB8ICB8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgfAotICAgICAgICAgICAgIHwgICAgfF9ffCAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAgICAgICB8ICAgIHwgIHwgICAgR0NIYXNoU2V0ICAgICBcfC8gICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgfCAgICB8X198ICAgICAgIF9fIF9fIF9fIF9fIF9fIF9fICAgICAgICAgICAgICAgfAotICAgICAgICAgICAgICAtLS0+fCAgfC0tLS0tPnxfX3xfX3xfX3xfX3xfX3xfX3wgICAgICAgICAgICAgIHwKLSAgICAgICAgICAgICAgICAgIHxfX3wgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgICAgICB8ICB8ICAgICAgICAgICAgICAgICAgICB8ICAgIEdDUGFnZSAgICAgICBcfC8KLSAgICAgICAgICAgICAgICAgIHxfX3wgICAgICAgICAgICAgICAgICAgIHwgICAgICBfXyBfXyBfXyBfXyBfXyBfXwotICAgICAgICAgICBHQ0hhc2ggICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0+fF9ffF9ffF9ffF9ffF9ffF9ffCBIZWFkZXJzCi0KLQotTWVtb3J5IGlzIHNlcGFyYXRlZCBpbiBzcGFjZXMuIEVhY2ggc3BhY2UgY29udGFpbnMgbWVtb3J5IGNodW5rIG9mIHRoZSBzYW1lCi1zaXplLiBXaGVuIHRoZSBhbGxvY2F0b3IgbmVlZHMgdG8gYWxsb2NhdGUgbiBieXRlcywgaXQgY2hvb3NlIGEgbWVtb3J5IHNwYWNlCi1pbiBhbiBleHBvbmVudGlhbCwgbGluZWFyIG9yIG1tYXBlZCBzcGFjZSBhbmQgcm91bmQgbiB0byB0aGUgc2l6ZSBvZiB0aGlzCi1zcGFjZS4gVGhpcyB0ZWNobmlxdWUgaXMgdXNlZCB0byBjb25zdHJ1Y3QgYSBwZXJmb3JtYW50IGhhc2h0YWJsZSBvZiBhbGwKLWFsbG9jYXRlZCBtZW1vcnkgY2h1bmtzLCB3aGljaCBpcyB1c2VkIHRvIGlkZW50aWZ5IHBvaW50ZXIgZHVyaW5nIGEgY29sbGVjdGlvbgotKHRoZSBnYXJiYWdlIGNvbGxlY3RvciBpcyBvbmx5IGNvbnNlcnZhdGl2ZSkuCi0KLVRoZSBmaXJzdCBiaXRzIG9mIGEgbWVtb3J5IGNodW5rIHBvaW50ZXIgcmVmZXJlbmNlIGFuIGVudHJ5IGluIEdDSGFzaCwgYW5kCi10aGUgbmV4dCBiaXRzIHJlZmVyZW5jZSBhbiBlbnRyeSBpbiBHQ0hhc2hTZXQuIEVhY2ggZW50cnkgaW4gR0NIYXNoU2V0IGlzIGEKLUdDUGFnZSBzdHJ1Y3R1cmUsIHdoaWNoIGRlc2NyaWJlcyBhIHNldCBvZiBjb250aWd1b3VzIHBhZ2VzIChhIG1lbW9yeSBzcGFjZSkuCi0KLVRoZSBHQ1BhZ2UgQ2xhc3MgaG9sZHMgYSBmaWVsZCAoR0NDaHVua05vZGUqKV9oZWFkZXJzIGNvbnRhaW5pbmcgdGhlIGxpc3QgdG8KLWFsbCBoZWFkZXJzIG9mIGZyZWUgY2h1bmtzIG9mIHRoZSBzcGFjZS4gSXQgYWxzbyBob2xkcyB0aGUgc2l6ZSBvZiB0aGUgc3BhY2UKLWluIF9jaHVua19uYmIuIFRoaXMgc2l6ZSBpcyB0aGUgcm91bmRlZCBzaXplIChleHAgb3IgbGluZWFyKSBvZiBhbGwgbWVtb3J5Ci1jaHVua3MgbWFuYWdlZCBpbiB0aGlzIHNwYWNlLgotCi1fTm90ZV86Ci1UaGlzIGlzIG5vdCB0aGUgY2FzZSBmb3Igc3BhY2UgYWxsb2NhdGVkIGluIHRoZSBtbWFwIGFyZWEsIHdob3NlIHBhZ2UKLWRlc2NyaXB0b3IgaG9sZHMgZGlyZWN0bHkgdGhlIGhlYWRlciBpdHNlbGYuCi0KLUEgaGVhZGVyIGlzIGRlc2NyaWJlZCBieSB0aGUgY2xhc3MgR0NDaHVua05vZGUuIEl0IGhvbGRzIHRoZSBzaXplIF9uYmJfbWFyayBvZgotbWVtb3J5IGNodW5rcyBpbiB0aGUgbGFzdCAyOSBiaXRzICh0aGUgMyBsYXN0IG9uZXMgYXJlIHVzZWQgYnkgdGhlIGdhcmJhZ2UKLWNvbGxlY3RvciB0byBzZXQgdGhlICpjb2xvciogb2YgdGhlIGNodW5rKS4gR0NDaHVua05vZGUgYXJlIHN0b3JlZCBpbiBhCi1jaXJjdWxhciBkb3VibGUgbGlua2VkIGxpc3QuCi0KLQotSUlJIEludGVybmFsIG1lbW9yeSBtYW5hZ2VtZW50Ci0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIGFsbG9jYXRvciBoYXMgdG8gYWxsb2NhdGUgaXRzIG1lbW1vcnkgc3RydWN0dXJlcyBpdHNlbGYuIEl0IGlzIHJlc3BvbnNpYmxlCi10byBhbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciB0aGUgbWljcm8tdm0gYW5kIHRoZSBzdHJ1Y3R1cmVzIG5lZWRlZCB0byBtYW5hZ2UKLWFuZCBhY2Nlc3MgdGhlIGFsbG9jYXRlZCBhcmVhcy4KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9Ndm0vQWxsb2NhdG9yL2djYWxsb2MuY3BwIGIvdm1raXQvbGliL012bS9BbGxvY2F0b3IvZ2NhbGxvYy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmOTdjMGYuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL012bS9BbGxvY2F0b3IvZ2NhbGxvYy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLS0gZ2NhbGxvYy5jYyAtIE12bSBhbGxvY2F0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE12bQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJnY2FsbG9jLmgiCi0jaW5jbHVkZSAidHlwZXMuaCIKLQotR0NDaHVua05vZGUgKkdDQWxsb2NhdG9yOjphbGxvY19oZWFkZXJzKHVpbnRwdHJfdCBoZWFkZXJzX25iYiwgdm9pZCAqYmFzZSwgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBkZXBsLCB1aW50cHRyX3QgZmlsbGVkKSB7Ci0JR0NDaHVua05vZGUgKmhlYWRlcnM7Ci0JdWludHB0cl90IHJvdW5kZWQgPSBHQ01hcHBlZEFyZWE6OnJvdW5kKGhlYWRlcnNfbmJiKTsKLQkKLQlpZihoZWFkZXJzX25iYiA9PSByb3VuZGVkKQotCQloZWFkZXJzID0gKEdDQ2h1bmtOb2RlICopKG5ldyBHQ01hcHBlZEFyZWEoJmhlYWRlcnNfYXJlYSwgcm91bmRlZCkpLT5hcmVhKCk7Ci0JZWxzZSB7Ci0JCWhlYWRlcnMgPSB1c2VkX2hlYWRlcnM7Ci0JCXVzZWRfaGVhZGVycyA9IChHQ0NodW5rTm9kZSAqKSgodWludHB0cl90KXVzZWRfaGVhZGVycyArIGhlYWRlcnNfbmJiKTsKLQkJaWYodXNlZF9oZWFkZXJzID49IG1heF9oZWFkZXJzKSB7Ci0JCQloZWFkZXJzID0gKEdDQ2h1bmtOb2RlICopKG5ldyBHQ01hcHBlZEFyZWEoJmhlYWRlcnNfYXJlYSwgdXNlZF9oZWFkZXJzX25iYikpLT5hcmVhKCk7Ci0JCQl1c2VkX2hlYWRlcnMgPSAoR0NDaHVua05vZGUgKikoKHVpbnRwdHJfdCloZWFkZXJzICsgaGVhZGVyc19uYmIpOwotCQkJbWF4X2hlYWRlcnMgPSAoR0NDaHVua05vZGUgKikoKHVpbnRwdHJfdCloZWFkZXJzICsgdXNlZF9oZWFkZXJzX25iYik7Ci0JCX0KLQl9Ci0KLQlyZWdpc3RlciBHQ0NodW5rTm9kZSAqY3VyID0gaGVhZGVyczsKLQlyZWdpc3RlciBHQ0NodW5rTm9kZSAqbGltID0gKEdDQ2h1bmtOb2RlICopKCh1aW50cHRyX3QpaGVhZGVycyArIGhlYWRlcnNfbmJiKTsKLQlyZWdpc3RlciBHQ0NodW5rTm9kZSAqbWF4ID0gbGltIC0gKDEgKyBmaWxsZWQpOwotCWZvcig7Y3VyPG1heDsgY3VyKyspIHsKLQkJY3VyLT5pbml0aWFsaXNlKGN1cisxLCBiYXNlKTsKLQkJYmFzZSA9ICh2b2lkICopKCh1aW50cHRyX3QpYmFzZSArIGRlcGwpOwotCX0KLQlmb3IoO2N1cjxsaW07IGN1cisrKSB7Ci0gCQljdXItPmluaXRpYWxpc2UoMCwgYmFzZSk7Ci0JCWJhc2UgPSAodm9pZCAqKSgodWludHB0cl90KWJhc2UgKyBkZXBsKTsKLSAJfQotCXJldHVybiBoZWFkZXJzOwotfQotCi1HQ0NodW5rTm9kZQkqR0NBbGxvY2F0b3I6OmFsbG9jX2xpc3QoR0NGcmVlTGlzdCAqZmwsIHVpbnRwdHJfdCBuKSB7Ci0gCUdDQ2h1bmtOb2RlCSAgKmhlYWRlcnM7Ci0gCXVpbnRwdHJfdAkJCQlhcmVhX25iYjsKLSAJdm9pZCAgICAgICAgICAqYXJlYV9wdHI7Ci0gCUdDUGFnZSAgICAgICAJKnBhZ2U7Ci0KLQlpZihHQ0ZyZWVMaXN0RmluZGVyOjppc01tYXBlZChuKSkgewotIAkJYXJlYV9uYmIgPSBHQ01hcHBlZEFyZWE6OnJvdW5kKG4pOwotCi0gCQkvKiBvbiBhbGxvdWUgdW4gRGVzY3JpcHRldXIgKi8KLSAJCXBhZ2UgPSBuZXcgR0NEZXNjcmlwdG9yTWFwcGVkQ2h1bmsoJm5vcm1hbF9hcmVhLCBhcmVhX25iYiwgYXJlYV9uYmIpOwotICAJCWFyZWFfcHRyID0gcGFnZS0+YXJlYSgpOwotCi0gCQloZWFkZXJzID0gcGFnZS0+aGVhZGVycygpOwotICAJfSBlbHNlIHsKLSAgCQl1aW50cHRyX3QgY2h1bmtfbmJiID0gZmwtPmNodW5rX25iYigpOwotCi0JCQkvKiBvbiBhbGxvdWUgdW4gRGVzY3JpcHRldXIgKi8KLQkJCXBhZ2UgPSBuZXcgR0NQYWdlKCZub3JtYWxfYXJlYSwgYXJlYV9uYmIgPSBmbC0+YXJlYV9uYmIoKSwgY2h1bmtfbmJiKTsKLQotCQkJYXJlYV9wdHIgPSBwYWdlLT5hcmVhKCk7Ci0KLQkJCS8qIG9uIGFsbG91ZSBkZXMgaGVhZGVycyAqLwotCQkJaGVhZGVycyA9IGFsbG9jX2hlYWRlcnMoZmwtPmhlYWRlcnNfbmJiKCksIGFyZWFfcHRyLCBjaHVua19uYmIsIGZsLT5maWxsZWQoKSk7Ci0KLSAgCQlwYWdlLT5oZWFkZXJzKGhlYWRlcnMpOwotICAJfQotCi0gCS8qIG9uIGhhc2ggbm90cmUgbm91dmVhdSBjaHVuayAqLwotIAlHQ0hhc2g6Omhhc2hfdW5wcm90ZWN0ZWQocGFnZSwgYXJlYV9wdHIsIGFyZWFfbmJiLCBhcmVhX25iYik7Ci0JCi0JZmwtPmxpc3QoaGVhZGVycyk7Ci0JcmV0dXJuIGhlYWRlcnM7Ci19Ci0KLSNkZWZpbmUgbWluKGEsIGIpICAgKChhKSA8IChiKSA/IChhKSA6IChiKSkKLSNkZWZpbmUgbWF4KGEsIGIpICAgKChhKSA8IChiKSA/IChiKSA6IChhKSkKLQotR0NGcmVlTGlzdEZpbmRlcjo6R0NGcmVlTGlzdEZpbmRlcigpIHsKLSAJdW5zaWduZWQgaW50CWksIGosIG07Ci0gCUdDRnJlZUxpc3QJCSpjdXI7Ci0KLSAJZm9yKGk9MDsgaTw9bWluX2V4cDsgaSsrKQotIAkJZXhwX2xpc3RzW2ldID0gX2V4cF9saXN0czsKLSAJX2V4cF9saXN0c1swXS5pbml0aWFsaXNlKG1pbl9leHAsIDEyOCptaW5fZXhwKTsKLQotIAlmb3IoaT1taW5fZXhwX2xvZywgY3VyPV9leHBfbGlzdHMrMTsgaTxtYXhfZXhwX2xvZzsgaSsrLCBjdXIrKykgewotIAkJbSA9IDEgPDwgKGkgKyAxKTsKLSAJCWN1ci0+aW5pdGlhbGlzZShtLCA1MTIqbSk7Ci0gCQlmb3Ioaj0xPDxpOyBqPG07IGorKykKLSAJCQlleHBfbGlzdHNbaisxXSA9IGN1cjsKLSAJfQotCi0gCWZvcihpPTA7aTxuYl9saW47IGkrKykgewotIAkJbSA9ICgoaSsxKTw8bGluX3N0ZXBfbG9nKSArIG1heF9leHA7Ci0gCQlsaW5fbGlzdHNbaV0uaW5pdGlhbGlzZShtLCBtaW4oMTI4Km0sIDY1NTM2KSk7Ci0gCX0KLQotIAkvLwlmb3IoaT0wOyBpPG1heF9saW4rMjsgaSsrKQotIAkvLwkJcHJpbnRmKCIlZCA9PiAlZFxuIiwgaSwgZmluZChpKS0+Y2h1bmtfbmJiKCkpOwotfQotCi0KLUdDQWxsb2NhdG9yOjpHQ0FsbG9jYXRvcigpIHsKLSAJdXNlZF9oZWFkZXJzID0gMDsKLSAJbWF4X2hlYWRlcnMgPSAwOwotIAlHQ0hhc2g6OmluaXRpYWxpc2UoKTsKLX0KLQotR0NBbGxvY2F0b3I6On5HQ0FsbG9jYXRvcigpIHsKLSAJR0NNYXBwZWRBcmVhICpjdXI7Ci0KLSAJZm9yKGN1cj1ub3JtYWxfYXJlYS5uZXh0KCk7IGN1ciE9Jm5vcm1hbF9hcmVhOyBjdXI9Y3VyLT5uZXh0KCkpCi0gCQlkZWxldGUgY3VyLT5tdW5tYXAoKTsKLQotIAlmb3IoY3VyPWhlYWRlcnNfYXJlYS5uZXh0KCk7IGN1ciE9JmhlYWRlcnNfYXJlYTsgY3VyPWN1ci0+bmV4dCgpKQotIAkJZGVsZXRlIGN1ci0+bXVubWFwKCk7Ci0KLSAJZm9yKGN1cj1tYXBwZWRfYXJlYS5uZXh0KCk7IGN1ciE9Jm1hcHBlZF9hcmVhOyBjdXI9Y3VyLT5uZXh0KCkpCi0gCQlkZWxldGUgY3VyLT5tdW5tYXAoKTsKLQlHQ0hhc2g6OnVubGluaygpOwotfQotCi12b2lkICpHQ0FsbG9jYXRvcjo6b3BlcmF0b3IgbmV3KHVpbnRwdHJfdCByZXEpIHsKLQl1aW50cHRyX3QgbmJiID0gR0NNYXBwZWRBcmVhOjpyb3VuZChyZXEpOwotCUdDQWxsb2NhdG9yICpyZXMgPSAoR0NBbGxvY2F0b3IgKilHQ01hcHBlZEFyZWE6OmRvX21tYXAobmJiKTsKLQlyZXMtPm15X3NpemUgPSBuYmI7Ci0JcmV0dXJuIHJlczsKLX0KLQotdm9pZCBHQ0FsbG9jYXRvcjo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKnB0cikgewotCUdDTWFwcGVkQXJlYTo6ZG9fbXVubWFwKHB0ciwgKChHQ0FsbG9jYXRvciAqKXB0ciktPm15X3NpemUpOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL012bS9BbGxvY2F0b3IvZ2NhbGxvYy5oIGIvdm1raXQvbGliL012bS9BbGxvY2F0b3IvZ2NhbGxvYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzAzMjcxLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9Ndm0vQWxsb2NhdG9yL2djYWxsb2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLS0tLS0gZ2NhbGxvYy5oIC0gTXZtIGFsbG9jYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXZtCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2lmbmRlZiBfR0NfQUxMT0NfSF8KLSNkZWZpbmUgX0dDX0FMTE9DX0hfCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4gLyogbWVtc2V0ICovCi0KLSNpbmNsdWRlICJnY2NodW5rLmgiCi0jaW5jbHVkZSAidHlwZXMuaCIKLQotY2xhc3MgR0NGcmVlTGlzdCB7Ci0gCUdDQ2h1bmtOb2RlIAkgKl9saXN0OwotIAl1aW50cHRyX3QJCQkJCV9jaHVua19uYmI7Ci0gCXVpbnRwdHJfdAkJCQkJX2FyZWFfbmJiOwotIAl1aW50cHRyX3QJCQkJCV9uYl9jaHVua3M7Ci0gCXVpbnRwdHJfdAkJCQkJX2hlYWRlcnNfbmJiOwotIAl1aW50cHRyX3QgICAgICAgICAgX2ZpbGxlZDsKLXB1YmxpYzoKLSAJaW5saW5lIEdDRnJlZUxpc3QoKSB7IF9jaHVua19uYmIgPSAwOyBfbmJfY2h1bmtzID0gMTsgfQotCi0gCWlubGluZSB2b2lkCQkJaW5pdGlhbGlzZSh1aW50cHRyX3QgbiwgdWludHB0cl90IGFyZWEpIHsKLSAJCV9saXN0CQkJCQk9IDA7Ci0gCQlfY2h1bmtfbmJiCQk9IG47IAotIAkJX2FyZWFfbmJiCQkJPSBHQ01hcHBlZEFyZWE6OnJvdW5kKGFyZWEpOyAvKiB0YWlsbGUgZW4gcGFnZXMgdXRpbGlz6WUgcG91ciB1bmUgZnJlZS1saXN0ICovCi0gCQlfbmJfY2h1bmtzCQk9IF9hcmVhX25iYi9fY2h1bmtfbmJiOyAgICAgIC8qIG5vbWJyZSBkZSB0eXBlIHF1ZSBqZSBwZXV4IGNhc2VyIGxhIGRlZGFucyAgKi8KLSAJCS8qIGVzdC1jZSBxdSdpbCByZXN0ZSBkZSBsYSBwbGFjZSBkZXJp6HJlID8gKi8KLSAJCV9maWxsZWQgPSAoX25iX2NodW5rcyAqIF9jaHVua19uYmIpID09IF9hcmVhX25iYiA/IDAgOiAxOwotIAkJLyogaid1dGlsaXNlIHVuICJmYXV4IGhlYWRlciIg4CAwIHBvdXIgY29tcGxldGVyIGNlIHRydWMgKi8KLSAJCV9oZWFkZXJzX25iYgk9IChfbmJfY2h1bmtzICsgX2ZpbGxlZCkqc2l6ZW9mKEdDQ2h1bmtOb2RlKTsKLSAJfQotCi0gCWlubGluZSBHQ0NodW5rTm9kZSAgICAqbGlzdCgpIHsgcmV0dXJuIF9saXN0OyB9Ci0gCWlubGluZSB2b2lkCQkJCQkJbGlzdChHQ0NodW5rTm9kZSAqbCkgeyBfbGlzdCA9IGw7IH0KLSAJaW5saW5lIHVpbnRwdHJfdAkJCQkJbmJfY2h1bmtzKCkJCXsgcmV0dXJuIF9uYl9jaHVua3M7IH0KLSAJaW5saW5lIHVpbnRwdHJfdAkJCQkJY2h1bmtfbmJiKCkJCXsgcmV0dXJuIF9jaHVua19uYmI7IH0KLSAJaW5saW5lIHVpbnRwdHJfdAkJCQkJYXJlYV9uYmIoKQkJeyByZXR1cm4gX2FyZWFfbmJiOyB9Ci0gCWlubGluZSB1aW50cHRyX3QJCQkJCWhlYWRlcnNfbmJiKCkgeyByZXR1cm4gX2hlYWRlcnNfbmJiOyB9Ci0gCWlubGluZSB1aW50cHRyX3QgICAgICAgICBmaWxsZWQoKSAgICAgIHsgcmV0dXJuIF9maWxsZWQ7IH0KLQotIAlpbmxpbmUgdm9pZCByZWplY3QoR0NDaHVua05vZGUgKmhlYWRlcikgewotIAkJaGVhZGVyLT5uZXh0KF9saXN0KTsKLSAJCV9saXN0ID0gaGVhZGVyOwotIAl9Ci19OwotCi1jbGFzcyBHQ0ZyZWVMaXN0RmluZGVyIHsKLSAJLyogdHJvaXMgem9uZXMgZGlzdGluY3RlczogZXhwb25lbnRpZWxsZS9saW5lYWlyZS9tbWFwICovCi0gCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbWluX2V4cF9sb2cgPSAwOwkJCQkJCS8qIDAgIC0+IDQgPT4gNCAqLwotIAlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1heF9leHBfbG9nID0gNTsJCQkJCQkvKiA0ICAtPiAzMiBlbiBleHBvbmVudGllbGxlICovCi0gCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbWF4X2xpbl9sb2cgPSAxMzsJCQkJCQkvKiAzMiAtPiAxMjggZW4gbGlu6WFpcmUgKi8KLSAJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBsaW5fc3RlcF9sb2cgPSA0OwkJCQkJCS8qIHBhciBwYXMgZGUgNCAqLwotIAlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1pbl9leHAgPSAxIDw8IG1pbl9leHBfbG9nOwotIAlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1heF9leHAgPSAxIDw8IG1heF9leHBfbG9nOwotIAlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1heF9saW4gPSAxIDw8IG1heF9saW5fbG9nOwotIAlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50CW5iX2V4cCA9IG1heF9leHBfbG9nIC0gbWluX2V4cF9sb2cgKyAxOwotIAlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5iX2xpbiA9IChtYXhfbGluIC0gbWF4X2V4cCk+Pmxpbl9zdGVwX2xvZzsKLQotIAlHQ0ZyZWVMaXN0CQlfZXhwX2xpc3RzW25iX2V4cF07Ci0gCUdDRnJlZUxpc3QJCSpleHBfbGlzdHNbbWF4X2V4cCsxXTsKLSAJR0NGcmVlTGlzdAkJbGluX2xpc3RzW25iX2xpbl07Ci0gCUdDRnJlZUxpc3QJCW1tYXBfbGlzdDsKLQotIAlpbmxpbmUgdWludHB0cl90IGxpbkVudHJ5KHVpbnRwdHJfdCBuKSB7IHJldHVybiAobiAtIG1heF9leHAgLSAxKT4+bGluX3N0ZXBfbG9nOyB9Ci1wdWJsaWM6Ci0gCUdDRnJlZUxpc3RGaW5kZXIoKTsKLQotIAlzdGF0aWMgaW5saW5lIGJvb2wJCWlzTW1hcGVkKHVpbnRwdHJfdCBuKSB7IHJldHVybiBuPm1heF9saW47IH0KLQotIAlpbmxpbmUgR0NGcmVlTGlzdCAqZmluZCh1aW50cHRyX3QgbikgewotIAkJcmV0dXJuIGlzTW1hcGVkKG4pID8gJm1tYXBfbGlzdCA6IChuPm1heF9leHApID8gbGluX2xpc3RzICsgbGluRW50cnkobikgOiBleHBfbGlzdHNbbl07IAotIAl9Ci19OwotCi1jbGFzcyBHQ0FsbG9jYXRvciB7Ci0gCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQJCXVzZWRfaGVhZGVyc19uYmIgPSAoUEFHRV9TSVpFICsgKDQwOTYqc2l6ZW9mKEdDQ2h1bmtOb2RlKSkgLSAxKSAmIC1QQUdFX1NJWkU7Ci0KLQl1aW50cHRyX3QgICAgbXlfc2l6ZTsKLSAJR0NGcmVlTGlzdEZpbmRlcgl1bmRlZmluZWRfZmluZGVyOwotIAlHQ0ZyZWVMaXN0RmluZGVyCXplcm9fZmlsbGVkX2ZpbmRlcjsKLQotCUdDTWFwcGVkQXJlYQkJbm9ybWFsX2FyZWE7ICAgIC8qIGFyZWEgcG91ciBsZXMgcGV0aXQgY2h1bmsgKi8KLQlHQ01hcHBlZEFyZWEJCW1hcHBlZF9hcmVhOyAgICAvKiBwb3VyIGxlcyBncm9zICovCi0JR0NNYXBwZWRBcmVhCQloZWFkZXJzX2FyZWE7ICAgLyogbGlzdGUgZGVzIG1tYXAgZGVzIGhlYWRlcnMgKi8KLQlHQ0NodW5rTm9kZQkJICAqdXNlZF9oZWFkZXJzOyAgLyogdW5lIGxpc3RlIGRlIGhlYWRlcnMgcG91ciBsZXMgcHJvY2hhaW5lcyBhbGxvY19saXN0ICovCi0JR0NDaHVua05vZGUJCSAgKm1heF9oZWFkZXJzOyAgIC8qIGxhIGxpbWl0ZSAqLwotCi0JR0NDaHVua05vZGUgICAgICphbGxvY19oZWFkZXJzKHVpbnRwdHJfdCwgdm9pZCAqLCB1aW50cHRyX3QsIHVpbnRwdHJfdCk7Ci0JR0NDaHVua05vZGUgICAgICphbGxvY19saXN0KEdDRnJlZUxpc3QgKiwgdWludHB0cl90KTsKLXB1YmxpYzoKLQlHQ0FsbG9jYXRvcigpOwotIAl+R0NBbGxvY2F0b3IoKTsKLQotCXZvaWQgKm9wZXJhdG9yIG5ldyh1aW50cHRyX3QpOwotCXZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKik7Ci0KLSAJaW5saW5lIEdDUGFnZSAgICAgICAgKm8ycGFnZSh2b2lkICpwdHIpIHsgcmV0dXJuIEdDSGFzaDo6Z2V0KHB0cik7IH0KLQotIAlpbmxpbmUgR0NDaHVua05vZGUgKmFsbG9jX2NodW5rKHVpbnRwdHJfdCBuLCBib29sIGlzQ29sLCB1bnNpZ25lZCBpbnQgbSkgewotCQlHQ0ZyZWVMaXN0CQkJICAgICAqZmwgPSB1bmRlZmluZWRfZmluZGVyLmZpbmQobik7Ci0JCXJlZ2lzdGVyIEdDQ2h1bmtOb2RlICpyZXMgPSBmbC0+bGlzdCgpOwotCQkKLQkJaWYoIXJlcykKLQkJCXJlcyA9IGFsbG9jX2xpc3QoZmwsIG4pOwotCQkKLQkJZmwtPmxpc3QocmVzLT5uZXh0KCkpOwotCQlyZXMtPm5iYihuLCBpc0NvbCwgbSk7Ci0KLQkJcmV0dXJuIHJlczsKLSAJfQotCQotIAlpbmxpbmUgdm9pZCByZWplY3RfY2h1bmsoR0NQYWdlICpwYWdlLCBHQ0NodW5rTm9kZSAqaGVhZGVyKSB7Ci0gCQlHQ0ZyZWVMaXN0ICpmbCA9IHVuZGVmaW5lZF9maW5kZXIuZmluZChwYWdlLT5jaHVua19uYmIoKSk7Ci0JCQotIAkJaWYoZmwtPmNodW5rX25iYigpKSB7Ci0JCQkvLwkJCXByaW50ZigiMCBGaWxsZWQgJXAgd2l0aCAlZCBieXRlc1xuIiwgaGVhZGVyLT5jaHVuaygpLCBoZWFkZXItPm5iYigpKTsKLQkJCW1lbXNldChoZWFkZXItPmNodW5rKCksIDAsIGhlYWRlci0+bmJiKCkpOwotCQkJaGVhZGVyLT5mcmVlKCk7Ci0gCQkJZmwtPnJlamVjdChoZWFkZXIpOwotCQl9IGVsc2UgewotCQkJR0NIYXNoOjpoYXNoX3VucHJvdGVjdGVkKHBhZ2UsIHBhZ2UtPmFyZWEoKSwgcGFnZS0+bmJiKCksIDApOwotCQkJcGFnZS0+cmVqZWN0KCk7Ci0JCQlkZWxldGUgKEdDUGFnZSAqKShwYWdlLT5tdW5tYXAoKSk7Ci0gCQl9Ci0gCX0KLQkKLSAJaW5saW5lIHZvaWQgcmVqZWN0X2NodW5rKEdDQ2h1bmtOb2RlICpoZWFkZXIpIHsKLSAJCXJlamVjdF9jaHVuayhvMnBhZ2UoaGVhZGVyLT5jaHVuaygpKSwgaGVhZGVyKTsKLSAJfQotCQotIAlpbmxpbmUgR0NDaHVua05vZGUgKnN0dXBpZF9yZWFsbG9jX2NodW5rKEdDQ2h1bmtOb2RlICpvbGRfaGVhZGVyLCB1aW50cHRyX3QgbmV3X25iYikgewotIAkJR0NDaHVua05vZGUgKm5ld19oZWFkZXIgPSBhbGxvY19jaHVuayhuZXdfbmJiLCBvbGRfaGVhZGVyLT5pc0NvbGxlY3RhYmxlKCksIG9sZF9oZWFkZXItPm1hcmsoKSk7Ci0gCQl1aW50cHRyX3Qgb2xkID0gb2xkX2hlYWRlci0+bmJiKCk7Ci0gCQl1aW50cHRyX3QgbmJiID0gb2xkIDwgbmV3X25iYiA/IG9sZCA6IG5ld19uYmI7Ci0gCQltZW1jcHkobmV3X2hlYWRlci0+Y2h1bmsoKSwgb2xkX2hlYWRlci0+Y2h1bmsoKSwgbmJiKTsKLSAJCXJldHVybiBuZXdfaGVhZGVyOwotIAl9Ci0JCi0gCWlubGluZSBHQ0NodW5rTm9kZSAqcmVhbGxvY19jaHVuayhHQ1BhZ2UgKnBhZ2UsIEdDQ2h1bmtOb2RlICpvbGRfaGVhZGVyLCB1aW50cHRyX3QgbmV3X25iYikgewotIAkJR0NDaHVua05vZGUgKm5ld19oZWFkZXIgPSBvbGRfaGVhZGVyOwotIAkJdWludHB0cl90CSAgICAgbWF4X25iYiA9IHBhZ2UtPmNodW5rX25iYigpOwotCQkKLSAJCWlmKEdDRnJlZUxpc3RGaW5kZXI6OmlzTW1hcGVkKG1heF9uYmIpKQotIAkJCWlmKEdDRnJlZUxpc3RGaW5kZXI6OmlzTW1hcGVkKG5ld19uYmIpKSB7Ci0gCQkJCS8qIGxlIHBsdXMgY29tcGxpcXXpLCBvbiBlc3NheWUgZGUgZmFpcmUgdW4gbXJlbWFwIGQndW4gcGV0aXQgYm91dC4uLiAqLwotIAkJCQl1aW50cHRyX3QJCQkJCQkJcm91bmRlZCA9IEdDTWFwcGVkQXJlYTo6cm91bmQobmV3X25iYik7Ci0JCQkJdWludHB0cl90ICAgICAgICAgICAgICBvbGRfbmJiID0gcGFnZS0+bmJiKCk7Ci0gCQkJCXNpZ25lZCBpbnQJCQkJCWRlcGwgPSByb3VuZGVkIC0gcGFnZS0+bmJiKCk7Ci0gCQkJCWlmKGRlcGwpIHsKLSAJCQkJCWlmKHBhZ2UtPm1yZW1hcChyb3VuZGVkKSA9PSAtMSkgLyogcGVyZHUgKi8KLSAJCQkJCQlyZXR1cm4gbmV3X2hlYWRlciA9IHN0dXBpZF9yZWFsbG9jX2NodW5rKG9sZF9oZWFkZXIsIG5ld19uYmIpOwotIAkJCQkJZWxzZSB7Ci0gCQkJCQkJaWYoZGVwbCA+IDApCi0gCQkJCQkJCUdDSGFzaDo6aGFzaF91bnByb3RlY3RlZChwYWdlLCAodm9pZCAqKSgodWludHB0cl90KXBhZ2UtPmFyZWEoKSArIG9sZF9uYmIpLCBkZXBsLCBkZXBsKTsKLSAJCQkJCQllbHNlCi0gCQkJCQkJCUdDSGFzaDo6aGFzaF91bnByb3RlY3RlZChwYWdlLCAodm9pZCAqKSgodWludHB0cl90KXBhZ2UtPmFyZWEoKSArIHJvdW5kZWQpLCAtZGVwbCwgMCk7Ci0gCQkJCQl9Ci0gCQkJCX0KLQkJCQlwYWdlLT5jaHVua19uYmIocm91bmRlZCk7Ci0gCQkJCW9sZF9oZWFkZXItPm5iYihuZXdfbmJiKTsKLSAJCQl9IGVsc2UKLSAJCQkJbmV3X2hlYWRlciA9IHN0dXBpZF9yZWFsbG9jX2NodW5rKG9sZF9oZWFkZXIsIG5ld19uYmIpOwotIAkJZWxzZQotIAkJCWlmKG5ld19uYmIgPD0gbWF4X25iYikKLSAJCQkJb2xkX2hlYWRlci0+bmJiKG5ld19uYmIpOwotIAkJCWVsc2UKLSAJCQkJbmV3X2hlYWRlciA9IHN0dXBpZF9yZWFsbG9jX2NodW5rKG9sZF9oZWFkZXIsIG5ld19uYmIpOwotIAkJcmV0dXJuIG5ld19oZWFkZXI7Ci0gCX0KLQotIAlpbmxpbmUgdm9pZCAqYWxsb2ModWludHB0cl90IHN6KSB7IHJldHVybiBhbGxvY19jaHVuayhzeiwgMCwgMCktPmNodW5rKCk7IH0KLQkKLSAJaW5saW5lIHZvaWQgZnJlZSh2b2lkICpwdHIpIHsKLSAJCUdDUGFnZSAgICAgCSpwYWdlID0gbzJwYWdlKHB0cik7Ci0gCQlHQ0NodW5rTm9kZQkqaGVhZGVyID0gcGFnZS0+bzJub2RlKHB0ciwgR0NDaHVua05vZGU6Om1hc2tOb3RDb2xsZWN0YWJsZSk7Ci0KLSAJCWlmKCFoZWFkZXIpCi0gCQkJZ2NmYXRhbCgiJXAgaXNuJ3QgYW4gb2JqZWN0IiwgcHRyKTsKLQkJCi0gCQlyZWplY3RfY2h1bmsocGFnZSwgaGVhZGVyKTsKLSAJfQotCi0gCWlubGluZSB2b2lkICpyZWFsbG9jKHZvaWQgKnB0ciwgdWludHB0cl90IG5iYikgewotIAkJR0NQYWdlICAgICAgCSpwYWdlID0gbzJwYWdlKHB0cik7Ci0gCQlHQ0NodW5rTm9kZSAgICpoZWFkZXIgPSBwYWdlLT5vMm5vZGUocHRyLCBHQ0NodW5rTm9kZTo6bWFza05vdENvbGxlY3RhYmxlKTsKLQkJCi0gCQlpZighaGVhZGVyKQotIAkJCWdjZmF0YWwoIiVwIGlzbid0IGFuIG9iamVjdCIsIGhlYWRlcik7Ci0JCQotIAkJcmVnaXN0ZXIgR0NDaHVua05vZGUgKm5ld19oZWFkZXIgPSByZWFsbG9jX2NodW5rKHBhZ2UsIGhlYWRlciwgbmJiKTsKLSAJCWlmKG5ld19oZWFkZXIgIT0gaGVhZGVyKQotIAkJCXJlamVjdF9jaHVuayhwYWdlLCBoZWFkZXIpOwotCi0gCQlyZXR1cm4gbmV3X2hlYWRlci0+Y2h1bmsoKTsKLSAJfQotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92bWtpdC9saWIvTXZtL0FsbG9jYXRvci9nY2NodW5rLmNwcCBiL3Zta2l0L2xpYi9Ndm0vQWxsb2NhdG9yL2djY2h1bmsuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzAxZWVmLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9Ndm0vQWxsb2NhdG9yL2djY2h1bmsuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0tLS0tLSBnY2NodW5rLmNjIC0gTXZtIGFsbG9jYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdm0KLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSAiZ2NjaHVuay5oIgotCi0KLUdDSGFzaFNldAkJICAJKkdDSGFzaDo6c2V0c1tHQ0hhc2hDb25zdDo6bmJfc2V0X3Blcl9oYXNoXTsKLXVuc2lnbmVkIGludCAgCUdDSGFzaDo6dXNlZFtHQ0hhc2hDb25zdDo6bmJfc2V0X3Blcl9oYXNoXTsKLUdDSGFzaFNldCAgICAgICBHQ0hhc2g6OmVtcHR5OwotYm9vbCAgICAgICAgICAgIEdDSGFzaDo6aW5pdGVkID0gMDsKLXNpemVfdCAgICAgICAgICBHQ0hhc2g6Om5iX2xpbmsgPSAwOwotCi1HQ0NodW5rTm9kZSAgICAgR0NQYWdlOjplbXB0eTsKLQotR0NQYWdlICAgICAgICAgIEdDSGFzaFNldDo6ZW1wdHk7Ci0KLXZvaWQgR0NIYXNoU2V0OjpoYXNoKEdDUGFnZSAqZCwgdm9pZCAqYmFzZSwgc2l6ZV90IG5iYiwgc2l6ZV90IG5iYl9tYXAsIHVuc2lnbmVkIGludCAqYykgewotIAlyZWdpc3RlciB1bnNpZ25lZCBpbnQgZW50cnkgPSBHQ0hhc2hDb25zdDo6ZGVzY19lbnRyeShiYXNlKTsKLSAJcmVnaXN0ZXIgdW5zaWduZWQgaW50IHBiYXNlID0gZW50cnkgPDwgUEFHRV9TSElGVDsKLSAJcmVnaXN0ZXIgdW5zaWduZWQgaW50IHRvcF9kZWwgPSAocGJhc2UgKyBuYmIpID4+IFBBR0VfU0hJRlQ7Ci0gCXJlZ2lzdGVyIHVuc2lnbmVkIGludCB0b3BfYWRkID0gKHBiYXNlICsgbmJiX21hcCkgPj4gUEFHRV9TSElGVDsKLQotCS8vCXByaW50ZigiICAgJXAgSGFzaCBmcm9tICVkIHRvICVkIGFuZCB0byAlZFxuIiwgdGhpcywgZW50cnksIHRvcF9hZGQsIHRvcF9kZWwpOwotIAlmb3IoOyBlbnRyeTx0b3BfYWRkOyBlbnRyeSsrKSB7Ci0gCQlwYWdlc1tlbnRyeV0gPSBkOwotIAkJKCpjKSsrOwotIAl9Ci0gCWZvcig7IGVudHJ5PHRvcF9kZWw7IGVudHJ5KyspIHsKLSAJCXBhZ2VzW2VudHJ5XSA9ICZlbXB0eTsKLSAJCSgqYyktLTsKLSAJfQotfQotCi12b2lkIEdDSGFzaDo6aGFzaF91bnByb3RlY3RlZChHQ1BhZ2UgKmRlc2MsIHZvaWQgKmJhc2UsIHVuc2lnbmVkIGludCBuYmIsIHVuc2lnbmVkIGludCBuYmJfbWFwKSB7Ci0gCXVpbnRwdHJfdAllbnRyeSA9IEdDSGFzaENvbnN0OjpzZXRfZW50cnkoYmFzZSk7Ci0gCXVpbnRwdHJfdAljdXJfc3ogPSBHQ0hhc2hDb25zdDo6c2V0X2VudHJ5XzJfcHRyKGVudHJ5ICsgMSkgLSAodWludHB0cl90KWJhc2U7CS8qIHRhaWxsZSByZXN0YW50ZSAqLwotIAljdXJfc3ogPSAoKGN1cl9zeiA8IG5iYikgPyBjdXJfc3ogOiBuYmIpOwkJCQkJCQkJCQkJCQkvKiBvbiBwcmVuZHMgbGUgbWluIGF2ZWMgbmJiICAgKi8KLQkKLQkvLwlwcmludGYoIkhhc2ggJXAgKCVwICVwICVkKSBpbiBlbnRyeSAlZCB3aXRoICVkLyVkXG4iLCBkZXNjLCBkZXNjLT5hcmVhKCksIGJhc2UsIGRlc2MtPm5iYigpLCBlbnRyeSwgY3VyX3N6LCBuYmJfbWFwKTsKLQl3aGlsZShjdXJfc3opIHsKLQkJaWYoc2V0c1tlbnRyeV0gPT0gJmVtcHR5KQotCQkJc2V0c1tlbnRyeV0gPSBuZXcgR0NIYXNoU2V0KCk7Ci0JCQotCQlzZXRzW2VudHJ5XS0+aGFzaChkZXNjLCBiYXNlLCBjdXJfc3osIChuYmJfbWFwID4gY3VyX3N6KSA/IGN1cl9zeiA6IG5iYl9tYXAsIHVzZWQgKyBlbnRyeSk7Ci0JCQotCQlpZighdXNlZFtlbnRyeV0pIHsKLQkJCWRlbGV0ZSBzZXRzW2VudHJ5XTsKLQkJCXNldHNbZW50cnldID0gJmVtcHR5OwotCQl9Ci0JCWVudHJ5Kys7Ci0JCWJhc2UgPSAodm9pZCAqKSgodWludHB0cl90KWJhc2UgKyBjdXJfc3opOwotCQluYmIgLT0gY3VyX3N6OwotCQluYmJfbWFwID0gKG5iYl9tYXAgPCBjdXJfc3opID8gMCA6IG5iYl9tYXAgLSBjdXJfc3o7Ci0JCWN1cl9zeiA9IChuYmIgPCBHQ0hhc2hDb25zdDo6c2V0X25iYikgPyBuYmIgOiBHQ0hhc2hDb25zdDo6c2V0X25iYjsKLQl9Ci19Ci0KLXZvaWQgR0NQYWdlOjppbml0aWFsaXNlKCkgewotIAllbXB0eS5pbml0aWFsaXNlKDAsIDApOwotfQotCi1HQ0hhc2hTZXQ6OkdDSGFzaFNldCgpIHsKLSAJdW5zaWduZWQgaW50IGk7Ci0JCi0gCWZvcihpPTA7IGk8R0NIYXNoQ29uc3Q6Om5iX2Rlc2NfcGVyX3NldDsgaSsrKQotIAkJcGFnZXNbaV0gPSAmZW1wdHk7Ci19Ci0KLXZvaWQgR0NIYXNoOjppbml0aWFsaXNlKCkgewotCWlmKCFpbml0ZWQpIHsKLQkJaW5pdGVkID0gMTsKLQkJR0NNaW5BbGxvYzo6aW5pdGlhbGlzZSgpOwotCQkKLQkJdW5zaWduZWQgaW50IGk7Ci0JCQotCQlmb3IoaT0wOyBpPEdDSGFzaENvbnN0OjpuYl9zZXRfcGVyX2hhc2g7IGkrKykgewotCQkJc2V0c1tpXSA9ICZlbXB0eTsKLQkJCXVzZWRbaV0gPSAwOwotCQl9Ci0JCUdDUGFnZTo6aW5pdGlhbGlzZSgpOwotCX0KLQluYl9saW5rKys7Ci19Ci0KLXZvaWQgR0NIYXNoOjpkZXN0cm95KCkgewotCWlmKGluaXRlZCkgewotCQlpZihuYl9saW5rKQotCQkJZ2N3YXJuaW5nMigiQ2FuJ3QgZGVzdHJveSBHQyBoYXNoIG1hcDogeW91IGhhdmUgY2xpZW50cyBjb25uZWN0ZWQgb24gaXRcbiIpOwotCQllbHNlIHsKLQkJCWluaXRlZCA9IDA7Ci0JCQl1bnNpZ25lZCBpbnQgaTsKLQkKLQkJCWZvcihpPTA7IGk8R0NIYXNoQ29uc3Q6Om5iX3NldF9wZXJfaGFzaDsgaSsrKQotCQkJCWlmKHNldHNbaV0gIT0gJmVtcHR5KQotCQkJCQlkZWxldGUgc2V0c1tpXTsKLQotCQkJR0NNaW5BbGxvYzo6ZGVzdHJveSgpOwotCQl9Ci0JfQotfQotCi12b2lkICpHQ0hhc2hTZXQ6Om9wZXJhdG9yIG5ldyhzaXplX3Qgc3opIHsKLQlyZXR1cm4gKHZvaWQgKilHQ01hcHBlZEFyZWE6OmRvX21tYXAoc3opOwotfQotCi12b2lkIEdDSGFzaFNldDo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKnB0ciwgc2l6ZV90IHN6KSB7Ci0JR0NNYXBwZWRBcmVhOjpkb19tdW5tYXAocHRyLCBzeik7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvTXZtL0FsbG9jYXRvci9nY2NodW5rLmggYi92bWtpdC9saWIvTXZtL0FsbG9jYXRvci9nY2NodW5rLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMzc2MWMuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL012bS9BbGxvY2F0b3IvZ2NjaHVuay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0tLS0tLSBnY2NodW5rLmggLSBNdm0gYWxsb2NhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdm0KLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIF9HQ19DSFVOS19IXwotI2RlZmluZSBfR0NfQ0hVTktfSF8KLQotLy8jaW5jbHVkZSAibXZtL1ZpcnR1YWxNYWNoaW5lLmgiCi0vLyNpbmNsdWRlICJtdm0vR0MuaCIKLQotI2luY2x1ZGUgImdjbWFwcGVyLmgiCi0jaW5jbHVkZSAidHlwZXMuaCIKLQotbmFtZXNwYWNlIG12bSB7Ci0JY2xhc3MgZ2NSb290OwotfQotCi11c2luZyBuYW1lc3BhY2UgbXZtOwotCi0vKiBkZXNjcmlwdGlvbiBkJ3VuIGJvdXQgZGUgbeltb2lyZSAqLwotY2xhc3MgR0NDaHVua05vZGUgewotIAlHQ0NodW5rTm9kZSAqX3ByZXY7ICAgICAvKiBiaXQgMC0xOiBsJ2FnZSwgbGVzIGF1dHJlczogbGUgcHJldmlvdXMgKi8KLSAJR0NDaHVua05vZGUJKl9uZXh0OwotIAl2b2lkICogICAgICAgX2NodW5rOwotIAl1aW50cHRyX3QJCSBfbmJiX21hcms7CS8qIG5iYiA9IDAgPD0+IGNlIGNodW5rIGVzdCBsaWJyZSAqLwotCSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJpdCAwLTI6IGxhIG1hcnF1ZSAqLwotCSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJpdCAzOiBlc3Qtb24gY29sbGVjdGFibGUgKi8KLXB1YmxpYzoKLSAJc3RhdGljIGNvbnN0IHNpZ25lZCBpbnQgbWFza0NvbGxlY3RhYmxlICAgID0gODsKLSAJc3RhdGljIGNvbnN0IHNpZ25lZCBpbnQgbWFza05vdENvbGxlY3RhYmxlID0gMDsKLQotIAlpbmxpbmUgR0NDaHVua05vZGUoKSB7fQotIAlpbmxpbmUgfkdDQ2h1bmtOb2RlKCkge30KLQotIAlpbmxpbmUgZ2NSb290CSAgICAgKgljaHVuaygpICAgICAgICAgICAgICAgIHsgcmV0dXJuIChnY1Jvb3QqKV9jaHVuazsgfQotCi0gCWlubGluZSBHQ0NodW5rTm9kZSAqCW5leHQoKSAgICAgICAgICAgICAgICAgeyByZXR1cm4gX25leHQ7IH0KLSAJaW5saW5lIHZvaWQJCQkJCQluZXh0KEdDQ2h1bmtOb2RlICpuKSAgIHsgX25leHQgPSBuOyB9Ci0KLSAJaW5saW5lIEdDQ2h1bmtOb2RlICoJcHJldigpICAgICAgICAgICAgICAgICB7IHJldHVybiBfcHJldjsgfQotIAlpbmxpbmUgR0NDaHVua05vZGUgKiAgcHJldihHQ0NodW5rTm9kZSAqcCkgICB7IHJldHVybiBfcHJldiA9IHA7IH0KLQotIAlpbmxpbmUgdm9pZAkJCQkJCWZyZWUoKSB7IF9uYmJfbWFyayA9IDA7IH0KLQotIAlpbmxpbmUgdm9pZAkJCQkJCW5iYih1aW50cHRyX3QgbiwgYm9vbCBpc0NvbCwgaW50IG0pIHsgX25iYl9tYXJrID0gKG4gPDwgNCkgfCAoKGlzQ29sICYgMHgxKSA8PCAzKSB8IG07IH0KLSAJaW5saW5lIHZvaWQJCQkJCQluYmIodWludHB0cl90IG4pCQkJCQkgICAgICAgIAkgeyBfbmJiX21hcmsgPSAobiA8PCA0KSB8IChfbmJiX21hcmsgJiAweGYpOyB9Ci0gCWlubGluZSB1aW50cHRyX3QJCQkJCW5iYigpICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIF9uYmJfbWFyayA+PiA0OyB9Ci0KLQkvKiBwYXMgZGUgdmVyaWZpY2F0aW9uIGRlIGRlYm9yZGVtZW50ISEhISAqLwotIAlpbmxpbmUgdm9pZAkJCQkJCV9tYXJrKHVuc2lnbmVkIGludCBtKSAgICAgICAgICAgICB7IF9uYmJfbWFyayA9IG0gfCAoX25iYl9tYXJrICYgLTgpOyB9Ci0gCWlubGluZSB1bnNpZ25lZCBpbnQJCW1hcmsoKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIF9uYmJfbWFyayAmIDc7IH0KLQotIAlpbmxpbmUgc2lnbmVkIGludCAgICAgIGlzQ29sbGVjdGFibGUoKSB7IHJldHVybiBfbmJiX21hcmsgJiA4OyB9Ci0KLSAJaW5saW5lIHZvaWQgaW5pdGlhbGlzZShHQ0NodW5rTm9kZSAqbiwgdm9pZCAqYykgewotIAkJX2NodW5rID0gYzsKLSAJCV9uZXh0ID0gbjsKLSAJCV9uYmJfbWFyayA9IDA7Ci0gCX0KLQotCS8qIHBvdXIgZmFpcmUgdW5lIGFtb3JjZSBkZSBsaXN0ZSAqLwotIAlpbmxpbmUgdm9pZCBhbG9uZSgpIHsgX3ByZXYgPSBfbmV4dCA9IHRoaXM7IH0KLQotCS8qIGFqb3V0ZSB0aGlzIOAgcCAqLwotIAlpbmxpbmUgdm9pZCBhcHBlbmQoR0NDaHVua05vZGUgKnApIHsKLSAJCV9wcmV2ID0gcDsKLSAJCV9uZXh0ID0gcC0+X25leHQ7Ci0gCQlwLT5fbmV4dCA9IHRoaXM7Ci0gCQlfbmV4dC0+X3ByZXYgPSB0aGlzOwotIAl9Ci0JCi0gIC8qIGFqb3V0ZSB0aGlzIOAgcCAqLwotIAlpbmxpbmUgdm9pZCBwcmVwZW5kKEdDQ2h1bmtOb2RlICpwKSB7Ci0gCQlfbmV4dCA9IHA7Ci0gICAgX3ByZXYgPSBwLT5fcHJldjsKLSAgICBwLT5fcHJldiA9IHRoaXM7Ci0gICAgX3ByZXYtPl9uZXh0ID0gdGhpczsKLSAJfQotCi0JLyogZW5sZXZlIHRoaXMgZGUgc2EgbGlzdGUgKi8KLSAJaW5saW5lIHZvaWQgcmVtb3ZlKCkgewotIAkJX25leHQtPl9wcmV2ID0gX3ByZXY7Ci0gCQlfcHJldi0+X25leHQgPSBfbmV4dDsKLSAJfQotCi0JLyogcGxhY2UgbGEgbGlzdGUgZGUgcCBkYW5zIHRoaXMuIEVjcmFzZSBjZWxsZSBkZSBwICovCi0JaW5saW5lIHZvaWQgYXR0cmFwZShHQ0NodW5rTm9kZSAqbCkJewotCQlpZihsID09IGwtPl9uZXh0KQotCQkJYWxvbmUoKTsKLQkJZWxzZSB7Ci0JCQkoX25leHQgPSBsLT5fbmV4dCktPl9wcmV2ID0gdGhpczsKLQkJCShfcHJldiA9IGwtPl9wcmV2KS0+X25leHQgPSB0aGlzOwotCQkJbC0+YWxvbmUoKTsKLQkJfQotCX0KLQotCS8qIGFqb3V0ZSBsYSBsaXN0ZSBkZSBsIGRhbnMgdGhpcyAqLwotIAlpbmxpbmUgdm9pZCBlYXQoR0NDaHVua05vZGUgKmwpIHsKLSAJCWlmKGwgIT0gbC0+X25leHQpIHsKLSAJCQkoX25leHQtPl9wcmV2ID0gbC0+X3ByZXYpLT5fbmV4dCA9IF9uZXh0OwotIAkJCShfbmV4dCA9IGwtPl9uZXh0KS0+X3ByZXYgPSB0aGlzOwotIAkJCWwtPmFsb25lKCk7Ci0gCQl9Ci0gCX0KLX07Ci0KLS8qIGVudGV0ZSBkZSBkZXNjcmlwdGlvbiBkZSB6b25lIG3pbW9pcmUgKi8KLS8qIHVuZSB6b25lIGVzdCB1biBlbnNlbWJsZSBkZSBib3V0cyBkZSBt6W1vaXJlIGRlIG3qbWUgdGFpbGxlLCBjb250aWd1ZXMsIGFsaWdu6SBzdXIgZGVzIHBhZ2VzICovCi1jbGFzcyBHQ1BhZ2UgOiBwdWJsaWMgR0NNYXBwZWRBcmVhIHsKLSAJc3RhdGljIEdDQ2h1bmtOb2RlIGVtcHR5OwotCi0gCUdDQ2h1bmtOb2RlCSpfaGVhZGVyczsKLSAJdWludHB0cl90CQkJIF9jaHVua19uYmI7Ci1wdWJsaWM6Ci0gCXN0YXRpYyB2b2lkIGluaXRpYWxpc2UoKTsKLQotIAlpbmxpbmUgR0NQYWdlKCkgewotIAkJR0NNYXBwZWRBcmVhOjppbml0aWFsaXNlKDAsIDApOwotIAkJX2hlYWRlcnMgPSAmZW1wdHk7Ci0gCQlfY2h1bmtfbmJiID0gKCh1bnNpZ25lZCBpbnQpLTEpID4+IDE7CQkvKiBvbiDpdml0ZSBsZSAvMCAqLwotIAl9Ci0KLSAJaW5saW5lIEdDUGFnZShHQ01hcHBlZEFyZWEgKnAsIHVpbnRwdHJfdCBtYXBwZWRfbmJiLCB1aW50cHRyX3QgY25iYikKLSAJCTogR0NNYXBwZWRBcmVhKHAsIG1hcHBlZF9uYmIpIHsKLSAJCV9jaHVua19uYmIgPSBjbmJiOwotIAl9Ci0KLSAJaW5saW5lIH5HQ1BhZ2UoKSB7fSAgICAgLyogRkFJUkUgTEUgVU5NQVAgQSBMQSBNQUlOISEhISEgKi8KLQotIAlpbmxpbmUgdWludHB0cl90CQkJCQljaHVua19uYmIoKQkJICAgICAgICB7IHJldHVybiBfY2h1bmtfbmJiOyB9Ci0gCWlubGluZSB2b2lkIAkJCQkJY2h1bmtfbmJiKHVpbnRwdHJfdCBuKQkJeyBfY2h1bmtfbmJiID0gbjsgfQotIAlpbmxpbmUgR0NDaHVua05vZGUgICAqaGVhZGVycygpCQkJICAgICAgICB7IHJldHVybiBfaGVhZGVyczsgfQotIAlpbmxpbmUgdm9pZCBoZWFkZXJzKEdDQ2h1bmtOb2RlICpoKSAgICAgICAgIHsgX2hlYWRlcnMgPSBoOzsgfQotCi0gCWlubGluZSBHQ0NodW5rTm9kZSAqbzJub2RlKHZvaWQgKnB0ciwgc2lnbmVkIGludCBtYXNrKSB7Ci0gCQlyZWdpc3RlciB1aW50cHRyX3QgZW50cnkgPSAoKHVpbnRwdHJfdClwdHIgLSAodWludHB0cl90KWFyZWEoKSkvX2NodW5rX25iYjsKLSAJCXJlZ2lzdGVyIEdDQ2h1bmtOb2RlICpyZXMgPSBfaGVhZGVycyArIGVudHJ5OwotIAkJcmV0dXJuICgodWludHB0cl90KXB0ciAtICh1aW50cHRyX3QpcmVzLT5jaHVuaygpIDwgcmVzLT5uYmIoKSkKLSAJCQkmJiAocmVzLT5pc0NvbGxlY3RhYmxlKCkgPT0gbWFzaykKLSAJCQk/IHJlcyA6IDA7Ci0gCX0KLQkKLSAJaW5saW5lIGdjUm9vdCAqbzJoZWFkZXIodm9pZCAqcHRyLCBzaWduZWQgaW50IG1hc2spIHsKLSAJCXJlZ2lzdGVyIHVpbnRwdHJfdCBlbnRyeSA9ICgodWludHB0cl90KXB0ciAtICh1aW50cHRyX3QpYXJlYSgpKS9fY2h1bmtfbmJiOwotIAkJcmVnaXN0ZXIgR0NDaHVua05vZGUgKnJlcyA9IF9oZWFkZXJzICsgZW50cnk7Ci0gCQlyZXR1cm4gKCh1aW50cHRyX3QpcHRyIC0gKHVpbnRwdHJfdClyZXMtPmNodW5rKCkgPCByZXMtPm5iYigpKQotIAkJCSYmIChyZXMtPmlzQ29sbGVjdGFibGUoKSA9PSBtYXNrKQotIAkJCT8gcmVzLT5jaHVuaygpIDogMDsKLSAJfQotfTsKLQotY2xhc3MgR0NEZXNjcmlwdG9yTWFwcGVkQ2h1bmsgOiBwdWJsaWMgR0NQYWdlIHsKLQlHQ0NodW5rTm9kZQloZWFkZXI7Ci1wdWJsaWM6Ci0JaW5saW5lIEdDRGVzY3JpcHRvck1hcHBlZENodW5rKEdDTWFwcGVkQXJlYSAqcCwgdWludHB0cl90IG1hcHBlZF9uYmIsIHVpbnRwdHJfdCBjbmJiKSAKLQkJOiBHQ1BhZ2UocCwgbWFwcGVkX25iYiwgY25iYikgewotCQloZWFkZXIuaW5pdGlhbGlzZSgwLCBhcmVhKCkpOwotCQloZWFkZXJzKCZoZWFkZXIpOwotCX0KLX07Ci0KLWNsYXNzIEdDSGFzaENvbnN0IHsKLXB1YmxpYzoKLSAJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludAkJZGVzY19iaXRzID0gUEFHRV9TSElGVDsKLSAJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludAkJc2V0X2JpdHMgPSAxMDsKLSAJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludAkJaGFzaF9iaXRzID0gKDMyIC0gc2V0X2JpdHMgLSBkZXNjX2JpdHMpOwotIAlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50CQluYl9kZXNjX3Blcl9zZXQgPSAxIDw8IHNldF9iaXRzOwotIAlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50CQluYl9zZXRfcGVyX2hhc2ggPSAxIDw8IGhhc2hfYml0czsKLSAJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludAkJc2V0X25iYiA9IDEgPDwgKHNldF9iaXRzICsgZGVzY19iaXRzKTsKLQotIAlzdGF0aWMgdWludHB0cl90CWRlc2NfZW50cnkodm9pZCAqIHB0cikgeyByZXR1cm4gKCh1aW50cHRyX3QpcHRyID4+IGRlc2NfYml0cykgJiAoKCAxIDw8IHNldF9iaXRzKSAtIDEpOyB9Ci0gCXN0YXRpYyB1aW50cHRyX3QJc2V0X2VudHJ5KHZvaWQgKnB0cikgeyByZXR1cm4gKHVpbnRwdHJfdClwdHIgPj4gKHNldF9iaXRzICsgZGVzY19iaXRzKTsgfQotIAlzdGF0aWMgdWludHB0cl90CXNldF9lbnRyeV8yX3B0cih1aW50cHRyX3QgZW50cnkpIHsgcmV0dXJuIGVudHJ5IDw8IChzZXRfYml0cyArIGRlc2NfYml0cyk7IH0KLX07Ci0KLWNsYXNzIEdDSGFzaFNldCB7Ci0gCXN0YXRpYyBHQ1BhZ2UgZW1wdHk7Ci0KLSAJR0NQYWdlCQkqcGFnZXNbR0NIYXNoQ29uc3Q6Om5iX2Rlc2NfcGVyX3NldF07Ci1wdWJsaWM6Ci0gCXZvaWQgKm9wZXJhdG9yIG5ldyh1aW50cHRyX3QpOwotIAl2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICosIHVpbnRwdHJfdCk7Ci0JCi0gCUdDSGFzaFNldCgpOwotCi0gCXZvaWQgaGFzaChHQ1BhZ2UgKiwgdm9pZCAqLCB1aW50cHRyX3QsIHVpbnRwdHJfdCwgdW5zaWduZWQgaW50ICopOwotCi0gCWlubGluZSBHQ1BhZ2UgKmdldCh2b2lkICpwdHIpIHsgcmV0dXJuIHBhZ2VzW0dDSGFzaENvbnN0OjpkZXNjX2VudHJ5KHB0cildOyB9Ci19OwotCi1jbGFzcyBHQ0hhc2ggewotIAlzdGF0aWMgR0NIYXNoU2V0CQkJKnNldHNbR0NIYXNoQ29uc3Q6Om5iX3NldF9wZXJfaGFzaF07Ci0gCXN0YXRpYyB1bnNpZ25lZCBpbnQJCXVzZWRbR0NIYXNoQ29uc3Q6Om5iX3NldF9wZXJfaGFzaF07Ci0gCXN0YXRpYyBHQ0hhc2hTZXQJICAgIGVtcHR5OwotCXN0YXRpYyBib29sICAgICAgICAgICBpbml0ZWQ7Ci0Jc3RhdGljIHVpbnRwdHJfdCAgICAgICAgIG5iX2xpbms7Ci0KLXB1YmxpYzoKLQlzdGF0aWMgdm9pZCB1bmxpbmsoKSB7IG5iX2xpbmstLTsgfQotIAlzdGF0aWMgdm9pZCBpbml0aWFsaXNlKCk7Ci0gCXN0YXRpYyB2b2lkIGRlc3Ryb3koKTsKLQotIAlzdGF0aWMgdm9pZCBoYXNoX3VucHJvdGVjdGVkKEdDUGFnZSAqcCwgdm9pZCAqYmFzZSwgdW5zaWduZWQgaW50IG5iYiwgdW5zaWduZWQgaW50IG5iYl9tYXApOwotIAkvL3ZvaWQgaGFzaChHQ1BhZ2UgKnApIHsgaGFzaChwLCBwLT5hcmVhKCksIHAtPm5iYigpLCBwLT5uYmIoKSk7IH0KLSAJLy92b2lkIHVuaGFzaChHQ1BhZ2UgKnApIHsgaGFzaChwLCBwLT5hcmVhKCksIHAtPm5iYigpLCAwKTsgfQotCi0gCXN0YXRpYyBpbmxpbmUgR0NQYWdlICpnZXQodm9pZCAqcHRyKSB7IHJldHVybiBzZXRzW0dDSGFzaENvbnN0OjpzZXRfZW50cnkocHRyKV0tPmdldChwdHIpOyB9Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9Ndm0vQWxsb2NhdG9yL2djZXJyb3IuY3BwIGIvdm1raXQvbGliL012bS9BbGxvY2F0b3IvZ2NlcnJvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YTc2MzUuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL012bS9BbGxvY2F0b3IvZ2NlcnJvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLS0tLSBnY2Vycm9yLmNjIC0gTXZtIGFsbG9jYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXZtCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgImdjZXJyb3IuaCIKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlICJvc2RlcC5oIgotCi1zdGF0aWMgdm9pZCBfX2djZmF0YWwoY29uc3QgY2hhciAqZmlsZSwgdW5zaWduZWQgaW50IGwsIGNvbnN0IGNoYXIgKmZ1bmMsIGNvbnN0IGNoYXIgKm1zZywgLi4uKQotewotICB2YV9saXN0IHZhOwotICB2YV9zdGFydCh2YSwgbXNnKTsKLSAgZnByaW50ZihzdGRlcnIsICJHQ1tlcnJvcl0gaW4gJXMgbGluZSAlZCAoZnVuY3Rpb24gJXMpXG4iLCBmaWxlLCBsLCBmdW5jKTsKLSAgdmZwcmludGYoc3RkZXJyLCBtc2csIHZhKTsKLSAgZnByaW50ZihzdGRlcnIsICJcbiIpOwotICB2YV9lbmQodmEpOwotICBleGl0KDApOwotfQotCi1zdGF0aWMgdm9pZCBfb25fZmF0YWwoKSB7fQotCi12b2lkICgqX2djZmF0YWwpKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50IGwsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pID0gX19nY2ZhdGFsOwotdm9pZCAoKm9uX2ZhdGFsKSh2b2lkKSA9IF9vbl9mYXRhbDsKLQotc3RhdGljIHZvaWQgX2RlZmF1bHRPbk1lbW9yeUVycm9yKHVuc2lnbmVkIGludCBzeikKLXsKLSAgZnByaW50ZihzdGRlcnIsICJHQ1tlcnJvcl0gb3V0IG9mIG1lbW9yeSBmb3IgJWQgYnl0ZXNcbiIsIHN6KTsKLSAgZXhpdCgwKTsKLX0KLQotdm9pZCAoKm9uTWVtb3J5RXJyb3IpKHVuc2lnbmVkIGludCkgPSBfZGVmYXVsdE9uTWVtb3J5RXJyb3I7CmRpZmYgLS1naXQgYS92bWtpdC9saWIvTXZtL0FsbG9jYXRvci9nY2Vycm9yLmggYi92bWtpdC9saWIvTXZtL0FsbG9jYXRvci9nY2Vycm9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMzQ4ODYuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL012bS9BbGxvY2F0b3IvZ2NlcnJvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLS0tIGdjZXJyb3IuaCAtIE12bSBhbGxvY2F0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE12bQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgX0dDX0VSUk9SX0hfCi0jZGVmaW5lIF9HQ19FUlJPUl9IXwotCi0KLWV4dGVybiB2b2lkICgqX2djZmF0YWwpKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50IGwsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOwotCi1leHRlcm4gdm9pZCAoKm9uX2ZhdGFsKSh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgKCpvbk1lbW9yeUVycm9yKSh1bnNpZ25lZCBpbnQgc3opOwotCi0jZGVmaW5lIGdjZmF0YWwobXNnLCBhcmdzLi4uKSBkbyB7IFwKLQkJCQkJCQkJCQkJCQkJCSAgb25fZmF0YWwoKTsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKl9nY2ZhdGFsKShfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sIG1zZywgIyNhcmdzKTsgXAotCQkJCQkJCQkJCQkJCQkJfSB3aGlsZSgwKQotCi0jZGVmaW5lIGdjd2FybmluZyhtc2csIGFyZ3MuLi4pIGRvIHsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiSW4gJXMgKCVzIGxpbmUgJWQpOlxuXHQiLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBfX0ZJTEVfXywgX19MSU5FX18pOyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKG1zZywgIyNhcmdzKTsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCi0KLSNkZWZpbmUgZ2N3YXJuaW5nMihtc2cpICAgICAgICAgZG8geyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJJbiAlcyAoJXMgbGluZSAlZCk6XG5cdCIsIF9fUFJFVFRZX0ZVTkNUSU9OX18sIF9fRklMRV9fLCBfX0xJTkVfXyk7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYobXNnKTsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCi0KLQotI2VuZGlmCi0KLQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL012bS9BbGxvY2F0b3IvZ2NtYXBwZXIuY3BwIGIvdm1raXQvbGliL012bS9BbGxvY2F0b3IvZ2NtYXBwZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGYzOTlmLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9Ndm0vQWxsb2NhdG9yL2djbWFwcGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLS0tLSBnY21hcHBlci5jYyAtIE12bSBhbGxvY2F0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE12bQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJnY21hcHBlci5oIgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0KLUdDTWluQWxsb2NTdGFjayBHQ01pbkFsbG9jOjpfc3RhY2tzW0dDTWluQWxsb2M6Om1heF9taW5fYWxsb2MgPj4gbG9nX3N0ZXBdOwotR0NNaW5BbGxvY1N0YWNrICpHQ01pbkFsbG9jOjpzdGFja3NbR0NNaW5BbGxvYzo6bWF4X21pbl9hbGxvYysxXTsKLUdDTWFwcGVkQXJlYSAgICBHQ01pbkFsbG9jOjpiYXNlX2FyZWE7Ci0KLQotCi0jaWYgZGVmaW5lZChfX01BQ0hfXykKLSNkZWZpbmUgRE9fTU1BUChzeikJCQkJCW1tYXAoMCwgc3osIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9QUklWQVRFIHwgTUFQX0FOT04sIC0xLCAwKQotI2Vsc2UKLSNkZWZpbmUgRE9fTU1BUChzeikJCQkJCW1tYXAoMCwgc3osIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9QUklWQVRFIHwgTUFQX0FOT05ZTU9VUywgMCwgMCkKLSNlbmRpZgotCi0jZGVmaW5lIERPX01VTk1BUChwdHIsIHN6KQltdW5tYXAocHRyLCBzeikKLQotI2lmIGRlZmluZWQoX19NQUNIX18pCi1zdGF0aWMgaW5saW5lIHZvaWQqIG1hbnVhbF9tcmVtYXAodm9pZCAqIGFkZHIsIGludCBvbGRfc2l6ZSwgaW50IG5ld19zaXplLCBpbnQgZmxhZ3MpCi17Ci0gIHZvaWQgKiByZXMgPSBhZGRyOwotICBpZiAobmV3X3NpemUgPCBvbGRfc2l6ZSkKLSAgICBET19NVU5NQVAoKHZvaWQqKSgoaW50cHRyX3QpYWRkciArIG5ld19zaXplKSwgb2xkX3NpemUgLSBuZXdfc2l6ZSk7Ci0gIGVsc2UgaWYgKG5ld19zaXplID4gb2xkX3NpemUpCi0gICAgLy8gVXNlIG9mIE1BUF9GSVhFRCBpcyBkaXNjb3VyYWdlZC4uLgotICAgIC8vIHJlcyA9IG1tYXAoYWRkciwgbmV3X3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9QUklWQVRFIHwgTUFQX0FOT04sIC0xLCBNQVBfRklYRUQpOwotICAgIHJlcz0odm9pZCopLTE7Ci0gIAotICByZXR1cm4gcmVzOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCAqZG9fbW1hcChzaXplX3Qgc3opIHsKLQl2b2lkICpyZXMgPSBET19NTUFQKHN6KTsKLQkvL3ByaW50ZigibW1hcCAlZCBieXRlcyBhdCAlZFxuIiwgc3osIHJlcyk7Ci0JaWYocmVzID09IE1BUF9GQUlMRUQpIHsKLQkJaWYgKGVycm5vID09IEVOT01FTSkKLSAgICAgICgqb25NZW1vcnlFcnJvcikoc3opOwotICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZ2NmYXRhbCgidW5hYmxlIHRvIG1tYXAgJWQgYnl0ZXMiLCBzeik7Ci0gICAgICB9Ci0JfQotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkb19tdW5tYXAodm9pZCAqcHRyLCBzaXplX3Qgc3opIHsKLQkvLwlwcmludGYoIm11bm1hcCAlZCBieXRlcyBhdCAlcFxuIiwgc3osIHB0cik7Ci0JRE9fTVVOTUFQKHB0ciwgc3opOwotfQotCi12b2lkICpHQ01hcHBlZEFyZWE6OmRvX21tYXAoc2l6ZV90IHN6KSB7IHJldHVybiA6OmRvX21tYXAoc3opOyB9Ci12b2lkIEdDTWFwcGVkQXJlYTo6ZG9fbXVubWFwKHZvaWQgKnB0ciwgc2l6ZV90IHN6KSB7IDo6ZG9fbXVubWFwKHB0ciwgc3opOyB9Ci0KLUdDTWFwcGVkQXJlYSAqR0NNYXBwZWRBcmVhOjptdW5tYXAoKSB7Ci0JOjpkb19tdW5tYXAoX21hcHBlZF9hcmVhLCBfbWFwcGVkX25iYik7Ci0JcmV0dXJuIHRoaXM7Ci19Ci0KLUdDTWFwcGVkQXJlYSAqR0NNYXBwZWRBcmVhOjptbWFwKHNpemVfdCBuKSB7Ci0JX21hcHBlZF9hcmVhID0gOjpkb19tbWFwKF9tYXBwZWRfbmJiID0gbik7Ci0JcmV0dXJuIHRoaXM7Ci19Ci0KLWludCBHQ01hcHBlZEFyZWE6Om1yZW1hcChzaXplX3QgbikgewotI2lmIGRlZmluZWQoX19NQUNIX18pCi0Jdm9pZCAqcmVzID0gbWFudWFsX21yZW1hcChfbWFwcGVkX2FyZWEsIF9tYXBwZWRfbmJiLCBuLCAwKTsKLSNlbHNlCi0Jdm9pZCAqcmVzID0gOjptcmVtYXAoX21hcHBlZF9hcmVhLCBfbWFwcGVkX25iYiwgbiwgMCk7Ci0jZW5kaWYKLSAgCi0JaWYoKGludHB0cl90KXJlcyA9PSAtMSkKLQkJcmV0dXJuIC0xOwotCV9tYXBwZWRfYXJlYSA9IHJlczsKLQlfbWFwcGVkX25iYiA9IG47Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgKkdDTWluQWxsb2M6OmFsbG9jX2FyZWEoR0NNaW5BbGxvY1N0YWNrICpzKSB7Ci0JR0NNaW5BbGxvY1N0YWNrCSphcmVhX3N0YWNrID0gc3RhY2tzW3NpemVvZihHQ01hcHBlZEFyZWEpXTsKLQlHQ01hcHBlZEFyZWEJCSphcmVhID0gKEdDTWFwcGVkQXJlYSAqKWFyZWFfc3RhY2stPmFsbG9jKCk7Ci0KLQlpZighYXJlYSkgewotCQkvKiBwYm0gOiBvbiBuJ2EgdnJhaW1lbnQgcGx1cyByaWVuIDopICovCi0JCWFyZWEgPSAoR0NNYXBwZWRBcmVhICopOjpkb19tbWFwKFBBR0VfU0laRSk7Ci0JCWFyZWEtPmluaXRpYWxpc2UoYXJlYSwgUEFHRV9TSVpFKTsKLQkJYXJlYV9zdGFjay0+ZmlsbCgodWludHB0cl90KShhcmVhICsgMSksIFBBR0VfU0laRSAtIHNpemVvZihHQ01hcHBlZEFyZWEpKTsKLQkJYXJlYS0+YXBwZW5kKCZiYXNlX2FyZWEpOwotCQlhcmVhID0gKEdDTWFwcGVkQXJlYSAqKWFyZWFfc3RhY2stPmFsbG9jKCk7Ci0JfQotCWFyZWEtPm1tYXAoUEFHRV9TSVpFKTsKLQlhcmVhLT5hcHBlbmQoJmJhc2VfYXJlYSk7Ci0Jcy0+ZmlsbCgodWludHB0cl90KWFyZWEtPmFyZWEoKSwgYXJlYS0+bmJiKCkpOwotCi0JcmV0dXJuIHMtPmFsbG9jKCk7Ci19Ci0KLXZvaWQgR0NNaW5BbGxvYzo6aW5pdGlhbGlzZSgpIHsKLQl1bnNpZ25lZCBpbnQgaSwgaiwgbTsKLQlzaXplX3QgbmJfc3RhY2tzID0gbWF4X21pbl9hbGxvYyA+PiBsb2dfc3RlcDsKLQkKLQlzdGFja3NbMF0gPSBfc3RhY2tzOwotCWZvcihpPTA7IGk8bmJfc3RhY2tzOyBpKyspIHsKLQkJbSA9IGk8PGxvZ19zdGVwOwotCQlfc3RhY2tzW2ldLmluaXRpYWxpc2UobSArICgxPDxsb2dfc3RlcCkpOwotCQlmb3Ioaj0wOyBqPCgxPDxsb2dfc3RlcCk7IGorKykKLQkJCXN0YWNrc1ttK2orMV0gPSBfc3RhY2tzICsgaTsKLQl9Ci19Ci0KLXZvaWQgR0NNaW5BbGxvYzo6ZGVzdHJveSgpIHsKLSAJdW5zaWduZWQgaW50IG5iX2FyZWEsIGk7Ci0gCUdDTWFwcGVkQXJlYSAqY3VyOwotCi0gCWZvcihuYl9hcmVhPTAsIGN1cj1iYXNlX2FyZWEubmV4dCgpOyBjdXIhPSZiYXNlX2FyZWE7IGN1cj1jdXItPm5leHQoKSwgbmJfYXJlYSsrKSB7fQotCi0gCUdDTWFwcGVkQXJlYSogYXJlYXMgPSAoR0NNYXBwZWRBcmVhKilhbGxvY2Eoc2l6ZW9mKEdDTWFwcGVkQXJlYSkgKiBuYl9hcmVhKTsKLQotIAlmb3IoaT0wLCBjdXI9YmFzZV9hcmVhLm5leHQoKTsgY3VyIT0mYmFzZV9hcmVhOyBjdXI9Y3VyLT5uZXh0KCksIGkrKykKLSAJCWFyZWFzW2ldID0gKmN1cjsKLQotIAlmb3IoaT0wOyBpPG5iX2FyZWE7IGkrKykKLSAJCWFyZWFzW2ldLm11bm1hcCgpOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL012bS9BbGxvY2F0b3IvZ2NtYXBwZXIuaCBiL3Zta2l0L2xpYi9Ndm0vQWxsb2NhdG9yL2djbWFwcGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNTk3YzAuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL012bS9BbGxvY2F0b3IvZ2NtYXBwZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLS0tLSBnY21hcHBlci5oIC0gTXZtIGFsbG9jYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXZtCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2lmbmRlZiBfR0NfTUFQUEVSX0hfCi0jZGVmaW5lIF9HQ19NQVBQRVJfSF8KLQotI2luY2x1ZGUgImdjZXJyb3IuaCIKLSNpbmNsdWRlICJvc2RlcC5oIgotI2luY2x1ZGUgInR5cGVzLmgiCi0KLWNsYXNzIEdDTWluQWxsb2M7Ci0KLWNsYXNzIEdDTWluIHsKLXB1YmxpYzoKLQlpbmxpbmUgR0NNaW4oKSB7fQotCWlubGluZSB+R0NNaW4oKSB7fQotCWlubGluZSB2b2lkICpvcGVyYXRvciBuZXcodWludHB0cl90KTsKLQlpbmxpbmUgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqLCB1aW50cHRyX3QpOwotfTsKLQotY2xhc3MgR0NNYXBwZWRBcmVhIDogcHVibGljIEdDTWluIHsKLSAJR0NNYXBwZWRBcmVhCSpfcHJldjsKLSAJR0NNYXBwZWRBcmVhCSpfbmV4dDsKLSAJdm9pZAkJCQkJKl9tYXBwZWRfYXJlYTsKLSAJdWludHB0cl90CQkJCV9tYXBwZWRfbmJiOwotCi1wdWJsaWM6Ci0gCXN0YXRpYyB1aW50cHRyX3Qgcm91bmQodWludHB0cl90IG4pIHsgcmV0dXJuIChuICsgUEFHRV9TSVpFIC0gMSkgJiAtUEFHRV9TSVpFOyB9Ci0KLSAJR0NNYXBwZWRBcmVhCSpwcmV2KCkgeyByZXR1cm4gX3ByZXY7IH0KLSAJR0NNYXBwZWRBcmVhCSpuZXh0KCkgeyByZXR1cm4gX25leHQ7IH0KLQkKLSAJaW5saW5lIEdDTWFwcGVkQXJlYSgpIHsgX3ByZXYgPSBfbmV4dCA9IHRoaXM7IH0KLSAJaW5saW5lIGV4cGxpY2l0IEdDTWFwcGVkQXJlYSh1aW50cHRyX3QgbikgeyBfcHJldiA9IF9uZXh0ID0gdGhpczsgbW1hcChuKTsgfQotIAlpbmxpbmUgR0NNYXBwZWRBcmVhKEdDTWFwcGVkQXJlYSAqcCwgdWludHB0cl90IG4pIHsgYXBwZW5kKHApOyBtbWFwKG4pOyB9Ci0KLSAJaW5saW5lIHZvaWQJCWluaXRpYWxpc2Uodm9pZCAqcCwgdWludHB0cl90IG4pIHsgX21hcHBlZF9hcmVhID0gcDsgX21hcHBlZF9uYmIgPSBuOyB9Ci0gCWlubGluZSB1aW50cHRyX3QgbmJiKCkgY29uc3QgeyByZXR1cm4gX21hcHBlZF9uYmI7IH0KLSAJaW5saW5lIHZvaWQJCSphcmVhKCkgeyByZXR1cm4gX21hcHBlZF9hcmVhOyB9Ci0KLSAJaW5saW5lIHZvaWQgYXBwZW5kKEdDTWFwcGVkQXJlYSAqcCkgewotIAkJX3ByZXYgPSBwOwotIAkJX25leHQgPSBwLT5fbmV4dDsKLSAJCXAtPl9uZXh0ID0gdGhpczsKLSAJCV9uZXh0LT5fcHJldiA9IHRoaXM7Ci0gCX0KLQotIAlpbmxpbmUgdm9pZCByZWplY3QoKSB7Ci0gCQlfcHJldi0+X25leHQgPSBfbmV4dDsKLSAJCV9uZXh0LT5fcHJldiA9IF9wcmV2OwotIAl9Ci0JCi0gCUdDTWFwcGVkQXJlYSAqCW11bm1hcCgpOwotIAlHQ01hcHBlZEFyZWEgKgltbWFwKHVpbnRwdHJfdCBzeik7Ci0gCWludAkJCQkJCQltcmVtYXAodWludHB0cl90IHN6KTsKLQkKLSAJc3RhdGljIHZvaWQgKmRvX21tYXAodWludHB0cl90IHN6KTsKLSAJc3RhdGljIHZvaWQgIGRvX211bm1hcCh2b2lkICosIHVpbnRwdHJfdCBzeik7Ci19OwotCi1jbGFzcyBHQ01pbkFsbG9jU3RhY2sgewotIAl1aW50cHRyX3QJCWN1cnJlbnQ7Ci0gCXVpbnRwdHJfdAkJbWF4OwotIAl1aW50cHRyX3QJCSpmcmVlX2xpc3Q7Ci0gCXVuc2lnbmVkIHNob3J0CW5iYjsKLQkKLXB1YmxpYzoKLSAJaW5saW5lIHZvaWQgaW5pdGlhbGlzZSh1aW50cHRyX3QgbikgeyBuYmIgPSBuOyBjdXJyZW50ID0gbWF4ID0gMDsgZnJlZV9saXN0ID0gMDsgfQotCi0JaW5saW5lIHZvaWQgZmlsbCh1aW50cHRyX3Qgc3QsIHVpbnRwdHJfdCBuKSB7Ci0JCWN1cnJlbnQgPSBzdDsKLQkJbWF4ID0gc3QgKyBuOwotCX0KLQkKLSAJaW5saW5lIHZvaWQgaW5qZWN0X2ZyZWUodm9pZCAqcHRyKSB7Ci0gCQkqKCh1aW50cHRyX3QgKiopcHRyKSA9IGZyZWVfbGlzdDsKLSAJCWZyZWVfbGlzdCA9ICh1aW50cHRyX3QgKilwdHI7Ci0gCX0KLQotIAlpbmxpbmUgdm9pZCAqYWxsb2MoKSB7Ci0gCQlyZWdpc3RlciB1aW50cHRyX3QgcmVzOwotIAkJaWYoZnJlZV9saXN0KSB7Ci0gCQkJcmVzID0gKHVpbnRwdHJfdClmcmVlX2xpc3Q7Ci0gCQkJZnJlZV9saXN0ID0gKigodWludHB0cl90ICoqKXJlcyk7Ci0gCQl9IGVsc2UgewotIAkJCXJlcyA9IGN1cnJlbnQ7Ci0gCQkJY3VycmVudCArPSBuYmI7Ci0gCQkJaWYoY3VycmVudCA+IG1heCkKLSAJCQkJcmV0dXJuIDA7Ci0gCQl9Ci0JCQotIAkJcmV0dXJuICh2b2lkKilyZXM7Ci0gCX0KLX07Ci0KLWNsYXNzIEdDTWluQWxsb2MgewotIAlzdGF0aWMgY29uc3QgdWludHB0cl90CWxvZ19tYXhfbWluX2FsbG9jID0gNjsJCQkJCQkJCQkJCS8qIDY0IG9jdGV0cyAqLwotIAlzdGF0aWMgY29uc3QgdWludHB0cl90CW1heF9taW5fYWxsb2MgPSAoMSA8PCBsb2dfbWF4X21pbl9hbGxvYyk7Ci0gCXN0YXRpYyBjb25zdCB1aW50cHRyX3QgbG9nX3N0ZXAgPSAyOwotCQotIAkvKiBwaWxlcyBkJ2FsbG9jYXRpb25zICovCi0gCXN0YXRpYyBHQ01pbkFsbG9jU3RhY2sJCQlfc3RhY2tzW21heF9taW5fYWxsb2MgPj4gbG9nX3N0ZXBdOwotIAlzdGF0aWMgR0NNaW5BbGxvY1N0YWNrCQkJKnN0YWNrc1ttYXhfbWluX2FsbG9jKzFdOwotCi0Jc3RhdGljIEdDTWFwcGVkQXJlYSAgICAgICAgIGJhc2VfYXJlYTsKLQotIAlzdGF0aWMgdm9pZCAqYWxsb2NfYXJlYShHQ01pbkFsbG9jU3RhY2sgKnMpOwotCi0JaW5saW5lIEdDTWluQWxsb2MoKSB7fSAvKiBwYXMgZCdpbnN0YW5jZSBkZSBjZSB0cnVjICovCi1wdWJsaWM6Ci0Jc3RhdGljIHZvaWQgaW5pdGlhbGlzZSgpOwotCXN0YXRpYyB2b2lkIGRlc3Ryb3koKTsKLQkKLSAJc3RhdGljIGlubGluZSB2b2lkICptaW5hbGxvYyh1aW50cHRyX3QpOwotIAlzdGF0aWMgaW5saW5lIHZvaWQgbWluZnJlZSh2b2lkICosIHVpbnRwdHJfdCk7Ci19OwotCi1pbmxpbmUgdm9pZCAqR0NNaW5BbGxvYzo6bWluYWxsb2ModWludHB0cl90IG5iYikgewotIAlHQ01pbkFsbG9jU3RhY2sgKnMgPSBzdGFja3NbbmJiXTsKLSAJdm9pZCAqcmVzID0gcy0+YWxsb2MoKTsKLQotIAlpZighcmVzKQotIAkJcmVzID0gYWxsb2NfYXJlYShzKTsKLSAJcmV0dXJuIHJlczsKLX0KLQotaW5saW5lIHZvaWQgR0NNaW5BbGxvYzo6bWluZnJlZSh2b2lkICpwdHIsIHVpbnRwdHJfdCBuYmIpIHsKLSAJc3RhY2tzW25iYl0tPmluamVjdF9mcmVlKHB0cik7Ci19Ci0KLWlubGluZSB2b2lkICpHQ01pbjo6b3BlcmF0b3IgbmV3KHVpbnRwdHJfdCBuYmIpIHsgCi0gCXJldHVybiBHQ01pbkFsbG9jOjptaW5hbGxvYyhuYmIpOwotfQotCi1pbmxpbmUgdm9pZCBHQ01pbjo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKnB0ciwgdWludHB0cl90IG5iYikgeyAKLQlHQ01pbkFsbG9jOjptaW5mcmVlKHB0ciwgbmJiKTsKLX0KLQotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL012bS9BbGxvY2F0b3Ivb3NkZXAuaCBiL3Zta2l0L2xpYi9Ndm0vQWxsb2NhdG9yL29zZGVwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNTczZTIuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL012bS9BbGxvY2F0b3Ivb3NkZXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tIG9zZGVwLmggLSBNdm0gYWxsb2NhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdm0KLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIF9fT1NERVBfSF8KLSNkZWZpbmUgX19PU0RFUF9IXwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLS8qIHN5cy9wYWdlcy5oID8/ICovCi0jZGVmaW5lIFBBR0VfU0hJRlQJCTEyCi0jZGVmaW5lIFBBR0VfU0laRQkJCSgxIDw8IFBBR0VfU0hJRlQpCi0KLSNpbmNsdWRlIDxjc3RkaW8+Ci0jaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlIDxjc3RyaW5nPgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9Ndm0vQm9laG1HQy9NYWtlZmlsZSBiL3Zta2l0L2xpYi9Ndm0vQm9laG1HQy9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZlNmYzZC4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTXZtL0JvZWhtR0MvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIz09PS0gbGliL012bS9Cb2VobUdDL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIwotIyAKLSMgICAgICAgICAgICAgICAgICAgICBUaGUgdm1raXQgcHJvamVjdAotIwotIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLSMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotIyAKLSMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCi1MRVZFTCA9IC4uLy4uLy4uCi0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29uZmlnCi0KLWlmZXEgKCQoV0lUSF9MTFZNX0dDQyksIDEpCi0gIE1PRFVMRV9OQU1FID0gQm9laG1HQwotZWxzZQotICBMSUJSQVJZTkFNRSA9IEJvZWhtR0MKLWVuZGlmCi0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCi0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9Ndm0vQm9laG1HQy9Ndm1HQy5oIGIvdm1raXQvbGliL012bS9Cb2VobUdDL012bUdDLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NGQ5NzMuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL012bS9Cb2VobUdDL012bUdDLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLSBNdm1HQy5oIC0gR2FyYmFnZSBDb2xsZWN0aW9uIEludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBNaWNybyBWaXJ0dWFsIE1hY2hpbmUKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0KLSNpZm5kZWYgTVZNX0JPRUhNX0dDX0gKLSNkZWZpbmUgTVZNX0JPRUhNX0dDX0gKLQotLy8jZGVmaW5lIEdDX1JFRElSRUNUX1RPX0xPQ0FMCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8Z2MvZ2NfYWxsb2NhdG9yLmg+Ci0vLyNpbmNsdWRlICJnYy9nY19sb2NhbF9hbGxvYy5oIgotI2luY2x1ZGUgImdjL2djLmgiCi0KLSNkZWZpbmUgU1RBVElDX1RSQUNFUih0eXBlKSBzdGF0aWNUcmFjZXIodHlwZSogb2JqKQotI2RlZmluZSBUUkFDRVIgdHJhY2VyKCkKLSNkZWZpbmUgUEFSRU5UX1RSQUNFUiB0cmFjZXIoKQotI2RlZmluZSBNQVJLX0FORF9UUkFDRSBtYXJrQW5kVHJhY2UoKQotI2RlZmluZSBDQUxMX1RSQUNFUiB0cmFjZXIoKQotCi1uYW1lc3BhY2UgbXZtIHsKLSAgICBjbGFzcyBUaHJlYWQ7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCAqIEdDX2Rsb3Blbihjb25zdCBjaGFyICpwYXRoLCBpbnQgbW9kZSkgdGhyb3cgKCk7Ci0KLSNkZWZpbmUgIGdjX25ldyhDbGFzcykgIF9fZ2NfbmV3KENsYXNzOjpWVCkgQ2xhc3MKLSNkZWZpbmUgX19nY19uZXcgbmV3Ci0KLW5hbWVzcGFjZSBtdm0gewotY2xhc3MgY29sbGVjdGFibGUgOiBwdWJsaWMgZ2NSb290IHsKLXB1YmxpYzoKLQotICB2b2lkIG1hcmtBbmRUcmFjZSgpIGNvbnN0IHt9Ci0KLSAgc2l6ZV90IG9iamVjdFNpemUoKSBjb25zdCB7Ci0gICAgZ2NfaGVhZGVyICogcmVzID0gKGdjX2hlYWRlciopKEdDX2Jhc2UoKHZvaWQqKXRoaXMpKTsKLSAgICByZXR1cm4gKEdDX3NpemUocmVzKSAtIHNpemVvZihnY19oZWFkZXIpKTsKLSAgfQotCi0gIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qgc3osIFZpcnR1YWxUYWJsZSAqVlQpIHsKLSAgICBnY19oZWFkZXIgKiByZXMgPSAoZ2NfaGVhZGVyKikgR0NfTUFMTE9DKHN6ICsgc2l6ZW9mKGdjX2hlYWRlcikpOwotICAgIHJlcyAtPiBfWFhYX3Z0PSBWVDsKLSAgICAKLSAgICBkZXN0cnVjdG9yX3QgZGVzdCA9IHJlcy0+Z2V0RGVzdHJ1Y3RvcigpOwotICAgIGlmIChkZXN0KQotICAgICAgR0NfcmVnaXN0ZXJfZmluYWxpemVyX25vX29yZGVyKHJlcywgKHZvaWQgKCopKHZvaWQqLCB2b2lkKikpZGVzdCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsgCi0gICAgcmV0dXJuIHJlcy0+XzJnYygpOwotICB9Ci0KLSAgdm9pZCogb3BlcmF0b3IgbmV3KHNpemVfdCBzeikgewotICAgIHJldHVybiBtYWxsb2Moc3opOwotICB9Ci0KLSAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqIHApIHsKLSAgICAvL0dDX0ZSRUUocCk7Ci0gIH0KLQotICB2b2lkKiByZWFsbG9jKHNpemVfdCBuKSB7Ci0gICAgdm9pZCAqIG9sZCA9IEdDX2Jhc2UodGhpcyk7Ci0gICAgZ2NfaGVhZGVyICogcmVzID0gKGdjX2hlYWRlciopIEdDX1JFQUxMT0Mob2xkLCBuICsgc2l6ZW9mKGdjX2hlYWRlcikpOwotICAgIHJldHVybiByZXMtPl8yZ2MoKTsKLSAgfQotCi19OwotICAKLXN0YXRpYyBpbnQgbWF4TWVtID0gMDsKLQotY2xhc3MgQ29sbGVjdG9yIHsKLXB1YmxpYzoKLQotICBzdGF0aWMgdm9pZCBpbml0aWFsaXNlKCk7Ci0gIHN0YXRpYyB2b2lkIGRlc3Ryb3koKSB7fQotCi0gIHN0YXRpYyB1bnNpZ25lZCBpbnQgZW5hYmxlKHVuc2lnbmVkIGludCBuKSB7Ci0gICAgaW50IG9sZCA9IEdDX2RvbnRfZ2M7Ci0gICAgaWYobikKLSAgICAgIEdDX2VuYWJsZSgpOwotICAgIGVsc2UKLSAgICAgIEdDX2Rpc2FibGUoKTsKLSAgICByZXR1cm4gIW9sZDsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIGdjU3RhdHMoc2l6ZV90ICZubywgc2l6ZV90ICZuYmIpIHsKLSAgICBubyA9IDA7Ci0gICAgbmJiID0gR0NfZ2V0X2hlYXBfc2l6ZSgpOyAKLSAgfQotICAKLSAgc3RhdGljIHZvaWQgbWF5YmVDb2xsZWN0KCkgewotICAgIEdDX2NvbGxlY3RfYV9saXR0bGUoKTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIGNvbGxlY3Qodm9pZCkgewotICAgIEdDX2djb2xsZWN0KCk7Ci0gIH0KLSAgCi0gIHN0YXRpYyB2b2lkIGluamVjdF9teV90aHJlYWQobXZtOjpUaHJlYWQqKTsKLSAgCi0gIHN0YXRpYyB2b2lkIHJlbW92ZV9teV90aHJlYWQobXZtOjpUaHJlYWQqKSB7fQotICBzdGF0aWMgQ29sbGVjdG9yKiBhbGxvY2F0ZSgpIHsgcmV0dXJuIDA7IH0KLQotICBzdGF0aWMgZ2MqIGJlZ09mKGNvbnN0IHZvaWQgKm9iaikgewotICAgIGdjX2hlYWRlciAqIGEgPSAoZ2NfaGVhZGVyKilHQ19iYXNlKCh2b2lkKilvYmopOwotICAgIGlmKGEgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0gICAgZWxzZSByZXR1cm4gKGdjKilhLT5fMmdjKCk7Ci0gIH0KLQotICBpbmxpbmUgc3RhdGljIGJvb2wgaXNPYmplY3QoY29uc3Qgdm9pZCAqbykgewotICAgIHJldHVybiBiZWdPZigodm9pZCopbyk7Ci0gIH0KLSAgCi0KLSAgc3RhdGljIGludCBnZXRNYXhNZW1vcnkodm9pZCkgeyByZXR1cm4gbWF4TWVtOyB9Ci0gIAotICBzdGF0aWMgaW50IGdldEZyZWVNZW1vcnkodm9pZCkgewotICAgIHJldHVybiBHQ19nZXRfZnJlZV9ieXRlcygpOyAKLSAgfQotCi0gIHN0YXRpYyBpbnQgZ2V0VG90YWxNZW1vcnkodm9pZCkgewotICAgIHJldHVybiBHQ19nZXRfaGVhcF9zaXplKCk7Ci0gIH0KLSAgCi0gIHN0YXRpYyB2b2lkIHNldE1heE1lbW9yeShzaXplX3Qgc2l6ZSkgewotICAgIEdDX3NldF9tYXhfaGVhcF9zaXplKHNpemUpOwotICAgIG1heE1lbSA9IHNpemU7Ci0gIH0KLSAgCi0gIHN0YXRpYyB2b2lkICAgICBzZXRNaW5NZW1vcnkoc2l6ZV90IHNpemUpIHsKLSAgICBpZihHQ19nZXRfaGVhcF9zaXplKCkgPCBzaXplKQotICAgIEdDX2V4cGFuZF9ocChzaXplIC0gR0NfZ2V0X2hlYXBfc2l6ZSgpKTsKLSAgfQotCi0gIHN0YXRpYyBib29sIGlzTGl2ZSgpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS92bWtpdC9saWIvTXZtL0JvZWhtR0MvZ2MuY3BwIGIvdm1raXQvbGliL012bS9Cb2VobUdDL2djLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc2YWZjMi4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTXZtL0JvZWhtR0MvZ2MuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0gZ2MuY2MgLSBCb2VobSBHQyBHYXJiYWdlIENvbGxlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE12bQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSAibXZtL0dDLmgiCi0jaW5jbHVkZSAibXZtL1RocmVhZHMvVGhyZWFkLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBtdm07Ci0KLXZvaWQgQ29sbGVjdG9yOjppbmplY3RfbXlfdGhyZWFkKG12bTo6VGhyZWFkKiB0aCkgewotICBHQ19pbml0KCk7Ci19Ci0KLXZvaWQgQ29sbGVjdG9yOjppbml0aWFsaXNlKCkgewotICBHQ19JTklUKCk7Ci19Ci0KLWV4dGVybiAiQyIgZ2MqIGdjbWFsbG9jKHNpemVfdCBzeiwgVmlydHVhbFRhYmxlKiBWVCkgewotICByZXR1cm4gKGdjKilnYzo6b3BlcmF0b3IgbmV3KHN6LCBWVCk7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvTXZtL0NvbW1vblRocmVhZC9Db2xsZWN0aW9uUlYuY3BwIGIvdm1raXQvbGliL012bS9Db21tb25UaHJlYWQvQ29sbGVjdGlvblJWLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc0OGM5My4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTXZtL0NvbW1vblRocmVhZC9Db2xsZWN0aW9uUlYuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8vPT09LS0tLS0tLS0gQ29sbGVjdGlvblJWLmNwcCAtIFJlbmRlei12b3VzIGZvciBnYXJiYWdlIGNvbGxlY3Rpb24gLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSAibXZtL1ZpcnR1YWxNYWNoaW5lLmgiCi0jaW5jbHVkZSAibXZtL1RocmVhZHMvQ29sbGVjdGlvblJWLmgiCi0jaW5jbHVkZSAibXZtL1ZNS2l0LmgiCi0jaW5jbHVkZSAibXZtL0dDLmgiCi0KLSNpbmNsdWRlICJkZWJ1Zy5oIgotCi11c2luZyBuYW1lc3BhY2UgbXZtOwotCi12b2lkIENvbGxlY3Rpb25SVjo6YW5vdGhlcl9tYXJrKCkgewotCVZNS2l0ICp2bWtpdCA9IG12bTo6VGhyZWFkOjpnZXQoKS0+dm1raXQ7Ci0gIGFzc2VydCh0aC0+Z2V0TGFzdFNQKCkgIT0gTlVMTCk7Ci0gIGFzc2VydChuYkpvaW5lZCA8IHZta2l0LT5OdW1iZXJPZlRocmVhZHMpOwotICBuYkpvaW5lZCsrOwotICBpZiAobmJKb2luZWQgPT0gdm1raXQtPm51bWJlck9mUnVubmluZ1RocmVhZHMpIHsKLSAgICBjb25kSW5pdGlhdG9yLmJyb2FkY2FzdCgpOwotICB9Ci19Ci0KLXZvaWQgQ29sbGVjdGlvblJWOjp3YWl0RW5kT2ZSVigpIHsKLSAgbXZtOjpUaHJlYWQqIHRoID0gbXZtOjpUaHJlYWQ6OmdldCgpOwotICBhc3NlcnQodGgtPmdldExhc3RTUCgpICE9IE5VTEwpOwotCi0gIHdoaWxlICh0aC0+ZG9ZaWVsZCkgewotICAgIGNvbmRFbmRSVi53YWl0KCZfbG9ja1JWKTsKLSAgfQotfQotCi12b2lkIENvbGxlY3Rpb25SVjo6d2FpdFJWKCkgewotICAvLyBBZGQgbXlzZWxmLgotICBuYkpvaW5lZCsrOwotCi0gIHdoaWxlIChuYkpvaW5lZCAhPSBtdm06OlRocmVhZDo6Z2V0KCktPnZta2l0LT5udW1iZXJPZlJ1bm5pbmdUaHJlYWRzKSB7Ci0gICAgY29uZEluaXRpYXRvci53YWl0KCZfbG9ja1JWKTsKLSAgfSAKLX0KLQotdm9pZCBDb29wZXJhdGl2ZUNvbGxlY3Rpb25SVjo6c3luY2hyb25pemUoKSB7Ci0gIGFzc2VydChuYkpvaW5lZCA9PSAwKTsKLSAgbXZtOjpUaHJlYWQqIHNlbGYgPSBtdm06OlRocmVhZDo6Z2V0KCk7Ci0JbXZtOjpWTUtpdCogdm1raXQgPSBzZWxmLT52bWtpdDsKLQotCWZvcihUaHJlYWQqIGN1cj12bWtpdC0+cnVubmluZ1RocmVhZHMubmV4dCgpOyBjdXIhPSZ2bWtpdC0+cnVubmluZ1RocmVhZHM7IGN1cj1jdXItPm5leHQoKSkgeyAKLSAgICBhc3NlcnQoIWN1ci0+ZG9ZaWVsZCk7Ci0gICAgY3VyLT5kb1lpZWxkID0gdHJ1ZTsKLSAgICBhc3NlcnQoIWN1ci0+am9pbmVkUlYpOwotICB9Ci0KLSAgLy8gVGhlIENBUyBpcyBub3QgbmVjZXNzYXJ5IGJ1dCBpdCBkb2VzIGEgbWVtb3J5IGJhcnJpZXIuIAotICBfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKCYoc2VsZi0+am9pbmVkUlYpLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgLy8gTG9va3VwIGN1cnJlbnRseSBibG9ja2VkIHRocmVhZHMuCi0JZm9yKFRocmVhZCogY3VyPXZta2l0LT5ydW5uaW5nVGhyZWFkcy5uZXh0KCk7IGN1ciE9JnZta2l0LT5ydW5uaW5nVGhyZWFkczsgY3VyPWN1ci0+bmV4dCgpKSB7Ci0JCWlmKGN1ci0+Z2V0TGFzdFNQKCkgJiYgY3VyICE9IHNlbGYpIHsKLSAgICAgIG5iSm9pbmVkKys7Ci0gICAgICBjdXItPmpvaW5lZFJWID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICAvLyBBbmQgd2FpdCBmb3Igb3RoZXIgdGhyZWFkcyB0byBmaW5pc2guCi0gIHdhaXRSVigpOwotCi0gIC8vIFVubG9jaywgc28gdGhhdCB0aHJlYWRzIGluIHVuY29vcGVyYXRpdmUgY29kZSB0aGF0IGdvIGJhY2sgdG8gY29vcGVyYXRpdmUKLSAgLy8gY29kZSBjYW4gc2V0IGJhY2sgdGhlaXIgbGFzdFNQLgotICB1bmxvY2tSVigpOwotfQotCi0KLSNpZiBkZWZpbmVkKF9fTUFDSF9fKQotIyBkZWZpbmUgU0lHR0MgIFNJR1hDUFUKLSNlbHNlCi0jIGRlZmluZSBTSUdHQyAgU0lHUFdSCi0jZW5kaWYKLQotdm9pZCBVbmNvb3BlcmF0aXZlQ29sbGVjdGlvblJWOjpzeW5jaHJvbml6ZSgpIHsgCi0gIGFzc2VydChuYkpvaW5lZCA9PSAwKTsKLSAgbXZtOjpUaHJlYWQqIHNlbGYgPSBtdm06OlRocmVhZDo6Z2V0KCk7Ci0JbXZtOjpWTUtpdCogdm1raXQgPSBzZWxmLT52bWtpdDsKLQotICAvLyBMb2NrIHRocmVhZCBsb2NrLCBzbyB0aGF0IHdlIGNhbiB0cmF2ZXJzZSB0aGUgdGhyZWFkIGxpc3Qgc2FmZWx5LiBUaGlzIHdpbGwKLSAgLy8gYmUgcmVsZWFzZWQgb24gZmluaXNoUlYuCi0JZm9yKFRocmVhZCogY3VyPXZta2l0LT5ydW5uaW5nVGhyZWFkcy5uZXh0KCk7IGN1ciE9JnZta2l0LT5ydW5uaW5nVGhyZWFkczsgY3VyPWN1ci0+bmV4dCgpKSB7IAotCQlpZihjdXIhPXNlbGYpIHsKLQkJCWludCByZXMgPSBjdXItPmtpbGwoU0lHR0MpOwotCQkJYXNzZXJ0KCFyZXMgJiYgIkVycm9yIG9uIGtpbGwiKTsKLQkJfQotCX0KLSAgCi0gIC8vIEFuZCB3YWl0IGZvciBvdGhlciB0aHJlYWRzIHRvIGZpbmlzaC4KLSAgd2FpdFJWKCk7Ci0KLSAgLy8gVW5sb2NrLCBzbyB0aGF0IHRocmVhZHMgaW4gdW5jb29wZXJhdGl2ZSBjb2RlIHRoYXQgZ28gYmFjayB0byBjb29wZXJhdGl2ZQotICAvLyBjb2RlIGNhbiBzZXQgYmFjayB0aGVpciBsYXN0U1AuCi0gIHVubG9ja1JWKCk7Ci19Ci0KLQotdm9pZCBVbmNvb3BlcmF0aXZlQ29sbGVjdGlvblJWOjpqb2luKCkgewotICBtdm06OlRocmVhZCogdGggPSBtdm06OlRocmVhZDo6Z2V0KCk7Ci0gIHRoLT5pblJWID0gdHJ1ZTsKLQotICBsb2NrUlYoKTsKLSAgdm9pZCogb2xkID0gdGgtPmdldExhc3RTUCgpOwotICB0aC0+c2V0TGFzdFNQKEZSQU1FX1BUUigpKTsKLSAgYW5vdGhlcl9tYXJrKCk7Ci0gIHdhaXRFbmRPZlJWKCk7Ci0gIHRoLT5zZXRMYXN0U1Aob2xkKTsKLSAgdW5sb2NrUlYoKTsKLQotICB0aC0+aW5SViA9IGZhbHNlOwotfQotCi12b2lkIENvb3BlcmF0aXZlQ29sbGVjdGlvblJWOjpqb2luKCkgewotICBtdm06OlRocmVhZCogdGggPSBtdm06OlRocmVhZDo6Z2V0KCk7Ci0gIGFzc2VydCh0aC0+ZG9ZaWVsZCAmJiAiTm8geWllbGQiKTsKLSAgYXNzZXJ0KCh0aC0+Z2V0TGFzdFNQKCkgPT0gTlVMTCkgJiYgIlNQIHByZXNlbnQgaW4gY29vcGVyYXRpdmUgY29kZSIpOwotCi0gIHRoLT5pblJWID0gdHJ1ZTsKLSAgCi0gIGxvY2tSVigpOwotICB0aC0+c2V0TGFzdFNQKEZSQU1FX1BUUigpKTsKLSAgdGgtPmpvaW5lZFJWID0gdHJ1ZTsKLSAgYW5vdGhlcl9tYXJrKCk7Ci0gIHdhaXRFbmRPZlJWKCk7Ci0gIHRoLT5zZXRMYXN0U1AoMCk7Ci0gIHVubG9ja1JWKCk7Ci0gIAotICB0aC0+aW5SViA9IGZhbHNlOwotfQotCi12b2lkIENvb3BlcmF0aXZlQ29sbGVjdGlvblJWOjpqb2luQmVmb3JlVW5jb29wZXJhdGl2ZSgpIHsKLSAgbXZtOjpUaHJlYWQqIHRoID0gbXZtOjpUaHJlYWQ6OmdldCgpOwotICBhc3NlcnQoKHRoLT5nZXRMYXN0U1AoKSAhPSBOVUxMKSAmJgotICAgICAgICAgIlNQIG5vdCBzZXQgYmVmb3JlIGVudGVyaW5nIHVuY29vcGVyYXRpdmUgY29kZSIpOwotCi0gIHRoLT5pblJWID0gdHJ1ZTsKLSAgCi0gIGxvY2tSVigpOwotICBpZiAodGgtPmRvWWllbGQpIHsKLSAgICBpZiAoIXRoLT5qb2luZWRSVikgewotICAgICAgdGgtPmpvaW5lZFJWID0gdHJ1ZTsKLSAgICAgIGFub3RoZXJfbWFyaygpOwotICAgIH0KLSAgICB3YWl0RW5kT2ZSVigpOwotICB9Ci0gIHVubG9ja1JWKCk7Ci0KLSAgdGgtPmluUlYgPSBmYWxzZTsKLX0KLQotdm9pZCBDb29wZXJhdGl2ZUNvbGxlY3Rpb25SVjo6am9pbkFmdGVyVW5jb29wZXJhdGl2ZSh2b2lkKiBTUCkgewotICBtdm06OlRocmVhZCogdGggPSBtdm06OlRocmVhZDo6Z2V0KCk7Ci0gIGFzc2VydCgodGgtPmdldExhc3RTUCgpID09IE5VTEwpICYmCi0gICAgICAgICAiU1Agc2V0IGFmdGVyIGVudGVyaW5nIHVuY29vcGVyYXRpdmUgY29kZSIpOwotCi0gIHRoLT5pblJWID0gdHJ1ZTsKLQotICBsb2NrUlYoKTsKLSAgaWYgKHRoLT5kb1lpZWxkKSB7Ci0gICAgdGgtPnNldExhc3RTUChTUCk7Ci0gICAgaWYgKCF0aC0+am9pbmVkUlYpIHsKLSAgICAgIHRoLT5qb2luZWRSViA9IHRydWU7Ci0gICAgICBhbm90aGVyX21hcmsoKTsKLSAgICB9Ci0gICAgd2FpdEVuZE9mUlYoKTsKLSAgICB0aC0+c2V0TGFzdFNQKE5VTEwpOwotICB9Ci0gIHVubG9ja1JWKCk7Ci0KLSAgdGgtPmluUlYgPSBmYWxzZTsKLX0KLQotZXh0ZXJuICJDIiB2b2lkIGNvbmRpdGlvbmFsU2FmZVBvaW50KCkgewotICBtdm06OlRocmVhZCogdGggPSBtdm06OlRocmVhZDo6Z2V0KCk7Ci0gIHRoLT52bWtpdC0+cmVuZGV6dm91cy5qb2luKCk7Ci19Ci0KLXZvaWQgQ29vcGVyYXRpdmVDb2xsZWN0aW9uUlY6OmZpbmlzaFJWKCkgewotICBsb2NrUlYoKTsKLSAgICAKLSAgbXZtOjpUaHJlYWQqIGluaXRpYXRvciA9IG12bTo6VGhyZWFkOjpnZXQoKTsKLQltdm06OlZNS2l0KiB2bWtpdCA9IGluaXRpYXRvci0+dm1raXQ7Ci0KLSAgZm9yKG12bTo6VGhyZWFkKiBjdXI9dm1raXQtPnJ1bm5pbmdUaHJlYWRzLm5leHQoKTsgY3VyIT0mdm1raXQtPnJ1bm5pbmdUaHJlYWRzOyBjdXI9Y3VyLT5uZXh0KCkpIHsKLSAgICBhc3NlcnQoY3VyLT5kb1lpZWxkICYmICJJbmNvbnNpc3RlbnQgc3RhdGUiKTsKLSAgICBhc3NlcnQoY3VyLT5qb2luZWRSViAmJiAiSW5jb25zaXN0ZW50IHN0YXRlIik7Ci0gICAgY3VyLT5kb1lpZWxkID0gZmFsc2U7Ci0gICAgY3VyLT5qb2luZWRSViA9IGZhbHNlOwotICB9Ci0JCi0gIGFzc2VydChuYkpvaW5lZCA9PSBpbml0aWF0b3ItPnZta2l0LT5OdW1iZXJPZlRocmVhZHMgJiYgIkluY29uc2lzdGVudCBzdGF0ZSIpOwotICBuYkpvaW5lZCA9IDA7Ci0gIGNvbmRFbmRSVi5icm9hZGNhc3QoKTsKLSAgdW5sb2NrUlYoKTsKLSAgaW5pdGlhdG9yLT5pblJWID0gZmFsc2U7Ci19Ci0KLXZvaWQgQ29vcGVyYXRpdmVDb2xsZWN0aW9uUlY6OnByZXBhcmVGb3JKb2luKCkgewotCS8vLyBub3RoaW5nIHRvIGRvCi19Ci0KLXZvaWQgVW5jb29wZXJhdGl2ZUNvbGxlY3Rpb25SVjo6ZmluaXNoUlYoKSB7Ci0gIGxvY2tSVigpOwotICBtdm06OlRocmVhZCogaW5pdGlhdG9yID0gbXZtOjpUaHJlYWQ6OmdldCgpOwotICBhc3NlcnQobmJKb2luZWQgPT0gaW5pdGlhdG9yLT52bWtpdC0+TnVtYmVyT2ZUaHJlYWRzICYmICJJbmNvbnNpc3RlbnQgc3RhdGUiKTsKLSAgbmJKb2luZWQgPSAwOwotICBjb25kRW5kUlYuYnJvYWRjYXN0KCk7Ci0gIHVubG9ja1JWKCk7Ci0gIGluaXRpYXRvci0+aW5SViA9IGZhbHNlOwotfQotCi12b2lkIFVuY29vcGVyYXRpdmVDb2xsZWN0aW9uUlY6OmpvaW5BZnRlclVuY29vcGVyYXRpdmUodm9pZCogU1ApIHsKLSAgVU5SRUFDSEFCTEUoKTsKLX0KLQotdm9pZCBVbmNvb3BlcmF0aXZlQ29sbGVjdGlvblJWOjpqb2luQmVmb3JlVW5jb29wZXJhdGl2ZSgpIHsKLSAgVU5SRUFDSEFCTEUoKTsKLX0KLQotc3RhdGljIHZvaWQgc2lnZ2NIYW5kbGVyKGludCkgewotICBtdm06OlRocmVhZCogdGggPSBtdm06OlRocmVhZDo6Z2V0KCk7Ci0gIHRoLT52bWtpdC0+cmVuZGV6dm91cy5qb2luKCk7Ci19Ci0KLXZvaWQgVW5jb29wZXJhdGl2ZUNvbGxlY3Rpb25SVjo6cHJlcGFyZUZvckpvaW4oKSB7Ci0gIC8vIFNldCB0aGUgU0lHR0MgaGFuZGxlciBmb3IgdW5jb29wZXJhdGl2ZSByZW5kZXp2b3VzLgotICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhOwotICBzaWdzZXRfdCBtYXNrOwotICBzaWdhY3Rpb24oU0lHR0MsIDAsICZzYSk7Ci0gIHNpZ2ZpbGxzZXQoJm1hc2spOwotICBzYS5zYV9tYXNrID0gbWFzazsKLSAgc2Euc2FfaGFuZGxlciA9IHNpZ2djSGFuZGxlcjsKLSAgc2Euc2FfZmxhZ3MgfD0gU0FfUkVTVEFSVDsKLSAgc2lnYWN0aW9uKFNJR0dDLCAmc2EsIE5VTEwpOwotICAKLSAgaWYgKG5iSm9pbmVkICE9IDApIHsKLSAgICAvLyBJbiB1bmNvb3BlcmF0aXZlIG1vZGUsIHdlIG1heSBoYXZlIG1pc3NlZCBhIHNpZ25hbC4KLSAgICBqb2luKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9Ndm0vQ29tbW9uVGhyZWFkL01ha2VmaWxlIGIvdm1raXQvbGliL012bS9Db21tb25UaHJlYWQvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZTFkMzMuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL012bS9Db21tb25UaHJlYWQvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIz09PS0gbGliL012bS9Db21tb25UaHJlYWQvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIwotIyAKLSMgICAgICAgICAgICAgICAgICAgICBUaGUgdm1raXQgcHJvamVjdAotIwotIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLSMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotIyAKLSMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCi1MRVZFTCA9IC4uLy4uLy4uCi0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29uZmlnCi0KLWlmZXEgKCQoV0lUSF9MTFZNX0dDQyksIDEpCi0gIE1PRFVMRV9OQU1FID0gQ29tbW9uVGhyZWFkCi1lbHNlCi0gIExJQlJBUllOQU1FID0gQ29tbW9uVGhyZWFkCi1lbmRpZgotCi0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCi0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9Ndm0vQ29tbW9uVGhyZWFkL09iamVjdExvY2tzLmNwcCBiL3Zta2l0L2xpYi9Ndm0vQ29tbW9uVGhyZWFkL09iamVjdExvY2tzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRiMTQxYS4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTXZtL0NvbW1vblRocmVhZC9PYmplY3RMb2Nrcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MzcgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0gT2JqZWN0TG9ja3MuY3BwIC0gT2JqZWN0LWJhc2VkIGxvY2tzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlIDxjYXNzZXJ0PgotCi0jaW5jbHVkZSAibXZtL1RocmVhZHMvQ29uZC5oIgotI2luY2x1ZGUgIm12bS9UaHJlYWRzL0xvY2tzLmgiCi0jaW5jbHVkZSAibXZtL1RocmVhZHMvT2JqZWN0TG9ja3MuaCIKLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9UaHJlYWQuaCIKLSNpbmNsdWRlICJtdm0vVmlydHVhbE1hY2hpbmUuaCIKLSNpbmNsdWRlICJtdm0vR0MuaCIKLSNpbmNsdWRlICJjdGVycm9yLmgiCi0jaW5jbHVkZSA8Y2Vycm5vPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotCi0KLXVzaW5nIG5hbWVzcGFjZSBtdm07Ci0KLXZvaWQgVGhpbkxvY2s6Om92ZXJmbG93VGhpbkxvY2soZ2MqIG9iamVjdCwgTG9ja1N5c3RlbSYgdGFibGUpIHsKLSAgbGx2bV9nY3Jvb3Qob2JqZWN0LCAwKTsKLSAgRmF0TG9jayogb2JqID0gdGFibGUuYWxsb2NhdGUob2JqZWN0KTsKLSAgdWludHB0cl90IElEID0gb2JqLT5nZXRJRCgpOwotICAvLyAxIGJlY2F1c2Ugd2Ugc3RhcnQgYXQgMCwgYW5kIDEgZm9yIHRoaXMgbG9jayByZXF1ZXN0LgotICBvYmotPmFjcXVpcmVBbGwob2JqZWN0LCAoVGhpbkNvdW50TWFzayA+PiBUaGluQ291bnRTaGlmdCkgKyAyKTsKLSAgdWludHB0cl90IG9sZFZhbHVlID0gMDsKLSAgdWludHB0cl90IG5ld1ZhbHVlID0gMDsKLSAgdWludHB0cl90IHlpZWxkZWRWYWx1ZSA9IDA7Ci0gIGRvIHsKLSAgICBvbGRWYWx1ZSA9IG9iamVjdC0+aGVhZGVyOwotICAgIG5ld1ZhbHVlID0gb2JqLT5nZXRJRCgpIHwgKG9sZFZhbHVlICYgTm9uTG9ja0JpdHNNYXNrKTsKLSAgICBhc3NlcnQob2JqLT5hc3NvY2lhdGVkT2JqZWN0ID09IG9iamVjdCk7Ci0gICAgeWllbGRlZFZhbHVlID0gX19zeW5jX3ZhbF9jb21wYXJlX2FuZF9zd2FwKCYob2JqZWN0LT5oZWFkZXIpLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotICB9IHdoaWxlICgoKG9iamVjdC0+aGVhZGVyKSAmIH5Ob25Mb2NrQml0c01hc2spICE9IElEKTsKLSAgYXNzZXJ0KG9iai0+YXNzb2NpYXRlZE9iamVjdCA9PSBvYmplY3QpOwotfQotIAotLy8vIGluaXRpYWxpc2UgLSBJbml0aWFsaXNlIHRoZSB2YWx1ZSBvZiB0aGUgbG9jay4KLS8vLwotdm9pZCBUaGluTG9jazo6cmVtb3ZlRmF0TG9jayhGYXRMb2NrKiBmYXRMb2NrLCBMb2NrU3lzdGVtJiB0YWJsZSkgewotICBnYyogb2JqZWN0ID0gZmF0TG9jay0+YXNzb2NpYXRlZE9iamVjdDsKLSAgbGx2bV9nY3Jvb3Qob2JqZWN0LCAwKTsKLSAgdWludHB0cl90IElEID0gZmF0TG9jay0+Z2V0SUQoKTsKLSAgdWludHB0cl90IG9sZFZhbHVlID0gMDsKLSAgdWludHB0cl90IG5ld1ZhbHVlID0gMDsKLSAgdWludHB0cl90IHlpZWxkZWRWYWx1ZSA9IDA7Ci0gIGRvIHsKLSAgICBvbGRWYWx1ZSA9IG9iamVjdC0+aGVhZGVyOwotICAgIG5ld1ZhbHVlID0gb2xkVmFsdWUgJiBOb25Mb2NrQml0c01hc2s7Ci0gICAgeWllbGRlZFZhbHVlID0gX19zeW5jX3ZhbF9jb21wYXJlX2FuZF9zd2FwKCZvYmplY3QtPmhlYWRlciwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLSAgfSB3aGlsZSAob2xkVmFsdWUgIT0geWllbGRlZFZhbHVlKTsKLSAgYXNzZXJ0KChvbGRWYWx1ZSAmIE5vbkxvY2tCaXRzTWFzaykgIT0gSUQpOwotICBmYXRMb2NrLT5hc3NvY2lhdGVkT2JqZWN0ID0gTlVMTDsKLX0KLSAgCi1GYXRMb2NrKiBUaGluTG9jazo6Y2hhbmdlVG9GYXRsb2NrKGdjKiBvYmplY3QsIExvY2tTeXN0ZW0mIHRhYmxlKSB7Ci0gIGxsdm1fZ2Nyb290KG9iamVjdCwgMCk7Ci0gIGlmICghKG9iamVjdC0+aGVhZGVyICYgRmF0TWFzaykpIHsKLSAgICBGYXRMb2NrKiBvYmogPSB0YWJsZS5hbGxvY2F0ZShvYmplY3QpOwotICAgIHVpbnQzMiBjb3VudCA9IChvYmplY3QtPmhlYWRlciAmIFRoaW5Db3VudE1hc2spID4+IFRoaW5Db3VudFNoaWZ0OwotICAgIG9iai0+YWNxdWlyZUFsbChvYmplY3QsIGNvdW50ICsgMSk7Ci0gICAgdWludHB0cl90IG9sZFZhbHVlID0gMDsKLSAgICB1aW50cHRyX3QgbmV3VmFsdWUgPSAwOwotICAgIHVpbnRwdHJfdCB5aWVsZGVkVmFsdWUgPSAwOwotICAgIHVpbnRwdHJfdCBJRCA9IG9iai0+Z2V0SUQoKTsKLSAgICBkbyB7Ci0gICAgICBvbGRWYWx1ZSA9IG9iamVjdC0+aGVhZGVyOwotICAgICAgbmV3VmFsdWUgPSBJRCB8IChvbGRWYWx1ZSAmIE5vbkxvY2tCaXRzTWFzayk7Ci0gICAgICBhc3NlcnQob2JqLT5hc3NvY2lhdGVkT2JqZWN0ID09IG9iamVjdCk7Ci0gICAgICB5aWVsZGVkVmFsdWUgPSBfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAoJihvYmplY3QtPmhlYWRlciksIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0gICAgfSB3aGlsZSAoKChvYmplY3QtPmhlYWRlcikgJiB+Tm9uTG9ja0JpdHNNYXNrKSAhPSBJRCk7Ci0gICAgcmV0dXJuIG9iajsKLSAgfSBlbHNlIHsKLSAgICBGYXRMb2NrKiByZXMgPSB0YWJsZS5nZXRGYXRMb2NrRnJvbUlEKG9iamVjdC0+aGVhZGVyKTsKLSAgICBhc3NlcnQocmVzICYmICJMb2NrIGRlYWxsb2NhdGVkIHdoaWxlIGhlbGQuIik7Ci0gICAgYXNzZXJ0KHJlcy0+YXNzb2NpYXRlZE9iamVjdCA9PSBvYmplY3QpOwotICAgIHJldHVybiByZXM7Ci0gIH0KLX0KLQotdm9pZCBwcmludERlYnVnTWVzc2FnZShnYyogb2JqZWN0LCBMb2NrU3lzdGVtJiB0YWJsZSkgewotICBsbHZtX2djcm9vdChvYmplY3QsIDApOwotICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICJXQVJOSU5HOiBbJXBdIGhhcyBiZWVuIHdhaXRpbmcgcmVhbGx5IGxvbmcgZm9yICVwIChoZWFkZXIgPSAleClcbiIsCi0gICAgICAodm9pZCopbXZtOjpUaHJlYWQ6OmdldCgpLAotICAgICAgKHZvaWQqKW9iamVjdCwKLSAgICAgIG9iamVjdC0+aGVhZGVyKTsKLSAgRmF0TG9jayogb2JqID0gdGFibGUuZ2V0RmF0TG9ja0Zyb21JRChvYmplY3QtPmhlYWRlcik7Ci0gIGlmIChvYmogIT0gTlVMTCkgewotICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAiV0FSTklORzogWyVwXSBpcyB3YWl0aW5nIG9uIGZhdGxvY2sgJXAuICIKLSAgICAgICAgIkl0cyBhc3NvY2lhdGVkIG9iamVjdCBpcyAlcC4gVGhlIG93bmVyIGlzICVwXG4iLAotICAgICAgICAodm9pZCopbXZtOjpUaHJlYWQ6OmdldCgpLAotICAgICAgICAodm9pZCopb2JqLAotICAgICAgICAodm9pZCopb2JqLT5nZXRBc3NvY2lhdGVkT2JqZWN0KCksCi0gICAgICAgICh2b2lkKilvYmotPm93bmVyKCkpOwotICB9Ci19Ci0KLXZvaWQgVGhpbkxvY2s6OmFjcXVpcmUoZ2MqIG9iamVjdCwgTG9ja1N5c3RlbSYgdGFibGUpIHsKLSAgbGx2bV9nY3Jvb3Qob2JqZWN0LCAwKTsKLSAgdWludDY0X3QgaWQgPSBtdm06OlRocmVhZDo6Z2V0KCktPmdldFRocmVhZElEKCk7Ci0gIHVpbnRwdHJfdCBvbGRWYWx1ZSA9IDA7Ci0gIHVpbnRwdHJfdCBuZXdWYWx1ZSA9IDA7Ci0gIHVpbnRwdHJfdCB5aWVsZGVkVmFsdWUgPSAwOwotCi0gIGlmICgob2JqZWN0LT5oZWFkZXIgJiBUaHJlYWQ6OklETWFzaykgPT0gaWQpIHsKLSAgICBhc3NlcnQob3duZXIob2JqZWN0LCB0YWJsZSkgJiYgIkluY29uc2lzdGVudCBsb2NrIik7Ci0gICAgaWYgKChvYmplY3QtPmhlYWRlciAmIFRoaW5Db3VudE1hc2spICE9IFRoaW5Db3VudE1hc2spIHsKLSAgICAgIHVpbnQzMiBjb3VudCA9IG9iamVjdC0+aGVhZGVyICYgVGhpbkNvdW50TWFzazsKLSAgICAgIGRvIHsKLSAgICAgICAgb2xkVmFsdWUgPSBvYmplY3QtPmhlYWRlcjsKLSAgICAgICAgbmV3VmFsdWUgPSBvbGRWYWx1ZSArIFRoaW5Db3VudEFkZDsKLSAgICAgICAgeWllbGRlZFZhbHVlID0gX19zeW5jX3ZhbF9jb21wYXJlX2FuZF9zd2FwKCYob2JqZWN0LT5oZWFkZXIpLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotICAgICAgfSB3aGlsZSAoKG9iamVjdC0+aGVhZGVyICYgVGhpbkNvdW50TWFzaykgPT0gY291bnQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdmVyZmxvd1RoaW5Mb2NrKG9iamVjdCwgdGFibGUpOwotICAgIH0KLSAgICBhc3NlcnQob3duZXIob2JqZWN0LCB0YWJsZSkgJiYgIk5vdCBvd25lciBhZnRlciBxdWl0dGluZyBhY3F1aXJlISIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGRvIHsKLSAgICBvbGRWYWx1ZSA9IG9iamVjdC0+aGVhZGVyICYgTm9uTG9ja0JpdHNNYXNrOwotICAgIG5ld1ZhbHVlID0gb2xkVmFsdWUgfCBpZDsKLSAgICB5aWVsZGVkVmFsdWUgPSBfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAoJihvYmplY3QtPmhlYWRlciksIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0gIH0gd2hpbGUgKChvYmplY3QtPmhlYWRlciAmIH5Ob25Mb2NrQml0c01hc2spID09IDApOwotCi0gIGlmICgoKG9iamVjdC0+aGVhZGVyKSAmIH5Ob25Mb2NrQml0c01hc2spID09IGlkKSB7Ci0gICAgYXNzZXJ0KG93bmVyKG9iamVjdCwgdGFibGUpICYmICJOb3Qgb3duZXIgYWZ0ZXIgcXVpdHRpbmcgYWNxdWlyZSEiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBTaW1wbGUgY291bnRlciB0byBsaXZlbHkgZGlhZ25vc2UgcG9zc2libGUgZGVhZCBsb2NrcyBpbiB0aGlzIGNvZGUuCi0gIGludCBjb3VudGVyID0gMDsgIAotICB3aGlsZSAodHJ1ZSkgewotICAgIGlmIChvYmplY3QtPmhlYWRlciAmIEZhdE1hc2spIHsKLSAgICAgIEZhdExvY2sqIG9iaiA9IHRhYmxlLmdldEZhdExvY2tGcm9tSUQob2JqZWN0LT5oZWFkZXIpOwotICAgICAgaWYgKG9iaiAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChvYmotPmFjcXVpcmUob2JqZWN0KSkgewotICAgICAgICAgIGFzc2VydCgob2JqZWN0LT5oZWFkZXIgJiBGYXRNYXNrKSAmJiAiSW5jb25zaXN0ZW50IGxvY2siKTsKLSAgICAgICAgICBhc3NlcnQoKHRhYmxlLmdldEZhdExvY2tGcm9tSUQob2JqZWN0LT5oZWFkZXIpID09IG9iaikgJiYgIkluY29uc2lzdGVudCBsb2NrIik7Ci0gICAgICAgICAgYXNzZXJ0KG93bmVyKG9iamVjdCwgdGFibGUpICYmICJOb3Qgb3duZXIgYWZ0ZXIgYWNxdXJpbmcgZmF0IGxvY2shIik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAKLSAgICBjb3VudGVyKys7Ci0gICAgaWYgKGNvdW50ZXIgPT0gMTAwMCkgcHJpbnREZWJ1Z01lc3NhZ2Uob2JqZWN0LCB0YWJsZSk7Ci0KLSAgICB3aGlsZSAob2JqZWN0LT5oZWFkZXIgJiB+Tm9uTG9ja0JpdHNNYXNrKSB7Ci0gICAgICBpZiAob2JqZWN0LT5oZWFkZXIgJiBGYXRNYXNrKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbXZtOjpUaHJlYWQ6OnlpZWxkKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmICgob2JqZWN0LT5oZWFkZXIgJiB+Tm9uTG9ja0JpdHNNYXNrKSA9PSAwKSB7Ci0gICAgICBGYXRMb2NrKiBvYmogPSB0YWJsZS5hbGxvY2F0ZShvYmplY3QpOwotICAgICAgb2JqLT5pbnRlcm5hbExvY2subG9jaygpOwotICAgICAgZG8gewotICAgICAgICBvbGRWYWx1ZSA9IG9iamVjdC0+aGVhZGVyICYgTm9uTG9ja0JpdHNNYXNrOwotICAgICAgICBuZXdWYWx1ZSA9IG9sZFZhbHVlIHwgb2JqLT5nZXRJRCgpOwotICAgICAgICBhc3NlcnQob2JqLT5hc3NvY2lhdGVkT2JqZWN0ID09IG9iamVjdCk7Ci0gICAgICAgIHlpZWxkZWRWYWx1ZSA9IF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcCgmb2JqZWN0LT5oZWFkZXIsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0gICAgICB9IHdoaWxlICgob2JqZWN0LT5oZWFkZXIgJiB+Tm9uTG9ja0JpdHNNYXNrKSA9PSAwKTsKLQotICAgICAgaWYgKChnZXRGYXRMb2NrKG9iamVjdCwgdGFibGUpICE9IG9iaikpIHsKLSAgICAgICAgYXNzZXJ0KChvYmplY3QtPmhlYWRlciAmIH5Ob25Mb2NrQml0c01hc2spICE9IG9iai0+Z2V0SUQoKSk7Ci0gICAgICAgIG9iai0+aW50ZXJuYWxMb2NrLnVubG9jaygpOwotICAgICAgICB0YWJsZS5kZWFsbG9jYXRlKG9iaik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBhc3NlcnQoKG9iamVjdC0+aGVhZGVyICYgfk5vbkxvY2tCaXRzTWFzaykgPT0gb2JqLT5nZXRJRCgpKTsKLSAgICAgICAgYXNzZXJ0KG93bmVyKG9iamVjdCwgdGFibGUpICYmICJJbmNvbnNpc3RlbnQgbG9jayIpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBhc3NlcnQob3duZXIob2JqZWN0LCB0YWJsZSkgJiYgIk5vdCBvd25lciBhZnRlciBxdWl0dGluZyBhY3F1aXJlISIpOwotfQotCi0vLy8gcmVsZWFzZSAtIFJlbGVhc2UgdGhlIGxvY2suCi12b2lkIFRoaW5Mb2NrOjpyZWxlYXNlKGdjKiBvYmplY3QsIExvY2tTeXN0ZW0mIHRhYmxlKSB7Ci0gIGxsdm1fZ2Nyb290KG9iamVjdCwgMCk7Ci0gIGFzc2VydChvd25lcihvYmplY3QsIHRhYmxlKSAmJiAiTm90IG93bmVyIHdoZW4gZW50ZXJpbmcgcmVsZWFzZSEiKTsKLSAgdWludDY0IGlkID0gbXZtOjpUaHJlYWQ6OmdldCgpLT5nZXRUaHJlYWRJRCgpOwotICB1aW50cHRyX3Qgb2xkVmFsdWUgPSAwOwotICB1aW50cHRyX3QgbmV3VmFsdWUgPSAwOwotICB1aW50cHRyX3QgeWllbGRlZFZhbHVlID0gMDsKLSAgaWYgKChvYmplY3QtPmhlYWRlciAmIH5Ob25Mb2NrQml0c01hc2spID09IGlkKSB7Ci0gICAgZG8gewotICAgICAgb2xkVmFsdWUgPSBvYmplY3QtPmhlYWRlcjsKLSAgICAgIG5ld1ZhbHVlID0gb2xkVmFsdWUgJiBOb25Mb2NrQml0c01hc2s7Ci0gICAgICB5aWVsZGVkVmFsdWUgPSBfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAoJm9iamVjdC0+aGVhZGVyLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotICAgIH0gd2hpbGUgKChvYmplY3QtPmhlYWRlciAmIH5Ob25Mb2NrQml0c01hc2spID09IGlkKTsKLSAgfSBlbHNlIGlmIChvYmplY3QtPmhlYWRlciAmIEZhdE1hc2spIHsKLSAgICBGYXRMb2NrKiBvYmogPSB0YWJsZS5nZXRGYXRMb2NrRnJvbUlEKG9iamVjdC0+aGVhZGVyKTsKLSAgICBhc3NlcnQob2JqICYmICJMb2NrIGRlYWxsb2NhdGVkIHdoaWxlIGhlbGQuIik7Ci0gICAgb2JqLT5yZWxlYXNlKG9iamVjdCwgdGFibGUpOwotICB9IGVsc2UgewotICAgIGFzc2VydCgoKG9iamVjdC0+aGVhZGVyICYgVGhpbkNvdW50TWFzaykgPiAwKSAmJiAiSW5jb25zaXN0ZW50IHN0YXRlIik7ICAgIAotICAgIHVpbnQzMiBjb3VudCA9IChvYmplY3QtPmhlYWRlciAmIFRoaW5Db3VudE1hc2spOwotICAgIGRvIHsKLSAgICAgIG9sZFZhbHVlID0gb2JqZWN0LT5oZWFkZXI7Ci0gICAgICBuZXdWYWx1ZSA9IG9sZFZhbHVlIC0gVGhpbkNvdW50QWRkOwotICAgICAgeWllbGRlZFZhbHVlID0gX19zeW5jX3ZhbF9jb21wYXJlX2FuZF9zd2FwKCYob2JqZWN0LT5oZWFkZXIpLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotICAgIH0gd2hpbGUgKChvYmplY3QtPmhlYWRlciAmIFRoaW5Db3VudE1hc2spID09IGNvdW50KTsKLSAgfQotfQotCi0vLy8gb3duZXIgLSBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbiB0aHJlYWQgaXMgdGhlIG93bmVyIG9mIHRoaXMgb2JqZWN0J3MKLS8vLyBsb2NrLgotYm9vbCBUaGluTG9jazo6b3duZXIoZ2MqIG9iamVjdCwgTG9ja1N5c3RlbSYgdGFibGUpIHsKLSAgbGx2bV9nY3Jvb3Qob2JqZWN0LCAwKTsKLSAgaWYgKG9iamVjdC0+aGVhZGVyICYgRmF0TWFzaykgewotICAgIEZhdExvY2sqIG9iaiA9IHRhYmxlLmdldEZhdExvY2tGcm9tSUQob2JqZWN0LT5oZWFkZXIpOwotICAgIGlmIChvYmogIT0gTlVMTCkgcmV0dXJuIG9iai0+b3duZXIoKTsKLSAgfSBlbHNlIHsKLSAgICB1aW50NjQgaWQgPSBtdm06OlRocmVhZDo6Z2V0KCktPmdldFRocmVhZElEKCk7Ci0gICAgaWYgKChvYmplY3QtPmhlYWRlciAmIFRocmVhZDo6SURNYXNrKSA9PSBpZCkgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vLy8gZ2V0RmF0TG9jayAtIEdldCB0aGUgZmF0IGxvY2sgaXMgdGhlIGxvY2sgaXMgYSBmYXQgbG9jaywgMCBvdGhlcndpc2UuCi1GYXRMb2NrKiBUaGluTG9jazo6Z2V0RmF0TG9jayhnYyogb2JqZWN0LCBMb2NrU3lzdGVtJiB0YWJsZSkgewotICBsbHZtX2djcm9vdChvYmplY3QsIDApOwotICBpZiAob2JqZWN0LT5oZWFkZXIgJiBGYXRNYXNrKSB7Ci0gICAgcmV0dXJuIHRhYmxlLmdldEZhdExvY2tGcm9tSUQob2JqZWN0LT5oZWFkZXIpOwotICB9IGVsc2UgewotICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLXZvaWQgRmF0TG9jazo6YWNxdWlyZUFsbChnYyogb2JqZWN0LCB1aW50MzIgbmIpIHsKLSAgYXNzZXJ0KGFzc29jaWF0ZWRPYmplY3QgPT0gb2JqZWN0KTsKLSAgbGx2bV9nY3Jvb3Qob2JqZWN0LCAwKTsKLSAgaW50ZXJuYWxMb2NrLmxvY2tBbGwobmIpOwotfQotCi1ib29sIEZhdExvY2s6Om93bmVyKCkgewotICByZXR1cm4gaW50ZXJuYWxMb2NrLnNlbGZPd25lcigpOwotfQotIAotbXZtOjpUaHJlYWQqIEZhdExvY2s6OmdldE93bmVyKCkgewotICByZXR1cm4gaW50ZXJuYWxMb2NrLmdldE93bmVyKCk7Ci19Ci0gIAotRmF0TG9jazo6RmF0TG9jayh1aW50MzJfdCBpLCBnYyogYSkgewotICBsbHZtX2djcm9vdChhLCAwKTsKLSAgYXNzZXJ0KGEgIT0gTlVMTCk7Ci0gIGZpcnN0VGhyZWFkID0gTlVMTDsKLSAgaW5kZXggPSBpOwotICBhc3NvY2lhdGVkT2JqZWN0ID0gYTsKLSAgd2FpdGluZ1RocmVhZHMgPSAwOwotICBsb2NraW5nVGhyZWFkcyA9IDA7Ci0gIG5leHRGcmVlTG9jayA9IE5VTEw7Ci19Ci0KLXVpbnRwdHJfdCBGYXRMb2NrOjpnZXRJRCgpIHsKLSAgcmV0dXJuIChpbmRleCA8PCBUaGluTG9jazo6Tm9uTG9ja0JpdHMpIHwgVGhpbkxvY2s6OkZhdE1hc2s7Ci19Ci0KLXZvaWQgRmF0TG9jazo6cmVsZWFzZShnYyogb2JqLCBMb2NrU3lzdGVtJiB0YWJsZSkgewotICBsbHZtX2djcm9vdChvYmosIDApOwotICBhc3NlcnQoYXNzb2NpYXRlZE9iamVjdCAmJiAiTm8gYXNzb2NpYXRlZCBvYmplY3Qgd2hlbiByZWxlYXNpbmciKTsKLSAgYXNzZXJ0KGFzc29jaWF0ZWRPYmplY3QgPT0gb2JqICYmICJNaXNtYXRjaCBvYmplY3QgaW4gbG9jayIpOwotICBpZiAoIXdhaXRpbmdUaHJlYWRzICYmICFsb2NraW5nVGhyZWFkcyAmJgotICAgICAgaW50ZXJuYWxMb2NrLnJlY3Vyc2lvbkNvdW50KCkgPT0gMSkgewotICAgIG12bTo6VGhpbkxvY2s6OnJlbW92ZUZhdExvY2sodGhpcywgdGFibGUpOwotICAgIHRhYmxlLmRlYWxsb2NhdGUodGhpcyk7Ci0gIH0KLSAgaW50ZXJuYWxMb2NrLnVubG9jaygpOwotfQotCi0vLy8gYWNxdWlyZSAtIEFjcXVpcmVzIHRoZSBpbnRlcm5hbExvY2suCi0vLy8KLWJvb2wgRmF0TG9jazo6YWNxdWlyZShnYyogb2JqKSB7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gICAgCi0gIHNwaW5Mb2NrLmxvY2soKTsKLSAgbG9ja2luZ1RocmVhZHMrKzsKLSAgc3BpbkxvY2sudW5sb2NrKCk7Ci0gICAgCi0gIGludGVybmFsTG9jay5sb2NrKCk7Ci0gICAgCi0gIHNwaW5Mb2NrLmxvY2soKTsKLSAgbG9ja2luZ1RocmVhZHMtLTsKLSAgc3BpbkxvY2sudW5sb2NrKCk7Ci0KLSAgaWYgKGFzc29jaWF0ZWRPYmplY3QgIT0gb2JqKSB7Ci0gICAgaW50ZXJuYWxMb2NrLnVubG9jaygpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBhc3NlcnQob2JqLT5oZWFkZXIgJiBUaGluTG9jazo6RmF0TWFzayk7Ci0gIGFzc2VydCgob2JqLT5oZWFkZXIgJiB+VGhpbkxvY2s6Ok5vbkxvY2tCaXRzTWFzaykgPT0gZ2V0SUQoKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLXZvaWQgTG9ja1N5c3RlbTo6ZGVhbGxvY2F0ZShGYXRMb2NrKiBsb2NrKSB7Ci0gIGxvY2stPmFzc29jaWF0ZWRPYmplY3QgPSBOVUxMOwotICB0aHJlYWRMb2NrLmxvY2soKTsKLSAgbG9jay0+bmV4dEZyZWVMb2NrID0gZnJlZUxvY2s7Ci0gIGZyZWVMb2NrID0gbG9jazsKLSAgdGhyZWFkTG9jay51bmxvY2soKTsKLX0KLSAgCi1Mb2NrU3lzdGVtOjpMb2NrU3lzdGVtKG12bTo6QnVtcFB0ckFsbG9jYXRvciYgYWxsKSA6IGFsbG9jYXRvcihhbGwpIHsKLSAgYXNzZXJ0KFRoaW5Mb2NrOjpUaGluQ291bnRNYXNrID4gMCk7Ci0gIExvY2tUYWJsZSA9IChGYXRMb2NrKiAqKikKLSAgICBhbGxvY2F0b3IuQWxsb2NhdGUoR2xvYmFsU2l6ZSAqIHNpemVvZihGYXRMb2NrKiopLCAiR2xvYmFsIExvY2tUYWJsZSIpOwotICBMb2NrVGFibGVbMF0gPSAoRmF0TG9jayoqKQotICAgIGFsbG9jYXRvci5BbGxvY2F0ZShJbmRleFNpemUgKiBzaXplb2YoRmF0TG9jayopLCAiSW5kZXggTG9ja1RhYmxlIik7Ci0gIGN1cnJlbnRJbmRleCA9IDA7Ci0gIGZyZWVMb2NrID0gTlVMTDsKLX0KLQotRmF0TG9jayogTG9ja1N5c3RlbTo6YWxsb2NhdGUoZ2MqIG9iaikgeyAgCi0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7IAotICBGYXRMb2NrKiByZXMgPSAwOwotICB0aHJlYWRMb2NrLmxvY2soKTsKLQotICAvLyBUcnkgdGhlIGZyZWVMb2NrIGxpc3QuCi0gIGlmIChmcmVlTG9jayAhPSBOVUxMKSB7Ci0gICAgcmVzID0gZnJlZUxvY2s7Ci0gICAgZnJlZUxvY2sgPSByZXMtPm5leHRGcmVlTG9jazsKLSAgICByZXMtPm5leHRGcmVlTG9jayA9IDA7Ci0gICAgYXNzZXJ0KHJlcy0+YXNzb2NpYXRlZE9iamVjdCA9PSBOVUxMKTsKLSAgICB0aHJlYWRMb2NrLnVubG9jaygpOwotICAgIHJlcy0+YXNzb2NpYXRlZE9iamVjdCA9IG9iajsKLSAgfSBlbHNlIHsgCi0gICAgLy8gR2V0IGFuIGluZGV4LgotICAgIHVpbnQzMl90IGluZGV4ID0gY3VycmVudEluZGV4Kys7Ci0gICAgaWYgKGluZGV4ID09IE1heExvY2tzKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlJhbiBvdXQgb2Ygc3BhY2UgZm9yIGFsbG9jYXRpbmcgbG9ja3MiKTsKLSAgICAgIGFib3J0KCk7Ci0gICAgfQotICAKLSAgICBGYXRMb2NrKiogdGFiID0gTG9ja1RhYmxlW2luZGV4ID4+IEJpdEluZGV4XTsKLSAgCi0gICAgVmlydHVhbE1hY2hpbmUqIHZtID0gb2JqLT5nZXRWaXJ0dWFsVGFibGUoKS0+dm07Ci0gICAgaWYgKHRhYiA9PSBOVUxMKSB7Ci0gICAgICB0YWIgPSAoRmF0TG9jayoqKXZtLT5hbGxvY2F0b3IuQWxsb2NhdGUoCi0gICAgICAgICAgSW5kZXhTaXplICogc2l6ZW9mKEZhdExvY2sqKSwgIkluZGV4IExvY2tUYWJsZSIpOwotICAgIH0KLSAgICB0aHJlYWRMb2NrLnVubG9jaygpOwotICAgCi0gICAgLy8gQWxsb2NhdGUgdGhlIGxvY2suCi0gICAgcmVzID0gbmV3KHZtLT5hbGxvY2F0b3IsICJMb2NrIikgRmF0TG9jayhpbmRleCwgb2JqKTsKLSAgICAKLSAgICAvLyBBZGQgdGhlIGxvY2sgdG8gdGhlIHRhYmxlLgotICAgIHVpbnQzMl90IGludGVybmFsSW5kZXggPSBpbmRleCAmIEJpdE1hc2s7Ci0gICAgdGFiW2ludGVybmFsSW5kZXhdID0gcmVzOwotICB9Ci0gICAKLSAgYXNzZXJ0KHJlcy0+YXNzb2NpYXRlZE9iamVjdCA9PSBvYmopOwotICAvLyBSZXR1cm4gdGhlIGxvY2suCi0gIHJldHVybiByZXM7Ci19Ci0KLQotRmF0TG9jayogTG9ja1N5c3RlbTo6Z2V0RmF0TG9ja0Zyb21JRCh1aW50cHRyX3QgSUQpIHsKLSAgaWYgKElEICYgVGhpbkxvY2s6OkZhdE1hc2spIHsKLSAgICB1aW50MzJfdCBpbmRleCA9IChJRCAmIH5UaGluTG9jazo6RmF0TWFzaykgPj4gVGhpbkxvY2s6Ok5vbkxvY2tCaXRzOwotICAgIEZhdExvY2sqIHJlcyA9IGdldExvY2soaW5kZXgpOwotICAgIHJldHVybiByZXM7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQotCi0KLWJvb2wgTG9ja2luZ1RocmVhZDo6d2FpdCgKLSAgICBnYyogc2VsZiwgTG9ja1N5c3RlbSYgdGFibGUsIHN0cnVjdCB0aW1ldmFsKiBpbmZvLCBib29sIHRpbWVkKSB7Ci0gIGxsdm1fZ2Nyb290KHNlbGYsIDApOwotICBhc3NlcnQobXZtOjpUaGluTG9jazo6b3duZXIoc2VsZiwgdGFibGUpKTsKLQotICBGYXRMb2NrKiBsID0gbXZtOjpUaGluTG9jazo6Y2hhbmdlVG9GYXRsb2NrKHNlbGYsIHRhYmxlKTsKLSAgdGhpcy0+d2FpdHNPbiA9IGw7Ci0gIG12bTo6Q29uZCYgdmFyY29uZFRocmVhZCA9IHRoaXMtPnZhcmNvbmQ7Ci0KLSAgaWYgKHRoaXMtPmludGVycnVwdEZsYWcgIT0gMCkgewotICAgIHRoaXMtPmludGVycnVwdEZsYWcgPSAwOwotICAgIHRoaXMtPndhaXRzT24gPSAwOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICB0aGlzLT5zdGF0ZSA9IExvY2tpbmdUaHJlYWQ6OlN0YXRlV2FpdGluZzsKLSAgaWYgKGwtPmZpcnN0VGhyZWFkKSB7Ci0gICAgYXNzZXJ0KGwtPmZpcnN0VGhyZWFkLT5wcmV2V2FpdGluZyAmJiBsLT5maXJzdFRocmVhZC0+bmV4dFdhaXRpbmcgJiYKLSAgICAgICAgICAgIkluY29uc2lzdGVudCBsaXN0Iik7Ci0gICAgaWYgKGwtPmZpcnN0VGhyZWFkLT5uZXh0V2FpdGluZyA9PSBsLT5maXJzdFRocmVhZCkgewotICAgICAgbC0+Zmlyc3RUaHJlYWQtPm5leHRXYWl0aW5nID0gdGhpczsKLSAgICB9IGVsc2UgewotICAgICAgbC0+Zmlyc3RUaHJlYWQtPnByZXZXYWl0aW5nLT5uZXh0V2FpdGluZyA9IHRoaXM7Ci0gICAgfSAKLSAgICB0aGlzLT5wcmV2V2FpdGluZyA9IGwtPmZpcnN0VGhyZWFkLT5wcmV2V2FpdGluZzsKLSAgICB0aGlzLT5uZXh0V2FpdGluZyA9IGwtPmZpcnN0VGhyZWFkOwotICAgIGwtPmZpcnN0VGhyZWFkLT5wcmV2V2FpdGluZyA9IHRoaXM7Ci0gIH0gZWxzZSB7Ci0gICAgbC0+Zmlyc3RUaHJlYWQgPSB0aGlzOwotICAgIHRoaXMtPm5leHRXYWl0aW5nID0gdGhpczsKLSAgICB0aGlzLT5wcmV2V2FpdGluZyA9IHRoaXM7Ci0gIH0KLSAgCi0gIGFzc2VydCh0aGlzLT5wcmV2V2FpdGluZyAmJiB0aGlzLT5uZXh0V2FpdGluZyAmJiAiSW5jb25zaXN0ZW50IGxpc3QiKTsKLSAgYXNzZXJ0KGwtPmZpcnN0VGhyZWFkLT5wcmV2V2FpdGluZyAmJiBsLT5maXJzdFRocmVhZC0+bmV4dFdhaXRpbmcgJiYKLSAgICAgICAgICJJbmNvbnNpc3RlbnQgbGlzdCIpOwotICAgICAgCi0gIGJvb2wgdGltZW91dCA9IGZhbHNlOwotCi0gIGwtPndhaXRpbmdUaHJlYWRzKys7Ci0KLSAgd2hpbGUgKCF0aGlzLT5pbnRlcnJ1cHRGbGFnICYmIHRoaXMtPm5leHRXYWl0aW5nKSB7Ci0gICAgaWYgKHRpbWVkKSB7Ci0gICAgICB0aW1lb3V0ID0gdmFyY29uZFRocmVhZC50aW1lZFdhaXQoJmwtPmludGVybmFsTG9jaywgaW5mbyk7Ci0gICAgICBpZiAodGltZW91dCkgYnJlYWs7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHZhcmNvbmRUaHJlYWQud2FpdCgmbC0+aW50ZXJuYWxMb2NrKTsKLSAgICB9Ci0gIH0KLSAgICAgIAotICBsLT53YWl0aW5nVGhyZWFkcy0tOwotICAgICAKLSAgYXNzZXJ0KCghbC0+Zmlyc3RUaHJlYWQgfHwgKGwtPmZpcnN0VGhyZWFkLT5wcmV2V2FpdGluZyAmJiAKLSAgICAgICAgIGwtPmZpcnN0VGhyZWFkLT5uZXh0V2FpdGluZykpICYmICJJbmNvbnNpc3RlbnQgbGlzdCIpOwotIAotICBib29sIGludGVycnVwdGVkID0gKHRoaXMtPmludGVycnVwdEZsYWcgIT0gMCk7Ci0KLSAgaWYgKGludGVycnVwdGVkIHx8IHRpbWVvdXQpIHsKLSAgICBpZiAodGhpcy0+bmV4dFdhaXRpbmcpIHsKLSAgICAgIGFzc2VydCh0aGlzLT5wcmV2V2FpdGluZyAmJiAiSW5jb25zaXN0ZW50IGxpc3QiKTsKLSAgICAgIGlmIChsLT5maXJzdFRocmVhZCAhPSB0aGlzKSB7Ci0gICAgICAgIHRoaXMtPm5leHRXYWl0aW5nLT5wcmV2V2FpdGluZyA9IHRoaXMtPnByZXZXYWl0aW5nOwotICAgICAgICB0aGlzLT5wcmV2V2FpdGluZy0+bmV4dFdhaXRpbmcgPSB0aGlzLT5uZXh0V2FpdGluZzsKLSAgICAgICAgYXNzZXJ0KGwtPmZpcnN0VGhyZWFkLT5wcmV2V2FpdGluZyAmJiAKLSAgICAgICAgICAgICAgIGwtPmZpcnN0VGhyZWFkLT5uZXh0V2FpdGluZyAmJiAiSW5jb25zaXN0ZW50IGxpc3QiKTsKLSAgICAgIH0gZWxzZSBpZiAodGhpcy0+bmV4dFdhaXRpbmcgPT0gdGhpcykgewotICAgICAgICBsLT5maXJzdFRocmVhZCA9IE5VTEw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBsLT5maXJzdFRocmVhZCA9IHRoaXMtPm5leHRXYWl0aW5nOwotICAgICAgICBsLT5maXJzdFRocmVhZC0+cHJldldhaXRpbmcgPSB0aGlzLT5wcmV2V2FpdGluZzsKLSAgICAgICAgdGhpcy0+cHJldldhaXRpbmctPm5leHRXYWl0aW5nID0gbC0+Zmlyc3RUaHJlYWQ7Ci0gICAgICAgIGFzc2VydChsLT5maXJzdFRocmVhZC0+cHJldldhaXRpbmcgJiYgCi0gICAgICAgICAgICAgICBsLT5maXJzdFRocmVhZC0+bmV4dFdhaXRpbmcgJiYgIkluY29uc2lzdGVudCBsaXN0Iik7Ci0gICAgICB9Ci0gICAgICB0aGlzLT5uZXh0V2FpdGluZyA9IE5VTEw7Ci0gICAgICB0aGlzLT5wcmV2V2FpdGluZyA9IE5VTEw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGFzc2VydCghdGhpcy0+cHJldldhaXRpbmcgJiYgIkluY29uc3RpdGVudCBzdGF0ZSIpOwotICAgICAgLy8gTm90aWZ5IGxvc3QsIG5vdGlmeSBzb21lb25lIGVsc2UuCi0gICAgICBub3RpZnkoc2VsZiwgdGFibGUpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBhc3NlcnQoIXRoaXMtPnByZXZXYWl0aW5nICYmICF0aGlzLT5uZXh0V2FpdGluZyAmJgotICAgICAgICAgICAiSW5jb25zaXN0ZW50IHN0YXRlIik7Ci0gIH0KLSAgICAgIAotICB0aGlzLT5zdGF0ZSA9IExvY2tpbmdUaHJlYWQ6OlN0YXRlUnVubmluZzsKLSAgdGhpcy0+d2FpdHNPbiA9IE5VTEw7Ci0KLSAgaWYgKGludGVycnVwdGVkKSB7Ci0gICAgdGhpcy0+aW50ZXJydXB0RmxhZyA9IDA7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIGFzc2VydChtdm06OlRoaW5Mb2NrOjpvd25lcihzZWxmLCB0YWJsZSkgJiYgIk5vdCBvd25lciBhZnRlciB3YWl0Iik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBMb2NraW5nVGhyZWFkOjpub3RpZnkoZ2MqIHNlbGYsIExvY2tTeXN0ZW0mIHRhYmxlKSB7Ci0gIGxsdm1fZ2Nyb290KHNlbGYsIDApOwotICBhc3NlcnQobXZtOjpUaGluTG9jazo6b3duZXIoc2VsZiwgdGFibGUpKTsKLSAgRmF0TG9jayogbCA9IG12bTo6VGhpbkxvY2s6OmdldEZhdExvY2soc2VsZiwgdGFibGUpOwotICAKLSAgaWYgKGwgPT0gTlVMTCkgcmV0dXJuOwotICBMb2NraW5nVGhyZWFkKiBjdXIgPSBsLT5maXJzdFRocmVhZDsKLSAgaWYgKGN1ciA9PSBOVUxMKSByZXR1cm47Ci0gIAotICBkbyB7Ci0gICAgaWYgKGN1ci0+aW50ZXJydXB0RmxhZyAhPSAwKSB7Ci0gICAgICBjdXIgPSBjdXItPm5leHRXYWl0aW5nOwotICAgIH0gZWxzZSB7Ci0gICAgICBhc3NlcnQoY3VyLT5wcmV2V2FpdGluZyAmJiBjdXItPm5leHRXYWl0aW5nICYmCi0gICAgICAgICAgICAgIkluY29uc2lzdGVudCBsaXN0Iik7Ci0gICAgICBpZiAoY3VyICE9IGwtPmZpcnN0VGhyZWFkKSB7Ci0gICAgICAgIGN1ci0+cHJldldhaXRpbmctPm5leHRXYWl0aW5nID0gY3VyLT5uZXh0V2FpdGluZzsKLSAgICAgICAgY3VyLT5uZXh0V2FpdGluZy0+cHJldldhaXRpbmcgPSBjdXItPnByZXZXYWl0aW5nOwotICAgICAgICBhc3NlcnQobC0+Zmlyc3RUaHJlYWQtPnByZXZXYWl0aW5nICYmCi0gICAgICAgICAgICAgICBsLT5maXJzdFRocmVhZC0+bmV4dFdhaXRpbmcgJiYgIkluY29uc2lzdGVudCBsaXN0Iik7Ci0gICAgICB9IGVsc2UgaWYgKGN1ci0+bmV4dFdhaXRpbmcgPT0gY3VyKSB7Ci0gICAgICAgIGwtPmZpcnN0VGhyZWFkID0gTlVMTDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGwtPmZpcnN0VGhyZWFkID0gY3VyLT5uZXh0V2FpdGluZzsKLSAgICAgICAgbC0+Zmlyc3RUaHJlYWQtPnByZXZXYWl0aW5nID0gY3VyLT5wcmV2V2FpdGluZzsKLSAgICAgICAgY3VyLT5wcmV2V2FpdGluZy0+bmV4dFdhaXRpbmcgPSBsLT5maXJzdFRocmVhZDsKLSAgICAgICAgYXNzZXJ0KGwtPmZpcnN0VGhyZWFkLT5wcmV2V2FpdGluZyAmJiAKLSAgICAgICAgICAgICAgIGwtPmZpcnN0VGhyZWFkLT5uZXh0V2FpdGluZyAmJiAiSW5jb25zaXN0ZW50IGxpc3QiKTsKLSAgICAgIH0KLSAgICAgIGN1ci0+cHJldldhaXRpbmcgPSBOVUxMOwotICAgICAgY3VyLT5uZXh0V2FpdGluZyA9IE5VTEw7Ci0gICAgICBjdXItPnZhcmNvbmQuc2lnbmFsKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0gd2hpbGUgKGN1ciAhPSBsLT5maXJzdFRocmVhZCk7Ci0KLSAgYXNzZXJ0KG12bTo6VGhpbkxvY2s6Om93bmVyKHNlbGYsIHRhYmxlKSAmJiAiTm90IG93bmVyIGFmdGVyIG5vdGlmeSIpOwotfQotCi12b2lkIExvY2tpbmdUaHJlYWQ6Om5vdGlmeUFsbChnYyogc2VsZiwgTG9ja1N5c3RlbSYgdGFibGUpIHsKLSAgbGx2bV9nY3Jvb3Qoc2VsZiwgMCk7Ci0gIGFzc2VydChtdm06OlRoaW5Mb2NrOjpvd25lcihzZWxmLCB0YWJsZSkpOwotICBGYXRMb2NrKiBsID0gbXZtOjpUaGluTG9jazo6Z2V0RmF0TG9jayhzZWxmLCB0YWJsZSk7Ci0gIGlmIChsID09IE5VTEwpIHJldHVybjsKLSAgTG9ja2luZ1RocmVhZCogY3VyID0gbC0+Zmlyc3RUaHJlYWQ7Ci0gIGlmIChjdXIgPT0gTlVMTCkgcmV0dXJuOwotICBkbyB7Ci0gICAgTG9ja2luZ1RocmVhZCogdGVtcCA9IGN1ci0+bmV4dFdhaXRpbmc7Ci0gICAgY3VyLT5wcmV2V2FpdGluZyA9IE5VTEw7Ci0gICAgY3VyLT5uZXh0V2FpdGluZyA9IE5VTEw7Ci0gICAgY3VyLT52YXJjb25kLnNpZ25hbCgpOwotICAgIGN1ciA9IHRlbXA7Ci0gIH0gd2hpbGUgKGN1ciAhPSBsLT5maXJzdFRocmVhZCk7Ci0gIGwtPmZpcnN0VGhyZWFkID0gTlVMTDsKLSAgYXNzZXJ0KG12bTo6VGhpbkxvY2s6Om93bmVyKHNlbGYsIHRhYmxlKSAmJiAiTm90IG93bmVyIGFmdGVyIG5vdGlmeUFsbCIpOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL012bS9Db21tb25UaHJlYWQvU2lnc2Vndi5jcHAgYi92bWtpdC9saWIvTXZtL0NvbW1vblRocmVhZC9TaWdzZWd2LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE0OWNlOS4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTXZtL0NvbW1vblRocmVhZC9TaWdzZWd2LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0gU2lnc2Vndi5jYyAtIFNpZ3NlZ3YgZGVmYXVsdCBoYW5kbGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0KLSNpbmNsdWRlICJtdm0vVmlydHVhbE1hY2hpbmUuaCIKLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9UaHJlYWQuaCIKLQotI2luY2x1ZGUgPGNzaWduYWw+Ci0jaW5jbHVkZSA8Y3N0ZGlvPgotCi11c2luZyBuYW1lc3BhY2UgbXZtOwotCi0jaWYgZGVmaW5lZChfX01BQ0hfXykgJiYgZGVmaW5lZChfX2kzODZfXykKLSNpbmNsdWRlICJ1Y29udGV4dC5oIgotI2VuZGlmCi0KLXZvaWQgc2lnc2VndkhhbmRsZXIoaW50IG4sIHNpZ2luZm9fdCAqX2luZm8sIHZvaWQgKmNvbnRleHQpIHsKLSAgdWludHB0cl90IGFkZHIgPSAodWludHB0cl90KV9pbmZvLT5zaV9hZGRyOwotI2lmIGRlZmluZWQoX19pMzg2X18pCi0gIHN0cnVjdCBmcmFtZSB7Ci0gICAgc3RydWN0IGZyYW1lICpjYWxsZXI7Ci0gICAgdm9pZCAgICAgICAgICppcDsKLSAgfTsKLSAgCi0gIC8qIG15IGZyYW1lICovCi0gIHN0cnVjdCBmcmFtZSAqZnA7Ci0gIC8qIGdldCBpdCAqLwotICBhc20gKCJtb3YgJSVlYnAsICUwIiA6ICI9JnIiKGZwKSk7Ci0gIC8qIG15IGNhbGxlciAqLwotICBzdHJ1Y3QgZnJhbWUgKmNhbGxlciA9IGZwLT5jYWxsZXI7IAotICAvKiBwcmVzZXJ2ZSBteSBjYWxsZXIgaWYgSSByZXR1cm4gZnJvbSB0aGUgaGFuZGxlciAqLwotICB2b2lkICpjYWxsZXJfaXAgPSBjYWxsZXItPmlwOyAKLQotI2lmIGRlZmluZWQoX19NQUNIX18pCi0gIC8vLmdyZWdzW1JFR19FSVBdOyAvKiBqdXN0IGxpa2UgaXQncyBvbiB0aGUgc3RhY2suLiAqLwotICBjYWxsZXItPmlwID0gKHZvaWQgKikoKHVjb250ZXh0X3QqKWNvbnRleHQpLT51Y19tY29udGV4dC0+X19zcy5fX2VpcDsKLSNlbHNlCi0gIC8qIGp1c3QgbGlrZSBpdCdzIG9uIHRoZSBzdGFjay4uLiAqLwotICBjYWxsZXItPmlwID0gKHZvaWQgKikoKHVjb250ZXh0X3QqKWNvbnRleHQpLT51Y19tY29udGV4dC5ncmVnc1tSRUdfRUlQXTsgCi0jZW5kaWYKLSNlbmRpZgotCi0gIG12bTo6VGhyZWFkKiB0aCA9IG12bTo6VGhyZWFkOjpnZXQoKTsKLSAgaWYgKGFkZHIgPiAodWludHB0cl90KXRoLT5nZXRUaHJlYWRJRCgpICYmIGFkZHIgPCAodWludHB0cl90KXRoLT5iYXNlU1ApIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlN0YWNrIG92ZXJmbG93IGluIFZNIGNvZGUgb3IgaW4gSk5JIGNvZGUuIElmIGl0IGlzIGZyb21cbiIKLSAgICAgICAgICAgICAgICAgICAgInRoZSBWTSwgaXQgaXMgZWl0aGVyIGZyb20gdGhlIEpJVCwgdGhlIEdDIG9yIHRoZSBydW50aW1lLiIKLSAgICAgICAgICAgICAgICAgICAgIlxuVGhpcyBoYXMgdG8gYmUgZml4ZWQgaW4gdGhlIFZNOiBWTUtpdCBtYWtlcyBzdXJlIHRoYXRcbiIKLSAgICAgICAgICAgICAgICAgICAgInRoZSBib3R0b20gb2YgdGhlIHN0YWNrIGlzIGFsd2F5cyBhdmFpbGFibGUgd2hlbiBlbnRlcmluZyIKLSAgICAgICAgICAgICAgICAgICAgIlxudGhlIFZNLlxuIik7Ci0gIH0gZWxzZSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJUaHJlYWQgJXAgcmVjZWl2ZWQgYSBTSUdTRUdWOiBlaXRoZXIgdGhlIFZNIGNvZGUgb3IgYW4gZXh0ZXJuYWxcbiIKLSAgICAgICAgICAgICAgICAgICAgIm5hdGl2ZSBtZXRob2QgaXMgYm9ndXMuIEFib3J0aW5nLi4uXG4iLCAodm9pZCopdGgpOwotICB9Ci0gIHRoLT5wcmludEJhY2t0cmFjZSgpOwotICBhYm9ydCgpOwotICAKLSNpZiBkZWZpbmVkKF9faTM4Nl9fKQotICBjYWxsZXItPmlwID0gY2FsbGVyX2lwOyAvKiByZXN0b3JlIHRoZSBjYWxsZXIgaXAgKi8KLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL012bS9Db21tb25UaHJlYWQvVk1UaHJlYWREYXRhLmNwcCBiL3Zta2l0L2xpYi9Ndm0vQ29tbW9uVGhyZWFkL1ZNVGhyZWFkRGF0YS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxOWQwZjMuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL012bS9Db21tb25UaHJlYWQvVk1UaHJlYWREYXRhLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI2luY2x1ZGUgIm12bS9UaHJlYWRzL1RocmVhZC5oIgotI2luY2x1ZGUgIk11dGF0b3JUaHJlYWQuaCIKLQotdXNpbmcgbmFtZXNwYWNlIG12bTsKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9Ndm0vQ29tbW9uVGhyZWFkL2N0ZXJyb3IuY3BwIGIvdm1raXQvbGliL012bS9Db21tb25UaHJlYWQvY3RlcnJvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyY2EzODQuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL012bS9Db21tb25UaHJlYWQvY3RlcnJvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLS0tIGN0ZXJyb3IuY2MgLSBNdm0gY29tbW9uIHRocmVhZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXZtCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgImN0ZXJyb3IuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLXZvaWQgKCpwZ2Nkb21zZ2YpKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50IGwsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pID0gX2djZG9tc2dmOwotdm9pZCAoKipnY2RvbXNnZikoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQgbCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikJPSAmcGdjZG9tc2dmOwotCi1jb25zdCBjaGFyICpjdHBlcnJvcigpIHsKLQlyZXR1cm4gc3RyZXJyb3IoZXJybm8pOwotfQotCi12b2lkIF9nY2RvbXNnZihjb25zdCBjaGFyICpmaWxlLCB1bnNpZ25lZCBpbnQgbCwgY29uc3QgY2hhciAqZnVuYywgY29uc3QgY2hhciAqbXNnLCAuLi4pCi17Ci0gIHZhX2xpc3QgdmE7Ci0gIHZhX3N0YXJ0KHZhLCBtc2cpOwotICBmcHJpbnRmKHN0ZGVyciwgIkdDW2Vycm9yXSBpbiAlcyBsaW5lICVkIChmdW5jdGlvbiAlcylcbiIsIGZpbGUsIGwsIGZ1bmMpOwotICB2ZnByaW50ZihzdGRlcnIsIG1zZywgdmEpOwotICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0gIHZhX2VuZCh2YSk7Ci0gIGV4aXQoMCk7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL012bS9Db21tb25UaHJlYWQvY3RlcnJvci5oIGIvdm1raXQvbGliL012bS9Db21tb25UaHJlYWQvY3RlcnJvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjAxNDk1Li4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9Ndm0vQ29tbW9uVGhyZWFkL2N0ZXJyb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0tLS0tLSBjdGVycm9yLmggLSBNdm0gY29tbW9uIHRocmVhZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdm0KLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIF9DVF9FUlJPUl9IXwotI2RlZmluZSBfQ1RfRVJST1JfSF8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmN0cGVycm9yKCk7Ci1leHRlcm4gdm9pZAlfZ2Nkb21zZ2YoY29uc3QgY2hhciAqZmlsZSwgdW5zaWduZWQgaW50IGwsIGNvbnN0IGNoYXIgKmZ1bmMsIGNvbnN0IGNoYXIgKm1zZywgLi4uKTsKLWV4dGVybiB2b2lkICgqcGdjZG9tc2dmKShjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCBsLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKLWV4dGVybiB2b2lkICgqKmdjZG9tc2dmKShjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCBsLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKLQotI2RlZmluZSBjdGZhdGFsKG1zZykgKCpnY2RvbXNnZikoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBtc2cpCi0KLSNlbmRpZgotCi0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9Ndm0vQ29tbW9uVGhyZWFkL2N0bG9jay5jcHAgYi92bWtpdC9saWIvTXZtL0NvbW1vblRocmVhZC9jdGxvY2suY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjE4NjEyLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9Ndm0vQ29tbW9uVGhyZWFkL2N0bG9jay5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLy89PT0tLS0gY3Rsb2NrLmNjIC0gQ29tbW9uIHRocmVhZHMgaW1wbGVtZW50YXRpb24gb2YgbG9ja3MgLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBNaWNybyBWaXJ0dWFsIE1hY2hpbmUKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0KLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9Db25kLmgiCi0jaW5jbHVkZSAibXZtL1RocmVhZHMvTG9ja3MuaCIKLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9UaHJlYWQuaCIKLSNpbmNsdWRlICJtdm0vVmlydHVhbE1hY2hpbmUuaCIKLSNpbmNsdWRlICJtdm0vR0MuaCIKLSNpbmNsdWRlICJjdGVycm9yLmgiCi0jaW5jbHVkZSA8Y2Vycm5vPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotCi0KLXVzaW5nIG5hbWVzcGFjZSBtdm07Ci0KLUxvY2s6OkxvY2soKSB7Ci0gIHB0aHJlYWRfbXV0ZXhhdHRyX3QgYXR0cjsKLQotICAvLyBJbml0aWFsaXplIHRoZSBtdXRleCBhdHRyaWJ1dGVzCi0gIGludCBlcnJvcmNvZGUgPSBwdGhyZWFkX211dGV4YXR0cl9pbml0KCZhdHRyKTsKLSAgYXNzZXJ0KGVycm9yY29kZSA9PSAwKTsgCi0KLSAgLy8gSW5pdGlhbGl6ZSB0aGUgbXV0ZXggYXMgYSByZWN1cnNpdmUgbXV0ZXgsIGlmIHJlcXVlc3RlZCwgb3Igbm9ybWFsCi0gIC8vIG90aGVyd2lzZS4KLSAgaW50IGtpbmQgPSBQVEhSRUFEX01VVEVYX05PUk1BTDsKLSAgZXJyb3Jjb2RlID0gcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSgmYXR0ciwga2luZCk7Ci0gIGFzc2VydChlcnJvcmNvZGUgPT0gMCk7IAotCi0jaWYgIWRlZmluZWQoX19GcmVlQlNEX18pICYmICFkZWZpbmVkKF9fT3BlbkJTRF9fKSAmJiAhZGVmaW5lZChfX05ldEJTRF9fKSAmJiBcCi0gICAgIWRlZmluZWQoX19EcmFnb25GbHlfXykKLSAgLy8gTWFrZSBpdCBhIHByb2Nlc3MgbG9jYWwgbXV0ZXgKLSAgZXJyb3Jjb2RlID0gcHRocmVhZF9tdXRleGF0dHJfc2V0cHNoYXJlZCgmYXR0ciwgUFRIUkVBRF9QUk9DRVNTX1BSSVZBVEUpOwotI2VuZGlmCi0KLSAgLy8gSW5pdGlhbGl6ZSB0aGUgbXV0ZXgKLSAgZXJyb3Jjb2RlID0gcHRocmVhZF9tdXRleF9pbml0KCZpbnRlcm5hbExvY2ssICZhdHRyKTsKLSAgYXNzZXJ0KGVycm9yY29kZSA9PSAwKTsgCi0KLSAgLy8gRGVzdHJveSB0aGUgYXR0cmlidXRlcwotICBlcnJvcmNvZGUgPSBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KCZhdHRyKTsKLSAgYXNzZXJ0KGVycm9yY29kZSA9PSAwKTsKLQotICBvd25lciA9IDA7Ci19Ci0KLUxvY2s6On5Mb2NrKCkgewotICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koKHB0aHJlYWRfbXV0ZXhfdCopJmludGVybmFsTG9jayk7Ci19Ci0KLWJvb2wgTG9jazo6c2VsZk93bmVyKCkgewotICByZXR1cm4gb3duZXIgPT0gbXZtOjpUaHJlYWQ6OmdldCgpOwotfQotCi1tdm06OlRocmVhZCogTG9jazo6Z2V0T3duZXIoKSB7Ci0gIHJldHVybiBvd25lcjsKLX0KLQotdm9pZCBMb2NrTm9ybWFsOjpsb2NrKCkgewotICBUaHJlYWQqIHRoID0gVGhyZWFkOjpnZXQoKTsKLSAgdGgtPmVudGVyVW5jb29wZXJhdGl2ZUNvZGUoKTsKLSAgcHRocmVhZF9tdXRleF9sb2NrKChwdGhyZWFkX211dGV4X3QqKSZpbnRlcm5hbExvY2spOwotICB0aC0+bGVhdmVVbmNvb3BlcmF0aXZlQ29kZSgpOwotICBvd25lciA9IHRoOwotfQotCi12b2lkIExvY2tOb3JtYWw6OnVubG9jaygpIHsKLSAgYXNzZXJ0KHNlbGZPd25lcigpICYmICJOb3Qgb3duZXIgd2hlbiB1bmxvY2tpbmciKTsKLSAgb3duZXIgPSAwOwotICBwdGhyZWFkX211dGV4X3VubG9jaygocHRocmVhZF9tdXRleF90KikmaW50ZXJuYWxMb2NrKTsKLX0KLQotdm9pZCBMb2NrUmVjdXJzaXZlOjpsb2NrKCkgewotICBpZiAoIXNlbGZPd25lcigpKSB7Ci0gICAgVGhyZWFkKiB0aCA9IFRocmVhZDo6Z2V0KCk7Ci0gICAgdGgtPmVudGVyVW5jb29wZXJhdGl2ZUNvZGUoKTsKLSAgICBwdGhyZWFkX211dGV4X2xvY2soKHB0aHJlYWRfbXV0ZXhfdCopJmludGVybmFsTG9jayk7Ci0gICAgdGgtPmxlYXZlVW5jb29wZXJhdGl2ZUNvZGUoKTsKLSAgICBvd25lciA9IHRoOwotICB9Ci0gICsrbjsKLX0KLQotaW50IExvY2tSZWN1cnNpdmU6OnRyeUxvY2soKSB7Ci0gIGludCByZXMgPSAwOwotICBpZiAoIXNlbGZPd25lcigpKSB7Ci0gICAgcmVzID0gcHRocmVhZF9tdXRleF90cnlsb2NrKChwdGhyZWFkX211dGV4X3QqKSZpbnRlcm5hbExvY2spOwotICAgIG93bmVyID0gbXZtOjpUaHJlYWQ6OmdldCgpOwotICB9Ci0gICsrbjsKLSAgcmV0dXJuIHJlczsKLX0KLQotdm9pZCBMb2NrUmVjdXJzaXZlOjp1bmxvY2soKSB7Ci0gIGFzc2VydChzZWxmT3duZXIoKSAmJiAiTm90IG93bmVyIHdoZW4gdW5sb2NraW5nIik7Ci0gIC0tbjsKLSAgaWYgKG4gPT0gMCkgewotICAgIG93bmVyID0gMDsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygocHRocmVhZF9tdXRleF90KikmaW50ZXJuYWxMb2NrKTsKLSAgfQotfQotCi1pbnQgTG9ja1JlY3Vyc2l2ZTo6dW5sb2NrQWxsKCkgewotICBhc3NlcnQoc2VsZk93bmVyKCkgJiYgIk5vdCBvd25lciB3aGVuIHVubG9ja2luZyBhbGwiKTsKLSAgaW50IHJlcyA9IG47Ci0gIG4gPSAwOwotICBvd25lciA9IDA7Ci0gIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKChwdGhyZWFkX211dGV4X3QqKSZpbnRlcm5hbExvY2spOwotICByZXR1cm4gcmVzOwotfQotCi12b2lkIExvY2tSZWN1cnNpdmU6OmxvY2tBbGwoaW50IGNvdW50KSB7Ci0gIGlmIChzZWxmT3duZXIoKSkgewotICAgIG4gKz0gY291bnQ7Ci0gIH0gZWxzZSB7Ci0gICAgVGhyZWFkKiB0aCA9IFRocmVhZDo6Z2V0KCk7Ci0gICAgdGgtPmVudGVyVW5jb29wZXJhdGl2ZUNvZGUoKTsKLSAgICBwdGhyZWFkX211dGV4X2xvY2soKHB0aHJlYWRfbXV0ZXhfdCopJmludGVybmFsTG9jayk7Ci0gICAgdGgtPmxlYXZlVW5jb29wZXJhdGl2ZUNvZGUoKTsKLSAgICBvd25lciA9IHRoOwotICAgIG4gPSBjb3VudDsKLSAgfQotfQotCi1Db25kOjpDb25kKCkgewotICBpbnQgZXJyb3Jjb2RlID0gcHRocmVhZF9jb25kX2luaXQoKHB0aHJlYWRfY29uZF90KikmaW50ZXJuYWxDb25kLCBOVUxMKTsKLSAgYXNzZXJ0KGVycm9yY29kZSA9PSAwKTsgCi19Ci0KLUNvbmQ6On5Db25kKCkgewotICBwdGhyZWFkX2NvbmRfZGVzdHJveSgocHRocmVhZF9jb25kX3QqKSZpbnRlcm5hbENvbmQpOwotfQotCi12b2lkIENvbmQ6OmJyb2FkY2FzdCgpIHsKLSAgcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgocHRocmVhZF9jb25kX3QqKSZpbnRlcm5hbENvbmQpOwotfQotCi12b2lkIENvbmQ6OndhaXQoTG9jayogbCkgewotICBhc3NlcnQobC0+c2VsZk93bmVyKCkpOwotICBpbnQgbiA9IGwtPnVuc2FmZVVubG9jaygpOwotCi0gIFRocmVhZCogdGggPSBUaHJlYWQ6OmdldCgpOwotICB0aC0+ZW50ZXJVbmNvb3BlcmF0aXZlQ29kZSgpOwotICBpbnQgcmVzID0gcHRocmVhZF9jb25kX3dhaXQoKHB0aHJlYWRfY29uZF90KikmaW50ZXJuYWxDb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0aHJlYWRfbXV0ZXhfdCopJihsLT5pbnRlcm5hbExvY2spKTsKLSAgdGgtPmxlYXZlVW5jb29wZXJhdGl2ZUNvZGUoKTsKLQotICBhc3NlcnQoIXJlcyAmJiAiRXJyb3Igb24gd2FpdCIpOwotICBsLT51bnNhZmVMb2NrKG4pOwotfQotCi12b2lkIENvbmQ6OnNpZ25hbCgpIHsKLSAgcHRocmVhZF9jb25kX3NpZ25hbCgocHRocmVhZF9jb25kX3QqKSZpbnRlcm5hbENvbmQpOwotfQotCi0jZGVmaW5lIEJJTExJT04gMTAwMDAwMDAwMAotaW50IENvbmQ6OnRpbWVkV2FpdChMb2NrKiBsLCBzdHJ1Y3QgdGltZXZhbCAqcmVmKSB7IAotICBzdHJ1Y3QgdGltZXNwZWMgdGltZW91dDsgCi0gIHN0cnVjdCB0aW1ldmFsIG5vdzsKLSAgZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpOyAKLSAgdGltZW91dC50dl9zZWMgPSBub3cudHZfc2VjICsgcmVmLT50dl9zZWM7IAotICB0aW1lb3V0LnR2X25zZWMgPSAobm93LnR2X3VzZWMgKyByZWYtPnR2X3VzZWMpICogMTAwMDsKLSAgaWYgKHRpbWVvdXQudHZfbnNlYyA+IEJJTExJT04pIHsKLSAgICB0aW1lb3V0LnR2X3NlYysrOwotICAgIHRpbWVvdXQudHZfbnNlYyAtPSBCSUxMSU9OOwotICB9Ci0gIAotICBhc3NlcnQobC0+c2VsZk93bmVyKCkpOwotICBpbnQgbiA9IGwtPnVuc2FmZVVubG9jaygpOwotICAKLSAgVGhyZWFkKiB0aCA9IFRocmVhZDo6Z2V0KCk7Ci0gIHRoLT5lbnRlclVuY29vcGVyYXRpdmVDb2RlKCk7Ci0gIGludCByZXMgPSBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KChwdGhyZWFkX2NvbmRfdCopJmludGVybmFsQ29uZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdGhyZWFkX211dGV4X3QqKSYobC0+aW50ZXJuYWxMb2NrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWVvdXQpOwotICB0aC0+bGVhdmVVbmNvb3BlcmF0aXZlQ29kZSgpOwotICAKLSAgYXNzZXJ0KCghcmVzIHx8IHJlcyA9PSBFVElNRURPVVQpICYmICJFcnJvciBvbiB0aW1lZCB3YWl0Iik7Ci0gIGwtPnVuc2FmZUxvY2sobik7Ci0KLSAgcmV0dXJuIHJlczsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9Ndm0vQ29tbW9uVGhyZWFkL2N0dGhyZWFkLmNwcCBiL3Zta2l0L2xpYi9Ndm0vQ29tbW9uVGhyZWFkL2N0dGhyZWFkLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q3OWYwZS4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTXZtL0NvbW1vblRocmVhZC9jdHRocmVhZC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NTAgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tIGN0dGhyZWFkLmNjIC0gVGhyZWFkIGltcGxlbWVudGF0aW9uIGZvciBWTUtpdCAtLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJkZWJ1Zy5oIgotCi0jaW5jbHVkZSAibXZtL0dDLmgiCi0jaW5jbHVkZSAibXZtL01ldGhvZEluZm8uaCIKLSNpbmNsdWRlICJtdm0vVmlydHVhbE1hY2hpbmUuaCIKLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9Db25kLmgiCi0jaW5jbHVkZSAibXZtL1RocmVhZHMvTG9ja3MuaCIKLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9UaHJlYWQuaCIKLSNpbmNsdWRlICJtdm0vVk1LaXQuaCIKLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8Y3NldGptcD4KLSNpbmNsdWRlIDxjc3RkaW8+Ci0jaW5jbHVkZSA8Y3RpbWU+Ci0jaW5jbHVkZSA8ZGxmY24uaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHNjaGVkLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBtdm07Ci0KLVRocmVhZDo6VGhyZWFkKFZNS2l0KiB2bWspIHsKLSNpZmRlZiBSVU5USU1FX0RXQVJGX0VYQ0VQVElPTlMKLQlpbnRlcm5hbFBlbmRpbmdFeGNlcHRpb24gPSAwOwotI2Vsc2UKLQlsYXN0RXhjZXB0aW9uQnVmZmVyID0gMDsKLSNlbmRpZgotCXZta2l0ID0gdm1rOwotCWxhc3RLbm93bkZyYW1lID0gMDsKLQlwZW5kaW5nRXhjZXB0aW9uID0gMDsKLQlhbGxWbXNEYXRhID0gMDsKLQlzdGF0ZSA9IDA7ICAgICAgICAgICAgIC8vIG5vdCBkYWVtb24sIG5vdCBydW5uaW5nCi0Jdm1rLT5yZWdpc3RlclByZXBhcmVkVGhyZWFkKHRoaXMpOwotfQotCi12b2lkIFRocmVhZDo6c2V0RGFlbW9uKCkgewotCWlmKChzdGF0ZSAmIFRIUkVBRF9SVU5OSU5HKSAmJiAhKHN0YXRlICYgVEhSRUFEX0RBRU1PTikpCi0JCXZta2l0LT5ub25EYWVtb25UaHJlYWRzTWFuYWdlci5sZWF2ZU5vbkRhZW1vbk1vZGUoKTsKLQlzdGF0ZSB8PSBUSFJFQURfREFFTU9OOwotfQotCi12b2lkIFRocmVhZDo6c2V0Tm9uRGFlbW9uKCkgewotCWlmKChzdGF0ZSAmIFRIUkVBRF9SVU5OSU5HKSAmJiAoc3RhdGUgJiBUSFJFQURfREFFTU9OKSkKLQkJdm1raXQtPm5vbkRhZW1vblRocmVhZHNNYW5hZ2VyLmVudGVyTm9uRGFlbW9uTW9kZSgpOwotCXN0YXRlICY9IH5USFJFQURfREFFTU9OOwotfQotCi12b2lkIFRocmVhZDo6YXR0YWNoKFZpcnR1YWxNYWNoaW5lKiB2bSkgewotCXZtRGF0YSA9IGFsbFZtc0RhdGFbdm0tPnZtSURdOwotCi0JaWYoIXZtRGF0YSkgewotCQl2bWtpdC0+dm1raXRMb2NrKCk7Ci0JCXZtRGF0YSA9IGFsbFZtc0RhdGFbdm0tPnZtSURdID0gdm0tPmJ1aWxkVk1UaHJlYWREYXRhKHRoaXMpOwotCQl2bWtpdC0+dm1raXRVbmxvY2soKTsKLQl9Ci19Ci0KLS8vIG11c3QgYmUgcHJvdGVjdGVkIGJ5IHJlbmRlenZvdXMudGhyZWFkTG9jawotdm9pZCBUaHJlYWQ6OnJlYWxsb2NBbGxWbXNEYXRhKGludCBvbGQsIGludCBuKSB7Ci0JVk1UaHJlYWREYXRhICoqbmV3RGF0YSA9IG5ldyBWTVRocmVhZERhdGEqW25dOwotCWlmKG9sZCkgewotCQltZW1jcHkobmV3RGF0YSwgYWxsVm1zRGF0YSwgb2xkKnNpemVvZihWTVRocmVhZERhdGEqKSk7Ci0JCVZNVGhyZWFkRGF0YSAqKm9sZERhdGEgPSBhbGxWbXNEYXRhOwotCQlhbGxWbXNEYXRhID0gbmV3RGF0YTsKLQkJZGVsZXRlIG9sZERhdGE7Ci0JfSBlbHNlCi0JCWFsbFZtc0RhdGEgPSBuZXdEYXRhOwotCW1lbXNldChhbGxWbXNEYXRhICsgb2xkKnNpemVvZihWTVRocmVhZERhdGEqKSwgMCwgKG4tb2xkKSpzaXplb2YoVk1UaHJlYWREYXRhKikpOwotfQotCi12b2lkIFRocmVhZDo6dHJhY2VyKHVpbnRwdHJfdCBjbG9zdXJlKSB7Ci0JbXZtOjpDb2xsZWN0b3I6Om1hcmtBbmRUcmFjZVJvb3QoJnBlbmRpbmdFeGNlcHRpb24sIGNsb3N1cmUpOwotCi0JLy8gc2hvdWxkIHdlIHRha2UgdGhlIHZta2l0IGxvY2s/IEkgc3VwcG9zZSB0aGF0IGFsbCB0aGUgdGhyZWFkcyBhcmUgc3VzcGVuZGVkIGR1cmluZyB0aGUgY29sbGVjdGlvbi4uLgotCWZvcihzaXplX3QgaT0wOyBpPHZta2l0LT52bXNBcnJheVNpemU7IGkrKykKLQkJaWYoYWxsVm1zRGF0YVtpXSkgewotCQkJYWxsVm1zRGF0YVtpXS0+dHJhY2VyKGNsb3N1cmUpOwotCQl9Ci19Ci0KLWludCBUaHJlYWQ6OmtpbGwodm9pZCogdGlkLCBpbnQgc2lnbm8pIHsKLSAgcmV0dXJuIHB0aHJlYWRfa2lsbCgocHRocmVhZF90KXRpZCwgc2lnbm8pOwotfQotCi1pbnQgVGhyZWFkOjpraWxsKGludCBzaWdubykgewotICByZXR1cm4gcHRocmVhZF9raWxsKChwdGhyZWFkX3QpaW50ZXJuYWxUaHJlYWRJRCwgc2lnbm8pOwotfQotCi12b2lkIFRocmVhZDo6ZXhpdChpbnQgdmFsdWUpIHsKLSAgcHRocmVhZF9leGl0KCh2b2lkKil2YWx1ZSk7Ci19Ci0KLXZvaWQgVGhyZWFkOjp5aWVsZCh2b2lkKSB7Ci0gIFRocmVhZCogdGggPSBtdm06OlRocmVhZDo6Z2V0KCk7Ci0gIGlmICh0aC0+aXNNdm1UaHJlYWQoKSkgewotICAgIGlmICh0aC0+ZG9ZaWVsZCAmJiAhdGgtPmluUlYpIHsKLSAgICAgIHRoLT52bWtpdC0+cmVuZGV6dm91cy5qb2luKCk7Ci0gICAgfQotICB9Ci0gIHNjaGVkX3lpZWxkKCk7Ci19Ci0KLXZvaWQgVGhyZWFkOjpqb2luUlZCZWZvcmVFbnRlcigpIHsKLSAgdm1raXQtPnJlbmRlenZvdXMuam9pbkJlZm9yZVVuY29vcGVyYXRpdmUoKTsgCi19Ci0KLXZvaWQgVGhyZWFkOjpqb2luUlZBZnRlckxlYXZlKHZvaWQqIHNhdmVkU1ApIHsKLSAgdm1raXQtPnJlbmRlenZvdXMuam9pbkFmdGVyVW5jb29wZXJhdGl2ZShzYXZlZFNQKTsgCi19Ci0KLXZvaWQgVGhyZWFkOjpzdGFydEtub3duRnJhbWUoS25vd25GcmFtZSYgRikgewotICAvLyBHZXQgdGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uCi0gIHZvaWQqKiBjdXIgPSAodm9pZCoqKUZSQU1FX1BUUigpOwotICAvLyBHZXQgdGhlIGNhbGxlciBvZiB0aGUgY2FsbGVyLgotICBjdXIgPSAodm9pZCoqKWN1clswXTsKLSAgRi5wcmV2aW91c0ZyYW1lID0gbGFzdEtub3duRnJhbWU7Ci0gIEYuY3VycmVudEZQID0gY3VyOwotICAvLyBUaGlzIGlzIHVzZWQgYXMgYSBtYXJrZXIuCi0gIEYuY3VycmVudElQID0gTlVMTDsKLSAgbGFzdEtub3duRnJhbWUgPSAmRjsKLX0KLQotdm9pZCBUaHJlYWQ6OmVuZEtub3duRnJhbWUoKSB7Ci0gIGFzc2VydChsYXN0S25vd25GcmFtZS0+Y3VycmVudElQID09IE5VTEwpOwotICBsYXN0S25vd25GcmFtZSA9IGxhc3RLbm93bkZyYW1lLT5wcmV2aW91c0ZyYW1lOwotfQotCi12b2lkIFRocmVhZDo6c3RhcnRVbmtub3duRnJhbWUoS25vd25GcmFtZSYgRikgewotICAvLyBHZXQgdGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uCi0gIHZvaWQqKiBjdXIgPSAodm9pZCoqKUZSQU1FX1BUUigpOwotICAvLyBHZXQgdGhlIGNhbGxlciBvZiB0aGUgY2FsbGVyLgotICBjdXIgPSAodm9pZCoqKWN1clswXTsKLSAgRi5wcmV2aW91c0ZyYW1lID0gbGFzdEtub3duRnJhbWU7Ci0gIEYuY3VycmVudEZQID0gY3VyOwotICBGLmN1cnJlbnRJUCA9IEZSQU1FX0lQKGN1cik7Ci0gIGxhc3RLbm93bkZyYW1lID0gJkY7Ci19Ci0KLXZvaWQgVGhyZWFkOjplbmRVbmtub3duRnJhbWUoKSB7Ci0gIGFzc2VydChsYXN0S25vd25GcmFtZS0+Y3VycmVudElQICE9IE5VTEwpOwotICBsYXN0S25vd25GcmFtZSA9IGxhc3RLbm93bkZyYW1lLT5wcmV2aW91c0ZyYW1lOwotfQotCi0jaWYgZGVmaW5lZChfX01BQ0hfXykKLSNkZWZpbmUgU0VMRl9IQU5ETEUgUlRMRF9ERUZBVUxUCi0jZWxzZQotI2RlZmluZSBTRUxGX0hBTkRMRSAwCi0jZW5kaWYKLQotVGhyZWFkKiBUaHJlYWQ6OnNldFBlbmRpbmdFeGNlcHRpb24oZ2MgKm9iaikgewotCWxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gIGFzc2VydChwZW5kaW5nRXhjZXB0aW9uID09IDAgJiYgInBlbmRpbmcgZXhjZXB0aW9uIGFscmVhZHkgdGhlcmU/Iik7Ci0JcGVuZGluZ0V4Y2VwdGlvbiA9IG9iajsKLQlyZXR1cm4gdGhpczsKLX0KLQotdm9pZCBUaHJlYWQ6OnRocm93SXQoKSB7Ci0gIGFzc2VydChwZW5kaW5nRXhjZXB0aW9uKTsKLQotI2lmZGVmIFJVTlRJTUVfRFdBUkZfRVhDRVBUSU9OUwotICAvLyBVc2UgZGxzeW0gaW5zdGVhZCBvZiBnZXR0aW5nIHRoZSBmdW5jdGlvbnMgc3RhdGljYWxseSB3aXRoIGV4dGVybiAiQyIKLSAgLy8gYmVjYXVzZSBnY2MgY29tcGlsZXMgZXhjZXB0aW9ucyBkaWZmZXJlbnRseS4KLSAgdHlwZWRlZiB2b2lkKiAoKmN4YV9hbGxvY2F0ZV9leGNlcHRpb25fdHlwZSkodW5zaWduZWQpOwotICB0eXBlZGVmIHZvaWQgICgqY3hhX3Rocm93X3R5cGUpKHZvaWQqLCB2b2lkKiwgdm9pZCopOwotICAKLSAgc3RhdGljIGN4YV9hbGxvY2F0ZV9leGNlcHRpb25fdHlwZSBjeGFfYWxsb2NhdGVfZXhjZXB0aW9uID0KLSAgICAoY3hhX2FsbG9jYXRlX2V4Y2VwdGlvbl90eXBlKSh1aW50cHRyX3QpCi0gICAgZGxzeW0oU0VMRl9IQU5ETEUsICJfX2N4YV9hbGxvY2F0ZV9leGNlcHRpb24iKTsKLSAgCi0gIHN0YXRpYyBjeGFfdGhyb3dfdHlwZSBjeGFfdGhyb3cgPQotICAgIChjeGFfdGhyb3dfdHlwZSkodWludHB0cl90KQotICAgIGRsc3ltKFNFTEZfSEFORExFLCAiX19jeGFfdGhyb3ciKTsKLSAgCi0gIHZvaWQqIGV4YyA9IGN4YV9hbGxvY2F0ZV9leGNlcHRpb24oMCk7Ci0gIC8vIDMyID0gc2l6ZW9mKF9VbndpbmRfRXhjZXB0aW9uKSBpbiBsaWJnY2MuLi4gIAotICBpbnRlcm5hbFBlbmRpbmdFeGNlcHRpb24gPSAodm9pZCopKCh1aW50cHRyX3QpZXhjIC0gMzIpOwotICBjeGFfdGhyb3coZXhjLCAwLCAwKTsKLSNlbHNlCi0jaWYgZGVmaW5lZChfX01BQ0hfXykKLSAgX2xvbmdqbXAobGFzdEV4Y2VwdGlvbkJ1ZmZlci0+YnVmZmVyLCAxKTsKLSNlbHNlCi0gIGxvbmdqbXAobGFzdEV4Y2VwdGlvbkJ1ZmZlci0+YnVmZmVyLCAxKTsKLSNlbmRpZgotI2VuZGlmCi19Ci0KLXZvaWQgVGhyZWFkOjpwcmludEJhY2t0cmFjZSgpIHsKLSAgU3RhY2tXYWxrZXIgV2Fsa2VyKHRoaXMpOwotCi0gIHdoaWxlIChNZXRob2RJbmZvKiBNSSA9IFdhbGtlci5nZXQoKSkgewotICAgIE1JLT5wcmludChXYWxrZXIuaXAsIFdhbGtlci5hZGRyKTsKLSAgICArK1dhbGtlcjsKLSAgfQotfQotCi12b2lkIFRocmVhZDo6Z2V0RnJhbWVDb250ZXh0KHZvaWQqKiBidWZmZXIpIHsKLSAgbXZtOjpTdGFja1dhbGtlciBXYWxrZXIodGhpcyk7Ci0gIHVpbnQzMl90IGkgPSAwOwotCi0gIHdoaWxlICh2b2lkKiBpcCA9ICpXYWxrZXIpIHsKLSAgICBidWZmZXJbaSsrXSA9IGlwOwotICAgICsrV2Fsa2VyOwotICB9Ci19Ci0KLXVpbnQzMl90IFRocmVhZDo6Z2V0RnJhbWVDb250ZXh0TGVuZ3RoKCkgewotICBtdm06OlN0YWNrV2Fsa2VyIFdhbGtlcih0aGlzKTsKLSAgdWludDMyX3QgaSA9IDA7Ci0KLSAgd2hpbGUgKCpXYWxrZXIpIHsKLSAgICArK2k7Ci0gICAgKytXYWxrZXI7Ci0gIH0KLSAgcmV0dXJuIGk7Ci19Ci0KLU1ldGhvZEluZm8qIFN0YWNrV2Fsa2VyOjpnZXQoKSB7Ci0gIGlmIChhZGRyID09IHRocmVhZC0+YmFzZVNQKSByZXR1cm4gMDsKLSAgaXAgPSBGUkFNRV9JUChhZGRyKTsKLSAgYm9vbCBpc1N0dWIgPSAoKHVuc2lnbmVkIGNoYXIqKWlwKVswXSA9PSAweENFOwotICBpZiAoaXNTdHViKSBpcCA9IGFkZHJbMl07Ci0gIHJldHVybiB0aHJlYWQtPnZta2l0LT5JUFRvTWV0aG9kSW5mbyhpcCk7Ci19Ci0KLXZvaWQqIFN0YWNrV2Fsa2VyOjpvcGVyYXRvciooKSB7Ci0gIGlmIChhZGRyID09IHRocmVhZC0+YmFzZVNQKSByZXR1cm4gMDsKLSAgaXAgPSBGUkFNRV9JUChhZGRyKTsKLSAgYm9vbCBpc1N0dWIgPSAoKHVuc2lnbmVkIGNoYXIqKWlwKVswXSA9PSAweENFOwotICBpZiAoaXNTdHViKSBpcCA9IGFkZHJbMl07Ci0gIHJldHVybiBpcDsKLX0KLQotdm9pZCBTdGFja1dhbGtlcjo6b3BlcmF0b3IrKygpIHsKLSAgaWYgKGFkZHIgIT0gdGhyZWFkLT5iYXNlU1ApIHsKLSAgICBhc3NlcnQoKGFkZHIgPCB0aHJlYWQtPmJhc2VTUCkgJiYgIkNvcnJ1cHRlZCBzdGFjayIpOwotICAgIGFzc2VydCgoYWRkciA8IGFkZHJbMF0pICYmICJDb3JydXB0ZWQgc3RhY2siKTsKLSAgICBpZiAoKGZyYW1lICE9IE5VTEwpICYmIChhZGRyID09IGZyYW1lLT5jdXJyZW50RlApKSB7Ci0gICAgICBhc3NlcnQoZnJhbWUtPmN1cnJlbnRJUCA9PSBOVUxMKTsKLSAgICAgIGZyYW1lID0gZnJhbWUtPnByZXZpb3VzRnJhbWU7Ci0gICAgICBhc3NlcnQoZnJhbWUgIT0gTlVMTCk7Ci0gICAgICBhc3NlcnQoZnJhbWUtPmN1cnJlbnRJUCAhPSBOVUxMKTsKLSAgICAgIGFkZHIgPSAodm9pZCoqKWZyYW1lLT5jdXJyZW50RlA7Ci0gICAgICBmcmFtZSA9IGZyYW1lLT5wcmV2aW91c0ZyYW1lOwotICAgIH0gZWxzZSB7Ci0gICAgICBhZGRyID0gKHZvaWQqKilhZGRyWzBdOwotICAgIH0KLSAgfQotfQotCi1TdGFja1dhbGtlcjo6U3RhY2tXYWxrZXIobXZtOjpUaHJlYWQqIHRoKSB7Ci0gIHRocmVhZCA9IHRoOwotICBmcmFtZSA9IHRoLT5sYXN0S25vd25GcmFtZTsKLSAgaWYgKG12bTo6VGhyZWFkOjpnZXQoKSA9PSB0aCkgewotICAgIGFkZHIgPSAodm9pZCoqKUZSQU1FX1BUUigpOwotICAgIGFkZHIgPSAodm9pZCoqKWFkZHJbMF07Ci0gIH0gZWxzZSB7Ci0gICAgYWRkciA9ICh2b2lkKiopdGgtPndhaXRPblNQKCk7Ci0gICAgaWYgKGZyYW1lKSB7Ci0gICAgICBhc3NlcnQoZnJhbWUtPmN1cnJlbnRGUCA+PSBhZGRyKTsKLSAgICB9Ci0gICAgaWYgKGZyYW1lICYmIChhZGRyID09IGZyYW1lLT5jdXJyZW50RlApKSB7Ci0gICAgICBmcmFtZSA9IGZyYW1lLT5wcmV2aW91c0ZyYW1lOwotICAgICAgYXNzZXJ0KChmcmFtZSA9PSBOVUxMKSB8fCAoZnJhbWUtPmN1cnJlbnRJUCA9PSBOVUxMKSk7Ci0gICAgfQotICB9Ci0gIGFzc2VydChhZGRyICYmICJObyBhZGRyZXNzIHRvIHN0YXJ0IHdpdGgiKTsKLX0KLQotCi0jaWZkZWYgV0lUSF9MTFZNX0dDQwotdm9pZCBUaHJlYWQ6OnNjYW5TdGFjayh1aW50cHRyX3QgY2xvc3VyZSkgewotICBTdGFja1dhbGtlciBXYWxrZXIodGhpcyk7Ci0gIHdoaWxlIChNZXRob2RJbmZvKiBNSSA9IFdhbGtlci5nZXQoKSkgewotICAgIE1JLT5zY2FuKGNsb3N1cmUsIFdhbGtlci5pcCwgV2Fsa2VyLmFkZHIpOwotICAgICsrV2Fsa2VyOwotICB9Ci19Ci0KLSNlbHNlCi0KLXZvaWQgVGhyZWFkOjpzY2FuU3RhY2sodWludHB0cl90IGNsb3N1cmUpIHsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50ICAqKm1heCA9ICh1bnNpZ25lZCBpbnQqKikodm9pZCopdGhpcy0+YmFzZVNQOwotICBpZiAobXZtOjpUaHJlYWQ6OmdldCgpICE9IHRoaXMpIHsKLSAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgICoqY3VyID0gKHVuc2lnbmVkIGludCoqKXRoaXMtPndhaXRPblNQKCk7Ci0gICAgZm9yKDsgY3VyPG1heDsgY3VyKyspIENvbGxlY3Rvcjo6c2Nhbk9iamVjdCgodm9pZCoqKWN1ciwgY2xvc3VyZSk7Ci0gIH0gZWxzZSB7Ci0gICAgam1wX2J1ZiBidWY7Ci0gICAgc2V0am1wKGJ1Zik7Ci0gICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50ICAqKmN1ciA9ICh1bnNpZ25lZCBpbnQqKikmYnVmOwotICAgIGZvcig7IGN1cjxtYXg7IGN1cisrKSBDb2xsZWN0b3I6OnNjYW5PYmplY3QoKHZvaWQqKiljdXIsIGNsb3N1cmUpOwotICB9Ci19Ci0jZW5kaWYKLQotdm9pZCBUaHJlYWQ6OmVudGVyVW5jb29wZXJhdGl2ZUNvZGUodW5zaWduZWQgbGV2ZWwpIHsKLSAgaWYgKGlzTXZtVGhyZWFkKCkpIHsKLSAgICBpZiAoIWluUlYpIHsKLSAgICAgIGFzc2VydCghbGFzdFNQICYmICJTUCBhbHJlYWR5IHNldCB3aGVuIGVudGVyaW5nIHVuY29vcGVyYXRpdmUgY29kZSIpOwotICAgICAgLy8gR2V0IHRoZSBjYWxsZXIuCi0gICAgICB2b2lkKiB0ZW1wID0gRlJBTUVfUFRSKCk7Ci0gICAgICAvLyBNYWtlIHN1cmUgdG8gYXQgbGVhc3QgZ2V0IHRoZSBjYWxsZXIgb2YgdGhlIGNhbGxlci4KLSAgICAgICsrbGV2ZWw7Ci0gICAgICB3aGlsZSAobGV2ZWwtLSkgdGVtcCA9ICgodm9pZCoqKXRlbXApWzBdOwotICAgICAgLy8gVGhlIGNhcyBpcyBub3QgbmVjZXNzYXJ5LCBidXQgaXQgZG9lcyBhIG1lbW9yeSBiYXJyaWVyLgotICAgICAgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCgmbGFzdFNQLCAwLCB0ZW1wKTsKLSAgICAgIGlmIChkb1lpZWxkKSBqb2luUlZCZWZvcmVFbnRlcigpOwotICAgICAgYXNzZXJ0KGxhc3RTUCAmJiAiTm8gbGFzdCBTUCB3aGVuIGVudGVyaW5nIHVuY29vcGVyYXRpdmUgY29kZSIpOwotICAgIH0KLSAgfQotfQotCi12b2lkIFRocmVhZDo6ZW50ZXJVbmNvb3BlcmF0aXZlQ29kZSh2b2lkKiBTUCkgewotICBpZiAoaXNNdm1UaHJlYWQoKSkgewotICAgIGlmICghaW5SVikgewotICAgICAgYXNzZXJ0KCFsYXN0U1AgJiYgIlNQIGFscmVhZHkgc2V0IHdoZW4gZW50ZXJpbmcgdW5jb29wZXJhdGl2ZSBjb2RlIik7Ci0gICAgICAvLyBUaGUgY2FzIGlzIG5vdCBuZWNlc3NhcnksIGJ1dCBpdCBkb2VzIGEgbWVtb3J5IGJhcnJpZXIuCi0gICAgICBfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKCZsYXN0U1AsIDAsIFNQKTsKLSAgICAgIGlmIChkb1lpZWxkKSBqb2luUlZCZWZvcmVFbnRlcigpOwotICAgICAgYXNzZXJ0KGxhc3RTUCAmJiAiTm8gbGFzdCBTUCB3aGVuIGVudGVyaW5nIHVuY29vcGVyYXRpdmUgY29kZSIpOwotICAgIH0KLSAgfQotfQotCi12b2lkIFRocmVhZDo6bGVhdmVVbmNvb3BlcmF0aXZlQ29kZSgpIHsKLSAgaWYgKGlzTXZtVGhyZWFkKCkpIHsKLSAgICBpZiAoIWluUlYpIHsKLSAgICAgIGFzc2VydChsYXN0U1AgJiYgIk5vIGxhc3QgU1Agd2hlbiBsZWF2aW5nIHVuY29vcGVyYXRpdmUgY29kZSIpOwotICAgICAgdm9pZCogc2F2ZWRTUCA9IGxhc3RTUDsKLSAgICAgIC8vIFRoZSBjYXMgaXMgbm90IG5lY2Vzc2FyeSwgYnV0IGl0IGRvZXMgYSBtZW1vcnkgYmFycmllci4KLSAgICAgIF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAoJmxhc3RTUCwgbGFzdFNQLCAwKTsKLSAgICAgIC8vIEEgcmVuZGV6dm91cyBoYXMganVzdCBiZWVuIGluaXRpYXRlZCwgam9pbiBpdC4KLSAgICAgIGlmIChkb1lpZWxkKSBqb2luUlZBZnRlckxlYXZlKHNhdmVkU1ApOwotICAgICAgYXNzZXJ0KCFsYXN0U1AgJiYgIlNQIGhhcyBhIHZhbHVlIGFmdGVyIGxlYXZpbmcgdW5jb29wZXJhdGl2ZSBjb2RlIik7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQqIFRocmVhZDo6d2FpdE9uU1AoKSB7Ci0gIC8vIEZpcnN0IHNlZSBpZiB3ZSBjYW4gZ2V0IGxhc3RTUCBkaXJlY3RseS4KLSAgdm9pZCogc3AgPSBsYXN0U1A7Ci0gIGlmIChzcCkgcmV0dXJuIHNwOwotICAKLSAgLy8gVGhlbiBsb29wIGEgZml4ZWQgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gZ2V0IGxhc3RTUC4KLSAgZm9yICh1aW50MzIgY291bnQgPSAwOyBjb3VudCA8IDEwMDA7ICsrY291bnQpIHsKLSAgICBzcCA9IGxhc3RTUDsKLSAgICBpZiAoc3ApIHJldHVybiBzcDsKLSAgfQotICAKLSAgLy8gRmluYWxseSwgeWllbGQgdW50aWwgbGFzdFNQIGlzIG5vdCBzZXQuCi0gIHdoaWxlICgoc3AgPSBsYXN0U1ApID09IE5VTEwpIG12bTo6VGhyZWFkOjp5aWVsZCgpOwotCi0gIGFzc2VydChzcCAhPSBOVUxMICYmICJTdGlsbCBubyBzcCIpOwotICByZXR1cm4gc3A7Ci19Ci0KLQotdWludHB0cl90IFRocmVhZDo6YmFzZUFkZHIgPSAwOwotCi0vLyBUaGVzZSBjb3VsZCBiZSBzZXQgYXQgcnVudGltZS4KLSNkZWZpbmUgU1RBQ0tfU0laRSAweDEwMDAwMAotI2RlZmluZSBOUl9USFJFQURTIDI1NQotCi0jaWYgKF9fV09SRFNJWkUgPT0gNjQpCi0jZGVmaW5lIFNUQVJUX0FERFIgMHgxMTAwMDAwMDAKLSNkZWZpbmUgRU5EX0FERFIgMHgxNzAwMDAwMDAKLSNlbHNlCi0jZGVmaW5lIFNUQVJUX0FERFIgMHgxMDAwMDAwMAotI2RlZmluZSBFTkRfQUREUiAweDcwMDAwMDAwCi0jZW5kaWYKLQotLy8vIFN0YWNrVGhyZWFkTWFuYWdlciAtIFRoaXMgY2xhc3MgYWxsb2NhdGVzIGFsbCBzdGFja3MgZm9yIHRocmVhZHMuIEJlY2F1c2UKLS8vLyB3ZSB3YW50IGZhc3QgYWNjZXNzIHRvIHRocmVhZCBsb2NhbCBkYXRhLCBhbmQgY2FuIG5vdCByZWx5IG9uIHBsYXRmb3JtCi0vLy8gZGVwZW5kZW50IHRocmVhZCBsb2NhbCBzdG9yYWdlIChlZyBwdGhyZWFkIGtleXMgYXJlIGluZWZmaWNpZW50LCB0bHMgaXMKLS8vLyBzcGVjaWZpYyB0byBMaW51eCksIHdlIHB1dCB0aHJlYWQgbG9jYWwgZGF0YSBhdCB0aGUgYm90dG9tIG9mIHRoZSAKLS8vLyBzdGFjay4gQSBzaW1wbGUgbWFzayBjb21wdXRlcyB0aGUgdGhyZWFkIGxvY2FsIGRhdGEgLCBiYXNlZCBvbiB0aGUgY3VycmVudAotLy8vIHN0YWNrIHBvaW50ZXIuCi0vLwotLy8vIFRoZSBzdGFja3MgYXJlIGFsbG9jYXRlZCBhdCBib290IHRpbWUuIFRoZXkgbXVzdCBhbGwgYmUgaW4gdGhlIG1lbW9yeSByYW5nZQotLy8vIDB4PzAwMDAwMDAgYW5kIE94KD8rMSkwMDAwMDAwLCBzbyB0aGF0IHRoZSB0aHJlYWQgbG9jYWwgZGF0YSBjYW4gYmUgY29tcHV0ZWQKLS8vLyBhbmQgdGhyZWFkcyBoYXZlIGEgdW5pcXVlIElELgotLy8vCi1jbGFzcyBTdGFja1RocmVhZE1hbmFnZXIgewotcHVibGljOgotICB1aW50cHRyX3QgYmFzZUFkZHI7Ci0gIHVpbnQzMiBhbGxvY1B0cjsKLSAgdWludDMyIHVzZWRbTlJfVEhSRUFEU107Ci0gIExvY2tOb3JtYWwgc3RhY2tMb2NrOwotCi0gIFN0YWNrVGhyZWFkTWFuYWdlcigpIHsKLSAgICBiYXNlQWRkciA9IDA7Ci0gICAgdWludHB0cl90IHB0ciA9IFNUQVJUX0FERFI7Ci0KLSAgICAvLyBEbyBhbiBtbWFwIGF0IGEgZml4ZWQgYWRkcmVzcy4gSWYgdGhlIG1tYXAgZmFpbHMgZm9yIGEgZ2l2ZW4gYWRkcmVzcwotICAgIC8vIHVzZSB0aGUgbmV4dCBvbmUuCi0gICAgd2hpbGUgKCFiYXNlQWRkciAmJiBwdHIgIT0gRU5EX0FERFIpIHsKLSAgICAgIHB0ciA9IHB0ciArIDB4MTAwMDAwMDA7Ci0jaWYgZGVmaW5lZCAoX19NQUNIX18pCi0gICAgICB1aW50MzIgZmxhZ3MgPSBNQVBfUFJJVkFURSB8IE1BUF9BTk9OIHwgTUFQX0ZJWEVEOwotI2Vsc2UKLSAgICAgIHVpbnQzMiBmbGFncyA9IE1BUF9QUklWQVRFIHwgTUFQX0FOT05ZTU9VUyB8IE1BUF9GSVhFRDsKLSNlbmRpZgotICAgICAgYmFzZUFkZHIgPSAodWludHB0cl90KW1tYXAoKHZvaWQqKXB0ciwgU1RBQ0tfU0laRSAqIE5SX1RIUkVBRFMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgZmxhZ3MsIC0xLCAwKTsKLSAgICAgIGlmIChiYXNlQWRkciA9PSAodWludHB0cl90KU1BUF9GQUlMRUQpIGJhc2VBZGRyID0gMDsKLSAgICB9Ci0gICAgaWYgKCFiYXNlQWRkcikgewotICAgICAgZnByaW50ZihzdGRlcnIsICJDYW4gbm90IGFsbG9jYXRlIHRocmVhZCBtZW1vcnlcbiIpOwotICAgICAgYWJvcnQoKTsKLSAgICB9Ci0gCi0gICAgLy8gUHJvdGVjdCB0aGUgcGFnZSBhZnRlciB0aGUgZmlyc3QgcGFnZS4gVGhlIGZpcnN0IHBhZ2UgY29udGFpbnMgdGhyZWFkCi0gICAgLy8gc3BlY2lmaWMgZGF0YS4gVGhlIHNlY29uZCBwYWdlIGhhcyBubyBhY2Nlc3MgcmlnaHRzIHRvIGNhdGNoIHN0YWNrCi0gICAgLy8gb3ZlcmZsb3dzLgotICAgIHVpbnQzMiBwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0gICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBOUl9USFJFQURTOyArK2kpIHsKLSAgICAgIHVpbnRwdHJfdCBhZGRyID0gYmFzZUFkZHIgKyAoaSAqIFNUQUNLX1NJWkUpICsgcGFnZXNpemU7Ci0gICAgICBtcHJvdGVjdCgodm9pZCopYWRkciwgcGFnZXNpemUsIFBST1RfTk9ORSk7Ci0gICAgfQotCi0gICAgbWVtc2V0KCh2b2lkKil1c2VkLCAwLCBOUl9USFJFQURTICogc2l6ZW9mKHVpbnQzMikpOwotICAgIGFsbG9jUHRyID0gMDsKLSAgICBtdm06OlRocmVhZDo6YmFzZUFkZHIgPSBiYXNlQWRkcjsKLSAgfQotCi0gIHVpbnRwdHJfdCBhbGxvY2F0ZSgpIHsKLSAgICBzdGFja0xvY2subG9jaygpOwotICAgIHVpbnQzMiBteUluZGV4ID0gMDsKLSAgICBkbyB7Ci0gICAgICBpZiAoIXVzZWRbbXlJbmRleF0pIHsKLSAgICAgICAgdXNlZFtteUluZGV4XSA9IDE7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgKytteUluZGV4OwotICAgIH0gd2hpbGUgKG15SW5kZXggIT0gTlJfVEhSRUFEUyk7Ci0gIAotICAgIHN0YWNrTG9jay51bmxvY2soKTsKLSAgICAKLSAgICBpZiAobXlJbmRleCAhPSBOUl9USFJFQURTKQotICAgICAgcmV0dXJuIGJhc2VBZGRyICsgbXlJbmRleCAqIFNUQUNLX1NJWkU7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi19OwotCi0KLS8vLyBTdGF0aWMgYWxsb2NhdGUgYSBzdGFjayBtYW5hZ2VyLiBJbiB0aGUgZnV0dXJlLCB0aGlzIHNob3VsZCBiZSB2aXJ0dWFsCi0vLy8gbWFjaGluZSBzcGVjaWZpYy4KLVN0YWNrVGhyZWFkTWFuYWdlciBUaGVTdGFja01hbmFnZXI7Ci0KLWV4dGVybiB2b2lkIHNpZ3NlZ3ZIYW5kbGVyKGludCwgc2lnaW5mb190Kiwgdm9pZCopOwotCi0vLy8gaW50ZXJuYWxUaHJlYWRTdGFydCAtIFRoZSBpbml0aWFsIGZ1bmN0aW9uIGNhbGxlZCBieSBhIHRocmVhZC4gU2V0cyBzb21lCi0vLy8gdGhyZWFkIHNwZWNpZmljIGRhdGEsIHJlZ2lzdGVycyB0aGUgdGhyZWFkIHRvIHRoZSBHQyBhbmQgY2FsbHMgdGhlCi0vLy8gZ2l2ZW4gcm91dGluZSBvZiB0aC4KLS8vLwotdm9pZCBUaHJlYWQ6OmludGVybmFsVGhyZWFkU3RhcnQobXZtOjpUaHJlYWQqIHRoKSB7Ci0gIHRoLT5iYXNlU1AgID0gRlJBTUVfUFRSKCk7Ci0KLSAgLy8gU2V0IHRoZSBTSUdTRUdWIGhhbmRsZXIgdG8gZGlhZ25vc2UgZXJyb3JzLgotICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhOwotICBzaWdzZXRfdCBtYXNrOwotICBzaWdmaWxsc2V0KCZtYXNrKTsKLSAgc2Euc2FfZmxhZ3MgPSBTQV9TSUdJTkZPOwotICBzYS5zYV9tYXNrID0gbWFzazsKLSAgc2Euc2Ffc2lnYWN0aW9uID0gc2lnc2VndkhhbmRsZXI7Ci0gIHNpZ2FjdGlvbihTSUdTRUdWLCAmc2EsIE5VTEwpOwotCi0KLSAgYXNzZXJ0KHRoLT52bWtpdCAmJiAiVk0gbm90IHNldCBpbiBhIHRocmVhZCIpOwotCi0gIHRoLT52bWtpdC0+cmVuZGV6dm91cy5wcmVwYXJlRm9ySm9pbigpOwotICB0aC0+cm91dGluZSh0aCk7Ci0JdGgtPnN0YXRlICY9IH5USFJFQURfUlVOTklORzsKLQlpZighKHRoLT5zdGF0ZSAmIFRIUkVBRF9EQUVNT04pKQotCQl0aC0+dm1raXQtPm5vbkRhZW1vblRocmVhZHNNYW5hZ2VyLmxlYXZlTm9uRGFlbW9uTW9kZSgpOwotICB0aC0+dm1raXQtPnVucmVnaXN0ZXJSdW5uaW5nVGhyZWFkKHRoKTsKLX0KLQotLy8vIHN0YXJ0IC0gQ2FsbGVkIGJ5IHRoZSBjcmVhdG9yIG9mIHRoZSB0aHJlYWQgdG8gcnVuIHRoZSBuZXcgdGhyZWFkLgotLy8vIFRoZSB0aHJlYWQgaXMgaW4gYSBkZXRhY2hlZCBzdGF0ZSwgYmVjYXVzZSBlYWNoIHZpcnR1YWwgbWFjaGluZSBoYXMKLS8vLyBpdHMgb3duIHdheSBvZiB3YWl0aW5nIGZvciBjcmVhdGVkIHRocmVhZHMuCi1pbnQgVGhyZWFkOjpzdGFydCh2b2lkICgqZmN0KShtdm06OlRocmVhZCopKSB7Ci0gIHB0aHJlYWRfYXR0cl90IGF0dHJpYnV0czsKLSAgcHRocmVhZF9hdHRyX2luaXQoJmF0dHJpYnV0cyk7Ci0gIHB0aHJlYWRfYXR0cl9zZXRzdGFjaygmYXR0cmlidXRzLCB0aGlzLCBTVEFDS19TSVpFKTsKLSAgcm91dGluZSA9IGZjdDsKLSAgLy8gTWFrZSBzdXJlIHRvIGFkZCBpdCBpbiB0aGUgbGlzdCBvZiB0aHJlYWRzIGJlZm9yZSBsZWF2aW5nIHRoaXMgZnVuY3Rpb246Ci0gIC8vIHRoZSBnYXJiYWdlIGNvbGxlY3RvciB3YW50cyB0byB0cmFjZSB0aGlzIHRocmVhZC4KLQlzdGF0ZSB8PSBUSFJFQURfUlVOTklORzsKLQlpZighKHN0YXRlICYgVEhSRUFEX0RBRU1PTikpCi0JCXZta2l0LT5ub25EYWVtb25UaHJlYWRzTWFuYWdlci5lbnRlck5vbkRhZW1vbk1vZGUoKTsKLSAgdm1raXQtPnJlZ2lzdGVyUnVubmluZ1RocmVhZCh0aGlzKTsKLSAgaW50IHJlcyA9IHB0aHJlYWRfY3JlYXRlKChwdGhyZWFkX3QqKSh2b2lkKikoJmludGVybmFsVGhyZWFkSUQpLCAmYXR0cmlidXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqICgqKSh2b2lkICopKWludGVybmFsVGhyZWFkU3RhcnQsIHRoaXMpOwotICBwdGhyZWFkX2RldGFjaCgocHRocmVhZF90KWludGVybmFsVGhyZWFkSUQpOwotICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cmlidXRzKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotLy8vIG9wZXJhdG9yIG5ldyAtIEdldCBhIHN0YWNrIGZyb20gdGhlIHN0YWNrIG1hbmFnZXIuIFRoZSBUaHJlYWQgb2JqZWN0Ci0vLy8gd2lsbCBiZSBwbGFjZWQgaW4gdGhlIGZpcnN0IHBhZ2UgYXQgdGhlIGJvdHRvbSBvZiB0aGUgc3RhY2suIEhlbmNlCi0vLy8gVGhyZWFkIG9iamVjdHMgY2FuIG5vdCBleGNlZWQgYSBwYWdlLgotdm9pZCogVGhyZWFkOjpvcGVyYXRvciBuZXcoc2l6ZV90IHN6KSB7Ci0gIGFzc2VydChzeiA8IChzaXplX3QpZ2V0cGFnZXNpemUoKSAmJiAiVGhyZWFkIGxvY2FsIGRhdGEgdG9vIGJpZyIpOwotICB2b2lkKiByZXMgPSAodm9pZCopVGhlU3RhY2tNYW5hZ2VyLmFsbG9jYXRlKCk7Ci0gIC8vIEdpdmUgaXQgYSBzZWNvbmQgY2hhbmNlLgotICBpZiAocmVzID09IE5VTEwpIHsKLSAgICBDb2xsZWN0b3I6OmNvbGxlY3QoKTsKLSAgICAvLyBXYWl0IGZvciB0aGUgZmluYWxpemVyIHRvIGhhdmUgY2xlYW5lZCB1cCB0aGUgdGhyZWFkcy4KLSAgICB3aGlsZSAocmVzID09IE5VTEwpIHsKLSAgICAgIG12bTo6VGhyZWFkOjp5aWVsZCgpOwotICAgICAgcmVzID0gKHZvaWQqKVRoZVN0YWNrTWFuYWdlci5hbGxvY2F0ZSgpOwotICAgIH0KLSAgfQotICAvLyBNYWtlIHN1cmUgdGhlIHRocmVhZCBpbmZvcm1hdGlvbiBpcyBjbGVhcmVkLgotICBtZW1zZXQocmVzLCAwLCBzeik7Ci0gIHJldHVybiByZXM7Ci19Ci0KLXZvaWQgVGhyZWFkOjpvcGVyYXRvciBkZWxldGUodm9pZCogdGgpIHsKLSAgdWludHB0cl90IGluZGV4ID0gKCh1aW50cHRyX3QpdGggJiBUaHJlYWQ6OklETWFzayk7Ci0gIGluZGV4ID0gKGluZGV4ICYgflRoZVN0YWNrTWFuYWdlci5iYXNlQWRkcikgPj4gMjA7Ci0gIFRoZVN0YWNrTWFuYWdlci51c2VkW2luZGV4XSA9IDA7Ci19Ci0KLVRocmVhZDo6flRocmVhZCgpIHsKLSAgLy8gSXQgc2VlbXMgbGlrZSB0aGUgcHRocmVhZCBpbXBsZW1lbnRhdGlvbiBpbiBMaW51eCBpcyBjbGVhcmluZyB3aXRoIE5VTEwKLSAgLy8gdGhlIHN0YWNrIG9mIHRoZSB0aHJlYWQuIFNvIHdlIGhhdmUgdG8gZ2V0IHRoZSB0aHJlYWQgaWQgYmVmb3JlCi0gIC8vIGNhbGxpbmcgcHRocmVhZF9qb2luLgotICB2b2lkKiB0aHJlYWRfaWQgPSBpbnRlcm5hbFRocmVhZElEOwotICBpZiAodGhyZWFkX2lkICE9IE5VTEwpIHsKLSAgICAvLyBXYWl0IGZvciB0aGUgdGhyZWFkIHRvIGRpZS4KLSAgICBwdGhyZWFkX2pvaW4oKHB0aHJlYWRfdCl0aHJlYWRfaWQsIE5VTEwpOwotICB9Ci0Jdm1raXQtPnVucmVnaXN0ZXJQcmVwYXJlZFRocmVhZCh0aGlzKTsKLX0KLQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL012bS9Db21waWxlci9EaXNhc3NlbWJsZXIuY3BwIGIvdm1raXQvbGliL012bS9Db21waWxlci9EaXNhc3NlbWJsZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTk0ZmEzLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9Ndm0vQ29tcGlsZXIvRGlzYXNzZW1ibGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8vPT09LS0tLS0tLS0tIERpc2Fzc2VtYmxlci5jYyAtIEludGVmYXJjZSB0byBkaXNhc3NlbWJsZXIgLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgTWljcm8gVmlydHVhbCBNYWNoaW5lCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgIm12bS9KSVQuaCIKLQotI2lmZGVmIEhBVkVfRElTQVNTRU1CTEVSCi0KLSNpZiBkZWZpbmVkKF9fUFBDX18pCi1leHRlcm4gIkMiCi17Ci0jIGluY2x1ZGUgPGRpcy1hc20uaD4KLSMgaW5jbHVkZSA8YmZkLmg+Ci19Ci0KLQotCi1zdGF0aWMgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gIGluZm87Ci1zdGF0aWMgaW50ICAgICAgaW5pdGlhbGlzZWQ9IDA7ICAKLQotLy8gdGhpcyBpcyB0aGUgb25seSBmdW5jdGlvbiBleHBvcnRlZCBmcm9tIHRoaXMgZmlsZQotCi1pbnQgbXZtOjpNdm1Nb2R1bGU6OmRpc2Fzc2VtYmxlKHVuc2lnbmVkIGludCAqYWRkcikKLXsKLSAgCi0gIGlmICghaW5pdGlhbGlzZWQpCi0gICAgeyAgIAotICAgICAgSU5JVF9ESVNBU1NFTUJMRV9JTkZPKGluZm8sIHN0ZG91dCwgZnByaW50Zik7Ci0gICAgICBpbmZvLmZsYXZvdXI9ICAgYmZkX3RhcmdldF9lbGZfZmxhdm91cjsKLSAgICAgIGluZm8uYXJjaD0gICAgYmZkX2FyY2hfcG93ZXJwYzsKLSAgICAgIGluZm8ubWFjaD0gICAgYmZkX21hY2hfcHBjXzc1MDsgLy8gZ2VuZXJpYyhpc2gpID09IFBQQyBHMwotICAgICAgaW5mby5lbmRpYW49ICAgIEJGRF9FTkRJQU5fQklHOwotICAgICAgaW5mby5idWZmZXJfbGVuZ3RoPSA2NTUzNjsKLSAgICB9ICAgCi0gIGluZm8uYnVmZmVyPSAgICAgKGJmZF9ieXRlICopYWRkcjsKLSAgaW5mby5idWZmZXJfdm1hPSAoYmZkX3ZtYSkobG9uZylhZGRyOwotICByZXR1cm4gcHJpbnRfaW5zbl9iaWdfcG93ZXJwYygoYmZkX3ZtYSkobG9uZylhZGRyLCAmaW5mbyk7Ci0gIAotfQotCi0jZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQotZXh0ZXJuICJDIgotewotIyBpbmNsdWRlIDxiZmQuaD4JLy8gYmZkIHR5cGVzCi0jIGluY2x1ZGUgPGRpcy1hc20uaD4JLy8gZGlzYXNzZW1ibGVfaW5mbwotICBpbnQgcHJpbnRfaW5zbl9pMzg2X2F0dChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvICopOwotfQotCi0KLXN0YXRpYyBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbwlpbmZvOwotc3RhdGljIGludAkJCWluaXRpYWxpc2VkPSAwOwotCi0KLWludCBtdm06Ok12bU1vZHVsZTo6ZGlzYXNzZW1ibGUodW5zaWduZWQgaW50ICphZGRyKQotewotICBpZiAoIWluaXRpYWxpc2VkKQotICAgIHsKLSAgICAgIElOSVRfRElTQVNTRU1CTEVfSU5GTyhpbmZvLCBzdGRvdXQsIGZwcmludGYpOwotICAgICAgaW5mby5mbGF2b3VyPQkgIGJmZF90YXJnZXRfZWxmX2ZsYXZvdXI7Ci0gICAgICBpbmZvLmFyY2g9CSAgYmZkX2FyY2hfaTM4NjsKLSAgICAgIGluZm8ubWFjaD0JICBiZmRfbWFjaF9pMzg2X2kzODY7Ci0gICAgICBpbmZvLmVuZGlhbj0JICBCRkRfRU5ESUFOX0xJVFRMRTsKLSAgICAgIGluZm8uYnVmZmVyX2xlbmd0aD0gNjU1MzY7Ci0gICAgfQotICBpbmZvLmJ1ZmZlcj0JICAgKGJmZF9ieXRlICopYWRkcjsKLSAgaW5mby5idWZmZXJfdm1hPSAoYmZkX3ZtYSkobG9uZylhZGRyOwotICByZXR1cm4gcHJpbnRfaW5zbl9pMzg2X2F0dCgoYmZkX3ZtYSkobG9uZylhZGRyLCAmaW5mbyk7Ci19Ci0KLSNlbHNlCi0KLWludCBtdm06Ok12bU1vZHVsZTo6ZGlzYXNzZW1ibGUodW5zaWduZWQgaW50KiBhZGRyKSB7Ci0gIHJldHVybiAwOwotfQotCi0jZW5kaWYKLQotI2Vsc2UKLQotaW50IG12bTo6TXZtTW9kdWxlOjpkaXNhc3NlbWJsZSh1bnNpZ25lZCBpbnQqIGFkZHIpIHsKLSAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgotCi0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9Ndm0vQ29tcGlsZXIvRXNjYXBlQW5hbHlzaXMuY3BwIGIvdm1raXQvbGliL012bS9Db21waWxlci9Fc2NhcGVBbmFseXNpcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYmYwNzguLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL012bS9Db21waWxlci9Fc2NhcGVBbmFseXNpcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLy89PT0tLS0tLS1Fc2NhcGVBbmFseXNpcy5jcHAgLSBTaW1wbGUgTExWTSBlc2NhcGUgYW5hbHlzaXMgLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLQotI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCi0jaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgotI2luY2x1ZGUgImxsdm0vR2xvYmFsVmFyaWFibGUuaCIKLSNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgotI2luY2x1ZGUgImxsdm0vUGFzcy5oIgotI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCi0jaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wSW5mby5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYWxsU2l0ZS5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgotCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlIDxtYXA+Ci0KLSNpbmNsdWRlICJtdm0vR0MuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGxsdm07Ci11c2luZyBuYW1lc3BhY2UgbXZtOwotCi1uYW1lc3BhY2UgewotCi0gIGNsYXNzIEVzY2FwZUFuYWx5c2lzIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7Ci0gIHB1YmxpYzoKLSAgICBzdGF0aWMgY2hhciBJRDsKLSAgICB1aW50NjRfdCBwYWdlU2l6ZTsKLSAgICBFc2NhcGVBbmFseXNpcygpIDogRnVuY3Rpb25QYXNzKElEKSB7Ci0gICAgICBwYWdlU2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKLSAgICAgIEFVLmFkZFJlcXVpcmVkPExvb3BJbmZvPigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKTsKLQotICBwcml2YXRlOgotICAgIGJvb2wgcHJvY2Vzc01hbGxvYyhJbnN0cnVjdGlvbiogSSwgVmFsdWUqIFNpemUsIFZhbHVlKiBWVCwgTG9vcCogQ3VyTG9vcCk7Ci0gIH07Ci0KLSAgY2hhciBFc2NhcGVBbmFseXNpczo6SUQgPSAwOwotICBSZWdpc3RlclBhc3M8RXNjYXBlQW5hbHlzaXM+IFgoIkVzY2FwZUFuYWx5c2lzIiwgIkVzY2FwZSBBbmFseXNpcyBQYXNzIik7Ci0KLWJvb2wgRXNjYXBlQW5hbHlzaXM6OnJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24mIEYpIHsKLSAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7Ci0gIEZ1bmN0aW9uKiBBbGxvY2F0b3IgPSBGLmdldFBhcmVudCgpLT5nZXRGdW5jdGlvbigiZ2NtYWxsb2MiKTsKLSAgaWYgKCFBbGxvY2F0b3IpIHJldHVybiBDaGFuZ2VkOwotCi0gIExvb3BJbmZvKiBMSSA9ICZnZXRBbmFseXNpczxMb29wSW5mbz4oKTsKLQotICBmb3IgKEZ1bmN0aW9uOjppdGVyYXRvciBCSSA9IEYuYmVnaW4oKSwgQkUgPSBGLmVuZCgpOyBCSSAhPSBCRTsgQkkrKykgeyAKLSAgICBCYXNpY0Jsb2NrICpDdXIgPSBCSTsKLSAgIAotICAgIC8vIEdldCB0aGUgcGFyZW50IGxvb3AgaWYgdGhlcmUgaXMgb25lLiBJZiB0aGUgYWxsb2NhdGlvbiBoYXBwZW5zIGluIGEgbG9vcAotICAgIC8vIHdlIG11c3QgbWFrZSBzdXJlIHRoYXQgdGhlIGFsbG9jYXRlZCB2YWx1ZSBpcyBub3QgdXNlZCBvdXRzaWRlIG9mCi0gICAgLy8gdGhlIGxvb3AuIElmIHRoZSBhbGxvY2F0aW9uIGRvZXMgbm90IGVzY2FwZSBhbmQgaXQgaXMgb25seSB1c2VkIGluc2lkZQotICAgIC8vIHRoZSBsb29wLCB3ZSB3aWxsIGhvaXN0IHRoZSBhbGxvY2F0aW9uIGluIHRoZSBwcmUtaGVhZGVyIG9mIHRoZSBsb29wLgotICAgIExvb3AqIEN1ckxvb3AgPSBMSS0+Z2V0TG9vcEZvcihDdXIpOwotICAgIGlmIChDdXJMb29wKSB7Ci0gICAgICBMb29wKiBOZXh0TG9vcCA9IEN1ckxvb3AtPmdldFBhcmVudExvb3AoKTsKLSAgICAgIHdoaWxlIChOZXh0TG9vcCkgewotICAgICAgICBDdXJMb29wID0gTmV4dExvb3A7Ci0gICAgICAgIE5leHRMb29wID0gQ3VyTG9vcC0+Z2V0UGFyZW50TG9vcCgpOwotICAgICAgfQotICAgIH0KLQotICAgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgSUkgPSBDdXItPmJlZ2luKCksIElFID0gQ3VyLT5lbmQoKTsgSUkgIT0gSUU7KSB7Ci0gICAgICBJbnN0cnVjdGlvbiAqSSA9IElJOwotICAgICAgSUkrKzsKLSAgICAgIGlmIChJLT5nZXRPcGNvZGUoKSAhPSBJbnN0cnVjdGlvbjo6Q2FsbCAmJgotICAgICAgICAgIEktPmdldE9wY29kZSgpICE9IEluc3RydWN0aW9uOjpJbnZva2UpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBDYWxsU2l0ZSBDYWxsKEkpOwotICAgICAgaWYgKENhbGwuZ2V0Q2FsbGVkVmFsdWUoKSA9PSBBbGxvY2F0b3IpIHsKLSAgICAgICAgaWYgKEN1ckxvb3ApIHsKLSAgICAgICAgICBib29sIGVzY2FwZXNMb29wID0gZmFsc2U7Ci0gICAgICAgICAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIFUgPSBJLT51c2VfYmVnaW4oKSwgRSA9IEktPnVzZV9lbmQoKTsKLSAgICAgICAgICAgICAgIFUgIT0gRTsgKytVKSB7Ci0gICAgICAgICAgICBpZiAoSW5zdHJ1Y3Rpb24qIElJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KCpVKSkgewotICAgICAgICAgICAgICBCYXNpY0Jsb2NrKiBCQlUgPSBJSS0+Z2V0UGFyZW50KCk7Ci0gICAgICAgICAgICAgIGlmICghQ3VyTG9vcC0+Y29udGFpbnMoQkJVKSkgewotICAgICAgICAgICAgICAgIGVzY2FwZXNMb29wID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmIChlc2NhcGVzTG9vcCkgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoQ2FsbEluc3QgKkNJID0gZHluX2Nhc3Q8Q2FsbEluc3Q+KEkpKSB7Ci0gICAgICAgICAgQ2hhbmdlZCB8PSBwcm9jZXNzTWFsbG9jKENJLCBDSS0+Z2V0QXJnT3BlcmFuZCgwKSwgQ0ktPmdldEFyZ09wZXJhbmQoMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1ckxvb3ApOwotICAgICAgICB9IGVsc2UgaWYgKEludm9rZUluc3QgKkNJID0gZHluX2Nhc3Q8SW52b2tlSW5zdD4oSSkpIHsKLSAgICAgICAgICBDaGFuZ2VkIHw9IHByb2Nlc3NNYWxsb2MoQ0ksIENJLT5nZXRBcmdPcGVyYW5kKDApLCBDSS0+Z2V0QXJnT3BlcmFuZCgxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyTG9vcCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIENoYW5nZWQ7Ci19Ci0KLQotCi0KLXN0YXRpYyBib29sIGVzY2FwZXMoVmFsdWUqIElucywgc3RkOjptYXA8SW5zdHJ1Y3Rpb24qLCBib29sPiYgdmlzaXRlZCkgewotICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgSSA9IElucy0+dXNlX2JlZ2luKCksIEUgPSBJbnMtPnVzZV9lbmQoKTsgCi0gICAgICAgSSAhPSBFOyArK0kpIHsKLSAgICBpZiAoSW5zdHJ1Y3Rpb24qIElJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KCpJKSkgewotICAgICAgaWYgKElJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6Q2FsbCB8fCAKLSAgICAgICAgICBJSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246Okludm9rZSkgewotICAgICAgICAKLSAgICAgICAgQ2FsbFNpdGUgQ1MoSUkpOwotICAgICAgICBpZiAoIUNTLm9ubHlSZWFkc01lbW9yeSgpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgCi0gICAgICAgIENhbGxTaXRlOjphcmdfaXRlcmF0b3IgQiA9IENTLmFyZ19iZWdpbigpLCBFID0gQ1MuYXJnX2VuZCgpOwotICAgICAgICBmb3IgKENhbGxTaXRlOjphcmdfaXRlcmF0b3IgQSA9IEI7IEEgIT0gRTsgKytBKSB7Ci0gICAgICAgICAgaWYgKEEtPmdldCgpID09IElucyAmJiAKLSAgICAgICAgICAgICAgIUNTLnBhcmFtSGFzQXR0cihBIC0gQiArIDEsIEF0dHJpYnV0ZTo6Tm9DYXB0dXJlKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgCi0gICAgICAgIC8vIFdlIG11c3QgYWxzbyBjb25zaWRlciB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uLgotICAgICAgICBpZiAoSUktPmdldFR5cGUoKSA9PSBJbnMtPmdldFR5cGUoKSkgewotICAgICAgICAgIGlmIChlc2NhcGVzKElJLCB2aXNpdGVkKSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgfSBlbHNlIGlmIChkeW5fY2FzdDxCaXRDYXN0SW5zdD4oSUkpKSB7Ci0gICAgICAgIGlmIChlc2NhcGVzKElJLCB2aXNpdGVkKSkgcmV0dXJuIHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKFN0b3JlSW5zdCogU0kgPSBkeW5fY2FzdDxTdG9yZUluc3Q+KElJKSkgewotICAgICAgICBpZiAoQWxsb2NhSW5zdCAqIEFJID0gZHluX2Nhc3Q8QWxsb2NhSW5zdD4oU0ktPmdldE9wZXJhbmQoMSkpKSB7Ci0gICAgICAgICAgaWYgKCF2aXNpdGVkW0FJXSkgewotICAgICAgICAgICAgdmlzaXRlZFtBSV0gPSB0cnVlOwotICAgICAgICAgICAgaWYgKGVzY2FwZXMoQUksIHZpc2l0ZWQpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoU0ktPmdldE9wZXJhbmQoMCkgPT0gSW5zKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAoZHluX2Nhc3Q8TG9hZEluc3Q+KElJKSkgewotICAgICAgICBpZiAoaXNhPFBvaW50ZXJUeXBlPihJSS0+Z2V0VHlwZSgpKSkgewotICAgICAgICAgIGlmIChlc2NhcGVzKElJLCB2aXNpdGVkKSkgcmV0dXJuIHRydWU7IC8vIGFsbG9jYXMKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChkeW5fY2FzdDxHZXRFbGVtZW50UHRySW5zdD4oSUkpKSB7Ci0gICAgICAgIGlmIChlc2NhcGVzKElJLCB2aXNpdGVkKSkgcmV0dXJuIHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKGR5bl9jYXN0PFJldHVybkluc3Q+KElJKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoZHluX2Nhc3Q8UEhJTm9kZT4oSUkpKSB7Ci0gICAgICAgIGlmICghdmlzaXRlZFtJSV0pIHsKLSAgICAgICAgICB2aXNpdGVkW0lJXSA9IHRydWU7Ci0gICAgICAgICAgaWYgKGVzY2FwZXMoSUksIHZpc2l0ZWQpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEVzY2FwZUFuYWx5c2lzOjpwcm9jZXNzTWFsbG9jKEluc3RydWN0aW9uKiBJLCBWYWx1ZSogU2l6ZSwgVmFsdWUqIFZULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wKiBDdXJMb29wKSB7Ci0gIEluc3RydWN0aW9uKiBBbGxvYyA9IEk7Ci0gIExMVk1Db250ZXh0JiBDb250ZXh0ID0gQWxsb2MtPmdldFBhcmVudCgpLT5nZXRDb250ZXh0KCk7Ci0KLSAgQ29uc3RhbnRJbnQqIENJID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KFNpemUpOwotICBib29sIGhhc0ZpbmFsaXplciA9IHRydWU7Ci0gIAotICBpZiAoQ0kpIHsKLSAgICBpZiAoQ29uc3RhbnRFeHByKiBDRSA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4oVlQpKSB7Ci0gICAgICBpZiAoQ29uc3RhbnRJbnQqIEMgPSBkeW5fY2FzdDxDb25zdGFudEludD4oQ0UtPmdldE9wZXJhbmQoMCkpKSB7Ci0gICAgICAgIFZpcnR1YWxUYWJsZSogVGFibGUgPSAoVmlydHVhbFRhYmxlKilDLT5nZXRaRXh0VmFsdWUoKTsKLSAgICAgICAgaGFzRmluYWxpemVyID0gKCgodm9pZCoqKVRhYmxlKVswXSAhPSAwKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEdsb2JhbFZhcmlhYmxlKiBHViA9IGR5bl9jYXN0PEdsb2JhbFZhcmlhYmxlPihDRS0+Z2V0T3BlcmFuZCgwKSk7Ci0gICAgICAgIGlmIChHVi0+aGFzSW5pdGlhbGl6ZXIoKSkgewotICAgICAgICAgIENvbnN0YW50KiBJbml0ID0gR1YtPmdldEluaXRpYWxpemVyKCk7Ci0gICAgICAgICAgaWYgKENvbnN0YW50QXJyYXkqIENBID0gZHluX2Nhc3Q8Q29uc3RhbnRBcnJheT4oSW5pdCkpIHsKLSAgICAgICAgICAgIENvbnN0YW50KiBWID0gQ0EtPmdldE9wZXJhbmQoMCk7Ci0gICAgICAgICAgICBoYXNGaW5hbGl6ZXIgPSAhVi0+aXNOdWxsVmFsdWUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gVGhlIG9iamVjdCBkb2VzIG5vdCBoYXZlIGEgZmluYWxpemVyIGFuZCBpcyBuZXZlciB1c2VkLiBSZW1vdmUgdGhlCi0gIC8vIGFsbG9jYXRpb24gYXMgaXQgd2lsbCBub3QgaGF2ZSBzaWRlIGVmZmVjdHMuCi0gIGlmICghaGFzRmluYWxpemVyICYmICFBbGxvYy0+Z2V0TnVtVXNlcygpKSB7Ci0gICAgREVCVUcoZXJycygpIDw8ICJFc2NhcGUgYW5hbHlzaXMgcmVtb3ZlcyBpbnN0cnVjdGlvbiAiIDw8ICpBbGxvYyA8PCAiOiAiKTsKLSAgICBBbGxvYy0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIHVpbnQ2NF90IE5TaXplID0gQ0ktPmdldFpFeHRWYWx1ZSgpOwotICAvLyBJZiB0aGUgY2xhc3MgaGFzIGEgZmluYWxpemUgbWV0aG9kLCBkbyBub3Qgc3RhY2sgYWxsb2NhdGUgdGhlIG9iamVjdC4KLSAgaWYgKE5TaXplIDwgcGFnZVNpemUgJiYgIWhhc0ZpbmFsaXplcikgewotICAgIHN0ZDo6bWFwPEluc3RydWN0aW9uKiwgYm9vbD4gdmlzaXRlZDsKLSAgICBib29sIGVzYyA9IGVzY2FwZXMoQWxsb2MsIHZpc2l0ZWQpOwotICAgIGlmICghZXNjKSB7Ci0KLSAgICAgIGlmIChDdXJMb29wKSB7Ci0gICAgICAgIC8vIFRoZSBvYmplY3QgZG9lcyBub3QgZXNjYXBlIGFuZCBpcyBvbmx5IHVzZWQgaW4gdGhlIGxvb3Agd2hlcmUgaXQKLSAgICAgICAgLy8gaXMgYWxsb2NhdGVkLiBXZSBob2lzdCB0aGUgYWxsb2NhdGlvbiBpbiB0aGUgcHJlLWhlYWRlciBzbyB0aGF0Ci0gICAgICAgIC8vIHdlIGRvbid0IGVuZCB1cCB3aXRoIHRvbnMgb2YgYWxsb2NhdGlvbnMgb24gdGhlIHN0YWNrLgotICAgICAgICBCYXNpY0Jsb2NrKiBCQiA9IEN1ckxvb3AtPmdldExvb3BQcmVoZWFkZXIoKTsKLSAgICAgICAgYXNzZXJ0KEJCICYmICJObyBQcmVoZWFkZXIhIik7Ci0gICAgICAgIERFQlVHKGVycnMoKSA8PCAiRXNjYXBlIGFuYWx5c2lzIGhvaXN0aW5nIHRvICIgPDwgQkItPmdldE5hbWVTdHIoKSk7Ci0gICAgICAgIERFQlVHKGVycnMoKSA8PCAiOiAiKTsKLSAgICAgICAgREVCVUcoZXJycygpIDw8ICpBbGxvYyk7Ci0gICAgICAgIEFsbG9jLT5yZW1vdmVGcm9tUGFyZW50KCk7Ci0gICAgICAgIEJCLT5nZXRJbnN0TGlzdCgpLmluc2VydChCQi0+Z2V0VGVybWluYXRvcigpLCBBbGxvYyk7Ci0gICAgICB9Ci0KLSAgICAgIEFsbG9jYUluc3QqIEFJID0gbmV3IEFsbG9jYUluc3QoVHlwZTo6Z2V0SW50OFR5KENvbnRleHQpLCBTaXplLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2MpOwotICAgICAgQml0Q2FzdEluc3QqIEJJID0gbmV3IEJpdENhc3RJbnN0KEFJLCBBbGxvYy0+Z2V0VHlwZSgpLCAiIiwgQWxsb2MpOwotICAgICAgREVCVUcoZXJycygpIDw8ICJlc2NhcGUiKTsKLSAgICAgIERFQlVHKGVycnMoKSA8PCBBbGxvYy0+Z2V0UGFyZW50KCktPmdldFBhcmVudCgpLT5nZXROYW1lU3RyKCkgPDwgIlxuIik7Ci0gICAgICBBbGxvYy0+cmVwbGFjZUFsbFVzZXNXaXRoKEJJKTsKLSAgICAgIC8vIElmIGl0J3MgYW4gaW52b2tlLCByZXBsYWNlIHRoZSBpbnZva2Ugd2l0aCBhIGRpcmVjdCBicmFuY2guCi0gICAgICBpZiAoSW52b2tlSW5zdCAqQ0kgPSBkeW5fY2FzdDxJbnZva2VJbnN0PihBbGxvYykpIHsKLSAgICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKENJLT5nZXROb3JtYWxEZXN0KCksIEFsbG9jKTsKLSAgICAgIH0KLSAgICAgIEFsbG9jLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci19Ci0KLW5hbWVzcGFjZSBtdm0gewotRnVuY3Rpb25QYXNzKiBjcmVhdGVFc2NhcGVBbmFseXNpc1Bhc3MoKSB7Ci0gIHJldHVybiBuZXcgRXNjYXBlQW5hbHlzaXMoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL012bS9Db21waWxlci9JbmxpbmVNYWxsb2MuY3BwIGIvdm1raXQvbGliL012bS9Db21waWxlci9JbmxpbmVNYWxsb2MuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzg5ZGIzLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9Ndm0vQ29tcGlsZXIvSW5saW5lTWFsbG9jLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0tLSBJbmxpbmVNYWxsb2MuY3BwIC0gSW5saW5lIGFsbG9jYXRpb25zICAtLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKLSNpbmNsdWRlICJsbHZtL0dsb2JhbFZhcmlhYmxlLmgiCi0jaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgotI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCi0jaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKLSNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FsbFNpdGUuaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKLSNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvVXRpbHMvQ2xvbmluZy5oIgotCi0jaW5jbHVkZSAibXZtL0pJVC5oIgotCi11c2luZyBuYW1lc3BhY2UgbGx2bTsKLQotbmFtZXNwYWNlIG12bSB7Ci0KLSAgY2xhc3MgSW5saW5lTWFsbG9jIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7Ci0gIHB1YmxpYzoKLSAgICBzdGF0aWMgY2hhciBJRDsKLSAgICBJbmxpbmVNYWxsb2MoKSA6IEZ1bmN0aW9uUGFzcyhJRCkge30KLQotICAgIHZpcnR1YWwgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKTsKLSAgcHJpdmF0ZToKLSAgfTsKLSAgY2hhciBJbmxpbmVNYWxsb2M6OklEID0gMDsKLQotI2lmIDAKLSAgc3RhdGljIFJlZ2lzdGVyUGFzczxJbmxpbmVNYWxsb2M+IFgoIklubGluZU1hbGxvYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmxpbmUgY2FsbHMgdG8gZ2NtYWxsb2MiKTsKLSNlbmRpZgotCi0KLWJvb2wgSW5saW5lTWFsbG9jOjpydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uJiBGKSB7Ci0gIEZ1bmN0aW9uKiBNYWxsb2MgPSBGLmdldFBhcmVudCgpLT5nZXRGdW5jdGlvbigiZ2NtYWxsb2MiKTsKLSAgaWYgKCFNYWxsb2MgfHwgTWFsbG9jLT5pc0RlY2xhcmF0aW9uKCkpIHJldHVybiBmYWxzZTsKLSAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7Ci0gIGZvciAoRnVuY3Rpb246Oml0ZXJhdG9yIEJJID0gRi5iZWdpbigpLCBCRSA9IEYuZW5kKCk7IEJJICE9IEJFOyBCSSsrKSB7IAotICAgIEJhc2ljQmxvY2sgKkN1ciA9IEJJOyAKLSAgICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIElJID0gQ3VyLT5iZWdpbigpLCBJRSA9IEN1ci0+ZW5kKCk7IElJICE9IElFOykgewotICAgICAgSW5zdHJ1Y3Rpb24gKkkgPSBJSTsKLSAgICAgIElJKys7Ci0gICAgICBpZiAoSS0+Z2V0T3Bjb2RlKCkgIT0gSW5zdHJ1Y3Rpb246OkNhbGwgJiYKLSAgICAgICAgICBJLT5nZXRPcGNvZGUoKSAhPSBJbnN0cnVjdGlvbjo6SW52b2tlKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgQ2FsbFNpdGUgQ2FsbChJKTsKLSAgICAgIEZ1bmN0aW9uKiBUZW1wID0gQ2FsbC5nZXRDYWxsZWRGdW5jdGlvbigpOwotICAgICAgaWYgKFRlbXAgPT0gTWFsbG9jKSB7Ci0gICAgICAgIGlmIChkeW5fY2FzdDxDb25zdGFudD4oQ2FsbC5nZXRBcmd1bWVudCgwKSkpIHsKLSAgICAgICAgICBJbmxpbmVGdW5jdGlvbkluZm8gSUZJKE5VTEwsIG12bTo6TXZtTW9kdWxlOjpUaGVUYXJnZXREYXRhKTsKLSAgICAgICAgICBDaGFuZ2VkIHw9IElubGluZUZ1bmN0aW9uKENhbGwsIElGSSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIENoYW5nZWQ7Ci19Ci0KLQotRnVuY3Rpb25QYXNzKiBjcmVhdGVJbmxpbmVNYWxsb2NQYXNzKCkgewotICByZXR1cm4gbmV3IElubGluZU1hbGxvYygpOwotfQotCi19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvTXZtL0NvbXBpbGVyL0pJVC5jcHAgYi92bWtpdC9saWIvTXZtL0NvbXBpbGVyL0pJVC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiODk5OWYuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL012bS9Db21waWxlci9KSVQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDkzICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0tLS0tLSBKSVQuY2MgLSBJbml0aWFsaXplIHRoZSBKSVQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTWljcm8gVmlydHVhbCBNYWNoaW5lCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlIDxsbHZtL0NhbGxpbmdDb252Lmg+Ci0jaW5jbHVkZSA8bGx2bS9Db25zdGFudHMuaD4KLSNpbmNsdWRlIDxsbHZtL0Rlcml2ZWRUeXBlcy5oPgotI2luY2x1ZGUgPGxsdm0vSW5zdHJ1Y3Rpb25zLmg+Ci0jaW5jbHVkZSA8bGx2bS9MaW5rQWxsUGFzc2VzLmg+Ci0jaW5jbHVkZSA8bGx2bS9MaW5rZXIuaD4KLSNpbmNsdWRlIDxsbHZtL0xMVk1Db250ZXh0Lmg+Ci0jaW5jbHVkZSA8bGx2bS9Nb2R1bGUuaD4KLSNpbmNsdWRlIDxsbHZtL1Bhc3NNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8bGx2bS9UeXBlLmg+Ci0jaW5jbHVkZSA8bGx2bS9BbmFseXNpcy9EZWJ1Z0luZm8uaD4KLSNpbmNsdWRlIDxsbHZtL0FuYWx5c2lzL0xvb3BQYXNzLmg+Ci0jaW5jbHVkZSA8bGx2bS9BbmFseXNpcy9WZXJpZmllci5oPgotI2luY2x1ZGUgPGxsdm0vQXNzZW1ibHkvUGFyc2VyLmg+Ci0jaW5jbHVkZSA8bGx2bS9Db2RlR2VuL0dDU3RyYXRlZ3kuaD4KLSNpbmNsdWRlIDxsbHZtL0NvZGVHZW4vSklUQ29kZUVtaXR0ZXIuaD4KLSNpbmNsdWRlIDxsbHZtL0NvbmZpZy9jb25maWcuaD4KLSNpbmNsdWRlIDxsbHZtL0V4ZWN1dGlvbkVuZ2luZS9FeGVjdXRpb25FbmdpbmUuaD4KLSNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9KSVRFdmVudExpc3RlbmVyLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCi0jaW5jbHVkZSA8bGx2bS9TdXBwb3J0L0RlYnVnLmg+Ci0jaW5jbHVkZSA8bGx2bS9TdXBwb3J0L0lSUmVhZGVyLmg+Ci0jaW5jbHVkZSA8bGx2bS9TdXBwb3J0L011dGV4R3VhcmQuaD4KLSNpbmNsdWRlIDxsbHZtL1N1cHBvcnQvUGFzc05hbWVQYXJzZXIuaD4KLSNpbmNsdWRlIDxsbHZtL1N1cHBvcnQvU291cmNlTWdyLmg+Ci0jaW5jbHVkZSA8bGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oPgotI2luY2x1ZGUgPGxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaD4KLSNpbmNsdWRlIDxsbHZtL1RhcmdldC9UYXJnZXRPcHRpb25zLmg+Ci0jaW5jbHVkZSA8bGx2bS9UYXJnZXQvVGFyZ2V0U2VsZWN0Lmg+Ci0jaW5jbHVkZSA8Li4vbGliL0V4ZWN1dGlvbkVuZ2luZS9KSVQvSklULmg+Ci0KLSNpbmNsdWRlICJtdm0vSklULmgiCi0jaW5jbHVkZSAibXZtL1RocmVhZHMvTG9ja3MuaCIKLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9UaHJlYWQuaCIKLSNpbmNsdWRlICJtdm0vVmlydHVhbE1hY2hpbmUuaCIKLSNpbmNsdWRlICJNdXRhdG9yVGhyZWFkLmgiCi0jaW5jbHVkZSAibXZtL0dDLmgiCi0jaW5jbHVkZSAibXZtL1ZNS2l0LmgiCi0KLSNpbmNsdWRlIDxkbGZjbi5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLSNpZiBkZWZpbmVkKF9fTUFDSF9fKQotI2RlZmluZSBTRUxGX0hBTkRMRSBSVExEX0RFRkFVTFQKLSNlbHNlCi0jZGVmaW5lIFNFTEZfSEFORExFIDAKLSNlbmRpZgotCi11c2luZyBuYW1lc3BhY2UgbXZtOwotdXNpbmcgbmFtZXNwYWNlIGxsdm07Ci0KLQotc3RhdGljIGNsOjpsaXN0PHN0ZDo6c3RyaW5nPiAKLUxvYWRCeXRlY29kZUZpbGVzKCJsb2FkLWJjIiwgY2w6OmRlc2MoIkxvYWQgYnl0ZWNvZGUgZmlsZSIpLCBjbDo6WmVyb09yTW9yZSwKLSAgICAgICAgICAgICAgICAgIGNsOjpDb21tYVNlcGFyYXRlZCk7Ci0KLWNsOjpvcHQ8Ym9vbD4gRW1pdERlYnVnSW5mbygiZW1pdC1kZWJ1Zy1pbmZvIiwgCi0gICAgICAgICAgICAgICAgICBjbDo6ZGVzYygiRW1pdCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24iKSwKLSAgICAgICAgICAgICAgICAgIGNsOjppbml0KGZhbHNlKSk7Ci0KLW5hbWVzcGFjZSBtdm0gewotICBuYW1lc3BhY2UgbGx2bV9ydW50aW1lIHsKLSAgICAjaW5jbHVkZSAiTExWTVJ1bnRpbWUuaW5jIgotICB9Ci0gIHZvaWQgbGlua1Zta2l0R0MoKTsKLX0KLQotY29uc3QgY2hhciogTXZtTW9kdWxlOjpnZXRIb3N0VHJpcGxlKCkgewotICByZXR1cm4gTExWTV9IT1NUVFJJUExFOwotfQotCi12b2lkIE12bUpJVE1ldGhvZEluZm86OnByaW50KHZvaWQqIGlwLCB2b2lkKiBhZGRyKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiOyAlcCAoJXApIGluICVzIExMVk0gbWV0aG9kXG4iLCBpcCwgYWRkciwKLSAgICAgICgobGx2bTo6RnVuY3Rpb24qKU1ldGFJbmZvKS0+Z2V0TmFtZSgpLmRhdGEoKSk7Ci19Ci0KLWNsYXNzIE12bUpJVExpc3RlbmVyIDogcHVibGljIGxsdm06OkpJVEV2ZW50TGlzdGVuZXIgewotcHVibGljOgotICB2aXJ0dWFsIHZvaWQgTm90aWZ5RnVuY3Rpb25FbWl0dGVkKGNvbnN0IEZ1bmN0aW9uICZGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkNvZGUsIHNpemVfdCBTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVtaXR0ZWRGdW5jdGlvbkRldGFpbHMgJkRldGFpbHMpIHsKLSAgICBhc3NlcnQoRi5nZXRQYXJlbnQoKSA9PSBNdm1Nb2R1bGU6Omdsb2JhbE1vZHVsZSk7Ci0gICAgYXNzZXJ0KEYuaGFzR0MoKSk7Ci0gICAgLy8gV2Uga25vdyB0aGUgbGFzdCBHQyBpbmZvIGlzIGZvciB0aGlzIG1ldGhvZC4KLSAgICBHQ1N0cmF0ZWd5OjppdGVyYXRvciBJID0gbXZtOjpNdm1Nb2R1bGU6OlRoZUdDU3RyYXRlZ3ktPmVuZCgpOwotICAgIEktLTsKLSAgICBERUJVRyhlcnJzKCkgPDwgKCpJKS0+Z2V0RnVuY3Rpb24oKS5nZXROYW1lKCkgPDwgJ1xuJyk7Ci0gICAgREVCVUcoZXJycygpIDw8IEYuZ2V0TmFtZSgpIDw8ICdcbicpOwotICAgIGFzc2VydCgmKCpJKS0+Z2V0RnVuY3Rpb24oKSA9PSAmRiAmJgotICAgICAgICAiR0MgSW5mbyBhbmQgbWV0aG9kIGRvIG5vdCBjb3JyZXNwb25kIik7Ci0gICAgbGx2bTo6R0NGdW5jdGlvbkluZm8qIEdGSSA9ICpJOwotICAgIEpJVE1ldGhvZEluZm8qIE1JID0gbmV3KCpNdm1Nb2R1bGU6OkFsbG9jYXRvciwgIk12bUpJVE1ldGhvZEluZm8iKQotICAgICAgICBNdm1KSVRNZXRob2RJbmZvKEdGSSwgJkYsIE12bU1vZHVsZTo6ZXhlY3V0aW9uRW5naW5lKTsKLSAgICBNSS0+YWRkVG9WTUtpdChtdm06OlRocmVhZDo6Z2V0KCktPnZta2l0LCAoSklUKilNdm1Nb2R1bGU6OmV4ZWN1dGlvbkVuZ2luZSk7Ci0gIH0KLX07Ci0KLXZvaWQgSklUTWV0aG9kSW5mbzo6YWRkVG9WTUtpdChWTUtpdCogdm1raXQsIEpJVCogaml0KSB7Ci0gIEpJVENvZGVFbWl0dGVyKiBKQ0UgPSBqaXQtPmdldENvZGVFbWl0dGVyKCk7Ci0gIGFzc2VydChHQ0luZm8gIT0gTlVMTCk7Ci0gIGZvciAoR0NGdW5jdGlvbkluZm86Oml0ZXJhdG9yIEkgPSBHQ0luZm8tPmJlZ2luKCksIEUgPSBHQ0luZm8tPmVuZCgpOwotICAgICAgIEkgIT0gRTsKLSAgICAgICBJKyspIHsKLSAgICB1aW50cHRyX3QgYWRkcmVzcyA9IEpDRS0+Z2V0TGFiZWxBZGRyZXNzKEktPkxhYmVsKTsKLSAgICBhc3NlcnQoYWRkcmVzcyAhPSAwKTsKLSAgICB2bWtpdC0+RnVuY3Rpb25zQ2FjaGUuYWRkTWV0aG9kSW5mbyh0aGlzLCAodm9pZCopYWRkcmVzcyk7Ci0gIH0KLX0KLQotc3RhdGljIE12bUpJVExpc3RlbmVyIEpJVExpc3RlbmVyOwotCi12b2lkIE12bU1vZHVsZTo6bG9hZEJ5dGVjb2RlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIFNNRGlhZ25vc3RpYyBFcnI7Ci0gIE1vZHVsZSogTSA9IFBhcnNlSVJGaWxlKHN0ciwgRXJyLCBnbG9iYWxNb2R1bGUtPmdldENvbnRleHQoKSk7Ci0gIGlmIChNKSB7Ci0gICAgTS0+c2V0VGFyZ2V0VHJpcGxlKGdldEhvc3RUcmlwbGUoKSk7Ci0gICAgTGlua2VyOjpMaW5rTW9kdWxlcyhnbG9iYWxNb2R1bGUsIE0sIDApOwotICAgIGRlbGV0ZSBNOwotICB9IGVsc2UgewotICAgIEVyci5QcmludCgibG9hZCBieXRlY29kZSIsIGVycnMoKSk7Ci0gIH0KLX0KLQotdHlwZWRlZiB2b2lkICgqQm9vdFR5cGUpKHVpbnRwdHJfdCBQbGFuKTsKLXR5cGVkZWYgdm9pZCAoKkJvb3RIZWFwVHlwZSkoaW50cHRyX3QgaW5pdGlhbCwgaW50cHRyX3QgbWF4KTsKLQotdm9pZCBNdm1Nb2R1bGU6OmluaXRpYWxpc2UoQ29kZUdlbk9wdDo6TGV2ZWwgbGV2ZWwsIE1vZHVsZSogTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldE1hY2hpbmUqIFQpIHsKLSAgbXZtOjpsaW5rVm1raXRHQygpOwotICAKLSAgbGx2bV9zdGFydF9tdWx0aXRocmVhZGVkKCk7Ci0gIAotICBsbHZtOjpOb0ZyYW1lUG9pbnRlckVsaW0gPSB0cnVlOwotICBsbHZtOjpEaXNhYmxlUHJldHR5U3RhY2tUcmFjZSA9IHRydWU7Ci0gIGxsdm06OkpJVEVtaXREZWJ1Z0luZm8gPSBFbWl0RGVidWdJbmZvOwotI2lmIERXQVJGX0VYQ0VQVElPTlMKLSAgbGx2bTo6SklURXhjZXB0aW9uSGFuZGxpbmcgPSB0cnVlOwotI2Vsc2UKLSAgbGx2bTo6SklURXhjZXB0aW9uSGFuZGxpbmcgPSBmYWxzZTsKLSNlbmRpZgotICAKLSAgLy8gRGlzYWJsZSBicmFuY2ggZm9sZCBmb3IgYWNjdXJhdGUgbGluZSBudW1iZXJzLgotICBjb25zdCBjaGFyKiBjb21tYW5kc1syXSA9IHsgInZta2l0IiwgIi1kaXNhYmxlLWJyYW5jaC1mb2xkIiB9OwotICBsbHZtOjpjbDo6UGFyc2VDb21tYW5kTGluZU9wdGlvbnMoMiwgY29uc3RfY2FzdDxjaGFyKio+KGNvbW1hbmRzKSk7Ci0KLSAgaWYgKCFNKSB7Ci0gICAgZ2xvYmFsTW9kdWxlID0gbmV3IE1vZHVsZSgiYm9vdHN0cmFwIG1vZHVsZSIsICoobmV3IExMVk1Db250ZXh0KCkpKTsKLQotICAgIEluaXRpYWxpemVOYXRpdmVUYXJnZXQoKTsKLQotICAgIGV4ZWN1dGlvbkVuZ2luZSA9IEV4ZWN1dGlvbkVuZ2luZTo6Y3JlYXRlSklUKGdsb2JhbE1vZHVsZSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBsZXZlbCwgZmFsc2UpOwotCi0gICAgQWxsb2NhdG9yID0gbmV3IEJ1bXBQdHJBbGxvY2F0b3IoKTsKLSAgICBleGVjdXRpb25FbmdpbmUtPlJlZ2lzdGVySklURXZlbnRMaXN0ZW5lcigmSklUTGlzdGVuZXIpOyAgICAKLSAgICBzdGQ6OnN0cmluZyBzdHIgPSAKLSAgICAgIGV4ZWN1dGlvbkVuZ2luZS0+Z2V0VGFyZ2V0RGF0YSgpLT5nZXRTdHJpbmdSZXByZXNlbnRhdGlvbigpOwotICAgIGdsb2JhbE1vZHVsZS0+c2V0RGF0YUxheW91dChzdHIpOwotICAgIGdsb2JhbE1vZHVsZS0+c2V0VGFyZ2V0VHJpcGxlKGdldEhvc3RUcmlwbGUoKSk7Ci0gIAotICAgIFRoZVRhcmdldERhdGEgPSBleGVjdXRpb25FbmdpbmUtPmdldFRhcmdldERhdGEoKTsKLSAgfSBlbHNlIHsKLSAgICBnbG9iYWxNb2R1bGUgPSBNOwotICAgIFRoZVRhcmdldERhdGEgPSBULT5nZXRUYXJnZXREYXRhKCk7Ci0gIH0KLQotICAvL0xMVk1Db250ZXh0JiBDb250ZXh0ID0gZ2xvYmFsTW9kdWxlLT5nZXRDb250ZXh0KCk7Ci0gIC8vTWV0YWRhdGFUeXBlS2luZCA9IENvbnRleHQuZ2V0TURLaW5kSUQoIkhpZ2hMZXZlbFR5cGUiKTsKLSAKLSAgZm9yIChzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGkgPSBMb2FkQnl0ZWNvZGVGaWxlcy5iZWdpbigpLAotICAgICAgIGUgPSBMb2FkQnl0ZWNvZGVGaWxlcy5lbmQoKTsgaSAhPSBlOyArK2kpIHsKLSAgICBsb2FkQnl0ZWNvZGVGaWxlKCppKTsgCi0gIH0KLX0KLQotQmFzZUludHJpbnNpY3M6OkJhc2VJbnRyaW5zaWNzKGxsdm06Ok1vZHVsZSogbW9kdWxlKSB7Ci0KLSAgbW9kdWxlLT5zZXREYXRhTGF5b3V0KE12bU1vZHVsZTo6Z2xvYmFsTW9kdWxlLT5nZXREYXRhTGF5b3V0KCkpOwotICBtb2R1bGUtPnNldFRhcmdldFRyaXBsZShNdm1Nb2R1bGU6Omdsb2JhbE1vZHVsZS0+Z2V0VGFyZ2V0VHJpcGxlKCkpOwotICBMTFZNQ29udGV4dCYgQ29udGV4dCA9IG1vZHVsZS0+Z2V0Q29udGV4dCgpOwotCi0gIHR5cGVkZWYgdm9pZCAoKmluaXRfaW5saW5lX3QpKGxsdm06Ok1vZHVsZSogbW9kdWxlKTsgCi0gIHN0YXRpYyBjb25zdCBjaGFyKiBNTVRrU3ltYm9sID0gIk1NVGtfSW5saW5lTWV0aG9kcyI7Ci0gIGluaXRfaW5saW5lX3QgaW5pdF9pbmxpbmUgPQotICAgICAgKGluaXRfaW5saW5lX3QpKHVpbnRwdHJfdClkbHN5bShTRUxGX0hBTkRMRSwgTU1Ua1N5bWJvbCk7Ci0gIGlmIChpbml0X2lubGluZSAhPSBOVUxMKSBpbml0X2lubGluZShtb2R1bGUpOwotCi0gIG12bTo6bGx2bV9ydW50aW1lOjptYWtlTExWTU1vZHVsZUNvbnRlbnRzKG1vZHVsZSk7Ci0KLSAgLy8gVHlwZSBkZWNsYXJhdGlvbgotICBwdHJUeXBlID0gUG9pbnRlclR5cGU6OmdldFVucXVhbChUeXBlOjpnZXRJbnQ4VHkoQ29udGV4dCkpOwotICBwdHIzMlR5cGUgPSBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFR5cGU6OmdldEludDMyVHkoQ29udGV4dCkpOwotICBwdHJQdHJUeXBlID0gUG9pbnRlclR5cGU6OmdldFVucXVhbChwdHJUeXBlKTsKLSAgcG9pbnRlclNpemVUeXBlID0gbW9kdWxlLT5nZXRQb2ludGVyU2l6ZSgpID09IE1vZHVsZTo6UG9pbnRlcjMyID8KLSAgICBUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpIDogVHlwZTo6Z2V0SW50NjRUeShDb250ZXh0KTsKLQotICAvLyBDb25zdGFudCBkZWNsYXJhdGlvbgotICBjb25zdGFudExvbmdNaW51c09uZSA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50NjRUeShDb250ZXh0KSwgKHVpbnQ2NF90KS0xKTsKLSAgY29uc3RhbnRMb25nWmVybyA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50NjRUeShDb250ZXh0KSwgMCk7Ci0gIGNvbnN0YW50TG9uZ09uZSA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50NjRUeShDb250ZXh0KSwgMSk7Ci0gIGNvbnN0YW50WmVybyA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwgMCk7Ci0gIGNvbnN0YW50SW50OFplcm8gPSBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDhUeShDb250ZXh0KSwgMCk7Ci0gIGNvbnN0YW50T25lID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLCAxKTsKLSAgY29uc3RhbnRUd28gPSBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoQ29udGV4dCksIDIpOwotICBjb25zdGFudFRocmVlID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLCAzKTsKLSAgY29uc3RhbnRGb3VyID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLCA0KTsKLSAgY29uc3RhbnRGaXZlID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLCA1KTsKLSAgY29uc3RhbnRTaXggPSBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoQ29udGV4dCksIDYpOwotICBjb25zdGFudFNldmVuID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLCA3KTsKLSAgY29uc3RhbnRFaWdodCA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwgOCk7Ci0gIGNvbnN0YW50TWludXNPbmUgPSBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoQ29udGV4dCksICh1aW50NjRfdCktMSk7Ci0gIGNvbnN0YW50TWluSW50ID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLCBNaW5JbnQpOwotICBjb25zdGFudE1heEludCA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwgTWF4SW50KTsKLSAgY29uc3RhbnRNaW5Mb25nID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ2NFR5KENvbnRleHQpLCBNaW5Mb25nKTsKLSAgY29uc3RhbnRNYXhMb25nID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ2NFR5KENvbnRleHQpLCBNYXhMb25nKTsKLSAgY29uc3RhbnRGbG9hdFplcm8gPSBDb25zdGFudEZQOjpnZXQoVHlwZTo6Z2V0RmxvYXRUeShDb250ZXh0KSwgMC4wZik7Ci0gIGNvbnN0YW50RmxvYXRPbmUgPSBDb25zdGFudEZQOjpnZXQoVHlwZTo6Z2V0RmxvYXRUeShDb250ZXh0KSwgMS4wZik7Ci0gIGNvbnN0YW50RmxvYXRUd28gPSBDb25zdGFudEZQOjpnZXQoVHlwZTo6Z2V0RmxvYXRUeShDb250ZXh0KSwgMi4wZik7Ci0gIGNvbnN0YW50RG91YmxlWmVybyA9IENvbnN0YW50RlA6OmdldChUeXBlOjpnZXREb3VibGVUeShDb250ZXh0KSwgMC4wKTsKLSAgY29uc3RhbnREb3VibGVPbmUgPSBDb25zdGFudEZQOjpnZXQoVHlwZTo6Z2V0RG91YmxlVHkoQ29udGV4dCksIDEuMCk7Ci0gIGNvbnN0YW50TWF4SW50RmxvYXQgPSBDb25zdGFudEZQOjpnZXQoVHlwZTo6Z2V0RmxvYXRUeShDb250ZXh0KSwgTWF4SW50RmxvYXQpOwotICBjb25zdGFudE1pbkludEZsb2F0ID0gQ29uc3RhbnRGUDo6Z2V0KFR5cGU6OmdldEZsb2F0VHkoQ29udGV4dCksIE1pbkludEZsb2F0KTsKLSAgY29uc3RhbnRNaW5Mb25nRmxvYXQgPSBDb25zdGFudEZQOjpnZXQoVHlwZTo6Z2V0RmxvYXRUeShDb250ZXh0KSwgTWluTG9uZ0Zsb2F0KTsKLSAgY29uc3RhbnRNaW5Mb25nRG91YmxlID0gQ29uc3RhbnRGUDo6Z2V0KFR5cGU6OmdldERvdWJsZVR5KENvbnRleHQpLCBNaW5Mb25nRG91YmxlKTsKLSAgY29uc3RhbnRNYXhMb25nRmxvYXQgPSBDb25zdGFudEZQOjpnZXQoVHlwZTo6Z2V0RmxvYXRUeShDb250ZXh0KSwgTWF4TG9uZ0Zsb2F0KTsKLSAgY29uc3RhbnRNYXhJbnREb3VibGUgPSBDb25zdGFudEZQOjpnZXQoVHlwZTo6Z2V0RG91YmxlVHkoQ29udGV4dCksIE1heEludERvdWJsZSk7Ci0gIGNvbnN0YW50TWluSW50RG91YmxlID0gQ29uc3RhbnRGUDo6Z2V0KFR5cGU6OmdldERvdWJsZVR5KENvbnRleHQpLCBNaW5JbnREb3VibGUpOwotICBjb25zdGFudE1heExvbmdEb3VibGUgPSBDb25zdGFudEZQOjpnZXQoVHlwZTo6Z2V0RG91YmxlVHkoQ29udGV4dCksIE1heExvbmdEb3VibGUpOwotICBjb25zdGFudE1heExvbmdEb3VibGUgPSBDb25zdGFudEZQOjpnZXQoVHlwZTo6Z2V0RG91YmxlVHkoQ29udGV4dCksIE1heExvbmdEb3VibGUpOwotICBjb25zdGFudEZsb2F0SW5maW5pdHkgPSBDb25zdGFudEZQOjpnZXQoVHlwZTo6Z2V0RmxvYXRUeShDb250ZXh0KSwgTWF4RmxvYXQpOwotICBjb25zdGFudEZsb2F0TWludXNJbmZpbml0eSA9IENvbnN0YW50RlA6OmdldChUeXBlOjpnZXRGbG9hdFR5KENvbnRleHQpLCBNaW5GbG9hdCk7Ci0gIGNvbnN0YW50RG91YmxlSW5maW5pdHkgPSBDb25zdGFudEZQOjpnZXQoVHlwZTo6Z2V0RG91YmxlVHkoQ29udGV4dCksIE1heERvdWJsZSk7Ci0gIGNvbnN0YW50RG91YmxlTWludXNJbmZpbml0eSA9IENvbnN0YW50RlA6OmdldChUeXBlOjpnZXREb3VibGVUeShDb250ZXh0KSwgTWluRG91YmxlKTsKLSAgY29uc3RhbnREb3VibGVNaW51c1plcm8gPSBDb25zdGFudEZQOjpnZXQoVHlwZTo6Z2V0RG91YmxlVHkoQ29udGV4dCksIC0wLjApOwotICBjb25zdGFudEZsb2F0TWludXNaZXJvID0gQ29uc3RhbnRGUDo6Z2V0KFR5cGU6OmdldEZsb2F0VHkoQ29udGV4dCksIC0wLjBmKTsKLSAgY29uc3RhbnRUaHJlYWRJRE1hc2sgPSBDb25zdGFudEludDo6Z2V0KHBvaW50ZXJTaXplVHlwZSwgbXZtOjpUaHJlYWQ6OklETWFzayk7Ci0gIGNvbnN0YW50U3RhY2tPdmVyZmxvd01hc2sgPSAKLSAgICBDb25zdGFudEludDo6Z2V0KHBvaW50ZXJTaXplVHlwZSwgbXZtOjpUaHJlYWQ6OlN0YWNrT3ZlcmZsb3dNYXNrKTsKLSAgY29uc3RhbnRGYXRNYXNrID0gQ29uc3RhbnRJbnQ6OmdldChwb2ludGVyU2l6ZVR5cGUsIAotICAgICAgcG9pbnRlclNpemVUeXBlID09IFR5cGU6OmdldEludDMyVHkoQ29udGV4dCkgPyAweDgwMDAwMDAwIDogMHg4MDAwMDAwMDAwMDAwMDAwTEwpOwotICBjb25zdGFudFB0ck9uZSA9IENvbnN0YW50SW50OjpnZXQocG9pbnRlclNpemVUeXBlLCAxKTsKLSAgY29uc3RhbnRQdHJaZXJvID0gQ29uc3RhbnRJbnQ6OmdldChwb2ludGVyU2l6ZVR5cGUsIDApOwotCi0gIGNvbnN0YW50UHRyTnVsbCA9IENvbnN0YW50OjpnZXROdWxsVmFsdWUocHRyVHlwZSk7IAotICBjb25zdGFudFB0ckxvZ1NpemUgPSAKLSAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoQ29udGV4dCksIHNpemVvZih2b2lkKikgPT0gOCA/IDMgOiAyKTsKLSAgYXJyYXlQdHJUeXBlID0gUG9pbnRlclR5cGU6OmdldFVucXVhbChBcnJheVR5cGU6OmdldChUeXBlOjpnZXRJbnQ4VHkoQ29udGV4dCksIDApKTsKLSAgCi0gIHByaW50RmxvYXRMTFZNID0gbW9kdWxlLT5nZXRGdW5jdGlvbigicHJpbnRGbG9hdCIpOwotICBwcmludERvdWJsZUxMVk0gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJwcmludERvdWJsZSIpOwotICBwcmludExvbmdMTFZNID0gbW9kdWxlLT5nZXRGdW5jdGlvbigicHJpbnRMb25nIik7Ci0gIHByaW50SW50TExWTSA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oInByaW50SW50Iik7Ci0gIHByaW50T2JqZWN0TExWTSA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oInByaW50T2JqZWN0Iik7Ci0KLSAgdW53aW5kUmVzdW1lID0gbW9kdWxlLT5nZXRGdW5jdGlvbigiX1Vud2luZF9SZXN1bWVfb3JfUmV0aHJvdyIpOwotICAKLSAgbGx2bUdldEV4Y2VwdGlvbiA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImxsdm0uZWguZXhjZXB0aW9uIik7Ci0gIGV4Y2VwdGlvblNlbGVjdG9yID0gbW9kdWxlLT5nZXRGdW5jdGlvbigibGx2bS5laC5zZWxlY3RvciIpOyAKLSAgCi0gIHBlcnNvbmFsaXR5ID0gbW9kdWxlLT5nZXRGdW5jdGlvbigiX19neHhfcGVyc29uYWxpdHlfdjAiKTsKLSAgZXhjZXB0aW9uRW5kQ2F0Y2ggPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJfX2N4YV9lbmRfY2F0Y2giKTsKLSAgZXhjZXB0aW9uQmVnaW5DYXRjaCA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oIl9fY3hhX2JlZ2luX2NhdGNoIik7Ci0KLSAgZnVuY19sbHZtX3NxcnRfZjY0ID0gbW9kdWxlLT5nZXRGdW5jdGlvbigibGx2bS5zcXJ0LmY2NCIpOwotICBmdW5jX2xsdm1fc2luX2Y2NCA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImxsdm0uc2luLmY2NCIpOwotICBmdW5jX2xsdm1fY29zX2Y2NCA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImxsdm0uY29zLmY2NCIpOwotICAKLSAgZnVuY19sbHZtX3Rhbl9mNjQgPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJ0YW4iKTsKLSAgZnVuY19sbHZtX2FzaW5fZjY0ID0gbW9kdWxlLT5nZXRGdW5jdGlvbigiYXNpbiIpOwotICBmdW5jX2xsdm1fYWNvc19mNjQgPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJhY29zIik7Ci0gIGZ1bmNfbGx2bV9hdGFuX2Y2NCA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImF0YW4iKTsKLSAgZnVuY19sbHZtX2V4cF9mNjQgPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJleHAiKTsKLSAgZnVuY19sbHZtX2xvZ19mNjQgPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJsb2ciKTsKLSAgZnVuY19sbHZtX2NlaWxfZjY0ID0gbW9kdWxlLT5nZXRGdW5jdGlvbigiY2VpbCIpOwotICBmdW5jX2xsdm1fZmxvb3JfZjY0ID0gbW9kdWxlLT5nZXRGdW5jdGlvbigiZmxvb3IiKTsKLSAgZnVuY19sbHZtX2NicnRfZjY0ID0gbW9kdWxlLT5nZXRGdW5jdGlvbigiY2JydCIpOwotICBmdW5jX2xsdm1fY29zaF9mNjQgPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJjb3NoIik7Ci0gIGZ1bmNfbGx2bV9leHBtMV9mNjQgPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJleHBtMSIpOwotICBmdW5jX2xsdm1fbG9nMTBfZjY0ID0gbW9kdWxlLT5nZXRGdW5jdGlvbigibG9nMTAiKTsKLSAgZnVuY19sbHZtX2xvZzFwX2Y2NCA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImxvZzFwIik7Ci0gIGZ1bmNfbGx2bV9zaW5oX2Y2NCA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oInNpbmgiKTsKLSAgZnVuY19sbHZtX3RhbmhfZjY0ID0gbW9kdWxlLT5nZXRGdW5jdGlvbigidGFuaCIpOwotICBmdW5jX2xsdm1fZmFic19mNjQgPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJmYWJzIik7Ci0gIGZ1bmNfbGx2bV9yaW50X2Y2NCA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oInJpbnQiKTsKLSAgICAKLSAgZnVuY19sbHZtX2h5cG90X2Y2NCA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImh5cG90Iik7Ci0gIGZ1bmNfbGx2bV9wb3dfZjY0ID0gbW9kdWxlLT5nZXRGdW5jdGlvbigicG93Iik7Ci0gIGZ1bmNfbGx2bV9hdGFuMl9mNjQgPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJhdGFuMiIpOwotICAgIAotICBmdW5jX2xsdm1fZmFic19mMzIgPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJmYWJzZiIpOwotCi0gIHNldGptcExMVk0gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJzZXRqbXAiKTsKLSAgCi0gIGxsdm1fbWVtY3B5X2kzMiA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImxsdm0ubWVtY3B5LmkzMiIpOwotICBsbHZtX21lbXNldF9pMzIgPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJsbHZtLm1lbXNldC5pMzIiKTsKLSAgbGx2bV9mcmFtZWFkZHJlc3MgPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJsbHZtLmZyYW1lYWRkcmVzcyIpOwotICBsbHZtX2djX2djcm9vdCA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImxsdm0uZ2Nyb290Iik7Ci0KLSAgbGx2bV9hdG9taWNfbGNzX2k4ID0gbW9kdWxlLT5nZXRGdW5jdGlvbigibGx2bS5hdG9taWMuY21wLnN3YXAuaTgucDBpOCIpOwotICBsbHZtX2F0b21pY19sY3NfaTE2ID0gbW9kdWxlLT5nZXRGdW5jdGlvbigibGx2bS5hdG9taWMuY21wLnN3YXAuaTE2LnAwaTE2Iik7Ci0gIGxsdm1fYXRvbWljX2xjc19pMzIgPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJsbHZtLmF0b21pYy5jbXAuc3dhcC5pMzIucDBpMzIiKTsKLSAgbGx2bV9hdG9taWNfbGNzX2k2NCA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImxsdm0uYXRvbWljLmNtcC5zd2FwLmk2NC5wMGk2NCIpOwotCi0gIGxsdm1fYXRvbWljX2xjc19wdHIgPSBwb2ludGVyU2l6ZVR5cGUgPT0gVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSA/IGxsdm1fYXRvbWljX2xjc19pMzIgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2F0b21pY19sY3NfaTY0OwotCi0gIHVuY29uZGl0aW9uYWxTYWZlUG9pbnQgPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJ1bmNvbmRpdGlvbmFsU2FmZVBvaW50Iik7Ci0gIGNvbmRpdGlvbmFsU2FmZVBvaW50ID0gbW9kdWxlLT5nZXRGdW5jdGlvbigiY29uZGl0aW9uYWxTYWZlUG9pbnQiKTsKLSAgQWxsb2NhdGVGdW5jdGlvbiA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImdjbWFsbG9jIik7Ci0gIEFsbG9jYXRlRnVuY3Rpb24tPnNldEdDKCJ2bWtpdCIpOwotICBhc3NlcnQoQWxsb2NhdGVGdW5jdGlvbiAmJiAiTm8gYWxsb2NhdGUgZnVuY3Rpb24iKTsKLSAgQWxsb2NhdGVVbnJlc29sdmVkRnVuY3Rpb24gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJnY21hbGxvY1VucmVzb2x2ZWQiKTsKLSAgYXNzZXJ0KEFsbG9jYXRlVW5yZXNvbHZlZEZ1bmN0aW9uICYmICJObyBhbGxvY2F0ZVVucmVzb2x2ZWQgZnVuY3Rpb24iKTsKLSAgQWRkRmluYWxpemF0aW9uQ2FuZGlkYXRlID0gbW9kdWxlLT5nZXRGdW5jdGlvbigiYWRkRmluYWxpemF0aW9uQ2FuZGlkYXRlIik7Ci0gIGFzc2VydChBZGRGaW5hbGl6YXRpb25DYW5kaWRhdGUgJiYgIk5vIGFkZEZpbmFsaXphdGlvbkNhbmRpZGF0ZSBmdW5jdGlvbiIpOwotCi0gIFZUVHlwZSAgICAgICAgICAgID0gUG9pbnRlclR5cGU6OmdldFVucXVhbChtb2R1bGUtPmdldFR5cGVCeU5hbWUoIlZUIikpOwotICBNdXRhdG9yVGhyZWFkVHlwZSA9IFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwobW9kdWxlLT5nZXRUeXBlQnlOYW1lKCJNdXRhdG9yVGhyZWFkIikpOwotCi0gIE9mZnNldERvWWllbGRJblRocmVhZENvbnN0YW50ID0gICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwgMSk7Ci0gIE9mZnNldENYWEV4Y2VwdGlvbkluVGhyZWFkQ29uc3RhbnQgPSAgICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwgMik7Ci0gIE9mZnNldFZNRGF0YUluVGhyZWFkQ29uc3RhbnQgPSAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwgMyk7Ci0gIE9mZnNldFBlbmRpbmdFeGNlcHRpb25JblRocmVhZENvbnN0YW50ID0gIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwgNCk7Ci0KLQlPZmZzZXRUaHJlYWRJbk11dGF0b3JUaHJlYWRDb25zdGFudCA9ICAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoQ29udGV4dCksIDApOwotfQotCi1jb25zdCBsbHZtOjpUYXJnZXREYXRhKiBNdm1Nb2R1bGU6OlRoZVRhcmdldERhdGE7Ci1sbHZtOjpHQ1N0cmF0ZWd5KiBNdm1Nb2R1bGU6OlRoZUdDU3RyYXRlZ3k7Ci1sbHZtOjpNb2R1bGUgKk12bU1vZHVsZTo6Z2xvYmFsTW9kdWxlOwotbGx2bTo6RXhlY3V0aW9uRW5naW5lKiBNdm1Nb2R1bGU6OmV4ZWN1dGlvbkVuZ2luZTsKLW12bTo6TG9ja1JlY3Vyc2l2ZSBNdm1Nb2R1bGU6OnByb3RlY3RFbmdpbmU7Ci1tdm06OkJ1bXBQdHJBbGxvY2F0b3IqIE12bU1vZHVsZTo6QWxsb2NhdG9yOwotLy91bnNpZ25lZCBNdm1Nb2R1bGU6Ok1ldGFkYXRhVHlwZUtpbmQ7Ci0KLXVpbnQ2NCBNdm1Nb2R1bGU6OmdldFR5cGVTaXplKGNvbnN0IGxsdm06OlR5cGUqIHR5cGUpIHsKLSAgcmV0dXJuIFRoZVRhcmdldERhdGEtPmdldFR5cGVBbGxvY1NpemUodHlwZSk7Ci19Ci0KLXZvaWQgTXZtTW9kdWxlOjpydW5QYXNzZXMobGx2bTo6RnVuY3Rpb24qIGZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkZ1bmN0aW9uUGFzc01hbmFnZXIqIHBtKSB7Ci0gIC8vIFRha2UgdGhlIGxvY2sgYmVjYXVzZSB0aGUgcGFzcyBtYW5hZ2VyIHdpbGwgY2FsbCBtYXRlcmlhbGl6ZUZ1bmN0aW9uLgotICAvLyBPdXIgaW1wbGVtZW50YXRpb24gb2YgbWF0ZXJpYWxpemVGdW5jdGlvbiByZXF1aXJlcyB0aGF0IHRoZSBsb2NrIGlzIGhlbGQKLSAgLy8gYnkgdGhlIGNhbGxlci4gVGhpcyBpcyBkdWUgdG8gTExWTSdzIEpJVCBzdWJzeXN0ZW0gd2hlcmUgdGhlIGNhbGwgdG8KLSAgLy8gbWF0ZXJpYWxpemVGdW5jdGlvbiBpcyBndWFyZGVkLgotICBwbS0+cnVuKCpmdW5jKTsKLX0KLQotc3RhdGljIHZvaWQgYWRkUGFzcyhGdW5jdGlvblBhc3NNYW5hZ2VyICpQTSwgUGFzcyAqUCkgewotICAvLyBBZGQgdGhlIHBhc3MgdG8gdGhlIHBhc3MgbWFuYWdlci4uLgotICBQTS0+YWRkKFApOwotfQotCi0vLyBUaGlzIGlzIGVxdWl2YWxlbnQgdG86Ci0vLyBvcHQgLXNpbXBsaWZ5Y2ZnIC1tZW0ycmVnIC1pbnN0Y29tYmluZSAtanVtcC10aHJlYWRpbmcgLXNpbXBsaWZ5Y2ZnCi0vLyAgICAgLXNjYWxhcnJlcGwgLWluc3Rjb21iaW5lIC1jb25kcHJvcCAtc2ltcGxpZnljZmcgLXByZWRzaW1wbGlmeSAKLS8vICAgICAtcmVhc3NvY2lhdGUgLWxpY20gLWxvb3AtdW5zd2l0Y2ggLWluZHZhcnMgLWxvb3AtZGVsZXRpb24gLWxvb3AtdW5yb2xsIAotLy8gICAgIC1pbnN0Y29tYmluZSAtZ3ZuIC1zY2NwIC1zaW1wbGlmeWNmZyAtaW5zdGNvbWJpbmUgLWNvbmRwcm9wIC1kc2UgLWFkY2UgCi0vLyAgICAgLXNpbXBsaWZ5Y2ZnCi0vLwotc3RhdGljIHZvaWQgQWRkU3RhbmRhcmRDb21waWxlUGFzc2VzKEZ1bmN0aW9uUGFzc01hbmFnZXIqIFBNKSB7IAotICAgCi0gIGFkZFBhc3MoUE0sIGNyZWF0ZUNGR1NpbXBsaWZpY2F0aW9uUGFzcygpKTsgLy8gQ2xlYW4gdXAgZGlzZ3VzdGluZyBjb2RlCi0gIGFkZFBhc3MoUE0sIGNyZWF0ZVByb21vdGVNZW1vcnlUb1JlZ2lzdGVyUGFzcygpKTsvLyBLaWxsIHVzZWxlc3MgYWxsb2NhcwotICAKLSAgYWRkUGFzcyhQTSwgY3JlYXRlSW5zdHJ1Y3Rpb25Db21iaW5pbmdQYXNzKCkpOyAvLyBDbGVhbnVwIGZvciBzY2FsYXJyZXBsLgotICBhZGRQYXNzKFBNLCBjcmVhdGVTY2FsYXJSZXBsQWdncmVnYXRlc1Bhc3MoKSk7IC8vIEJyZWFrIHVwIGFnZ3JlZ2F0ZSBhbGxvY2FzCi0gIGFkZFBhc3MoUE0sIGNyZWF0ZUluc3RydWN0aW9uQ29tYmluaW5nUGFzcygpKTsgLy8gQ2xlYW51cCBmb3Igc2NhbGFycmVwbC4KLSAgYWRkUGFzcyhQTSwgY3JlYXRlSnVtcFRocmVhZGluZ1Bhc3MoKSk7ICAgICAgICAvLyBUaHJlYWQganVtcHMuCi0gIGFkZFBhc3MoUE0sIGNyZWF0ZUNGR1NpbXBsaWZpY2F0aW9uUGFzcygpKTsgICAgLy8gTWVyZ2UgJiByZW1vdmUgQkJzCi0gIGFkZFBhc3MoUE0sIGNyZWF0ZUluc3RydWN0aW9uQ29tYmluaW5nUGFzcygpKTsgLy8gQ29tYmluZSBzaWxseSBzZXEncwotICAKLSAgYWRkUGFzcyhQTSwgY3JlYXRlQ0ZHU2ltcGxpZmljYXRpb25QYXNzKCkpOyAgICAvLyBNZXJnZSAmIHJlbW92ZSBCQnMKLSAgYWRkUGFzcyhQTSwgY3JlYXRlUmVhc3NvY2lhdGVQYXNzKCkpOyAgICAgICAgICAvLyBSZWFzc29jaWF0ZSBleHByZXNzaW9ucwotICBhZGRQYXNzKFBNLCBjcmVhdGVMb29wUm90YXRlUGFzcygpKTsgICAgICAgICAgIC8vIFJvdGF0ZSBsb29wcy4KLSAgYWRkUGFzcyhQTSwgY3JlYXRlTElDTVBhc3MoKSk7ICAgICAgICAgICAgICAgICAvLyBIb2lzdCBsb29wIGludmFyaWFudHMKLSAgYWRkUGFzcyhQTSwgY3JlYXRlTG9vcFVuc3dpdGNoUGFzcygpKTsgICAgICAgICAvLyBVbnN3aXRjaCBsb29wcy4KLSAgYWRkUGFzcyhQTSwgY3JlYXRlSW5zdHJ1Y3Rpb25Db21iaW5pbmdQYXNzKCkpOyAKLSAgYWRkUGFzcyhQTSwgY3JlYXRlSW5kVmFyU2ltcGxpZnlQYXNzKCkpOyAgICAgICAvLyBDYW5vbmljYWxpemUgaW5kdmFycwotICBhZGRQYXNzKFBNLCBjcmVhdGVMb29wRGVsZXRpb25QYXNzKCkpOyAgICAgICAgIC8vIERlbGV0ZSBkZWFkIGxvb3BzCi0gIGFkZFBhc3MoUE0sIGNyZWF0ZUxvb3BVbnJvbGxQYXNzKCkpOyAgICAgICAgICAgLy8gVW5yb2xsIHNtYWxsIGxvb3BzKi8KLSAgYWRkUGFzcyhQTSwgY3JlYXRlSW5zdHJ1Y3Rpb25Db21iaW5pbmdQYXNzKCkpOyAvLyBDbGVhbiB1cCBhZnRlciB0aGUgdW5yb2xsZXIKLSAgYWRkUGFzcyhQTSwgY3JlYXRlR1ZOUGFzcygpKTsgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgcmVkdW5kYW5jaWVzCi0gIGFkZFBhc3MoUE0sIGNyZWF0ZU1lbUNweU9wdFBhc3MoKSk7ICAgICAgICAgICAgIC8vIFJlbW92ZSBtZW1jcHkgLyBmb3JtIG1lbXNldCAgCi0gIGFkZFBhc3MoUE0sIGNyZWF0ZVNDQ1BQYXNzKCkpOyAgICAgICAgICAgICAgICAgLy8gQ29uc3RhbnQgcHJvcCB3aXRoIFNDQ1AKLQotICAvLyBSdW4gaW5zdGNvbWJpbmUgYWZ0ZXIgcmVkdW5kYW5jeSBlbGltaW5hdGlvbiB0byBleHBsb2l0IG9wcG9ydHVuaXRpZXMKLSAgLy8gb3BlbmVkIHVwIGJ5IHRoZW0uCi0gIGFkZFBhc3MoUE0sIGNyZWF0ZUluc3RydWN0aW9uQ29tYmluaW5nUGFzcygpKTsKLSAgYWRkUGFzcyhQTSwgY3JlYXRlSnVtcFRocmVhZGluZ1Bhc3MoKSk7ICAgICAgICAgLy8gVGhyZWFkIGp1bXBzCi0gIGFkZFBhc3MoUE0sIGNyZWF0ZURlYWRTdG9yZUVsaW1pbmF0aW9uUGFzcygpKTsgIC8vIERlbGV0ZSBkZWFkIHN0b3JlcwotICBhZGRQYXNzKFBNLCBjcmVhdGVBZ2dyZXNzaXZlRENFUGFzcygpKTsgICAgICAgICAvLyBEZWxldGUgZGVhZCBpbnN0cnVjdGlvbnMKLSAgYWRkUGFzcyhQTSwgY3JlYXRlQ0ZHU2ltcGxpZmljYXRpb25QYXNzKCkpOyAgICAgLy8gTWVyZ2UgJiByZW1vdmUgQkJzCi19Ci0KLXN0YXRpYyBjbDo6b3B0PGJvb2w+IAotRGlzYWJsZU9wdGltaXphdGlvbnMoImRpc2FibGUtb3B0IiwgCi0gICAgICAgICAgICAgICAgICAgICBjbDo6ZGVzYygiRG8gbm90IHJ1biBhbnkgb3B0aW1pemF0aW9uIHBhc3NlcyIpKTsKLQotY2w6Om9wdDxib29sPgotU3RhbmRhcmRDb21waWxlT3B0cygic3RkLWNvbXBpbGUtb3B0cyIsIAotICAgICAgICAgICAgICAgICAgIGNsOjpkZXNjKCJJbmNsdWRlIHRoZSBzdGFuZGFyZCBjb21waWxlIHRpbWUgb3B0aW1pemF0aW9ucyIpKTsKLQotLy8gVGhlIE9wdGltaXphdGlvbkxpc3QgaXMgYXV0b21hdGljYWxseSBwb3B1bGF0ZWQgd2l0aCByZWdpc3RlcmVkIFBhc3NlcyBieSB0aGUKLS8vIFBhc3NOYW1lUGFyc2VyLgotLy8KLXN0YXRpYyBsbHZtOjpjbDo6bGlzdDxjb25zdCBsbHZtOjpQYXNzSW5mbyosIGJvb2wsIGxsdm06OlBhc3NOYW1lUGFyc2VyPgotUGFzc0xpc3QobGx2bTo6Y2w6OmRlc2MoIk9wdGltaXphdGlvbnMgYXZhaWxhYmxlOiIpKTsKLQotbmFtZXNwYWNlIG12bSB7Ci0gIGxsdm06OkZ1bmN0aW9uUGFzcyogY3JlYXRlSW5saW5lTWFsbG9jUGFzcygpOwotfQotCi12b2lkIE12bU1vZHVsZTo6YWRkQ29tbWFuZExpbmVQYXNzZXMoRnVuY3Rpb25QYXNzTWFuYWdlciogUE0pIHsKLSAgYWRkUGFzcyhQTSwgbmV3IFRhcmdldERhdGEoKk12bU1vZHVsZTo6VGhlVGFyZ2V0RGF0YSkpOwotCi0gIGFkZFBhc3MoUE0sIGNyZWF0ZVZlcmlmaWVyUGFzcygpKTsgICAgICAgIC8vIFZlcmlmeSB0aGF0IGlucHV0IGlzIGNvcnJlY3QKLQotI2lmZGVmIFdJVEhfTU1USwotICBhZGRQYXNzKFBNLCBjcmVhdGVDRkdTaW1wbGlmaWNhdGlvblBhc3MoKSk7IC8vIENsZWFuIHVwIGRpc2d1c3RpbmcgY29kZQotICBhZGRQYXNzKFBNLCBjcmVhdGVJbmxpbmVNYWxsb2NQYXNzKCkpOwotI2VuZGlmCi0gIAotICAvLyBDcmVhdGUgYSBuZXcgb3B0aW1pemF0aW9uIHBhc3MgZm9yIGVhY2ggb25lIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lCi0gIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBQYXNzTGlzdC5zaXplKCk7ICsraSkgewotICAgIC8vIENoZWNrIHRvIHNlZSBpZiAtc3RkLWNvbXBpbGUtb3B0cyB3YXMgc3BlY2lmaWVkIGJlZm9yZSB0aGlzIG9wdGlvbi4gIElmCi0gICAgLy8gc28sIGhhbmRsZSBpdC4KLSAgICBpZiAoU3RhbmRhcmRDb21waWxlT3B0cyAmJiAKLSAgICAgICAgU3RhbmRhcmRDb21waWxlT3B0cy5nZXRQb3NpdGlvbigpIDwgUGFzc0xpc3QuZ2V0UG9zaXRpb24oaSkpIHsKLSAgICAgIGlmICghRGlzYWJsZU9wdGltaXphdGlvbnMpIEFkZFN0YW5kYXJkQ29tcGlsZVBhc3NlcyhQTSk7Ci0gICAgICBTdGFuZGFyZENvbXBpbGVPcHRzID0gZmFsc2U7Ci0gICAgfQotICAgICAgCi0gICAgY29uc3QgUGFzc0luZm8gKlBhc3NJbmYgPSBQYXNzTGlzdFtpXTsKLSAgICBQYXNzICpQID0gMDsKLSAgICBpZiAoUGFzc0luZi0+Z2V0Tm9ybWFsQ3RvcigpKQotICAgICAgUCA9IFBhc3NJbmYtPmdldE5vcm1hbEN0b3IoKSgpOwotICAgIGVsc2UKLSAgICAgIGVycnMoKSA8PCAiY2Fubm90IGNyZWF0ZSBwYXNzOiAiCi0gICAgICAgICAgIDw8IFBhc3NJbmYtPmdldFBhc3NOYW1lKCkgPDwgIlxuIjsKLSAgICBpZiAoUCkgewotICAgICAgICBib29sIGlzTW9kdWxlUGFzcyA9IChQLT5nZXRQYXNzS2luZCgpID09IFBUX01vZHVsZSk7Ci0gICAgICAgIGlmIChpc01vZHVsZVBhc3MpIAotICAgICAgICAgIGVycnMoKSA8PCAidm1raXQgZG9lcyBub3Qgc3VwcG9ydCBtb2R1bGUgcGFzczogIgotICAgICAgICAgICAgIDw8IFBhc3NJbmYtPmdldFBhc3NOYW1lKCkgPDwgIlxuIjsKLSAgICAgICAgZWxzZSBhZGRQYXNzKFBNLCBQKTsKLQotICAgIH0KLSAgfQotICAgIAotICAvLyBJZiAtc3RkLWNvbXBpbGUtb3B0cyB3YXMgc3BlY2lmaWVkIGF0IHRoZSBlbmQgb2YgdGhlIHBhc3MgbGlzdCwgYWRkIHRoZW0uCi0gIGlmIChTdGFuZGFyZENvbXBpbGVPcHRzKSB7Ci0gICAgQWRkU3RhbmRhcmRDb21waWxlUGFzc2VzKFBNKTsKLSAgfQotICBQTS0+ZG9Jbml0aWFsaXphdGlvbigpOwotfQotCi0vLyBXZSBwcm90ZWN0IHRoZSBjcmVhdGlvbiBvZiBJUiB3aXRoIHRoZSBleGVjdXRpb25FbmdpbmUgbG9jayBiZWNhdXNlCi0vLyBjb2RlZ2VuJ2luZyBhIGZ1bmN0aW9uIG1heSBhbHNvIGNyZWF0ZSBJUiBvYmplY3RzLgotdm9pZCBNdm1Nb2R1bGU6OnByb3RlY3RJUigpIHsKLSAgcHJvdGVjdEVuZ2luZS5sb2NrKCk7Ci19Ci0KLXZvaWQgTXZtTW9kdWxlOjp1bnByb3RlY3RJUigpIHsKLSAgcHJvdGVjdEVuZ2luZS51bmxvY2soKTsKLX0KLQotdm9pZCBKSVRNZXRob2RJbmZvOjpzY2FuKHVpbnRwdHJfdCBjbG9zdXJlLCB2b2lkKiBpcCwgdm9pZCogYWRkcikgewotICBpZiAoR0NJbmZvKSB7Ci0gICAgREVCVUcobGx2bTo6ZXJycygpIDw8IEdDSW5mby0+Z2V0RnVuY3Rpb24oKS5nZXROYW1lKCkgPDwgJ1xuJyk7Ci0gICAgLy8gQWxsIHNhZmUgcG9pbnRzIGhhdmUgdGhlIHNhbWUgaW5mb3JtYXRpb25zIGN1cnJlbnRseSBpbiBMTFZNLgotICAgIGxsdm06OkdDRnVuY3Rpb25JbmZvOjppdGVyYXRvciBKID0gR0NJbmZvLT5iZWdpbigpOwotICAgIC8vdWludHB0cl90IHNwYWRkciA9ICh1aW50cHRyX3QpYWRkciArIEdGSS0+Z2V0RnJhbWVTaXplKCkgKyBzaXplb2Yodm9pZCopOwotICAgIHVpbnRwdHJfdCBzcGFkZHIgPSAoKHVpbnRwdHJfdCopYWRkcilbMF07Ci0gICAgZm9yIChsbHZtOjpHQ0Z1bmN0aW9uSW5mbzo6bGl2ZV9pdGVyYXRvciBLID0gR0NJbmZvLT5saXZlX2JlZ2luKEopLAotICAgICAgICAgS0UgPSBHQ0luZm8tPmxpdmVfZW5kKEopOyBLICE9IEtFOyArK0spIHsKLSAgICAgIGludHB0cl90IG9iaiA9ICooaW50cHRyX3QqKShzcGFkZHIgKyBLLT5TdGFja09mZnNldCk7Ci0gICAgICAvLyBWZXJpZnkgdGhhdCBvYmogZG9lcyBub3QgY29tZSBmcm9tIGEgSlNSIGJ5dGVjb2RlLgotICAgICAgaWYgKCEob2JqICYgMSkpIHsKLSAgICAgICAgQ29sbGVjdG9yOjpzY2FuT2JqZWN0KCh2b2lkKiopKHNwYWRkciArIEstPlN0YWNrT2Zmc2V0KSwgY2xvc3VyZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvTXZtL0NvbXBpbGVyL0xvb3BTYWZlUG9pbnRzLmNwcCBiL3Zta2l0L2xpYi9Ndm0vQ29tcGlsZXIvTG9vcFNhZmVQb2ludHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTU1NjI4Li4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9Ndm0vQ29tcGlsZXIvTG9vcFNhZmVQb2ludHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8vPT09LS0tLS0tLSBMb29wU2FmZVBvaW50cy5jcHAgLSBBZGQgc2FmZSBwb2ludHMgaW4gbG9vcCBoZWFkZXJzIC0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0KLSNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgotI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTG9vcFBhc3MuaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FsbFNpdGUuaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGxsdm07Ci0KLW5hbWVzcGFjZSB7Ci0KLSAgY2xhc3MgTG9vcFNhZmVQb2ludHMgOiBwdWJsaWMgTG9vcFBhc3MgewotICBwdWJsaWM6Ci0gICAgc3RhdGljIGNoYXIgSUQ7Ci0gICAgCi0gICAgTG9vcFNhZmVQb2ludHMoKSA6IExvb3BQYXNzKElEKSB7fQotCi0gICAgdmlydHVhbCBib29sIHJ1bk9uTG9vcChMb29wKiBMLCBMUFBhc3NNYW5hZ2VyJiBMUE0pOwotCi0gICAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKLSAgICAgIEFVLmFkZFJlcXVpcmVkPExvb3BJbmZvPigpOwotICAgIH0KLQotCi0gIHByaXZhdGU6Ci0gICAgdm9pZCBpbnNlcnRTYWZlUG9pbnQoQmFzaWNCbG9jayogQkIsIEZ1bmN0aW9uKiBTYWZlRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUqIFlpZWxkUHRyLCBMb29wKiBMLCBMb29wSW5mbyogTEkpOwotICB9OwotCi0gIGNoYXIgTG9vcFNhZmVQb2ludHM6OklEID0gMDsKLSAgUmVnaXN0ZXJQYXNzPExvb3BTYWZlUG9pbnRzPiBYKCJMb29wU2FmZVBvaW50cyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWRkIHNhZmUgcG9pbnRzIGluIGxvb3AgaGVhZGVycyIpOwotCi12b2lkIExvb3BTYWZlUG9pbnRzOjppbnNlcnRTYWZlUG9pbnQoQmFzaWNCbG9jayogQkIsIEZ1bmN0aW9uKiBTYWZlRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUqIFlpZWxkUHRyLCBMb29wKiBMLCBMb29wSW5mbyogTEkpIHsKLSAgSW5zdHJ1Y3Rpb24qIEkgPSBCQi0+Z2V0Rmlyc3ROb25QSEkoKTsKLSAgQmFzaWNCbG9jayogTkJCID0gQkItPnNwbGl0QmFzaWNCbG9jayhJKTsKLSAgTC0+YWRkQmFzaWNCbG9ja1RvTG9vcChOQkIsIExJLT5nZXRCYXNlKCkpOwotCi0gIE5CQiA9IE5CQi0+Z2V0U2luZ2xlUHJlZGVjZXNzb3IoKTsKLSAgSSA9IE5CQi0+Z2V0VGVybWluYXRvcigpOwotICBCYXNpY0Jsb2NrKiBTVSA9IChzdGF0aWNfY2FzdDxCcmFuY2hJbnN0Kj4oSSkpLT5nZXRTdWNjZXNzb3IoMCk7Ci0gIEktPmVyYXNlRnJvbVBhcmVudCgpOwotICAKLSAgVmFsdWUqIExkID0gbmV3IExvYWRJbnN0KFlpZWxkUHRyLCAiIiwgTkJCKTsKLSAgQmFzaWNCbG9jayogeWllbGQgPSBCYXNpY0Jsb2NrOjpDcmVhdGUoU2FmZUZ1bmN0aW9uLT5nZXRDb250ZXh0KCksICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQi0+Z2V0UGFyZW50KCkpOwotICAKLSAgQnJhbmNoSW5zdDo6Q3JlYXRlKHlpZWxkLCBTVSwgTGQsIE5CQik7Ci0KLSAgQ2FsbEluc3Q6OkNyZWF0ZShTYWZlRnVuY3Rpb24sICIiLCB5aWVsZCk7Ci0gIEJyYW5jaEluc3Q6OkNyZWF0ZShTVSwgeWllbGQpOwotCi0gIEwtPmFkZEJhc2ljQmxvY2tUb0xvb3AoeWllbGQsIExJLT5nZXRCYXNlKCkpOwotfQotCi0KLWJvb2wgTG9vcFNhZmVQb2ludHM6OnJ1bk9uTG9vcChMb29wKiBMLCBMUFBhc3NNYW5hZ2VyJiBMUE0pIHsKLQotICBMb29wSW5mbyogTEkgPSAmZ2V0QW5hbHlzaXM8TG9vcEluZm8+KCk7Ci0gIEJhc2ljQmxvY2sqIEhlYWRlciA9IEwtPmdldEhlYWRlcigpOwotICBGdW5jdGlvbiAqRiA9IEhlYWRlci0+Z2V0UGFyZW50KCk7ICAKLSAgRnVuY3Rpb24qIFNhZmVGdW5jdGlvbiA9Ci0gICAgRi0+Z2V0UGFyZW50KCktPmdldEZ1bmN0aW9uKCJjb25kaXRpb25hbFNhZmVQb2ludCIpOwotICBpZiAoIVNhZmVGdW5jdGlvbikgcmV0dXJuIGZhbHNlOwotCi0gIFZhbHVlKiBZaWVsZFB0ciA9IDA7Ci0gIAotICAvLyBMb29rdXAgdGhlIHlpZWxkIHBvaW50ZXIuCi0gIGZvciAoRnVuY3Rpb246Oml0ZXJhdG9yIEJJID0gRi0+YmVnaW4oKSwgQkUgPSBGLT5lbmQoKTsgQkkgIT0gQkU7IEJJKyspIHsgCi0gICAgQmFzaWNCbG9jayAqQ3VyID0gQkk7Ci0KLSAgICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIElJID0gQ3VyLT5iZWdpbigpLCBJRSA9IEN1ci0+ZW5kKCk7IElJICE9IElFOykgewotICAgICAgSW5zdHJ1Y3Rpb24gKkkgPSBJSTsKLSAgICAgIElJKys7Ci0gICAgICBpZiAoSS0+Z2V0T3Bjb2RlKCkgIT0gSW5zdHJ1Y3Rpb246OkNhbGwgJiYKLSAgICAgICAgICBJLT5nZXRPcGNvZGUoKSAhPSBJbnN0cnVjdGlvbjo6SW52b2tlKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBDYWxsU2l0ZSBDYWxsKEkpOwotICAgICAgaWYgKENhbGwuZ2V0Q2FsbGVkVmFsdWUoKSA9PSBTYWZlRnVuY3Rpb24pIHsKLSAgICAgICAgaWYgKEJhc2ljQmxvY2sqIEluY29taW5nID0gQ3VyLT5nZXRTaW5nbGVQcmVkZWNlc3NvcigpKSB7Ci0gICAgICAgICAgaWYgKEJyYW5jaEluc3QqIFQgPSBkeW5fY2FzdDxCcmFuY2hJbnN0PihJbmNvbWluZy0+Z2V0VGVybWluYXRvcigpKSkgewotICAgICAgICAgICAgaWYgKExvYWRJbnN0KiBMSSA9IGR5bl9jYXN0PExvYWRJbnN0PihULT5nZXRDb25kaXRpb24oKSkpIHsKLSAgICAgICAgICAgICAgWWllbGRQdHIgPSBMSS0+Z2V0UG9pbnRlck9wZXJhbmQoKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChZaWVsZFB0cikgYnJlYWs7Ci0gIH0KLQotICBpZiAoIVlpZWxkUHRyKSByZXR1cm4gZmFsc2U7Ci0KLSAgaW5zZXJ0U2FmZVBvaW50KEhlYWRlciwgU2FmZUZ1bmN0aW9uLCBZaWVsZFB0ciwgTCwgTEkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotfQotCi0KLW5hbWVzcGFjZSBtdm0gewotCi1Mb29wUGFzcyogY3JlYXRlTG9vcFNhZmVQb2ludHNQYXNzKCkgewotICByZXR1cm4gbmV3IExvb3BTYWZlUG9pbnRzKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9Ndm0vQ29tcGlsZXIvTWFrZWZpbGUgYi92bWtpdC9saWIvTXZtL0NvbXBpbGVyL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWVhOTM4Li4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9Ndm0vQ29tcGlsZXIvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIz09PS0gbGliL012bS9SdW50aW1lL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIwotIyAKLSMgICAgICAgICAgICAgICAgICAgICBUaGUgdm1raXQgcHJvamVjdAotIwotIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLSMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotIyAKLSMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCi1MRVZFTCA9IC4uLy4uLy4uCi0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29uZmlnCi0KLWlmZXEgKCQoV0lUSF9MTFZNX0dDQyksIDEpCi0gIE1PRFVMRV9OQU1FID0gTXZtQ29tcGlsZXIKLWVsc2UKLSAgTElCUkFSWU5BTUUgPSBNdm1Db21waWxlcgotZW5kaWYKLQotVk1LSVRfUlVOVElNRSA9ICQoUFJPSl9TUkNfRElSKS9tdm0tcnVudGltZS5sbAotCi1pZmVxICgkKEdDX01NVEspLCAxKQotVk1LSVRfUlVOVElNRSArPSAkKFBST0pfU1JDX0RJUikvbXZtLW1tdGstdGhyZWFkLmxsCi1lbHNlCi1WTUtJVF9SVU5USU1FICs9ICQoUFJPSl9TUkNfRElSKS9tdm0tbW1hcDItdGhyZWFkLmxsCi1lbmRpZgotCi1CVUlMVF9TT1VSQ0VTID0gTExWTVJ1bnRpbWUuaW5jCi0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCmRpZmYgLS1naXQgYS92bWtpdC9saWIvTXZtL0NvbXBpbGVyL1Zta2l0R0MuY3BwIGIvdm1raXQvbGliL012bS9Db21waWxlci9WbWtpdEdDLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA0NTk4MC4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTXZtL0NvbXBpbGVyL1Zta2l0R0MuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLy89PT0tLS0tLS0tIFZta2l0R0MuY3BwIC0gR0MgZm9yIEpJVC1nZW5lcmF0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLQotI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9HQ3MuaCIKLSNpbmNsdWRlICJsbHZtL0NvZGVHZW4vR0NTdHJhdGVneS5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgotCi0jaW5jbHVkZSAibXZtL0pJVC5oIgotCi11c2luZyBuYW1lc3BhY2UgbGx2bTsKLQotbmFtZXNwYWNlIHsKLSAgY2xhc3MgVm1raXRHQyA6IHB1YmxpYyBHQ1N0cmF0ZWd5IHsKLSAgcHVibGljOgotICAgIFZta2l0R0MoKTsKLSAgfTsKLX0KLQotbmFtZXNwYWNlIG12bSB7Ci0gIHZvaWQgbGlua1Zta2l0R0MoKSB7IH0KLX0KLQotc3RhdGljIEdDUmVnaXN0cnk6OkFkZDxWbWtpdEdDPgotWCgidm1raXQiLCAiVk1LaXQgR0MgZm9yIEpJVC1nZW5lcmF0ZWQgZnVuY3Rpb25zIik7Ci0KLVZta2l0R0M6OlZta2l0R0MoKSB7Ci0gIE5lZWRlZFNhZmVQb2ludHMgPSAxIDw8IEdDOjpQb3N0Q2FsbDsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9Ndm0vQ29tcGlsZXIvbXZtLW1tYXAyLXRocmVhZC5sbCBiL3Zta2l0L2xpYi9Ndm0vQ29tcGlsZXIvbXZtLW1tYXAyLXRocmVhZC5sbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY0NjE1Yy4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTXZtL0NvbXBpbGVyL212bS1tbWFwMi10aHJlYWQubGwKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTs7OyBGaWVsZCAwOiB0aGUgdGhyZWFkCi0lTXV0YXRvclRocmVhZCA9IHR5cGUgeyAlVGhyZWFkIH0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9Ndm0vQ29tcGlsZXIvbXZtLW1tdGstdGhyZWFkLmxsIGIvdm1raXQvbGliL012bS9Db21waWxlci9tdm0tbW10ay10aHJlYWQubGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjOWFjMTkuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL012bS9Db21waWxlci9tdm0tbW10ay10aHJlYWQubGwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSVCdW1wUHRyQWxsb2NhdG9yID0gdHlwZSB7IGkzMiwgaTgqLCBpOCosIGk4KiwgaTgqLCBpOCosIGk4KiwgaTgqIH0KLQotOzs7IEZpZWxkIDA6IHRoZSB0aHJlYWQKLTs7OyBmaWVsZCAxOiBhbGxvY2F0b3IKLTs7OyBmaWVsZCAyOiBNdXRhdG9yQ29udGV4dAotOzs7IGZpZWxkIDM6IHJlYWxSb3V0aW5lCi0lTXV0YXRvclRocmVhZCA9IHR5cGUgeyAlVGhyZWFkLCAlQnVtcFB0ckFsbG9jYXRvciwgaTgqLCBpOCogfQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL012bS9Db21waWxlci9tdm0tcnVudGltZS5sbCBiL3Zta2l0L2xpYi9Ndm0vQ29tcGlsZXIvbXZtLXJ1bnRpbWUubGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YzY3ZTIuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL012bS9Db21waWxlci9tdm0tcnVudGltZS5sbAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi07Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OwotOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsgQ29tbW9uIHR5cGVzIDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKLTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ci0KLTs7OyBBIHZpcnR1YWwgdGFibGUgaXMgYW4gYXJyYXkgb2YgZnVuY3Rpb24gcG9pbnRlcnMuCi0lVlQgPSB0eXBlIFswIHggaTMyICguLi4pKl0KLQotJUNpcmN1bGFyQmFzZSA9IHR5cGUgeyAlVlQqLCAlQ2lyY3VsYXJCYXNlKiwgJUNpcmN1bGFyQmFzZSogfQotCi07OzsgRmllbGQgMDogIHRoZSBwYXJlbnQgKGNpcmN1bGFyIGJhc2UpCi07OzsgRmllbGQgMTogIGJvb2wgICAgZG9ZaWVsZAotOzs7IGZpZWxkIDI6ICB2b2lkKiAgIGxhc3RFeGNlcHRpb25CdWZmZXIvaW50ZXJuYWxQZW5kaW5nRXhjZXB0aW9uCi07OzsgZmllbGQgMzogIHZvaWQqICAgdm1EYXRhCi07OzsgZmllbGQgNDogIGdjKiAgICAgcGVuZGluZ0V4Y2VwdGlvbgotOzs7IGZpZWxkIDU6ICBWTWtpdCogIHZta2l0Ci07OzsgRmllbGQgNjogIHZvaWQqICAgYmFzZVNQCi07OzsgRmllbGQgNzogIGJvb2wgICAgaW5SVgotOzs7IEZpZWxkIDg6ICBib29sICAgIGpvaW5lZFJWCi07OzsgRmllbGQgOTogIHZvaWQqICAgbGFzdFNQCi07OzsgRmllbGQgMTA6IHZvaWQqICAgaW50ZXJuYWxUaHJlYWRJRAotOzs7IGZpZWxkIDExOiB2b2lkKiAgIHJvdXRpbmUKLTs7OyBmaWVsZCAxMjogdm9pZCogICBsYXN0S25vd25GcmFtZQotOzs7IGZpZWxkIDEzOiB2b2lkKiAgIGFsbFZNRGF0YXMKLTs7OyBmaWVsZCAxNDogdWludDMyICBzdGF0ZQotJVRocmVhZCAgICAgICA9IHR5cGUgeyAlQ2lyY3VsYXJCYXNlLCBpMSwgaTgqLCBpOCosIGk4KiwgaTgqLCBpOCosIGkxLCBpMSwgaTgqLCBpOCosIGk4KiwgaTgqLCBpOCosIGkzMiB9Ci0KLTs7OyBmaWVsZCAwOiBWVAotOzs7IGZpZWxkIDE6IG12bTo6TXV0YXRvclRocmVhZCogIG11dAotOzs7IGZpZWxkIDI6IG12bTo6VmlydHVhbE1hY2hpbmUqIHZtCi0lVk1UaHJlYWREYXRhID0gdHlwZSB7ICVWVCosICVNdXRhdG9yVGhyZWFkKiwgaTgqIH0KLQotOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKLTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7IFByaW50aW5nIGZ1bmN0aW9ucyA7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ci07Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OwotCi1kZWNsYXJlIHZvaWQgQHByaW50RmxvYXQoZmxvYXQpCi1kZWNsYXJlIHZvaWQgQHByaW50RG91YmxlKGRvdWJsZSkKLWRlY2xhcmUgdm9pZCBAcHJpbnRMb25nKGk2NCkKLWRlY2xhcmUgdm9pZCBAcHJpbnRJbnQoaTMyKQotZGVjbGFyZSB2b2lkIEBwcmludE9iamVjdChpOCopCi0KLTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ci07Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OyBFeGNlcHRpb25zIDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OwotOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKLQotZGVjbGFyZSB2b2lkIEBfVW53aW5kX1Jlc3VtZV9vcl9SZXRocm93KGk4KikKLWRlY2xhcmUgaTgqICBAbGx2bS5laC5leGNlcHRpb24oKSBub3Vud2luZAotZGVjbGFyZSBpMzIgIEBsbHZtLmVoLnNlbGVjdG9yLmkzMihpOCosIGk4KiwgLi4uKSBub3Vud2luZAotZGVjbGFyZSBpNjQgIEBsbHZtLmVoLnNlbGVjdG9yLmk2NChpOCosIGk4KiwgLi4uKSBub3Vud2luZAotZGVjbGFyZSB2b2lkIEBfX2d4eF9wZXJzb25hbGl0eV92MCgpCi1kZWNsYXJlIGk4KiAgQF9fY3hhX2JlZ2luX2NhdGNoKGk4KikKLWRlY2xhcmUgdm9pZCBAX19jeGFfZW5kX2NhdGNoKCkKLWRlY2xhcmUgaTMyICBAc2V0am1wKGk4KikKLQotOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKLTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7IE1hdGggOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ci07Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OwotCi1kZWNsYXJlIGRvdWJsZSBAbGx2bS5zcXJ0LmY2NChkb3VibGUpIG5vdW53aW5kCi1kZWNsYXJlIGRvdWJsZSBAbGx2bS5zaW4uZjY0KGRvdWJsZSkgbm91bndpbmQKLWRlY2xhcmUgZG91YmxlIEBsbHZtLmNvcy5mNjQoZG91YmxlKSBub3Vud2luZAotZGVjbGFyZSBkb3VibGUgQHRhbihkb3VibGUpCi1kZWNsYXJlIGRvdWJsZSBAYXNpbihkb3VibGUpCi1kZWNsYXJlIGRvdWJsZSBAYWNvcyhkb3VibGUpCi1kZWNsYXJlIGRvdWJsZSBAYXRhbihkb3VibGUpCi1kZWNsYXJlIGRvdWJsZSBAZXhwKGRvdWJsZSkKLWRlY2xhcmUgZG91YmxlIEBsb2coZG91YmxlKQotZGVjbGFyZSBkb3VibGUgQGNlaWwoZG91YmxlKQotZGVjbGFyZSBkb3VibGUgQGZsb29yKGRvdWJsZSkKLWRlY2xhcmUgZG91YmxlIEBjYnJ0KGRvdWJsZSkKLWRlY2xhcmUgZG91YmxlIEBjb3NoKGRvdWJsZSkKLWRlY2xhcmUgZG91YmxlIEBleHBtMShkb3VibGUpCi1kZWNsYXJlIGRvdWJsZSBAbG9nMTAoZG91YmxlKQotZGVjbGFyZSBkb3VibGUgQGxvZzFwKGRvdWJsZSkKLWRlY2xhcmUgZG91YmxlIEBzaW5oKGRvdWJsZSkKLWRlY2xhcmUgZG91YmxlIEB0YW5oKGRvdWJsZSkKLWRlY2xhcmUgZG91YmxlIEBmYWJzKGRvdWJsZSkKLWRlY2xhcmUgZG91YmxlIEByaW50KGRvdWJsZSkKLWRlY2xhcmUgZG91YmxlIEBoeXBvdChkb3VibGUsIGRvdWJsZSkKLWRlY2xhcmUgZG91YmxlIEBwb3coZG91YmxlLCBkb3VibGUpCi1kZWNsYXJlIGRvdWJsZSBAYXRhbjIoZG91YmxlLCBkb3VibGUpCi1kZWNsYXJlIGZsb2F0ICBAZmFic2YoZmxvYXQpCi0KLTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ci07Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OyBNZW1vcnkgOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OwotOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKLQotZGVjbGFyZSB2b2lkIEBsbHZtLm1lbWNweS5pMzIoaTggKiwgaTggKiwgaTMyLCBpMzIpIG5vdW53aW5kCi1kZWNsYXJlIHZvaWQgQGxsdm0ubWVtc2V0LmkzMihpOCAqLCBpOCwgaTMyLCBpMzIpIG5vdW53aW5kCi1kZWNsYXJlIGk4KiAgQGxsdm0uZnJhbWVhZGRyZXNzKGkzMikgbm91bndpbmQgcmVhZG5vbmUKLQotOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKLTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7IEF0b21pYyA7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ci07Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OwotCi1kZWNsYXJlIGk4ICBAbGx2bS5hdG9taWMuY21wLnN3YXAuaTgucDBpOChpOCosIGk4LCBpOCkgbm91bndpbmQKLWRlY2xhcmUgaTE2IEBsbHZtLmF0b21pYy5jbXAuc3dhcC5pMTYucDBpMTYoaTE2KiwgaTE2LCBpMTYpIG5vdW53aW5kCi1kZWNsYXJlIGkzMiBAbGx2bS5hdG9taWMuY21wLnN3YXAuaTMyLnAwaTMyKGkzMiosIGkzMiwgaTMyKSBub3Vud2luZAotZGVjbGFyZSBpNjQgQGxsdm0uYXRvbWljLmNtcC5zd2FwLmk2NC5wMGk2NChpNjQqLCBpNjQsIGk2NCkgbm91bndpbmQKLQotZGVjbGFyZSB2b2lkIEB1bmNvbmRpdGlvbmFsU2FmZVBvaW50KCkgbm91bndpbmQKLWRlY2xhcmUgdm9pZCBAY29uZGl0aW9uYWxTYWZlUG9pbnQoKSBub3Vud2luZAotCi07Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OwotOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7IEdDIDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKLTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ci0KLWRlY2xhcmUgdm9pZCBAbGx2bS5nY3Jvb3QoaTgqKiwgaTgqKQotZGVjbGFyZSBpOCogQGdjbWFsbG9jKGkzMiwgaTgqKQotZGVjbGFyZSBpOCogQGdjbWFsbG9jVW5yZXNvbHZlZChpMzIsIGk4KikKLWRlY2xhcmUgdm9pZCBAYWRkRmluYWxpemF0aW9uQ2FuZGlkYXRlKGk4KikKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9Ndm0vR0NNbWFwMi9NYWtlZmlsZSBiL3Zta2l0L2xpYi9Ndm0vR0NNbWFwMi9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQzM2I1Ni4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTXZtL0dDTW1hcDIvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIz09PS0gbGliL012bS9HQ01tYXAyL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIwotIyAKLSMgICAgICAgICAgICAgICAgICAgICBUaGUgdm1raXQgcHJvamVjdAotIwotIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLSMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotIyAKLSMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCi1MRVZFTCA9IC4uLy4uLy4uCi0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29uZmlnCi0KLWlmZXEgKCQoV0lUSF9MTFZNX0dDQyksIDEpCi0gIE1PRFVMRV9OQU1FID0gR0NNbWFwMgotZWxzZQotICBMSUJSQVJZTkFNRSA9IEdDTW1hcDIKLWVuZGlmCi0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCi0KLUNYWC5GbGFncyArPSAtSSQoUFJPSl9TUkNfRElSKS8uLi9Db21tb25UaHJlYWQgLUkkKFBST0pfU1JDX0RJUikvLi4vQWxsb2NhdG9yCmRpZmYgLS1naXQgYS92bWtpdC9saWIvTXZtL0dDTW1hcDIvTXV0YXRvclRocmVhZC5oIGIvdm1raXQvbGliL012bS9HQ01tYXAyL011dGF0b3JUaHJlYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE5MjdlMi4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTXZtL0dDTW1hcDIvTXV0YXRvclRocmVhZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0gTXV0YXRvclRocmVhZC5oIC0gVGhyZWFkIGZvciBHQyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotCi0jaWZuZGVmIE1WTV9NVVRBVE9SX1RIUkVBRF9ICi0jZGVmaW5lIE1WTV9NVVRBVE9SX1RIUkVBRF9ICi0KLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9UaHJlYWQuaCIKLQotbmFtZXNwYWNlIG12bSB7Ci0KLWNsYXNzIE11dGF0b3JUaHJlYWQgOiBwdWJsaWMgbXZtOjpUaHJlYWQgewotcHVibGljOgotICBNdXRhdG9yVGhyZWFkKFZNS2l0KiB2bWtpdCkgOiBtdm06OlRocmVhZCh2bWtpdCkge30KLX07Ci0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS92bWtpdC9saWIvTXZtL0dDTW1hcDIvTXZtR0MuaCBiL3Zta2l0L2xpYi9Ndm0vR0NNbWFwMi9Ndm1HQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmZkMjQyLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9Ndm0vR0NNbWFwMi9Ndm1HQy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0gTXZtR0MuaCAtIEdhcmJhZ2UgQ29sbGVjdGlvbiBJbnRlcmZhY2UgLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTWljcm8gVmlydHVhbCBNYWNoaW5lCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotCi0jaWZuZGVmIE1WTV9NTUFQX0dDX0gKLSNkZWZpbmUgTVZNX01NQVBfR0NfSAotCi0jaW5jbHVkZSAidHlwZXMuaCIKLSNpbmNsdWRlICJnY2FsbG9jLmgiCi0jaW5jbHVkZSAibXZtL1ZpcnR1YWxNYWNoaW5lLmgiCi0KLSNkZWZpbmUgZ2NfYWxsb2NhdG9yIHN0ZDo6YWxsb2NhdG9yCi0KLXVzaW5nIG5hbWVzcGFjZSBtdm07Ci0KLW5hbWVzcGFjZSBtdm0gewotCWNsYXNzIFRocmVhZDsKLQljbGFzcyBWaXJ0dWFsTWFjaGluZTsKLQotY2xhc3MgR0NWaXJ0dWFsVGFibGUgOiBwdWJsaWMgQ29tbW9uVmlydHVhbFRhYmxlIHsKLXB1YmxpYzoKLSAgc3RhdGljIHVpbnQzMl90IG51bWJlck9mQmFzZUZ1bmN0aW9ucygpIHsKLSAgICByZXR1cm4gbnVtYmVyT2ZDb21tb25FbnRyaWVzKCk7Ci0gIH0KLSAgCi0gIHN0YXRpYyB1aW50MzJfdCBudW1iZXJPZlNwZWNpYWxpemVkVHJhY2VycygpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotfTsKLQotY2xhc3MgQ29sbGVjdG9yIHsKLSAgZnJpZW5kIGNsYXNzIEdDVGhyZWFkOwotICBmcmllbmQgY2xhc3MgQ29sbGVjdGlvblJWOwotICBzdGF0aWMgR0NBbGxvY2F0b3IgICphbGxvY2F0b3I7ICAgICAgLyogVGhlIGFsbG9jYXRvciAqLwotICBzdGF0aWMgU3BpbkxvY2sgX2dsb2JhbExvY2s7ICAgICAgICAgLyogR2xvYmFsIGxvY2sgZm9yIGFsbG9jYXRpb24gKi8gIAotCi0gIHN0YXRpYyBHQ0NodW5rTm9kZSAgKnVzZWRfbm9kZXM7ICAgICAvKiBVc2VkIG1lbW9yeSBub2RlcyAqLwotICBzdGF0aWMgR0NDaHVua05vZGUgICp1bnVzZWRfbm9kZXM7ICAgLyogVW51c2VkIG1lbW9yeSBub2RlcyAqLwotICBzdGF0aWMgdW5zaWduZWQgaW50ICAgY3VycmVudF9tYXJrOwotCi0gIHN0YXRpYyBpbnQgIF9jb2xsZWN0X2ZyZXFfYXV0bzsgICAgICAvKiBDb2xsZWN0aW9uIGZyZXF1ZW5jeSBpbiBnY21hbGxvYy9nY3JlYWxsb2MgKi8KLSAgc3RhdGljIGludCAgX2NvbGxlY3RfZnJlcV9tYXliZTsgICAgIC8qIENvbGxlY3Rpb24gZnJlcXVlbmN5ICBpbiBtYXliZUNvbGxlY3QgKi8KLSAgc3RhdGljIGludCAgX3NpbmNlX2xhc3RfY29sbGVjdGlvbjsgIC8qIEJ5dGVzIGxlZnQgc2luY2UgbGFzdCBjb2xsZWN0aW9uICovCi0gIHN0YXRpYyBib29sIF9lbmFibGVfYXV0bzsgICAgICAgICAgICAvKiBBdXRvbWF0aWMgY29sbGVjdGlvbj8gKi8KLSAgc3RhdGljIGJvb2wgX2VuYWJsZV9tYXliZTsgICAgICAgICAgIC8qIENvbGxlY3Rpb24gaW4gbWF5YmVDb2xsZWN0KCk/ICovCi0gIHN0YXRpYyBib29sIF9lbmFibGVfY29sbGVjdGlvbjsgICAgICAvKiBjb2xsZWN0aW9uIGF1dGhvcml6ZWQ/ICovCi0gIHN0YXRpYyBpbnQgIHN0YXR1czsKLSAKLSAgCi0gIGVudW0geyBzdGF0X2NvbGxlY3QsIHN0YXRfYWxsb2MsIHN0YXRfYnJva2VuIH07Ci0KLSAgc3RhdGljIGlubGluZSB2b2lkICBsb2NrKCkgICB7IF9nbG9iYWxMb2NrLmxvY2soKTsgfQotICBzdGF0aWMgaW5saW5lIHZvaWQgIHVubG9jaygpIHsgX2dsb2JhbExvY2sudW5sb2NrKCk7IH0KLSAgCi0gIC8qIEludGVyZmFjZSBmb3IgY29sbGVjdGlvbiwgdmVyaWZpZXMgZW5hYmxlX2NvbGxlY3QgKi8KLSAgc3RhdGljIHZvaWQgY29sbGVjdF91bnByb3RlY3QoKTsgICAgCi0gIC8qIFRoZSBjb2xsZWN0aW9uICovICAKLSAgc3RhdGljIHZvaWQgZG9fY29sbGVjdCgpOyAgICAgICAgICAgCi0KLSAgc3RhdGljIGlubGluZSBHQ0NodW5rTm9kZSAqbzJub2RlKGNvbnN0IHZvaWQgKnApIHsKLSAgICBpZiAoIXApIHJldHVybiAwOwotICAgIHJldHVybiBHQ0hhc2g6OmdldChjb25zdF9jYXN0PHZvaWQqPihwKSktPm8ybm9kZShjb25zdF9jYXN0PHZvaWQqPihwKSwgR0NDaHVua05vZGU6Om1hc2tDb2xsZWN0YWJsZSk7Ci0gIH0KLQotICBzdGF0aWMgaW5saW5lIHNpemVfdCByZWFsX25iYihHQ0NodW5rTm9kZSAqbikgeyAKLSAgICByZXR1cm4gbi0+bmJiKCkgLSBzaXplb2YoZ2NSb290KTsKLSAgfQotICAKLQotcHVibGljOgotICBzdGF0aWMgdm9pZCAoKmludGVybk1lbW9yeUVycm9yKSh1bnNpZ25lZCBpbnQpOwotCi0gIHN0YXRpYyBpbnQgdmVyYm9zZTsgCi0gIAotICBzdGF0aWMgYm9vbCBpc0xpdmUodm9pZCogcHRyLCB1aW50cHRyX3QgY2xvc3VyZSkgewotICAgIEdDQ2h1bmtOb2RlICpub2RlID0gbzJub2RlKHB0cik7Ci0gICAgCi0gICAgaWYobm9kZSAmJiBpc01hcmtlZChub2RlKSkgcmV0dXJuIHRydWU7Ci0gICAgZWxzZSByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHN0YXRpYyB2b2lkIHNjYW5PYmplY3Qodm9pZCoqIHB0ciwgdWludHB0cl90IGNsb3N1cmUpOwotCi0gIHN0YXRpYyB2b2lkIGluaXRpYWxpc2UoKTsKLSAgc3RhdGljIHZvaWQgZGVzdHJveSgpOwotCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCAqYWxsb2NhdGVfdW5wcm90ZWN0ZWQoc2l6ZV90IHN6KSB7Ci0gICAgcmV0dXJuIGFsbG9jYXRvci0+YWxsb2Moc3opOwotICB9Ci0gIAotICBzdGF0aWMgaW5saW5lIHZvaWQgIGZyZWVfdW5wcm90ZWN0ZWQodm9pZCAqcHRyKSB7Ci0gICAgYWxsb2NhdG9yLT5mcmVlKHB0cik7Ci0gIH0KLQotICBzdGF0aWMgaW5saW5lIHZvaWQgKmJlZ09mKGNvbnN0IHZvaWQgKnApIHsKLSAgICBHQ0NodW5rTm9kZSAqbm9kZSA9IG8ybm9kZShwKTsKLSAgICBpZihub2RlKQotICAgICAgcmV0dXJuIG5vZGUtPmNodW5rKCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIDA7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBnY1N0YXRzKHNpemVfdCAqbm8sIHNpemVfdCAqbmJiKTsKLQotICBzdGF0aWMgaW5saW5lIHNpemVfdCBvYmplY3RTaXplKHZvaWQgKnB0cikgewotICAgIEdDQ2h1bmtOb2RlICpub2RlID0gbzJub2RlKHB0cik7Ci0gICAgcmV0dXJuIG5vZGUgPyByZWFsX25iYihub2RlKSA6IDA7Ci0gIH0KLQotICBzdGF0aWMgaW5saW5lIHZvaWQgY29sbGVjdCgpIHsKLSAgICBsb2NrKCk7Ci0gICAgY29sbGVjdF91bnByb3RlY3QoKTsKLSAgICB1bmxvY2soKTsKLSAgfQotCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXliZUNvbGxlY3QoKSB7Ci0gICAgaWYoX2VuYWJsZV9hdXRvICYmIChfc2luY2VfbGFzdF9jb2xsZWN0aW9uIDw9IChfY29sbGVjdF9mcmVxX2F1dG8gLSBfY29sbGVjdF9mcmVxX21heWJlKSkpCi0gICAgICBjb2xsZWN0KCk7IAotICB9Ci0KLSAgc3RhdGljIGlubGluZSB2b2lkICpnY21hbGxvYyhWaXJ0dWFsVGFibGUgKnZ0LCBzaXplX3QgbikgewotI2lmIChfX1dPUkRTSVpFID09IDY0KQotICAgIHZvaWQqIHJlcyA9IG1hbGxvYyhuKTsKLSAgICBtZW1zZXQocmVzLCAwLCBuKTsKLSAgICAoKHZvaWQqKilyZXMpWzBdID0gdnQ7Ci0gICAgcmV0dXJuIHJlczsKLSNlbHNlCi0gICAgbG9jaygpOwotICAgIAotICAgIF9zaW5jZV9sYXN0X2NvbGxlY3Rpb24gLT0gbjsKLSAgICBpZihfZW5hYmxlX2F1dG8gJiYgKF9zaW5jZV9sYXN0X2NvbGxlY3Rpb24gPD0gMCkpIHsKLSAgICAgIGNvbGxlY3RfdW5wcm90ZWN0KCk7Ci0gICAgfQotICAgIHJlZ2lzdGVyIEdDQ2h1bmtOb2RlICpoZWFkZXIgPSBhbGxvY2F0b3ItPmFsbG9jX2NodW5rKG4sIDEsIGN1cnJlbnRfbWFyayAmIDEpOwotCi0gICAgaGVhZGVyLT5hcHBlbmQodXNlZF9ub2Rlcyk7Ci0gICAgcmVnaXN0ZXIgc3RydWN0IGdjUm9vdCAqcCA9IGhlYWRlci0+Y2h1bmsoKTsKLSAgICBwLT5zZXRWaXJ0dWFsVGFibGUodnQpOwotCi0KLSAgICB1bmxvY2soKTsKLQotICAgIGlmICgoKENvbW1vblZpcnR1YWxUYWJsZSopdnQpLT5kZXN0cnVjdG9yKQotICAgICAgbXZtOjpUaHJlYWQ6OmdldCgpLT52bWtpdC0+YWRkRmluYWxpemF0aW9uQ2FuZGlkYXRlKChnYyopcCk7Ci0KLQotICAgIHJldHVybiBwOwotI2VuZGlmCi0gIH0KLQotICBzdGF0aWMgaW5saW5lIHZvaWQgKmdjcmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBuKSB7Ci0jaWYgKF9fV09SRFNJWkUgPT0gNjQpCi0gICAgdm9pZCogcmVzID0gcmVhbGxvYyhwdHIsIG4pOwotICAgIHJldHVybiByZXM7Ci0jZWxzZQotICAgIGxvY2soKTsKLSAgICAKLSAgICBHQ1BhZ2UgICAgICAqZGVzYyA9IEdDSGFzaDo6Z2V0KHB0cik7Ci0gICAgR0NDaHVua05vZGUgICpub2RlID0gZGVzYy0+bzJub2RlKHB0ciwgR0NDaHVua05vZGU6Om1hc2tDb2xsZWN0YWJsZSk7Ci0KLSAgICBpZighbm9kZSkKLSAgICAgIGdjZmF0YWwoIiVwIGlzbid0IGEgYXZhbGlkIG9iamVjdCIsIHB0cik7Ci0KLSAgICBzaXplX3QgICAgICBvbGRfc3ogPSBub2RlLT5uYmIoKTsKLSAgICAKLSAgICBfc2luY2VfbGFzdF9jb2xsZWN0aW9uIC09IChuIC0gb2xkX3N6KTsKLQotICAgIGlmKF9lbmFibGVfYXV0byAmJiAoX3NpbmNlX2xhc3RfY29sbGVjdGlvbiA8PSAwKSkgewotICAgICAgY29sbGVjdF91bnByb3RlY3QoKTsKLSAgICB9Ci0KLSAgICBHQ0NodW5rTm9kZSAgKnJlcyA9IGFsbG9jYXRvci0+cmVhbGxvY19jaHVuayhkZXNjLCBub2RlLCBuKTsKLQotICAgIGlmKHJlcyAhPSBub2RlKSB7Ci0gICAgICByZXMtPmFwcGVuZCh1c2VkX25vZGVzKTsKLSAgICAgIG1hcmsocmVzKTsKLSAgICB9Ci0KLSAgICBnY1Jvb3QgKm9iaiA9IHJlcy0+Y2h1bmsoKTsKLQotICAgIHVubG9jaygpOwotICAgIHJldHVybiBvYmo7Ci0jZW5kaWYKLSAgfQotCi0gIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGVuYWJsZSh1bnNpZ25lZCBpbnQgbikgIHsKLSAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgb2xkID0gX2VuYWJsZV9jb2xsZWN0aW9uOwotICAgIF9lbmFibGVfY29sbGVjdGlvbiA9IG47IAotICAgIHJldHVybiBvbGQ7Ci0gIH0KLQotICBzdGF0aWMgaW5saW5lIGJvb2wgaXNNYXJrZWQoR0NDaHVua05vZGUgKm5vZGUpIHsgCi0gICAgcmV0dXJuIG5vZGUtPm1hcmsoKSA9PSAoY3VycmVudF9tYXJrICYgMSk7Ci0gIH0KLSAgCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXJrKEdDQ2h1bmtOb2RlICpub2RlKSB7Ci0gICAgbm9kZS0+X21hcmsoY3VycmVudF9tYXJrICYgMSk7Ci0gIH0KLQotICBzdGF0aWMgaW5saW5lIHZvaWQgdHJhY2UoR0NDaHVua05vZGUgKm5vZGUpIHsKLSAgICBnY1Jvb3QgKm8gPSBub2RlLT5jaHVuaygpOwotICAgIG8tPnRyYWNlcigwKTsKLSAgfQotCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXJrQW5kVHJhY2Uodm9pZCogc291cmNlLCB2b2lkICpwdHIsIHVpbnRwdHJfdCBjbG9zdXJlKSB7Ci0gICAgbWFya0FuZFRyYWNlUm9vdChwdHIsIGNsb3N1cmUpOwotICB9Ci0gIAotICBzdGF0aWMgaW5saW5lIHZvaWQgbWFya0FuZFRyYWNlUm9vdCh2b2lkICpwdHIsIHVpbnRwdHJfdCBjbG9zdXJlKSB7Ci0gICAgdm9pZCogb2JqID0gKih2b2lkKiopcHRyOwotICAgIGlmIChvYmopIHsKLSAgICAgIEdDQ2h1bmtOb2RlICpub2RlID0gbzJub2RlKG9iaik7Ci0gICAKLSNpZmRlZiBXSVRIX0xMVk1fR0NDCi0gICAgICBhc3NlcnQobm9kZSAmJiAiTm8gbm9kZSBpbiAgcHJlY2lzZSBtb2RlIik7Ci0gICAgICBhc3NlcnQob2JqID09IGJlZ09mKG9iaikgJiYgIkludGVyaW9yIHBvaW50ZXIiKTsKLSNlbmRpZgotCi0gICAgICBpZihub2RlICYmICFpc01hcmtlZChub2RlKSkgewotICAgICAgICBtYXJrKG5vZGUpOwotICAgICAgICBub2RlLT5yZW1vdmUoKTsKLSAgICAgICAgbm9kZS0+cHJlcGVuZCh1c2VkX25vZGVzKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBzdGF0aWMgaW50IGdldE1heE1lbW9yeSgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICAKLSAgc3RhdGljIGludCBnZXRGcmVlTWVtb3J5KCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIAotICBzdGF0aWMgaW50IGdldFRvdGFsTWVtb3J5KCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgdm9pZCBzZXRNYXhNZW1vcnkoc2l6ZV90IHN6KXsKLSAgfQotCi0gIHZvaWQgc2V0TWluTWVtb3J5KHNpemVfdCBzeil7Ci0gIH0KLQotICBzdGF0aWMgZ2MqIHJldGFpbkZvckZpbmFsaXplKGdjKiB2YWwsIHVpbnRwdHJfdCBjbG9zdXJlKSB7Ci0gICAgbWFya0FuZFRyYWNlUm9vdCgmdmFsLCBjbG9zdXJlKTsKLSAgICByZXR1cm4gdmFsOwotICB9Ci0gIAotICBzdGF0aWMgZ2MqIHJldGFpblJlZmVyZW50KGdjKiB2YWwsIHVpbnRwdHJfdCBjbG9zdXJlKSB7Ci0gICAgbWFya0FuZFRyYWNlUm9vdCgmdmFsLCBjbG9zdXJlKTsKLSAgICByZXR1cm4gdmFsOwotICB9Ci0KLSAgc3RhdGljIGdjKiBnZXRGb3J3YXJkZWRSZWZlcmVuY2UoZ2MqIHZhbCwgdWludHB0cl90IGNsb3N1cmUpIHsKLSAgICByZXR1cm4gdmFsOwotICB9Ci0gIAotICBzdGF0aWMgZ2MqIGdldEZvcndhcmRlZFJlZmVyZW50KGdjKiB2YWwsIHVpbnRwdHJfdCBjbG9zdXJlKSB7Ci0gICAgcmV0dXJuIHZhbDsKLSAgfQotICAKLSAgc3RhdGljIGdjKiBnZXRGb3J3YXJkZWRGaW5hbGl6YWJsZShnYyogdmFsLCB1aW50cHRyX3QgY2xvc3VyZSkgewotICAgIHJldHVybiB2YWw7Ci0gIH0KLX07Ci0KLWNsYXNzIGNvbGxlY3RhYmxlIDogcHVibGljIGdjUm9vdCB7Ci1wdWJsaWM6Ci0gCi0gIHNpemVfdCBvYmplY3RTaXplKCkgY29uc3QgewotICAgIHJldHVybiBtdm06OkNvbGxlY3Rvcjo6b2JqZWN0U2l6ZSgodm9pZCopdGhpcyk7Ci0gIH0KLQotICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHN6LCBWaXJ0dWFsVGFibGUgKlZUKSB7Ci0gICAgcmV0dXJuIG12bTo6Q29sbGVjdG9yOjpnY21hbGxvYyhWVCwgc3opOwotICB9Ci0KLSAgdm9pZCogb3BlcmF0b3IgbmV3KHNpemVfdCBzeikgewotICAgIHJldHVybiBtYWxsb2Moc3opOwotICB9Ci0KLSAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqKSB7Ci0gICAgZ2NmYXRhbCgwLCAibmV2ZXIgY2FsbCBkaXJlY3RseSBhIGRlc3RydWN0b3IuLi4uLiIpOwotICB9Ci0KLSAgdm9pZCogcmVhbGxvYyhzaXplX3QgbikgewotICAgIHJldHVybiBtdm06OkNvbGxlY3Rvcjo6Z2NyZWFsbG9jKHRoaXMsIG4pOwotICB9Ci0KLX07Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL012bS9HQ01tYXAyL09iamVjdEhlYWRlci5oIGIvdm1raXQvbGliL012bS9HQ01tYXAyL09iamVjdEhlYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzQzNmNlLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9Ndm0vR0NNbWFwMi9PYmplY3RIZWFkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8vPT09LS0tLS0gT2JqZWN0SGVhZGVyLmggLSBNYWNyb3MgZm9yIGRlc2NyaWJpbmcgYW4gb2JqZWN0IGhlYWRlciAtLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2lmbmRlZiBNVk1fT0JKRUNUX0hFQURFUl9ICi0jZGVmaW5lIE1WTV9PQkpFQ1RfSEVBREVSX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi1uYW1lc3BhY2UgbXZtIHsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IEdDQml0cyA9IDI7Ci0gIHN0YXRpYyBjb25zdCBib29sIE1vdmVzT2JqZWN0ID0gZmFsc2U7Ci19Ci0KLSNlbmRpZiAvLyBNVk1fT0JKRUNUX0hFQURFUl9ICmRpZmYgLS1naXQgYS92bWtpdC9saWIvTXZtL0dDTW1hcDIvY3Rvc2RlcC5oIGIvdm1raXQvbGliL012bS9HQ01tYXAyL2N0b3NkZXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIyOTFhZS4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTXZtL0dDTW1hcDIvY3Rvc2RlcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLS0tIGN0b3NkZXAuaCAtIE12bSBHYXJiYWdlIENvbGxlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE12bQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIF9DVF9PU0RFUF9IXwotI2RlZmluZSBfQ1RfT1NERVBfSF8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGNzdGRpbz4KLSNpbmNsdWRlIDxjc3RkbGliPgotCi0jZGVmaW5lIHRtYWxsb2MJCQkJCW1hbGxvYwotI2RlZmluZSB0ZnJlZQkJCQkJCWZyZWUKLQotY2xhc3MgVE9iaiB7Ci1wdWJsaWM6Ci0Jdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzeikgeyByZXR1cm4gdG1hbGxvYyhzeik7IH0KLQl2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICpwdHIsIHNpemVfdCBzeikgeyByZXR1cm4gdGZyZWUocHRyKTsgfQotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92bWtpdC9saWIvTXZtL0dDTW1hcDIvZ2MuY3BwIGIvdm1raXQvbGliL012bS9HQ01tYXAyL2djLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMwZmQ4Yy4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTXZtL0dDTW1hcDIvZ2MuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLS0tIGdjLmNjIC0gTXZtIEdhcmJhZ2UgQ29sbGVjdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE12bQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSAibXZtL1RocmVhZHMvVGhyZWFkLmgiCi0jaW5jbHVkZSAibXZtL0dDLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBtdm07Ci0KLQotZXh0ZXJuICJDIiB2b2lkIE1hcmtBbmRUcmFjZShnYyogZ2MsIHVpbnRwdHJfdCBjbG9zdXJlKSB7Ci0gIENvbGxlY3Rvcjo6bWFya0FuZFRyYWNlUm9vdCgmZ2MsIGNsb3N1cmUpOwotfQotCi1leHRlcm4gIkMiIHZvaWQqIGdjbWFsbG9jKHNpemVfdCBzeiwgVmlydHVhbFRhYmxlKiBWVCkgewotICB2b2lkKiByZXMgPSBDb2xsZWN0b3I6OmdjbWFsbG9jKFZULCBzeik7Ci0gIHJldHVybiByZXM7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCogZ2NtYWxsb2NVbnJlc29sdmVkKHNpemVfdCBzeiwgVmlydHVhbFRhYmxlKiBWVCkgewotICB2b2lkKiByZXMgPSAwOwotICBsbHZtX2djcm9vdChyZXMsIDApOwotICByZXMgPSBDb2xsZWN0b3I6OmdjbWFsbG9jKFZULCBzeik7Ci0gIHJldHVybiByZXM7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBhZGRGaW5hbGl6YXRpb25DYW5kaWRhdGUoZ2MqIG9iaikgewotICAvLyBUaGlzIGlzIHVzZWxlc3Mgd2l0aCBHQ21tYXAyLCBhcyB0aGUgZ2NtYWxsb2MgYWxyZWFkeSBkaWQgaXQuCi19Ci0KLXZvaWQgQ29sbGVjdG9yOjpzY2FuT2JqZWN0KHZvaWQqKiB2YWwsIHVpbnRwdHJfdCBjbG9zdXJlKSB7Ci0gIHZvaWQqIG9iaiA9ICp2YWw7Ci0gIGlmIChvYmopIHsKLSAgICBHQ0NodW5rTm9kZSAqbm9kZSA9IG8ybm9kZShvYmopOwotCi0jaWZkZWYgV0lUSF9MTFZNX0dDQwotICAgIGFzc2VydChiZWdPZihvYmopID09IG9iaiAmJiAiSW50ZXJpb3IgcG9pbnRlclxuIik7Ci0gICAgYXNzZXJ0KG5vZGUgJiYgIk5vIG5vZGUgaW4gcHJlY2lzZSBHQyBtb2RlIik7Ci0jZW5kaWYKLSAgCi0gICAgaWYgKG5vZGUgJiYgIUNvbGxlY3Rvcjo6aXNNYXJrZWQobm9kZSkpIHsKLSAgICAgIG5vZGUtPnJlbW92ZSgpOwotICAgICAgbm9kZS0+YXBwZW5kKENvbGxlY3Rvcjo6dXNlZF9ub2Rlcyk7Ci0gICAgICBDb2xsZWN0b3I6Om1hcmsobm9kZSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvTXZtL0dDTW1hcDIvZ2Njb2xsZWN0b3IuY3BwIGIvdm1raXQvbGliL012bS9HQ01tYXAyL2djY29sbGVjdG9yLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NjYTEwNC4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTXZtL0dDTW1hcDIvZ2Njb2xsZWN0b3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0gZ2Njb2xsZWN0b3IuY2MgLSBNdm0gR2FyYmFnZSBDb2xsZWN0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdm0KLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgIm12bS9HQy5oIgotI2luY2x1ZGUgIm12bS9WTUtpdC5oIgotI2luY2x1ZGUgIm12bS9TeXN0ZW1UaHJlYWRzLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBtdm07Ci0KLUdDQWxsb2NhdG9yICAgKkNvbGxlY3Rvcjo6YWxsb2NhdG9yID0gMDsKLVNwaW5Mb2NrICAgICAgQ29sbGVjdG9yOjpfZ2xvYmFsTG9jazsKLQotaW50ICAgICAgICAgICBDb2xsZWN0b3I6OnN0YXR1czsKLQotR0NDaHVua05vZGUgICAgKkNvbGxlY3Rvcjo6dXNlZF9ub2RlczsKLUdDQ2h1bmtOb2RlICAgICpDb2xsZWN0b3I6OnVudXNlZF9ub2RlczsKLQotdW5zaWduZWQgaW50ICAgQ29sbGVjdG9yOjpjdXJyZW50X21hcms7Ci0KLWludCAgQ29sbGVjdG9yOjpfY29sbGVjdF9mcmVxX2F1dG87Ci1pbnQgIENvbGxlY3Rvcjo6X2NvbGxlY3RfZnJlcV9tYXliZTsKLWludCAgQ29sbGVjdG9yOjpfc2luY2VfbGFzdF9jb2xsZWN0aW9uOwotCi1ib29sIENvbGxlY3Rvcjo6X2VuYWJsZV9hdXRvOwotYm9vbCBDb2xsZWN0b3I6Ol9lbmFibGVfbWF5YmU7Ci1ib29sIENvbGxlY3Rvcjo6X2VuYWJsZV9jb2xsZWN0aW9uOwotCi1pbnQgQ29sbGVjdG9yOjp2ZXJib3NlID0gMDsKLQotdm9pZCBDb2xsZWN0b3I6OmRvX2NvbGxlY3QoKSB7Ci0gIEdDQ2h1bmtOb2RlICAqY3VyOwotICBfc2luY2VfbGFzdF9jb2xsZWN0aW9uID0gX2NvbGxlY3RfZnJlcV9hdXRvOwotCi0gIGN1cnJlbnRfbWFyaysrOwotCi0gIHVudXNlZF9ub2Rlcy0+YXR0cmFwZSh1c2VkX25vZGVzKTsKLQotICBtdm06OlRocmVhZCogdGggPSBtdm06OlRocmVhZDo6Z2V0KCk7Ci0JaWYodGgtPnN0YXJ0Q29sbGVjdGlvbigpKSB7Ci0KLQkJbXZtOjpUaHJlYWQqIHRjdXIgPSB0aDsKLQotCQkvLyAoMSkgVHJhY2UgVk1LaXQuCi0JCXRoLT52bWtpdC0+dHJhY2VyKDApOwotCi0JCS8vICgyKSBUcmFjZSB0aGUgdGhyZWFkcy4KLQkJZG8gewotCQkJdGN1ci0+c2NhblN0YWNrKDApOwotCQkJdGN1ci0+dHJhY2VyKDApOwotCQkJdGN1ciA9IChtdm06OlRocmVhZCopdGN1ci0+bmV4dCgpOwotCQl9IHdoaWxlICh0Y3VyICE9IHRoKTsKLQotCQkvLyAoMykgVHJhY2Ugc3RhY2sgb2JqZWN0cy4KLQkJZm9yKGN1ciA9IHVzZWRfbm9kZXMtPm5leHQoKTsgY3VyICE9IHVzZWRfbm9kZXM7IGN1ciA9IGN1ci0+bmV4dCgpKQotCQkJdHJhY2UoY3VyKTsKLQotCQkvLyBHbyBiYWNrIHRvIHRoZSBwcmV2aW91cyBub2RlLgotCQljdXIgPSBjdXItPnByZXYoKTsKLQotCQkvLyAoNCkgVHJhY2UgdGhlIHdlYWsgcmVmZXJlbmNlIHF1ZXVlLgotCQl0aC0+dm1raXQtPnNjYW5XZWFrUmVmZXJlbmNlc1F1ZXVlKDApOwotCi0JCS8vICg1KSBUcmFjZSB0aGUgc29mdCByZWZlcmVuY2UgcXVldWUuCi0JCXRoLT52bWtpdC0+c2NhblNvZnRSZWZlcmVuY2VzUXVldWUoMCk7Ci0gIAotCQkvLyAoNikgVHJhY2UgdGhlIGZpbmFsaXphdGlvbiBxdWV1ZS4KLQkJdGgtPnZta2l0LT5zY2FuRmluYWxpemF0aW9uUXVldWUoMCk7Ci0KLQkJLy8gKDcpIFRyYWNlIHRoZSBwaGFudG9tIHJlZmVyZW5jZSBxdWV1ZS4KLQkJdGgtPnZta2l0LT5zY2FuUGhhbnRvbVJlZmVyZW5jZXNRdWV1ZSgwKTsKLQotCQkvLyAoOCkgVHJhY2UgdGhlIG5ldyBvYmplY3RzIGFkZGVkIGJ5IHF1ZXVlcy4KLQkJZm9yKGN1ciA9IGN1ci0+bmV4dCgpOyBjdXIgIT0gdXNlZF9ub2RlczsgY3VyID0gY3VyLT5uZXh0KCkpCi0JCQl0cmFjZShjdXIpOwotCi0KLQkJLy8gRmluYWxpemUuCi0JCUdDQ2h1bmtOb2RlIGZpbmFsaXphYmxlOwotCQlmaW5hbGl6YWJsZS5hdHRyYXBlKHVudXNlZF9ub2Rlcyk7Ci0KLQkJLy8gV2UgaGF2ZSBzdG9wcGVkIGNvbGxlY3RpbmcsIGdvIGJhY2sgdG8gYWxsb2Mgc3RhdGUuCi0JCXN0YXR1cyA9IHN0YXRfYWxsb2M7Ci0gIAotCQkvLyBXYWtlIHVwIGFsbCB0aHJlYWRzLgotCQl0aC0+dm1raXQtPnJlbmRlenZvdXMuZmluaXNoUlYoKTsKLQkJdGgtPnZta2l0LT5lbmRDb2xsZWN0aW9uKCk7Ci0gIAotCQkvLyBLaWxsIHVucmVhY2hhYmxlIG9iamVjdHMuCi0JCUdDQ2h1bmtOb2RlICpuZXh0ID0gMDsKLQkJZm9yKGN1cj1maW5hbGl6YWJsZS5uZXh0KCk7IGN1ciE9JmZpbmFsaXphYmxlOyBjdXI9bmV4dCkgewotCQkJbmV4dCA9IGN1ci0+bmV4dCgpOwotCQkJYWxsb2NhdG9yLT5yZWplY3RfY2h1bmsoY3VyKTsKLQkJfQotCX0KLSAgCi19Ci0KLXZvaWQgQ29sbGVjdG9yOjpjb2xsZWN0X3VucHJvdGVjdCgpIHsKLSAgaWYoX2VuYWJsZV9jb2xsZWN0aW9uICYmIChzdGF0dXMgPT0gc3RhdF9hbGxvYykpIHsKLSAgICBzdGF0dXMgPSBzdGF0X2NvbGxlY3Q7Ci0gICAgZG9fY29sbGVjdCgpOwotICB9Ci19Ci0KLXZvaWQgQ29sbGVjdG9yOjpnY1N0YXRzKHNpemVfdCAqX25vLCBzaXplX3QgKl9uYmIpIHsKLSAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBuLCB0b3Q7Ci0gICByZWdpc3RlciBHQ0NodW5rTm9kZSAqY3VyOwotICAgbG9jaygpOwotICAgZm9yKG49MCwgdG90PTAsIGN1cj11c2VkX25vZGVzLT5uZXh0KCk7IGN1ciE9dXNlZF9ub2RlczsgY3VyPWN1ci0+bmV4dCgpLCBuKyspCi0gICAgIHRvdCArPSBjdXItPm5iYigpOwotICAgdW5sb2NrKCk7Ci0gICAqX25vID0gbjsKLSAgICpfbmJiID0gdG90OwotfQotCmRpZmYgLS1naXQgYS92bWtpdC9saWIvTXZtL0dDTW1hcDIvZ2Npbml0LmNwcCBiL3Zta2l0L2xpYi9Ndm0vR0NNbWFwMi9nY2luaXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmJjNzAyLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9Ndm0vR0NNbWFwMi9nY2luaXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLS0gZ2Npbml0LmNjIC0gTXZtIEdhcmJhZ2UgQ29sbGVjdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXZtCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJtdm0vR0MuaCIKLQotdXNpbmcgbmFtZXNwYWNlIG12bTsKLQotc3RhdGljIGNvbnN0IHNpemVfdCBkZWZfY29sbGVjdF9mcmVxX2F1dG8gPSA2NCoxMDI0KjEwMjQ7Ci1zdGF0aWMgY29uc3Qgc2l6ZV90IGRlZl9jb2xsZWN0X2ZyZXFfbWF5YmUgPSA2NCoxMDI0KjEwMjQ7Ci0KLQotdm9pZCBDb2xsZWN0b3I6OmluaXRpYWxpc2UoKSB7Ci0gCi0gIHVzZWRfbm9kZXMgPSBuZXcgR0NDaHVua05vZGUoKTsKLSAgdW51c2VkX25vZGVzID0gbmV3IEdDQ2h1bmtOb2RlKCk7Ci0gIGFsbG9jYXRvciA9IG5ldyBHQ0FsbG9jYXRvcigpOwotICAgCi0gIHVzZWRfbm9kZXMtPmFsb25lKCk7Ci0gIHVudXNlZF9ub2Rlcy0+YWxvbmUoKTsKLQotICBjdXJyZW50X21hcmsgPSAwOwotICBzdGF0dXMgPSBzdGF0X2FsbG9jOwotCi0gIF9jb2xsZWN0X2ZyZXFfYXV0byA9IGRlZl9jb2xsZWN0X2ZyZXFfYXV0bzsKLSAgX2NvbGxlY3RfZnJlcV9tYXliZSA9IGRlZl9jb2xsZWN0X2ZyZXFfbWF5YmU7Ci0gIAotICBfc2luY2VfbGFzdF9jb2xsZWN0aW9uID0gX2NvbGxlY3RfZnJlcV9hdXRvOwotCi0gIF9lbmFibGVfYXV0byA9IDE7Ci0gIF9lbmFibGVfY29sbGVjdGlvbiA9IDE7Ci0gIF9lbmFibGVfbWF5YmUgPSAxOwotCi19Ci0KLXZvaWQgQ29sbGVjdG9yOjpkZXN0cm95KCkgewotICBkZWxldGUgYWxsb2NhdG9yOwotICBhbGxvY2F0b3IgPSAwOwotfQotCmRpZmYgLS1naXQgYS92bWtpdC9saWIvTXZtL0pJVEdDUGFzcy9KSVRHQ1Bhc3MuY3BwIGIvdm1raXQvbGliL012bS9KSVRHQ1Bhc3MvSklUR0NQYXNzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcxZWIyMS4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTXZtL0pJVEdDUGFzcy9KSVRHQ1Bhc3MuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy89PT0tLS0tLS0gSklUR0NQYXNzLmNwcCAtIFB1dCBHQyBpbmZvcm1hdGlvbiBpbiBmdW5jdGlvbnMgY29tcGlsZWQgLS0tLS0tLS0tLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gd2l0aCBsbHZtLWdjYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0KLSNpbmNsdWRlICJsbHZtL0ludHJpbnNpY3MuaCIKLSNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgotI2luY2x1ZGUgImxsdm0vUGFzcy5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgotCi11c2luZyBuYW1lc3BhY2UgbGx2bTsKLQotbmFtZXNwYWNlIHsKLQotICBjbGFzcyBKSVRHQ1Bhc3MgOiBwdWJsaWMgTW9kdWxlUGFzcyB7Ci0gIHB1YmxpYzoKLSAgICBzdGF0aWMgY2hhciBJRDsKLSAgICAKLSAgICBKSVRHQ1Bhc3MoKSA6IE1vZHVsZVBhc3MoSUQpIHt9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgcnVuT25Nb2R1bGUoTW9kdWxlJiBNKTsKLQotICAgIC8vLyBnZXRBbmFseXNpc1VzYWdlIC0gV2UgZG8gbm90IG1vZGlmeSBhbnl0aGluZy4KLSAgICB2aXJ0dWFsIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3QgewotICAgICAgQVUuc2V0UHJlc2VydmVzQWxsKCk7Ci0gICAgfSAKLQotICB9OwotCi0gIGNoYXIgSklUR0NQYXNzOjpJRCA9IDA7Ci0gIFJlZ2lzdGVyUGFzczxKSVRHQ1Bhc3M+IFgoIkpJVEdDUGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgIkFkZCBHQyBpbmZvcm1hdGlvbiBpbiBmaWxlcyBjb21waWxlZCB3aXRoIGxsdm0tZ2NjIik7Ci0KLWJvb2wgSklUR0NQYXNzOjpydW5Pbk1vZHVsZShNb2R1bGUmIE0pIHsKLQotICBGdW5jdGlvbiogRiA9IE0uZ2V0RnVuY3Rpb24oIl9fbGx2bV9nY3Jvb3QiKTsKLSAgaWYgKEYpIHsKLSAgICBGdW5jdGlvbiAqZ2Nyb290RnVuID0gSW50cmluc2ljOjpnZXREZWNsYXJhdGlvbigmTSwgSW50cmluc2ljOjpnY3Jvb3QpOwotCi0gICAgRi0+cmVwbGFjZUFsbFVzZXNXaXRoKGdjcm9vdEZ1bik7Ci0gICAgRi0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0KLSAgICBmb3IgKFZhbHVlOjp1c2VfaXRlcmF0b3IgSSA9IGdjcm9vdEZ1bi0+dXNlX2JlZ2luKCksCi0gICAgICAgICBFID0gZ2Nyb290RnVuLT51c2VfZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgICBpZiAoSW5zdHJ1Y3Rpb24qIElJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KCpJKSkgewotICAgICAgICBGdW5jdGlvbiogRiA9IElJLT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCk7Ci0gICAgICAgIGlmICghRi0+aGFzR0MoKSkgRi0+c2V0R0MoInZta2l0Iik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9Ndm0vSklUR0NQYXNzL01ha2VmaWxlIGIvdm1raXQvbGliL012bS9KSVRHQ1Bhc3MvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZjU2YjIuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL012bS9KSVRHQ1Bhc3MvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIz09PS0gbGliL012bS9TdGF0aWNHQ1Bhc3MvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIwotIwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotIwotIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLSMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotIwotIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKLQotTEVWRUwgPSAuLi8uLi8uLgotTElCUkFSWU5BTUUgPSBKSVRHQ1Bhc3MKLUxPQURBQkxFX01PRFVMRSA9IDEKLVVTRURMSUJTID0KLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KLQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL012bS9NTVRrL01ha2VmaWxlIGIvdm1raXQvbGliL012bS9NTVRrL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGY1MGE1Li4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9Ndm0vTU1Uay9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjPT09LSBsaWIvTXZtL01NVGsvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCi0jIAotIyAgICAgICAgICAgICAgICAgICAgIFRoZSB2bWtpdCBwcm9qZWN0Ci0jCi0jIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0jIAotIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKLUxFVkVMID0gLi4vLi4vLi4KLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb25maWcKLQotaWZlcSAoJChXSVRIX0xMVk1fR0NDKSwgMSkKLSAgTU9EVUxFX05BTUUgPSBNTVRrCi1lbHNlCi0gIExJQlJBUllOQU1FID0gTU1UawotZW5kaWYKLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9Ndm0vTU1Uay9NdXRhdG9yVGhyZWFkLmggYi92bWtpdC9saWIvTXZtL01NVGsvTXV0YXRvclRocmVhZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDExZjdiLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9Ndm0vTU1Uay9NdXRhdG9yVGhyZWFkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLz09PS0tLS0tLS0tLSBNdXRhdG9yVGhyZWFkLmggLSBUaHJlYWQgZm9yIEdDIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0KLSNpZm5kZWYgTVZNX01VVEFUT1JfVEhSRUFEX0gKLSNkZWZpbmUgTVZNX01VVEFUT1JfVEhSRUFEX0gKLQotI2luY2x1ZGUgIm12bS9BbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9UaHJlYWQuaCIKLQotbmFtZXNwYWNlIG12bSB7Ci0KLWNsYXNzIE11dGF0b3JUaHJlYWQgOiBwdWJsaWMgbXZtOjpUaHJlYWQgewotcHVibGljOgotICBNdXRhdG9yVGhyZWFkKFZNS2l0KiB2bWtpdCkgOiBtdm06OlRocmVhZCh2bWtpdCkgewotICAgIE11dGF0b3JDb250ZXh0ID0gMDsKLSAgfQotICBtdm06OlRocmVhZEFsbG9jYXRvciBBbGxvY2F0b3I7Ci0gIHVpbnRwdHJfdCBNdXRhdG9yQ29udGV4dDsKLSAgCi0gIC8vLyByZWFsUm91dGluZSAtIFRoZSBmdW5jdGlvbiB0byBpbnZva2Ugd2hlbiB0aGUgdGhyZWFkIHN0YXJ0cy4KLSAgLy8vCi0gIHZvaWQgKCpyZWFsUm91dGluZSkobXZtOjpUaHJlYWQqKTsKLQotICBzdGF0aWMgdm9pZCBpbml0KFRocmVhZCogX3RoKTsKLQotICBzdGF0aWMgTXV0YXRvclRocmVhZCogZ2V0KCkgewotICAgIHJldHVybiAoTXV0YXRvclRocmVhZCopbXZtOjpUaHJlYWQ6OmdldCgpOwotICB9Ci0KLSAgdmlydHVhbCBpbnQgc3RhcnQodm9pZCAoKmZjdCkobXZtOjpUaHJlYWQqKSkgewotICAgIHJlYWxSb3V0aW5lID0gZmN0OwotICAgIHJvdXRpbmUgPSBpbml0OwotICAgIHJldHVybiBUaHJlYWQ6OnN0YXJ0KGluaXQpOwotICB9Ci19OwotCi19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL012bS9NTVRrL012bUdDLmNwcCBiL3Zta2l0L2xpYi9Ndm0vTU1Uay9Ndm1HQy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZjk5ZDcuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL012bS9NTVRrL012bUdDLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tIE12bUdDLmNwcCAtIEdhcmJhZ2UgQ29sbGVjdGlvbiBJbnRlcmZhY2UgLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSAibXZtL0dDLmgiCi0jaW5jbHVkZSAibXZtL1ZNS2l0LmgiCi0jaW5jbHVkZSAiTXV0YXRvclRocmVhZC5oIgotI2luY2x1ZGUgIm12bS9WaXJ0dWFsTWFjaGluZS5oIgotCi0jaW5jbHVkZSA8c2V0PgotCi11c2luZyBuYW1lc3BhY2UgbXZtOwotCi1zdGF0aWMgbXZtOjpTcGluTG9jayBsb2NrOwotc3RkOjpzZXQ8Z2MqPiBfX0ludGVybmFsU2V0X187Ci1pbnQgQ29sbGVjdG9yOjp2ZXJib3NlID0gMDsKLQotZXh0ZXJuICJDIiB2b2lkKiBnY21hbGxvYyh1aW50MzJfdCBzeiwgdm9pZCogX1ZUKSB7Ci0gIGdjKiByZXMgPSAwOwotICBWaXJ0dWFsVGFibGUqIFZUID0gKFZpcnR1YWxUYWJsZSopX1ZUOwotICBzeiA9IGxsdm06OlJvdW5kVXBUb0FsaWdubWVudChzeiwgc2l6ZW9mKHZvaWQqKSk7Ci0gIHJlcyA9IChnYyopbWFsbG9jKHN6KTsKLSAgbWVtc2V0KHJlcywgMCwgc3opOwotICAKLSAgbG9jay5hY3F1aXJlKCk7Ci0gIF9fSW50ZXJuYWxTZXRfXy5pbnNlcnQocmVzKTsKLSAgbG9jay5yZWxlYXNlKCk7Ci0gIAotICByZXMtPnNldFZpcnR1YWxUYWJsZShWVCk7Ci0gIHJldHVybiByZXM7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCogZ2NtYWxsb2NVbnJlc29sdmVkKHVpbnQzMl90IHN6LCBWaXJ0dWFsVGFibGUqIFZUKSB7Ci0gIGdjKiByZXMgPSAoZ2MqKWdjbWFsbG9jKHN6LCBWVCk7Ci0gIGlmIChWVC0+ZGVzdHJ1Y3RvcikKLSAgICBtdm06OlRocmVhZDo6Z2V0KCktPnZta2l0LT5hZGRGaW5hbGl6YXRpb25DYW5kaWRhdGUocmVzKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotZXh0ZXJuICJDIiB2b2lkIGFkZEZpbmFsaXphdGlvbkNhbmRpZGF0ZShnYyogb2JqKSB7Ci0gIG12bTo6VGhyZWFkOjpnZXQoKS0+dm1raXQtPmFkZEZpbmFsaXphdGlvbkNhbmRpZGF0ZShvYmopOwotfQotCi1leHRlcm4gIkMiIHZvaWQqIEFsbG9jYXRlTWFnaWNBcnJheShpbnQzMl90IHN6LCB2b2lkKiBsZW5ndGgpIHsKLSAgZ2MqIHJlcyA9IChnYyopbWFsbG9jKHN6KTsKLSAgbWVtc2V0KHJlcywgMCwgc3opOwotICAoKHZvaWQqKilyZXMpWzBdID0gbGVuZ3RoOwotICByZXR1cm4gcmVzOwotfQotCi12b2lkKiBDb2xsZWN0b3I6OmJlZ09mKGdjKiBvYmopIHsKLSAgbG9jay5hY3F1aXJlKCk7Ci0gIHN0ZDo6c2V0PGdjKj46Oml0ZXJhdG9yIEkgPSBfX0ludGVybmFsU2V0X18uZmluZChvYmopOwotICBzdGQ6OnNldDxnYyo+OjppdGVyYXRvciBFID0gX19JbnRlcm5hbFNldF9fLmVuZCgpOwotICBsb2NrLnJlbGVhc2UoKTsKLSAgICAKLSAgaWYgKEkgIT0gRSkgcmV0dXJuIG9iajsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgTXV0YXRvclRocmVhZDo6aW5pdChUaHJlYWQqIF90aCkgewotICBNdXRhdG9yVGhyZWFkKiB0aCA9IChNdXRhdG9yVGhyZWFkKilfdGg7Ci0gIHRoLT5yZWFsUm91dGluZShfdGgpOwotfQotCi1ib29sIENvbGxlY3Rvcjo6aXNMaXZlKGdjKiBwdHIsIHVpbnRwdHJfdCBjbG9zdXJlKSB7Ci0gIGFib3J0KCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBDb2xsZWN0b3I6OnNjYW5PYmplY3Qodm9pZCoqIHB0ciwgdWludHB0cl90IGNsb3N1cmUpIHsKLSAgYWJvcnQoKTsKLX0KLSAKLXZvaWQgQ29sbGVjdG9yOjptYXJrQW5kVHJhY2Uodm9pZCogc291cmNlLCB2b2lkKiBwdHIsIHVpbnRwdHJfdCBjbG9zdXJlKSB7Ci0gIGFib3J0KCk7Ci19Ci0gIAotdm9pZCBDb2xsZWN0b3I6Om1hcmtBbmRUcmFjZVJvb3Qodm9pZCogcHRyLCB1aW50cHRyX3QgY2xvc3VyZSkgewotICBhYm9ydCgpOwotfQotCi1nYyogQ29sbGVjdG9yOjpyZXRhaW5Gb3JGaW5hbGl6ZShnYyogdmFsLCB1aW50cHRyX3QgY2xvc3VyZSkgewotICBhYm9ydCgpOwotICByZXR1cm4gTlVMTDsKLX0KLSAgCi1nYyogQ29sbGVjdG9yOjpyZXRhaW5SZWZlcmVudChnYyogdmFsLCB1aW50cHRyX3QgY2xvc3VyZSkgewotICBhYm9ydCgpOwotICByZXR1cm4gTlVMTDsKLX0KLSAgCi1nYyogQ29sbGVjdG9yOjpnZXRGb3J3YXJkZWRGaW5hbGl6YWJsZShnYyogdmFsLCB1aW50cHRyX3QgY2xvc3VyZSkgewotICBhYm9ydCgpOwotICByZXR1cm4gTlVMTDsKLX0KLSAgCi1nYyogQ29sbGVjdG9yOjpnZXRGb3J3YXJkZWRSZWZlcmVuY2UoZ2MqIHZhbCwgdWludHB0cl90IGNsb3N1cmUpIHsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0gIAotZ2MqIENvbGxlY3Rvcjo6Z2V0Rm9yd2FyZGVkUmVmZXJlbnQoZ2MqIHZhbCwgdWludHB0cl90IGNsb3N1cmUpIHsKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgQ29sbGVjdG9yOjpjb2xsZWN0KCkgewotICAvLyBEbyBub3RoaW5nLgotfQotCi12b2lkIENvbGxlY3Rvcjo6aW5pdGlhbGlzZSgpIHsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9Ndm0vTU1Uay9Ndm1HQy5oIGIvdm1raXQvbGliL012bS9NTVRrL012bUdDLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMDkyMWQuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL012bS9NTVRrL012bUdDLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tIE12bUdDLmggLSBHYXJiYWdlIENvbGxlY3Rpb24gSW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0KLSNpZm5kZWYgTVZNX01NVEtfR0NfSAotI2RlZmluZSBNVk1fTU1US19HQ19ICi0KLSNpbmNsdWRlIDxjc3RkbGliPgotCi0jZGVmaW5lIGdjX2FsbG9jYXRvciBzdGQ6OmFsbG9jYXRvcgotCi1uYW1lc3BhY2UgbXZtIHsKLQotY2xhc3MgR0NWaXJ0dWFsVGFibGUgOiBwdWJsaWMgQ29tbW9uVmlydHVhbFRhYmxlIHsKLXB1YmxpYzoKLSAgdWludHB0cl90IHNwZWNpYWxpemVkVHJhY2Vyc1sxXTsKLSAgCi0gIHN0YXRpYyB1aW50MzJfdCBudW1iZXJPZkJhc2VGdW5jdGlvbnMoKSB7Ci0gICAgcmV0dXJuIG51bWJlck9mQ29tbW9uRW50cmllcygpICsgMTsKLSAgfQotCi0gIHN0YXRpYyB1aW50MzJfdCBudW1iZXJPZlNwZWNpYWxpemVkVHJhY2VycygpIHsKLSAgICByZXR1cm4gMTsKLSAgfQotfTsKLQotZXh0ZXJuICJDIiB2b2lkKiBnY21hbGxvY1VucmVzb2x2ZWQodWludDMyX3Qgc3osIFZpcnR1YWxUYWJsZSogVlQpOwotCi1jbGFzcyBjb2xsZWN0YWJsZSA6IHB1YmxpYyBnY1Jvb3QgewotcHVibGljOgotCi0gIHNpemVfdCBvYmplY3RTaXplKCkgY29uc3QgewotICAgIGFib3J0KCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHN6LCBWaXJ0dWFsVGFibGUgKlZUKSB7Ci0gICAgcmV0dXJuIGdjbWFsbG9jVW5yZXNvbHZlZChzeiwgVlQpOwotICB9Ci0KLX07Ci0gIAotY2xhc3MgQ29sbGVjdG9yIHsKLXB1YmxpYzoKLSAgc3RhdGljIGludCB2ZXJib3NlOwotCi0gIHN0YXRpYyBib29sIGlzTGl2ZShnYyogcHRyLCB1aW50cHRyX3QgY2xvc3VyZSkgX19hdHRyaWJ1dGVfXyAoKGFsd2F5c19pbmxpbmUpKTsgCi0gIHN0YXRpYyB2b2lkIHNjYW5PYmplY3Qodm9pZCoqIHB0ciwgdWludHB0cl90IGNsb3N1cmUpIF9fYXR0cmlidXRlX18gKChhbHdheXNfaW5saW5lKSk7Ci0gIHN0YXRpYyB2b2lkIG1hcmtBbmRUcmFjZSh2b2lkKiBzb3VyY2UsIHZvaWQqIHB0ciwgdWludHB0cl90IGNsb3N1cmUpIF9fYXR0cmlidXRlX18gKChhbHdheXNfaW5saW5lKSk7Ci0gIHN0YXRpYyB2b2lkIG1hcmtBbmRUcmFjZVJvb3Qodm9pZCogcHRyLCB1aW50cHRyX3QgY2xvc3VyZSkgX19hdHRyaWJ1dGVfXyAoKGFsd2F5c19pbmxpbmUpKTsKLSAgc3RhdGljIGdjKiByZXRhaW5Gb3JGaW5hbGl6ZShnYyogdmFsLCB1aW50cHRyX3QgY2xvc3VyZSkgX19hdHRyaWJ1dGVfXyAoKGFsd2F5c19pbmxpbmUpKTsKLSAgc3RhdGljIGdjKiByZXRhaW5SZWZlcmVudChnYyogdmFsLCB1aW50cHRyX3QgY2xvc3VyZSkgX19hdHRyaWJ1dGVfXyAoKGFsd2F5c19pbmxpbmUpKTsKLSAgc3RhdGljIGdjKiBnZXRGb3J3YXJkZWRGaW5hbGl6YWJsZShnYyogdmFsLCB1aW50cHRyX3QgY2xvc3VyZSkgX19hdHRyaWJ1dGVfXyAoKGFsd2F5c19pbmxpbmUpKTsKLSAgc3RhdGljIGdjKiBnZXRGb3J3YXJkZWRSZWZlcmVuY2UoZ2MqIHZhbCwgdWludHB0cl90IGNsb3N1cmUpIF9fYXR0cmlidXRlX18gKChhbHdheXNfaW5saW5lKSk7Ci0gIHN0YXRpYyBnYyogZ2V0Rm9yd2FyZGVkUmVmZXJlbnQoZ2MqIHZhbCwgdWludHB0cl90IGNsb3N1cmUpIF9fYXR0cmlidXRlX18gKChhbHdheXNfaW5saW5lKSk7Ci0KLSAgc3RhdGljIHZvaWQgY29sbGVjdCgpOwotICAKLSAgc3RhdGljIHZvaWQgaW5pdGlhbGlzZSgpOwotICAKLSAgc3RhdGljIGludCBnZXRNYXhNZW1vcnkoKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgCi0gIHN0YXRpYyBpbnQgZ2V0RnJlZU1lbW9yeSgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICAKLSAgc3RhdGljIGludCBnZXRUb3RhbE1lbW9yeSgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHZvaWQgc2V0TWF4TWVtb3J5KHNpemVfdCBzeil7Ci0gIH0KLQotICB2b2lkIHNldE1pbk1lbW9yeShzaXplX3Qgc3opewotICB9Ci0KLSAgc3RhdGljIHZvaWQqIGJlZ09mKGdjKik7Ci19OwotCi19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9Ndm0vTWFrZWZpbGUgYi92bWtpdC9saWIvTXZtL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDAwZDdmLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9Ndm0vTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIz09PS0gbGliL012bS9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIwotIyAKLSMgICAgICAgICAgICAgICAgICAgICBUaGUgdm1raXQgcHJvamVjdAotIwotIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLSMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotIyAKLSMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCi1MRVZFTCA9IC4uLy4uCi0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29uZmlnCi0KLUVYVFJBX0RJU1QgPSBCb2VobUdDIEdDTW1hcDIgTU1UawotCi1ESVJTID0gQWxsb2NhdG9yIENvbW1vblRocmVhZCAkKEdDTElCKSBSdW50aW1lIENvbXBpbGVyIFN0YXRpY0dDUGFzcyBKSVRHQ1Bhc3MKLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9Ndm0vUnVudGltZS9MTFZNQXNzZW1ibHkubGwgYi92bWtpdC9saWIvTXZtL1J1bnRpbWUvTExWTUFzc2VtYmx5LmxsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTE0NzgwLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9Ndm0vUnVudGltZS9MTFZNQXNzZW1ibHkubGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi07Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OwotOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsgQXRvbWljIDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKLTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ci0KLWRlY2xhcmUgaTggIEBsbHZtLmF0b21pYy5jbXAuc3dhcC5pOC5wMGk4KGk4KiwgaTgsIGk4KSBub3Vud2luZAotZGVjbGFyZSBpMTYgQGxsdm0uYXRvbWljLmNtcC5zd2FwLmkxNi5wMGkxNihpMTYqLCBpMTYsIGkxNikgbm91bndpbmQKLWRlY2xhcmUgaTMyIEBsbHZtLmF0b21pYy5jbXAuc3dhcC5pMzIucDBpMzIoaTMyKiwgaTMyLCBpMzIpIG5vdW53aW5kCi0KLTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ci07Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SGVscGVyIGZ1bmN0aW9ucyBmb3IgZ2NjIDwgNC4yIDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OwotOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKLQotZGVmaW5lIGk4IEBsbHZtX2F0b21pY19jbXBfc3dhcF9pOChpOCogJXB0ciwgaTggJWNtcCwgaTggJXN3YXApIAotbm91bndpbmQgewotICAlQSA9IGNhbGwgaTggQGxsdm0uYXRvbWljLmNtcC5zd2FwLmk4LnAwaTgoIGk4KiAlcHRyLCBpOCAlY21wLCBpOCAlc3dhcCkKLSAgcmV0IGk4ICVBCi19Ci0KLWRlZmluZSBpMTYgQGxsdm1fYXRvbWljX2NtcF9zd2FwX2kxNihpMTYqICVwdHIsIGkxNiAlY21wLCBpMTYgJXN3YXApCi1ub3Vud2luZCB7Ci0gICVBID0gY2FsbCBpMTYgQGxsdm0uYXRvbWljLmNtcC5zd2FwLmkxNi5wMGkxNiggaTE2KiAlcHRyLCBpMTYgJWNtcCwgaTE2ICVzd2FwKQotICByZXQgaTE2ICVBCi19Ci0KLWRlZmluZSBpMzIgQGxsdm1fYXRvbWljX2NtcF9zd2FwX2kzMihpMzIqICVwdHIsIGkzMiAlY21wLCBpMzIgJXN3YXApCi1ub3Vud2luZCB7Ci0gICVBID0gY2FsbCBpMzIgQGxsdm0uYXRvbWljLmNtcC5zd2FwLmkzMi5wMGkzMihpMzIqICVwdHIsIGkzMiAlY21wLCBpMzIgJXN3YXApCi0gIHJldCBpMzIgJUEKLX0KLQotCmRpZmYgLS1naXQgYS92bWtpdC9saWIvTXZtL1J1bnRpbWUvTExWTUFzc2VtYmx5NjQubGwgYi92bWtpdC9saWIvTXZtL1J1bnRpbWUvTExWTUFzc2VtYmx5NjQubGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhN2FmZDEuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL012bS9SdW50aW1lL0xMVk1Bc3NlbWJseTY0LmxsCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1kZWNsYXJlIGk2NCBAbGx2bS5hdG9taWMuY21wLnN3YXAuaTY0LnAwaTY0KGk2NCosIGk2NCwgaTY0KSBub3Vud2luZAotCi1kZWZpbmUgaTY0IEBsbHZtX2F0b21pY19jbXBfc3dhcF9pNjQoaTY0KiAlcHRyLCBpNjQgJWNtcCwgaTY0ICVzd2FwKQotbm91bndpbmQgewotICAlQSA9IGNhbGwgaTY0IEBsbHZtLmF0b21pYy5jbXAuc3dhcC5pNjQucDBpNjQoIGk2NCogJXB0ciwgaTY0ICVjbXAsIGk2NCAlc3dhcCkKLSAgcmV0IGk2NCAlQQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL012bS9SdW50aW1lL01ha2VmaWxlIGIvdm1raXQvbGliL012bS9SdW50aW1lL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmVlMjY4Li4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9Ndm0vUnVudGltZS9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMjPT09LSBsaWIvTXZtL1J1bnRpbWUvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCi0jIAotIyAgICAgICAgICAgICAgICAgICAgIFRoZSB2bWtpdCBwcm9qZWN0Ci0jCi0jIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0jIAotIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKLUxFVkVMID0gLi4vLi4vLi4KLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb25maWcKLQotaWZlcSAoJChXSVRIX0xMVk1fR0NDKSwgMSkKLQotICBNT0RVTEVfTkFNRSA9IE12bQotCi1lbHNlCi0gIExJQlJBUllOQU1FID0gTXZtCi0KLSAgVk1LSVRfQVNTRU1CTFkgPSAkKFBST0pfU1JDX0RJUikvTExWTUFzc2VtYmx5LmxsCi0gIEJVSUxUX1NPVVJDRVMgPSBMTFZNQXNzZW1ibHkucwotCi0gIGlmZXEgKCQoV0lUSF82NCksIDEpCi0gICAgVk1LSVRfQVNTRU1CTFkgKz0gJChQUk9KX1NSQ19ESVIpL0xMVk1Bc3NlbWJseTY0LmxsCi0gIGVuZGlmCi0KLSAgU09VUkNFUyA9IExMVk1Bc3NlbWJseS5zICQobm90ZGlyICQod2lsZGNhcmQgJChQUk9KX1NSQ19ESVIpLyouY3BwKSkKLQotZW5kaWYKLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9Ndm0vUnVudGltZS9NZXRob2RJbmZvLmNwcCBiL3Zta2l0L2xpYi9Ndm0vUnVudGltZS9NZXRob2RJbmZvLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJlN2M3MC4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTXZtL1J1bnRpbWUvTWV0aG9kSW5mby5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLy89PT0tLS0tLS0tIE1ldGhvZEluZm8uY3BwIC0gUnVudGltZSBpbmZvcm1hdGlvbiBmb3IgbWV0aG9kcyAtLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJtdm0vQWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAibXZtL01ldGhvZEluZm8uaCIKLSNpbmNsdWRlICJtdm0vVmlydHVhbE1hY2hpbmUuaCIKLSNpbmNsdWRlICJtdm0vR0MuaCIKLSNpbmNsdWRlICJtdm0vVk1LaXQuaCIKLQotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jaW5jbHVkZSA8bWFwPgotCi0jaWYgZGVmaW5lZChfX01BQ0hfXykKLSNkZWZpbmUgU0VMRl9IQU5ETEUgUlRMRF9ERUZBVUxUCi0jZWxzZQotI2RlZmluZSBTRUxGX0hBTkRMRSAwCi0jZW5kaWYKLQotdXNpbmcgbmFtZXNwYWNlIG12bTsKLQotdm9pZCBDYW1sTWV0aG9kSW5mbzo6c2Nhbih1aW50cHRyX3QgY2xvc3VyZSwgdm9pZCogaXAsIHZvaWQqIGFkZHIpIHsKLSAgYXNzZXJ0KENGICE9IE5VTEwpOwotICAvL3VpbnRwdHJfdCBzcGFkZHIgPSAodWludHB0cl90KWFkZHIgKyBDRi0+RnJhbWVTaXplICsgc2l6ZW9mKHZvaWQqKTsKLSAgdWludHB0cl90IHNwYWRkciA9ICgodWludHB0cl90KilhZGRyKVswXTsKLSAgZm9yICh1aW50MTYgaSA9IDA7IGkgPCBDRi0+TnVtTGl2ZU9mZnNldHM7ICsraSkgewotICAgIENvbGxlY3Rvcjo6c2Nhbk9iamVjdCgodm9pZCoqKShzcGFkZHIgKyBDRi0+TGl2ZU9mZnNldHNbaV0pLCBjbG9zdXJlKTsKLSAgfQotfQotCi12b2lkIFN0YXRpY0NhbWxNZXRob2RJbmZvOjpwcmludCh2b2lkKiBpcCwgdm9pZCogYWRkcikgewotICBmcHJpbnRmKHN0ZGVyciwgIjsgJXAgKCVwKSBpbiAlcyBzdGF0aWMgbWV0aG9kXG4iLCBpcCwgYWRkciwgbmFtZSk7Ci19Ci0KLXZvaWQgRGVmYXVsdE1ldGhvZEluZm86OnByaW50KHZvaWQqIGlwLCB2b2lkKiBhZGRyKSB7Ci0gIERsX2luZm8gaW5mbzsKLSAgaW50IHJlcyA9IGRsYWRkcihpcCwgJmluZm8pOwotICBpZiAocmVzICE9IDAgJiYgaW5mby5kbGlfc25hbWUgIT0gTlVMTCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiOyAlcCAoJXApIGluICVzXG4iLCAgaXAsIGFkZHIsIGluZm8uZGxpX3NuYW1lKTsKLSAgfSBlbHNlIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIjsgJXAgaW4gVW5rbm93biBtZXRob2RcbiIsICBpcCk7Ci0gIH0KLX0KLQotRGVmYXVsdE1ldGhvZEluZm8gRGVmYXVsdE1ldGhvZEluZm86OkRNOwotCi12b2lkIERlZmF1bHRNZXRob2RJbmZvOjpzY2FuKHVpbnRwdHJfdCBjbG9zdXJlLCB2b2lkKiBpcCwgdm9pZCogYWRkcikgewotfQotCi1zdHJ1Y3QgQ2FtbEZyYW1lcyB7Ci0gIHVpbnQxNl90IE51bURlc2NyaXB0b3JzOwotICBDYW1sRnJhbWUgZnJhbWVzWzFdOwotfTsKLQotc3RydWN0IENhbWxGcmFtZURlY29kZXIgewotICBDYW1sRnJhbWVzKiBmcmFtZXMgOwotICB1aW50MzIgY3VycmVudERlc2NyaXB0b3I7Ci0gIENhbWxGcmFtZSogY3VycmVudEZyYW1lOwotCi0gIENhbWxGcmFtZURlY29kZXIoQ2FtbEZyYW1lcyogZnJhbWVzKSB7Ci0gICAgdGhpcy0+ZnJhbWVzID0gZnJhbWVzOwotICAgIGN1cnJlbnREZXNjcmlwdG9yID0gMDsKLSAgICBjdXJyZW50RnJhbWUgPSAmKGZyYW1lcy0+ZnJhbWVzWzBdKTsKLSAgfQotCi0gIGJvb2wgaGFzTmV4dCgpIHsKLSAgICByZXR1cm4gY3VycmVudERlc2NyaXB0b3IgPCBmcmFtZXMtPk51bURlc2NyaXB0b3JzOwotICB9Ci0KLSAgdm9pZCBhZHZhbmNlKCkgewotICAgICsrY3VycmVudERlc2NyaXB0b3I7Ci0gICAgaWYgKCFoYXNOZXh0KCkpIHJldHVybjsKLSAgICBjdXJyZW50RnJhbWUgPSAoQ2FtbEZyYW1lKikgKChjaGFyKiljdXJyZW50RnJhbWUgKyAKLSAgICAgIChjdXJyZW50RnJhbWUtPk51bUxpdmVPZmZzZXRzICUgMikgKiBzaXplb2YodWludDE2X3QpICsKLSAgICAgIGN1cnJlbnRGcmFtZS0+TnVtTGl2ZU9mZnNldHMgKiBzaXplb2YodWludDE2X3QpICsKLSAgICAgIHNpemVvZih2b2lkKikgKyBzaXplb2YodWludDE2X3QpICsgc2l6ZW9mKHVpbnQxNl90KSk7Ci0gIH0KLQotICBDYW1sRnJhbWUqIG5leHQoKSB7Ci0gICAgYXNzZXJ0KGhhc05leHQoKSk7Ci0gICAgQ2FtbEZyYW1lKiByZXN1bHQgPSBjdXJyZW50RnJhbWU7Ci0gICAgYWR2YW5jZSgpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX07Ci0KLXN0YXRpYyBCdW1wUHRyQWxsb2NhdG9yKiBTdGF0aWNBbGxvY2F0b3IgPSBOVUxMOwotCi1GdW5jdGlvbk1hcDo6RnVuY3Rpb25NYXAoKSB7Ci0gIENhbWxGcmFtZXMqIGZyYW1lcyA9Ci0gICAgKENhbWxGcmFtZXMqKWRsc3ltKFNFTEZfSEFORExFLCAiY2FtbFZta2l0b3B0aW1pemVkX19mcmFtZXRhYmxlIik7Ci0gIGlmIChmcmFtZXMgPT0gTlVMTCkgcmV0dXJuOwotICAKLSAgU3RhdGljQWxsb2NhdG9yID0gbmV3IEJ1bXBQdHJBbGxvY2F0b3IoKTsKLSAgQ2FtbEZyYW1lRGVjb2RlciBkZWNvZGVyKGZyYW1lcyk7Ci0gIERsX2luZm8gaW5mbzsKLSAgd2hpbGUgKGRlY29kZXIuaGFzTmV4dCgpKSB7Ci0gICAgQ2FtbEZyYW1lKiBmcmFtZSA9IGRlY29kZXIubmV4dCgpOwotICAgIGludCByZXMgPSBkbGFkZHIoZnJhbWUtPlJldHVybkFkZHJlc3MsICZpbmZvKTsKLSAgICBhc3NlcnQocmVzICE9IDAgJiYgIk5vIGZyYW1lIik7Ci0gICAgU3RhdGljQ2FtbE1ldGhvZEluZm8qIE1JID0gbmV3KCpTdGF0aWNBbGxvY2F0b3IsICJTdGF0aWNDYW1sTWV0aG9kSW5mbyIpCi0gICAgICAgIFN0YXRpY0NhbWxNZXRob2RJbmZvKGZyYW1lLCBpbmZvLmRsaV9zbmFtZSk7Ci0gICAgYWRkTWV0aG9kSW5mbyhNSSwgZnJhbWUtPlJldHVybkFkZHJlc3MpOwotICB9Ci19Ci0KLU1ldGhvZEluZm8qIEZ1bmN0aW9uTWFwOjpJUFRvTWV0aG9kSW5mbyh2b2lkKiBpcCkgewotICBGdW5jdGlvbk1hcExvY2suYWNxdWlyZSgpOwotICBzdGQ6Om1hcDx2b2lkKiwgTWV0aG9kSW5mbyo+OjppdGVyYXRvciBJID0gRnVuY3Rpb25zLmZpbmQoaXApOwotICBNZXRob2RJbmZvKiByZXMgPSBOVUxMOwotICBpZiAoSSAhPSBGdW5jdGlvbnMuZW5kKCkpIHsKLSAgICByZXMgPSBJLT5zZWNvbmQ7Ci0gIH0gZWxzZSB7Ci0gICAgcmVzID0gJkRlZmF1bHRNZXRob2RJbmZvOjpETTsKLSAgfQotICBGdW5jdGlvbk1hcExvY2sucmVsZWFzZSgpOwotICByZXR1cm4gcmVzOwotfQotCi12b2lkIEZ1bmN0aW9uTWFwOjphZGRNZXRob2RJbmZvKE1ldGhvZEluZm8qIG1ldGgsIHZvaWQqIGlwKSB7Ci0gIEZ1bmN0aW9uTWFwTG9jay5hY3F1aXJlKCk7Ci0gIEZ1bmN0aW9ucy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoaXAsIG1ldGgpKTsKLSAgRnVuY3Rpb25NYXBMb2NrLnJlbGVhc2UoKTsKLX0KLQotCi12b2lkIEZ1bmN0aW9uTWFwOjpyZW1vdmVNZXRob2RJbmZvcyh2b2lkKiBvd25lcikgewotICBGdW5jdGlvbk1hcExvY2suYWNxdWlyZSgpOwotICBzdGQ6Om1hcDx2b2lkKiwgbXZtOjpNZXRob2RJbmZvKj46Oml0ZXJhdG9yIHRlbXA7Ci0gIGZvciAoc3RkOjptYXA8dm9pZCosIG12bTo6TWV0aG9kSW5mbyo+OjppdGVyYXRvciBpID0gRnVuY3Rpb25zLmJlZ2luKCksCi0gICAgICAgZSA9IEZ1bmN0aW9ucy5lbmQoKTsgaSAhPSBlOykgewotICAgIG12bTo6TWV0aG9kSW5mbyogTUkgPSBpLT5zZWNvbmQ7Ci0gICAgdGVtcCA9IGk7Ci0gICAgaSsrOwotICAgIGlmIChNSS0+T3duZXIgPT0gb3duZXIpIHsKLSAgICAgIEZ1bmN0aW9ucy5lcmFzZSh0ZW1wKTsKLSAgICB9Ci0gIH0KLSAgRnVuY3Rpb25NYXBMb2NrLnJlbGVhc2UoKTsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9Ndm0vUnVudGltZS9QcmludEJ1ZmZlci5jcHAgYi92bWtpdC9saWIvTXZtL1J1bnRpbWUvUHJpbnRCdWZmZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTc1MWY1Li4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9Ndm0vUnVudGltZS9QcmludEJ1ZmZlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0gT2JqZWN0LmNjIC0gQ29tbW9uIG9iamVjdHMgZm9yIHZtbGV0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBNaWNybyBWaXJ0dWFsIE1hY2hpbmUKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgPGNzdGRpbz4KLSNpbmNsdWRlIDxjc3RkbGliPgotCi0jaW5jbHVkZSAibXZtL0dDLmgiCi0jaW5jbHVkZSAibXZtL1ByaW50QnVmZmVyLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBtdm07Ci0KLWV4dGVybiAiQyIgdm9pZCBwcmludEZsb2F0KGZsb2F0IGYpIHsKLSAgZnByaW50ZihzdGRlcnIsICIlZlxuIiwgZik7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBwcmludERvdWJsZShkb3VibGUgZCkgewotICBmcHJpbnRmKHN0ZGVyciwgIiVmXG4iLCBkKTsKLX0KLQotZXh0ZXJuICJDIiB2b2lkIHByaW50TG9uZyhzaW50NjQgbCkgewotICBmcHJpbnRmKHN0ZGVyciwgIiVsbGRcbiIsIChsb25nIGxvbmcgaW50KWwpOwotfQotCi1leHRlcm4gIkMiIHZvaWQgcHJpbnRJbnQoc2ludDMyIGkpIHsKLSAgZnByaW50ZihzdGRlcnIsICIlZFxuIiwgaSk7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBwcmludE9iamVjdCh2b2lkKiBwdHIpIHsKLSAgZnByaW50ZihzdGRlcnIsICIlcFxuIiwgcHRyKTsKLX0KLQotZXh0ZXJuICJDIiB2b2lkIHdyaXRlX3B0cihQcmludEJ1ZmZlciogYnVmLCB2b2lkKiBvYmopIHsKLSAgYnVmLT53cml0ZVB0cihvYmopOwotfQotCi1leHRlcm4gIkMiIHZvaWQgd3JpdGVfaW50KFByaW50QnVmZmVyKiBidWYsIGludCBhKSB7Ci0gIGJ1Zi0+d3JpdGVTNChhKTsKLX0KLQotZXh0ZXJuICJDIiB2b2lkIHdyaXRlX3N0cihQcmludEJ1ZmZlciogYnVmLCBjaGFyKiBhKSB7Ci0gIGJ1Zi0+d3JpdGUoYSk7Ci19Ci0KLXZvaWQgT2xkT2JqZWN0OjpkZWZhdWx0X3ByaW50KGNvbnN0IGdjICpvLCBQcmludEJ1ZmZlciAqYnVmKSB7Ci0JbGx2bV9nY3Jvb3QobywgMCk7Ci0gIGJ1Zi0+d3JpdGUoIjxPbGRPYmplY3RAIik7Ci0gIGJ1Zi0+d3JpdGVQdHIoKHZvaWQqKW8pOwotICBidWYtPndyaXRlKCI+Iik7Ci19Ci0KLQotI2lmIDAKLS8vIG9sZCBzdHVmZgotCi1jbGFzcyBVVEY4QnVpbGRlciB7Ci0JdWludDE2ICpidWY7Ci0JdWludDMyICBjdXI7Ci0JdWludDMyICBzaXplOwotCi1wdWJsaWM6Ci0JVVRGOEJ1aWxkZXIoc2l6ZV90IHNpemUpIHsKLQkJc2l6ZSA9IChzaXplIDwgNCkgPyA0IDogc2l6ZTsKLQkJdGhpcy0+YnVmID0gbmV3IHVpbnQxNltzaXplXTsKLQkJdGhpcy0+c2l6ZSA9IHNpemU7Ci0JfQotCi0JVVRGOEJ1aWxkZXIgKmFwcGVuZChjb25zdCBVVEY4ICp1dGY4LCB1aW50MzIgc3RhcnQ9MCwgdWludDMyIGxlbmd0aD0weGZmZmZmZmZmKSB7Ci0JCWxlbmd0aCA9IGxlbmd0aCA9PSAweGZmZmZmZmZmID8gdXRmOC0+c2l6ZSA6IGxlbmd0aDsKLQkJdWludDMyIHJlcSA9IGN1ciArIGxlbmd0aDsKLQotCQlpZihyZXEgPiBzaXplKSB7Ci0JCQl1aW50MzIgbmV3U2l6ZSA9IHNpemU8PDE7Ci0JCQl3aGlsZShyZXEgPCBuZXdTaXplKQotCQkJCW5ld1NpemUgPDw9IDE7Ci0JCQl1aW50MTYgKm5ld0J1ZiA9IG5ldyB1aW50MTZbbmV3U2l6ZV07Ci0JCQltZW1jcHkobmV3QnVmLCBidWYsIGN1cjw8MSk7Ci0JCQlkZWxldGUgW11idWY7Ci0JCQlidWYgPSBuZXdCdWY7Ci0JCQlzaXplID0gbmV3U2l6ZTsKLQkJfQotCi0JCW1lbWNweShidWYgKyBjdXIsICZ1dGY4LT5lbGVtZW50cyArIHN0YXJ0LCBsZW5ndGg8PDEpOwotCQljdXIgPSByZXE7Ci0KLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JY29uc3QgVVRGOCAqdG9VVEY4KFVURjhNYXAgKm1hcCkgewotCQlyZXR1cm4gbWFwLT5sb29rdXBPckNyZWF0ZVJlYWRlcihidWYsIHNpemUpOwotCX0KLQotCX5VVEY4QnVpbGRlcigpIHsKLQkJZGVsZXRlIFtdIGJ1ZjsKLQl9Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9Ndm0vUnVudGltZS9TeXN0ZW1UaHJlYWRzLmNwcCBiL3Zta2l0L2xpYi9Ndm0vUnVudGltZS9TeXN0ZW1UaHJlYWRzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU4YThjYy4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTXZtL1J1bnRpbWUvU3lzdGVtVGhyZWFkcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkgKzAsMCBAQAotI2luY2x1ZGUgIm12bS9TeXN0ZW1UaHJlYWRzLmgiCi0jaW5jbHVkZSAibXZtL0dDLmgiCi0jaW5jbHVkZSAibXZtL1ZpcnR1YWxNYWNoaW5lLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBtdm07Ci0KLVJlZmVyZW5jZVRocmVhZDo6UmVmZXJlbmNlVGhyZWFkKG12bTo6Vk1LaXQqIHZta2l0KSA6Ci0JTXV0YXRvclRocmVhZCh2bWtpdCksCi0JV2Vha1JlZmVyZW5jZXNRdWV1ZShSZWZlcmVuY2VRdWV1ZTo6V0VBSyksCi0JU29mdFJlZmVyZW5jZXNRdWV1ZShSZWZlcmVuY2VRdWV1ZTo6U09GVCksIAotCVBoYW50b21SZWZlcmVuY2VzUXVldWUoUmVmZXJlbmNlUXVldWU6OlBIQU5UT00pIHsKLQotICBUb0VucXVldWUgPSBuZXcgbXZtOjpnYypbSU5JVElBTF9RVUVVRV9TSVpFXTsKLSAgVG9FbnF1ZXVlTGVuZ3RoID0gSU5JVElBTF9RVUVVRV9TSVpFOwotICBUb0VucXVldWVJbmRleCA9IDA7Ci0KLQlzZXREYWVtb24oKTsKLX0KLQotdm9pZCBSZWZlcmVuY2VUaHJlYWQ6OmFkZFdlYWtSZWZlcmVuY2UobXZtOjpnYyogcmVmKSB7Ci0JbGx2bV9nY3Jvb3QocmVmLCAwKTsKLQlXZWFrUmVmZXJlbmNlc1F1ZXVlLmFkZFJlZmVyZW5jZShyZWYpOwotfQotICAKLXZvaWQgUmVmZXJlbmNlVGhyZWFkOjphZGRTb2Z0UmVmZXJlbmNlKG12bTo6Z2MqIHJlZikgewotCWxsdm1fZ2Nyb290KHJlZiwgMCk7Ci0JU29mdFJlZmVyZW5jZXNRdWV1ZS5hZGRSZWZlcmVuY2UocmVmKTsKLX0KLSAgCi12b2lkIFJlZmVyZW5jZVRocmVhZDo6YWRkUGhhbnRvbVJlZmVyZW5jZShtdm06OmdjKiByZWYpIHsKLQlsbHZtX2djcm9vdChyZWYsIDApOwotCVBoYW50b21SZWZlcmVuY2VzUXVldWUuYWRkUmVmZXJlbmNlKHJlZik7Ci19Ci0KLW12bTo6Z2MqKiBnZXRSZWZlcmVudChtdm06OmdjKiBvYmopIHsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLQltdm06OlZpcnR1YWxNYWNoaW5lKiB2bSA9IG9iai0+Z2V0VmlydHVhbFRhYmxlKCktPnZtOwotCW12bTo6VGhyZWFkOjpnZXQoKS0+YXR0YWNoKHZtKTsKLQlyZXR1cm4gdm0tPmdldFJlZmVyZW50KG9iaik7Ci19Ci0KLXZvaWQgc2V0UmVmZXJlbnQobXZtOjpnYyogb2JqLCBtdm06OmdjKiB2YWwpIHsKLSAgbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgbGx2bV9nY3Jvb3QodmFsLCAwKTsKLQltdm06OlZpcnR1YWxNYWNoaW5lKiB2bSA9IG9iai0+Z2V0VmlydHVhbFRhYmxlKCktPnZtOwotCW12bTo6VGhyZWFkOjpnZXQoKS0+YXR0YWNoKHZtKTsKLQl2bS0+c2V0UmVmZXJlbnQob2JqLCB2YWwpOwotfQotIAotdm9pZCBpbnZva2VFbnF1ZXVlKG12bTo6Z2MqIG9iaikgewotICBsbHZtX2djcm9vdChvYmosIDApOwotICBUUlkgewotCQltdm06OlZpcnR1YWxNYWNoaW5lKiB2bSA9IG9iai0+Z2V0VmlydHVhbFRhYmxlKCktPnZtOwotCQltdm06OlRocmVhZDo6Z2V0KCktPmF0dGFjaCh2bSk7Ci0JCQotICAgIHZtLT5lbnF1ZXVlUmVmZXJlbmNlKG9iaik7Ci0gIH0gSUdOT1JFOwotICBtdm06OlRocmVhZDo6Z2V0KCktPmNsZWFyUGVuZGluZ0V4Y2VwdGlvbigpOwotfQotCi12b2lkIFJlZmVyZW5jZVRocmVhZDo6ZW5xdWV1ZVN0YXJ0KFJlZmVyZW5jZVRocmVhZCogdGgpIHsKLQltdm06OmdjKiByZXMgPSBOVUxMOwotICBsbHZtX2djcm9vdChyZXMsIDApOwotCi0gIHdoaWxlICh0cnVlKSB7Ci0gICAgdGgtPkVucXVldWVMb2NrLmxvY2soKTsKLSAgICB3aGlsZSAodGgtPlRvRW5xdWV1ZUluZGV4ID09IDApIHsKLSAgICAgIHRoLT5FbnF1ZXVlQ29uZC53YWl0KCZ0aC0+RW5xdWV1ZUxvY2spOwotICAgIH0KLSAgICB0aC0+RW5xdWV1ZUxvY2sudW5sb2NrKCk7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgdGgtPlRvRW5xdWV1ZUxvY2suYWNxdWlyZSgpOwotICAgICAgaWYgKHRoLT5Ub0VucXVldWVJbmRleCAhPSAwKSB7Ci0gICAgICAgIHJlcyA9IHRoLT5Ub0VucXVldWVbdGgtPlRvRW5xdWV1ZUluZGV4IC0gMV07Ci0gICAgICAgIC0tdGgtPlRvRW5xdWV1ZUluZGV4OwotICAgICAgfQotICAgICAgdGgtPlRvRW5xdWV1ZUxvY2sucmVsZWFzZSgpOwotICAgICAgaWYgKCFyZXMpIGJyZWFrOwotCi0gICAgICBpbnZva2VFbnF1ZXVlKHJlcyk7Ci0gICAgICByZXMgPSBOVUxMOwotICAgIH0KLSAgfQotfQotCi0KLXZvaWQgUmVmZXJlbmNlVGhyZWFkOjphZGRUb0VucXVldWUobXZtOjpnYyogb2JqKSB7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gIGlmIChUb0VucXVldWVJbmRleCA+PSBUb0VucXVldWVMZW5ndGgpIHsKLSAgICB1aW50MzIgbmV3TGVuZ3RoID0gVG9FbnF1ZXVlTGVuZ3RoICogR1JPV19GQUNUT1I7Ci0JCW12bTo6Z2MqKiBuZXdRdWV1ZSA9IG5ldyBtdm06OmdjKltuZXdMZW5ndGhdOwotICAgIGlmICghbmV3UXVldWUpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiSSBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgcmVmZXJlbmNlIG92ZXJmbG93IHlldCFcbiIpOwotICAgICAgYWJvcnQoKTsKLSAgICB9ICAgCi0gICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBUb0VucXVldWVMZW5ndGg7ICsraSkgewotICAgICAgbmV3UXVldWVbaV0gPSBUb0VucXVldWVbaV07Ci0gICAgfSAgIAotICAgIGRlbGV0ZVtdIFRvRW5xdWV1ZTsKLSAgICBUb0VucXVldWUgPSBuZXdRdWV1ZTsKLSAgICBUb0VucXVldWVMZW5ndGggPSBuZXdMZW5ndGg7Ci0gIH0KLSAgVG9FbnF1ZXVlW1RvRW5xdWV1ZUluZGV4KytdID0gb2JqOwotfQotCi12b2lkIFJlZmVyZW5jZVF1ZXVlOjphZGRSZWZlcmVuY2UobXZtOjpnYyogcmVmKSB7Ci0JbGx2bV9nY3Jvb3QocmVmLCAwKTsKLQlRdWV1ZUxvY2suYWNxdWlyZSgpOwotCWlmIChDdXJyZW50SW5kZXggPj0gUXVldWVMZW5ndGgpIHsKLQkJdWludDMyIG5ld0xlbmd0aCA9IFF1ZXVlTGVuZ3RoICogR1JPV19GQUNUT1I7Ci0JCW12bTo6Z2MqKiBuZXdRdWV1ZSA9IG5ldyBtdm06OmdjKltuZXdMZW5ndGhdOwotCQltZW1zZXQobmV3UXVldWUsIDAsIG5ld0xlbmd0aCAqIHNpemVvZihtdm06OmdjKikpOwotCQlpZiAoIW5ld1F1ZXVlKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIkkgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIHJlZmVyZW5jZSBvdmVyZmxvdyB5ZXQhXG4iKTsKLQkJCWFib3J0KCk7Ci0JCX0KLQkJZm9yICh1aW50MzIgaSA9IDA7IGkgPCBRdWV1ZUxlbmd0aDsgKytpKSBuZXdRdWV1ZVtpXSA9IFJlZmVyZW5jZXNbaV07Ci0JCWRlbGV0ZVtdIFJlZmVyZW5jZXM7Ci0JCVJlZmVyZW5jZXMgPSBuZXdRdWV1ZTsKLQkJUXVldWVMZW5ndGggPSBuZXdMZW5ndGg7Ci0JfQotCVJlZmVyZW5jZXNbQ3VycmVudEluZGV4KytdID0gcmVmOwotCVF1ZXVlTG9jay5yZWxlYXNlKCk7Ci19Ci0KLW12bTo6Z2MqIFJlZmVyZW5jZVF1ZXVlOjpwcm9jZXNzUmVmZXJlbmNlKG12bTo6Z2MqIHJlZmVyZW5jZSwgUmVmZXJlbmNlVGhyZWFkKiB0aCwgdWludHB0cl90IGNsb3N1cmUpIHsKLSAgaWYgKCFtdm06OkNvbGxlY3Rvcjo6aXNMaXZlKHJlZmVyZW5jZSwgY2xvc3VyZSkpIHsKLSAgICBzZXRSZWZlcmVudChyZWZlcmVuY2UsIDApOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLQltdm06OmdjKiByZWZlcmVudCA9ICooZ2V0UmVmZXJlbnQocmVmZXJlbmNlKSk7Ci0KLSAgaWYgKCFyZWZlcmVudCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgaWYgKHNlbWFudGljcyA9PSBTT0ZUKSB7Ci0gICAgLy8gVE9ETzogYXJlIHdlIGFyZSBvdXQgb2YgbWVtb3J5PyBDb25zaWRlciB0aGF0IHdlIGFsd2F5cyBhcmUgZm9yIG5vdy4KLSAgICBpZiAoZmFsc2UpIHsKLSAgICAgIG12bTo6Q29sbGVjdG9yOjpyZXRhaW5SZWZlcmVudChyZWZlcmVudCwgY2xvc3VyZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHNlbWFudGljcyA9PSBQSEFOVE9NKSB7Ci0gICAgLy8gTm90aGluZyB0byBkby4KLSAgfQotCi0JbXZtOjpnYyogbmV3UmVmZXJlbmNlID0KLSAgICAgIG12bTo6Q29sbGVjdG9yOjpnZXRGb3J3YXJkZWRSZWZlcmVuY2UocmVmZXJlbmNlLCBjbG9zdXJlKTsKLSAgaWYgKG12bTo6Q29sbGVjdG9yOjppc0xpdmUocmVmZXJlbnQsIGNsb3N1cmUpKSB7Ci0JCW12bTo6Z2MqIG5ld1JlZmVyZW50ID0gbXZtOjpDb2xsZWN0b3I6OmdldEZvcndhcmRlZFJlZmVyZW50KHJlZmVyZW50LCBjbG9zdXJlKTsKLSAgICBzZXRSZWZlcmVudChuZXdSZWZlcmVuY2UsIG5ld1JlZmVyZW50KTsKLSAgICByZXR1cm4gbmV3UmVmZXJlbmNlOwotICB9IGVsc2UgewotICAgIHNldFJlZmVyZW50KG5ld1JlZmVyZW5jZSwgMCk7Ci0gICAgdGgtPmFkZFRvRW5xdWV1ZShuZXdSZWZlcmVuY2UpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLQotdm9pZCBSZWZlcmVuY2VRdWV1ZTo6c2NhbihSZWZlcmVuY2VUaHJlYWQqIHRoLCB1aW50cHRyX3QgY2xvc3VyZSkgewotICB1aW50MzIgTmV3SW5kZXggPSAwOwotCi0gIGZvciAodWludDMyIGkgPSAwOyBpIDwgQ3VycmVudEluZGV4OyArK2kpIHsKLQkJbXZtOjpnYyogb2JqID0gUmVmZXJlbmNlc1tpXTsKLQkJbXZtOjpnYyogcmVzID0gcHJvY2Vzc1JlZmVyZW5jZShvYmosIHRoLCBjbG9zdXJlKTsKLSAgICBpZiAocmVzKSBSZWZlcmVuY2VzW05ld0luZGV4KytdID0gcmVzOwotICB9Ci0KLSAgQ3VycmVudEluZGV4ID0gTmV3SW5kZXg7Ci19Ci0KLXZvaWQgUmVmZXJlbmNlVGhyZWFkOjp0cmFjZXIodWludHB0cl90IGNsb3N1cmUpIHsKLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBUb0VucXVldWVJbmRleDsgKytpKSB7Ci0gICAgbXZtOjpDb2xsZWN0b3I6Om1hcmtBbmRUcmFjZVJvb3QoVG9FbnF1ZXVlICsgaSwgY2xvc3VyZSk7Ci0gIH0gCi0JTXV0YXRvclRocmVhZDo6dHJhY2VyKGNsb3N1cmUpOwotfQotCi0KLUZpbmFsaXplclRocmVhZDo6RmluYWxpemVyVGhyZWFkKFZNS2l0KiB2bWtpdCkgOiBNdXRhdG9yVGhyZWFkKHZta2l0KSB7Ci0gIEZpbmFsaXphdGlvblF1ZXVlID0gbmV3IG12bTo6Z2MqW0lOSVRJQUxfUVVFVUVfU0laRV07Ci0gIFF1ZXVlTGVuZ3RoID0gSU5JVElBTF9RVUVVRV9TSVpFOwotICBDdXJyZW50SW5kZXggPSAwOwotCi0gIFRvQmVGaW5hbGl6ZWQgPSBuZXcgbXZtOjpnYypbSU5JVElBTF9RVUVVRV9TSVpFXTsKLSAgVG9CZUZpbmFsaXplZExlbmd0aCA9IElOSVRJQUxfUVVFVUVfU0laRTsKLSAgQ3VycmVudEZpbmFsaXplZEluZGV4ID0gMDsKLQotCXNldERhZW1vbigpOwotfQotCi12b2lkIEZpbmFsaXplclRocmVhZDo6Z3Jvd0ZpbmFsaXphdGlvblF1ZXVlKCkgewotICBpZiAoQ3VycmVudEluZGV4ID49IFF1ZXVlTGVuZ3RoKSB7Ci0gICAgdWludDMyIG5ld0xlbmd0aCA9IFF1ZXVlTGVuZ3RoICogR1JPV19GQUNUT1I7Ci0JCW12bTo6Z2MqKiBuZXdRdWV1ZSA9IG5ldyBtdm06OmdjKltuZXdMZW5ndGhdOwotICAgIGlmICghbmV3UXVldWUpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiSSBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgZmluYWxpemVyIG92ZXJmbG93cyB5ZXQhXG4iKTsKLSAgICAgIGFib3J0KCk7Ci0gICAgfQotICAgIGZvciAodWludDMyIGkgPSAwOyBpIDwgUXVldWVMZW5ndGg7ICsraSkgbmV3UXVldWVbaV0gPSBGaW5hbGl6YXRpb25RdWV1ZVtpXTsKLSAgICBkZWxldGVbXSBGaW5hbGl6YXRpb25RdWV1ZTsKLSAgICBGaW5hbGl6YXRpb25RdWV1ZSA9IG5ld1F1ZXVlOwotICAgIFF1ZXVlTGVuZ3RoID0gbmV3TGVuZ3RoOwotICB9Ci19Ci0KLXZvaWQgRmluYWxpemVyVGhyZWFkOjpncm93VG9CZUZpbmFsaXplZFF1ZXVlKCkgewotICBpZiAoQ3VycmVudEZpbmFsaXplZEluZGV4ID49IFRvQmVGaW5hbGl6ZWRMZW5ndGgpIHsKLSAgICB1aW50MzIgbmV3TGVuZ3RoID0gVG9CZUZpbmFsaXplZExlbmd0aCAqIEdST1dfRkFDVE9SOwotCQltdm06OmdjKiogbmV3UXVldWUgPSBuZXcgbXZtOjpnYypbbmV3TGVuZ3RoXTsKLSAgICBpZiAoIW5ld1F1ZXVlKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIkkgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIGZpbmFsaXplciBvdmVyZmxvd3MgeWV0IVxuIik7Ci0gICAgICBhYm9ydCgpOwotICAgIH0KLSAgICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IFRvQmVGaW5hbGl6ZWRMZW5ndGg7ICsraSkgbmV3UXVldWVbaV0gPSBUb0JlRmluYWxpemVkW2ldOwotICAgIGRlbGV0ZVtdIFRvQmVGaW5hbGl6ZWQ7Ci0gICAgVG9CZUZpbmFsaXplZCA9IG5ld1F1ZXVlOwotICAgIFRvQmVGaW5hbGl6ZWRMZW5ndGggPSBuZXdMZW5ndGg7Ci0gIH0KLX0KLQotCi12b2lkIEZpbmFsaXplclRocmVhZDo6YWRkRmluYWxpemF0aW9uQ2FuZGlkYXRlKG12bTo6Z2MqIG9iaikgewotICBsbHZtX2djcm9vdChvYmosIDApOwotICBGaW5hbGl6YXRpb25RdWV1ZUxvY2suYWNxdWlyZSgpOwotIAotICBpZiAoQ3VycmVudEluZGV4ID49IFF1ZXVlTGVuZ3RoKSB7Ci0gICAgZ3Jvd0ZpbmFsaXphdGlvblF1ZXVlKCk7Ci0gIH0KLSAgCi0gIEZpbmFsaXphdGlvblF1ZXVlW0N1cnJlbnRJbmRleCsrXSA9IG9iajsKLSAgRmluYWxpemF0aW9uUXVldWVMb2NrLnJlbGVhc2UoKTsKLX0KLQotdm9pZCBGaW5hbGl6ZXJUaHJlYWQ6OnNjYW5GaW5hbGl6YXRpb25RdWV1ZSh1aW50cHRyX3QgY2xvc3VyZSkgewotICB1aW50MzIgTmV3SW5kZXggPSAwOwotICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IEN1cnJlbnRJbmRleDsgKytpKSB7Ci0JCW12bTo6Z2MqIG9iaiA9IEZpbmFsaXphdGlvblF1ZXVlW2ldOwotCi0gICAgaWYgKCFtdm06OkNvbGxlY3Rvcjo6aXNMaXZlKG9iaiwgY2xvc3VyZSkpIHsKLSAgICAgIG9iaiA9IG12bTo6Q29sbGVjdG9yOjpyZXRhaW5Gb3JGaW5hbGl6ZShGaW5hbGl6YXRpb25RdWV1ZVtpXSwgY2xvc3VyZSk7Ci0gICAgICAKLSAgICAgIGlmIChDdXJyZW50RmluYWxpemVkSW5kZXggPj0gVG9CZUZpbmFsaXplZExlbmd0aCkKLSAgICAgICAgZ3Jvd1RvQmVGaW5hbGl6ZWRRdWV1ZSgpOwotICAgICAgCi0gICAgICAvKiBBZGQgdG8gb2JqZWN0IHRhYmxlICovCi0gICAgICBUb0JlRmluYWxpemVkW0N1cnJlbnRGaW5hbGl6ZWRJbmRleCsrXSA9IG9iajsKLSAgICB9IGVsc2UgewotICAgICAgRmluYWxpemF0aW9uUXVldWVbTmV3SW5kZXgrK10gPQotICAgICAgICBtdm06OkNvbGxlY3Rvcjo6Z2V0Rm9yd2FyZGVkRmluYWxpemFibGUob2JqLCBjbG9zdXJlKTsKLSAgICB9Ci0gIH0KLSAgQ3VycmVudEluZGV4ID0gTmV3SW5kZXg7Ci19Ci0KLXR5cGVkZWYgdm9pZCAoKmRlc3RydWN0b3JfdCkodm9pZCopOwotCi12b2lkIGludm9rZUZpbmFsaXplKG12bTo6Z2MqIG9iaikgewotICBsbHZtX2djcm9vdChvYmosIDApOwotICBUUlkgewotCQlsbHZtX2djcm9vdChvYmosIDApOwotCQlWaXJ0dWFsTWFjaGluZSogdm0gPSBvYmotPmdldFZpcnR1YWxUYWJsZSgpLT52bTsKLQkJbXZtOjpUaHJlYWQ6OmdldCgpLT5hdHRhY2godm0pOwotCQl2bS0+ZmluYWxpemVPYmplY3Qob2JqKTsKLSAgfSBJR05PUkU7Ci0gIG12bTo6VGhyZWFkOjpnZXQoKS0+Y2xlYXJQZW5kaW5nRXhjZXB0aW9uKCk7Ci19Ci0KLXZvaWQgRmluYWxpemVyVGhyZWFkOjpmaW5hbGl6ZXJTdGFydChGaW5hbGl6ZXJUaHJlYWQqIHRoKSB7Ci0JbXZtOjpnYyogcmVzID0gTlVMTDsKLSAgbGx2bV9nY3Jvb3QocmVzLCAwKTsKLQotICB3aGlsZSAodHJ1ZSkgewotICAgIHRoLT5GaW5hbGl6YXRpb25Mb2NrLmxvY2soKTsKLSAgICB3aGlsZSAodGgtPkN1cnJlbnRGaW5hbGl6ZWRJbmRleCA9PSAwKSB7Ci0gICAgICB0aC0+RmluYWxpemF0aW9uQ29uZC53YWl0KCZ0aC0+RmluYWxpemF0aW9uTG9jayk7Ci0gICAgfQotICAgIHRoLT5GaW5hbGl6YXRpb25Mb2NrLnVubG9jaygpOwotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHRoLT5GaW5hbGl6YXRpb25RdWV1ZUxvY2suYWNxdWlyZSgpOwotICAgICAgaWYgKHRoLT5DdXJyZW50RmluYWxpemVkSW5kZXggIT0gMCkgewotICAgICAgICByZXMgPSB0aC0+VG9CZUZpbmFsaXplZFt0aC0+Q3VycmVudEZpbmFsaXplZEluZGV4IC0gMV07Ci0gICAgICAgIC0tdGgtPkN1cnJlbnRGaW5hbGl6ZWRJbmRleDsKLSAgICAgIH0KLSAgICAgIHRoLT5GaW5hbGl6YXRpb25RdWV1ZUxvY2sucmVsZWFzZSgpOwotICAgICAgaWYgKCFyZXMpIGJyZWFrOwotCi0JCQltdm06OlZpcnR1YWxUYWJsZSogVlQgPSByZXMtPmdldFZpcnR1YWxUYWJsZSgpOwotCQkJQVNTRVJUKFZULT52bSk7Ci0gICAgICBpZiAoVlQtPm9wZXJhdG9yRGVsZXRlKSB7Ci0gICAgICAgIGRlc3RydWN0b3JfdCBkZXN0ID0gKGRlc3RydWN0b3JfdClWVC0+ZGVzdHJ1Y3RvcjsKLSAgICAgICAgZGVzdChyZXMpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW52b2tlRmluYWxpemUocmVzKTsKLSAgICAgIH0KLSAgICAgIHJlcyA9IE5VTEw7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgRmluYWxpemVyVGhyZWFkOjp0cmFjZXIodWludHB0cl90IGNsb3N1cmUpIHsKLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBDdXJyZW50RmluYWxpemVkSW5kZXg7ICsraSkgewotICAgIG12bTo6Q29sbGVjdG9yOjptYXJrQW5kVHJhY2VSb290KFRvQmVGaW5hbGl6ZWQgKyBpLCBjbG9zdXJlKTsKLSAgfQotCU11dGF0b3JUaHJlYWQ6OnRyYWNlcihjbG9zdXJlKTsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9Ndm0vUnVudGltZS9VVEY4LmNwcCBiL3Zta2l0L2xpYi9Ndm0vUnVudGltZS9VVEY4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU1ZDYxYi4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTXZtL1J1bnRpbWUvVVRGOC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotI2luY2x1ZGUgIm12bS9BbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJtdm0vVVRGOC5oIgotCi11c2luZyBuYW1lc3BhY2UgbXZtOwotCi1jb25zdCBVVEY4KiBVVEY4OjpleHRyYWN0KFVURjhNYXAqIG1hcCwgdWludDMyIHN0YXJ0LCB1aW50MzIgZW5kKSBjb25zdCB7Ci0gIHVpbnQzMiBsZW4gPSBlbmQgLSBzdGFydDsKLSAgVGhyZWFkQWxsb2NhdG9yIGFsbG9jYXRvcjsKLSAgdWludDE2KiBidWYgPSAodWludDE2KilhbGxvY2F0b3IuQWxsb2NhdGUoc2l6ZW9mKHVpbnQxNikgKiBsZW4pOwotCi0gIGZvciAodWludDMyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICBidWZbaV0gPSBlbGVtZW50c1tpICsgc3RhcnRdOwotICB9Ci0KLSAgcmV0dXJuIG1hcC0+bG9va3VwT3JDcmVhdGVSZWFkZXIoYnVmLCBsZW4pOwotfQotCi1zdGF0aWMgdWludDMyIGFzY2lpekhhc2hlcihjb25zdCBjaGFyKiBhc2NpaXosIHNpbnQzMiBzaXplKSB7Ci0gIHVpbnQzMiByMCA9IDAsIHIxID0gMDsKLSAgZm9yIChzaW50MzIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICBjaGFyIGMgPSBhc2NpaXpbaV07Ci0gICAgcjAgKz0gYzsKLSAgICByMSBePSBjOwotICB9Ci0gIHJldHVybiAocjEgJiAyNTUpICsgKChyMCAmIDI1NSkgPDwgOCk7Ci19Ci0KLXVpbnQzMiBVVEY4OjpyZWFkZXJIYXNoZXIoY29uc3QgdWludDE2KiBidWYsIHNpbnQzMiBzaXplKSB7Ci0gIHVpbnQzMiByMCA9IDAsIHIxID0gMDsKLSAgZm9yIChzaW50MzIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICB1aW50MTYgYyA9IGJ1ZltpXTsKLSAgICByMCArPSBjOwotICAgIHIxIF49IGM7Ci0gIH0KLSAgcmV0dXJuIChyMSAmIDI1NSkgKyAoKHIwICYgMjU1KSA8PCA4KTsKLX0KLQotc3RhdGljIGJvb2wgYXNjaWl6RXF1YWwoY29uc3QgVVRGOCogdmFsLCBjb25zdCBjaGFyKiBhc2NpaXosIHNpbnQzMiBzaXplKSB7Ci0gIHNpbnQzMiBsZW4gPSB2YWwtPnNpemU7Ci0gIGlmIChsZW4gIT0gc2l6ZSkgcmV0dXJuIGZhbHNlOwotICBlbHNlIHsKLSAgICBmb3IgKHNpbnQzMiBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICBpZiAoYXNjaWl6W2ldICE9IHZhbC0+ZWxlbWVudHNbaV0pIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KLQotc3RhdGljIGJvb2wgcmVhZGVyRXF1YWwoY29uc3QgVVRGOCogdmFsLCBjb25zdCB1aW50MTYqIGJ1Ziwgc2ludDMyIHNpemUpIHsKLSAgc2ludDMyIGxlbiA9IHZhbC0+c2l6ZTsKLSAgaWYgKGxlbiAhPSBzaXplKSByZXR1cm4gZmFsc2U7Ci0gIGVsc2UgcmV0dXJuICEobWVtY21wKHZhbC0+ZWxlbWVudHMsIGJ1ZiwgbGVuICogc2l6ZW9mKHVpbnQxNikpKTsKLX0KLQotdm9pZCBVVEY4TWFwOjpyZXBsYWNlKGNvbnN0IFVURjgqIG9sZFVURjgsIGNvbnN0IFVURjgqIG5ld1VURjgpIHsKLSAgbG9jay5sb2NrKCk7Ci0gIHVpbnQzMiBrZXkgPSBvbGRVVEY4LT5oYXNoKCk7Ci0gIHN0ZDo6cGFpcjxVVEY4TWFwOjppdGVyYXRvciwgVVRGOE1hcDo6aXRlcmF0b3I+IHAgPSBtYXAuZXF1YWxfcmFuZ2Uoa2V5KTsKLSAgCi0gIGZvciAoVVRGOE1hcDo6aXRlcmF0b3IgaSA9IHAuZmlyc3Q7IGkgIT0gcC5zZWNvbmQ7IGkrKykgewotICAgIGlmIChpLT5zZWNvbmQgPT0gb2xkVVRGOCkgewotICAgICAgbWFwLmVyYXNlKGkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIG1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoa2V5LCBuZXdVVEY4KSk7Ci0gIGxvY2sudW5sb2NrKCk7Ci0KLX0KLQotY29uc3QgVVRGOCogVVRGOE1hcDo6bG9va3VwT3JDcmVhdGVBc2NpaXooY29uc3QgY2hhciogYXNjaWl6KSB7Ci0gIHNpbnQzMiBzaXplID0gc3RybGVuKGFzY2lpeik7Ci0gIHVpbnQzMiBrZXkgPSBhc2NpaXpIYXNoZXIoYXNjaWl6LCBzaXplKTsKLSAgY29uc3QgVVRGOCogcmVzID0gMDsKLSAgbG9jay5sb2NrKCk7Ci0gIAotICBzdGQ6OnBhaXI8VVRGOE1hcDo6aXRlcmF0b3IsIFVURjhNYXA6Oml0ZXJhdG9yPiBwID0gbWFwLmVxdWFsX3JhbmdlKGtleSk7Ci0gIAotICBmb3IgKFVURjhNYXA6Oml0ZXJhdG9yIGkgPSBwLmZpcnN0OyBpICE9IHAuc2Vjb25kOyBpKyspIHsKLSAgICBpZiAoYXNjaWl6RXF1YWwoaS0+c2Vjb25kLCBhc2NpaXosIHNpemUpKSB7Ci0gICAgICByZXMgPSBpLT5zZWNvbmQ7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBpZiAocmVzID09IDApIHsKLSAgICBVVEY4KiB0bXAgPSBuZXcoYWxsb2NhdG9yLCBzaXplKSBVVEY4KHNpemUpOwotICAgIGZvciAoc2ludDMyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICB0bXAtPmVsZW1lbnRzW2ldID0gYXNjaWl6W2ldOwotICAgIH0KLSAgICByZXMgPSAoY29uc3QgVVRGOCopdG1wOwotICAgIG1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoa2V5LCByZXMpKTsKLSAgfQotICAKLSAgbG9jay51bmxvY2soKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotY29uc3QgVVRGOCogVVRGOE1hcDo6bG9va3VwT3JDcmVhdGVSZWFkZXIoY29uc3QgdWludDE2KiBidWYsIHVpbnQzMiBsZW4pIHsKLSAgc2ludDMyIHNpemUgPSAoc2ludDMyKWxlbjsKLSAgdWludDMyIGtleSA9IFVURjg6OnJlYWRlckhhc2hlcihidWYsIHNpemUpOwotICBjb25zdCBVVEY4KiByZXMgPSAwOwotICBsb2NrLmxvY2soKTsKLSAgCi0gIHN0ZDo6cGFpcjxVVEY4TWFwOjppdGVyYXRvciwgVVRGOE1hcDo6aXRlcmF0b3I+IHAgPSBtYXAuZXF1YWxfcmFuZ2Uoa2V5KTsKLQotICBmb3IgKFVURjhNYXA6Oml0ZXJhdG9yIGkgPSBwLmZpcnN0OyBpICE9IHAuc2Vjb25kOyBpKyspIHsKLSAgICBpZiAocmVhZGVyRXF1YWwoaS0+c2Vjb25kLCBidWYsIHNpemUpKSB7Ci0gICAgICByZXMgPSBpLT5zZWNvbmQ7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBpZiAocmVzID09IDApIHsKLSAgICBVVEY4KiB0bXAgPSBuZXcoYWxsb2NhdG9yLCBzaXplKSBVVEY4KHNpemUpOwotICAgIG1lbWNweSh0bXAtPmVsZW1lbnRzLCBidWYsIGxlbiAqIHNpemVvZih1aW50MTYpKTsKLSAgICByZXMgPSAoY29uc3QgVVRGOCopdG1wOwotICAgIG1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoa2V5LCByZXMpKTsKLSAgfQotICAKLSAgbG9jay51bmxvY2soKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotY29uc3QgVVRGOCogVVRGOE1hcDo6bG9va3VwQXNjaWl6KGNvbnN0IGNoYXIqIGFzY2lpeikgewotICBzaW50MzIgc2l6ZSA9IHN0cmxlbihhc2NpaXopOwotICB1aW50MzIga2V5ID0gYXNjaWl6SGFzaGVyKGFzY2lpeiwgc2l6ZSk7Ci0gIGNvbnN0IFVURjgqIHJlcyA9IDA7Ci0gIGxvY2subG9jaygpOwotICAKLSAgc3RkOjpwYWlyPFVURjhNYXA6Oml0ZXJhdG9yLCBVVEY4TWFwOjppdGVyYXRvcj4gcCA9IG1hcC5lcXVhbF9yYW5nZShrZXkpOwotICAKLSAgZm9yIChVVEY4TWFwOjppdGVyYXRvciBpID0gcC5maXJzdDsgaSAhPSBwLnNlY29uZDsgaSsrKSB7Ci0gICAgaWYgKGFzY2lpekVxdWFsKGktPnNlY29uZCwgYXNjaWl6LCBzaXplKSkgewotICAgICAgcmVzID0gaS0+c2Vjb25kOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgbG9jay51bmxvY2soKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotY29uc3QgVVRGOCogVVRGOE1hcDo6bG9va3VwUmVhZGVyKGNvbnN0IHVpbnQxNiogYnVmLCB1aW50MzIgbGVuKSB7Ci0gIHNpbnQzMiBzaXplID0gKHNpbnQzMilsZW47Ci0gIHVpbnQzMiBrZXkgPSBVVEY4OjpyZWFkZXJIYXNoZXIoYnVmLCBzaXplKTsKLSAgY29uc3QgVVRGOCogcmVzID0gMDsKLSAgbG9jay5sb2NrKCk7Ci0gIAotICBzdGQ6OnBhaXI8VVRGOE1hcDo6aXRlcmF0b3IsIFVURjhNYXA6Oml0ZXJhdG9yPiBwID0gbWFwLmVxdWFsX3JhbmdlKGtleSk7Ci0KLSAgZm9yIChVVEY4TWFwOjppdGVyYXRvciBpID0gcC5maXJzdDsgaSAhPSBwLnNlY29uZDsgaSsrKSB7Ci0gICAgaWYgKHJlYWRlckVxdWFsKGktPnNlY29uZCwgYnVmLCBzaXplKSkgewotICAgICAgcmVzID0gaS0+c2Vjb25kOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgbG9jay51bmxvY2soKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotdm9pZCBVVEY4TWFwOjppbnNlcnQoY29uc3QgVVRGOCogdmFsKSB7Ci0gIG1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIodmFsLT5oYXNoKCksIHZhbCkpOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL012bS9SdW50aW1lL1ZNS2l0LmNwcCBiL3Zta2l0L2xpYi9Ndm0vUnVudGltZS9WTUtpdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZDhmZDEuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL012bS9SdW50aW1lL1ZNS2l0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0jaW5jbHVkZSAibXZtL1ZNS2l0LmgiCi0jaW5jbHVkZSAibXZtL1ZpcnR1YWxNYWNoaW5lLmgiCi0jaW5jbHVkZSAibXZtL1N5c3RlbVRocmVhZHMuaCIKLSNpbmNsdWRlICJtdm0vR0MuaCIKLSNpbmNsdWRlICJtdm0vSklULmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBtdm07Ci0KLSNpZiAwCi0jZGVmaW5lIGRwcmludGYoLi4uKSBkbyB7IHByaW50ZigiWyVwXSAiLCAodm9pZCopbXZtOjpUaHJlYWQ6OmdldCgpKTsgcHJpbnRmKF9fVkFfQVJHU19fKTsgfSB3aGlsZSgwKQotI2Vsc2UKLSNkZWZpbmUgZHByaW50ZiguLi4pCi0jZW5kaWYKLQotc3RhdGljIFNwaW5Mb2NrIGluaXRlZExvY2s7Ci1zdGF0aWMgYm9vbCAgICAgaW5pdGVkID0gZmFsc2U7Ci0KLXZvaWQgVk1LaXQ6OmluaXRpYWxpc2UobGx2bTo6Q29kZUdlbk9wdDo6TGV2ZWwgbGV2ZWwsIGxsdm06Ok1vZHVsZSogVGhlTW9kdWxlLCBsbHZtOjpUYXJnZXRNYWNoaW5lKiBUaGVUYXJnZXQpIHsKLQlpbml0ZWRMb2NrLmxvY2soKTsKLQlpZighaW5pdGVkKSB7Ci0JCWluaXRlZCA9IHRydWU7Ci0JCW12bTo6TXZtTW9kdWxlOjppbml0aWFsaXNlKGxldmVsLCBUaGVNb2R1bGUsIFRoZVRhcmdldCk7Ci0JCW12bTo6Q29sbGVjdG9yOjppbml0aWFsaXNlKCk7Ci0JfQotCWluaXRlZExvY2sudW5sb2NrKCk7Ci19Ci0KLVZNS2l0OjpWTUtpdChtdm06OkJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jKSA6IGFsbG9jYXRvcihBbGxvYykgewotCWluaXRpYWxpc2UoKTsKLQotCXZtcyAgICAgICAgICA9IDA7Ci0Jdm1zQXJyYXlTaXplID0gMDsKLX0KLQotdm9pZCBWTUtpdDo6c2NhbldlYWtSZWZlcmVuY2VzUXVldWUodWludHB0cl90IGNsb3N1cmUpIHsKLQlpZihyZWZlcmVuY2VUaHJlYWQpCi0JCXJlZmVyZW5jZVRocmVhZC0+V2Vha1JlZmVyZW5jZXNRdWV1ZS5zY2FuKHJlZmVyZW5jZVRocmVhZCwgY2xvc3VyZSk7Ci19Ci0gIAotdm9pZCBWTUtpdDo6c2NhblNvZnRSZWZlcmVuY2VzUXVldWUodWludHB0cl90IGNsb3N1cmUpIHsKLQlpZihyZWZlcmVuY2VUaHJlYWQpCi0JCXJlZmVyZW5jZVRocmVhZC0+U29mdFJlZmVyZW5jZXNRdWV1ZS5zY2FuKHJlZmVyZW5jZVRocmVhZCwgY2xvc3VyZSk7Ci19Ci0gIAotdm9pZCBWTUtpdDo6c2NhblBoYW50b21SZWZlcmVuY2VzUXVldWUodWludHB0cl90IGNsb3N1cmUpIHsKLQlpZihyZWZlcmVuY2VUaHJlYWQpCi0JCXJlZmVyZW5jZVRocmVhZC0+UGhhbnRvbVJlZmVyZW5jZXNRdWV1ZS5zY2FuKHJlZmVyZW5jZVRocmVhZCwgY2xvc3VyZSk7Ci19Ci0KLXZvaWQgVk1LaXQ6OnNjYW5GaW5hbGl6YXRpb25RdWV1ZSh1aW50cHRyX3QgY2xvc3VyZSkgewotCWlmKGZpbmFsaXplclRocmVhZCkKLQkJZmluYWxpemVyVGhyZWFkLT5zY2FuRmluYWxpemF0aW9uUXVldWUoY2xvc3VyZSk7Ci19Ci0KLUZpbmFsaXplclRocmVhZCogVk1LaXQ6OmdldEFuZEFsbG9jYXRlRmluYWxpemVyVGhyZWFkKCkgewotCWlmKCFmaW5hbGl6ZXJUaHJlYWQpIHsKLQkJdm1raXRMb2NrKCk7Ci0JCWlmKCFmaW5hbGl6ZXJUaHJlYWQpIHsKLQkJCWZpbmFsaXplclRocmVhZCA9IG5ldyBGaW5hbGl6ZXJUaHJlYWQodGhpcyk7Ci0JCQlmaW5hbGl6ZXJUaHJlYWQtPnN0YXJ0KCh2b2lkICgqKShtdm06OlRocmVhZCopKUZpbmFsaXplclRocmVhZDo6ZmluYWxpemVyU3RhcnQpOwotCQl9Ci0JCXZta2l0VW5sb2NrKCk7Ci0JfQotCXJldHVybiBmaW5hbGl6ZXJUaHJlYWQ7Ci19Ci0KLVJlZmVyZW5jZVRocmVhZCogVk1LaXQ6OmdldEFuZEFsbG9jYXRlUmVmZXJlbmNlVGhyZWFkKCkgewotCWlmKCFyZWZlcmVuY2VUaHJlYWQpIHsKLQkJdm1raXRMb2NrKCk7Ci0JCWlmKCFyZWZlcmVuY2VUaHJlYWQpIHsKLQkJCXJlZmVyZW5jZVRocmVhZCA9IG5ldyBSZWZlcmVuY2VUaHJlYWQodGhpcyk7Ci0JCQlyZWZlcmVuY2VUaHJlYWQtPnN0YXJ0KCh2b2lkICgqKShtdm06OlRocmVhZCopKVJlZmVyZW5jZVRocmVhZDo6ZW5xdWV1ZVN0YXJ0KTsKLQkJfQotCQl2bWtpdFVubG9jaygpOwotCX0KLQlyZXR1cm4gcmVmZXJlbmNlVGhyZWFkOwotfQotCi12b2lkIFZNS2l0OjphZGRGaW5hbGl6YXRpb25DYW5kaWRhdGUobXZtOjpnYyogb2JqZWN0KSB7Ci0gIGxsdm1fZ2Nyb290KG9iamVjdCwgMCk7Ci0gIGdldEFuZEFsbG9jYXRlRmluYWxpemVyVGhyZWFkKCktPmFkZEZpbmFsaXphdGlvbkNhbmRpZGF0ZShvYmplY3QpOwotfQotCi12b2lkIFZNS2l0OjphZGRXZWFrUmVmZXJlbmNlKG12bTo6Z2MqIHJlZikgewotICBsbHZtX2djcm9vdChyZWYsIDApOwotCWdldEFuZEFsbG9jYXRlUmVmZXJlbmNlVGhyZWFkKCktPmFkZFdlYWtSZWZlcmVuY2UocmVmKTsKLX0KLSAgCi12b2lkIFZNS2l0OjphZGRTb2Z0UmVmZXJlbmNlKG12bTo6Z2MqIHJlZikgewotICBsbHZtX2djcm9vdChyZWYsIDApOwotCWdldEFuZEFsbG9jYXRlUmVmZXJlbmNlVGhyZWFkKCktPmFkZFNvZnRSZWZlcmVuY2UocmVmKTsKLX0KLSAgCi12b2lkIFZNS2l0OjphZGRQaGFudG9tUmVmZXJlbmNlKG12bTo6Z2MqIHJlZikgewotCWxsdm1fZ2Nyb290KHJlZiwgMCk7Ci0JZ2V0QW5kQWxsb2NhdGVSZWZlcmVuY2VUaHJlYWQoKS0+YWRkUGhhbnRvbVJlZmVyZW5jZShyZWYpOwotfQotCi12b2lkIFZNS2l0Ojp0cmFjZXIodWludHB0cl90IGNsb3N1cmUpIHsKLQkvLyBkb24ndCBoYXZlIHRvIHRha2UgdGhlIHZta2l0TG9jaywgYWxyZWFkeSB0YWtlbiBieSB0aGUgcmVuZGV6dm91cy4KLQlmb3Ioc2l6ZV90IGk9MDsgaTx2bXNBcnJheVNpemU7IGkrKykKLQkJaWYodm1zW2ldKQotCQkJdm1zW2ldLT50cmFjZXIoY2xvc3VyZSk7Ci19Ci0KLWJvb2wgVk1LaXQ6OnN0YXJ0Q29sbGVjdGlvbigpIHsKLQkvLyBkbyBub3QgdGFrZSB0aGUgbG9jayBoZXJlIGJlY2F1c2UgaWYgYSBnYyBpcyBjdXJyZW50bHkgcnVubmluZywgaXQgY291bGQgY2FsbCBlbnRlclVuY29vcGVyYXRpdmVDb2RlIAotCS8vIHdoaWNoIHdpbGwgZXhlY3V0ZSB0aGUgZ2MgYW5kIHdlIHdpbGwgdGhlcmVmb3JlIHJlY2FsbCB0aGUgZ2MganVzdCBiZWhpbmQuIFN0dXBpZCBiZWNhdXNlIHRoZSBwcmV2aW91cyBvbmUKLQkvLyBzaG91bGQgaGF2ZSBmcmVlZCBzb21lIG1lbW9yeQotICByZW5kZXp2b3VzLnN0YXJ0UlYoKTsKLQotICBpZiAobXZtOjpUaHJlYWQ6OmdldCgpLT5kb1lpZWxkKSB7Ci0gICAgcmVuZGV6dm91cy5jYW5jZWxSVigpOwotICAgIHJlbmRlenZvdXMuam9pbigpOwotICAgIHJldHVybiAwOwotICB9IGVsc2UgewotCQlkcHJpbnRmKCJTdGFydCBjb2xsZWN0aW9uXG4iKTsKLQkJLy8gTG9jayB0aHJlYWQgbG9jaywgc28gdGhhdCB3ZSBjYW4gdHJhdmVyc2UgdGhlIHZtIGFuZCB0aHJlYWQgbGlzdHMgc2FmZWx5LiBUaGlzIHdpbGwgYmUgcmVsZWFzZWQgb24gZmluaXNoUlYuCi0JCXZta2l0TG9jaygpOwotCi0JCWlmKGZpbmFsaXplclRocmVhZCkKLQkJCWZpbmFsaXplclRocmVhZC0+RmluYWxpemF0aW9uUXVldWVMb2NrLmFjcXVpcmUoKTsKLQkJaWYocmVmZXJlbmNlVGhyZWFkKSB7Ci0JCQlyZWZlcmVuY2VUaHJlYWQtPlRvRW5xdWV1ZUxvY2suYWNxdWlyZSgpOwotCQkJcmVmZXJlbmNlVGhyZWFkLT5Tb2Z0UmVmZXJlbmNlc1F1ZXVlLmFjcXVpcmUoKTsKLQkJCXJlZmVyZW5jZVRocmVhZC0+V2Vha1JlZmVyZW5jZXNRdWV1ZS5hY3F1aXJlKCk7Ci0JCQlyZWZlcmVuY2VUaHJlYWQtPlBoYW50b21SZWZlcmVuY2VzUXVldWUuYWNxdWlyZSgpOwotCQl9Ci0KLQkJLy8gY2FsbCBmaXJzdCBzdGFydENvbGxlY3Rpb24gb24gZWFjaCB2bSB0byBhdm9pZCBkZWFkbG9jay4gCi0JCS8vIGluZGVlZCwgYSB2bSBjb3VsZCB3YW50IHRvIGV4ZWN1dGUgYXBwbGljYXRpdmUgY29kZQotCQlmb3Ioc2l6ZV90IGk9MDsgaTx2bXNBcnJheVNpemU7IGkrKykKLQkJCWlmKHZtc1tpXSkKLQkJCQl2bXNbaV0tPnN0YXJ0Q29sbGVjdGlvbigpOwotCi0gICAgcmVuZGV6dm91cy5zeW5jaHJvbml6ZSgpOwotCi0JCXJldHVybiAxOwotCX0KLX0KLQotdm9pZCBWTUtpdDo6ZW5kQ29sbGVjdGlvbigpIHsKLQlkcHJpbnRmKCJFbmQgY29sbGVjdGlvblxuIik7Ci0KLQlyZW5kZXp2b3VzLmZpbmlzaFJWKCk7Ci0KLQlmb3Ioc2l6ZV90IGk9MDsgaTx2bXNBcnJheVNpemU7IGkrKykKLQkJaWYodm1zW2ldKQotCQkJdm1zW2ldLT5lbmRDb2xsZWN0aW9uKCk7Ci0KLQlpZihmaW5hbGl6ZXJUaHJlYWQpIHsKLQkJZmluYWxpemVyVGhyZWFkLT5GaW5hbGl6YXRpb25RdWV1ZUxvY2sucmVsZWFzZSgpOwotCQlmaW5hbGl6ZXJUaHJlYWQtPkZpbmFsaXphdGlvbkNvbmQuYnJvYWRjYXN0KCk7Ci0JfQotCi0JaWYocmVmZXJlbmNlVGhyZWFkKSB7Ci0JCXJlZmVyZW5jZVRocmVhZC0+VG9FbnF1ZXVlTG9jay5yZWxlYXNlKCk7Ci0JCXJlZmVyZW5jZVRocmVhZC0+U29mdFJlZmVyZW5jZXNRdWV1ZS5yZWxlYXNlKCk7Ci0JCXJlZmVyZW5jZVRocmVhZC0+V2Vha1JlZmVyZW5jZXNRdWV1ZS5yZWxlYXNlKCk7Ci0JCXJlZmVyZW5jZVRocmVhZC0+UGhhbnRvbVJlZmVyZW5jZXNRdWV1ZS5yZWxlYXNlKCk7Ci0JCXJlZmVyZW5jZVRocmVhZC0+RW5xdWV1ZUNvbmQuYnJvYWRjYXN0KCk7Ci0JfQotCi0Jdm1raXRVbmxvY2soKTsKLX0KLQotc2l6ZV90IFZNS2l0OjphZGRWTShWaXJ0dWFsTWFjaGluZSogdm0pIHsKLQlkcHJpbnRmKCJhZGQgdm06ICVwXG4iLCB2bSk7Ci0Jdm1raXRMb2NrKCk7Ci0KLQlmb3Ioc2l6ZV90IGk9MDsgaTx2bXNBcnJheVNpemU7IGkrKykKLQkJaWYoIXZtc1tpXSkgewotCQkJdm1zW2ldID0gdm07Ci0JCQl2bWtpdFVubG9jaygpOwotCQkJcmV0dXJuIGk7Ci0JCX0KLQotCWludCByZXMgPSB2bXNBcnJheVNpemU7Ci0Jdm1zQXJyYXlTaXplID0gdm1zQXJyYXlTaXplID8gKHZtc0FycmF5U2l6ZTw8MSkgOiAxOwotCS8vIHJlYWxsb2NhdGUgdGhlIHZtcwotCVZpcnR1YWxNYWNoaW5lICoqbmV3Vm1zID0gbmV3IFZpcnR1YWxNYWNoaW5lKlt2bXNBcnJheVNpemVdOwotCi0JbWVtY3B5KG5ld1Ztcywgdm1zLCByZXMqc2l6ZW9mKFZpcnR1YWxNYWNoaW5lKikpOwotCW1lbXNldChuZXdWbXMgKyByZXMqc2l6ZW9mKFZpcnR1YWxNYWNoaW5lKiksIDAsICh2bXNBcnJheVNpemUtcmVzKSpzaXplb2YoVmlydHVhbE1hY2hpbmUqKSk7Ci0JbmV3Vm1zW3Jlc10gPSB2bTsKLQotCVZpcnR1YWxNYWNoaW5lICoqb2xkVm1zID0gdm1zOwotCXZtcyA9IG5ld1ZtczsgLy8gdm1zIG11c3QgYWx3YXlzIGNvbnRhaW4gdmFsaWQgZGF0YQotCWRlbGV0ZVtdIG9sZFZtczsKLQkKLSAJLy8gcmVhbGxvY2F0ZSB0aGUgYWxsVk1EYXRhcwotIAlmb3IoVGhyZWFkKiBjdXI9cHJlcGFyZWRUaHJlYWRzLm5leHQoKTsgY3VyIT0mcHJlcGFyZWRUaHJlYWRzOyBjdXI9Y3VyLT5uZXh0KCkpIHsKLQkJY3VyLT5yZWFsbG9jQWxsVm1zRGF0YShyZXMsIHZtc0FycmF5U2l6ZSk7Ci0JfQotCi0gCWZvcihUaHJlYWQqIGN1cj1ydW5uaW5nVGhyZWFkcy5uZXh0KCk7IGN1ciE9JnJ1bm5pbmdUaHJlYWRzOyBjdXI9Y3VyLT5uZXh0KCkpIHsKLQkJY3VyLT5yZWFsbG9jQWxsVm1zRGF0YShyZXMsIHZtc0FycmF5U2l6ZSk7Ci0JfQotCi0Jdm1raXRVbmxvY2soKTsKLQotCXJldHVybiByZXM7Ci19Ci0KLXZvaWQgVk1LaXQ6OnJlbW92ZVZNKHNpemVfdCBpZCkgewotCWRwcmludGYoInJlbW92ZSB2bTogJXBcbiIsIHZtKTsKLQkvLyBJIHRoaW5rIHRoYXQgd2Ugb25seSBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gYWxsIHRoZSB0aHJlYWQgZGF0YSBhcmUgcmVsZWFzZWQKLQl2bXNbaWRdID0gMDsKLX0KLQotdm9pZCBWTUtpdDo6cmVnaXN0ZXJQcmVwYXJlZFRocmVhZChtdm06OlRocmVhZCogdGgpIHsKLQlkcHJpbnRmKCJDcmVhdGUgdGhyZWFkOiAlcFxuIiwgdGgpOwotCXZta2l0TG9jaygpOwotCXRoLT5hcHBlbmRUbygmcHJlcGFyZWRUaHJlYWRzKTsKLQl0aC0+cmVhbGxvY0FsbFZtc0RhdGEoMCwgdm1zQXJyYXlTaXplKTsKLQl2bWtpdFVubG9jaygpOwotfQotICAKLXZvaWQgVk1LaXQ6OnVucmVnaXN0ZXJQcmVwYXJlZFRocmVhZChtdm06OlRocmVhZCogdGgpIHsKLQlkcHJpbnRmKCJEZWxldGUgdGhyZWFkOiAlcFxuIiwgdGgpOwotCXZta2l0TG9jaygpOwotCXRoLT5yZW1vdmUoKTsKLQlmb3Ioc2l6ZV90IGk9MDsgaTx2bXNBcnJheVNpemU7IGkrKykKLQkJaWYodGgtPmFsbFZtc0RhdGFbaV0pCi0JCQlkZWxldGUgdGgtPmFsbFZtc0RhdGFbaV07Ci0JZGVsZXRlIHRoLT5hbGxWbXNEYXRhOwotCXZta2l0VW5sb2NrKCk7Ci19Ci0KLXZvaWQgVk1LaXQ6OnJlZ2lzdGVyUnVubmluZ1RocmVhZChtdm06OlRocmVhZCogdGgpIHsKLQlkcHJpbnRmKCJSZWdpc3RlciB0aHJlYWQ6ICVwXG4iLCB0aCk7Ci0Jdm1raXRMb2NrKCk7Ci0JbnVtYmVyT2ZSdW5uaW5nVGhyZWFkcysrOwotCXRoLT5yZW1vdmUoKTsKLQl0aC0+YXBwZW5kVG8oJnJ1bm5pbmdUaHJlYWRzKTsKLQl2bWtpdFVubG9jaygpOwotfQotICAKLXZvaWQgVk1LaXQ6OnVucmVnaXN0ZXJSdW5uaW5nVGhyZWFkKG12bTo6VGhyZWFkKiB0aCkgewotCWRwcmludGYoIlVucmVnaXN0ZXIgdGhyZWFkOiAlcFxuIiwgdGgpOwotCXZta2l0TG9jaygpOwotCW51bWJlck9mUnVubmluZ1RocmVhZHMtLTsKLQl0aC0+cmVtb3ZlKCk7Ci0JdGgtPmFwcGVuZFRvKCZwcmVwYXJlZFRocmVhZHMpOwotCXZta2l0VW5sb2NrKCk7Ci19Ci0KLXZvaWQgVk1LaXQ6OndhaXROb25EYWVtb25UaHJlYWRzKCkgeyAKLQlub25EYWVtb25UaHJlYWRzTWFuYWdlci53YWl0Tm9uRGFlbW9uVGhyZWFkcygpOwotfQotCi12b2lkIE5vbkRhZW1vblRocmVhZE1hbmFnZXI6OmxlYXZlTm9uRGFlbW9uTW9kZSgpIHsKLSAgbm9uRGFlbW9uTG9jay5sb2NrKCk7Ci0gIC0tbm9uRGFlbW9uVGhyZWFkczsKLSAgaWYgKG5vbkRhZW1vblRocmVhZHMgPT0gMCkgbm9uRGFlbW9uVmFyLnNpZ25hbCgpOwotICBub25EYWVtb25Mb2NrLnVubG9jaygpOyAgCi19Ci0KLXZvaWQgTm9uRGFlbW9uVGhyZWFkTWFuYWdlcjo6ZW50ZXJOb25EYWVtb25Nb2RlKCkgewotICBub25EYWVtb25Mb2NrLmxvY2soKTsKLSAgKytub25EYWVtb25UaHJlYWRzOwotICBub25EYWVtb25Mb2NrLnVubG9jaygpOyAgCi19Ci0KLXZvaWQgTm9uRGFlbW9uVGhyZWFkTWFuYWdlcjo6d2FpdE5vbkRhZW1vblRocmVhZHMoKSB7Ci0gIG5vbkRhZW1vbkxvY2subG9jaygpOwotCi0gIHdoaWxlIChub25EYWVtb25UaHJlYWRzKSB7Ci0gICAgbm9uRGFlbW9uVmFyLndhaXQoJm5vbkRhZW1vbkxvY2spOwotICB9Ci0gIAotICBub25EYWVtb25Mb2NrLnVubG9jaygpOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL012bS9SdW50aW1lL1ZpcnR1YWxNYWNoaW5lLmNwcCBiL3Zta2l0L2xpYi9Ndm0vUnVudGltZS9WaXJ0dWFsTWFjaGluZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YWJmMDYuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL012bS9SdW50aW1lL1ZpcnR1YWxNYWNoaW5lLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSNpbmNsdWRlICJtdm0vVmlydHVhbE1hY2hpbmUuaCIKLSNpbmNsdWRlICJtdm0vVk1LaXQuaCIKLSNpbmNsdWRlICJNdXRhdG9yVGhyZWFkLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBtdm07Ci0KLVZpcnR1YWxNYWNoaW5lOjpWaXJ0dWFsTWFjaGluZShtdm06OkJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jLCBtdm06OlZNS2l0KiB2bWspIDoJYWxsb2NhdG9yKEFsbG9jKSB7Ci0Jdm1raXQgPSB2bWs7Ci0Jdm1JRCA9IHZta2l0LT5hZGRWTSh0aGlzKTsKLX0KLQotVmlydHVhbE1hY2hpbmU6On5WaXJ0dWFsTWFjaGluZSgpIHsKLQl2bWtpdC0+cmVtb3ZlVk0odm1JRCk7Ci19Ci0KLWNsYXNzIExhdW5jaGVyVGhyZWFkIDogcHVibGljIE11dGF0b3JUaHJlYWQgewotcHVibGljOgotIAl2b2lkICAgICAgICAgICgqcmVhbFN0YXJ0KShWaXJ0dWFsTWFjaGluZSosIGludCwgY2hhcioqKTsKLSAJVmlydHVhbE1hY2hpbmUqIHZtOwotIAlpbnQgICAgICAgICAgICAgYXJnYzsKLSAJY2hhcioqICAgICAgICAgIGFyZ3Y7Ci0KLSAJTGF1bmNoZXJUaHJlYWQoVk1LaXQqIHZta2l0LCB2b2lkICgqcykoVmlydHVhbE1hY2hpbmUqLCBpbnQsIGNoYXIqKiksIFZpcnR1YWxNYWNoaW5lKiB2LCBpbnQgYWMsIGNoYXIqKiBhdikgOiBNdXRhdG9yVGhyZWFkKHZta2l0KSB7Ci0gCQlyZWFsU3RhcnQgPSBzOwotIAkJdm0gPSB2OwotIAkJYXJnYyA9IGFjOwotIAkJYXJndiA9IGF2OwotIAl9Ci0KLSAJc3RhdGljIHZvaWQgbGF1bmNoKExhdW5jaGVyVGhyZWFkKiB0aCkgewotIAkJaWYodGgtPnJlYWxTdGFydCkKLSAJCQl0aC0+cmVhbFN0YXJ0KHRoLT52bSwgdGgtPmFyZ2MsIHRoLT5hcmd2KTsKLSAJCWVsc2UKLSAJCQl0aC0+dm0tPnJ1bkFwcGxpY2F0aW9uSW1wbCh0aC0+YXJnYywgdGgtPmFyZ3YpOwotIAl9Ci19OwotCi12b2lkIFZpcnR1YWxNYWNoaW5lOjpydW5BcHBsaWNhdGlvbih2b2lkICgqc3RhcnRlcikoVmlydHVhbE1hY2hpbmUqLCBpbnQsIGNoYXIqKiksIGludCBhcmdjLCBjaGFyICoqYXJndikgewotCShuZXcgTGF1bmNoZXJUaHJlYWQodm1raXQsIHN0YXJ0ZXIsIHRoaXMsIGFyZ2MsIGFyZ3YpKS0+c3RhcnQoKHZvaWQgKCopKFRocmVhZCopKUxhdW5jaGVyVGhyZWFkOjpsYXVuY2gpOwotfQotCi12b2lkIFZpcnR1YWxNYWNoaW5lOjpydW5BcHBsaWNhdGlvbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLQlydW5BcHBsaWNhdGlvbigwLCBhcmdjLCBhcmd2KTsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9Ndm0vU3RhdGljR0NQYXNzL01ha2VmaWxlIGIvdm1raXQvbGliL012bS9TdGF0aWNHQ1Bhc3MvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NmY5ZGMuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL012bS9TdGF0aWNHQ1Bhc3MvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIz09PS0gbGliL012bS9TdGF0aWNHQ1Bhc3MvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIwotIwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotIwotIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLSMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotIwotIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKLQotTEVWRUwgPSAuLi8uLi8uLgotTElCUkFSWU5BTUUgPSBTdGF0aWNHQ1Bhc3MKLUxPQURBQkxFX01PRFVMRSA9IDEKLVVTRURMSUJTID0KLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KLQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL012bS9TdGF0aWNHQ1Bhc3MvU3RhdGljR0NQYXNzLmNwcCBiL3Zta2l0L2xpYi9Ndm0vU3RhdGljR0NQYXNzL1N0YXRpY0dDUGFzcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NmM2YWQuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL012bS9TdGF0aWNHQ1Bhc3MvU3RhdGljR0NQYXNzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8vPT09LS0tLSBTdGF0aWNHQ1Bhc3MuY3BwIC0gUHV0IEdDIGluZm9ybWF0aW9uIGluIGZ1bmN0aW9ucyBjb21waWxlZCAtLS0tLS0tLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHdpdGggbGx2bS1nY2MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotCi0jaW5jbHVkZSAibGx2bS9JbnRyaW5zaWNzLmgiCi0jaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKLSNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKLQotI2luY2x1ZGUgPGNzdGRpbz4KLQotdXNpbmcgbmFtZXNwYWNlIGxsdm07Ci0KLW5hbWVzcGFjZSB7Ci0KLSAgY2xhc3MgU3RhdGljR0NQYXNzIDogcHVibGljIE1vZHVsZVBhc3MgewotICBwdWJsaWM6Ci0gICAgc3RhdGljIGNoYXIgSUQ7Ci0gICAgCi0gICAgU3RhdGljR0NQYXNzKCkgOiBNb2R1bGVQYXNzKElEKSB7fQotCi0gICAgdmlydHVhbCBib29sIHJ1bk9uTW9kdWxlKE1vZHVsZSYgTSk7Ci0KLSAgICAvLy8gZ2V0QW5hbHlzaXNVc2FnZSAtIFdlIGRvIG5vdCBtb2RpZnkgYW55dGhpbmcuCi0gICAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IHsKLSAgICAgIEFVLnNldFByZXNlcnZlc0FsbCgpOwotICAgIH0gCi0KLSAgfTsKLQotICBjaGFyIFN0YXRpY0dDUGFzczo6SUQgPSAwOwotICBSZWdpc3RlclBhc3M8U3RhdGljR0NQYXNzPiBYKCJTdGF0aWNHQ1Bhc3MiLAotICAgICAgICAgICAgICAgICAgICAgICJBZGQgR0MgaW5mb3JtYXRpb24gaW4gZmlsZXMgY29tcGlsZWQgd2l0aCBsbHZtLWdjYyIpOwotCi1ib29sIFN0YXRpY0dDUGFzczo6cnVuT25Nb2R1bGUoTW9kdWxlJiBNKSB7Ci0KLSAgRnVuY3Rpb24qIEYgPSBNLmdldEZ1bmN0aW9uKCJfX2xsdm1fZ2Nyb290Iik7Ci0gIEZ1bmN0aW9uICpnY3Jvb3RGdW4gPSBJbnRyaW5zaWM6OmdldERlY2xhcmF0aW9uKCZNLCBJbnRyaW5zaWM6Omdjcm9vdCk7Ci0KLSAgaWYgKEYpIHsKLSAgICBGLT5yZXBsYWNlQWxsVXNlc1dpdGgoZ2Nyb290RnVuKTsKLSAgICBGLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgfQotCi0gIGJvb2wgZXJyb3IgPSBmYWxzZTsKLSAgZm9yIChWYWx1ZTo6dXNlX2l0ZXJhdG9yIEkgPSBnY3Jvb3RGdW4tPnVzZV9iZWdpbigpLAotICAgICAgIEUgPSBnY3Jvb3RGdW4tPnVzZV9lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICBpZiAoSW5zdHJ1Y3Rpb24qIElJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KCpJKSkgewotICAgICAgRnVuY3Rpb24qIEYgPSBJSS0+Z2V0UGFyZW50KCktPmdldFBhcmVudCgpOwotICAgICAgaWYgKEYtPmhhc0dDKCkpIEYtPmNsZWFyR0MoKTsKLSAgICAgIEYtPnNldEdDKCJvY2FtbCIpOwotICAgIH0KLSAgfQotCi0gIGZvciAoTW9kdWxlOjppdGVyYXRvciBJID0gTS5iZWdpbigpLCBFID0gTS5lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICBpZiAoSS0+aGFzR0MoKSAmJiBJLT5oYXNJbnRlcm5hbExpbmthZ2UoKSkgewotICAgICAgZXJyb3IgPSB0cnVlOwotICAgICAgZnByaW50ZihzdGRlcnIsICJNZXRob2QgJXMgaGFzIHN0YXRpYyBsaW5rYWdlIGJ1dCB1c2VzIGdjX3Jvb3QuICIKLSAgICAgICAgICAgICAgICAgICAgICAiRnVuY3Rpb25zIHVzaW5nIGdjX3Jvb3Qgc2hvdWxkIG5vdCBoYXZlIHN0YXRpYyBsaW5rYWdlLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICBJLT5nZXROYW1lKCkuZGF0YSgpKTsKLSAgICB9Ci0gICAgaWYgKEktPmhhc0dDKCkgJiYgIXN0cmNtcChJLT5nZXRHQygpLCAidm1raXQiKSkgSS0+c2V0R0MoIm9jYW1sIik7Ci0gIH0KLQotICBpZiAoZXJyb3IpIGFib3J0KCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9OMy9MTFZNUnVudGltZS9NYWtlZmlsZSBiL3Zta2l0L2xpYi9OMy9MTFZNUnVudGltZS9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVhZmM2Zi4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTjMvTExWTVJ1bnRpbWUvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIz09PS0gbGliL04zL0xMVk1SdW50aW1lL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIwotIyAKLSMgICAgICAgICAgICAgICAgICAgICBUaGUgdm1raXQgcHJvamVjdAotIwotIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLSMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotIyAKLSMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCi1MRVZFTCA9IC4uLy4uLy4uCi0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29uZmlnCi0KLVZNS0lUX1JVTlRJTUUgPSAkKFBST0pfU1JDX1JPT1QpL2xpYi9OMy9MTFZNUnVudGltZS9ydW50aW1lLmxsCi1CVUlMVF9TT1VSQ0VTID0gTExWTVJ1bnRpbWUuaW5jCi0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCmRpZmYgLS1naXQgYS92bWtpdC9saWIvTjMvTExWTVJ1bnRpbWUvcnVudGltZS5sbCBiL3Zta2l0L2xpYi9OMy9MTFZNUnVudGltZS9ydW50aW1lLmxsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDEwZTVjLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9OMy9MTFZNUnVudGltZS9ydW50aW1lLmxsCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotJUNMSU9iamVjdCA9IHR5cGUge2k4KiwgaTgqLCBpOCp9Ci0KLTs7OyBUeXBlcyBmb3IgQ0xJIGFycmF5cy4gQSBzaXplIG9mIDAgbWVhbnMgYW4gdW5kZWZpbmVkIHNpemUuCi0lQ0xJQXJyYXkgPSB0eXBlIHsgJUNMSU9iamVjdCwgaTMyIH0KLSVBcnJheUJvb2xlYW4gPSB0eXBlIHsgJUNMSU9iamVjdCwgaTMyLCBbMCB4IGk4XSB9Ci0lQXJyYXlVSW50OCAgID0gdHlwZSB7ICVDTElPYmplY3QsIGkzMiwgWzAgeCBpOF0gfQotJUFycmF5U0ludDggICA9IHR5cGUgeyAlQ0xJT2JqZWN0LCBpMzIsIFswIHggaThdIH0KLSVBcnJheUNoYXIgICAgPSB0eXBlIHsgJUNMSU9iamVjdCwgaTMyLCBbMCB4IGkxNl0gfQotJUFycmF5U0ludDE2ICA9IHR5cGUgeyAlQ0xJT2JqZWN0LCBpMzIsIFswIHggaTE2XSB9Ci0lQXJyYXlVSW50MTYgID0gdHlwZSB7ICVDTElPYmplY3QsIGkzMiwgWzAgeCBpMTZdIH0KLSVBcnJheVNJbnQzMiAgPSB0eXBlIHsgJUNMSU9iamVjdCwgaTMyLCBbMCB4IGkzMl0gfQotJUFycmF5VUludDMyICA9IHR5cGUgeyAlQ0xJT2JqZWN0LCBpMzIsIFswIHggaTMyXSB9Ci0lQXJyYXlTSW50NjQgID0gdHlwZSB7ICVDTElPYmplY3QsIGkzMiwgWzAgeCBpNjRdIH0KLSVBcnJheVVJbnQ2NCAgPSB0eXBlIHsgJUNMSU9iamVjdCwgaTMyLCBbMCB4IGk2NF0gfQotJUFycmF5SW50UHRyICA9IHR5cGUgeyAlQ0xJT2JqZWN0LCBpMzIsIFswIHggaTMyKl0gfQotJUFycmF5VUludFB0ciA9IHR5cGUgeyAlQ0xJT2JqZWN0LCBpMzIsIFswIHggaTMyKl0gfQotJUFycmF5RmxvYXQgICA9IHR5cGUgeyAlQ0xJT2JqZWN0LCBpMzIsIFswIHggZmxvYXRdIH0KLSVBcnJheURvdWJsZSAgPSB0eXBlIHsgJUNMSU9iamVjdCwgaTMyLCBbMCB4IGRvdWJsZV0gfQotJUFycmF5T2JqZWN0ICA9IHR5cGUgeyAlQ0xJT2JqZWN0LCBpMzIsIFswIHggJUNMSU9iamVjdCpdIH0KLQotJUNhY2hlTm9kZSA9IHR5cGUge2k4KiwgaTgqLCBpOCosIGk4KiwgaTgqLCBpMX0KLQotJUVudmVsb3BwZSA9IHR5cGUge2k4KiwgJUNhY2hlTm9kZSosIGk4KiwgaTgqfQotCi1kZWNsYXJlIHZvaWQgQE1hcmtBbmRUcmFjZSglQ0xJT2JqZWN0KikKLWRlY2xhcmUgdm9pZCBAQ0xJT2JqZWN0VHJhY2VyKCVDTElPYmplY3QqKQotCi1kZWNsYXJlICVDTElPYmplY3QqIEBpbml0aWFsaXNlQ2xhc3MoaTgqKQotCi1kZWNsYXJlICVDYWNoZU5vZGUqIEBuM1ZpcnR1YWxMb29rdXAoJUNhY2hlTm9kZSosICVDTElPYmplY3QqKQotCi1kZWNsYXJlICVDTElPYmplY3QqIEBuZXdBcnJheShpOCosIGkzMikKLWRlY2xhcmUgJUNMSU9iamVjdCogQG5ld09iamVjdChpOCopCi1kZWNsYXJlICVDTElPYmplY3QqIEBuZXdNdWx0aUFycmF5KGk4KikKLWRlY2xhcmUgJUNMSU9iamVjdCogQG5ld1N0cmluZyhpOCopCi0KLWRlY2xhcmUgJUNMSU9iamVjdCogQGluaXRpYWxpc2VPYmplY3QoaTgqLCBpMzIpIHJlYWRub25lCi0KLWRlY2xhcmUgaTMyIEBhcnJheUxlbmd0aCglQ0xJQXJyYXkqKSByZWFkbm9uZQotCi1kZWNsYXJlIHZvaWQgQG4zTnVsbFBvaW50ZXJFeGNlcHRpb24oKQotZGVjbGFyZSB2b2lkIEBuM0NsYXNzQ2FzdEV4Y2VwdGlvbigpCi1kZWNsYXJlIHZvaWQgQGluZGV4T3V0T2ZCb3VuZHMoJUNMSU9iamVjdCosIGkzMikKLQotZGVjbGFyZSB2b2lkIEBUaHJvd0V4Y2VwdGlvbiglQ0xJT2JqZWN0KikKLWRlY2xhcmUgdm9pZCBAQ2xlYXJFeGNlcHRpb24oKQotZGVjbGFyZSBpOCogQEdldENwcEV4Y2VwdGlvbigpCi1kZWNsYXJlICVDTElPYmplY3QqIEBHZXRDTElFeGNlcHRpb24oKQotZGVjbGFyZSBpMSBAQ29tcGFyZUV4Y2VwdGlvbihpOCopCi0KLWRlY2xhcmUgaTMyIEBuM0luc3RhbmNlT2YoJUNMSU9iamVjdCosIGk4KikKLQotOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKLTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7IERlYnVnZ2luZyBtZXRob2RzIDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ci07Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OwotCi1kZWNsYXJlIHZvaWQgQG4zUHJpbnRFeGVjdXRpb24oaTMyLCBpMzIpCi0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9OMy9NYWtlZmlsZSBiL3Zta2l0L2xpYi9OMy9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY2OWFlOC4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTjMvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIz09PS0gbGliL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIwotIyAKLSMgICAgICAgICAgICAgICAgICAgICBUaGUgdm1raXQgcHJvamVjdAotIwotIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLSMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotIyAKLSMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCi1MRVZFTCA9IC4uLy4uCi0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29uZmlnCi0KLURJUlMgPSBMTFZNUnVudGltZSBWTUNvcmUKLQotaWZlcSAoJChXSVRIX04zX01PTk8pLCAxKSAKLSAgICBESVJTICs9IE1vbm8KLWVuZGlmCi0KLWlmZXEgKCQoV0lUSF9OM19QTkVUTElCKSwgMSkgCi0gICAgRElSUyArPSBQTmV0TGliCi1lbmRpZgotCi1FWFRSQV9ESVNUID0gTW9ubyBQTmV0TGliCi0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCmRpZmYgLS1naXQgYS92bWtpdC9saWIvTjMvTW9uby9MSUNFTlNFLlRYVCBiL3Zta2l0L2xpYi9OMy9Nb25vL0xJQ0VOU0UuVFhUCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjdkYTdiLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9OMy9Nb25vL0xJQ0VOU0UuVFhUCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVZNS2l0IE1vbm8gcnVudGltZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUFsbCBmaWxlcyBhcmUgbGljZW5zZWQgdW5kZXIgdGhlIFZNS2l0IGxpY2Vuc2Ugd2l0aCB0aGUgZm9sbG93aW5nIGFkZGl0aW9uczoKLQotdm1raXQvbGliL04zL01vbm8vTW9uby5jcHAKLQotICAgICAgICBUaGlzIGNvZGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTEdQTCBvciBjb21tZXJjaWFsIGxpY2Vuc2VzLgotCi0gICAgICAgIFRoZSBMR1BMIGVuc3VyZXMgdGhhdCBNb25vIGNhbiBiZSB1c2VkIGluIG1vc3Qgc2NlbmFyaW9zLCBidXQKLSAgICAgICAgZ2l2ZXMgTm92ZWxsIHRoZSBmbGV4aWJpbGl0eSB0byByZWxpY2Vuc2UgdGhlIGNvZGUgZm9yIGVtYmVkZGVkCi0gICAgICAgIHN5c3RlbXMgb3IgY29tbWVyY2lhbCBzZXR0aW5ncyB3aGVyZSB0aGUgTEdQTCBjYW4gbm90IGJlIHVzZWQuCi0KLSAgICAgICAgQ29udGFjdCBtb25vQG5vdmVsbC5jb20gZm9yIGRldGFpbHMgb24gb2J0YWluaW5nIHRoZSBNb25vCi0gICAgICAgIHJ1bnRpbWUgdW5kZXIgb3RoZXIgdGVybXMuCi0gICAgICAgIAotICAgICAgICAoQykgMjAwOCBYaW1pYW4sIEluYy4gIGh0dHA6Ly93d3cueGltaWFuLmNvbQotCi12bWtpdC9saWIvTjMvTW9uby9udW1iZXItZm9ybWF0dGVyLmgKLQotICAgICAgICBUaGlzIGZpbGUgaXMgdW5kZXIgdGhlIE1vbm8gTGljZW5zZS4KLSAgICAgICAgKEMpIDIwMDggWGltaWFuLCBJbmMuICBodHRwOi8vd3d3LnhpbWlhbi5jb20KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9OMy9Nb25vL01ha2VmaWxlIGIvdm1raXQvbGliL04zL01vbm8vTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMDU1MjguLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL04zL01vbm8vTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIz09PS0gbGliL04zL01vbm8vTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIwotIyAKLSMgICAgICAgICAgICAgICAgICAgICBUaGUgdm1raXQgcHJvamVjdAotIwotIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLSMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotIyAKLSMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCi1MRVZFTCA9IC4uLy4uLy4uCi0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29uZmlnCi0KLWlmZXEgKCQoV0lUSF9MTFZNX0dDQyksIDEpCi0gIE1PRFVMRV9OQU1FID0gTW9ubwotZWxzZQotICBMSUJSQVJZTkFNRSA9IE1vbm8KLWVuZGlmCi0KLUVYVFJBX0RJU1QgPSBNb25vUGF0aC5pbmMuaW4KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCi1DWFguRmxhZ3MgKz0gLUkkKFBST0pfU1JDX0RJUikvLi4vVk1Db3JlCi0KLUNYWC5GbGFncyArPSBgcGtnLWNvbmZpZyAtLWNmbGFncyBnbGliLTIuMCBndGhyZWFkLTIuMGAKLUNYWC5GbGFncyArPSBgcGtnLWNvbmZpZyAtLWNmbGFncyBnbW9kdWxlLTIuMGAKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9OMy9Nb25vL01vbm8uY3BwIGIvdm1raXQvbGliL04zL01vbm8vTW9uby5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2OTlhMTYuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL04zL01vbm8vTW9uby5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNzQgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLSBNb25vLmNwcCAtIFRoZSBNb25vIGludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4zCi0vLwotLy8gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIExpY2Vuc2UKLS8vIGFuZCB0aGUgTW9ubyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLyBUaGUgZmlsZSBhbHNvIGhhcyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgY29weXJpZ2h0OgotLy8KLS8vIChDKSAyMDA4IFhpbWlhbiwgSW5jLiAgaHR0cDovL3d3dy54aW1pYW4uY29tCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgIm12bS9KSVQuaCIKLQotI2luY2x1ZGUgIkFzc2VtYmx5LmgiCi0jaW5jbHVkZSAiTW9ub1N0cmluZy5oIgotI2luY2x1ZGUgIk1TQ29ybGliLmgiCi0jaW5jbHVkZSAiTjMuaCIKLSNpbmNsdWRlICJSZWFkZXIuaCIKLSNpbmNsdWRlICJWTUFycmF5LmgiCi0jaW5jbHVkZSAiVk1DbGFzcy5oIgotI2luY2x1ZGUgIlZNT2JqZWN0LmgiCi0jaW5jbHVkZSAiVk1UaHJlYWQuaCIKLQotI2luY2x1ZGUgPGdsaWIuaD4KLQotI2luY2x1ZGUgIm51bWJlci1mb3JtYXR0ZXIuaCIKLQotI2luY2x1ZGUgIk1vbm9QYXRoLmluYyIKLQotdXNpbmcgbmFtZXNwYWNlIG4zOwotCi1leHRlcm4gIkMiIGludCBTeXN0ZW1fRW52aXJvbm1lbnRfZ2V0X1BsYXRmb3JtICh2b2lkKSB7Ci0jaWYgZGVmaW5lZCAoUExBVEZPUk1fV0lOMzIpCi0JLyogV2luMzJOVCAqLwotCXJldHVybiAyOwotI2Vsc2UKLQkvKiBVbml4ICovCi0JcmV0dXJuIDEyODsKLSNlbmRpZgotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqZW5jb2RpbmdzIFtdID0gewotCShjaGFyICopIDEsCi0JCSJhc2NpaSIsICJ1c19hc2NpaSIsICJ1cyIsICJhbnNpX3gzLjRfMTk2OCIsCi0JCSJhbnNpX3gzLjRfMTk4NiIsICJjcDM2NyIsICJjc2FzY2lpIiwgImlibTM2NyIsCi0JCSJpc29faXJfNiIsICJpc282NDZfdXMiLCAiaXNvXzY0Ni5pcnY6MTk5MSIsCi0JKGNoYXIgKikgMiwKLQkJInV0Zl83IiwgImNzdW5pY29kZTExdXRmNyIsICJ1bmljb2RlXzFfMV91dGZfNyIsCi0JCSJ1bmljb2RlXzJfMF91dGZfNyIsICJ4X3VuaWNvZGVfMV8xX3V0Zl83IiwKLQkJInhfdW5pY29kZV8yXzBfdXRmXzciLAotCShjaGFyICopIDMsCi0JCSJ1dGZfOCIsICJ1bmljb2RlXzFfMV91dGZfOCIsICJ1bmljb2RlXzJfMF91dGZfOCIsCi0JCSJ4X3VuaWNvZGVfMV8xX3V0Zl84IiwgInhfdW5pY29kZV8yXzBfdXRmXzgiLAotCShjaGFyICopIDQsCi0JCSJ1dGZfMTYiLCAiVVRGXzE2TEUiLCAidWNzXzIiLCAidW5pY29kZSIsCi0JCSJpc29fMTA2NDZfdWNzMiIsCi0JKGNoYXIgKikgNSwKLQkJInVuaWNvZGVmZmZlIiwgInV0Zl8xNmJlIiwKLQkoY2hhciAqKSA2LAotCQkiaXNvXzg4NTlfMSIsCi0JKGNoYXIgKikgMAotfTsKLQotLyoKLSAqIFJldHVybnMgdGhlIGludGVybmFsIGNvZGVwYWdlLCBpZiB0aGUgdmFsdWUgb2YgImludF9jb2RlX3BhZ2UiIGlzCi0gKiAxIGF0IGVudHJ5LCBhbmQgd2UgY2FuIG5vdCBjb21wdXRlIGEgc3VpdGFibGUgY29kZSBwYWdlIG51bWJlciwKLSAqIHJldHVybnMgdGhlIGNvZGUgcGFnZSBhcyBhIHN0cmluZwotICovCi1leHRlcm4gIkMiIE1vbm9TdHJpbmcqCi1TeXN0ZW1fVGV4dF9FbmNvZGluZ19JbnRlcm5hbENvZGVQYWdlIChnaW50MzIgKmludF9jb2RlX3BhZ2UpIAotewotCWNvbnN0IGNoYXIgKmNzZXQ7Ci0JY29uc3QgY2hhciAqcDsKLQljaGFyICpjOwotCWNoYXIgKmNvZGVwYWdlID0gTlVMTDsKLQlpbnQgY29kZTsKLQlpbnQgd2FudF9uYW1lID0gKmludF9jb2RlX3BhZ2U7Ci0JaW50IGk7Ci0JCi0JKmludF9jb2RlX3BhZ2UgPSAtMTsKLQotCWdfZ2V0X2NoYXJzZXQgKCZjc2V0KTsKLQljID0gY29kZXBhZ2UgPSBzdHJkdXAgKGNzZXQpOwotCWZvciAoYyA9IGNvZGVwYWdlOyAqYzsgYysrKXsKLQkJaWYgKGlzYXNjaWkgKCpjKSAmJiBpc2FscGhhICgqYykpCi0JCQkqYyA9IHRvbG93ZXIgKCpjKTsKLQkJaWYgKCpjID09ICctJykKLQkJCSpjID0gJ18nOwotCX0KLQkvKiBnX3ByaW50ICgiY2hhcnNldDogJXNcbiIsIGNzZXQpOyAqLwotCQotCS8qIGhhbmRsZSBzb21lIGNvbW1vbiBhbGlhc2VzICovCi0JcCA9IGVuY29kaW5ncyBbMF07Ci0JY29kZSA9IDA7Ci0JZm9yIChpID0gMDsgcCAhPSAwOyApewotCQlpZiAoKGdzc2l6ZSkgcCA8IDcpewotCQkJY29kZSA9IChnc3NpemUpIHA7Ci0JCQlwID0gZW5jb2RpbmdzIFsrK2ldOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHN0cmNtcCAocCwgY29kZXBhZ2UpID09IDApewotCQkJKmludF9jb2RlX3BhZ2UgPSBjb2RlOwotCQkJYnJlYWs7Ci0JCX0KLQkJcCA9IGVuY29kaW5ncyBbKytpXTsKLQl9Ci0JCi0JaWYgKHN0cnN0ciAoY29kZXBhZ2UsICJ1dGZfOCIpICE9IE5VTEwpCi0JCSppbnRfY29kZV9wYWdlIHw9IDB4MTAwMDAwMDA7Ci0JZnJlZSAoY29kZXBhZ2UpOwotCQotCWlmICh3YW50X25hbWUgJiYgKmludF9jb2RlX3BhZ2UgPT0gLTEpIHsKLQkJTjMgKnZtID0gKE4zKilWTVRocmVhZDo6Z2V0KCktPmdldFZNKCk7Ci0JCWRlY2xhcmVfZ2Nyb290KEFycmF5Q2hhciosIGFycmF5X3JlcykgPSB2bS0+YXNjaWl6VG9BcnJheShjc2V0KTsKLQkJZGVjbGFyZV9nY3Jvb3QoTW9ub1N0cmluZyosIHJlcykgPSAoTW9ub1N0cmluZyopKHZtLT5hcnJheVRvU3RyaW5nKGFycmF5X3JlcykpOwotCQlyZXR1cm4gcmVzOwotCX0gZWxzZQotCQlyZXR1cm4gTlVMTDsKLX0KLQotZXh0ZXJuICJDIiB2b2lkIFN5c3RlbV9UaHJlYWRpbmdfTW9uaXRvcl9Nb25pdG9yX2V4aXQoVk1PYmplY3QqIG9iaikgewotICAvLyBUT0RPOiBUaGVyZSdzIGEgYnVnIGluIHRoZSBib290c3RyYXAsIHNlZSB3aHkKLQlsbHZtX2djcm9vdChvYmosIDApOwotICBpZiAoTG9ja09iajo6b3duZXIob2JqLT5sb2NrT2JqKSkgVk1PYmplY3Q6OnVubG9jayhvYmopOwotfQotCi1leHRlcm4gIkMiIGJvb2wgU3lzdGVtX1RocmVhZGluZ19Nb25pdG9yX01vbml0b3JfdHJ5X2VudGVyKFZNT2JqZWN0KiBvYmosIGludCBtcykgewotCWxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0JVk1PYmplY3Q6OmFxdWlyZShvYmopOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1leHRlcm4gIkMiIHZvaWQqIFN5c3RlbV9JT19Nb25vSU9fZ2V0X0NvbnNvbGVFcnJvcigpIHsKLSAgcmV0dXJuICh2b2lkKilzdGRlcnI7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCogU3lzdGVtX0lPX01vbm9JT19nZXRfQ29uc29sZU91dHB1dCgpIHsKLSAgcmV0dXJuICh2b2lkKilzdGRvdXQ7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCogU3lzdGVtX0lPX01vbm9JT19nZXRfQ29uc29sZUlucHV0KCkgewotICByZXR1cm4gKHZvaWQqKXN0ZGluOwotfQotCi1lbnVtIE1vbm9GaWxlVHlwZSB7Ci0gICAgVW5rbm93bj0weDAwMDAsCi0gICAgRGlzaz0weDAwMDEsCi0gICAgQ2hhcj0weDAwMDIsCi0gICAgUGlwZT0weDAwMDMsCi0gICAgUmVtb3RlPTB4ODAwMAotfTsgIAotCi1leHRlcm4gIkMiIE1vbm9GaWxlVHlwZSBTeXN0ZW1fSU9fTW9ub0lPX0dldEZpbGVUeXBlKHZvaWQqIGhhbmRsZSwgaW50KiBlcnJvcikgewotICBpZiAoaGFuZGxlID09ICh2b2lkKilzdGRpbiB8fCBoYW5kbGUgPT0gKHZvaWQqKXN0ZG91dCB8fCBoYW5kbGUgPT0gKHZvaWQqKXN0ZGVycikKLSAgICByZXR1cm4gQ2hhcjsKLSAgZWxzZQotICAgIHJldHVybiBVbmtub3duOwotfQotCi1leHRlcm4gIkMiIE1vbm9TdHJpbmcgKgotU3lzdGVtX0Vudmlyb25tZW50X2dldF9OZXdMaW5lICh2b2lkKQotewotCU4zICp2bSA9IChOMyopVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpOwotI2lmIGRlZmluZWQgKFBMQVRGT1JNX1dJTjMyKQotCWRlY2xhcmVfZ2Nyb290KEFycmF5Q2hhciosIGFycmF5KSA9IHZtLT5hc2NpaXpUb0FycmF5KCJcclxuIik7Ci0jZWxzZQotCWRlY2xhcmVfZ2Nyb290KEFycmF5Q2hhciosIGFycmF5KSA9IHZtLT5hc2NpaXpUb0FycmF5KCJcbiIpOwotI2VuZGlmCi0KLQlkZWNsYXJlX2djcm9vdChNb25vU3RyaW5nKiwgcmVzKSA9IChNb25vU3RyaW5nKil2bS0+YXJyYXlUb1N0cmluZyhhcnJheSk7Ci0JcmV0dXJuIHJlczsKLX0KLQotZXh0ZXJuICJDIiB2b2lkCi1TeXN0ZW1fU3RyaW5nX0ludGVybmFsQ29weVRvKE1vbm9TdHJpbmcqIHN0ciwgc2ludDMyIHNpbmRleCwgVk1BcnJheSogZGVzdCwgc2ludDMyIGRlc3RJbmRleCwgc2ludDMyIGNvdW50KSB7Ci0JbGx2bV9nY3Jvb3Qoc3RyLCAwKTsKLQlsbHZtX2djcm9vdChkZXN0LCAwKTsKLSAgZGVjbGFyZV9nY3Jvb3QoY29uc3QgQXJyYXlDaGFyKiwgY29udGVudHMpID0gc3RyLT52YWx1ZTsKLSAgbWVtY3B5KCZkZXN0LT5lbGVtZW50c1tkZXN0SW5kZXhdLCAmY29udGVudHMtPmVsZW1lbnRzW3NpbmRleF0sIGNvdW50ICogc2l6ZW9mKHVpbnQxNikpOwotfQotCi1leHRlcm4gIkMiIHVpbnQxNiBTeXN0ZW1fU3RyaW5nX2dldF9DaGFycyhNb25vU3RyaW5nKiBzdHIsIHNpbnQzMiBvZmZzZXQpIHsKLQlsbHZtX2djcm9vdChzdHIsIDApOwotICByZXR1cm4gc3RyLT52YWx1ZS0+ZWxlbWVudHNbb2Zmc2V0XTsKLX0KLQotc3RhdGljIHNpbnQzMiBieXRlTGVuZ3RoKFZNQXJyYXkqIGFycmF5KSB7Ci0JbGx2bV9nY3Jvb3QoYXJyYXksIDApOwotICBWTUNsYXNzQXJyYXkqIGNsID0gKFZNQ2xhc3NBcnJheSopYXJyYXktPmNsYXNzT2Y7Ci0gIFZNQ29tbW9uQ2xhc3MqIGJhc2UgPSBjbC0+YmFzZUNsYXNzOwotICB1aW50MzIgc2l6ZSA9IGJhc2UtPm5hdHVyYWxUeXBlLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCkgLyA4OyAgCi0gIHJldHVybiBhcnJheS0+c2l6ZSAqIHNpemU7Ci19Ci0KLWV4dGVybiAiQyIgYm9vbCBTeXN0ZW1fQnVmZmVyX0Jsb2NrQ29weUludGVybmFsIChWTUFycmF5KiBzcmMsIGludCBzcmNfb2Zmc2V0LCBWTUFycmF5KiBkZXN0LCBpbnQgZGVzdF9vZmZzZXQsIGludCBjb3VudCkgewotCWxsdm1fZ2Nyb290KHNyYywgMCk7Ci0JbGx2bV9nY3Jvb3QoZGVzdCwgMCk7Ci0gIHVpbnQ4ICpzcmNfYnVmLCAqZGVzdF9idWY7Ci0KLQkvKiB3YXRjaCBvdXQgZm9yIGludGVnZXIgb3ZlcmZsb3cgKi8KLQlpZiAoKHNyY19vZmZzZXQgPiBieXRlTGVuZ3RoKHNyYykgLSBjb3VudCkgfHwgKGRlc3Rfb2Zmc2V0ID4gYnl0ZUxlbmd0aChkZXN0KSAtIGNvdW50KSkKLQkJcmV0dXJuIGZhbHNlOwotCi0Jc3JjX2J1ZiA9ICh1aW50OCAqKXNyYy0+ZWxlbWVudHMgKyBzcmNfb2Zmc2V0OwotCWRlc3RfYnVmID0gKHVpbnQ4ICopZGVzdC0+ZWxlbWVudHMgKyBkZXN0X29mZnNldDsKLQotCWlmIChzcmMgIT0gZGVzdCkKLQkJbWVtY3B5IChkZXN0X2J1Ziwgc3JjX2J1ZiwgY291bnQpOwotCWVsc2UKLQkJbWVtbW92ZSAoZGVzdF9idWYsIHNyY19idWYsIGNvdW50KTsgLyogU291cmNlIGFuZCBkZXN0IGFyZSB0aGUgc2FtZSBhcnJheSAqLwotCi0JcmV0dXJuIHRydWU7Ci0KLX0KLQotZXh0ZXJuICJDIiBzaW50MzIgU3lzdGVtX0J1ZmZlcl9CeXRlTGVuZ3RoSW50ZXJuYWwoVk1BcnJheSogYXJyYXkpIHsKLQlsbHZtX2djcm9vdChhcnJheSwgMCk7Ci0gIHJldHVybiBieXRlTGVuZ3RoKGFycmF5KTsKLX0KLQotZXh0ZXJuICJDIiBzaW50MzIgCi1TeXN0ZW1fSU9fTW9ub0lPX1dyaXRlICh2b2lkKiBoYW5kbGUsIEFycmF5VUludDggKnNyYywKLQkJCQkgIHNpbnQzMiBzcmNfb2Zmc2V0LCBzaW50MzIgY291bnQsCi0JCQkJICBzaW50MzIgKmVycm9yKQotewotCWxsdm1fZ2Nyb290KHNyYywgMCk7Ci0gIGNoYXIqIGJ1ZmZlciA9IChjaGFyKilhbGxvY2EoIDEwMjQpOy8vKGNvdW50ICsgOCkgKiBzaXplb2YodWludDE2KSk7Ci0JdWludDMyIG4gPSAwOwotCi0JKmVycm9yID0gMDsKLQkKLQlpZiAoc3JjX29mZnNldCArIGNvdW50ID4gc3JjLT5zaXplKQotCQlyZXR1cm4gMDsKLSAgIAotICBtZW1jcHkoYnVmZmVyLCAoY2hhciopJihzcmMtPmVsZW1lbnRzW3NyY19vZmZzZXRdKSwgY291bnQpOwotICBidWZmZXJbY291bnRdID0gMDsKLQluID0gZnByaW50ZigoRklMRSopaGFuZGxlLCBidWZmZXIpOwotCi0JcmV0dXJuIChzaW50MzIpbjsKLX0KLQotLyogVGhlc2UgcGFyYW1ldGVycyBhcmUgInJlYWRvbmx5IiBpbiBjb3JsaWIvU3lzdGVtL051bWJlckZvcm1hdHRlci5jcyAqLwotZXh0ZXJuICJDIiB2b2lkCi1TeXN0ZW1fTnVtYmVyRm9ybWF0dGVyX0dldEZvcm1hdHRlclRhYmxlcyAoZ3VpbnQ2NCBjb25zdCAqKm1hbnRpc3NhcywKLQkJCQkJICAgIGdpbnQzMiBjb25zdCAqKmV4cG9uZW50cywKLQkJCQkJICAgIGd1bmljaGFyMiBjb25zdCAqKmRpZ2l0TG93ZXJUYWJsZSwKLQkJCQkJICAgIGd1bmljaGFyMiBjb25zdCAqKmRpZ2l0VXBwZXJUYWJsZSwKLQkJCQkJICAgIGdpbnQ2NCBjb25zdCAqKnRlblBvd2Vyc0xpc3QsCi0JCQkJCSAgICBnaW50MzIgY29uc3QgKipkZWNIZXhEaWdpdHMpCi17Ci0JKm1hbnRpc3NhcyA9IEZvcm1hdHRlcl9NYW50aXNzYUJpdHNUYWJsZTsKLQkqZXhwb25lbnRzID0gRm9ybWF0dGVyX1RlbnNFeHBvbmVudFRhYmxlOwotCSpkaWdpdExvd2VyVGFibGUgPSBGb3JtYXR0ZXJfRGlnaXRMb3dlclRhYmxlOwotCSpkaWdpdFVwcGVyVGFibGUgPSBGb3JtYXR0ZXJfRGlnaXRVcHBlclRhYmxlOwotCSp0ZW5Qb3dlcnNMaXN0ID0gRm9ybWF0dGVyX1RlblBvd2Vyc0xpc3Q7Ci0JKmRlY0hleERpZ2l0cyA9IEZvcm1hdHRlcl9EZWNIZXhEaWdpdHM7Ci19Ci0KLWV4dGVybiAiQyIgVk1PYmplY3QqIFN5c3RlbV9UaHJlYWRpbmdfVGhyZWFkX0N1cnJlbnRUaHJlYWRfaW50ZXJuYWwoKSB7Ci0JZGVjbGFyZV9nY3Jvb3QoVk1PYmplY3QqLCBhcHBUaHJlYWQpID0gVk1UaHJlYWQ6OmdldCgpLT5vb29fYXBwVGhyZWFkOwotICByZXR1cm4gYXBwVGhyZWFkOwotfQotCi1leHRlcm4gIkMiIFZNT2JqZWN0KgotU3lzdGVtX1RocmVhZGluZ19UaHJlYWRfR2V0Q2FjaGVkQ3VycmVudEN1bHR1cmUgKFZNT2JqZWN0ICpvYmopCi17Ci0JbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLQlyZXR1cm4gMDsKLX0KLQotZXh0ZXJuICJDIiBWTU9iamVjdCoKLVN5c3RlbV9UaHJlYWRpbmdfVGhyZWFkX0dldFNlcmlhbGl6ZWRDdXJyZW50Q3VsdHVyZSAoVk1PYmplY3QgKm9iaikKLXsKLQlsbHZtX2djcm9vdChvYmosIDApOwotCXJldHVybiAwOwotfQotCi1leHRlcm4gIkMiIFZNT2JqZWN0KiBTeXN0ZW1fT2JqZWN0X01lbWJlcndpc2VDbG9uZShWTU9iamVjdCogb2JqKSB7Ci0JbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgdWludDY0IHNpemUgPSBvYmotPm9iamVjdFNpemUoKTsKLSAgZGVjbGFyZV9nY3Jvb3QoVk1PYmplY3QqLCByZXMpID0gKChWTUNsYXNzKilvYmotPmNsYXNzT2YpLT5kb05ldygpOwotICBtZW1jcHkocmVzLCBvYmosIHNpemUpOwotICByZXMtPmxvY2tPYmogPSAwOwotICByZXR1cm4gcmVzOwotfQotCi1leHRlcm4gIkMiIGJvb2wKLVN5c3RlbV9HbG9iYWxpemF0aW9uX0N1bHR1cmVJbmZvX2NvbnN0cnVjdF9pbnRlcm5hbF9sb2NhbGVfZnJvbV9jdXJyZW50X2xvY2FsZSAoVk1PYmplY3QgKmNpKQotewotCWxsdm1fZ2Nyb290KGNpLCAwKTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZAotU3lzdGVtX1RocmVhZGluZ19UaHJlYWRfU2V0Q2FjaGVkQ3VycmVudEN1bHR1cmUgKFZNT2JqZWN0KiB0aHJlYWQsIFZNT2JqZWN0ICpjdWx0dXJlKQotewotCWxsdm1fZ2Nyb290KHRocmVhZCwgMCk7Ci0JbGx2bV9nY3Jvb3QoY3VsdHVyZSwgMCk7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZAotU3lzdGVtX1N0cmluZ19fY3RvcihNb25vU3RyaW5nKiBzdHIsIEFycmF5Q2hhciogYXJyYXksIHNpbnQzMiBzdGFydEluZGV4LCBzaW50MzIgY291bnQpIHsKLQlsbHZtX2djcm9vdChzdHIsIDApOwotCWxsdm1fZ2Nyb290KGFycmF5LCAwKTsKLSAgTjMqIHZtID0gVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpOwotICBkZWNsYXJlX2djcm9vdChjb25zdCBBcnJheUNoYXIqLCB2YWx1ZSkgPSB2bS0+YnVmVG9BcnJheSgmKGFycmF5LT5lbGVtZW50c1tzdGFydEluZGV4XSksIGNvdW50KTsKLSAgc3RyLT5sZW5ndGggPSBjb3VudDsKLSAgc3RyLT5zdGFydENoYXIgPSBhcnJheS0+ZWxlbWVudHNbc3RhcnRJbmRleF07Ci0gIHN0ci0+dmFsdWUgPSB2YWx1ZTsKLX0KLQotZXh0ZXJuICJDIiBNb25vU3RyaW5nICogCi1TeXN0ZW1fU3RyaW5nX0ludGVybmFsSm9pbiAoTW9ub1N0cmluZyAqc2VwYXJhdG9yLCBWTUFycmF5ICogdmFsdWUsIHNpbnQzMiBzaW5kZXgsIHNpbnQzMiBjb3VudCkKLXsKLQlsbHZtX2djcm9vdChzZXBhcmF0b3IsIDApOwotCWxsdm1fZ2Nyb290KHZhbHVlLCAwKTsKLQlkZWNsYXJlX2djcm9vdChNb25vU3RyaW5nKiwgY3VycmVudCkgPSAwOwotCXNpbnQzMiBsZW5ndGg7Ci0Jc2ludDMyIHBvczsKLQlzaW50MzIgaW5zZXJ0bGVuOwotCXNpbnQzMiBkZXN0cG9zOwotCXNpbnQzMiBzcmNsZW47Ci0gIGNvbnN0IHVpbnQxNiAqaW5zZXJ0OwotCWNvbnN0IHVpbnQxNiAqc3JjOwotCXVpbnQxNiAqZGVzdDsKLQotCWluc2VydCA9IHNlcGFyYXRvci0+dmFsdWUtPmVsZW1lbnRzOwotCWluc2VydGxlbiA9IHNlcGFyYXRvci0+bGVuZ3RoOwotCi0JbGVuZ3RoID0gMDsKLQlmb3IgKHBvcyA9IHNpbmRleDsgcG9zICE9IHNpbmRleCArIGNvdW50OyBwb3MrKykgewotCQljdXJyZW50ID0gKE1vbm9TdHJpbmcqKXZhbHVlLT5lbGVtZW50c1twb3NdOwotCQlpZiAoY3VycmVudCAhPSBOVUxMKQotCQkJbGVuZ3RoICs9IGN1cnJlbnQtPmxlbmd0aDsKLQotCQlpZiAocG9zIDwgc2luZGV4ICsgY291bnQgLSAxKQotCQkJbGVuZ3RoICs9IGluc2VydGxlbjsKLQl9Ci0KLQlkZXN0ID0gKHVpbnQxNiopYWxsb2NhKGxlbmd0aCAqIHNpemVvZih1aW50MTYpKTsKLQlkZXN0cG9zID0gMDsKLQotCWZvciAocG9zID0gc2luZGV4OyBwb3MgIT0gc2luZGV4ICsgY291bnQ7IHBvcysrKSB7Ci0JCWN1cnJlbnQgPSAoTW9ub1N0cmluZyopdmFsdWUtPmVsZW1lbnRzW3Bvc107Ci0JCWlmIChjdXJyZW50ICE9IE5VTEwpIHsKLQkJCXNyYyA9IGN1cnJlbnQtPnZhbHVlLT5lbGVtZW50czsKLQkJCXNyY2xlbiA9IGN1cnJlbnQtPmxlbmd0aDsKLQotCQkJbWVtY3B5IChkZXN0ICsgZGVzdHBvcywgc3JjLCBzcmNsZW4gKiBzaXplb2YodWludDE2KSk7Ci0JCQlkZXN0cG9zICs9IHNyY2xlbjsKLQkJfQotCi0JCWlmIChwb3MgPCBzaW5kZXggKyBjb3VudCAtIDEpIHsKLQkJCW1lbWNweShkZXN0ICsgZGVzdHBvcywgaW5zZXJ0LCBpbnNlcnRsZW4gKiBzaXplb2YodWludDE2KSk7Ci0JCQlkZXN0cG9zICs9IGluc2VydGxlbjsKLQkJfQotCX0KLSAgCi0gIE4zKiB2bSA9IChOMyopVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpOwotICBkZWNsYXJlX2djcm9vdChjb25zdCBBcnJheUNoYXIqLCBhcnJheSkgPSB2bS0+YnVmVG9BcnJheShkZXN0LCBsZW5ndGgpOwotCWRlY2xhcmVfZ2Nyb290KE1vbm9TdHJpbmcqLCByZXMpID0gKE1vbm9TdHJpbmcqKXZtLT5hcnJheVRvU3RyaW5nKGFycmF5KTsKLQlyZXR1cm4gcmVzOwotfQotCi1leHRlcm4gIkMiIE1vbm9TdHJpbmcgKgotU3lzdGVtX1N0cmluZ19JbnRlcm5hbEFsbG9jYXRlU3RyIChzaW50MzIgbGVuZ3RoKQotewotICBkZWNsYXJlX2djcm9vdChNb25vU3RyaW5nKiwgc3RyKSA9IChNb25vU3RyaW5nKilNU0NvcmxpYjo6cFN0cmluZy0+ZG9OZXcoKTsKLSAgc3RyLT5sZW5ndGggPSBsZW5ndGg7Ci0gIHJldHVybiBzdHI7Ci19Ci0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9OMy9Nb25vL01vbm9NU0NvcmxpYi5jcHAgYi92bWtpdC9saWIvTjMvTW9uby9Nb25vTVNDb3JsaWIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmIyZmExLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9OMy9Nb25vL01vbm9NU0NvcmxpYi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLy89PT0tLS0tLSBNb25vTVNDb3JsaWIuY3BwIC0gVGhlIE1vbm8gTVNDb3JsaWIgaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4zCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotCi0jaW5jbHVkZSAibXZtL0pJVC5oIgotCi0jaW5jbHVkZSAiQXNzZW1ibHkuaCIKLSNpbmNsdWRlICJNU0NvcmxpYi5oIgotI2luY2x1ZGUgIk4zLmgiCi0jaW5jbHVkZSAiVk1DbGFzcy5oIgotI2luY2x1ZGUgIlZNT2JqZWN0LmgiCi0jaW5jbHVkZSAiVk1UaHJlYWQuaCIKLQotdXNpbmcgbmFtZXNwYWNlIG4zOwotCi12b2lkIE1TQ29ybGliOjpsb2FkU3RyaW5nQ2xhc3MoTjMqIHZtKSB7Ci0gIFZNQ2xhc3MqIHR5cGUgPSAoVk1DbGFzcyopdm0tPmNvcmVBc3NlbWJseS0+bG9hZFR5cGVGcm9tTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bS0+YXNjaWl6VG9VVEY4KCJTdHJpbmciKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bS0+YXNjaWl6VG9VVEY4KCJTeXN0ZW0iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgTVNDb3JsaWI6OnBTdHJpbmcgPSB0eXBlOwotICBNU0NvcmxpYjo6cE9iamVjdC0+cmVzb2x2ZVR5cGUodHJ1ZSwgZmFsc2UsIE5VTEwpOwotICBNU0NvcmxpYjo6cE9iamVjdC0+cmVzb2x2ZVZUKCk7Ci0gIHR5cGUtPnJlc29sdmVUeXBlKHRydWUsIGZhbHNlLCBOVUxMKTsKLSAgdHlwZS0+cmVzb2x2ZVZUKCk7Ci0KLSAgdWludDY0IHNpemUgPSBtdm06Ok12bU1vZHVsZTo6Z2V0VHlwZVNpemUodHlwZS0+dmlydHVhbFR5cGUtPmdldENvbnRhaW5lZFR5cGUoMCkpICsgc2l6ZW9mKGNvbnN0IFVURjgqKSArIHNpemVvZihsbHZtOjpHbG9iYWxWYXJpYWJsZSopOwotICB0eXBlLT52aXJ0dWFsSW5zdGFuY2UgPSAKLSAgICAoVk1PYmplY3QqKWdjOjpvcGVyYXRvciBuZXcoc2l6ZSwgVk1PYmplY3Q6OmdldE4zVmlydHVhbFRhYmxlKHR5cGUtPnZpcnR1YWxJbnN0YW5jZSkpOwotCVZNT2JqZWN0Ojppbml0aWFsaXNlKHR5cGUtPnZpcnR1YWxJbnN0YW5jZSwgdHlwZSk7Ci19Ci0KLQotdm9pZCBNU0NvcmxpYjo6aW5pdGlhbGlzZShOMyogdm0pIHsKLSAgCi0gIFZNQ2xhc3MqIHJ1bnRpbWVUeXBlSGFuZGxlID0gMDsKLSAgVk1DbGFzcyogcmVhbENsclR5cGUgPSAwOwotICAjZGVmaW5lIElOSVQodmFyLCBuYW1lU3BhY2UsIG5hbWUsIHR5cGUsIHByaW0pIHtcCi0gIHZhciA9IChWTUNsYXNzKil2bS0+Y29yZUFzc2VtYmx5LT5sb2FkVHlwZUZyb21OYW1lKCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0tPmFzY2lpelRvVVRGOChuYW1lKSwgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bS0+YXNjaWl6VG9VVEY4KG5hbWVTcGFjZSksXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUpOyBcCi0gIHZhci0+aXNQcmltaXRpdmUgPSBwcmltOyBcCi0gIGlmICh0eXBlKSB7IFwKLSAgICB2YXItPm5hdHVyYWxUeXBlID0gdHlwZTsgIFwKLSAgICB2YXItPnZpcnR1YWxUeXBlID0gdHlwZTsgIFwKLSAgfX0KLQotICBJTklUKE1TQ29ybGliOjpjbHJUeXBlLCAgICJTeXN0ZW0iLCAiTW9ub1R5cGUiLCAwLCBmYWxzZSk7Ci0gIElOSVQocmVhbENsclR5cGUsICAgIlN5c3RlbSIsICJUeXBlIiwgMCwgZmFsc2UpOwotICBJTklUKHJ1bnRpbWVUeXBlSGFuZGxlLCAgICJTeXN0ZW0iLCAiUnVudGltZVR5cGVIYW5kbGUiLCAwLCBmYWxzZSk7Ci0gIC8qCi0gIElOSVQoTVNDb3JsaWI6OmFzc2VtYmx5UmVmbGVjdGlvbiwgICAiU3lzdGVtLlJlZmxlY3Rpb24iLCAiQXNzZW1ibHkiLCAwLCBmYWxzZSk7Ci0gIElOSVQoTVNDb3JsaWI6OnR5cGVkUmVmZXJlbmNlLCAgICJTeXN0ZW0iLCAiVHlwZWRSZWZlcmVuY2UiLCAwLCBmYWxzZSk7Ci0gIElOSVQoTVNDb3JsaWI6OnByb3BlcnR5VHlwZSwgICAiU3lzdGVtLlJlZmxlY3Rpb24iLCAiQ2xyUHJvcGVydHkiLCAwLCBmYWxzZSk7Ci0gIElOSVQoTVNDb3JsaWI6Om1ldGhvZFR5cGUsICAgIlN5c3RlbS5SZWZsZWN0aW9uIiwgIkNsck1ldGhvZCIsIDAsIGZhbHNlKTsKLSAgSU5JVChNU0NvcmxpYjo6cmVzb3VyY2VTdHJlYW1UeXBlLCAgICJTeXN0ZW0uUmVmbGVjdGlvbiIsICJDbHJSZXNvdXJjZVN0cmVhbSIsIDAsIGZhbHNlKTsqLwotI3VuZGVmIElOSVQKLSAgCi0gIHsKLSAgTVNDb3JsaWI6OmNsclR5cGUtPnJlc29sdmVUeXBlKGZhbHNlLCBmYWxzZSwgTlVMTCk7Ci0gIE1TQ29ybGliOjp0eXBlQ2xyVHlwZSA9IHJlYWxDbHJUeXBlLT5sb29rdXBGaWVsZCh2bS0+YXNjaWl6VG9VVEY4KCJfaW1wbCIpLCBydW50aW1lVHlwZUhhbmRsZSwgZmFsc2UsIGZhbHNlKTsKLSAgfQotCi0vKgotICB7Ci0gIE1TQ29ybGliOjphc3NlbWJseVJlZmxlY3Rpb24tPnJlc29sdmVUeXBlKGZhbHNlLCBmYWxzZSk7Ci0gIHN0ZDo6dmVjdG9yPFZNQ29tbW9uQ2xhc3MqPiBhcmdzOwotICBhcmdzLnB1c2hfYmFjayhNU0NvcmxpYjo6cFZvaWQpOwotICBhcmdzLnB1c2hfYmFjayhNU0NvcmxpYjo6YXNzZW1ibHlSZWZsZWN0aW9uKTsKLSAgTVNDb3JsaWI6OmN0b3JBc3NlbWJseVJlZmxlY3Rpb24gPSBNU0NvcmxpYjo6YXNzZW1ibHlSZWZsZWN0aW9uLT5sb29rdXBNZXRob2Qodm0tPmFzY2lpelRvVVRGOCgiLmN0b3IiKSwgYXJncywgZmFsc2UsIGZhbHNlKTsKLSAgTVNDb3JsaWI6OmFzc2VtYmx5QXNzZW1ibHlSZWZsZWN0aW9uID0gTVNDb3JsaWI6OmFzc2VtYmx5UmVmbGVjdGlvbi0+bG9va3VwRmllbGQodm0tPmFzY2lpelRvVVRGOCgicHJpdmF0ZURhdGEiKSwgTVNDb3JsaWI6OnBJbnRQdHIsIGZhbHNlLCBmYWxzZSk7Ci0gIH0KLSAgCi0gIHsKLSAgTVNDb3JsaWI6OnByb3BlcnR5VHlwZS0+cmVzb2x2ZVR5cGUoZmFsc2UsIGZhbHNlKTsKLSAgc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+IGFyZ3M7Ci0gIGFyZ3MucHVzaF9iYWNrKE1TQ29ybGliOjpwVm9pZCk7Ci0gIGFyZ3MucHVzaF9iYWNrKE1TQ29ybGliOjpwcm9wZXJ0eVR5cGUpOwotICBNU0NvcmxpYjo6Y3RvclByb3BlcnR5VHlwZSA9IE1TQ29ybGliOjpwcm9wZXJ0eVR5cGUtPmxvb2t1cE1ldGhvZCh2bS0+YXNjaWl6VG9VVEY4KCIuY3RvciIpLCBhcmdzLCBmYWxzZSwgZmFsc2UpOwotICBNU0NvcmxpYjo6cHJvcGVydHlQcm9wZXJ0eVR5cGUgPSBNU0NvcmxpYjo6cHJvcGVydHlUeXBlLT5sb29rdXBGaWVsZCh2bS0+YXNjaWl6VG9VVEY4KCJwcml2YXRlRGF0YSIpLCBNU0NvcmxpYjo6cEludFB0ciwgZmFsc2UsIGZhbHNlKTsKLSAgfQotICAKLSAgewotICBNU0NvcmxpYjo6bWV0aG9kVHlwZS0+cmVzb2x2ZVR5cGUoZmFsc2UsIGZhbHNlKTsKLSAgc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+IGFyZ3M7Ci0gIGFyZ3MucHVzaF9iYWNrKE1TQ29ybGliOjpwVm9pZCk7Ci0gIGFyZ3MucHVzaF9iYWNrKE1TQ29ybGliOjptZXRob2RUeXBlKTsKLSAgTVNDb3JsaWI6OmN0b3JNZXRob2RUeXBlID0gTVNDb3JsaWI6Om1ldGhvZFR5cGUtPmxvb2t1cE1ldGhvZCh2bS0+YXNjaWl6VG9VVEY4KCIuY3RvciIpLCBhcmdzLCBmYWxzZSwgZmFsc2UpOwotICBNU0NvcmxpYjo6bWV0aG9kTWV0aG9kVHlwZSA9IE1TQ29ybGliOjptZXRob2RUeXBlLT5sb29rdXBGaWVsZCh2bS0+YXNjaWl6VG9VVEY4KCJwcml2YXRlRGF0YSIpLCBNU0NvcmxpYjo6cEludFB0ciwgZmFsc2UsIGZhbHNlKTsKLSAgfQotICAKLSAgewotICBNU0NvcmxpYjo6cmVzb3VyY2VTdHJlYW1UeXBlLT5yZXNvbHZlVHlwZShmYWxzZSwgZmFsc2UpOwotICBzdGQ6OnZlY3RvcjxWTUNvbW1vbkNsYXNzKj4gYXJnczsKLSAgYXJncy5wdXNoX2JhY2soTVNDb3JsaWI6OnBWb2lkKTsKLSAgYXJncy5wdXNoX2JhY2soTVNDb3JsaWI6OnJlc291cmNlU3RyZWFtVHlwZSk7Ci0gIGFyZ3MucHVzaF9iYWNrKE1TQ29ybGliOjpwSW50UHRyKTsKLSAgYXJncy5wdXNoX2JhY2soTVNDb3JsaWI6OnBTSW50NjQpOwotICBhcmdzLnB1c2hfYmFjayhNU0NvcmxpYjo6cFNJbnQ2NCk7Ci0gIE1TQ29ybGliOjpjdG9yUmVzb3VyY2VTdHJlYW1UeXBlID0gTVNDb3JsaWI6OnJlc291cmNlU3RyZWFtVHlwZS0+bG9va3VwTWV0aG9kKHZtLT5hc2NpaXpUb1VURjgoIi5jdG9yIiksIGFyZ3MsIGZhbHNlLCBmYWxzZSk7Ci0gIH0KLSAgCi0gIFZNQ29tbW9uQ2xhc3MqIHZvaWRQdHIgPSB2bS0+Y29yZUFzc2VtYmx5LT5jb25zdHJ1Y3RQb2ludGVyKE1TQ29ybGliOjpwVm9pZCwgMSk7Ci0jZGVmaW5lIElOSVQodmFyLCBjbCwgdHlwZSkge1wKLSAgICBjbC0+cmVzb2x2ZVR5cGUoZmFsc2UsIGZhbHNlKTsgXAotICAgIHZhciA9IGNsLT5sb29rdXBGaWVsZCh2bS0+YXNjaWl6VG9VVEY4KCJ2YWx1ZV8iKSwgdHlwZSwgZmFsc2UsIGZhbHNlKTsgXAotICB9Ci0gIAotICBJTklUKE1TQ29ybGliOjpjdG9yQm9vbGVhbiwgIE1TQ29ybGliOjpwQm9vbGVhbiwgTVNDb3JsaWI6OnBCb29sZWFuKTsKLSAgSU5JVChNU0NvcmxpYjo6Y3RvclVJbnQ4LCBNU0NvcmxpYjo6cFVJbnQ4LCBNU0NvcmxpYjo6cFVJbnQ4KTsKLSAgSU5JVChNU0NvcmxpYjo6Y3RvclNJbnQ4LCBNU0NvcmxpYjo6cFNJbnQ4LCBNU0NvcmxpYjo6cFNJbnQ4KTsKLSAgSU5JVChNU0NvcmxpYjo6Y3RvckNoYXIsICBNU0NvcmxpYjo6cENoYXIsIE1TQ29ybGliOjpwQ2hhcik7Ci0gIElOSVQoTVNDb3JsaWI6OmN0b3JTSW50MTYsIE1TQ29ybGliOjpwU0ludDE2LCBNU0NvcmxpYjo6cFNJbnQxNik7Ci0gIElOSVQoTVNDb3JsaWI6OmN0b3JVSW50MTYsIE1TQ29ybGliOjpwVUludDE2LCBNU0NvcmxpYjo6cFVJbnQxNik7Ci0gIElOSVQoTVNDb3JsaWI6OmN0b3JTSW50MzIsIE1TQ29ybGliOjpwU0ludDMyLCBNU0NvcmxpYjo6cFNJbnQzMik7Ci0gIElOSVQoTVNDb3JsaWI6OmN0b3JVSW50MzIsIE1TQ29ybGliOjpwVUludDMyLCBNU0NvcmxpYjo6cFVJbnQzMik7Ci0gIElOSVQoTVNDb3JsaWI6OmN0b3JTSW50NjQsIE1TQ29ybGliOjpwU0ludDY0LCBNU0NvcmxpYjo6cFNJbnQ2NCk7Ci0gIElOSVQoTVNDb3JsaWI6OmN0b3JVSW50NjQsIE1TQ29ybGliOjpwVUludDY0LCBNU0NvcmxpYjo6cFVJbnQ2NCk7Ci0gIElOSVQoTVNDb3JsaWI6OmN0b3JJbnRQdHIsIE1TQ29ybGliOjpwSW50UHRyLCB2b2lkUHRyKTsKLSAgSU5JVChNU0NvcmxpYjo6Y3RvclVJbnRQdHIsIE1TQ29ybGliOjpwVUludFB0ciwgdm9pZFB0cik7Ci0gIElOSVQoTVNDb3JsaWI6OmN0b3JEb3VibGUsIE1TQ29ybGliOjpwRG91YmxlLCBNU0NvcmxpYjo6cERvdWJsZSk7Ci0gIElOSVQoTVNDb3JsaWI6OmN0b3JGbG9hdCwgTVNDb3JsaWI6OnBGbG9hdCwgTVNDb3JsaWI6OnBGbG9hdCk7Ci0KLSN1bmRlZiBJTklUCi0KLSAgKi8KLX0KLQotVk1PYmplY3QqIFByb3BlcnR5OjpnZXRQcm9wZXJ0eURlbGVnYXRlZSgpIHsKLQlkZWNsYXJlX2djcm9vdChWTU9iamVjdCosIGRlbGVnYXRlZSkgPSBvb29fZGVsZWdhdGVlOwotCi0gIGlmICghZGVsZWdhdGVlKSB7Ci0gICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7ICAKLSAgfQotCi0gIHJldHVybiBkZWxlZ2F0ZWU7Ci19Ci0KLVZNT2JqZWN0KiBWTU1ldGhvZDo6Z2V0TWV0aG9kRGVsZWdhdGVlKCkgewotCWRlY2xhcmVfZ2Nyb290KFZNT2JqZWN0KiwgZGVsZWdhdGVlKSA9IG9vb19kZWxlZ2F0ZWU7Ci0KLSAgaWYgKCFkZWxlZ2F0ZWUpIHsKLSAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsgIAotICB9Ci0KLSAgcmV0dXJuIGRlbGVnYXRlZTsKLX0KLQotVk1PYmplY3QqIFZNQ29tbW9uQ2xhc3M6OmdldENsYXNzRGVsZWdhdGVlKCkgewotCWRlY2xhcmVfZ2Nyb290KFZNT2JqZWN0KiwgZGVsZWdhdGVlKSA9IG9vb19kZWxlZ2F0ZWU7Ci0KLSAgaWYgKCFkZWxlZ2F0ZWUpIHsKLSAgICBvb29fZGVsZWdhdGVlID0gZGVsZWdhdGVlID0gTVNDb3JsaWI6OmNsclR5cGUtPmRvTmV3KCk7Ci0gICAgTVNDb3JsaWI6OnR5cGVDbHJUeXBlLT5zZXRJbnRQdHIoZGVsZWdhdGVlLCAoaW50Kil0aGlzKTsKLSAgfQotCi0gIHJldHVybiBkZWxlZ2F0ZWU7Ci19Ci0KLVZNT2JqZWN0KiBBc3NlbWJseTo6Z2V0QXNzZW1ibHlEZWxlZ2F0ZWUoKSB7Ci0JZGVjbGFyZV9nY3Jvb3QoVk1PYmplY3QqLCBkZWxlZ2F0ZWUpID0gb29vX2RlbGVnYXRlZTsKLQotICBpZiAoIWRlbGVnYXRlZSkgewotICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOyAgCi0gIH0KLQotICByZXR1cm4gZGVsZWdhdGVlOwotfQotCi12b2lkIE1TQ29ybGliOjpsb2FkQm9vdHN0cmFwKE4zKiB2bSkgewotICBWTUNsYXNzKiBjbCA9IChWTUNsYXNzKil2bS0+Y29yZUFzc2VtYmx5LT5sb2FkVHlwZUZyb21OYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLT5hc2NpaXpUb1VURjgoIlRocmVhZCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLT5hc2NpaXpUb1VURjgoIlN5c3RlbS5UaHJlYWRpbmciKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKTsKLSAgZGVjbGFyZV9nY3Jvb3QoVk1PYmplY3QqLCBhcHBUaHJlYWQpID0gY2wtPmRvTmV3KCk7Ci0gIFZNVGhyZWFkOjpnZXQoKS0+b29vX2FwcFRocmVhZCA9IGFwcFRocmVhZDsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9OMy9Nb25vL01vbm9QYXRoLmluYy5pbiBiL3Zta2l0L2xpYi9OMy9Nb25vL01vbm9QYXRoLmluYy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmViYmJjZC4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTjMvTW9uby9Nb25vUGF0aC5pbmMuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vLz09PS0tLS0tLSBNb25vUGF0aC5jcHAgLSBtc2NvcmxpYi5kbGwgbG9jYXRpb24gZm9yIG1vbm8gLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjMKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSAiTVNDb3JsaWIuaCIKLQotdXNpbmcgbmFtZXNwYWNlIG4zOwotCi1jb25zdCBjaGFyKiBNU0NvcmxpYjo6bGlic1BhdGggID0gICJAbW9ub3BhdGhALyI7Ci0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9OMy9Nb25vL01vbm9TdHJpbmcuY3BwIGIvdm1raXQvbGliL04zL01vbm8vTW9ub1N0cmluZy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMTQzMWYuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL04zL01vbm8vTW9ub1N0cmluZy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLz09PS0tLSBQTmV0U3RyaW5nLmNwcCAtIEltcGxlbWVudGF0aW9uIG9mIFBOZXQgc3RyaW5nIGludGVyZmFjZSAtLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMwotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgotI2luY2x1ZGUgImxsdm0vR2xvYmFsVmFyaWFibGUuaCIKLSNpbmNsdWRlICJsbHZtL0xMVk1Db250ZXh0LmgiCi0KLSNpbmNsdWRlICJtdm0vSklULmgiCi0KLSNpbmNsdWRlICJDTElTdHJpbmcuaCIKLSNpbmNsdWRlICJNU0NvcmxpYi5oIgotI2luY2x1ZGUgIk4zLmgiCi0jaW5jbHVkZSAiTW9ub1N0cmluZy5oIgotI2luY2x1ZGUgIlZNQXJyYXkuaCIKLSNpbmNsdWRlICJWTUNsYXNzLmgiCi0jaW5jbHVkZSAiVk1UaHJlYWQuaCIKLQotdXNpbmcgbmFtZXNwYWNlIG4zOwotdXNpbmcgbmFtZXNwYWNlIGxsdm07Ci0KLQotQ0xJU3RyaW5nKiBDTElTdHJpbmc6OnN0cmluZ0R1cChjb25zdCBBcnJheUNoYXIqIGFycmF5LCBOMyogdm0pIHsKLQlsbHZtX2djcm9vdChhcnJheSwgMCk7Ci0gIGRlY2xhcmVfZ2Nyb290KE1vbm9TdHJpbmcqLCBvYmopID0gKE1vbm9TdHJpbmcqKU1TQ29ybGliOjpwU3RyaW5nLT5kb05ldygpOwotICBvYmotPmxlbmd0aCA9IGFycmF5LT5zaXplOwotICBpZiAoYXJyYXktPnNpemUgPT0gMCkgewotICAgIG9iai0+c3RhcnRDaGFyID0gMDsKLSAgfSBlbHNlIHsKLSAgICBvYmotPnN0YXJ0Q2hhciA9IGFycmF5LT5lbGVtZW50c1swXTsKLSAgfQotICBvYmotPnZhbHVlID0gYXJyYXk7IAotICByZXR1cm4gb2JqOwotfQotCi1HbG9iYWxWYXJpYWJsZSogQ0xJU3RyaW5nOjpsbHZtVmFyKENMSVN0cmluZyAqc2VsZikgewotCWxsdm1fZ2Nyb290KHNlbGYsIDApOwotICBkZWNsYXJlX2djcm9vdChNb25vU3RyaW5nKiwgc3RyKSA9IChNb25vU3RyaW5nKilzZWxmOwotICBpZiAoIXN0ci0+X2xsdm1WYXIpIHsKLSAgICBOMyogdm0gPSBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCk7Ci0gICAgaWYgKCFzdHItPl9sbHZtVmFyKSB7Ci0gICAgICBjb25zdCBUeXBlKiBwdHkgPSBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFR5cGU6OmdldEludDhUeShnZXRHbG9iYWxDb250ZXh0KCkpKTsKLSAgICAgIE1vZHVsZSogTW9kID0gdm0tPmdldExMVk1Nb2R1bGUoKTsKLSAgICAgIENvbnN0YW50KiBjb25zID0gCi0gICAgICAgIENvbnN0YW50RXhwcjo6Z2V0SW50VG9QdHIoQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ2NFR5KGdldEdsb2JhbENvbnRleHQoKSksIHVpbnQ2NF90IChzZWxmKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHR5KTsKLSAgICAgIHN0ci0+X2xsdm1WYXIgPSBuZXcgR2xvYmFsVmFyaWFibGUoKk1vZCwgcHR5LCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnMsICIiKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHN0ci0+X2xsdm1WYXI7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvTjMvTW9uby9Nb25vU3RyaW5nLmggYi92bWtpdC9saWIvTjMvTW9uby9Nb25vU3RyaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NTNkMmMuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL04zL01vbm8vTW9ub1N0cmluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tIE1vbm9TdHJpbmcuaCAtIFN0cmluZyByZXByZXNlbnRhdGlvbiBpbiBNb25vIC0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMwotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgTjNfTU9OT19TVFJJTkdfSAotI2RlZmluZSBOM19NT05PX1NUUklOR19ICi0KLSNpbmNsdWRlICJsbHZtL0dsb2JhbFZhcmlhYmxlLmgiCi0KLSNpbmNsdWRlICJ0eXBlcy5oIgotI2luY2x1ZGUgIm12bS9QcmludEJ1ZmZlci5oIgotCi0jaW5jbHVkZSAiQ0xJU3RyaW5nLmgiCi0KLW5hbWVzcGFjZSBuMyB7Ci0KLWNsYXNzIE1vbm9TdHJpbmcgOiBwdWJsaWMgQ0xJU3RyaW5nIHsKLXB1YmxpYzoKLSAgCi0gIC8vICEhISBtb25vIGxheW91dCAhISEKLSAgc2ludDMyIGxlbmd0aDsKLSAgdWludDggc3RhcnRDaGFyOwotICBjb25zdCBBcnJheUNoYXIqIHZhbHVlOwotICBsbHZtOjpHbG9iYWxWYXJpYWJsZSogX2xsdm1WYXI7Ci0KLX07Ci0KLX0gLy8gZW5kIG5hbWVzcGFjZSBuMwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9OMy9Nb25vL251bWJlci1mb3JtYXR0ZXIuaCBiL3Zta2l0L2xpYi9OMy9Nb25vL251bWJlci1mb3JtYXR0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVjMGJjOS4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTjMvTW9uby9udW1iZXItZm9ybWF0dGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MTQgKzAsMCBAQAotLyogCi0gKiBUaGlzIGZpbGUgaXMgdW5kZXIgdGhlIE1vbm8gTGljZW5zZS4KLSAqIChDKSAyMDA4IFhpbWlhbiwgSW5jLiAgaHR0cDovL3d3dy54aW1pYW4uY29tCi0gKi8KLQotI2lmbmRlZiBfTU9OT19NRVRBREFUQV9OVU1CRVJfRk9STUFUVEVSX0hfCi0jZGVmaW5lIF9NT05PX01FVEFEQVRBX05VTUJFUl9GT1JNQVRURVJfSF8gMQotCi1zdGF0aWMgY29uc3QgZ3VpbnQ2NCBGb3JtYXR0ZXJfTWFudGlzc2FCaXRzVGFibGUgW10gPSB7Ci0JNDU1Njk1MTI2MjIyMjc0ODQzMlVMTCwgOTExMzkwMjUyNDQ0NTQ5Njg2NVVMTCwgMTgyMjc4MDUwNDg4OTA5OTM3MzBVTEwsIAotCTM2NDU1NjEwMDk3NzgxOTg3NDZVTEwsIDcyOTExMjIwMTk1NTYzOTc0OTJVTEwsIDE0NTgyMjQ0MDM5MTEyNzk0OTg0VUxMLCAKLQkyOTE2NDQ4ODA3ODIyNTU4OTk2VUxMLCA1ODMyODk3NjE1NjQ1MTE3OTkzVUxMLCAxMTY2NTc5NTIzMTI5MDIzNTk4N1VMTCwgCi0JMjMzMzE1OTA0NjI1ODA0NzE5N1VMTCwgNDY2NjMxODA5MjUxNjA5NDM5NFVMTCwgOTMzMjYzNjE4NTAzMjE4ODc4OVVMTCwgCi0JMTg2NjUyNzIzNzAwNjQzNzc1N1VMTCwgMzczMzA1NDQ3NDAxMjg3NTUxNVVMTCwgNzQ2NjEwODk0ODAyNTc1MTAzMVVMTCwgCi0JMTQ5MzIyMTc4OTYwNTE1MDIwNjNVTEwsIDI5ODY0NDM1NzkyMTAzMDA0MTJVTEwsIDU5NzI4ODcxNTg0MjA2MDA4MjVVTEwsIAotCTExOTQ1Nzc0MzE2ODQxMjAxNjUxVUxMLCAyMzg5MTU0ODYzMzY4MjQwMzMwVUxMLCA0Nzc4MzA5NzI2NzM2NDgwNjYwVUxMLCAKLQk5NTU2NjE5NDUzNDcyOTYxMzIwVUxMLCAxOTExMzIzODkwNjk0NTkyMjY0VUxMLCAzODIyNjQ3NzgxMzg5MTg0NTI4VUxMLCAKLQk3NjQ1Mjk1NTYyNzc4MzY5MDU2VUxMLCAxNTI5MDU5MTEyNTU1NjczODExM1VMTCwgMzA1ODExODIyNTExMTM0NzYyMlVMTCwgCi0JNjExNjIzNjQ1MDIyMjY5NTI0NVVMTCwgMTIyMzI0NzI5MDA0NDUzOTA0OTBVTEwsIDI0NDY0OTQ1ODAwODkwNzgwOThVTEwsIAotCTQ4OTI5ODkxNjAxNzgxNTYxOTZVTEwsIDk3ODU5NzgzMjAzNTYzMTIzOTJVTEwsIDE5NTcxOTU2NjQwNzEyNjI0NzhVTEwsIAotCTM5MTQzOTEzMjgxNDI1MjQ5NTdVTEwsIDc4Mjg3ODI2NTYyODUwNDk5MTRVTEwsIDE1NjU3NTY1MzEyNTcwMDk5ODI4VUxMLCAKLQkzMTMxNTEzMDYyNTE0MDE5OTY1VUxMLCA2MjYzMDI2MTI1MDI4MDM5OTMxVUxMLCAxMjUyNjA1MjI1MDA1NjA3OTg2MlVMTCwgCi0JMjUwNTIxMDQ1MDAxMTIxNTk3MlVMTCwgNTAxMDQyMDkwMDAyMjQzMTk0NFVMTCwgMTAwMjA4NDE4MDAwNDQ4NjM4ODlVTEwsIAotCTIwMDQxNjgzNjAwMDg5NzI3NzdVTEwsIDQwMDgzMzY3MjAwMTc5NDU1NTVVTEwsIDgwMTY2NzM0NDAwMzU4OTExMTFVTEwsIAotCTE2MDMzMzQ2ODgwMDcxNzgyMjIzVUxMLCAzMjA2NjY5Mzc2MDE0MzU2NDQ0VUxMLCA2NDEzMzM4NzUyMDI4NzEyODg5VUxMLCAKLQkxMjgyNjY3NzUwNDA1NzQyNTc3OVVMTCwgMjU2NTMzNTUwMDgxMTQ4NTE1NVVMTCwgNTEzMDY3MTAwMTYyMjk3MDMxMVVMTCwgCi0JMTAyNjEzNDIwMDMyNDU5NDA2MjNVTEwsIDIwNTIyNjg0MDA2NDkxODgxMjRVTEwsIDQxMDQ1MzY4MDEyOTgzNzYyNDlVTEwsIAotCTgyMDkwNzM2MDI1OTY3NTI0OThVTEwsIDE2NDE4MTQ3MjA1MTkzNTA0OTk3VUxMLCAzMjgzNjI5NDQxMDM4NzAwOTk5VUxMLCAKLQk2NTY3MjU4ODgyMDc3NDAxOTk4VUxMLCAxMzEzNDUxNzc2NDE1NDgwMzk5N1VMTCwgMjYyNjkwMzU1MjgzMDk2MDc5OVVMTCwgCi0JNTI1MzgwNzEwNTY2MTkyMTU5OVVMTCwgMTA1MDc2MTQyMTEzMjM4NDMxOThVTEwsIDIxMDE1MjI4NDIyNjQ3Njg2MzlVTEwsIAotCTQyMDMwNDU2ODQ1Mjk1MzcyNzlVTEwsIDg0MDYwOTEzNjkwNTkwNzQ1NThVTEwsIDE2ODEyMTgyNzM4MTE4MTQ5MTE3VUxMLCAKLQkzMzYyNDM2NTQ3NjIzNjI5ODIzVUxMLCA2NzI0ODczMDk1MjQ3MjU5NjQ2VUxMLCAxMzQ0OTc0NjE5MDQ5NDUxOTI5M1VMTCwgCi0JMjY4OTk0OTIzODA5ODkwMzg1OFVMTCwgNTM3OTg5ODQ3NjE5NzgwNzcxN1VMTCwgMTA3NTk3OTY5NTIzOTU2MTU0MzVVTEwsIAotCTIxNTE5NTkzOTA0NzkxMjMwODdVTEwsIDQzMDM5MTg3ODA5NTgyNDYxNzRVTEwsIDg2MDc4Mzc1NjE5MTY0OTIzNDhVTEwsIAotCTE3MjE1Njc1MTIzODMyOTg0Njk2VUxMLCAzNDQzMTM1MDI0NzY2NTk2OTM5VUxMLCA2ODg2MjcwMDQ5NTMzMTkzODc4VUxMLCAKLQkxMzc3MjU0MDA5OTA2NjM4Nzc1NlVMTCwgMjc1NDUwODAxOTgxMzI3NzU1MVVMTCwgNTUwOTAxNjAzOTYyNjU1NTEwMlVMTCwgCi0JMTEwMTgwMzIwNzkyNTMxMTAyMDVVTEwsIDIyMDM2MDY0MTU4NTA2MjIwNDFVTEwsIDQ0MDcyMTI4MzE3MDEyNDQwODJVTEwsIAotCTg4MTQ0MjU2NjM0MDI0ODgxNjRVTEwsIDE3NjI4ODUxMzI2ODA0OTc2MzI4VUxMLCAzNTI1NzcwMjY1MzYwOTk1MjY1VUxMLCAKLQk3MDUxNTQwNTMwNzIxOTkwNTMxVUxMLCAxNDEwMzA4MTA2MTQ0Mzk4MTA2M1VMTCwgMjgyMDYxNjIxMjI4ODc5NjIxMlVMTCwgCi0JNTY0MTIzMjQyNDU3NzU5MjQyNVVMTCwgMTEyODI0NjQ4NDkxNTUxODQ4NTBVTEwsIDIyNTY0OTI5Njk4MzEwMzY5NzBVTEwsIAotCTQ1MTI5ODU5Mzk2NjIwNzM5NDBVTEwsIDkwMjU5NzE4NzkzMjQxNDc4ODBVTEwsIDE4MDUxOTQzNzU4NjQ4Mjk1NzYwVUxMLCAKLQkzNjEwMzg4NzUxNzI5NjU5MTUyVUxMLCA3MjIwNzc3NTAzNDU5MzE4MzA0VUxMLCAxNDQ0MTU1NTAwNjkxODYzNjYwOFVMTCwgCi0JMjg4ODMxMTAwMTM4MzcyNzMyMVVMTCwgNTc3NjYyMjAwMjc2NzQ1NDY0M1VMTCwgMTE1NTMyNDQwMDU1MzQ5MDkyODZVTEwsIAotCTIzMTA2NDg4MDExMDY5ODE4NTdVTEwsIDQ2MjEyOTc2MDIyMTM5NjM3MTRVTEwsIDkyNDI1OTUyMDQ0Mjc5Mjc0MjlVTEwsIAotCTE4NDg1MTkwNDA4ODU1ODU0ODVVTEwsIDM2OTcwMzgwODE3NzExNzA5NzFVTEwsIDczOTQwNzYxNjM1NDIzNDE5NDNVTEwsIAotCTE0Nzg4MTUyMzI3MDg0NjgzODg3VUxMLCAyOTU3NjMwNDY1NDE2OTM2Nzc3VUxMLCA1OTE1MjYwOTMwODMzODczNTU0VUxMLCAKLQkxMTgzMDUyMTg2MTY2Nzc0NzEwOVVMTCwgMjM2NjEwNDM3MjMzMzU0OTQyMVVMTCwgNDczMjIwODc0NDY2NzA5ODg0M1VMTCwgCi0JOTQ2NDQxNzQ4OTMzNDE5NzY4N1VMTCwgMTg5Mjg4MzQ5Nzg2NjgzOTUzN1VMTCwgMzc4NTc2Njk5NTczMzY3OTA3NVVMTCwgCi0JNzU3MTUzMzk5MTQ2NzM1ODE1MFVMTCwgMTUxNDMwNjc5ODI5MzQ3MTYzMDBVTEwsIDMwMjg2MTM1OTY1ODY5NDMyNjBVTEwsIAotCTYwNTcyMjcxOTMxNzM4ODY1MjBVTEwsIDEyMTE0NDU0Mzg2MzQ3NzczMDQwVUxMLCAyNDIyODkwODc3MjY5NTU0NjA4VUxMLCAKLQk0ODQ1NzgxNzU0NTM5MTA5MjE2VUxMLCA5NjkxNTYzNTA5MDc4MjE4NDMyVUxMLCAxOTM4MzEyNzAxODE1NjQzNjg2VUxMLCAKLQkzODc2NjI1NDAzNjMxMjg3MzcyVUxMLCA3NzUzMjUwODA3MjYyNTc0NzQ1VUxMLCAxNTUwNjUwMTYxNDUyNTE0OTQ5MVVMTCwgCi0JMzEwMTMwMDMyMjkwNTAyOTg5OFVMTCwgNjIwMjYwMDY0NTgxMDA1OTc5NlVMTCwgMTI0MDUyMDEyOTE2MjAxMTk1OTNVTEwsIAotCTI0ODEwNDAyNTgzMjQwMjM5MThVTEwsIDQ5NjIwODA1MTY2NDgwNDc4MzdVTEwsIDk5MjQxNjEwMzMyOTYwOTU2NzRVTEwsIAotCTE5ODQ4MzIyMDY2NTkyMTkxMzRVTEwsIDM5Njk2NjQ0MTMzMTg0MzgyNjlVTEwsIDc5MzkzMjg4MjY2MzY4NzY1MzlVTEwsIAotCTE1ODc4NjU3NjUzMjczNzUzMDc5VUxMLCAzMTc1NzMxNTMwNjU0NzUwNjE1VUxMLCA2MzUxNDYzMDYxMzA5NTAxMjMxVUxMLCAKLQkxMjcwMjkyNjEyMjYxOTAwMjQ2M1VMTCwgMjU0MDU4NTIyNDUyMzgwMDQ5MlVMTCwgNTA4MTE3MDQ0OTA0NzYwMDk4NVVMTCwgCi0JMTAxNjIzNDA4OTgwOTUyMDE5NzBVTEwsIDIwMzI0NjgxNzk2MTkwNDAzOTRVTEwsIDQwNjQ5MzYzNTkyMzgwODA3ODhVTEwsIAotCTgxMjk4NzI3MTg0NzYxNjE1NzZVTEwsIDE2MjU5NzQ1NDM2OTUyMzIzMTUzVUxMLCAzMjUxOTQ5MDg3MzkwNDY0NjMwVUxMLCAKLQk2NTAzODk4MTc0NzgwOTI5MjYxVUxMLCAxMzAwNzc5NjM0OTU2MTg1ODUyMlVMTCwgMjYwMTU1OTI2OTkxMjM3MTcwNFVMTCwgCi0JNTIwMzExODUzOTgyNDc0MzQwOVVMTCwgMTA0MDYyMzcwNzk2NDk0ODY4MThVTEwsIDIwODEyNDc0MTU5Mjk4OTczNjNVTEwsIAotCTQxNjI0OTQ4MzE4NTk3OTQ3MjdVTEwsIDgzMjQ5ODk2NjM3MTk1ODk0NTRVTEwsIDE2NjQ5OTc5MzI3NDM5MTc4OTA5VUxMLCAKLQkzMzI5OTk1ODY1NDg3ODM1NzgxVUxMLCA2NjU5OTkxNzMwOTc1NjcxNTYzVUxMLCAxMzMxOTk4MzQ2MTk1MTM0MzEyN1VMTCwgCi0JMjY2Mzk5NjY5MjM5MDI2ODYyNVVMTCwgNTMyNzk5MzM4NDc4MDUzNzI1MFVMTCwgMTA2NTU5ODY3Njk1NjEwNzQ1MDFVTEwsIAotCTIxMzExOTczNTM5MTIyMTQ5MDBVTEwsIDQyNjIzOTQ3MDc4MjQ0Mjk4MDBVTEwsIDg1MjQ3ODk0MTU2NDg4NTk2MDFVTEwsIAotCTE3MDQ5NTc4ODMxMjk3NzE5MjAyVUxMLCAzNDA5OTE1NzY2MjU5NTQzODQwVUxMLCA2ODE5ODMxNTMyNTE5MDg3NjgxVUxMLCAKLQkxMzYzOTY2MzA2NTAzODE3NTM2MlVMTCwgMjcyNzkzMjYxMzAwNzYzNTA3MlVMTCwgNTQ1NTg2NTIyNjAxNTI3MDE0NFVMTCwgCi0JMTA5MTE3MzA0NTIwMzA1NDAyODlVTEwsIDIxODIzNDYwOTA0MDYxMDgwNTdVTEwsIDQzNjQ2OTIxODA4MTIyMTYxMTVVTEwsIAotCTg3MjkzODQzNjE2MjQ0MzIyMzFVTEwsIDE3NDU4NzY4NzIzMjQ4ODY0NDYzVUxMLCAzNDkxNzUzNzQ0NjQ5NzcyODkyVUxMLCAKLQk2OTgzNTA3NDg5Mjk5NTQ1Nzg1VUxMLCAxMzk2NzAxNDk3ODU5OTA5MTU3MFVMTCwgMjc5MzQwMjk5NTcxOTgxODMxNFVMTCwgCi0JNTU4NjgwNTk5MTQzOTYzNjYyOFVMTCwgMTExNzM2MTE5ODI4NzkyNzMyNTZVTEwsIDIyMzQ3MjIzOTY1NzU4NTQ2NTFVTEwsIAotCTQ0Njk0NDQ3OTMxNTE3MDkzMDJVTEwsIDg5Mzg4ODk1ODYzMDM0MTg2MDVVTEwsIDE3ODc3Nzc5MTcyNjA2ODM3MjEwVUxMLCAKLQkzNTc1NTU1ODM0NTIxMzY3NDQyVUxMLCA3MTUxMTExNjY5MDQyNzM0ODg0VUxMLCAxNDMwMjIyMzMzODA4NTQ2OTc2OFVMTCwgCi0JMjg2MDQ0NDY2NzYxNzA5Mzk1M1VMTCwgNTcyMDg4OTMzNTIzNDE4NzkwN1VMTCwgMTE0NDE3Nzg2NzA0NjgzNzU4MTRVTEwsIAotCTIyODgzNTU3MzQwOTM2NzUxNjJVTEwsIDQ1NzY3MTE0NjgxODczNTAzMjVVTEwsIDkxNTM0MjI5MzYzNzQ3MDA2NTFVTEwsIAotCTE4MzA2ODQ1ODcyNzQ5NDAxMzAzVUxMLCAzNjYxMzY5MTc0NTQ5ODgwMjYwVUxMLCA3MzIyNzM4MzQ5MDk5NzYwNTIxVUxMLCAKLQkxNDY0NTQ3NjY5ODE5OTUyMTA0M1VMTCwgMjkyOTA5NTMzOTYzOTkwNDIwOFVMTCwgNTg1ODE5MDY3OTI3OTgwODQxN1VMTCwgCi0JMTE3MTYzODEzNTg1NTk2MTY4MzRVTEwsIDIzNDMyNzYyNzE3MTE5MjMzNjZVTEwsIDQ2ODY1NTI1NDM0MjM4NDY3MzNVTEwsIAotCTkzNzMxMDUwODY4NDc2OTM0NjdVTEwsIDE4NzQ2MjEwMTczNjk1Mzg2OTNVTEwsIDM3NDkyNDIwMzQ3MzkwNzczODdVTEwsIAotCTc0OTg0ODQwNjk0NzgxNTQ3NzRVTEwsIDE0OTk2OTY4MTM4OTU2MzA5NTQ4VUxMLCAyOTk5MzkzNjI3NzkxMjYxOTA5VUxMLCAKLQk1OTk4Nzg3MjU1NTgyNTIzODE5VUxMLCAxMTk5NzU3NDUxMTE2NTA0NzYzOFVMTCwgMjM5OTUxNDkwMjIzMzAwOTUyN1VMTCwgCi0JNDc5OTAyOTgwNDQ2NjAxOTA1NVVMTCwgOTU5ODA1OTYwODkzMjAzODExMFVMTCwgMTkxOTYxMTkyMTc4NjQwNzYyMlVMTCwgCi0JMzgzOTIyMzg0MzU3MjgxNTI0NFVMTCwgNzY3ODQ0NzY4NzE0NTYzMDQ4OFVMTCwgMTUzNTY4OTUzNzQyOTEyNjA5NzdVTEwsIAotCTMwNzEzNzkwNzQ4NTgyNTIxOTVVTEwsIDYxNDI3NTgxNDk3MTY1MDQzOTBVTEwsIDEyMjg1NTE2Mjk5NDMzMDA4NzgxVUxMLCAKLQkyNDU3MTAzMjU5ODg2NjAxNzU2VUxMLCA0OTE0MjA2NTE5NzczMjAzNTEyVUxMLCA5ODI4NDEzMDM5NTQ2NDA3MDI1VUxMLCAKLQkxOTY1NjgyNjA3OTA5MjgxNDA1VUxMLCAzOTMxMzY1MjE1ODE4NTYyODEwVUxMLCA3ODYyNzMwNDMxNjM3MTI1NjIwVUxMLCAKLQkxNTcyNTQ2MDg2MzI3NDI1MTI0MFVMTCwgMzE0NTA5MjE3MjY1NDg1MDI0OFVMTCwgNjI5MDE4NDM0NTMwOTcwMDQ5NlVMTCwgCi0JMTI1ODAzNjg2OTA2MTk0MDA5OTJVTEwsIDI1MTYwNzM3MzgxMjM4ODAxOThVTEwsIDUwMzIxNDc0NzYyNDc3NjAzOTdVTEwsIAotCTEwMDY0Mjk0OTUyNDk1NTIwNzk0VUxMLCAyMDEyODU4OTkwNDk5MTA0MTU4VUxMLCA0MDI1NzE3OTgwOTk4MjA4MzE3VUxMLCAKLQk4MDUxNDM1OTYxOTk2NDE2NjM1VUxMLCAxNjEwMjg3MTkyMzk5MjgzMzI3MFVMTCwgMzIyMDU3NDM4NDc5ODU2NjY1NFVMTCwgCi0JNjQ0MTE0ODc2OTU5NzEzMzMwOFVMTCwgMTI4ODIyOTc1MzkxOTQyNjY2MTZVTEwsIDI1NzY0NTk1MDc4Mzg4NTMzMjNVTEwsIAotCTUxNTI5MTkwMTU2Nzc3MDY2NDZVTEwsIDEwMzA1ODM4MDMxMzU1NDEzMjkzVUxMLCAyMDYxMTY3NjA2MjcxMDgyNjU4VUxMLCAKLQk0MTIyMzM1MjEyNTQyMTY1MzE3VUxMLCA4MjQ0NjcwNDI1MDg0MzMwNjM0VUxMLCAxNjQ4OTM0MDg1MDE2ODY2MTI2OVVMTCwgCi0JMzI5Nzg2ODE3MDAzMzczMjI1M1VMTCwgNjU5NTczNjM0MDA2NzQ2NDUwN1VMTCwgMTMxOTE0NzI2ODAxMzQ5MjkwMTVVTEwsIAotCTI2MzgyOTQ1MzYwMjY5ODU4MDNVTEwsIDUyNzY1ODkwNzIwNTM5NzE2MDZVTEwsIDEwNTUzMTc4MTQ0MTA3OTQzMjEyVUxMLCAKLQkyMTEwNjM1NjI4ODIxNTg4NjQyVUxMLCA0MjIxMjcxMjU3NjQzMTc3Mjg0VUxMLCA4NDQyNTQyNTE1Mjg2MzU0NTY5VUxMLCAKLQkxNjg4NTA4NTAzMDU3MjcwOTEzOVVMTCwgMzM3NzAxNzAwNjExNDU0MTgyN1VMTCwgNjc1NDAzNDAxMjIyOTA4MzY1NVVMTCwgCi0JMTM1MDgwNjgwMjQ0NTgxNjczMTFVTEwsIDI3MDE2MTM2MDQ4OTE2MzM0NjJVTEwsIDU0MDMyMjcyMDk3ODMyNjY5MjRVTEwsIAotCTEwODA2NDU0NDE5NTY2NTMzODQ5VUxMLCAyMTYxMjkwODgzOTEzMzA2NzY5VUxMLCA0MzIyNTgxNzY3ODI2NjEzNTM5VUxMLCAKLQk4NjQ1MTYzNTM1NjUzMjI3MDc5VUxMLCAxNzI5MDMyNzA3MTMwNjQ1NDE1OFVMTCwgMzQ1ODA2NTQxNDI2MTI5MDgzMVVMTCwgCi0JNjkxNjEzMDgyODUyMjU4MTY2M1VMTCwgMTM4MzIyNjE2NTcwNDUxNjMzMjdVTEwsIDI3NjY0NTIzMzE0MDkwMzI2NjVVTEwsIAotCTU1MzI5MDQ2NjI4MTgwNjUzMzBVTEwsIDExMDY1ODA5MzI1NjM2MTMwNjYxVUxMLCAyMjEzMTYxODY1MTI3MjI2MTMyVUxMLCAKLQk0NDI2MzIzNzMwMjU0NDUyMjY0VUxMLCA4ODUyNjQ3NDYwNTA4OTA0NTI5VUxMLCAxNzcwNTI5NDkyMTAxNzgwOTA1OFVMTCwgCi0JMzU0MTA1ODk4NDIwMzU2MTgxMVVMTCwgNzA4MjExNzk2ODQwNzEyMzYyM1VMTCwgMTQxNjQyMzU5MzY4MTQyNDcyNDZVTEwsIAotCTI4MzI4NDcxODczNjI4NDk0NDlVTEwsIDU2NjU2OTQzNzQ3MjU2OTg4OThVTEwsIDExMzMxMzg4NzQ5NDUxMzk3Nzk3VUxMLCAKLQkyMjY2Mjc3NzQ5ODkwMjc5NTU5VUxMLCA0NTMyNTU1NDk5NzgwNTU5MTE5VUxMLCA5MDY1MTEwOTk5NTYxMTE4MjM4VUxMLCAKLQkxODEzMDIyMTk5OTEyMjIzNjQ3NlVMTCwgMzYyNjA0NDM5OTgyNDQ0NzI5NVVMTCwgNzI1MjA4ODc5OTY0ODg5NDU5MFVMTCwgCi0JMTQ1MDQxNzc1OTkyOTc3ODkxODBVTEwsIDI5MDA4MzU1MTk4NTk1NTc4MzZVTEwsIDU4MDE2NzEwMzk3MTkxMTU2NzJVTEwsIAotCTExNjAzMzQyMDc5NDM4MjMxMzQ0VUxMLCAyMzIwNjY4NDE1ODg3NjQ2MjY4VUxMLCA0NjQxMzM2ODMxNzc1MjkyNTM3VUxMLCAKLQk5MjgyNjczNjYzNTUwNTg1MDc1VUxMLCAxODU2NTM0NzMyNzEwMTE3MDE1VUxMLCAzNzEzMDY5NDY1NDIwMjM0MDMwVUxMLCAKLQk3NDI2MTM4OTMwODQwNDY4MDYwVUxMLCAxNDg1MjI3Nzg2MTY4MDkzNjEyMVVMTCwgMjk3MDQ1NTU3MjMzNjE4NzIyNFVMTCwgCi0JNTk0MDkxMTE0NDY3MjM3NDQ0OFVMTCwgMTE4ODE4MjIyODkzNDQ3NDg4OTZVTEwsIDIzNzYzNjQ0NTc4Njg5NDk3NzlVTEwsIAotCTQ3NTI3Mjg5MTU3Mzc4OTk1NThVTEwsIDk1MDU0NTc4MzE0NzU3OTkxMTdVTEwsIDE5MDEwOTE1NjYyOTUxNTk4MjNVTEwsIAotCTM4MDIxODMxMzI1OTAzMTk2NDdVTEwsIDc2MDQzNjYyNjUxODA2MzkyOTRVTEwsIDE1MjA4NzMyNTMwMzYxMjc4NTg4VUxMLCAKLQkzMDQxNzQ2NTA2MDcyMjU1NzE3VUxMLCA2MDgzNDkzMDEyMTQ0NTExNDM1VUxMLCAxMjE2Njk4NjAyNDI4OTAyMjg3MFVMTCwgCi0JMjQzMzM5NzIwNDg1NzgwNDU3NFVMTCwgNDg2Njc5NDQwOTcxNTYwOTE0OFVMTCwgOTczMzU4ODgxOTQzMTIxODI5NlVMTCwgCi0JMTk0NjcxNzc2Mzg4NjI0MzY1OVVMTCwgMzg5MzQzNTUyNzc3MjQ4NzMxOFVMTCwgNzc4Njg3MTA1NTU0NDk3NDYzN1VMTCwgCi0JMTU1NzM3NDIxMTEwODk5NDkyNzRVTEwsIDMxMTQ3NDg0MjIyMTc5ODk4NTRVTEwsIDYyMjk0OTY4NDQ0MzU5Nzk3MDlVTEwsIAotCTEyNDU4OTkzNjg4ODcxOTU5NDE5VUxMLCAyNDkxNzk4NzM3Nzc0MzkxODgzVUxMLCA0OTgzNTk3NDc1NTQ4NzgzNzY3VUxMLCAKLQk5OTY3MTk0OTUxMDk3NTY3NTM1VUxMLCAxOTkzNDM4OTkwMjE5NTEzNTA3VUxMLCAzOTg2ODc3OTgwNDM5MDI3MDE0VUxMLCAKLQk3OTczNzU1OTYwODc4MDU0MDI4VUxMLCAxNTk0NzUxMTkyMTc1NjEwODA1NlVMTCwgMzE4OTUwMjM4NDM1MTIyMTYxMVVMTCwgCi0JNjM3OTAwNDc2ODcwMjQ0MzIyMlVMTCwgMTI3NTgwMDk1Mzc0MDQ4ODY0NDVVTEwsIDI1NTE2MDE5MDc0ODA5NzcyODlVTEwsIAotCTUxMDMyMDM4MTQ5NjE5NTQ1NzhVTEwsIDEwMjA2NDA3NjI5OTIzOTA5MTU2VUxMLCAyMDQxMjgxNTI1OTg0NzgxODMxVUxMLCAKLQk0MDgyNTYzMDUxOTY5NTYzNjYyVUxMLCA4MTY1MTI2MTAzOTM5MTI3MzI1VUxMLCAxNjMzMDI1MjIwNzg3ODI1NDY1MFVMTCwgCi0JMzI2NjA1MDQ0MTU3NTY1MDkzMFVMTCwgNjUzMjEwMDg4MzE1MTMwMTg2MFVMTCwgMTMwNjQyMDE3NjYzMDI2MDM3MjBVTEwsIAotCTI2MTI4NDAzNTMyNjA1MjA3NDRVTEwsIDUyMjU2ODA3MDY1MjEwNDE0ODhVTEwsIDEwNDUxMzYxNDEzMDQyMDgyOTc2VUxMLCAKLQkyMDkwMjcyMjgyNjA4NDE2NTk1VUxMLCA0MTgwNTQ0NTY1MjE2ODMzMTkwVUxMLCA4MzYxMDg5MTMwNDMzNjY2MzgwVUxMLCAKLQkxNjcyMjE3ODI2MDg2NzMzMjc2MVVMTCwgMzM0NDQzNTY1MjE3MzQ2NjU1MlVMTCwgNjY4ODg3MTMwNDM0NjkzMzEwNFVMTCwgCi0JMTMzNzc3NDI2MDg2OTM4NjYyMDlVTEwsIDI2NzU1NDg1MjE3Mzg3NzMyNDFVTEwsIDUzNTEwOTcwNDM0Nzc1NDY0ODNVTEwsIAotCTEwNzAyMTk0MDg2OTU1MDkyOTY3VUxMLCAyMTQwNDM4ODE3MzkxMDE4NTkzVUxMLCA0MjgwODc3NjM0NzgyMDM3MTg3VUxMLCAKLQk4NTYxNzU1MjY5NTY0MDc0Mzc0VUxMLCAxNzEyMzUxMDUzOTEyODE0ODc0OFVMTCwgMzQyNDcwMjEwNzgyNTYyOTc0OVVMTCwgCi0JNjg0OTQwNDIxNTY1MTI1OTQ5OVVMTCwgMTM2OTg4MDg0MzEzMDI1MTg5OThVTEwsIDI3Mzk3NjE2ODYyNjA1MDM3OTlVTEwsIAotCTU0Nzk1MjMzNzI1MjEwMDc1OTlVTEwsIDEwOTU5MDQ2NzQ1MDQyMDE1MTk4VUxMLCAyMTkxODA5MzQ5MDA4NDAzMDM5VUxMLCAKLQk0MzgzNjE4Njk4MDE2ODA2MDc5VUxMLCA4NzY3MjM3Mzk2MDMzNjEyMTU5VUxMLCAxNzUzNDQ3NDc5MjA2NzIyNDMxOFVMTCwgCi0JMzUwNjg5NDk1ODQxMzQ0NDg2M1VMTCwgNzAxMzc4OTkxNjgyNjg4OTcyN1VMTCwgMTQwMjc1Nzk4MzM2NTM3Nzk0NTRVTEwsIAotCTI4MDU1MTU5NjY3MzA3NTU4OTBVTEwsIDU2MTEwMzE5MzM0NjE1MTE3ODFVTEwsIDExMjIyMDYzODY2OTIzMDIzNTYzVUxMLCAKLQkyMjQ0NDEyNzczMzg0NjA0NzEyVUxMLCA0NDg4ODI1NTQ2NzY5MjA5NDI1VUxMLCA4OTc3NjUxMDkzNTM4NDE4ODUwVUxMLCAKLQkxNzk1NTMwMjE4NzA3NjgzNzcwMVVMTCwgMzU5MTA2MDQzNzQxNTM2NzU0MFVMTCwgNzE4MjEyMDg3NDgzMDczNTA4MFVMTCwgCi0JMTQzNjQyNDE3NDk2NjE0NzAxNjFVTEwsIDI4NzI4NDgzNDk5MzIyOTQwMzJVTEwsIDU3NDU2OTY2OTk4NjQ1ODgwNjRVTEwsIAotCTExNDkxMzkzMzk5NzI5MTc2MTI5VUxMLCAyMjk4Mjc4Njc5OTQ1ODM1MjI1VUxMLCA0NTk2NTU3MzU5ODkxNjcwNDUxVUxMLCAKLQk5MTkzMTE0NzE5NzgzMzQwOTAzVUxMLCAxODM4NjIyOTQzOTU2NjY4MTgwNlVMTCwgMzY3NzI0NTg4NzkxMzMzNjM2MVVMTCwgCi0JNzM1NDQ5MTc3NTgyNjY3MjcyMlVMTCwgMTQ3MDg5ODM1NTE2NTMzNDU0NDVVTEwsIDI5NDE3OTY3MTAzMzA2NjkwODlVTEwsIAotCTU4ODM1OTM0MjA2NjEzMzgxNzhVTEwsIDExNzY3MTg2ODQxMzIyNjc2MzU2VUxMLCAyMzUzNDM3MzY4MjY0NTM1MjcxVUxMLCAKLQk0NzA2ODc0NzM2NTI5MDcwNTQyVUxMLCA5NDEzNzQ5NDczMDU4MTQxMDg0VUxMLCAxODgyNzQ5ODk0NjExNjI4MjE2VUxMLCAKLQkzNzY1NDk5Nzg5MjIzMjU2NDMzVUxMLCA3NTMwOTk5NTc4NDQ2NTEyODY3VUxMLCAxNTA2MTk5OTE1Njg5MzAyNTczNVVMTCwgCi0JMzAxMjM5OTgzMTM3ODYwNTE0N1VMTCwgNjAyNDc5OTY2Mjc1NzIxMDI5NFVMTCwgMTIwNDk1OTkzMjU1MTQ0MjA1ODhVTEwsIAotCTI0MDk5MTk4NjUxMDI4ODQxMTdVTEwsIDQ4MTk4Mzk3MzAyMDU3NjgyMzVVTEwsIDk2Mzk2Nzk0NjA0MTE1MzY0NzBVTEwsIAotCTE5Mjc5MzU4OTIwODIzMDcyOTRVTEwsIDM4NTU4NzE3ODQxNjQ2MTQ1ODhVTEwsIDc3MTE3NDM1NjgzMjkyMjkxNzZVTEwsIAotCTE1NDIzNDg3MTM2NjU4NDU4MzUzVUxMLCAzMDg0Njk3NDI3MzMxNjkxNjcwVUxMLCA2MTY5Mzk0ODU0NjYzMzgzMzQxVUxMLCAKLQkxMjMzODc4OTcwOTMyNjc2NjY4MlVMTCwgMjQ2Nzc1Nzk0MTg2NTM1MzMzNlVMTCwgNDkzNTUxNTg4MzczMDcwNjY3M1VMTCwgCi0JOTg3MTAzMTc2NzQ2MTQxMzM0NlVMTCwgMTk3NDIwNjM1MzQ5MjI4MjY2OVVMTCwgMzk0ODQxMjcwNjk4NDU2NTMzOFVMTCwgCi0JNzg5NjgyNTQxMzk2OTEzMDY3N1VMTCwgMTU3OTM2NTA4Mjc5MzgyNjEzNTRVTEwsIDMxNTg3MzAxNjU1ODc2NTIyNzBVTEwsIAotCTYzMTc0NjAzMzExNzUzMDQ1NDFVTEwsIDEyNjM0OTIwNjYyMzUwNjA5MDgzVUxMLCAyNTI2OTg0MTMyNDcwMTIxODE2VUxMLCAKLQk1MDUzOTY4MjY0OTQwMjQzNjMzVUxMLCAxMDEwNzkzNjUyOTg4MDQ4NzI2NlVMTCwgMjAyMTU4NzMwNTk3NjA5NzQ1M1VMTCwgCi0JNDA0MzE3NDYxMTk1MjE5NDkwNlVMTCwgODA4NjM0OTIyMzkwNDM4OTgxM1VMTCwgMTYxNzI2OTg0NDc4MDg3Nzk2MjZVTEwsIAotCTMyMzQ1Mzk2ODk1NjE3NTU5MjVVTEwsIDY0NjkwNzkzNzkxMjM1MTE4NTBVTEwsIDEyOTM4MTU4NzU4MjQ3MDIzNzAxVUxMLCAKLQkyNTg3NjMxNzUxNjQ5NDA0NzQwVUxMLCA1MTc1MjYzNTAzMjk4ODA5NDgwVUxMLCAxMDM1MDUyNzAwNjU5NzYxODk2MFVMTCwgCi0JMjA3MDEwNTQwMTMxOTUyMzc5MlVMTCwgNDE0MDIxMDgwMjYzOTA0NzU4NFVMTCwgODI4MDQyMTYwNTI3ODA5NTE2OFVMTCwgCi0JMTY1NjA4NDMyMTA1NTYxOTAzMzdVTEwsIDMzMTIxNjg2NDIxMTEyMzgwNjdVTEwsIDY2MjQzMzcyODQyMjI0NzYxMzVVTEwsIAotCTEzMjQ4Njc0NTY4NDQ0OTUyMjcwVUxMLCAyNjQ5NzM0OTEzNjg4OTkwNDU0VUxMLCA1Mjk5NDY5ODI3Mzc3OTgwOTA4VUxMLCAKLQkxMDU5ODkzOTY1NDc1NTk2MTgxNlVMTCwgMjExOTc4NzkzMDk1MTE5MjM2M1VMTCwgNDIzOTU3NTg2MTkwMjM4NDcyNlVMTCwgCi0JODQ3OTE1MTcyMzgwNDc2OTQ1MlVMTCwgMTY5NTgzMDM0NDc2MDk1Mzg5MDVVTEwsIDMzOTE2NjA2ODk1MjE5MDc3ODFVTEwsIAotCTY3ODMzMjEzNzkwNDM4MTU1NjJVTEwsIDEzNTY2NjQyNzU4MDg3NjMxMTI0VUxMLCAyNzEzMzI4NTUxNjE3NTI2MjI0VUxMLCAKLQk1NDI2NjU3MTAzMjM1MDUyNDQ5VUxMLCAxMDg1MzMxNDIwNjQ3MDEwNDg5OVVMTCwgMjE3MDY2Mjg0MTI5NDAyMDk3OVVMTCwgCi0JNDM0MTMyNTY4MjU4ODA0MTk1OVVMTCwgODY4MjY1MTM2NTE3NjA4MzkxOVVMTCwgMTczNjUzMDI3MzAzNTIxNjc4MzlVTEwsIAotCTM0NzMwNjA1NDYwNzA0MzM1NjdVTEwsIDY5NDYxMjEwOTIxNDA4NjcxMzVVTEwsIDEzODkyMjQyMTg0MjgxNzM0MjcxVUxMLCAKLQkyNzc4NDQ4NDM2ODU2MzQ2ODU0VUxMLCA1NTU2ODk2ODczNzEyNjkzNzA4VUxMLCAxMTExMzc5Mzc0NzQyNTM4NzQxN1VMTCwgCi0JMjIyMjc1ODc0OTQ4NTA3NzQ4M1VMTCwgNDQ0NTUxNzQ5ODk3MDE1NDk2NlVMTCwgODg5MTAzNDk5Nzk0MDMwOTkzM1VMTCwgCi0JMTc3ODIwNjk5OTU4ODA2MTk4NjdVTEwsIDM1NTY0MTM5OTkxNzYxMjM5NzNVTEwsIDcxMTI4Mjc5OTgzNTIyNDc5NDdVTEwsIAotCTE0MjI1NjU1OTk2NzA0NDk1ODk0VUxMLCAyODQ1MTMxMTk5MzQwODk5MTc4VUxMLCA1NjkwMjYyMzk4NjgxNzk4MzU3VUxMLCAKLQkxMTM4MDUyNDc5NzM2MzU5NjcxNVVMTCwgMjI3NjEwNDk1OTQ3MjcxOTM0M1VMTCwgNDU1MjIwOTkxODk0NTQzODY4NlVMTCwgCi0JOTEwNDQxOTgzNzg5MDg3NzM3MlVMTCwgMTgyMDg4Mzk2NzU3ODE3NTQ3NDRVTEwsIDM2NDE3Njc5MzUxNTYzNTA5NDhVTEwsIAotCTcyODM1MzU4NzAzMTI3MDE4OTdVTEwsIDE0NTY3MDcxNzQwNjI1NDAzNzk1VUxMLCAyOTEzNDE0MzQ4MTI1MDgwNzU5VUxMLCAKLQk1ODI2ODI4Njk2MjUwMTYxNTE4VUxMLCAxMTY1MzY1NzM5MjUwMDMyMzAzNlVMTCwgMjMzMDczMTQ3ODUwMDA2NDYwN1VMTCwgCi0JNDY2MTQ2Mjk1NzAwMDEyOTIxNFVMTCwgOTMyMjkyNTkxNDAwMDI1ODQyOVVMTCwgMTg2NDU4NTE4MjgwMDA1MTY4NVVMTCwgCi0JMzcyOTE3MDM2NTYwMDEwMzM3MVVMTCwgNzQ1ODM0MDczMTIwMDIwNjc0M1VMTCwgMTQ5MTY2ODE0NjI0MDA0MTM0ODZVTEwsIAotCTI5ODMzMzYyOTI0ODAwODI2OTdVTEwsIDU5NjY2NzI1ODQ5NjAxNjUzOTRVTEwsIDExOTMzMzQ1MTY5OTIwMzMwNzg5VUxMLCAKLQkyMzg2NjY5MDMzOTg0MDY2MTU3VUxMLCA0NzczMzM4MDY3OTY4MTMyMzE1VUxMLCA5NTQ2Njc2MTM1OTM2MjY0NjMxVUxMLCAKLQkxOTA5MzM1MjI3MTg3MjUyOTI2VUxMLCAzODE4NjcwNDU0Mzc0NTA1ODUyVUxMLCA3NjM3MzQwOTA4NzQ5MDExNzA1VUxMLCAKLQkxNTI3NDY4MTgxNzQ5ODAyMzQxMFVMTCwgMzA1NDkzNjM2MzQ5OTYwNDY4MlVMTCwgNjEwOTg3MjcyNjk5OTIwOTM2NFVMTCwgCi0JMTIyMTk3NDU0NTM5OTg0MTg3MjhVTEwsIDI0NDM5NDkwOTA3OTk2ODM3NDVVTEwsIDQ4ODc4OTgxODE1OTkzNjc0OTFVTEwsIAotCTk3NzU3OTYzNjMxOTg3MzQ5ODJVTEwsIDE5NTUxNTkyNzI2Mzk3NDY5OTZVTEwsIDM5MTAzMTg1NDUyNzk0OTM5OTNVTEwsIAotCTc4MjA2MzcwOTA1NTg5ODc5ODZVTEwsIDE1NjQxMjc0MTgxMTE3OTc1OTcyVUxMLCAzMTI4MjU0ODM2MjIzNTk1MTk0VUxMLCAKLQk2MjU2NTA5NjcyNDQ3MTkwMzg4VUxMLCAxMjUxMzAxOTM0NDg5NDM4MDc3N1VMTCwgMjUwMjYwMzg2ODk3ODg3NjE1NVVMTCwgCi0JNTAwNTIwNzczNzk1Nzc1MjMxMVVMTCwgMTAwMTA0MTU0NzU5MTU1MDQ2MjJVTEwsIDIwMDIwODMwOTUxODMxMDA5MjRVTEwsIAotCTQwMDQxNjYxOTAzNjYyMDE4NDhVTEwsIDgwMDgzMzIzODA3MzI0MDM2OTdVTEwsIDE2MDE2NjY0NzYxNDY0ODA3Mzk1VUxMLCAKLQkzMjAzMzMyOTUyMjkyOTYxNDc5VUxMLCA2NDA2NjY1OTA0NTg1OTIyOTU4VUxMLCAxMjgxMzMzMTgwOTE3MTg0NTkxNlVMTCwgCi0JMjU2MjY2NjM2MTgzNDM2OTE4M1VMTCwgNTEyNTMzMjcyMzY2ODczODM2NlVMTCwgMTAyNTA2NjU0NDczMzc0NzY3MzNVTEwsIAotCTIwNTAxMzMwODk0Njc0OTUzNDZVTEwsIDQxMDAyNjYxNzg5MzQ5OTA2OTNVTEwsIDgyMDA1MzIzNTc4Njk5ODEzODZVTEwsIAotCTE2NDAxMDY0NzE1NzM5OTYyNzcyVUxMLCAzMjgwMjEyOTQzMTQ3OTkyNTU0VUxMLCA2NTYwNDI1ODg2Mjk1OTg1MTA5VUxMLCAKLQkxMzEyMDg1MTc3MjU5MTk3MDIxOFVMTCwgMjYyNDE3MDM1NDUxODM5NDA0M1VMTCwgNTI0ODM0MDcwOTAzNjc4ODA4N1VMTCwgCi0JMTA0OTY2ODE0MTgwNzM1NzYxNzRVTEwsIDIwOTkzMzYyODM2MTQ3MTUyMzRVTEwsIDQxOTg2NzI1NjcyMjk0MzA0NjlVTEwsIAotCTgzOTczNDUxMzQ0NTg4NjA5MzlVTEwsIDE2Nzk0NjkwMjY4OTE3NzIxODc5VUxMLCAzMzU4OTM4MDUzNzgzNTQ0Mzc1VUxMLCAKLQk2NzE3ODc2MTA3NTY3MDg4NzUxVUxMLCAxMzQzNTc1MjIxNTEzNDE3NzUwM1VMTCwgMjY4NzE1MDQ0MzAyNjgzNTUwMFVMTCwgCi0JNTM3NDMwMDg4NjA1MzY3MTAwMVVMTCwgMTA3NDg2MDE3NzIxMDczNDIwMDJVTEwsIDIxNDk3MjAzNTQ0MjE0Njg0MDBVTEwsIAotCTQyOTk0NDA3MDg4NDI5MzY4MDFVTEwsIDg1OTg4ODE0MTc2ODU4NzM2MDJVTEwsIDE3MTk3NzYyODM1MzcxNzQ3MjA0VUxMLCAKLQkzNDM5NTUyNTY3MDc0MzQ5NDQwVUxMLCA2ODc5MTA1MTM0MTQ4Njk4ODgxVUxMLCAxMzc1ODIxMDI2ODI5NzM5Nzc2M1VMTCwgCi0JMjc1MTY0MjA1MzY1OTQ3OTU1MlVMTCwgNTUwMzI4NDEwNzMxODk1OTEwNVVMTCwgMTEwMDY1NjgyMTQ2Mzc5MTgyMTBVTEwsIAotCTIyMDEzMTM2NDI5Mjc1ODM2NDJVTEwsIDQ0MDI2MjcyODU4NTUxNjcyODRVTEwsIDg4MDUyNTQ1NzE3MTAzMzQ1NjhVTEwsIAotCTE3NjEwNTA5MTQzNDIwNjY5MTM3VUxMLCAzNTIyMTAxODI4Njg0MTMzODI3VUxMLCA3MDQ0MjAzNjU3MzY4MjY3NjU0VUxMLCAKLQkxNDA4ODQwNzMxNDczNjUzNTMwOVVMTCwgMjgxNzY4MTQ2Mjk0NzMwNzA2MVVMTCwgNTYzNTM2MjkyNTg5NDYxNDEyM1VMTCwgCi0JMTEyNzA3MjU4NTE3ODkyMjgyNDdVTEwsIDIyNTQxNDUxNzAzNTc4NDU2NDlVTEwsIDQ1MDgyOTAzNDA3MTU2OTEyOTlVTEwsIAotCTkwMTY1ODA2ODE0MzEzODI1OThVTEwsIDE4MDMzMTYxMzYyODYyNzY1MTk2VUxMLCAzNjA2NjMyMjcyNTcyNTUzMDM5VUxMLCAKLQk3MjEzMjY0NTQ1MTQ1MTA2MDc4VUxMLCAxNDQyNjUyOTA5MDI5MDIxMjE1N1VMTCwgMjg4NTMwNTgxODA1ODA0MjQzMVVMTCwgCi0JNTc3MDYxMTYzNjExNjA4NDg2MlVMTCwgMTE1NDEyMjMyNzIyMzIxNjk3MjVVTEwsIDIzMDgyNDQ2NTQ0NDY0MzM5NDVVTEwsIAotCTQ2MTY0ODkzMDg4OTI4Njc4OTBVTEwsIDkyMzI5Nzg2MTc3ODU3MzU3ODBVTEwsIDE4NDY1OTU3MjM1NTcxNDcxNTZVTEwsIAotCTM2OTMxOTE0NDcxMTQyOTQzMTJVTEwsIDczODYzODI4OTQyMjg1ODg2MjRVTEwsIDE0NzcyNzY1Nzg4NDU3MTc3MjQ5VUxMLCAKLQkyOTU0NTUzMTU3NjkxNDM1NDQ5VUxMLCA1OTA5MTA2MzE1MzgyODcwODk5VUxMLCAxMTgxODIxMjYzMDc2NTc0MTc5OVVMTCwgCi0JMjM2MzY0MjUyNjE1MzE0ODM1OVVMTCwgNDcyNzI4NTA1MjMwNjI5NjcxOVVMTCwgOTQ1NDU3MDEwNDYxMjU5MzQzOVVMTCwgCi0JMTg5MDkxNDAyMDkyMjUxODY4N1VMTCwgMzc4MTgyODA0MTg0NTAzNzM3NVVMTCwgNzU2MzY1NjA4MzY5MDA3NDc1MVVMTCwgCi0JMTUxMjczMTIxNjczODAxNDk1MDNVTEwsIDMwMjU0NjI0MzM0NzYwMjk5MDBVTEwsIDYwNTA5MjQ4NjY5NTIwNTk4MDFVTEwsIAotCTEyMTAxODQ5NzMzOTA0MTE5NjAyVUxMLCAyNDIwMzY5OTQ2NzgwODIzOTIwVUxMLCA0ODQwNzM5ODkzNTYxNjQ3ODQxVUxMLCAKLQk5NjgxNDc5Nzg3MTIzMjk1NjgyVUxMLCAxOTM2Mjk1OTU3NDI0NjU5MTM2VUxMLCAzODcyNTkxOTE0ODQ5MzE4MjcyVUxMLCAKLQk3NzQ1MTgzODI5Njk4NjM2NTQ1VUxMLCAxNTQ5MDM2NzY1OTM5NzI3MzA5MVVMTCwgMzA5ODA3MzUzMTg3OTQ1NDYxOFVMTCwgCi0JNjE5NjE0NzA2Mzc1ODkwOTIzNlVMTCwgMTIzOTIyOTQxMjc1MTc4MTg0NzNVTEwsIDI0Nzg0NTg4MjU1MDM1NjM2OTRVTEwsIAotCTQ5NTY5MTc2NTEwMDcxMjczODlVTEwsIDk5MTM4MzUzMDIwMTQyNTQ3NzhVTEwsIDE5ODI3NjcwNjA0MDI4NTA5NTVVTEwsIAotCTM5NjU1MzQxMjA4MDU3MDE5MTFVTEwsIDc5MzEwNjgyNDE2MTE0MDM4MjJVTEwsIDE1ODYyMTM2NDgzMjIyODA3NjQ1VUxMLCAKLQkzMTcyNDI3Mjk2NjQ0NTYxNTI5VUxMLCA2MzQ0ODU0NTkzMjg5MTIzMDU4VUxMLCAxMjY4OTcwOTE4NjU3ODI0NjExNlVMTCwgCi0JMjUzNzk0MTgzNzMxNTY0OTIyM1VMTCwgNTA3NTg4MzY3NDYzMTI5ODQ0NlVMTCwgMTAxNTE3NjczNDkyNjI1OTY4OTNVTEwsIAotCTIwMzAzNTM0Njk4NTI1MTkzNzhVTEwsIDQwNjA3MDY5Mzk3MDUwMzg3NTdVTEwsIDgxMjE0MTM4Nzk0MTAwNzc1MTRVTEwsIAotCTE2MjQyODI3NzU4ODIwMTU1MDI4VUxMLCAzMjQ4NTY1NTUxNzY0MDMxMDA1VUxMLCA2NDk3MTMxMTAzNTI4MDYyMDExVUxMLCAKLQkxMjk5NDI2MjIwNzA1NjEyNDAyM1VMTCwgMjU5ODg1MjQ0MTQxMTIyNDgwNFVMTCwgNTE5NzcwNDg4MjgyMjQ0OTYwOVVMTCwgCi0JMTAzOTU0MDk3NjU2NDQ4OTkyMThVTEwsIDIwNzkwODE5NTMxMjg5Nzk4NDNVTEwsIDQxNTgxNjM5MDYyNTc5NTk2ODdVTEwsIAotCTgzMTYzMjc4MTI1MTU5MTkzNzRVTEwsIDE2NjMyNjU1NjI1MDMxODM4NzQ5VUxMLCAzMzI2NTMxMTI1MDA2MzY3NzQ5VUxMLCAKLQk2NjUzMDYyMjUwMDEyNzM1NDk5VUxMLCAxMzMwNjEyNDUwMDAyNTQ3MDk5OVVMTCwgMjY2MTIyNDkwMDAwNTA5NDE5OVVMTCwgCi0JNTMyMjQ0OTgwMDAxMDE4ODM5OVVMTCwgMTA2NDQ4OTk2MDAwMjAzNzY3OTlVTEwsIDIxMjg5Nzk5MjAwMDQwNzUzNTlVTEwsIAotCTQyNTc5NTk4NDAwMDgxNTA3MTlVTEwsIDg1MTU5MTk2ODAwMTYzMDE0MzlVTEwsIDE3MDMxODM5MzYwMDMyNjAyODc5VUxMLCAKLQkzNDA2MzY3ODcyMDA2NTIwNTc1VUxMLCA2ODEyNzM1NzQ0MDEzMDQxMTUxVUxMLCAxMzYyNTQ3MTQ4ODAyNjA4MjMwM1VMTCwgCi0JMjcyNTA5NDI5NzYwNTIxNjQ2MFVMTCwgNTQ1MDE4ODU5NTIxMDQzMjkyMVVMTCwgMTA5MDAzNzcxOTA0MjA4NjU4NDJVTEwsIAotCTIxODAwNzU0MzgwODQxNzMxNjhVTEwsIDQzNjAxNTA4NzYxNjgzNDYzMzdVTEwsIDg3MjAzMDE3NTIzMzY2OTI2NzRVTEwsIAotCTE3NDQwNjAzNTA0NjczMzg1MzQ4VUxMLCAzNDg4MTIwNzAwOTM0Njc3MDY5VUxMLCA2OTc2MjQxNDAxODY5MzU0MTM5VUxMLCAKLQkxMzk1MjQ4MjgwMzczODcwODI3OVVMTCwgMjc5MDQ5NjU2MDc0Nzc0MTY1NVVMTCwgNTU4MDk5MzEyMTQ5NTQ4MzMxMVVMTCwgCi0JMTExNjE5ODYyNDI5OTA5NjY2MjNVTEwsIDIyMzIzOTcyNDg1OTgxOTMzMjRVTEwsIDQ0NjQ3OTQ0OTcxOTYzODY2NDlVTEwsIAotCTg5Mjk1ODg5OTQzOTI3NzMyOThVTEwsIDE3ODU5MTc3OTg4Nzg1NTQ2NTk3VUxMLCAzNTcxODM1NTk3NzU3MTA5MzE5VUxMLCAKLQk3MTQzNjcxMTk1NTE0MjE4NjM4VUxMLCAxNDI4NzM0MjM5MTAyODQzNzI3N1VMTCwgMjg1NzQ2ODQ3ODIwNTY4NzQ1NVVMTCwgCi0JNTcxNDkzNjk1NjQxMTM3NDkxMVVMTCwgMTE0Mjk4NzM5MTI4MjI3NDk4MjJVTEwsIDIyODU5NzQ3ODI1NjQ1NDk5NjRVTEwsIAotCTQ1NzE5NDk1NjUxMjkwOTk5MjhVTEwsIDkxNDM4OTkxMzAyNTgxOTk4NTdVTEwsIDE4Mjg3Nzk4MjYwNTE2Mzk5NzE1VUxMLCAKLQkzNjU3NTU5NjUyMTAzMjc5OTQzVUxMLCA3MzE1MTE5MzA0MjA2NTU5ODg2VUxMLCAxNDYzMDIzODYwODQxMzExOTc3MlVMTCwgCi0JMjkyNjA0NzcyMTY4MjYyMzk1NFVMTCwgNTg1MjA5NTQ0MzM2NTI0NzkwOFVMTCwgMTE3MDQxOTA4ODY3MzA0OTU4MTdVTEwsIAotCTIzNDA4MzgxNzczNDYwOTkxNjNVTEwsIDQ2ODE2NzYzNTQ2OTIxOTgzMjdVTEwsIDkzNjMzNTI3MDkzODQzOTY2NTRVTEwsIAotCTE4NzI2NzA1NDE4NzY4NzkzMzBVTEwsIDM3NDUzNDEwODM3NTM3NTg2NjFVTEwsIDc0OTA2ODIxNjc1MDc1MTczMjNVTEwsIAotCTE0OTgxMzY0MzM1MDE1MDM0NjQ2VUxMLCAyOTk2MjcyODY3MDAzMDA2OTI5VUxMLCA1OTkyNTQ1NzM0MDA2MDEzODU4VUxMLCAKLQkxMTk4NTA5MTQ2ODAxMjAyNzcxN1VMTCwgMjM5NzAxODI5MzYwMjQwNTU0M1VMTCwgNDc5NDAzNjU4NzIwNDgxMTA4N1VMTCwgCi0JOTU4ODA3MzE3NDQwOTYyMjE3NFVMTCwgMTkxNzYxNDYzNDg4MTkyNDQzNFVMTCwgMzgzNTIyOTI2OTc2Mzg0ODg2OVVMTCwgCi0JNzY3MDQ1ODUzOTUyNzY5NzczOVVMTCwgMTUzNDA5MTcwNzkwNTUzOTU0NzhVTEwsIDMwNjgxODM0MTU4MTEwNzkwOTVVTEwsIAotCTYxMzYzNjY4MzE2MjIxNTgxOTFVTEwsIDEyMjcyNzMzNjYzMjQ0MzE2MzgyVUxMLCAyNDU0NTQ2NzMyNjQ4ODYzMjc2VUxMLCAKLQk0OTA5MDkzNDY1Mjk3NzI2NTUzVUxMLCA5ODE4MTg2OTMwNTk1NDUzMTA2VUxMLCAxOTYzNjM3Mzg2MTE5MDkwNjIxVUxMLCAKLQkzOTI3Mjc0NzcyMjM4MTgxMjQyVUxMLCA3ODU0NTQ5NTQ0NDc2MzYyNDg0VUxMLCAxNTcwOTA5OTA4ODk1MjcyNDk2OVVMTCwgCi0JMzE0MTgxOTgxNzc5MDU0NDk5M1VMTCwgNjI4MzYzOTYzNTU4MTA4OTk4N1VMTCwgMTI1NjcyNzkyNzExNjIxNzk5NzVVTEwsIAotCTI1MTM0NTU4NTQyMzI0MzU5OTVVTEwsIDUwMjY5MTE3MDg0NjQ4NzE5OTBVTEwsIDEwMDUzODIzNDE2OTI5NzQzOTgwVUxMLCAKLQkyMDEwNzY0NjgzMzg1OTQ4Nzk2VUxMLCA0MDIxNTI5MzY2NzcxODk3NTkyVUxMLCA4MDQzMDU4NzMzNTQzNzk1MTg0VUxMLCAKLQkxNjA4NjExNzQ2NzA4NzU5MDM2OVVMTCwgMzIxNzIyMzQ5MzQxNzUxODA3M1VMTCwgNjQzNDQ0Njk4NjgzNTAzNjE0N1VMTCwgCi0JMTI4Njg4OTM5NzM2NzAwNzIyOTVVTEwsIDI1NzM3Nzg3OTQ3MzQwMTQ0NTlVTEwsIDUxNDc1NTc1ODk0NjgwMjg5MThVTEwsIAotCTEwMjk1MTE1MTc4OTM2MDU3ODM2VUxMLCAyMDU5MDIzMDM1Nzg3MjExNTY3VUxMLCA0MTE4MDQ2MDcxNTc0NDIzMTM0VUxMLCAKLQk4MjM2MDkyMTQzMTQ4ODQ2MjY5VUxMLCAxNjQ3MjE4NDI4NjI5NzY5MjUzOFVMTCwgMzI5NDQzNjg1NzI1OTUzODUwN1VMTCwgCi0JNjU4ODg3MzcxNDUxOTA3NzAxNVVMTCwgMTMxNzc3NDc0MjkwMzgxNTQwMzBVTEwsIDI2MzU1NDk0ODU4MDc2MzA4MDZVTEwsIAotCTUyNzEwOTg5NzE2MTUyNjE2MTJVTEwsIDEwNTQyMTk3OTQzMjMwNTIzMjI0VUxMLCAyMTA4NDM5NTg4NjQ2MTA0NjQ0VUxMLCAKLQk0MjE2ODc5MTc3MjkyMjA5Mjg5VUxMLCA4NDMzNzU4MzU0NTg0NDE4NTc5VUxMLCAxNjg2NzUxNjcwOTE2ODgzNzE1OFVMTCwgCi0JMzM3MzUwMzM0MTgzMzc2NzQzMVVMTCwgNjc0NzAwNjY4MzY2NzUzNDg2M1VMTCwgMTM0OTQwMTMzNjczMzUwNjk3MjdVTEwsIAotCTI2OTg4MDI2NzM0NjcwMTM5NDVVTEwsIDUzOTc2MDUzNDY5MzQwMjc4OTBVTEwsIDEwNzk1MjEwNjkzODY4MDU1NzgxVUxMLCAKLQkyMTU5MDQyMTM4NzczNjExMTU2VUxMLCA0MzE4MDg0Mjc3NTQ3MjIyMzEyVUxMLCA4NjM2MTY4NTU1MDk0NDQ0NjI1VUxMLCAKLQkxNzI3MjMzNzExMDE4ODg4OTI1MFVMTCwgMzQ1NDQ2NzQyMjAzNzc3Nzg1MFVMTCwgNjkwODkzNDg0NDA3NTU1NTcwMFVMTCwgCi0JMTM4MTc4Njk2ODgxNTExMTE0MDBVTEwsIDI3NjM1NzM5Mzc2MzAyMjIyODBVTEwsIDU1MjcxNDc4NzUyNjA0NDQ1NjBVTEwsIAotCTExMDU0Mjk1NzUwNTIwODg5MTIwVUxMLCAyMjEwODU5MTUwMTA0MTc3ODI0VUxMLCA0NDIxNzE4MzAwMjA4MzU1NjQ4VUxMLCAKLQk4ODQzNDM2NjAwNDE2NzExMjk2VUxMLCAxNzY4Njg3MzIwMDgzMzQyMjU5MlVMTCwgMzUzNzM3NDY0MDE2NjY4NDUxOFVMTCwgCi0JNzA3NDc0OTI4MDMzMzM2OTAzN1VMTCwgMTQxNDk0OTg1NjA2NjY3MzgwNzRVTEwsIDI4Mjk4OTk3MTIxMzMzNDc2MTRVTEwsIAotCTU2NTk3OTk0MjQyNjY2OTUyMjlVTEwsIDExMzE5NTk4ODQ4NTMzMzkwNDU5VUxMLCAyMjYzOTE5NzY5NzA2Njc4MDkxVUxMLCAKLQk0NTI3ODM5NTM5NDEzMzU2MTgzVUxMLCA5MDU1Njc5MDc4ODI2NzEyMzY3VUxMLCAxODExMTM1ODE1NzY1MzQyNDczNVVMTCwgCi0JMzYyMjI3MTYzMTUzMDY4NDk0N1VMTCwgNzI0NDU0MzI2MzA2MTM2OTg5NFVMTCwgMTQ0ODkwODY1MjYxMjI3Mzk3ODhVTEwsIAotCTI4OTc4MTczMDUyMjQ1NDc5NTdVTEwsIDU3OTU2MzQ2MTA0NDkwOTU5MTVVTEwsIDExNTkxMjY5MjIwODk4MTkxODMwVUxMLCAKLQkyMzE4MjUzODQ0MTc5NjM4MzY2VUxMLCA0NjM2NTA3Njg4MzU5Mjc2NzMyVUxMLCA5MjczMDE1Mzc2NzE4NTUzNDY0VUxMLCAKLQkxODU0NjAzMDc1MzQzNzEwNjkyVUxMLCAzNzA5MjA2MTUwNjg3NDIxMzg1VUxMLCA3NDE4NDEyMzAxMzc0ODQyNzcxVUxMLCAKLQkxNDgzNjgyNDYwMjc0OTY4NTU0MlVMTCwgMjk2NzM2NDkyMDU0OTkzNzEwOFVMTCwgNTkzNDcyOTg0MTA5OTg3NDIxN1VMTCwgCi0JMTE4Njk0NTk2ODIxOTk3NDg0MzRVTEwsIDIzNzM4OTE5MzY0Mzk5NDk2ODZVTEwsIDQ3NDc3ODM4NzI4Nzk4OTkzNzNVTEwsIAotCTk0OTU1Njc3NDU3NTk3OTg3NDdVTEwsIDE4OTkxMTM1NDkxNTE5NTk3NDlVTEwsIDM3OTgyMjcwOTgzMDM5MTk0OThVTEwsIAotCTc1OTY0NTQxOTY2MDc4Mzg5OTdVTEwsIDE1MTkyOTA4MzkzMjE1Njc3OTk1VUxMLCAzMDM4NTgxNjc4NjQzMTM1NTk5VUxMLCAKLQk2MDc3MTYzMzU3Mjg2MjcxMTk4VUxMLCAxMjE1NDMyNjcxNDU3MjU0MjM5NlVMTCwgMjQzMDg2NTM0MjkxNDUwODQ3OVVMTCwgCi0JNDg2MTczMDY4NTgyOTAxNjk1OFVMTCwgOTcyMzQ2MTM3MTY1ODAzMzkxN1VMTCwgMTk0NDY5MjI3NDMzMTYwNjc4M1VMTCwgCi0JMzg4OTM4NDU0ODY2MzIxMzU2NlVMTCwgNzc3ODc2OTA5NzMyNjQyNzEzM1VMTCwgMTU1NTc1MzgxOTQ2NTI4NTQyNjdVTEwsIAotCTMxMTE1MDc2Mzg5MzA1NzA4NTNVTEwsIDYyMjMwMTUyNzc4NjExNDE3MDdVTEwsIDEyNDQ2MDMwNTU1NzIyMjgzNDE0VUxMLCAKLQkyNDg5MjA2MTExMTQ0NDU2NjgyVUxMLCA0OTc4NDEyMjIyMjg4OTEzMzY1VUxMLCA5OTU2ODI0NDQ0NTc3ODI2NzMxVUxMLCAKLQkxOTkxMzY0ODg4OTE1NTY1MzQ2VUxMLCAzOTgyNzI5Nzc3ODMxMTMwNjkyVUxMLCA3OTY1NDU5NTU1NjYyMjYxMzg1VUxMLCAKLQkxNTkzMDkxOTExMTMyNDUyMjc3MFVMTCwgMzE4NjE4MzgyMjI2NDkwNDU1NFVMTCwgNjM3MjM2NzY0NDUyOTgwOTEwOFVMTCwgCi0JMTI3NDQ3MzUyODkwNTk2MTgyMTZVTEwsIDI1NDg5NDcwNTc4MTE5MjM2NDNVTEwsIDUwOTc4OTQxMTU2MjM4NDcyODZVTEwsIAotCTEwMTk1Nzg4MjMxMjQ3Njk0NTcyVUxMLCAyMDM5MTU3NjQ2MjQ5NTM4OTE0VUxMLCA0MDc4MzE1MjkyNDk5MDc3ODI5VUxMLCAKLQk4MTU2NjMwNTg0OTk4MTU1NjU4VUxMLCAxNjMxMzI2MTE2OTk5NjMxMTMxNlVMTCwgMzI2MjY1MjIzMzk5OTI2MjI2M1VMTCwgCi0JNjUyNTMwNDQ2Nzk5ODUyNDUyNlVMTCwgMTMwNTA2MDg5MzU5OTcwNDkwNTNVTEwsIDI2MTAxMjE3ODcxOTk0MDk4MTBVTEwsIAotCTUyMjAyNDM1NzQzOTg4MTk2MjFVTEwsIDEwNDQwNDg3MTQ4Nzk3NjM5MjQyVUxMLCAyMDg4MDk3NDI5NzU5NTI3ODQ4VUxMLCAKLQk0MTc2MTk0ODU5NTE5MDU1Njk3VUxMLCA4MzUyMzg5NzE5MDM4MTExMzk0VUxMLCAxNjcwNDc3OTQzODA3NjIyMjc4OFVMTCwgCi0JMzM0MDk1NTg4NzYxNTI0NDU1N1VMTCwgNjY4MTkxMTc3NTIzMDQ4OTExNVVMTCwgMTMzNjM4MjM1NTA0NjA5NzgyMzBVTEwsIAotCTI2NzI3NjQ3MTAwOTIxOTU2NDZVTEwsIDUzNDU1Mjk0MjAxODQzOTEyOTJVTEwsIDEwNjkxMDU4ODQwMzY4NzgyNTg0VUxMLCAKLQkyMTM4MjExNzY4MDczNzU2NTE2VUxMLCA0Mjc2NDIzNTM2MTQ3NTEzMDMzVUxMLCA4NTUyODQ3MDcyMjk1MDI2MDY3VUxMLCAKLQkxNzEwNTY5NDE0NDU5MDA1MjEzNVVMTCwgMzQyMTEzODgyODkxODAxMDQyN1VMTCwgNjg0MjI3NzY1NzgzNjAyMDg1NFVMTCwgCi0JMTM2ODQ1NTUzMTU2NzIwNDE3MDhVTEwsIDI3MzY5MTEwNjMxMzQ0MDgzNDFVTEwsIDU0NzM4MjIxMjYyNjg4MTY2ODNVTEwsIAotCTEwOTQ3NjQ0MjUyNTM3NjMzMzY2VUxMLCAyMTg5NTI4ODUwNTA3NTI2NjczVUxMLCA0Mzc5MDU3NzAxMDE1MDUzMzQ2VUxMLCAKLQk4NzU4MTE1NDAyMDMwMTA2NjkzVUxMLCAxNzUxNjIzMDgwNDA2MDIxMzM4NlVMTCwgMzUwMzI0NjE2MDgxMjA0MjY3N1VMTCwgCi0JNzAwNjQ5MjMyMTYyNDA4NTM1NFVMTCwgMTQwMTI5ODQ2NDMyNDgxNzA3MDlVTEwsIDI4MDI1OTY5Mjg2NDk2MzQxNDFVTEwsIAotCTU2MDUxOTM4NTcyOTkyNjgyODNVTEwsIDExMjEwMzg3NzE0NTk4NTM2NTY3VUxMLCAyMjQyMDc3NTQyOTE5NzA3MzEzVUxMLCAKLQk0NDg0MTU1MDg1ODM5NDE0NjI2VUxMLCA4OTY4MzEwMTcxNjc4ODI5MjUzVUxMLCAxNzkzNjYyMDM0MzM1NzY1ODUwN1VMTCwgCi0JMzU4NzMyNDA2ODY3MTUzMTcwMVVMTCwgNzE3NDY0ODEzNzM0MzA2MzQwM1VMTCwgMTQzNDkyOTYyNzQ2ODYxMjY4MDZVTEwsIAotCTI4Njk4NTkyNTQ5MzcyMjUzNjFVTEwsIDU3Mzk3MTg1MDk4NzQ0NTA3MjJVTEwsIDExNDc5NDM3MDE5NzQ4OTAxNDQ1VUxMLCAKLQkyMjk1ODg3NDAzOTQ5NzgwMjg5VUxMLCA0NTkxNzc0ODA3ODk5NTYwNTc4VUxMLCA5MTgzNTQ5NjE1Nzk5MTIxMTU2VUxMLCAKLQkxODM2NzA5OTIzMTU5ODI0MjMxMlVMTCwgMzY3MzQxOTg0NjMxOTY0ODQ2MlVMTCwgNzM0NjgzOTY5MjYzOTI5NjkyNFVMTCwgCi0JMTQ2OTM2NzkzODUyNzg1OTM4NDlVTEwsIDI5Mzg3MzU4NzcwNTU3MTg3NjlVTEwsIDU4Nzc0NzE3NTQxMTE0Mzc1MzlVTEwsIAotCTExNzU0OTQzNTA4MjIyODc1MDc5VUxMLCAyMzUwOTg4NzAxNjQ0NTc1MDE1VUxMLCA0NzAxOTc3NDAzMjg5MTUwMDMxVUxMLCAKLQk5NDAzOTU0ODA2NTc4MzAwMDYzVUxMLCAxODgwNzkwOTYxMzE1NjYwMDEyVUxMLCAzNzYxNTgxOTIyNjMxMzIwMDI1VUxMLCAKLQk3NTIzMTYzODQ1MjYyNjQwMDUwVUxMLCAxNTA0NjMyNzY5MDUyNTI4MDEwMVVMTCwgMzAwOTI2NTUzODEwNTA1NjAyMFVMTCwgCi0JNjAxODUzMTA3NjIxMDExMjA0MFVMTCwgMTIwMzcwNjIxNTI0MjAyMjQwODFVTEwsIDI0MDc0MTI0MzA0ODQwNDQ4MTZVTEwsIAotCTQ4MTQ4MjQ4NjA5NjgwODk2MzJVTEwsIDk2Mjk2NDk3MjE5MzYxNzkyNjVVTEwsIDE5MjU5Mjk5NDQzODcyMzU4NTNVTEwsIAotCTM4NTE4NTk4ODg3NzQ0NzE3MDZVTEwsIDc3MDM3MTk3Nzc1NDg5NDM0MTJVTEwsIDE1NDA3NDM5NTU1MDk3ODg2ODI0VUxMLCAKLQkzMDgxNDg3OTExMDE5NTc3MzY0VUxMLCA2MTYyOTc1ODIyMDM5MTU0NzI5VUxMLCAxMjMyNTk1MTY0NDA3ODMwOTQ1OVVMTCwgCi0JMjQ2NTE5MDMyODgxNTY2MTg5MVVMTCwgNDkzMDM4MDY1NzYzMTMyMzc4M1VMTCwgOTg2MDc2MTMxNTI2MjY0NzU2N1VMTCwgCi0JMTk3MjE1MjI2MzA1MjUyOTUxM1VMTCwgMzk0NDMwNDUyNjEwNTA1OTAyN1VMTCwgNzg4ODYwOTA1MjIxMDExODA1NFVMTCwgCi0JMTU3NzcyMTgxMDQ0MjAyMzYxMDhVTEwsIDMxNTU0NDM2MjA4ODQwNDcyMjFVTEwsIDYzMTA4ODcyNDE3NjgwOTQ0NDNVTEwsIAotCTEyNjIxNzc0NDgzNTM2MTg4ODg2VUxMLCAyNTI0MzU0ODk2NzA3MjM3Nzc3VUxMLCA1MDQ4NzA5NzkzNDE0NDc1NTU0VUxMLCAKLQkxMDA5NzQxOTU4NjgyODk1MTEwOVVMTCwgMjAxOTQ4MzkxNzM2NTc5MDIyMVVMTCwgNDAzODk2NzgzNDczMTU4MDQ0M1VMTCwgCi0JODA3NzkzNTY2OTQ2MzE2MDg4N1VMTCwgMTYxNTU4NzEzMzg5MjYzMjE3NzRVTEwsIDMyMzExNzQyNjc3ODUyNjQzNTRVTEwsIAotCTY0NjIzNDg1MzU1NzA1Mjg3MDlVTEwsIDEyOTI0Njk3MDcxMTQxMDU3NDE5VUxMLCAyNTg0OTM5NDE0MjI4MjExNDgzVUxMLCAKLQk1MTY5ODc4ODI4NDU2NDIyOTY3VUxMLCAxMDMzOTc1NzY1NjkxMjg0NTkzNVVMTCwgMjA2Nzk1MTUzMTM4MjU2OTE4N1VMTCwgCi0JNDEzNTkwMzA2Mjc2NTEzODM3NFVMTCwgODI3MTgwNjEyNTUzMDI3Njc0OFVMTCwgMTY1NDM2MTIyNTEwNjA1NTM0OTdVTEwsIAotCTMzMDg3MjI0NTAyMTIxMTA2OTlVTEwsIDY2MTc0NDQ5MDA0MjQyMjEzOThVTEwsIDEzMjM0ODg5ODAwODQ4NDQyNzk3VUxMLCAKLQkyNjQ2OTc3OTYwMTY5Njg4NTU5VUxMLCA1MjkzOTU1OTIwMzM5Mzc3MTE5VUxMLCAxMDU4NzkxMTg0MDY3ODc1NDIzOFVMTCwgCi0JMjExNzU4MjM2ODEzNTc1MDg0N1VMTCwgNDIzNTE2NDczNjI3MTUwMTY5NVVMTCwgODQ3MDMyOTQ3MjU0MzAwMzM5MFVMTCwgCi0JMTY5NDA2NTg5NDUwODYwMDY3ODFVTEwsIDMzODgxMzE3ODkwMTcyMDEzNTZVTEwsIDY3NzYyNjM1NzgwMzQ0MDI3MTJVTEwsIAotCTEzNTUyNTI3MTU2MDY4ODA1NDI1VUxMLCAyNzEwNTA1NDMxMjEzNzYxMDg1VUxMLCA1NDIxMDEwODYyNDI3NTIyMTcwVUxMLCAKLQkxMDg0MjAyMTcyNDg1NTA0NDM0MFVMTCwgMjE2ODQwNDM0NDk3MTAwODg2OFVMTCwgNDMzNjgwODY4OTk0MjAxNzczNlVMTCwgCi0JODY3MzYxNzM3OTg4NDAzNTQ3MlVMTCwgMTczNDcyMzQ3NTk3NjgwNzA5NDRVTEwsIDM0Njk0NDY5NTE5NTM2MTQxODhVTEwsIAotCTY5Mzg4OTM5MDM5MDcyMjgzNzdVTEwsIDEzODc3Nzg3ODA3ODE0NDU2NzU1VUxMLCAyNzc1NTU3NTYxNTYyODkxMzUxVUxMLCAKLQk1NTUxMTE1MTIzMTI1NzgyNzAyVUxMLCAxMTEwMjIzMDI0NjI1MTU2NTQwNFVMTCwgMjIyMDQ0NjA0OTI1MDMxMzA4MFVMTCwgCi0JNDQ0MDg5MjA5ODUwMDYyNjE2MVVMTCwgODg4MTc4NDE5NzAwMTI1MjMyM1VMTCwgMTc3NjM1NjgzOTQwMDI1MDQ2NDZVTEwsIAotCTM1NTI3MTM2Nzg4MDA1MDA5MjlVTEwsIDcxMDU0MjczNTc2MDEwMDE4NThVTEwsIDE0MjEwODU0NzE1MjAyMDAzNzE3VUxMLCAKLQkyODQyMTcwOTQzMDQwNDAwNzQzVUxMLCA1Njg0MzQxODg2MDgwODAxNDg2VUxMLCAxMTM2ODY4Mzc3MjE2MTYwMjk3M1VMTCwgCi0JMjI3MzczNjc1NDQzMjMyMDU5NFVMTCwgNDU0NzQ3MzUwODg2NDY0MTE4OVVMTCwgOTA5NDk0NzAxNzcyOTI4MjM3OVVMTCwgCi0JMTgxODk4OTQwMzU0NTg1NjQ3NThVTEwsIDM2Mzc5Nzg4MDcwOTE3MTI5NTFVTEwsIDcyNzU5NTc2MTQxODM0MjU5MDNVTEwsIAotCTE0NTUxOTE1MjI4MzY2ODUxODA2VUxMLCAyOTEwMzgzMDQ1NjczMzcwMzYxVUxMLCA1ODIwNzY2MDkxMzQ2NzQwNzIyVUxMLCAKLQkxMTY0MTUzMjE4MjY5MzQ4MTQ0NVVMTCwgMjMyODMwNjQzNjUzODY5NjI4OVVMTCwgNDY1NjYxMjg3MzA3NzM5MjU3OFVMTCwgCi0JOTMxMzIyNTc0NjE1NDc4NTE1NlVMTCwgMTg2MjY0NTE0OTIzMDk1NzAzMVVMTCwgMzcyNTI5MDI5ODQ2MTkxNDA2MlVMTCwgCi0JNzQ1MDU4MDU5NjkyMzgyODEyNVVMTCwgMTQ5MDExNjExOTM4NDc2NTYyNTBVTEwsIDI5ODAyMzIyMzg3Njk1MzEyNTBVTEwsIAotCTU5NjA0NjQ0Nzc1MzkwNjI1MDBVTEwsIDExOTIwOTI4OTU1MDc4MTI1MDAwVUxMLCAyMzg0MTg1NzkxMDE1NjI1MDAwVUxMLCAKLQk0NzY4MzcxNTgyMDMxMjUwMDAwVUxMLCA5NTM2NzQzMTY0MDYyNTAwMDAwVUxMLCAxOTA3MzQ4NjMyODEyNTAwMDAwVUxMLCAKLQkzODE0Njk3MjY1NjI1MDAwMDAwVUxMLCA3NjI5Mzk0NTMxMjUwMDAwMDAwVUxMLCAxNTI1ODc4OTA2MjUwMDAwMDAwMFVMTCwgCi0JMzA1MTc1NzgxMjUwMDAwMDAwMFVMTCwgNjEwMzUxNTYyNTAwMDAwMDAwMFVMTCwgMTIyMDcwMzEyNTAwMDAwMDAwMDBVTEwsIAotCTI0NDE0MDYyNTAwMDAwMDAwMDBVTEwsIDQ4ODI4MTI1MDAwMDAwMDAwMDBVTEwsIDk3NjU2MjUwMDAwMDAwMDAwMDBVTEwsIAotCTE5NTMxMjUwMDAwMDAwMDAwMDBVTEwsIDM5MDYyNTAwMDAwMDAwMDAwMDBVTEwsIDc4MTI1MDAwMDAwMDAwMDAwMDBVTEwsIAotCTE1NjI1MDAwMDAwMDAwMDAwMDAwVUxMLCAzMTI1MDAwMDAwMDAwMDAwMDAwVUxMLCA2MjUwMDAwMDAwMDAwMDAwMDAwVUxMLCAKLQkxMjUwMDAwMDAwMDAwMDAwMDAwMFVMTCwgMjUwMDAwMDAwMDAwMDAwMDAwMFVMTCwgNTAwMDAwMDAwMDAwMDAwMDAwMFVMTCwgCi0JMTAwMDAwMDAwMDAwMDAwMDAwMDBVTEwsIDIwMDAwMDAwMDAwMDAwMDAwMDBVTEwsIDQwMDAwMDAwMDAwMDAwMDAwMDBVTEwsIAotCTgwMDAwMDAwMDAwMDAwMDAwMDBVTEwsIDE2MDAwMDAwMDAwMDAwMDAwMDAwVUxMLCAzMjAwMDAwMDAwMDAwMDAwMDAwVUxMLCAKLQk2NDAwMDAwMDAwMDAwMDAwMDAwVUxMLCAxMjgwMDAwMDAwMDAwMDAwMDAwMFVMTCwgMjU2MDAwMDAwMDAwMDAwMDAwMFVMTCwgCi0JNTEyMDAwMDAwMDAwMDAwMDAwMFVMTCwgMTAyNDAwMDAwMDAwMDAwMDAwMDBVTEwsIDIwNDgwMDAwMDAwMDAwMDAwMDBVTEwsIAotCTQwOTYwMDAwMDAwMDAwMDAwMDBVTEwsIDgxOTIwMDAwMDAwMDAwMDAwMDBVTEwsIDE2Mzg0MDAwMDAwMDAwMDAwMDAwVUxMLCAKLQkzMjc2ODAwMDAwMDAwMDAwMDAwVUxMLCA2NTUzNjAwMDAwMDAwMDAwMDAwVUxMLCAxMzEwNzIwMDAwMDAwMDAwMDAwMFVMTCwgCi0JMjYyMTQ0MDAwMDAwMDAwMDAwMFVMTCwgNTI0Mjg4MDAwMDAwMDAwMDAwMFVMTCwgMTA0ODU3NjAwMDAwMDAwMDAwMDBVTEwsIAotCTIwOTcxNTIwMDAwMDAwMDAwMDBVTEwsIDQxOTQzMDQwMDAwMDAwMDAwMDBVTEwsIDgzODg2MDgwMDAwMDAwMDAwMDBVTEwsIAotCTE2Nzc3MjE2MDAwMDAwMDAwMDAwVUxMLCAzMzU1NDQzMjAwMDAwMDAwMDAwVUxMLCA2NzEwODg2NDAwMDAwMDAwMDAwVUxMLCAKLQkxMzQyMTc3MjgwMDAwMDAwMDAwMFVMTCwgMjY4NDM1NDU2MDAwMDAwMDAwMFVMTCwgNTM2ODcwOTEyMDAwMDAwMDAwMFVMTCwgCi0JMTA3Mzc0MTgyNDAwMDAwMDAwMDBVTEwsIDIxNDc0ODM2NDgwMDAwMDAwMDBVTEwsIDQyOTQ5NjcyOTYwMDAwMDAwMDBVTEwsIAotCTg1ODk5MzQ1OTIwMDAwMDAwMDBVTEwsIDE3MTc5ODY5MTg0MDAwMDAwMDAwVUxMLCAzNDM1OTczODM2ODAwMDAwMDAwVUxMLCAKLQk2ODcxOTQ3NjczNjAwMDAwMDAwVUxMLCAxMzc0Mzg5NTM0NzIwMDAwMDAwMFVMTCwgMjc0ODc3OTA2OTQ0MDAwMDAwMFVMTCwgCi0JNTQ5NzU1ODEzODg4MDAwMDAwMFVMTCwgMTA5OTUxMTYyNzc3NjAwMDAwMDBVTEwsIDIxOTkwMjMyNTU1NTIwMDAwMDBVTEwsIAotCTQzOTgwNDY1MTExMDQwMDAwMDBVTEwsIDg3OTYwOTMwMjIyMDgwMDAwMDBVTEwsIDE3NTkyMTg2MDQ0NDE2MDAwMDAwVUxMLCAKLQkzNTE4NDM3MjA4ODgzMjAwMDAwVUxMLCA3MDM2ODc0NDE3NzY2NDAwMDAwVUxMLCAxNDA3Mzc0ODgzNTUzMjgwMDAwMFVMTCwgCi0JMjgxNDc0OTc2NzEwNjU2MDAwMFVMTCwgNTYyOTQ5OTUzNDIxMzEyMDAwMFVMTCwgMTEyNTg5OTkwNjg0MjYyNDAwMDBVTEwsIAotCTIyNTE3OTk4MTM2ODUyNDgwMDBVTEwsIDQ1MDM1OTk2MjczNzA0OTYwMDBVTEwsIDkwMDcxOTkyNTQ3NDA5OTIwMDBVTEwsIAotCTE4MDE0Mzk4NTA5NDgxOTg0MDAwVUxMLCAzNjAyODc5NzAxODk2Mzk2ODAwVUxMLCA3MjA1NzU5NDAzNzkyNzkzNjAwVUxMLCAKLQkxNDQxMTUxODgwNzU4NTU4NzIwMFVMTCwgMjg4MjMwMzc2MTUxNzExNzQ0MFVMTCwgNTc2NDYwNzUyMzAzNDIzNDg4MFVMTCwgCi0JMTE1MjkyMTUwNDYwNjg0Njk3NjBVTEwsIDIzMDU4NDMwMDkyMTM2OTM5NTJVTEwsIDQ2MTE2ODYwMTg0MjczODc5MDRVTEwsIAotCTkyMjMzNzIwMzY4NTQ3NzU4MDhVTEwsIDE4NDQ2NzQ0MDczNzA5NTUxNjFVTEwsIDM2ODkzNDg4MTQ3NDE5MTAzMjNVTEwsIAotCTczNzg2OTc2Mjk0ODM4MjA2NDZVTEwsIDE0NzU3Mzk1MjU4OTY3NjQxMjkyVUxMLCAyOTUxNDc5MDUxNzkzNTI4MjU4VUxMLCAKLQk1OTAyOTU4MTAzNTg3MDU2NTE3VUxMLCAxMTgwNTkxNjIwNzE3NDExMzAzNFVMTCwgMjM2MTE4MzI0MTQzNDgyMjYwNlVMTCwgCi0JNDcyMjM2NjQ4Mjg2OTY0NTIxM1VMTCwgOTQ0NDczMjk2NTczOTI5MDQyN1VMTCwgMTg4ODk0NjU5MzE0Nzg1ODA4NVVMTCwgCi0JMzc3Nzg5MzE4NjI5NTcxNjE3MFVMTCwgNzU1NTc4NjM3MjU5MTQzMjM0MVVMTCwgMTUxMTE1NzI3NDUxODI4NjQ2ODNVTEwsIAotCTMwMjIzMTQ1NDkwMzY1NzI5MzZVTEwsIDYwNDQ2MjkwOTgwNzMxNDU4NzNVTEwsIDEyMDg5MjU4MTk2MTQ2MjkxNzQ3VUxMLCAKLQkyNDE3ODUxNjM5MjI5MjU4MzQ5VUxMLCA0ODM1NzAzMjc4NDU4NTE2Njk4VUxMLCA5NjcxNDA2NTU2OTE3MDMzMzk3VUxMLCAKLQkxOTM0MjgxMzExMzgzNDA2Njc5VUxMLCAzODY4NTYyNjIyNzY2ODEzMzU5VUxMLCA3NzM3MTI1MjQ1NTMzNjI2NzE4VUxMLCAKLQkxNTQ3NDI1MDQ5MTA2NzI1MzQzNlVMTCwgMzA5NDg1MDA5ODIxMzQ1MDY4N1VMTCwgNjE4OTcwMDE5NjQyNjkwMTM3NFVMTCwgCi0JMTIzNzk0MDAzOTI4NTM4MDI3NDhVTEwsIDI0NzU4ODAwNzg1NzA3NjA1NDlVTEwsIDQ5NTE3NjAxNTcxNDE1MjEwOTlVTEwsIAotCTk5MDM1MjAzMTQyODMwNDIxOTlVTEwsIDE5ODA3MDQwNjI4NTY2MDg0MzlVTEwsIDM5NjE0MDgxMjU3MTMyMTY4NzlVTEwsIAotCTc5MjI4MTYyNTE0MjY0MzM3NTlVTEwsIDE1ODQ1NjMyNTAyODUyODY3NTE4VUxMLCAzMTY5MTI2NTAwNTcwNTczNTAzVUxMLCAKLQk2MzM4MjUzMDAxMTQxMTQ3MDA3VUxMLCAxMjY3NjUwNjAwMjI4MjI5NDAxNFVMTCwgMjUzNTMwMTIwMDQ1NjQ1ODgwMlVMTCwgCi0JNTA3MDYwMjQwMDkxMjkxNzYwNVVMTCwgMTAxNDEyMDQ4MDE4MjU4MzUyMTFVTEwsIDIwMjgyNDA5NjAzNjUxNjcwNDJVTEwsIAotCTQwNTY0ODE5MjA3MzAzMzQwODRVTEwsIDgxMTI5NjM4NDE0NjA2NjgxNjlVTEwsIDE2MjI1OTI3NjgyOTIxMzM2MzM5VUxMLCAKLQkzMjQ1MTg1NTM2NTg0MjY3MjY3VUxMLCA2NDkwMzcxMDczMTY4NTM0NTM1VUxMLCAxMjk4MDc0MjE0NjMzNzA2OTA3MVVMTCwgCi0JMjU5NjE0ODQyOTI2NzQxMzgxNFVMTCwgNTE5MjI5Njg1ODUzNDgyNzYyOFVMTCwgMTAzODQ1OTM3MTcwNjk2NTUyNTdVTEwsIAotCTIwNzY5MTg3NDM0MTM5MzEwNTFVTEwsIDQxNTM4Mzc0ODY4Mjc4NjIxMDJVTEwsIDgzMDc2NzQ5NzM2NTU3MjQyMDVVTEwsIAotCTE2NjE1MzQ5OTQ3MzExNDQ4NDExVUxMLCAzMzIzMDY5OTg5NDYyMjg5NjgyVUxMLCA2NjQ2MTM5OTc4OTI0NTc5MzY0VUxMLCAKLQkxMzI5MjI3OTk1Nzg0OTE1ODcyOVVMTCwgMjY1ODQ1NTk5MTU2OTgzMTc0NVVMTCwgNTMxNjkxMTk4MzEzOTY2MzQ5MVVMTCwgCi0JMTA2MzM4MjM5NjYyNzkzMjY5ODNVTEwsIDIxMjY3NjQ3OTMyNTU4NjUzOTZVTEwsIDQyNTM1Mjk1ODY1MTE3MzA3OTNVTEwsIAotCTg1MDcwNTkxNzMwMjM0NjE1ODZVTEwsIDE3MDE0MTE4MzQ2MDQ2OTIzMTczVUxMLCAzNDAyODIzNjY5MjA5Mzg0NjM0VUxMLCAKLQk2ODA1NjQ3MzM4NDE4NzY5MjY5VUxMLCAxMzYxMTI5NDY3NjgzNzUzODUzOFVMTCwgMjcyMjI1ODkzNTM2NzUwNzcwN1VMTCwgCi0JNTQ0NDUxNzg3MDczNTAxNTQxNVVMTCwgMTA4ODkwMzU3NDE0NzAwMzA4MzBVTEwsIDIxNzc4MDcxNDgyOTQwMDYxNjZVTEwsIAotCTQzNTU2MTQyOTY1ODgwMTIzMzJVTEwsIDg3MTEyMjg1OTMxNzYwMjQ2NjRVTEwsIDE3NDIyNDU3MTg2MzUyMDQ5MzI5VUxMLCAKLQkzNDg0NDkxNDM3MjcwNDA5ODY1VUxMLCA2OTY4OTgyODc0NTQwODE5NzMxVUxMLCAxMzkzNzk2NTc0OTA4MTYzOTQ2M1VMTCwgCi0JMjc4NzU5MzE0OTgxNjMyNzg5MlVMTCwgNTU3NTE4NjI5OTYzMjY1NTc4NVVMTCwgMTExNTAzNzI1OTkyNjUzMTE1NzBVTEwsIAotCTIyMzAwNzQ1MTk4NTMwNjIzMTRVTEwsIDQ0NjAxNDkwMzk3MDYxMjQ2MjhVTEwsIDg5MjAyOTgwNzk0MTIyNDkyNTZVTEwsIAotCTE3ODQwNTk2MTU4ODI0NDk4NTEzVUxMLCAzNTY4MTE5MjMxNzY0ODk5NzAyVUxMLCA3MTM2MjM4NDYzNTI5Nzk5NDA1VUxMLCAKLQkxNDI3MjQ3NjkyNzA1OTU5ODgxMFVMTCwgMjg1NDQ5NTM4NTQxMTkxOTc2MlVMTCwgNTcwODk5MDc3MDgyMzgzOTUyNFVMTCwgCi0JMTE0MTc5ODE1NDE2NDc2NzkwNDhVTEwsIDIyODM1OTYzMDgzMjk1MzU4MDlVTEwsIDQ1NjcxOTI2MTY2NTkwNzE2MTlVTEwsIAotCTkxMzQzODUyMzMzMTgxNDMyMzhVTEwsIDE4MjY4NzcwNDY2NjM2Mjg2NDc3VUxMLCAzNjUzNzU0MDkzMzI3MjU3Mjk1VUxMLCAKLQk3MzA3NTA4MTg2NjU0NTE0NTkxVUxMLCAxNDYxNTAxNjM3MzMwOTAyOTE4MlVMTCwgMjkyMzAwMzI3NDY2MTgwNTgzNlVMTCwgCi0JNTg0NjAwNjU0OTMyMzYxMTY3MlVMTCwgMTE2OTIwMTMwOTg2NDcyMjMzNDVVTEwsIDIzMzg0MDI2MTk3Mjk0NDQ2NjlVTEwsIAotCTQ2NzY4MDUyMzk0NTg4ODkzMzhVTEwsIDkzNTM2MTA0Nzg5MTc3Nzg2NzZVTEwsIDE4NzA3MjIwOTU3ODM1NTU3MzVVTEwsIAotCTM3NDE0NDQxOTE1NjcxMTE0NzBVTEwsIDc0ODI4ODgzODMxMzQyMjI5NDFVTEwsIDE0OTY1Nzc2NzY2MjY4NDQ1ODgyVUxMLCAKLQkyOTkzMTU1MzUzMjUzNjg5MTc2VUxMLCA1OTg2MzEwNzA2NTA3Mzc4MzUyVUxMLCAxMTk3MjYyMTQxMzAxNDc1NjcwNVVMTCwgCi0JMjM5NDUyNDI4MjYwMjk1MTM0MVVMTCwgNDc4OTA0ODU2NTIwNTkwMjY4MlVMTCwgOTU3ODA5NzEzMDQxMTgwNTM2NFVMTCwgCi0JMTkxNTYxOTQyNjA4MjM2MTA3MlVMTCwgMzgzMTIzODg1MjE2NDcyMjE0NVVMTCwgNzY2MjQ3NzcwNDMyOTQ0NDI5MVVMTCwgCi0JMTUzMjQ5NTU0MDg2NTg4ODg1ODNVTEwsIDMwNjQ5OTEwODE3MzE3Nzc3MTZVTEwsIDYxMjk5ODIxNjM0NjM1NTU0MzNVTEwsIAotCTEyMjU5OTY0MzI2OTI3MTEwODY2VUxMLCAyNDUxOTkyODY1Mzg1NDIyMTczVUxMLCA0OTAzOTg1NzMwNzcwODQ0MzQ2VUxMLCAKLQk5ODA3OTcxNDYxNTQxNjg4NjkzVUxMLCAxOTYxNTk0MjkyMzA4MzM3NzM4VUxMLCAzOTIzMTg4NTg0NjE2Njc1NDc3VUxMLCAKLQk3ODQ2Mzc3MTY5MjMzMzUwOTU0VUxMLCAxNTY5Mjc1NDMzODQ2NjcwMTkwOVVMTCwgMzEzODU1MDg2NzY5MzM0MDM4MVVMTCwgCi0JNjI3NzEwMTczNTM4NjY4MDc2M1VMTCwgMTI1NTQyMDM0NzA3NzMzNjE1MjdVTEwsIDI1MTA4NDA2OTQxNTQ2NzIzMDVVTEwsIAotCTUwMjE2ODEzODgzMDkzNDQ2MTFVTEwsIDEwMDQzMzYyNzc2NjE4Njg5MjIyVUxMLCAyMDA4NjcyNTU1MzIzNzM3ODQ0VUxMLCAKLQk0MDE3MzQ1MTEwNjQ3NDc1Njg4VUxMLCA4MDM0NjkwMjIxMjk0OTUxMzc3VUxMLCAxNjA2OTM4MDQ0MjU4OTkwMjc1NVVMTCwgCi0JMzIxMzg3NjA4ODUxNzk4MDU1MVVMTCwgNjQyNzc1MjE3NzAzNTk2MTEwMlVMTCwgMTI4NTU1MDQzNTQwNzE5MjIyMDRVTEwsIAotCTI1NzExMDA4NzA4MTQzODQ0NDBVTEwsIDUxNDIyMDE3NDE2Mjg3Njg4ODFVTEwsIDEwMjg0NDAzNDgzMjU3NTM3NzYzVUxMLCAKLQkyMDU2ODgwNjk2NjUxNTA3NTUyVUxMLCA0MTEzNzYxMzkzMzAzMDE1MTA1VUxMLCA4MjI3NTIyNzg2NjA2MDMwMjEwVUxMLCAKLQkxNjQ1NTA0NTU3MzIxMjA2MDQyMVVMTCwgMzI5MTAwOTExNDY0MjQxMjA4NFVMTCwgNjU4MjAxODIyOTI4NDgyNDE2OFVMTCwgCi0JMTMxNjQwMzY0NTg1Njk2NDgzMzdVTEwsIDI2MzI4MDcyOTE3MTM5Mjk2NjdVTEwsIDUyNjU2MTQ1ODM0Mjc4NTkzMzRVTEwsIAotCTEwNTMxMjI5MTY2ODU1NzE4NjY5VUxMLCAyMTA2MjQ1ODMzMzcxMTQzNzMzVUxMLCA0MjEyNDkxNjY2NzQyMjg3NDY3VUxMLCAKLQk4NDI0OTgzMzMzNDg0NTc0OTM1VUxMLCAxNjg0OTk2NjY2Njk2OTE0OTg3MVVMTCwgMzM2OTk5MzMzMzM5MzgyOTk3NFVMTCwgCi0JNjczOTk4NjY2Njc4NzY1OTk0OFVMTCwgMTM0Nzk5NzMzMzM1NzUzMTk4OTdVTEwsIDI2OTU5OTQ2NjY3MTUwNjM5NzlVTEwsIAotCTUzOTE5ODkzMzM0MzAxMjc5NThVTEwsIDEwNzgzOTc4NjY2ODYwMjU1OTE3VUxMLCAyMTU2Nzk1NzMzMzcyMDUxMTgzVUxMLCAKLQk0MzEzNTkxNDY2NzQ0MTAyMzY3VUxMLCA4NjI3MTgyOTMzNDg4MjA0NzM0VUxMLCAxNzI1NDM2NTg2Njk3NjQwOTQ2OFVMTCwgCi0JMzQ1MDg3MzE3MzM5NTI4MTg5M1VMTCwgNjkwMTc0NjM0Njc5MDU2Mzc4N1VMTCwgMTM4MDM0OTI2OTM1ODExMjc1NzRVTEwsIAotCTI3NjA2OTg1Mzg3MTYyMjU1MTRVTEwsIDU1MjEzOTcwNzc0MzI0NTEwMjlVTEwsIDExMDQyNzk0MTU0ODY0OTAyMDU5VUxMLCAKLQkyMjA4NTU4ODMwOTcyOTgwNDExVUxMLCA0NDE3MTE3NjYxOTQ1OTYwODIzVUxMLCA4ODM0MjM1MzIzODkxOTIxNjQ3VUxMLCAKLQkxNzY2ODQ3MDY0Nzc4Mzg0MzI5NVVMTCwgMzUzMzY5NDEyOTU1Njc2ODY1OVVMTCwgNzA2NzM4ODI1OTExMzUzNzMxOFVMTCwgCi0JMTQxMzQ3NzY1MTgyMjcwNzQ2MzZVTEwsIDI4MjY5NTUzMDM2NDU0MTQ5MjdVTEwsIDU2NTM5MTA2MDcyOTA4Mjk4NTRVTEwsIAotCTExMzA3ODIxMjE0NTgxNjU5NzA5VUxMLCAyMjYxNTY0MjQyOTE2MzMxOTQxVUxMLCA0NTIzMTI4NDg1ODMyNjYzODgzVUxMLCAKLQk5MDQ2MjU2OTcxNjY1MzI3NzY3VUxMLCAxODA5MjUxMzk0MzMzMDY1NTUzNFVMTCwgMzYxODUwMjc4ODY2NjEzMTEwNlVMTCwgCi0JNzIzNzAwNTU3NzMzMjI2MjIxM1VMTCwgMTQ0NzQwMTExNTQ2NjQ1MjQ0MjdVTEwsIDI4OTQ4MDIyMzA5MzI5MDQ4ODVVTEwsIAotCTU3ODk2MDQ0NjE4NjU4MDk3NzFVTEwsIDExNTc5MjA4OTIzNzMxNjE5NTQyVUxMLCAyMzE1ODQxNzg0NzQ2MzIzOTA4VUxMLCAKLQk0NjMxNjgzNTY5NDkyNjQ3ODE2VUxMLCA5MjYzMzY3MTM4OTg1Mjk1NjMzVUxMLCAxODUyNjczNDI3Nzk3MDU5MTI2VUxMLCAKLQkzNzA1MzQ2ODU1NTk0MTE4MjUzVUxMLCA3NDEwNjkzNzExMTg4MjM2NTA3VUxMLCAxNDgyMTM4NzQyMjM3NjQ3MzAxNFVMTCwgCi0JMjk2NDI3NzQ4NDQ3NTI5NDYwMlVMTCwgNTkyODU1NDk2ODk1MDU4OTIwNVVMTCwgMTE4NTcxMDk5Mzc5MDExNzg0MTFVTEwsIAotCTIzNzE0MjE5ODc1ODAyMzU2ODJVTEwsIDQ3NDI4NDM5NzUxNjA0NzEzNjRVTEwsIDk0ODU2ODc5NTAzMjA5NDI3MjlVTEwsIAotCTE4OTcxMzc1OTAwNjQxODg1NDVVTEwsIDM3OTQyNzUxODAxMjgzNzcwOTFVTEwsIDc1ODg1NTAzNjAyNTY3NTQxODNVTEwsIAotCTE1MTc3MTAwNzIwNTEzNTA4MzY2VUxMLCAzMDM1NDIwMTQ0MTAyNzAxNjczVUxMLCA2MDcwODQwMjg4MjA1NDAzMzQ2VUxMLCAKLQkxMjE0MTY4MDU3NjQxMDgwNjY5M1VMTCwgMjQyODMzNjExNTI4MjE2MTMzOFVMTCwgNDg1NjY3MjIzMDU2NDMyMjY3N1VMTCwgCi0JOTcxMzM0NDQ2MTEyODY0NTM1NFVMTCwgMTk0MjY2ODg5MjIyNTcyOTA3MFVMTCwgMzg4NTMzNzc4NDQ1MTQ1ODE0MVVMTCwgCi0JNzc3MDY3NTU2ODkwMjkxNjI4M1VMTCwgMTU1NDEzNTExMzc4MDU4MzI1NjdVTEwsIDMxMDgyNzAyMjc1NjExNjY1MTNVTEwsIAotCTYyMTY1NDA0NTUxMjIzMzMwMjZVTEwsIDEyNDMzMDgwOTEwMjQ0NjY2MDUzVUxMLCAyNDg2NjE2MTgyMDQ4OTMzMjEwVUxMLCAKLQk0OTczMjMyMzY0MDk3ODY2NDIxVUxMLCA5OTQ2NDY0NzI4MTk1NzMyODQzVUxMLCAxOTg5MjkyOTQ1NjM5MTQ2NTY4VUxMLCAKLQkzOTc4NTg1ODkxMjc4MjkzMTM3VUxMLCA3OTU3MTcxNzgyNTU2NTg2Mjc0VUxMLCAxNTkxNDM0MzU2NTExMzE3MjU0OFVMTCwgCi0JMzE4Mjg2ODcxMzAyMjYzNDUwOVVMTCwgNjM2NTczNzQyNjA0NTI2OTAxOVVMTCwgMTI3MzE0NzQ4NTIwOTA1MzgwMzlVTEwsIAotCTI1NDYyOTQ5NzA0MTgxMDc2MDdVTEwsIDUwOTI1ODk5NDA4MzYyMTUyMTVVTEwsIDEwMTg1MTc5ODgxNjcyNDMwNDMxVUxMLCAKLQkyMDM3MDM1OTc2MzM0NDg2MDg2VUxMLCA0MDc0MDcxOTUyNjY4OTcyMTcyVUxMLCA4MTQ4MTQzOTA1MzM3OTQ0MzQ1VUxMLCAKLQkxNjI5NjI4NzgxMDY3NTg4ODY5MFVMTCwgMzI1OTI1NzU2MjEzNTE3NzczOFVMTCwgNjUxODUxNTEyNDI3MDM1NTQ3NlVMTCwgCi0JMTMwMzcwMzAyNDg1NDA3MTA5NTJVTEwsIDI2MDc0MDYwNDk3MDgxNDIxOTBVTEwsIDUyMTQ4MTIwOTk0MTYyODQzODBVTEwsIAotCTEwNDI5NjI0MTk4ODMyNTY4NzYxVUxMLCAyMDg1OTI0ODM5NzY2NTEzNzUyVUxMLCA0MTcxODQ5Njc5NTMzMDI3NTA0VUxMLCAKLQk4MzQzNjk5MzU5MDY2MDU1MDA5VUxMLCAxNjY4NzM5ODcxODEzMjExMDAxOFVMTCwgMzMzNzQ3OTc0MzYyNjQyMjAwM1VMTCwgCi0JNjY3NDk1OTQ4NzI1Mjg0NDAwN1VMTCwgMTMzNDk5MTg5NzQ1MDU2ODgwMTRVTEwsIDI2Njk5ODM3OTQ5MDExMzc2MDJVTEwsIAotCTUzMzk5Njc1ODk4MDIyNzUyMDVVTEwsIDEwNjc5OTM1MTc5NjA0NTUwNDExVUxMLCAyMTM1OTg3MDM1OTIwOTEwMDgyVUxMLCAKLQk0MjcxOTc0MDcxODQxODIwMTY0VUxMLCA4NTQzOTQ4MTQzNjgzNjQwMzI5VUxMLCAxNzA4Nzg5NjI4NzM2NzI4MDY1OVVMTCwgCi0JMzQxNzU3OTI1NzQ3MzQ1NjEzMVVMTCwgNjgzNTE1ODUxNDk0NjkxMjI2M1VMTCwgMTM2NzAzMTcwMjk4OTM4MjQ1MjdVTEwsIAotCTI3MzQwNjM0MDU5Nzg3NjQ5MDVVTEwsIDU0NjgxMjY4MTE5NTc1Mjk4MTBVTEwsIDEwOTM2MjUzNjIzOTE1MDU5NjIxVUxMLCAKLQkyMTg3MjUwNzI0NzgzMDExOTI0VUxMLCA0Mzc0NTAxNDQ5NTY2MDIzODQ4VUxMLCA4NzQ5MDAyODk5MTMyMDQ3Njk3VUxMLCAKLQkxNzQ5ODAwNTc5ODI2NDA5NTM5NFVMTCwgMzQ5OTYwMTE1OTY1MjgxOTA3OFVMTCwgNjk5OTIwMjMxOTMwNTYzODE1N1VMTCwgCi0JMTM5OTg0MDQ2Mzg2MTEyNzYzMTVVTEwsIDI3OTk2ODA5Mjc3MjIyNTUyNjNVTEwsIDU1OTkzNjE4NTU0NDQ1MTA1MjZVTEwsIAotCTExMTk4NzIzNzEwODg5MDIxMDUyVUxMLCAyMjM5NzQ0NzQyMTc3ODA0MjEwVUxMLCA0NDc5NDg5NDg0MzU1NjA4NDIxVUxMLCAKLQk4OTU4OTc4OTY4NzExMjE2ODQyVUxMLCAxNzkxNzk1NzkzNzQyMjQzMzY4NFVMTCwgMzU4MzU5MTU4NzQ4NDQ4NjczNlVMTCwgCi0JNzE2NzE4MzE3NDk2ODk3MzQ3M1VMTCwgMTQzMzQzNjYzNDk5Mzc5NDY5NDdVTEwsIDI4NjY4NzMyNjk5ODc1ODkzODlVTEwsIAotCTU3MzM3NDY1Mzk5NzUxNzg3NzlVTEwsIDExNDY3NDkzMDc5OTUwMzU3NTU4VUxMLCAyMjkzNDk4NjE1OTkwMDcxNTExVUxMLCAKLQk0NTg2OTk3MjMxOTgwMTQzMDIzVUxMLCA5MTczOTk0NDYzOTYwMjg2MDQ2VUxMLCAxODM0Nzk4ODkyNzkyMDU3MjA5MlVMTCwgCi0JMzY2OTU5Nzc4NTU4NDExNDQxOFVMTCwgNzMzOTE5NTU3MTE2ODIyODgzN1VMTCwgMTQ2NzgzOTExNDIzMzY0NTc2NzRVTEwsIAotCTI5MzU2NzgyMjg0NjcyOTE1MzRVTEwsIDU4NzEzNTY0NTY5MzQ1ODMwNjlVTEwsIDExNzQyNzEyOTEzODY5MTY2MTM5VUxMLCAKLQkyMzQ4NTQyNTgyNzczODMzMjI3VUxMLCA0Njk3MDg1MTY1NTQ3NjY2NDU1VUxMLCA5Mzk0MTcwMzMxMDk1MzMyOTExVUxMLCAKLQkxODc4ODM0MDY2MjE5MDY2NTgyVUxMLCAzNzU3NjY4MTMyNDM4MTMzMTY0VUxMLCA3NTE1MzM2MjY0ODc2MjY2MzI5VUxMLCAKLQkxNTAzMDY3MjUyOTc1MjUzMjY1OFVMTCwgMzAwNjEzNDUwNTk1MDUwNjUzMVVMTCwgNjAxMjI2OTAxMTkwMTAxMzA2M1VMTCwgCi0JMTIwMjQ1MzgwMjM4MDIwMjYxMjZVTEwsIDI0MDQ5MDc2MDQ3NjA0MDUyMjVVTEwsIDQ4MDk4MTUyMDk1MjA4MTA0NTBVTEwsIAotCTk2MTk2MzA0MTkwNDE2MjA5MDFVTEwsIDE5MjM5MjYwODM4MDgzMjQxODBVTEwsIDM4NDc4NTIxNjc2MTY2NDgzNjBVTEwsIAotCTc2OTU3MDQzMzUyMzMyOTY3MjFVTEwsIDE1MzkxNDA4NjcwNDY2NTkzNDQyVUxMLCAzMDc4MjgxNzM0MDkzMzE4Njg4VUxMLCAKLQk2MTU2NTYzNDY4MTg2NjM3Mzc2VUxMLCAxMjMxMzEyNjkzNjM3MzI3NDc1M1VMTCwgMjQ2MjYyNTM4NzI3NDY1NDk1MFVMTCwgCi0JNDkyNTI1MDc3NDU0OTMwOTkwMVVMTCwgOTg1MDUwMTU0OTA5ODYxOTgwM1VMTCwgMTk3MDEwMDMwOTgxOTcyMzk2MFVMTCwgCi0JMzk0MDIwMDYxOTYzOTQ0NzkyMVVMTCwgNzg4MDQwMTIzOTI3ODg5NTg0MlVMTCwgMTU3NjA4MDI0Nzg1NTc3OTE2ODRVTEwsIAotCTMxNTIxNjA0OTU3MTE1NTgzMzZVTEwsIDYzMDQzMjA5OTE0MjMxMTY2NzNVTEwsIDEyNjA4NjQxOTgyODQ2MjMzMzQ3VUxMLCAKLQkyNTIxNzI4Mzk2NTY5MjQ2NjY5VUxMLCA1MDQzNDU2NzkzMTM4NDkzMzM5VUxMLCAxMDA4NjkxMzU4NjI3Njk4NjY3OFVMTCwgCi0JMjAxNzM4MjcxNzI1NTM5NzMzNVVMTCwgNDAzNDc2NTQzNDUxMDc5NDY3MVVMTCwgODA2OTUzMDg2OTAyMTU4OTM0MlVMTCwgCi0JMTYxMzkwNjE3MzgwNDMxNzg2ODVVTEwsIDMyMjc4MTIzNDc2MDg2MzU3MzdVTEwsIDY0NTU2MjQ2OTUyMTcyNzE0NzRVTEwsIAotCTEyOTExMjQ5MzkwNDM0NTQyOTQ4VUxMLCAyNTgyMjQ5ODc4MDg2OTA4NTg5VUxMLCA1MTY0NDk5NzU2MTczODE3MTc5VUxMLCAKLQkxMDMyODk5OTUxMjM0NzYzNDM1OFVMTCwgMjA2NTc5OTkwMjQ2OTUyNjg3MVVMTCwgNDEzMTU5OTgwNDkzOTA1Mzc0M1VMTCwgCi0JODI2MzE5OTYwOTg3ODEwNzQ4NlVMTCwgMTY1MjYzOTkyMTk3NTYyMTQ5NzNVTEwsIDMzMDUyNzk4NDM5NTEyNDI5OTRVTEwsIAotCTY2MTA1NTk2ODc5MDI0ODU5ODlVTEwsIDEzMjIxMTE5Mzc1ODA0OTcxOTc5VUxMLCAyNjQ0MjIzODc1MTYwOTk0Mzk1VUxMLCAKLQk1Mjg4NDQ3NzUwMzIxOTg4NzkxVUxMLCAxMDU3Njg5NTUwMDY0Mzk3NzU4M1VMTCwgMjExNTM3OTEwMDEyODc5NTUxNlVMTCwgCi0JNDIzMDc1ODIwMDI1NzU5MTAzM1VMTCwgODQ2MTUxNjQwMDUxNTE4MjA2NlVMTCwgMTY5MjMwMzI4MDEwMzAzNjQxMzNVTEwsIAotCTMzODQ2MDY1NjAyMDYwNzI4MjZVTEwsIDY3NjkyMTMxMjA0MTIxNDU2NTNVTEwsIDEzNTM4NDI2MjQwODI0MjkxMzA2VUxMLCAKLQkyNzA3Njg1MjQ4MTY0ODU4MjYxVUxMLCA1NDE1MzcwNDk2MzI5NzE2NTIyVUxMLCAxMDgzMDc0MDk5MjY1OTQzMzA0NVVMTCwgCi0JMjE2NjE0ODE5ODUzMTg4NjYwOVVMTCwgNDMzMjI5NjM5NzA2Mzc3MzIxOFVMTCwgODY2NDU5Mjc5NDEyNzU0NjQzNlVMTCwgCi0JMTczMjkxODU1ODgyNTUwOTI4NzJVTEwsIDM0NjU4MzcxMTc2NTEwMTg1NzRVTEwsIDY5MzE2NzQyMzUzMDIwMzcxNDhVTEwsIAotCTEzODYzMzQ4NDcwNjA0MDc0Mjk3VUxMLCAyNzcyNjY5Njk0MTIwODE0ODU5VUxMLCA1NTQ1MzM5Mzg4MjQxNjI5NzE5VUxMLCAKLQkxMTA5MDY3ODc3NjQ4MzI1OTQzOFVMTCwgMjIxODEzNTc1NTI5NjY1MTg4N1VMTCwgNDQzNjI3MTUxMDU5MzMwMzc3NVVMTCwgCi0JODg3MjU0MzAyMTE4NjYwNzU1MFVMTCwgMTc3NDUwODYwNDIzNzMyMTUxMDFVTEwsIDM1NDkwMTcyMDg0NzQ2NDMwMjBVTEwsIAotCTcwOTgwMzQ0MTY5NDkyODYwNDBVTEwsIDE0MTk2MDY4ODMzODk4NTcyMDgxVUxMLCAyODM5MjEzNzY2Nzc5NzE0NDE2VUxMLCAKLQk1Njc4NDI3NTMzNTU5NDI4ODMyVUxMLCAxMTM1Njg1NTA2NzExODg1NzY2NFVMTCwgMjI3MTM3MTAxMzQyMzc3MTUzMlVMTCwgCi0JNDU0Mjc0MjAyNjg0NzU0MzA2NVVMTCwgOTA4NTQ4NDA1MzY5NTA4NjEzMVVMTCwgMTgxNzA5NjgxMDczOTAxNzIyNjNVTEwsIAotCTM2MzQxOTM2MjE0NzgwMzQ0NTJVTEwsIDcyNjgzODcyNDI5NTYwNjg5MDVVTEwsIDE0NTM2Nzc0NDg1OTEyMTM3ODEwVUxMLCAKLQkyOTA3MzU0ODk3MTgyNDI3NTYyVUxMLCA1ODE0NzA5Nzk0MzY0ODU1MTI0VUxMLCAxMTYyOTQxOTU4ODcyOTcxMDI0OFVMTCwgCi0JMjMyNTg4MzkxNzc0NTk0MjA0OVVMTCwgNDY1MTc2NzgzNTQ5MTg4NDA5OVVMTCwgOTMwMzUzNTY3MDk4Mzc2ODE5OVVMTCwgCi0JMTg2MDcwNzEzNDE5Njc1MzYzOVVMTCwgMzcyMTQxNDI2ODM5MzUwNzI3OVVMTCwgNzQ0MjgyODUzNjc4NzAxNDU1OVVMTCwgCi0JMTQ4ODU2NTcwNzM1NzQwMjkxMThVTEwsIDI5NzcxMzE0MTQ3MTQ4MDU4MjNVTEwsIDU5NTQyNjI4Mjk0Mjk2MTE2NDdVTEwsIAotCTExOTA4NTI1NjU4ODU5MjIzMjk0VUxMLCAyMzgxNzA1MTMxNzcxODQ0NjU4VUxMLCA0NzYzNDEwMjYzNTQzNjg5MzE3VUxMLCAKLQk5NTI2ODIwNTI3MDg3Mzc4NjM1VUxMLCAxOTA1MzY0MTA1NDE3NDc1NzI3VUxMLCAzODEwNzI4MjEwODM0OTUxNDU0VUxMLCAKLQk3NjIxNDU2NDIxNjY5OTAyOTA4VUxMLCAxNTI0MjkxMjg0MzMzOTgwNTgxN1VMTCwgMzA0ODU4MjU2ODY2Nzk2MTE2M1VMTCwgCi0JNjA5NzE2NTEzNzMzNTkyMjMyNlVMTCwgMTIxOTQzMzAyNzQ2NzE4NDQ2NTNVTEwsIDI0Mzg4NjYwNTQ5MzQzNjg5MzBVTEwsIAotCTQ4Nzc3MzIxMDk4Njg3Mzc4NjFVTEwsIDk3NTU0NjQyMTk3Mzc0NzU3MjNVTEwsIDE5NTEwOTI4NDM5NDc0OTUxNDRVTEwsIAotCTM5MDIxODU2ODc4OTQ5OTAyODlVTEwsIDc4MDQzNzEzNzU3ODk5ODA1NzhVTEwsIDE1NjA4NzQyNzUxNTc5OTYxMTU2VUxMLCAKLQkzMTIxNzQ4NTUwMzE1OTkyMjMxVUxMLCA2MjQzNDk3MTAwNjMxOTg0NDYyVUxMLCAxMjQ4Njk5NDIwMTI2Mzk2ODkyNVVMTCwgCi0JMjQ5NzM5ODg0MDI1Mjc5Mzc4NVVMTCwgNDk5NDc5NzY4MDUwNTU4NzU3MFVMTCwgOTk4OTU5NTM2MTAxMTE3NTE0MFVMTCwgCi0JMTk5NzkxOTA3MjIwMjIzNTAyOFVMTCwgMzk5NTgzODE0NDQwNDQ3MDA1NlVMTCwgNzk5MTY3NjI4ODgwODk0MDExMlVMTCwgCi0JMTU5ODMzNTI1Nzc2MTc4ODAyMjRVTEwsIDMxOTY2NzA1MTU1MjM1NzYwNDRVTEwsIDYzOTMzNDEwMzEwNDcxNTIwODlVTEwsIAotCTEyNzg2NjgyMDYyMDk0MzA0MTc5VUxMLCAyNTU3MzM2NDEyNDE4ODYwODM1VUxMLCA1MTE0NjcyODI0ODM3NzIxNjcxVUxMLCAKLQkxMDIyOTM0NTY0OTY3NTQ0MzM0M1VMTCwgMjA0NTg2OTEyOTkzNTA4ODY2OFVMTCwgNDA5MTczODI1OTg3MDE3NzMzN1VMTCwgCi0JODE4MzQ3NjUxOTc0MDM1NDY3NVVMTCwgMTYzNjY5NTMwMzk0ODA3MDkzNTBVTEwsIDMyNzMzOTA2MDc4OTYxNDE4NzBVTEwsIAotCTY1NDY3ODEyMTU3OTIyODM3NDBVTEwsIDEzMDkzNTYyNDMxNTg0NTY3NDgwVUxMLCAyNjE4NzEyNDg2MzE2OTEzNDk2VUxMLCAKLQk1MjM3NDI0OTcyNjMzODI2OTkyVUxMLCAxMDQ3NDg0OTk0NTI2NzY1Mzk4NFVMTCwgMjA5NDk2OTk4OTA1MzUzMDc5NlVMTCwgCi0JNDE4OTkzOTk3ODEwNzA2MTU5M1VMTCwgODM3OTg3OTk1NjIxNDEyMzE4N1VMTCwgMTY3NTk3NTk5MTI0MjgyNDYzNzRVTEwsIAotCTMzNTE5NTE5ODI0ODU2NDkyNzRVTEwsIDY3MDM5MDM5NjQ5NzEyOTg1NDlVTEwsIDEzNDA3ODA3OTI5OTQyNTk3MDk5VUxMLCAKLQkyNjgxNTYxNTg1OTg4NTE5NDE5VUxMLCA1MzYzMTIzMTcxOTc3MDM4ODM5VUxMLCAxMDcyNjI0NjM0Mzk1NDA3NzY3OVVMTCwgCi0JMjE0NTI0OTI2ODc5MDgxNTUzNVVMTCwgNDI5MDQ5ODUzNzU4MTYzMTA3MVVMTCwgODU4MDk5NzA3NTE2MzI2MjE0M1VMTCwgCi0JMTcxNjE5OTQxNTAzMjY1MjQyODdVTEwsIDM0MzIzOTg4MzAwNjUzMDQ4NTdVTEwsIDY4NjQ3OTc2NjAxMzA2MDk3MTRVTEwsIAotCTEzNzI5NTk1MzIwMjYxMjE5NDI5VUxMLCAyNzQ1OTE5MDY0MDUyMjQzODg1VUxMLCA1NDkxODM4MTI4MTA0NDg3NzcxVUxMLCAKLQkxMDk4MzY3NjI1NjIwODk3NTU0M1VMTCwgMjE5NjczNTI1MTI0MTc5NTEwOFVMTCwgNDM5MzQ3MDUwMjQ4MzU5MDIxN1VMTCwgCi0JODc4Njk0MTAwNDk2NzE4MDQzNVVMTCwgMTc1NzM4ODIwMDk5MzQzNjA4NzBVTEwsIDM1MTQ3NzY0MDE5ODY4NzIxNzRVTEwsIAotCTcwMjk1NTI4MDM5NzM3NDQzNDhVTEwsIDE0MDU5MTA1NjA3OTQ3NDg4Njk2VUxMLCAyODExODIxMTIxNTg5NDk3NzM5VUxMLCAKLQk1NjIzNjQyMjQzMTc4OTk1NDc4VUxMLCAxMTI0NzI4NDQ4NjM1Nzk5MDk1N1VMTCwgMjI0OTQ1Njg5NzI3MTU5ODE5MVVMTCwgCi0JNDQ5ODkxMzc5NDU0MzE5NjM4MlVMTCwgODk5NzgyNzU4OTA4NjM5Mjc2NVVMTCwgMTc5OTU2NTUxNzgxNzI3ODU1MzFVTEwsIAotCTM1OTkxMzEwMzU2MzQ1NTcxMDZVTEwsIDcxOTgyNjIwNzEyNjkxMTQyMTJVTEwsIDE0Mzk2NTI0MTQyNTM4MjI4NDI0VUxMLCAKLQkyODc5MzA0ODI4NTA3NjQ1Njg0VUxMLCA1NzU4NjA5NjU3MDE1MjkxMzY5VUxMLCAxMTUxNzIxOTMxNDAzMDU4MjczOVVMTCwgCi0JMjMwMzQ0Mzg2MjgwNjExNjU0N1VMTCwgNDYwNjg4NzcyNTYxMjIzMzA5NVVMTCwgOTIxMzc3NTQ1MTIyNDQ2NjE5MVVMTCwgCi0JMTg0Mjc1NTA5MDI0NDg5MzIzODNVTEwsIDM2ODU1MTAxODA0ODk3ODY0NzZVTEwsIDczNzEwMjAzNjA5Nzk1NzI5NTNVTEwsIAotCTE0NzQyMDQwNzIxOTU5MTQ1OTA3VUxMLCAyOTQ4NDA4MTQ0MzkxODI5MTgxVUxMLCA1ODk2ODE2Mjg4NzgzNjU4MzYyVUxMLCAKLQkxMTc5MzYzMjU3NzU2NzMxNjcyNVVMTCwgMjM1ODcyNjUxNTUxMzQ2MzM0NVVMTCwgNDcxNzQ1MzAzMTAyNjkyNjY5MFVMTCwgCi0JOTQzNDkwNjA2MjA1Mzg1MzM4MFVMTCwgMTg4Njk4MTIxMjQxMDc3MDY3NlVMTCwgMzc3Mzk2MjQyNDgyMTU0MTM1MlVMTCwgCi0JNzU0NzkyNDg0OTY0MzA4MjcwNFVMTCwgMTUwOTU4NDk2OTkyODYxNjU0MDhVTEwsIDMwMTkxNjk5Mzk4NTcyMzMwODFVTEwsIAotCTYwMzgzMzk4Nzk3MTQ0NjYxNjNVTEwsIDEyMDc2Njc5NzU5NDI4OTMyMzI3VUxMLCAyNDE1MzM1OTUxODg1Nzg2NDY1VUxMLCAKLQk0ODMwNjcxOTAzNzcxNTcyOTMwVUxMLCA5NjYxMzQzODA3NTQzMTQ1ODYxVUxMLCAxOTMyMjY4NzYxNTA4NjI5MTcyVUxMLCAKLQkzODY0NTM3NTIzMDE3MjU4MzQ0VUxMLCA3NzI5MDc1MDQ2MDM0NTE2Njg5VUxMLCAxNTQ1ODE1MDA5MjA2OTAzMzM3OFVMTCwgCi0JMzA5MTYzMDAxODQxMzgwNjY3NVVMTCwgNjE4MzI2MDAzNjgyNzYxMzM1MVVMTCwgMTIzNjY1MjAwNzM2NTUyMjY3MDNVTEwsIAotCTI0NzMzMDQwMTQ3MzEwNDUzNDBVTEwsIDQ5NDY2MDgwMjk0NjIwOTA2ODFVTEwsIDk4OTMyMTYwNTg5MjQxODEzNjJVTEwsIAotCTE5Nzg2NDMyMTE3ODQ4MzYyNzJVTEwsIDM5NTcyODY0MjM1Njk2NzI1NDRVTEwsIDc5MTQ1NzI4NDcxMzkzNDUwODlVTEwsIAotCTE1ODI5MTQ1Njk0Mjc4NjkwMTc5VUxMLCAzMTY1ODI5MTM4ODU1NzM4MDM1VUxMLCA2MzMxNjU4Mjc3NzExNDc2MDcxVUxMLCAKLQkxMjY2MzMxNjU1NTQyMjk1MjE0M1VMTCwgMjUzMjY2MzMxMTA4NDU5MDQyOFVMTCwgNTA2NTMyNjYyMjE2OTE4MDg1N1VMTCwgCi0JMTAxMzA2NTMyNDQzMzgzNjE3MTVVTEwsIDIwMjYxMzA2NDg4Njc2NzIzNDNVTEwsIDQwNTIyNjEyOTc3MzUzNDQ2ODZVTEwsIAotCTgxMDQ1MjI1OTU0NzA2ODkzNzJVTEwsIDE2MjA5MDQ1MTkwOTQxMzc4NzQ0VUxMLCAzMjQxODA5MDM4MTg4Mjc1NzQ4VUxMLCAKLQk2NDgzNjE4MDc2Mzc2NTUxNDk3VUxMLCAxMjk2NzIzNjE1Mjc1MzEwMjk5NVVMTCwgMjU5MzQ0NzIzMDU1MDYyMDU5OVVMTCwgCi0JNTE4Njg5NDQ2MTEwMTI0MTE5OFVMTCwgMTAzNzM3ODg5MjIyMDI0ODIzOTZVTEwsIDIwNzQ3NTc3ODQ0NDA0OTY0NzlVTEwsIAotCTQxNDk1MTU1Njg4ODA5OTI5NThVTEwsIDgyOTkwMzExMzc3NjE5ODU5MTdVTEwsIDE2NTk4MDYyMjc1NTIzOTcxODM0VUxMLCAKLQkzMzE5NjEyNDU1MTA0Nzk0MzY2VUxMLCA2NjM5MjI0OTEwMjA5NTg4NzMzVUxMLCAxMzI3ODQ0OTgyMDQxOTE3NzQ2N1VMTCwgCi0JMjY1NTY4OTk2NDA4MzgzNTQ5M1VMTCwgNTMxMTM3OTkyODE2NzY3MDk4NlVMTCwgMTA2MjI3NTk4NTYzMzUzNDE5NzNVTEwsIAotCTIxMjQ1NTE5NzEyNjcwNjgzOTRVTEwsIDQyNDkxMDM5NDI1MzQxMzY3ODlVTEwsIDg0OTgyMDc4ODUwNjgyNzM1NzlVTEwsIAotCTE2OTk2NDE1NzcwMTM2NTQ3MTU4VUxMLCAzMzk5MjgzMTU0MDI3MzA5NDMxVUxMLCA2Nzk4NTY2MzA4MDU0NjE4ODYzVUxMLCAKLQkxMzU5NzEzMjYxNjEwOTIzNzcyNlVMTCwgMjcxOTQyNjUyMzIyMTg0NzU0NVVMTCwgNTQzODg1MzA0NjQ0MzY5NTA5MFVMTCwgCi0JMTA4Nzc3MDYwOTI4ODczOTAxODFVTEwsIDIxNzU1NDEyMTg1Nzc0NzgwMzZVTEwsIDQzNTEwODI0MzcxNTQ5NTYwNzJVTEwsIAotCTg3MDIxNjQ4NzQzMDk5MTIxNDRVTEwsIDE3NDA0MzI5NzQ4NjE5ODI0Mjg5VUxMLCAzNDgwODY1OTQ5NzIzOTY0ODU3VUxMLCAKLQk2OTYxNzMxODk5NDQ3OTI5NzE1VUxMLCAxMzkyMzQ2Mzc5ODg5NTg1OTQzMVVMTCwgMjc4NDY5Mjc1OTc3OTE3MTg4NlVMTCwgCi0JNTU2OTM4NTUxOTU1ODM0Mzc3MlVMTCwgMTExMzg3NzEwMzkxMTY2ODc1NDVVTEwsIDIyMjc3NTQyMDc4MjMzMzc1MDlVTEwsIAotCTQ0NTU1MDg0MTU2NDY2NzUwMThVTEwsIDg5MTEwMTY4MzEyOTMzNTAwMzZVTEwsIDE3ODIyMDMzNjYyNTg2NzAwMDcyVUxMLCAKLQkzNTY0NDA2NzMyNTE3MzQwMDE0VUxMLCA3MTI4ODEzNDY1MDM0NjgwMDI5VUxMLCAxNDI1NzYyNjkzMDA2OTM2MDA1OFVMTCwgCi0JMjg1MTUyNTM4NjAxMzg3MjAxMVVMTCwgNTcwMzA1MDc3MjAyNzc0NDAyM1VMTCwgMTE0MDYxMDE1NDQwNTU0ODgwNDZVTEwsIAotCTIyODEyMjAzMDg4MTEwOTc2MDlVTEwsIDQ1NjI0NDA2MTc2MjIxOTUyMThVTEwsIDkxMjQ4ODEyMzUyNDQzOTA0MzdVTEwsIAotCTE4MjQ5NzYyNDcwNDg4NzgwODc0VUxMLCAzNjQ5OTUyNDk0MDk3NzU2MTc0VUxMLCA3Mjk5OTA0OTg4MTk1NTEyMzQ5VUxMLCAKLQkxNDU5OTgwOTk3NjM5MTAyNDY5OVVMTCwgMjkxOTk2MTk5NTI3ODIwNDkzOVVMTCwgNTgzOTkyMzk5MDU1NjQwOTg3OVVMTCwgCi0JMTE2Nzk4NDc5ODExMTI4MTk3NTlVTEwsIDIzMzU5Njk1OTYyMjI1NjM5NTFVTEwsIDQ2NzE5MzkxOTI0NDUxMjc5MDNVTEwsIAotCTkzNDM4NzgzODQ4OTAyNTU4MDdVTEwsIDE4Njg3NzU2NzY5NzgwNTExNjFVTEwsIDM3Mzc1NTEzNTM5NTYxMDIzMjNVTEwsIAotCTc0NzUxMDI3MDc5MTIyMDQ2NDZVTEwsIDE0OTUwMjA1NDE1ODI0NDA5MjkyVUxMLCAyOTkwMDQxMDgzMTY0ODgxODU4VUxMLCAKLQk1OTgwMDgyMTY2MzI5NzYzNzE2VUxMLCAxMTk2MDE2NDMzMjY1OTUyNzQzM1VMTCwgMjM5MjAzMjg2NjUzMTkwNTQ4NlVMTCwgCi0JNDc4NDA2NTczMzA2MzgxMDk3M1VMTCwgOTU2ODEzMTQ2NjEyNzYyMTk0N1VMTCwgMTkxMzYyNjI5MzIyNTUyNDM4OVVMTCwgCi0JMzgyNzI1MjU4NjQ1MTA0ODc3OFVMTCwgNzY1NDUwNTE3MjkwMjA5NzU1N1VMTCwgMTUzMDkwMTAzNDU4MDQxOTUxMTVVTEwsIAotCTMwNjE4MDIwNjkxNjA4MzkwMjNVTEwsIDYxMjM2MDQxMzgzMjE2NzgwNDZVTEwsIDEyMjQ3MjA4Mjc2NjQzMzU2MDkyVUxMLCAKLQkyNDQ5NDQxNjU1MzI4NjcxMjE4VUxMLCA0ODk4ODgzMzEwNjU3MzQyNDM2VUxMLCA5Nzk3NzY2NjIxMzE0Njg0ODczVUxMLCAKLQkxOTU5NTUzMzI0MjYyOTM2OTc0VUxMLCAzOTE5MTA2NjQ4NTI1ODczOTQ5VUxMLCA3ODM4MjEzMjk3MDUxNzQ3ODk5VUxMLCAKLQkxNTY3NjQyNjU5NDEwMzQ5NTc5OFVMTCwgMzEzNTI4NTMxODgyMDY5OTE1OVVMTCwgNjI3MDU3MDYzNzY0MTM5ODMxOVVMTCwgCi0JMTI1NDExNDEyNzUyODI3OTY2MzhVTEwsIDI1MDgyMjgyNTUwNTY1NTkzMjdVTEwsIDUwMTY0NTY1MTAxMTMxMTg2NTVVTEwsIAotCTEwMDMyOTEzMDIwMjI2MjM3MzEwVUxMLCAyMDA2NTgyNjA0MDQ1MjQ3NDYyVUxMLCA0MDEzMTY1MjA4MDkwNDk0OTI0VUxMLCAKLQk4MDI2MzMwNDE2MTgwOTg5ODQ4VUxMLCAxNjA1MjY2MDgzMjM2MTk3OTY5N1VMTCwgMzIxMDUzMjE2NjQ3MjM5NTkzOVVMTCwgCi0JNjQyMTA2NDMzMjk0NDc5MTg3OFVMTCwgMTI4NDIxMjg2NjU4ODk1ODM3NTdVTEwsIDI1Njg0MjU3MzMxNzc5MTY3NTFVTEwsIAotCTUxMzY4NTE0NjYzNTU4MzM1MDNVTEwsIDEwMjczNzAyOTMyNzExNjY3MDA2VUxMLCAyMDU0NzQwNTg2NTQyMzMzNDAxVUxMLCAKLQk0MTA5NDgxMTczMDg0NjY2ODAyVUxMLCA4MjE4OTYyMzQ2MTY5MzMzNjA1VUxMLCAxNjQzNzkyNDY5MjMzODY2NzIxMFVMTCwgCi0JMzI4NzU4NDkzODQ2NzczMzQ0MlVMTCwgNjU3NTE2OTg3NjkzNTQ2Njg4NFVMTCwgMTMxNTAzMzk3NTM4NzA5MzM3NjhVTEwsIAotCTI2MzAwNjc5NTA3NzQxODY3NTNVTEwsIDUyNjAxMzU5MDE1NDgzNzM1MDdVTEwsIDEwNTIwMjcxODAzMDk2NzQ3MDE0VUxMLCAKLQkyMTA0MDU0MzYwNjE5MzQ5NDAyVUxMLCA0MjA4MTA4NzIxMjM4Njk4ODA1VUxMLCA4NDE2MjE3NDQyNDc3Mzk3NjExVUxMLCAKLQkxNjgzMjQzNDg4NDk1NDc5NTIyM1VMTCwgMzM2NjQ4Njk3Njk5MDk1OTA0NFVMTCwgNjczMjk3Mzk1Mzk4MTkxODA4OVVMTCwgCi0JMTM0NjU5NDc5MDc5NjM4MzYxNzhVTEwsIDI2OTMxODk1ODE1OTI3NjcyMzVVTEwsIDUzODYzNzkxNjMxODU1MzQ0NzFVTEwsIAotCTEwNzcyNzU4MzI2MzcxMDY4OTQyVUxMLCAyMTU0NTUxNjY1Mjc0MjEzNzg4VUxMLCA0MzA5MTAzMzMwNTQ4NDI3NTc3VUxMLCAKLQk4NjE4MjA2NjYxMDk2ODU1MTU0VUxMLCAxNzIzNjQxMzMyMjE5MzcxMDMwOFVMTCwgMzQ0NzI4MjY2NDQzODc0MjA2MVVMTCwgCi0JNjg5NDU2NTMyODg3NzQ4NDEyM1VMTCwgMTM3ODkxMzA2NTc3NTQ5NjgyNDZVTEwsIDI3NTc4MjYxMzE1NTA5OTM2NDlVTEwsIAotCTU1MTU2NTIyNjMxMDE5ODcyOThVTEwsIDExMDMxMzA0NTI2MjAzOTc0NTk3VUxMLCAyMjA2MjYwOTA1MjQwNzk0OTE5VUxMLCAKLQk0NDEyNTIxODEwNDgxNTg5ODM4VUxMLCA4ODI1MDQzNjIwOTYzMTc5Njc3VUxMLCAxNzY1MDA4NzI0MTkyNjM1OTM1NVVMTCwgCi0JMzUzMDAxNzQ0ODM4NTI3MTg3MVVMTCwgNzA2MDAzNDg5Njc3MDU0Mzc0MlVMTCwgMTQxMjAwNjk3OTM1NDEwODc0ODRVTEwsIAotCTI4MjQwMTM5NTg3MDgyMTc0OTZVTEwsIDU2NDgwMjc5MTc0MTY0MzQ5OTNVTEwsIDExMjk2MDU1ODM0ODMyODY5OTg3VUxMLCAKLQkyMjU5MjExMTY2OTY2NTczOTk3VUxMLCA0NTE4NDIyMzMzOTMzMTQ3OTk1VUxMLCA5MDM2ODQ0NjY3ODY2Mjk1OTkwVUxMLCAKLQkxODA3MzY4OTMzNTczMjU5MTk4MFVMTCwgMzYxNDczNzg2NzE0NjUxODM5NlVMTCwgNzIyOTQ3NTczNDI5MzAzNjc5MlVMTCwgCi0JMTQ0NTg5NTE0Njg1ODYwNzM1ODRVTEwsIDI4OTE3OTAyOTM3MTcyMTQ3MTZVTEwsIDU3ODM1ODA1ODc0MzQ0Mjk0MzNVTEwsIAotCTExNTY3MTYxMTc0ODY4ODU4ODY3VUxMLCAyMzEzNDMyMjM0OTczNzcxNzczVUxMLCA0NjI2ODY0NDY5OTQ3NTQzNTQ3VUxMLCAKLQk5MjUzNzI4OTM5ODk1MDg3MDk0VUxMLCAxODUwNzQ1Nzg3OTc5MDE3NDE4VUxMLCAzNzAxNDkxNTc1OTU4MDM0ODM3VUxMLCAKLQk3NDAyOTgzMTUxOTE2MDY5Njc1VUxMLCAxNDgwNTk2NjMwMzgzMjEzOTM1MFVMTCwgMjk2MTE5MzI2MDc2NjQyNzg3MFVMTCwgCi0JNTkyMjM4NjUyMTUzMjg1NTc0MFVMTCwgMTE4NDQ3NzMwNDMwNjU3MTE0ODBVTEwsIDIzNjg5NTQ2MDg2MTMxNDIyOTZVTEwsIAotCTQ3Mzc5MDkyMTcyMjYyODQ1OTJVTEwsIDk0NzU4MTg0MzQ0NTI1NjkxODRVTEwsIDE4OTUxNjM2ODY4OTA1MTM4MzZVTEwsIAotCTM3OTAzMjczNzM3ODEwMjc2NzNVTEwsIDc1ODA2NTQ3NDc1NjIwNTUzNDdVTEwsIDE1MTYxMzA5NDk1MTI0MTEwNjk0VUxMLCAKLQkzMDMyMjYxODk5MDI0ODIyMTM4VUxMLCA2MDY0NTIzNzk4MDQ5NjQ0Mjc3VUxMLCAxMjEyOTA0NzU5NjA5OTI4ODU1NVVMTCwgCi0JMjQyNTgwOTUxOTIxOTg1NzcxMVVMTCwgNDg1MTYxOTAzODQzOTcxNTQyMlVMTCwgOTcwMzIzODA3Njg3OTQzMDg0NFVMTCwgCi0JMTk0MDY0NzYxNTM3NTg4NjE2OFVMTCwgMzg4MTI5NTIzMDc1MTc3MjMzN1VMTCwgNzc2MjU5MDQ2MTUwMzU0NDY3NVVMTCwgCi0JMTU1MjUxODA5MjMwMDcwODkzNTFVTEwsIDMxMDUwMzYxODQ2MDE0MTc4NzBVTEwsIDYyMTAwNzIzNjkyMDI4MzU3NDBVTEwsIAotCTEyNDIwMTQ0NzM4NDA1NjcxNDgxVUxMLCAyNDg0MDI4OTQ3NjgxMTM0Mjk2VUxMLCA0OTY4MDU3ODk1MzYyMjY4NTkyVUxMLCAKLQk5OTM2MTE1NzkwNzI0NTM3MTg0VUxMLCAxOTg3MjIzMTU4MTQ0OTA3NDM2VUxMLCAzOTc0NDQ2MzE2Mjg5ODE0ODczVUxMLCAKLQk3OTQ4ODkyNjMyNTc5NjI5NzQ3VUxMLCAxNTg5Nzc4NTI2NTE1OTI1OTQ5NVVMTCwgMzE3OTU1NzA1MzAzMTg1MTg5OVVMTCwgCi0JNjM1OTExNDEwNjA2MzcwMzc5OFVMTCwgMTI3MTgyMjgyMTIxMjc0MDc1OTZVTEwsIDI1NDM2NDU2NDI0MjU0ODE1MTlVTEwsIAotCTUwODcyOTEyODQ4NTA5NjMwMzhVTEwsIDEwMTc0NTgyNTY5NzAxOTI2MDc3VUxMLCAyMDM0OTE2NTEzOTQwMzg1MjE1VUxMLCAKLQk0MDY5ODMzMDI3ODgwNzcwNDMwVUxMLCA4MTM5NjY2MDU1NzYxNTQwODYxVUxMLCAxNjI3OTMzMjExMTUyMzA4MTcyM1VMTCwgCi0JMzI1NTg2NjQyMjMwNDYxNjM0NFVMTCwgNjUxMTczMjg0NDYwOTIzMjY4OVVMTCwgMTMwMjM0NjU2ODkyMTg0NjUzNzlVTEwsIAotCTI2MDQ2OTMxMzc4NDM2OTMwNzVVTEwsIDUyMDkzODYyNzU2ODczODYxNTFVTEwsIDEwNDE4NzcyNTUxMzc0NzcyMzAzVUxMLCAKLQkyMDgzNzU0NTEwMjc0OTU0NDYwVUxMLCA0MTY3NTA5MDIwNTQ5OTA4OTIxVUxMLCA4MzM1MDE4MDQxMDk5ODE3ODQyVUxMLCAKLQkxNjY3MDAzNjA4MjE5OTYzNTY4NVVMTCwgMzMzNDAwNzIxNjQzOTkyNzEzN1VMTCwgNjY2ODAxNDQzMjg3OTg1NDI3NFVMTCwgCi0JMTMzMzYwMjg4NjU3NTk3MDg1NDhVTEwsIDI2NjcyMDU3NzMxNTE5NDE3MDlVTEwsIDUzMzQ0MTE1NDYzMDM4ODM0MTlVTEwsIAotCTEwNjY4ODIzMDkyNjA3NzY2ODM4VUxMLCAyMTMzNzY0NjE4NTIxNTUzMzY3VUxMLCA0MjY3NTI5MjM3MDQzMTA2NzM1VUxMLCAKLQk4NTM1MDU4NDc0MDg2MjEzNDcwVUxMLCAxNzA3MDExNjk0ODE3MjQyNjk0MVVMTCwgMzQxNDAyMzM4OTYzNDQ4NTM4OFVMTCwgCi0JNjgyODA0Njc3OTI2ODk3MDc3NlVMTCwgMTM2NTYwOTM1NTg1Mzc5NDE1NTNVTEwsIDI3MzEyMTg3MTE3MDc1ODgzMTBVTEwsIAotCTU0NjI0Mzc0MjM0MTUxNzY2MjFVTEwsIDEwOTI0ODc0ODQ2ODMwMzUzMjQyVUxMLCAyMTg0OTc0OTY5MzY2MDcwNjQ4VUxMLCAKLQk0MzY5OTQ5OTM4NzMyMTQxMjk3VUxMLCA4NzM5ODk5ODc3NDY0MjgyNTk0VUxMLCAxNzQ3OTc5OTc1NDkyODU2NTE4OFVMTCwgCi0JMzQ5NTk1OTk1MDk4NTcxMzAzN1VMTCwgNjk5MTkxOTkwMTk3MTQyNjA3NVVMTCwgMTM5ODM4Mzk4MDM5NDI4NTIxNTBVTEwsIAotCTI3OTY3Njc5NjA3ODg1NzA0MzBVTEwsIDU1OTM1MzU5MjE1NzcxNDA4NjBVTEwsIDExMTg3MDcxODQzMTU0MjgxNzIwVUxMLCAKLQkyMjM3NDE0MzY4NjMwODU2MzQ0VUxMLCA0NDc0ODI4NzM3MjYxNzEyNjg4VUxMLCA4OTQ5NjU3NDc0NTIzNDI1Mzc2VUxMLCAKLQkxNzg5OTMxNDk0OTA0Njg1MDc1MlVMTCwgMzU3OTg2Mjk4OTgwOTM3MDE1MFVMTCwgNzE1OTcyNTk3OTYxODc0MDMwMVVMTCwgCi0JMTQzMTk0NTE5NTkyMzc0ODA2MDJVTEwsIDI4NjM4OTAzOTE4NDc0OTYxMjBVTEwsIDU3Mjc3ODA3ODM2OTQ5OTIyNDBVTEwsIAotCTExNDU1NTYxNTY3Mzg5OTg0NDgxVUxMLCAyMjkxMTEyMzEzNDc3OTk2ODk2VUxMLCA0NTgyMjI0NjI2OTU1OTkzNzkyVUxMLCAKLQk5MTY0NDQ5MjUzOTExOTg3NTg1VUxMLCAxODMyODg5ODUwNzgyMzk3NTE3MFVMTCwgMzY2NTc3OTcwMTU2NDc5NTAzNFVMTCwgCi0JNzMzMTU1OTQwMzEyOTU5MDA2OFVMTCwgMTQ2NjMxMTg4MDYyNTkxODAxMzZVTEwsIDI5MzI2MjM3NjEyNTE4MzYwMjdVTEwsIAotCTU4NjUyNDc1MjI1MDM2NzIwNTRVTEwsIDExNzMwNDk1MDQ1MDA3MzQ0MTA5VUxMLCAyMzQ2MDk5MDA5MDAxNDY4ODIxVUxMLCAKLQk0NjkyMTk4MDE4MDAyOTM3NjQzVUxMLCA5Mzg0Mzk2MDM2MDA1ODc1Mjg3VUxMLCAxODc2ODc5MjA3MjAxMTc1MDU3VUxMLCAKLQkzNzUzNzU4NDE0NDAyMzUwMTE0VUxMLCA3NTA3NTE2ODI4ODA0NzAwMjI5VUxMLCAxNTAxNTAzMzY1NzYwOTQwMDQ1OVVMTCwgCi0JMzAwMzAwNjczMTUyMTg4MDA5MVVMTCwgNjAwNjAxMzQ2MzA0Mzc2MDE4M1VMTCwgMTIwMTIwMjY5MjYwODc1MjAzNjdVTEwsIAotCTI0MDI0MDUzODUyMTc1MDQwNzNVTEwsIDQ4MDQ4MTA3NzA0MzUwMDgxNDdVTEwsIDk2MDk2MjE1NDA4NzAwMTYyOTRVTEwsIAotCTE5MjE5MjQzMDgxNzQwMDMyNThVTEwsIDM4NDM4NDg2MTYzNDgwMDY1MTdVTEwsIDc2ODc2OTcyMzI2OTYwMTMwMzVVTEwsIAotCTE1Mzc1Mzk0NDY1MzkyMDI2MDcwVUxMLCAzMDc1MDc4ODkzMDc4NDA1MjE0VUxMLCA2MTUwMTU3Nzg2MTU2ODEwNDI4VUxMLCAKLQkxMjMwMDMxNTU3MjMxMzYyMDg1NlVMTCwgMjQ2MDA2MzExNDQ2MjcyNDE3MVVMTCwgNDkyMDEyNjIyODkyNTQ0ODM0MlVMTCwgCi0JOTg0MDI1MjQ1Nzg1MDg5NjY4NVVMTCwgMTk2ODA1MDQ5MTU3MDE3OTMzN1VMTCwgMzkzNjEwMDk4MzE0MDM1ODY3NFVMTCwgCi0JNzg3MjIwMTk2NjI4MDcxNzM0OFVMTCwgMTU3NDQ0MDM5MzI1NjE0MzQ2OTZVTEwsIDMxNDg4ODA3ODY1MTIyODY5MzlVTEwsIAotCTYyOTc3NjE1NzMwMjQ1NzM4NzhVTEwsIDEyNTk1NTIzMTQ2MDQ5MTQ3NzU3VUxMLCAyNTE5MTA0NjI5MjA5ODI5NTUxVUxMLCAKLQk1MDM4MjA5MjU4NDE5NjU5MTAyVUxMLCAxMDA3NjQxODUxNjgzOTMxODIwNVVMTCwgMjAxNTI4MzcwMzM2Nzg2MzY0MVVMTCwgCi0JNDAzMDU2NzQwNjczNTcyNzI4MlVMTCwgODA2MTEzNDgxMzQ3MTQ1NDU2NFVMTCwgMTYxMjIyNjk2MjY5NDI5MDkxMjlVTEwsIAotCTMyMjQ0NTM5MjUzODg1ODE4MjVVTEwsIDY0NDg5MDc4NTA3NzcxNjM2NTFVTEwsIDEyODk3ODE1NzAxNTU0MzI3MzAzVUxMLCAKLQkyNTc5NTYzMTQwMzEwODY1NDYwVUxMLCA1MTU5MTI2MjgwNjIxNzMwOTIxVUxMLCAxMDMxODI1MjU2MTI0MzQ2MTg0MlVMTCwgCi0JMjA2MzY1MDUxMjI0ODY5MjM2OFVMTCwgNDEyNzMwMTAyNDQ5NzM4NDczN1VMTCwgODI1NDYwMjA0ODk5NDc2OTQ3NFVMTCwgCi0JMTY1MDkyMDQwOTc5ODk1Mzg5NDhVTEwsIDMzMDE4NDA4MTk1OTc5MDc3ODlVTEwsIDY2MDM2ODE2MzkxOTU4MTU1NzlVTEwsIAotCTEzMjA3MzYzMjc4MzkxNjMxMTU4VUxMLCAyNjQxNDcyNjU1Njc4MzI2MjMxVUxMLCA1MjgyOTQ1MzExMzU2NjUyNDYzVUxMLCAKLQkxMDU2NTg5MDYyMjcxMzMwNDkyN1VMTCwgMjExMzE3ODEyNDU0MjY2MDk4NVVMTCwgNDIyNjM1NjI0OTA4NTMyMTk3MFVMTCwgCi0JODQ1MjcxMjQ5ODE3MDY0Mzk0MVVMTCwgMTY5MDU0MjQ5OTYzNDEyODc4ODNVTEwsIDMzODEwODQ5OTkyNjgyNTc1NzZVTEwsIAotCTY3NjIxNjk5OTg1MzY1MTUxNTNVTEwsIDEzNTI0MzM5OTk3MDczMDMwMzA2VUxMLCAyNzA0ODY3OTk5NDE0NjA2MDYxVUxMLCAKLQk1NDA5NzM1OTk4ODI5MjEyMTIyVUxMLCAxMDgxOTQ3MTk5NzY1ODQyNDI0NVVMTCwgMjE2Mzg5NDM5OTUzMTY4NDg0OVVMTCwgCi0JNDMyNzc4ODc5OTA2MzM2OTY5OFVMTCwgODY1NTU3NzU5ODEyNjczOTM5NlVMTCwgMTczMTExNTUxOTYyNTM0Nzg3OTJVTEwsIAotCTM0NjIyMzEwMzkyNTA2OTU3NThVTEwsIDY5MjQ0NjIwNzg1MDEzOTE1MTZVTEwsIDEzODQ4OTI0MTU3MDAyNzgzMDMzVUxMLCAKLQkyNzY5Nzg0ODMxNDAwNTU2NjA2VUxMLCA1NTM5NTY5NjYyODAxMTEzMjEzVUxMLCAxMTA3OTEzOTMyNTYwMjIyNjQyN1VMTCwgCi0JMjIxNTgyNzg2NTEyMDQ0NTI4NVVMTCwgNDQzMTY1NTczMDI0MDg5MDU3MFVMTCwgODg2MzMxMTQ2MDQ4MTc4MTE0MVVMTCwgCi0JMTc3MjY2MjI5MjA5NjM1NjIyODNVTEwsIDM1NDUzMjQ1ODQxOTI3MTI0NTZVTEwsIDcwOTA2NDkxNjgzODU0MjQ5MTNVTEwsIAotCTE0MTgxMjk4MzM2NzcwODQ5ODI2VUxMLCAyODM2MjU5NjY3MzU0MTY5OTY1VUxMLCA1NjcyNTE5MzM0NzA4MzM5OTMwVUxMLCAKLQkxMTM0NTAzODY2OTQxNjY3OTg2MVVMTCwgMjI2OTAwNzczMzg4MzMzNTk3MlVMTCwgNDUzODAxNTQ2Nzc2NjY3MTk0NFVMTCwgCi0JOTA3NjAzMDkzNTUzMzM0Mzg4OVVMTCwgMTgxNTIwNjE4NzEwNjY2ODc3NzhVTEwsIDM2MzA0MTIzNzQyMTMzMzc1NTVVTEwsIAotCTcyNjA4MjQ3NDg0MjY2NzUxMTFVTEwsIDE0NTIxNjQ5NDk2ODUzMzUwMjIyVUxMLCAyOTA0MzI5ODk5MzcwNjcwMDQ0VUxMLCAKLQk1ODA4NjU5Nzk4NzQxMzQwMDg5VUxMLCAxMTYxNzMxOTU5NzQ4MjY4MDE3OFVMTCwgMjMyMzQ2MzkxOTQ5NjUzNjAzNVVMTCwgCi0JNDY0NjkyNzgzODk5MzA3MjA3MVVMTCwgOTI5Mzg1NTY3Nzk4NjE0NDE0MlVMTCwgMTg1ODc3MTEzNTU5NzIyODgyOFVMTCwgCi0JMzcxNzU0MjI3MTE5NDQ1NzY1NlVMTCwgNzQzNTA4NDU0MjM4ODkxNTMxM1VMTCwgMTQ4NzAxNjkwODQ3Nzc4MzA2MjdVTEwsIAotCTI5NzQwMzM4MTY5NTU1NjYxMjVVTEwsIDU5NDgwNjc2MzM5MTExMzIyNTFVTEwsIDExODk2MTM1MjY3ODIyMjY0NTAyVUxMLCAKLQkyMzc5MjI3MDUzNTY0NDUyOTAwVUxMLCA0NzU4NDU0MTA3MTI4OTA1ODAwVUxMLCA5NTE2OTA4MjE0MjU3ODExNjAxVUxMLCAKLQkxOTAzMzgxNjQyODUxNTYyMzIwVUxMLCAzODA2NzYzMjg1NzAzMTI0NjQwVUxMLCA3NjEzNTI2NTcxNDA2MjQ5MjgxVUxMLCAKLQkxNTIyNzA1MzE0MjgxMjQ5ODU2M1VMTCwgMzA0NTQxMDYyODU2MjQ5OTcxMlVMTCwgNjA5MDgyMTI1NzEyNDk5OTQyNVVMTCwgCi0JMTIxODE2NDI1MTQyNDk5OTg4NTBVTEwsIDI0MzYzMjg1MDI4NDk5OTk3NzBVTEwsIDQ4NzI2NTcwMDU2OTk5OTk1NDBVTEwsIAotCTk3NDUzMTQwMTEzOTk5OTkwODBVTEwsIDE5NDkwNjI4MDIyNzk5OTk4MTZVTEwsIDM4OTgxMjU2MDQ1NTk5OTk2MzJVTEwsIAotCTc3OTYyNTEyMDkxMTk5OTkyNjRVTEwsIDE1NTkyNTAyNDE4MjM5OTk4NTI4VUxMLCAzMTE4NTAwNDgzNjQ3OTk5NzA1VUxMLCAKLQk2MjM3MDAwOTY3Mjk1OTk5NDExVUxMLCAxMjQ3NDAwMTkzNDU5MTk5ODgyMlVMTCwgMjQ5NDgwMDM4NjkxODM5OTc2NFVMTCwgCi0JNDk4OTYwMDc3MzgzNjc5OTUyOVVMTCwgOTk3OTIwMTU0NzY3MzU5OTA1OFVMTCwgMTk5NTg0MDMwOTUzNDcxOTgxMVVMTCwgCi0JMzk5MTY4MDYxOTA2OTQzOTYyM1VMTCwgNzk4MzM2MTIzODEzODg3OTI0NlVMTCwgMTU5NjY3MjI0NzYyNzc3NTg0OTNVTEwsIAotCTMxOTMzNDQ0OTUyNTU1NTE2OThVTEwsIDYzODY2ODg5OTA1MTExMDMzOTdVTEwsIDEyNzczMzc3OTgxMDIyMjA2Nzk0VUxMLCAKLQkyNTU0Njc1NTk2MjA0NDQxMzU4VUxMLCA1MTA5MzUxMTkyNDA4ODgyNzE3VUxMLCAxMDIxODcwMjM4NDgxNzc2NTQzNVVMTCwgCi0JMjA0Mzc0MDQ3Njk2MzU1MzA4N1VMTCwgNDA4NzQ4MDk1MzkyNzEwNjE3NFVMTCwgODE3NDk2MTkwNzg1NDIxMjM0OFVMTCwgCi0JMTYzNDk5MjM4MTU3MDg0MjQ2OTdVTEwsIDMyNjk5ODQ3NjMxNDE2ODQ5MzlVTEwsIDY1Mzk5Njk1MjYyODMzNjk4NzhVTEwsIAotCTEzMDc5OTM5MDUyNTY2NzM5NzU3VUxMLCAyNjE1OTg3ODEwNTEzMzQ3OTUxVUxMLCA1MjMxOTc1NjIxMDI2Njk1OTAzVUxMLCAKLQkxMDQ2Mzk1MTI0MjA1MzM5MTgwNlVMTCwgMjA5Mjc5MDI0ODQxMDY3ODM2MVVMTCwgNDE4NTU4MDQ5NjgyMTM1NjcyMlVMTCwgCi0JODM3MTE2MDk5MzY0MjcxMzQ0NFVMTCwgMTY3NDIzMjE5ODcyODU0MjY4ODlVTEwsIDMzNDg0NjQzOTc0NTcwODUzNzdVTEwsIAotCTY2OTY5Mjg3OTQ5MTQxNzA3NTVVTEwsIDEzMzkzODU3NTg5ODI4MzQxNTExVUxMLCAyNjc4NzcxNTE3OTY1NjY4MzAyVUxMLCAKLQk1MzU3NTQzMDM1OTMxMzM2NjA0VUxMLCAxMDcxNTA4NjA3MTg2MjY3MzIwOVVMTCwgMjE0MzAxNzIxNDM3MjUzNDY0MVVMTCwgCi0JNDI4NjAzNDQyODc0NTA2OTI4M1VMTCwgODU3MjA2ODg1NzQ5MDEzODU2N1VMTCwgMTcxNDQxMzc3MTQ5ODAyNzcxMzVVTEwsIAotCTM0Mjg4Mjc1NDI5OTYwNTU0MjdVTEwsIDY4NTc2NTUwODU5OTIxMTA4NTRVTEwsIDEzNzE1MzEwMTcxOTg0MjIxNzA4VUxMLCAKLQkyNzQzMDYyMDM0Mzk2ODQ0MzQxVUxMLCA1NDg2MTI0MDY4NzkzNjg4NjgzVUxMLCAxMDk3MjI0ODEzNzU4NzM3NzM2NlVMTCwgCi0JMjE5NDQ0OTYyNzUxNzQ3NTQ3M1VMTCwgNDM4ODg5OTI1NTAzNDk1MDk0NlVMTCwgODc3Nzc5ODUxMDA2OTkwMTg5M1VMTCwgCi0JMTc1NTU1OTcwMjAxMzk4MDM3ODZVTEwsIDM1MTExMTk0MDQwMjc5NjA3NTdVTEwsIDcwMjIyMzg4MDgwNTU5MjE1MTRVTEwsIAotCTE0MDQ0NDc3NjE2MTExODQzMDI5VUxMLCAyODA4ODk1NTIzMjIyMzY4NjA1VUxMLCA1NjE3NzkxMDQ2NDQ0NzM3MjExVUxMLCAKLQkxMTIzNTU4MjA5Mjg4OTQ3NDQyM1VMTCwgMjI0NzExNjQxODU3Nzg5NDg4NFVMTCwgNDQ5NDIzMjgzNzE1NTc4OTc2OVVMTCwgCi0JODk4ODQ2NTY3NDMxMTU3OTUzOFVMTCwgMTc5NzY5MzEzNDg2MjMxNTkwNzdVTEwsIDM1OTUzODYyNjk3MjQ2MzE4MTVVTEwsIAotCTcxOTA3NzI1Mzk0NDkyNjM2MzBVTEwsIDE0MzgxNTQ1MDc4ODk4NTI3MjYxVUxMLCAyODc2MzA5MDE1Nzc5NzA1NDUyVUxMLCAKLQk1NzUyNjE4MDMxNTU5NDEwOTA0VUxMLCAxMTUwNTIzNjA2MzExODgyMTgwOVVMTCwgMjMwMTA0NzIxMjYyMzc2NDM2MVVMTCwgCi0JNDYwMjA5NDQyNTI0NzUyODcyM1VMTCwgOTIwNDE4ODg1MDQ5NTA1NzQ0N1VMTCwgMTg0MDgzNzc3MDA5OTAxMTQ4OTVVTEwsIAotCTM2ODE2NzU1NDAxOTgwMjI5NzlVTEwsIDczNjMzNTEwODAzOTYwNDU5NThVTEwsIAotfTsKLQotc3RhdGljIGNvbnN0IGdpbnQzMiBGb3JtYXR0ZXJfVGVuc0V4cG9uZW50VGFibGUgW10gPSB7Ci0JLTMyMywgLTMyMywgLTMyMywgLTMyMiwgLTMyMiwgLTMyMiwgLTMyMSwgLTMyMSwgLTMyMSwgLTMyMCwgLTMyMCwgLTMyMCwgCi0JLTMxOSwgLTMxOSwgLTMxOSwgLTMxOSwgLTMxOCwgLTMxOCwgLTMxOCwgLTMxNywgLTMxNywgLTMxNywgLTMxNiwgLTMxNiwgCi0JLTMxNiwgLTMxNiwgLTMxNSwgLTMxNSwgLTMxNSwgLTMxNCwgLTMxNCwgLTMxNCwgLTMxMywgLTMxMywgLTMxMywgLTMxMywgCi0JLTMxMiwgLTMxMiwgLTMxMiwgLTMxMSwgLTMxMSwgLTMxMSwgLTMxMCwgLTMxMCwgLTMxMCwgLTMxMCwgLTMwOSwgLTMwOSwgCi0JLTMwOSwgLTMwOCwgLTMwOCwgLTMwOCwgLTMwNywgLTMwNywgLTMwNywgLTMwNywgLTMwNiwgLTMwNiwgLTMwNiwgLTMwNSwgCi0JLTMwNSwgLTMwNSwgLTMwNCwgLTMwNCwgLTMwNCwgLTMwNCwgLTMwMywgLTMwMywgLTMwMywgLTMwMiwgLTMwMiwgLTMwMiwgCi0JLTMwMSwgLTMwMSwgLTMwMSwgLTMwMSwgLTMwMCwgLTMwMCwgLTMwMCwgLTI5OSwgLTI5OSwgLTI5OSwgLTI5OCwgLTI5OCwgCi0JLTI5OCwgLTI5OCwgLTI5NywgLTI5NywgLTI5NywgLTI5NiwgLTI5NiwgLTI5NiwgLTI5NSwgLTI5NSwgLTI5NSwgLTI5NSwgCi0JLTI5NCwgLTI5NCwgLTI5NCwgLTI5MywgLTI5MywgLTI5MywgLTI5MiwgLTI5MiwgLTI5MiwgLTI5MSwgLTI5MSwgLTI5MSwgCi0JLTI5MSwgLTI5MCwgLTI5MCwgLTI5MCwgLTI4OSwgLTI4OSwgLTI4OSwgLTI4OCwgLTI4OCwgLTI4OCwgLTI4OCwgLTI4NywgCi0JLTI4NywgLTI4NywgLTI4NiwgLTI4NiwgLTI4NiwgLTI4NSwgLTI4NSwgLTI4NSwgLTI4NSwgLTI4NCwgLTI4NCwgLTI4NCwgCi0JLTI4MywgLTI4MywgLTI4MywgLTI4MiwgLTI4MiwgLTI4MiwgLTI4MiwgLTI4MSwgLTI4MSwgLTI4MSwgLTI4MCwgLTI4MCwgCi0JLTI4MCwgLTI3OSwgLTI3OSwgLTI3OSwgLTI3OSwgLTI3OCwgLTI3OCwgLTI3OCwgLTI3NywgLTI3NywgLTI3NywgLTI3NiwgCi0JLTI3NiwgLTI3NiwgLTI3NiwgLTI3NSwgLTI3NSwgLTI3NSwgLTI3NCwgLTI3NCwgLTI3NCwgLTI3MywgLTI3MywgLTI3MywgCi0JLTI3MywgLTI3MiwgLTI3MiwgLTI3MiwgLTI3MSwgLTI3MSwgLTI3MSwgLTI3MCwgLTI3MCwgLTI3MCwgLTI3MCwgLTI2OSwgCi0JLTI2OSwgLTI2OSwgLTI2OCwgLTI2OCwgLTI2OCwgLTI2NywgLTI2NywgLTI2NywgLTI2NywgLTI2NiwgLTI2NiwgLTI2NiwgCi0JLTI2NSwgLTI2NSwgLTI2NSwgLTI2NCwgLTI2NCwgLTI2NCwgLTI2NCwgLTI2MywgLTI2MywgLTI2MywgLTI2MiwgLTI2MiwgCi0JLTI2MiwgLTI2MSwgLTI2MSwgLTI2MSwgLTI2MCwgLTI2MCwgLTI2MCwgLTI2MCwgLTI1OSwgLTI1OSwgLTI1OSwgLTI1OCwgCi0JLTI1OCwgLTI1OCwgLTI1NywgLTI1NywgLTI1NywgLTI1NywgLTI1NiwgLTI1NiwgLTI1NiwgLTI1NSwgLTI1NSwgLTI1NSwgCi0JLTI1NCwgLTI1NCwgLTI1NCwgLTI1NCwgLTI1MywgLTI1MywgLTI1MywgLTI1MiwgLTI1MiwgLTI1MiwgLTI1MSwgLTI1MSwgCi0JLTI1MSwgLTI1MSwgLTI1MCwgLTI1MCwgLTI1MCwgLTI0OSwgLTI0OSwgLTI0OSwgLTI0OCwgLTI0OCwgLTI0OCwgLTI0OCwgCi0JLTI0NywgLTI0NywgLTI0NywgLTI0NiwgLTI0NiwgLTI0NiwgLTI0NSwgLTI0NSwgLTI0NSwgLTI0NSwgLTI0NCwgLTI0NCwgCi0JLTI0NCwgLTI0MywgLTI0MywgLTI0MywgLTI0MiwgLTI0MiwgLTI0MiwgLTI0MiwgLTI0MSwgLTI0MSwgLTI0MSwgLTI0MCwgCi0JLTI0MCwgLTI0MCwgLTIzOSwgLTIzOSwgLTIzOSwgLTIzOSwgLTIzOCwgLTIzOCwgLTIzOCwgLTIzNywgLTIzNywgLTIzNywgCi0JLTIzNiwgLTIzNiwgLTIzNiwgLTIzNiwgLTIzNSwgLTIzNSwgLTIzNSwgLTIzNCwgLTIzNCwgLTIzNCwgLTIzMywgLTIzMywgCi0JLTIzMywgLTIzMiwgLTIzMiwgLTIzMiwgLTIzMiwgLTIzMSwgLTIzMSwgLTIzMSwgLTIzMCwgLTIzMCwgLTIzMCwgLTIyOSwgCi0JLTIyOSwgLTIyOSwgLTIyOSwgLTIyOCwgLTIyOCwgLTIyOCwgLTIyNywgLTIyNywgLTIyNywgLTIyNiwgLTIyNiwgLTIyNiwgCi0JLTIyNiwgLTIyNSwgLTIyNSwgLTIyNSwgLTIyNCwgLTIyNCwgLTIyNCwgLTIyMywgLTIyMywgLTIyMywgLTIyMywgLTIyMiwgCi0JLTIyMiwgLTIyMiwgLTIyMSwgLTIyMSwgLTIyMSwgLTIyMCwgLTIyMCwgLTIyMCwgLTIyMCwgLTIxOSwgLTIxOSwgLTIxOSwgCi0JLTIxOCwgLTIxOCwgLTIxOCwgLTIxNywgLTIxNywgLTIxNywgLTIxNywgLTIxNiwgLTIxNiwgLTIxNiwgLTIxNSwgLTIxNSwgCi0JLTIxNSwgLTIxNCwgLTIxNCwgLTIxNCwgLTIxNCwgLTIxMywgLTIxMywgLTIxMywgLTIxMiwgLTIxMiwgLTIxMiwgLTIxMSwgCi0JLTIxMSwgLTIxMSwgLTIxMSwgLTIxMCwgLTIxMCwgLTIxMCwgLTIwOSwgLTIwOSwgLTIwOSwgLTIwOCwgLTIwOCwgLTIwOCwgCi0JLTIwOCwgLTIwNywgLTIwNywgLTIwNywgLTIwNiwgLTIwNiwgLTIwNiwgLTIwNSwgLTIwNSwgLTIwNSwgLTIwNSwgLTIwNCwgCi0JLTIwNCwgLTIwNCwgLTIwMywgLTIwMywgLTIwMywgLTIwMiwgLTIwMiwgLTIwMiwgLTIwMSwgLTIwMSwgLTIwMSwgLTIwMSwgCi0JLTIwMCwgLTIwMCwgLTIwMCwgLTE5OSwgLTE5OSwgLTE5OSwgLTE5OCwgLTE5OCwgLTE5OCwgLTE5OCwgLTE5NywgLTE5NywgCi0JLTE5NywgLTE5NiwgLTE5NiwgLTE5NiwgLTE5NSwgLTE5NSwgLTE5NSwgLTE5NSwgLTE5NCwgLTE5NCwgLTE5NCwgLTE5MywgCi0JLTE5MywgLTE5MywgLTE5MiwgLTE5MiwgLTE5MiwgLTE5MiwgLTE5MSwgLTE5MSwgLTE5MSwgLTE5MCwgLTE5MCwgLTE5MCwgCi0JLTE4OSwgLTE4OSwgLTE4OSwgLTE4OSwgLTE4OCwgLTE4OCwgLTE4OCwgLTE4NywgLTE4NywgLTE4NywgLTE4NiwgLTE4NiwgCi0JLTE4NiwgLTE4NiwgLTE4NSwgLTE4NSwgLTE4NSwgLTE4NCwgLTE4NCwgLTE4NCwgLTE4MywgLTE4MywgLTE4MywgLTE4MywgCi0JLTE4MiwgLTE4MiwgLTE4MiwgLTE4MSwgLTE4MSwgLTE4MSwgLTE4MCwgLTE4MCwgLTE4MCwgLTE4MCwgLTE3OSwgLTE3OSwgCi0JLTE3OSwgLTE3OCwgLTE3OCwgLTE3OCwgLTE3NywgLTE3NywgLTE3NywgLTE3NywgLTE3NiwgLTE3NiwgLTE3NiwgLTE3NSwgCi0JLTE3NSwgLTE3NSwgLTE3NCwgLTE3NCwgLTE3NCwgLTE3MywgLTE3MywgLTE3MywgLTE3MywgLTE3MiwgLTE3MiwgLTE3MiwgCi0JLTE3MSwgLTE3MSwgLTE3MSwgLTE3MCwgLTE3MCwgLTE3MCwgLTE3MCwgLTE2OSwgLTE2OSwgLTE2OSwgLTE2OCwgLTE2OCwgCi0JLTE2OCwgLTE2NywgLTE2NywgLTE2NywgLTE2NywgLTE2NiwgLTE2NiwgLTE2NiwgLTE2NSwgLTE2NSwgLTE2NSwgLTE2NCwgCi0JLTE2NCwgLTE2NCwgLTE2NCwgLTE2MywgLTE2MywgLTE2MywgLTE2MiwgLTE2MiwgLTE2MiwgLTE2MSwgLTE2MSwgLTE2MSwgCi0JLTE2MSwgLTE2MCwgLTE2MCwgLTE2MCwgLTE1OSwgLTE1OSwgLTE1OSwgLTE1OCwgLTE1OCwgLTE1OCwgLTE1OCwgLTE1NywgCi0JLTE1NywgLTE1NywgLTE1NiwgLTE1NiwgLTE1NiwgLTE1NSwgLTE1NSwgLTE1NSwgLTE1NSwgLTE1NCwgLTE1NCwgLTE1NCwgCi0JLTE1MywgLTE1MywgLTE1MywgLTE1MiwgLTE1MiwgLTE1MiwgLTE1MiwgLTE1MSwgLTE1MSwgLTE1MSwgLTE1MCwgLTE1MCwgCi0JLTE1MCwgLTE0OSwgLTE0OSwgLTE0OSwgLTE0OSwgLTE0OCwgLTE0OCwgLTE0OCwgLTE0NywgLTE0NywgLTE0NywgLTE0NiwgCi0JLTE0NiwgLTE0NiwgLTE0NSwgLTE0NSwgLTE0NSwgLTE0NSwgLTE0NCwgLTE0NCwgLTE0NCwgLTE0MywgLTE0MywgLTE0MywgCi0JLTE0MiwgLTE0MiwgLTE0MiwgLTE0MiwgLTE0MSwgLTE0MSwgLTE0MSwgLTE0MCwgLTE0MCwgLTE0MCwgLTEzOSwgLTEzOSwgCi0JLTEzOSwgLTEzOSwgLTEzOCwgLTEzOCwgLTEzOCwgLTEzNywgLTEzNywgLTEzNywgLTEzNiwgLTEzNiwgLTEzNiwgLTEzNiwgCi0JLTEzNSwgLTEzNSwgLTEzNSwgLTEzNCwgLTEzNCwgLTEzNCwgLTEzMywgLTEzMywgLTEzMywgLTEzMywgLTEzMiwgLTEzMiwgCi0JLTEzMiwgLTEzMSwgLTEzMSwgLTEzMSwgLTEzMCwgLTEzMCwgLTEzMCwgLTEzMCwgLTEyOSwgLTEyOSwgLTEyOSwgLTEyOCwgCi0JLTEyOCwgLTEyOCwgLTEyNywgLTEyNywgLTEyNywgLTEyNywgLTEyNiwgLTEyNiwgLTEyNiwgLTEyNSwgLTEyNSwgLTEyNSwgCi0JLTEyNCwgLTEyNCwgLTEyNCwgLTEyNCwgLTEyMywgLTEyMywgLTEyMywgLTEyMiwgLTEyMiwgLTEyMiwgLTEyMSwgLTEyMSwgCi0JLTEyMSwgLTEyMSwgLTEyMCwgLTEyMCwgLTEyMCwgLTExOSwgLTExOSwgLTExOSwgLTExOCwgLTExOCwgLTExOCwgLTExOCwgCi0JLTExNywgLTExNywgLTExNywgLTExNiwgLTExNiwgLTExNiwgLTExNSwgLTExNSwgLTExNSwgLTExNCwgLTExNCwgLTExNCwgCi0JLTExNCwgLTExMywgLTExMywgLTExMywgLTExMiwgLTExMiwgLTExMiwgLTExMSwgLTExMSwgLTExMSwgLTExMSwgLTExMCwgCi0JLTExMCwgLTExMCwgLTEwOSwgLTEwOSwgLTEwOSwgLTEwOCwgLTEwOCwgLTEwOCwgLTEwOCwgLTEwNywgLTEwNywgLTEwNywgCi0JLTEwNiwgLTEwNiwgLTEwNiwgLTEwNSwgLTEwNSwgLTEwNSwgLTEwNSwgLTEwNCwgLTEwNCwgLTEwNCwgLTEwMywgLTEwMywgCi0JLTEwMywgLTEwMiwgLTEwMiwgLTEwMiwgLTEwMiwgLTEwMSwgLTEwMSwgLTEwMSwgLTEwMCwgLTEwMCwgLTEwMCwgLTk5LCAKLQktOTksIC05OSwgLTk5LCAtOTgsIC05OCwgLTk4LCAtOTcsIC05NywgLTk3LCAtOTYsIC05NiwgLTk2LCAKLQktOTYsIC05NSwgLTk1LCAtOTUsIC05NCwgLTk0LCAtOTQsIC05MywgLTkzLCAtOTMsIC05MywgLTkyLCAKLQktOTIsIC05MiwgLTkxLCAtOTEsIC05MSwgLTkwLCAtOTAsIC05MCwgLTkwLCAtODksIC04OSwgLTg5LCAKLQktODgsIC04OCwgLTg4LCAtODcsIC04NywgLTg3LCAtODYsIC04NiwgLTg2LCAtODYsIC04NSwgLTg1LCAKLQktODUsIC04NCwgLTg0LCAtODQsIC04MywgLTgzLCAtODMsIC04MywgLTgyLCAtODIsIC04MiwgLTgxLCAKLQktODEsIC04MSwgLTgwLCAtODAsIC04MCwgLTgwLCAtNzksIC03OSwgLTc5LCAtNzgsIC03OCwgLTc4LCAKLQktNzcsIC03NywgLTc3LCAtNzcsIC03NiwgLTc2LCAtNzYsIC03NSwgLTc1LCAtNzUsIC03NCwgLTc0LCAKLQktNzQsIC03NCwgLTczLCAtNzMsIC03MywgLTcyLCAtNzIsIC03MiwgLTcxLCAtNzEsIC03MSwgLTcxLCAKLQktNzAsIC03MCwgLTcwLCAtNjksIC02OSwgLTY5LCAtNjgsIC02OCwgLTY4LCAtNjgsIC02NywgLTY3LCAKLQktNjcsIC02NiwgLTY2LCAtNjYsIC02NSwgLTY1LCAtNjUsIC02NSwgLTY0LCAtNjQsIC02NCwgLTYzLCAKLQktNjMsIC02MywgLTYyLCAtNjIsIC02MiwgLTYyLCAtNjEsIC02MSwgLTYxLCAtNjAsIC02MCwgLTYwLCAKLQktNTksIC01OSwgLTU5LCAtNTksIC01OCwgLTU4LCAtNTgsIC01NywgLTU3LCAtNTcsIC01NiwgLTU2LCAKLQktNTYsIC01NSwgLTU1LCAtNTUsIC01NSwgLTU0LCAtNTQsIC01NCwgLTUzLCAtNTMsIC01MywgLTUyLCAKLQktNTIsIC01MiwgLTUyLCAtNTEsIC01MSwgLTUxLCAtNTAsIC01MCwgLTUwLCAtNDksIC00OSwgLTQ5LCAKLQktNDksIC00OCwgLTQ4LCAtNDgsIC00NywgLTQ3LCAtNDcsIC00NiwgLTQ2LCAtNDYsIC00NiwgLTQ1LCAKLQktNDUsIC00NSwgLTQ0LCAtNDQsIC00NCwgLTQzLCAtNDMsIC00MywgLTQzLCAtNDIsIC00MiwgLTQyLCAKLQktNDEsIC00MSwgLTQxLCAtNDAsIC00MCwgLTQwLCAtNDAsIC0zOSwgLTM5LCAtMzksIC0zOCwgLTM4LCAKLQktMzgsIC0zNywgLTM3LCAtMzcsIC0zNywgLTM2LCAtMzYsIC0zNiwgLTM1LCAtMzUsIC0zNSwgLTM0LCAKLQktMzQsIC0zNCwgLTM0LCAtMzMsIC0zMywgLTMzLCAtMzIsIC0zMiwgLTMyLCAtMzEsIC0zMSwgLTMxLCAKLQktMzEsIC0zMCwgLTMwLCAtMzAsIC0yOSwgLTI5LCAtMjksIC0yOCwgLTI4LCAtMjgsIC0yNywgLTI3LCAKLQktMjcsIC0yNywgLTI2LCAtMjYsIC0yNiwgLTI1LCAtMjUsIC0yNSwgLTI0LCAtMjQsIC0yNCwgLTI0LCAKLQktMjMsIC0yMywgLTIzLCAtMjIsIC0yMiwgLTIyLCAtMjEsIC0yMSwgLTIxLCAtMjEsIC0yMCwgLTIwLCAKLQktMjAsIC0xOSwgLTE5LCAtMTksIC0xOCwgLTE4LCAtMTgsIC0xOCwgLTE3LCAtMTcsIC0xNywgLTE2LCAKLQktMTYsIC0xNiwgLTE1LCAtMTUsIC0xNSwgLTE1LCAtMTQsIC0xNCwgLTE0LCAtMTMsIC0xMywgLTEzLCAKLQktMTIsIC0xMiwgLTEyLCAtMTIsIC0xMSwgLTExLCAtMTEsIC0xMCwgLTEwLCAtMTAsIC05LCAtOSwgCi0JLTksIC05LCAtOCwgLTgsIC04LCAtNywgLTcsIC03LCAtNiwgLTYsIC02LCAtNiwgCi0JLTUsIC01LCAtNSwgLTQsIC00LCAtNCwgLTMsIC0zLCAtMywgLTMsIC0yLCAtMiwgCi0JLTIsIC0xLCAtMSwgLTEsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDIsIAotCTIsIDIsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDUsIDUsIDUsIAotCTYsIDYsIDYsIDcsIDcsIDcsIDcsIDgsIDgsIDgsIDksIDksIAotCTksIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMywgCi0JMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNiwgCi0JMTYsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE5LCAxOSwgMTksIDE5LCAyMCwgCi0JMjAsIDIwLCAyMSwgMjEsIDIxLCAyMiwgMjIsIDIyLCAyMiwgMjMsIDIzLCAyMywgCi0JMjQsIDI0LCAyNCwgMjUsIDI1LCAyNSwgMjUsIDI2LCAyNiwgMjYsIDI3LCAyNywgCi0JMjcsIDI4LCAyOCwgMjgsIDI4LCAyOSwgMjksIDI5LCAzMCwgMzAsIDMwLCAzMSwgCi0JMzEsIDMxLCAzMiwgMzIsIDMyLCAzMiwgMzMsIDMzLCAzMywgMzQsIDM0LCAzNCwgCi0JMzUsIDM1LCAzNSwgMzUsIDM2LCAzNiwgMzYsIDM3LCAzNywgMzcsIDM4LCAzOCwgCi0JMzgsIDM4LCAzOSwgMzksIDM5LCA0MCwgNDAsIDQwLCA0MSwgNDEsIDQxLCA0MSwgCi0JNDIsIDQyLCA0MiwgNDMsIDQzLCA0MywgNDQsIDQ0LCA0NCwgNDQsIDQ1LCA0NSwgCi0JNDUsIDQ2LCA0NiwgNDYsIDQ3LCA0NywgNDcsIDQ3LCA0OCwgNDgsIDQ4LCA0OSwgCi0JNDksIDQ5LCA1MCwgNTAsIDUwLCA1MCwgNTEsIDUxLCA1MSwgNTIsIDUyLCA1MiwgCi0JNTMsIDUzLCA1MywgNTMsIDU0LCA1NCwgNTQsIDU1LCA1NSwgNTUsIDU2LCA1NiwgCi0JNTYsIDU2LCA1NywgNTcsIDU3LCA1OCwgNTgsIDU4LCA1OSwgNTksIDU5LCA2MCwgCi0JNjAsIDYwLCA2MCwgNjEsIDYxLCA2MSwgNjIsIDYyLCA2MiwgNjMsIDYzLCA2MywgCi0JNjMsIDY0LCA2NCwgNjQsIDY1LCA2NSwgNjUsIDY2LCA2NiwgNjYsIDY2LCA2NywgCi0JNjcsIDY3LCA2OCwgNjgsIDY4LCA2OSwgNjksIDY5LCA2OSwgNzAsIDcwLCA3MCwgCi0JNzEsIDcxLCA3MSwgNzIsIDcyLCA3MiwgNzIsIDczLCA3MywgNzMsIDc0LCA3NCwgCi0JNzQsIDc1LCA3NSwgNzUsIDc1LCA3NiwgNzYsIDc2LCA3NywgNzcsIDc3LCA3OCwgCi0JNzgsIDc4LCA3OCwgNzksIDc5LCA3OSwgODAsIDgwLCA4MCwgODEsIDgxLCA4MSwgCi0JODEsIDgyLCA4MiwgODIsIDgzLCA4MywgODMsIDg0LCA4NCwgODQsIDg0LCA4NSwgCi0JODUsIDg1LCA4NiwgODYsIDg2LCA4NywgODcsIDg3LCA4NywgODgsIDg4LCA4OCwgCi0JODksIDg5LCA4OSwgOTAsIDkwLCA5MCwgOTEsIDkxLCA5MSwgOTEsIDkyLCA5MiwgCi0JOTIsIDkzLCA5MywgOTMsIDk0LCA5NCwgOTQsIDk0LCA5NSwgOTUsIDk1LCA5NiwgCi0JOTYsIDk2LCA5NywgOTcsIDk3LCA5NywgOTgsIDk4LCA5OCwgOTksIDk5LCA5OSwgCi0JMTAwLCAxMDAsIDEwMCwgMTAwLCAxMDEsIDEwMSwgMTAxLCAxMDIsIDEwMiwgMTAyLCAxMDMsIDEwMywgCi0JMTAzLCAxMDMsIDEwNCwgMTA0LCAxMDQsIDEwNSwgMTA1LCAxMDUsIDEwNiwgMTA2LCAxMDYsIDEwNiwgCi0JMTA3LCAxMDcsIDEwNywgMTA4LCAxMDgsIDEwOCwgMTA5LCAxMDksIDEwOSwgMTA5LCAxMTAsIDExMCwgCi0JMTEwLCAxMTEsIDExMSwgMTExLCAxMTIsIDExMiwgMTEyLCAxMTIsIDExMywgMTEzLCAxMTMsIDExNCwgCi0JMTE0LCAxMTQsIDExNSwgMTE1LCAxMTUsIDExNSwgMTE2LCAxMTYsIDExNiwgMTE3LCAxMTcsIDExNywgCi0JMTE4LCAxMTgsIDExOCwgMTE5LCAxMTksIDExOSwgMTE5LCAxMjAsIDEyMCwgMTIwLCAxMjEsIDEyMSwgCi0JMTIxLCAxMjIsIDEyMiwgMTIyLCAxMjIsIDEyMywgMTIzLCAxMjMsIDEyNCwgMTI0LCAxMjQsIDEyNSwgCi0JMTI1LCAxMjUsIDEyNSwgMTI2LCAxMjYsIDEyNiwgMTI3LCAxMjcsIDEyNywgMTI4LCAxMjgsIDEyOCwgCi0JMTI4LCAxMjksIDEyOSwgMTI5LCAxMzAsIDEzMCwgMTMwLCAxMzEsIDEzMSwgMTMxLCAxMzEsIDEzMiwgCi0JMTMyLCAxMzIsIDEzMywgMTMzLCAxMzMsIDEzNCwgMTM0LCAxMzQsIDEzNCwgMTM1LCAxMzUsIDEzNSwgCi0JMTM2LCAxMzYsIDEzNiwgMTM3LCAxMzcsIDEzNywgMTM3LCAxMzgsIDEzOCwgMTM4LCAxMzksIDEzOSwgCi0JMTM5LCAxNDAsIDE0MCwgMTQwLCAxNDAsIDE0MSwgMTQxLCAxNDEsIDE0MiwgMTQyLCAxNDIsIDE0MywgCi0JMTQzLCAxNDMsIDE0MywgMTQ0LCAxNDQsIDE0NCwgMTQ1LCAxNDUsIDE0NSwgMTQ2LCAxNDYsIDE0NiwgCi0JMTQ2LCAxNDcsIDE0NywgMTQ3LCAxNDgsIDE0OCwgMTQ4LCAxNDksIDE0OSwgMTQ5LCAxNTAsIDE1MCwgCi0JMTUwLCAxNTAsIDE1MSwgMTUxLCAxNTEsIDE1MiwgMTUyLCAxNTIsIDE1MywgMTUzLCAxNTMsIDE1MywgCi0JMTU0LCAxNTQsIDE1NCwgMTU1LCAxNTUsIDE1NSwgMTU2LCAxNTYsIDE1NiwgMTU2LCAxNTcsIDE1NywgCi0JMTU3LCAxNTgsIDE1OCwgMTU4LCAxNTksIDE1OSwgMTU5LCAxNTksIDE2MCwgMTYwLCAxNjAsIDE2MSwgCi0JMTYxLCAxNjEsIDE2MiwgMTYyLCAxNjIsIDE2MiwgMTYzLCAxNjMsIDE2MywgMTY0LCAxNjQsIDE2NCwgCi0JMTY1LCAxNjUsIDE2NSwgMTY1LCAxNjYsIDE2NiwgMTY2LCAxNjcsIDE2NywgMTY3LCAxNjgsIDE2OCwgCi0JMTY4LCAxNjgsIDE2OSwgMTY5LCAxNjksIDE3MCwgMTcwLCAxNzAsIDE3MSwgMTcxLCAxNzEsIDE3MSwgCi0JMTcyLCAxNzIsIDE3MiwgMTczLCAxNzMsIDE3MywgMTc0LCAxNzQsIDE3NCwgMTc0LCAxNzUsIDE3NSwgCi0JMTc1LCAxNzYsIDE3NiwgMTc2LCAxNzcsIDE3NywgMTc3LCAxNzgsIDE3OCwgMTc4LCAxNzgsIDE3OSwgCi0JMTc5LCAxNzksIDE4MCwgMTgwLCAxODAsIDE4MSwgMTgxLCAxODEsIDE4MSwgMTgyLCAxODIsIDE4MiwgCi0JMTgzLCAxODMsIDE4MywgMTg0LCAxODQsIDE4NCwgMTg0LCAxODUsIDE4NSwgMTg1LCAxODYsIDE4NiwgCi0JMTg2LCAxODcsIDE4NywgMTg3LCAxODcsIDE4OCwgMTg4LCAxODgsIDE4OSwgMTg5LCAxODksIDE5MCwgCi0JMTkwLCAxOTAsIDE5MCwgMTkxLCAxOTEsIDE5MSwgMTkyLCAxOTIsIDE5MiwgMTkzLCAxOTMsIDE5MywgCi0JMTkzLCAxOTQsIDE5NCwgMTk0LCAxOTUsIDE5NSwgMTk1LCAxOTYsIDE5NiwgMTk2LCAxOTYsIDE5NywgCi0JMTk3LCAxOTcsIDE5OCwgMTk4LCAxOTgsIDE5OSwgMTk5LCAxOTksIDE5OSwgMjAwLCAyMDAsIDIwMCwgCi0JMjAxLCAyMDEsIDIwMSwgMjAyLCAyMDIsIDIwMiwgMjAyLCAyMDMsIDIwMywgMjAzLCAyMDQsIDIwNCwgCi0JMjA0LCAyMDUsIDIwNSwgMjA1LCAyMDYsIDIwNiwgMjA2LCAyMDYsIDIwNywgMjA3LCAyMDcsIDIwOCwgCi0JMjA4LCAyMDgsIDIwOSwgMjA5LCAyMDksIDIwOSwgMjEwLCAyMTAsIDIxMCwgMjExLCAyMTEsIDIxMSwgCi0JMjEyLCAyMTIsIDIxMiwgMjEyLCAyMTMsIDIxMywgMjEzLCAyMTQsIDIxNCwgMjE0LCAyMTUsIDIxNSwgCi0JMjE1LCAyMTUsIDIxNiwgMjE2LCAyMTYsIDIxNywgMjE3LCAyMTcsIDIxOCwgMjE4LCAyMTgsIDIxOCwgCi0JMjE5LCAyMTksIDIxOSwgMjIwLCAyMjAsIDIyMCwgMjIxLCAyMjEsIDIyMSwgMjIxLCAyMjIsIDIyMiwgCi0JMjIyLCAyMjMsIDIyMywgMjIzLCAyMjQsIDIyNCwgMjI0LCAyMjQsIDIyNSwgMjI1LCAyMjUsIDIyNiwgCi0JMjI2LCAyMjYsIDIyNywgMjI3LCAyMjcsIDIyNywgMjI4LCAyMjgsIDIyOCwgMjI5LCAyMjksIDIyOSwgCi0JMjMwLCAyMzAsIDIzMCwgMjMwLCAyMzEsIDIzMSwgMjMxLCAyMzIsIDIzMiwgMjMyLCAyMzMsIDIzMywgCi0JMjMzLCAyMzMsIDIzNCwgMjM0LCAyMzQsIDIzNSwgMjM1LCAyMzUsIDIzNiwgMjM2LCAyMzYsIDIzNywgCi0JMjM3LCAyMzcsIDIzNywgMjM4LCAyMzgsIDIzOCwgMjM5LCAyMzksIDIzOSwgMjQwLCAyNDAsIDI0MCwgCi0JMjQwLCAyNDEsIDI0MSwgMjQxLCAyNDIsIDI0MiwgMjQyLCAyNDMsIDI0MywgMjQzLCAyNDMsIDI0NCwgCi0JMjQ0LCAyNDQsIDI0NSwgMjQ1LCAyNDUsIDI0NiwgMjQ2LCAyNDYsIDI0NiwgMjQ3LCAyNDcsIDI0NywgCi0JMjQ4LCAyNDgsIDI0OCwgMjQ5LCAyNDksIDI0OSwgMjQ5LCAyNTAsIDI1MCwgMjUwLCAyNTEsIDI1MSwgCi0JMjUxLCAyNTIsIDI1MiwgMjUyLCAyNTIsIDI1MywgMjUzLCAyNTMsIDI1NCwgMjU0LCAyNTQsIDI1NSwgCi0JMjU1LCAyNTUsIDI1NSwgMjU2LCAyNTYsIDI1NiwgMjU3LCAyNTcsIDI1NywgMjU4LCAyNTgsIDI1OCwgCi0JMjU4LCAyNTksIDI1OSwgMjU5LCAyNjAsIDI2MCwgMjYwLCAyNjEsIDI2MSwgMjYxLCAyNjEsIDI2MiwgCi0JMjYyLCAyNjIsIDI2MywgMjYzLCAyNjMsIDI2NCwgMjY0LCAyNjQsIDI2NSwgMjY1LCAyNjUsIDI2NSwgCi0JMjY2LCAyNjYsIDI2NiwgMjY3LCAyNjcsIDI2NywgMjY4LCAyNjgsIDI2OCwgMjY4LCAyNjksIDI2OSwgCi0JMjY5LCAyNzAsIDI3MCwgMjcwLCAyNzEsIDI3MSwgMjcxLCAyNzEsIDI3MiwgMjcyLCAyNzIsIDI3MywgCi0JMjczLCAyNzMsIDI3NCwgMjc0LCAyNzQsIDI3NCwgMjc1LCAyNzUsIDI3NSwgMjc2LCAyNzYsIDI3NiwgCi0JMjc3LCAyNzcsIDI3NywgMjc3LCAyNzgsIDI3OCwgMjc4LCAyNzksIDI3OSwgMjc5LCAyODAsIDI4MCwgCi0JMjgwLCAyODAsIDI4MSwgMjgxLCAyODEsIDI4MiwgMjgyLCAyODIsIDI4MywgMjgzLCAyODMsIDI4MywgCi0JMjg0LCAyODQsIDI4NCwgMjg1LCAyODUsIDI4NSwgMjg2LCAyODYsIDI4NiwgMjg2LCAyODcsIDI4NywgCi0JMjg3LCAyODgsIDI4OCwgMjg4LCAyODksIDI4OSwgMjg5LCAyODksIDI5MCwgMjkwLCAyOTAsIDI5MSwgCi0JMjkxLCAyOTEsIDI5MiwgMjkyLCAyOTIsIDI5MiwgMjkzLCAyOTMsIAotfTsKLQotc3RhdGljIGNvbnN0IGd1bmljaGFyMiBGb3JtYXR0ZXJfRGlnaXRMb3dlclRhYmxlIFtdID0gewotCScwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJwotfTsKLQotc3RhdGljIGNvbnN0IGd1bmljaGFyMiBGb3JtYXR0ZXJfRGlnaXRVcHBlclRhYmxlIFtdID0gewotCScwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJwotfTsKLQotc3RhdGljIGdpbnQ2NCBGb3JtYXR0ZXJfVGVuUG93ZXJzTGlzdCBbXSA9IHsKLQkxTEwsCi0JMTBMTCwKLQkxMDBMTCwKLQkxMDAwTEwsCi0JMTAwMDBMTCwKLQkxMDAwMDBMTCwKLQkxMDAwMDAwTEwsCi0JMTAwMDAwMDBMTCwKLQkxMDAwMDAwMDBMTCwKLQkxMDAwMDAwMDAwTEwsCi0JMTAwMDAwMDAwMDBMTCwKLQkxMDAwMDAwMDAwMDBMTCwKLQkxMDAwMDAwMDAwMDAwTEwsCi0JMTAwMDAwMDAwMDAwMDBMTCwKLQkxMDAwMDAwMDAwMDAwMDBMTCwKLQkxMDAwMDAwMDAwMDAwMDAwTEwsCi0JMTAwMDAwMDAwMDAwMDAwMDBMTCwKLQkxMDAwMDAwMDAwMDAwMDAwMDBMTCwKLQkxMDAwMDAwMDAwMDAwMDAwMDAwTEwsCi19OwotCi0vLyBEZWNIZXhEaWdpdHMgcyBhIHRyYW5zbGF0aW9uIHRhYmxlIGZyb20gYSBkZWNpbWFsIG51bWJlciB0byBpdHMKLS8vIGRpZ2l0cyBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbiAoZS5nLiBEZWNIZXhEaWdpdHMgWzM0XSA9IDB4MzQpLgotc3RhdGljIGdpbnQzMiBGb3JtYXR0ZXJfRGVjSGV4RGlnaXRzIFtdID0gewotCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIAotCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksIAotCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIAotCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksIAotCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksIAotCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsIDB4NTksIAotCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjgsIDB4NjksIAotCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsIDB4NzksIAotCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIDB4ODgsIDB4ODksIAotCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIDB4OTgsIDB4OTksCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9OMy9QTmV0TGliL0xJQ0VOU0UuVFhUIGIvdm1raXQvbGliL04zL1BOZXRMaWIvTElDRU5TRS5UWFQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZmUxYTkuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL04zL1BOZXRMaWIvTElDRU5TRS5UWFQKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVk1LaXQgUE5ldExpYiBydW50aW1lCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQWxsIGZpbGVzIGFyZSBsaWNlbnNlZCB1bmRlciB0aGUgVk1LaXQgbGljZW5zZSB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25zOgotCi12bWtpdC9saWIvTjMvUE5ldExpYi9QTmV0TGliLmNwcAotICAgICAgCi0gICAgICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMgIFNvdXRoZXJuIFN0b3JtIFNvZnR3YXJlLCBQdHkgTHRkLgotCi0gICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9OMy9QTmV0TGliL01ha2VmaWxlIGIvdm1raXQvbGliL04zL1BOZXRMaWIvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OWY2N2IuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL04zL1BOZXRMaWIvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIz09PS0gbGliL04zL1BOZXRMaWIvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIwotIyAKLSMgICAgICAgICAgICAgICAgICAgICBUaGUgdm1raXQgcHJvamVjdAotIwotIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLSMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotIyAKLSMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCi1MRVZFTCA9IC4uLy4uLy4uCi0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29uZmlnCi0KLWlmZXEgKCQoV0lUSF9MTFZNX0dDQyksIDEpCi0gIE1PRFVMRV9OQU1FID0gUE5ldExpYgotZWxzZQotICBMSUJSQVJZTkFNRSA9IFBOZXRMaWIKLWVuZGlmCi0KLUVYVFJBX0RJU1QgPSBQTmV0UGF0aC5pbmMuaW4KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCi1DWFguRmxhZ3MgKz0gLUkkKFBST0pfU1JDX0RJUikvLi4vVk1Db3JlCmRpZmYgLS1naXQgYS92bWtpdC9saWIvTjMvUE5ldExpYi9QTmV0TGliLmNwcCBiL3Zta2l0L2xpYi9OMy9QTmV0TGliL1BOZXRMaWIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGNjZjA3Li4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9OMy9QTmV0TGliL1BOZXRMaWIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTEyMyArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLS0tLSBQTmV0TGliLmNwcCAtIFBOZXRMaWIgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjMKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2Ugd2l0aCB0aGUgZm9sbG93aW5nIGFkZGl0aW9uczoKLS8vCi0vLyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMgIFNvdXRoZXJuIFN0b3JtIFNvZnR3YXJlLCBQdHkgTHRkLgotLy8KLS8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLS8vIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0vLwotLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLS8vCi0vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLS8vCi0vLyBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgPG1hdGguaD4KLQotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgIm12bS9KSVQuaCIKLQotI2luY2x1ZGUgIkFzc2VtYmx5LmgiCi0jaW5jbHVkZSAiQ0xJQWNjZXNzLmgiCi0jaW5jbHVkZSAiQ0xJSml0LmgiCi0jaW5jbHVkZSAiUE5ldFN0cmluZy5oIgotI2luY2x1ZGUgIk5hdGl2ZVV0aWwuaCIKLSNpbmNsdWRlICJNU0NvcmxpYi5oIgotI2luY2x1ZGUgIk4zLmgiCi0jaW5jbHVkZSAiUE5ldExpYi5oIgotI2luY2x1ZGUgIlJlYWRlci5oIgotI2luY2x1ZGUgIlZNQXJyYXkuaCIKLSNpbmNsdWRlICJWTUNsYXNzLmgiCi0jaW5jbHVkZSAiVk1PYmplY3QuaCIKLSNpbmNsdWRlICJWTVRocmVhZC5oIgotI2luY2x1ZGUgIkNMSVN0cmluZy5oIgotCi0jaW5jbHVkZSAiUE5ldFBhdGguaW5jIgotCi0jaW5jbHVkZSAibGx2bS9MTFZNQ29udGV4dC5oIgotCi11c2luZyBuYW1lc3BhY2UgbjM7Ci0KLSNkZWZpbmUgSUxfQ09OU09MRV9OT1JNQUwgMAotCi0KLSNkZWZpbmUgTUVNQkVSX1RZUEVTX0NPTlNUUlVDVE9SIDB4MQotI2RlZmluZSBNRU1CRVJfVFlQRVNfRVZFTlQgMHgyCi0jZGVmaW5lIE1FTUJFUl9UWVBFU19GSUVMRCAweDQKLSNkZWZpbmUgTUVNQkVSX1RZUEVTX01FVEhPRCAweDgKLSNkZWZpbmUgTUVNQkVSX1RZUEVTX1BST1BFUlRZIDB4MTAKLSNkZWZpbmUgTUVNQkVSX1RZUEVTX1RZUEVJTkZPIDB4MjAKLSNkZWZpbmUgTUVNQkVSX1RZUEVTX0NVU1RPTSAweDQwCi0jZGVmaW5lIE1FTUJFUl9UWVBFU19ORVNURURUWVBFIDB4ODAKLSNkZWZpbmUgTUVNQkVSX1RZUEVTX0FMTCAweEJGCi0KLSNkZWZpbmUgTUVUSE9EX1NFTUFOVElDX0FUVFJJQlVURVNfU0VUVEVSICAgMHgxCi0jZGVmaW5lIE1FVEhPRF9TRU1BTlRJQ19BVFRSSUJVVEVTX0dFVFRFUiAgIDB4MgotI2RlZmluZSBNRVRIT0RfU0VNQU5USUNfQVRUUklCVVRFU19PVEhFUiAgICAweDQKLSNkZWZpbmUgTUVUSE9EX1NFTUFOVElDX0FUVFJJQlVURVNfQURET04gICAgMHg4Ci0jZGVmaW5lIE1FVEhPRF9TRU1BTlRJQ19BVFRSSUJVVEVTX1JFTU9WRU9OIDB4MTAKLSNkZWZpbmUgTUVUSE9EX1NFTUFOVElDX0FUVFJJQlVURVNfRklSRSAgICAgMHgyMAotCi0KLWV4dGVybiAiQyIgewotZXh0ZXJuIHVpbnQzMiBJTEdldENvZGVQYWdlKHZvaWQpOwotZXh0ZXJuIHVpbnQzMiBJTEdldEN1bHR1cmVJRCh2b2lkKTsKLWV4dGVybiBjaGFyKiBJTEdldEN1bHR1cmVOYW1lKHZvaWQpOwotZXh0ZXJuIHNpbnQzMiBJTEFuc2lHZXRNYXhCeXRlQ291bnQoc2ludDMyKTsKLWV4dGVybiBzaW50MzIgIElMQ29uc29sZVdyaXRlQ2hhcihzaW50MzIpOwotZXh0ZXJuIHVpbnQzMiBJTENvbnNvbGVHZXRNb2RlKHZvaWQpOwotZXh0ZXJuIHNpbnQzMiBJTEFuc2lHZXRCeXRlcyh1aW50MTYqLCBzaW50MzIsIHVpbnQ4Kiwgc2ludDMyKTsKLWV4dGVybiB2b2lkIF9JTF9TdGRpb19TdGRGbHVzaCh2b2lkKiwgc2ludDMyKTsKLWV4dGVybiBjaGFyIElMR2V0VW5pY29kZUNhdGVnb3J5KHNpbnQzMik7Ci1leHRlcm4gc2ludDY0IF9JTF9UaW1lTWV0aG9kc19HZXRDdXJyZW50VGltZSh2b2lkKik7Ci1leHRlcm4gdWludDMyIElMVW5pY29kZVN0cmluZ1RvTG93ZXIodm9pZCosIHZvaWQqLCB1aW50MzIpOwotZXh0ZXJuIHNpbnQzMiBJTFVuaWNvZGVTdHJpbmdDb21wYXJlSWdub3JlQ2FzZSh2b2lkKiwgdm9pZCosIHNpbnQzMik7Ci1leHRlcm4gc2ludDMyIElMVW5pY29kZVN0cmluZ0NvbXBhcmVOb0lnbm9yZUNhc2Uodm9pZCosIHZvaWQqLCBzaW50MzIpOwotCi0jaW5jbHVkZSAibXZtL0NvbmZpZy9jb25maWcuaCIKLS8vIFBORVQgd2FudHMgdGhpcwotdm9pZCAqR0NfcnVuX3RocmVhZCh2b2lkICooKnRocmVhZF9mdW5jKSh2b2lkICopLCB2b2lkICphcmcpeyByZXR1cm4gMDsgfQotI2lmIG5vdChVU0VfR0NfQk9FSE0pCi1pbnQgR0NfaW52b2tlX2ZpbmFsaXplcnMgKHZvaWQpIHsgcmV0dXJuIDA7IH0KLWludCBHQ19zaG91bGRfaW52b2tlX2ZpbmFsaXplcnMgKHZvaWQpIHsgcmV0dXJuIDA7IH0KLXZvaWQgR0NfcmVnaXN0ZXJfZmluYWxpemVyX25vX29yZGVyKHZvaWQqLCB2b2lkICgqKSh2b2lkKiwgdm9pZCopLCB2b2lkKiwgdm9pZCAoKiopKHZvaWQqLCB2b2lkKiksIHZvaWQqKikgeyByZXR1cm47IH0KLXZvaWQgR0NfZ2NvbGxlY3Qodm9pZCkge30KLXZvaWQqIEdDX21hbGxvY191bmNvbGxlY3RhYmxlKHNpemVfdCkgeyByZXR1cm4gMDsgfQotdm9pZCBHQ19leGNsdWRlX3N0YXRpY19yb290cyh2b2lkKiwgdm9pZCopIHt9Ci12b2lkIEdDX2ZyZWUodm9pZCopIHt9Ci12b2lkIEdDX21hbGxvY19leHBsaWNpdGx5X3R5cGVkKHZvaWQpIHt9Ci1zaXplX3QgR0NfZ2V0X2hlYXBfc2l6ZSh2b2lkKSB7cmV0dXJuIDA7fQotaW50IEdDX3JlZ2lzdGVyX2Rpc2FwcGVhcmluZ19saW5rKHZvaWQqKikgeyByZXR1cm4gMDsgfQotaW50IEdDX2dlbmVyYWxfcmVnaXN0ZXJfZGlzYXBwZWFyaW5nX2xpbmsodm9pZCoqLCB2b2lkKikgeyByZXR1cm4gMDsgfQotaW50IEdDX3B0aHJlYWRfc2lnbWFzayhpbnQsIGNvbnN0IHNpZ3NldF90Kiwgc2lnc2V0X3QqKSB7IHJldHVybiAwOyB9Ci1pbnQgR0NfcHRocmVhZF9kZXRhY2gocHRocmVhZF90KSB7IHJldHVybiAwOyB9Ci1pbnQgR0NfcHRocmVhZF9jcmVhdGUocHRocmVhZF90KiwgY29uc3QgcHRocmVhZF9hdHRyX3QqLCB2b2lkKiAoKikodm9pZCopLCB2b2lkKikgeyByZXR1cm4gMDsgfQotdm9pZCogR0NfbWFsbG9jKHNpemVfdCkgeyByZXR1cm4gMDsgfQotdm9pZCBHQ19tYWtlX2Rlc2NyaXB0b3Iodm9pZCkge30KLWludCBHQ191bnJlZ2lzdGVyX2Rpc2FwcGVhcmluZ19saW5rKHZvaWQqKikgeyByZXR1cm4gMDsgfQotdm9pZCAoKkdDX2ZpbmFsaXplcl9ub3RpZmllcikodm9pZCk7Ci1pbnQgR0NfamF2YV9maW5hbGl6YXRpb247Ci1pbnQgR0NfZmluYWxpemVfb25fZGVtYW5kOwotdm9pZCBHQ19zZXRfbWF4X2hlYXBfc2l6ZShzaXplX3QpIHt9Ci12b2lkKiBHQ19tYWxsb2NfYXRvbWljKHNpemVfdCkgeyByZXR1cm4gMDsgfQotI2VuZGlmCi0KLS8vIEZha2UgdGVybWNhcCBzeW1ib2xzCi12b2lkIHRpZ2V0c3RyKHZvaWQpIHsKLSAgYWJvcnQoKTsKLX0KLXZvaWQgdGdldHN0cih2b2lkKSB7Ci0gIGFib3J0KCk7Ci19Ci12b2lkIHNldHVwdGVybSh2b2lkKSB7Ci0gIGFib3J0KCk7Ci19Ci12b2lkIHRpZ2V0bnVtKHZvaWQpIHsKLSAgYWJvcnQoKTsKLX0KLXZvaWQgdGdldG51bSh2b2lkKSB7Ci0gIGFib3J0KCk7Ci19Ci12b2lkIHRpZ2V0ZmxhZyh2b2lkKSB7Ci0gIGFib3J0KCk7Ci19Ci12b2lkIHRwYXJtKHZvaWQpIHsKLSAgYWJvcnQoKTsKLX0KLXZvaWQgdGdldGVudCh2b2lkKSB7Ci0gIGFib3J0KCk7Ci19Ci12b2lkIHRwdXRzKHZvaWQpIHsKLSAgYWJvcnQoKTsKLX0KLXZvaWQgdGdvdG8odm9pZCkgewotICBhYm9ydCgpOwotfQotdm9pZCB0Z2V0ZmxhZyh2b2lkKSB7Ci0gIGFib3J0KCk7Ci19Ci19Ci0KLQotCi1leHRlcm4gIkMiIHVpbnQzMiBTeXN0ZW1fVGV4dF9EZWZhdWx0RW5jb2RpbmdfSW50ZXJuYWxDb2RlUGFnZSgpIHsKLSAgcmV0dXJuIElMR2V0Q29kZVBhZ2UoKTsKLX0KLQotZXh0ZXJuICJDIiB1aW50MzIgU3lzdGVtX0dsb2JhbGl6YXRpb25fQ3VsdHVyZUluZm9fSW50ZXJuYWxDdWx0dXJlSUQoKSB7Ci0gIHJldHVybiBJTEdldEN1bHR1cmVJRCgpOwotfQotCi1leHRlcm4gIkMiIFZNT2JqZWN0KiBTeXN0ZW1fR2xvYmFsaXphdGlvbl9DdWx0dXJlSW5mb19JbnRlcm5hbEN1bHR1cmVOYW1lKCkgewotICBjaGFyKiB2YWwgPSBJTEdldEN1bHR1cmVOYW1lKCk7Ci0gIE4zKiB2bSA9IChOMyopKFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKSk7Ci0JZGVjbGFyZV9nY3Jvb3QoQXJyYXlDaGFyKiwgYXJyYXkpID0gMDsKLQotICBpZiAodmFsKSB7Ci0gICAgYXJyYXkgPSB2bS0+YXNjaWl6VG9BcnJheSh2YWwpOwotICAgIGZyZWUodmFsKTsKLSAgfSBlbHNlIHsKLSAgICBhcnJheSA9IHZtLT5hc2NpaXpUb0FycmF5KCJpdiIpOwotICB9Ci0JZGVjbGFyZV9nY3Jvb3QoVk1PYmplY3QqLCByZXMpID0gdm0tPmFycmF5VG9TdHJpbmcoYXJyYXkpOwotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBjb25zdCBBcnJheUNoYXIqIG5ld0J1aWxkZXIoTjMqIHZtLCBQTmV0U3RyaW5nKiB2YWx1ZSwgdWludDMyIGxlbmd0aCkgewotCWxsdm1fZ2Nyb290KHZhbHVlLCAwKTsKLSAgdWludDMyIHZhbHVlTGVuZ3RoID0gdmFsdWUgPyB2YWx1ZS0+bGVuZ3RoIDogMDsKLSAgZGVjbGFyZV9nY3Jvb3QoY29uc3QgQXJyYXlDaGFyKiwgYXJyYXkpID0gdmFsdWUgPyB2YWx1ZS0+dmFsdWUgOiAwOwotICB1aW50MzIgcm91bmRMZW5ndGggPSAoNyArIGxlbmd0aCkgJiAweGZmZmZmZmY4OwotICB1aW50MTYqIGJ1ZiA9ICh1aW50MTYqKWFsbG9jYShyb3VuZExlbmd0aCAqIHNpemVvZih1aW50MTYpKTsKLSAgdWludDMyIHN0ckxlbmd0aCA9IDA7Ci0KLSAgaWYgKHZhbHVlICE9IDApIHsKLSAgICBpZiAodmFsdWVMZW5ndGggPD0gcm91bmRMZW5ndGgpIHsKLSAgICAgIG1lbWNweShidWYsIGFycmF5LT5lbGVtZW50cywgdmFsdWVMZW5ndGggKiBzaXplb2YodWludDE2KSk7Ci0gICAgICBzdHJMZW5ndGggPSB2YWx1ZUxlbmd0aDsKLSAgICB9IGVsc2UgewotICAgICAgbWVtY3B5KGJ1ZiwgYXJyYXktPmVsZW1lbnRzLCByb3VuZExlbmd0aCAqIHNpemVvZih1aW50MTYpKTsKLSAgICAgIHN0ckxlbmd0aCA9IHJvdW5kTGVuZ3RoOwotICAgIH0KLSAgfQotCi0JZGVjbGFyZV9nY3Jvb3QoQXJyYXlDaGFyKiwgYXJyYXlfcmVzKSA9IHZtLT5idWZUb0FycmF5KGJ1Ziwgc3RyTGVuZ3RoKTsKLSAgcmV0dXJuIGFycmF5X3JlczsKLX0KLQotZXh0ZXJuICJDIiBWTU9iamVjdCogU3lzdGVtX1N0cmluZ19OZXdCdWlsZGVyKFBOZXRTdHJpbmcqIHZhbHVlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIGxlbmd0aCkgewotCWxsdm1fZ2Nyb290KHZhbHVlLCAwKTsKLSAgTjMqIHZtID0gKE4zKikoVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpKTsKLSAgZGVjbGFyZV9nY3Jvb3QoUE5ldFN0cmluZyosIHN0cikgPSAoUE5ldFN0cmluZyopdm0tPmFycmF5VG9TdHJpbmcobmV3QnVpbGRlcih2bSwgdmFsdWUsIGxlbmd0aCkpOwotICByZXR1cm4gc3RyOwotfQotCi1leHRlcm4gIkMiIFZNT2JqZWN0KiBQbGF0Zm9ybV9TeXNDaGFySW5mb19HZXROZXdMaW5lKCkgewotICBOMyogdm0gPSAoTjMqKShWTVRocmVhZDo6Z2V0KCktPmdldFZNKCkpOwotCWRlY2xhcmVfZ2Nyb290KEFycmF5Q2hhciosIGFycmF5KSA9IHZtLT5hc2NpaXpUb0FycmF5KCJcbiIpOwotICBkZWNsYXJlX2djcm9vdChWTU9iamVjdCosIHJlcykgPSB2bS0+YXJyYXlUb1N0cmluZyhhcnJheSk7Ci0JcmV0dXJuIHJlczsKLX0KLQotZXh0ZXJuICJDIiB2b2lkIFN5c3RlbV9TdHJpbmdfQ29weVRvQ2hlY2tlZChQTmV0U3RyaW5nKiBzdHIsIHNpbnQzMiBzc3RhcnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUNoYXIqIGRlc3QsIHNpbnQzMiBkc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbnQzMiBjb3VudCkgewotCWxsdm1fZ2Nyb290KHN0ciwgMCk7Ci0JbGx2bV9nY3Jvb3QoZGVzdCwgMCk7Ci0gIGRlY2xhcmVfZ2Nyb290KGNvbnN0IEFycmF5Q2hhciosIHZhbHVlKSA9IHN0ci0+dmFsdWU7Ci0gIG1lbWNweSgmZGVzdC0+ZWxlbWVudHNbZHN0YXJ0XSwgJnZhbHVlLT5lbGVtZW50c1tzc3RhcnRdLCBjb3VudCA8PCAxKTsKLX0KLQotZXh0ZXJuICJDIiBzaW50MzIgU3lzdGVtX1RleHRfRGVmYXVsdEVuY29kaW5nX0ludGVybmFsR2V0TWF4Qnl0ZUNvdW50KHNpbnQzMiB2YWwpIHsKLSAgcmV0dXJuIElMQW5zaUdldE1heEJ5dGVDb3VudCh2YWwpOwotfQotCi1leHRlcm4gIkMiIHZvaWQgUGxhdGZvcm1fU3RkaW9fU3RkV3JpdGUoc2ludDMyIGZkLCBBcnJheVVJbnQ4KiB2YWx1ZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ludDMyIGluZGV4LCBzaW50MzIgY291bnQpIHsKLQlsbHZtX2djcm9vdCh2YWx1ZSwgMCk7Ci0gIGlmIChmZCA9PSAxKSB7Ci0gICAgaWYgKElMQ29uc29sZUdldE1vZGUoKSA9PSBJTF9DT05TT0xFX05PUk1BTCkgewotICAgICAgZndyaXRlKCZ2YWx1ZS0+ZWxlbWVudHNbaW5kZXhdLCAxLCBjb3VudCwgc3Rkb3V0KTsKLSAgICB9IGVsc2UgewotICAgICAgY2hhciogYnVmID0gKGNoYXIqKSgmdmFsdWUtPmVsZW1lbnRzW2luZGV4XSk7Ci0gICAgICB3aGlsZSAoY291bnQgPiAwKSB7Ci0gICAgICAgIElMQ29uc29sZVdyaXRlQ2hhcigqYnVmKTsKLSAgICAgICAgKytidWY7Ci0gICAgICAgIC0tY291bnQ7Ci0gICAgICB9Ci0gICAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgZndyaXRlKCZ2YWx1ZS0+ZWxlbWVudHNbaW5kZXhdLCAxLCBjb3VudCwgc3RkZXJyKTsKLSAgfQotfQotCi1leHRlcm4gIkMiIHNpbnQzMiBTeXN0ZW1fVGV4dF9EZWZhdWx0RW5jb2RpbmdfSW50ZXJuYWxHZXRCeXRlcyhBcnJheUNoYXIqIGNoYXJzLAotICAgICAgICAgICAgc2ludDMyIGNoYXJJbmRleCwgc2ludDMyIGNoYXJDb3VudCwgQXJyYXlVSW50OCogYnl0ZXMsIHNpbnQzMiBieXRlSW5kZXgpIHsKLSAgbGx2bV9nY3Jvb3QoY2hhcnMsIDApOwotCWxsdm1fZ2Nyb290KGJ5dGVzLCAwKTsKLSAgcmV0dXJuIElMQW5zaUdldEJ5dGVzKCZjaGFycy0+ZWxlbWVudHNbY2hhckluZGV4XSwgY2hhckNvdW50LCAmYnl0ZXMtPmVsZW1lbnRzW2J5dGVJbmRleF0sIGJ5dGVzLT5zaXplIC0gYnl0ZUluZGV4KTsKLX0KLQotZXh0ZXJuICJDIiB2b2lkIFBsYXRmb3JtX1N0ZGlvX1N0ZEZsdXNoKHNpbnQzMiBmZCkgewotICBfSUxfU3RkaW9fU3RkRmx1c2goMCwgZmQpOwotfQotCi1leHRlcm4gIkMiIFZNT2JqZWN0KiBTeXN0ZW1fUmVmbGVjdGlvbl9DbHJUeXBlX0dldEVsZW1lbnRUeXBlKFZNT2JqZWN0KiBLbGFzcykgewotCWxsdm1fZ2Nyb290KEtsYXNzLCAwKTsKLSAgVk1Db21tb25DbGFzcyogY2wgPSAoVk1Db21tb25DbGFzcyopTVNDb3JsaWI6OnR5cGVDbHJUeXBlLT5nZXRJbnRQdHIoS2xhc3MpOwotICBpZiAoIWNsLT5pc0FycmF5KSB7Ci0gICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0gZWxzZSB7Ci0JCWRlY2xhcmVfZ2Nyb290KFZNT2JqZWN0ICosIGRlbGVnYXRlZSkgPSAoKFZNQ2xhc3NBcnJheSopY2wpLT5iYXNlQ2xhc3MtPmdldENsYXNzRGVsZWdhdGVlKCk7Ci0gICAgcmV0dXJuIGRlbGVnYXRlZTsKLSAgfQotfQotCi1leHRlcm4gIkMiIFBOZXRTdHJpbmcqIFN5c3RlbV9TdHJpbmdfTmV3U3RyaW5nKHVpbnQzMiBzaXplKSB7Ci0gIGRlY2xhcmVfZ2Nyb290KFBOZXRTdHJpbmcqLCBzdHIpID0gKFBOZXRTdHJpbmcqKU1TQ29ybGliOjpwU3RyaW5nLT5kb05ldygpOwotICBzdHItPmxlbmd0aCA9IHNpemU7Ci0gIHJldHVybiBzdHI7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBTeXN0ZW1fU3RyaW5nX0NvcHlfMyhQTmV0U3RyaW5nKiBkZXN0LCBzaW50MzIgcG9zLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTmV0U3RyaW5nKiBzcmMpIHsKLQlsbHZtX2djcm9vdChkZXN0LCAwKTsKLQlsbHZtX2djcm9vdChzcmMsIDApOwotICBkZWNsYXJlX2djcm9vdChBcnJheUNoYXIqLCBhcnIpID0gKEFycmF5Q2hhciopTVNDb3JsaWI6OmFycmF5Q2hhci0+ZG9OZXcocG9zICsgc3JjLT52YWx1ZS0+c2l6ZSk7Ci0gIAotICBmb3IgKHNpbnQzMiBpID0gMDsgaSA8IHBvczsgKytpKSB7Ci0gICAgYXJyLT5lbGVtZW50c1tpXSA9IGRlc3QtPnZhbHVlLT5lbGVtZW50c1tpXTsKLSAgfQotCQotICBmb3IgKHNpbnQzMiBpID0gMDsgaSA8IHNyYy0+bGVuZ3RoOyArK2kpIHsKLSAgICBhcnItPmVsZW1lbnRzW3BvcyArIGldID0gc3JjLT52YWx1ZS0+ZWxlbWVudHNbaV07Ci0gIH0KLQotICBkZXN0LT52YWx1ZSA9IGFycjsKLSAgZGVzdC0+bGVuZ3RoID0gZGVzdC0+dmFsdWUtPnNpemU7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBTeXN0ZW1fU3RyaW5nX0NvcHlfNShQTmV0U3RyaW5nKiBkZXN0LCBzaW50MzIgZGVzdFBvcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5ldFN0cmluZyogc3JjLCBzaW50MzIgc3JjUG9zLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW50MzIgbGVuZ3RoKSB7Ci0JbGx2bV9nY3Jvb3QoZGVzdCwgMCk7Ci0JbGx2bV9nY3Jvb3Qoc3JjLCAwKTsKLQlkZWNsYXJlX2djcm9vdChjb25zdCBBcnJheUNoYXIqLCBhcnJheVNyYykgPSBzcmMtPnZhbHVlOwotCi0JLy8JcHJpbnRmKCJDb3B5ICVwICVwICVkICVkICVkICglcCAlZClcbiIsICh2b2lkICopZGVzdCwgKHZvaWQgKilzcmMsIGRlc3RQb3MsIHNyY1BvcywgbGVuZ3RoLCAodm9pZCAqKWRlc3QtPnZhbHVlLCBkZXN0LT5sZW5ndGgpOwotCi0JaWYoZGVzdFBvcyA9PSAwICYmIHNyY1BvcyA9PSAwICYmIGxlbmd0aCA9PSBzcmMtPmxlbmd0aCkgewotCQlkZXN0LT52YWx1ZSA9IGFycmF5U3JjOwotCQlkZXN0LT5sZW5ndGggPSBsZW5ndGg7Ci0JfSBlbHNlIHsKLQkJc2ludDMyIHRvcCAgICAgICA9IGRlc3RQb3MgKyBsZW5ndGg7Ci0JCXVpbnQxNiAqYnVmICAgICAgPSAodWludDE2KilhbGxvY2EoKHRvcCA8IGRlc3QtPmxlbmd0aCA/IGRlc3QtPmxlbmd0aCA6IHRvcCkgKiBzaXplb2YodWludDE2KSk7Ci0KLQkJaWYoZGVzdFBvcykKLQkJCW1lbWNweShidWYsIGRlc3QtPnZhbHVlLT5lbGVtZW50cywgZGVzdFBvcyAqIHNpemVvZih1aW50MTYpKTsKLQotCQltZW1jcHkoYnVmICsgZGVzdFBvcywgc3JjLT52YWx1ZS0+ZWxlbWVudHMgKyBzcmNQb3MsIGxlbmd0aCAqIHNpemVvZih1aW50MTYpKTsKLQotCQlpZih0b3AgPD0gZGVzdC0+bGVuZ3RoKQotCQkJbWVtY3B5KGJ1ZiArIHRvcCwgZGVzdC0+dmFsdWUtPmVsZW1lbnRzICsgdG9wLCAoZGVzdC0+bGVuZ3RoIC0gdG9wKSAqIHNpemVvZih1aW50MTYpKTsKLQkJZWxzZQotCQkJZGVzdC0+bGVuZ3RoID0gdG9wOwotCi0JCWRlY2xhcmVfZ2Nyb290KEFycmF5Q2hhciosIGFycmF5KSA9IFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+YnVmVG9BcnJheShidWYsIGRlc3QtPmxlbmd0aCk7Ci0JCWRlc3QtPnZhbHVlICA9IGFycmF5OwotCX0KLQkvLwkJcHJpbnRmKCItLS0+ICVzXG4iLCBtdm06OlByaW50QnVmZmVyKFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+YXJyYXlUb1VURjgoZGVzdC0+dmFsdWUpKS5jU3RyaW5nKCkpOwotfQotCi1leHRlcm4gIkMiIHZvaWQgU3lzdGVtX1RocmVhZGluZ19Nb25pdG9yX0VudGVyKFZNT2JqZWN0KiBvYmopIHsKLQlsbHZtX2djcm9vdChvYmosIDApOwotCS8vCW9iai0+YXF1aXJlKCk7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBTeXN0ZW1fVGhyZWFkaW5nX01vbml0b3JfRXhpdChWTU9iamVjdCogb2JqKSB7Ci0JbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLQkvLwlvYmotPnVubG9jaygpOwotfQotCi0KLWV4dGVybiAiQyIgYm9vbCBTeXN0ZW1fU3RyaW5nX0VxdWFscyhQTmV0U3RyaW5nKiBzdHIxLCBQTmV0U3RyaW5nKiBzdHIyKSB7Ci0JbGx2bV9nY3Jvb3Qoc3RyMSwgMCk7Ci0JbGx2bV9nY3Jvb3Qoc3RyMiwgMCk7Ci0JZGVjbGFyZV9nY3Jvb3QoY29uc3QgQXJyYXlDaGFyKiwgYTEpID0gc3RyMS0+dmFsdWU7Ci0JZGVjbGFyZV9nY3Jvb3QoY29uc3QgQXJyYXlDaGFyKiwgYTIpID0gc3RyMi0+dmFsdWU7Ci0gIHJldHVybiBhMSA9PSBhMjsKLX0KLQotZXh0ZXJuICJDIiBzaW50MzIgUGxhdGZvcm1fU3lzQ2hhckluZm9fR2V0VW5pY29kZUNhdGVnb3J5KGNoYXIgYykgewotICByZXR1cm4gSUxHZXRVbmljb2RlQ2F0ZWdvcnkoYyk7Ci19Ci0KLWV4dGVybiAiQyIgdWludDE2IFN5c3RlbV9TdHJpbmdfR2V0Q2hhcihQTmV0U3RyaW5nKiBzdHIsIHNpbnQzMiBpbmRleCkgewotCWxsdm1fZ2Nyb290KHN0ciwgMCk7Ci0gIHJldHVybiBzdHItPnZhbHVlLT5lbGVtZW50c1tpbmRleF07Ci19Ci0KLWV4dGVybiAiQyIgc2ludDMyIFN5c3RlbV9TdHJpbmdfSW5kZXhPZihQTmV0U3RyaW5nKiBzdHIsIHVpbnQxNiB2YWx1ZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ludDMyIHN0YXJ0SW5kZXgsIHNpbnQzMiBjb3VudCkgewotCWxsdm1fZ2Nyb290KHN0ciwgMCk7Ci0gIGlmIChzdGFydEluZGV4IDwgMCkgewotICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoInNob3VkIHRocm93IGFyZyByYW5nZSIpOwotICB9Ci0KLSAgaWYgKChjb3VudCA8IDApIHx8IChzdHItPmxlbmd0aCAtIHN0YXJ0SW5kZXggPCBjb3VudCkpIHsKLSAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJzaG91ZCB0aHJvdyBhcmcgcmFuZ2UiKTsKLSAgfQotCi0gIHNpbnQzMiBpID0gc3RhcnRJbmRleDsKLSAgZGVjbGFyZV9nY3Jvb3QoY29uc3QgQXJyYXlDaGFyKiwgYXJyYXkpID0gc3RyLT52YWx1ZTsKLSAgd2hpbGUgKGkgPCBzdGFydEluZGV4ICsgY291bnQpIHsKLSAgICBpZiAoYXJyYXktPmVsZW1lbnRzW2ldID09IHZhbHVlKSByZXR1cm4gaTsKLSAgICBlbHNlICsraTsKLSAgfQotCi0gIHJldHVybiAtMTsKLX0KLQotZXh0ZXJuICJDIiBzaW50MzIgU3lzdGVtX1N0cmluZ19HZXRIYXNoQ29kZShQTmV0U3RyaW5nKiBzdHIpIHsKLQlsbHZtX2djcm9vdChzdHIsIDApOwotICBzaW50MzIgaGFzaCA9IDA7Ci0gIGRlY2xhcmVfZ2Nyb290KGNvbnN0IEFycmF5Q2hhciosIGFycmF5KSA9IHN0ci0+dmFsdWU7Ci0gIGZvciAoc2ludDMyIGkgPSAwOyBpIDwgYXJyYXktPnNpemU7ICsraSkgewotICAgIGhhc2ggKz0gKChoYXNoIDw8IDUpICsgYXJyYXktPmVsZW1lbnRzW2ldKTsKLSAgfQotICByZXR1cm4gaGFzaDsKLX0KLQotZXh0ZXJuICJDIiBWTU9iamVjdCogU3lzdGVtX1RleHRfU3RyaW5nQnVpbGRlcl9JbnNlcnRfU3lzdGVtX1RleHRfU3RyaW5nQnVpbGRlcl9TeXN0ZW1fSW50MzJfU3lzdGVtX0NoYXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyKiBvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW50MzIgaW5kZXgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2IHZhbHVlKSB7Ci0JbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgTjMqIHZtID0gKE4zKikoVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpKTsKLSAgZGVjbGFyZV9nY3Jvb3QoUE5ldFN0cmluZyosIGJ1aWxkU3RyaW5nKSA9IG9iai0+YnVpbGRTdHJpbmc7Ci0gIGRlY2xhcmVfZ2Nyb290KGNvbnN0IEFycmF5Q2hhciosIGFycmF5KSA9IGJ1aWxkU3RyaW5nLT52YWx1ZTsKLSAgc2ludDMyIHN0ckxlbmd0aCA9IGJ1aWxkU3RyaW5nLT5sZW5ndGg7Ci0gIHNpbnQzMiBsZW5ndGggPSAoaW5kZXggKyAxKSA+IHN0ckxlbmd0aCA/IGluZGV4ICsgMSA6IHN0ckxlbmd0aCArIDE7Ci0gIHVpbnQxNiogYnVmID0gKHVpbnQxNiopYWxsb2NhKGxlbmd0aCAqIHNpemVvZih1aW50MTYpKTsKLQotICBpZiAoaW5kZXggIT0gMCkgewotICAgIG1lbWNweShidWYsIGFycmF5LT5lbGVtZW50cywgaW5kZXggKiBzaXplb2YodWludDE2KSk7Ci0gIH0KLQotICBpZiAoc3RyTGVuZ3RoID4gaW5kZXgpIHsKLSAgICBtZW1jcHkoJihidWZbaW5kZXggKyAxXSksICYoYXJyYXktPmVsZW1lbnRzW2luZGV4XSksIAotICAgICAgICAgICAgICAgKHN0ckxlbmd0aCAtIGluZGV4KSAqIHNpemVvZih1aW50MTYpKTsKLSAgfQotCi0gIGJ1ZltpbmRleF0gPSB2YWx1ZTsKLQlkZWNsYXJlX2djcm9vdChBcnJheUNoYXIqLCBhcnJheV9yZXMpID0gdm0tPmJ1ZlRvQXJyYXkoYnVmLCBsZW5ndGgpOwotICBkZWNsYXJlX2djcm9vdChQTmV0U3RyaW5nKiwgc3RyKSA9IChQTmV0U3RyaW5nKil2bS0+YXJyYXlUb1N0cmluZyhhcnJheV9yZXMpOwotICBvYmotPmJ1aWxkU3RyaW5nID0gc3RyOwotICAKLSAgcmV0dXJuIG9iajsKLX0KLQotZXh0ZXJuICJDIiBWTU9iamVjdCogU3lzdGVtX1RleHRfU3RyaW5nQnVpbGRlcl9JbnNlcnRfU3lzdGVtX1RleHRfU3RyaW5nQnVpbGRlcl9TeXN0ZW1fSW50MzJfU3lzdGVtX1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIqIG9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbnQzMiBpbmRleCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTmV0U3RyaW5nKiBzdHIpIHsKLQlsbHZtX2djcm9vdChvYmosIDApOwotCWxsdm1fZ2Nyb290KHN0ciwgMCk7Ci0gIE4zKiB2bSA9IChOMyopKFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKSk7Ci0gIGRlY2xhcmVfZ2Nyb290KFBOZXRTdHJpbmcqLCBidWlsZFN0cmluZykgPSBvYmotPmJ1aWxkU3RyaW5nOwotICBkZWNsYXJlX2djcm9vdChjb25zdCBBcnJheUNoYXIqLCBzdHJBcnJheSkgPSBzdHItPnZhbHVlOwotICBkZWNsYXJlX2djcm9vdChjb25zdCBBcnJheUNoYXIqLCBidWlsZEFycmF5KSA9IGJ1aWxkU3RyaW5nLT52YWx1ZTsKLSAgc2ludDMyIHN0ckxlbmd0aCA9IHN0ci0+bGVuZ3RoOwotICBzaW50MzIgYnVpbGRMZW5ndGggPSBidWlsZFN0cmluZy0+bGVuZ3RoOwotICBzaW50MzIgbGVuZ3RoID0gc3RyTGVuZ3RoICsgYnVpbGRMZW5ndGg7Ci0gIHVpbnQxNiogYnVmID0gKHVpbnQxNiopYWxsb2NhKGxlbmd0aCAqIHNpemVvZih1aW50MTYpKTsKLQotICBpZiAoaW5kZXggIT0gMCkgewotICAgIG1lbWNweShidWYsIGJ1aWxkQXJyYXktPmVsZW1lbnRzLCBpbmRleCAqIHNpemVvZih1aW50MTYpKTsKLSAgfQotCi0gIGlmIChzdHJMZW5ndGggIT0gMCkgewotICAgIG1lbWNweSgmKGJ1ZltpbmRleF0pLCBzdHJBcnJheS0+ZWxlbWVudHMsIHN0ckxlbmd0aCAqIHNpemVvZih1aW50MTYpKTsKLSAgfQotICAgIAotICBpZiAoYnVpbGRMZW5ndGggLSBpbmRleCA+IDApIHsKLSAgICBtZW1jcHkoJihidWZbc3RyTGVuZ3RoICsgaW5kZXhdKSwgJihidWlsZEFycmF5LT5lbGVtZW50c1tpbmRleF0pLCAKLSAgICAgICAgICAgICAgIChidWlsZExlbmd0aCAtIGluZGV4KSAqIHNpemVvZih1aW50MTYpKTsKLSAgfQotCi0JZGVjbGFyZV9nY3Jvb3QoQXJyYXlDaGFyKiwgYXJyYXlfcmVzKSA9IHZtLT5idWZUb0FycmF5KGJ1ZiwgbGVuZ3RoKTsKLSAgZGVjbGFyZV9nY3Jvb3QoUE5ldFN0cmluZyosIHZhbCkgPSAoUE5ldFN0cmluZyopdm0tPmFycmF5VG9TdHJpbmcoYXJyYXlfcmVzKTsKLSAgb2JqLT5idWlsZFN0cmluZyA9IHZhbDsKLQotICByZXR1cm4gb2JqOwotfQotCi1leHRlcm4gIkMiIFZNT2JqZWN0KiBTeXN0ZW1fVGV4dF9TdHJpbmdCdWlsZGVyX0FwcGVuZF9TeXN0ZW1fVGV4dF9TdHJpbmdCdWlsZGVyX1N5c3RlbV9DaGFyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciogb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2IHZhbHVlKSB7Ci0JbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgTjMqIHZtID0gKE4zKikoVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpKTsKLSAgZGVjbGFyZV9nY3Jvb3QoUE5ldFN0cmluZyosIGJ1aWxkU3RyaW5nKSA9IG9iai0+YnVpbGRTdHJpbmc7Ci0gIGRlY2xhcmVfZ2Nyb290KGNvbnN0IEFycmF5Q2hhciosIGFycmF5KSA9IGJ1aWxkU3RyaW5nLT52YWx1ZTsKLSAgc2ludDMyIGxlbmd0aCA9IGJ1aWxkU3RyaW5nLT5sZW5ndGg7Ci0gIHVpbnQxNiogYnVmID0gKHVpbnQxNiopYWxsb2NhKChsZW5ndGggKyAxKSAqIHNpemVvZih1aW50MTYpKTsKLQotICBtZW1jcHkoYnVmLCBhcnJheS0+ZWxlbWVudHMsIGxlbmd0aCAqIHNpemVvZih1aW50MTYpKTsKLQotICBidWZbbGVuZ3RoXSA9IHZhbHVlOwotCWRlY2xhcmVfZ2Nyb290KEFycmF5Q2hhciosIGFycmF5X3JlcykgPSB2bS0+YnVmVG9BcnJheShidWYsIGxlbmd0aCArIDEpOwotCWRlY2xhcmVfZ2Nyb290KFBOZXRTdHJpbmcqLCB2YWwpID0gKFBOZXRTdHJpbmcqKXZtLT5hcnJheVRvU3RyaW5nKGFycmF5X3Jlcyk7Ci0gIG9iai0+YnVpbGRTdHJpbmcgPSB2YWw7Ci0gIHJldHVybiBvYmo7Ci19Ci0KLQotZXh0ZXJuICJDIiBWTU9iamVjdCogU3lzdGVtX1RleHRfU3RyaW5nQnVpbGRlcl9BcHBlbmRfU3lzdGVtX1RleHRfU3RyaW5nQnVpbGRlcl9TeXN0ZW1fU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciogb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5ldFN0cmluZyogc3RyKSB7Ci0JbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLQlsbHZtX2djcm9vdChzdHIsIDApOwotICBOMyogdm0gPSAoTjMqKShWTVRocmVhZDo6Z2V0KCktPmdldFZNKCkpOwotICBkZWNsYXJlX2djcm9vdChQTmV0U3RyaW5nKiwgYnVpbGRTdHJpbmcpID0gb2JqLT5idWlsZFN0cmluZzsKLSAgZGVjbGFyZV9nY3Jvb3QoY29uc3QgQXJyYXlDaGFyKiwgYnVpbGRBcnJheSkgPSBidWlsZFN0cmluZy0+dmFsdWU7Ci0gIGRlY2xhcmVfZ2Nyb290KGNvbnN0IEFycmF5Q2hhciosIHN0ckFycmF5KSA9IHN0ci0+dmFsdWU7Ci0gIHNpbnQzMiBidWlsZExlbmd0aCA9IGJ1aWxkU3RyaW5nLT5sZW5ndGg7Ci0gIHNpbnQzMiBzdHJMZW5ndGggPSBzdHItPmxlbmd0aDsKLSAgc2ludDMyIGxlbmd0aCA9IGJ1aWxkTGVuZ3RoICsgc3RyTGVuZ3RoOwotICB1aW50MTYqIGJ1ZiA9ICh1aW50MTYqKWFsbG9jYShsZW5ndGggKiBzaXplb2YodWludDE2KSk7Ci0KLSAgbWVtY3B5KGJ1ZiwgYnVpbGRBcnJheS0+ZWxlbWVudHMsIGJ1aWxkTGVuZ3RoICogc2l6ZW9mKHVpbnQxNikpOwotICBtZW1jcHkoJihidWZbYnVpbGRMZW5ndGhdKSwgc3RyQXJyYXktPmVsZW1lbnRzLCBzdHJMZW5ndGggKiBzaXplb2YodWludDE2KSk7Ci0KLQlkZWNsYXJlX2djcm9vdChBcnJheUNoYXIqLCBhcnJheV9yZXMpID0gdm0tPmJ1ZlRvQXJyYXkoYnVmLCBsZW5ndGgpOwotICBkZWNsYXJlX2djcm9vdChQTmV0U3RyaW5nKiwgdmFsKSA9IChQTmV0U3RyaW5nKil2bS0+YXJyYXlUb1N0cmluZyhhcnJheV9yZXMpOwotICBvYmotPmJ1aWxkU3RyaW5nID0gdmFsOwotICByZXR1cm4gb2JqOwotfQotCi1leHRlcm4gIkMiIHNpbnQzMiBTeXN0ZW1fU3RyaW5nX0ZpbmRJblJhbmdlKFBOZXRTdHJpbmcqIG9iaiwgc2ludDMyIHNyY0ZpcnN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ludDMyIHNyY0xhc3QsIHNpbnQzMiBzdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTmV0U3RyaW5nKiBkZXN0KSB7Ci0JbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLQlsbHZtX2djcm9vdChkZXN0LCAwKTsKLSAgdWludDE2KiBidWYxID0gKHVpbnQxNiopJihvYmotPnZhbHVlLT5lbGVtZW50c1tzcmNGaXJzdF0pOwotICB1aW50MTYqIGJ1ZjIgPSAodWludDE2KikoZGVzdC0+dmFsdWUtPmVsZW1lbnRzKTsKLSAgc2ludDMyIGRlc3RMZW5ndGggPSBkZXN0LT5sZW5ndGg7Ci0gIHNpbnQzMiBzaXplID0gZGVzdExlbmd0aCAqIHNpemVvZih1aW50MTYpOwotICAKLSAgaWYgKHN0ZXAgPiAwKSB7Ci0gICAgaWYgKGRlc3RMZW5ndGggPT0gMSkgewotICAgICAgd2hpbGUgKHNyY0ZpcnN0IDw9IHNyY0xhc3QpIHsKLSAgICAgICAgaWYgKGJ1ZjFbMF0gID09IGJ1ZjJbMF0pIHsKLSAgICAgICAgICByZXR1cm4gc3JjRmlyc3Q7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgYnVmMSA9ICYoYnVmMVsxXSk7Ci0gICAgICAgICAgKytzcmNGaXJzdDsgCi0gICAgICAgIH0KLSAgICAgIH0gCi0gICAgfSBlbHNlIHsKLSAgICAgIHdoaWxlIChzcmNGaXJzdCA8PSBzcmNMYXN0KSB7Ci0gICAgICAgIGlmICgoYnVmMVswXSA9PSBidWYyWzBdKSAmJiAhbWVtY21wKGJ1ZjEsIGJ1ZjIsIHNpemUpKSB7Ci0gICAgICAgICAgcmV0dXJuIHNyY0ZpcnN0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGJ1ZjEgPSAmKGJ1ZjFbMV0pOwotICAgICAgICAgICsrc3JjRmlyc3Q7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGRlc3RMZW5ndGggPT0gMSkgewotICAgICAgd2hpbGUgKHNyY0ZpcnN0ID49IHNyY0xhc3QpIHsKLSAgICAgICAgaWYgKGJ1ZjFbMF0gPT0gYnVmMlswXSkgewotICAgICAgICAgIHJldHVybiBzcmNGaXJzdDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBidWYxID0gYnVmMSAtIDE7Ci0gICAgICAgICAgLS1zcmNGaXJzdDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICB3aGlsZSAoc3JjRmlyc3QgPj0gc3JjTGFzdCkgewotICAgICAgICBpZiAoKGJ1ZjFbMF0gPT0gYnVmMlswXSkgJiYgIW1lbWNtcChidWYxLCBidWYyLCBzaXplKSkgewotICAgICAgICAgIHJldHVybiBzcmNGaXJzdDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBidWYxID0gYnVmMSAtIDE7Ci0gICAgICAgICAgLS1zcmNGaXJzdDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gLTE7Ci19Ci0KLWV4dGVybiAiQyIgVk1PYmplY3QqIFN5c3RlbV9SZWZsZWN0aW9uX0Fzc2VtYmx5X0xvYWRGcm9tTmFtZShQTmV0U3RyaW5nKiBzdHIsIHNpbnQzMiAmIGVycm9yLCBWTU9iamVjdCogcGFyZW50KSB7Ci0JbGx2bV9nY3Jvb3Qoc3RyLCAwKTsKLQlsbHZtX2djcm9vdChwYXJlbnQsIDApOwotICBOMyogdm0gPSAoTjMqKShWTVRocmVhZDo6Z2V0KCktPmdldFZNKCkpOwotCWRlY2xhcmVfZ2Nyb290KGNvbnN0IEFycmF5Q2hhciosIHZhbHVlKSA9IHN0ci0+dmFsdWU7Ci0gIEFzc2VtYmx5KiBhc3MgPSB2bS0+Y29uc3RydWN0QXNzZW1ibHkodm0tPmFycmF5VG9VVEY4KHZhbHVlKSk7Ci0KLQlpZighYXNzLT5yZXNvbHZlKDEsICJkbGwiKSkKLQkJdm0tPmVycm9yKCJ1bmZvdW5kIGFzc2VtYmx5ICVzXG4iLCBtdm06OlByaW50QnVmZmVyKHZhbHVlKS5jU3RyaW5nKCkpOwotCi0gIGVycm9yID0gMDsKLQlkZWNsYXJlX2djcm9vdChWTU9iamVjdCosIGRlbGVnYXRlZSkgPSBhc3MtPmdldEFzc2VtYmx5RGVsZWdhdGVlKCk7Ci0gIHJldHVybiBkZWxlZ2F0ZWU7Ci19Ci0KLWV4dGVybiAiQyIgUE5ldFN0cmluZyogU3lzdGVtX1N0cmluZ19Db25jYXRfMihQTmV0U3RyaW5nKiBzdHIxLCBQTmV0U3RyaW5nKiBzdHIyKSB7Ci0JbGx2bV9nY3Jvb3Qoc3RyMSwgMCk7Ci0JbGx2bV9nY3Jvb3Qoc3RyMiwgMCk7Ci0gIE4zKiB2bSA9IChOMyopKFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKSk7Ci0gIGRlY2xhcmVfZ2Nyb290KGNvbnN0IEFycmF5Q2hhciosIGExKSA9IHN0cjEtPnZhbHVlOwotICBkZWNsYXJlX2djcm9vdChjb25zdCBBcnJheUNoYXIqLCBhMikgPSBzdHIyLT52YWx1ZTsKLSAgc2ludDMyIGxlbjEgPSBzdHIxLT5sZW5ndGg7Ci0gIHNpbnQzMiBsZW4yID0gc3RyMi0+bGVuZ3RoOwotICB1aW50MTYqIGJ1ZiA9ICh1aW50MTYqKWFsbG9jYSgobGVuMSArIGxlbjIpICogc2l6ZW9mKHVpbnQxNikpOwotCi0gIG1lbWNweShidWYsIGExLT5lbGVtZW50cywgbGVuMSAqIHNpemVvZih1aW50MTYpKTsKLSAgbWVtY3B5KCYoYnVmW2xlbjFdKSwgYTItPmVsZW1lbnRzLCBsZW4yICogc2l6ZW9mKHVpbnQxNikpOwotICAKLQlkZWNsYXJlX2djcm9vdChBcnJheUNoYXIqLCBhcnJheV9yZXMpID0gdm0tPmJ1ZlRvQXJyYXkoYnVmLCBsZW4xICsgbGVuMik7Ci0gIGRlY2xhcmVfZ2Nyb290KFBOZXRTdHJpbmcqLCB2YWwpID0gKFBOZXRTdHJpbmcqKXZtLT5hcnJheVRvU3RyaW5nKGFycmF5X3Jlcyk7Ci0gIAotICByZXR1cm4gdmFsOwotfQotCi1leHRlcm4gIkMiIFBOZXRTdHJpbmcqIFN5c3RlbV9TdHJpbmdfQ29uY2F0XzMoUE5ldFN0cmluZyogc3RyMSwgUE5ldFN0cmluZyogc3RyMiwgUE5ldFN0cmluZyogc3RyMykgewotCWxsdm1fZ2Nyb290KHN0cjEsIDApOwotCWxsdm1fZ2Nyb290KHN0cjIsIDApOwotCWxsdm1fZ2Nyb290KHN0cjMsIDApOwotICBOMyogdm0gPSAoTjMqKShWTVRocmVhZDo6Z2V0KCktPmdldFZNKCkpOwotICBkZWNsYXJlX2djcm9vdChjb25zdCBBcnJheUNoYXIqLCBhMSkgPSBzdHIxLT52YWx1ZTsKLSAgZGVjbGFyZV9nY3Jvb3QoY29uc3QgQXJyYXlDaGFyKiwgYTIpID0gc3RyMi0+dmFsdWU7Ci0gIGRlY2xhcmVfZ2Nyb290KGNvbnN0IEFycmF5Q2hhciosIGEzKSA9IHN0cjMtPnZhbHVlOwotICBzaW50MzIgbGVuMSA9IHN0cjEtPmxlbmd0aDsKLSAgc2ludDMyIGxlbjIgPSBzdHIyLT5sZW5ndGg7Ci0gIHNpbnQzMiBsZW4zID0gc3RyMy0+bGVuZ3RoOwotICB1aW50MTYqIGJ1ZiA9ICh1aW50MTYqKWFsbG9jYSgobGVuMSArIGxlbjIgKyBsZW4zKSAqIHNpemVvZih1aW50MTYpKTsKLQotICBtZW1jcHkoYnVmLCBhMS0+ZWxlbWVudHMsIGxlbjEgKiBzaXplb2YodWludDE2KSk7Ci0gIG1lbWNweSgmKGJ1ZltsZW4xXSksIGEyLT5lbGVtZW50cywgbGVuMiAqIHNpemVvZih1aW50MTYpKTsKLSAgbWVtY3B5KCYoYnVmW2xlbjEgKyBsZW4yXSksIGEzLT5lbGVtZW50cywgbGVuMyAqIHNpemVvZih1aW50MTYpKTsKLSAgCi0JZGVjbGFyZV9nY3Jvb3QoQXJyYXlDaGFyKiwgYXJyYXlfcmVzKSA9IHZtLT5idWZUb0FycmF5KGJ1ZiwgbGVuMSArIGxlbjIgKyBsZW4zKTsKLSAgZGVjbGFyZV9nY3Jvb3QoUE5ldFN0cmluZyosIHZhbCkgPSAoUE5ldFN0cmluZyopdm0tPmFycmF5VG9TdHJpbmcoYXJyYXlfcmVzKTsKLSAgCi0gIHJldHVybiB2YWw7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBTeXN0ZW1fU3RyaW5nX1JlbW92ZVNwYWNlKFBOZXRTdHJpbmcqIHN0ciwgc2ludDMyIGluZGV4LCBzaW50MzIgbGVuZ3RoKSB7Ci0JbGx2bV9nY3Jvb3Qoc3RyLCAwKTsKLSAgZGVjbGFyZV9nY3Jvb3QoY29uc3QgQXJyYXlDaGFyKiwgYXJyYXkpID0gc3RyLT52YWx1ZTsKLSAgc2ludDMyIHN0ckxlbmd0aCA9IHN0ci0+bGVuZ3RoOwotICB1aW50MTYqIGJ1ZiA9ICh1aW50MTYqKWFsbG9jYShzdHJMZW5ndGggKiBzaXplb2YodWludDE2KSk7Ci0gIHNpbnQzMiBqID0gaW5kZXg7Ci0KLSAgaWYgKGluZGV4ICE9IDApIHsKLSAgICBtZW1jcHkoYnVmLCBhcnJheS0+ZWxlbWVudHMsIGluZGV4ICogc2l6ZW9mKHVpbnQxNikpOwotICB9Ci0gIAotICAvLyAzMiBpcyBzcGFjZQotICBmb3IgKHNpbnQzMiBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7Ci0gICAgdWludDE2IGN1ciA9IGFycmF5LT5lbGVtZW50c1tpbmRleCArIGldOwotICAgIGlmIChjdXIgIT0gMzIpIHsKLSAgICAgIGJ1ZltqXSA9IGN1cjsKLSAgICB9IGVsc2UgewotICAgICAgKytqOwotICAgIH0KLSAgfQotCi0gIGlmIChzdHJMZW5ndGggPiAoaW5kZXggKyBsZW5ndGgpKSB7Ci0gICAgbWVtY3B5KCYoYnVmW2pdKSwgJihhcnJheS0+ZWxlbWVudHNbaW5kZXggKyBsZW5ndGhdKSwgKHN0ckxlbmd0aCAtIChpbmRleCArIGxlbmd0aCkpICogc2l6ZW9mKHVpbnQxNikpOwotICB9Ci0KLSAgZGVjbGFyZV9nY3Jvb3QoY29uc3QgQXJyYXlDaGFyKiwgcmVzKSA9IFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+YnVmVG9BcnJheShidWYsIGopOwotICBzdHItPnZhbHVlID0gcmVzOwotICBzdHItPmxlbmd0aCA9IGo7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBTeXN0ZW1fU3RyaW5nX19jdG9yXzMoUE5ldFN0cmluZyogc3RyLCB1aW50MTYgY2gsIHNpbnQzMiBjb3VudCkgewotCWxsdm1fZ2Nyb290KHN0ciwgMCk7Ci0gIGRlY2xhcmVfZ2Nyb290KEFycmF5Q2hhciosIGFycmF5KSA9IChBcnJheUNoYXIqKU1TQ29ybGliOjphcnJheUNoYXItPmRvTmV3KGNvdW50KTsKLSAgZm9yIChzaW50MzIgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgYXJyYXktPmVsZW1lbnRzW2ldID0gY2g7Ci0gIH0KLQotICBzdHItPnZhbHVlID0gYXJyYXk7Ci0gIHN0ci0+bGVuZ3RoID0gYXJyYXktPnNpemU7Ci0gIHN0ci0+Y2FwYWNpdHkgPSBhcnJheS0+c2l6ZTsKLX0KLQotZXh0ZXJuICJDIiBpbnQ2NF90IFBsYXRmb3JtX1RpbWVNZXRob2RzX0dldEN1cnJlbnRUaW1lKCkgewotICByZXR1cm4gX0lMX1RpbWVNZXRob2RzX0dldEN1cnJlbnRUaW1lKDApOwotfQotCi0jZGVmaW5lIEFTU0VNQkxZX1ZBTFVFKG9iaikgKChBc3NlbWJseSoqKW9iailbM10KLQotdm9pZCogc3lzX21lbXJjaHIoY29uc3Qgdm9pZCogcywgaW50IGMsIHNpemVfdCBuKSB7Ci0gIHVuc2lnbmVkIGNoYXIqIG0gPSAodW5zaWduZWQgY2hhciopIHMgKyBuOwotICBmb3IgKDs7KSB7Ci0gICAgaWYgKCEobi0tKSkgcmV0dXJuIE5VTEw7Ci0gICAgZWxzZSBpZiAoKm0tLSA9PSAodW5zaWduZWQgY2hhciljKSByZXR1cm4gKHZvaWQqKShtKzEpOwotICB9Ci19Ci0KLWV4dGVybiAiQyIgVk1PYmplY3QqIFN5c3RlbV9SZWZsZWN0aW9uX0Fzc2VtYmx5X0dldFR5cGUoVk1PYmplY3QqIG9iaiwgUE5ldFN0cmluZyogc3RyLCBib29sIG9uRXJyb3IsIGJvb2wgaWdub3JlQ2FzZSkgewotCWxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0JbGx2bV9nY3Jvb3Qoc3RyLCAwKTsKLSAgQXNzZW1ibHkqIGFzcyA9IEFTU0VNQkxZX1ZBTFVFKG9iaik7Ci0gIGRlY2xhcmVfZ2Nyb290KGNvbnN0IEFycmF5Q2hhciosIGFycmF5KSA9IHN0ci0+dmFsdWU7Ci0JbXZtOjpQcmludEJ1ZmZlciBwYihhcnJheSk7Ci0gIGNoYXIqIGFzY2lpeiA9IHBiLmNTdHJpbmcoKTsKLSAgY2hhciogaW5kZXggPSAoY2hhciopc3lzX21lbXJjaHIoYXNjaWl6LCAnLicsIHN0cmxlbihhc2NpaXopKTsKLSAgTjMqIHZtID0gYXNzLT52bTsKLSAgCi0gIGluZGV4WzBdID0gMDsKLSAgKytpbmRleDsKLSAgVk1Db21tb25DbGFzcyogY2wgPSBhc3MtPmxvYWRUeXBlRnJvbU5hbWUodm0tPmFzY2lpelRvVVRGOChpbmRleCksIHZtLT5hc2NpaXpUb1VURjgoYXNjaWl6KSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgb25FcnJvcik7Ci0gIGlmICghY2wpIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotCWRlY2xhcmVfZ2Nyb290KFZNT2JqZWN0ICosIGRlbGVnYXRlZSkgPSBjbC0+Z2V0Q2xhc3NEZWxlZ2F0ZWUoKTsKLSAgcmV0dXJuIGRlbGVnYXRlZTsKLX0KLQotc3RhdGljIGJvb2wgcGFyYW1ldGVyTWF0Y2goc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+IHBhcmFtcywgQXJyYXlPYmplY3QqIHR5cGVzLCBib29sIHZpcnQpIHsKLQlsbHZtX2djcm9vdCh0eXBlcywgMCk7Ci0gIHVpbnQzMiB2ID0gdmlydCA/IDEgOiAwOwotICBpZiAodHlwZXMtPnNpemUgKyB2ICsgMSAhPSBwYXJhbXMuc2l6ZSgpKSByZXR1cm4gZmFsc2U7Ci0gIGZvciAoc2ludDMyIGkgPSAwOyBpIDwgdHlwZXMtPnNpemU7ICsraSkgewotICAgIFZNQ29tbW9uQ2xhc3MqIGN1ciA9IChWTUNvbW1vbkNsYXNzKilNU0NvcmxpYjo6dHlwZUNsclR5cGUtPmdldEludFB0cih0eXBlcy0+ZWxlbWVudHNbaV0pOwotICAgIGlmIChjdXIgIT0gcGFyYW1zW2kgKyAxICsgdl0pIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotZXh0ZXJuICJDIiBWTU9iamVjdCogU3lzdGVtX1JlZmxlY3Rpb25fQ2xyVHlwZV9HZXRNZW1iZXJJbXBsKFZNT2JqZWN0KiBUeXBlLCBQTmV0U3RyaW5nKiBzdHIsIHNpbnQzMiBtZW1iZXJUeXBlcywgc2ludDMyIGJpbmRpbmdGbGFncywgVk1PYmplY3QqIGJpbmRlciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW50MzIgY2FsbGluZ0NvbnZlbnRpb25zLCBBcnJheU9iamVjdCogdHlwZXMsIFZNT2JqZWN0KiBtb2RpZmllcnMpIHsKLQlsbHZtX2djcm9vdChUeXBlLCAwKTsKLQlsbHZtX2djcm9vdChzdHIsIDApOwotCWxsdm1fZ2Nyb290KGJpbmRlciwgMCk7Ci0JbGx2bV9nY3Jvb3QodHlwZXMsIDApOwotCWxsdm1fZ2Nyb290KG1vZGlmaWVycywgMCk7Ci0gIFZNQ29tbW9uQ2xhc3MqIHR5cGUgPSAoVk1Db21tb25DbGFzcyopTVNDb3JsaWI6OnR5cGVDbHJUeXBlLT5nZXRJbnRQdHIoVHlwZSk7Ci0gIE4zKiB2bSA9IChOMyopKFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKSk7Ci0gIGNvbnN0IFVURjgqIG5hbWUgPSB2bS0+YXJyYXlUb1VURjgoc3RyLT52YWx1ZSk7Ci0gIGlmIChtZW1iZXJUeXBlcyA9PSBNRU1CRVJfVFlQRVNfUFJPUEVSVFkpIHsKLSAgICBzdGQ6OnZlY3RvcjxQcm9wZXJ0eSosIGdjX2FsbG9jYXRvcjxQcm9wZXJ0eSo+ID4gcHJvcGVydGllcyA9IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUtPnByb3BlcnRpZXM7Ci0gICAgUHJvcGVydHkgKnJlcyA9IDA7Ci0gICAgZm9yIChzdGQ6OnZlY3RvcjxQcm9wZXJ0eSosIGdjX2FsbG9jYXRvcjxQcm9wZXJ0eSo+ID46Oml0ZXJhdG9yIGkgPSBwcm9wZXJ0aWVzLmJlZ2luKCksIAotICAgICAgICAgICAgZSA9IHByb3BlcnRpZXMuZW5kKCk7IGkhPSBlOyArK2kpIHsKLSAgICAgIGlmICgoKmkpLT5uYW1lID09IG5hbWUpIHsKLSAgICAgICAgcmVzID0gKmk7IAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHJlcyA9PSAwKSBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLQkJZGVjbGFyZV9nY3Jvb3QoVk1PYmplY3QqLCBwcm9wX3JlcykgPSByZXMtPmdldFByb3BlcnR5RGVsZWdhdGVlKCk7Ci0gICAgcmV0dXJuIHByb3BfcmVzOwotICB9IGVsc2UgaWYgKG1lbWJlclR5cGVzID09IE1FTUJFUl9UWVBFU19NRVRIT0QpIHsKLSAgICBzdGQ6OnZlY3RvcjxWTU1ldGhvZCo+IHZpcnR1YWxNZXRob2RzID0gdHlwZS0+dmlydHVhbE1ldGhvZHM7Ci0gICAgc3RkOjp2ZWN0b3I8Vk1NZXRob2QqPiBzdGF0aWNNZXRob2RzID0gdHlwZS0+c3RhdGljTWV0aG9kczsKLSAgICAKLSAgICBmb3IgKHN0ZDo6dmVjdG9yPFZNTWV0aG9kKj46Oml0ZXJhdG9yIGkgPSB2aXJ0dWFsTWV0aG9kcy5iZWdpbigpLCAKLSAgICAgICAgICAgIGUgPSB2aXJ0dWFsTWV0aG9kcy5lbmQoKTsgaSE9IGU7ICsraSkgewotICAgICAgVk1NZXRob2QqIG1ldGggPSAqaTsKLSAgICAgIGlmIChtZXRoLT5uYW1lID09IG5hbWUpIHsKLSAgICAgICAgaWYgKHBhcmFtZXRlck1hdGNoKG1ldGgtPnBhcmFtZXRlcnMsIHR5cGVzLCB0cnVlKSkgewotCQkJCQlkZWNsYXJlX2djcm9vdChWTU9iamVjdCosIG1ldGhfcmVzKSA9IG1ldGgtPmdldE1ldGhvZERlbGVnYXRlZSgpOwotICAgICAgICAgIHJldHVybiBtZXRoX3JlczsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBmb3IgKHN0ZDo6dmVjdG9yPFZNTWV0aG9kKj46Oml0ZXJhdG9yIGkgPSBzdGF0aWNNZXRob2RzLmJlZ2luKCksIAotICAgICAgICAgICAgZSA9IHN0YXRpY01ldGhvZHMuZW5kKCk7IGkhPSBlOyArK2kpIHsKLSAgICAgIFZNTWV0aG9kKiBtZXRoID0gKmk7Ci0gICAgICBpZiAobWV0aC0+bmFtZSA9PSBuYW1lKSB7Ci0gICAgICAgIGlmIChwYXJhbWV0ZXJNYXRjaChtZXRoLT5wYXJhbWV0ZXJzLCB0eXBlcywgZmFsc2UpKSB7Ci0JCQkJCWRlY2xhcmVfZ2Nyb290KFZNT2JqZWN0KiwgbWV0aF9yZXMpID0gbWV0aC0+Z2V0TWV0aG9kRGVsZWdhdGVlKCk7Ci0gICAgICAgICAgcmV0dXJuIG1ldGhfcmVzOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0gZWxzZSB7Ci0gICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWV4dGVybiAiQyIgVk1PYmplY3QqIFN5c3RlbV9SZWZsZWN0aW9uX0NsckhlbHBlcnNfR2V0U2VtYW50aWNzKHVpbnRwdHJfdCBpdGVtLCB1aW50MzIgYXR0cmlidXRlcywgYm9vbCBub25QdWJsaWMpIHsKLQlpZiAoYXR0cmlidXRlcyA9PSBNRVRIT0RfU0VNQU5USUNfQVRUUklCVVRFU19HRVRURVIpIHsKLQkJUHJvcGVydHkqIHByb3AgPSAoUHJvcGVydHkqKWl0ZW07Ci0JCW12bTo6UHJpbnRCdWZmZXIgX2FzY2lpeihwcm9wLT5uYW1lKTsKLQkJY29uc3QgY2hhciogYXNjaWl6ID0gX2FzY2lpei5jU3RyaW5nKCk7Ci0JCWNoYXIqIGJ1ZiA9IChjaGFyKilhbGxvY2Eoc3RybGVuKGFzY2lpeikgKyA1KTsKLQkJc3ByaW50ZihidWYsICJnZXRfJXMiLCBhc2NpaXopOwotCQlOMyogdm0gPSBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCk7Ci0JCVZNTWV0aG9kKiBtZXRoID0gcHJvcC0+dHlwZS0+bG9va3VwTWV0aG9kKHZtLT5hc2NpaXpUb1VURjgoYnVmKSwgcHJvcC0+cGFyYW1ldGVycywgdHJ1ZSwgZmFsc2UpOwotCQlhc3NlcnQobWV0aCk7Ci0JCWRlY2xhcmVfZ2Nyb290KFZNT2JqZWN0KiwgcmVzKSA9IG1ldGgtPmdldE1ldGhvZERlbGVnYXRlZSgpOwotCQlyZXR1cm4gcmVzOwotCX0gZWxzZSB7Ci0JCVZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZTogR2V0U2VtYW50aWNzOiAlZCIsIGF0dHJpYnV0ZXMpOwotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGRlY2Fwc3VsZVByaW1pdGl2ZShWTU9iamVjdCogYXJnLCBjb25zdCBsbHZtOjpUeXBlKiB0eXBlLCBzdGQ6OnZlY3RvcjxsbHZtOjpHZW5lcmljVmFsdWU+JiBhcmdzKSB7Ci0JbGx2bV9nY3Jvb3QoYXJnLCAwKTsKLQotICBpZiAodHlwZSA9PSBsbHZtOjpUeXBlOjpnZXRJbnQxVHkobGx2bTo6Z2V0R2xvYmFsQ29udGV4dCgpKSkgewotICAgIGxsdm06OkdlbmVyaWNWYWx1ZSBndjsKLSAgICBndi5JbnRWYWwgPSBsbHZtOjpBUEludCgxLCAoYm9vbCkoKHVpbnQzMiopYXJnKVtWQUxVRV9PRkZTRVRdKTsKLSAgICBhcmdzLnB1c2hfYmFjayhndik7Ci0gIH0gZWxzZSBpZiAodHlwZSA9PSBsbHZtOjpUeXBlOjpnZXRJbnQ4VHkobGx2bTo6Z2V0R2xvYmFsQ29udGV4dCgpKSkgewotICAgIGxsdm06OkdlbmVyaWNWYWx1ZSBndjsKLSAgICBndi5JbnRWYWwgPSBsbHZtOjpBUEludCg4LCAodWludDgpKCh1aW50MzIqKWFyZylbVkFMVUVfT0ZGU0VUXSk7Ci0gICAgYXJncy5wdXNoX2JhY2soZ3YpOwotICB9IGVsc2UgaWYgKHR5cGUgPT0gbGx2bTo6VHlwZTo6Z2V0SW50MTZUeShsbHZtOjpnZXRHbG9iYWxDb250ZXh0KCkpKSB7Ci0gICAgbGx2bTo6R2VuZXJpY1ZhbHVlIGd2OwotICAgIGd2LkludFZhbCA9IGxsdm06OkFQSW50KDE2LCAodWludDE2KSgodWludDMyKilhcmcpW1ZBTFVFX09GRlNFVF0pOwotICAgIGFyZ3MucHVzaF9iYWNrKGd2KTsKLSAgfSBlbHNlIGlmICh0eXBlID09IGxsdm06OlR5cGU6OmdldEludDMyVHkobGx2bTo6Z2V0R2xvYmFsQ29udGV4dCgpKSkgewotICAgIGxsdm06OkdlbmVyaWNWYWx1ZSBndjsKLSAgICBndi5JbnRWYWwgPSBsbHZtOjpBUEludCgzMiwgKHVpbnQzMikoKHVpbnQzMiopYXJnKVtWQUxVRV9PRkZTRVRdKTsKLSAgICBhcmdzLnB1c2hfYmFjayhndik7Ci0gIH0gZWxzZSBpZiAodHlwZSA9PSBsbHZtOjpUeXBlOjpnZXRJbnQ2NFR5KGxsdm06OmdldEdsb2JhbENvbnRleHQoKSkpIHsKLSAgICBsbHZtOjpHZW5lcmljVmFsdWUgZ3Y7Ci0gICAgdWludDMyKiBwdHIgPSAmKCh1aW50MzIqKWFyZylbVkFMVUVfT0ZGU0VUXTsKLSAgICBndi5JbnRWYWwgPSBsbHZtOjpBUEludCg2NCwgKCh1aW50NjQqKXB0cilbMF0pOwotICAgIGFyZ3MucHVzaF9iYWNrKGd2KTsKLSAgfSBlbHNlIGlmICh0eXBlID09IGxsdm06OlR5cGU6OmdldEZsb2F0VHkobGx2bTo6Z2V0R2xvYmFsQ29udGV4dCgpKSkgewotICAgIGxsdm06OkdlbmVyaWNWYWx1ZSBndjsKLSAgICBmbG9hdCogcHRyID0gJigoZmxvYXQqKWFyZylbVkFMVUVfT0ZGU0VUXTsKLSAgICBndi5GbG9hdFZhbCA9ICgoZmxvYXQqKXB0cilbMF07Ci0gICAgYXJncy5wdXNoX2JhY2soZ3YpOwotICB9IGVsc2UgaWYgKHR5cGUgPT0gbGx2bTo6VHlwZTo6Z2V0RG91YmxlVHkobGx2bTo6Z2V0R2xvYmFsQ29udGV4dCgpKSkgewotICAgIGxsdm06OkdlbmVyaWNWYWx1ZSBndjsKLSAgICB1aW50MzIqIHB0ciA9ICYoKHVpbnQzMiopYXJnKVtWQUxVRV9PRkZTRVRdOwotICAgIGd2LkRvdWJsZVZhbCA9ICgoZG91YmxlKilwdHIpWzBdOwotICAgIGFyZ3MucHVzaF9iYWNrKGd2KTsKLSAgfSBlbHNlIGlmICh0eXBlID09IGxsdm06OlBvaW50ZXJUeXBlOjpnZXRVbnF1YWwobGx2bTo6VHlwZTo6Z2V0SW50OFR5KGxsdm06OmdldEdsb2JhbENvbnRleHQoKSkpKSB7Ci0gICAgbGx2bTo6R2VuZXJpY1ZhbHVlIGd2KCgodm9pZCoqKWFyZylbVkFMVUVfT0ZGU0VUXSk7Ci0gICAgYXJncy5wdXNoX2JhY2soZ3YpOwotICB9IGVsc2UgewotICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotICB9Ci19Ci0KLWV4dGVybiAiQyIgVk1PYmplY3QqIFN5c3RlbV9SZWZsZWN0aW9uX0Nsck1ldGhvZF9JbnZva2UoVk1PYmplY3QqIE1ldGhvZCwgVk1PYmplY3QqIG9iaiwgc2ludDMyIGludm9rZUF0dHIsIFZNT2JqZWN0KiBiaW5kZXIsIEFycmF5T2JqZWN0KiBhcmdzLCBWTU9iamVjdCogY3VsdHVyZSkgewotCWxsdm1fZ2Nyb290KE1ldGhvZCwgMCk7Ci0JbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLQlsbHZtX2djcm9vdChiaW5kZXIsIDApOwotCWxsdm1fZ2Nyb290KGFyZ3MsIDApOwotCWxsdm1fZ2Nyb290KGN1bHR1cmUsIDApOwotCi0gIFZNTWV0aG9kKiBtZXRoID0gKFZNTWV0aG9kKilNU0NvcmxpYjo6bWV0aG9kTWV0aG9kVHlwZS0+Z2V0SW50UHRyKE1ldGhvZCk7Ci0gIG1ldGgtPmdldFNpZ25hdHVyZShOVUxMKTsKLSAgbWV0aC0+Y29tcGlsZWRQdHIoTlVMTCk7Ci0gIGxsdm06OkZ1bmN0aW9uKiBmdW5jID0gQ0xJSml0Ojpjb21waWxlKG1ldGgtPmNsYXNzRGVmLCBtZXRoKTsKLSAgVk1DbGFzcyogdHlwZSA9IG1ldGgtPmNsYXNzRGVmOwotICB0eXBlLT5yZXNvbHZlU3RhdGljKHRydWUsIE5VTEwpOwotICB1aW50MzIgdmlydCA9IG1ldGgtPnZpcnQ7Ci0KLSAgaWYgKChvYmogIT0gMCkgJiYgdmlydCkgewotICAgIGlmICghKG9iai0+Y2xhc3NPZi0+aXNBc3NpZ25hYmxlRnJvbSh0eXBlKSkpIHsKLSAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+aWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG12bTo6UHJpbnRCdWZmZXIobWV0aC0+bmFtZSkuY1N0cmluZygpKTsKLSAgICB9Ci0gICAgdmVyaWZ5TnVsbChvYmopOwotICB9Ci0gICAgCi0gIHN0ZDo6dmVjdG9yPGxsdm06OkdlbmVyaWNWYWx1ZT4gZ3ZhcmdzOwotICB1aW50MzIgaW5kZXggPSAwOwotICAKLSAgbGx2bTo6RnVuY3Rpb246OmFyZ19pdGVyYXRvciBpID0gZnVuYy0+YXJnX2JlZ2luKCk7Ci0gIGxsdm06OkZ1bmN0aW9uOjphcmdfaXRlcmF0b3IgZSA9IGZ1bmMtPmFyZ19lbmQoKTsKLSAgaWYgKHZpcnQpIHsKLSAgICBsbHZtOjpHZW5lcmljVmFsdWUgZ3Yob2JqKTsKLSAgICBndmFyZ3MucHVzaF9iYWNrKGd2KTsKLSAgICArK2k7Ci0gIH0KLSAgCi0gIGZvciAoIDtpICE9IGU7ICsraSwgKytpbmRleCkgewotICAgIGNvbnN0IGxsdm06OlR5cGUqIHR5cGUgPSBpLT5nZXRUeXBlKCk7Ci0gICAgaWYgKGxsdm06OmlzYTxsbHZtOjpQb2ludGVyVHlwZT4odHlwZSkgJiYgdHlwZSAhPSBsbHZtOjpQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKGxsdm06OlR5cGU6OmdldEludDhUeShsbHZtOjpnZXRHbG9iYWxDb250ZXh0KCkpKSkgewotICAgICAgbGx2bTo6R2VuZXJpY1ZhbHVlIGd2KGFyZ3MtPmVsZW1lbnRzW2luZGV4XSk7Ci0gICAgICBndmFyZ3MucHVzaF9iYWNrKGd2KTsKLSAgICB9IGVsc2UgewotICAgICAgZGVjYXBzdWxlUHJpbWl0aXZlKGFyZ3MtPmVsZW1lbnRzW2luZGV4XSwgdHlwZSwgZ3ZhcmdzKTsKLSAgICB9Ci0gIH0KLSAgCi0gIGxsdm06OkdlbmVyaWNWYWx1ZSBndjsKLSAgdHJ5ewotICAgIGd2ID0gbWV0aC0+Y29tcGlsZVRvTmF0aXZlKCktPmludm9rZUdlbmVyaWMoZ3ZhcmdzKTsKLSAgfWNhdGNoKC4uLikgewotICAgIGFzc2VydCgwKTsKLSAgfQotICAKLSAgZGVjbGFyZV9nY3Jvb3QoVk1PYmplY3QqLCByZXMpID0gMDsKLSAgVk1Db21tb25DbGFzcyogcmV0VHlwZSA9IG1ldGgtPnBhcmFtZXRlcnNbMF07Ci0KLSNkZWZpbmUgQ09OU1RSVUNUX1JFUyhuYW1lLCB0eXBlLCBndl9leHRyYWN0b3IpCQkJCQkJCQkJCVwKLQllbHNlIGlmKHJldFR5cGUgPT0gTVNDb3JsaWI6OnAjI25hbWUpIHsJCQkJCQkJCQkJCQkJXAotCQlyZXMgPSBNU0NvcmxpYjo6cCMjbmFtZS0+ZG9OZXcoKTsJCQkJCQkJCQkJCQkJCQlcCi0JCU1TQ29ybGliOjpjdG9yIyNuYW1lLT5zZXQjI25hbWUocmVzLCAodHlwZSlndi5ndl9leHRyYWN0b3IpOwlcCi0JfQotCi0gIGlmIChyZXRUeXBlID09IE1TQ29ybGliOjpwVm9pZCkgewotICAgIHJlcyA9IE1TQ29ybGliOjpwVm9pZC0+ZG9OZXcoKTsKLSAgfSBPTl9QUklNSVRJVkVTKENPTlNUUlVDVF9SRVMsIF9GX05URSkgZWxzZSB7Ci0gICAgaWYgKHJldFR5cGUtPnN1cGVyID09IE1TQ29ybGliOjpwVmFsdWUgfHwgcmV0VHlwZS0+c3VwZXIgPT0gTVNDb3JsaWI6OnBFbnVtKQotICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgcmVzID0gKFZNT2JqZWN0Kilndi5Qb2ludGVyVmFsOwotICB9Ci0gIAotICByZXR1cm4gcmVzOwotfQotCi0KLXN0YXRpYyBWTU9iamVjdCogY3JlYXRlUmVzb3VyY2VTdHJlYW0oQXNzZW1ibHkqIGFzcywgc2ludDMyIHBvc24pIHsKLSAgdWludDMyIHJlc1NpemUgPSBhc3MtPnJlc1NpemU7Ci0gIHVpbnQzMiByZXNSdmEgPSBhc3MtPnJlc1J2YTsKLSAgU2VjdGlvbiogdGV4dFNlY3Rpb24gPSBhc3MtPnRleHRTZWN0aW9uOwotICB1aW50MzIgc2VjdGlvbkxlbiA9IHJlc1NpemU7Ci0gIHVpbnQzMiBzZWN0aW9uID0gMDsKLSAgdWludDMyIHN0YXJ0ID0gMDsKLSAgdWludDMyIGxlbmd0aCA9IDA7Ci0gIHVpbnQzMiBwYWQgPSAwOwotICAKLSAgUmVhZGVyKiByZWFkZXIgPSBhc3MtPm5ld1JlYWRlcihhc3MtPmJ5dGVzKTsKLSAgc2VjdGlvbiA9IHRleHRTZWN0aW9uLT5yYXdBZGRyZXNzICsgKHJlc1J2YSAtIHRleHRTZWN0aW9uLT52aXJ0dWFsQWRkcmVzcyk7Ci0KLSAgcmVhZGVyLT5zZWVrKHNlY3Rpb24sIFJlYWRlcjo6U2Vla1NldCk7Ci0gIHdoaWxlIChwb3NuID4gMCkgewotICAgIGlmIChzZWN0aW9uTGVuIDwgNCkgcmV0dXJuIDA7Ci0gICAgbGVuZ3RoID0gcmVhZGVyLT5yZWFkVTQoKTsKLSAgICBpZiAobGVuZ3RoID4gKHNlY3Rpb25MZW4gLSA0KSkgcmV0dXJuIDA7Ci0gICAgaWYgKChsZW5ndGggJSA0KSAhPSAwKSB7Ci0gICAgICBwYWQgPSA0IC0gKGxlbmd0aCAlIDQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwYWQgPSAwOwotICAgIH0KLSAgICBzdGFydCA9IHN0YXJ0ICsgbGVuZ3RoICsgcGFkICsgNDsKLSAgICBzZWN0aW9uID0gc2VjdGlvbiArIGxlbmd0aCArIHBhZCArIDQ7Ci0gICAgcmVhZGVyLT5zZWVrKHNlY3Rpb24gKyBsZW5ndGggKyBwYWQgKyA0LCBSZWFkZXI6OlNlZWtTZXQpOwotICAgIHNlY3Rpb25MZW4gPSBzZWN0aW9uTGVuIC0gKGxlbmd0aCArIHBhZCArIDQpOwotICAgIHBvc24gPSBwb3NuIC0gMTsKLSAgfQotCi0gIHN0YXJ0ID0gc3RhcnQgKyA0OwotICBpZiAoc2VjdGlvbkxlbiA8IDQpIHJldHVybiAwOwotICBsZW5ndGggPSByZWFkZXItPnJlYWRVNCgpOwotICBpZiAobGVuZ3RoID4gKHNlY3Rpb25MZW4gLSA0KSkgcmV0dXJuIDA7Ci0KLSAgZGVjbGFyZV9nY3Jvb3QoVk1PYmplY3QqLCByZXMpID0gTVNDb3JsaWI6OnJlc291cmNlU3RyZWFtVHlwZS0+ZG9OZXcoKTsKLSAgTVNDb3JsaWI6OmN0b3JSZXNvdXJjZVN0cmVhbVR5cGUtPmNvbXBpbGVUb05hdGl2ZSgpLT5pbnZva2VWb2lkKHJlcywgYXNzLCAodWludDY0KXN0YXJ0LCAodWludDY0KWxlbmd0aCk7Ci0KLSAgcmV0dXJuIHJlczsKLX0KLSAgICAgIAotZXh0ZXJuICJDIiBWTU9iamVjdCogU3lzdGVtX1JlZmxlY3Rpb25fQXNzZW1ibHlfR2V0TWFuaWZlc3RSZXNvdXJjZVN0cmVhbShWTU9iamVjdCogQXNzLCBQTmV0U3RyaW5nKiBzdHIpIHsKLQlsbHZtX2djcm9vdChBc3MsIDApOwotCWxsdm1fZ2Nyb290KHN0ciwgMCk7Ci0gIEFzc2VtYmx5KiBhc3MgPSAoQXNzZW1ibHkqKU1TQ29ybGliOjphc3NlbWJseUFzc2VtYmx5UmVmbGVjdGlvbi0+Z2V0SW50UHRyKEFzcyk7Ci0gIE4zKiB2bSA9IChOMyopKFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKSk7Ci0JZGVjbGFyZV9nY3Jvb3QoY29uc3QgQXJyYXlDaGFyKiwgYXJyYXkpID0gc3RyLT52YWx1ZTsKLSAgY29uc3QgVVRGOCogaWQgPSB2bS0+YXJyYXlUb1VURjgoYXJyYXkpOwotICBIZWFkZXIqIGhlYWRlciA9IGFzcy0+Q0xJSGVhZGVyOwotICB1aW50MzIgc3RyaW5nT2Zmc2V0ID0gaGVhZGVyLT5zdHJpbmdTdHJlYW0tPnJlYWxPZmZzZXQ7Ci0gIFRhYmxlKiBtYW5UYWJsZSAgPSBoZWFkZXItPnRhYmxlc1tDT05TVEFOVF9NYW5pZmVzdFJlc291cmNlXTsKLSAgdWludDMyIG1hblJvd3MgICA9IG1hblRhYmxlLT5yb3dzTnVtYmVyOwotICBzaW50MzIgcG9zID0gLTE7Ci0gIHVpbnQzMiBpID0gMDsKLSAgCi0gIHdoaWxlICgocG9zID09IC0xKSAmJiAoaSA8IG1hblJvd3MpKSB7Ci0gICAgdWludDMyIG5hbWVPZmZzZXQgPSBtYW5UYWJsZS0+cmVhZEluZGV4SW5Sb3coaSArIDEsIENPTlNUQU5UX01BTklGRVNUX1JFU09VUkNFX05BTUUsIGFzcy0+Ynl0ZXMpOwotICAgIGNvbnN0IFVURjgqIG5hbWUgPSBhc3MtPnJlYWRTdHJpbmcodm0sIHN0cmluZ09mZnNldCArIG5hbWVPZmZzZXQpOwotCi0gICAgaWYgKG5hbWUgPT0gaWQpIHsKLSAgICAgIHBvcyA9IGk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICsraTsKLSAgICB9Ci0gIH0KLQotICBpZiAocG9zICE9IC0xKSB7Ci0JCWRlY2xhcmVfZ2Nyb290KFZNT2JqZWN0KiwgcmVzKSA9IGNyZWF0ZVJlc291cmNlU3RyZWFtKGFzcywgcG9zKTsKLSAgICByZXR1cm4gcmVzOwotICB9IGVsc2UgewotICAgIHJldHVybiAwOwotICB9Ci19Ci0KLQotZXh0ZXJuICJDIiBBcnJheU9iamVjdCogU3lzdGVtX1JlZmxlY3Rpb25fQ2xySGVscGVyc19HZXRDdXN0b21BdHRyaWJ1dGVzKEFzc2VtYmx5KiBhc3MsIFZNQ29tbW9uQ2xhc3MqIGNsclR5cGVQcml2YXRlLCBib29sIGluaGVyaXQpIHsKLQlkZWNsYXJlX2djcm9vdChBcnJheU9iamVjdCosIHJlcykgPSBhc3MtPmdldEN1c3RvbUF0dHJpYnV0ZXMoY2xyVHlwZVByaXZhdGUtPnRva2VuLCBjbHJUeXBlUHJpdmF0ZSk7Ci0gIHJldHVybiByZXM7Ci19Ci0KLWV4dGVybiAiQyIgVk1PYmplY3QqIFN5c3RlbV9HbG9iYWxpemF0aW9uX1RleHRJbmZvX1RvTG93ZXIoVk1PYmplY3QqIG9iaiwgUE5ldFN0cmluZyogc3RyKSB7Ci0JbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLQlsbHZtX2djcm9vdChzdHIsIDApOwotICB2ZXJpZnlOdWxsKHN0cik7Ci0gIGRlY2xhcmVfZ2Nyb290KGNvbnN0IEFycmF5Q2hhciosIGFycmF5KSA9IHN0ci0+dmFsdWU7Ci0gIHVpbnQzMiBsZW5ndGggPSBzdHItPmxlbmd0aDsKLQotICB1aW50MTYqIGJ1ZiA9ICh1aW50MTYqKWFsbG9jYShsZW5ndGggKiBzaXplb2YodWludDE2KSk7Ci0KLSAgTjMqIHZtID0gVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpOwotCi0gIG1lbWNweShidWYsIGFycmF5LT5lbGVtZW50cywgbGVuZ3RoICogc2l6ZW9mKHVpbnQxNikpOwotICBJTFVuaWNvZGVTdHJpbmdUb0xvd2VyKCh2b2lkKilidWYsICh2b2lkKilhcnJheS0+ZWxlbWVudHMsIGxlbmd0aCk7Ci0gIGRlY2xhcmVfZ2Nyb290KGNvbnN0IEFycmF5Q2hhciosIHJlcykgPSB2bS0+YnVmVG9BcnJheShidWYsIGxlbmd0aCk7Ci0gIGRlY2xhcmVfZ2Nyb290KFZNT2JqZWN0KiwgcmVzX3N0cikgPSB2bS0+YXJyYXlUb1N0cmluZyhyZXMpOwotCXJldHVybiByZXNfc3RyOwotfQotCi1leHRlcm4gIkMiIFZNT2JqZWN0KiBTeXN0ZW1fU3RyaW5nX1JlcGxhY2UoUE5ldFN0cmluZyogc3RyLCB1aW50MTYgYzEsIHVpbnQxNiBjMikgewotCWxsdm1fZ2Nyb290KHN0ciwgMCk7Ci0gIGRlY2xhcmVfZ2Nyb290KGNvbnN0IEFycmF5Q2hhciosIGFycmF5KSA9IHN0ci0+dmFsdWU7Ci0gIHVpbnQzMiBsZW5ndGggPSBzdHItPmxlbmd0aDsKLSAgaWYgKChjMSA9PSBjMikgfHwgbGVuZ3RoID09IDApIHJldHVybiBzdHI7Ci0KLSAgdWludDE2KiBidWYgPSAodWludDE2KilhbGxvY2EobGVuZ3RoICogc2l6ZW9mKHVpbnQxNikpOwotICBtZW1jcHkoYnVmLCBhcnJheS0+ZWxlbWVudHMsIGxlbmd0aCAqIHNpemVvZih1aW50MTYpKTsKLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewotICAgIGlmIChidWZbaV0gPT0gYzEpIGJ1ZltpXSA9IGMyOwotICB9Ci0gIAotICBOMyogdm0gPSAoTjMqKVZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKTsKLSAgZGVjbGFyZV9nY3Jvb3QoY29uc3QgQXJyYXlDaGFyKiwgcmVzKSA9IHZtLT5idWZUb0FycmF5KGJ1ZiwgbGVuZ3RoKTsKLSAgZGVjbGFyZV9nY3Jvb3QoVk1PYmplY3QqLCByZXNfc3RyKSA9IHZtLT5hcnJheVRvU3RyaW5nKHJlcyk7Ci0JcmV0dXJuIHJlc19zdHI7Ci19Ci0KLWV4dGVybiAiQyIgdWludDMyIFN5c3RlbV9SZWZsZWN0aW9uX0NsclJlc291cmNlU3RyZWFtX1Jlc291cmNlUmVhZChBc3NlbWJseSogYXNzZW1ibHksIHVpbnQ2NCBwb3NpdGlvbiwgQXJyYXlVSW50OCogYnVmZmVyLCB1aW50MzIgb2Zmc2V0LCB1aW50MzIgY291bnQpIHsKLQlsbHZtX2djcm9vdChidWZmZXIsIDApOwotICB1aW50MzIgcmVzUnZhID0gYXNzZW1ibHktPnJlc1J2YTsKLSAgQnl0ZUNvZGUqIGJ5dGVzID0gYXNzZW1ibHktPmJ5dGVzOwotICBTZWN0aW9uKiB0ZXh0U2VjdGlvbiA9IGFzc2VtYmx5LT50ZXh0U2VjdGlvbjsKLSAgdWludDMyIHNlY3Rpb24gPSAwOwotCi0gIHNlY3Rpb24gPSB0ZXh0U2VjdGlvbi0+cmF3QWRkcmVzcyArIChyZXNSdmEgLSB0ZXh0U2VjdGlvbi0+dmlydHVhbEFkZHJlc3MpOwotICBtZW1jcHkoJihidWZmZXItPmVsZW1lbnRzW29mZnNldF0pLCAmKGJ5dGVzLT5lbGVtZW50c1tzZWN0aW9uICsgcG9zaXRpb25dKSwgY291bnQpOwotCi0gIHJldHVybiBjb3VudDsKLX0KLQotZXh0ZXJuICJDIiBzaW50MzIgU3lzdGVtX1N0cmluZ19Db21wYXJlSW50ZXJuYWwoUE5ldFN0cmluZyogc3RyQSwgc2ludDMyIGluZGV4QSwgc2ludDMyIGxlbmd0aEEsIFBOZXRTdHJpbmcqIHN0ckIsIHNpbnQzMiBpbmRleEIsIHNpbnQzMiBsZW5ndGhCLCBib29sIGlnbm9yZUNhc2UpIHsKLQlsbHZtX2djcm9vdChzdHJBLCAwKTsKLQlsbHZtX2djcm9vdChzdHJCLCAwKTsKLQotICBpZiAoc3RyQSA9PSAwKSB7Ci0gICAgaWYgKHN0ckIgPT0gMCkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAtMTsKLSAgfSBlbHNlIGlmIChzdHJCID09IDApIHsKLSAgICByZXR1cm4gMTsKLSAgfSBlbHNlIHsKLSAgICBzaW50MzIgY21wID0gMDsKLSAgICBpZiAobGVuZ3RoQSA+PSBsZW5ndGhCKSB7Ci0gICAgICBpZiAoaWdub3JlQ2FzZSkgewotICAgICAgICBjbXAgPSBJTFVuaWNvZGVTdHJpbmdDb21wYXJlSWdub3JlQ2FzZSgodm9pZCopJihzdHJBLT52YWx1ZS0+ZWxlbWVudHNbaW5kZXhBXSksICh2b2lkKikmKHN0ckItPnZhbHVlLT5lbGVtZW50c1tpbmRleEJdKSwgbGVuZ3RoQik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjbXAgPSBJTFVuaWNvZGVTdHJpbmdDb21wYXJlTm9JZ25vcmVDYXNlKCh2b2lkKikmKHN0ckEtPnZhbHVlLT5lbGVtZW50c1tpbmRleEFdKSwgKHZvaWQqKSYoc3RyQi0+dmFsdWUtPmVsZW1lbnRzW2luZGV4Ql0pLCBsZW5ndGhCKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGNtcCAhPSAwKSByZXR1cm4gY21wOwotICAgICAgZWxzZSBpZiAobGVuZ3RoQSA+IGxlbmd0aEIpIHJldHVybiAxOwotICAgICAgZWxzZSByZXR1cm4gMDsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKGlnbm9yZUNhc2UpIHsKLSAgICAgICAgY21wID0gSUxVbmljb2RlU3RyaW5nQ29tcGFyZUlnbm9yZUNhc2UoKHZvaWQqKSYoc3RyQS0+dmFsdWUtPmVsZW1lbnRzW2luZGV4QV0pLCAodm9pZCopJihzdHJCLT52YWx1ZS0+ZWxlbWVudHNbaW5kZXhCXSksIGxlbmd0aEEpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY21wID0gSUxVbmljb2RlU3RyaW5nQ29tcGFyZU5vSWdub3JlQ2FzZSgodm9pZCopJihzdHJBLT52YWx1ZS0+ZWxlbWVudHNbaW5kZXhBXSksICh2b2lkKikmKHN0ckItPnZhbHVlLT5lbGVtZW50c1tpbmRleEJdKSwgbGVuZ3RoQSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChjbXAgIT0gMCkgcmV0dXJuIGNtcDsKLSAgICAgIGVsc2UgcmV0dXJuIC0xOwotICAgIH0KLSAgfQotfQotCi1leHRlcm4gIkMiIHZvaWQgU3lzdGVtX1N0cmluZ19DaGFyRmlsbChQTmV0U3RyaW5nKiBzdHIsIHNpbnQzMiBzdGFydCwgc2ludDMyIGNvdW50LCBjaGFyIGNoKSB7Ci0JbGx2bV9nY3Jvb3Qoc3RyLCAwKTsKLSAgZGVjbGFyZV9nY3Jvb3QoY29uc3QgQXJyYXlDaGFyKiwgYXJyYXkpID0gc3RyLT52YWx1ZTsKLSAgc2ludDMyIGxlbmd0aCA9IHN0YXJ0ICsgY291bnQ7Ci0gIHVpbnQxNiogYnVmID0gKHVpbnQxNiopYWxsb2NhKGxlbmd0aCAqIHNpemVvZih1aW50MTYpKTsKLQotICBtZW1jcHkoYnVmLCBhcnJheS0+ZWxlbWVudHMsIHN0YXJ0ICogc2l6ZW9mKHVpbnQxNikpOwotICBmb3IgKHNpbnQzMiBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICBidWZbaSArIHN0YXJ0XSA9IGNoOwotICB9Ci0gIAotICBOMyogdm0gPSBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCk7Ci0gIGRlY2xhcmVfZ2Nyb290KGNvbnN0IEFycmF5Q2hhciosIHZhbCkgPSB2bS0+YnVmVG9BcnJheShidWYsIGxlbmd0aCk7Ci0gIHN0ci0+dmFsdWUgPSB2YWw7Ci0gIHN0ci0+bGVuZ3RoID0gbGVuZ3RoOwotfQotCi0KLWV4dGVybiAiQyIgc2ludDMyIFN5c3RlbV9TdHJpbmdfSW50ZXJuYWxPcmRpbmFsKFBOZXRTdHJpbmcgKnN0ckEsIHNpbnQzMiBpbmRleEEsIHNpbnQzMiBsZW5ndGhBLAotCQkJCQkJUE5ldFN0cmluZyAqc3RyQiwgc2ludDMyIGluZGV4Qiwgc2ludDMyIGxlbmd0aEIpIHsKLQlsbHZtX2djcm9vdChzdHJBLCAwKTsKLQlsbHZtX2djcm9vdChzdHJCLCAwKTsKLQljb25zdCB1aW50MTYgKmJ1ZkE7Ci0JY29uc3QgdWludDE2ICpidWZCOwotCi0JLyogSGFuZGxlIHRoZSBlYXN5IGNhc2VzIGZpcnN0ICovCi0JaWYoIXN0ckEpCi0JewotCQlpZighc3RyQikKLQkJewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JZWxzZSBpZighc3RyQikKLQl7Ci0JCXJldHVybiAxOwotCX0KLQotCS8qIENvbXBhcmUgdGhlIHR3byBzdHJpbmdzICovCi0JYnVmQSA9ICYoc3RyQS0+dmFsdWUtPmVsZW1lbnRzW2luZGV4QV0pOwotCWJ1ZkIgPSAmKHN0ckItPnZhbHVlLT5lbGVtZW50c1tpbmRleEJdKTsKLQl3aGlsZShsZW5ndGhBID4gMCAmJiBsZW5ndGhCID4gMCkKLQl7Ci0JCWlmKCpidWZBIDwgKmJ1ZkIpCi0JCXsKLQkJCXJldHVybiAtMTsKLQkJfQotCQllbHNlIGlmKCpidWZBID4gKmJ1ZkIpCi0JCXsKLQkJCXJldHVybiAxOwotCQl9Ci0JCSsrYnVmQTsKLQkJKytidWZCOwotCQktLWxlbmd0aEE7Ci0JCS0tbGVuZ3RoQjsKLQl9Ci0KLQkvKiBEZXRlcm1pbmUgdGhlIG9yZGVyaW5nIGJhc2VkIG9uIHRoZSB0YWlsIHNlY3Rpb25zICovCi0JaWYobGVuZ3RoQSA+IDApCi0JewotCQlyZXR1cm4gMTsKLQl9Ci0JZWxzZSBpZihsZW5ndGhCID4gMCkKLQl7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZWxzZQotCXsKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi1leHRlcm4gIkMiIFZNT2JqZWN0KiBTeXN0ZW1fVGhyZWFkaW5nX1RocmVhZF9JbnRlcm5hbEN1cnJlbnRUaHJlYWQoKSB7Ci0JZGVjbGFyZV9nY3Jvb3QoVk1PYmplY3QqLCBhcHBUaHJlYWQpID0gVk1UaHJlYWQ6OmdldCgpLT5vb29fYXBwVGhyZWFkOwotICByZXR1cm4gYXBwVGhyZWFkOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL04zL1BOZXRMaWIvUE5ldExpYi5oIGIvdm1raXQvbGliL04zL1BOZXRMaWIvUE5ldExpYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2UyMWNhLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9OMy9QTmV0TGliL1BOZXRMaWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0gUE5ldExpYi5oIC0gUE5ldExpYiBpbnRlcmZhY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMwotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLQotI2lmbmRlZiBOM19QTkVUTElCX0gKLSNkZWZpbmUgTjNfUE5FVExJQl9ICi0KLSNpbmNsdWRlICJWTU9iamVjdC5oIgotCi0KLW5hbWVzcGFjZSBuMyB7Ci0KLWNsYXNzIFBOZXRTdHJpbmc7Ci0KLWNsYXNzIFN0cmluZ0J1aWxkZXIgOiBwdWJsaWMgVk1PYmplY3QgewotcHVibGljOgotICBQTmV0U3RyaW5nKiBidWlsZFN0cmluZzsKLSAgc2ludDMyIG1heENhcGFjdGl5OwotICBzaW50MzIgbmVlZHNDb3B5OwotfTsKLQotfQotCi0jZW5kaWYgCmRpZmYgLS1naXQgYS92bWtpdC9saWIvTjMvUE5ldExpYi9QTmV0TVNDb3JsaWIuY3BwIGIvdm1raXQvbGliL04zL1BOZXRMaWIvUE5ldE1TQ29ybGliLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYyNTAwNi4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTjMvUE5ldExpYi9QTmV0TVNDb3JsaWIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8vPT09LS0tLS0gUE5ldE1TQ29ybGliLmNwcCAtIFRoZSBQbmV0IE1TQ29ybGliIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMwotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLQotI2luY2x1ZGUgIm12bS9KSVQuaCIKLQotI2luY2x1ZGUgIkFzc2VtYmx5LmgiCi0jaW5jbHVkZSAiTVNDb3JsaWIuaCIKLSNpbmNsdWRlICJOMy5oIgotI2luY2x1ZGUgIlZNQ2xhc3MuaCIKLSNpbmNsdWRlICJWTU9iamVjdC5oIgotI2luY2x1ZGUgIlZNVGhyZWFkLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBuMzsKLQotdm9pZCBNU0NvcmxpYjo6bG9hZFN0cmluZ0NsYXNzKE4zKiB2bSkgewotICBWTUNsYXNzKiB0eXBlID0gKFZNQ2xhc3MqKXZtLT5jb3JlQXNzZW1ibHktPmxvYWRUeXBlRnJvbU5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0tPmFzY2lpelRvVVRGOCgiU3RyaW5nIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0tPmFzY2lpelRvVVRGOCgiU3lzdGVtIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gIE1TQ29ybGliOjpwU3RyaW5nID0gdHlwZTsKLSAgTVNDb3JsaWI6OnBPYmplY3QtPnJlc29sdmVUeXBlKHRydWUsIGZhbHNlLCBOVUxMKTsKLSAgTVNDb3JsaWI6OnBPYmplY3QtPnJlc29sdmVWVCgpOwotICB0eXBlLT5yZXNvbHZlVHlwZSh0cnVlLCBmYWxzZSwgTlVMTCk7Ci0gIHR5cGUtPnJlc29sdmVWVCgpOwotCi0gIHVpbnQ2NCBzaXplID0gbXZtOjpNdm1Nb2R1bGU6OmdldFR5cGVTaXplKHR5cGUtPnZpcnR1YWxUeXBlLT5nZXRDb250YWluZWRUeXBlKDApKSArIHNpemVvZihjb25zdCBVVEY4KikgKyBzaXplb2YobGx2bTo6R2xvYmFsVmFyaWFibGUqKTsKLSAgdHlwZS0+dmlydHVhbEluc3RhbmNlID0gCi0gICAgKFZNT2JqZWN0KilnYzo6b3BlcmF0b3IgbmV3KHNpemUsIFZNT2JqZWN0OjpnZXROM1ZpcnR1YWxUYWJsZSh0eXBlLT52aXJ0dWFsSW5zdGFuY2UpKTsKLQlWTU9iamVjdDo6aW5pdGlhbGlzZSh0eXBlLT52aXJ0dWFsSW5zdGFuY2UsIHR5cGUpOwotfQotCi0KLXZvaWQgTVNDb3JsaWI6OmluaXRpYWxpc2UoTjMqIHZtKSB7Ci0gICNkZWZpbmUgSU5JVCh2YXIsIG5hbWVTcGFjZSwgbmFtZSwgdHlwZSwgcHJpbSkge1wKLSAgdmFyID0gKFZNQ2xhc3MqKXZtLT5jb3JlQXNzZW1ibHktPmxvYWRUeXBlRnJvbU5hbWUoIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bS0+YXNjaWl6VG9VVEY4KG5hbWUpLCAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLT5hc2NpaXpUb1VURjgobmFtZVNwYWNlKSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7IFwKLSAgdmFyLT5pc1ByaW1pdGl2ZSA9IHByaW07IFwKLSAgaWYgKHR5cGUpIHsgXAotICAgIHZhci0+bmF0dXJhbFR5cGUgPSB0eXBlOyAgXAotICAgIHZhci0+dmlydHVhbFR5cGUgPSB0eXBlOyAgXAotICB9fQotCi0gIElOSVQoTVNDb3JsaWI6OmNsclR5cGUsICAgIlN5c3RlbS5SZWZsZWN0aW9uIiwgIkNsclR5cGUiLCAwLCBmYWxzZSk7Ci0gIElOSVQoTVNDb3JsaWI6OmFzc2VtYmx5UmVmbGVjdGlvbiwgICAiU3lzdGVtLlJlZmxlY3Rpb24iLCAiQXNzZW1ibHkiLCAwLCBmYWxzZSk7Ci0gIElOSVQoTVNDb3JsaWI6OnR5cGVkUmVmZXJlbmNlLCAgICJTeXN0ZW0iLCAiVHlwZWRSZWZlcmVuY2UiLCAwLCBmYWxzZSk7Ci0gIElOSVQoTVNDb3JsaWI6OnByb3BlcnR5VHlwZSwgICAiU3lzdGVtLlJlZmxlY3Rpb24iLCAiQ2xyUHJvcGVydHkiLCAwLCBmYWxzZSk7Ci0gIElOSVQoTVNDb3JsaWI6Om1ldGhvZFR5cGUsICAgIlN5c3RlbS5SZWZsZWN0aW9uIiwgIkNsck1ldGhvZCIsIDAsIGZhbHNlKTsKLSAgSU5JVChNU0NvcmxpYjo6cmVzb3VyY2VTdHJlYW1UeXBlLCAgICJTeXN0ZW0uUmVmbGVjdGlvbiIsICJDbHJSZXNvdXJjZVN0cmVhbSIsIDAsIGZhbHNlKTsKLQotI3VuZGVmIElOSVQKLSAgCi0gIHsKLSAgTVNDb3JsaWI6OmNsclR5cGUtPnJlc29sdmVUeXBlKGZhbHNlLCBmYWxzZSwgTlVMTCk7Ci0gIHN0ZDo6dmVjdG9yPFZNQ29tbW9uQ2xhc3MqPiBhcmdzOwotICBhcmdzLnB1c2hfYmFjayhNU0NvcmxpYjo6cFZvaWQpOwotICBhcmdzLnB1c2hfYmFjayhNU0NvcmxpYjo6Y2xyVHlwZSk7Ci0gIE1TQ29ybGliOjpjdG9yQ2xyVHlwZSA9IE1TQ29ybGliOjpjbHJUeXBlLT5sb29rdXBNZXRob2Qodm0tPmFzY2lpelRvVVRGOCgiLmN0b3IiKSwgYXJncywgZmFsc2UsIGZhbHNlKTsKLSAgTVNDb3JsaWI6OnR5cGVDbHJUeXBlID0gTVNDb3JsaWI6OmNsclR5cGUtPmxvb2t1cEZpZWxkKHZtLT5hc2NpaXpUb1VURjgoInByaXZhdGVEYXRhIiksIE1TQ29ybGliOjpwSW50UHRyLCBmYWxzZSwgZmFsc2UpOwotICB9Ci0KLSAgewotICBNU0NvcmxpYjo6YXNzZW1ibHlSZWZsZWN0aW9uLT5yZXNvbHZlVHlwZShmYWxzZSwgZmFsc2UsIE5VTEwpOwotICBzdGQ6OnZlY3RvcjxWTUNvbW1vbkNsYXNzKj4gYXJnczsKLSAgYXJncy5wdXNoX2JhY2soTVNDb3JsaWI6OnBWb2lkKTsKLSAgYXJncy5wdXNoX2JhY2soTVNDb3JsaWI6OmFzc2VtYmx5UmVmbGVjdGlvbik7Ci0gIE1TQ29ybGliOjpjdG9yQXNzZW1ibHlSZWZsZWN0aW9uID0gTVNDb3JsaWI6OmFzc2VtYmx5UmVmbGVjdGlvbi0+bG9va3VwTWV0aG9kKHZtLT5hc2NpaXpUb1VURjgoIi5jdG9yIiksIGFyZ3MsIGZhbHNlLCBmYWxzZSk7Ci0gIE1TQ29ybGliOjphc3NlbWJseUFzc2VtYmx5UmVmbGVjdGlvbiA9IE1TQ29ybGliOjphc3NlbWJseVJlZmxlY3Rpb24tPmxvb2t1cEZpZWxkKHZtLT5hc2NpaXpUb1VURjgoInByaXZhdGVEYXRhIiksIE1TQ29ybGliOjpwSW50UHRyLCBmYWxzZSwgZmFsc2UpOwotICB9Ci0gIAotICB7Ci0gIE1TQ29ybGliOjpwcm9wZXJ0eVR5cGUtPnJlc29sdmVUeXBlKGZhbHNlLCBmYWxzZSwgTlVMTCk7Ci0gIHN0ZDo6dmVjdG9yPFZNQ29tbW9uQ2xhc3MqPiBhcmdzOwotICBhcmdzLnB1c2hfYmFjayhNU0NvcmxpYjo6cFZvaWQpOwotICBhcmdzLnB1c2hfYmFjayhNU0NvcmxpYjo6cHJvcGVydHlUeXBlKTsKLSAgTVNDb3JsaWI6OmN0b3JQcm9wZXJ0eVR5cGUgPSBNU0NvcmxpYjo6cHJvcGVydHlUeXBlLT5sb29rdXBNZXRob2Qodm0tPmFzY2lpelRvVVRGOCgiLmN0b3IiKSwgYXJncywgZmFsc2UsIGZhbHNlKTsKLSAgTVNDb3JsaWI6OnByb3BlcnR5UHJvcGVydHlUeXBlID0gTVNDb3JsaWI6OnByb3BlcnR5VHlwZS0+bG9va3VwRmllbGQodm0tPmFzY2lpelRvVVRGOCgicHJpdmF0ZURhdGEiKSwgTVNDb3JsaWI6OnBJbnRQdHIsIGZhbHNlLCBmYWxzZSk7Ci0gIH0KLSAgCi0gIHsKLSAgTVNDb3JsaWI6Om1ldGhvZFR5cGUtPnJlc29sdmVUeXBlKGZhbHNlLCBmYWxzZSwgTlVMTCk7Ci0gIHN0ZDo6dmVjdG9yPFZNQ29tbW9uQ2xhc3MqPiBhcmdzOwotICBhcmdzLnB1c2hfYmFjayhNU0NvcmxpYjo6cFZvaWQpOwotICBhcmdzLnB1c2hfYmFjayhNU0NvcmxpYjo6bWV0aG9kVHlwZSk7Ci0gIE1TQ29ybGliOjpjdG9yTWV0aG9kVHlwZSA9IE1TQ29ybGliOjptZXRob2RUeXBlLT5sb29rdXBNZXRob2Qodm0tPmFzY2lpelRvVVRGOCgiLmN0b3IiKSwgYXJncywgZmFsc2UsIGZhbHNlKTsKLSAgTVNDb3JsaWI6Om1ldGhvZE1ldGhvZFR5cGUgPSBNU0NvcmxpYjo6bWV0aG9kVHlwZS0+bG9va3VwRmllbGQodm0tPmFzY2lpelRvVVRGOCgicHJpdmF0ZURhdGEiKSwgTVNDb3JsaWI6OnBJbnRQdHIsIGZhbHNlLCBmYWxzZSk7Ci0gIH0KLSAgCi0gIHsKLSAgTVNDb3JsaWI6OnJlc291cmNlU3RyZWFtVHlwZS0+cmVzb2x2ZVR5cGUoZmFsc2UsIGZhbHNlLCBOVUxMKTsKLSAgc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+IGFyZ3M7Ci0gIGFyZ3MucHVzaF9iYWNrKE1TQ29ybGliOjpwVm9pZCk7Ci0gIGFyZ3MucHVzaF9iYWNrKE1TQ29ybGliOjpyZXNvdXJjZVN0cmVhbVR5cGUpOwotICBhcmdzLnB1c2hfYmFjayhNU0NvcmxpYjo6cEludFB0cik7Ci0gIGFyZ3MucHVzaF9iYWNrKE1TQ29ybGliOjpwU0ludDY0KTsKLSAgYXJncy5wdXNoX2JhY2soTVNDb3JsaWI6OnBTSW50NjQpOwotICBNU0NvcmxpYjo6Y3RvclJlc291cmNlU3RyZWFtVHlwZSA9IE1TQ29ybGliOjpyZXNvdXJjZVN0cmVhbVR5cGUtPmxvb2t1cE1ldGhvZCh2bS0+YXNjaWl6VG9VVEY4KCIuY3RvciIpLCBhcmdzLCBmYWxzZSwgZmFsc2UpOwotICB9Ci0gIAotICBWTUNvbW1vbkNsYXNzKiB2b2lkUHRyID0gdm0tPmNvcmVBc3NlbWJseS0+Y29uc3RydWN0UG9pbnRlcihNU0NvcmxpYjo6cFZvaWQsIDEpOwotI2RlZmluZSBJTklUKHZhciwgY2wsIHR5cGUpIHtcCi0gICAgY2wtPnJlc29sdmVUeXBlKGZhbHNlLCBmYWxzZSwgTlVMTCk7IFwKLSAgICB2YXIgPSBjbC0+bG9va3VwRmllbGQodm0tPmFzY2lpelRvVVRGOCgidmFsdWVfIiksIHR5cGUsIGZhbHNlLCBmYWxzZSk7IFwKLSAgfQotICAKLSAgSU5JVChNU0NvcmxpYjo6Y3RvckJvb2xlYW4sICBNU0NvcmxpYjo6cEJvb2xlYW4sIE1TQ29ybGliOjpwQm9vbGVhbik7Ci0gIElOSVQoTVNDb3JsaWI6OmN0b3JVSW50OCwgTVNDb3JsaWI6OnBVSW50OCwgTVNDb3JsaWI6OnBVSW50OCk7Ci0gIElOSVQoTVNDb3JsaWI6OmN0b3JTSW50OCwgTVNDb3JsaWI6OnBTSW50OCwgTVNDb3JsaWI6OnBTSW50OCk7Ci0gIElOSVQoTVNDb3JsaWI6OmN0b3JDaGFyLCAgTVNDb3JsaWI6OnBDaGFyLCBNU0NvcmxpYjo6cENoYXIpOwotICBJTklUKE1TQ29ybGliOjpjdG9yU0ludDE2LCBNU0NvcmxpYjo6cFNJbnQxNiwgTVNDb3JsaWI6OnBTSW50MTYpOwotICBJTklUKE1TQ29ybGliOjpjdG9yVUludDE2LCBNU0NvcmxpYjo6cFVJbnQxNiwgTVNDb3JsaWI6OnBVSW50MTYpOwotICBJTklUKE1TQ29ybGliOjpjdG9yU0ludDMyLCBNU0NvcmxpYjo6cFNJbnQzMiwgTVNDb3JsaWI6OnBTSW50MzIpOwotICBJTklUKE1TQ29ybGliOjpjdG9yVUludDMyLCBNU0NvcmxpYjo6cFVJbnQzMiwgTVNDb3JsaWI6OnBVSW50MzIpOwotICBJTklUKE1TQ29ybGliOjpjdG9yU0ludDY0LCBNU0NvcmxpYjo6cFNJbnQ2NCwgTVNDb3JsaWI6OnBTSW50NjQpOwotICBJTklUKE1TQ29ybGliOjpjdG9yVUludDY0LCBNU0NvcmxpYjo6cFVJbnQ2NCwgTVNDb3JsaWI6OnBVSW50NjQpOwotICBJTklUKE1TQ29ybGliOjpjdG9ySW50UHRyLCBNU0NvcmxpYjo6cEludFB0ciwgdm9pZFB0cik7Ci0gIElOSVQoTVNDb3JsaWI6OmN0b3JVSW50UHRyLCBNU0NvcmxpYjo6cFVJbnRQdHIsIHZvaWRQdHIpOwotICBJTklUKE1TQ29ybGliOjpjdG9yRG91YmxlLCBNU0NvcmxpYjo6cERvdWJsZSwgTVNDb3JsaWI6OnBEb3VibGUpOwotICBJTklUKE1TQ29ybGliOjpjdG9yRmxvYXQsIE1TQ29ybGliOjpwRmxvYXQsIE1TQ29ybGliOjpwRmxvYXQpOwotCi0jdW5kZWYgSU5JVAotCi0KLX0KLQotVk1PYmplY3QqIFByb3BlcnR5OjpnZXRQcm9wZXJ0eURlbGVnYXRlZSgpIHsKLQlkZWNsYXJlX2djcm9vdChWTU9iamVjdCosIGRlbGVnYXRlZSkgPSBvb29fZGVsZWdhdGVlOwotCi0gIGlmICghZGVsZWdhdGVlKSB7Ci0gICAgb29vX2RlbGVnYXRlZSA9IGRlbGVnYXRlZSA9IE1TQ29ybGliOjpwcm9wZXJ0eVR5cGUtPmRvTmV3KCk7Ci0gICAgTVNDb3JsaWI6OmN0b3JQcm9wZXJ0eVR5cGUtPmNvbXBpbGVUb05hdGl2ZSgpLT5pbnZva2VWb2lkKGRlbGVnYXRlZSk7Ci0gICAgTVNDb3JsaWI6OnByb3BlcnR5UHJvcGVydHlUeXBlLT5zZXRJbnRQdHIoZGVsZWdhdGVlLCAoaW50Kil0aGlzKTsKLSAgfQotCi0gIHJldHVybiBkZWxlZ2F0ZWU7Ci19Ci0KLVZNT2JqZWN0KiBWTU1ldGhvZDo6Z2V0TWV0aG9kRGVsZWdhdGVlKCkgewotCWRlY2xhcmVfZ2Nyb290KFZNT2JqZWN0KiwgZGVsZWdhdGVlKSA9IG9vb19kZWxlZ2F0ZWU7Ci0KLSAgaWYgKCFkZWxlZ2F0ZWUpIHsKLSAgICBvb29fZGVsZWdhdGVlID0gZGVsZWdhdGVlID0gTVNDb3JsaWI6Om1ldGhvZFR5cGUtPmRvTmV3KCk7Ci0gICAgTVNDb3JsaWI6OmN0b3JNZXRob2RUeXBlLT5jb21waWxlVG9OYXRpdmUoKS0+aW52b2tlVm9pZChkZWxlZ2F0ZWUpOwotICAgIE1TQ29ybGliOjptZXRob2RNZXRob2RUeXBlLT5zZXRJbnRQdHIoZGVsZWdhdGVlLCAoaW50Kil0aGlzKTsKLSAgfQotCi0gIHJldHVybiBkZWxlZ2F0ZWU7Ci19Ci0KLVZNT2JqZWN0KiBWTUNvbW1vbkNsYXNzOjpnZXRDbGFzc0RlbGVnYXRlZSgpIHsKLQlkZWNsYXJlX2djcm9vdChWTU9iamVjdCosIGRlbGVnYXRlZSkgPSBvb29fZGVsZWdhdGVlOwotCi0gIGlmICghZGVsZWdhdGVlKSB7Ci0gICAgb29vX2RlbGVnYXRlZSA9IGRlbGVnYXRlZSA9IE1TQ29ybGliOjpjbHJUeXBlLT5kb05ldygpOwotICAgIE1TQ29ybGliOjpjdG9yQ2xyVHlwZS0+Y29tcGlsZVRvTmF0aXZlKCktPmludm9rZVZvaWQoZGVsZWdhdGVlKTsKLSAgICBNU0NvcmxpYjo6dHlwZUNsclR5cGUtPnNldEludFB0cihkZWxlZ2F0ZWUsIChpbnQqKXRoaXMpOwotICB9Ci0KLSAgcmV0dXJuIGRlbGVnYXRlZTsKLX0KLQotVk1PYmplY3QqIEFzc2VtYmx5OjpnZXRBc3NlbWJseURlbGVnYXRlZSgpIHsKLQlkZWNsYXJlX2djcm9vdChWTU9iamVjdCosIGRlbGVnYXRlZSkgPSBvb29fZGVsZWdhdGVlOwotCi0gIGlmICghZGVsZWdhdGVlKSB7Ci0gICAgb29vX2RlbGVnYXRlZSA9IGRlbGVnYXRlZSA9IE1TQ29ybGliOjphc3NlbWJseVJlZmxlY3Rpb24tPmRvTmV3KCk7Ci0gICAgTVNDb3JsaWI6OmN0b3JBc3NlbWJseVJlZmxlY3Rpb24tPmNvbXBpbGVUb05hdGl2ZSgpLT5pbnZva2VWb2lkKGRlbGVnYXRlZSk7Ci0gICAgTVNDb3JsaWI6OmFzc2VtYmx5QXNzZW1ibHlSZWZsZWN0aW9uLT5zZXRJbnRQdHIoZGVsZWdhdGVlLCAoaW50Kil0aGlzKTsKLSAgfQotCi0gIHJldHVybiBkZWxlZ2F0ZWU7Ci19Ci0KLXN0YXRpYyB2b2lkIG1hcEluaXRpYWxUaHJlYWQoTjMqIHZtKSB7Ci0gIFZNQ2xhc3MqIGNsID0gKFZNQ2xhc3MqKXZtLT5jb3JlQXNzZW1ibHktPmxvYWRUeXBlRnJvbU5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0tPmFzY2lpelRvVVRGOCgiVGhyZWFkIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm0tPmFzY2lpelRvVVRGOCgiU3lzdGVtLlRocmVhZGluZyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIHRydWUsIHRydWUsIHRydWUpOwotCWRlY2xhcmVfZ2Nyb290KFZNT2JqZWN0KiwgYXBwVGhyZWFkKSA9IGNsLT5kb05ldygpOwotCi0gIHN0ZDo6dmVjdG9yPFZNQ29tbW9uQ2xhc3MqPiBhcmdzOwotICBhcmdzLnB1c2hfYmFjayhNU0NvcmxpYjo6cFZvaWQpOwotICBhcmdzLnB1c2hfYmFjayhjbCk7Ci0gIGFyZ3MucHVzaF9iYWNrKE1TQ29ybGliOjpwSW50UHRyKTsKLSAgVk1NZXRob2QqIGN0b3IgPSBjbC0+bG9va3VwTWV0aG9kKHZtLT5hc2NpaXpUb1VURjgoIi5jdG9yIiksIGFyZ3MsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKLSAgVk1UaHJlYWQqIG15dGggPSBWTVRocmVhZDo6Z2V0KCk7Ci0gIGN0b3ItPmNvbXBpbGVUb05hdGl2ZSgpLT5pbnZva2VWb2lkKGFwcFRocmVhZCwgbXl0aCk7Ci0gIG15dGgtPm9vb19hcHBUaHJlYWQgPSBhcHBUaHJlYWQ7Ci19Ci0KLXZvaWQgTVNDb3JsaWI6OmxvYWRCb290c3RyYXAoTjMqIHZtKSB7Ci0gIG1hcEluaXRpYWxUaHJlYWQodm0pOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL04zL1BOZXRMaWIvUE5ldFBhdGguaW5jLmluIGIvdm1raXQvbGliL04zL1BOZXRMaWIvUE5ldFBhdGguaW5jLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTgyMTZjLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9OMy9QTmV0TGliL1BOZXRQYXRoLmluYy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLSBQTmV0UGF0aC5oIC0gQ29uZmlndXJhdGlvbiBmb3IgcG5ldGxpYiAtLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMwotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJNU0NvcmxpYi5oIgotCi11c2luZyBuYW1lc3BhY2UgbjM7Ci0KLWNvbnN0IGNoYXIqIE1TQ29ybGliOjpsaWJzUGF0aCAgPSAgIkBwbmV0bGlicGF0aEAvIjsKLQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL04zL1BOZXRMaWIvUE5ldFN0cmluZy5jcHAgYi92bWtpdC9saWIvTjMvUE5ldExpYi9QTmV0U3RyaW5nLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZlNGE3Yi4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTjMvUE5ldExpYi9QTmV0U3RyaW5nLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vPT09LS0tIFBOZXRTdHJpbmcuY3BwIC0gSW1wbGVtZW50YXRpb24gb2YgUE5ldCBzdHJpbmcgaW50ZXJmYWNlIC0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4zCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCi0jaW5jbHVkZSAibGx2bS9HbG9iYWxWYXJpYWJsZS5oIgotI2luY2x1ZGUgImxsdm0vTExWTUNvbnRleHQuaCIKLQotI2luY2x1ZGUgIm12bS9KSVQuaCIKLQotI2luY2x1ZGUgIkNMSVN0cmluZy5oIgotI2luY2x1ZGUgIk1TQ29ybGliLmgiCi0jaW5jbHVkZSAiTjMuaCIKLSNpbmNsdWRlICJQTmV0U3RyaW5nLmgiCi0jaW5jbHVkZSAiVk1BcnJheS5oIgotI2luY2x1ZGUgIlZNQ2xhc3MuaCIKLSNpbmNsdWRlICJWTVRocmVhZC5oIgotCi11c2luZyBuYW1lc3BhY2UgbjM7Ci11c2luZyBuYW1lc3BhY2UgbGx2bTsKLQotCi1DTElTdHJpbmcqIENMSVN0cmluZzo6c3RyaW5nRHVwKGNvbnN0IEFycmF5Q2hhciogYXJyYXksIE4zKiB2bSkgewotCWxsdm1fZ2Nyb290KGFycmF5LCAwKTsKLSAgZGVjbGFyZV9nY3Jvb3QoUE5ldFN0cmluZyosIG9iaikgPSAoUE5ldFN0cmluZyopTVNDb3JsaWI6OnBTdHJpbmctPmRvTmV3KCk7Ci0gIG9iai0+Y2FwYWNpdHkgPSBhcnJheS0+c2l6ZTsKLSAgb2JqLT5sZW5ndGggPSBhcnJheS0+c2l6ZTsKLSAgaWYgKGFycmF5LT5zaXplID09IDApIHsKLSAgICBvYmotPmZpcnN0Q2hhciA9IDA7Ci0gIH0gZWxzZSB7Ci0gICAgb2JqLT5maXJzdENoYXIgPSBhcnJheS0+ZWxlbWVudHNbMF07Ci0gIH0KLSAgb2JqLT52YWx1ZSA9IGFycmF5OyAKLSAgcmV0dXJuIG9iajsKLX0KLQotR2xvYmFsVmFyaWFibGUqIENMSVN0cmluZzo6bGx2bVZhcihDTElTdHJpbmcgKnNlbGYpIHsKLQlsbHZtX2djcm9vdChzZWxmLCAwKTsKLSAgZGVjbGFyZV9nY3Jvb3QoUE5ldFN0cmluZyosIHN0cikgPSAoUE5ldFN0cmluZyopc2VsZjsKLSAgaWYgKCFzdHItPl9sbHZtVmFyKSB7Ci0gICAgTjMqIHZtID0gVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpOwotICAgIGlmICghc3RyLT5fbGx2bVZhcikgewotICAgICAgY29uc3QgVHlwZSogcHR5ID0gUG9pbnRlclR5cGU6OmdldFVucXVhbChUeXBlOjpnZXRJbnQ4VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSk7Ci0gICAgICBDb25zdGFudCogY29ucyA9IAotICAgICAgICBDb25zdGFudEV4cHI6OmdldEludFRvUHRyKENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50NjRUeShnZXRHbG9iYWxDb250ZXh0KCkpLCB1aW50NjRfdCAoc2VsZikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0eSk7Ci0gICAgICBzdHItPl9sbHZtVmFyID0gbmV3IEdsb2JhbFZhcmlhYmxlKCoodm0tPmdldExMVk1Nb2R1bGUoKSksIHB0eSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhbHVlOjpFeHRlcm5hbExpbmthZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zLCAiIik7Ci0gICAgfQotICB9Ci0gIHJldHVybiBzdHItPl9sbHZtVmFyOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL04zL1BOZXRMaWIvUE5ldFN0cmluZy5oIGIvdm1raXQvbGliL04zL1BOZXRMaWIvUE5ldFN0cmluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzc5YTUyLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9OMy9QTmV0TGliL1BOZXRTdHJpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLSBQTmV0U3RyaW5nLmggLSBTdHJpbmcgcmVwcmVzZW50YXRpb24gaW4gUE5ldCAtLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjMKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIE4zX1BORVRfU1RSSU5HX0gKLSNkZWZpbmUgTjNfUE5FVF9TVFJJTkdfSAotCi0jaW5jbHVkZSAibGx2bS9HbG9iYWxWYXJpYWJsZS5oIgotCi0jaW5jbHVkZSAidHlwZXMuaCIKLSNpbmNsdWRlICJtdm0vUHJpbnRCdWZmZXIuaCIKLQotI2luY2x1ZGUgIkNMSVN0cmluZy5oIgotCi1uYW1lc3BhY2UgbjMgewotCi1jbGFzcyBBcnJheUNoYXI7Ci0KLWNsYXNzIFBOZXRTdHJpbmcgOiBwdWJsaWMgQ0xJU3RyaW5nIHsKLXB1YmxpYzoKLSAgCi0gIC8vICEhISBwbmV0bGliIGxheW91dCAhISEKLSAgc2ludDMyIGNhcGFjaXR5OwotICBzaW50MzIgbGVuZ3RoOwotICB1aW50OCBmaXJzdENoYXI7Ci0gIGNvbnN0IEFycmF5Q2hhciogdmFsdWU7Ci0gIGxsdm06Okdsb2JhbFZhcmlhYmxlKiBfbGx2bVZhcjsKLQotfTsKLQotfSAvLyBlbmQgbmFtZXNwYWNlIG4zCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL04zL1ZNQ29yZS9Bc3NlbWJseS5jcHAgYi92bWtpdC9saWIvTjMvVk1Db3JlL0Fzc2VtYmx5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY5ODEzMC4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTjMvVk1Db3JlL0Fzc2VtYmx5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5MzAgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0gQXNzZW1ibHkuY3BwIC0gRGVmaW5pdGlvbiBvZiBhbiBhc3NlbWJseSAtLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4zCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgIk4zRGVidWcuaCIKLSNpbmNsdWRlICJ0eXBlcy5oIgotCi0jaW5jbHVkZSAiQXNzZW1ibHkuaCIKLSNpbmNsdWRlICJDTElBY2Nlc3MuaCIKLSNpbmNsdWRlICJMb2NrZWRNYXAuaCIKLSNpbmNsdWRlICJNU0NvcmxpYi5oIgotI2luY2x1ZGUgIk4zLmgiCi0jaW5jbHVkZSAiUmVhZGVyLmgiCi0jaW5jbHVkZSAiVk1DbGFzcy5oIgotI2luY2x1ZGUgIlZNT2JqZWN0LmgiCi0jaW5jbHVkZSAiVk1UaHJlYWQuaCIKLQotdXNpbmcgbmFtZXNwYWNlIG4zOwotCi0KLSNkZWZpbmUgREVGX1RBQkxFX01BU0sobmFtZSwgbmIsIC4uLikgXAotICBzdGF0aWMgdm9pZCBuYW1lKHVpbnQzMiBpbmRleCwgXAotICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFRhYmxlKiwgZ2NfYWxsb2NhdG9yPFRhYmxlKj4gPiYgdGFibGVzLCBcCi0gICAgICAgICAgICAgICAgICAgdWludDMyIGhlYXBTaXplcykgeyBcCi0gICAgVGFibGUqIHRhYmxlID0gdGFibGVzW2luZGV4XTsgXAotICAgIHVpbnQzMiByb3dTaXplID0gMDsgXAotICAgIHVpbnQzMiBiaXRtYXNrID0gMDsgXAotICAgIF9fVkFfQVJHU19fOyBcCi0gICAgdGFibGUtPmNvdW50ID0gbmI7IFwKLSAgICB0YWJsZS0+c2l6ZU1hc2sgPSBiaXRtYXNrOyBcCi0gICAgdGFibGUtPnJvd1NpemUgPSByb3dTaXplOyBcCi0gIH0KLSAgCi0KLURFRl9UQUJMRV9NQVNLKE1FVEhPRF9Nb2R1bGUsIDUsCi0gIElOVDE2KENPTlNUQU5UX01PRFVMRV9HRU5FUkFUSU9OKQotICBTVFJJTkcoQ09OU1RBTlRfTU9EVUxFX05BTUUpCi0gIEdVSUQoQ09OU1RBTlRfTU9EVUxFX01WSUQpCi0gIEdVSUQoQ09OU1RBTlRfTU9EVUxFX0VOQ0lEKQotICBHVUlEKENPTlNUQU5UX01PRFVMRV9FTkNCQVNFSUQpKQotICAKLURFRl9UQUJMRV9NQVNLKE1FVEhPRF9UeXBlUmVmLCAzLAotICBSRVNPTFVUSU9OX1NDT1BFKENPTlNUQU5UX1RZUEVSRUZfUkVTT0xVVElPTl9TQ09QRSkKLSAgU1RSSU5HKENPTlNUQU5UX1RZUEVSRUZfTkFNRSkKLSAgU1RSSU5HKENPTlNUQU5UX1RZUEVSRUZfTkFNRVNQQUNFKSkKLSAgCi1ERUZfVEFCTEVfTUFTSyhNRVRIT0RfVHlwZURlZiwgNiwKLSAgSU5UMzIoQ09OU1RBTlRfVFlQRURFRl9GTEFHUykKLSAgU1RSSU5HKENPTlNUQU5UX1RZUEVERUZfTkFNRSkKLSAgU1RSSU5HKENPTlNUQU5UX1RZUEVERUZfTkFNRVNQQUNFKQotICBUWVBFREVGX09SX1JFRihDT05TVEFOVF9UWVBFREVGX0VYVEVORFMpCi0gIFRBQkxFKENPTlNUQU5UX0ZpZWxkLCBDT05TVEFOVF9UWVBFREVGX0ZJRUxETElTVCkKLSAgVEFCTEUoQ09OU1RBTlRfTWV0aG9kRGVmLCBDT05TVEFOVF9UWVBFREVGX01FVEhPRExJU1QpKQotCi1ERUZfVEFCTEVfTUFTSyhNRVRIT0RfTWV0aG9kRGVmLCA2LAotICBJTlQzMihDT05TVEFOVF9NRVRIT0RERUZfUlZBKQotICBJTlQxNihDT05TVEFOVF9NRVRIT0RERUZfSU1QTEZMQUdTKQotICBJTlQxNihDT05TVEFOVF9NRVRIT0RERUZfRkxBR1MpCi0gIFNUUklORyhDT05TVEFOVF9NRVRIT0RERUZfTkFNRSkKLSAgQkxPQihDT05TVEFOVF9NRVRIT0RERUZfU0lHTkFUVVJFKQotICBUQUJMRShDT05TVEFOVF9QYXJhbSwgQ09OU1RBTlRfTUVUSE9EREVGX1BBUkFNTElTVCkpCi0gIAotREVGX1RBQkxFX01BU0soTUVUSE9EX1BhcmFtLCAzLAotICBJTlQxNihDT05TVEFOVF9QQVJBTV9GTEFHUykKLSAgSU5UMTYoQ09OU1RBTlRfUEFSQU1fU0VRVUVOQ0UpCi0gIFNUUklORyhDT05TVEFOVF9QQVJBTV9OQU1FKSkKLSAgCi1ERUZfVEFCTEVfTUFTSyhNRVRIT0RfTWVtYmVyUmVmLCAzLAotICBNRU1CRVJfUkVGX1BBUkVOVChDT05TVEFOVF9NRU1CRVJSRUZfQ0xBU1MpCi0gIFNUUklORyhDT05TVEFOVF9NRU1CRVJSRUZfTkFNRSkKLSAgQkxPQihDT05TVEFOVF9NRU1CRVJSRUZfU0lHTkFUVVJFKSkKLSAgCi1ERUZfVEFCTEVfTUFTSyhNRVRIT0RfQ3VzdG9tQXR0cmlidXRlLCAzLAotICBIQVNfQ1VTVE9NX0FUVFJJQlVURShDT05TVEFOVF9DVVNUT01fQVRUUklCVVRFX1BBUkVOVCkKLSAgQ1VTVE9NX0FUVFJJQlVURV9UWVBFKENPTlNUQU5UX0NVU1RPTV9BVFRSSUJVVEVfVFlQRSkKLSAgQkxPQihDT05TVEFOVF9DVVNUT01fQVRUUklCVVRFX1ZBTFVFKSkKLSAgCi1ERUZfVEFCTEVfTUFTSyhNRVRIT0RfU3RhbmRhbG9uZVNpZywgMSwKLSAgQkxPQihDT05TVEFOVF9TVEFOREFMT05FX1NJR19TSUdOQVRVUkUpKQotICAKLURFRl9UQUJMRV9NQVNLKE1FVEhPRF9UeXBlU3BlYywgMSwKLSAgQkxPQihDT05TVEFOVF9UWVBFU1BFQ19TSUdOQVRVUkUpKQotICAKLURFRl9UQUJMRV9NQVNLKE1FVEhPRF9Bc3NlbWJseSwgOSwKLSAgSU5UMzIoQ09OU1RBTlRfQVNTRU1CTFlfSEFTSF9BTEdfSUQpCi0gIElOVDE2KENPTlNUQU5UX0FTU0VNQkxZX01BSk9SKQotICBJTlQxNihDT05TVEFOVF9BU1NFTUJMWV9NSU5PUikKLSAgSU5UMTYoQ09OU1RBTlRfQVNTRU1CTFlfQlVJTEQpCi0gIElOVDE2KENPTlNUQU5UX0FTU0VNQkxZX1JFVklTSU9OKQotICBJTlQzMihDT05TVEFOVF9BU1NFTUJMWV9GTEFHUykKLSAgQkxPQihDT05TVEFOVF9BU1NFTUJMWV9QVUJMSUNfS0VZKQotICBTVFJJTkcoQ09OU1RBTlRfQVNTRU1CTFlfTkFNRSkKLSAgU1RSSU5HKENPTlNUQU5UX0FTU0VNQkxZX0NVTFRVUkUpKQotICAKLURFRl9UQUJMRV9NQVNLKE1FVEhPRF9Bc3NlbWJseVJlZiwgOSwKLSAgSU5UMTYoQ09OU1RBTlRfQVNTRU1CTFlfUkVGX01BSk9SKQotICBJTlQxNihDT05TVEFOVF9BU1NFTUJMWV9SRUZfTUlOT1IpCi0gIElOVDE2KENPTlNUQU5UX0FTU0VNQkxZX1JFRl9CVUlMRCkKLSAgSU5UMTYoQ09OU1RBTlRfQVNTRU1CTFlfUkVGX1JFVklTSU9OKQotICBJTlQzMihDT05TVEFOVF9BU1NFTUJMWV9SRUZfRkxBR1MpCi0gIEJMT0IoQ09OU1RBTlRfQVNTRU1CTFlfUkVGX1BVQkxJQ19LRVkpCi0gIFNUUklORyhDT05TVEFOVF9BU1NFTUJMWV9SRUZfTkFNRSkKLSAgU1RSSU5HKENPTlNUQU5UX0FTU0VNQkxZX1JFRl9DVUxUVVJFKQotICBCTE9CKENPTlNUQU5UX0FTU0VNQkxZX1JFRl9IQVNIX1ZBTFVFKSkKLSAgCi1ERUZfVEFCTEVfTUFTSyhNRVRIT0RfRmllbGQsIDMsCi0gIElOVDE2KENPTlNUQU5UX0ZJRUxEX0ZMQUdTKQotICBTVFJJTkcoQ09OU1RBTlRfRklFTERfTkFNRSkKLSAgQkxPQihDT05TVEFOVF9GSUVMRF9TSUdOQVRVUkUpKQotICAKLURFRl9UQUJMRV9NQVNLKE1FVEhPRF9JbnRlcmZhY2VJbXBsLCAyLAotICBUQUJMRShDT05TVEFOVF9UeXBlRGVmLCBDT05TVEFOVF9JTlRFUkZBQ0VfSU1QTF9DTEFTUykKLSAgVFlQRURFRl9PUl9SRUYoQ09OU1RBTlRfSU5URVJGQUNFX0lNUExfSU5URVJGQUNFKSkKLSAgCi1ERUZfVEFCTEVfTUFTSyhNRVRIT0RfTmVzdGVkQ2xhc3MsIDIsCi0gIFRBQkxFKENPTlNUQU5UX1R5cGVEZWYsIENPTlNUQU5UX05FU1RFRF9DTEFTU19ORVNURURfQ0xBU1MpCi0gIFRBQkxFKENPTlNUQU5UX1R5cGVEZWYsIENPTlNUQU5UX05FU1RFRF9DTEFTU19FTkNMT1NJTkdfQ0xBU1MpKQotCi1ERUZfVEFCTEVfTUFTSyhNRVRIT0RfTWV0aG9kU3BlYywgMiwKLSAgTUVUSE9EREVGX09SX1JFRihDT05TVEFOVF9NRVRIT0RfU1BFQ19NRVRIT0QpCi0gIEJMT0IoQ09OU1RBTlRfTUVUSE9EX1NQRUNfSU5TVEFOVElBVElPTikpCi0KLURFRl9UQUJMRV9NQVNLKE1FVEhPRF9HZW5lcmljUGFyYW1Db25zdHJhaW50LCAyLAotICBUQUJMRShDT05TVEFOVF9HZW5lcmljUGFyYW0sIENPTlNUQU5UX0dFTkVSSUNfUEFSQU1fQ09OU1RSQUlOVF9PV05FUikKLSAgVFlQRURFRl9PUl9SRUYoQ09OU1RBTlRfR0VORVJJQ19QQVJBTV9DT05TVFJBSU5UX0NPTlNUUkFJTlQpKQotICAKLURFRl9UQUJMRV9NQVNLKE1FVEhPRF9Db25zdGFudCwgMywKLSAgSU5UMTYoQ09OU1RBTlRfQ09OU1RBTlRfVFlQRSkKLSAgSEFTX0NPTlNUQU5UKENPTlNUQU5UX0NPTlNUQU5UX1BBUkVOVCkKLSAgQkxPQihDT05TVEFOVF9DT05TVEFOVF9WQUxVRSkpCi0gIAotREVGX1RBQkxFX01BU0soTUVUSE9EX0ZpZWxkTWFyc2hhbCwgMiwKLSAgSEFTX0ZJRUxEX01BUlNIQUwoQ09OU1RBTlRfRklFTERfTUFSU0hBTF9QQVJFTlQpCi0gIEJMT0IoQ09OU1RBTlRfRklFTERfTUFSU0hBTF9OQVRJVkVfVFlQRSkpCi0gIAotREVGX1RBQkxFX01BU0soTUVUSE9EX0RlY2xTZWN1cml0eSwgMywKLSAgSU5UMTYoQ09OU1RBTlRfREVDTF9TRUNVUklUWV9BQ1RJT04pCi0gIEhBU19ERUNMX1NFQ1VSSVRZKENPTlNUQU5UX0RFQ0xfU0VDVVJJVFlfUEFSRU5UKQotICBCTE9CKENPTlNUQU5UX0RFQ0xfU0VDVVJJVFlfUEVSTUlTU0lPTl9TRVQpKQotCi1ERUZfVEFCTEVfTUFTSyhNRVRIT0RfQ2xhc3NMYXlvdXQsIDMsCi0gIElOVDE2KENPTlNUQU5UX0NMQVNTX0xBWU9VVF9QQUNLSU5HX1NJWkUpCi0gIElOVDMyKENPTlNUQU5UX0NMQVNTX0xBWU9VVF9DTEFTU19TSVpFKQotICBUQUJMRShDT05TVEFOVF9UeXBlRGVmLCBDT05TVEFOVF9DTEFTU19MQVlPVVRfUEFSRU5UKSkKLSAgCi1ERUZfVEFCTEVfTUFTSyhNRVRIT0RfRmllbGRMYXlvdXQsIDIsCi0gIElOVDMyKENPTlNUQU5UX0ZJRUxEX0xBWU9VVF9PRkZTRVQpCi0gIFRBQkxFKENPTlNUQU5UX0ZpZWxkLCBDT05TVEFOVF9GSUVMRF9MQVlPVVRfRklFTEQpKQotCi1ERUZfVEFCTEVfTUFTSyhNRVRIT0RfRXZlbnRNYXAsIDIsCi0gIFRBQkxFKENPTlNUQU5UX1R5cGVEZWYsIENPTlNUQU5UX0VWRU5UX01BUF9QQVJFTlQpCi0gIFRBQkxFKENPTlNUQU5UX0V2ZW50LCBDT05TVEFOVF9FVkVOX01BUF9FVkVOVF9MSVNUKSkKLQotREVGX1RBQkxFX01BU0soTUVUSE9EX0V2ZW50LCAzLAotICBJTlQxNihDT05TVEFOVF9FVkVOVF9FVkVOVF9GTEFHUykKLSAgU1RSSU5HKENPTlNUQU5UX0VWRU5UX05BTUUpCi0gIFRZUEVERUZfT1JfUkVGKENPTlNUQU5UX0VWRU5UX1RZUEUpKQotICAKLURFRl9UQUJMRV9NQVNLKE1FVEhPRF9Qcm9wZXJ0eU1hcCwgMiwKLSAgVEFCTEUoQ09OU1RBTlRfVHlwZURlZiwgQ09OU1RBTlRfUFJPUEVSVFlfTUFQX1BBUkVOVCkKLSAgVEFCTEUoQ09OU1RBTlRfUHJvcGVydHksIENPTlNUQU5UX1BST1BFUlRZX01BUF9QUk9QRVJUWV9MSVNUKSkKLSAgCi1ERUZfVEFCTEVfTUFTSyhNRVRIT0RfUHJvcGVydHksIDMsCi0gIElOVDE2KENPTlNUQU5UX1BST1BFUlRZX0ZMQUdTKQotICBTVFJJTkcoQ09OU1RBTlRfUFJPUEVSVFlfTkFNRSkKLSAgQkxPQihDT05TVEFOVF9QUk9QRVJUWV9UWVBFKSkKLSAgCi1ERUZfVEFCTEVfTUFTSyhNRVRIT0RfTWV0aG9kU2VtYW50aWNzLCAzLAotICBJTlQxNihDT05TVEFOVF9NRVRIT0RfU0VNQU5USUNTX1NFTUFOVElDUykKLSAgVEFCTEUoQ09OU1RBTlRfTWV0aG9kRGVmLCBDT05TVEFOVF9NRVRIT0RfU0VNQU5USUNTX01FVEhPRCkKLSAgSEFTX1NFTUFOVElDUyhDT05TVEFOVF9NRVRIT0RfU0VNQU5USUNTX0FTU09DSUFUSU9OKSkKLQotREVGX1RBQkxFX01BU0soTUVUSE9EX01ldGhvZEltcGwsIDMsCi0gIFRBQkxFKENPTlNUQU5UX1R5cGVEZWYsIENPTlNUQU5UX01FVEhPRF9JTVBMX0NMQVNTKQotICBNRVRIT0RERUZfT1JfUkVGKENPTlNUQU5UX01FVEhPRF9JTVBMX01FVEhPRF9CT0RZKQotICBNRVRIT0RERUZfT1JfUkVGKENPTlNUQU5UX01FVEhPRF9JTVBMX01FVEhPRF9ERUNMQVJBVElPTikpCi0gIAotREVGX1RBQkxFX01BU0soTUVUSE9EX01vZHVsZVJlZiwgMSwKLSAgU1RSSU5HKENPTlNUQU5UX01PRFVMRV9SRUZfTkFNRSkpCi0gIAotREVGX1RBQkxFX01BU0soTUVUSE9EX0ltcGxNYXAsIDQsCi0gIElOVDE2KENPTlNUQU5UX0lNUExfTUFQX01BUFBJTkdfRkxBR1MpCi0gIE1FTUJFUl9GT1JXQVJERUQoQ09OU1RBTlRfSU1QTF9NQVBfTUVNQkVSX0ZPUldBUkRFRCkKLSAgU1RSSU5HKENPTlNUQU5UX0lNUExfTUFQX0lNUE9SVF9OQU1FKQotICBUQUJMRShDT05TVEFOVF9Nb2R1bGVSZWYsIENPTlNUQU5UX0lNUExfTUFQX0lNUE9SVF9TQ09QRSkpCi0gIAotREVGX1RBQkxFX01BU0soTUVUSE9EX0ZpZWxkUnZhLCAyLAotICBJTlQzMihDT05TVEFOVF9GSUVMRF9SVkFfUlZBKQotICBUQUJMRShDT05TVEFOVF9GaWVsZCwgQ09OU1RBTlRfRklFTERfUlZBX0ZJRUxEKSkKLQotREVGX1RBQkxFX01BU0soTUVUSE9EX01hbmlmZXN0UmVzb3VyY2UsIDQsCi0gIElOVDMyKENPTlNUQU5UX01BTklGRVNUX1JFU09VUkNFX09GRlNFVCkKLSAgSU5UMzIoQ09OU1RBTlRfTUFOSUZFU1RfUkVTT1VSQ0VfRkxBR1MpCi0gIFNUUklORyhDT05TVEFOVF9NQU5JRkVTVF9SRVNPVVJDRV9OQU1FKQotICBJTVBMRU1FTlRBVElPTihDT05TVEFOVF9NQU5JRkVTVF9SRVNPVVJDRV9JTVBMRU1FTlRBVElPTikpCi0gIAotREVGX1RBQkxFX01BU0soTUVUSE9EX0Fzc2VtYmx5UHJvY2Vzc29yLCAxLAotICBJTlQzMihDT05TVEFOVF9BU1NFTUJMWV9QUk9DRVNTT1JfUFJPQ0VTU09SKSkKLSAgCi1ERUZfVEFCTEVfTUFTSyhNRVRIT0RfQXNzZW1ibHlPUywgMywKLSAgSU5UMzIoQ09OU1RBTlRfQVNTRU1CTFlfT1NfUExBVEZPUk1fSUQpCi0gIElOVDMyKENPTlNUQU5UX0FTU0VNQkxZX09TX01BSk9SX1ZFUlNJT04pCi0gIElOVDMyKENPTlNUQU5UX0FTU0VNQkxZX09TX01JTk9SX1ZFUlNJT04pKQotICAKLURFRl9UQUJMRV9NQVNLKE1FVEhPRF9GaWxlLCAzLAotICBJTlQzMihDT05TVEFOVF9GSUxFX0ZMQUdTKQotICBTVFJJTkcoQ09OU1RBTlRfRklMRV9OQU1FKQotICBCTE9CKENPTlNUQU5UX0ZJTEVfSEFTSF9WQUxVRSkpCi0KLURFRl9UQUJMRV9NQVNLKE1FVEhPRF9HZW5lcmljUGFyYW0sIDQsCi0gIElOVDE2KENPTlNUQU5UX0dFTkVSSUNfUEFSQU1fTlVNQkVSKQotICBJTlQxNihDT05TVEFOVF9HRU5FUklDX1BBUkFNX0ZMQUdTKQotICBUWVBFX09SX01FVEhPRERFRihDT05TVEFOVF9HRU5FUklDX1BBUkFNX09XTkVSKQotICBTVFJJTkcoQ09OU1RBTlRfR0VORVJJQ19QQVJBTV9OQU1FKSkKLQotdm9pZCBIZWFkZXI6OnByaW50KG12bTo6UHJpbnRCdWZmZXIqIGJ1ZikgY29uc3QgewotICBidWYtPndyaXRlKCJIZWFkZXI8PiIpOwotfQotCi12b2lkIFNlY3Rpb246OnByaW50KG12bTo6UHJpbnRCdWZmZXIqIGJ1ZikgY29uc3QgewotICBidWYtPndyaXRlKCJTZWN0aW9uPD4iKTsKLX0KLQotdm9pZCBUYWJsZTo6cHJpbnQobXZtOjpQcmludEJ1ZmZlciogYnVmKSBjb25zdCB7Ci0gIGJ1Zi0+d3JpdGUoIlRhYmxlPD4iKTsKLX0KLQotdm9pZCBTdHJlYW06OnByaW50KG12bTo6UHJpbnRCdWZmZXIqIGJ1ZikgY29uc3QgewotICBidWYtPndyaXRlKCJUYWJsZTw+Iik7Ci19Ci0KLXZvaWQgQXNzZW1ibHk6OnByaW50KG12bTo6UHJpbnRCdWZmZXIqIGJ1ZikgY29uc3QgewotICBidWYtPndyaXRlKCJBc3NlbWJseTwiKTsKLSAgbmFtZS0+cHJpbnQoYnVmKTsKLSAgYnVmLT53cml0ZSgiPiIpOwotfQotCi1zdGF0aWMgVk1Db21tb25DbGFzcyogYXJyYXlEdXAoQ2xhc3NOYW1lQ21wICZjbXAsIEFzc2VtYmx5KiBhc3MpIHsKLSAgVk1DbGFzc0FycmF5KiBjbCA9IG5ldyhhc3MtPmFsbG9jYXRvciwgIlZNQ2xhc3NBcnJheSIpIFZNQ2xhc3NBcnJheSgpOwotICBjbC0+aW5pdGlhbGlzZShhc3MtPnZtLCB0cnVlKTsKLSAgY2wtPm5hbWUgPSBjbXAubmFtZTsKLSAgY2wtPm5hbWVTcGFjZSA9IGNtcC5uYW1lU3BhY2U7Ci0gIGNsLT5zdXBlciA9IFZNQ2xhc3NBcnJheTo6U3VwZXJBcnJheTsKLSAgY2wtPmludGVyZmFjZXMgPSBWTUNsYXNzQXJyYXk6OkludGVyZmFjZXNBcnJheTsKLSAgY2wtPnZpcnR1YWxNZXRob2RzID0gVk1DbGFzc0FycmF5OjpWaXJ0dWFsTWV0aG9kc0FycmF5OwotICBjbC0+c3RhdGljTWV0aG9kcyA9IFZNQ2xhc3NBcnJheTo6U3RhdGljTWV0aG9kc0FycmF5OwotICBjbC0+dmlydHVhbEZpZWxkcyA9IFZNQ2xhc3NBcnJheTo6VmlydHVhbEZpZWxkc0FycmF5OwotICBjbC0+c3RhdGljRmllbGRzID0gVk1DbGFzc0FycmF5OjpTdGF0aWNGaWVsZHNBcnJheTsKLSAgY2wtPmRlcHRoID0gMTsKLSAgY2wtPmRpc3BsYXkucHVzaF9iYWNrKFZNQ2xhc3NBcnJheTo6U3VwZXJBcnJheSk7Ci0gIGNsLT5kaXNwbGF5LnB1c2hfYmFjayhjbCk7Ci0gIGNsLT5zdGF0dXMgPSBsb2FkZWQ7Ci0gIGNsLT5hc3NlbWJseSA9IGFzczsKLSAgcmV0dXJuIGNsOyAKLX0KLQotVk1DbGFzc0FycmF5KiBBc3NlbWJseTo6Y29uc3RydWN0QXJyYXkoVk1Db21tb25DbGFzcyogYmFzZSwgdWludDMyIGRpbXMpIHsKLSAgaWYgKHRoaXMgIT0gYmFzZS0+YXNzZW1ibHkpIAotICAgIHJldHVybiBiYXNlLT5hc3NlbWJseS0+Y29uc3RydWN0QXJyYXkoYmFzZSwgZGltcyk7Ci0KLSAgQ2xhc3NOYW1lQ21wIENDKFZNQ2xhc3NBcnJheTo6Y29uc3RydWN0QXJyYXlOYW1lKGJhc2UtPm5hbWUsIGRpbXMpLAotICAgICAgICAgICAgICAgICAgYmFzZS0+bmFtZVNwYWNlKTsKLSAgVk1DbGFzc0FycmF5KiBjbCA9IChWTUNsYXNzQXJyYXkqKShsb2FkZWROYW1lQ2xhc3Nlcy0+bG9va3VwT3JDcmVhdGUoQ0MsIHRoaXMsIGFycmF5RHVwKSk7Ci0gIGlmICghY2wtPmJhc2VDbGFzcykgewotICAgIGNsLT5kaW1zID0gZGltczsKLSAgICBpZiAoZGltcyA+IDEpCi0gICAgICBjbC0+YmFzZUNsYXNzID0gY29uc3RydWN0QXJyYXkoYmFzZSwgZGltcyAtIDEpOwotICAgIGVsc2UKLSAgICAgIGNsLT5iYXNlQ2xhc3MgPSBiYXNlOwotICB9Ci0gIHJldHVybiBjbDsKLX0KLQotc3RhdGljIFZNQ29tbW9uQ2xhc3MqIHBvaW50ZXJEdXAoQ2xhc3NOYW1lQ21wICZjbXAsIEFzc2VtYmx5KiBhc3MpIHsKLSAgVk1DbGFzc1BvaW50ZXIqIGNsID0gbmV3KGFzcy0+YWxsb2NhdG9yLCAiVk1DbGFzc1BvaW50ZXIiKSBWTUNsYXNzUG9pbnRlcigpOwotICBjbC0+aW5pdGlhbGlzZShhc3MtPnZtLCBmYWxzZSk7Ci0gIGNsLT5pc1BvaW50ZXIgPSB0cnVlOwotICBjbC0+bmFtZSA9IGNtcC5uYW1lOwotICBjbC0+bmFtZVNwYWNlID0gY21wLm5hbWVTcGFjZTsKLSAgY2wtPmRlcHRoID0gMDsKLSAgY2wtPmRpc3BsYXkucHVzaF9iYWNrKGNsKTsKLSAgY2wtPnN0YXR1cyA9IGxvYWRlZDsKLSAgY2wtPmFzc2VtYmx5ID0gYXNzOwotICByZXR1cm4gY2w7IAotfQotCi1WTUNsYXNzUG9pbnRlciogQXNzZW1ibHk6OmNvbnN0cnVjdFBvaW50ZXIoVk1Db21tb25DbGFzcyogYmFzZSwgdWludDMyIGRpbXMpIHsKLSAgaWYgKHRoaXMgIT0gYmFzZS0+YXNzZW1ibHkpIAotICAgIHJldHVybiBiYXNlLT5hc3NlbWJseS0+Y29uc3RydWN0UG9pbnRlcihiYXNlLCBkaW1zKTsKLSAgCi0gIENsYXNzTmFtZUNtcCBDQyhWTUNsYXNzUG9pbnRlcjo6Y29uc3RydWN0UG9pbnRlck5hbWUoYmFzZS0+bmFtZSwgZGltcyksCi0gICAgICAgICAgICAgICAgICBiYXNlLT5uYW1lU3BhY2UpOwotICBWTUNsYXNzUG9pbnRlciogY2wgPSAoVk1DbGFzc1BvaW50ZXIqKShsb2FkZWROYW1lQ2xhc3Nlcy0+bG9va3VwT3JDcmVhdGUoQ0MsIHRoaXMsIHBvaW50ZXJEdXApKTsKLSAgaWYgKCFjbC0+YmFzZUNsYXNzKSB7Ci0gICAgY2wtPmRpbXMgPSBkaW1zOwotICAgIGNsLT5iYXNlQ2xhc3MgPSBiYXNlOwotICB9Ci0gIHJldHVybiBjbDsKLX0KLQotVk1DbGFzc0FycmF5KiBBc3NlbWJseTo6Y29uc3RydWN0QXJyYXkoY29uc3QgVVRGOCogbmFtZSwgY29uc3QgVVRGOCogbmFtZVNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIGRpbXMpIHsKLSAgYXNzZXJ0KHRoaXMgPT0gKChOMyopVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpKS0+Y29yZUFzc2VtYmx5KTsKLSAgQ2xhc3NOYW1lQ21wIENDKFZNQ2xhc3NBcnJheTo6Y29uc3RydWN0QXJyYXlOYW1lKG5hbWUsIGRpbXMpLAotICAgICAgICAgICAgICAgICAgbmFtZVNwYWNlKTsKLSAgVk1DbGFzc0FycmF5KiBjbCA9IChWTUNsYXNzQXJyYXkqKShsb2FkZWROYW1lQ2xhc3Nlcy0+bG9va3VwT3JDcmVhdGUoQ0MsIHRoaXMsIGFycmF5RHVwKSk7Ci0gIGNsLT5kaW1zID0gZGltczsKLSAgcmV0dXJuIGNsOwotfQotCi1zdGF0aWMgVk1Db21tb25DbGFzcyogY2xhc3NEdXAoQ2xhc3NOYW1lQ21wICZjbXAsIEFzc2VtYmx5KiBhc3MpIHsKLSAgVk1DbGFzcyogY2wgPSBuZXcoYXNzLT5hbGxvY2F0b3IsICJWTUNsYXNzIikgVk1DbGFzcygpOwotICBjbC0+aW5pdGlhbGlzZShhc3MtPnZtLCBmYWxzZSk7Ci0gIGNsLT5uYW1lID0gY21wLm5hbWU7Ci0gIGNsLT5uYW1lU3BhY2UgPSBjbXAubmFtZVNwYWNlOwotICBjbC0+dmlydHVhbFRyYWNlciA9IDA7Ci0gIGNsLT5zdGF0aWNJbnN0YW5jZSA9IDA7Ci0gIGNsLT52aXJ0dWFsSW5zdGFuY2UgPSAwOwotICBjbC0+dmlydHVhbFR5cGUgPSAwOwotICBjbC0+c3VwZXIgPSAwOwotICBjbC0+c3RhdHVzID0gaGFzaGVkOwotICBjbC0+YXNzZW1ibHkgPSBhc3M7Ci0gIHJldHVybiBjbDsKLX0KLQotVk1DbGFzcyogQXNzZW1ibHk6OmNvbnN0cnVjdENsYXNzKGNvbnN0IFVURjgqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVVRGOCogbmFtZVNwYWNlLCB1aW50MzIgdG9rZW4pIHsKLSAgQ2xhc3NOYW1lQ21wIENDKG5hbWUsIG5hbWVTcGFjZSk7Ci0gIFZNQ2xhc3MqIGNsID0gKFZNQ2xhc3MqKWxvYWRlZE5hbWVDbGFzc2VzLT5sb29rdXBPckNyZWF0ZShDQywgdGhpcywgY2xhc3NEdXApOwotICBsb2FkZWRUb2tlbkNsYXNzZXMtPmxvb2t1cE9yQ3JlYXRlKHRva2VuLCBjbCk7Ci0gIGNsLT50b2tlbiA9IHRva2VuOwotICByZXR1cm4gY2w7Ci19Ci0KLXN0YXRpYyBWTUNvbW1vbkNsYXNzKiBnZW5DbGFzc0R1cChDbGFzc05hbWVDbXAgJmNtcCwgQXNzZW1ibHkqIGFzcykgewotICBWTUNsYXNzKiBjbCA9IG5ldyhhc3MtPmFsbG9jYXRvciwgIlZNR2VuZXJpY0NsYXNzIikgVk1HZW5lcmljQ2xhc3MoKTsKLSAgY2wtPmluaXRpYWxpc2UoYXNzLT52bSwgZmFsc2UpOwotICBjbC0+bmFtZSA9IGNtcC5uYW1lOwotICBjbC0+bmFtZVNwYWNlID0gY21wLm5hbWVTcGFjZTsKLSAgY2wtPnZpcnR1YWxUcmFjZXIgPSAwOwotICBjbC0+c3RhdGljSW5zdGFuY2UgPSAwOwotICBjbC0+dmlydHVhbEluc3RhbmNlID0gMDsKLSAgY2wtPnZpcnR1YWxUeXBlID0gMDsKLSAgY2wtPnN1cGVyID0gMDsKLSAgY2wtPnN0YXR1cyA9IGhhc2hlZDsKLSAgY2wtPmFzc2VtYmx5ID0gYXNzOwotICByZXR1cm4gY2w7Ci19Ci0KLVZNR2VuZXJpY0NsYXNzKiBBc3NlbWJseTo6Y29uc3RydWN0R2VuZXJpY0NsYXNzKGNvbnN0IFVURjgqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVURjgqIG5hbWVTcGFjZSwgc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+IGdlbkFyZ3MsIHVpbnQzMiB0b2tlbikgewotICB1aW50MzIgc2l6ZSA9IG5hbWUtPnNpemUgKyAyOwotICBzaW50MzIgaSA9IDA7Ci0gIGZvciAoc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+OjppdGVyYXRvciBpdCA9IGdlbkFyZ3MuYmVnaW4oKSwgZSA9IGdlbkFyZ3MuZW5kKCk7IGl0IT0gZTsgKytpdCkgewotICAgIHNpemUgKz0gKCppdCktPm5hbWUtPnNpemUgKyAxOwotICB9Ci0gIHVpbnQxNiogYnVmID0gKHVpbnQxNiopIGFsbG9jYShzaXplb2YodWludDE2KSAqIHNpemUpOwotICBmb3IgKGkgPSAwOyBpIDwgbmFtZS0+c2l6ZTsgaSsrKSB7Ci0gICAgYnVmW2ldID0gbmFtZS0+ZWxlbWVudHNbaV07Ci0gIH0KLSAgYnVmW2krK10gPSAnPCc7Ci0gIGZvciAoc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+OjppdGVyYXRvciBpdCA9IGdlbkFyZ3MuYmVnaW4oKSwgZSA9IGdlbkFyZ3MuZW5kKCk7IGl0IT0gZTsgKytpdCkgewotICAgIGZvciAoaW50IGogPSAwOyBqIDwgKCppdCktPm5hbWUtPnNpemU7IGkrKywgaisrKSB7Ci0gICAgICBidWZbaV0gPSAoKml0KS0+bmFtZS0+ZWxlbWVudHNbal07Ci0gICAgfQotICAgIGJ1ZltpKytdID0gJywnOwotICB9Ci0gIGJ1ZltpXSA9ICc+JzsKLSAgY29uc3QgVVRGOCogZ2VuTmFtZSA9IFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+YnVmVG9VVEY4KGJ1Ziwgc2l6ZSk7Ci0gIC8vcHJpbnRmKCIlc1xuIiwgbXZtOjpQcmludEJ1ZmZlcihnZW5OYW1lKS5jU3RyaW5nKCkpOwotICAKLSAgQ2xhc3NOYW1lQ21wIENDKGdlbk5hbWUsIG5hbWVTcGFjZSk7Ci0gIFZNR2VuZXJpY0NsYXNzKiBjbCA9IChWTUdlbmVyaWNDbGFzcyopIGxvYWRlZE5hbWVDbGFzc2VzLT5sb29rdXBPckNyZWF0ZShDQywgdGhpcywgZ2VuQ2xhc3NEdXApOwotICAKLSAgY2wtPmdlbmVyaWNQYXJhbXMgPSBnZW5BcmdzOyAvLyBUT0RPIEdDIHNhZmU/Ci0gIGNsLT50b2tlbiA9IHRva2VuOwotICAKLSAgcmV0dXJuIGNsOwotfQotCi1zdGF0aWMgVk1GaWVsZCogZmllbGREdXAodWludDMyJiBrZXksIEFzc2VtYmx5KiBhc3MpIHsKLSAgVk1GaWVsZCogZmllbGQgPSBuZXcoYXNzLT5hbGxvY2F0b3IsICJWTUZpZWxkIikgVk1GaWVsZCgpOwotICBmaWVsZC0+dG9rZW4gPSBrZXk7Ci0gIHJldHVybiBmaWVsZDsKLX0KLQotVk1GaWVsZCogIEFzc2VtYmx5Ojpjb25zdHJ1Y3RGaWVsZChWTUNsYXNzKiBjbCwgY29uc3QgVVRGOCogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk1Db21tb25DbGFzcyogc2lnbmF0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgdG9rZW4sIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgVk1GaWVsZCogZmllbGQ7IAotICAKLSAgaWYgKGdlbkNsYXNzID09IDApIHsKLSAgICAvLyB3ZSBhcmUgbm90IHJlYWRpbmcgYSBnZW5lcmljIGNsYXNzIAotICAgIGZpZWxkID0gbG9hZGVkVG9rZW5GaWVsZHMtPmxvb2t1cE9yQ3JlYXRlKHRva2VuLCB0aGlzLCBmaWVsZER1cCk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gd2UgYXJlIHJlYWRpbmcgYSBnZW5lcmljIGNsYXNzLCBkb24ndCBhZGQgYSByZWZlcmVuY2UKLSAgICAvLyB0byB0aGUgbG9hZGVkVG9rZW5GaWVsZHMgbWFwCi0gICAgZmllbGQgPSBmaWVsZER1cCh0b2tlbiwgdGhpcyk7Ci0gIH0KLSAgCi0gIGZpZWxkLT5jbGFzc0RlZiA9IGNsOwotICBmaWVsZC0+c2lnbmF0dXJlID0gc2lnbmF0dXJlOwotICBmaWVsZC0+bmFtZSA9IG5hbWU7Ci0gIAotICByZXR1cm4gZmllbGQ7Ci19Ci0KLXN0YXRpYyBWTU1ldGhvZCogbWV0aG9kRHVwKHVpbnQzMiYga2V5LCBBc3NlbWJseSogYXNzKSB7Ci0gIFZNTWV0aG9kKiBtZXRoID0gbmV3KGFzcy0+YWxsb2NhdG9yLCAiVk1NZXRob2QiKSBWTU1ldGhvZCgpOwotICBtZXRoLT50b2tlbiA9IGtleTsKLSAgbWV0aC0+Y2FuQmVJbmxpbmVkID0gZmFsc2U7Ci0gIHJldHVybiBtZXRoOwotfQotCi1zdGF0aWMgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2REdXAodWludDMyJiBrZXksIEFzc2VtYmx5KiBhc3MpIHsKLSAgVk1HZW5lcmljTWV0aG9kKiBtZXRoID0gbmV3KGFzcy0+YWxsb2NhdG9yLCAiVk1HZW5lcmljTWV0aG9kIikgVk1HZW5lcmljTWV0aG9kKCk7Ci0gIG1ldGgtPnRva2VuID0ga2V5OwotICBtZXRoLT5jYW5CZUlubGluZWQgPSBmYWxzZTsKLSAgcmV0dXJuIG1ldGg7Ci19Ci0KLVZNTWV0aG9kKiBBc3NlbWJseTo6Y29uc3RydWN0TWV0aG9kKFZNQ2xhc3MqIGNsLCBjb25zdCBVVEY4KiBuYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiB0b2tlbiwgYm9vbCBnZW5lcmljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+KiBnZW5NZXRob2RJbnN0YW50aWF0aW9uLCBWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MpIHsKLSAgVk1NZXRob2QqIG1ldGg7Ci0gIAotICBpZiAoZ2VuQ2xhc3MgPT0gMCAmJiBnZW5lcmljID09IGZhbHNlKSB7Ci0gICAgLy8gd2UgYXJlIG5vdCByZWFkaW5nIGEgZ2VuZXJpYyBjbGFzcyAKLSAgICBtZXRoID0gbG9hZGVkVG9rZW5NZXRob2RzLT5sb29rdXBPckNyZWF0ZSh0b2tlbiwgdGhpcywgbWV0aG9kRHVwKTsKLSAgfSBlbHNlIHsKLSAgICAvLyB3ZSBhcmUgcmVhZGluZyBhIGdlbmVyaWMgY2xhc3Mgb3IgYSBnZW5lcmljIG1ldGhvZCwgZG9uJ3QgYWRkIGEgcmVmZXJlbmNlCi0gICAgLy8gdG8gdGhlIGxvYWRlZFRva2VuTWV0aG9kcyBtYXAKLSAgICBtZXRoID0gbWV0aG9kRHVwKHRva2VuLCB0aGlzKTsKLSAgICAKLSAgICBpZiAoZ2VuZXJpYykgewotICAgICAgLy8gd2UgYXJlIHJlYWRpbmcgYSBnZW5lcmljIG1ldGhvZAotICAgICAgaWYgKGdlbk1ldGhvZEluc3RhbnRpYXRpb24gPT0gTlVMTCkgewotICAgICAgICBjbC0+Z2VuZXJpY01ldGhvZHMucHVzaF9iYWNrKG1ldGgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QgPSBnZW5NZXRob2REdXAodG9rZW4sIHRoaXMpOwotICAgICAgICBnZW5NZXRob2QtPmdlbmVyaWNQYXJhbXMgPSAqZ2VuTWV0aG9kSW5zdGFudGlhdGlvbjsKLSAgICAgICAgbWV0aCA9IGdlbk1ldGhvZDsKLSAgICAgICAgaWYgKGlzU3RhdGljKG1ldGgtPmZsYWdzKSkgewotICAgICAgICAgIGNsLT5zdGF0aWNNZXRob2RzLnB1c2hfYmFjayhtZXRoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBjbC0+dmlydHVhbE1ldGhvZHMucHVzaF9iYWNrKG1ldGgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBtZXRoLT5jbGFzc0RlZiA9IGNsOwotICBtZXRoLT5fc2lnbmF0dXJlID0gMDsKLSAgbWV0aC0+bmFtZSA9IG5hbWU7Ci0gIAotICByZXR1cm4gbWV0aDsKLX0KLQotQXNzZW1ibHk6OkFzc2VtYmx5KG12bTo6QnVtcFB0ckFsbG9jYXRvciAmYWxsb2NhdG9yLCBOMyAqdm0sIGNvbnN0IFVURjggKm5hbWUpIDogYWxsb2NhdG9yKGFsbG9jYXRvcikgewotCXRoaXMtPmxvY2tWYXIgPSBuZXcgbXZtOjpMb2NrUmVjdXJzaXZlKCk7Ci0gIHRoaXMtPmxvYWRlZE5hbWVDbGFzc2VzID0gIG5ldyhhbGxvY2F0b3IsICJDbGFzc05hbWVNYXAiKSAgIENsYXNzTmFtZU1hcCgpOwotICB0aGlzLT5sb2FkZWRUb2tlbkNsYXNzZXMgPSBuZXcoYWxsb2NhdG9yLCAiQ2xhc3NUb2tlbk1hcCIpICBDbGFzc1Rva2VuTWFwKCk7Ci0gIHRoaXMtPmxvYWRlZFRva2VuTWV0aG9kcyA9IG5ldyhhbGxvY2F0b3IsICJNZXRob2RUb2tlbk1hcCIpIE1ldGhvZFRva2VuTWFwKCk7Ci0gIHRoaXMtPmxvYWRlZFRva2VuRmllbGRzID0gIG5ldyhhbGxvY2F0b3IsICJGaWVsZFRva2VuTWFwIikgIEZpZWxkVG9rZW5NYXAoKTsKLQotICB0aGlzLT5hc3NlbWJseVJlZnMgPSAwOwotICB0aGlzLT5pc1JlYWQgPSBmYWxzZTsKLQl0aGlzLT52bSA9IHZtOwotICB0aGlzLT5uYW1lID0gbmFtZTsKLX0KLQotc3RhdGljIHZvaWQgdW5pbXBsZW1lbnRlZCh1aW50MzIgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFRhYmxlKiwgZ2NfYWxsb2NhdG9yPFRhYmxlKj4gPiYgdGFibGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgaGVhcFNpemVzKSB7Ci0gIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoIlVua25vd24gdGFibGUgJXgiLCBpbmRleCk7Ci19Ci0KLW1hc2tWZWN0b3JfdCBBc3NlbWJseTo6bWFza1ZlY3Rvcls2NF0gPSB7Ci0gIE1FVEhPRF9Nb2R1bGUsICAgICAgICAgICAgICAgIC8vIDB4MDAKLSAgTUVUSE9EX1R5cGVSZWYsICAgICAgICAgICAgICAgLy8gMHgwMQotICBNRVRIT0RfVHlwZURlZiwgICAgICAgICAgICAgICAvLyAweDAyCi0gIHVuaW1wbGVtZW50ZWQsICAgICAgICAgICAgICAgIC8vIDB4MDMKLSAgTUVUSE9EX0ZpZWxkLCAgICAgICAgICAgICAgICAgLy8gMHgwNAotICB1bmltcGxlbWVudGVkLCAgICAgICAgICAgICAgICAvLyAweDA1Ci0gIE1FVEhPRF9NZXRob2REZWYsICAgICAgICAgICAgIC8vIDB4MDYKLSAgdW5pbXBsZW1lbnRlZCwgICAgICAgICAgICAgICAgLy8gMHgwNwotICBNRVRIT0RfUGFyYW0sICAgICAgICAgICAgICAgICAvLyAweDA4Ci0gIE1FVEhPRF9JbnRlcmZhY2VJbXBsLCAgICAgICAgIC8vIDB4MDkKLSAgTUVUSE9EX01lbWJlclJlZiwgICAgICAgICAgICAgLy8gMHgwQQotICBNRVRIT0RfQ29uc3RhbnQsICAgICAgICAgICAgICAvLyAweDBCCi0gIE1FVEhPRF9DdXN0b21BdHRyaWJ1dGUsICAgICAgIC8vIDB4MEMKLSAgTUVUSE9EX0ZpZWxkTWFyc2hhbCwgICAgICAgICAgLy8gMHgwRAotICBNRVRIT0RfRGVjbFNlY3VyaXR5LCAgICAgICAgICAvLyAweDBFCi0gIE1FVEhPRF9DbGFzc0xheW91dCwgICAgICAgICAgIC8vIDB4MUYKLSAgTUVUSE9EX0ZpZWxkTGF5b3V0LCAgICAgICAgICAgLy8gMHgxMAotICBNRVRIT0RfU3RhbmRhbG9uZVNpZywgICAgICAgICAvLyAweDExCi0gIE1FVEhPRF9FdmVudE1hcCwgICAgICAgICAgICAgIC8vIDB4MTIKLSAgdW5pbXBsZW1lbnRlZCwgICAgICAgICAgICAgICAgLy8gMHgxMwotICBNRVRIT0RfRXZlbnQsICAgICAgICAgICAgICAgICAvLyAweDE0Ci0gIE1FVEhPRF9Qcm9wZXJ0eU1hcCwgICAgICAgICAgIC8vIDB4MTUKLSAgdW5pbXBsZW1lbnRlZCwgICAgICAgICAgICAgICAgLy8gMHgxNgotICBNRVRIT0RfUHJvcGVydHksICAgICAgICAgICAgICAvLyAweDE3Ci0gIE1FVEhPRF9NZXRob2RTZW1hbnRpY3MsICAgICAgIC8vIDB4MTgKLSAgTUVUSE9EX01ldGhvZEltcGwsICAgICAgICAgICAgLy8gMHgxOQotICBNRVRIT0RfTW9kdWxlUmVmLCAgICAgICAgICAgICAvLyAweDFBCi0gIE1FVEhPRF9UeXBlU3BlYywgICAgICAgICAgICAgIC8vIDB4MUIKLSAgTUVUSE9EX0ltcGxNYXAsICAgICAgICAgICAgICAgLy8gMHgxQwotICBNRVRIT0RfRmllbGRSdmEsICAgICAgICAgICAgICAvLyAweDFECi0gIHVuaW1wbGVtZW50ZWQsICAgICAgICAgICAgICAgIC8vIDB4MUUKLSAgdW5pbXBsZW1lbnRlZCwgICAgICAgICAgICAgICAgLy8gMHgxRgotICBNRVRIT0RfQXNzZW1ibHksICAgICAgICAgICAgICAvLyAweDIwCi0gIE1FVEhPRF9Bc3NlbWJseVByb2Nlc3NvciwgICAgIC8vIDB4MjEKLSAgTUVUSE9EX0Fzc2VtYmx5T1MsICAgICAgICAgICAgLy8gMHgyMgotICBNRVRIT0RfQXNzZW1ibHlSZWYsICAgICAgICAgICAvLyAweDIzCi0gIHVuaW1wbGVtZW50ZWQsICAgICAgICAgICAgICAgIC8vIDB4MjQKLSAgdW5pbXBsZW1lbnRlZCwgICAgICAgICAgICAgICAgLy8gMHgyNQotICBNRVRIT0RfRmlsZSwgICAgICAgICAgICAgICAgICAvLyAweDI2Ci0gIHVuaW1wbGVtZW50ZWQsICAgICAgICAgICAgICAgIC8vIDB4MjcKLSAgTUVUSE9EX01hbmlmZXN0UmVzb3VyY2UsICAgICAgLy8gMHgyOAotICBNRVRIT0RfTmVzdGVkQ2xhc3MsICAgICAgICAgICAvLyAweDI5Ci0gIE1FVEhPRF9HZW5lcmljUGFyYW0sICAgICAgICAgIC8vIDB4MkEKLSAgTUVUSE9EX01ldGhvZFNwZWMsICAgICAgICAgICAgLy8gMHgyQgotICBNRVRIT0RfR2VuZXJpY1BhcmFtQ29uc3RyYWludCwvLyAweDJDCi0gIHVuaW1wbGVtZW50ZWQsCi0gIHVuaW1wbGVtZW50ZWQsCi0gIHVuaW1wbGVtZW50ZWQsCi0gIHVuaW1wbGVtZW50ZWQsIAotICB1bmltcGxlbWVudGVkLAotICB1bmltcGxlbWVudGVkLAotICB1bmltcGxlbWVudGVkLAotICB1bmltcGxlbWVudGVkLAotICB1bmltcGxlbWVudGVkLAotICB1bmltcGxlbWVudGVkLAotICB1bmltcGxlbWVudGVkLAotICB1bmltcGxlbWVudGVkLAotICB1bmltcGxlbWVudGVkLAotICB1bmltcGxlbWVudGVkLAotICB1bmltcGxlbWVudGVkLAotICB1bmltcGxlbWVudGVkLAotICB1bmltcGxlbWVudGVkLAotICB1bmltcGxlbWVudGVkLAotICB1bmltcGxlbWVudGVkCi19OwotCi1jb25zdCBjaGFyKiBBc3NlbWJseTo6bWFza1ZlY3Rvck5hbWVbNjRdID0gewotICAiTUVUSE9EX01vZHVsZSIsICAgICAgICAgICAgICAgIC8vIDB4MDAKLSAgIk1FVEhPRF9UeXBlUmVmIiwgICAgICAgICAgICAgICAvLyAweDAxCi0gICJNRVRIT0RfVHlwZURlZiIsICAgICAgICAgICAgICAgLy8gMHgwMgotICAidW5pbXBsZW1lbnRlZCIsICAgICAgICAgICAgICAgIC8vIDB4MDMKLSAgIk1FVEhPRF9GaWVsZCIsICAgICAgICAgICAgICAgICAvLyAweDA0Ci0gICJ1bmltcGxlbWVudGVkIiwgICAgICAgICAgICAgICAgLy8gMHgwNQotICAiTUVUSE9EX01ldGhvZERlZiIsICAgICAgICAgICAgIC8vIDB4MDYKLSAgInVuaW1wbGVtZW50ZWQiLCAgICAgICAgICAgICAgICAvLyAweDA3Ci0gICJNRVRIT0RfUGFyYW0iLCAgICAgICAgICAgICAgICAgLy8gMHgwOAotICAiTUVUSE9EX0ludGVyZmFjZUltcGwiLCAgICAgICAgIC8vIDB4MDkKLSAgIk1FVEhPRF9NZW1iZXJSZWYiLCAgICAgICAgICAgICAvLyAweDBBCi0gICJNRVRIT0RfQ29uc3RhbnQiLCAgICAgICAgICAgICAgLy8gMHgwQgotICAiTUVUSE9EX0N1c3RvbUF0dHJpYnV0ZSIsICAgICAgIC8vIDB4MEMKLSAgIk1FVEhPRF9GaWVsZE1hcnNoYWwiLCAgICAgICAgICAvLyAweDBECi0gICJNRVRIT0RfRGVjbFNlY3VyaXR5IiwgICAgICAgICAgLy8gMHgwRQotICAiTUVUSE9EX0NsYXNzTGF5b3V0IiwgICAgICAgICAgIC8vIDB4MUYKLSAgIk1FVEhPRF9GaWVsZExheW91dCIsICAgICAgICAgICAvLyAweDEwCi0gICJNRVRIT0RfU3RhbmRhbG9uZVNpZyIsICAgICAgICAgLy8gMHgxMQotICAiTUVUSE9EX0V2ZW50TWFwIiwgICAgICAgICAgICAgIC8vIDB4MTIKLSAgInVuaW1wbGVtZW50ZWQiLCAgICAgICAgICAgICAgICAvLyAweDEzCi0gICJNRVRIT0RfRXZlbnQiLCAgICAgICAgICAgICAgICAgLy8gMHgxNAotICAiTUVUSE9EX1Byb3BlcnR5TWFwIiwgICAgICAgICAgIC8vIDB4MTUKLSAgInVuaW1wbGVtZW50ZWQiLCAgICAgICAgICAgICAgICAvLyAweDE2Ci0gICJNRVRIT0RfUHJvcGVydHkiLCAgICAgICAgICAgICAgLy8gMHgxNwotICAiTUVUSE9EX01ldGhvZFNlbWFudGljcyIsICAgICAgIC8vIDB4MTgKLSAgIk1FVEhPRF9NZXRob2RJbXBsIiwgICAgICAgICAgICAvLyAweDE5Ci0gICJNRVRIT0RfTW9kdWxlUmVmIiwgICAgICAgICAgICAgLy8gMHgxQQotICAiTUVUSE9EX1R5cGVTcGVjIiwgICAgICAgICAgICAgIC8vIDB4MUIKLSAgIk1FVEhPRF9JbXBsTWFwIiwgICAgICAgICAgICAgICAvLyAweDFDCi0gICJNRVRIT0RfRmllbGRSdmEiLCAgICAgICAgICAgICAgLy8gMHgxRAotICAidW5pbXBsZW1lbnRlZCIsICAgICAgICAgICAgICAgIC8vIDB4MUUKLSAgInVuaW1wbGVtZW50ZWQiLCAgICAgICAgICAgICAgICAvLyAweDFGCi0gICJNRVRIT0RfQXNzZW1ibHkiLCAgICAgICAgICAgICAgLy8gMHgyMAotICAiTUVUSE9EX0Fzc2VtYmx5UHJvY2Vzc29yIiwgICAgIC8vIDB4MjEKLSAgIk1FVEhPRF9Bc3NlbWJseU9TIiwgICAgICAgICAgICAvLyAweDIyCi0gICJNRVRIT0RfQXNzZW1ibHlSZWYiLCAgICAgICAgICAgLy8gMHgyMwotICAidW5pbXBsZW1lbnRlZCIsICAgICAgICAgICAgICAgIC8vIDB4MjQKLSAgInVuaW1wbGVtZW50ZWQiLCAgICAgICAgICAgICAgICAvLyAweDI1Ci0gICJNRVRIT0RfRmlsZSIsICAgICAgICAgICAgICAgICAgLy8gMHgyNgotICAidW5pbXBsZW1lbnRlZCIsICAgICAgICAgICAgICAgIC8vIDB4MjcKLSAgIk1FVEhPRF9NYW5pZmVzdFJlc291cmNlIiwgICAgICAvLyAweDI4Ci0gICJNRVRIT0RfTmVzdGVkQ2xhc3MiLCAgICAgICAgICAgLy8gMHgyOQotICAiTUVUSE9EX0dlbmVyaWNQYXJhbSIsICAgICAgICAgIC8vIDB4MkEKLSAgIk1FVEhPRF9NZXRob2RTcGVjIiwgICAgICAgICAgICAvLyAweDJCCi0gICJNRVRIT0RfR2VuZXJpY1BhcmFtQ29uc3RyYWludCIsIC8vIDB4MkMKLSAgInVuaW1wbGVtZW50ZWQiLAotICAidW5pbXBsZW1lbnRlZCIsCi0gICJ1bmltcGxlbWVudGVkIiwKLSAgInVuaW1wbGVtZW50ZWQiLCAKLSAgInVuaW1wbGVtZW50ZWQiLAotICAidW5pbXBsZW1lbnRlZCIsCi0gICJ1bmltcGxlbWVudGVkIiwKLSAgInVuaW1wbGVtZW50ZWQiLAotICAidW5pbXBsZW1lbnRlZCIsCi0gICJ1bmltcGxlbWVudGVkIiwKLSAgInVuaW1wbGVtZW50ZWQiLAotICAidW5pbXBsZW1lbnRlZCIsCi0gICJ1bmltcGxlbWVudGVkIiwKLSAgInVuaW1wbGVtZW50ZWQiLAotICAidW5pbXBsZW1lbnRlZCIsCi0gICJ1bmltcGxlbWVudGVkIiwKLSAgInVuaW1wbGVtZW50ZWQiLAotICAidW5pbXBsZW1lbnRlZCIsCi0gICJ1bmltcGxlbWVudGVkIgotfTsKLQotI2RlZmluZSBFWFRSQUNUX1NJWkUoYml0bWFzaywgaW5kZXgpIFwKLSAgKDEgKyAoMyAmIChiaXRtYXNrID4+IChpbmRleCA8PCAxKSkpKQotCi12b2lkIFRhYmxlOjpyZWFkUm93KHVpbnQzMiogcmVzdWx0LCB1aW50MzIgcm93LCBCeXRlQ29kZSogYXJyYXkpIHsKLSAgdWludDMyIHJvd09mZnNldCA9IG9mZnNldCArICgocm93IC0gMSkgKiByb3dTaXplKTsKLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgdWludDMyIHNpemUgPSBFWFRSQUNUX1NJWkUoc2l6ZU1hc2ssIGkpOwotICAgIHN3aXRjaChzaXplKSB7Ci0gICAgICBjYXNlIDE6IFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOyBicmVhazsKLSAgICAgIGNhc2UgMjogcmVzdWx0W2ldID0gUkVBRF9VMihhcnJheSwgcm93T2Zmc2V0KTsgYnJlYWs7Ci0gICAgICBjYXNlIDQ6IHJlc3VsdFtpXSA9IFJFQURfVTQoYXJyYXksIHJvd09mZnNldCk7IGJyZWFrOwotICAgICAgZGVmYXVsdDogVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigidW5rbm93biBzaXplICVkIiwgc2l6ZSk7IGJyZWFrOwotICAgIH0KLSAgfQotfQotCi11aW50MzIgVGFibGU6OnJlYWRJbmRleEluUm93KHVpbnQzMiByb3csIHVpbnQzMiBpbmRleCwgQnl0ZUNvZGUqIGFycmF5KSB7Ci0gIHVpbnQzMiBpbmRleE9mZnNldCA9IG9mZnNldCArICgocm93IC0gMSkgKiByb3dTaXplKTsKLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBpbmRleDsgKytpKSB7Ci0gICAgaW5kZXhPZmZzZXQgKz0gRVhUUkFDVF9TSVpFKHNpemVNYXNrLCBpKTsKLSAgfQotCi0gIHVpbnQzMiBzaXplID0gRVhUUkFDVF9TSVpFKHNpemVNYXNrLCBpbmRleCk7Ci0KLSAgc3dpdGNoKHNpemUpIHsKLSAgICBjYXNlIDE6IFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOyBicmVhazsKLSAgICBjYXNlIDI6IHJldHVybiBSRUFEX1UyKGFycmF5LCBpbmRleE9mZnNldCk7Ci0gICAgY2FzZSA0OiByZXR1cm4gUkVBRF9VNChhcnJheSwgaW5kZXhPZmZzZXQpOwotICAgIGRlZmF1bHQ6IFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoInVua25vd24gc2l6ZSAlZCIsIHNpemUpOyBicmVhazsKLSAgfQotCi0gIC8vIHVucmVhY2hhYmxlCi0gIHJldHVybiAwOwotfQotCi12b2lkIFNlY3Rpb246OnJlYWQoUmVhZGVyKiByZWFkZXIsIE4zKiB2bSkgewotICBuYW1lID0gKGNoYXIqKSBtYWxsb2MoU0VDVElPTl9OQU1FX0xFTkdUSCk7Ci0gIG1lbWNweShuYW1lLCAmKHJlYWRlci0+Ynl0ZXMtPmVsZW1lbnRzW3JlYWRlci0+Y3Vyc29yXSksCi0gICAgICAgICAgICAgU0VDVElPTl9OQU1FX0xFTkdUSCk7Ci0gIHJlYWRlci0+Y3Vyc29yICs9IFNFQ1RJT05fTkFNRV9MRU5HVEg7Ci0KLSAgdmlydHVhbFNpemUgICAgICAgPSByZWFkZXItPnJlYWRVNCgpOwotICB2aXJ0dWFsQWRkcmVzcyAgICA9IHJlYWRlci0+cmVhZFU0KCk7Ci0gIHJhd1NpemUgICAgICAgICAgID0gcmVhZGVyLT5yZWFkVTQoKTsKLSAgcmF3QWRkcmVzcyAgICAgICAgPSByZWFkZXItPnJlYWRVNCgpOwotICByZWxvY0FkZHJlc3MgICAgICA9IHJlYWRlci0+cmVhZFU0KCk7Ci0gIGxpbmVOdW1iZXJzICAgICAgID0gcmVhZGVyLT5yZWFkVTQoKTsKLSAgcmVsb2NhdGlvbnNOdW1iZXIgPSByZWFkZXItPnJlYWRVMigpOwotICBsaW5lTnVtYmVyc051bWJlciA9IHJlYWRlci0+cmVhZFUyKCk7Ci0gIGNoYXJhY3RlcmlzdGljcyAgID0gcmVhZGVyLT5yZWFkVTQoKTsKLX0KLQotdm9pZCBIZWFkZXI6OnJlYWQobXZtOjpCdW1wUHRyQWxsb2NhdG9yICZhbGxvY2F0b3IsIFJlYWRlciogcmVhZGVyLCBOMyogdm0pIHsKLSAgdWludDMyIHN0YXJ0ID0gcmVhZGVyLT5jdXJzb3I7Ci0gIHNpZ25hdHVyZSA9IHJlYWRlci0+cmVhZFU0KCk7Ci0gIG1ham9yID0gcmVhZGVyLT5yZWFkVTIoKTsKLSAgbWlub3IgPSByZWFkZXItPnJlYWRVMigpOwotICByZXNlcnZlZCA9IHJlYWRlci0+cmVhZFU0KCk7Ci0gIHZlcnNpb25MZW5ndGggPSByZWFkZXItPnJlYWRVNCgpOwotICB2ZXJzaW9uTmFtZSA9IEFzc2VtYmx5OjpyZWFkVVRGOCh2bSwgdmVyc2lvbkxlbmd0aCwgcmVhZGVyKTsKLSAgZmxhZ3MgPSByZWFkZXItPnJlYWRVMigpOwotICBuYlN0cmVhbXMgPSByZWFkZXItPnJlYWRVMigpOwotCi0gIGZvciAodWludDMyIGkgPSAwOyBpIDwgbmJTdHJlYW1zOyArK2kpIHsKLSAgICB1aW50MzIgb2Zmc2V0ID0gcmVhZGVyLT5yZWFkVTQoKTsKLSAgICB1aW50MzIgc2l6ZSA9IHJlYWRlci0+cmVhZFU0KCk7Ci0gICAgdWludDMyIGxlbiA9IAotICAgICAgc3RybGVuKChjaGFyKikoJihyZWFkZXItPmJ5dGVzLT5lbGVtZW50c1tyZWFkZXItPmN1cnNvcl0pKSk7Ci0KLSAgICBTdHJlYW0qIHN0cmVhbSA9IG5ldyhhbGxvY2F0b3IsICJTdHJlYW0iKSBTdHJlYW0oKTsKLSAgICBjaGFyKiBzdHIgPSAoY2hhciopbWFsbG9jKGxlbiArIDEpOwotICAgIG1lbWNweShzdHIsICYocmVhZGVyLT5ieXRlcy0+ZWxlbWVudHNbcmVhZGVyLT5jdXJzb3JdKSwgbGVuICsgMSk7Ci0gICAgcmVhZGVyLT5jdXJzb3IgKz0gKGxlbiArICg0IC0gKGxlbiAlIDQpKSk7Ci0KLSAgICBzdHJlYW0tPnJlYWxPZmZzZXQgPSBzdGFydCArIG9mZnNldDsKLSAgICBzdHJlYW0tPnNpemUgPSBzaXplOwotICAgIHN0cmVhbS0+bmFtZSA9IHN0cjsKLQotICAgIGlmICghKHN0cmNtcChzdHIsICIjfiIpKSkgdGlsZFN0cmVhbSA9IHN0cmVhbTsKLSAgICBlbHNlIGlmICghKHN0cmNtcChzdHIsICIjU3RyaW5ncyIpKSkgc3RyaW5nU3RyZWFtID0gc3RyZWFtOwotICAgIGVsc2UgaWYgKCEoc3RyY21wKHN0ciwgIiNVUyIpKSkgdXNTdHJlYW0gPSBzdHJlYW07Ci0gICAgZWxzZSBpZiAoIShzdHJjbXAoc3RyLCAiI0Jsb2IiKSkpIGJsb2JTdHJlYW0gPSBzdHJlYW07Ci0gICAgZWxzZSBpZiAoIShzdHJjbXAoc3RyLCAiI0dVSUQiKSkpIGd1aWRTdHJlYW0gPSBzdHJlYW07Ci0gICAgZWxzZSBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbnZhbGlkIHN0cmVhbSAlcyIsIHN0cik7Ci0gIH0KLX0KLQotY29uc3QgQXJyYXlDaGFyKiBBc3NlbWJseTo6cmVhZFVURjE2KE4zKiB2bSwgdWludDMyIGxlbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRlciogcmVhZGVyKSB7Ci0JZGVjbGFyZV9nY3Jvb3QoY29uc3QgQXJyYXlDaGFyKiwgcmVzKSA9IHJlYWRVVEYxNih2bSwgbGVuLCByZWFkZXItPmJ5dGVzLCByZWFkZXItPmN1cnNvcik7Ci0gIHJldHVybiByZXM7Ci19Ci0KLWNvbnN0IEFycmF5Q2hhciogQXNzZW1ibHk6OnJlYWRVVEYxNihOMyogdm0sIHVpbnQzMiBsZW4sIAotCQkJCQkJCQkJCQkJCQkJCQkJCSBCeXRlQ29kZSogYnl0ZXMsIHVpbnQzMiAmb2Zmc2V0KSB7Ci0gIHVpbnQzMiByZWFsTGVuID0gbGVuID4+IDE7Ci0gIHVpbnQxNiogYnVmID0gKHVpbnQxNiopYWxsb2NhKGxlbik7Ci0gIHVpbnQzMiBpID0gMDsKLSAgd2hpbGUgKGkgPCByZWFsTGVuKSB7Ci0gICAgdWludDE2IGN1ciA9IFJFQURfVTIoYnl0ZXMsIG9mZnNldCk7Ci0gICAgYnVmW2ldID0gY3VyOwotICAgICsraTsKLSAgfQotCWRlY2xhcmVfZ2Nyb290KEFycmF5Q2hhciosIHJlcykgPSB2bS0+YnVmVG9BcnJheShidWYsIHJlYWxMZW4pOyAKLQlyZXR1cm4gcmVzOwotfQotCi1jb25zdCBVVEY4KiBBc3NlbWJseTo6cmVhZFVURjgoTjMqIHZtLCB1aW50MzIgbGVuLCBSZWFkZXIqIHJlYWRlcikgewotICByZXR1cm4gcmVhZFVURjgodm0sIGxlbiwgcmVhZGVyLT5ieXRlcywgcmVhZGVyLT5jdXJzb3IpOwotfQotCi1jb25zdCBVVEY4KiBBc3NlbWJseTo6cmVhZFVURjgoTjMqIHZtLCB1aW50MzIgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVDb2RlKiBieXRlcywgdWludDMyICZvZmZzZXQpIHsKLSAgdWludDE2KiBidWYgPSAodWludDE2KilhbGxvY2EobGVuICogc2l6ZW9mKHVpbnQxNikpOwotICB1aW50MzIgbiA9IDA7Ci0gIHVpbnQzMiBpID0gMDsKLSAgCi0gIHdoaWxlIChpIDwgbGVuKSB7Ci0gICAgdWludDMyIGN1ciA9IFJFQURfVTEoYnl0ZXMsIG9mZnNldCk7Ci0gICAgaWYgKGN1ciAmIDB4ODApIHsKLSAgICAgIHVpbnQzMiB5ID0gUkVBRF9VMShieXRlcywgb2Zmc2V0KTsKLSAgICAgIGlmIChjdXIgJiAweDIwKSB7Ci0gICAgICAgIHVpbnQzMiB6ID0gUkVBRF9VMShieXRlcywgb2Zmc2V0KTsKLSAgICAgICAgY3VyID0gKChjdXIgJiAweDBGKSA8PCAxMikgKwotICAgICAgICAgICAgICAoKHkgJiAweDNGKSA8PCA2KSArCi0gICAgICAgICAgICAgICh6ICYgMHgzRik7Ci0gICAgICAgIGkgKz0gMzsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGN1ciA9ICgoY3VyICYgMHgxRikgPDwgNikgKwotICAgICAgICAgICAgICAoeSAmIDB4M0YpOwotICAgICAgICBpICs9IDI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICsraTsKLSAgICB9Ci0gICAgYnVmW25dID0gKCh1aW50MTYpY3VyKTsKLSAgICArK247Ci0gIH0KLQotICBjb25zdCBVVEY4KiB1dGY4ID0gdm0tPmJ1ZlRvVVRGOChidWYsIG4pOwotCi0gIHJldHVybiB1dGY4OwotfQotCi1jb25zdCBVVEY4KiBBc3NlbWJseTo6cmVhZFN0cmluZyhOMyogdm0sIHVpbnQzMiBvZmZzZXQpIHsKLSAgdWludDMyIGVuZCA9IG9mZnNldDsKLSAgdWludDMyIGN1ciA9IDA7Ci0gIHdoaWxlICgoY3VyID0gUkVBRF9VMShieXRlcywgZW5kKSkgIT0gMCkge30KLSAgcmV0dXJuIHJlYWRVVEY4KHZtLCAoZW5kIC0gMSAtIG9mZnNldCksIGJ5dGVzLCBvZmZzZXQpOwotfQotCi12b2lkIEFzc2VtYmx5OjpyZWFkVGFibGVzKFJlYWRlciogcmVhZGVyKSB7Ci0gIC8vdWludDMyIHJlc2VydmVkMSA9IAotICByZWFkZXItPnJlYWRVNCgpOwotICAvL3VpbnQ4IG1ham9yID0gCi0gIHJlYWRlci0+cmVhZFUxKCk7Ci0gIC8vdWludDggbWlub3IgPSAKLSAgcmVhZGVyLT5yZWFkVTEoKTsKLSAgdWludDggaGVhcFNpemVzID0gcmVhZGVyLT5yZWFkVTEoKTsKLSAgLy91aW50OCByZXNlcnZlZDIgPSAKLSAgcmVhZGVyLT5yZWFkVTEoKTsKLSAgdWludDMyIHZhbGlkTG93ID0gcmVhZGVyLT5yZWFkVTQoKTsKLSAgdWludDMyIHZhbGlkSGlnaCA9IHJlYWRlci0+cmVhZFU0KCk7Ci0gIC8vdWludDMyIHNvcnRlZExvdyA9IAotICByZWFkZXItPnJlYWRVNCgpOwotICAvL3VpbnQzMiBzb3J0ZWRIaWdoID0gCi0gIHJlYWRlci0+cmVhZFU0KCk7Ci0gIHVpbnQzMiB0YWJsZU51bWJlciA9IDA7Ci0gIHVpbnQzMiBvZmZzZXQgPSAwOwotCi0gIGZvciAodWludDMyIGkgPSAwOyBpIDwgMzI7ICsraSkgewotICAgIFRhYmxlKiB0YWJsZSA9IG5ldyhhbGxvY2F0b3IsICJUYWJsZSIpIFRhYmxlKCk7Ci0gICAgaWYgKCgxIDw8IGkpICYgdmFsaWRMb3cpIHsKLSAgICAgIHRhYmxlLT5yb3dzTnVtYmVyID0gcmVhZGVyLT5yZWFkVTQoKTsKLSAgICAgICsrdGFibGVOdW1iZXI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRhYmxlLT5yb3dzTnVtYmVyID0gMDsKLSAgICB9Ci0gICAgQ0xJSGVhZGVyLT50YWJsZXMucHVzaF9iYWNrKHRhYmxlKTsKLSAgfQotCi0gIGZvciAodWludDMyIGkgPSAwOyBpIDwgMzI7ICsraSkgewotICAgIFRhYmxlKiB0YWJsZSA9IG5ldyhhbGxvY2F0b3IsICJUYWJsZSIpIFRhYmxlKCk7Ci0gICAgaWYgKCgxIDw8IGkpICYgdmFsaWRIaWdoKSB7Ci0gICAgICB0YWJsZS0+cm93c051bWJlciA9IHJlYWRlci0+cmVhZFU0KCk7Ci0gICAgICArK3RhYmxlTnVtYmVyOwotICAgIH0gZWxzZSB7Ci0gICAgICB0YWJsZS0+cm93c051bWJlciA9IDA7Ci0gICAgfQotICAgIENMSUhlYWRlci0+dGFibGVzLnB1c2hfYmFjayh0YWJsZSk7Ci0gIH0KLQotICBvZmZzZXQgPSByZWFkZXItPmN1cnNvcjsKLSAgCi0gIHVpbnQzMiBpbmRleCA9IDA7Ci0gIGZvciAoc3RkOjp2ZWN0b3I8VGFibGUqLCBnY19hbGxvY2F0b3I8VGFibGUqPiA+OjppdGVyYXRvciBpID0gCi0gICAgICAgICAgIENMSUhlYWRlci0+dGFibGVzLmJlZ2luKCksCi0gICAgICAgZSA9IENMSUhlYWRlci0+dGFibGVzLmVuZCgpOyBpICE9IGU7ICsraSwgKytpbmRleCkgewotICAgIFRhYmxlKiB0YWJsZSA9ICgqaSk7Ci0gICAgaWYgKHRhYmxlLT5yb3dzTnVtYmVyKSB7Ci0gICAgICBtYXNrVmVjdG9yW2luZGV4XShpbmRleCwgQ0xJSGVhZGVyLT50YWJsZXMsIGhlYXBTaXplcyk7Ci0gICAgICB0YWJsZS0+b2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgb2Zmc2V0ICs9ICh0YWJsZS0+cm93c051bWJlciAqIHRhYmxlLT5yb3dTaXplKTsKLSAgICB9Ci0gIH0KLX0KLQotUmVhZGVyICpBc3NlbWJseTo6bmV3UmVhZGVyKEJ5dGVDb2RlKiBhcnJheSwgdWludDMyIHN0YXJ0LCB1aW50MzIgZW5kKSB7IAotCXJldHVybiBuZXcoYWxsb2NhdG9yLCAiUmVhZGVyIikgUmVhZGVyKGFycmF5LCBzdGFydCwgZW5kKTsgCi19Ci0KLWludCBBc3NlbWJseTo6cmVzb2x2ZShpbnQgZG9SZXNvbHZlLCBjb25zdCBjaGFyICpleHQpIHsKLQlpZighYnl0ZXMpCi0JCW9wZW4oZXh0KTsKLQotCWlmKGJ5dGVzICYmIGRvUmVzb2x2ZSAmJiAhaXNSZWFkKSB7Ci0JCWxvY2tWYXItPmxvY2soKTsKLQkJaWYoIWlzUmVhZCkgewotCQkJUmVhZGVyKiByZWFkZXIgPSBuZXdSZWFkZXIoYnl0ZXMpOwotCQkJUFJJTlRfREVCVUcoTjNfTE9BRCwgMSwgTElHSFRfR1JFRU4sICJSZWFkaW5nICVzOjolcyIsIG12bTo6UHJpbnRCdWZmZXIodm0pLmNTdHJpbmcoKSwKLQkJCQkJCQkJCW12bTo6UHJpbnRCdWZmZXIodGhpcykuY1N0cmluZygpKTsKLQotCQkJdGV4dFNlY3Rpb24gPSAgbmV3KGFsbG9jYXRvciwgIlNlY3Rpb24iKSBTZWN0aW9uKCk7Ci0JCQlyc3JjU2VjdGlvbiA9ICBuZXcoYWxsb2NhdG9yLCAiU2VjdGlvbiIpIFNlY3Rpb24oKTsKLQkJCXJlbG9jU2VjdGlvbiA9IG5ldyhhbGxvY2F0b3IsICJTZWN0aW9uIikgU2VjdGlvbigpOwotCi0JCQlyZWFkZXItPnNlZWsoVEVYVF9TRUNUSU9OX0hFQURFUiwgUmVhZGVyOjpTZWVrU2V0KTsKLQkJCXRleHRTZWN0aW9uLT5yZWFkKHJlYWRlciwgdm0pOwotCQkJcnNyY1NlY3Rpb24tPnJlYWQocmVhZGVyLCB2bSk7Ci0JCQlyZWxvY1NlY3Rpb24tPnJlYWQocmVhZGVyLCB2bSk7Ci0KLQkJCXJlYWRlci0+c2VlayhDTElfSEVBREVSLCBSZWFkZXI6OlNlZWtTZXQpOwotCQkJQ0xJSGVhZGVyTG9jYXRpb24gPSByZWFkZXItPnJlYWRVNCgpOwotCQkJcmVhZGVyLT5zZWVrKHRleHRTZWN0aW9uLT5yYXdBZGRyZXNzICsgCi0JCQkJCQkJCQkgKENMSUhlYWRlckxvY2F0aW9uIC0gdGV4dFNlY3Rpb24tPnZpcnR1YWxBZGRyZXNzKSwKLQkJCQkJCQkJCSBSZWFkZXI6OlNlZWtTZXQpOwotCi0JCQljYiAgICAgICAgICA9IHJlYWRlci0+cmVhZFU0KCk7Ci0JCQltYWpvciAgICAgICA9IHJlYWRlci0+cmVhZFUyKCk7Ci0JCQltaW5vciAgICAgICA9IHJlYWRlci0+cmVhZFUyKCk7Ci0JCQltZFJ2YSAgICAgICA9IHJlYWRlci0+cmVhZFU0KCk7Ci0JCQltZFNpemUgICAgICA9IHJlYWRlci0+cmVhZFU0KCk7Ci0JCQlmbGFncyAgICAgICA9IHJlYWRlci0+cmVhZFU0KCk7Ci0JCQllbnRyeVBvaW50ICA9IHJlYWRlci0+cmVhZFU0KCk7Ci0JCQlyZXNSdmEgICAgICA9IHJlYWRlci0+cmVhZFU0KCk7Ci0JCQlyZXNTaXplICAgICA9IHJlYWRlci0+cmVhZFU0KCk7Ci0gIAotCQkJcmVhZGVyLT5zZWVrKHRleHRTZWN0aW9uLT5yYXdBZGRyZXNzICsgKG1kUnZhIC0gdGV4dFNlY3Rpb24tPnZpcnR1YWxBZGRyZXNzKSwKLQkJCQkJCQkJCSBSZWFkZXI6OlNlZWtTZXQpOwotCi0JCQlDTElIZWFkZXIgPSBuZXcgKGFsbG9jYXRvciwgIkhlYWRlciIpIEhlYWRlcigpOwotCQkJQ0xJSGVhZGVyLT5yZWFkKGFsbG9jYXRvciwgcmVhZGVyLCB2bSk7Ci0KLQkJCXJlYWRlci0+c2VlayhDTElIZWFkZXItPnRpbGRTdHJlYW0tPnJlYWxPZmZzZXQsIFJlYWRlcjo6U2Vla1NldCk7Ci0KLQkJCXJlYWRUYWJsZXMocmVhZGVyKTsKLQotCQkJaXNSZWFkID0gMTsKLQkJfQotCQlsb2NrVmFyLT51bmxvY2soKTsKLQl9Ci0KLQlyZXR1cm4gYnl0ZXMgPyAoZG9SZXNvbHZlID8gaXNSZWFkIDogMSkgOiAwOwotfQotCi1pbnQgQXNzZW1ibHk6Om9wZW4oY29uc3QgY2hhciAqZXh0KSB7Ci0JbG9ja1Zhci0+bG9jaygpOwotCW12bTo6UHJpbnRCdWZmZXIgX2FzY2lpeiA9IG12bTo6UHJpbnRCdWZmZXIobmFtZSk7Ci0JY29uc3QgY2hhciogYXNjaWl6ID0gX2FzY2lpei5jU3RyaW5nKCk7Ci0JdWludDMyIGFsZW4gPSBzdHJsZW4oYXNjaWl6KTsKLQotCXVpbnQzMiBpZHggPSAwOwotCi0Jd2hpbGUgKChieXRlcyA9PSAwKSAmJiAoaWR4IDwgdm0tPmFzc2VtYmx5UGF0aC5zaXplKCkpKSB7Ci0JCWNvbnN0IGNoYXIqIGN1ciA9IHZtLT5hc3NlbWJseVBhdGhbaWR4XTsKLQkJdWludDMyIHN0ckxlbiA9IHN0cmxlbihjdXIpOwotCQljaGFyKiBidWYgPSAoY2hhciopYWxsb2NhKHN0ckxlbiArIGFsZW4gKyAxNik7Ci0KLQkJaWYgKGV4dCAhPSAwKSB7Ci0JCQlzcHJpbnRmKGJ1ZiwgIiVzJXMuJXMiLCBjdXIsIGFzY2lpeiwgZXh0KTsKLQkJfSBlbHNlIHsKLQkJCXNwcmludGYoYnVmLCAiJXMlcyIsIGN1ciwgYXNjaWl6KTsKLQkJfQotCQkJCi0JCWJ5dGVzID0gUmVhZGVyOjpvcGVuRmlsZShhbGxvY2F0b3IsIGJ1Zik7Ci0JCSsraWR4OwotCX0KLQlsb2NrVmFyLT51bmxvY2soKTsKLQotCXJldHVybiBieXRlcyA/IDEgOiAwOwotfQotCi11aW50MzIgQXNzZW1ibHk6OmdldFR5cGVEZWZUb2tlbkZyb21NZXRob2QodWludDMyIHRva2VuKSB7Ci0gIHVpbnQzMiBpbmRleCA9IHRva2VuICYgMHhmZmZmOwotICBUYWJsZSogdHlwZVRhYmxlID0gQ0xJSGVhZGVyLT50YWJsZXNbQ09OU1RBTlRfVHlwZURlZl07Ci0gIHVpbnQzMiBuYlJvd3MgPSB0eXBlVGFibGUtPnJvd3NOdW1iZXI7Ci0gIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgdWludDMyIGkgPSAwOwotICAKLSAgd2hpbGUgKCFmb3VuZCAmJiAoaSA8IG5iUm93cyAtIDEpKSB7Ci0gICAgCi0gICAgdWludDMyIG15SWQgPSB0eXBlVGFibGUtPnJlYWRJbmRleEluUm93KGkgKyAxLCBDT05TVEFOVF9UWVBFREVGX01FVEhPRExJU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzKTsKLSAgICB1aW50MzIgbmV4dElkID0gdHlwZVRhYmxlLT5yZWFkSW5kZXhJblJvdyhpICsgMiwgQ09OU1RBTlRfVFlQRURFRl9NRVRIT0RMSVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzKTsKLQotICAgIGlmIChpbmRleCA8IG5leHRJZCAmJiBpbmRleCA+PSBteUlkKSB7Ci0gICAgICBmb3VuZCA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICsraTsKLSAgICB9Ci0gIH0KLSAgCi0gIHJldHVybiBpICsgMSArIChDT05TVEFOVF9UeXBlRGVmIDw8IDI0KTsKLX0KLQotVk1Db21tb25DbGFzcyogQXNzZW1ibHk6OnJlYWRUeXBlU3BlYyhOMyogdm0sIHVpbnQzMiBpbmRleCwgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCkgewotICB1aW50MzIgYmxvYk9mZnNldCA9IENMSUhlYWRlci0+YmxvYlN0cmVhbS0+cmVhbE9mZnNldDsKLSAgVGFibGUqIHR5cGVUYWJsZSAgPSBDTElIZWFkZXItPnRhYmxlc1tDT05TVEFOVF9UeXBlU3BlY107Ci0gIHVpbnQzMiogdHlwZUFycmF5ID0gKHVpbnQzMiopYWxsb2NhKHNpemVvZih1aW50MzIpICogdHlwZVRhYmxlLT5yb3dTaXplKTsKLSAgdHlwZVRhYmxlLT5yZWFkUm93KHR5cGVBcnJheSwgaW5kZXgsIGJ5dGVzKTsKLSAgCi0gIHVpbnQzMiBzaWduT2Zmc2V0ID0gdHlwZUFycmF5W0NPTlNUQU5UX1RZUEVTUEVDX1NJR05BVFVSRV07Ci0gIAotICB1aW50MzIgb2Zmc2V0ID0gYmxvYk9mZnNldCArIHNpZ25PZmZzZXQ7Ci0gIHJldHVybiBleHRyYWN0VHlwZUluU2lnbmF0dXJlKG9mZnNldCwgZ2VuQ2xhc3MsIGdlbk1ldGhvZCk7Ci0gIAotfQotCi1WTUNvbW1vbkNsYXNzKiBBc3NlbWJseTo6bG9va3VwQ2xhc3NGcm9tTmFtZShjb25zdCBVVEY4KiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVVRGOCogbmFtZVNwYWNlKSB7Ci0gIENsYXNzTmFtZUNtcCBDQyhuYW1lLCBuYW1lU3BhY2UpOwotICByZXR1cm4gbG9hZGVkTmFtZUNsYXNzZXMtPmxvb2t1cChDQyk7Ci19Ci0KLVZNQ29tbW9uQ2xhc3MqIEFzc2VtYmx5Ojpsb29rdXBDbGFzc0Zyb21Ub2tlbih1aW50MzIgdG9rZW4pIHsKLSAgcmV0dXJuIGxvYWRlZFRva2VuQ2xhc3Nlcy0+bG9va3VwKHRva2VuKTsKLX0KLQotVk1NZXRob2QqIEFzc2VtYmx5Ojpsb29rdXBNZXRob2RGcm9tVG9rZW4odWludDMyIHRva2VuKSB7Ci0gIHJldHVybiBsb2FkZWRUb2tlbk1ldGhvZHMtPmxvb2t1cCh0b2tlbik7Ci19Ci1WTUZpZWxkKiBBc3NlbWJseTo6bG9va3VwRmllbGRGcm9tVG9rZW4odWludDMyIHRva2VuKSB7Ci0gIHJldHVybiBsb2FkZWRUb2tlbkZpZWxkcy0+bG9va3VwKHRva2VuKTsKLX0KLQotCi0KLVZNQ29tbW9uQ2xhc3MqIEFzc2VtYmx5OjpnZXRDbGFzc0Zyb21OYW1lKE4zKiB2bSwgY29uc3QgVVRGOCogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVURjgqIG5hbWVTcGFjZSkgewotICBWTUNvbW1vbkNsYXNzKiB0eXBlID0gbG9va3VwQ2xhc3NGcm9tTmFtZShuYW1lLCBuYW1lU3BhY2UpOwotCi0gIGlmICh0eXBlID09IDApIHsKLSAgICBUYWJsZSogdHlwZVRhYmxlICA9IENMSUhlYWRlci0+dGFibGVzW0NPTlNUQU5UX1R5cGVEZWZdOwotICAgIHVpbnQzMiBuYiA9IHR5cGVUYWJsZS0+cm93c051bWJlcjsKLSAgICB1aW50MzIgc3RyaW5nT2Zmc2V0ID0gQ0xJSGVhZGVyLT5zdHJpbmdTdHJlYW0tPnJlYWxPZmZzZXQ7Ci0KLSAgICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IG5iOyArK2kpIHsKLSAgICAgIHVpbnQzMiB2YWx1ZSA9IHR5cGVUYWJsZS0+cmVhZEluZGV4SW5Sb3coaSArIDEsIENPTlNUQU5UX1RZUEVERUZfTkFNRSwgYnl0ZXMpOwotICAgICAgY29uc3QgVVRGOCogY3VyTmFtZSA9IHJlYWRTdHJpbmcodm0sIHN0cmluZ09mZnNldCArIHZhbHVlKTsKLSAgICAgIGlmIChuYW1lID09IGN1ck5hbWUpIHsKLSAgICAgICAgdWludDMyIHZhbHVlID0gdHlwZVRhYmxlLT5yZWFkSW5kZXhJblJvdyhpICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05TVEFOVF9UWVBFREVGX05BTUVTUEFDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcyk7Ci0gICAgICAgIGNvbnN0IFVURjgqIGN1ck5hbWVTcGFjZSA9IHJlYWRTdHJpbmcodm0sIHN0cmluZ09mZnNldCArIHZhbHVlKTsKLSAgICAgICAgaWYgKGN1ck5hbWVTcGFjZSA9PSBuYW1lU3BhY2UpIHsKLSAgICAgICAgICByZXR1cm4gcmVhZFR5cGVEZWYodm0sIGkgKyAxKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybiB0eXBlOwotfQotCi1Bc3NlbWJseSogQXNzZW1ibHk6OnJlYWRBc3NlbWJseVJlZihOMyogdm0sIHVpbnQzMiBpbmRleCkgewotICBpZiAoYXNzZW1ibHlSZWZzID09IDApIHsKLSAgICB1aW50MzIgc2l6ZSA9IHNpemVvZihBc3NlbWJseSopKgotICAgICAgICAgICAgICAgICAgICAgIENMSUhlYWRlci0+dGFibGVzW0NPTlNUQU5UX0Fzc2VtYmx5UmVmXS0+cm93c051bWJlcjsKLSAgICBhc3NlbWJseVJlZnMgPSAoQXNzZW1ibHkqKiltYWxsb2Moc2l6ZSk7Ci0gICAgbWVtc2V0KGFzc2VtYmx5UmVmcywgMCwgc2l6ZSk7Ci0gIH0KLSAgQXNzZW1ibHkqIHJlZiA9IGFzc2VtYmx5UmVmc1tpbmRleCAtIDFdOwotICBpZiAocmVmID09IDApIHsKLSAgICB1aW50MzIgc3RyaW5nT2Zmc2V0ID0gQ0xJSGVhZGVyLT5zdHJpbmdTdHJlYW0tPnJlYWxPZmZzZXQ7Ci0gICAgVGFibGUqIGFzc1RhYmxlID0gQ0xJSGVhZGVyLT50YWJsZXNbQ09OU1RBTlRfQXNzZW1ibHlSZWZdOwotICAgIHVpbnQzMiogYXNzQXJyYXkgPSAodWludDMyKilhbGxvY2Eoc2l6ZW9mKHVpbnQzMikgKiBhc3NUYWJsZS0+cm93U2l6ZSk7Ci0gICAgYXNzVGFibGUtPnJlYWRSb3coYXNzQXJyYXksIGluZGV4LCBieXRlcyk7Ci0gICAgY29uc3QgVVRGOCogbmFtZSA9IAotICAgICAgcmVhZFN0cmluZyh2bSwgc3RyaW5nT2Zmc2V0ICsgYXNzQXJyYXlbQ09OU1RBTlRfQVNTRU1CTFlfUkVGX05BTUVdKTsKLSAgICAKLSAgICByZWYgPSB2bS0+Y29uc3RydWN0QXNzZW1ibHkobmFtZSk7Ci0KLSAgICBpZighcmVmLT5yZXNvbHZlKDEsICJkbGwiKSkKLQkJCSBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLQotICAgIGFzc2VtYmx5UmVmc1tpbmRleCAtIDFdID0gcmVmOwotICB9Ci0gIHJldHVybiByZWY7Ci19Ci0KLVZNQ29tbW9uQ2xhc3MqIEFzc2VtYmx5OjpyZWFkVHlwZVJlZihOMyogdm0sIHVpbnQzMiBpbmRleCkgewotICB1aW50MzIgc3RyaW5nT2Zmc2V0ID0gQ0xJSGVhZGVyLT5zdHJpbmdTdHJlYW0tPnJlYWxPZmZzZXQ7Ci0gIAotICBUYWJsZSogdHlwZVRhYmxlICA9IENMSUhlYWRlci0+dGFibGVzW0NPTlNUQU5UX1R5cGVSZWZdOwotICB1aW50MzIqIHR5cGVBcnJheSA9ICh1aW50MzIqKWFsbG9jYShzaXplb2YodWludDMyKSAqIHR5cGVUYWJsZS0+cm93U2l6ZSk7Ci0gIAotICB0eXBlVGFibGUtPnJlYWRSb3codHlwZUFycmF5LCBpbmRleCwgYnl0ZXMpOwotCi0gIHVpbnQzMiByZXNTY29wZSAgID0gdHlwZUFycmF5W0NPTlNUQU5UX1RZUEVSRUZfUkVTT0xVVElPTl9TQ09QRV07Ci0gIHVpbnQzMiBuYW1lICAgICAgID0gdHlwZUFycmF5W0NPTlNUQU5UX1RZUEVSRUZfTkFNRV07Ci0gIHVpbnQzMiBuYW1lU3BhY2UgID0gdHlwZUFycmF5W0NPTlNUQU5UX1RZUEVSRUZfTkFNRVNQQUNFXTsKLSAgCi0KLSAgdWludDMyIHZhbCA9IHJlc1Njb3BlICYgMzsKLSAgdWludDMyIGVudHJ5ID0gcmVzU2NvcGUgPj4gMjsKLSAgVk1Db21tb25DbGFzcyogdHlwZSA9IDA7Ci0gIAotICBzd2l0Y2ggKHZhbCkgewotICAgIGNhc2UgMDogVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lICVkICVkIiwgdmFsLCBlbnRyeSk7IGJyZWFrOwotICAgIGNhc2UgMTogVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lICVkLCAlZCIsIHZhbCwgZW50cnkpOyBicmVhazsKLSAgICBjYXNlIDI6IHsKLSAgICAgIEFzc2VtYmx5KiByZWZBc3NlbWJseSA9IHJlYWRBc3NlbWJseVJlZih2bSwgZW50cnkpOwotICAgICAgdHlwZSA9IHJlZkFzc2VtYmx5LT5nZXRDbGFzc0Zyb21OYW1lKHZtLCByZWFkU3RyaW5nKHZtLCBzdHJpbmdPZmZzZXQgKyBuYW1lKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFN0cmluZyh2bSwgc3RyaW5nT2Zmc2V0ICsgbmFtZVNwYWNlKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSAzOiBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUgJWQgJWQiLHZhbCwgZW50cnkpOyBicmVhazsKLSAgICBkZWZhdWx0OiAKLSAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoInVua2tub3duIHJlc29sdXRpb24gc2NvcGUgJXgiLCB2YWwpOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIHR5cGU7Ci19Ci0KLVZNQ2xhc3MqIEFzc2VtYmx5OjpyZWFkVHlwZURlZihOMyogdm0sIHVpbnQzMiBpbmRleCkgewotICByZXR1cm4gcmVhZFR5cGVEZWYodm0sIGluZGV4LCAoc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+KSAwKTsKLX0KLQotVk1DbGFzcyogQXNzZW1ibHk6OnJlYWRUeXBlRGVmKE4zKiB2bSwgdWludDMyIGluZGV4LCBzdGQ6OnZlY3RvcjxWTUNvbW1vbkNsYXNzKj4gZ2VuQXJncykgewotICB1aW50MzIgdG9rZW4gPSAoQ09OU1RBTlRfVHlwZURlZiA8PCAyNCkgKyBpbmRleDsKLSAgdWludDMyIHN0cmluZ09mZnNldCA9IENMSUhlYWRlci0+c3RyaW5nU3RyZWFtLT5yZWFsT2Zmc2V0OwotCi0gIFRhYmxlKiB0eXBlVGFibGUgID0gQ0xJSGVhZGVyLT50YWJsZXNbQ09OU1RBTlRfVHlwZURlZl07Ci0gIHVpbnQzMiogdHlwZUFycmF5ID0gKHVpbnQzMiopYWxsb2NhKHNpemVvZih1aW50MzIpICogdHlwZVRhYmxlLT5yb3dTaXplKTsKLSAgCi0gIHR5cGVUYWJsZS0+cmVhZFJvdyh0eXBlQXJyYXksIGluZGV4LCBieXRlcyk7Ci0KLSAgdWludDMyIGZsYWdzICAgICAgPSB0eXBlQXJyYXlbQ09OU1RBTlRfVFlQRURFRl9GTEFHU107Ci0gIHVpbnQzMiBuYW1lICAgICAgID0gdHlwZUFycmF5W0NPTlNUQU5UX1RZUEVERUZfTkFNRV07Ci0gIHVpbnQzMiBuYW1lU3BhY2UgID0gdHlwZUFycmF5W0NPTlNUQU5UX1RZUEVERUZfTkFNRVNQQUNFXTsKLSAgdWludDMyIGV4dGVuZHMgICAgPSB0eXBlQXJyYXlbQ09OU1RBTlRfVFlQRURFRl9FWFRFTkRTXTsKLSAgLy91aW50MzIgZmllbGRMaXN0ICA9IHR5cGVBcnJheVtDT05TVEFOVF9UWVBFREVGX0ZJRUxETElTVF07Ci0gIC8vdWludDMyIG1ldGhvZExpc3QgPSB0eXBlQXJyYXlbQ09OU1RBTlRfVFlQRURFRl9NRVRIT0RMSVNUXTsKLQotICAvL1RhYmxlKiBmaWVsZFRhYmxlICAgPSBDTElIZWFkZXItPnRhYmxlc1tDT05TVEFOVF9GaWVsZF07Ci0gIC8vdWludDMyIGZpZWxkU2l6ZSAgICA9IGZpZWxkVGFibGUtPnJvd3NOdW1iZXI7Ci0gIC8vVGFibGUqIG1ldGhvZFRhYmxlICA9IENMSUhlYWRlci0+dGFibGVzW0NPTlNUQU5UX01ldGhvZERlZl07Ci0gIC8vdWludDMyIG1ldGhvZFNpemUgICA9IG1ldGhvZFRhYmxlLT5yb3dzTnVtYmVyOwotCi0gIFZNQ2xhc3MqIHR5cGU7Ci0gIAotICBpZiAoZ2VuQXJncyA9PSAoc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+KSAwKSB7Ci0gICAgdHlwZSA9IGNvbnN0cnVjdENsYXNzKHJlYWRTdHJpbmcodm0sIG5hbWUgKyBzdHJpbmdPZmZzZXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkU3RyaW5nKHZtLCBuYW1lU3BhY2UgKyBzdHJpbmdPZmZzZXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbik7Ci0gIH0gZWxzZSB7Ci0JLy8gZ2VuZXJpYyB0eXBlCi0JdHlwZSA9IGNvbnN0cnVjdEdlbmVyaWNDbGFzcyhyZWFkU3RyaW5nKHZtLCBuYW1lICsgc3RyaW5nT2Zmc2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRTdHJpbmcodm0sIG5hbWVTcGFjZSArIHN0cmluZ09mZnNldCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5BcmdzLCB0b2tlbik7Ci0gIH0KLQotICB0eXBlLT52bSA9IHZtOwotCi0gIHVpbnQzMiB2YWwgPSAzICYgZXh0ZW5kczsKLSAgdWludDMyIGVudHJ5ID0gZXh0ZW5kcyA+PiAyOwotCi0gIHN3aXRjaCAodmFsKSB7Ci0gICAgY2FzZSAwOiB7Ci0gICAgICB0eXBlLT5zdXBlclRva2VuID0gZW50cnkgKyAoQ09OU1RBTlRfVHlwZURlZiA8PCAyNCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSAxOiB7Ci0gICAgICB0eXBlLT5zdXBlclRva2VuID0gZW50cnkgKyAoQ09OU1RBTlRfVHlwZVJlZiA8PCAyNCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSAyOiB7Ci0gICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkZWZhdWx0OiB7Ci0gICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIGdldEludGVyZmFjZXNGcm9tVG9rZW5UeXBlKHR5cGUtPmludGVyZmFjZXNUb2tlbiwgdG9rZW4pOwotICB0eXBlLT5mbGFncyA9IGZsYWdzOwotCi0gIHJldHVybiB0eXBlOwotfQotCi12b2lkIEFzc2VtYmx5OjpnZXRJbnRlcmZhY2VzRnJvbVRva2VuVHlwZShzdGQ6OnZlY3Rvcjx1aW50MzI+JiB0b2tlbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgdG9rZW4pIHsKLSAgdWludDMyIGluZGV4ID0gdG9rZW4gJiAweGZmZmY7Ci0gIFRhYmxlKiBpbnRlcmZhY2VzVGFibGUgPSBDTElIZWFkZXItPnRhYmxlc1tDT05TVEFOVF9JbnRlcmZhY2VJbXBsXTsKLSAgdWludDMyIG5iUm93cyA9IGludGVyZmFjZXNUYWJsZS0+cm93c051bWJlcjsKLQotICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IG5iUm93czsgKytpKSB7Ci0gICAgdWludDMyIGludGVyZmFjZUlkID0gCi0gICAgICBpbnRlcmZhY2VzVGFibGUtPnJlYWRJbmRleEluUm93KGkgKyAxLCBDT05TVEFOVF9JTlRFUkZBQ0VfSU1QTF9DTEFTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMpOwotICAgIGlmIChpbnRlcmZhY2VJZCA9PSBpbmRleCkgewotICAgICAgdWludDMyIGNsID0gaW50ZXJmYWNlc1RhYmxlLT5yZWFkSW5kZXhJblJvdyhpICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05TVEFOVF9JTlRFUkZBQ0VfSU1QTF9JTlRFUkZBQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMpOwotICAgICAgdWludDMyIHRhYmxlID0gY2wgJiAzOwotICAgICAgdWludDMyIGludGVyZmFjZVRva2VuID0gY2wgPj4gMjsKLQotICAgICAgc3dpdGNoICh0YWJsZSkgewotICAgICAgICBjYXNlIDA6IGludGVyZmFjZVRva2VuICs9IChDT05TVEFOVF9UeXBlRGVmIDw8IDI0KTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTogaW50ZXJmYWNlVG9rZW4gKz0gKENPTlNUQU5UX1R5cGVSZWYgPDwgMjQpOyBicmVhazsKLSAgICAgICAgY2FzZSAyOiBpbnRlcmZhY2VUb2tlbiArPSAoQ09OU1RBTlRfVHlwZVNwZWMgPDwgMjQpOyBicmVhazsKLSAgICAgICAgZGVmYXVsdDogVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigidW5rbm93biB0YWJsZSAleCIsIHRhYmxlKTsgYnJlYWs7Ci0gICAgICB9Ci0gICAgICB0b2tlbnMucHVzaF9iYWNrKGludGVyZmFjZVRva2VuKTsKLSAgICB9Ci0gIH0KLX0KLQotVk1Db21tb25DbGFzcyogQXNzZW1ibHk6OmxvYWRUeXBlKE4zKiB2bSwgdWludDMyIHRva2VuLCBib29sIHJlc29sdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXNvbHZlU3RhdGljLCBib29sIGNsaW5pdCwgYm9vbCBkb3Rocm93LCBWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKSB7Ci0JcmV0dXJuIGxvYWRUeXBlKHZtLCB0b2tlbiwgcmVzb2x2ZSwgcmVzb2x2ZVN0YXRpYywgY2xpbml0LCBkb3Rocm93LCAoc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+KSAwLCBnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLX0KLQotCi1WTUNvbW1vbkNsYXNzKiBBc3NlbWJseTo6bG9hZFR5cGUoTjMqIHZtLCB1aW50MzIgdG9rZW4sIGJvb2wgcmVzb2x2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlc29sdmVTdGF0aWMsIGJvb2wgY2xpbml0LCBib29sIGRvdGhyb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+IGdlbkFyZ3MsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgCi0gIFZNQ29tbW9uQ2xhc3MqIHR5cGUgPSBsb29rdXBDbGFzc0Zyb21Ub2tlbih0b2tlbik7Ci0gIGlmICghdHlwZSB8fCB0eXBlLT5zdGF0dXMgPT0gaGFzaGVkKSB7Ci0gICAgdWludDMyIHRhYmxlID0gdG9rZW4gPj4gMjQ7Ci0gICAgdWludDMyIGluZGV4ID0gdG9rZW4gJiAweGZmZmY7Ci0KLSAgICBpZiAodGFibGUgPT0gQ09OU1RBTlRfVHlwZURlZikgewotICAgICAgdHlwZSA9IHJlYWRUeXBlRGVmKHZtLCBpbmRleCwgZ2VuQXJncyk7Ci0gICAgfSBlbHNlIGlmICh0YWJsZSA9PSBDT05TVEFOVF9UeXBlUmVmKSB7Ci0gICAgICB0eXBlID0gcmVhZFR5cGVSZWYodm0sIGluZGV4KTsKLSAgICB9IGVsc2UgaWYgKHRhYmxlID09IENPTlNUQU5UX1R5cGVTcGVjKSB7Ci0gICAgICB0eXBlID0gcmVhZFR5cGVTcGVjKHZtLCBpbmRleCwgZ2VuQ2xhc3MsIGdlbk1ldGhvZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSAleCIsIHRva2VuKTsKLSAgICB9Ci0gIH0KLQotICBpZiAodHlwZSA9PSAwKSBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgaWYgKHR5cGUtPnN0YXR1cyA9PSBoYXNoZWQpIHsKLSAgICB0eXBlLT5hcXVpcmUoKTsKLSAgICBpZiAodHlwZS0+c3RhdHVzID09IGhhc2hlZCkgewotICAgICAgdHlwZS0+c3RhdHVzID0gbG9hZGVkOwotICAgIH0KLSAgICB0eXBlLT5yZWxlYXNlKCk7Ci0gIH0KLQotICBpZiAocmVzb2x2ZSkgdHlwZS0+cmVzb2x2ZVR5cGUocmVzb2x2ZVN0YXRpYywgY2xpbml0LCBnZW5NZXRob2QpOwotCi0gIHJldHVybiB0eXBlOwotfQotCi12b2lkIEFzc2VtYmx5OjpyZWFkQ2xhc3MoVk1Db21tb25DbGFzcyogY2wsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKSB7Ci0gIHVpbnQzMiBpbmRleCA9IGNsLT50b2tlbiAmIDB4ZmZmZjsKLSAgVGFibGUqIHR5cGVUYWJsZSA9IENMSUhlYWRlci0+dGFibGVzW0NPTlNUQU5UX1R5cGVEZWZdOwotICB1aW50MzIgdHlwZVNpemUgPSB0eXBlVGFibGUtPnJvd3NOdW1iZXI7Ci0gIHVpbnQzMiogdHlwZUFycmF5ID0gKHVpbnQzMiopYWxsb2NhKHNpemVvZih1aW50MzIpICogdHlwZVRhYmxlLT5yb3dTaXplKTsKLSAgdHlwZVRhYmxlLT5yZWFkUm93KHR5cGVBcnJheSwgaW5kZXgsIGJ5dGVzKTsKLSAgCi0gIHVpbnQzMiBmaWVsZExpc3QgID0gdHlwZUFycmF5W0NPTlNUQU5UX1RZUEVERUZfRklFTERMSVNUXTsKLSAgdWludDMyIG1ldGhvZExpc3QgPSB0eXBlQXJyYXlbQ09OU1RBTlRfVFlQRURFRl9NRVRIT0RMSVNUXTsKLQotICBUYWJsZSogZmllbGRUYWJsZSAgID0gQ0xJSGVhZGVyLT50YWJsZXNbQ09OU1RBTlRfRmllbGRdOwotICB1aW50MzIgZmllbGRTaXplICAgID0gZmllbGRUYWJsZS0+cm93c051bWJlcjsKLSAgVGFibGUqIG1ldGhvZFRhYmxlICA9IENMSUhlYWRlci0+dGFibGVzW0NPTlNUQU5UX01ldGhvZERlZl07Ci0gIHVpbnQzMiBtZXRob2RTaXplICAgPSBtZXRob2RUYWJsZS0+cm93c051bWJlcjsKLSAgCi0gIGdldFByb3BlcnRpZXMoY2wsIHN0YXRpY19jYXN0PFZNR2VuZXJpY0NsYXNzKj4oY2wpLCBnZW5NZXRob2QpOwotCi0gIGlmIChtZXRob2RMaXN0ICYmIG1ldGhvZFRhYmxlICE9IDAgJiYgbWV0aG9kTGlzdCA8PSBtZXRob2RTaXplKSB7Ci0gICAgdWludDMyIGVuZE1ldGhvZCA9IChpbmRleCA9PSB0eXBlU2l6ZSkgPyAKLSAgICAgICAgbWV0aG9kU2l6ZSArIDEgOiAKLSAgICAgICAgdHlwZVRhYmxlLT5yZWFkSW5kZXhJblJvdyhpbmRleCArIDEsIENPTlNUQU5UX1RZUEVERUZfTUVUSE9ETElTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcyk7Ci0KLSAgICB1aW50MzIgbmJNZXRob2RzID0gZW5kTWV0aG9kIC0gbWV0aG9kTGlzdDsKLQotICAgIGZvciAodWludDMyIGkgPSAwOyBpIDwgbmJNZXRob2RzOyArK2kpIHsKLSAgICAgIFZNTWV0aG9kKiBtZXRoID0gcmVhZE1ldGhvZERlZihpICsgbWV0aG9kTGlzdCwgY2wsIE5VTEwsIHN0YXRpY19jYXN0PFZNR2VuZXJpY0NsYXNzKj4oY2wpKTsKLSAgICAgIAotICAgICAgaWYgKG1ldGggIT0gTlVMTCkgewotICAgICAgICBpZiAoaXNTdGF0aWMobWV0aC0+ZmxhZ3MpKSB7Ci0gICAgICAgICAgY2wtPnN0YXRpY01ldGhvZHMucHVzaF9iYWNrKG1ldGgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGNsLT52aXJ0dWFsTWV0aG9kcy5wdXNoX2JhY2sobWV0aCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIGlmIChmaWVsZExpc3QgJiYgZmllbGRUYWJsZSAhPSAwICYmIGZpZWxkTGlzdCA8PSBmaWVsZFNpemUpIHsKLSAgICB1aW50MzIgZW5kRmllbGQgPSAoaW5kZXggPT0gdHlwZVNpemUpID8gCi0gICAgICAgIGZpZWxkU2l6ZSArIDEgOiAKLSAgICAgICAgdHlwZVRhYmxlLT5yZWFkSW5kZXhJblJvdyhpbmRleCArIDEsIENPTlNUQU5UX1RZUEVERUZfRklFTERMSVNULCBieXRlcyk7Ci0KLSAgICB1aW50MzIgbmJGaWVsZHMgPSBlbmRGaWVsZCAtIGZpZWxkTGlzdDsKLQotICAgIGZvciAodWludDMyIGkgPSAwOyBpIDwgbmJGaWVsZHM7ICsraSkgewotICAgICAgVk1GaWVsZCogZmllbGQgPSByZWFkRmllbGQoaSArIGZpZWxkTGlzdCwgY2wsIHN0YXRpY19jYXN0PFZNR2VuZXJpY0NsYXNzKj4oY2wpLCBnZW5NZXRob2QpOwotICAgICAgaWYgKGlzU3RhdGljKGZpZWxkLT5mbGFncykpIHsKLSAgICAgICAgY2wtPnN0YXRpY0ZpZWxkcy5wdXNoX2JhY2soZmllbGQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY2wtPnZpcnR1YWxGaWVsZHMucHVzaF9iYWNrKGZpZWxkKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBBc3NlbWJseTo6cmVhZEN1c3RvbUF0dHJpYnV0ZXModWludDMyIG9mZnNldCwgc3RkOjp2ZWN0b3I8bGx2bTo6R2VuZXJpY1ZhbHVlPiYgYXJncywgVk1NZXRob2QqIG1ldGgpIHsKLSAgdW5jb21wcmVzc1NpZ25hdHVyZShvZmZzZXQpOwotICB1aW50MTYgcHJvbG9nID0gUkVBRF9VMihieXRlcywgb2Zmc2V0KTsKLQotICBpZiAocHJvbG9nICE9IDB4MSkgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigidW5rbm93biBwcm9sb2ciKTsKLQotICB1aW50MzIgc3RhcnQgPSBtZXRoLT52aXJ0ID8gMSA6IDA7Ci0KLSAgZm9yICh1aW50MzIgaSA9IHN0YXJ0ICsgMTsgaSA8IG1ldGgtPnBhcmFtZXRlcnMuc2l6ZSgpOyArK2kpIHsKLSAgICBpZiAobWV0aC0+cGFyYW1ldGVyc1tpXSA9PSBNU0NvcmxpYjo6cFNJbnQzMikgewotICAgICAgbGx2bTo6R2VuZXJpY1ZhbHVlIGd2OwotICAgICAgZ3YuSW50VmFsID0gbGx2bTo6QVBJbnQoMzIsIFJFQURfVTQoYnl0ZXMsIG9mZnNldCkpOwotICAgICAgYXJncy5wdXNoX2JhY2soZ3YpOwotICAgIH0gZWxzZSB7Ci0gICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgICB9Ci0gIH0KLQotfQotCi1BcnJheU9iamVjdCogQXNzZW1ibHk6OmdldEN1c3RvbUF0dHJpYnV0ZXModWludDMyIHRva2VuLCBWTUNvbW1vbkNsYXNzKiBjbCkgewotICBUYWJsZSogYXR0clRhYmxlID0gQ0xJSGVhZGVyLT50YWJsZXNbQ09OU1RBTlRfQ3VzdG9tQXR0cmlidXRlXTsKLSAgdWludDMyIGF0dHJTaXplID0gYXR0clRhYmxlLT5yb3dzTnVtYmVyOwotICB1aW50MzIqIGF0dHJBcnJheSA9ICh1aW50MzIqKWFsbG9jYShzaXplb2YodWludDMyKSAqIGF0dHJUYWJsZS0+cm93U2l6ZSk7Ci0gIHN0ZDo6dmVjdG9yPFZNT2JqZWN0Kj4gdmVjOwotCi0gIGZvciAodWludDMyIGkgPSAwOyBpIDwgYXR0clNpemU7ICsraSkgewotICAgIGF0dHJUYWJsZS0+cmVhZFJvdyhhdHRyQXJyYXksIGkgKyAxLCBieXRlcyk7Ci0gICAgdWludDMyIG1ldGggPSBhdHRyQXJyYXlbQ09OU1RBTlRfQ1VTVE9NX0FUVFJJQlVURV9UWVBFXTsKLSAgICB1aW50MzIgdGFibGUgPSBtZXRoICYgNzsKLSAgICB1aW50MzIgaW5kZXggPSBtZXRoID4+IDM7Ci0gICAgVk1NZXRob2QqIGNvbnMgPSAwOwotCi0gICAgc3dpdGNoKHRhYmxlKSB7Ci0gICAgICBkZWZhdWx0OiAKLSAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7IAotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMjogCi0gICAgICAgIGNvbnMgPSBnZXRNZXRob2RGcm9tVG9rZW4oaW5kZXggKyAoQ09OU1RBTlRfTWV0aG9kRGVmIDw8IDI0KSwgTlVMTCwgTlVMTCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAzOgotICAgICAgICBjb25zID0gZ2V0TWV0aG9kRnJvbVRva2VuKGluZGV4ICsgKENPTlNUQU5UX01lbWJlclJlZiA8PCAyNCksIE5VTEwsIE5VTEwpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoY2wgPT0gY29ucy0+Y2xhc3NEZWYpIHsKLSAgICAgIHVpbnQzMiBibG9iT2Zmc2V0ID0gQ0xJSGVhZGVyLT5ibG9iU3RyZWFtLT5yZWFsT2Zmc2V0OwotICAgICAgc3RkOjp2ZWN0b3I8bGx2bTo6R2VuZXJpY1ZhbHVlPiBhcmdzOwotICAgICAgZGVjbGFyZV9nY3Jvb3QoVk1PYmplY3QqLCBvYmopID0gY29ucy0+Y2xhc3NEZWYtPmRvTmV3KCk7Ci0gICAgICBhcmdzLnB1c2hfYmFjayhsbHZtOjpHZW5lcmljVmFsdWUob2JqKSk7Ci0gICAgICByZWFkQ3VzdG9tQXR0cmlidXRlcyhibG9iT2Zmc2V0ICsgYXR0ckFycmF5W0NPTlNUQU5UX0NVU1RPTV9BVFRSSUJVVEVfVkFMVUVdLCBhcmdzLCBjb25zKTsKLQotICAgICAgY29ucy0+Y29tcGlsZVRvTmF0aXZlKCktPmludm9rZUdlbmVyaWMoYXJncyk7Ci0gICAgICB2ZWMucHVzaF9iYWNrKG9iaik7Ci0gICAgfQotICB9Ci0KLSAgZGVjbGFyZV9nY3Jvb3QoQXJyYXlPYmplY3QqLCByZXMpID0gKEFycmF5T2JqZWN0KilNU0NvcmxpYjo6YXJyYXlPYmplY3QtPmRvTmV3KHZlYy5zaXplKCkpOwotICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IHZlYy5zaXplKCk7ICsraSkKLSAgICByZXMtPmVsZW1lbnRzW2ldID0gdmVjW2ldOwotICAKLSAgcmV0dXJuIHJlczsKLX0KLQotdm9pZCBBc3NlbWJseTo6Z2V0UHJvcGVydGllcyhWTUNvbW1vbkNsYXNzKiBjbCwgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QgKmdlbk1ldGhvZCkgewotICB1aW50MzIgaW5kZXggPSBjbC0+dG9rZW4gJiAweGZmZmY7Ci0gIFRhYmxlKiBtYXBUYWJsZSA9IENMSUhlYWRlci0+dGFibGVzW0NPTlNUQU5UX1Byb3BlcnR5TWFwXTsKLSAgdWludDMyIG1hcFNpemUgPSBtYXBUYWJsZS0+cm93c051bWJlcjsKLSAgCi0gIFRhYmxlKiBwcm9wZXJ0eVRhYmxlID0gQ0xJSGVhZGVyLT50YWJsZXNbQ09OU1RBTlRfUHJvcGVydHldOwotICB1aW50MzIgcHJvcGVydHlTaXplID0gcHJvcGVydHlUYWJsZS0+cm93c051bWJlcjsKLSAgCi0gIHVpbnQzMiBwcm9wZXJ0eUxpc3QgPSAwOwotICB1aW50MzIgaSA9IDA7Ci0KLSAgd2hpbGUgKCFwcm9wZXJ0eUxpc3QgJiYgaSAhPSBtYXBTaXplKSB7Ci0gICAgdWludDMyIHBhcmVudCA9IG1hcFRhYmxlLT5yZWFkSW5kZXhJblJvdyhpICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05TVEFOVF9QUk9QRVJUWV9NQVBfUEFSRU5ULCBieXRlcyk7Ci0gICAgaWYgKHBhcmVudCA9PSBpbmRleCkgewotICAgICAgcHJvcGVydHlMaXN0ID0gbWFwVGFibGUtPnJlYWRJbmRleEluUm93KGkgKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlNUQU5UX1BST1BFUlRZX01BUF9QUk9QRVJUWV9MSVNULCBieXRlcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICsraTsKLSAgICB9Ci0gIH0KLQotICBpZiAocHJvcGVydHlMaXN0ICYmIHByb3BlcnR5VGFibGUgIT0gMCAmJiBwcm9wZXJ0eUxpc3QgPD0gcHJvcGVydHlTaXplKSB7Ci0gICAgdWludDMyIGVuZFByb3BlcnR5ID0gKGkgKyAxID09IG1hcFNpemUpID8gCi0gICAgICAgIHByb3BlcnR5U2l6ZSArIDEgOiAKLSAgICAgICAgbWFwVGFibGUtPnJlYWRJbmRleEluUm93KGkgKyAyLCBDT05TVEFOVF9QUk9QRVJUWV9NQVBfUFJPUEVSVFlfTElTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzKTsKLSAgICB1aW50MzIgbmJQcm9wZXJ0aWVzID0gZW5kUHJvcGVydHkgLSBwcm9wZXJ0eUxpc3Q7Ci0KLSAgICBmb3IgKHVpbnQzMiBqID0gMDsgaiA8IG5iUHJvcGVydGllczsgKytqKSB7Ci0gICAgICBjbC0+cHJvcGVydGllcy5wdXNoX2JhY2socmVhZFByb3BlcnR5KGogKyBwcm9wZXJ0eUxpc3QsIGNsLCBnZW5DbGFzcywgZ2VuTWV0aG9kKSk7Ci0gICAgfQotCi0gIH0gCi19Ci0KLVByb3BlcnR5KiBBc3NlbWJseTo6cmVhZFByb3BlcnR5KHVpbnQzMiBpbmRleCwgVk1Db21tb25DbGFzcyogY2wsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgdWludDMyIHN0cmluZ09mZnNldCA9IENMSUhlYWRlci0+c3RyaW5nU3RyZWFtLT5yZWFsT2Zmc2V0OwotICB1aW50MzIgYmxvYk9mZnNldCA9IENMSUhlYWRlci0+YmxvYlN0cmVhbS0+cmVhbE9mZnNldDsKLSAgCi0gIFRhYmxlKiBwcm9wVGFibGUgID0gQ0xJSGVhZGVyLT50YWJsZXNbQ09OU1RBTlRfUHJvcGVydHldOwotICB1aW50MzIqIHByb3BBcnJheSA9ICh1aW50MzIqKWFsbG9jYShzaXplb2YodWludDMyKSAqIHByb3BUYWJsZS0+cm93U2l6ZSk7Ci0gIAotICBwcm9wVGFibGUtPnJlYWRSb3cocHJvcEFycmF5LCBpbmRleCwgYnl0ZXMpOwotCi0gIHVpbnQzMiBmbGFncyAgICAgID0gcHJvcEFycmF5W0NPTlNUQU5UX1BST1BFUlRZX0ZMQUdTXTsKLSAgdWludDMyIG5hbWVJbmRleCAgPSBwcm9wQXJyYXlbQ09OU1RBTlRfUFJPUEVSVFlfTkFNRV07Ci0gIHVpbnQzMiB0eXBlICAgICAgID0gcHJvcEFycmF5W0NPTlNUQU5UX1BST1BFUlRZX1RZUEVdOwotCi0gIFByb3BlcnR5KiBwcm9wID0gbmV3KGFsbG9jYXRvciwgIlByb3BlcnR5IikgUHJvcGVydHkoKTsKLSAgcHJvcC0+bmFtZSA9IHJlYWRTdHJpbmcoVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLCBzdHJpbmdPZmZzZXQgKyBuYW1lSW5kZXgpOwotICBwcm9wLT5mbGFncyA9IGZsYWdzOwotICBwcm9wLT50eXBlID0gY2w7Ci0gIHVpbnQzMiBvZmZzZXQgPSBibG9iT2Zmc2V0ICsgdHlwZTsKLSAgcHJvcC0+dmlydCA9IGV4dHJhY3RNZXRob2RTaWduYXR1cmUob2Zmc2V0LCBjbCwgcHJvcC0+cGFyYW1ldGVycywgZ2VuQ2xhc3MsIGdlbk1ldGhvZCk7Ci0gIHJldHVybiBwcm9wOwotfQotCi1WTU1ldGhvZCogQXNzZW1ibHk6OnJlYWRNZXRob2REZWYodWludDMyIGluZGV4LCBWTUNvbW1vbkNsYXNzKiBjbCwKLSAgICAgICBzdGQ6OnZlY3RvcjxWTUNvbW1vbkNsYXNzKj4qIGdlbk1ldGhvZEluc3RhbnRpYXRpb24sIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcykgewotICB1aW50MzIgdG9rZW4gPSBpbmRleCArIChDT05TVEFOVF9NZXRob2REZWYgPDwgMjQpOwotICB1aW50MzIgc3RyaW5nT2Zmc2V0ID0gQ0xJSGVhZGVyLT5zdHJpbmdTdHJlYW0tPnJlYWxPZmZzZXQ7Ci0gIHVpbnQzMiBibG9iT2Zmc2V0ID0gQ0xJSGVhZGVyLT5ibG9iU3RyZWFtLT5yZWFsT2Zmc2V0OwotICAKLSAgVGFibGUqIHBhcmFtVGFibGUgID0gQ0xJSGVhZGVyLT50YWJsZXNbQ09OU1RBTlRfUGFyYW1dOwotICB1aW50MzIgcGFyYW1TaXplICAgID0gcGFyYW1UYWJsZS0+cm93c051bWJlcjsKLSAgCi0gIFRhYmxlKiBtZXRoVGFibGUgID0gQ0xJSGVhZGVyLT50YWJsZXNbQ09OU1RBTlRfTWV0aG9kRGVmXTsKLSAgdWludDMyIG1ldGhvZFNpemUgICAgPSBtZXRoVGFibGUtPnJvd3NOdW1iZXI7Ci0gIHVpbnQzMiogbWV0aEFycmF5ID0gKHVpbnQzMiopYWxsb2NhKHNpemVvZih1aW50MzIpICogbWV0aFRhYmxlLT5yb3dTaXplKTsKLSAgCi0gIG1ldGhUYWJsZS0+cmVhZFJvdyhtZXRoQXJyYXksIGluZGV4LCBieXRlcyk7Ci0KLSAgdWludDMyIHJ2YSAgICAgICAgPSBtZXRoQXJyYXlbQ09OU1RBTlRfTUVUSE9EREVGX1JWQV07Ci0gIHVpbnQzMiBpbXBsRmxhZ3MgID0gbWV0aEFycmF5W0NPTlNUQU5UX01FVEhPRERFRl9JTVBMRkxBR1NdOwotICB1aW50MzIgZmxhZ3MgICAgICA9IG1ldGhBcnJheVtDT05TVEFOVF9NRVRIT0RERUZfRkxBR1NdOwotICB1aW50MzIgbmFtZSAgICAgICA9IG1ldGhBcnJheVtDT05TVEFOVF9NRVRIT0RERUZfTkFNRV07Ci0gIHVpbnQzMiBzaWduYXR1cmUgID0gbWV0aEFycmF5W0NPTlNUQU5UX01FVEhPRERFRl9TSUdOQVRVUkVdOwotICB1aW50MzIgcGFyYW1MaXN0ICA9IG1ldGhBcnJheVtDT05TVEFOVF9NRVRIT0RERUZfUEFSQU1MSVNUXTsKLSAgCi0gIHVpbnQzMiBvZmZzZXQgPSBibG9iT2Zmc2V0ICsgc2lnbmF0dXJlOwotCi0gIFZNTWV0aG9kKiBtZXRoID0gCi0gICAgY29uc3RydWN0TWV0aG9kKChWTUNsYXNzKiljbCwgcmVhZFN0cmluZyhjbC0+dm0sIChuYW1lICsgc3RyaW5nT2Zmc2V0KSksCi0gICAgICAgICAgICAgICAgICAgIHRva2VuLCBpc0dlbmVyaWNNZXRob2Qob2Zmc2V0KSwgZ2VuTWV0aG9kSW5zdGFudGlhdGlvbiwgZ2VuQ2xhc3MpOwotICAKLSAgb2Zmc2V0ID0gYmxvYk9mZnNldCArIHNpZ25hdHVyZTsKLSAgCi0gIG1ldGgtPnZpcnQgPSBleHRyYWN0TWV0aG9kU2lnbmF0dXJlKG9mZnNldCwgY2wsIG1ldGgtPnBhcmFtZXRlcnMsIGdlbkNsYXNzLCAKLSAgICAgIHN0YXRpY19jYXN0PFZNR2VuZXJpY01ldGhvZCo+IChtZXRoKSk7Ci0gIAotICBtZXRoLT5mbGFncyA9IGZsYWdzOwotICBtZXRoLT5pbXBsRmxhZ3MgPSBpbXBsRmxhZ3M7Ci0KLSAgaWYgKHJ2YSkgewotICAgIG1ldGgtPm9mZnNldEluVGV4dFNlY3Rpb24gPSB0ZXh0U2VjdGlvbi0+cmF3QWRkcmVzcyArIAotCQkJKHJ2YSAtIHRleHRTZWN0aW9uLT52aXJ0dWFsQWRkcmVzcyk7Ci0gIH0gZWxzZSB7Ci0gICAgbWV0aC0+b2Zmc2V0SW5UZXh0U2VjdGlvbiA9IDA7Ci0gIH0KLQotICBpZiAocGFyYW1MaXN0ICYmIHBhcmFtVGFibGUgIT0gMCAmJiBwYXJhbUxpc3QgPD0gcGFyYW1TaXplKSB7Ci0gICAgdWludDMyIGVuZFBhcmFtID0gKGluZGV4ID09IG1ldGhvZFNpemUpID8gCi0gICAgICAgIHBhcmFtU2l6ZSArIDEgOiAKLSAgICAgICAgbWV0aFRhYmxlLT5yZWFkSW5kZXhJblJvdyhpbmRleCArIDEsIENPTlNUQU5UX01FVEhPRERFRl9QQVJBTUxJU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzKTsKLQotICAgIHVpbnQzMiBuYlBhcmFtcyA9IGVuZFBhcmFtIC0gcGFyYW1MaXN0OwotCi0gICAgZm9yICh1aW50MzIgaiA9IDA7IGogPCBuYlBhcmFtczsgKytqKSB7Ci0gICAgICBtZXRoLT5wYXJhbXMucHVzaF9iYWNrKHJlYWRQYXJhbShqICsgcGFyYW1MaXN0LCBtZXRoKSk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIG1ldGg7Ci19Ci0KLVZNRmllbGQqIEFzc2VtYmx5OjpyZWFkRmllbGQodWludDMyIGluZGV4LCBWTUNvbW1vbkNsYXNzKiBjbCwgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCkgewotICB1aW50MzIgdG9rZW4gPSBpbmRleCArIChDT05TVEFOVF9GaWVsZCA8PCAyNCk7Ci0gIHVpbnQzMiBzdHJpbmdPZmZzZXQgPSBDTElIZWFkZXItPnN0cmluZ1N0cmVhbS0+cmVhbE9mZnNldDsKLSAgdWludDMyIGJsb2JPZmZzZXQgPSBDTElIZWFkZXItPmJsb2JTdHJlYW0tPnJlYWxPZmZzZXQ7Ci0gIAotICBUYWJsZSogZmllbGRUYWJsZSAgPSBDTElIZWFkZXItPnRhYmxlc1tDT05TVEFOVF9GaWVsZF07Ci0gIHVpbnQzMiogZmllbGRBcnJheSA9ICh1aW50MzIqKWFsbG9jYShzaXplb2YodWludDMyKSAqIGZpZWxkVGFibGUtPnJvd1NpemUpOwotICAKLSAgZmllbGRUYWJsZS0+cmVhZFJvdyhmaWVsZEFycmF5LCBpbmRleCwgYnl0ZXMpOwotCi0gIHVpbnQzMiBmbGFncyAgICAgID0gZmllbGRBcnJheVtDT05TVEFOVF9GSUVMRF9GTEFHU107Ci0gIHVpbnQzMiBuYW1lICAgICAgID0gZmllbGRBcnJheVtDT05TVEFOVF9GSUVMRF9OQU1FXTsKLSAgdWludDMyIHNpZ25hdHVyZSAgPSBmaWVsZEFycmF5W0NPTlNUQU5UX0ZJRUxEX1NJR05BVFVSRV07Ci0gIAotICB1aW50MzIgb2Zmc2V0ID0gYmxvYk9mZnNldCArIHNpZ25hdHVyZTsKLSAgVk1GaWVsZCogZmllbGQgPSBjb25zdHJ1Y3RGaWVsZCgoVk1DbGFzcyopIGNsLCByZWFkU3RyaW5nKGNsLT52bSwgKG5hbWUKLSAgICAgICsgc3RyaW5nT2Zmc2V0KSksIGV4dHJhY3RGaWVsZFNpZ25hdHVyZShvZmZzZXQsIGdlbkNsYXNzLCBnZW5NZXRob2QpLAotICAgICAgdG9rZW4sIGdlbkNsYXNzLCBnZW5NZXRob2QpOwotICBmaWVsZC0+ZmxhZ3MgPSBmbGFnczsKLSAgCi0gIHJldHVybiBmaWVsZDsKLX0KLQotUGFyYW0qIEFzc2VtYmx5OjpyZWFkUGFyYW0odWludDMyIGluZGV4LCBWTU1ldGhvZCogbWV0aCkgewotICB1aW50MzIgc3RyaW5nT2Zmc2V0ID0gQ0xJSGVhZGVyLT5zdHJpbmdTdHJlYW0tPnJlYWxPZmZzZXQ7Ci0gIAotICBUYWJsZSogcGFyYW1UYWJsZSAgPSBDTElIZWFkZXItPnRhYmxlc1tDT05TVEFOVF9QYXJhbV07Ci0gIHVpbnQzMiogcGFyYW1BcnJheSA9ICh1aW50MzIqKWFsbG9jYShzaXplb2YodWludDMyKSAqIHBhcmFtVGFibGUtPnJvd1NpemUpOwotICAKLSAgcGFyYW1UYWJsZS0+cmVhZFJvdyhwYXJhbUFycmF5LCBpbmRleCwgYnl0ZXMpOwotCi0gIHVpbnQzMiBmbGFncyAgICAgID0gcGFyYW1BcnJheVtDT05TVEFOVF9QQVJBTV9GTEFHU107Ci0gIHVpbnQzMiBuYW1lICAgICAgID0gcGFyYW1BcnJheVtDT05TVEFOVF9QQVJBTV9OQU1FXTsKLSAgdWludDMyIHNlcXVlbmNlICAgPSBwYXJhbUFycmF5W0NPTlNUQU5UX1BBUkFNX1NFUVVFTkNFXTsKLSAgCi0gIFBhcmFtKiBwYXJhbSA9IG5ldyhhbGxvY2F0b3IsICJQYXJhbSIpIFBhcmFtKCk7Ci0gIHBhcmFtLT5mbGFncyA9IGZsYWdzOwotICBwYXJhbS0+c2VxdWVuY2UgPSBzZXF1ZW5jZTsKLSAgcGFyYW0tPm5hbWUgPSByZWFkU3RyaW5nKG1ldGgtPmNsYXNzRGVmLT52bSwgc3RyaW5nT2Zmc2V0ICsgbmFtZSk7Ci0gIHBhcmFtLT5tZXRob2QgPSBtZXRoOwotICAKLSAgcmV0dXJuIHBhcmFtOwotfQotCi1WTUNvbW1vbkNsYXNzKiBBc3NlbWJseTo6bG9hZFR5cGVGcm9tTmFtZShjb25zdCBVVEY4KiBuYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVURjgqIG5hbWVTcGFjZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlc29sdmUsIGJvb2wgdW5pZnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNsaW5pdCwgYm9vbCBkb3Rocm93KSB7Ci0gIFZNQ29tbW9uQ2xhc3MqIGNsID0gbG9va3VwQ2xhc3NGcm9tTmFtZShuYW1lLCBuYW1lU3BhY2UpOwotICBpZiAoY2wgPT0gMCB8fCBjbC0+c3RhdHVzID09IGhhc2hlZCkgewotICAgIGNsID0gZ2V0Q2xhc3NGcm9tTmFtZSgoKE4zKilWTVRocmVhZDo6Z2V0KCktPmdldFZNKCkpLCBuYW1lLCBuYW1lU3BhY2UpOwotICAgIAotICAgIGlmIChjbCA9PSAwKSBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLQotICAgIGlmIChjbC0+c3RhdHVzID09IGhhc2hlZCkgewotICAgICAgY2wtPmFxdWlyZSgpOwotICAgICAgaWYgKGNsLT5zdGF0dXMgPT0gaGFzaGVkKSB7Ci0gICAgICAgIGNsLT5zdGF0dXMgPSBsb2FkZWQ7Ci0gICAgICB9Ci0gICAgICBjbC0+cmVsZWFzZSgpOwotICAgIH0KLSAgfQotCi0gIGlmIChyZXNvbHZlKSBjbC0+cmVzb2x2ZVR5cGUodW5pZnksIGNsaW5pdCwgTlVMTCk7Ci0KLSAgcmV0dXJuIGNsOwotfQotCi12b2lkIEFzc2VtYmx5OjpyZWFkU2lnbmF0dXJlKHVpbnQzMiBsb2NhbFZhclNpZywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFZNQ29tbW9uQ2xhc3MqPiYgbG9jYWxzLCBWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKSB7Ci0gIHVpbnQzMiB0YWJsZSA9IGxvY2FsVmFyU2lnID4+IDI0OwotICB1aW50MzIgaW5kZXggPSBsb2NhbFZhclNpZyAmIDB4ZmZmZjsKLSAgaWYgKHRhYmxlICE9IENPTlNUQU5UX1N0YW5kYWxvbmVTaWcpIHsKLSAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJsb2NhbHMgZG8gbm90IHBvaW50IHRvIGEgU3RhbmRBbG9uZVNpZyB0YWJsZSIpOwotICB9Ci0gIFRhYmxlKiBzaWduYXR1cmVzID0gQ0xJSGVhZGVyLT50YWJsZXNbQ09OU1RBTlRfU3RhbmRhbG9uZVNpZ107Ci0gIHVpbnQzMiogYXJyYXkgPSAodWludDMyKilhbGxvY2Eoc2l6ZW9mKHVpbnQzMikgKiBzaWduYXR1cmVzLT5yb3dTaXplKTsKLSAgc2lnbmF0dXJlcy0+cmVhZFJvdyhhcnJheSwgaW5kZXgsIGJ5dGVzKTsKLQotICB1aW50MzIgYmxvYk9mZnNldCA9IENMSUhlYWRlci0+YmxvYlN0cmVhbS0+cmVhbE9mZnNldDsKLSAgdWludDMyIGJsb2JFbnRyeSA9IGJsb2JPZmZzZXQgKyBhcnJheVtDT05TVEFOVF9TVEFOREFMT05FX1NJR19TSUdOQVRVUkVdOwotICAKLQotICBsb2NhbFZhclNpZ25hdHVyZShibG9iRW50cnksIGxvY2FscywgZ2VuQ2xhc3MsIGdlbk1ldGhvZCk7Ci19Ci0KLVZNRmllbGQqIEFzc2VtYmx5OjpnZXRGaWVsZEZyb21Ub2tlbih1aW50MzIgdG9rZW4sIGJvb2wgc3RhdCwgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCkgewotICBWTUZpZWxkKiBmaWVsZCA9IGxvb2t1cEZpZWxkRnJvbVRva2VuKHRva2VuKTsKLSAgaWYgKCFmaWVsZCkgewotICAgIHVpbnQzMiB0YWJsZSA9IHRva2VuID4+IDI0OwotICAgIHN3aXRjaCAodGFibGUpIHsKLSAgICAgIGNhc2UgQ09OU1RBTlRfRmllbGQgOiB7Ci0gICAgICAgIHVpbnQzMiB0eXBlVG9rZW4gPSBnZXRUeXBlZGVmVG9rZW5Gcm9tRmllbGQodG9rZW4pOwotICAgICAgICB1aW50MzIgbmV3VGFibGUgPSB0eXBlVG9rZW4gPj4gMjQ7Ci0gICAgICAgIHN3aXRjaCAobmV3VGFibGUpIHsKLSAgICAgICAgICBjYXNlIENPTlNUQU5UX1R5cGVEZWYgOiB7Ci0gICAgICAgICAgICBsb2FkVHlwZSgoTjMqKShWTVRocmVhZDo6Z2V0KCktPmdldFZNKCkpLCB0eXBlVG9rZW4sIHRydWUsIHRydWUsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZ2VuQ2xhc3MsIGdlbk1ldGhvZCk7Ci0gICAgICAgICAgICBmaWVsZCA9IGxvb2t1cEZpZWxkRnJvbVRva2VuKHRva2VuKTsKLSAgICAgICAgICAgIGlmICghZmllbGQpIHsKLSAgICAgICAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZGVmYXVsdCA6IHsKLSAgICAgICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBDT05TVEFOVF9NZW1iZXJSZWYgOiB7Ci0gICAgICAgIGZpZWxkID0gcmVhZE1lbWJlclJlZkFzRmllbGQodG9rZW4sIHN0YXQsIGdlbkNsYXNzLCBnZW5NZXRob2QpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgZGVmYXVsdCA6IHsKLSAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGZpZWxkLT5jbGFzc0RlZi0+cmVzb2x2ZVR5cGUoc3RhdCwgZmFsc2UsIGdlbk1ldGhvZCk7Ci0gIHJldHVybiBmaWVsZDsKLX0KLQotdWludDMyIEFzc2VtYmx5OjpnZXRUeXBlZGVmVG9rZW5Gcm9tRmllbGQodWludDMyIHRva2VuKSB7Ci0gIHVpbnQzMiBpbmRleCA9IHRva2VuICYgMHhmZmZmOwotICBUYWJsZSogdHlwZVRhYmxlID0gQ0xJSGVhZGVyLT50YWJsZXNbQ09OU1RBTlRfVHlwZURlZl07Ci0gIHVpbnQzMiBuYlJvd3MgPSB0eXBlVGFibGUtPnJvd3NOdW1iZXI7Ci0KLSAgYm9vbCBmb3VuZCA9IGZhbHNlOwotICB1aW50MzIgaSA9IDA7Ci0KLSAgd2hpbGUgKCFmb3VuZCAmJiBpIDwgbmJSb3dzIC0gMSkgewotICAgIHVpbnQzMiBteUlkID0gdHlwZVRhYmxlLT5yZWFkSW5kZXhJblJvdyhpICsgMSwgQ09OU1RBTlRfVFlQRURFRl9GSUVMRExJU1QsIGJ5dGVzKTsKLSAgICB1aW50MzIgbmV4dElkID0gdHlwZVRhYmxlLT5yZWFkSW5kZXhJblJvdyhpICsgMiwgQ09OU1RBTlRfVFlQRURFRl9GSUVMRExJU1QsIGJ5dGVzKTsKLQotICAgIGlmICgoaW5kZXggPCBuZXh0SWQpICYmIChpbmRleCA+PSBteUlkKSkgewotICAgICAgZm91bmQgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICArK2k7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGkgKyAxICsgKENPTlNUQU5UX1R5cGVEZWYgPDwgMjQpOwotfQotCi11aW50MzIgQXNzZW1ibHk6OmdldEV4cGxpY2l0TGF5b3V0KHVpbnQzMiB0b2tlbikgewotICB1aW50MzIgaW5kZXggPSB0b2tlbiAmIDB4ZmZmZjsKLSAgVGFibGUqIGxheW91dFRhYmxlID0gQ0xJSGVhZGVyLT50YWJsZXNbQ09OU1RBTlRfQ2xhc3NMYXlvdXRdOwotICB1aW50MzIgdGFibGVTaXplID0gbGF5b3V0VGFibGUtPnJvd3NOdW1iZXI7Ci0KLSAgYm9vbCBmb3VuZCA9IGZhbHNlOwotICB1aW50MzIgaSA9IDA7Ci0gIHVpbnQzMiBzaXplID0gMDsKLQotICB3aGlsZSAoIWZvdW5kICYmIGkgIT0gdGFibGVTaXplKSB7Ci0gICAgdWludDMyIHBhcmVudCA9IGxheW91dFRhYmxlLT5yZWFkSW5kZXhJblJvdyhpICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05TVEFOVF9DTEFTU19MQVlPVVRfUEFSRU5ULCBieXRlcyk7Ci0gICAgaWYgKHBhcmVudCA9PSBpbmRleCkgewotICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgc2l6ZSA9IGxheW91dFRhYmxlLT5yZWFkSW5kZXhJblJvdyhpICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05TVEFOVF9DTEFTU19MQVlPVVRfQ0xBU1NfU0laRSwgYnl0ZXMpOwotICAgIH0KLSAgICArK2k7Ci0gIH0KLQotICBpZiAoIWZvdW5kKQotICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotCi0gIHJldHVybiBzaXplOwotfQotCi1WTUZpZWxkKiBBc3NlbWJseTo6cmVhZE1lbWJlclJlZkFzRmllbGQodWludDMyIHRva2VuLCBib29sIHN0YXQsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgdWludDMyIGluZGV4ID0gdG9rZW4gJiAweGZmZmY7Ci0gIFRhYmxlKiBtZW1iZXJUYWJsZSA9IENMSUhlYWRlci0+dGFibGVzW0NPTlNUQU5UX01lbWJlclJlZl07Ci0gIHVpbnQzMiogbWVtYmVyQXJyYXkgPSAodWludDMyKilhbGxvY2Eoc2l6ZW9mKHVpbnQzMikgKiBtZW1iZXJUYWJsZS0+cm93U2l6ZSk7Ci0gIAotICBtZW1iZXJUYWJsZS0+cmVhZFJvdyhtZW1iZXJBcnJheSwgaW5kZXgsIGJ5dGVzKTsKLQotICB1aW50MzIgc3RyaW5nT2Zmc2V0ID0gQ0xJSGVhZGVyLT5zdHJpbmdTdHJlYW0tPnJlYWxPZmZzZXQ7Ci0gIHVpbnQzMiBibG9iT2Zmc2V0ICAgPSBDTElIZWFkZXItPmJsb2JTdHJlYW0tPnJlYWxPZmZzZXQ7Ci0gIAotICBjb25zdCBVVEY4KiBuYW1lID0gcmVhZFN0cmluZygoTjMqKShWTVRocmVhZDo6Z2V0KCktPmdldFZNKCkpLCBzdHJpbmdPZmZzZXQgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlckFycmF5W0NPTlNUQU5UX01FTUJFUlJFRl9OQU1FXSk7Ci0gIAotCi0gIHVpbnQzMiB2YWx1ZSA9IG1lbWJlckFycmF5W0NPTlNUQU5UX01FTUJFUlJFRl9DTEFTU107Ci0gIHVpbnQzMiB0YWJsZSA9IHZhbHVlICYgNzsKLSAgaW5kZXggPSB2YWx1ZSA+PiAzOwotCi0gIFZNQ29tbW9uQ2xhc3MqIHR5cGUgPSBOVUxMOwotICAKLSAgc3dpdGNoICh0YWJsZSkgewotICAgIGNhc2UgMCA6IHsKLSAgICAgIHVpbnQzMiB0eXBlVG9rZW4gPSBpbmRleCArIChDT05TVEFOVF9UeXBlRGVmIDw8IDI0KTsKLSAgICAgIHR5cGUgPSBsb2FkVHlwZSgoKE4zKilWTVRocmVhZDo6Z2V0KCktPmdldFZNKCkpLCB0eXBlVG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLQkgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgMSA6IHsKLSAgICAgIHVpbnQzMiB0eXBlVG9rZW4gPSBpbmRleCArIChDT05TVEFOVF9UeXBlUmVmIDw8IDI0KTsKLSAgICAgIHR5cGUgPSBsb2FkVHlwZSgoKE4zKilWTVRocmVhZDo6Z2V0KCktPmdldFZNKCkpLCB0eXBlVG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgMjoKLSAgICBjYXNlIDM6IFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOyBicmVhazsKLSAgICBjYXNlIDQ6IHsKLSAgICAgIHVpbnQzMiB0eXBlVG9rZW4gPSBpbmRleCArIChDT05TVEFOVF9UeXBlU3BlYyA8PCAyNCk7Ci0gICAgICB0eXBlID0gbG9hZFR5cGUoKChOMyopVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpKSwgdHlwZVRva2VuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigidW5rbm93biBNZW1iZXJSZWZQYXJlbnQgdGFnICVkIiwgdGFibGUpOwotICAgICAgCi0gIH0KLQotICB1aW50MzIgb2Zmc2V0ID0gYmxvYk9mZnNldCArIG1lbWJlckFycmF5W0NPTlNUQU5UX01FTUJFUlJFRl9TSUdOQVRVUkVdOwotCi0gIFZNR2VuZXJpY0NsYXNzKiBnZW5lcmljQ2xhc3MgPSBzdGF0aWNfY2FzdDxWTUdlbmVyaWNDbGFzcyo+ICh0eXBlKTsKLQotICBpZiAoZ2VuZXJpY0NsYXNzKSB7Ci0gICAgVk1Db21tb25DbGFzcyogc2lnbmF0dXJlID0gZXh0cmFjdEZpZWxkU2lnbmF0dXJlKG9mZnNldCwgZ2VuZXJpY0NsYXNzLAotICAgICAgICBnZW5NZXRob2QpOwotICAgIFZNRmllbGQqIGZpZWxkID0gdHlwZS0+bG9va3VwRmllbGQobmFtZSwgc2lnbmF0dXJlLCBzdGF0LCB0cnVlKTsKLSAgICByZXR1cm4gZmllbGQ7Ci0gIH0gZWxzZSB7Ci0gICAgVk1Db21tb25DbGFzcyogc2lnbmF0dXJlID0gZXh0cmFjdEZpZWxkU2lnbmF0dXJlKG9mZnNldCwgZ2VuQ2xhc3MsIGdlbk1ldGhvZCk7Ci0gICAgVk1GaWVsZCogZmllbGQgPSB0eXBlLT5sb29rdXBGaWVsZChuYW1lLCBzaWduYXR1cmUsIHN0YXQsIHRydWUpOwotICAgIHJldHVybiBmaWVsZDsKLSAgfQotICAKLX0KLQotCi1WTU1ldGhvZCogQXNzZW1ibHk6OmdldE1ldGhvZEZyb21Ub2tlbih1aW50MzIgdG9rZW4sIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgVk1NZXRob2QqIG1ldGggPSBsb29rdXBNZXRob2RGcm9tVG9rZW4odG9rZW4pOwotICAKLSAgaWYgKCFtZXRoKSB7Ci0gICAgdWludDMyIHRhYmxlID0gdG9rZW4gPj4gMjQ7Ci0gICAgc3dpdGNoICh0YWJsZSkgewotICAgICAgY2FzZSBDT05TVEFOVF9NZXRob2REZWYgOiB7Ci0gICAgICAgIHVpbnQzMiB0eXBlVG9rZW4gPSBnZXRUeXBlZGVmVG9rZW5Gcm9tTWV0aG9kKHRva2VuKTsKLSAgICAgICAgdWludDMyIG5ld1RhYmxlID0gdHlwZVRva2VuID4+IDI0OwotICAgICAgICBzd2l0Y2ggKG5ld1RhYmxlKSB7Ci0gICAgICAgICAgY2FzZSBDT05TVEFOVF9UeXBlRGVmIDogewotICAgICAgICAgICAgbG9hZFR5cGUoKE4zKikoVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpKSwgdHlwZVRva2VuLCB0cnVlLCB0cnVlLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgIHRydWUsIGdlbkNsYXNzLCBnZW5NZXRob2QpOwotICAgICAgICAgICAgbWV0aCA9IGxvb2t1cE1ldGhvZEZyb21Ub2tlbih0b2tlbik7Ci0gICAgICAgICAgICBpZiAoIW1ldGgpIHsKLSAgICAgICAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZGVmYXVsdCA6IHsKLSAgICAgICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBDT05TVEFOVF9NZW1iZXJSZWYgOiB7Ci0gICAgICAgIG1ldGggPSByZWFkTWVtYmVyUmVmQXNNZXRob2QodG9rZW4sIE5VTEwsIGdlbkNsYXNzLCBnZW5NZXRob2QpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBDT05TVEFOVF9NZXRob2RTcGVjIDogewotICAgICAgICBtZXRoID0gcmVhZE1ldGhvZFNwZWModG9rZW4sIGdlbkNsYXNzLCBnZW5NZXRob2QpOyAKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGRlZmF1bHQgOiB7Ci0gICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgbWV0aC0+Z2V0U2lnbmF0dXJlKGdlbk1ldGhvZCk7Ci0gIAotICByZXR1cm4gbWV0aDsKLX0KLQotdWludDMyIEFzc2VtYmx5OjpnZXRUeXBlZGVmVG9rZW5Gcm9tTWV0aG9kKHVpbnQzMiB0b2tlbikgewotICB1aW50MzIgaW5kZXggPSB0b2tlbiAmIDB4ZmZmZjsKLSAgVGFibGUqIHR5cGVUYWJsZSA9IENMSUhlYWRlci0+dGFibGVzW0NPTlNUQU5UX1R5cGVEZWZdOwotICB1aW50MzIgbmJSb3dzID0gdHlwZVRhYmxlLT5yb3dzTnVtYmVyOwotCi0gIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgdWludDMyIGkgPSAwOwotCi0gIHdoaWxlICghZm91bmQgJiYgaSA8IG5iUm93cyAtIDEpIHsKLSAgICB1aW50MzIgbXlJZCA9IHR5cGVUYWJsZS0+cmVhZEluZGV4SW5Sb3coaSArIDEsIENPTlNUQU5UX1RZUEVERUZfTUVUSE9ETElTVCwgYnl0ZXMpOwotICAgIHVpbnQzMiBuZXh0SWQgPSB0eXBlVGFibGUtPnJlYWRJbmRleEluUm93KGkgKyAyLCBDT05TVEFOVF9UWVBFREVGX01FVEhPRExJU1QsIGJ5dGVzKTsKLQotICAgIGlmICgoaW5kZXggPCBuZXh0SWQpICYmIChpbmRleCA+PSBteUlkKSkgewotICAgICAgZm91bmQgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICArK2k7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGkgKyAxICsgKENPTlNUQU5UX1R5cGVEZWYgPDwgMjQpOwotfQotCi1WTU1ldGhvZCAqQXNzZW1ibHk6Omluc3RhbnRpYXRlR2VuZXJpY01ldGhvZCgKLSAgICBzdGQ6OnZlY3RvcjxWTUNvbW1vbkNsYXNzKj4gKmdlbkFyZ3MsIFZNQ29tbW9uQ2xhc3MgKnR5cGUsCi0gICAgY29uc3QgVVRGOCAqJiBuYW1lLCBzdGQ6OnZlY3RvcjxWTUNvbW1vbkNsYXNzKj4gJiBhcmdzLCB1aW50MzIgdG9rZW4sCi0gICAgYm9vbCB2aXJ0LCBWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MpIHsKLSAgVk1NZXRob2QgKm1ldGggPSBOVUxMOwotICAKLSAgaWYgKGdlbkFyZ3MgIT0gTlVMTCkgewotICAgIFZNQ2xhc3MqIGNsID0gc3RhdGljX2Nhc3Q8Vk1DbGFzcyo+ICh0eXBlKTsKLQotICAgIGlmIChjbCA9PSBOVUxMKSB7Ci0gICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKAotICAgICAgICAgICJPbmx5IGluc3RhbmNlcyBvZiBnZW5lcmljIGNsYXNzZXMgYXJlIGFsbG93ZWQuIik7Ci0gICAgfQotCi0gICAgLy8gc2VhcmNoIGZvciBtYXRjaGluZyBzaWduYXR1cmUKLSAgICBmb3IgKHVpbnQgaSA9IDA7IGkgPCBjbC0+Z2VuZXJpY01ldGhvZHMuc2l6ZSgpOyArK2kpIHsKLSAgICAgIFZNTWV0aG9kKiBnZW5NZXRob2QgPSBjbC0+Z2VuZXJpY01ldGhvZHMuYXQoaSk7Ci0KLSAgICAgIGlmICgobmFtZSAhPSBnZW5NZXRob2QtPm5hbWUpIHx8ICFnZW5NZXRob2QtPnNpZ25hdHVyZUVxdWFsc0dlbmVyaWMoCi0gICAgICAgICAgYXJncykpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIC8vIHVzZSBmb3VuZCB0b2tlbiB0byBjcmVhdGUgaW5zdGFuY2Ugb2YgZ2VuZXJpYyBtZXRob2QKLSAgICAgIG1ldGggPSByZWFkTWV0aG9kRGVmKGdlbk1ldGhvZC0+dG9rZW4gJiAweEZGRkZGRiwgdHlwZSwgZ2VuQXJncywgZ2VuQ2xhc3MpOwotICAgICAgbWV0aC0+dG9rZW4gPSB0b2tlbjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgbWV0aCA9IHR5cGUtPmxvb2t1cE1ldGhvZChuYW1lLCBhcmdzLCAhdmlydCwgdHJ1ZSk7Ci0gIH0KLSAgCi0gIHJldHVybiBtZXRoOwotfQotCi1WTU1ldGhvZCogQXNzZW1ibHk6OnJlYWRNZW1iZXJSZWZBc01ldGhvZCh1aW50MzIgdG9rZW4sIHN0ZDo6dmVjdG9yPFZNQ29tbW9uQ2xhc3MqPiogZ2VuQXJncywgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCkgewotICB1aW50MzIgaW5kZXggPSB0b2tlbiAmIDB4ZmZmZjsKLSAgVGFibGUqIG1lbWJlclRhYmxlID0gQ0xJSGVhZGVyLT50YWJsZXNbQ09OU1RBTlRfTWVtYmVyUmVmXTsKLSAgdWludDMyKiBtZW1iZXJBcnJheSA9ICh1aW50MzIqKWFsbG9jYShzaXplb2YodWludDMyKSAqIG1lbWJlclRhYmxlLT5yb3dTaXplKTsKLSAgCi0gIG1lbWJlclRhYmxlLT5yZWFkUm93KG1lbWJlckFycmF5LCBpbmRleCwgYnl0ZXMpOwotCi0gIHVpbnQzMiBzdHJpbmdPZmZzZXQgPSBDTElIZWFkZXItPnN0cmluZ1N0cmVhbS0+cmVhbE9mZnNldDsKLSAgdWludDMyIGJsb2JPZmZzZXQgICA9IENMSUhlYWRlci0+YmxvYlN0cmVhbS0+cmVhbE9mZnNldDsKLSAgCi0gIGNvbnN0IFVURjgqIG5hbWUgPSByZWFkU3RyaW5nKChOMyopKFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKSksIHN0cmluZ09mZnNldCArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyQXJyYXlbQ09OU1RBTlRfTUVNQkVSUkVGX05BTUVdKTsKLSAgCi0gIHVpbnQzMiBvZmZzZXQgPSBibG9iT2Zmc2V0ICsgbWVtYmVyQXJyYXlbQ09OU1RBTlRfTUVNQkVSUkVGX1NJR05BVFVSRV07Ci0gIHN0ZDo6dmVjdG9yPFZNQ29tbW9uQ2xhc3MqPiBhcmdzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgdWludDMyIHZhbHVlID0gbWVtYmVyQXJyYXlbQ09OU1RBTlRfTUVNQkVSUkVGX0NMQVNTXTsKLSAgdWludDMyIHRhYmxlID0gdmFsdWUgJiA3OwotICBpbmRleCA9IHZhbHVlID4+IDM7Ci0KLSAgc3dpdGNoICh0YWJsZSkgewotICAgIGNhc2UgMCA6IHsKLSAgICAgIHVpbnQzMiB0eXBlVG9rZW4gPSBpbmRleCArIChDT05TVEFOVF9UeXBlRGVmIDw8IDI0KTsKLSAgICAgIFZNQ29tbW9uQ2xhc3MqIHR5cGUgPSBsb2FkVHlwZSgoKE4zKikoVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpKSksIHR5cGVUb2tlbiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLSAgICAgIGJvb2wgdmlydCA9IGV4dHJhY3RNZXRob2RTaWduYXR1cmUob2Zmc2V0LCB0eXBlLCBhcmdzLCBnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLSAgICAgIFZNTWV0aG9kICptZXRoID0gaW5zdGFudGlhdGVHZW5lcmljTWV0aG9kKGdlbkFyZ3MsIHR5cGUsIG5hbWUsIGFyZ3MsIHRva2VuLCB2aXJ0LCBnZW5DbGFzcyk7Ci0gICAgICByZXR1cm4gbWV0aDsKLSAgICB9Ci0KLSAgICBjYXNlIDEgOiB7Ci0gICAgICB1aW50MzIgdHlwZVRva2VuID0gaW5kZXggKyAoQ09OU1RBTlRfVHlwZVJlZiA8PCAyNCk7Ci0gICAgICBWTUNvbW1vbkNsYXNzKiB0eXBlID0gbG9hZFR5cGUoKChOMyopVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpKSwgdHlwZVRva2VuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZ2VuQ2xhc3MsIGdlbk1ldGhvZCk7Ci0gICAgICBib29sIHZpcnQgPSBleHRyYWN0TWV0aG9kU2lnbmF0dXJlKG9mZnNldCwgdHlwZSwgYXJncywgZ2VuQ2xhc3MsIGdlbk1ldGhvZCk7Ci0gICAgICBWTU1ldGhvZCAqbWV0aCA9IGluc3RhbnRpYXRlR2VuZXJpY01ldGhvZChnZW5BcmdzLCB0eXBlLCBuYW1lLCBhcmdzLCB0b2tlbiwgdmlydCwgZ2VuQ2xhc3MpOwotICAgICAgcmV0dXJuIG1ldGg7Ci0gICAgfQotCi0gICAgY2FzZSAyOgotICAgIGNhc2UgMzogVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lICVkIiwgdGFibGUpOyBicmVhazsKLSAgICBjYXNlIDQ6IHsKLSAgICAgIFZNQ2xhc3MqIHR5cGUgPSAoVk1DbGFzcyopIHJlYWRUeXBlU3BlYyh2bSwgaW5kZXgsIGdlbkNsYXNzLCBnZW5NZXRob2QpOwotICAgICAgICAKLSAgICAgIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcyA9IHN0YXRpY19jYXN0PFZNR2VuZXJpY0NsYXNzKj4gKHR5cGUpOwotICAKLSAgICAgIGlmIChnZW5DbGFzcykgewotICAgICAgICB0eXBlLT5yZXNvbHZlVHlwZShmYWxzZSwgZmFsc2UsIGdlbk1ldGhvZCk7Ci0gICAgICAgIAotICAgICAgICBib29sIHZpcnQgPSBleHRyYWN0TWV0aG9kU2lnbmF0dXJlKG9mZnNldCwgdHlwZSwgYXJncywgZ2VuQ2xhc3MsIGdlbk1ldGhvZCk7Ci0gICAgICAgIFZNTWV0aG9kKiBtZXRoID0gaW5zdGFudGlhdGVHZW5lcmljTWV0aG9kKGdlbkFyZ3MsIHR5cGUsIG5hbWUsIGFyZ3MsCi0gICAgICAgICAgICB0b2tlbiwgdmlydCwgZ2VuQ2xhc3MpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG1ldGg7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0eXBlLT5yZXNvbHZlVHlwZShmYWxzZSwgZmFsc2UsIGdlbk1ldGhvZCk7Ci0gICAgICAgIAotICAgICAgICBWTU1ldGhvZCogbWV0aCA9IG5ldyhhbGxvY2F0b3IsICJWTU1ldGhvZCIpIFZNTWV0aG9kKCkgOwotICAgICAgICBib29sIHZpcnQgPSBleHRyYWN0TWV0aG9kU2lnbmF0dXJlKG9mZnNldCwgdHlwZSwgYXJncywgZ2VuQ2xhc3MsIGdlbk1ldGhvZCk7Ci0gICAgICAgIGJvb2wgc3RydWN0UmV0dXJuID0gZmFsc2U7Ci0gICAgICAgIGNvbnN0IGxsdm06OkZ1bmN0aW9uVHlwZSogc2lnbmF0dXJlID0gVk1NZXRob2Q6OnJlc29sdmVTaWduYXR1cmUoYXJncywKLSAgICAgICAgICAgIHZpcnQsIHN0cnVjdFJldHVybiwgZ2VuTWV0aG9kKTsKLSAgICAgICAgbWV0aC0+X3NpZ25hdHVyZSA9IHNpZ25hdHVyZTsKLSAgICAgICAgbWV0aC0+Y2xhc3NEZWYgPSB0eXBlOwotICAgICAgICBtZXRoLT5uYW1lID0gbmFtZTsKLSAgICAgICAgbWV0aC0+dmlydCA9IHZpcnQ7Ci0gICAgICAgIG1ldGgtPnN0cnVjdFJldHVybiA9IHN0cnVjdFJldHVybjsKLSAgICAgICAgbWV0aC0+cGFyYW1ldGVycyA9IGFyZ3M7IC8vIFRPRE8gY2hlY2sgd2hldGhlciB0aGlzIGZpeCBpcyBjb3JyZWN0Ci0gICAgICAgIHJldHVybiBtZXRoOwotICAgICAgfQotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigidW5rbm93biBNZW1iZXJSZWZQYXJlbnQgdGFnICVkIiwgdGFibGUpOwotICAgICAgCi0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotVk1NZXRob2QqIEFzc2VtYmx5OjpyZWFkTWV0aG9kU3BlYyh1aW50MzIgdG9rZW4sIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgdWludDMyIGluZGV4ID0gdG9rZW4gJiAweGZmZmY7Ci0gIHVpbnQzMiBibG9iT2Zmc2V0ID0gQ0xJSGVhZGVyLT5ibG9iU3RyZWFtLT5yZWFsT2Zmc2V0OwotICAKLSAgVGFibGUqIG1ldGhvZFRhYmxlID0gQ0xJSGVhZGVyLT50YWJsZXNbQ09OU1RBTlRfTWV0aG9kU3BlY107Ci0gIHVpbnQzMiogbWV0aG9kQXJyYXkgPSAodWludDMyKikgYWxsb2NhKHNpemVvZih1aW50MzIpICogbWV0aG9kVGFibGUtPnJvd1NpemUpOwotICAKLSAgbWV0aG9kVGFibGUtPnJlYWRSb3cobWV0aG9kQXJyYXksIGluZGV4LCBieXRlcyk7Ci0gIAotICB1aW50MzIgbWV0aG9kID0gbWV0aG9kQXJyYXlbQ09OU1RBTlRfTUVUSE9EX1NQRUNfTUVUSE9EXTsKLSAgdWludDMyIGluc3RhbnRpYXRpb24gPSBtZXRob2RBcnJheVtDT05TVEFOVF9NRVRIT0RfU1BFQ19JTlNUQU5USUFUSU9OXTsKLSAgCi0gIHVpbnQzMiBvZmZzZXQgPSBibG9iT2Zmc2V0ICsgaW5zdGFudGlhdGlvbjsKLSAgCi0gIHN0ZDo6dmVjdG9yPFZNQ29tbW9uQ2xhc3MqPiBnZW5BcmdzOwotICBtZXRob2RTcGVjU2lnbmF0dXJlKG9mZnNldCwgZ2VuQXJncywgZ2VuQ2xhc3MsIGdlbk1ldGhvZCk7Ci0gIAotICB1aW50MzIgdGFibGUgPSBtZXRob2QgJiAxOwotICBpbmRleCA9IG1ldGhvZCA+PiAxOwotICAKLSAgdWludDMyIG1ldGhvZFRva2VuOwotICAKLSAgc3dpdGNoICh0YWJsZSkgewotICAgIGNhc2UgMCA6IHsKLSAgICAgIG1ldGhvZFRva2VuID0gaW5kZXggKyAoQ09OU1RBTlRfTWV0aG9kRGVmIDw8IDI0KTsKLSAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgMSA6IHsKLSAgICAgIG1ldGhvZFRva2VuID0gaW5kZXggKyAoQ09OU1RBTlRfTWVtYmVyUmVmIDw8IDI0KTsKLSAgICAgIHJldHVybiByZWFkTWVtYmVyUmVmQXNNZXRob2QobWV0aG9kVG9rZW4sICZnZW5BcmdzLCBnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoIkludmFsaWQgTWV0aG9kU3BlYyEiKTsKLSAgfQotICAKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNvbnN0IEFycmF5Q2hhciogQXNzZW1ibHk6OnJlYWRVc2VyU3RyaW5nKHVpbnQzMiB0b2tlbikgewotICB1aW50MzIgb2Zmc2V0ID0gQ0xJSGVhZGVyLT51c1N0cmVhbS0+cmVhbE9mZnNldCArIHRva2VuOwotCi0gIHVpbnQ4IHNpemUgPSBSRUFEX1UxKGJ5dGVzLCBvZmZzZXQpOwotICBpZiAoc2l6ZSA+PiA3KSB7Ci0gICAgaWYgKChzaXplID4+IDYpID09IDMpIHsKLSAgICAgIHVpbnQzMiBzaXplMSA9IFJFQURfVTEoYnl0ZXMsIG9mZnNldCk7Ci0gICAgICB1aW50MzIgc2l6ZTIgPSBSRUFEX1UxKGJ5dGVzLCBvZmZzZXQpOwotICAgICAgdWludDMyIHNpemUzID0gUkVBRF9VMShieXRlcywgb2Zmc2V0KTsKLSAgICAgIHNpemUgPSAoKHNpemUgXiAweGMwKSA8PCAyNCkgKyAoc2l6ZTEgPDwgMTYpICsgKHNpemUyIDw8IDgpICsgc2l6ZTM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNpemUgPSAoKHNpemUgXiAweDgwKSA8PCA4KSArIFJFQURfVTEoYnl0ZXMsIG9mZnNldCk7Ci0gICAgfQotICB9Ci0KLQlkZWNsYXJlX2djcm9vdChjb25zdCBBcnJheUNoYXIqLCByZXMpID0gcmVhZFVURjE2KChOMyopKFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKSksIHNpemUsIGJ5dGVzLCBvZmZzZXQpOwotICByZXR1cm4gcmVzOwotfQotCi11aW50MzIgQXNzZW1ibHk6OmdldFJWQUZyb21GaWVsZCh1aW50MzIgdG9rZW4pIHsKLSAgCi0gIHVpbnQzMiBpbmRleCA9IHRva2VuICYgMHhmZmZmOwotICBUYWJsZSogcnZhVGFibGUgPSBDTElIZWFkZXItPnRhYmxlc1tDT05TVEFOVF9GaWVsZFJWQV07Ci0gIHVpbnQzMiBydmFTaXplID0gcnZhVGFibGUtPnJvd3NOdW1iZXI7Ci0gIAotICB1aW50MzIgaSA9IDA7Ci0gIGJvb2wgZm91bmQgPSBmYWxzZTsKLQotICB3aGlsZSAoIWZvdW5kICYmIGkgIT0gcnZhU2l6ZSkgewotICAgIHVpbnQzMiBmaWVsZElkID0gcnZhVGFibGUtPnJlYWRJbmRleEluUm93KGkgKyAxLCBDT05TVEFOVF9GSUVMRF9SVkFfRklFTEQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMpOwotICAgIGlmIChmaWVsZElkID09IGluZGV4KSB7Ci0gICAgICBmb3VuZCA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICsraTsKLSAgICB9Ci0gIH0KLSAgaWYgKCFmb3VuZCkgewotICAgIHJldHVybiAwOwotICB9IGVsc2UgewotICAgIHJldHVybiBydmFUYWJsZS0+cmVhZEluZGV4SW5Sb3coaSArIDEsIENPTlNUQU5UX0ZJRUxEX1JWQV9SVkEsIGJ5dGVzKTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS92bWtpdC9saWIvTjMvVk1Db3JlL0Fzc2VtYmx5LmggYi92bWtpdC9saWIvTjMvVk1Db3JlL0Fzc2VtYmx5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZjJjNmMuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL04zL1ZNQ29yZS9Bc3NlbWJseS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzM3ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLSBBc3NlbWJseS5oIC0gRGVmaW5pdGlvbiBvZiBhbiBhc3NlbWJseSAtLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMwotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLQotI2lmbmRlZiBOM19BU1NFTUJMWV9ICi0jZGVmaW5lIE4zX0FTU0VNQkxZX0gKLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLSNpbmNsdWRlICJtdm0vT2JqZWN0LmgiCi0jaW5jbHVkZSAibXZtL1RocmVhZHMvTG9ja3MuaCIKLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9Db25kLmgiCi0KLSNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgotI2luY2x1ZGUgImxsdm0vVHlwZS5oIgotCi0jaW5jbHVkZSAiVk1BcnJheS5oIgotCi1uYW1lc3BhY2UgbGx2bSB7Ci0gIGNsYXNzIEdlbmVyaWNWYWx1ZTsKLX0KLQotbmFtZXNwYWNlIG12bSB7Ci0JY2xhc3MgVVRGODsKLQljbGFzcyBVVEY4TWFwOwotfQotCi1uYW1lc3BhY2UgbjMgewotCi11c2luZyBtdm06OlVURjg7Ci11c2luZyBtdm06OlVURjhNYXA7Ci0KLWNsYXNzIEFycmF5Q2hhcjsKLWNsYXNzIEFycmF5T2JqZWN0OwotY2xhc3MgQXNzZW1ibHk7Ci1jbGFzcyBDbGFzc05hbWVNYXA7Ci1jbGFzcyBDbGFzc1Rva2VuTWFwOwotY2xhc3MgRmllbGRUb2tlbk1hcDsKLWNsYXNzIE1ldGhvZFRva2VuTWFwOwotY2xhc3MgTjM7Ci1jbGFzcyBQYXJhbTsKLWNsYXNzIFByb3BlcnR5OwotY2xhc3MgUmVhZGVyOwotY2xhc3MgVk1DbGFzczsKLWNsYXNzIFZNR2VuZXJpY0NsYXNzOwotY2xhc3MgVk1DbGFzc0FycmF5OwotY2xhc3MgVk1DbGFzc1BvaW50ZXI7Ci1jbGFzcyBWTUNvbW1vbkNsYXNzOwotY2xhc3MgVk1GaWVsZDsKLWNsYXNzIFZNTWV0aG9kOwotY2xhc3MgVk1PYmplY3Q7Ci1jbGFzcyBWTUdlbmVyaWNDbGFzczsKLWNsYXNzIFZNR2VuZXJpY01ldGhvZDsKLWNsYXNzIEJ5dGVDb2RlOwotCi1jbGFzcyBTZWN0aW9uIDogcHVibGljIG12bTo6UGVybWFuZW50T2JqZWN0IHsKLXB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIHByaW50KG12bTo6UHJpbnRCdWZmZXIqIGJ1ZikgY29uc3Q7Ci0gIAotICBjaGFyKiBuYW1lOwotICB1aW50MzIgdmlydHVhbFNpemU7Ci0gIHVpbnQzMiB2aXJ0dWFsQWRkcmVzczsKLSAgdWludDMyIHJhd1NpemU7Ci0gIHVpbnQzMiByYXdBZGRyZXNzOwotICB1aW50MzIgcmVsb2NBZGRyZXNzOwotICB1aW50MzIgbGluZU51bWJlcnM7Ci0gIHVpbnQzMiByZWxvY2F0aW9uc051bWJlcjsKLSAgdWludDMyIGxpbmVOdW1iZXJzTnVtYmVyOwotICB1aW50MzIgY2hhcmFjdGVyaXN0aWNzOwotCi0gIHZvaWQgcmVhZChSZWFkZXIqIHJlYWRlciwgTjMqIHZtKTsKLX07Ci0KLWNsYXNzIFN0cmVhbSA6IHB1YmxpYyBtdm06OlBlcm1hbmVudE9iamVjdCB7Ci1wdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBwcmludChtdm06OlByaW50QnVmZmVyKiBidWYpIGNvbnN0OwotCi0gIGNoYXIqIG5hbWU7Ci0gIHVpbnQzMiByZWFsT2Zmc2V0OwotICB1aW50MzIgc2l6ZTsKLX07Ci0KLWNsYXNzIFRhYmxlIDogcHVibGljIG12bTo6UGVybWFuZW50T2JqZWN0IHsKLXB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIHByaW50KG12bTo6UHJpbnRCdWZmZXIqIGJ1ZikgY29uc3Q7Ci0KLSAgdWludDMyIG9mZnNldDsKLSAgdWludDMyIHJvd3NOdW1iZXI7Ci0gIHVpbnQzMiByb3dTaXplOwotICB1aW50MzIgY291bnQ7Ci0gIHVpbnQzMiBzaXplTWFzazsKLQotICB2b2lkIHJlYWRSb3codWludDMyKiByZXN1bHQsIHVpbnQzMiByb3csIEJ5dGVDb2RlKiBhcnJheSk7Ci0gIHVpbnQzMiByZWFkSW5kZXhJblJvdyh1aW50MzIgcm93LCB1aW50MzIgaW5kZXgsIEJ5dGVDb2RlKiBhcnJheSk7Ci0KLX07Ci0KLQotY2xhc3MgSGVhZGVyIDogcHVibGljIG12bTo6UGVybWFuZW50T2JqZWN0IHsKLXB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIHByaW50KG12bTo6UHJpbnRCdWZmZXIqIGJ1ZikgY29uc3Q7Ci0KLSAgdWludDMyIHNpZ25hdHVyZTsKLSAgdWludDMyIG1ham9yOwotICB1aW50MzIgbWlub3I7Ci0gIHVpbnQzMiByZXNlcnZlZDsKLSAgdWludDMyIHZlcnNpb25MZW5ndGg7Ci0gIHVpbnQzMiBmbGFnczsKLSAgdWludDMyIG5iU3RyZWFtczsKLQotICBjb25zdCBVVEY4KiB2ZXJzaW9uTmFtZTsKLSAgU3RyZWFtKiB0aWxkU3RyZWFtOwotICBTdHJlYW0qIHN0cmluZ1N0cmVhbTsKLSAgU3RyZWFtKiB1c1N0cmVhbTsKLSAgU3RyZWFtKiBibG9iU3RyZWFtOwotICBTdHJlYW0qIGd1aWRTdHJlYW07Ci0gIHN0ZDo6dmVjdG9yPFRhYmxlKiwgZ2NfYWxsb2NhdG9yPFRhYmxlKj4gPiB0YWJsZXM7Ci0gIAotICB2b2lkIHJlYWQobXZtOjpCdW1wUHRyQWxsb2NhdG9yICZhbGxvY2F0b3IsIFJlYWRlciogcmVhZGVyLCBOMyogdm0pOwotfTsKLQotdHlwZWRlZiB2b2lkICgqbWFza1ZlY3Rvcl90KSh1aW50MzIgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFRhYmxlKiwgZ2NfYWxsb2NhdG9yPFRhYmxlKj4gPiYgdGFibGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgaGVhcFNpemVzKTsKLQotdHlwZWRlZiBWTUNvbW1vbkNsYXNzKiAoKnNpZ25hdHVyZVZlY3Rvcl90KSh1aW50MzIgb3AsIEFzc2VtYmx5KiBhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiYgb2Zmc2V0LCBWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKTsKLQotY2xhc3MgQXNzZW1ibHkgOiBwdWJsaWMgbXZtOjpQZXJtYW5lbnRPYmplY3QgewotcHVibGljOgotICB2aXJ0dWFsIHZvaWQgcHJpbnQobXZtOjpQcmludEJ1ZmZlciogYnVmKSBjb25zdDsKLSAgdmlydHVhbCB2b2lkIFRSQUNFUjsKLQotICBWTUNsYXNzUG9pbnRlciogY29uc3RydWN0UG9pbnRlcihWTUNvbW1vbkNsYXNzKiBiYXNlLCB1aW50MzIgZGltcyk7Ci0gIFZNQ2xhc3NBcnJheSogY29uc3RydWN0QXJyYXkoVk1Db21tb25DbGFzcyogYmFzZSwgdWludDMyIGRpbXMpOwotICBWTUNsYXNzQXJyYXkqIGNvbnN0cnVjdEFycmF5KGNvbnN0IFVURjgqIG5hbWUsIGNvbnN0IFVURjgqIG5hbWVTcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgZGltcyk7Ci0gIFZNQ2xhc3MqICAgICAgY29uc3RydWN0Q2xhc3MoY29uc3QgVVRGOCogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVVEY4KiBuYW1lU3BhY2UsIHVpbnQzMiB0b2tlbik7Ci0gIFZNR2VuZXJpY0NsYXNzKiBjb25zdHJ1Y3RHZW5lcmljQ2xhc3MoY29uc3QgVVRGOCogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVVEY4KiBuYW1lU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+IGdlbkFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHRva2VuKTsKLSAgVk1GaWVsZCogICAgICBjb25zdHJ1Y3RGaWVsZChWTUNsYXNzKiBjbCwgY29uc3QgVVRGOCogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWTUNvbW1vbkNsYXNzKiBzaWduYXR1cmUsIHVpbnQzMiB0b2tlbiwgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCk7Ci0gIFZNTWV0aG9kKiAgICAgY29uc3RydWN0TWV0aG9kKFZNQ2xhc3MqIGNsLCBjb25zdCBVVEY4KiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgdG9rZW4sIGJvb2wgZ2VuZXJpYywgc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+KiBnZW5NZXRob2RJbnN0YW50aWF0aW9uLCBWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MpOwotICBWTUNvbW1vbkNsYXNzKiBsb29rdXBDbGFzc0Zyb21OYW1lKGNvbnN0IFVURjgqIG5hbWUsIGNvbnN0IFVURjgqIG5hbWVTcGFjZSk7Ci0gIFZNQ29tbW9uQ2xhc3MqIGxvb2t1cENsYXNzRnJvbVRva2VuKHVpbnQzMiB0b2tlbik7Ci0gIFZNTWV0aG9kKiBsb29rdXBNZXRob2RGcm9tVG9rZW4odWludDMyIHRva2VuKTsKLSAgVk1GaWVsZCogbG9va3VwRmllbGRGcm9tVG9rZW4odWludDMyIHRva2VuKTsKLSAgCi0gIFZNT2JqZWN0KiAgICAgZ2V0QXNzZW1ibHlEZWxlZ2F0ZWUoKTsKLQotICBDbGFzc05hbWVNYXAqIGxvYWRlZE5hbWVDbGFzc2VzOwotICBDbGFzc1Rva2VuTWFwKiBsb2FkZWRUb2tlbkNsYXNzZXM7Ci0gIE1ldGhvZFRva2VuTWFwKiBsb2FkZWRUb2tlbk1ldGhvZHM7Ci0gIEZpZWxkVG9rZW5NYXAqIGxvYWRlZFRva2VuRmllbGRzOwotICAKLSAgTjMqICAgICAgICAgICB2bTsKLSAgbXZtOjpMb2NrKiAgICBsb2NrVmFyOwotICBtdm06OkNvbmQqICAgIGNvbmRWYXI7Ci0gIGNvbnN0IFVURjgqICAgbmFtZTsKLSAgQnl0ZUNvZGUqICAgICBieXRlczsKLSAgU2VjdGlvbiogICAgICB0ZXh0U2VjdGlvbjsKLSAgU2VjdGlvbiogICAgICByc3JjU2VjdGlvbjsKLSAgU2VjdGlvbiogICAgICByZWxvY1NlY3Rpb247Ci0gIEhlYWRlciogICAgICAgQ0xJSGVhZGVyOwotICBWTU9iamVjdCogICAgIG9vb19kZWxlZ2F0ZWU7Ci0gIEFzc2VtYmx5KiogICAgYXNzZW1ibHlSZWZzOwotCi0gIHVpbnQzMiBDTElIZWFkZXJMb2NhdGlvbjsKLSAgdm9sYXRpbGUgYm9vbCBpc1JlYWQ7Ci0gIHVpbnQzMiBjYjsKLSAgdWludDMyIG1ham9yOwotICB1aW50MzIgbWlub3I7Ci0gIHVpbnQzMiBtZFJ2YTsKLSAgdWludDMyIG1kU2l6ZTsKLSAgdWludDMyIGZsYWdzOwotICB1aW50MzIgZW50cnlQb2ludDsKLSAgdWludDMyIHJlc1J2YTsKLSAgdWludDMyIHJlc1NpemU7Ci0KLQltdm06OkJ1bXBQdHJBbGxvY2F0b3IgJmFsbG9jYXRvcjsKLQotCUFzc2VtYmx5KG12bTo6QnVtcFB0ckFsbG9jYXRvciAmQWxsb2MsIE4zICp2bSwgY29uc3QgVVRGOCogbmFtZSk7Ci0KLQlpbnQgb3Blbihjb25zdCBjaGFyICpleHQpOwotICBpbnQgcmVzb2x2ZShpbnQgZG9SZXNvbHZlLCBjb25zdCBjaGFyICpleHQpOwotCi0gIHN0YXRpYyBjb25zdCBVVEY4KiByZWFkVVRGOChOMyogdm0sIHVpbnQzMiBsZW4sIFJlYWRlciogcmVhZGVyKTsKLSAgc3RhdGljIGNvbnN0IFVURjgqIHJlYWRVVEY4KE4zKiB2bSwgdWludDMyIGxlbiwgQnl0ZUNvZGUqIGJ5dGVzLCB1aW50MzImIG9mZnNldCk7Ci0gIHN0YXRpYyBjb25zdCBBcnJheUNoYXIqIHJlYWRVVEYxNihOMyogdm0sIHVpbnQzMiBsZW4sIFJlYWRlciogcmVhZGVyKTsKLSAgc3RhdGljIGNvbnN0IEFycmF5Q2hhciogcmVhZFVURjE2KE4zKiB2bSwgdWludDMyIGxlbiwgQnl0ZUNvZGUqIGJ5dGVzLCB1aW50MzImIG9mZnNldCk7Ci0gIGNvbnN0IFVURjgqICAgICAgICByZWFkU3RyaW5nKE4zKiB2bSwgdWludDMyIG9mZnNldCk7Ci0gIHZvaWQgcmVhZFRhYmxlcyhSZWFkZXIqIHJlYWRlcik7Ci0KLSAgc3RhdGljIG1hc2tWZWN0b3JfdCBtYXNrVmVjdG9yWzY0XTsKLSAgc3RhdGljIGNvbnN0IGNoYXIqIG1hc2tWZWN0b3JOYW1lWzY0XTsKLSAgc3RhdGljIHNpZ25hdHVyZVZlY3Rvcl90IHNpZ25hdHVyZVZlY3RvclsweDQ2XTsKLSAgc3RhdGljIGNvbnN0IGNoYXIqIHNpZ25hdHVyZU5hbWVzWzB4NDZdOwotICAKLQotCVJlYWRlciAqbmV3UmVhZGVyKEJ5dGVDb2RlKiBhcnJheSwgdWludDMyIHN0YXJ0ID0gMCwgdWludDMyIGVuZCA9IDApOwotCi0gIHVpbnQzMiB1bmNvbXByZXNzU2lnbmF0dXJlKHVpbnQzMiYgb2Zmc2V0KTsKLSAgdWludDMyIGdldFR5cGVEZWZUb2tlbkZyb21NZXRob2QodWludDMyIHRva2VuKTsKLSAgVk1Db21tb25DbGFzcyogbG9hZFR5cGUoTjMqIHZtLCB1aW50MzIgdG9rZW4sIGJvb2wgcmVzb2x2ZUZ1bmMsIGJvb2wgcmVzb2x2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjbGluaXQsIGJvb2wgZG90aHJvdywgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCk7Ci0gIFZNQ29tbW9uQ2xhc3MqIGxvYWRUeXBlKE4zKiB2bSwgdWludDMyIHRva2VuLCBib29sIHJlc29sdmVGdW5jLCBib29sIHJlc29sdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2xpbml0LCBib29sIGRvdGhyb3csIHN0ZDo6dmVjdG9yPFZNQ29tbW9uQ2xhc3MqPiBnZW5BcmdzLCBWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKTsKLSAgCi0gIFZNQ29tbW9uQ2xhc3MqIGxvYWRUeXBlRnJvbU5hbWUoY29uc3QgVVRGOCogbmFtZSwgY29uc3QgVVRGOCogbmFtZVNwYWNlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlc29sdmVGdW5jLCBib29sIHJlc29sdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjbGluaXQsIGJvb2wgZG90aHJvdyk7Ci0gIHZvaWQgcmVhZENsYXNzKFZNQ29tbW9uQ2xhc3MqIGNsLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCk7Ci0gIHZvaWQgZ2V0UHJvcGVydGllcyhWTUNvbW1vbkNsYXNzKiBjbCwgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCk7Ci0gIFByb3BlcnR5KiByZWFkUHJvcGVydHkodWludDMyIGluZGV4LCBWTUNvbW1vbkNsYXNzKiBjbCwgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCk7Ci0gIFZNTWV0aG9kKiByZWFkTWV0aG9kRGVmKHVpbnQzMiBpbmRleCwgVk1Db21tb25DbGFzcyogY2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFZNQ29tbW9uQ2xhc3MqPiogZ2VuTWV0aG9kSW5zdGFudGlhdGlvbiwgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzKTsKLSAgVk1NZXRob2QqIHJlYWRNZXRob2RTcGVjKHVpbnQzMiB0b2tlbiwgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCk7Ci0gIFZNRmllbGQqIHJlYWRGaWVsZCh1aW50MzIgaW5kZXgsIFZNQ29tbW9uQ2xhc3MqIGNsLCBWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKTsKLSAgUGFyYW0qIHJlYWRQYXJhbSh1aW50MzIgaW5kZXgsIFZNTWV0aG9kKiBtZXRoKTsKLSAgVk1DbGFzcyogcmVhZFR5cGVEZWYoTjMqIHZtLCB1aW50MzIgaW5kZXgpOwotICBWTUNsYXNzKiByZWFkVHlwZURlZihOMyogdm0sIHVpbnQzMiBpbmRleCwgc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+IGdlbkFyZ3MpOwotICBWTUNvbW1vbkNsYXNzKiByZWFkVHlwZVNwZWMoTjMqIHZtLCB1aW50MzIgaW5kZXgsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpOwotICBBc3NlbWJseSogcmVhZEFzc2VtYmx5UmVmKE4zKiB2bSwgdWludDMyIGluZGV4KTsKLSAgVk1Db21tb25DbGFzcyogcmVhZFR5cGVSZWYoTjMqIHZtLCB1aW50MzIgaW5kZXgpOwotICB2b2lkIHJlYWRTaWduYXR1cmUodWludDMyIG9mZnNldCwgc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+JiBsb2NhbHMsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpOwotICAKLSAgdm9pZCBnZXRJbnRlcmZhY2VzRnJvbVRva2VuVHlwZShzdGQ6OnZlY3Rvcjx1aW50MzI+JiB0b2tlbnMsIHVpbnQzMiB0b2tlbik7Ci0gIAotICBib29sIGV4dHJhY3RNZXRob2RTaWduYXR1cmUodWludDMyJiBvZmZzZXQsIFZNQ29tbW9uQ2xhc3MqIGNsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+ICZwYXJhbXMsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpOwotICBib29sIGlzR2VuZXJpY01ldGhvZCh1aW50MzImIG9mZnNldCk7Ci0gIHZvaWQgbG9jYWxWYXJTaWduYXR1cmUodWludDMyJiBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+JiBsb2NhbHMsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpOwotICB2b2lkIG1ldGhvZFNwZWNTaWduYXR1cmUodWludDMyJiBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxWTUNvbW1vbkNsYXNzKj4mIGdlbkFyZ3MsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpOwotICBWTUNvbW1vbkNsYXNzKiBleHRyYWN0RmllbGRTaWduYXR1cmUodWludDMyJiBvZmZzZXQsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpOwotICBWTUNvbW1vbkNsYXNzKiBleHRyYWN0VHlwZUluU2lnbmF0dXJlKHVpbnQzMiYgb2Zmc2V0LCBWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKTsKLSAgVk1Db21tb25DbGFzcyogZXhwbG9yZVR5cGUodWludDMyJiBvZmZzZXQsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpOyAKLSAgCi0gIFZNQ29tbW9uQ2xhc3MqIGdldENsYXNzRnJvbU5hbWUoTjMqIHZtLCBjb25zdCBVVEY4KiBuYW1lLCBjb25zdCBVVEY4KiBuYW1lU3BhY2UpOwotICAKLSAgVk1GaWVsZCogZ2V0RmllbGRGcm9tVG9rZW4odWludDMyIHRva2VuLCBib29sIHN0YXQsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpOyAKLSAgdWludDMyIGdldFR5cGVkZWZUb2tlbkZyb21GaWVsZCh1aW50MzIgdG9rZW4pOwotICBWTUZpZWxkKiByZWFkTWVtYmVyUmVmQXNGaWVsZCh1aW50MzIgdG9rZW4sIGJvb2wgc3RhdCwgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCk7Ci0gIAotICBWTU1ldGhvZCogZ2V0TWV0aG9kRnJvbVRva2VuKHVpbnQzMiB0b2tlbiwgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCk7IAotICB1aW50MzIgZ2V0VHlwZWRlZlRva2VuRnJvbU1ldGhvZCh1aW50MzIgdG9rZW4pOwotICBWTU1ldGhvZCogcmVhZE1lbWJlclJlZkFzTWV0aG9kKHVpbnQzMiB0b2tlbiwgc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+KiBnZW5BcmdzLCBWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKTsKLQotICBjb25zdCBBcnJheUNoYXIqIHJlYWRVc2VyU3RyaW5nKHVpbnQzMiB0b2tlbik7IAotICB1aW50MzIgZ2V0RXhwbGljaXRMYXlvdXQodWludDMyIHRva2VuKTsKLSAgdWludDMyIGdldFJWQUZyb21GaWVsZCh1aW50MzIgdG9rZW4pOwotICAKLSAgc3RhdGljIEFzc2VtYmx5KiBnZXRDYWxsaW5nQXNzZW1ibHkoKTsKLSAgc3RhdGljIEFzc2VtYmx5KiBnZXRFeGVjdXRpbmdBc3NlbWJseSgpOwotCi0gIHZvaWQgcmVhZEN1c3RvbUF0dHJpYnV0ZXModWludDMyIG9mZnNldCwgc3RkOjp2ZWN0b3I8bGx2bTo6R2VuZXJpY1ZhbHVlPiYgYXJncywgVk1NZXRob2QqIG1ldGgpOwotICBBcnJheU9iamVjdCogZ2V0Q3VzdG9tQXR0cmlidXRlcyh1aW50MzIgdG9rZW4sIFZNQ29tbW9uQ2xhc3MqIGNsKTsKLXByaXZhdGU6Ci0gICAgVk1NZXRob2QgKmluc3RhbnRpYXRlR2VuZXJpY01ldGhvZChzdGQ6OnZlY3RvcjxWTUNvbW1vbkNsYXNzKj4gKmdlbkFyZ3MsIFZNQ29tbW9uQ2xhc3MgKnR5cGUsIGNvbnN0IFVURjggKiYgbmFtZSwgc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+ICYgYXJncywgdWludDMyIHRva2VuLCBib29sIHZpcnQsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcyk7Ci0KLX07Ci0KLQotI2RlZmluZSBDT05TVEFOVF9Bc3NlbWJseSAweDIwCi0jZGVmaW5lIENPTlNUQU5UX0Fzc2VtYmx5T1MgMHgyMgotI2RlZmluZSBDT05TVEFOVF9Bc3NlbWJseVByb2Nlc3NvciAweDIxCi0jZGVmaW5lIENPTlNUQU5UX0Fzc2VtYmx5UmVmIDB4MjMKLSNkZWZpbmUgQ09OU1RBTlRfQXNzZW1ibHlSZWZPUyAweDI1Ci0jZGVmaW5lIENPTlNUQU5UX0Fzc2VtYmx5UmVmUHJvY2Vzc29yIDB4MjQKLSNkZWZpbmUgQ09OU1RBTlRfQ2xhc3NMYXlvdXQgMHgwRgotI2RlZmluZSBDT05TVEFOVF9Db25zdGFudCAweDBCCi0jZGVmaW5lIENPTlNUQU5UX0N1c3RvbUF0dHJpYnV0ZSAweDBDCi0jZGVmaW5lIENPTlNUQU5UX0RlY2xTZWN1cml0eSAweDBFCi0jZGVmaW5lIENPTlNUQU5UX0V2ZW50TWFwIDB4MTIKLSNkZWZpbmUgQ09OU1RBTlRfRXZlbnQgMHgxNAotI2RlZmluZSBDT05TVEFOVF9FeHBvcnRlZFR5cGUgMHgyNwotI2RlZmluZSBDT05TVEFOVF9GaWVsZCAweDA0Ci0jZGVmaW5lIENPTlNUQU5UX0ZpZWxkTGF5b3V0IDB4MTAKLSNkZWZpbmUgQ09OU1RBTlRfRmllbGRNYXJzaGFsIDB4MEQKLSNkZWZpbmUgQ09OU1RBTlRfRmllbGRSVkEgMHgxRAotI2RlZmluZSBDT05TVEFOVF9GaWxlIDB4MjYKLSNkZWZpbmUgQ09OU1RBTlRfR2VuZXJpY1BhcmFtIDB4MkEKLSNkZWZpbmUgQ09OU1RBTlRfR2VuZXJpY1BhcmFtQ29uc3RyYWludCAweDJDCi0jZGVmaW5lIENPTlNUQU5UX0ltcGxNYXAgMHgxQwotI2RlZmluZSBDT05TVEFOVF9JbnRlcmZhY2VJbXBsIDB4MDkKLSNkZWZpbmUgQ09OU1RBTlRfTWFuaWZlc3RSZXNvdXJjZSAweDI4Ci0jZGVmaW5lIENPTlNUQU5UX01lbWJlclJlZiAweDBBCi0jZGVmaW5lIENPTlNUQU5UX01ldGhvZERlZiAweDA2Ci0jZGVmaW5lIENPTlNUQU5UX01ldGhvZEltcGwgMHgxOQotI2RlZmluZSBDT05TVEFOVF9NZXRob2RTZW1hbnRpY3MgMHgxOAotI2RlZmluZSBDT05TVEFOVF9NZXRob2RTcGVjIDB4MkIKLSNkZWZpbmUgQ09OU1RBTlRfTW9kdWxlIDB4MDAKLSNkZWZpbmUgQ09OU1RBTlRfTW9kdWxlUmVmIDB4MUEKLSNkZWZpbmUgQ09OU1RBTlRfTmVzdGVkQ2xhc3MgMHgyOQotI2RlZmluZSBDT05TVEFOVF9QYXJhbSAweDA4Ci0jZGVmaW5lIENPTlNUQU5UX1Byb3BlcnR5IDB4MTcKLSNkZWZpbmUgQ09OU1RBTlRfUHJvcGVydHlNYXAgMHgxNQotI2RlZmluZSBDT05TVEFOVF9TdGFuZGFsb25lU2lnIDB4MTEKLSNkZWZpbmUgQ09OU1RBTlRfVHlwZURlZiAweDAyCi0jZGVmaW5lIENPTlNUQU5UX1R5cGVSZWYgMHgwMQotI2RlZmluZSBDT05TVEFOVF9UeXBlU3BlYyAweDFCCi0KLQotI2RlZmluZSBDT05TVEFOVF9IYXNUaGlzIDB4MjAKLSNkZWZpbmUgQ09OU1RBTlRfRXhwbGljaXRUaGlzIDB4NDAKLSNkZWZpbmUgQ09OU1RBTlRfRGVmYXVsdCAweDAKLSNkZWZpbmUgQ09OU1RBTlRfVmFyYXJnIDB4NQotI2RlZmluZSBDT05TVEFOVF9DIDB4MQotI2RlZmluZSBDT05TVEFOVF9TdGRDYWxsIDB4MgotI2RlZmluZSBDT05TVEFOVF9UaGlzQ2FsbCAweDMKLSNkZWZpbmUgQ09OU1RBTlRfRmFzdENhbGwgMHg0Ci0jZGVmaW5lIENPTlNUQU5UX0dlbmVyaWMgMHgxMAotI2RlZmluZSBDT05TVEFOVF9TZW50aW5lbCAweDQxCi0KLQotI2RlZmluZSBDT05TVEFOVF9Db3JJTE1ldGhvZF9UaW55Rm9ybWF0IDB4MgotI2RlZmluZSBDT05TVEFOVF9Db3JJTE1ldGhvZF9GYXRGb3JtYXQgMHgzCi0jZGVmaW5lIENPTlNUQU5UX0NvcklMTWV0aG9kX01vcmVTZWN0cyAweDgKLSNkZWZpbmUgQ09OU1RBTlRfQ29ySUxNZXRob2RfSW5pdExvY2FscyAweDEwCi0jZGVmaW5lIENPTlNUQU5UX0NvcklMTWV0aG9kX1NlY3RfRmF0Rm9ybWF0IDB4NDAKLSNkZWZpbmUgQ09OU1RBTlRfQ09SX0lMRVhDRVBUSU9OX0NMQVVTRV9FWENFUFRJT04gIDB4MDAwMAotI2RlZmluZSBDT05TVEFOVF9DT1JfSUxFWENFUFRJT05fQ0xBVVNFX0ZJTFRFUiAgICAgMHgwMDAxCi0jZGVmaW5lIENPTlNUQU5UX0NPUl9JTEVYQ0VQVElPTl9DTEFVU0VfRklOQUxMWSAgICAweDAwMDIKLSNkZWZpbmUgQ09OU1RBTlRfQ09SX0lMRVhDRVBUSU9OX0NMQVVTRV9GQVVMVCAgICAgIDB4MDAwNAotCi0KLSNkZWZpbmUgQ0xJX0hFQURFUiAweDE2OAotI2RlZmluZSBURVhUX1NFQ1RJT05fSEVBREVSIDB4MTc4Ci0jZGVmaW5lIFJTUkNfU0VDVElPTl9IRUFERVIgMHgxNzgKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9IRUFERVIgMHgxNzgKLSNkZWZpbmUgU0VDVElPTl9OQU1FX0xFTkdUSCA4Ci0jZGVmaW5lIFRBQkxFX01BWCA2NAotI2RlZmluZSBOQl9UQUJMRVMgNDEKLQotI2RlZmluZSBJTlQxNihvZmZzZXQpICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHJvd1NpemUgKz0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYml0bWFzayA9IGJpdG1hc2sgfCAoMSA8PCAob2Zmc2V0IDw8IDEpKTsKLQotI2RlZmluZSBJTlQzMihvZmZzZXQpICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHJvd1NpemUgKz0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYml0bWFzayA9IGJpdG1hc2sgfCAoMyA8PCAob2Zmc2V0IDw8IDEpKTsKLQotCi0jZGVmaW5lIFNUUklORyhvZmZzZXQpIHsgICAgICAgICAgICAgICAgICAgIFwKLSAgdWludDMyIGZpZWxkU2l6ZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAoaGVhcFNpemVzICYgMHgwMSkgeyAgICAgICAgICAgICAgICAgICBcCi0gICAgZmllbGRTaXplID0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZpZWxkU2l6ZSA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgcm93U2l6ZSArPSBmaWVsZFNpemU7ICAgICAgICAgICAgICAgICAgICAgXAotICBiaXRtYXNrID0gYml0bWFzayB8ICgoZmllbGRTaXplIC0gMSkgPDwgKG9mZnNldCA8PCAxKSk7IFwKLX0KLQotI2RlZmluZSBHVUlEKG9mZnNldCkgeyAgICAgICAgICAgICAgICAgICAgICBcCi0gIHVpbnQzMiBmaWVsZFNpemUgPSAwOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKGhlYXBTaXplcyAmIDB4MDIpIHsgICAgICAgICAgICAgICAgICAgXAotICAgIGZpZWxkU2l6ZSA9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmaWVsZFNpemUgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHJvd1NpemUgKz0gZmllbGRTaXplOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgYml0bWFzayA9IGJpdG1hc2sgfCAoKGZpZWxkU2l6ZSAtIDEpIDw8IChvZmZzZXQgPDwgMSkpOyBcCi19Ci0KLSNkZWZpbmUgQkxPQihvZmZzZXQpIHsgICAgICAgICAgICAgICAgICAgICAgXAotICB1aW50MzIgZmllbGRTaXplID0gMDsgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmIChoZWFwU2l6ZXMgJiAweDA0KSB7ICAgICAgICAgICAgICAgICAgIFwKLSAgICBmaWVsZFNpemUgPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZmllbGRTaXplID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICByb3dTaXplICs9IGZpZWxkU2l6ZTsgICAgICAgICAgICAgICAgICAgICBcCi0gIGJpdG1hc2sgPSBiaXRtYXNrIHwgKChmaWVsZFNpemUgLSAxKSA8PCAob2Zmc2V0IDw8IDEpKTsgXAotfQotCi0jZGVmaW5lIFRBQkxFKHRhYmxlLCBvZmZzZXQpIHsgICAgICAgICAgICAgICAgICBcCi0gIHVpbnQzMiBmaWVsZFNpemUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmICh0YWJsZXNbdGFibGVdLT5yb3dzTnVtYmVyIDwgMHgxMDAwMCkgeyAgICBcCi0gICAgZmllbGRTaXplID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZmllbGRTaXplID0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHJvd1NpemUgKz0gZmllbGRTaXplOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGJpdG1hc2sgPSBiaXRtYXNrIHwgKChmaWVsZFNpemUgLSAxKSA8PCAob2Zmc2V0IDw8IDEpKTsgXAotfQotCi0KLSNkZWZpbmUgVFlQRURFRl9PUl9SRUYob2Zmc2V0KSB7IFwKLSAgdWludDMyIGZpZWxkU2l6ZSA9IDA7IFwKLSAgaWYgKHRhYmxlc1tDT05TVEFOVF9UeXBlRGVmXS0+cm93c051bWJlciA8IDB4NDAwMCAmJiAgICAgIFwKLSAgICAgIHRhYmxlc1tDT05TVEFOVF9UeXBlUmVmXS0+cm93c051bWJlciA8IDB4NDAwMCAmJiAgICAgIFwKLSAgICAgIHRhYmxlc1tDT05TVEFOVF9UeXBlU3BlY10tPnJvd3NOdW1iZXIgPCAweDQwMDApIHsgICAgIFwKLSAgICBmaWVsZFNpemUgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZpZWxkU2l6ZSA9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHJvd1NpemUgKz0gZmllbGRTaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBiaXRtYXNrID0gYml0bWFzayB8ICgoZmllbGRTaXplIC0gMSkgPDwgKG9mZnNldCA8PCAxKSk7IFwKLX0KLQotCi0jZGVmaW5lIEhBU19DT05TVEFOVChvZmZzZXQpIHsgXAotICB1aW50MzIgZmllbGRTaXplID0gMDsgXAotICBpZiAodGFibGVzW0NPTlNUQU5UX0ZpZWxkXS0+cm93c051bWJlciA8IDB4NDAwMCAmJiAgICAgIFwKLSAgICAgIHRhYmxlc1tDT05TVEFOVF9QYXJhbV0tPnJvd3NOdW1iZXIgPCAweDQwMDAgJiYgICAgICBcCi0gICAgICB0YWJsZXNbQ09OU1RBTlRfUHJvcGVydHldLT5yb3dzTnVtYmVyIDwgMHg0MDAwKSB7ICAgXAotICAgIGZpZWxkU2l6ZSA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZmllbGRTaXplID0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgcm93U2l6ZSArPSBmaWVsZFNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGJpdG1hc2sgPSBiaXRtYXNrIHwgKChmaWVsZFNpemUgLSAxKSA8PCAob2Zmc2V0IDw8IDEpKTsgXAotfQotCi0jZGVmaW5lIEhBU19DVVNUT01fQVRUUklCVVRFKG9mZnNldCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB1aW50MzIgZmllbGRTaXplID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKHRhYmxlc1tDT05TVEFOVF9NZXRob2REZWZdLT5yb3dzTnVtYmVyIDwgMHg4MDAgJiYgICAgICAgICBcCi0gICAgICB0YWJsZXNbQ09OU1RBTlRfRmllbGRdLT5yb3dzTnVtYmVyIDwgMHg4MDAgJiYgICAgICAgICAgICAgXAotICAgICAgdGFibGVzW0NPTlNUQU5UX1R5cGVSZWZdLT5yb3dzTnVtYmVyIDwgMHg4MDAgJiYgICAgICAgICAgIFwKLSAgICAgIHRhYmxlc1tDT05TVEFOVF9UeXBlRGVmXS0+cm93c051bWJlciA8IDB4ODAwICYmICAgICAgICAgICBcCi0gICAgICB0YWJsZXNbQ09OU1RBTlRfUGFyYW1dLT5yb3dzTnVtYmVyIDwgMHg4MDAgJiYgICAgICAgICAgICAgXAotICAgICAgdGFibGVzW0NPTlNUQU5UX0ludGVyZmFjZUltcGxdLT5yb3dzTnVtYmVyIDwgMHg4MDAgJiYgICAgIFwKLSAgICAgIHRhYmxlc1tDT05TVEFOVF9NZW1iZXJSZWZdLT5yb3dzTnVtYmVyIDwgMHg4MDAgJiYgICAgICAgICBcCi0gICAgICB0YWJsZXNbQ09OU1RBTlRfTW9kdWxlXS0+cm93c051bWJlciA8IDB4ODAwICYmICAgICAgICAgICAgXAotICAgICAgdGFibGVzW0NPTlNUQU5UX0RlY2xTZWN1cml0eV0tPnJvd3NOdW1iZXIgPCAweDgwMCAmJiAgICAgIFwKLSAgICAgIHRhYmxlc1tDT05TVEFOVF9Qcm9wZXJ0eV0tPnJvd3NOdW1iZXIgPCAweDgwMCAmJiAgICAgICAgICBcCi0gICAgICB0YWJsZXNbQ09OU1RBTlRfRXZlbnRdLT5yb3dzTnVtYmVyIDwgMHg4MDAgJiYgICAgICAgICAgICAgXAotICAgICAgdGFibGVzW0NPTlNUQU5UX1N0YW5kYWxvbmVTaWddLT5yb3dzTnVtYmVyIDwgMHg4MDAgJiYgICAgIFwKLSAgICAgIHRhYmxlc1tDT05TVEFOVF9Nb2R1bGVSZWZdLT5yb3dzTnVtYmVyIDwgMHg4MDAgJiYgICAgICAgICBcCi0gICAgICB0YWJsZXNbQ09OU1RBTlRfVHlwZVNwZWNdLT5yb3dzTnVtYmVyIDwgMHg4MDAgJiYgICAgICAgICAgXAotICAgICAgdGFibGVzW0NPTlNUQU5UX0Fzc2VtYmx5XS0+cm93c051bWJlciA8IDB4ODAwICYmICAgICAgICAgIFwKLSAgICAgIHRhYmxlc1tDT05TVEFOVF9Bc3NlbWJseVJlZl0tPnJvd3NOdW1iZXIgPCAweDgwMCAmJiAgICAgICBcCi0gICAgICB0YWJsZXNbQ09OU1RBTlRfRmlsZV0tPnJvd3NOdW1iZXIgPCAweDgwMCAmJiAgICAgICAgICAgICAgXAotICAgICAgdGFibGVzW0NPTlNUQU5UX0V4cG9ydGVkVHlwZV0tPnJvd3NOdW1iZXIgPCAweDgwMCAmJiAgICAgIFwKLSAgICAgIHRhYmxlc1tDT05TVEFOVF9NYW5pZmVzdFJlc291cmNlXS0+cm93c051bWJlciA8IDB4ODAwKSB7ICBcCi0gICAgZmllbGRTaXplID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmaWVsZFNpemUgPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICByb3dTaXplICs9IGZpZWxkU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYml0bWFzayA9IGJpdG1hc2sgfCAoKGZpZWxkU2l6ZSAtIDEpIDw8IChvZmZzZXQgPDwgMSkpOyAgICAgICBcCi19Ci0KLSNkZWZpbmUgSEFTX0ZJRUxEX01BUlNIQUwob2Zmc2V0KSB7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHVpbnQzMiBmaWVsZFNpemUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAodGFibGVzW0NPTlNUQU5UX0ZpZWxkXS0+cm93c051bWJlciA8IDB4ODAwMCAmJiAgICAgIFwKLSAgICAgIHRhYmxlc1tDT05TVEFOVF9QYXJhbV0tPnJvd3NOdW1iZXIgPCAweDgwMDApIHsgICAgICBcCi0gICAgZmllbGRTaXplID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmaWVsZFNpemUgPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICByb3dTaXplICs9IGZpZWxkU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYml0bWFzayA9IGJpdG1hc2sgfCAoKGZpZWxkU2l6ZSAtIDEpIDw8IChvZmZzZXQgPDwgMSkpOyBcCi19Ci0KLSNkZWZpbmUgSEFTX0RFQ0xfU0VDVVJJVFkob2Zmc2V0KSB7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHVpbnQzMiBmaWVsZFNpemUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAodGFibGVzW0NPTlNUQU5UX1R5cGVEZWZdLT5yb3dzTnVtYmVyIDwgMHg0MDAwICYmICAgIFwKLSAgICAgIHRhYmxlc1tDT05TVEFOVF9NZXRob2REZWZdLT5yb3dzTnVtYmVyIDwgMHg0MDAwICYmICBcCi0gICAgICB0YWJsZXNbQ09OU1RBTlRfQXNzZW1ibHldLT5yb3dzTnVtYmVyIDwgMHg0MDAwKSB7ICAgXAotICAgIGZpZWxkU2l6ZSA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZmllbGRTaXplID0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgcm93U2l6ZSArPSBmaWVsZFNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGJpdG1hc2sgPSBiaXRtYXNrIHwgKChmaWVsZFNpemUgLSAxKSA8PCAob2Zmc2V0IDw8IDEpKTsgXAotfQotCi0jZGVmaW5lIE1FTUJFUl9SRUZfUEFSRU5UKG9mZnNldCkgeyAgICAgICAgICAgICAgICAgICAgICAgXAotICB1aW50MzIgZmllbGRTaXplID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKHRhYmxlc1tDT05TVEFOVF9UeXBlRGVmXS0+cm93c051bWJlciA8IDB4MjAwMCAmJiAgICBcCi0gICAgICB0YWJsZXNbQ09OU1RBTlRfVHlwZVJlZl0tPnJvd3NOdW1iZXIgPCAweDIwMDAgJiYgICAgXAotICAgICAgdGFibGVzW0NPTlNUQU5UX01vZHVsZVJlZl0tPnJvd3NOdW1iZXIgPCAweDIwMDAgJiYgIFwKLSAgICAgIHRhYmxlc1tDT05TVEFOVF9NZXRob2REZWZdLT5yb3dzTnVtYmVyIDwgMHgyMDAwICYmICBcCi0gICAgICB0YWJsZXNbQ09OU1RBTlRfVHlwZVNwZWNdLT5yb3dzTnVtYmVyIDwgMHgyMDAwKSB7ICAgXAotICAgIGZpZWxkU2l6ZSA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZmllbGRTaXplID0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgcm93U2l6ZSArPSBmaWVsZFNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGJpdG1hc2sgPSBiaXRtYXNrIHwgKChmaWVsZFNpemUgLSAxKSA8PCAob2Zmc2V0IDw8IDEpKTsgXAotfQotCi0jZGVmaW5lIEhBU19TRU1BTlRJQ1Mob2Zmc2V0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB1aW50MzIgZmllbGRTaXplID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKHRhYmxlc1tDT05TVEFOVF9FdmVudF0tPnJvd3NOdW1iZXIgPCAweDgwMDAgJiYgICAgICBcCi0gICAgICB0YWJsZXNbQ09OU1RBTlRfUHJvcGVydHldLT5yb3dzTnVtYmVyIDwgMHg4MDAwKSB7ICAgXAotICAgIGZpZWxkU2l6ZSA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZmllbGRTaXplID0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgcm93U2l6ZSArPSBmaWVsZFNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGJpdG1hc2sgPSBiaXRtYXNrIHwgKChmaWVsZFNpemUgLSAxKSA8PCAob2Zmc2V0IDw8IDEpKTsgXAotfQotCi0jZGVmaW5lIE1FVEhPRERFRl9PUl9SRUYob2Zmc2V0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICB1aW50MzIgZmllbGRTaXplID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKHRhYmxlc1tDT05TVEFOVF9NZXRob2REZWZdLT5yb3dzTnVtYmVyIDwgMHg4MDAwICYmICBcCi0gICAgICB0YWJsZXNbQ09OU1RBTlRfTWVtYmVyUmVmXS0+cm93c051bWJlciA8IDB4ODAwMCkgeyAgXAotICAgIGZpZWxkU2l6ZSA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZmllbGRTaXplID0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgcm93U2l6ZSArPSBmaWVsZFNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGJpdG1hc2sgPSBiaXRtYXNrIHwgKChmaWVsZFNpemUgLSAxKSA8PCAob2Zmc2V0IDw8IDEpKTsgXAotfQotCi0jZGVmaW5lIE1FTUJFUl9GT1JXQVJERUQob2Zmc2V0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICB1aW50MzIgZmllbGRTaXplID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKHRhYmxlc1tDT05TVEFOVF9GaWVsZF0tPnJvd3NOdW1iZXIgPCAweDgwMDAgJiYgICAgICBcCi0gICAgICB0YWJsZXNbQ09OU1RBTlRfTWV0aG9kRGVmXS0+cm93c051bWJlciA8IDB4ODAwMCkgeyAgXAotICAgIGZpZWxkU2l6ZSA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZmllbGRTaXplID0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgcm93U2l6ZSArPSBmaWVsZFNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGJpdG1hc2sgPSBiaXRtYXNrIHwgKChmaWVsZFNpemUgLSAxKSA8PCAob2Zmc2V0IDw8IDEpKTsgXAotfQotCi0jZGVmaW5lIElNUExFTUVOVEFUSU9OKG9mZnNldCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdWludDMyIGZpZWxkU2l6ZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAodGFibGVzW0NPTlNUQU5UX0ZpbGVdLT5yb3dzTnVtYmVyIDwgMHg0MDAwICYmICAgICAgICAgICBcCi0gICAgICB0YWJsZXNbQ09OU1RBTlRfQXNzZW1ibHlSZWZdLT5yb3dzTnVtYmVyIDwgMHg0MDAwICYmICAgIFwKLSAgICAgIHRhYmxlc1tDT05TVEFOVF9FeHBvcnRlZFR5cGVdLT5yb3dzTnVtYmVyIDwgMHg0MDAwKSB7ICAgXAotICAgIGZpZWxkU2l6ZSA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmaWVsZFNpemUgPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHJvd1NpemUgKz0gZmllbGRTaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYml0bWFzayA9IGJpdG1hc2sgfCAoKGZpZWxkU2l6ZSAtIDEpIDw8IChvZmZzZXQgPDwgMSkpOyAgICAgXAotfQotCi0vLyBTb21lIGVuY29kaW5ncyBhcmUgbm90IHVzZWQgaGVyZQotI2RlZmluZSBDVVNUT01fQVRUUklCVVRFX1RZUEUob2Zmc2V0KSB7ICAgICAgICAgICAgICAgICAgIFwKLSAgdWludDMyIGZpZWxkU2l6ZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmICh0YWJsZXNbQ09OU1RBTlRfTWV0aG9kRGVmXS0+cm93c051bWJlciA8IDB4MjAwMCAmJiAgXAotICAgICAgdGFibGVzW0NPTlNUQU5UX01lbWJlclJlZl0tPnJvd3NOdW1iZXIgPCAweDIwMDApIHsgIFwKLSAgICBmaWVsZFNpemUgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZpZWxkU2l6ZSA9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHJvd1NpemUgKz0gZmllbGRTaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBiaXRtYXNrID0gYml0bWFzayB8ICgoZmllbGRTaXplIC0gMSkgPDwgKG9mZnNldCA8PCAxKSk7IFwKLX0KLQotI2RlZmluZSBSRVNPTFVUSU9OX1NDT1BFKG9mZnNldCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHVpbnQzMiBmaWVsZFNpemUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKHRhYmxlc1tDT05TVEFOVF9Nb2R1bGVdLT5yb3dzTnVtYmVyIDwgMHg0MDAwICYmICAgICAgICAgXAotICAgICAgdGFibGVzW0NPTlNUQU5UX01vZHVsZVJlZl0tPnJvd3NOdW1iZXIgPCAweDQwMDAgJiYgICAgICBcCi0gICAgICB0YWJsZXNbQ09OU1RBTlRfQXNzZW1ibHlSZWZdLT5yb3dzTnVtYmVyIDwgMHg0MDAwICYmICAgIFwKLSAgICAgIHRhYmxlc1tDT05TVEFOVF9UeXBlUmVmXS0+cm93c051bWJlciA8IDB4NDAwMCkgeyAgICAgICAgXAotICAgIGZpZWxkU2l6ZSA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmaWVsZFNpemUgPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHJvd1NpemUgKz0gZmllbGRTaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYml0bWFzayA9IGJpdG1hc2sgfCAoKGZpZWxkU2l6ZSAtIDEpIDw8IChvZmZzZXQgPDwgMSkpOyAgICAgXAotfQotCi0jZGVmaW5lIFRZUEVfT1JfTUVUSE9EREVGKG9mZnNldCkgeyAgICAgICAgICAgICAgICAgICAgICAgXAotICB1aW50MzIgZmllbGRTaXplID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKHRhYmxlc1tDT05TVEFOVF9UeXBlRGVmXS0+cm93c051bWJlciA8IDB4ODAwMCAmJiAgICBcCi0gICAgICB0YWJsZXNbQ09OU1RBTlRfTWV0aG9kRGVmXS0+cm93c051bWJlciA8IDB4ODAwMCkgeyAgXAotICAgIGZpZWxkU2l6ZSA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZmllbGRTaXplID0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgcm93U2l6ZSArPSBmaWVsZFNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGJpdG1hc2sgPSBiaXRtYXNrIHwgKChmaWVsZFNpemUgLSAxKSA8PCAob2Zmc2V0IDw8IDEpKTsgXAotfQotCi0KLSNkZWZpbmUgQ09OU1RBTlRfTU9EVUxFX0dFTkVSQVRJT04gMAotI2RlZmluZSBDT05TVEFOVF9NT0RVTEVfTkFNRSAxCi0jZGVmaW5lIENPTlNUQU5UX01PRFVMRV9NVklEIDIKLSNkZWZpbmUgQ09OU1RBTlRfTU9EVUxFX0VOQ0lEIDMKLSNkZWZpbmUgQ09OU1RBTlRfTU9EVUxFX0VOQ0JBU0VJRCA0Ci0KLQotI2RlZmluZSBDT05TVEFOVF9UWVBFUkVGX1JFU09MVVRJT05fU0NPUEUgMAotI2RlZmluZSBDT05TVEFOVF9UWVBFUkVGX05BTUUgMQotI2RlZmluZSBDT05TVEFOVF9UWVBFUkVGX05BTUVTUEFDRSAyCi0KLSNkZWZpbmUgQ09OU1RBTlRfVFlQRURFRl9GTEFHUyAwCi0jZGVmaW5lIENPTlNUQU5UX1RZUEVERUZfTkFNRSAxCi0jZGVmaW5lIENPTlNUQU5UX1RZUEVERUZfTkFNRVNQQUNFIDIKLSNkZWZpbmUgQ09OU1RBTlRfVFlQRURFRl9FWFRFTkRTIDMKLSNkZWZpbmUgQ09OU1RBTlRfVFlQRURFRl9GSUVMRExJU1QgNAotI2RlZmluZSBDT05TVEFOVF9UWVBFREVGX01FVEhPRExJU1QgNQotCi0jZGVmaW5lIENPTlNUQU5UX01FVEhPRERFRl9SVkEgMAotI2RlZmluZSBDT05TVEFOVF9NRVRIT0RERUZfSU1QTEZMQUdTIDEKLSNkZWZpbmUgQ09OU1RBTlRfTUVUSE9EREVGX0ZMQUdTIDIKLSNkZWZpbmUgQ09OU1RBTlRfTUVUSE9EREVGX05BTUUgMwotI2RlZmluZSBDT05TVEFOVF9NRVRIT0RERUZfU0lHTkFUVVJFIDQKLSNkZWZpbmUgQ09OU1RBTlRfTUVUSE9EREVGX1BBUkFNTElTVCA1Ci0KLSNkZWZpbmUgQ09OU1RBTlRfUEFSQU1fRkxBR1MgMAotI2RlZmluZSBDT05TVEFOVF9QQVJBTV9TRVFVRU5DRSAxCi0jZGVmaW5lIENPTlNUQU5UX1BBUkFNX05BTUUgMgotCi0jZGVmaW5lIENPTlNUQU5UX01FTUJFUlJFRl9DTEFTUyAwCi0jZGVmaW5lIENPTlNUQU5UX01FTUJFUlJFRl9OQU1FIDEKLSNkZWZpbmUgQ09OU1RBTlRfTUVNQkVSUkVGX1NJR05BVFVSRSAyCi0KLSNkZWZpbmUgQ09OU1RBTlRfQ1VTVE9NX0FUVFJJQlVURV9QQVJFTlQgMAotI2RlZmluZSBDT05TVEFOVF9DVVNUT01fQVRUUklCVVRFX1RZUEUgMQotI2RlZmluZSBDT05TVEFOVF9DVVNUT01fQVRUUklCVVRFX1ZBTFVFIDIKLSAgCi0jZGVmaW5lIENPTlNUQU5UX1NUQU5EQUxPTkVfU0lHX1NJR05BVFVSRSAwCi0KLSNkZWZpbmUgQ09OU1RBTlRfVFlQRVNQRUNfU0lHTkFUVVJFIDAKLQotI2RlZmluZSBDT05TVEFOVF9BU1NFTUJMWV9IQVNIX0FMR19JRCAwCi0jZGVmaW5lIENPTlNUQU5UX0FTU0VNQkxZX01BSk9SIDEKLSNkZWZpbmUgQ09OU1RBTlRfQVNTRU1CTFlfTUlOT1IgMgotI2RlZmluZSBDT05TVEFOVF9BU1NFTUJMWV9CVUlMRCAzCi0jZGVmaW5lIENPTlNUQU5UX0FTU0VNQkxZX1JFVklTSU9OIDQKLSNkZWZpbmUgQ09OU1RBTlRfQVNTRU1CTFlfRkxBR1MgNQotI2RlZmluZSBDT05TVEFOVF9BU1NFTUJMWV9QVUJMSUNfS0VZIDYKLSNkZWZpbmUgQ09OU1RBTlRfQVNTRU1CTFlfTkFNRSA3Ci0jZGVmaW5lIENPTlNUQU5UX0FTU0VNQkxZX0NVTFRVUkUgOAotCi0jZGVmaW5lIENPTlNUQU5UX0FTU0VNQkxZX1JFRl9NQUpPUiAwCi0jZGVmaW5lIENPTlNUQU5UX0FTU0VNQkxZX1JFRl9NSU5PUiAxCi0jZGVmaW5lIENPTlNUQU5UX0FTU0VNQkxZX1JFRl9CVUlMRCAyCi0jZGVmaW5lIENPTlNUQU5UX0FTU0VNQkxZX1JFRl9SRVZJU0lPTiAzCi0jZGVmaW5lIENPTlNUQU5UX0FTU0VNQkxZX1JFRl9GTEFHUyA0Ci0jZGVmaW5lIENPTlNUQU5UX0FTU0VNQkxZX1JFRl9QVUJMSUNfS0VZIDUKLSNkZWZpbmUgQ09OU1RBTlRfQVNTRU1CTFlfUkVGX05BTUUgNgotI2RlZmluZSBDT05TVEFOVF9BU1NFTUJMWV9SRUZfQ1VMVFVSRSA3Ci0jZGVmaW5lIENPTlNUQU5UX0FTU0VNQkxZX1JFRl9IQVNIX1ZBTFVFIDgKLQotI2RlZmluZSBDT05TVEFOVF9GSUVMRF9GTEFHUyAwCi0jZGVmaW5lIENPTlNUQU5UX0ZJRUxEX05BTUUgMQotI2RlZmluZSBDT05TVEFOVF9GSUVMRF9TSUdOQVRVUkUgMgotCi0jZGVmaW5lIENPTlNUQU5UX0lOVEVSRkFDRV9JTVBMX0NMQVNTIDAKLSNkZWZpbmUgQ09OU1RBTlRfSU5URVJGQUNFX0lNUExfSU5URVJGQUNFIDEKLQotI2RlZmluZSBDT05TVEFOVF9ORVNURURfQ0xBU1NfTkVTVEVEX0NMQVNTIDAKLSNkZWZpbmUgQ09OU1RBTlRfTkVTVEVEX0NMQVNTX0VOQ0xPU0lOR19DTEFTUyAxCi0KLSNkZWZpbmUgQ09OU1RBTlRfTUVUSE9EX1NQRUNfTUVUSE9EIDAKLSNkZWZpbmUgQ09OU1RBTlRfTUVUSE9EX1NQRUNfSU5TVEFOVElBVElPTiAxCi0KLSNkZWZpbmUgQ09OU1RBTlRfR0VORVJJQ19QQVJBTV9DT05TVFJBSU5UX09XTkVSIDAKLSNkZWZpbmUgQ09OU1RBTlRfR0VORVJJQ19QQVJBTV9DT05TVFJBSU5UX0NPTlNUUkFJTlQgMQotCi0jZGVmaW5lIENPTlNUQU5UX0NPTlNUQU5UX1RZUEUgMAotI2RlZmluZSBDT05TVEFOVF9DT05TVEFOVF9QQVJFTlQgMQotI2RlZmluZSBDT05TVEFOVF9DT05TVEFOVF9WQUxVRSAyCi0KLSNkZWZpbmUgQ09OU1RBTlRfRklFTERfTUFSU0hBTF9QQVJFTlQgMAotI2RlZmluZSBDT05TVEFOVF9GSUVMRF9NQVJTSEFMX05BVElWRV9UWVBFIDEKLQotI2RlZmluZSBDT05TVEFOVF9ERUNMX1NFQ1VSSVRZX0FDVElPTiAwCi0jZGVmaW5lIENPTlNUQU5UX0RFQ0xfU0VDVVJJVFlfUEFSRU5UIDEKLSNkZWZpbmUgQ09OU1RBTlRfREVDTF9TRUNVUklUWV9QRVJNSVNTSU9OX1NFVCAyCi0KLSNkZWZpbmUgQ09OU1RBTlRfQ0xBU1NfTEFZT1VUX1BBQ0tJTkdfU0laRSAwCi0jZGVmaW5lIENPTlNUQU5UX0NMQVNTX0xBWU9VVF9DTEFTU19TSVpFIDEKLSNkZWZpbmUgQ09OU1RBTlRfQ0xBU1NfTEFZT1VUX1BBUkVOVCAyCi0KLSNkZWZpbmUgQ09OU1RBTlRfRklFTERfTEFZT1VUX09GRlNFVCAwCi0jZGVmaW5lIENPTlNUQU5UX0ZJRUxEX0xBWU9VVF9GSUVMRCAxCi0KLSNkZWZpbmUgQ09OU1RBTlRfRVZFTlRfTUFQX1BBUkVOVCAwCi0jZGVmaW5lIENPTlNUQU5UX0VWRU5fTUFQX0VWRU5UX0xJU1QgMQotCi0jZGVmaW5lIENPTlNUQU5UX0VWRU5UX0VWRU5UX0ZMQUdTIDAKLSNkZWZpbmUgQ09OU1RBTlRfRVZFTlRfTkFNRSAxCi0jZGVmaW5lIENPTlNUQU5UX0VWRU5UX1RZUEUgMgotCi0jZGVmaW5lIENPTlNUQU5UX1BST1BFUlRZX01BUF9QQVJFTlQgMAotI2RlZmluZSBDT05TVEFOVF9QUk9QRVJUWV9NQVBfUFJPUEVSVFlfTElTVCAxCi0KLSNkZWZpbmUgQ09OU1RBTlRfUFJPUEVSVFlfRkxBR1MgMAotI2RlZmluZSBDT05TVEFOVF9QUk9QRVJUWV9OQU1FIDEKLSNkZWZpbmUgQ09OU1RBTlRfUFJPUEVSVFlfVFlQRSAyCi0KLSNkZWZpbmUgQ09OU1RBTlRfTUVUSE9EX1NFTUFOVElDU19TRU1BTlRJQ1MgMAotI2RlZmluZSBDT05TVEFOVF9NRVRIT0RfU0VNQU5USUNTX01FVEhPRCAxCi0jZGVmaW5lIENPTlNUQU5UX01FVEhPRF9TRU1BTlRJQ1NfQVNTT0NJQVRJT04gMgotCi0jZGVmaW5lIENPTlNUQU5UX01FVEhPRF9JTVBMX0NMQVNTIDAKLSNkZWZpbmUgQ09OU1RBTlRfTUVUSE9EX0lNUExfTUVUSE9EX0JPRFkgMQotI2RlZmluZSBDT05TVEFOVF9NRVRIT0RfSU1QTF9NRVRIT0RfREVDTEFSQVRJT04gMgotCi0jZGVmaW5lIENPTlNUQU5UX01PRFVMRV9SRUZfTkFNRSAwCi0KLSNkZWZpbmUgQ09OU1RBTlRfSU1QTF9NQVBfTUFQUElOR19GTEFHUyAwCi0jZGVmaW5lIENPTlNUQU5UX0lNUExfTUFQX01FTUJFUl9GT1JXQVJERUQgMQotI2RlZmluZSBDT05TVEFOVF9JTVBMX01BUF9JTVBPUlRfTkFNRSAyCi0jZGVmaW5lIENPTlNUQU5UX0lNUExfTUFQX0lNUE9SVF9TQ09QRSAzCi0KLSNkZWZpbmUgQ09OU1RBTlRfRklFTERfUlZBX1JWQSAwCi0jZGVmaW5lIENPTlNUQU5UX0ZJRUxEX1JWQV9GSUVMRCAxCi0KLSNkZWZpbmUgQ09OU1RBTlRfTUFOSUZFU1RfUkVTT1VSQ0VfT0ZGU0VUIDAKLSNkZWZpbmUgQ09OU1RBTlRfTUFOSUZFU1RfUkVTT1VSQ0VfRkxBR1MgMQotI2RlZmluZSBDT05TVEFOVF9NQU5JRkVTVF9SRVNPVVJDRV9OQU1FIDIKLSNkZWZpbmUgQ09OU1RBTlRfTUFOSUZFU1RfUkVTT1VSQ0VfSU1QTEVNRU5UQVRJT04gMwotCi0jZGVmaW5lIENPTlNUQU5UX0FTU0VNQkxZX1BST0NFU1NPUl9QUk9DRVNTT1IgMAotCi0jZGVmaW5lIENPTlNUQU5UX0FTU0VNQkxZX09TX1BMQVRGT1JNX0lEIDAKLSNkZWZpbmUgQ09OU1RBTlRfQVNTRU1CTFlfT1NfTUFKT1JfVkVSU0lPTiAxCi0jZGVmaW5lIENPTlNUQU5UX0FTU0VNQkxZX09TX01JTk9SX1ZFUlNJT04gMgotCi0jZGVmaW5lIENPTlNUQU5UX0ZJTEVfRkxBR1MgMAotI2RlZmluZSBDT05TVEFOVF9GSUxFX05BTUUgMQotI2RlZmluZSBDT05TVEFOVF9GSUxFX0hBU0hfVkFMVUUgMgotCi0jZGVmaW5lIENPTlNUQU5UX0dFTkVSSUNfUEFSQU1fTlVNQkVSIDAKLSNkZWZpbmUgQ09OU1RBTlRfR0VORVJJQ19QQVJBTV9GTEFHUyAxCi0jZGVmaW5lIENPTlNUQU5UX0dFTkVSSUNfUEFSQU1fT1dORVIgMgotI2RlZmluZSBDT05TVEFOVF9HRU5FUklDX1BBUkFNX05BTUUgMwotCi19IC8vIGVuZCBuYW1lc3BhY2UgbjMKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvQ0xJQWNjZXNzLmggYi92bWtpdC9saWIvTjMvVk1Db3JlL0NMSUFjY2Vzcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWM2ZmRiLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvQ0xJQWNjZXNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLS0gQ0xJQWNjZXNzLmggLSBDTEkgYWNjZXNzIGRlc2NyaXB0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjMKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIE4zX0NMSV9BQ0NFU1NfSAotI2RlZmluZSBOM19DTElfQUNDRVNTX0gKLQotbmFtZXNwYWNlIG4zIHsKLQotI2RlZmluZSBBQ0NfU1RBVElDICAgICAgICAweDAwMTAKLSNkZWZpbmUgQUNDX1ZJUlRVQUwgICAgICAgMHgwMDQwCi0jZGVmaW5lIEFDQ19JTlRFUkZBQ0UgICAgIDB4MDAyMAotI2RlZmluZSBBQ0NfSU5URVJOQUwgICAgICAweDEwMDAKLSNkZWZpbmUgQUNDX1NZTkNIUk8gICAgICAgMHgwMDIwCi0KLSNkZWZpbmUgRVhQTElDSVRfTEFZT1VUIDB4MDAwMDAwMTAKLQotI2RlZmluZSBNS19WRVJJRklFUihuYW1lLCBmbGFnKSAgICAgICAgICAgICAgICAgICBcCi0gIGlubGluZSBib29sIG5hbWUodW5zaWduZWQgaW50IHBhcmFtKSB7ICAgICAgICAgIFwKLSAgICByZXR1cm4gKGZsYWcgJiBwYXJhbSkgIT0gMDsgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0KLU1LX1ZFUklGSUVSKGlzU3RhdGljLCAgICAgQUNDX1NUQVRJQykKLU1LX1ZFUklGSUVSKGlzVmlydHVhbCwgICAgQUNDX1ZJUlRVQUwpCi1NS19WRVJJRklFUihpc0ludGVyZmFjZSwgIEFDQ19JTlRFUkZBQ0UpCi1NS19WRVJJRklFUihpc0ludGVybmFsLCAgIEFDQ19JTlRFUk5BTCkKLU1LX1ZFUklGSUVSKGlzU3luY2hybywgICAgQUNDX1NZTkNIUk8pCi0KLU1LX1ZFUklGSUVSKGhhc0V4cGxpY2l0TGF5b3V0LCAgICBFWFBMSUNJVF9MQVlPVVQpCi0gIAotCi0jdW5kZWYgTUtfVkVSSUZJRVIKLQotfSAvLyBlbmQgbmFtZXNwYWNlIG4zCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL04zL1ZNQ29yZS9DTElKaXQuY3BwIGIvdm1raXQvbGliL04zL1ZNQ29yZS9DTElKaXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjRjMGNhLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvQ0xJSml0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3OTUgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0gQ0xJSml0LmNwcCAtIENMSSBqdXN0IGluIHRpbWUgY29tcGlsZXIgLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4zCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IE9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgIm12bS9KSVQuaCIKLQotI2luY2x1ZGUgIkFzc2VtYmx5LmgiCi0jaW5jbHVkZSAiQ0xJQWNjZXNzLmgiCi0jaW5jbHVkZSAiQ0xJSml0LmgiCi0jaW5jbHVkZSAiTVNDb3JsaWIuaCIKLSNpbmNsdWRlICJOYXRpdmVVdGlsLmgiCi0jaW5jbHVkZSAiTjMuaCIKLSNpbmNsdWRlICJOM01vZHVsZVByb3ZpZGVyLmgiCi0jaW5jbHVkZSAiUmVhZGVyLmgiCi0jaW5jbHVkZSAiVk1BcnJheS5oIgotI2luY2x1ZGUgIlZNQ2FjaGUuaCIKLSNpbmNsdWRlICJWTUNsYXNzLmgiCi0jaW5jbHVkZSAiVk1UaHJlYWQuaCIKLSNpbmNsdWRlICJOM01ldGFUeXBlLmgiCi0KLSNpbmNsdWRlIDxsbHZtL0NhbGxpbmdDb252Lmg+Ci0jaW5jbHVkZSA8bGx2bS9Db25zdGFudHMuaD4KLSNpbmNsdWRlIDxsbHZtL0Rlcml2ZWRUeXBlcy5oPgotI2luY2x1ZGUgPGxsdm0vRnVuY3Rpb24uaD4KLSNpbmNsdWRlIDxsbHZtL0luc3RydWN0aW9ucy5oPgotI2luY2x1ZGUgPGxsdm0vTGlua0FsbFBhc3Nlcy5oPgotI2luY2x1ZGUgPGxsdm0vTExWTUNvbnRleHQuaD4KLSNpbmNsdWRlIDxsbHZtL01vZHVsZS5oPgotI2luY2x1ZGUgPGxsdm0vVHlwZS5oPgotI2luY2x1ZGUgPGxsdm0vQW5hbHlzaXMvTG9vcFBhc3MuaD4KLSNpbmNsdWRlIDxsbHZtL1N1cHBvcnQvQ0ZHLmg+Ci0jaW5jbHVkZSA8bGx2bS9TdXBwb3J0L011dGV4R3VhcmQuaD4KLQotI2luY2x1ZGUgIk4zRGVidWcuaCIKLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBsbHZtOwotdXNpbmcgbmFtZXNwYWNlIG4zOwotCi12b2lkIEV4Y2VwdGlvbkJsb2NrRGVzYzo6cHJpbnQobXZtOjpQcmludEJ1ZmZlciogYnVmKSBjb25zdCB7Ci0gIGJ1Zi0+d3JpdGUoIkV4Y2VwdGlvbjw+Iik7Ci19Ci0KLSNpZmRlZiBXSVRIX1RSQUNFUgotLy8gZm9yIHN0cnVjdHMKLXN0YXRpYyB2b2lkIHRyYWNlU3RydWN0KFZNQ29tbW9uQ2xhc3MqIGNsLCBCYXNpY0Jsb2NrKiBibG9jaywgVmFsdWUqIGFyZykgewotI2lmZGVmIE1VTFRJUExFX0dDCi0gIFZhbHVlKiBHQyA9ICsrKGJsb2NrLT5nZXRQYXJlbnQoKS0+YXJnX2JlZ2luKCkpOwotI2VuZGlmCi0KLSAgZm9yIChzdGQ6OnZlY3RvcjxWTUZpZWxkKj46Oml0ZXJhdG9yIGkgPSBjbC0+dmlydHVhbEZpZWxkcy5iZWdpbigpLCAKLSAgICAgICAgICAgIGUgPSBjbC0+dmlydHVhbEZpZWxkcy5lbmQoKTsgaSE9IGU7ICsraSkgewotCi0gICAgVk1GaWVsZCogZmllbGQgPSAqaTsKLSAgICBpZiAoZmllbGQtPnNpZ25hdHVyZS0+c3VwZXIgPT0gTVNDb3JsaWI6OnBWYWx1ZSkgewotICAgICAgaWYgKCFmaWVsZC0+c2lnbmF0dXJlLT5pc1ByaW1pdGl2ZSkgewotICAgICAgICBWYWx1ZSogcHRyID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShhcmcsIGZpZWxkLT5vZmZzZXQsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrKTsKLSAgICAgICAgdHJhY2VTdHJ1Y3QoZmllbGQtPnNpZ25hdHVyZSwgYmxvY2ssIHB0cik7Ci0gICAgICB9IGVsc2UgaWYgKGZpZWxkLT5zaWduYXR1cmUgPT0gTVNDb3JsaWI6OnBJbnRQdHIgfHwgCi0gICAgICAgICAgICAgICAgIGZpZWxkLT5zaWduYXR1cmUgPT0gTVNDb3JsaWI6OnBVSW50UHRyKSAgewotICAgICAgICBWYWx1ZSogdmFsQ2FzdCA9IG5ldyBCaXRDYXN0SW5zdChhcmcsIFZNT2JqZWN0OjpsbHZtVHlwZSwgIiIsIGJsb2NrKTsKLSNpZmRlZiBNVUxUSVBMRV9HQwotICAgICAgICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IEFyZ3M7Ci0gICAgICAgIEFyZ3MucHVzaF9iYWNrKHZhbENhc3QpOwotICAgICAgICBBcmdzLnB1c2hfYmFjayhHQyk7Ci0gICAgICAgIENhbGxJbnN0OjpDcmVhdGUoQ0xJSml0OjptYXJrQW5kVHJhY2VMTFZNLCBBcmdzLmJlZ2luKCksIEFyZ3MuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiIsIGJsb2NrKTsKLSNlbHNlCi0gICAgICAgIENhbGxJbnN0OjpDcmVhdGUoQ0xJSml0OjptYXJrQW5kVHJhY2VMTFZNLCB2YWxDYXN0LCAiIiwgYmxvY2spOwotI2VuZGlmCi0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChmaWVsZC0+c2lnbmF0dXJlLT5zdXBlciAhPSBNU0NvcmxpYjo6cEVudW0pIHsKLSAgICAgIFZhbHVlKiB2YWxDYXN0ID0gbmV3IEJpdENhc3RJbnN0KGFyZywgVk1PYmplY3Q6Omxsdm1UeXBlLCAiIiwgYmxvY2spOwotI2lmZGVmIE1VTFRJUExFX0dDCi0gICAgICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IEFyZ3M7Ci0gICAgICBBcmdzLnB1c2hfYmFjayh2YWxDYXN0KTsKLSAgICAgIEFyZ3MucHVzaF9iYWNrKEdDKTsKLSAgICAgIENhbGxJbnN0OjpDcmVhdGUoQ0xJSml0OjptYXJrQW5kVHJhY2VMTFZNLCBBcmdzLmJlZ2luKCksIEFyZ3MuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICIiLCBibG9jayk7Ci0jZWxzZQotICAgICAgQ2FsbEluc3Q6OkNyZWF0ZShDTElKaXQ6Om1hcmtBbmRUcmFjZUxMVk0sIHZhbENhc3QsICIiLCBibG9jayk7Ci0jZW5kaWYKLSAgICB9Ci0gIH0KLX0KLQotCi0vLyBBbHdheXMgY2xhc3Nlcwotc3RhdGljIHZvaWQgdHJhY2VDbGFzcyhWTUNvbW1vbkNsYXNzKiBjbCwgQmFzaWNCbG9jayogYmxvY2ssIFZhbHVlKiBhcmcsIAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxWTUZpZWxkKj4mIGZpZWxkcywgYm9vbCBib3hlZCA9IGZhbHNlKSB7Ci0jaWZkZWYgTVVMVElQTEVfR0MKLSAgVmFsdWUqIEdDID0gKysoYmxvY2stPmdldFBhcmVudCgpLT5hcmdfYmVnaW4oKSk7Ci0jZW5kaWYKLSAKLSAgQ29uc3RhbnQqIHplcm8gPSBjbC0+dm0tPm1vZHVsZS0+Y29uc3RhbnRaZXJvOwotICBmb3IgKHN0ZDo6dmVjdG9yPFZNRmllbGQqPjo6aXRlcmF0b3IgaSA9IGZpZWxkcy5iZWdpbigpLCAKLSAgICAgICAgICAgIGUgPSBmaWVsZHMuZW5kKCk7IGkhPSBlOyArK2kpIHsKLSAgICBWTUZpZWxkKiBmaWVsZCA9ICppOwotICAgIGlmIChmaWVsZC0+c2lnbmF0dXJlLT5zdXBlciA9PSBNU0NvcmxpYjo6cFZhbHVlKSB7Ci0gICAgICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IGFyZ3M7IC8vc2l6ZSA9IDIKLSAgICAgIGFyZ3MucHVzaF9iYWNrKHplcm8pOwotICAgICAgaWYgKGJveGVkKSB7Ci0gICAgICAgIENvbnN0YW50SW50KiBDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihmaWVsZC0+b2Zmc2V0KTsKLSAgICAgICAgYXJncy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KGdldEdsb2JhbENvbnRleHQoKSksIENJLT5nZXRWYWx1ZSgpICsgMSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYXJncy5wdXNoX2JhY2soZmllbGQtPm9mZnNldCk7Ci0gICAgICB9Ci0gICAgICBWYWx1ZSogcHRyID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShhcmcsIGFyZ3MuYmVnaW4oKSwgYXJncy5lbmQoKSwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrKTsKLSAgICAgIHRyYWNlU3RydWN0KGZpZWxkLT5zaWduYXR1cmUsIGJsb2NrLCBwdHIpOwotICAgIH0gZWxzZSBpZiAoZmllbGQtPnNpZ25hdHVyZS0+c3VwZXIgIT0gTVNDb3JsaWI6OnBFbnVtKSB7Ci0gICAgICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IGFyZ3M7IC8vc2l6ZSA9IDIKLSAgICAgIGFyZ3MucHVzaF9iYWNrKHplcm8pOwotICAgICAgaWYgKGJveGVkKSB7Ci0gICAgICAgIENvbnN0YW50SW50KiBDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihmaWVsZC0+b2Zmc2V0KTsKLSAgICAgICAgYXJncy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KGdldEdsb2JhbENvbnRleHQoKSksIENJLT5nZXRWYWx1ZSgpICsgMSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYXJncy5wdXNoX2JhY2soZmllbGQtPm9mZnNldCk7Ci0gICAgICB9Ci0gICAgICBWYWx1ZSogcHRyID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShhcmcsIGFyZ3MuYmVnaW4oKSwgYXJncy5lbmQoKSwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrKTsKLSAgICAgIFZhbHVlKiB2YWwgPSBuZXcgTG9hZEluc3QocHRyLCAiIiwgYmxvY2spOwotICAgICAgVmFsdWUqIHZhbENhc3QgPSBuZXcgQml0Q2FzdEluc3QodmFsLCBWTU9iamVjdDo6bGx2bVR5cGUsICIiLCBibG9jayk7Ci0jaWZkZWYgTVVMVElQTEVfR0MKLSAgICAgICAgc3RkOjp2ZWN0b3I8VmFsdWUqPiBBcmdzOwotICAgICAgICBBcmdzLnB1c2hfYmFjayh2YWxDYXN0KTsKLSAgICAgICAgQXJncy5wdXNoX2JhY2soR0MpOwotICAgICAgICBDYWxsSW5zdDo6Q3JlYXRlKENMSUppdDo6bWFya0FuZFRyYWNlTExWTSwgQXJncy5iZWdpbigpLCBBcmdzLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICIiLCBibG9jayk7Ci0jZWxzZQotICAgICAgQ2FsbEluc3Q6OkNyZWF0ZShDTElKaXQ6Om1hcmtBbmRUcmFjZUxMVk0sIHZhbENhc3QsICIiLCBibG9jayk7Ci0jZW5kaWYKLSAgICB9Ci0gIH0KLX0KLSNlbmRpZgotCi0KLU4zVmlydHVhbFRhYmxlKiBDTElKaXQ6Om1ha2VBcnJheVZUKFZNQ2xhc3NBcnJheSogY2wpIHsKLQlWTUNsYXNzICpzdXBlciA9IChWTUNsYXNzKiljbC0+c3VwZXI7Ci0gIE4zVmlydHVhbFRhYmxlICogcmVzID0gCi0JCW5ldyhjbC0+YXNzZW1ibHktPmFsbG9jYXRvciwgc3VwZXItPnZ0U2l6ZSkgTjNWaXJ0dWFsVGFibGUoVk1PYmplY3Q6OmdldE4zVmlydHVhbFRhYmxlKHN1cGVyLT52aXJ0dWFsSW5zdGFuY2UpLCBzdXBlci0+dnRTaXplKTsKLQotI2lmZGVmIFdJVEhfVFJBQ0VSICAKLSAgRnVuY3Rpb24qIGZ1bmMgPSBGdW5jdGlvbjo6Q3JlYXRlKG1hcmtBbmRUcmFjZUxMVk1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxMaW5rYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFya0FuZFRyYWNlT2JqZWN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2wtPnZtLT5nZXRMTFZNTW9kdWxlKCkpOwotICBBcmd1bWVudCogYXJnID0gZnVuYy0+YXJnX2JlZ2luKCk7Ci0jaWZkZWYgTVVMVElQTEVfR0MgCi0gIEFyZ3VtZW50KiBHQyA9ICsrKGZ1bmMtPmFyZ19iZWdpbigpKTsKLSNlbmRpZgotICAgIC8vIENvbnN0YW50IERlZmluaXRpb25zCi0gIENvbnN0YW50KiBjb25zdF9pbnQzMl84ID0gY2wtPnZtLT5tb2R1bGUtPmNvbnN0YW50WmVybzsKLSAgQ29uc3RhbnQqIGNvbnN0X2ludDMyXzkgPSBjbC0+dm0tPm1vZHVsZS0+Y29uc3RhbnRPbmU7Ci0gIENvbnN0YW50KiBjb25zdF9pbnQzMl8xMCA9IGNsLT52bS0+bW9kdWxlLT5jb25zdGFudFR3bzsKLSAgCi0gIAotICAvLyBGdW5jdGlvbiBEZWZpbml0aW9ucwotICAKLSAgewotICAgIEJhc2ljQmxvY2sqIGxhYmVsX2VudHJ5ID0gQmFzaWNCbG9jazo6Q3JlYXRlKGdldEdsb2JhbENvbnRleHQoKSwgImVudHJ5IixmdW5jLDApOwotICAgIEJhc2ljQmxvY2sqIGxhYmVsX2JiID0gQmFzaWNCbG9jazo6Q3JlYXRlKGdldEdsb2JhbENvbnRleHQoKSwgImJiIixmdW5jLDApOwotICAgIEJhc2ljQmxvY2sqIGxhYmVsX3JldHVybiA9IEJhc2ljQmxvY2s6OkNyZWF0ZShnZXRHbG9iYWxDb250ZXh0KCksICJyZXR1cm4iLGZ1bmMsMCk7Ci0gICAgCi0gICAgVmFsdWUqIHB0cl92ID0gbmV3IEJpdENhc3RJbnN0KGFyZywgY2wtPm5hdHVyYWxUeXBlLCAiIiwgbGFiZWxfZW50cnkpOwotICAgIAotICAgIC8vIEJsb2NrIGVudHJ5IChsYWJlbF9lbnRyeSkKLSAgICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IHB0cl90bXA5MThfaW5kaWNlczsKLSAgICBwdHJfdG1wOTE4X2luZGljZXMucHVzaF9iYWNrKGNvbnN0X2ludDMyXzgpOwotICAgIHB0cl90bXA5MThfaW5kaWNlcy5wdXNoX2JhY2soY29uc3RfaW50MzJfOSk7Ci0gICAgSW5zdHJ1Y3Rpb24qIHB0cl90bXA5MTggPSAKLSAgICAgIEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUocHRyX3YsIHB0cl90bXA5MThfaW5kaWNlcy5iZWdpbigpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX3RtcDkxOF9pbmRpY2VzLmVuZCgpLCAidG1wOTE4IiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsX2VudHJ5KTsKLSAgICBMb2FkSW5zdCogaW50MzJfdG1wMTAxOSA9IG5ldyBMb2FkSW5zdChwdHJfdG1wOTE4LCAidG1wMTAxOSIsIGZhbHNlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbF9lbnRyeSk7Ci0KLSAgICBJQ21wSW5zdCogaW50MV90bXAxMjIxID0gbmV3IElDbXBJbnN0KCpsYWJlbF9lbnRyeSwgSUNtcEluc3Q6OklDTVBfU0dULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdG1wMTAxOSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pbnQzMl84LCAidG1wMTIyMSIpOwotCi0gICAgQnJhbmNoSW5zdDo6Q3JlYXRlKGxhYmVsX2JiLCBsYWJlbF9yZXR1cm4sIGludDFfdG1wMTIyMSwgbGFiZWxfZW50cnkpOwotICAgIAotICAgIC8vIEJsb2NrIGJiIChsYWJlbF9iYikKLSAgICBBcmd1bWVudCogZndkcmVmXzEyID0gbmV3IEFyZ3VtZW50KEludGVnZXJUeXBlOjpnZXQoZ2V0R2xvYmFsQ29udGV4dCgpLCAzMikpOwotICAgIFBISU5vZGUqIGludDMyX2lfMDE1XzAgPSBQSElOb2RlOjpDcmVhdGUoVHlwZTo6Z2V0SW50MzJUeShnZXRHbG9iYWxDb250ZXh0KCkpLCAiaS4wMTUuMCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxfYmIpOwotICAgIGludDMyX2lfMDE1XzAtPnJlc2VydmVPcGVyYW5kU3BhY2UoMik7Ci0gICAgaW50MzJfaV8wMTVfMC0+YWRkSW5jb21pbmcoZndkcmVmXzEyLCBsYWJlbF9iYik7Ci0gICAgaW50MzJfaV8wMTVfMC0+YWRkSW5jb21pbmcoY29uc3RfaW50MzJfOCwgbGFiZWxfZW50cnkpOwotICAgIAotICAgIHN0ZDo6dmVjdG9yPFZhbHVlKj4gcHRyX3RtcDNfaW5kaWNlczsKLSAgICBwdHJfdG1wM19pbmRpY2VzLnB1c2hfYmFjayhjb25zdF9pbnQzMl84KTsKLSAgICBwdHJfdG1wM19pbmRpY2VzLnB1c2hfYmFjayhjb25zdF9pbnQzMl8xMCk7Ci0gICAgcHRyX3RtcDNfaW5kaWNlcy5wdXNoX2JhY2soaW50MzJfaV8wMTVfMCk7Ci0gICAgSW5zdHJ1Y3Rpb24qIHB0cl90bXAzID0gCi0gICAgICBHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlKHB0cl92LCBwdHJfdG1wM19pbmRpY2VzLmJlZ2luKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfdG1wM19pbmRpY2VzLmVuZCgpLCAidG1wMyIsIGxhYmVsX2JiKTsKLQotICAgIGlmIChjbC0+YmFzZUNsYXNzLT5zdXBlciA9PSBNU0NvcmxpYjo6cFZhbHVlKSB7Ci0gICAgICB0cmFjZVN0cnVjdChjbC0+YmFzZUNsYXNzLCBsYWJlbF9iYiwgcHRyX3RtcDMpOwotICAgIH0gZWxzZSBpZiAoY2wtPmJhc2VDbGFzcy0+c3VwZXIgIT0gTVNDb3JsaWI6OnBFbnVtKSB7Ci0gICAgICBMb2FkSW5zdCogcHRyX3RtcDQgPSBuZXcgTG9hZEluc3QocHRyX3RtcDMsICJ0bXA0IiwgZmFsc2UsIGxhYmVsX2JiKTsKLSAgICAgIFZhbHVlKiBhcmcgPSBuZXcgQml0Q2FzdEluc3QocHRyX3RtcDQsIFZNT2JqZWN0OjpsbHZtVHlwZSwgIiIsIGxhYmVsX2JiKTsKLSNpZmRlZiBNVUxUSVBMRV9HQwotICAgICAgc3RkOjp2ZWN0b3I8VmFsdWUqPiBBcmdzOwotICAgICAgQXJncy5wdXNoX2JhY2soYXJnKTsKLSAgICAgIEFyZ3MucHVzaF9iYWNrKEdDKTsKLSAgICAgIENhbGxJbnN0OjpDcmVhdGUobWFya0FuZFRyYWNlTExWTSwgQXJncy5iZWdpbigpLCBBcmdzLmVuZCgpLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxfYmIpOwotI2Vsc2UKLSAgICAgIENhbGxJbnN0OjpDcmVhdGUobWFya0FuZFRyYWNlTExWTSwgYXJnLCAiIiwgbGFiZWxfYmIpOwotI2VuZGlmCi0gICAgfQotICAgIEJpbmFyeU9wZXJhdG9yKiBpbnQzMl90bXA2ID0gCi0gICAgICBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlKEluc3RydWN0aW9uOjpBZGQsIGludDMyX2lfMDE1XzAsIGNvbnN0X2ludDMyXzksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0bXA2IiwgbGFiZWxfYmIpOwotICAgIExvYWRJbnN0KiBpbnQzMl90bXAxMCA9IG5ldyBMb2FkSW5zdChwdHJfdG1wOTE4LCAidG1wMTAiLCBmYWxzZSwgbGFiZWxfYmIpOwotICAgIElDbXBJbnN0KiBpbnQxX3RtcDEyID0gbmV3IElDbXBJbnN0KCpsYWJlbF9iYiwgSUNtcEluc3Q6OklDTVBfU0dULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3RtcDEwLCBpbnQzMl90bXA2LCAidG1wMTIiKTsKLSAgICBCcmFuY2hJbnN0OjpDcmVhdGUobGFiZWxfYmIsIGxhYmVsX3JldHVybiwgaW50MV90bXAxMiwgbGFiZWxfYmIpOwotICAgIAotICAgIC8vIEJsb2NrIHJldHVybiAobGFiZWxfcmV0dXJuKQotICAgIFJldHVybkluc3Q6OkNyZWF0ZShnZXRHbG9iYWxDb250ZXh0KCksIGxhYmVsX3JldHVybik7Ci0gICAgCi0gICAgLy8gUmVzb2x2ZSBGb3J3YXJkIFJlZmVyZW5jZXMKLSAgICBmd2RyZWZfMTItPnJlcGxhY2VBbGxVc2VzV2l0aChpbnQzMl90bXA2KTsgZGVsZXRlIGZ3ZHJlZl8xMjsKLSAgICAKLSAgfQotICAKLSAgdm9pZCogdHJhY2VyID0gbXZtOjpNdm1Nb2R1bGU6OmV4ZWN1dGlvbkVuZ2luZS0+Z2V0UG9pbnRlclRvR2xvYmFsKGZ1bmMpOwotICAoKHZvaWQqKilyZXMpW1ZUX1RSQUNFUl9PRkZTRVRdID0gdHJhY2VyOwotICBjbC0+dmlydHVhbFRyYWNlciA9IGZ1bmM7Ci0jZW5kaWYKLQotI2RlZmluZSBDQVNFX0FSUkFZKG5hbWUsIHR5cGUpCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCWlmKGNsLT5iYXNlQ2xhc3MgPT0gTVNDb3JsaWI6OnAjI25hbWUpIHsJCQkJCQkJCQkJCQkJCQlcCi0JCSgodm9pZCoqKXJlcylbVlRfUFJJTlRfT0ZGU0VUXSA9ICgodm9pZCAqKikodW5zaWduZWQgaW50KUFycmF5IyNuYW1lOjpkb19wcmludCk7IFwKLSAgfSBlbHNlCi0JCi0JT05fVFlQRVMoQ0FTRV9BUlJBWSwgX0ZfTlQpIHt9Ci0KLSN1bmRlZiBDQVNFX0FSUkFZCi0KLSAgcmV0dXJuIHJlczsKLX0KLQotTjNWaXJ0dWFsVGFibGUqIENMSUppdDo6bWFrZVZUKFZNQ2xhc3MqIGNsLCBib29sIHN0YXQpIHsKLQlpbnQgbiAgICAgICAgICAgICAgICA9IE4zVmlydHVhbFRhYmxlOjpiYXNlVnRTaXplKCk7Ci0gIE4zVmlydHVhbFRhYmxlICogcmVzID0KLQkJc3RhdCA/ICAgICAgIAotCQluZXcoY2wtPmFzc2VtYmx5LT5hbGxvY2F0b3IsIG4pICAgICAgICAgIE4zVmlydHVhbFRhYmxlKCh1aW50cHRyX3QpMCwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkodWludHB0cl90KTAsIAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKHVpbnRwdHJfdClWTU9iamVjdDo6X3RyYWNlLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSh1aW50cHRyX3QpVk1PYmplY3Q6Ol9wcmludCwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkodWludHB0cl90KW12bTo6T2JqZWN0OjpkZWZhdWx0X2hhc2hDb2RlKSA6IAotCQkoY2wtPnN1cGVyID8gCi0JCSBuZXcoY2wtPmFzc2VtYmx5LT5hbGxvY2F0b3IsIGNsLT52dFNpemUpIE4zVmlydHVhbFRhYmxlKFZNT2JqZWN0OjpnZXROM1ZpcnR1YWxUYWJsZSgoKFZNQ2xhc3MgKiljbC0+c3VwZXIpLT52aXJ0dWFsSW5zdGFuY2UpLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSBuLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSBjbC0+dnRTaXplKSA6Ci0JCSBuZXcoY2wtPmFzc2VtYmx5LT5hbGxvY2F0b3IsIGNsLT52dFNpemUpIE4zVmlydHVhbFRhYmxlKCh1aW50cHRyX3QpMCwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgKHVpbnRwdHJfdCkwLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAodWludHB0cl90KVZNT2JqZWN0OjpfdHJhY2UsIAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICh1aW50cHRyX3QpVk1PYmplY3Q6Ol9wcmludCwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgKHVpbnRwdHJfdCltdm06Ok9iamVjdDo6ZGVmYXVsdF9oYXNoQ29kZSkpOwotCQkKLQotI2lmZGVmIFdJVEhfVFJBQ0VSICAKLSAgY29uc3QgVHlwZSogdHlwZSA9IHN0YXQgPyBjbC0+c3RhdGljVHlwZSA6IGNsLT52aXJ0dWFsVHlwZTsKLSAgc3RkOjp2ZWN0b3I8Vk1GaWVsZCo+ICZmaWVsZHMgPSBzdGF0ID8gY2wtPnN0YXRpY0ZpZWxkcyA6IGNsLT52aXJ0dWFsRmllbGRzOwotICAKLSAgRnVuY3Rpb24qIGZ1bmMgPSBGdW5jdGlvbjo6Q3JlYXRlKG1hcmtBbmRUcmFjZUxMVk1UeXBlLAotCQkJCQkJCQkJCQkJCQkJCQkJR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSwKLQkJCQkJCQkJCQkJCQkJCQkJCSJtYXJrQW5kVHJhY2VPYmplY3QiLAotCQkJCQkJCQkJCQkJCQkJCQkJY2wtPnZtLT5nZXRMTFZNTW9kdWxlKCkpOwotCi0gIEFyZ3VtZW50KiBhcmcgPSBmdW5jLT5hcmdfYmVnaW4oKTsKLSNpZmRlZiBNVUxUSVBMRV9HQyAKLSAgQXJndW1lbnQqIEdDID0gKysoZnVuYy0+YXJnX2JlZ2luKCkpOwotI2VuZGlmCi0gIEJhc2ljQmxvY2sqIGJsb2NrID0gQmFzaWNCbG9jazo6Q3JlYXRlKGdldEdsb2JhbENvbnRleHQoKSwgIiIsIGZ1bmMpOwotICBsbHZtOjpWYWx1ZSogcmVhbEFyZyA9IG5ldyBCaXRDYXN0SW5zdChhcmcsIHR5cGUsICIiLCBibG9jayk7Ci0gCi0jaWZkZWYgTVVMVElQTEVfR0MKLSAgc3RkOjp2ZWN0b3I8VmFsdWUqPiBBcmdzOwotICBBcmdzLnB1c2hfYmFjayhhcmcpOwotICBBcmdzLnB1c2hfYmFjayhHQyk7Ci0gIGlmIChzdGF0IHx8IGNsLT5zdXBlciA9PSAwKSB7Ci0gICAgQ2FsbEluc3Q6OkNyZWF0ZSh2bU9iamVjdFRyYWNlckxMVk0sIEFyZ3MuYmVnaW4oKSwgQXJncy5lbmQoKSwgIiIsIGJsb2NrKTsKLSAgfSBlbHNlIHsKLSAgICBDYWxsSW5zdDo6Q3JlYXRlKCgoVk1DbGFzcyopY2wtPnN1cGVyKS0+dmlydHVhbFRyYWNlciwgQXJncy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgQXJncy5lbmQoKSwgIiIsIGJsb2NrKTsKLSAgfQotI2Vsc2UKLSAgaWYgKHN0YXQgfHwgY2wtPnN1cGVyID09IDApIHsKLSAgICBDYWxsSW5zdDo6Q3JlYXRlKHZtT2JqZWN0VHJhY2VyTExWTSwgYXJnLCAiIiwgYmxvY2spOwotICB9IGVsc2UgewotICAgIENhbGxJbnN0OjpDcmVhdGUoKChWTUNsYXNzKiljbC0+c3VwZXIpLT52aXJ0dWFsVHJhY2VyLCBhcmcsICIiLCBibG9jayk7Ci0gIH0KLSNlbmRpZgotICAKLSAgdHJhY2VDbGFzcyhjbCwgYmxvY2ssIHJlYWxBcmcsIGZpZWxkcywgKGNsLT5zdXBlciA9PSBNU0NvcmxpYjo6cFZhbHVlICYmICFzdGF0KSk7Ci0gIFJldHVybkluc3Q6OkNyZWF0ZShnZXRHbG9iYWxDb250ZXh0KCksIGJsb2NrKTsKLQotICB2b2lkKiB0cmFjZXIgPSBtdm06Ok12bU1vZHVsZTo6ZXhlY3V0aW9uRW5naW5lLT5nZXRQb2ludGVyVG9HbG9iYWwoZnVuYyk7Ci0gICgodm9pZCoqKXJlcylbVlRfVFJBQ0VSX09GRlNFVF0gPSB0cmFjZXI7Ci0gIAotICBpZiAoIXN0YXQpIHsKLSAgICBjbC0+dmlydHVhbFRyYWNlciA9IGZ1bmM7Ci0gIH0gZWxzZSB7Ci0gICAgY2wtPnN0YXRpY1RyYWNlciA9IGZ1bmM7Ci0gIH0KLSNlbmRpZgotCQotICByZXR1cm4gcmVzOwotfQotCi1CYXNpY0Jsb2NrKiBDTElKaXQ6OmNyZWF0ZUJhc2ljQmxvY2soY29uc3QgY2hhciogbmFtZSkgewotICByZXR1cm4gQmFzaWNCbG9jazo6Q3JlYXRlKGdldEdsb2JhbENvbnRleHQoKSwgbmFtZSwgbGx2bUZ1bmN0aW9uKTsKLX0KLQotdm9pZCBDTElKaXQ6OnNldEN1cnJlbnRCbG9jayhCYXNpY0Jsb2NrKiBuZXdCbG9jaykgewotCi0gIHN0ZDo6dmVjdG9yPFZhbHVlKj4gbmV3U3RhY2s7Ci0gIHVpbnQzMiBpbmRleCA9IDA7Ci0gIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgaSA9IG5ld0Jsb2NrLT5iZWdpbigpLCBlID0gbmV3QmxvY2stPmVuZCgpOyBpICE9IGU7Ci0gICAgICAgKytpLCArK2luZGV4KSB7Ci0gICAgaWYgKCEoaXNhPFBISU5vZGU+KGkpKSkgewotICAgICAgYnJlYWs7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG5ld1N0YWNrLnB1c2hfYmFjayhpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHN0YWNrID0gbmV3U3RhY2s7Ci0gIGN1cnJlbnRCbG9jayA9IG5ld0Jsb2NrOwotfQotCi1leHRlcm4gdm9pZCBjb252ZXJ0VmFsdWUoVmFsdWUqJiB2YWwsIGNvbnN0IFR5cGUqIHQxLCBCYXNpY0Jsb2NrKiBjdXJyZW50QmxvY2spOwotCi1zdGF0aWMgdm9pZCB0ZXN0UEhJTm9kZXMoQmFzaWNCbG9jayogZGVzdCwgQmFzaWNCbG9jayogaW5zZXJ0LCBDTElKaXQqIGppdCkgewotICBpZihkZXN0LT5lbXB0eSgpKSB7Ci0gICAgZm9yIChzdGQ6OnZlY3RvcjxWYWx1ZSo+OjppdGVyYXRvciBpID0gaml0LT5zdGFjay5iZWdpbigpLAotICAgICAgICAgICAgZSA9IGppdC0+c3RhY2suZW5kKCk7IGkhPSBlOyArK2kpIHsKLSAgICAgIFZhbHVlKiBjdXIgPSAoKmkpOwotICAgICAgUEhJTm9kZSogbm9kZSA9IFBISU5vZGU6OkNyZWF0ZShjdXItPmdldFR5cGUoKSwgIiIsIGRlc3QpOwotICAgICAgbm9kZS0+YWRkSW5jb21pbmcoY3VyLCBpbnNlcnQpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBzdGQ6OnZlY3RvcjxWYWx1ZSo+OjppdGVyYXRvciBzdGFja2l0ID0gaml0LT5zdGFjay5iZWdpbigpOwotICAgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgaSA9IGRlc3QtPmJlZ2luKCksIGUgPSBkZXN0LT5lbmQoKTsgaSAhPSBlOwotICAgICAgICAgKytpKSB7Ci0gICAgICBpZiAoIShpc2E8UEhJTm9kZT4oaSkpKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgSW5zdHJ1Y3Rpb24qIGlucyA9IGk7Ci0gICAgICAgIFZhbHVlKiBjdXIgPSAoKnN0YWNraXQpOwotICAgICAgICBjb252ZXJ0VmFsdWUoY3VyLCBpbnMtPmdldFR5cGUoKSwgaW5zZXJ0KTsKLSAgICAgICAgKChQSElOb2RlKilpbnMpLT5hZGRJbmNvbWluZyhjdXIsIGluc2VydCk7Ci0gICAgICAgICsrc3RhY2tpdDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBDTElKaXQ6OmJyYW5jaChsbHZtOjpCYXNpY0Jsb2NrKiBkZXN0LCBsbHZtOjpCYXNpY0Jsb2NrKiBpbnNlcnQpIHsKLSAgdGVzdFBISU5vZGVzKGRlc3QsIGluc2VydCwgdGhpcyk7Ci0gIEJyYW5jaEluc3Q6OkNyZWF0ZShkZXN0LCBpbnNlcnQpOwotfQotCi12b2lkIENMSUppdDo6YnJhbmNoKGxsdm06OlZhbHVlKiB0ZXN0LCBsbHZtOjpCYXNpY0Jsb2NrKiBpZlRydWUsCi0gICAgICAgICAgICAgICAgICAgIGxsdm06OkJhc2ljQmxvY2sqIGlmRmFsc2UsIGxsdm06OkJhc2ljQmxvY2sqIGluc2VydCkgeyAgCi0gIHRlc3RQSElOb2RlcyhpZlRydWUsIGluc2VydCwgdGhpcyk7Ci0gIHRlc3RQSElOb2RlcyhpZkZhbHNlLCBpbnNlcnQsIHRoaXMpOwotICBCcmFuY2hJbnN0OjpDcmVhdGUoaWZUcnVlLCBpZkZhbHNlLCB0ZXN0LCBpbnNlcnQpOwotfQotCi1WYWx1ZSogQ0xJSml0Ojpwb3AoKSB7Ci0gIGFzc2VydChzdGFjay5zaXplKCkpOwotICBWYWx1ZSogcmV0ID0gdG9wKCk7Ci0gIHN0YWNrLnBvcF9iYWNrKCk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLVZhbHVlKiBDTElKaXQ6OnRvcCgpIHsKLSAgcmV0dXJuIHN0YWNrLmJhY2soKTsKLX0KLQotdm9pZCBDTElKaXQ6OnB1c2goVmFsdWUqIHZhbCkgewotICBhc3NlcnQodmFsKTsKLSAgc3RhY2sucHVzaF9iYWNrKHZhbCk7Ci19Ci0KLVZhbHVlKiBDTElKaXQ6OmNoYW5nZVR5cGUoVmFsdWUqIHZhbCwgY29uc3QgVHlwZSogdHlwZSkgewotICBjb25zdCBUeXBlKiB2YWxUeXBlID0gdmFsLT5nZXRUeXBlKCk7Ci0gIGlmICh0eXBlLT5pc0ludGVnZXJUeSgpKSB7Ci0gICAgaWYgKHZhbFR5cGUgPT0gUG9pbnRlclR5cGU6OmdldFVucXVhbCh0eXBlKSkgewotICAgICAgLy8gaW4gY2FzdCBpdCdzIGEgc3RydWN0Ci0gICAgICB2YWwgPSBuZXcgTG9hZEluc3QodmFsLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAodHlwZS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpIDwgCi0gICAgICAgICAgICAgdmFsVHlwZS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpKSB7Ci0gICAgICB2YWwgPSBuZXcgVHJ1bmNJbnN0KHZhbCwgdHlwZSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHZhbCA9IG5ldyBTRXh0SW5zdCh2YWwsIHR5cGUsICIiLCBjdXJyZW50QmxvY2spOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlID09IFR5cGU6OmdldEZsb2F0VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSkgewotICAgIHZhbCA9IG5ldyBGUFRydW5jSW5zdCh2YWwsIHR5cGUsICIiLCBjdXJyZW50QmxvY2spOwotICB9IGVsc2UgaWYgKHR5cGUgPT0gVHlwZTo6Z2V0RG91YmxlVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSkgewotICAgIHZhbCA9IG5ldyBGUEV4dEluc3QodmFsLCB0eXBlLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgfSBlbHNlIHsKLSAgICB2YWwgPSBuZXcgQml0Q2FzdEluc3QodmFsLCB0eXBlLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgfQotICByZXR1cm4gdmFsOwotfQotCi12b2lkIENMSUppdDo6bWFrZUFyZ3MoY29uc3QgRnVuY3Rpb25UeXBlKiB0eXBlLCBzdGQ6OnZlY3RvcjxWYWx1ZSo+JiBBcmdzLAotICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RydWN0UmV0dXJuKSB7Ci0gIHVpbnQzMiBzaXplID0gdHlwZS0+Z2V0TnVtUGFyYW1zKCk7Ci0gIFZhbHVlKiogYXJncyA9IChWYWx1ZSoqKWFsbG9jYShzaXplb2YoVmFsdWUqKSAqIHNpemUpOwotICBzaW50MzIgaW5kZXggPSBzaXplIC0gMTsKLSAgRnVuY3Rpb25UeXBlOjpwYXJhbV9pdGVyYXRvciBlID0gdHlwZS0+cGFyYW1fZW5kKCk7Ci0gIGUtLTsKLSAgaWYgKHN0cnVjdFJldHVybikgeyBlLS07IGluZGV4LS07IHNpemUtLTsgfQotICBmb3IgKDsgaW5kZXggPj0gMDsgLS1lLCAtLWluZGV4KSB7Ci0gICAgY29uc3QgVHlwZSogYXJnVHlwZSA9ICgqZSk7Ci0gICAgVmFsdWUqIHZhbCA9IHBvcCgpOwotICAgIGlmICh2YWwtPmdldFR5cGUoKSAhPSBhcmdUeXBlKSB7Ci0gICAgICB2YWwgPSBjaGFuZ2VUeXBlKHZhbCwgYXJnVHlwZSk7Ci0gICAgfQotICAgIGFyZ3NbaW5kZXhdID0gdmFsOwotICB9Ci0KLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICBBcmdzLnB1c2hfYmFjayhhcmdzW2ldKTsKLSAgfQotfQotCi1JbnN0cnVjdGlvbiogQ0xJSml0Ojpsb3dlck1hdGhPcHMoVk1NZXRob2QqIG1ldGgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFZhbHVlKj4mIGFyZ3MpIHsKLSAgCi0gIGlmIChtZXRoLT5uYW1lID09IE4zOjpzcXJ0KSB7Ci0gICAgcmV0dXJuIENhbGxJbnN0OjpDcmVhdGUobW9kdWxlLT5mdW5jX2xsdm1fc3FydF9mNjQsIGFyZ3NbMF0sICJ0bXAxIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgfSBlbHNlIGlmIChtZXRoLT5uYW1lID09IE4zOjpzaW4pIHsKLSAgICByZXR1cm4gQ2FsbEluc3Q6OkNyZWF0ZShtb2R1bGUtPmZ1bmNfbGx2bV9zaW5fZjY0LCBhcmdzWzBdLCAidG1wMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgfSBlbHNlIGlmIChtZXRoLT5uYW1lID09IE4zOjpjb3MpIHsKLSAgICByZXR1cm4gQ2FsbEluc3Q6OkNyZWF0ZShtb2R1bGUtPmZ1bmNfbGx2bV9jb3NfZjY0LCBhcmdzWzBdLCAidG1wMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgfSBlbHNlIGlmIChtZXRoLT5uYW1lID09IE4zOjpleHApIHsKLSAgICByZXR1cm4gQ2FsbEluc3Q6OkNyZWF0ZShtb2R1bGUtPmZ1bmNfbGx2bV9leHBfZjY0LCBhcmdzWzBdLCAidG1wMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgfSBlbHNlIGlmIChtZXRoLT5uYW1lID09IE4zOjpsb2cpIHsKLSAgICByZXR1cm4gQ2FsbEluc3Q6OkNyZWF0ZShtb2R1bGUtPmZ1bmNfbGx2bV9sb2dfZjY0LCBhcmdzWzBdLCAidG1wMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgfSBlbHNlIGlmIChtZXRoLT5uYW1lID09IE4zOjpmbG9vcikgewotICAgIHJldHVybiBDYWxsSW5zdDo6Q3JlYXRlKG1vZHVsZS0+ZnVuY19sbHZtX2Zsb29yX2Y2NCwgYXJnc1swXSwgInRtcDEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gIH0gZWxzZSBpZiAobWV0aC0+bmFtZSA9PSBOMzo6bG9nMTApIHsKLSAgICByZXR1cm4gQ2FsbEluc3Q6OkNyZWF0ZShtb2R1bGUtPmZ1bmNfbGx2bV9sb2cxMF9mNjQsIGFyZ3NbMF0sICJ0bXAxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICB9IGVsc2UgaWYgKG1ldGgtPm5hbWUgPT0gTjM6OnBvdykgewotICAgIEluc3RydWN0aW9uKiB2YWwgPSBDYWxsSW5zdDo6Q3JlYXRlKG1vZHVsZS0+ZnVuY19sbHZtX3Bvd19mNjQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuYmVnaW4oKSwgYXJncy5lbmQoKSwgInRtcDEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gICAgcmV0dXJuIHZhbDsKLSAgfQotICByZXR1cm4gMDsKLQotfQotCi1JbnN0cnVjdGlvbiogQ0xJSml0OjppbnZva2VJbmxpbmUoVk1NZXRob2QqIG1ldGgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFZhbHVlKj4mIGFyZ3MsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsgIAotCW12bTo6QnVtcFB0ckFsbG9jYXRvciAqYSA9IG5ldyBtdm06OkJ1bXBQdHJBbGxvY2F0b3IoKTsKLSAgQ0xJSml0KiBqaXQgPSBuZXcoKmEsICJDTElKaXQiKSBDTElKaXQoKmEpOwotICBqaXQtPm1vZHVsZSA9IG1ldGgtPmNsYXNzRGVmLT52bS0+bW9kdWxlOwotICBqaXQtPmNvbXBpbGluZ0NsYXNzID0gbWV0aC0+Y2xhc3NEZWY7IAotICBqaXQtPmNvbXBpbGluZ01ldGhvZCA9IG1ldGg7Ci0gIAotICBqaXQtPnVuaWZpZWRVbnJlYWNoYWJsZSA9IHVuaWZpZWRVbnJlYWNoYWJsZTsKLSAgaml0LT5pbmxpbmVNZXRob2RzID0gaW5saW5lTWV0aG9kczsKLSAgaml0LT5pbmxpbmVNZXRob2RzW21ldGhdID0gdHJ1ZTsKLSAgSW5zdHJ1Y3Rpb24qIHJldCA9IGppdC0+aW5saW5lQ29tcGlsZShsbHZtRnVuY3Rpb24sIGN1cnJlbnRCbG9jaywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEV4Y2VwdGlvbkJsb2NrLCBhcmdzLCBzdGF0aWNfY2FzdDxWTUdlbmVyaWNDbGFzcyo+KGppdC0+Y29tcGlsaW5nQ2xhc3MpLCBnZW5NZXRob2QpOwotICBpbmxpbmVNZXRob2RzW21ldGhdID0gZmFsc2U7Ci0KLQlkZWxldGUgYTsKLSAgcmV0dXJuIHJldDsKLX0KLQotCi12b2lkIENMSUppdDo6aW52b2tlKHVpbnQzMiB2YWx1ZSwgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCkgewotICBWTU1ldGhvZCogbWV0aCA9IGNvbXBpbGluZ0NsYXNzLT5hc3NlbWJseS0+Z2V0TWV0aG9kRnJvbVRva2VuKHZhbHVlLCBnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLQotICBpZiAobWV0aC0+Y2xhc3NEZWYtPmlzQXJyYXkpIHsKLSAgICB1aW50OCBmdW5jID0gMDsKLSAgICBOMyogdm0gPSBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCk7Ci0gICAgaWYgKG1ldGgtPm5hbWUgPT0gdm0tPmFzY2lpelRvVVRGOCgiU2V0IikpIHsKLSAgICAgIGZ1bmMgPSAwOwotICAgIH0gZWxzZSBpZiAobWV0aC0+bmFtZSA9PSB2bS0+YXNjaWl6VG9VVEY4KCJHZXQiKSkgewotICAgICAgZnVuYyA9IDE7Ci0gICAgfSBlbHNlIGlmIChtZXRoLT5uYW1lID09IHZtLT5hc2NpaXpUb1VURjgoIkFkZHJlc3MiKSkgewotICAgICAgZnVuYyA9IDI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHZtLT5lcnJvcigiaW1wbGVtZW50IG1lICVzIiwgbXZtOjpQcmludEJ1ZmZlcihtZXRoLT5uYW1lKS5jU3RyaW5nKCkpOwotICAgIH0KLSAgICAgIAotICAgIFZNQ2xhc3NBcnJheSogdHlwZSA9IChWTUNsYXNzQXJyYXkqKW1ldGgtPmNsYXNzRGVmOwotICAgIHVpbnQzMiBkaW1zID0gdHlwZS0+ZGltczsKLSAgICBWYWx1ZSoqIGFyZ3MgPSAoVmFsdWUqKilhbGxvY2Eoc2l6ZW9mKFZhbHVlKikgKiBkaW1zKTsKLSAgICBWYWx1ZSogdmFsID0gMDsKLSAgICBpZiAoZnVuYyA9PSAwKSB7Ci0gICAgICB2YWwgPSBwb3AoKTsKLSAgICB9Ci0gICAgZm9yIChzaW50MzIgaSA9IGRpbXMgLSAxOyBpID49IDAgOyAtLWkpIHsKLSAgICAgIGFyZ3NbaV0gPSBwb3AoKTsKLSAgICB9Ci0gICAgVmFsdWUqIG9iaiA9IHBvcCgpOwotICAgIFZNQ2xhc3NBcnJheSogYmFzZSA9IHR5cGU7Ci0gICAgZm9yICh1aW50MzIgdiA9IDA7IHYgPCBkaW1zOyArK3YpIHsKLSAgICAgIHN0ZDo6dmVjdG9yPFZhbHVlKj4gQXJnczsKLSAgICAgIEFyZ3MucHVzaF9iYWNrKG1vZHVsZS0+Y29uc3RhbnRaZXJvKTsKLSAgICAgIEFyZ3MucHVzaF9iYWNrKG1vZHVsZS0+Y29uc3RhbnRUd28pOwotICAgICAgQXJncy5wdXNoX2JhY2soYXJnc1t2XSk7Ci0gICAgICBvYmogPSB2ZXJpZnlBbmRDb21wdXRlUHRyKG9iaiwgYXJnc1t2XSwgYmFzZS0+bmF0dXJhbFR5cGUsIHRydWUpOwotICAgICAgaWYgKHYgIT0gZGltcyAtIDEpIHsKLSAgICAgICAgYmFzZSA9IChWTUNsYXNzQXJyYXkqKWJhc2UtPmJhc2VDbGFzczsKLSAgICAgICAgb2JqID0gbmV3IExvYWRJbnN0KG9iaiwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmIChmdW5jID09IDApIHsKLSAgICAgIG5ldyBTdG9yZUluc3QodmFsLCBvYmosIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgIH0gZWxzZSBpZiAoZnVuYyA9PSAxKSB7Ci0gICAgICBwdXNoKG5ldyBMb2FkSW5zdChvYmosICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICB9IGVsc2UgewotICAgICAgcHVzaChvYmopOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IEFyZ3M7Ci0gIGNvbnN0IGxsdm06OkZ1bmN0aW9uVHlwZSogdHlwZSA9IG1ldGgtPmdldFNpZ25hdHVyZShnZW5NZXRob2QpOwotICBtYWtlQXJncyh0eXBlLCBBcmdzLCBtZXRoLT5zdHJ1Y3RSZXR1cm4pOwotICAKLSAgaWYgKG1ldGgtPmNsYXNzRGVmLT5uYW1lU3BhY2UgPT0gTjM6OnN5c3RlbSAmJiAKLSAgICAgIG1ldGgtPmNsYXNzRGVmLT5uYW1lID09IE4zOjptYXRoKSB7Ci0gICAgVmFsdWUqIHZhbCA9IGxvd2VyTWF0aE9wcyhtZXRoLCBBcmdzKTsgCi0gICAgaWYgKHZhbCkgewotICAgICAgcHVzaCh2YWwpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfSBlbHNlIGlmIChtZXRoLT5jbGFzc0RlZi0+bmFtZVNwYWNlID09IE4zOjpzeXN0ZW0gJiYgCi0gICAgICAgICAgICAgbWV0aC0+Y2xhc3NEZWYtPm5hbWUgPT0gTjM6OmRvdWJsZU5hbWUpIHsKLSAgICBpZiAobWV0aC0+bmFtZSA9PSBOMzo6aXNOYW4pIHsKLSAgICAgIHB1c2gobmV3IEZDbXBJbnN0KCpjdXJyZW50QmxvY2ssIEZDbXBJbnN0OjpGQ01QX1VOTywgQXJnc1swXSwgCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUtPmNvbnN0YW50RG91YmxlWmVybywgInRtcDEiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChtZXRoLT5uYW1lID09IE4zOjp0ZXN0SW5maW5pdHkpIHsKLSAgICAgIEJhc2ljQmxvY2sqIGVuZEJsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygiZW5kIHRlc3QgaW5maW5pdHkiKTsKLSAgICAgIEJhc2ljQmxvY2sqIG1pbnVzSW5maW5pdHkgPSBjcmVhdGVCYXNpY0Jsb2NrKCItIGluZmluaXR5Iik7Ci0gICAgICBCYXNpY0Jsb2NrKiBub0luZmluaXR5ID0gY3JlYXRlQmFzaWNCbG9jaygibm8gaW5maW5pdHkiKTsKLSAgICAgIFBISU5vZGUqIG5vZGUgPSBQSElOb2RlOjpDcmVhdGUoVHlwZTo6Z2V0SW50MzJUeShnZXRHbG9iYWxDb250ZXh0KCkpLCAiIiwgZW5kQmxvY2spOwotICAgICAgbm9kZS0+YWRkSW5jb21pbmcobW9kdWxlLT5jb25zdGFudE9uZSwgY3VycmVudEJsb2NrKTsKLSAgICAgIG5vZGUtPmFkZEluY29taW5nKG1vZHVsZS0+Y29uc3RhbnRNaW51c09uZSwgbWludXNJbmZpbml0eSk7Ci0gICAgICBub2RlLT5hZGRJbmNvbWluZyhtb2R1bGUtPmNvbnN0YW50WmVybywgbm9JbmZpbml0eSk7Ci0gICAgICBWYWx1ZSogdmFsMSA9IG5ldyBGQ21wSW5zdCgqY3VycmVudEJsb2NrLCBGQ21wSW5zdDo6RkNNUF9PRVEsIEFyZ3NbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUtPmNvbnN0YW50RG91YmxlSW5maW5pdHksICJ0bXAxIik7IAotICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKGVuZEJsb2NrLCBtaW51c0luZmluaXR5LCB2YWwxLCBjdXJyZW50QmxvY2spOwotICAgICAgVmFsdWUqIHZhbDIgPSBuZXcgRkNtcEluc3QoKm1pbnVzSW5maW5pdHksIEZDbXBJbnN0OjpGQ01QX09FUSwgQXJnc1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS0+Y29uc3RhbnREb3VibGVNaW51c0luZmluaXR5LCAidG1wMSIpOwotICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKGVuZEJsb2NrLCBub0luZmluaXR5LCB2YWwyLCBtaW51c0luZmluaXR5KTsKLSAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShlbmRCbG9jaywgbm9JbmZpbml0eSk7Ci0gICAgICBjdXJyZW50QmxvY2sgPSBlbmRCbG9jazsgCi0gICAgICBwdXNoKG5vZGUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfSBlbHNlIGlmIChtZXRoLT5jbGFzc0RlZi0+bmFtZVNwYWNlID09IE4zOjpzeXN0ZW0gJiYgCi0gICAgICAgICAgICAgbWV0aC0+Y2xhc3NEZWYtPm5hbWUgPT0gTjM6OmZsb2F0TmFtZSkgewotICAgIGlmIChtZXRoLT5uYW1lID09IE4zOjppc05hbikgewotICAgICAgcHVzaChuZXcgRkNtcEluc3QoKmN1cnJlbnRCbG9jaywgRkNtcEluc3Q6OkZDTVBfVU5PLCBBcmdzWzBdLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS0+Y29uc3RhbnRGbG9hdFplcm8sICJ0bXAxIikpOwotICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAobWV0aC0+bmFtZSA9PSBOMzo6dGVzdEluZmluaXR5KSB7Ci0gICAgICBCYXNpY0Jsb2NrKiBlbmRCbG9jayA9IGNyZWF0ZUJhc2ljQmxvY2soImVuZCB0ZXN0IGluZmluaXR5Iik7Ci0gICAgICBCYXNpY0Jsb2NrKiBtaW51c0luZmluaXR5ID0gY3JlYXRlQmFzaWNCbG9jaygiLSBpbmZpbml0eSIpOwotICAgICAgQmFzaWNCbG9jayogbm9JbmZpbml0eSA9IGNyZWF0ZUJhc2ljQmxvY2soIm5vIGluZmluaXR5Iik7Ci0gICAgICBQSElOb2RlKiBub2RlID0gUEhJTm9kZTo6Q3JlYXRlKFR5cGU6OmdldEludDMyVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgIiIsIGVuZEJsb2NrKTsKLSAgICAgIG5vZGUtPmFkZEluY29taW5nKG1vZHVsZS0+Y29uc3RhbnRPbmUsIGN1cnJlbnRCbG9jayk7Ci0gICAgICBub2RlLT5hZGRJbmNvbWluZyhtb2R1bGUtPmNvbnN0YW50TWludXNPbmUsIG1pbnVzSW5maW5pdHkpOwotICAgICAgbm9kZS0+YWRkSW5jb21pbmcobW9kdWxlLT5jb25zdGFudFplcm8sIG5vSW5maW5pdHkpOwotICAgICAgVmFsdWUqIHZhbDEgPSBuZXcgRkNtcEluc3QoKmN1cnJlbnRCbG9jaywgRkNtcEluc3Q6OkZDTVBfT0VRLCBBcmdzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLT5jb25zdGFudEZsb2F0SW5maW5pdHksICJ0bXAxIik7Ci0gICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoZW5kQmxvY2ssIG1pbnVzSW5maW5pdHksIHZhbDEsIGN1cnJlbnRCbG9jayk7Ci0gICAgICBWYWx1ZSogdmFsMiA9IG5ldyBGQ21wSW5zdCgqbWludXNJbmZpbml0eSwgRkNtcEluc3Q6OkZDTVBfT0VRLCBBcmdzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLT5jb25zdGFudEZsb2F0TWludXNJbmZpbml0eSwgInRtcDEiKTsKLSAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShlbmRCbG9jaywgbm9JbmZpbml0eSwgdmFsMiwgbWludXNJbmZpbml0eSk7Ci0gICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoZW5kQmxvY2ssIG5vSW5maW5pdHkpOwotICAgICAgY3VycmVudEJsb2NrID0gZW5kQmxvY2s7IAotICAgICAgcHVzaChub2RlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLSAgCi0gIFZhbHVlKiByZXMgPSAwOwotICBpZiAobWV0aCAmJiBtZXRoLT5jYW5CZUlubGluZWQgJiYgbWV0aCAhPSBjb21waWxpbmdNZXRob2QgJiYgCi0gICAgICBpbmxpbmVNZXRob2RzW21ldGhdID09IDApIHsKLSAgICByZXMgPSBpbnZva2VJbmxpbmUobWV0aCwgQXJncywgZ2VuQ2xhc3MsIGdlbk1ldGhvZCk7Ci0gIH0gZWxzZSB7Ci0gICAgRnVuY3Rpb24qIGZ1bmMgPSBtZXRoLT5jb21waWxlZFB0cihnZW5NZXRob2QpOwotICAgIAotICAgIHJlcyA9IGludm9rZShmdW5jLCBBcmdzLCAiIiwgY3VycmVudEJsb2NrLCBtZXRoLT5zdHJ1Y3RSZXR1cm4pOwotICB9Ci0gIGlmIChtZXRoLT5wYXJhbWV0ZXJzWzBdICE9IE1TQ29ybGliOjpwVm9pZCkgewotICAgIHB1c2gocmVzKTsKLSAgfQotfQotCi12b2lkIENMSUppdDo6aW52b2tlTmV3KHVpbnQzMiB2YWx1ZSwgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCkgewotICBBc3NlbWJseSogYXNzID0gY29tcGlsaW5nQ2xhc3MtPmFzc2VtYmx5OwotICBWTU1ldGhvZCogbWV0aCA9IGFzcy0+Z2V0TWV0aG9kRnJvbVRva2VuKHZhbHVlLCBnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLSAgVk1DbGFzcyogdHlwZSA9IG1ldGgtPmNsYXNzRGVmOwotICBjb25zdCBGdW5jdGlvblR5cGUqIGZ1bmNUeXBlID0gbWV0aC0+Z2V0U2lnbmF0dXJlKGdlbk1ldGhvZCk7Ci0gICAgCi0gIFZhbHVlKiBvYmogPSAwOwotICBpZiAodHlwZS0+aXNQb2ludGVyKSB7Ci0gICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lICVzIiwgbXZtOjpQcmludEJ1ZmZlcih0eXBlKS5jU3RyaW5nKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzQXJyYXkpIHsKLSAgICBWTUNsYXNzQXJyYXkqIGFycmF5VHlwZSA9IChWTUNsYXNzQXJyYXkqKXR5cGU7Ci0gICAgVmFsdWUqIHZhbENsID0gbmV3IExvYWRJbnN0KGFycmF5VHlwZS0+bGx2bVZhcigpLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICBWYWx1ZSoqIGFyZ3MgPSAoVmFsdWUqKilhbGxvY2Eoc2l6ZW9mKFZhbHVlKikgKiAoYXJyYXlUeXBlLT5kaW1zICsgMSkpOwotICAgIGFyZ3NbMF0gPSB2YWxDbDsKLQotICAgIGZvciAoaW50IGN1ciA9IGFycmF5VHlwZS0+ZGltczsgY3VyID4gMDsgLS1jdXIpCi0gICAgICBhcmdzW2N1cl0gPSBwb3AoKTsKLSAgICAgCi0gICAgc3RkOjp2ZWN0b3I8VmFsdWUqPiBBcmdzOwotICAgIGZvciAodWludDMyIHYgPSAwOyB2IDwgYXJyYXlUeXBlLT5kaW1zICsgMTsgKyt2KSB7Ci0gICAgICBBcmdzLnB1c2hfYmFjayhhcmdzW3ZdKTsKLSAgICB9Ci0gICAgcHVzaChpbnZva2UoYXJyYXlNdWx0aUNvbnNMTFZNLCBBcmdzLCAiIiwgY3VycmVudEJsb2NrLCBmYWxzZSkpOwotICAgIHJldHVybjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPnN1cGVyID09IE1TQ29ybGliOjpwVmFsdWUgfHwgdHlwZS0+c3VwZXIgPT0gTVNDb3JsaWI6OnBFbnVtKSB7Ci0gICAgb2JqID0gbmV3IEFsbG9jYUluc3QodHlwZS0+bmF0dXJhbFR5cGUsICIiLCBjdXJyZW50QmxvY2spOwotICAgIHVpbnQ2NCBzaXplID0gbXZtOjpNdm1Nb2R1bGU6OmdldFR5cGVTaXplKHR5cGUtPm5hdHVyYWxUeXBlKTsKLSAgICAgICAgCi0gICAgc3RkOjp2ZWN0b3I8VmFsdWUqPiBwYXJhbXM7Ci0gICAgcGFyYW1zLnB1c2hfYmFjayhuZXcgQml0Q2FzdEluc3Qob2JqLCBtb2R1bGUtPnB0clR5cGUsICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICBwYXJhbXMucHVzaF9iYWNrKG1vZHVsZS0+Y29uc3RhbnRJbnQ4WmVybyk7Ci0gICAgcGFyYW1zLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgc2l6ZSkpOwotICAgIHBhcmFtcy5wdXNoX2JhY2sobW9kdWxlLT5jb25zdGFudFplcm8pOwotICAgIENhbGxJbnN0OjpDcmVhdGUobW9kdWxlLT5sbHZtX21lbXNldF9pMzIsIHBhcmFtcy5iZWdpbigpLCBwYXJhbXMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAiIiwgY3VycmVudEJsb2NrKTsKLSAgfSBlbHNlIHsKLSAgICBWYWx1ZSogdmFyID0gbmV3IExvYWRJbnN0KHR5cGUtPmxsdm1WYXIoKSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgVmFsdWUqIHZhbCA9IENhbGxJbnN0OjpDcmVhdGUob2JqQ29uc0xMVk0sIHZhciwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgb2JqID0gbmV3IEJpdENhc3RJbnN0KHZhbCwgdHlwZS0+bmF0dXJhbFR5cGUsICIiLCBjdXJyZW50QmxvY2spOwotICB9Ci0gIAotICBzdGQ6OnZlY3RvcjxWYWx1ZSo+OjppdGVyYXRvciBpID0gc3RhY2suZW5kKCk7Ci0gIHVpbnQzMiBuYlBhcmFtcyA9IGZ1bmNUeXBlLT5nZXROdW1QYXJhbXMoKTsKLSAgd2hpbGUgKC0tbmJQYXJhbXMpIC0taTsKLSAgc3RhY2suaW5zZXJ0KGksIG9iaik7Ci0KLSAgc3RkOjp2ZWN0b3I8VmFsdWUqPiBBcmdzOwotICBtYWtlQXJncyhmdW5jVHlwZSwgQXJncywgbWV0aC0+c3RydWN0UmV0dXJuKTsKLSAgaWYgKG1ldGggJiYgbWV0aC0+Y2FuQmVJbmxpbmVkICYmIG1ldGggIT0gY29tcGlsaW5nTWV0aG9kICYmIAotICAgICAgaW5saW5lTWV0aG9kc1ttZXRoXSA9PSAwKSB7Ci0gICAgaW52b2tlSW5saW5lKG1ldGgsIEFyZ3MsIGdlbkNsYXNzLCBnZW5NZXRob2QpOwotICB9IGVsc2UgewotICAgIEZ1bmN0aW9uKiBmdW5jID0gbWV0aC0+Y29tcGlsZWRQdHIoZ2VuTWV0aG9kKTsKLSAgICAKLSAgICBpbnZva2UoZnVuYywgQXJncywgIiIsIGN1cnJlbnRCbG9jaywgbWV0aC0+c3RydWN0UmV0dXJuKTsKLSAgfQotICAgIAotICBpZiAoKHR5cGUtPnN1cGVyID09IE1TQ29ybGliOjpwVmFsdWUgfHwgdHlwZS0+c3VwZXIgPT0gTVNDb3JsaWI6OnBFbnVtKSAmJgotICAgICAgdHlwZS0+dmlydHVhbEZpZWxkcy5zaXplKCkgPT0gMSkgewotICAgIHB1c2gobmV3IExvYWRJbnN0KG9iaiwgIiIsIGN1cnJlbnRCbG9jaykpOwotICB9IGVsc2UgewotICAgIHB1c2gob2JqKTsKLSAgfQotfQotICAKLWxsdm06OlZhbHVlKiBDTElKaXQ6OmdldFZpcnR1YWxGaWVsZCh1aW50MzIgdmFsdWUsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgVk1GaWVsZCogZmllbGQgPSBjb21waWxpbmdDbGFzcy0+YXNzZW1ibHktPmdldEZpZWxkRnJvbVRva2VuKHZhbHVlLCBmYWxzZSwgZ2VuQ2xhc3MsIGdlbk1ldGhvZCk7Ci0gIFZhbHVlKiBvYmogPSBwb3AoKTsKLSAgaWYgKChmaWVsZC0+Y2xhc3NEZWYtPnN1cGVyID09IE1TQ29ybGliOjpwVmFsdWUgfHwKLSAgICAgIGZpZWxkLT5jbGFzc0RlZi0+c3VwZXIgPT0gTVNDb3JsaWI6OnBFbnVtKSAmJgotICAgICAgZmllbGQtPmNsYXNzRGVmLT52aXJ0dWFsRmllbGRzLnNpemUoKSA9PSAxKXsKLSAgICAvLyBzdHJ1Y3QhCi0gICAgcmV0dXJuIG9iajsKLSAgfSBlbHNlIHsKLSAgICBpZiAoZmllbGQtPmNsYXNzRGVmLT5zdXBlciAhPSBNU0NvcmxpYjo6cFZhbHVlICYmIAotICAgICAgICBmaWVsZC0+Y2xhc3NEZWYtPnN1cGVyICE9IE1TQ29ybGliOjpwRW51bSkgewotICAgICAgb2JqID0gbmV3IEJpdENhc3RJbnN0KG9iaiwgZmllbGQtPmNsYXNzRGVmLT5uYXR1cmFsVHlwZSwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgICB9Ci0gICAgc3RkOjp2ZWN0b3I8VmFsdWUqPiBhcmdzOwotICAgIGFyZ3MucHVzaF9iYWNrKG1vZHVsZS0+Y29uc3RhbnRaZXJvKTsKLSAgICBhcmdzLnB1c2hfYmFjayhmaWVsZC0+b2Zmc2V0KTsKLSAgICBWYWx1ZSogcHRyID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShvYmosIGFyZ3MuYmVnaW4oKSwgYXJncy5lbmQoKSwgIiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gICAgcmV0dXJuIHB0cjsKLSAgfQotfQotCi1sbHZtOjpWYWx1ZSogQ0xJSml0OjpnZXRTdGF0aWNGaWVsZCh1aW50MzIgdmFsdWUsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgVk1GaWVsZCogZmllbGQgPSBjb21waWxpbmdDbGFzcy0+YXNzZW1ibHktPmdldEZpZWxkRnJvbVRva2VuKHZhbHVlLCB0cnVlLCBnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLSAgVk1Db21tb25DbGFzcyogY2wgPSBmaWVsZC0+Y2xhc3NEZWY7Ci0gIGNsLT5yZXNvbHZlVHlwZSh0cnVlLCBmYWxzZSwgZ2VuTWV0aG9kKTsKLSAgVmFsdWUqIGFyZyA9IG5ldyBMb2FkSW5zdChjbC0+bGx2bVZhcigpLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgVmFsdWUqIGNhbGwgPSBpbnZva2UoaW5pdGlhbGlzZUNsYXNzTExWTSwgYXJnLCAiIiwgY3VycmVudEJsb2NrLCBmYWxzZSk7Ci0gIFZhbHVlKiBzdGF0aWNDbCA9IG5ldyBCaXRDYXN0SW5zdChjYWxsLCBjbC0+c3RhdGljVHlwZSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIAotICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IGFyZ3M7Ci0gIGFyZ3MucHVzaF9iYWNrKG1vZHVsZS0+Y29uc3RhbnRaZXJvKTsKLSAgYXJncy5wdXNoX2JhY2soZmllbGQtPm9mZnNldCk7Ci0gIFZhbHVlKiBwdHIgPSBHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlKHN0YXRpY0NsLCBhcmdzLmJlZ2luKCksIGFyZ3MuZW5kKCksICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICAKLSAgcmV0dXJuIHB0cjsKLQotfQotICAKLXZvaWQgQ0xJSml0OjpzZXRWaXJ0dWFsRmllbGQodWludDMyIHZhbHVlLCBib29sIGlzVm9sYXRpbGUsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgVk1GaWVsZCogZmllbGQgPSBjb21waWxpbmdDbGFzcy0+YXNzZW1ibHktPmdldEZpZWxkRnJvbVRva2VuKHZhbHVlLCBmYWxzZSwgZ2VuQ2xhc3MsIGdlbk1ldGhvZCk7Ci0gIFZhbHVlKiB2YWwgPSBwb3AoKTsKLSAgVmFsdWUqIG9iaiA9IHBvcCgpOwotICBjb25zdCBUeXBlKiB2YWxUeXBlID0gdmFsLT5nZXRUeXBlKCk7Ci0KLSAgVmFsdWUqIHB0ciA9IDA7Ci0gIGNvbnN0IFR5cGUqIHR5cGUgPSBvYmotPmdldFR5cGUoKTsKLSAgaWYgKChmaWVsZC0+Y2xhc3NEZWYtPnN1cGVyID09IE1TQ29ybGliOjpwVmFsdWUgfHwKLSAgICAgIGZpZWxkLT5jbGFzc0RlZi0+c3VwZXIgPT0gTVNDb3JsaWI6OnBFbnVtKSAmJgotICAgICAgZmllbGQtPmNsYXNzRGVmLT52aXJ0dWFsRmllbGRzLnNpemUoKSA9PSAxKXsKLSAgICAvLyBzdHJ1Y3QhCi0gICAgcHRyID0gb2JqOwotICB9IGVsc2UgewotICAgIGlmIChmaWVsZC0+Y2xhc3NEZWYtPnN1cGVyICE9IE1TQ29ybGliOjpwVmFsdWUgJiYKLSAgICAgICAgZmllbGQtPmNsYXNzRGVmLT5zdXBlciAhPSBNU0NvcmxpYjo6cEVudW0pIHsKLSAgICAgIG9iaiA9IG5ldyBCaXRDYXN0SW5zdChvYmosIGZpZWxkLT5jbGFzc0RlZi0+bmF0dXJhbFR5cGUsICIiLCBjdXJyZW50QmxvY2spOwotICAgIH0KLSAgICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IGFyZ3M7Ci0gICAgYXJncy5wdXNoX2JhY2sobW9kdWxlLT5jb25zdGFudFplcm8pOwotICAgIGFyZ3MucHVzaF9iYWNrKGZpZWxkLT5vZmZzZXQpOwotICAgIHB0ciA9IEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUob2JqLCBhcmdzLmJlZ2luKCksIGFyZ3MuZW5kKCksICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICB9Ci0gIAotICBpZiAoZmllbGQtPnNpZ25hdHVyZS0+c3VwZXIgPT0gTVNDb3JsaWI6OnBWYWx1ZSAmJgotICAgICAgZmllbGQtPnNpZ25hdHVyZS0+dmlydHVhbEZpZWxkcy5zaXplKCkgPiAxKSB7Ci0gICAgdWludDY0IHNpemUgPSBtdm06Ok12bU1vZHVsZTo6Z2V0VHlwZVNpemUoZmllbGQtPnNpZ25hdHVyZS0+bmF0dXJhbFR5cGUpOwotICAgICAgICAKLSAgICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IHBhcmFtczsKLSAgICBwYXJhbXMucHVzaF9iYWNrKG5ldyBCaXRDYXN0SW5zdChwdHIsIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVHlwZTo6Z2V0SW50OFR5KGdldEdsb2JhbENvbnRleHQoKSkpLCAiIiwgY3VycmVudEJsb2NrKSk7Ci0gICAgcGFyYW1zLnB1c2hfYmFjayhuZXcgQml0Q2FzdEluc3QodmFsLCBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFR5cGU6OmdldEludDhUeShnZXRHbG9iYWxDb250ZXh0KCkpKSwgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgIHBhcmFtcy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KGdldEdsb2JhbENvbnRleHQoKSksIHNpemUpKTsKLSAgICBwYXJhbXMucHVzaF9iYWNrKG1vZHVsZS0+Y29uc3RhbnRaZXJvKTsKLSAgICBDYWxsSW5zdDo6Q3JlYXRlKG1vZHVsZS0+bGx2bV9tZW1jcHlfaTMyLCBwYXJhbXMuYmVnaW4oKSwgcGFyYW1zLmVuZCgpLCAiIiwgY3VycmVudEJsb2NrKTsKLQotICB9IGVsc2UgewotICAgIHR5cGUgPSBmaWVsZC0+c2lnbmF0dXJlLT5uYXR1cmFsVHlwZTsKLSAgICBpZiAodmFsID09IGNvbnN0YW50Vk1PYmplY3ROdWxsKSB7Ci0gICAgICB2YWwgPSBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKHR5cGUpOwotICAgIH0gZWxzZSBpZiAodHlwZSAhPSB2YWxUeXBlKSB7Ci0gICAgICB2YWwgPSBjaGFuZ2VUeXBlKHZhbCwgdHlwZSk7Ci0gICAgfQotICAKLSAgICBuZXcgU3RvcmVJbnN0KHZhbCwgcHRyLCBpc1ZvbGF0aWxlLCBjdXJyZW50QmxvY2spOwotICB9Ci19Ci0KLXZvaWQgQ0xJSml0OjpzZXRTdGF0aWNGaWVsZCh1aW50MzIgdmFsdWUsIGJvb2wgaXNWb2xhdGlsZSwgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCkgewotICBWTUZpZWxkKiBmaWVsZCA9IGNvbXBpbGluZ0NsYXNzLT5hc3NlbWJseS0+Z2V0RmllbGRGcm9tVG9rZW4odmFsdWUsIHRydWUsIGdlbkNsYXNzLCBnZW5NZXRob2QpOwotICAKLSAgVk1Db21tb25DbGFzcyogY2wgPSBmaWVsZC0+Y2xhc3NEZWY7Ci0gIFZhbHVlKiBhcmcgPSBuZXcgTG9hZEluc3QoY2wtPmxsdm1WYXIoKSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIFZhbHVlKiBjYWxsID0gaW52b2tlKGluaXRpYWxpc2VDbGFzc0xMVk0sIGFyZywgIiIsIGN1cnJlbnRCbG9jaywgZmFsc2UpOwotICBWYWx1ZSogc3RhdGljQ2wgPSBuZXcgQml0Q2FzdEluc3QoY2FsbCwgY2wtPnN0YXRpY1R5cGUsICIiLCBjdXJyZW50QmxvY2spOwotICAKLSAgc3RkOjp2ZWN0b3I8VmFsdWUqPiBhcmdzOwotICBhcmdzLnB1c2hfYmFjayhtb2R1bGUtPmNvbnN0YW50WmVybyk7Ci0gIGFyZ3MucHVzaF9iYWNrKGZpZWxkLT5vZmZzZXQpOwotICBWYWx1ZSogcHRyID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShzdGF0aWNDbCwgYXJncy5iZWdpbigpLCBhcmdzLmVuZCgpLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICBWYWx1ZSogdmFsID0gcG9wKCk7Ci0gIGNvbnN0IFR5cGUqIHR5cGUgPSBmaWVsZC0+c2lnbmF0dXJlLT5uYXR1cmFsVHlwZTsKLSAgY29uc3QgVHlwZSogdmFsVHlwZSA9IHZhbC0+Z2V0VHlwZSgpOwotICBpZiAodmFsID09IGNvbnN0YW50Vk1PYmplY3ROdWxsKSB7Ci0gICAgdmFsID0gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZSh0eXBlKTsKLSAgfSBlbHNlIGlmICh0eXBlICE9IHZhbFR5cGUpIHsKLSAgICB2YWwgPSBjaGFuZ2VUeXBlKHZhbCwgdHlwZSk7Ci0gIH0KLSAgbmV3IFN0b3JlSW5zdCh2YWwsIHB0ciwgaXNWb2xhdGlsZSwgY3VycmVudEJsb2NrKTsKLX0KLQotdm9pZCBDTElKaXQ6OkpJVFZlcmlmeU51bGwoVmFsdWUqIG9iaikgewotICBDTElKaXQqIGppdCA9IHRoaXM7Ci0gIENvbnN0YW50KiB6ZXJvID0gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShvYmotPmdldFR5cGUoKSk7Ci0gIFZhbHVlKiB0ZXN0ID0gbmV3IElDbXBJbnN0KCpqaXQtPmN1cnJlbnRCbG9jaywgSUNtcEluc3Q6OklDTVBfRVEsIG9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemVybywgIiIpOwotCi0gIEJhc2ljQmxvY2sqIGV4aXQgPSBqaXQtPmNyZWF0ZUJhc2ljQmxvY2soInZlcmlmeU51bGxFeGl0Iik7Ci0gIEJhc2ljQmxvY2sqIGNvbnQgPSBqaXQtPmNyZWF0ZUJhc2ljQmxvY2soInZlcmlmeU51bGxDb250Iik7Ci0KLSAgQnJhbmNoSW5zdDo6Q3JlYXRlKGV4aXQsIGNvbnQsIHRlc3QsIGppdC0+Y3VycmVudEJsb2NrKTsKLSAgCi0gIHN0ZDo6dmVjdG9yPFZhbHVlKj4gYXJnczsKLSAgaWYgKGN1cnJlbnRFeGNlcHRpb25CbG9jayAhPSBlbmRFeGNlcHRpb25CbG9jaykgewotICAgIEludm9rZUluc3Q6OkNyZWF0ZShDTElKaXQ6Om51bGxQb2ludGVyRXhjZXB0aW9uTExWTSwgdW5pZmllZFVucmVhY2hhYmxlLAotICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFeGNlcHRpb25CbG9jaywgYXJncy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgIGFyZ3MuZW5kKCksICIiLCBleGl0KTsKLSAgfSBlbHNlIHsKLSAgICBDYWxsSW5zdDo6Q3JlYXRlKENMSUppdDo6bnVsbFBvaW50ZXJFeGNlcHRpb25MTFZNLCBhcmdzLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgIGFyZ3MuZW5kKCksICIiLCBleGl0KTsKLSAgICBuZXcgVW5yZWFjaGFibGVJbnN0KGdldEdsb2JhbENvbnRleHQoKSwgZXhpdCk7Ci0gIH0KLQotCi0gIGppdC0+Y3VycmVudEJsb2NrID0gY29udDsKLX0KLQotbGx2bTo6VmFsdWUqIENMSUppdDo6dmVyaWZ5QW5kQ29tcHV0ZVB0cihsbHZtOjpWYWx1ZSogb2JqLCBsbHZtOjpWYWx1ZSogaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OlR5cGUqIGFycmF5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB2ZXJpZikgewotICBKSVRWZXJpZnlOdWxsKG9iaik7Ci0gIAotICBpZiAoaW5kZXgtPmdldFR5cGUoKSAhPSBUeXBlOjpnZXRJbnQzMlR5KGdldEdsb2JhbENvbnRleHQoKSkpIHsKLSAgICBpbmRleCA9IGNoYW5nZVR5cGUoaW5kZXgsIFR5cGU6OmdldEludDMyVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSk7Ci0gIH0KLSAgCi0gIGlmICh0cnVlKSB7Ci0gICAgVmFsdWUqIHNpemUgPSBhcnJheVNpemUob2JqKTsKLSAgICAKLSAgICBWYWx1ZSogY21wID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX1NMVCwgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCAiIik7Ci0KLSAgICBCYXNpY0Jsb2NrKiBpZlRydWUgPSAgY3JlYXRlQmFzaWNCbG9jaygidHJ1ZSB2ZXJpZnlBbmRDb21wdXRlUHRyIik7Ci0gICAgQmFzaWNCbG9jayogaWZGYWxzZSA9IGNyZWF0ZUJhc2ljQmxvY2soImZhbHNlIHZlcmlmeUFuZENvbXB1dGVQdHIiKTsKLQotICAgIGJyYW5jaChjbXAsIGlmVHJ1ZSwgaWZGYWxzZSwgY3VycmVudEJsb2NrKTsKLSAgICAKLSAgICBzdGQ6OnZlY3RvcjxWYWx1ZSo+YXJnczsKLSAgICBhcmdzLnB1c2hfYmFjayhuZXcgQml0Q2FzdEluc3Qob2JqLCBWTU9iamVjdDo6bGx2bVR5cGUsICIiLCBpZkZhbHNlKSk7Ci0gICAgYXJncy5wdXNoX2JhY2soaW5kZXgpOwotICAgIGlmIChjdXJyZW50RXhjZXB0aW9uQmxvY2sgIT0gZW5kRXhjZXB0aW9uQmxvY2spIHsKLSAgICAgIEludm9rZUluc3Q6OkNyZWF0ZShDTElKaXQ6OmluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25MTFZNLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZpZWRVbnJlYWNoYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RXhjZXB0aW9uQmxvY2ssIGFyZ3MuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmVuZCgpLCAiIiwgaWZGYWxzZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIENhbGxJbnN0OjpDcmVhdGUoQ0xJSml0OjppbmRleE91dE9mQm91bmRzRXhjZXB0aW9uTExWTSwgYXJncy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgIGFyZ3MuZW5kKCksICIiLCBpZkZhbHNlKTsKLSAgICAgIG5ldyBVbnJlYWNoYWJsZUluc3QoZ2V0R2xvYmFsQ29udGV4dCgpLCBpZkZhbHNlKTsKLSAgICB9Ci0gIAotICAgIGN1cnJlbnRCbG9jayA9IGlmVHJ1ZTsKLSAgfQotICAKLSAgQ29uc3RhbnQqIHplcm8gPSBtb2R1bGUtPmNvbnN0YW50WmVybzsKLSAgVmFsdWUqIHZhbCA9IG5ldyBCaXRDYXN0SW5zdChvYmosIGFycmF5VHlwZSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIAotICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IGluZGV4ZXM7IC8vWzNdOwotICBpbmRleGVzLnB1c2hfYmFjayh6ZXJvKTsKLSAgaW5kZXhlcy5wdXNoX2JhY2soVk1BcnJheTo6ZWxlbWVudHNPZmZzZXQoKSk7Ci0gIGluZGV4ZXMucHVzaF9iYWNrKGluZGV4KTsKLSAgVmFsdWUqIHB0ciA9IEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUodmFsLCBpbmRleGVzLmJlZ2luKCksIGluZGV4ZXMuZW5kKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgY3VycmVudEJsb2NrKTsKLQotICByZXR1cm4gcHRyOwotCi19Ci0KLUNvbnN0YW50KiBWTUFycmF5OjpzaXplT2Zmc2V0KCkgewotICByZXR1cm4gVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5tb2R1bGUtPmNvbnN0YW50T25lOwotfQotCi1Db25zdGFudCogVk1BcnJheTo6ZWxlbWVudHNPZmZzZXQoKSB7Ci0gIHJldHVybiBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPm1vZHVsZS0+Y29uc3RhbnRUd287Ci19Ci0KLVZhbHVlKiBDTElKaXQ6OmFycmF5U2l6ZShWYWx1ZSogYXJyYXkpIHsKLSAgaWYgKGFycmF5LT5nZXRUeXBlKCkgIT0gVk1BcnJheTo6bGx2bVR5cGUpIHsKLSAgICBhcnJheSA9IG5ldyBCaXRDYXN0SW5zdChhcnJheSwgVk1BcnJheTo6bGx2bVR5cGUsICIiLCBjdXJyZW50QmxvY2spOwotICB9Ci0gIHJldHVybiBDYWxsSW5zdDo6Q3JlYXRlKGFycmF5TGVuZ3RoTExWTSwgYXJyYXksICIiLCBjdXJyZW50QmxvY2spOwotICAvKgotICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IGFyZ3M7IC8vc2l6ZT0gIDIKLSAgYXJncy5wdXNoX2JhY2sobW9kdWxlLT5jb25zdGFudFplcm8pOwotICBhcmdzLnB1c2hfYmFjayhWTUFycmF5OjpzaXplT2Zmc2V0KCkpOwotICBWYWx1ZSogcHRyID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShhcnJheSwgYXJncy5iZWdpbigpLCBhcmdzLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCBjdXJyZW50QmxvY2spOwotICByZXR1cm4gbmV3IExvYWRJbnN0KHB0ciwgIiIsIGN1cnJlbnRCbG9jayk7Ki8KLX0KLQotRnVuY3Rpb24qIENMSUppdDo6Y3JlYXRlRGVsZWdhdGUoKSB7Ci0gIEZ1bmN0aW9uKiBmdW5jID0gbGx2bUZ1bmN0aW9uID0gY29tcGlsaW5nTWV0aG9kLT5tZXRoUHRyOwotICBGdW5jdGlvbjo6YXJnX2l0ZXJhdG9yIGkgPSBmdW5jLT5hcmdfYmVnaW4oKSsrLCBlID0gZnVuYy0+YXJnX2VuZCgpOwotICBWYWx1ZSogb2JqID0gaSsrOwotICBWYWx1ZSogdGFyZ2V0ID0gaSsrOwotICBWYWx1ZSogaGFuZGxlID0gaSsrOwotICBhc3NlcnQoaSA9PSBlKTsKLSAgCi0gIEJhc2ljQmxvY2sqIGVudHJ5ID0gY3JlYXRlQmFzaWNCbG9jaygiZW50cnkiKTsKLSAgb2JqID0gbmV3IEJpdENhc3RJbnN0KG9iaiwgTVNDb3JsaWI6OnBEZWxlZ2F0ZS0+dmlydHVhbFR5cGUsICIiLCBlbnRyeSk7Ci0gIHN0ZDo6dmVjdG9yPFZhbHVlKj4gZWx0czsKLSAgZWx0cy5wdXNoX2JhY2sobW9kdWxlLT5jb25zdGFudFplcm8pOwotICBlbHRzLnB1c2hfYmFjayhtb2R1bGUtPmNvbnN0YW50T25lKTsKLSAgVmFsdWUqIHRhcmdldFB0ciA9IEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUob2JqLCBlbHRzLmJlZ2luKCksIGVsdHMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCBlbnRyeSk7Ci0gIAotICBlbHRzLnBvcF9iYWNrKCk7Ci0gIGVsdHMucHVzaF9iYWNrKG1vZHVsZS0+Y29uc3RhbnRUd28pOwotICBWYWx1ZSogaGFuZGxlUHRyID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShvYmosIGVsdHMuYmVnaW4oKSwgZWx0cy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIGVudHJ5KTsKLQotICBuZXcgU3RvcmVJbnN0KHRhcmdldCwgdGFyZ2V0UHRyLCBmYWxzZSwgZW50cnkpOyAKLSAgbmV3IFN0b3JlSW5zdChoYW5kbGUsIGhhbmRsZVB0ciwgZmFsc2UsIGVudHJ5KTsKLSAgUmV0dXJuSW5zdDo6Q3JlYXRlKGdldEdsb2JhbENvbnRleHQoKSwgZW50cnkpOwotICAKLSAgcmV0dXJuIGZ1bmM7Ci19Ci1GdW5jdGlvbiogQ0xJSml0OjppbnZva2VEZWxlZ2F0ZSgpIHsKLSAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gIHJldHVybiAwOwotfQotCi1GdW5jdGlvbiogQ0xJSml0Ojpjb21waWxlSW50ZXJuKCkgewotICBQUklOVF9ERUJVRyhOM19DT01QSUxFLCAxLCBDT0xPUl9OT1JNQUwsICJpbnRlcm4gY29tcGlsZSAlc1xuIiwKLSAgICAgICAgICAgICAgbXZtOjpQcmludEJ1ZmZlcihjb21waWxpbmdNZXRob2QpLmNTdHJpbmcoKSk7Ci0KLSAgaWYgKGNvbXBpbGluZ0NsYXNzLT5zdWJjbGFzc09mKE1TQ29ybGliOjpwRGVsZWdhdGUpKSB7Ci0gICAgY29uc3QgVVRGOCogbmFtZSA9IGNvbXBpbGluZ01ldGhvZC0+bmFtZTsKLSAgICBpZiAobmFtZSA9PSBOMzo6Y3Rvck5hbWUpIHJldHVybiBjcmVhdGVEZWxlZ2F0ZSgpOwotICAgIGVsc2UgaWYgKG5hbWUgPT0gTjM6Omludm9rZU5hbWUpIHJldHVybiBpbnZva2VEZWxlZ2F0ZSgpOwotICAgIGVsc2UgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gIH0gZWxzZSB7Ci0gICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lICVzIiwgbXZtOjpQcmludEJ1ZmZlcihjb21waWxpbmdDbGFzcykuY1N0cmluZygpKTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotRnVuY3Rpb24qIENMSUppdDo6Y29tcGlsZU5hdGl2ZShWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCkgewotICBQUklOVF9ERUJVRyhOM19DT01QSUxFLCAxLCBDT0xPUl9OT1JNQUwsICJuYXRpdmUgY29tcGlsZSAlc1xuIiwKLSAgICAgICAgICAgICAgbXZtOjpQcmludEJ1ZmZlcihjb21waWxpbmdNZXRob2QpLmNTdHJpbmcoKSk7Ci0gICAgCi0gIGNvbnN0IEZ1bmN0aW9uVHlwZSAqZnVuY1R5cGUgPSBjb21waWxpbmdNZXRob2QtPmdldFNpZ25hdHVyZShnZW5NZXRob2QpOwotICAKLSAgRnVuY3Rpb24qIGZ1bmMgPSBsbHZtRnVuY3Rpb24gPSBjb21waWxpbmdNZXRob2QtPm1ldGhQdHI7Ci0gIGN1cnJlbnRCbG9jayA9IGNyZWF0ZUJhc2ljQmxvY2soInN0YXJ0Iik7Ci0gIC8vIFRPRE8KLSAgLyplbmRFeGNlcHRpb25CbG9jayA9IGNyZWF0ZUJhc2ljQmxvY2soImV4Y2VwdGlvbkJsb2NrIik7Ci0gIGVuZEJsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygiZW5kIik7Ci0gIG5ldyBVbndpbmRJbnN0KGVuZEV4Y2VwdGlvbkJsb2NrKTsqLwotICAKLSAgdWludDMyIG5hcmdzID0gZnVuYy0+YXJnX3NpemUoKTsKLSAgc3RkOjp2ZWN0b3I8VmFsdWUqPiBuYXRpdmVBcmdzOwotICAKLSAgdWludDMyIGluZGV4ID0gMDsKLSAgZm9yIChGdW5jdGlvbjo6YXJnX2l0ZXJhdG9yIGkgPSBmdW5jLT5hcmdfYmVnaW4oKTsgCi0gICAgICAgaW5kZXggPCBuYXJnczsgKytpLCArK2luZGV4KSB7ICAgCi0gICAgbmF0aXZlQXJncy5wdXNoX2JhY2soaSk7Ci0gIH0KLQotICB2b2lkKiBuYXRQdHIgPSBOYXRpdmVVdGlsOjpuYXRpdmVMb29rdXAoY29tcGlsaW5nQ2xhc3MsIGNvbXBpbGluZ01ldGhvZCk7Ci0gIAotICBWYWx1ZSogdmFsUHRyID0gCi0gICAgQ29uc3RhbnRFeHByOjpnZXRJbnRUb1B0cihDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDY0VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgKHVpbnQ2NCluYXRQdHIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlclR5cGU6OmdldFVucXVhbChmdW5jVHlwZSkpOwotICAKLSAgVmFsdWUqIHJlc3VsdCA9IENhbGxJbnN0OjpDcmVhdGUodmFsUHRyLCBuYXRpdmVBcmdzLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUFyZ3MuZW5kKCksICIiLCBjdXJyZW50QmxvY2spOwotICAKLSAgCi0gIGlmIChyZXN1bHQtPmdldFR5cGUoKSAhPSBUeXBlOjpnZXRWb2lkVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSkKLSAgICBSZXR1cm5JbnN0OjpDcmVhdGUoZ2V0R2xvYmFsQ29udGV4dCgpLCByZXN1bHQsIGN1cnJlbnRCbG9jayk7Ci0gIGVsc2UKLSAgICBSZXR1cm5JbnN0OjpDcmVhdGUoZ2V0R2xvYmFsQ29udGV4dCgpLCBjdXJyZW50QmxvY2spOwotICAKLSAgCi0gIHJldHVybiBsbHZtRnVuY3Rpb247Ci19Ci0KLXVpbnQzMiBDTElKaXQ6OnJlYWRFeGNlcHRpb25UYWJsZSh1aW50MzIgb2Zmc2V0LCBib29sIGZhdCwgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCkgewotICBBc3NlbWJseSogYXNzID0gY29tcGlsaW5nQ2xhc3MtPmFzc2VtYmx5OwotICBCeXRlQ29kZSogYnl0ZXMgPSBhc3MtPmJ5dGVzOwotICB1aW50MzIgbmJlID0gMDsKLSAgaWYgKGZhdCkgewotICAgIG5iZSA9IChSRUFEX1UzKGJ5dGVzLCBvZmZzZXQpIC0gNCkgLyAyNDsKLSAgfSBlbHNlIHsKLSAgICBuYmUgPSAoUkVBRF9VMShieXRlcywgb2Zmc2V0KSAtIDQpIC8gMTI7Ci0gICAgUkVBRF9VMihieXRlcywgb2Zmc2V0KTsKLSAgfQotICAKLSAgIGlmIChuYmUpIHsKLSAgICBzdXBwbExvY2FsID0gbmV3IEFsbG9jYUluc3QoVk1PYmplY3Q6Omxsdm1UeXBlLCAiZXhjZXB0aW9uVmFyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgfQotICAKLSAgQmFzaWNCbG9jayogcmVhbEVuZEV4Y2VwdGlvbkJsb2NrID0gZW5kRXhjZXB0aW9uQmxvY2s7Ci0gIC8vIFRPRE8gc3luY2hyb25pemVkCi0KLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBuYmU7ICsraSkgewotICAgIEV4Y2VwdGlvbkJsb2NrRGVzYyogZXggPSBuZXcoYWxsb2NhdG9yLCAiRXhjZXB0aW9uQmxvY2tEZXNjIikgRXhjZXB0aW9uQmxvY2tEZXNjKCk7Ci0gICAgdWludDMyIGZsYWdzID0gMDsKLSAgICB1aW50MzIgY2xhc3NUb2tlbiA9IDA7Ci0gICAgaWYgKGZhdCkgewotICAgICAgZmxhZ3MgPSBSRUFEX1U0KGJ5dGVzLCBvZmZzZXQpOwotICAgICAgZXgtPnRyeU9mZnNldCA9IFJFQURfVTQoYnl0ZXMsIG9mZnNldCk7Ci0gICAgICBleC0+dHJ5TGVuZ3RoID0gUkVBRF9VNChieXRlcywgb2Zmc2V0KTsKLSAgICAgIGV4LT5oYW5kbGVyT2Zmc2V0ID0gUkVBRF9VNChieXRlcywgb2Zmc2V0KTsKLSAgICAgIGV4LT5oYW5kbGVyTGVuZ3RoID0gUkVBRF9VNChieXRlcywgb2Zmc2V0KTsKLSAgICAgIGNsYXNzVG9rZW4gPSBSRUFEX1U0KGJ5dGVzLCBvZmZzZXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBmbGFncyA9IFJFQURfVTIoYnl0ZXMsIG9mZnNldCk7Ci0gICAgICBleC0+dHJ5T2Zmc2V0ID0gUkVBRF9VMihieXRlcywgb2Zmc2V0KTsKLSAgICAgIGV4LT50cnlMZW5ndGggPSBSRUFEX1UxKGJ5dGVzLCBvZmZzZXQpOwotICAgICAgZXgtPmhhbmRsZXJPZmZzZXQgPSBSRUFEX1UyKGJ5dGVzLCBvZmZzZXQpOwotICAgICAgZXgtPmhhbmRsZXJMZW5ndGggPSBSRUFEX1UxKGJ5dGVzLCBvZmZzZXQpOwotICAgICAgY2xhc3NUb2tlbiA9IFJFQURfVTQoYnl0ZXMsIG9mZnNldCk7Ci0gICAgfQotICAgIAotICAgIGlmICghKG9wY29kZUluZm9zW2V4LT5oYW5kbGVyT2Zmc2V0XS5uZXdCbG9jaykpIHsKLSAgICAgIG9wY29kZUluZm9zW2V4LT5oYW5kbGVyT2Zmc2V0XS5uZXdCbG9jayA9IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlQmFzaWNCbG9jaygiaGFuZGxlckV4Y2VwdGlvbiIpOwotICAgIH0KLSAgICAKLSAgICBleC0+aGFuZGxlciA9IG9wY29kZUluZm9zW2V4LT5oYW5kbGVyT2Zmc2V0XS5uZXdCbG9jazsKLSAgICAKLSAgICBpZiAoZmxhZ3MgPT0gQ09OU1RBTlRfQ09SX0lMRVhDRVBUSU9OX0NMQVVTRV9FWENFUFRJT04pIHsKLSAgICAgIGV4LT50ZXN0ID0gY3JlYXRlQmFzaWNCbG9jaygidGVzdEV4Y2VwdGlvbiIpOwotICAgICAgaWYgKGNsYXNzVG9rZW4pIHsKLSAgICAgICAgZXgtPmNhdGNoQ2xhc3MgPSBhc3MtPmxvYWRUeXBlKChOMyopVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLCBjbGFzc1Rva2VuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGV4LT5jYXRjaENsYXNzID0gTVNDb3JsaWI6OnBFeGNlcHRpb247Ci0gICAgICB9Ci0gICAgICBvcGNvZGVJbmZvc1tleC0+aGFuZGxlck9mZnNldF0ucmVxU3VwcGwgPSB0cnVlOwotICAgICAgZXhjZXB0aW9ucy5wdXNoX2JhY2soZXgpOwotCi0gICAgICBmb3IgKHVpbnQxNiBpID0gZXgtPnRyeU9mZnNldDsgaSA8IGV4LT50cnlPZmZzZXQgKyBleC0+dHJ5TGVuZ3RoOyArK2kpIHsKLSAgICAgICAgaWYgKG9wY29kZUluZm9zW2ldLmV4Y2VwdGlvbkJsb2NrID09IGVuZEV4Y2VwdGlvbkJsb2NrKSB7Ci0gICAgICAgICAgb3Bjb2RlSW5mb3NbaV0uZXhjZXB0aW9uQmxvY2sgPSBleC0+dGVzdDsKLSAgICAgICAgfSAgICAKLSAgICAgIH0gIAotCi0gICAgfSBlbHNlIGlmIChmbGFncyA9PSBDT05TVEFOVF9DT1JfSUxFWENFUFRJT05fQ0xBVVNFX0ZJTkFMTFkpIHsKLSAgICAgIGV4LT5jYXRjaENsYXNzID0gMDsKLSAgICAgIGZpbmFsbHlIYW5kbGVycy5wdXNoX2JhY2soZXgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgICB9Ci0gIH0KLSAgCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKHN0ZDo6dmVjdG9yPEV4Y2VwdGlvbkJsb2NrRGVzYyo+OjppdGVyYXRvciBpID0gZXhjZXB0aW9ucy5iZWdpbigpLAotICAgIGUgPSBleGNlcHRpb25zLmVuZCgpOyBpIT0gZTsgKytpKSB7Ci0KLSAgICBFeGNlcHRpb25CbG9ja0Rlc2MqIGN1ciA9ICppOwotICAgIEV4Y2VwdGlvbkJsb2NrRGVzYyogbmV4dCA9IDA7Ci0gICAgaWYgKGkgKyAxICE9IGUpIHsKLSAgICAgIG5leHQgPSAqKGkgKyAxKTsKLSAgICB9Ci0KLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGN1ci0+cmVhbFRlc3QgPSBjcmVhdGVCYXNpY0Jsb2NrKCJyZWFsVGVzdEV4Y2VwdGlvbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBjdXItPnJlYWxUZXN0ID0gY3VyLT50ZXN0OwotICAgIH0KLSAgICAKLSAgICBpZiAobmV4dCAmJiBjdXItPnRyeU9mZnNldCA9PSBuZXh0LT50cnlPZmZzZXQgJiYgCi0gICAgICAgIGN1ci0+dHJ5T2Zmc2V0ICsgY3VyLT50cnlMZW5ndGggPT0gbmV4dC0+dHJ5T2Zmc2V0ICsgbmV4dC0+dHJ5TGVuZ3RoKQotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICBlbHNlCi0gICAgICBmaXJzdCA9IHRydWU7Ci0gICAgICAKLSAgfQotCi0gIGZvciAoc3RkOjp2ZWN0b3I8RXhjZXB0aW9uQmxvY2tEZXNjKj46Oml0ZXJhdG9yIGkgPSBleGNlcHRpb25zLmJlZ2luKCksCi0gICAgZSA9IGV4Y2VwdGlvbnMuZW5kKCk7IGkhPSBlOyArK2kpIHsKLQotICAgIEV4Y2VwdGlvbkJsb2NrRGVzYyogY3VyID0gKmk7Ci0gICAgRXhjZXB0aW9uQmxvY2tEZXNjKiBuZXh0ID0gMDsKLSAgICBCYXNpY0Jsb2NrKiBiYk5leHQgPSAwOwotICAgIGlmIChpICsgMSAhPSBlKSB7Ci0gICAgICBuZXh0ID0gKihpICsgMSk7Ci0gICAgICBpZiAoY3VyLT50cnlPZmZzZXQgPj0gbmV4dC0+dHJ5T2Zmc2V0ICYmIAotICAgICAgICAgIGN1ci0+dHJ5T2Zmc2V0ICsgY3VyLT50cnlMZW5ndGggPD0KLSAgICAgICAgICAgIG5leHQtPnRyeU9mZnNldCArIG5leHQtPnRyeUxlbmd0aCkgewotICAgICAgICBiYk5leHQgPSByZWFsRW5kRXhjZXB0aW9uQmxvY2s7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBiYk5leHQgPSBuZXh0LT5yZWFsVGVzdDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgYmJOZXh0ID0gcmVhbEVuZEV4Y2VwdGlvbkJsb2NrOwotICAgIH0KLQotICAgIGlmIChjdXItPnJlYWxUZXN0ICE9IGN1ci0+dGVzdCkgewotICAgICAgY29uc3QgUG9pbnRlclR5cGUqIFBvaW50ZXJUeV8wID0gbW9kdWxlLT5wdHJUeXBlOwotICAgICAgc3RkOjp2ZWN0b3I8VmFsdWUqPiBpbnQzMl9laF9zZWxlY3RfcGFyYW1zOwotICAgICAgSW5zdHJ1Y3Rpb24qIHB0cl9laF9wdHIgPSBDYWxsSW5zdDo6Q3JlYXRlKG1vZHVsZS0+bGx2bUdldEV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZWhfcHRyIiwgY3VyLT50ZXN0KTsKLSAgICAgIGludDMyX2VoX3NlbGVjdF9wYXJhbXMucHVzaF9iYWNrKHB0cl9laF9wdHIpOwotICAgICAgQ29uc3RhbnQqIEMgPSBDb25zdGFudEV4cHI6OmdldENhc3QoSW5zdHJ1Y3Rpb246OkJpdENhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUtPnBlcnNvbmFsaXR5LCBQb2ludGVyVHlfMCk7Ci0gICAgICBpbnQzMl9laF9zZWxlY3RfcGFyYW1zLnB1c2hfYmFjayhDKTsKLSAgICAgIGludDMyX2VoX3NlbGVjdF9wYXJhbXMucHVzaF9iYWNrKG1vZHVsZS0+Y29uc3RhbnRQdHJOdWxsKTsKLSAgICAgIENhbGxJbnN0OjpDcmVhdGUobW9kdWxlLT5leGNlcHRpb25TZWxlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfZWhfc2VsZWN0X3BhcmFtcy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl9laF9zZWxlY3RfcGFyYW1zLmVuZCgpLCAiZWhfc2VsZWN0IiwgY3VyLT50ZXN0KTsKLSAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShjdXItPnJlYWxUZXN0LCBjdXItPnRlc3QpOwotICAgIH0gCi0KLSAgICBWYWx1ZSogY2wgPSBuZXcgTG9hZEluc3QoY3VyLT5jYXRjaENsYXNzLT5sbHZtVmFyKCksICIiLCBjdXItPnJlYWxUZXN0KTsKLSAgICBWYWx1ZSogY21wID0gQ2FsbEluc3Q6OkNyZWF0ZShjb21wYXJlRXhjZXB0aW9uTExWTSwgY2wsICIiLCBjdXItPnJlYWxUZXN0KTsKLSAgICBCcmFuY2hJbnN0OjpDcmVhdGUoY3VyLT5oYW5kbGVyLCBiYk5leHQsIGNtcCwgY3VyLT5yZWFsVGVzdCk7Ci0gICAgCi0gICAgaWYgKGN1ci0+aGFuZGxlci0+ZW1wdHkoKSkgewotICAgICAgVmFsdWUqIGNwcCA9IENhbGxJbnN0OjpDcmVhdGUoZ2V0Q3BwRXhjZXB0aW9uTExWTSwgIiIsIGN1ci0+aGFuZGxlcik7Ci0gICAgICBWYWx1ZSogZXhjID0gQ2FsbEluc3Q6OkNyZWF0ZShnZXRDTElFeGNlcHRpb25MTFZNLCAiIiwgY3VyLT5oYW5kbGVyKTsKLSAgICAgIENhbGxJbnN0OjpDcmVhdGUoY2xlYXJFeGNlcHRpb25MTFZNLCAiIiwgY3VyLT5oYW5kbGVyKTsKLSAgICAgIENhbGxJbnN0OjpDcmVhdGUobW9kdWxlLT5leGNlcHRpb25CZWdpbkNhdGNoLCBjcHAsICJ0bXA4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgY3VyLT5oYW5kbGVyKTsKLSAgICAgIHN0ZDo6dmVjdG9yPFZhbHVlKj4gdm9pZF8yOF9wYXJhbXM7Ci0gICAgICBDYWxsSW5zdDo6Q3JlYXRlKG1vZHVsZS0+ZXhjZXB0aW9uRW5kQ2F0Y2gsIHZvaWRfMjhfcGFyYW1zLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgIHZvaWRfMjhfcGFyYW1zLmVuZCgpLCAiIiwgY3VyLT5oYW5kbGVyKTsKLSAgICAgIG5ldyBTdG9yZUluc3QoZXhjLCBzdXBwbExvY2FsLCBmYWxzZSwgY3VyLT5oYW5kbGVyKTsKLSAgICAgIAotICAgICAgZm9yICh1aW50MTYgaSA9IGN1ci0+dHJ5T2Zmc2V0OyBpIDwgY3VyLT50cnlPZmZzZXQgKyBjdXItPnRyeUxlbmd0aDsKLSAgICAgICAgICAgKytpKSB7Ci0gICAgICAgIG9wY29kZUluZm9zW2ldLmV4Y2VwdGlvbiA9IGV4YzsKLSAgICAgIH0gIAotICAgIH0gCi0gICAgIAotICB9Ci0KLSAgcmV0dXJuIG5iZTsKLQotfQotCi0jaWYgTjNfRVhFQ1VURSA+IDEKLXN0YXRpYyB2b2lkIHByaW50QXJncyhzdGQ6OnZlY3RvcjxsbHZtOjpWYWx1ZSo+IGFyZ3MsIEJhc2ljQmxvY2sqIGluc2VydEF0KSB7Ci0JTjMgKnZtID0gVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpOwotCi0gIGZvciAoc3RkOjp2ZWN0b3I8bGx2bTo6VmFsdWUqPjo6aXRlcmF0b3IgaSA9IGFyZ3MuYmVnaW4oKSwKLSAgICAgICBlID0gYXJncy5lbmQoKTsgaSE9IGU7ICsraSkgewotICAgIGxsdm06OlZhbHVlKiBhcmcgPSAqaTsKLSAgICBjb25zdCBsbHZtOjpUeXBlKiB0eXBlID0gYXJnLT5nZXRUeXBlKCk7Ci0gICAgaWYgKHR5cGUgPT0gVHlwZTo6Z2V0SW50OFR5KGdldEdsb2JhbENvbnRleHQoKSkgfHwgdHlwZSA9PSBUeXBlOjpnZXRJbnQxNlR5KGdldEdsb2JhbENvbnRleHQoKSkgfHwgdHlwZSA9PSBUeXBlOjpnZXRJbnQxVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSkgewotICAgICAgQ2FsbEluc3Q6OkNyZWF0ZSh2bS0+bW9kdWxlLT5wcmludEludExMVk0sIG5ldyBaRXh0SW5zdChhcmcsIFR5cGU6OmdldEludDMyVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgIiIsIGluc2VydEF0KSwgIiIsIGluc2VydEF0KTsKLSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVHlwZTo6Z2V0SW50MzJUeShnZXRHbG9iYWxDb250ZXh0KCkpKSB7Ci0gICAgICBDYWxsSW5zdDo6Q3JlYXRlKHZtLT5tb2R1bGUtPnByaW50SW50TExWTSwgYXJnLCAiIiwgaW5zZXJ0QXQpOwotICAgIH0gZWxzZSBpZiAodHlwZSA9PSBUeXBlOjpnZXRJbnQ2NFR5KGdldEdsb2JhbENvbnRleHQoKSkpIHsKLSAgICAgIENhbGxJbnN0OjpDcmVhdGUodm0tPm1vZHVsZS0+cHJpbnRMb25nTExWTSwgYXJnLCAiIiwgaW5zZXJ0QXQpOwotICAgIH0gZWxzZSBpZiAodHlwZSA9PSBUeXBlOjpnZXRGbG9hdFR5KGdldEdsb2JhbENvbnRleHQoKSkpIHsKLSAgICAgIENhbGxJbnN0OjpDcmVhdGUodm0tPm1vZHVsZS0+cHJpbnRGbG9hdExMVk0sIGFyZywgIiIsIGluc2VydEF0KTsKLSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVHlwZTo6Z2V0RG91YmxlVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSkgewotICAgICAgQ2FsbEluc3Q6OkNyZWF0ZSh2bS0+bW9kdWxlLT5wcmludERvdWJsZUxMVk0sIGFyZywgIiIsIGluc2VydEF0KTsKLSAgICB9IGVsc2UgewotICAgICAgQ2FsbEluc3Q6OkNyZWF0ZSh2bS0+bW9kdWxlLT5wcmludEludExMVk0sIG5ldyBQdHJUb0ludEluc3QoYXJnLCBUeXBlOjpnZXRJbnQzMlR5KGdldEdsb2JhbENvbnRleHQoKSksICIiLCBpbnNlcnRBdCksICIiLCBpbnNlcnRBdCk7Ci0gICAgfQotICB9Ci0KLX0KLSNlbmRpZgotCi1GdW5jdGlvbiogQ0xJSml0Ojpjb21waWxlRmF0T3JUaW55KFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgUFJJTlRfREVCVUcoTjNfQ09NUElMRSwgMSwgQ09MT1JfTk9STUFMLCAidGlueSBvciBmYXQgY29tcGlsZSAlc1xuIiwKLSAgICAgICAgICAgICAgbXZtOjpQcmludEJ1ZmZlcihjb21waWxpbmdNZXRob2QpLmNTdHJpbmcoKSk7Ci0gIHVpbnQzMiBvZmZzZXQgPSBjb21waWxpbmdNZXRob2QtPm9mZnNldEluVGV4dFNlY3Rpb247Ci0JQnl0ZUNvZGUqIGJ5dGVzID0gY29tcGlsaW5nQ2xhc3MtPmFzc2VtYmx5LT5ieXRlczsKLSAgdWludDggaGVhZGVyID0gUkVBRF9VMShieXRlcywgb2Zmc2V0KTsKLSAgYm9vbCB0aW55ID0gZmFsc2U7Ci0gIHVpbnQzMiBsb2NhbFZhclNpZyA9IDA7Ci0gIHVpbnQzMiBtYXhTdGFjayA9IDA7Ci0gIHVpbnQzMiBjb2RlTGVuID0gMDsKLSAgdWludDMyIG5iZSA9IDA7Ci0KLSAgaWYgKChoZWFkZXIgJiAzKSA9PSBDT05TVEFOVF9Db3JJTE1ldGhvZF9UaW55Rm9ybWF0KSB7Ci0gICAgdGlueSA9IHRydWU7Ci0gICAgY29kZUxlbiA9IChoZWFkZXIgJiAweGZmZmMpID4+IDI7Ci0gIH0gZWxzZSBpZiAoKGhlYWRlciAmIDMpICE9IENPTlNUQU5UX0NvcklMTWV0aG9kX0ZhdEZvcm1hdCkgewotICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoInVua25vd24gTWV0aG9kIEZvcm1hdCIpOwotICB9IGVsc2UgewotICAgIGhlYWRlciArPSAoUkVBRF9VMShieXRlcywgb2Zmc2V0KSA8PCA4KTsgLy9oZWFkZXIKLSAgICBtYXhTdGFjayA9IFJFQURfVTIoYnl0ZXMsIG9mZnNldCk7Ci0gICAgY29kZUxlbiA9IFJFQURfVTQoYnl0ZXMsIG9mZnNldCk7Ci0gICAgbG9jYWxWYXJTaWcgPSBSRUFEX1U0KGJ5dGVzLCBvZmZzZXQpOwotICB9Ci0gICAgCi0KLSAgLyogVE9ETyBTeW5jaHJvbml6ZQotICBib29sIHN5bmNocm8gPSBpc1N5bmNocm8oY29tcGlsaW5nTWV0aG9kLT5mbGFncyk7Ci0gICovCi0KLSAgY29uc3QgRnVuY3Rpb25UeXBlICpmdW5jVHlwZSA9IGNvbXBpbGluZ01ldGhvZC0+Z2V0U2lnbmF0dXJlKGdlbk1ldGhvZCk7Ci0gIAotICBGdW5jdGlvbiogZnVuYyA9IGxsdm1GdW5jdGlvbiA9IGNvbXBpbGluZ01ldGhvZC0+bWV0aFB0cjsKLSAgY3VycmVudEJsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygic3RhcnQiKTsKLSAgZW5kRXhjZXB0aW9uQmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJleGNlcHRpb25CbG9jayIpOwotICB1bmlmaWVkVW5yZWFjaGFibGUgPSBjcmVhdGVCYXNpY0Jsb2NrKCJ1bmlmaWVkVW5yZWFjaGFibGUiKTsgCi0gIAotCi0gIG9wY29kZUluZm9zID0gKE9waW5mbyopYWxsb2NhKGNvZGVMZW4gKiBzaXplb2YoT3BpbmZvKSk7Ci0gIG1lbXNldChvcGNvZGVJbmZvcywgMCwgY29kZUxlbiAqIHNpemVvZihPcGluZm8pKTsKLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBjb2RlTGVuOyArK2kpIHsKLSAgICBvcGNvZGVJbmZvc1tpXS5leGNlcHRpb25CbG9jayA9IGVuZEV4Y2VwdGlvbkJsb2NrOwotICB9Ci0gIAotICBpZiAoIXRpbnkpIHsKLSAgICBpZiAoaGVhZGVyICYgQ09OU1RBTlRfQ29ySUxNZXRob2RfTW9yZVNlY3RzKSB7Ci0gICAgICB1aW50MzIgZXhjcE9mZnNldCA9IDA7Ci0gICAgICBpZiAoKGNvZGVMZW4gJSA0KSA9PSAwKSB7Ci0gICAgICAgIGV4Y3BPZmZzZXQgPSBvZmZzZXQgKyBjb2RlTGVuOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZXhjcE9mZnNldCA9IG9mZnNldCArIGNvZGVMZW4gKyAoNCAtIChjb2RlTGVuICUgNCkpOwotICAgICAgfQotCi0gICAgICB1aW50OCBmbGFncyA9IFJFQURfVTEoYnl0ZXMsIGV4Y3BPZmZzZXQpOwotICAgICAgbmJlID0gcmVhZEV4Y2VwdGlvblRhYmxlKGV4Y3BPZmZzZXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICYgQ09OU1RBTlRfQ29ySUxNZXRob2RfU2VjdF9GYXRGb3JtYXQsIGdlbkNsYXNzLCBnZW5NZXRob2QpOwotICAgIH0KLSAgfQotCi0gIGZvciAoRnVuY3Rpb246OmFyZ19pdGVyYXRvciBpID0gZnVuYy0+YXJnX2JlZ2luKCksIGUgPSBmdW5jLT5hcmdfZW5kKCk7IAotICAgICAgIGkgIT0gZTsgKytpKSB7Ci0gICAgCi0gICAgY29uc3QgVHlwZSogY3VyID0gaS0+Z2V0VHlwZSgpOwotCi0gICAgQWxsb2NhSW5zdCogYWxsb2MgPSBuZXcgQWxsb2NhSW5zdChjdXIsICIiLCBjdXJyZW50QmxvY2spOwotICAgIG5ldyBTdG9yZUluc3QoaSwgYWxsb2MsIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgIGFyZ3VtZW50cy5wdXNoX2JhY2soYWxsb2MpOwotICB9IAotICAKLSAgaWYgKGxvY2FsVmFyU2lnKSB7Ci0gICAgc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+IHRlbXA7Ci0gICAgY29tcGlsaW5nQ2xhc3MtPmFzc2VtYmx5LT5yZWFkU2lnbmF0dXJlKGxvY2FsVmFyU2lnLCB0ZW1wLCBnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLQotICAgIGZvciAoc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+OjppdGVyYXRvciBpID0gdGVtcC5iZWdpbigpLCAKLSAgICAgICAgICAgIGUgPSB0ZW1wLmVuZCgpOyBpIT0gZTsgKytpKSB7Ci0gICAgICBWTUNvbW1vbkNsYXNzKiBjbCA9ICppOwotICAgICAgY2wtPnJlc29sdmVUeXBlKGZhbHNlLCBmYWxzZSwgZ2VuTWV0aG9kKTsKLSAgICAgIEFsbG9jYUluc3QqIGFsbG9jID0gbmV3IEFsbG9jYUluc3QoY2wtPm5hdHVyYWxUeXBlLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgIGlmIChjbC0+bmF0dXJhbFR5cGUtPmlzU2luZ2xlVmFsdWVUeXBlKCkpIHsKLSAgICAgICAgbmV3IFN0b3JlSW5zdChDb25zdGFudDo6Z2V0TnVsbFZhbHVlKGNsLT5uYXR1cmFsVHlwZSksIGFsbG9jLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdWludDY0IHNpemUgPSBtdm06Ok12bU1vZHVsZTo6Z2V0VHlwZVNpemUoY2wtPm5hdHVyYWxUeXBlKTsKLSAgICAgICAgCi0gICAgICAgIHN0ZDo6dmVjdG9yPFZhbHVlKj4gcGFyYW1zOwotICAgICAgICBwYXJhbXMucHVzaF9iYWNrKG5ldyBCaXRDYXN0SW5zdChhbGxvYywgbW9kdWxlLT5wdHJUeXBlLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKSk7Ci0gICAgICAgIHBhcmFtcy5wdXNoX2JhY2sobW9kdWxlLT5jb25zdGFudEludDhaZXJvKTsKLSAgICAgICAgcGFyYW1zLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgc2l6ZSkpOwotICAgICAgICBwYXJhbXMucHVzaF9iYWNrKG1vZHVsZS0+Y29uc3RhbnRaZXJvKTsKLSAgICAgICAgQ2FsbEluc3Q6OkNyZWF0ZShtb2R1bGUtPmxsdm1fbWVtc2V0X2kzMiwgcGFyYW1zLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmVuZCgpLCAiIiwgY3VycmVudEJsb2NrKTsKLQotICAgICAgfQotICAgICAgbG9jYWxzLnB1c2hfYmFjayhhbGxvYyk7Ci0gICAgfQotICB9Ci0KLSAgZXhwbG9yZU9wY29kZXMoJmNvbXBpbGluZ0NsYXNzLT5hc3NlbWJseS0+Ynl0ZXMtPmVsZW1lbnRzW29mZnNldF0sIGNvZGVMZW4pOyAKLSAKLSAgZW5kQmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJlbmQiKTsKLQotICBjb25zdCBUeXBlKiBlbmRUeXBlID0gZnVuY1R5cGUtPmdldFJldHVyblR5cGUoKTsgCi0gIGlmIChlbmRUeXBlICE9IFR5cGU6OmdldFZvaWRUeShnZXRHbG9iYWxDb250ZXh0KCkpKSB7Ci0gICAgZW5kTm9kZSA9IFBISU5vZGU6OkNyZWF0ZShlbmRUeXBlLCAiIiwgZW5kQmxvY2spOwotICB9IGVsc2UgaWYgKGNvbXBpbGluZ01ldGhvZC0+c3RydWN0UmV0dXJuKSB7Ci0gICAgY29uc3QgVHlwZSogbGFzdFR5cGUgPSAKLSAgICAgIGZ1bmNUeXBlLT5nZXRDb250YWluZWRUeXBlKGZ1bmNUeXBlLT5nZXROdW1Db250YWluZWRUeXBlcygpIC0gMSk7Ci0gICAgZW5kTm9kZSA9IFBISU5vZGU6OkNyZWF0ZShsYXN0VHlwZSwgIiIsIGVuZEJsb2NrKTsKLSAgfQotCi0gIGNvbXBpbGVPcGNvZGVzKCZjb21waWxpbmdDbGFzcy0+YXNzZW1ibHktPmJ5dGVzLT5lbGVtZW50c1tvZmZzZXRdLCBjb2RlTGVuLCBnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLSAgCi0gIGN1cnJlbnRCbG9jayA9IGVuZEJsb2NrOwotICBwcmVkX2l0ZXJhdG9yIFBJID0gcHJlZF9iZWdpbihlbmRCbG9jayk7Ci0gIHByZWRfaXRlcmF0b3IgUEUgPSBwcmVkX2VuZChlbmRCbG9jayk7Ci0gIGlmIChQSSA9PSBQRSkgewotICAgIGVuZEJsb2NrLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoZW5kVHlwZSAhPSBUeXBlOjpnZXRWb2lkVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSkgewotI2lmIE4zX0VYRUNVVEUgPiAxCi0gICAgICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IGFyZ3M7Ci0gICAgICBhcmdzLnB1c2hfYmFjayhlbmROb2RlKTsKLSAgICAgIHByaW50QXJncyhhcmdzLCBlbmRCbG9jayk7Ci0jZW5kaWYKLSAgICAgIFJldHVybkluc3Q6OkNyZWF0ZShnZXRHbG9iYWxDb250ZXh0KCksIGVuZE5vZGUsIGVuZEJsb2NrKTsKLSAgICB9IGVsc2UgaWYgKGNvbXBpbGluZ01ldGhvZC0+c3RydWN0UmV0dXJuKSB7Ci0gICAgICBjb25zdCBUeXBlKiBsYXN0VHlwZSA9IAotICAgICAgICBmdW5jVHlwZS0+Z2V0Q29udGFpbmVkVHlwZShmdW5jVHlwZS0+Z2V0TnVtQ29udGFpbmVkVHlwZXMoKSAtIDEpOwotICAgICAgdWludDY0IHNpemUgPSBtdm06Ok12bU1vZHVsZTo6Z2V0VHlwZVNpemUobGFzdFR5cGUtPmdldENvbnRhaW5lZFR5cGUoMCkpOwotICAgICAgVmFsdWUqIG9iaiA9IC0tbGx2bUZ1bmN0aW9uLT5hcmdfZW5kKCk7Ci0gICAgICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IHBhcmFtczsKLSAgICAgIHBhcmFtcy5wdXNoX2JhY2sobmV3IEJpdENhc3RJbnN0KG9iaiwgbW9kdWxlLT5wdHJUeXBlLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jaykpOwotICAgICAgcGFyYW1zLnB1c2hfYmFjayhuZXcgQml0Q2FzdEluc3QoZW5kTm9kZSwgbW9kdWxlLT5wdHJUeXBlLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jaykpOwotICAgICAgcGFyYW1zLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgc2l6ZSkpOwotICAgICAgcGFyYW1zLnB1c2hfYmFjayhtb2R1bGUtPmNvbnN0YW50Rm91cik7Ci0gICAgICBDYWxsSW5zdDo6Q3JlYXRlKG1vZHVsZS0+bGx2bV9tZW1jcHlfaTMyLCBwYXJhbXMuYmVnaW4oKSwgcGFyYW1zLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgIFJldHVybkluc3Q6OkNyZWF0ZShnZXRHbG9iYWxDb250ZXh0KCksIGN1cnJlbnRCbG9jayk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFJldHVybkluc3Q6OkNyZWF0ZShnZXRHbG9iYWxDb250ZXh0KCksIGVuZEJsb2NrKTsKLSAgICB9Ci0gIH0KLSAgCi0gIFBJID0gcHJlZF9iZWdpbihlbmRFeGNlcHRpb25CbG9jayk7Ci0gIFBFID0gcHJlZF9lbmQoZW5kRXhjZXB0aW9uQmxvY2spOwotICBpZiAoUEkgPT0gUEUpIHsKLSAgICBlbmRFeGNlcHRpb25CbG9jay0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gIH0gZWxzZSB7Ci0gICAgQ2FsbEluc3QqIHB0cl9laF9wdHIgPSBDYWxsSW5zdDo6Q3JlYXRlKGdldENwcEV4Y2VwdGlvbkxMVk0sICJlaF9wdHIiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRFeGNlcHRpb25CbG9jayk7Ci0gICAgQ2FsbEluc3Q6OkNyZWF0ZShtb2R1bGUtPnVud2luZFJlc3VtZSwgcHRyX2VoX3B0ciwgIiIsIGVuZEV4Y2VwdGlvbkJsb2NrKTsKLSAgICBuZXcgVW5yZWFjaGFibGVJbnN0KGdldEdsb2JhbENvbnRleHQoKSwgZW5kRXhjZXB0aW9uQmxvY2spOwotICB9Ci0gIAotICBQSSA9IHByZWRfYmVnaW4odW5pZmllZFVucmVhY2hhYmxlKTsKLSAgUEUgPSBwcmVkX2VuZCh1bmlmaWVkVW5yZWFjaGFibGUpOwotICBpZiAoUEkgPT0gUEUpIHsKLSAgICB1bmlmaWVkVW5yZWFjaGFibGUtPmVyYXNlRnJvbVBhcmVudCgpOwotICB9IGVsc2UgewotICAgIG5ldyBVbnJlYWNoYWJsZUluc3QoZ2V0R2xvYmFsQ29udGV4dCgpLCB1bmlmaWVkVW5yZWFjaGFibGUpOwotICB9Ci0gIAotICBtdm06Ok12bU1vZHVsZTo6cnVuUGFzc2VzKGxsdm1GdW5jdGlvbiwgVk1UaHJlYWQ6OmdldCgpLT5wZXJGdW5jdGlvblBhc3Nlcyk7Ci0gIAotICBpZiAobmJlID09IDAgJiYgY29kZUxlbiA8IDUwKSB7Ci0gICAgUFJJTlRfREVCVUcoTjNfQ09NUElMRSwgMSwgQ09MT1JfTk9STUFMLCAiJXMgY2FuIGJlIGlubGluZWRcbiIsCi0gICAgICAgICAgICAgICAgbXZtOjpQcmludEJ1ZmZlcihjb21waWxpbmdNZXRob2QpLmNTdHJpbmcoKSk7Ci0gICAgY29tcGlsaW5nTWV0aG9kLT5jYW5CZUlubGluZWQgPSB0cnVlOwotICB9Ci0gIAotICByZXR1cm4gbGx2bUZ1bmN0aW9uOwotfQotCi1JbnN0cnVjdGlvbiogQ0xJSml0OjppbmxpbmVDb21waWxlKEZ1bmN0aW9uKiBwYXJlbnRGdW5jdGlvbiwgQmFzaWNCbG9jayomIGN1ckJCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrKiBlbmRFeEJsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxWYWx1ZSo+JiBhcmdzLCBWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKSB7Ci0gIAotICBQUklOVF9ERUJVRyhOM19DT01QSUxFLCAxLCBDT0xPUl9OT1JNQUwsICJ0aW55IG9yIGZhdCBpbmxpbmUgY29tcGlsZSAlc1xuIiwKLSAgICAgICAgICAgICAgbXZtOjpQcmludEJ1ZmZlcihjb21waWxpbmdNZXRob2QpLmNTdHJpbmcoKSk7Ci0gIHVpbnQzMiBvZmZzZXQgPSBjb21waWxpbmdNZXRob2QtPm9mZnNldEluVGV4dFNlY3Rpb247Ci0gIEJ5dGVDb2RlKiBieXRlcyA9IGNvbXBpbGluZ0NsYXNzLT5hc3NlbWJseS0+Ynl0ZXM7Ci0gIHVpbnQ4IGhlYWRlciA9IFJFQURfVTEoYnl0ZXMsIG9mZnNldCk7Ci0gIGJvb2wgdGlueSA9IGZhbHNlOwotICB1aW50MzIgbG9jYWxWYXJTaWcgPSAwOwotICB1aW50MzIgbWF4U3RhY2sgPSAwOwotICB1aW50MzIgY29kZUxlbiA9IDA7Ci0gIAotICBpZiAoKGhlYWRlciAmIDMpID09IENPTlNUQU5UX0NvcklMTWV0aG9kX1RpbnlGb3JtYXQpIHsKLSAgICB0aW55ID0gdHJ1ZTsKLSAgICBjb2RlTGVuID0gKGhlYWRlciAmIDB4ZmZmYykgPj4gMjsKLSAgfSBlbHNlIGlmICgoaGVhZGVyICYgMykgIT0gQ09OU1RBTlRfQ29ySUxNZXRob2RfRmF0Rm9ybWF0KSB7Ci0gICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigidW5rbm93biBNZXRob2QgRm9ybWF0Iik7Ci0gIH0gZWxzZSB7Ci0gICAgaGVhZGVyICs9IChSRUFEX1UxKGJ5dGVzLCBvZmZzZXQpIDw8IDgpOyAvL2hlYWRlcgotICAgIG1heFN0YWNrID0gUkVBRF9VMihieXRlcywgb2Zmc2V0KTsKLSAgICBjb2RlTGVuID0gUkVBRF9VNChieXRlcywgb2Zmc2V0KTsKLSAgICBsb2NhbFZhclNpZyA9IFJFQURfVTQoYnl0ZXMsIG9mZnNldCk7Ci0gIH0KLSAgICAKLQotICAvKiBUT0RPIFN5bmNocm9uaXplCi0gIGJvb2wgc3luY2hybyA9IGlzU3luY2hybyhjb21waWxpbmdNZXRob2QtPmZsYWdzKTsKLSAgKi8KLQotICBjb25zdCBGdW5jdGlvblR5cGUgKmZ1bmNUeXBlID0gY29tcGlsaW5nTWV0aG9kLT5nZXRTaWduYXR1cmUoZ2VuTWV0aG9kKTsKLSAgCi0gIGxsdm1GdW5jdGlvbiA9IHBhcmVudEZ1bmN0aW9uOwotICBjdXJyZW50QmxvY2sgPSBjdXJCQjsKLSAgZW5kRXhjZXB0aW9uQmxvY2sgPSAwOyAKLSAgCi0KLSAgb3Bjb2RlSW5mb3MgPSAoT3BpbmZvKilhbGxvY2EoY29kZUxlbiAqIHNpemVvZihPcGluZm8pKTsKLSAgbWVtc2V0KG9wY29kZUluZm9zLCAwLCBjb2RlTGVuICogc2l6ZW9mKE9waW5mbykpOwotICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IGNvZGVMZW47ICsraSkgewotICAgIG9wY29kZUluZm9zW2ldLmV4Y2VwdGlvbkJsb2NrID0gZW5kRXhCbG9jazsKLSAgfQotICAKLSAgaWYgKCF0aW55KSB7Ci0gICAgaWYgKGhlYWRlciAmIENPTlNUQU5UX0NvcklMTWV0aG9kX01vcmVTZWN0cykgewotICAgICAgYXNzZXJ0KDAgJiYgImlubGluaW5nIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zISIpOwotICAgICAgdWludDMyIGV4Y3BPZmZzZXQgPSAwOwotICAgICAgaWYgKChjb2RlTGVuICUgNCkgPT0gMCkgewotICAgICAgICBleGNwT2Zmc2V0ID0gb2Zmc2V0ICsgY29kZUxlbjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGV4Y3BPZmZzZXQgPSBvZmZzZXQgKyBjb2RlTGVuICsgKDQgLSAoY29kZUxlbiAlIDQpKTsKLSAgICAgIH0KLQotICAgICAgdWludDggZmxhZ3MgPSBSRUFEX1UxKGJ5dGVzLCBleGNwT2Zmc2V0KTsKLSAgICAgIHJlYWRFeGNlcHRpb25UYWJsZShleGNwT2Zmc2V0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAmIENPTlNUQU5UX0NvcklMTWV0aG9kX1NlY3RfRmF0Rm9ybWF0LCBnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLSAgICB9Ci0gIH0KLQotICBmb3IgKHN0ZDo6dmVjdG9yPFZhbHVlKj46Oml0ZXJhdG9yIGkgPSBhcmdzLmJlZ2luKCksIGUgPSBhcmdzLmVuZCgpOyAKLSAgICAgICBpICE9IGU7ICsraSkgewotICAgIAotICAgIGNvbnN0IFR5cGUqIGN1ciA9ICgqaSktPmdldFR5cGUoKTsKLQotICAgIEFsbG9jYUluc3QqIGFsbG9jID0gbmV3IEFsbG9jYUluc3QoY3VyLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICBuZXcgU3RvcmVJbnN0KCppLCBhbGxvYywgZmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0gICAgYXJndW1lbnRzLnB1c2hfYmFjayhhbGxvYyk7Ci0gIH0gCi0KLSAgaWYgKGxvY2FsVmFyU2lnKSB7Ci0gICAgc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+IHRlbXA7Ci0gICAgY29tcGlsaW5nQ2xhc3MtPmFzc2VtYmx5LT5yZWFkU2lnbmF0dXJlKGxvY2FsVmFyU2lnLCB0ZW1wLCBnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLQotICAgIGZvciAoc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+OjppdGVyYXRvciBpID0gdGVtcC5iZWdpbigpLCAKLSAgICAgICAgICAgIGUgPSB0ZW1wLmVuZCgpOyBpIT0gZTsgKytpKSB7Ci0gICAgICBWTUNvbW1vbkNsYXNzKiBjbCA9ICppOwotICAgICAgY2wtPnJlc29sdmVUeXBlKGZhbHNlLCBmYWxzZSwgZ2VuTWV0aG9kKTsKLSAgICAgIEFsbG9jYUluc3QqIGFsbG9jID0gbmV3IEFsbG9jYUluc3QoY2wtPm5hdHVyYWxUeXBlLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgIGlmIChjbC0+bmF0dXJhbFR5cGUtPmlzU2luZ2xlVmFsdWVUeXBlKCkpIHsKLSAgICAgICAgbmV3IFN0b3JlSW5zdChDb25zdGFudDo6Z2V0TnVsbFZhbHVlKGNsLT5uYXR1cmFsVHlwZSksIGFsbG9jLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdWludDY0IHNpemUgPSBtdm06Ok12bU1vZHVsZTo6Z2V0VHlwZVNpemUoY2wtPm5hdHVyYWxUeXBlKTsKLSAgICAgICAgCi0gICAgICAgIHN0ZDo6dmVjdG9yPFZhbHVlKj4gcGFyYW1zOwotICAgICAgICBwYXJhbXMucHVzaF9iYWNrKG5ldyBCaXRDYXN0SW5zdChhbGxvYywgbW9kdWxlLT5wdHJUeXBlLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKSk7Ci0gICAgICAgIHBhcmFtcy5wdXNoX2JhY2sobW9kdWxlLT5jb25zdGFudEludDhaZXJvKTsKLSAgICAgICAgcGFyYW1zLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgc2l6ZSkpOwotICAgICAgICBwYXJhbXMucHVzaF9iYWNrKG1vZHVsZS0+Y29uc3RhbnRaZXJvKTsKLSAgICAgICAgQ2FsbEluc3Q6OkNyZWF0ZShtb2R1bGUtPmxsdm1fbWVtc2V0X2kzMiwgcGFyYW1zLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmVuZCgpLCAiIiwgY3VycmVudEJsb2NrKTsKLQotICAgICAgfQotICAgICAgbG9jYWxzLnB1c2hfYmFjayhhbGxvYyk7Ci0gICAgfQotICB9Ci0KLSAgZXhwbG9yZU9wY29kZXMoJmNvbXBpbGluZ0NsYXNzLT5hc3NlbWJseS0+Ynl0ZXMtPmVsZW1lbnRzW29mZnNldF0sIGNvZGVMZW4pOyAKLSAKLSAgZW5kQmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJlbmQiKTsKLQotICBjb25zdCBUeXBlKiBlbmRUeXBlID0gZnVuY1R5cGUtPmdldFJldHVyblR5cGUoKTsgCi0gIGlmIChlbmRUeXBlICE9IFR5cGU6OmdldFZvaWRUeShnZXRHbG9iYWxDb250ZXh0KCkpKSB7Ci0gICAgZW5kTm9kZSA9IFBISU5vZGU6OkNyZWF0ZShlbmRUeXBlLCAiIiwgZW5kQmxvY2spOwotICB9IGVsc2UgaWYgKGNvbXBpbGluZ01ldGhvZC0+c3RydWN0UmV0dXJuKSB7Ci0gICAgY29uc3QgVHlwZSogbGFzdFR5cGUgPSAKLSAgICAgIGZ1bmNUeXBlLT5nZXRDb250YWluZWRUeXBlKGZ1bmNUeXBlLT5nZXROdW1Db250YWluZWRUeXBlcygpIC0gMSk7Ci0gICAgZW5kTm9kZSA9IFBISU5vZGU6OkNyZWF0ZShsYXN0VHlwZSwgIiIsIGVuZEJsb2NrKTsKLSAgfQotCi0gIGNvbXBpbGVPcGNvZGVzKCZjb21waWxpbmdDbGFzcy0+YXNzZW1ibHktPmJ5dGVzLT5lbGVtZW50c1tvZmZzZXRdLCBjb2RlTGVuLCBnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLSAgCi0gIGN1ckJCID0gZW5kQmxvY2s7Ci0gIAotICBQUklOVF9ERUJVRyhOM19DT01QSUxFLCAxLCBDT0xPUl9OT1JNQUwsCi0gICAgICAgICAgICAgICJlbmQgdGlueSBvciBmYXQgaW5saW5lIGNvbXBpbGUgJXNcbiIsCi0gICAgICAgICAgICAgIG12bTo6UHJpbnRCdWZmZXIoY29tcGlsaW5nTWV0aG9kKS5jU3RyaW5nKCkpOwotICAKLSAgcmV0dXJuIGVuZE5vZGU7Ci19Ci0KLQotRnVuY3Rpb24qIENMSUppdDo6Y29tcGlsZShWTUNsYXNzKiBjbCwgVk1NZXRob2QqIG1ldGgpIHsKLQltdm06OkJ1bXBQdHJBbGxvY2F0b3IgKmEgPSBuZXcgbXZtOjpCdW1wUHRyQWxsb2NhdG9yKCk7Ci0gIENMSUppdCogaml0ID0gbmV3KCphLCAiQ0xJSml0IikgQ0xJSml0KCphKTsKLSAgaml0LT5jb21waWxpbmdDbGFzcyA9IGNsOyAKLSAgaml0LT5jb21waWxpbmdNZXRob2QgPSBtZXRoOwotICBqaXQtPm1vZHVsZSA9IGNsLT52bS0+bW9kdWxlOwotICBGdW5jdGlvbiogZnVuYzsKLSAgbWV0aC0+Z2V0U2lnbmF0dXJlKHN0YXRpY19jYXN0PFZNR2VuZXJpY01ldGhvZCo+KG1ldGgpKTsKLSAgCi0gIGlmIChpc0ludGVybmFsKG1ldGgtPmltcGxGbGFncykpIHsKLSAgICBmdW5jID0gaml0LT5jb21waWxlTmF0aXZlKHN0YXRpY19jYXN0PFZNR2VuZXJpY01ldGhvZCo+KG1ldGgpKTsKLSAgfSBlbHNlIGlmIChtZXRoLT5vZmZzZXRJblRleHRTZWN0aW9uID09IDApIHsKLSAgICBmdW5jID0gaml0LT5jb21waWxlSW50ZXJuKCk7Ci0gIH0gZWxzZSB7Ci0gICAgZnVuYyA9IGppdC0+Y29tcGlsZUZhdE9yVGlueShzdGF0aWNfY2FzdDxWTUdlbmVyaWNDbGFzcyo+KGNsKSwgc3RhdGljX2Nhc3Q8Vk1HZW5lcmljTWV0aG9kKj4obWV0aCkpOwotICB9Ci0KLQlkZWxldGUgYTsKLQkvLwlwcmludGYoIkNvbXBpbGluZzogJXNcbiIsIG12bTo6UHJpbnRCdWZmZXIobWV0aCkuY1N0cmluZygpKTsKLSAgcmV0dXJuIGZ1bmM7Ci19Ci0KLQotbGx2bTo6RnVuY3Rpb24gKlZNTWV0aG9kOjpjb21waWxlZFB0cihWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCkgewotICBpZiAobWV0aFB0ciAhPSAwKSByZXR1cm4gbWV0aFB0cjsKLSAgZWxzZSB7Ci0gICAgY2xhc3NEZWYtPmFxdWlyZSgpOwotICAgIGlmIChtZXRoUHRyID09IDApIHsKLSAgICAgIG1ldGhQdHIgPSBGdW5jdGlvbjo6Q3JlYXRlKGdldFNpZ25hdHVyZShnZW5NZXRob2QpLCBHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxXZWFrTGlua2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12bTo6UHJpbnRCdWZmZXIodGhpcykuY1N0cmluZygpLCBjbGFzc0RlZi0+dm0tPmdldExMVk1Nb2R1bGUoKSk7Ci0gICAgICBjbGFzc0RlZi0+dm0tPmZ1bmN0aW9ucy0+aGFzaChtZXRoUHRyLCB0aGlzKTsKLSAgICB9Ci0gICAgY2xhc3NEZWYtPnJlbGVhc2UoKTsKLSAgICByZXR1cm4gbWV0aFB0cjsKLSAgfQotfQotCi1WTU1ldGhvZCogQ0xJSml0OjpnZXRNZXRob2QobGx2bTo6RnVuY3Rpb24qIEYpIHsgCi0gIFZNTWV0aG9kKiBtZXRoID0gVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5mdW5jdGlvbnMtPmxvb2t1cChGKTsKLSAgcmV0dXJuIG1ldGg7Ci19Ci0KLXZvaWQgVk1GaWVsZDo6aW5pdEZpZWxkKFZNT2JqZWN0KiBvYmopIHsKLSAgVk1GaWVsZCogZmllbGQgPSB0aGlzOwotICBDb25zdGFudCogb2Zmc2V0ID0gZmllbGQtPm9mZnNldDsKLSAgY29uc3QgVGFyZ2V0RGF0YSogdGFyZ2V0RGF0YSA9IG12bTo6TXZtTW9kdWxlOjpleGVjdXRpb25FbmdpbmUtPmdldFRhcmdldERhdGEoKTsKLSAgYm9vbCBzdGF0ID0gaXNTdGF0aWMoZmllbGQtPmZsYWdzKTsKLSAgY29uc3QgVHlwZSogY2xUeXBlID0gc3RhdCA/IGZpZWxkLT5jbGFzc0RlZi0+c3RhdGljVHlwZSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+Y2xhc3NEZWYtPnZpcnR1YWxUeXBlOwotICAKLSAgY29uc3QgU3RydWN0TGF5b3V0KiBzbCA9Ci0gICAgdGFyZ2V0RGF0YS0+Z2V0U3RydWN0TGF5b3V0KChTdHJ1Y3RUeXBlKikoY2xUeXBlLT5nZXRDb250YWluZWRUeXBlKDApKSk7Ci0gIHVpbnQ2NCBwdHJPZmZzZXQgPSBzbC0+Z2V0RWxlbWVudE9mZnNldChkeW5fY2FzdDxDb25zdGFudEludD4ob2Zmc2V0KS0+Z2V0WkV4dFZhbHVlKCkpOwotICAKLSAgZmllbGQtPnB0ck9mZnNldCA9IHB0ck9mZnNldDsKLQotfQotCi12b2lkIENMSUppdDo6aW5pdGlhbGlzZSgpIHsKLX0KLQotdm9pZCBDTElKaXQ6OmluaXRpYWxpc2VBcHBEb21haW4oTjMqIHZtKSB7Ci0gIG12bTo6TXZtTW9kdWxlOjpwcm90ZWN0RW5naW5lLmxvY2soKTsKLSAgbXZtOjpNdm1Nb2R1bGU6OmV4ZWN1dGlvbkVuZ2luZS0+YWRkTW9kdWxlKHZtLT5nZXRMTFZNTW9kdWxlKCkpOwotICBtdm06Ok12bU1vZHVsZTo6cHJvdGVjdEVuZ2luZS51bmxvY2soKTsKLX0KLQotbmFtZXNwYWNlIG4zIHsgCi0gIG5hbWVzcGFjZSBsbHZtX3J1bnRpbWUgeyAKLSAgICAjaW5jbHVkZSAiTExWTVJ1bnRpbWUuaW5jIgotICB9Ci19Ci0KLQotdm9pZCBDTElKaXQ6OmluaXRpYWxpc2VCb290c3RyYXBWTShOMyogdm0pIHsKLSAgTW9kdWxlKiBtb2R1bGUgPSB2bS0+Z2V0TExWTU1vZHVsZSgpOwotICBtdm06Ok12bU1vZHVsZTo6cHJvdGVjdEVuZ2luZS5sb2NrKCk7Ci0gIG12bTo6TXZtTW9kdWxlOjpleGVjdXRpb25FbmdpbmUtPmFkZE1vZHVsZShtb2R1bGUpOwotICBtdm06Ok12bU1vZHVsZTo6cHJvdGVjdEVuZ2luZS51bmxvY2soKTsKLSAgICAKLSAgbjM6Omxsdm1fcnVudGltZTo6bWFrZUxMVk1Nb2R1bGVDb250ZW50cyhtb2R1bGUpOwotCi0gIFZNT2JqZWN0OjpsbHZtVHlwZSA9IAotICAgIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwobW9kdWxlLT5nZXRUeXBlQnlOYW1lKCJDTElPYmplY3QiKSk7Ci0gIFZNQXJyYXk6Omxsdm1UeXBlID0gCi0gICAgUG9pbnRlclR5cGU6OmdldFVucXVhbChtb2R1bGUtPmdldFR5cGVCeU5hbWUoIkNMSUFycmF5IikpOwotICBDYWNoZU5vZGU6Omxsdm1UeXBlID0gCi0gICAgUG9pbnRlclR5cGU6OmdldFVucXVhbChtb2R1bGUtPmdldFR5cGVCeU5hbWUoIkNhY2hlTm9kZSIpKTsKLSAgRW52ZWxvcHBlOjpsbHZtVHlwZSA9IAotICAgIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwobW9kdWxlLT5nZXRUeXBlQnlOYW1lKCJFbnZlbG9wcGUiKSk7Ci0KLSNkZWZpbmUgR0VUX0xMVk1fQVJSQVlfVFlQRShuYW1lLCB0eXBlKQkJCQkJCQkJCQkJCQkJCQlcCi0JQXJyYXkjI25hbWU6Omxsdm1UeXBlID0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLSAgICBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKG1vZHVsZS0+Z2V0VHlwZUJ5TmFtZSgiQXJyYXkiI25hbWUpKTsJCQlcCi0KLQlPTl9UWVBFUyhHRVRfTExWTV9BUlJBWV9UWVBFLCBfRl9OVCkKLQotI3VuZGVmIEdFVF9MTFZNX0FSUkFZX1RZUEUKLQotI2lmZGVmIFdJVEhfVFJBQ0VSCi0gIG1hcmtBbmRUcmFjZUxMVk0gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJNYXJrQW5kVHJhY2UiKTsKLSAgbWFya0FuZFRyYWNlTExWTVR5cGUgPSBtYXJrQW5kVHJhY2VMTFZNLT5nZXRGdW5jdGlvblR5cGUoKTsKLSAgdm1PYmplY3RUcmFjZXJMTFZNID0gbW9kdWxlLT5nZXRGdW5jdGlvbigiQ0xJT2JqZWN0VHJhY2VyIik7Ci0jZW5kaWYKLQotCi0gIGluaXRpYWxpc2VDbGFzc0xMVk0gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJpbml0aWFsaXNlQ2xhc3MiKTsKLSAgdmlydHVhbExvb2t1cExMVk0gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJuM1ZpcnR1YWxMb29rdXAiKTsKLQotICBhcnJheUNvbnNMTFZNID0gbW9kdWxlLT5nZXRGdW5jdGlvbigibmV3QXJyYXkiKTsKLSAgb2JqQ29uc0xMVk0gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJuZXdPYmplY3QiKTsKLSAgbmV3U3RyaW5nTExWTSA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oIm5ld1N0cmluZyIpOwotICBvYmpJbml0TExWTSA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oImluaXRpYWxpc2VPYmplY3QiKTsKLSAgYXJyYXlNdWx0aUNvbnNMTFZNID0gbW9kdWxlLT5nZXRGdW5jdGlvbigibmV3TXVsdGlBcnJheSIpOwotICBhcnJheUxlbmd0aExMVk0gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJhcnJheUxlbmd0aCIpOwotICBpbnN0YW5jZU9mTExWTSA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oIm4zSW5zdGFuY2VPZiIpOwotCi0gIG51bGxQb2ludGVyRXhjZXB0aW9uTExWTSA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oIm4zTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKLSAgY2xhc3NDYXN0RXhjZXB0aW9uTExWTSA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oIm4zQ2xhc3NDYXN0RXhjZXB0aW9uIik7Ci0gIGluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25MTFZNID0gbW9kdWxlLT5nZXRGdW5jdGlvbigiaW5kZXhPdXRPZkJvdW5kcyIpOwotCi0gIAotICB0aHJvd0V4Y2VwdGlvbkxMVk0gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJUaHJvd0V4Y2VwdGlvbiIpOwotICBjbGVhckV4Y2VwdGlvbkxMVk0gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJDbGVhckV4Y2VwdGlvbiIpOwotICBjb21wYXJlRXhjZXB0aW9uTExWTSA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oIkNvbXBhcmVFeGNlcHRpb24iKTsKLSAgZ2V0Q3BwRXhjZXB0aW9uTExWTSA9IG1vZHVsZS0+Z2V0RnVuY3Rpb24oIkdldENwcEV4Y2VwdGlvbiIpOwotICBnZXRDTElFeGNlcHRpb25MTFZNID0gbW9kdWxlLT5nZXRGdW5jdGlvbigiR2V0Q0xJRXhjZXB0aW9uIik7Ci0KLQotICBwcmludEV4ZWN1dGlvbkxMVk0gPSBtb2R1bGUtPmdldEZ1bmN0aW9uKCJuM1ByaW50RXhlY3V0aW9uIik7Ci0KLQotICAKLSAgY29uc3RhbnRWTU9iamVjdE51bGwgPSBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFZNT2JqZWN0OjpsbHZtVHlwZSk7Ci19Ci0KLUNvbnN0YW50KiBDTElKaXQ6OmNvbnN0YW50Vk1PYmplY3ROdWxsOwotCi0KLVZhbHVlKiBDTElKaXQ6Omludm9rZShWYWx1ZSAqRiwgc3RkOjp2ZWN0b3I8bGx2bTo6VmFsdWUqPiBhcmdzLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCwgYm9vbCBzdHJ1Y3RSZXR1cm4pIHsKLSNpZiBOM19FWEVDVVRFID4gMQotICBwcmludEFyZ3MoYXJncywgSW5zZXJ0QXRFbmQpOwotI2VuZGlmCi0KLSAgVmFsdWUqIHJldCA9IDA7Ci0gIGlmIChzdHJ1Y3RSZXR1cm4pIHsKLSAgICBjb25zdCBUeXBlKiBmdW5jVHlwZSA9IEYtPmdldFR5cGUoKTsKLSAgICBpZiAoaXNhPFBvaW50ZXJUeXBlPihmdW5jVHlwZSkpIHsKLSAgICAgIGZ1bmNUeXBlID0gZnVuY1R5cGUtPmdldENvbnRhaW5lZFR5cGUoMCk7Ci0gICAgfQotICAgIGNvbnN0IFR5cGUqIGxhc3RUeXBlID0gZnVuY1R5cGUtPmdldENvbnRhaW5lZFR5cGUoZnVuY1R5cGUtPmdldE51bUNvbnRhaW5lZFR5cGVzKCkgLSAxKTsKLSAgICByZXQgPSBuZXcgQWxsb2NhSW5zdChsYXN0VHlwZS0+Z2V0Q29udGFpbmVkVHlwZSgwKSwgIiIsIEluc2VydEF0RW5kKTsKLSAgICBhcmdzLnB1c2hfYmFjayhyZXQpOwotICB9Ci0gIFZhbHVlKiB2YWwgPSAwOwotICAvLyBtZWFuczogaXMgdGhlcmUgYSBoYW5kbGVyIGZvciBtZT8KLSAgaWYgKGN1cnJlbnRFeGNlcHRpb25CbG9jayAhPSBlbmRFeGNlcHRpb25CbG9jaykgewotICAgIEJhc2ljQmxvY2sqIGlmTm9ybWFsID0gY3JlYXRlQmFzaWNCbG9jaygibm8gZXhjZXB0aW9uIGJsb2NrIik7Ci0gICAgY3VycmVudEJsb2NrID0gaWZOb3JtYWw7Ci0gICAgdmFsID0gSW52b2tlSW5zdDo6Q3JlYXRlKEYsIGlmTm9ybWFsLCBjdXJyZW50RXhjZXB0aW9uQmxvY2ssIGFyZ3MuYmVnaW4oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5lbmQoKSwgTmFtZSwgSW5zZXJ0QXRFbmQpOwotICB9IGVsc2UgewotICAgIHZhbCA9IENhbGxJbnN0OjpDcmVhdGUoRiwgYXJncy5iZWdpbigpLCBhcmdzLmVuZCgpLCBOYW1lLCBJbnNlcnRBdEVuZCk7Ci0gIH0KLSAgaWYgKHJldCkgcmV0dXJuIHJldDsKLSAgZWxzZSByZXR1cm4gdmFsOwotfQotCi1WYWx1ZSogQ0xJSml0OjppbnZva2UoVmFsdWUgKkYsIFZhbHVlKiBhcmcxLCBjb25zdCBjaGFyKiBOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCwgYm9vbCBzdHJ1Y3RSZXR1cm4pIHsKLSAgCi0gIHN0ZDo6dmVjdG9yPFZhbHVlKj4gYXJnczsKLSAgYXJncy5wdXNoX2JhY2soYXJnMSk7Ci0jaWYgTjNfRVhFQ1VURSA+IDEKLSAgcHJpbnRBcmdzKGFyZ3MsIEluc2VydEF0RW5kKTsKLSNlbmRpZgotICBWYWx1ZSogcmV0ID0gMDsKLSAgaWYgKHN0cnVjdFJldHVybikgewotICAgIGNvbnN0IFR5cGUqIGZ1bmNUeXBlID0gRi0+Z2V0VHlwZSgpOwotICAgIGlmIChpc2E8UG9pbnRlclR5cGU+KGZ1bmNUeXBlKSkgewotICAgICAgZnVuY1R5cGUgPSBmdW5jVHlwZS0+Z2V0Q29udGFpbmVkVHlwZSgwKTsKLSAgICB9Ci0gICAgY29uc3QgVHlwZSogbGFzdFR5cGUgPSBmdW5jVHlwZS0+Z2V0Q29udGFpbmVkVHlwZShmdW5jVHlwZS0+Z2V0TnVtQ29udGFpbmVkVHlwZXMoKSAtIDEpOwotICAgIHJldCA9IG5ldyBBbGxvY2FJbnN0KGxhc3RUeXBlLT5nZXRDb250YWluZWRUeXBlKDApLCAiIiwgSW5zZXJ0QXRFbmQpOwotICAgIGFyZ3MucHVzaF9iYWNrKHJldCk7Ci0gIH0KLSAgCi0gIFZhbHVlKiB2YWwgPSAwOwotICAvLyBtZWFuczogaXMgdGhlcmUgYSBoYW5kbGVyIGZvciBtZT8KLSAgaWYgKGN1cnJlbnRFeGNlcHRpb25CbG9jayAhPSBlbmRFeGNlcHRpb25CbG9jaykgewotICAgIEJhc2ljQmxvY2sqIGlmTm9ybWFsID0gY3JlYXRlQmFzaWNCbG9jaygibm8gZXhjZXB0aW9uIGJsb2NrIik7Ci0gICAgY3VycmVudEJsb2NrID0gaWZOb3JtYWw7Ci0gICAgdmFsID0gSW52b2tlSW5zdDo6Q3JlYXRlKEYsIGlmTm9ybWFsLCBjdXJyZW50RXhjZXB0aW9uQmxvY2ssIGFyZ3MuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5lbmQoKSwgTmFtZSwgSW5zZXJ0QXRFbmQpOwotICB9IGVsc2UgewotICAgIHZhbCA9IENhbGxJbnN0OjpDcmVhdGUoRiwgYXJncy5iZWdpbigpLCBhcmdzLmVuZCgpLCBOYW1lLCBJbnNlcnRBdEVuZCk7Ci0gIH0KLSAgCi0gIGlmIChyZXQpIHJldHVybiByZXQ7Ci0gIGVsc2UgcmV0dXJuIHZhbDsgCi19Ci0KLVZhbHVlKiBDTElKaXQ6Omludm9rZShWYWx1ZSAqRiwgVmFsdWUqIGFyZzEsIFZhbHVlKiBhcmcyLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBOYW1lLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCwgCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RydWN0UmV0dXJuKSB7Ci0gIAotICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IGFyZ3M7Ci0gIGFyZ3MucHVzaF9iYWNrKGFyZzEpOwotICBhcmdzLnB1c2hfYmFjayhhcmcyKTsKLSNpZiBOM19FWEVDVVRFID4gMQotICBwcmludEFyZ3MoYXJncywgSW5zZXJ0QXRFbmQpOwotI2VuZGlmCi0gIAotICBWYWx1ZSogcmV0ID0gMDsKLSAgaWYgKHN0cnVjdFJldHVybikgewotICAgIGNvbnN0IFR5cGUqIGZ1bmNUeXBlID0gRi0+Z2V0VHlwZSgpOwotICAgIGlmIChpc2E8UG9pbnRlclR5cGU+KGZ1bmNUeXBlKSkgewotICAgICAgZnVuY1R5cGUgPSBmdW5jVHlwZS0+Z2V0Q29udGFpbmVkVHlwZSgwKTsKLSAgICB9Ci0gICAgY29uc3QgVHlwZSogbGFzdFR5cGUgPSBmdW5jVHlwZS0+Z2V0Q29udGFpbmVkVHlwZShmdW5jVHlwZS0+Z2V0TnVtQ29udGFpbmVkVHlwZXMoKSAtIDEpOwotICAgIHJldCA9IG5ldyBBbGxvY2FJbnN0KGxhc3RUeXBlLT5nZXRDb250YWluZWRUeXBlKDApLCAiIiwgSW5zZXJ0QXRFbmQpOwotICAgIGFyZ3MucHVzaF9iYWNrKHJldCk7Ci0gIH0KLQotICBWYWx1ZSogdmFsID0gMDsKLSAgLy8gbWVhbnM6IGlzIHRoZXJlIGEgaGFuZGxlciBmb3IgbWU/Ci0gIGlmIChjdXJyZW50RXhjZXB0aW9uQmxvY2sgIT0gZW5kRXhjZXB0aW9uQmxvY2spIHsKLSAgICBCYXNpY0Jsb2NrKiBpZk5vcm1hbCA9IGNyZWF0ZUJhc2ljQmxvY2soIm5vIGV4Y2VwdGlvbiBibG9jayIpOwotICAgIGN1cnJlbnRCbG9jayA9IGlmTm9ybWFsOwotICAgIHZhbCA9IEludm9rZUluc3Q6OkNyZWF0ZShGLCBpZk5vcm1hbCwgY3VycmVudEV4Y2VwdGlvbkJsb2NrLCBhcmdzLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5lbmQoKSwgTmFtZSwgSW5zZXJ0QXRFbmQpOwotICB9IGVsc2UgewotICAgIHZhbCA9IENhbGxJbnN0OjpDcmVhdGUoRiwgYXJncy5iZWdpbigpLCBhcmdzLmVuZCgpLCBOYW1lLCBJbnNlcnRBdEVuZCk7Ci0gIH0KLSAgaWYgKHJldCkgcmV0dXJuIHJldDsKLSAgZWxzZSByZXR1cm4gdmFsOyAKLX0KLQotVmFsdWUqIENMSUppdDo6aW52b2tlKFZhbHVlICpGLCBjb25zdCBjaGFyKiBOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCwgYm9vbCBzdHJ1Y3RSZXR1cm4pIHsKLSAgCi0gIHN0ZDo6dmVjdG9yPFZhbHVlKj4gYXJnczsKLSAgVmFsdWUqIHJldCA9IDA7Ci0gIGlmIChzdHJ1Y3RSZXR1cm4pIHsKLSAgICBjb25zdCBUeXBlKiBmdW5jVHlwZSA9IEYtPmdldFR5cGUoKTsKLSAgICBpZiAoaXNhPFBvaW50ZXJUeXBlPihmdW5jVHlwZSkpIHsKLSAgICAgIGZ1bmNUeXBlID0gZnVuY1R5cGUtPmdldENvbnRhaW5lZFR5cGUoMCk7Ci0gICAgfQotICAgIGNvbnN0IFR5cGUqIGxhc3RUeXBlID0gZnVuY1R5cGUtPmdldENvbnRhaW5lZFR5cGUoZnVuY1R5cGUtPmdldE51bUNvbnRhaW5lZFR5cGVzKCkgLSAxKTsKLSAgICByZXQgPSBuZXcgQWxsb2NhSW5zdChsYXN0VHlwZS0+Z2V0Q29udGFpbmVkVHlwZSgwKSwgIiIsIEluc2VydEF0RW5kKTsKLSAgICBhcmdzLnB1c2hfYmFjayhyZXQpOwotICB9Ci0KLSAgVmFsdWUqIHZhbCA9IDA7Ci0gIC8vIG1lYW5zOiBpcyB0aGVyZSBhIGhhbmRsZXIgZm9yIG1lPwotICBpZiAoY3VycmVudEV4Y2VwdGlvbkJsb2NrICE9IGVuZEV4Y2VwdGlvbkJsb2NrKSB7Ci0gICAgQmFzaWNCbG9jayogaWZOb3JtYWwgPSBjcmVhdGVCYXNpY0Jsb2NrKCJubyBleGNlcHRpb24gYmxvY2siKTsKLSAgICBjdXJyZW50QmxvY2sgPSBpZk5vcm1hbDsKLSAgICB2YWwgPSBJbnZva2VJbnN0OjpDcmVhdGUoRiwgaWZOb3JtYWwsIGN1cnJlbnRFeGNlcHRpb25CbG9jaywgYXJncy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuZW5kKCksIE5hbWUsIEluc2VydEF0RW5kKTsKLSAgfSBlbHNlIHsKLSAgICB2YWwgPSBDYWxsSW5zdDo6Q3JlYXRlKEYsIGFyZ3MuYmVnaW4oKSwgYXJncy5lbmQoKSwgTmFtZSwgSW5zZXJ0QXRFbmQpOwotICB9Ci0gIGlmIChyZXQpIHJldHVybiByZXQ7Ci0gIGVsc2UgcmV0dXJuIHZhbDsgCi19Ci0KLQotCi0KLW5hbWVzcGFjZSBtdm0gewotbGx2bTo6RnVuY3Rpb25QYXNzKiBjcmVhdGVFc2NhcGVBbmFseXNpc1Bhc3MobGx2bTo6RnVuY3Rpb24qLCBsbHZtOjpGdW5jdGlvbiopOwotbGx2bTo6RnVuY3Rpb25QYXNzKiBjcmVhdGVMb3dlckFycmF5TGVuZ3RoUGFzcygpOwotfQotCi0KLXN0YXRpYyB2b2lkIGFkZFBhc3MoRnVuY3Rpb25QYXNzTWFuYWdlciAqUE0sIFBhc3MgKlApIHsKLSAgLy8gQWRkIHRoZSBwYXNzIHRvIHRoZSBwYXNzIG1hbmFnZXIuLi4KLSAgUE0tPmFkZChQKTsKLX0KLQotdm9pZCBBZGRTdGFuZGFyZENvbXBpbGVQYXNzZXMoRnVuY3Rpb25QYXNzTWFuYWdlciAqUE0pIHsKLSAgbGx2bTo6TXV0ZXhHdWFyZCBsb2NrZWQobXZtOjpNdm1Nb2R1bGU6OmV4ZWN1dGlvbkVuZ2luZS0+bG9jayk7Ci0gIC8vIExMVk0gZG9lcyBub3QgYWxsb3cgY2FsbGluZyBmdW5jdGlvbnMgZnJvbSBvdGhlciBtb2R1bGVzIGluIHZlcmlmaWVyCi0gIC8vUE0tPmFkZChsbHZtOjpjcmVhdGVWZXJpZmllclBhc3MoKSk7ICAgICAgICAgICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgaW5wdXQgaXMgY29ycmVjdAotICAKLSAgYWRkUGFzcyhQTSwgY3JlYXRlQ0ZHU2ltcGxpZmljYXRpb25QYXNzKCkpOyAvLyBDbGVhbiB1cCBkaXNndXN0aW5nIGNvZGUKLSAgYWRkUGFzcyhQTSwgY3JlYXRlUHJvbW90ZU1lbW9yeVRvUmVnaXN0ZXJQYXNzKCkpOy8vIEtpbGwgdXNlbGVzcyBhbGxvY2FzCi0gIAotICBhZGRQYXNzKFBNLCBjcmVhdGVJbnN0cnVjdGlvbkNvbWJpbmluZ1Bhc3MoKSk7IC8vIENsZWFudXAgZm9yIHNjYWxhcnJlcGwuCi0gIGFkZFBhc3MoUE0sIGNyZWF0ZUp1bXBUaHJlYWRpbmdQYXNzKCkpOyAgICAgICAgLy8gVGhyZWFkIGp1bXBzLgotICBhZGRQYXNzKFBNLCBjcmVhdGVDRkdTaW1wbGlmaWNhdGlvblBhc3MoKSk7ICAgIC8vIE1lcmdlICYgcmVtb3ZlIEJCcwotICBhZGRQYXNzKFBNLCBjcmVhdGVTY2FsYXJSZXBsQWdncmVnYXRlc1Bhc3MoKSk7IC8vIEJyZWFrIHVwIGFnZ3JlZ2F0ZSBhbGxvY2FzCi0gIGFkZFBhc3MoUE0sIGNyZWF0ZUluc3RydWN0aW9uQ29tYmluaW5nUGFzcygpKTsgLy8gQ29tYmluZSBzaWxseSBzZXEncwotICAKLSAgYWRkUGFzcyhQTSwgY3JlYXRlQ0ZHU2ltcGxpZmljYXRpb25QYXNzKCkpOyAgICAvLyBNZXJnZSAmIHJlbW92ZSBCQnMKLSAgYWRkUGFzcyhQTSwgY3JlYXRlUmVhc3NvY2lhdGVQYXNzKCkpOyAgICAgICAgICAvLyBSZWFzc29jaWF0ZSBleHByZXNzaW9ucwotICBhZGRQYXNzKFBNLCBjcmVhdGVMSUNNUGFzcygpKTsgICAgICAgICAgICAgICAgIC8vIEhvaXN0IGxvb3AgaW52YXJpYW50cwotICAKLSAgYWRkUGFzcyhQTSwgY3JlYXRlTG9vcFVuc3dpdGNoUGFzcygpKTsgICAgICAgICAvLyBVbnN3aXRjaCBsb29wcy4KLSAgYWRkUGFzcyhQTSwgY3JlYXRlSW5kVmFyU2ltcGxpZnlQYXNzKCkpOyAgICAgICAvLyBDYW5vbmljYWxpemUgaW5kdmFycwotICBhZGRQYXNzKFBNLCBjcmVhdGVMb29wRGVsZXRpb25QYXNzKCkpOyAgICAgICAgIC8vIERlbGV0ZSBkZWFkIGxvb3BzCi0gIGFkZFBhc3MoUE0sIGNyZWF0ZUxvb3BVbnJvbGxQYXNzKCkpOyAgICAgICAgICAgLy8gVW5yb2xsIHNtYWxsIGxvb3BzKi8KLSAgYWRkUGFzcyhQTSwgY3JlYXRlSW5zdHJ1Y3Rpb25Db21iaW5pbmdQYXNzKCkpOyAvLyBDbGVhbiB1cCBhZnRlciB0aGUgdW5yb2xsZXIKLSAgYWRkUGFzcyhQTSwgY3JlYXRlR1ZOUGFzcygpKTsgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgcmVkdW5kYW5jaWVzCi0gIGFkZFBhc3MoUE0sIGNyZWF0ZVNDQ1BQYXNzKCkpOyAgICAgICAgICAgICAgICAgLy8gQ29uc3RhbnQgcHJvcCB3aXRoIFNDQ1AKLSAgYWRkUGFzcyhQTSwgY3JlYXRlQ0ZHU2ltcGxpZmljYXRpb25QYXNzKCkpOyAgICAvLyBNZXJnZSAmIHJlbW92ZSBCQnMKLSAKLSAgLy8gUnVuIGluc3Rjb21iaW5lIGFmdGVyIHJlZHVuZGFuY3kgZWxpbWluYXRpb24gdG8gZXhwbG9pdCBvcHBvcnR1bml0aWVzCi0gIC8vIG9wZW5lZCB1cCBieSB0aGVtLgotICBhZGRQYXNzKFBNLCBjcmVhdGVJbnN0cnVjdGlvbkNvbWJpbmluZ1Bhc3MoKSk7Ci0KLSAgYWRkUGFzcyhQTSwgY3JlYXRlRGVhZFN0b3JlRWxpbWluYXRpb25QYXNzKCkpOyAvLyBEZWxldGUgZGVhZCBzdG9yZXMKLSAgYWRkUGFzcyhQTSwgY3JlYXRlQWdncmVzc2l2ZURDRVBhc3MoKSk7ICAgICAgICAvLyBEZWxldGUgZGVhZCBpbnN0cnVjdGlvbnMKLSAgYWRkUGFzcyhQTSwgY3JlYXRlQ0ZHU2ltcGxpZmljYXRpb25QYXNzKCkpOyAgICAvLyBNZXJnZSAmIHJlbW92ZSBCQnMKLQotICBhZGRQYXNzKFBNLCBtdm06OmNyZWF0ZUxvd2VyQXJyYXlMZW5ndGhQYXNzKCkpOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL04zL1ZNQ29yZS9DTElKaXQuaCBiL3Zta2l0L2xpYi9OMy9WTUNvcmUvQ0xJSml0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZDY4ZTQuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL04zL1ZNQ29yZS9DTElKaXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5MyArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLS0gQ0xJSml0LmggLSBDTEkganVzdCBpbiB0aW1lIGNvbXBpbGVyIC0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjMKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIE4zX0NMSUppdF9ICi0jZGVmaW5lIE4zX0NMSUppdF9ICi0KLSNpbmNsdWRlICJtdm0vSklULmgiCi0jaW5jbHVkZSAibXZtL09iamVjdC5oIgotI2luY2x1ZGUgIm12bS9QcmludEJ1ZmZlci5oIgotI2luY2x1ZGUgIm12bS9UaHJlYWRzL0xvY2tzLmgiCi0KLSNpbmNsdWRlICJsbHZtL0Jhc2ljQmxvY2suaCIKLSNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgotI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKLSNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgotI2luY2x1ZGUgImxsdm0vUGFzc01hbmFnZXIuaCIKLSNpbmNsdWRlICJsbHZtL1R5cGUuaCIKLSNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9FeGVjdXRpb25FbmdpbmUuaCIKLSNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9HZW5lcmljVmFsdWUuaCIKLSNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCi0KLSNpbmNsdWRlICJ0eXBlcy5oIgotCi1uYW1lc3BhY2UgbjMgewotCi1jbGFzcyBDYWNoZU5vZGU7Ci1jbGFzcyBOMzsKLWNsYXNzIE4zTW9kdWxlUHJvdmlkZXI7Ci1jbGFzcyBWTUNsYXNzOwotY2xhc3MgVk1DbGFzc0FycmF5OwotY2xhc3MgVk1Db21tb25DbGFzczsKLWNsYXNzIFZNTWV0aG9kOwotY2xhc3MgVk1PYmplY3Q7Ci1jbGFzcyBWTUdlbmVyaWNDbGFzczsKLWNsYXNzIFZNR2VuZXJpY01ldGhvZDsKLWNsYXNzIE4zVmlydHVhbFRhYmxlOwotCi1jbGFzcyBFeGNlcHRpb25CbG9ja0Rlc2MgOiBwdWJsaWMgbXZtOjpQZXJtYW5lbnRPYmplY3QgewotcHVibGljOgotCXVpbnQzMiB0cnlPZmZzZXQ7Ci0JdWludDMyIHRyeUxlbmd0aDsKLQl1aW50MzIgaGFuZGxlck9mZnNldDsKLQl1aW50MzIgaGFuZGxlckxlbmd0aDsKLQlWTUNvbW1vbkNsYXNzKiBjYXRjaENsYXNzOwotCWxsdm06OkJhc2ljQmxvY2sqIHRlc3Q7Ci0JbGx2bTo6QmFzaWNCbG9jayogcmVhbFRlc3Q7Ci0JbGx2bTo6QmFzaWNCbG9jayogaGFuZGxlcjsKLQotCXZpcnR1YWwgdm9pZCBwcmludChtdm06OlByaW50QnVmZmVyKiBidWYpIGNvbnN0OwotfTsKLQotY2xhc3MgT3BpbmZvIHsKLXB1YmxpYzoKLSAgbGx2bTo6QmFzaWNCbG9jayogbmV3QmxvY2s7Ci0gIGxsdm06OkJhc2ljQmxvY2sqIGV4Y2VwdGlvbkJsb2NrOwotICBib29sIHJlcVN1cHBsOwotICBsbHZtOjpWYWx1ZSogZXhjZXB0aW9uOwotICAKLSAgdmlydHVhbCB2b2lkIHByaW50KG12bTo6UHJpbnRCdWZmZXIqIGJ1ZikgY29uc3QgewotICAgIGJ1Zi0+d3JpdGUoIk9waW5mbyIpOwotICB9Ci19OwotCi0KLWNsYXNzIENMSUppdCA6IHB1YmxpYyBtdm06OlBlcm1hbmVudE9iamVjdCB7Ci1wdWJsaWM6Ci0JbXZtOjpCdW1wUHRyQWxsb2NhdG9yICZhbGxvY2F0b3I7Ci0KLQlDTElKaXQobXZtOjpCdW1wUHRyQWxsb2NhdG9yICZhKSA6IGFsbG9jYXRvcihhKSB7fQotCi0gIHZpcnR1YWwgdm9pZCBwcmludChtdm06OlByaW50QnVmZmVyKiBidWYpIGNvbnN0IHsKLSAgICBidWYtPndyaXRlKCJDTElKaXQiKTsKLSAgfQotICAKLSAgc3RhdGljIGNvbnN0IGNoYXIqIE9wY29kZU5hbWVzWzB4RTFdOwotICBzdGF0aWMgY29uc3QgY2hhciogT3Bjb2RlTmFtZXNGRVsweDIzXTsKLQotICBzdGF0aWMgTjNWaXJ0dWFsVGFibGUqIG1ha2VWVChWTUNsYXNzKiBjbCwgYm9vbCBpc1N0YXRpYyk7Ci0gIHN0YXRpYyBOM1ZpcnR1YWxUYWJsZSogbWFrZUFycmF5VlQoVk1DbGFzc0FycmF5KiBjbCk7Ci0gIAotICBzdGF0aWMgdm9pZCBwcmludEV4ZWN1dGlvbihjaGFyKiwgbjM6OlZNTWV0aG9kKik7Ci0gIHZvaWQgY29tcGlsZU9wY29kZXModWludDgqLCB1aW50MzIsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpOwotICB2b2lkIGV4cGxvcmVPcGNvZGVzKHVpbnQ4KiwgdWludDMyKTsKLSAgCi0gIGxsdm06OkZ1bmN0aW9uKiBsbHZtRnVuY3Rpb247Ci0gIFZNTWV0aG9kKiBjb21waWxpbmdNZXRob2Q7Ci0gIFZNQ2xhc3MqIGNvbXBpbGluZ0NsYXNzOwotICBtdm06OkJhc2VJbnRyaW5zaWNzKiBtb2R1bGU7Ci0KLSAgc3RkOjp2ZWN0b3I8bGx2bTo6VmFsdWUqPiBhcmd1bWVudHM7Ci0gIHN0ZDo6dmVjdG9yPGxsdm06OlZhbHVlKj4gbG9jYWxzOwotICAKLSAgLy8gZW5kIGZ1bmN0aW9uCi0gIGxsdm06OkJhc2ljQmxvY2sqIGVuZEJsb2NrOwotICBsbHZtOjpQSElOb2RlKiBlbmROb2RlOwotCi0gIC8vIGJsb2NrIG1hbmlwdWxhdGlvbgotICBsbHZtOjpCYXNpY0Jsb2NrKiBjdXJyZW50QmxvY2s7Ci0gIGxsdm06OkJhc2ljQmxvY2sqIGNyZWF0ZUJhc2ljQmxvY2soY29uc3QgY2hhciogbmFtZSA9ICIiKTsKLSAgdm9pZCBzZXRDdXJyZW50QmxvY2sobGx2bTo6QmFzaWNCbG9jayogYmxvY2spOwotCi0gIC8vIGJyYW5jaGVzCi0gIHZvaWQgYnJhbmNoKGxsdm06OlZhbHVlKiB0ZXN0LCBsbHZtOjpCYXNpY0Jsb2NrKiBpZlRydWUsCi0gICAgICAgICAgICAgIGxsdm06OkJhc2ljQmxvY2sqIGlmRmFsc2UsIGxsdm06OkJhc2ljQmxvY2sqIGluc2VydCk7Ci0gIHZvaWQgYnJhbmNoKGxsdm06OkJhc2ljQmxvY2sqIHdoZXJlLCBsbHZtOjpCYXNpY0Jsb2NrKiBpbnNlcnQpOwotICAgCi0gIC8vIHN0YWNrIG1hbmlwdWxhdGlvbgotICBzdGQ6OnZlY3RvcjxsbHZtOjpWYWx1ZSo+IHN0YWNrOwotICB2b2lkIHB1c2gobGx2bTo6VmFsdWUqKTsKLSAgbGx2bTo6VmFsdWUqIHBvcCgpOwotICBsbHZtOjpWYWx1ZSogdG9wKCk7Ci0gIAotICAvLyBleGNlcHRpb25zCi0gIGxsdm06OkJhc2ljQmxvY2sqICAgICAgICAgICAgICAgIGVuZEV4Y2VwdGlvbkJsb2NrOwotICBsbHZtOjpCYXNpY0Jsb2NrKiAgICAgICAgICAgICAgICBjdXJyZW50RXhjZXB0aW9uQmxvY2s7Ci0gIGxsdm06OkJhc2ljQmxvY2sqICAgICAgICAgICAgICAgIHVuaWZpZWRVbnJlYWNoYWJsZTsKLSAgc3RkOjp2ZWN0b3I8RXhjZXB0aW9uQmxvY2tEZXNjKj4gZXhjZXB0aW9uczsKLSAgc3RkOjp2ZWN0b3I8RXhjZXB0aW9uQmxvY2tEZXNjKj4gZmluYWxseUhhbmRsZXJzOwotCi0gIHVpbnQzMiByZWFkRXhjZXB0aW9uVGFibGUodWludDMyIG9mZnNldCwgYm9vbCBmYXQsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpOwotICBzdGQ6OnZlY3RvcjxsbHZtOjpCYXNpY0Jsb2NrKj4gICBsZWF2ZXM7IAotICBsbHZtOjpWYWx1ZSogc3VwcGxMb2NhbDsKLQotICAvLyBjYWxscwotICB2b2lkIGludm9rZSh1aW50MzIgdmFsdWUsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpOwotICB2b2lkIGludm9rZUludGVyZmFjZU9yVmlydHVhbCh1aW50MzIgdmFsdWUsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpOwotICB2b2lkIGludm9rZU5ldyh1aW50MzIgdmFsdWUsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpOwotICBsbHZtOjpWYWx1ZSogZ2V0VmlydHVhbEZpZWxkKHVpbnQzMiB2YWx1ZSwgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCk7Ci0gIGxsdm06OlZhbHVlKiBnZXRTdGF0aWNGaWVsZCh1aW50MzIgdmFsdWUsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpOwotICB2b2lkIHNldFZpcnR1YWxGaWVsZCh1aW50MzIgdmFsdWUsIGJvb2wgaXNWb2xhdGlsZSwgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCk7Ci0gIHZvaWQgc2V0U3RhdGljRmllbGQodWludDMyIHZhbHVlLCBib29sIGlzVm9sYXRpbGUsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpOwotCi0gIHZvaWQgSklUVmVyaWZ5TnVsbChsbHZtOjpWYWx1ZSogb2JqKTsKLSAgCi0gIC8vIGFycmF5IG1hbmlwdWxhdGlvbgotICBsbHZtOjpWYWx1ZSogdmVyaWZ5QW5kQ29tcHV0ZVB0cihsbHZtOjpWYWx1ZSogb2JqLCBsbHZtOjpWYWx1ZSogaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OlR5cGUqIGFycmF5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB2ZXJpZiA9IHRydWUpOwotICBsbHZtOjpWYWx1ZSogYXJyYXlTaXplKGxsdm06OlZhbHVlKiBvYmopOwotCi0gIE9waW5mbyogb3Bjb2RlSW5mb3M7Ci0KLSAgc3RhdGljIGxsdm06OkZ1bmN0aW9uKiBwcmludEV4ZWN1dGlvbkxMVk07Ci0gIHN0YXRpYyBsbHZtOjpGdW5jdGlvbiogaW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbkxMVk07Ci0gIHN0YXRpYyBsbHZtOjpGdW5jdGlvbiogbnVsbFBvaW50ZXJFeGNlcHRpb25MTFZNOwotICBzdGF0aWMgbGx2bTo6RnVuY3Rpb24qIGluaXRpYWxpc2VDbGFzc0xMVk07Ci0gIHN0YXRpYyBsbHZtOjpGdW5jdGlvbiogdGhyb3dFeGNlcHRpb25MTFZNOwotICBzdGF0aWMgbGx2bTo6RnVuY3Rpb24qIGNsZWFyRXhjZXB0aW9uTExWTTsKLSAgc3RhdGljIGxsdm06OkZ1bmN0aW9uKiBjb21wYXJlRXhjZXB0aW9uTExWTTsKLSAgc3RhdGljIGxsdm06OkZ1bmN0aW9uKiBjbGFzc0Nhc3RFeGNlcHRpb25MTFZNOwotICBzdGF0aWMgbGx2bTo6RnVuY3Rpb24qIG5ld1N0cmluZ0xMVk07Ci0gIHN0YXRpYyBsbHZtOjpGdW5jdGlvbiogYXJyYXlMZW5ndGhMTFZNOwotCi0gIHN0YXRpYyBsbHZtOjpGdW5jdGlvbiogY29tcGlsZShWTUNsYXNzKiBjbCwgVk1NZXRob2QqIG1ldGgpOwotCi0jaWZkZWYgV0lUSF9UUkFDRVIKLSAgc3RhdGljIGxsdm06OkZ1bmN0aW9uKiBtYXJrQW5kVHJhY2VMTFZNOwotICBzdGF0aWMgY29uc3QgbGx2bTo6RnVuY3Rpb25UeXBlKiBtYXJrQW5kVHJhY2VMTFZNVHlwZTsKLSNlbmRpZgotICBzdGF0aWMgbGx2bTo6RnVuY3Rpb24qIHZtT2JqZWN0VHJhY2VyTExWTTsKLSAgc3RhdGljIGxsdm06OkZ1bmN0aW9uKiBhcnJheUNvbnNMTFZNOwotICBzdGF0aWMgbGx2bTo6RnVuY3Rpb24qIGFycmF5TXVsdGlDb25zTExWTTsKLSAgc3RhdGljIGxsdm06OkZ1bmN0aW9uKiBvYmpDb25zTExWTTsKLSAgc3RhdGljIGxsdm06OkZ1bmN0aW9uKiBvYmpJbml0TExWTTsKLSAgc3RhdGljIGxsdm06OkZ1bmN0aW9uKiBpbnN0YW5jZU9mTExWTTsKLSAgc3RhdGljIGxsdm06OkZ1bmN0aW9uKiBnZXRDcHBFeGNlcHRpb25MTFZNOwotICBzdGF0aWMgbGx2bTo6RnVuY3Rpb24qIGdldENMSUV4Y2VwdGlvbkxMVk07Ci0gIAotICBzdGF0aWMgdm9pZCBpbml0aWFsaXNlKCk7Ci0gIHN0YXRpYyB2b2lkIGluaXRpYWxpc2VBcHBEb21haW4oTjMqIHZtKTsKLSAgc3RhdGljIHZvaWQgaW5pdGlhbGlzZUJvb3RzdHJhcFZNKE4zKiB2bSk7Ci0KLSAgbGx2bTo6RnVuY3Rpb24qIGNvbXBpbGVOYXRpdmUoVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpOwotICBsbHZtOjpGdW5jdGlvbiogY29tcGlsZUZhdE9yVGlueShWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKTsKLSAgbGx2bTo6RnVuY3Rpb24qIGNvbXBpbGVJbnRlcm4oKTsKLQotICBsbHZtOjpGdW5jdGlvbiogY3JlYXRlRGVsZWdhdGUoKTsKLSAgbGx2bTo6RnVuY3Rpb24qIGludm9rZURlbGVnYXRlKCk7Ci0KLSAgbGx2bTo6VmFsdWUqIGludm9rZShsbHZtOjpWYWx1ZSAqRiwgc3RkOjp2ZWN0b3I8bGx2bTo6VmFsdWUqPiBhcmdzLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgbGx2bTo6QmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQsIGJvb2wgc3RydWN0UmV0dXJuKTsKLSAgLy8gQWx0ZXJuYXRlIENhbGxJbnN0IGN0b3JzIHcvIHR3byBhY3R1YWxzLCB3LyBvbmUgYWN0dWFsIGFuZCBubwotICAvLyBhY3R1YWxzLCByZXNwZWN0aXZlbHkuCi0gIGxsdm06OlZhbHVlKiBpbnZva2UobGx2bTo6VmFsdWUgKkYsIGxsdm06OlZhbHVlICpBY3R1YWwxLAotICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpBY3R1YWwyLCBjb25zdCBjaGFyKiBOYW1lLAotICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkJhc2ljQmxvY2sgKkluc2VydEF0RW5kLCBib29sIHN0cnVjdFJldHVybik7Ci0gIGxsdm06OlZhbHVlKiBpbnZva2UobGx2bTo6VmFsdWUgKkYsIGxsdm06OlZhbHVlICpBY3R1YWwxLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIE5hbWUsIGxsdm06OkJhc2ljQmxvY2sgKkluc2VydEF0RW5kLAotICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RydWN0UmV0dXJuKTsKLSAgbGx2bTo6VmFsdWUqIGludm9rZShsbHZtOjpWYWx1ZSAqRiwgY29uc3QgY2hhciogTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCwgYm9vbCBzdHJ1Y3RSZXR1cm4pOwotICAKLSAgdm9pZCBtYWtlQXJncyhjb25zdCBsbHZtOjpGdW5jdGlvblR5cGUqIHR5cGUsIAotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGxsdm06OlZhbHVlKj4mIEFyZ3MsIGJvb2wgc3RydWN0UmV0dXJuKTsKLSAgbGx2bTo6VmFsdWUqIGNoYW5nZVR5cGUobGx2bTo6VmFsdWUqIHZhbCwgY29uc3QgbGx2bTo6VHlwZSogdHlwZSk7Ci0gIAotICBzdGF0aWMgbGx2bTo6RnVuY3Rpb24qIHZpcnR1YWxMb29rdXBMTFZNOwotCi0gIGxsdm06Okluc3RydWN0aW9uKiBsb3dlck1hdGhPcHMoVk1NZXRob2QqIG1ldGgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGxsdm06OlZhbHVlKj4mIGFyZ3MpOwotCi0gIHN0YXRpYyBsbHZtOjpDb25zdGFudCogY29uc3RhbnRWTU9iamVjdE51bGw7Ci0KLSAgbGx2bTo6SW5zdHJ1Y3Rpb24qIGlubGluZUNvbXBpbGUobGx2bTo6RnVuY3Rpb24qIHBhcmVudEZ1bmN0aW9uLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6QmFzaWNCbG9jayomIGN1ckJCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpCYXNpY0Jsb2NrKiBlbmRFeEJsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxsbHZtOjpWYWx1ZSo+JiBhcmdzLCBWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKTsKLQotICBzdGQ6Om1hcDxWTU1ldGhvZCosIGJvb2w+IGlubGluZU1ldGhvZHM7Ci0KLSAgbGx2bTo6SW5zdHJ1Y3Rpb24qIGludm9rZUlubGluZShWTU1ldGhvZCogbWV0aCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bGx2bTo6VmFsdWUqPiYgYXJncywgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCk7Ci0KLSAgc3RhdGljIFZNTWV0aG9kKiBnZXRNZXRob2QobGx2bTo6RnVuY3Rpb24qIEYpOwotfTsKLQotZW51bSBPcGNvZGUgewotICBOT1AgPSAweDAwLAotICBCUkVBSyA9IDB4MDEsCi0gIExEQVJHXzAgPSAweDAyLAotICBMREFSR18xID0gMHgwMywKLSAgTERBUkdfMiA9IDB4MDQsCi0gIExEQVJHXzMgPSAweDA1LAotICBMRExPQ18wID0gMHgwNiwKLSAgTERMT0NfMSA9IDB4MDcsCi0gIExETE9DXzIgPSAweDA4LAotICBMRExPQ18zID0gMHgwOSwKLSAgU1RMT0NfMCA9IDB4MEEsCi0gIFNUTE9DXzEgPSAweDBCLAotICBTVExPQ18yID0gMHgwQywKLSAgU1RMT0NfMyA9IDB4MEQsCi0gIExEQVJHX1MgPSAweDBFLAotICBMREFSR0FfUyA9IDB4MEYsCi0gIFNUQVJHX1MgPSAweDEwLAotICBMRExPQ19TID0gMHgxMSwKLSAgTERMT0NBX1MgPSAweDEyLAotICBTVExPQ19TID0gMHgxMywKLSAgTEROVUxMID0gMHgxNCwKLSAgTERDX0k0X00xID0gMHgxNSwKLSAgTERDX0k0XzAgPSAweDE2LAotICBMRENfSTRfMSA9IDB4MTcsCi0gIExEQ19JNF8yID0gMHgxOCwKLSAgTERDX0k0XzMgPSAweDE5LAotICBMRENfSTRfNCA9IDB4MUEsCi0gIExEQ19JNF81ID0gMHgxQiwKLSAgTERDX0k0XzYgPSAweDFDLAotICBMRENfSTRfNyA9IDB4MUQsCi0gIExEQ19JNF84ID0gMHgxRSwKLSAgTERDX0k0X1MgPSAweDFGLAotICBMRENfSTQgPSAweDIwLAotICBMRENfSTggPSAweDIxLAotICBMRENfUjQgPSAweDIyLAotICBMRENfUjggPSAweDIzLAotICBVTlVTRUQ5OSA9IDB4MjQsCi0gIERVUCA9IDB4MjUsCi0gIFBPUCA9IDB4MjYsCi0gIEpNUCA9IDB4MjcsCi0gIENBTEwgPSAweDI4LAotICBDQUxMSSA9IDB4MjksCi0gIFJFVCA9IDB4MkEsCi0gIEJSX1MgPSAweDJCLAotICBCUkZBTFNFX1MgPSAweDJDLAotICBCUlRSVUVfUyA9IDB4MkQsCi0gIEJFUV9TID0gMHgyRSwKLSAgQkdFX1MgPSAweDJGLAotICBCR1RfUyA9IDB4MzAsCi0gIEJMRV9TID0gMHgzMSwKLSAgQkxUX1MgPSAweDMyLAotICBCTkVfVU5fUyA9IDB4MzMsCi0gIEJHRV9VTl9TID0gMHgzNCwKLSAgQkdUX1VOX1MgPSAweDM1LAotICBCTEVfVU5fUyA9IDB4MzYsCi0gIEJMVF9VTl9TID0gMHgzNywKLSAgQlIgPSAweDM4LAotICBCUkZBTFNFID0gMHgzOSwKLSAgQlJUUlVFID0gMHgzQSwKLSAgQkVRID0gMHgzQiwKLSAgQkdFID0gMHgzQywKLSAgQkdUID0gMHgzRCwKLSAgQkxFID0gMHgzRSwKLSAgQkxUID0gMHgzRiwKLSAgQk5FX1VOID0gMHg0MCwKLSAgQkdFX1VOID0gMHg0MSwKLSAgQkdUX1VOID0gMHg0MiwKLSAgQkxFX1VOID0gMHg0MywKLSAgQkxUX1VOID0gMHg0NCwKLSAgU1dJVENIID0gMHg0NSwKLSAgTERJTkRfSTEgPSAweDQ2LAotICBMRElORF9VMSA9IDB4NDcsCi0gIExESU5EX0kyID0gMHg0OCwKLSAgTERJTkRfVTIgPSAweDQ5LAotICBMRElORF9JNCA9IDB4NEEsCi0gIExESU5EX1U0ID0gMHg0QiwKLSAgTERJTkRfSTggPSAweDRDLAotICBMRElORF9JID0gMHg0RCwKLSAgTERJTkRfUjQgPSAweDRFLAotICBMRElORF9SOCA9IDB4NEYsCi0gIExESU5EX1JFRiA9IDB4NTAsCi0gIFNUSU5EX1JFRiA9IDB4NTEsCi0gIFNUSU5EX0kxID0gMHg1MiwKLSAgU1RJTkRfSTIgPSAweDUzLAotICBTVElORF9JNCA9IDB4NTQsCi0gIFNUSU5EX0k4ID0gMHg1NSwKLSAgU1RJTkRfUjQgPSAweDU2LAotICBTVElORF9SOCA9IDB4NTcsCi0gIEFERCA9IDB4NTgsCi0gIFNVQiA9IDB4NTksCi0gIE1VTCA9IDB4NUEsCi0gIERJViA9IDB4NUIsCi0gIERJVl9VTiA9IDB4NUMsCi0gIFJFTSA9IDB4NUQsCi0gIFJFTV9VTiA9IDB4NUUsCi0gIEFORCA9IDB4NUYsCi0gIE9SID0gMHg2MCwKLSAgWE9SID0gMHg2MSwKLSAgU0hMID0gMHg2MiwKLSAgU0hSID0gMHg2MywKLSAgU0hSX1VOID0gMHg2NCwKLSAgTkVHID0gMHg2NSwKLSAgTk9UID0gMHg2NiwKLSAgQ09OVl9JMSA9IDB4NjcsCi0gIENPTlZfSTIgPSAweDY4LAotICBDT05WX0k0ID0gMHg2OSwKLSAgQ09OVl9JOCA9IDB4NkEsCi0gIENPTlZfUjQgPSAweDZCLAotICBDT05WX1I4ID0gMHg2QywKLSAgQ09OVl9VNCA9IDB4NkQsCi0gIENPTlZfVTggPSAweDZFLAotICBDQUxMVklSVCA9IDB4NkYsCi0gIENQT0JKID0gMHg3MCwKLSAgTERPQkogPSAweDcxLAotICBMRFNUUiA9IDB4NzIsCi0gIE5FV09CSiA9IDB4NzMsCi0gIENBU1RDTEFTUyA9IDB4NzQsCi0gIElTSU5TVCA9IDB4NzUsCi0gIENPTlZfUl9VTiA9IDB4NzYsCi0gIFVOVVNFRDU4ID0gMHg3NywKLSAgVU5VU0VEMSA9IDB4NzgsCi0gIFVOQk9YID0gMHg3OSwKLSAgVEhST1cgPSAweDdBLAotICBMREZMRCA9IDB4N0IsCi0gIExERkxEQSA9IDB4N0MsCi0gIFNURkxEID0gMHg3RCwKLSAgTERTRkxEID0gMHg3RSwKLSAgTERTRkxEQSA9IDB4N0YsCi0gIFNUU0ZMRCA9IDB4ODAsCi0gIFNUT0JKID0gMHg4MSwKLSAgQ09OVl9PVkZfSTFfVU4gPSAweDgyLAotICBDT05WX09WRl9JMl9VTiA9IDB4ODMsCi0gIENPTlZfT1ZGX0k0X1VOID0gMHg4NCwKLSAgQ09OVl9PVkZfSThfVU4gPSAweDg1LAotICBDT05WX09WRl9VMV9VTiA9IDB4ODYsCi0gIENPTlZfT1ZGX1UyX1VOID0gMHg4NywKLSAgQ09OVl9PVkZfVTRfVU4gPSAweDg4LAotICBDT05WX09WRl9VOF9VTiA9IDB4ODksCi0gIENPTlZfT1ZGX0lfVU4gPSAweDhBLAotICBDT05WX09WRl9VX1VOID0gMHg4QiwKLSAgQk9YID0gMHg4QywKLSAgTkVXQVJSID0gMHg4RCwKLSAgTERMRU4gPSAweDhFLAotICBMREVMRU1BID0gMHg4RiwKLSAgTERFTEVNX0kxID0gMHg5MCwKLSAgTERFTEVNX1UxID0gMHg5MSwKLSAgTERFTEVNX0kyID0gMHg5MiwKLSAgTERFTEVNX1UyID0gMHg5MywKLSAgTERFTEVNX0k0ID0gMHg5NCwKLSAgTERFTEVNX1U0ID0gMHg5NSwKLSAgTERFTEVNX0k4ID0gMHg5NiwKLSAgTERFTEVNX0kgPSAweDk3LAotICBMREVMRU1fUjQgPSAweDk4LAotICBMREVMRU1fUjggPSAweDk5LAotICBMREVMRU1fUkVGID0gMHg5QSwKLSAgU1RFTEVNX0kgPSAweDlCLAotICBTVEVMRU1fSTEgPSAweDlDLAotICBTVEVMRU1fSTIgPSAweDlELAotICBTVEVMRU1fSTQgPSAweDlFLAotICBTVEVMRU1fSTggPSAweDlGLAotICBTVEVMRU1fUjQgPSAweEEwLAotICBTVEVMRU1fUjggPSAweEExLAotICBTVEVMRU1fUkVGID0gMHhBMiwKLSAgTERFTEVNID0gMHhBMywKLSAgU1RFTEVNID0gMHhBNCwKLSAgVU5CT1hfQU5ZID0gMHhBNSwKLSAgVU5VU0VENSA9IDB4QTYsCi0gIFVOVVNFRDYgPSAweEE3LAotICBVTlVTRUQ3ID0gMHhBOCwKLSAgVU5VU0VEOCA9IDB4QTksCi0gIFVOVVNFRDkgPSAweEFBLAotICBVTlVTRUQxMCA9IDB4QUIsCi0gIFVOVVNFRDExID0gMHhBQywKLSAgVU5VU0VEMTIgPSAweEFELAotICBVTlVTRUQxMyA9IDB4QUUsCi0gIFVOVVNFRDE0ID0gMHhBRiwKLSAgVU5VU0VEMTUgPSAweEIwLAotICBVTlVTRUQxNiA9IDB4QjEsCi0gIFVOVVNFRDE3ID0gMHhCMiwKLSAgQ09OVl9PVkZfSTEgPSAweEIzLAotICBDT05WX09WRl9VMSA9IDB4QjQsCi0gIENPTlZfT1ZGX0kyID0gMHhCNSwKLSAgQ09OVl9PVkZfVTIgPSAweEI2LAotICBDT05WX09WRl9JNCA9IDB4QjcsCi0gIENPTlZfT1ZGX1U0ID0gMHhCOCwKLSAgQ09OVl9PVkZfSTggPSAweEI5LAotICBDT05WX09WRl9VOCA9IDB4QkEsCi0gIFVOVVNFRDUwID0gMHhCQiwKLSAgVU5VU0VEMTggPSAweEJDLAotICBVTlVTRUQxOSA9IDB4QkQsCi0gIFVOVVNFRDIwID0gMHhCRSwKLSAgVU5VU0VEMjEgPSAweEJGLAotICBVTlVTRUQyMiA9IDB4QzAsCi0gIFVOVVNFRDIzID0gMHhDMSwKLSAgUkVGQU5ZVkFMID0gMHhDMiwKLSAgQ0tGSU5JVEUgPSAweEMzLAotICBVTlVTRUQyNCA9IDB4QzQsCi0gIFVOVVNFRDI1ID0gMHhDNSwKLSAgTUtSRUZBTlkgPSAweEM2LAotICBVTlVTRUQ1OSA9IDB4QzcsCi0gIFVOVVNFRDYwID0gMHhDOCwKLSAgVU5VU0VENjEgPSAweEM5LAotICBVTlVTRUQ2MiA9IDB4Q0EsCi0gIFVOVVNFRDYzID0gMHhDQiwKLSAgVU5VU0VENjQgPSAweENDLAotICBVTlVTRUQ2NSA9IDB4Q0QsCi0gIFVOVVNFRDY2ID0gMHhDRSwKLSAgVU5VU0VENjcgPSAweENGLAotICBMRFRPS0VOID0gMHhEMCwKLSAgQ09OVl9VMiA9IDB4RDEsCi0gIENPTlZfVTEgPSAweEQyLAotICBDT05WX0kgPSAweEQzLAotICBDT05WX09WRl9JID0gMHhENCwKLSAgQ09OVl9PVkZfVSA9IDB4RDUsCi0gIEFERF9PVkYgPSAweEQ2LAotICBBRERfT1ZGX1VOID0gMHhENywKLSAgTVVMX09WRiA9IDB4RDgsCi0gIE1VTF9PVkZfVU4gPSAweEQ5LAotICBTVUJfT1ZGID0gMHhEQSwKLSAgU1VCX09WRl9VTiA9IDB4REIsCi0gIEVOREZJTkFMTFkgPSAweERDLAotICBMRUFWRSA9IDB4REQsCi0gIExFQVZFX1MgPSAweERFLAotICBTVElORF9JID0gMHhERiwKLSAgQ09OVl9VID0gMHhFMAotfTsKLQotZW51bSBPcGNvZGVGRSB7Ci0gIEFSR0xJU1QgPSAweDAwLAotICBDRVEgPSAweDAxLAotICBDR1QgPSAweDAyLAotICBDR1RfVU4gPSAweDAzLAotICBDTFQgPSAweDA0LAotICBDTFRfVU4gPSAweDA1LAotICBMREZUTiA9IDB4MDYsCi0gIExEVklSVEZUTiA9IDB4MDcsCi0gIFVOVVNFRDU2ID0gMHgwOCwKLSAgTERBUkcgPSAweDA5LAotICBMREFSR0EgPSAweDBBLAotICBTVEFSRyA9IDB4MEIsCi0gIExETE9DID0gMHgwQywKLSAgTERMT0NBID0gMHgwRCwKLSAgU1RMT0MgPSAweDBFLAotICBMT0NBTExPQyA9IDB4MEYsCi0gIFVOVVNFRDU3ID0gMHgxMCwKLSAgRU5ERklMVEVSID0gMHgxMSwKLSAgVU5BTElHTkVEXyA9IDB4MTIsCi0gIFZPTEFUSUxFXyA9IDB4MTMsCi0gIFRBSUxfID0gMHgxNCwKLSAgSU5JVE9CSiA9IDB4MTUsCi0gIENPTlNUUkFJTkVEXyA9IDB4MTYsCi0gIENQQkxLID0gMHgxNywKLSAgSU5JVEJMSyA9IDB4MTgsCi0gIE5PXyA9IDB4MTksCi0gIFJFVEhST1cgPSAweDFBLAotICBVTlVTRUQgPSAweDFCLAotICBTSVpFT0YgPSAweDFDLAotICBSRUZBTllUWVBFID0gMHgxRCwKLSAgUkVBRE9OTFlfID0gMHgxRSwKLSAgVU5VU0VENTMgPSAweDFGLAotICBVTlVTRUQ1NCA9IDB4MjAsCi0gIFVOVVNFRDU1ID0gMHgyMSwKLSAgVU5VU0VENzAgPSAweDIyCi19OwotCi0KLX0gLy8gZW5kIG5hbWVzcGFjZSBuMwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvQ0xJSml0TWV0YS5jcHAgYi92bWtpdC9saWIvTjMvVk1Db3JlL0NMSUppdE1ldGEuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTRiOTExLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvQ0xJSml0TWV0YS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotLy89PT0tLS0tLS0gQ0xJSml0TWV0YS5jcHAgLSBDTEkgY2xhc3MvbWV0aG9kL2ZpZWxkIG9wZXJhdG9ycyAtLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4zCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0jaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvR2VuZXJpY1ZhbHVlLmgiCi0jaW5jbHVkZSAibGx2bS9HbG9iYWxWYXJpYWJsZS5oIgotI2luY2x1ZGUgImxsdm0vTExWTUNvbnRleHQuaCIKLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLSNpbmNsdWRlICJtdm0vSklULmgiCi0KLSNpbmNsdWRlICJDTElBY2Nlc3MuaCIKLSNpbmNsdWRlICJDTElKaXQuaCIKLSNpbmNsdWRlICJDTElTdHJpbmcuaCIKLSNpbmNsdWRlICJOMy5oIgotI2luY2x1ZGUgIlZNQ2xhc3MuaCIKLSNpbmNsdWRlICJWTU9iamVjdC5oIgotI2luY2x1ZGUgIlZNVGhyZWFkLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBuMzsKLXVzaW5nIG5hbWVzcGFjZSBsbHZtOwotCi0vLyBUT0RPOiBNVVNUIENIRUNLIHRoZSB0eXBlIQotLy8JCWlmIChsbHZtOjppc2E8Y2hlY2s+KHNpZ25hdHVyZS0+bmF0dXJhbFR5cGUpKSB7CQkJCQkJCQkJIAotLy8JCWlmIChzaWduYXR1cmUtPm5hdHVyYWxUeXBlID09IFR5cGU6OmdldEZsb2F0VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSkgewotCi0jZGVmaW5lIElNUExFTUVOVFNfVk1GSUVMRF9BU1NFU1NPUlMobmFtZSwgdHlwZSwgZG9fcm9vdCkJCQkJCQkJCVwKLQl2b2lkIFZNRmllbGQ6OnNldCMjbmFtZShWTU9iamVjdCogb2JqLCB0eXBlIHZhbCkgewkJCQkJCQkJCQlcCi0JCWxsdm1fZ2Nyb290KG9iaiwgMCk7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCQlkb19yb290KHZhbCwgMCk7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCWlmIChjbGFzc0RlZi0+c3RhdHVzIDwgcmVhZHkpCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQljbGFzc0RlZi0+cmVzb2x2ZVR5cGUodHJ1ZSwgdHJ1ZSwgTlVMTCk7CQkJCQkJCQkJCQkJCVwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJKih0eXBlKikoKGNoYXIgKilvYmogKyBwdHJPZmZzZXQpID0gdmFsOwkJCQkJCQkJCQkJCQkJXAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCQlyZXR1cm47CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQl9CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JdHlwZSBWTUZpZWxkOjpnZXQjI25hbWUoVk1PYmplY3QqIG9iaikgewkJCQkJCQkJCQkJCQkJCVwKLQkJbGx2bV9nY3Jvb3Qob2JqLCAwKTsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCWlmIChjbGFzc0RlZi0+c3RhdHVzIDwgcmVhZHkpCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQljbGFzc0RlZi0+cmVzb2x2ZVR5cGUodHJ1ZSwgdHJ1ZSwgTlVMTCk7CQkJCQkJCQkJCQkJCVwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJdHlwZSByZXM7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCQlkb19yb290KHJlcywgMCk7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCXJlcyA9ICoodHlwZSAqKSgoY2hhciAqKW9iaiArIHB0ck9mZnNldCk7CQkJCQkJCQkJCQkJCQlcCi0JCXJldHVybiByZXM7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JfQotCi1PTl9UWVBFUyhJTVBMRU1FTlRTX1ZNRklFTERfQVNTRVNTT1JTLCBfRl9OVFIpCi0KLSN1bmRlZiBJTVBMRU1FTlRTX1ZNRklFTERfQVNTRVNTT1JTCi0KLUdlbmVyaWNWYWx1ZSBWTU1ldGhvZDo6aW52b2tlR2VuZXJpYyhzdGQ6OnZlY3RvcjxsbHZtOjpHZW5lcmljVmFsdWU+JiBhcmdzKSB7CQkJCQkJCQkJCQkJCQkJCQkJCi0JLy8gYXQgdGhpcyBzdGVwLCB3ZSBtdXN0IG5vdCBsYXVuY2ggdGhlIGdjIGJlY2F1c2Ugb2JqZWN0cyBhcmd1bWVudHMgYXJlIHNvbWV3aGVyZSBpbiB0aGUgc3RhY2sgYSBjb3B5aW5nIGNvbGxlY3RvcgotCS8vIGNhbiBub3Qga25vdyB3aGVyZSB0aGV5IGFyZQotCWFzc2VydChjb2RlKTsJCQkJCQkJCQkvLyBjb21waWxpbmcgYSBtZXRob2QgY2FuIHRyaWdnZXIgYSBnYwotCXJldHVybiBtdm06Ok12bU1vZHVsZTo6ZXhlY3V0aW9uRW5naW5lLT5ydW5GdW5jdGlvbihtZXRoUHRyLCBhcmdzKTsKLX0KLQotR2VuZXJpY1ZhbHVlIFZNTWV0aG9kOjppbnZva2VHZW5lcmljKHZhX2xpc3QgYXApIHsJCQkJCQkJCQkJCQkJCQkJCQkKLQlGdW5jdGlvbiogZnVuYyA9IG1ldGhQdHI7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQotCXN0ZDo6dmVjdG9yPEdlbmVyaWNWYWx1ZT4gYXJnczsJCQkJCQkJCQkJCQkJCQkJCQkJCi0JZm9yIChGdW5jdGlvbjo6YXJnX2l0ZXJhdG9yIGkgPSBmdW5jLT5hcmdfYmVnaW4oKSwgZSA9IGZ1bmMtPmFyZ19lbmQoKTsJCi0JCQkgaSAhPSBlOyArK2kpIHsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCi0JCWNvbnN0IFR5cGUqIGN1ciA9IGktPmdldFR5cGUoKTsJCQkJCQkJCQkJCQkJCQkJCQkKLQkJaWYgKGN1ciA9PSBUeXBlOjpnZXRJbnQ4VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSkgewkJCQkJCQkJCQotCQkJR2VuZXJpY1ZhbHVlIGd2OwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQotCQkJZ3YuSW50VmFsID0gQVBJbnQoOCwgdmFfYXJnKGFwLCBpbnQpKTsJCQkJCQkJCQkJCQkJCi0JCQlhcmdzLnB1c2hfYmFjayhndik7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkKLQkJfSBlbHNlIGlmIChjdXIgPT0gVHlwZTo6Z2V0SW50MTZUeShnZXRHbG9iYWxDb250ZXh0KCkpKSB7CQkJCQkKLQkJCUdlbmVyaWNWYWx1ZSBndjsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkKLQkJCWd2LkludFZhbCA9IEFQSW50KDE2LCB2YV9hcmcoYXAsIGludCkpOwkJCQkJCQkJCQkJCQkKLQkJCWFyZ3MucHVzaF9iYWNrKGd2KTsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQotCQl9IGVsc2UgaWYgKGN1ciA9PSBUeXBlOjpnZXRJbnQzMlR5KGdldEdsb2JhbENvbnRleHQoKSkpIHsJCQkJCQotCQkJR2VuZXJpY1ZhbHVlIGd2OwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQotCQkJZ3YuSW50VmFsID0gQVBJbnQoMzIsIHZhX2FyZyhhcCwgaW50KSk7CQkJCQkJCQkJCQkJCQotCQkJYXJncy5wdXNoX2JhY2soZ3YpOwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCi0JCX0gZWxzZSBpZiAoY3VyID09IFR5cGU6OmdldEludDY0VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSkgewkJCQkJCi0JCQlHZW5lcmljVmFsdWUgZ3YxOwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQotCQkJZ3YxLkludFZhbCA9IEFQSW50KDY0LCB2YV9hcmcoYXAsIHVpbnQ2NCkpOwkJCQkJCQkJCQkJCi0JCQlhcmdzLnB1c2hfYmFjayhndjEpOwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkKLQkJfSBlbHNlIGlmIChjdXIgPT0gVHlwZTo6Z2V0RG91YmxlVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSkgewkJCQkKLQkJCUdlbmVyaWNWYWx1ZSBndjE7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCi0JCQlndjEuRG91YmxlVmFsID0gdmFfYXJnKGFwLCBkb3VibGUpOwkJCQkJCQkJCQkJCQkJCQotCQkJYXJncy5wdXNoX2JhY2soZ3YxKTsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCi0JCX0gZWxzZSBpZiAoY3VyID09IFR5cGU6OmdldEZsb2F0VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSkgewkJCQkJCi0JCQlHZW5lcmljVmFsdWUgZ3Y7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCi0JCQlndi5GbG9hdFZhbCA9IChmbG9hdCkodmFfYXJnKGFwLCBkb3VibGUpKTsJCQkJCQkJCQkJCQotCQkJYXJncy5wdXNoX2JhY2soZ3YpOwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCi0JCX0gZWxzZSB7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkKLQkJCUdlbmVyaWNWYWx1ZSBndih2YV9hcmcoYXAsIFZNT2JqZWN0KikpOwkJCQkJCQkJCQkJCQkKLQkJCWFyZ3MucHVzaF9iYWNrKGd2KTsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQotCQl9CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCi0JfQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkKLQkKLQlyZXR1cm4gaW52b2tlR2VuZXJpYyhhcmdzKTsKLX0KLQotR2VuZXJpY1ZhbHVlIFZNTWV0aG9kOjppbnZva2VHZW5lcmljKC4uLikgewotCXZhX2xpc3QgYXA7Ci0JdmFfc3RhcnQoYXAsIHRoaXMpOwotCUdlbmVyaWNWYWx1ZSByZXMgPSBpbnZva2VHZW5lcmljKGFwKTsKLQl2YV9lbmQoYXApOwotCXJldHVybiByZXM7Ci19Ci0KLSNkZWZpbmUgREVGSU5FX0lOVk9LRShuYW1lLCB0eXBlLCBleHRyYWN0b3IpCQkJCQkJCQkJCQkJCQlcCi0JdHlwZSBWTU1ldGhvZDo6aW52b2tlIyNuYW1lKC4uLikgewkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJdmFfbGlzdCBhcDsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJdmFfc3RhcnQoYXAsIHRoaXMpOwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCUdlbmVyaWNWYWx1ZSByZXMgPSBpbnZva2VHZW5lcmljKGFwKTsJCQkJCQkJCQkJCQkJCQkJXAotCQl2YV9lbmQoYXApOwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCQlyZXR1cm4gKHR5cGUpcmVzLmV4dHJhY3RvcjsJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JfQotCi1PTl9UWVBFUyhERUZJTkVfSU5WT0tFLCBfRl9OVEUpCi0KLSN1bmRlZiBERUZJTkVfSU5WT0tFCi0KLSNkZWZpbmUgREVGSU5FX0lOVk9LRV9WT0lEKG5hbWUsIHR5cGUsIGV4dHJhY3RvcikJXAotCXR5cGUgVk1NZXRob2Q6Omludm9rZSMjbmFtZSguLi4pIHsJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCXZhX2xpc3QgYXA7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCXZhX3N0YXJ0KGFwLCB0aGlzKTsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCQlpbnZva2VHZW5lcmljKGFwKTsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCQl2YV9lbmQoYXApOwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCX0KLQotT05fVk9JRChERUZJTkVfSU5WT0tFX1ZPSUQsIF9GX05URSkKLQotI3VuZGVmIERFRklORV9JTlZPS0VfVk9JRAotCi0KLS8vIC8vIG1ldHRyZSBlbiBwYXJhbSB1biBGdW5jdGlvbiAqCi0vLyAvLyBtYXRlcmlhbGl6ZUZ1bmN0aW9uIGF2YW50Ci0vLyBHZW5lcmljVmFsdWUgVk1NZXRob2Q6Om9wZXJhdG9yKCkodmFfbGlzdCBhcCkgewotICAKLS8vICAgaWYgKGNsYXNzRGVmLT5zdGF0dXMgPCByZWFkeSkgCi0vLyAgICAgY2xhc3NEZWYtPnJlc29sdmVUeXBlKHRydWUsIHRydWUsIE5VTEwpOwotICAKLS8vICAgRnVuY3Rpb24qIGZ1bmMgPSBjb21waWxlZFB0cihOVUxMKTsKLSAgCi0vLyAgIHN0ZDo6dmVjdG9yPEdlbmVyaWNWYWx1ZT4gYXJnczsKLS8vICAgZm9yIChGdW5jdGlvbjo6YXJnX2l0ZXJhdG9yIGkgPSBmdW5jLT5hcmdfYmVnaW4oKSwgZSA9IGZ1bmMtPmFyZ19lbmQoKTsKLS8vICAgICAgICBpICE9IGU7ICsraSkgewotLy8gICAgIGNvbnN0IFR5cGUqIHR5cGUgPSBpLT5nZXRUeXBlKCk7Ci0vLyAgICAgaWYgKHR5cGUgPT0gVHlwZTo6Z2V0SW50OFR5KGdldEdsb2JhbENvbnRleHQoKSkpIHsKLS8vICAgICAgIEdlbmVyaWNWYWx1ZSBndjsKLS8vICAgICAgIGd2LkludFZhbCA9IEFQSW50KDgsIHZhX2FyZyhhcCwgaW50KSk7Ci0vLyAgICAgICBhcmdzLnB1c2hfYmFjayhndik7Ci0vLyAgICAgfSBlbHNlIGlmICh0eXBlID09IFR5cGU6OmdldEludDE2VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSkgewotLy8gICAgICAgR2VuZXJpY1ZhbHVlIGd2OwotLy8gICAgICAgZ3YuSW50VmFsID0gQVBJbnQoMTYsIHZhX2FyZyhhcCwgaW50KSk7Ci0vLyAgICAgICBhcmdzLnB1c2hfYmFjayhndik7Ci0vLyAgICAgfSBlbHNlIGlmICh0eXBlID09IFR5cGU6OmdldEludDMyVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSkgewotLy8gICAgICAgR2VuZXJpY1ZhbHVlIGd2OwotLy8gICAgICAgZ3YuSW50VmFsID0gQVBJbnQoMzIsIHZhX2FyZyhhcCwgaW50KSk7Ci0vLyAgICAgICBhcmdzLnB1c2hfYmFjayhndik7Ci0vLyAgICAgfSBlbHNlIGlmICh0eXBlID09IFR5cGU6OmdldEludDY0VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSkgewotLy8gICAgICAgR2VuZXJpY1ZhbHVlIGd2MTsKLS8vICAgICAgIGd2MS5JbnRWYWwgPSBBUEludCg2NCwgdmFfYXJnKGFwLCB1aW50NjQpKTsKLS8vICAgICAgIGFyZ3MucHVzaF9iYWNrKGd2MSk7Ci0vLyAgICAgfSBlbHNlIGlmICh0eXBlID09IFR5cGU6OmdldERvdWJsZVR5KGdldEdsb2JhbENvbnRleHQoKSkpIHsgCi0vLyAgICAgICBHZW5lcmljVmFsdWUgZ3YxOwotLy8gICAgICAgZ3YxLkRvdWJsZVZhbCA9IHZhX2FyZyhhcCwgZG91YmxlKTsKLS8vICAgICAgIGFyZ3MucHVzaF9iYWNrKGd2MSk7Ci0vLyAgICAgfSBlbHNlIGlmICh0eXBlID09IFR5cGU6OmdldEZsb2F0VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSkgewotLy8gICAgICAgR2VuZXJpY1ZhbHVlIGd2OwotLy8gICAgICAgZ3YuRmxvYXRWYWwgPSAoZmxvYXQpKHZhX2FyZyhhcCwgZG91YmxlKSk7Ci0vLyAgICAgICBhcmdzLnB1c2hfYmFjayhndik7Ci0vLyAgICAgfSBlbHNlIHsKLS8vICAgICAgIEdlbmVyaWNWYWx1ZSBndih2YV9hcmcoYXAsIFZNT2JqZWN0KikpOwotLy8gICAgICAgYXJncy5wdXNoX2JhY2soZ3YpOwotLy8gICAgIH0KLS8vICAgfQotICAKLS8vICAgcmV0dXJuIG12bTo6TXZtTW9kdWxlOjpleGVjdXRpb25FbmdpbmUtPnJ1bkZ1bmN0aW9uKGZ1bmMsIGFyZ3MpOwotLy8gfQotCi0vLyBHZW5lcmljVmFsdWUgVk1NZXRob2Q6Om9wZXJhdG9yKCkoVk1PYmplY3QqIG9iaiwgdmFfbGlzdCBhcCkgewotICAKLS8vICAgaWYgKGNsYXNzRGVmLT5zdGF0dXMgPCByZWFkeSkgCi0vLyAgICAgY2xhc3NEZWYtPnJlc29sdmVUeXBlKHRydWUsIHRydWUsIE5VTEwpOwotICAKLS8vICAgRnVuY3Rpb24qIGZ1bmMgPSBjb21waWxlZFB0cihOVUxMKTsKLSAgCi0vLyAgIHN0ZDo6dmVjdG9yPEdlbmVyaWNWYWx1ZT4gYXJnczsKLS8vICAgR2VuZXJpY1ZhbHVlIG9iamVjdChvYmopOwotLy8gICBhcmdzLnB1c2hfYmFjayhvYmplY3QpOwotCi0vLyAgIGZvciAoRnVuY3Rpb246OmFyZ19pdGVyYXRvciBpID0gKysoZnVuYy0+YXJnX2JlZ2luKCkpLCBlID0gZnVuYy0+YXJnX2VuZCgpOwotLy8gICAgICAgIGkgIT0gZTsgKytpKSB7Ci0vLyAgICAgY29uc3QgVHlwZSogdHlwZSA9IGktPmdldFR5cGUoKTsKLS8vICAgICBpZiAodHlwZSA9PSBUeXBlOjpnZXRJbnQ4VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSkgewotLy8gICAgICAgR2VuZXJpY1ZhbHVlIGd2OwotLy8gICAgICAgZ3YuSW50VmFsID0gQVBJbnQoOCwgdmFfYXJnKGFwLCBpbnQpKTsKLS8vICAgICAgIGFyZ3MucHVzaF9iYWNrKGd2KTsKLS8vICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVHlwZTo6Z2V0SW50MTZUeShnZXRHbG9iYWxDb250ZXh0KCkpKSB7Ci0vLyAgICAgICBHZW5lcmljVmFsdWUgZ3Y7Ci0vLyAgICAgICBndi5JbnRWYWwgPSBBUEludCgxNiwgdmFfYXJnKGFwLCBpbnQpKTsKLS8vICAgICAgIGFyZ3MucHVzaF9iYWNrKGd2KTsKLS8vICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVHlwZTo6Z2V0SW50MzJUeShnZXRHbG9iYWxDb250ZXh0KCkpKSB7Ci0vLyAgICAgICBHZW5lcmljVmFsdWUgZ3Y7Ci0vLyAgICAgICBndi5JbnRWYWwgPSBBUEludCgzMiwgdmFfYXJnKGFwLCBpbnQpKTsKLS8vICAgICAgIGFyZ3MucHVzaF9iYWNrKGd2KTsKLS8vICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVHlwZTo6Z2V0SW50NjRUeShnZXRHbG9iYWxDb250ZXh0KCkpKSB7Ci0vLyAgICAgICBHZW5lcmljVmFsdWUgZ3YxOwotLy8gICAgICAgZ3YxLkludFZhbCA9IEFQSW50KDY0LCB2YV9hcmcoYXAsIHVpbnQ2NCkpOwotLy8gICAgICAgYXJncy5wdXNoX2JhY2soZ3YxKTsKLS8vICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVHlwZTo6Z2V0RG91YmxlVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSkgeyAKLS8vICAgICAgIEdlbmVyaWNWYWx1ZSBndjE7Ci0vLyAgICAgICBndjEuRG91YmxlVmFsID0gdmFfYXJnKGFwLCBkb3VibGUpOwotLy8gICAgICAgYXJncy5wdXNoX2JhY2soZ3YxKTsKLS8vICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVHlwZTo6Z2V0RmxvYXRUeShnZXRHbG9iYWxDb250ZXh0KCkpKSB7Ci0vLyAgICAgICBHZW5lcmljVmFsdWUgZ3Y7Ci0vLyAgICAgICBndi5GbG9hdFZhbCA9IChmbG9hdCkodmFfYXJnKGFwLCBkb3VibGUpKTsKLS8vICAgICAgIGFyZ3MucHVzaF9iYWNrKGd2KTsKLS8vICAgICB9IGVsc2UgewotLy8gICAgICAgR2VuZXJpY1ZhbHVlIGd2KHZhX2FyZyhhcCwgVk1PYmplY3QqKSk7Ci0vLyAgICAgICBhcmdzLnB1c2hfYmFjayhndik7Ci0vLyAgICAgfQotLy8gICB9Ci0gICAgICAKLS8vICAgcmV0dXJuIG12bTo6TXZtTW9kdWxlOjpleGVjdXRpb25FbmdpbmUtPnJ1bkZ1bmN0aW9uKGZ1bmMsIGFyZ3MpOwotLy8gfQotCi0KLS8vIEdlbmVyaWNWYWx1ZSBWTU1ldGhvZDo6b3BlcmF0b3IoKSguLi4pIHsKLS8vICAgdmFfbGlzdCBhcDsKLS8vICAgdmFfc3RhcnQoYXAsIHRoaXMpOwotLy8gICBHZW5lcmljVmFsdWUgcmV0ID0gKCp0aGlzKShhcCk7Ci0vLyAgIHZhX2VuZChhcCk7Ci0vLyAgIHJldHVybiAgcmV0OwotLy8gfQotCi0vLyBHZW5lcmljVmFsdWUgVk1NZXRob2Q6OnJ1biguLi4pIHsKLS8vICAgdmFfbGlzdCBhcDsKLS8vICAgdmFfc3RhcnQoYXAsIHRoaXMpOwotLy8gICBHZW5lcmljVmFsdWUgcmV0ID0gKCp0aGlzKShhcCk7Ci0vLyAgIHZhX2VuZChhcCk7Ci0vLyAgIHJldHVybiAgcmV0OwotLy8gfQotCi0vLyBHZW5lcmljVmFsdWUgVk1NZXRob2Q6Om9wZXJhdG9yKCkoc3RkOjp2ZWN0b3I8R2VuZXJpY1ZhbHVlPiYgYXJncykgewotICAKLS8vICAgaWYgKGNsYXNzRGVmLT5zdGF0dXMgPCByZWFkeSkgCi0vLyAgICAgY2xhc3NEZWYtPnJlc29sdmVUeXBlKHRydWUsIHRydWUsIE5VTEwpOwotICAKLS8vICAgRnVuY3Rpb24qIGZ1bmMgPSBjb21waWxlZFB0cihOVUxMKTsKLS8vICAgcmV0dXJuIG12bTo6TXZtTW9kdWxlOjpleGVjdXRpb25FbmdpbmUtPnJ1bkZ1bmN0aW9uKGZ1bmMsIGFyZ3MpOwotLy8gfQotCi1HbG9iYWxWYXJpYWJsZSogVk1Db21tb25DbGFzczo6bGx2bVZhcigpIHsKLSAgaWYgKCFfbGx2bVZhcikgewotICAgIGFxdWlyZSgpOwotICAgIGlmICghX2xsdm1WYXIpIHsKLSAgICAgIE1vZHVsZSogTW9kID0gdm0tPmdldExMVk1Nb2R1bGUoKTsKLSAgICAgIGNvbnN0IFR5cGUqIHB0eSA9IFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVHlwZTo6Z2V0SW50OFR5KGdldEdsb2JhbENvbnRleHQoKSkpOwotICAgICAgQ29uc3RhbnQqIGNvbnMgPSAKLSAgICAgICAgQ29uc3RhbnRFeHByOjpnZXRJbnRUb1B0cihDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDY0VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgdWludDY0X3QgKHRoaXMpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0eSk7Ci0KLSAgICAgIF9sbHZtVmFyID0gbmV3IEdsb2JhbFZhcmlhYmxlKCpNb2QsIHB0eSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhbHVlOjpFeHRlcm5hbExpbmthZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zLCAiIik7Ci0gICAgCi0gICAgfQotICAgIHJlbGVhc2UoKTsKLSAgfQotICByZXR1cm4gX2xsdm1WYXI7Ci19Ci0KLUdsb2JhbFZhcmlhYmxlKiBWTUZpZWxkOjpsbHZtVmFyKCkgewotICBpZiAoIV9sbHZtVmFyKSB7Ci0gICAgY2xhc3NEZWYtPmFxdWlyZSgpOwotICAgIGlmICghX2xsdm1WYXIpIHsKLSAgICAgIGNvbnN0IFR5cGUqIHB0eSA9IFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVHlwZTo6Z2V0SW50OFR5KGdldEdsb2JhbENvbnRleHQoKSkpOwotICAgICAgTW9kdWxlKiBNb2QgPSBjbGFzc0RlZi0+dm0tPmdldExMVk1Nb2R1bGUoKTsKLSAgICAgIENvbnN0YW50KiBjb25zID0gCi0gICAgICAgIENvbnN0YW50RXhwcjo6Z2V0SW50VG9QdHIoQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ2NFR5KGdldEdsb2JhbENvbnRleHQoKSksIHVpbnQ2NF90ICh0aGlzKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHR5KTsKLQotICAgICAgX2xsdm1WYXIgPSBuZXcgR2xvYmFsVmFyaWFibGUoKk1vZCwgcHR5LCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnMsICIiKTsKLSAgICB9Ci0gICAgY2xhc3NEZWYtPnJlbGVhc2UoKTsKLSAgfQotICByZXR1cm4gX2xsdm1WYXI7Ci19Ci0KLUdsb2JhbFZhcmlhYmxlKiBWTU1ldGhvZDo6bGx2bVZhcigpIHsKLSAgaWYgKCFfbGx2bVZhcikgewotICAgIGNsYXNzRGVmLT5hcXVpcmUoKTsKLSAgICBpZiAoIV9sbHZtVmFyKSB7Ci0gICAgICBNb2R1bGUqIE1vZCA9IGNsYXNzRGVmLT52bS0+Z2V0TExWTU1vZHVsZSgpOwotICAgICAgY29uc3QgVHlwZSogcHR5ID0gUG9pbnRlclR5cGU6OmdldFVucXVhbChUeXBlOjpnZXRJbnQ4VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSk7Ci0gICAgICBDb25zdGFudCogY29ucyA9IAotICAgICAgICBDb25zdGFudEV4cHI6OmdldEludFRvUHRyKENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50NjRUeShnZXRHbG9iYWxDb250ZXh0KCkpLCB1aW50NjRfdCAodGhpcykpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0eSk7Ci0KLSAgICAgIF9sbHZtVmFyID0gbmV3IEdsb2JhbFZhcmlhYmxlKCpNb2QsIHB0eSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhbHVlOjpFeHRlcm5hbExpbmthZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zLCAiIik7Ci0gICAgCi0gICAgfQotICAgIGNsYXNzRGVmLT5yZWxlYXNlKCk7Ci0gIH0KLSAgcmV0dXJuIF9sbHZtVmFyOwotfQotCi1Db25zdGFudCogVk1PYmplY3Q6OmNsYXNzT2Zmc2V0KCkgewotICByZXR1cm4gVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5tb2R1bGUtPmNvbnN0YW50T25lOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL04zL1ZNQ29yZS9DTElSdW50aW1lSklULmNwcCBiL3Zta2l0L2xpYi9OMy9WTUNvcmUvQ0xJUnVudGltZUpJVC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYWViNmIuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL04zL1ZNQ29yZS9DTElSdW50aW1lSklULmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vLz09PS0tLSBDTElSdW50aW1lSklULmNwcCAtIFJ1bnRpbWUgZnVuY3Rpb25zIGZvciB0aGUgSklUIGNvbXBpbGVkIGNvZGUgLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHZta2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgT2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0KLSNpbmNsdWRlIDxjc3RkaW8+Ci0KLSNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgotI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCi0jaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvRXhlY3V0aW9uRW5naW5lLmgiCi0KLSNpbmNsdWRlICJtdm0vSklULmgiCi0jaW5jbHVkZSAibXZtL09iamVjdC5oIgotI2luY2x1ZGUgIm12bS9QcmludEJ1ZmZlci5oIgotI2luY2x1ZGUgIm12bS9UaHJlYWRzL0xvY2tzLmgiCi0KLSNpbmNsdWRlICJDTElTdHJpbmcuaCIKLSNpbmNsdWRlICJNU0NvcmxpYi5oIgotI2luY2x1ZGUgIk4zLmgiCi0jaW5jbHVkZSAiVk1BcnJheS5oIgotI2luY2x1ZGUgIlZNQ2FjaGUuaCIKLSNpbmNsdWRlICJWTUNsYXNzLmgiCi0jaW5jbHVkZSAiVk1PYmplY3QuaCIKLSNpbmNsdWRlICJWTVRocmVhZC5oIgotI2luY2x1ZGUgIkFzc2VtYmx5LmgiCi0KLSNpbmNsdWRlICJtdm0vR0MvR0MuaCIKLQotI2luY2x1ZGUgPGNzdGRhcmc+Ci0KLXVzaW5nIG5hbWVzcGFjZSBuMzsKLXVzaW5nIG5hbWVzcGFjZSBsbHZtOwotCi1leHRlcm4gIkMiIFZNT2JqZWN0KiBpbml0aWFsaXNlQ2xhc3MoVk1DbGFzcyogY2wpIHsKLSAgY2wtPmNsaW5pdENsYXNzKE5VTEwpOwotICByZXR1cm4gY2wtPnN0YXRpY0luc3RhbmNlOwotfQotCi1leHRlcm4gIkMiIHZvaWQgbjNDbGFzc0Nhc3RFeGNlcHRpb24oKSB7Ci0gIGZmbHVzaChzdGRvdXQpOwotICBhc3NlcnQoMCAmJiAiaW1wbGVtZW50IGNsYXNzIGNhc3QgZXhjZXB0aW9uIik7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBuM051bGxQb2ludGVyRXhjZXB0aW9uKCkgewotICBmZmx1c2goc3Rkb3V0KTsKLSAgYXNzZXJ0KDAgJiYgImltcGxlbWVudCBudWxsIHBvaW50ZXIgZXhjZXB0aW9uIik7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBpbmRleE91dE9mQm91bmRzKCkgewotICBmZmx1c2goc3Rkb3V0KTsKLSAgYXNzZXJ0KDAgJiYgImltcGxlbWVudCBpbmRleCBvdXQgb2YgYm91bmRzIGV4Y2VwdGlvbiIpOwotfQotCi1leHRlcm4gIkMiIFZNT2JqZWN0KiBuZXdTdHJpbmcoY29uc3QgQXJyYXlDaGFyKiB1dGY4KSB7Ci0JTjMgKnZtID0gKE4zKilWTVRocmVhZDo6Z2V0KCktPmdldFZNKCk7Ci0gIGRlY2xhcmVfZ2Nyb290KFZNT2JqZWN0KiwgcmVzKSA9IHZtLT5hcnJheVRvU3RyaW5nKHV0ZjgpOwotCXJldHVybiByZXM7Ci19Ci0KLWV4dGVybiAiQyIgYm9vbCBuM0luc3RhbmNlT2YoVk1PYmplY3QqIG9iaiwgVk1Db21tb25DbGFzcyogY2wpIHsKLSAgcmV0dXJuIFZNT2JqZWN0OjppbnN0YW5jZU9mKG9iaiwgY2wpOwotfQotCi1leHRlcm4gIkMiIHZvaWQqIEdldENwcEV4Y2VwdGlvbigpIHsKLSAgcmV0dXJuIFZNVGhyZWFkOjpnZXRDcHBFeGNlcHRpb24oKTsKLX0KLQotZXh0ZXJuICJDIiB2b2lkIFRocm93RXhjZXB0aW9uKFZNT2JqZWN0KiBvYmopIHsKLSAgcmV0dXJuIFZNVGhyZWFkOjp0aHJvd0V4Y2VwdGlvbihvYmopOwotfQotCi1leHRlcm4gIkMiIFZNT2JqZWN0KiBHZXRDTElFeGNlcHRpb24oKSB7Ci0JZGVjbGFyZV9nY3Jvb3QoVk1PYmplY3QqLCByZXMpID0gVk1UaHJlYWQ6OmdldENMSUV4Y2VwdGlvbigpOwotICByZXR1cm4gcmVzOwotfQotCi1leHRlcm4gIkMiIGJvb2wgQ29tcGFyZUV4Y2VwdGlvbihWTUNsYXNzKiBjbCkgewotICByZXR1cm4gVk1UaHJlYWQ6OmNvbXBhcmVFeGNlcHRpb24oY2wpOwotfQotCi1leHRlcm4gIkMiIHZvaWQgQ2xlYXJFeGNlcHRpb24oKSB7Ci0gIHJldHVybiBWTVRocmVhZDo6Z2V0KCktPmNsZWFyRXhjZXB0aW9uKCk7Ci19Ci0KLXN0YXRpYyBWTU9iamVjdCogZG9NdWx0aU5ld0ludGVybihWTUNsYXNzQXJyYXkqIGNsLCB1aW50MzIgZGltLCBzaW50MzIqIGJ1ZikgewotICBpZiAoZGltIDw9IDApIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoIkNhbid0IGhhcHBlbiIpOwotICBzaW50MzIgbiA9IGJ1ZlswXTsKLSAgaWYgKG4gPCAwKSBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPm5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uKG4pOwotICAKLSAgZGVjbGFyZV9nY3Jvb3QoVk1BcnJheSosIHJlcykgPSAoVk1BcnJheSopY2wtPmRvTmV3KG4pOwotICBpZiAoZGltID4gMSkgewotICAgIFZNQ29tbW9uQ2xhc3MqIGJhc2UgPSBjbC0+YmFzZUNsYXNzOwotICAgIGlmIChuID4gMCkgewotICAgICAgZm9yIChzaW50MzIgaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgcmVzLT5lbGVtZW50c1tpXSA9IGRvTXVsdGlOZXdJbnRlcm4oKFZNQ2xhc3NBcnJheSopYmFzZSwgZGltIC0gMSwgJihidWZbMV0pKTsKLSAgICAgIH0gICAKLSAgICB9ICAgCi0gICAgZm9yICh1aW50MzIgaSA9IDE7IGkgPCBkaW07ICsraSkgewotICAgICAgaWYgKGJ1ZltpXSA8IDApIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+bmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24oYnVmW2ldKTsKLSAgICB9ICAgCi0gIH0KLSAgcmV0dXJuIHJlczsKLX0KLQotZXh0ZXJuICJDIiBWTU9iamVjdCogZG9NdWx0aU5ldyhWTUNsYXNzQXJyYXkqIGNsLCAuLi4pIHsKLSAgc2ludDMyKiBkaW1TaXplcyA9IChzaW50MzIqKWFsbG9jYShjbC0+ZGltcyAqIHNpemVvZihzaW50MzIpKTsKLSAgdmFfbGlzdCBhcDsgCi0gIHZhX3N0YXJ0KGFwLCBjbCk7Ci0gIGZvciAodWludDMyIGkgPSAwOyBpIDwgY2wtPmRpbXM7ICsraSkgewotICAgIGRpbVNpemVzW2ldID0gdmFfYXJnKGFwLCBzaW50MzIpOwotICB9Ci0gIHZhX2VuZChhcCk7Ci0gIHJldHVybiBkb011bHRpTmV3SW50ZXJuKGNsLCBjbC0+ZGltcywgZGltU2l6ZXMpOwotfQotCi1leHRlcm4gIkMiIENhY2hlTm9kZSogbjNWaXJ0dWFsTG9va3VwKENhY2hlTm9kZSogY2FjaGUsIFZNT2JqZWN0ICpvYmopIHsKLSAgRW52ZWxvcHBlKiBlbnZlbG9wcGUgPSBjYWNoZS0+ZW52ZWxvcHBlOwotICBWTUNvbW1vbkNsYXNzKiBvY2wgPSBvYmotPmNsYXNzT2Y7Ci0gIFZNTWV0aG9kKiBvcmlnID0gZW52ZWxvcHBlLT5vcmlnaW5hbE1ldGhvZDsKLQotICBDYWNoZU5vZGUqIHJjYWNoZSA9IDA7Ci0gIENhY2hlTm9kZSogdG1wID0gZW52ZWxvcHBlLT5maXJzdENhY2hlOwotICBDYWNoZU5vZGUqIGxhc3QgPSB0bXA7Ci0gIGVudmVsb3BwZS0+Y2FjaGVMb2NrLT5sb2NrKCk7Ci0KLSAgd2hpbGUgKHRtcCkgewotICAgIGlmIChvY2wgPT0gdG1wLT5sYXN0Q2libGUpIHsKLSAgICAgIHJjYWNoZSA9IHRtcDsKLSAgICAgIGJyZWFrOwotICAgIH0gZWxzZSB7Ci0gICAgICBsYXN0ID0gdG1wOwotICAgICAgdG1wID0gdG1wLT5uZXh0OwotICAgIH0KLSAgfQotCi0gIGlmICghcmNhY2hlKSB7Ci0gICAgVk1NZXRob2QqIGRtZXRoID0gb2NsLT5sb29rdXBNZXRob2REb250VGhyb3cob3JpZy0+bmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnLT5wYXJhbWV0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCB0cnVlKTsKLSAgICBpZiAoZG1ldGggPT0gMCkgewotCQkJbXZtOjpQcmludEJ1ZmZlciBfbWV0aEFzY2lpeihvcmlnLT5uYW1lKTsKLSAgICAgIG12bTo6UHJpbnRCdWZmZXIgX25hbWVBc2NpaXoob3JpZy0+Y2xhc3NEZWYtPm5hbWUpOwotICAgICAgbXZtOjpQcmludEJ1ZmZlciBfbmFtZVNwYWNlQXNjaWl6KG9yaWctPmNsYXNzRGVmLT5uYW1lU3BhY2UpOwotICAgICAgY29uc3QgY2hhciogbWV0aEFzY2lpeiA9IF9tZXRoQXNjaWl6LmNTdHJpbmcoKTsKLSAgICAgIGNvbnN0IGNoYXIqIG5hbWVBc2NpaXogPSBfbmFtZUFzY2lpei5jU3RyaW5nKCk7Ci0gICAgICBjb25zdCBjaGFyKiBuYW1lU3BhY2VBc2NpaXogPSBfbmFtZVNwYWNlQXNjaWl6LmNTdHJpbmcoKTsKLQotICAgICAgY2hhciAqYnVmID0gKGNoYXIqKWFsbG9jYSgzICsgc3RybGVuKG1ldGhBc2NpaXopICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4obmFtZUFzY2lpeikgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihuYW1lU3BhY2VBc2NpaXopKTsKLSAgICAgIHNwcmludGYoYnVmLCAiJXMuJXMuJXMiLCBuYW1lU3BhY2VBc2NpaXosIG5hbWVBc2NpaXosIG1ldGhBc2NpaXopOwotICAgICAgY29uc3QgVVRGOCogbmV3TmFtZSA9IFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+YXNjaWl6VG9VVEY4KGJ1Zik7Ci0gICAgICBkbWV0aCA9IG9jbC0+bG9va3VwTWV0aG9kKG5ld05hbWUsIG9yaWctPnBhcmFtZXRlcnMsIGZhbHNlLCB0cnVlKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGNhY2hlLT5tZXRoUHRyKSB7Ci0gICAgICByY2FjaGUgPSBDYWNoZU5vZGU6OmFsbG9jYXRlKG9yaWctPmNsYXNzRGVmLT5hc3NlbWJseS0+YWxsb2NhdG9yKTsKLSAgICAgIHJjYWNoZS0+ZW52ZWxvcHBlID0gZW52ZWxvcHBlOwotICAgIH0gZWxzZSB7Ci0gICAgICByY2FjaGUgPSBjYWNoZTsKLSAgICB9Ci0gICAgCi0gICAgRnVuY3Rpb24qIGZ1bmMgPSBkbWV0aC0+Y29tcGlsZWRQdHIoTlVMTCk7Ci0gICAgcmNhY2hlLT5tZXRoUHRyID0gbXZtOjpNdm1Nb2R1bGU6OmV4ZWN1dGlvbkVuZ2luZS0+Z2V0UG9pbnRlclRvR2xvYmFsKGZ1bmMpOwotICAgIHJjYWNoZS0+bGFzdENpYmxlID0gKFZNQ2xhc3MqKW9jbDsKLSAgICByY2FjaGUtPmJveCA9IChkbWV0aC0+Y2xhc3NEZWYtPnN1cGVyID09IE1TQ29ybGliOjpwVmFsdWUpOwotICB9Ci0KLSAgaWYgKGVudmVsb3BwZS0+Zmlyc3RDYWNoZSAhPSByY2FjaGUpIHsKLSAgICBDYWNoZU5vZGUgKmYgPSBlbnZlbG9wcGUtPmZpcnN0Q2FjaGU7Ci0gICAgZW52ZWxvcHBlLT5maXJzdENhY2hlID0gcmNhY2hlOwotICAgIGxhc3QtPm5leHQgPSByY2FjaGUtPm5leHQ7Ci0gICAgcmNhY2hlLT5uZXh0ID0gZjsKLQotICB9Ci0gIAotICBlbnZlbG9wcGUtPmNhY2hlTG9jay0+dW5sb2NrKCk7Ci0gIAotICByZXR1cm4gcmNhY2hlOwotfQotCi1leHRlcm4gIkMiIFZNT2JqZWN0KiBuZXdPYmplY3QoVk1DbGFzcyogY2wpIHsKLQlkZWNsYXJlX2djcm9vdChWTU9iamVjdCosIHJlcykgPSBjbC0+ZG9OZXcoKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotZXh0ZXJuICJDIiBWTU9iamVjdCogbmV3QXJyYXkoVk1DbGFzc0FycmF5KiBjbCwgc2ludDMyIG5iKSB7Ci0JZGVjbGFyZV9nY3Jvb3QoVk1PYmplY3QqLCByZXMpID0gY2wtPmRvTmV3KG5iKTsKLSAgcmV0dXJuIHJlczsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvQ0xJU2lnbmF0dXJlLmNwcCBiL3Zta2l0L2xpYi9OMy9WTUNvcmUvQ0xJU2lnbmF0dXJlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVkNTg5OS4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTjMvVk1Db3JlL0NMSVNpZ25hdHVyZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NDkgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0gQ0xJU2lnbmF0dXJlLmNwcCAtIFJlYWRzIENMSSBzaWduYXR1cmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4zCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotCi0jaW5jbHVkZSAiQXNzZW1ibHkuaCIKLSNpbmNsdWRlICJNU0NvcmxpYi5oIgotI2luY2x1ZGUgIk4zLmgiCi0jaW5jbHVkZSAiUmVhZGVyLmgiCi0jaW5jbHVkZSAiVk1DbGFzcy5oIgotI2luY2x1ZGUgIlZNVGhyZWFkLmgiCi0KLSNpbmNsdWRlICJTaWduYXR1cmVOYW1lcy5kZWYiCi0KLXVzaW5nIG5hbWVzcGFjZSBuMzsKLQotLy8gRUNNQSAzMzU6IHBhZ2UgMTUwIDIzLjEuMTYgRWxlbWVudCB0eXBlcyB1c2VkIGluIHNpZ25hdHVyZXMgCi0KLQotc3RhdGljIFZNQ29tbW9uQ2xhc3MqIE1FVEhPRF9FbGVtZW50VHlwZUVuZCh1aW50MzIgb3AsIEFzc2VtYmx5KiBhc3MsCi0gICAgdWludDMyJiBvZmZzZXQsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgVk1Db21tb25DbGFzcyogTUVUSE9EX0VsZW1lbnRUeXBlVm9pZCh1aW50MzIgb3AsIEFzc2VtYmx5KiBhc3MsCi0gICAgdWludDMyJiBvZmZzZXQsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgcmV0dXJuIE1TQ29ybGliOjpwVm9pZDsKLX0KLQotc3RhdGljIFZNQ29tbW9uQ2xhc3MqIE1FVEhPRF9FbGVtZW50VHlwZUJvb2xlYW4odWludDMyIG9wLCBBc3NlbWJseSogYXNzLAotICAgIHVpbnQzMiYgb2Zmc2V0LCBWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKSB7Ci0gIHJldHVybiBNU0NvcmxpYjo6cEJvb2xlYW47Ci19Ci0KLXN0YXRpYyBWTUNvbW1vbkNsYXNzKiBNRVRIT0RfRWxlbWVudFR5cGVDaGFyKHVpbnQzMiBvcCwgQXNzZW1ibHkqIGFzcywKLSAgICB1aW50MzImIG9mZnNldCwgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCkgewotICByZXR1cm4gTVNDb3JsaWI6OnBDaGFyOwotfQotCi1zdGF0aWMgVk1Db21tb25DbGFzcyogTUVUSE9EX0VsZW1lbnRUeXBlSTEodWludDMyIG9wLCBBc3NlbWJseSogYXNzLAotICAgIHVpbnQzMiYgb2Zmc2V0LCBWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKSB7Ci0gIHJldHVybiBNU0NvcmxpYjo6cFNJbnQ4OwotfQotCi1zdGF0aWMgVk1Db21tb25DbGFzcyogTUVUSE9EX0VsZW1lbnRUeXBlVTEodWludDMyIG9wLCBBc3NlbWJseSogYXNzLAotICAgIHVpbnQzMiYgb2Zmc2V0LCBWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKSB7Ci0gIHJldHVybiBNU0NvcmxpYjo6cFVJbnQ4OwotfQotCi1zdGF0aWMgVk1Db21tb25DbGFzcyogTUVUSE9EX0VsZW1lbnRUeXBlSTIodWludDMyIG9wLCBBc3NlbWJseSogYXNzLAotICAgIHVpbnQzMiYgb2Zmc2V0LCBWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKSB7Ci0gIHJldHVybiBNU0NvcmxpYjo6cFNJbnQxNjsKLX0KLQotc3RhdGljIFZNQ29tbW9uQ2xhc3MqIE1FVEhPRF9FbGVtZW50VHlwZVUyKHVpbnQzMiBvcCwgQXNzZW1ibHkqIGFzcywKLSAgICB1aW50MzImIG9mZnNldCwgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCkgewotICByZXR1cm4gTVNDb3JsaWI6OnBVSW50MTY7Ci19Ci0KLXN0YXRpYyBWTUNvbW1vbkNsYXNzKiBNRVRIT0RfRWxlbWVudFR5cGVJNCh1aW50MzIgb3AsIEFzc2VtYmx5KiBhc3MsCi0gICAgdWludDMyJiBvZmZzZXQsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgcmV0dXJuIE1TQ29ybGliOjpwU0ludDMyOwotfQotCi1zdGF0aWMgVk1Db21tb25DbGFzcyogTUVUSE9EX0VsZW1lbnRUeXBlVTQodWludDMyIG9wLCBBc3NlbWJseSogYXNzLAotICAgIHVpbnQzMiYgb2Zmc2V0LCBWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKSB7Ci0gIHJldHVybiBNU0NvcmxpYjo6cFVJbnQzMjsKLX0KLQotc3RhdGljIFZNQ29tbW9uQ2xhc3MqIE1FVEhPRF9FbGVtZW50VHlwZUk4KHVpbnQzMiBvcCwgQXNzZW1ibHkqIGFzcywKLSAgICB1aW50MzImIG9mZnNldCwgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCkgewotICByZXR1cm4gTVNDb3JsaWI6OnBTSW50NjQ7Ci19Ci0KLXN0YXRpYyBWTUNvbW1vbkNsYXNzKiBNRVRIT0RfRWxlbWVudFR5cGVVOCh1aW50MzIgb3AsIEFzc2VtYmx5KiBhc3MsCi0gICAgdWludDMyJiBvZmZzZXQsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgcmV0dXJuIE1TQ29ybGliOjpwVUludDY0OwotfQotCi1zdGF0aWMgVk1Db21tb25DbGFzcyogTUVUSE9EX0VsZW1lbnRUeXBlUjQodWludDMyIG9wLCBBc3NlbWJseSogYXNzLAotICAgIHVpbnQzMiYgb2Zmc2V0LCBWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKSB7Ci0gIHJldHVybiBNU0NvcmxpYjo6cEZsb2F0OwotfQotCi1zdGF0aWMgVk1Db21tb25DbGFzcyogTUVUSE9EX0VsZW1lbnRUeXBlUjgodWludDMyIG9wLCBBc3NlbWJseSogYXNzLAotICAgIHVpbnQzMiYgb2Zmc2V0LCBWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKSB7Ci0gIHJldHVybiBNU0NvcmxpYjo6cERvdWJsZTsKLX0KLQotc3RhdGljIFZNQ29tbW9uQ2xhc3MqIE1FVEhPRF9FbGVtZW50VHlwZVN0cmluZyh1aW50MzIgb3AsIEFzc2VtYmx5KiBhc3MsCi0gICAgdWludDMyJiBvZmZzZXQsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgcmV0dXJuIE1TQ29ybGliOjpwU3RyaW5nOwotfQotCi1zdGF0aWMgVk1Db21tb25DbGFzcyogTUVUSE9EX0VsZW1lbnRUeXBlUHRyKHVpbnQzMiBvcCwgQXNzZW1ibHkqIGFzcywKLSAgICB1aW50MzImIG9mZnNldCwgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCkgewotICBWTUNvbW1vbkNsYXNzKiBjb250YWlucyA9IGFzcy0+ZXhwbG9yZVR5cGUob2Zmc2V0LCBnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLSAgcmV0dXJuIGFzcy0+Y29uc3RydWN0UG9pbnRlcihjb250YWlucywgMSk7Ci19Ci0KLXN0YXRpYyBWTUNvbW1vbkNsYXNzKiBNRVRIT0RfRWxlbWVudFR5cGVCeVJlZih1aW50MzIgb3AsIEFzc2VtYmx5KiBhc3MsCi0gICAgdWludDMyJiBvZmZzZXQsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgVk1Db21tb25DbGFzcyogY29udGFpbnMgPSBhc3MtPmV4cGxvcmVUeXBlKG9mZnNldCwgZ2VuQ2xhc3MsIGdlbk1ldGhvZCk7Ci0gIHJldHVybiBhc3MtPmNvbnN0cnVjdFBvaW50ZXIoY29udGFpbnMsIDEpOwotfQotCi1zdGF0aWMgVk1Db21tb25DbGFzcyogTUVUSE9EX0VsZW1lbnRUeXBlVmFsdWVUeXBlKHVpbnQzMiBvcCwgQXNzZW1ibHkqIGFzcywKLSAgICB1aW50MzImIG9mZnNldCwgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCkgewotICB1aW50MzIgdmFsdWUgPSBhc3MtPnVuY29tcHJlc3NTaWduYXR1cmUob2Zmc2V0KTsKLSAgdWludDMyIHRhYmxlID0gdmFsdWUgJiAzOwotICB1aW50MzIgaW5kZXggPSB2YWx1ZSA+PiAyOwotICB1aW50MzIgdG9rZW4gPSAwOwotCi0gIHN3aXRjaCAodGFibGUpIHsKLSAgY2FzZSAwOgotICAgIHRhYmxlID0gQ09OU1RBTlRfVHlwZURlZjsKLSAgICBicmVhazsKLSAgY2FzZSAxOgotICAgIHRhYmxlID0gQ09OU1RBTlRfVHlwZVJlZjsKLSAgICBicmVhazsKLSAgY2FzZSAyOgotICAgIHRhYmxlID0gQ09OU1RBTlRfVHlwZVNwZWM7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigidW5rbm93biBUeXBlRGVmT3JSZWZFbmNvZGVkICVkIiwgaW5kZXgpOwotICAgIGJyZWFrOwotICB9Ci0KLSAgdG9rZW4gPSAodGFibGUgPDwgMjQpICsgaW5kZXg7Ci0gIFZNQ29tbW9uQ2xhc3MqIGNsID0gYXNzLT5sb2FkVHlwZSgoTjMqKSAoVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpKSwgdG9rZW4sIGZhbHNlLAotICAgICAgZmFsc2UsIGZhbHNlLCB0cnVlLCBnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLSAgcmV0dXJuIGNsOwotfQotCi1zdGF0aWMgVk1Db21tb25DbGFzcyogTUVUSE9EX0VsZW1lbnRUeXBlQ2xhc3ModWludDMyIG9wLCBBc3NlbWJseSogYXNzLAotICAgIHVpbnQzMiYgb2Zmc2V0LCBWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKSB7Ci0gIHVpbnQzMiB2YWx1ZSA9IGFzcy0+dW5jb21wcmVzc1NpZ25hdHVyZShvZmZzZXQpOwotICB1aW50MzIgdGFibGUgPSB2YWx1ZSAmIDM7Ci0gIHVpbnQzMiBpbmRleCA9IHZhbHVlID4+IDI7Ci0gIHVpbnQzMiB0b2tlbiA9IDA7Ci0KLSAgc3dpdGNoICh0YWJsZSkgewotICBjYXNlIDA6Ci0gICAgdGFibGUgPSBDT05TVEFOVF9UeXBlRGVmOwotICAgIGJyZWFrOwotICBjYXNlIDE6Ci0gICAgdGFibGUgPSBDT05TVEFOVF9UeXBlUmVmOwotICAgIGJyZWFrOwotICBjYXNlIDI6Ci0gICAgdGFibGUgPSBDT05TVEFOVF9UeXBlU3BlYzsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJ1bmtub3duIFR5cGVEZWZPclJlZkVuY29kZWQgJWQiLCBpbmRleCk7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICB0b2tlbiA9ICh0YWJsZSA8PCAyNCkgKyBpbmRleDsKLSAgVk1Db21tb25DbGFzcyogY2wgPSBhc3MtPmxvYWRUeXBlKChOMyopIChWTVRocmVhZDo6Z2V0KCktPmdldFZNKCkpLCB0b2tlbiwgZmFsc2UsCi0gICAgICBmYWxzZSwgZmFsc2UsIHRydWUsIGdlbkNsYXNzLCBnZW5NZXRob2QpOwotICByZXR1cm4gY2w7Ci19Ci0KLXN0YXRpYyBWTUNvbW1vbkNsYXNzKiBNRVRIT0RfRWxlbWVudFR5cGVWYXIodWludDMyIG9wLCBBc3NlbWJseSogYXNzLAotICAgIHVpbnQzMiYgb2Zmc2V0LCBWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKSB7Ci0gIHVpbnQzMiBudW1iZXIgPSBhc3MtPnVuY29tcHJlc3NTaWduYXR1cmUob2Zmc2V0KTsKLQotICBhc3NlcnQoZ2VuQ2xhc3MgIT0gTlVMTCAmJiAiQ3VycmVudCBHZW5lcmljIENsYXNzIG5vdCBzZXQhIik7Ci0KLSAgcmV0dXJuIGdlbkNsYXNzLT5nZW5lcmljUGFyYW1zW251bWJlcl07Ci19Ci0KLXN0YXRpYyBWTUNvbW1vbkNsYXNzKiBNRVRIT0RfRWxlbWVudFR5cGVBcnJheSh1aW50MzIgb3AsIEFzc2VtYmx5KiBhc3MsCi0gICAgdWludDMyJiBvZmZzZXQsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgVk1Db21tb25DbGFzcyogY2wgPSBhc3MtPmV4cGxvcmVUeXBlKG9mZnNldCwgZ2VuQ2xhc3MsIGdlbk1ldGhvZCk7Ci0gIHVpbnQzMiByYW5rID0gYXNzLT51bmNvbXByZXNzU2lnbmF0dXJlKG9mZnNldCk7Ci0gIHVpbnQzMiBudW1TaXplcyA9IGFzcy0+dW5jb21wcmVzc1NpZ25hdHVyZShvZmZzZXQpOwotCi0gIGlmIChudW1TaXplcyAhPSAwKSB7Ci0gICAgcHJpbnRmKCJ0eXBlID0gJXNcbiIsIG12bTo6UHJpbnRCdWZmZXIoY2wpLmNTdHJpbmcoKSk7Ci0gICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gIH0KLQotICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IG51bVNpemVzOyArK2kpIHsKLSAgICBhc3MtPnVuY29tcHJlc3NTaWduYXR1cmUob2Zmc2V0KTsKLSAgfQotCi0gIHVpbnQzMiBudW1PYm91bmRzID0gYXNzLT51bmNvbXByZXNzU2lnbmF0dXJlKG9mZnNldCk7Ci0gIGlmIChudW1PYm91bmRzICE9IDApCi0gICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0KLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBudW1PYm91bmRzOyArK2kpIHsKLSAgICBhc3MtPnVuY29tcHJlc3NTaWduYXR1cmUob2Zmc2V0KTsKLSAgfQotCi0gIFZNQ2xhc3NBcnJheSogYXJyYXkgPSBhc3MtPmNvbnN0cnVjdEFycmF5KGNsLCByYW5rKTsKLSAgcmV0dXJuIGFycmF5OwotfQotCi1zdGF0aWMgVk1Db21tb25DbGFzcyogTUVUSE9EX0VsZW1lbnRUeXBlR2VuZXJpY0luc3QodWludDMyIG9wLCBBc3NlbWJseSogYXNzLAotICAgIHVpbnQzMiYgb2Zmc2V0LCBWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKSB7Ci0gIC8vIG9mZnNldCBwb2ludHMgdG8gKENMQVNTIHwgVkFMVUVUWVBFKSBUeXBlRGVmT3JSZWZFbmNvZGVkCi0KLSAgLy8gc2tpcCBnZW5lcmljIHR5cGUgZGVmaW5pdGlvbgotICBvZmZzZXQrKzsgLy8gdGhpcyBpcyAoQ0xBU1MgfCBWQUxVRVRZUEUpCi0KLSAgLy8gc2F2ZSBzdGFydGluZyBvZmZzZXQgZm9yIGxhdGVyIHVzZQotICB1aW50MzIgZ2VuZXJpY1R5cGVPZmZzZXQgPSBvZmZzZXQ7Ci0KLSAgYXNzLT51bmNvbXByZXNzU2lnbmF0dXJlKG9mZnNldCk7IC8vIFR5cGVEZWZPclJlZkVuY29kZWQKLQotICAvL1ZNQ29tbW9uQ2xhc3MqIGNsID0gYXNzLT5leHBsb3JlVHlwZShvZmZzZXQpOwotCi0gIHVpbnQzMiBhcmdDb3VudCA9IGFzcy0+dW5jb21wcmVzc1NpZ25hdHVyZShvZmZzZXQpOwotCi0gIHN0ZDo6dmVjdG9yPFZNQ29tbW9uQ2xhc3MqPiBhcmdzOwotCi0gIC8vIEdldCBnZW5lcmljIGFyZ3VtZW50cy4KLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBhcmdDb3VudDsgKytpKSB7Ci0gICAgYXJncy5wdXNoX2JhY2soYXNzLT5leHBsb3JlVHlwZShvZmZzZXQsIGdlbkNsYXNzLCBnZW5NZXRob2QpKTsKLSAgfQotCi0gIC8vIHNhdmUgb2Zmc2V0Ci0gIHVpbnQzMiBlbmRPZmZzZXQgPSBvZmZzZXQ7Ci0gIC8vIHJlc3RvcmUgc3RhcnRpbmcgb2Zmc2V0Ci0gIG9mZnNldCA9IGdlbmVyaWNUeXBlT2Zmc2V0OwotCi0gIC8vIFR5cGVEZWZPclJlZkVuY29kZWQKLSAgdWludDMyIHZhbHVlID0gYXNzLT51bmNvbXByZXNzU2lnbmF0dXJlKG9mZnNldCk7Ci0gIHVpbnQzMiB0YWJsZSA9IHZhbHVlICYgMzsKLSAgdWludDMyIGluZGV4ID0gdmFsdWUgPj4gMjsKLSAgdWludDMyIHRva2VuID0gMDsKLQotICBzd2l0Y2ggKHRhYmxlKSB7Ci0gIGNhc2UgMDoKLSAgICB0YWJsZSA9IENPTlNUQU5UX1R5cGVEZWY7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgMToKLSAgICB0YWJsZSA9IENPTlNUQU5UX1R5cGVSZWY7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgMjoKLSAgICB0YWJsZSA9IENPTlNUQU5UX1R5cGVTcGVjOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoInVua25vd24gVHlwZURlZk9yUmVmRW5jb2RlZCAlZCIsIGluZGV4KTsKLSAgICBicmVhazsKLSAgfQotCi0gIHRva2VuID0gKHRhYmxlIDw8IDI0KSArIGluZGV4OwotICBWTUNvbW1vbkNsYXNzKiBjbCA9IGFzcy0+bG9hZFR5cGUoKE4zKikgKFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKSksIHRva2VuLCBmYWxzZSwKLSAgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgYXJncywgZ2VuQ2xhc3MsIGdlbk1ldGhvZCk7Ci0gIC8vIHJlc3RvcmUgZW5kT2Zmc2V0Ci0gIG9mZnNldCA9IGVuZE9mZnNldDsKLQotICByZXR1cm4gY2w7Ci19Ci0KLXN0YXRpYyBWTUNvbW1vbkNsYXNzKiBNRVRIT0RfRWxlbWVudFR5cGVUeXBlZEJ5UmVmKHVpbnQzMiBvcCwgQXNzZW1ibHkqIGFzcywKLSAgICB1aW50MzImIG9mZnNldCwgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCkgewotICByZXR1cm4gTVNDb3JsaWI6OnR5cGVkUmVmZXJlbmNlOwotfQotCi1zdGF0aWMgVk1Db21tb25DbGFzcyogTUVUSE9EX0VsZW1lbnRUeXBlSSh1aW50MzIgb3AsIEFzc2VtYmx5KiBhc3MsCi0gICAgdWludDMyJiBvZmZzZXQsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgcmV0dXJuIE1TQ29ybGliOjpwSW50UHRyOwotfQotCi1zdGF0aWMgVk1Db21tb25DbGFzcyogTUVUSE9EX0VsZW1lbnRUeXBlVSh1aW50MzIgb3AsIEFzc2VtYmx5KiBhc3MsCi0gICAgdWludDMyJiBvZmZzZXQsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgcmV0dXJuIE1TQ29ybGliOjpwVUludFB0cjsKLX0KLQotc3RhdGljIFZNQ29tbW9uQ2xhc3MqIE1FVEhPRF9FbGVtZW50VHlwZUZucHRyKHVpbnQzMiBvcCwgQXNzZW1ibHkqIGFzcywKLSAgICB1aW50MzImIG9mZnNldCwgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCkgewotICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBWTUNvbW1vbkNsYXNzKiBNRVRIT0RfRWxlbWVudFR5cGVPYmplY3QodWludDMyIG9wLCBBc3NlbWJseSogYXNzLAotICAgIHVpbnQzMiYgb2Zmc2V0LCBWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKSB7Ci0gIHJldHVybiBNU0NvcmxpYjo6cE9iamVjdDsKLX0KLQotc3RhdGljIFZNQ29tbW9uQ2xhc3MqIE1FVEhPRF9FbGVtZW50VHlwZVN6YXJyYXkodWludDMyIG9wLCBBc3NlbWJseSogYXNzLAotICAgIHVpbnQzMiYgb2Zmc2V0LCBWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKSB7Ci0gIFZNQ29tbW9uQ2xhc3MqIGNvbnRhaW5zID0gYXNzLT5leHBsb3JlVHlwZShvZmZzZXQsIGdlbkNsYXNzLCBnZW5NZXRob2QpOwotICBWTUNsYXNzQXJyYXkqIHJlcyA9IGFzcy0+Y29uc3RydWN0QXJyYXkoY29udGFpbnMsIDEpOwotICByZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgVk1Db21tb25DbGFzcyogTUVUSE9EX0VsZW1lbnRUeXBlTXZhcih1aW50MzIgb3AsIEFzc2VtYmx5KiBhc3MsCi0gICAgdWludDMyJiBvZmZzZXQsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kICpjdXJyR2VuZXJpY01ldGhvZCkgewotICB1aW50MzIgbnVtYmVyID0gYXNzLT51bmNvbXByZXNzU2lnbmF0dXJlKG9mZnNldCk7Ci0KLSAgaWYgKGN1cnJHZW5lcmljTWV0aG9kID09IE5VTEwpIHsKLSAgICAvLyB3aGVuIHJlYWRpbmcgaW4gc2lnbmF0dXJlcyB3aGljaCBjb250YWluIHJlZmVyZW5jZXMgdG8gZ2VuZXJpYyBhcmd1bWVudHMKLSAgICAvLyBvZiBnZW5lcmljIG1ldGhvZHMgd2UgbmVlZCBjcmVhdGUgYSBwbGFjZWhvbGRlciBmb3IgZWFjaCBvZiB0aGVtLAotICAgIC8vIHRoaXMgaXMgZG9uZSBieSBjcmVhdGluZyBhIGR1bW15IFZNQ2xhc3Mgd2hpY2ggaGFzIHRoZSBhc3NlbWJseSBmaWVsZAotICAgIC8vIHNldCB0byBOVUxMLCB0aGUgdG9rZW4gZmllbGQgaXMgdXNlZCB0byBzdG9yZSB0aGUgZ2VuZXJpYyBhcmd1bWVudCBudW1iZXIKLSAgICBWTUNsYXNzKiBjbCA9IG5ldyhhc3MtPmFsbG9jYXRvciwgIlZNQ2xhc3MiKSBWTUNsYXNzKCk7Ci0gICAgY2wtPnRva2VuID0gbnVtYmVyOwotICAgIGNsLT5hc3NlbWJseSA9IGFzczsKLSAgICBjbC0+bmFtZVNwYWNlID0gYXNzLT5uYW1lOwotICAgIGNoYXIgKnRtcCA9IChjaGFyICopIGFsbG9jYSgxMDApOwotICAgIHNucHJpbnRmKHRtcCwgMTAwLCAiISElZCIsIG51bWJlcik7Ci0gICAgY2wtPm5hbWUgPSBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmFzY2lpelRvVVRGOCh0bXApOwotICAgIHJldHVybiBjbDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gY3VyckdlbmVyaWNNZXRob2QtPmdlbmVyaWNQYXJhbXNbbnVtYmVyXTsKLSAgfQotfQotCi1zdGF0aWMgVk1Db21tb25DbGFzcyogTUVUSE9EX0VsZW1lbnRUeXBlQ21vZFJlcWQodWludDMyIG9wLCBBc3NlbWJseSogYXNzLAotICAgIHVpbnQzMiYgb2Zmc2V0LCBWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKSB7Ci0gIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIFZNQ29tbW9uQ2xhc3MqIE1FVEhPRF9FbGVtZW50VHlwZUNtb2RPcHQodWludDMyIG9wLCBBc3NlbWJseSogYXNzLAotICAgIHVpbnQzMiYgb2Zmc2V0LCBWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKSB7Ci0gIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIFZNQ29tbW9uQ2xhc3MqIE1FVEhPRF9FbGVtZW50VHlwZUludGVybmFsKHVpbnQzMiBvcCwgQXNzZW1ibHkqIGFzcywKLSAgICB1aW50MzImIG9mZnNldCwgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCkgewotICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBWTUNvbW1vbkNsYXNzKiBNRVRIT0RfRWxlbWVudFR5cGVNb2RpZmllcih1aW50MzIgb3AsIEFzc2VtYmx5KiBhc3MsCi0gICAgdWludDMyJiBvZmZzZXQsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgVk1Db21tb25DbGFzcyogTUVUSE9EX0VsZW1lbnRUeXBlU2VudGluZWwodWludDMyIG9wLCBBc3NlbWJseSogYXNzLAotICAgIHVpbnQzMiYgb2Zmc2V0LCBWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKSB7Ci0gIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIFZNQ29tbW9uQ2xhc3MqIE1FVEhPRF9FbGVtZW50VHlwZVBpbm5lZCh1aW50MzIgb3AsIEFzc2VtYmx5KiBhc3MsCi0gICAgdWludDMyJiBvZmZzZXQsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBWTUNvbW1vbkNsYXNzKiB1bmltcGxlbWVudGVkKHVpbnQzMiBvcCwgQXNzZW1ibHkqIGFzcywgdWludDMyJiBvZmZzZXQsCi0gICAgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCkgewotICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJ1bmtub3duIHNpZ25hdHVyZSIpOwotICByZXR1cm4gMDsKLX0KLQotc2lnbmF0dXJlVmVjdG9yX3QgQXNzZW1ibHk6OnNpZ25hdHVyZVZlY3RvclsweDQ2XSA9IHsgTUVUSE9EX0VsZW1lbnRUeXBlRW5kLCAvLyAweDAwCi0gICAgTUVUSE9EX0VsZW1lbnRUeXBlVm9pZCwgLy8gMHgwMQotICAgIE1FVEhPRF9FbGVtZW50VHlwZUJvb2xlYW4sIC8vIDB4MDIKLSAgICBNRVRIT0RfRWxlbWVudFR5cGVDaGFyLCAvLyAweDAzCi0gICAgTUVUSE9EX0VsZW1lbnRUeXBlSTEsIC8vIDB4MDQKLSAgICBNRVRIT0RfRWxlbWVudFR5cGVVMSwgLy8gMHgwNQotICAgIE1FVEhPRF9FbGVtZW50VHlwZUkyLCAvLyAweDA2Ci0gICAgTUVUSE9EX0VsZW1lbnRUeXBlVTIsIC8vIDB4MDcKLSAgICBNRVRIT0RfRWxlbWVudFR5cGVJNCwgLy8gMHgwOAotICAgIE1FVEhPRF9FbGVtZW50VHlwZVU0LCAvLyAweDA5Ci0gICAgTUVUSE9EX0VsZW1lbnRUeXBlSTgsIC8vIDB4MEEKLSAgICBNRVRIT0RfRWxlbWVudFR5cGVVOCwgLy8gMHgwQgotICAgIE1FVEhPRF9FbGVtZW50VHlwZVI0LCAvLyAweDBDCi0gICAgTUVUSE9EX0VsZW1lbnRUeXBlUjgsIC8vIDB4MEQKLSAgICBNRVRIT0RfRWxlbWVudFR5cGVTdHJpbmcsIC8vIDB4MEUKLSAgICBNRVRIT0RfRWxlbWVudFR5cGVQdHIsIC8vIDB4MUYKLSAgICBNRVRIT0RfRWxlbWVudFR5cGVCeVJlZiwgLy8gMHgxMAotICAgIE1FVEhPRF9FbGVtZW50VHlwZVZhbHVlVHlwZSwgLy8gMHgxMQotICAgIE1FVEhPRF9FbGVtZW50VHlwZUNsYXNzLCAvLyAweDEyCi0gICAgTUVUSE9EX0VsZW1lbnRUeXBlVmFyLCAvLyAweDEzCi0gICAgTUVUSE9EX0VsZW1lbnRUeXBlQXJyYXksIC8vIDB4MTQKLSAgICBNRVRIT0RfRWxlbWVudFR5cGVHZW5lcmljSW5zdCwgLy8gMHgxNQotICAgIE1FVEhPRF9FbGVtZW50VHlwZVR5cGVkQnlSZWYsIC8vIDB4MTYKLSAgICB1bmltcGxlbWVudGVkLCAvLyAweDE3Ci0gICAgTUVUSE9EX0VsZW1lbnRUeXBlSSwgLy8gMHgxOAotICAgIE1FVEhPRF9FbGVtZW50VHlwZVUsIC8vIDB4MTkKLSAgICB1bmltcGxlbWVudGVkLCAvLyAweDFBCi0gICAgTUVUSE9EX0VsZW1lbnRUeXBlRm5wdHIsIC8vIDB4MUIKLSAgICBNRVRIT0RfRWxlbWVudFR5cGVPYmplY3QsIC8vIDB4MUMKLSAgICBNRVRIT0RfRWxlbWVudFR5cGVTemFycmF5LCAvLyAweDFECi0gICAgTUVUSE9EX0VsZW1lbnRUeXBlTXZhciwgLy8gMHgxRQotICAgIE1FVEhPRF9FbGVtZW50VHlwZUNtb2RSZXFkLCAvLyAweDFGCi0gICAgTUVUSE9EX0VsZW1lbnRUeXBlQ21vZE9wdCwgLy8gMHgyMAotICAgIE1FVEhPRF9FbGVtZW50VHlwZUludGVybmFsLCAvLyAweDIxCi0gICAgTUVUSE9EX0VsZW1lbnRUeXBlTW9kaWZpZXIsIC8vIDB4MjIKLSAgICB1bmltcGxlbWVudGVkLCAvLyAweDIzCi0gICAgdW5pbXBsZW1lbnRlZCwgLy8gMHgyNAotICAgIHVuaW1wbGVtZW50ZWQsIC8vIDB4MjUKLSAgICB1bmltcGxlbWVudGVkLCAvLyAweDI2Ci0gICAgdW5pbXBsZW1lbnRlZCwgLy8gMHgyNwotICAgIHVuaW1wbGVtZW50ZWQsIC8vIDB4MjgKLSAgICB1bmltcGxlbWVudGVkLCAvLyAweDI5Ci0gICAgdW5pbXBsZW1lbnRlZCwgLy8gMHgyQQotICAgIHVuaW1wbGVtZW50ZWQsIC8vIDB4MkIKLSAgICB1bmltcGxlbWVudGVkLCAvLyAweDJDCi0gICAgdW5pbXBsZW1lbnRlZCwgLy8gMHgyRAotICAgIHVuaW1wbGVtZW50ZWQsIC8vIDB4MkUKLSAgICB1bmltcGxlbWVudGVkLCAvLyAweDJGCi0gICAgdW5pbXBsZW1lbnRlZCwgLy8gMHgzMAotICAgIHVuaW1wbGVtZW50ZWQsIC8vIDB4MzEKLSAgICB1bmltcGxlbWVudGVkLCAvLyAweDMyCi0gICAgdW5pbXBsZW1lbnRlZCwgLy8gMHgzMwotICAgIHVuaW1wbGVtZW50ZWQsIC8vIDB4MzQKLSAgICB1bmltcGxlbWVudGVkLCAvLyAweDM1Ci0gICAgdW5pbXBsZW1lbnRlZCwgLy8gMHgzNgotICAgIHVuaW1wbGVtZW50ZWQsIC8vIDB4MzcKLSAgICB1bmltcGxlbWVudGVkLCAvLyAweDM4Ci0gICAgdW5pbXBsZW1lbnRlZCwgLy8gMHgzOQotICAgIHVuaW1wbGVtZW50ZWQsIC8vIDB4M0EKLSAgICB1bmltcGxlbWVudGVkLCAvLyAweDNCCi0gICAgdW5pbXBsZW1lbnRlZCwgLy8gMHgzQwotICAgIHVuaW1wbGVtZW50ZWQsIC8vIDB4M0QKLSAgICB1bmltcGxlbWVudGVkLCAvLyAweDNFCi0gICAgdW5pbXBsZW1lbnRlZCwgLy8gMHgzRgotICAgIHVuaW1wbGVtZW50ZWQsIC8vIDB4NDAKLSAgICBNRVRIT0RfRWxlbWVudFR5cGVTZW50aW5lbCwgLy8gMHg0MQotICAgIHVuaW1wbGVtZW50ZWQsIC8vIDB4NDIKLSAgICB1bmltcGxlbWVudGVkLCAvLyAweDQzCi0gICAgdW5pbXBsZW1lbnRlZCwgLy8gMHg0NAotICAgIE1FVEhPRF9FbGVtZW50VHlwZVBpbm5lZCAvLyAweDQ1Ci0gICAgfTsKLQotYm9vbCBBc3NlbWJseTo6ZXh0cmFjdE1ldGhvZFNpZ25hdHVyZSh1aW50MzImIG9mZnNldCwgVk1Db21tb25DbGFzcyogY2wsCi0gICAgc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+JiB0eXBlcywgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCkgewotICAvL3VpbnQzMiBjb3VudCAgICAgID0gCi0gIHVuY29tcHJlc3NTaWduYXR1cmUob2Zmc2V0KTsKLSAgdWludDMyIGNhbGwgPSB1bmNvbXByZXNzU2lnbmF0dXJlKG9mZnNldCk7Ci0KLSAgaWYgKGNhbGwgJiBDT05TVEFOVF9HZW5lcmljKSB7Ci0gICAgLy91aW50MzIgZ2VuQXJnQ291bnQgPQotICAgIHVuY29tcHJlc3NTaWduYXR1cmUob2Zmc2V0KTsKLSAgfQotCi0gIHVpbnQzMiBwYXJhbUNvdW50ID0gdW5jb21wcmVzc1NpZ25hdHVyZShvZmZzZXQpOwotCi0gIHVpbnQzMiBoYXNUaGlzID0gY2FsbCAmIENPTlNUQU5UX0hhc1RoaXMgPyAxIDogMDsKLSAgdWludDMyIHJlYWxDb3VudCA9IHBhcmFtQ291bnQgKyBoYXNUaGlzOwotCi0gIFZNQ29tbW9uQ2xhc3MqIHJldCA9IGV4cGxvcmVUeXBlKG9mZnNldCwgZ2VuQ2xhc3MsIGdlbk1ldGhvZCk7Ci0gIHR5cGVzLnB1c2hfYmFjayhyZXQpOwotCi0gIGlmIChoYXNUaGlzKSB7Ci0gICAgdHlwZXMucHVzaF9iYWNrKGNsKTsKLSAgfQotCi0gIGZvciAodWludDMyIGkgPSBoYXNUaGlzOyBpIDwgcmVhbENvdW50OyArK2kpIHsKLSAgICBWTUNvbW1vbkNsYXNzKiBjdXIgPSBleHBsb3JlVHlwZShvZmZzZXQsIGdlbkNsYXNzLCBnZW5NZXRob2QpOwotICAgIHR5cGVzLnB1c2hfYmFjayhjdXIpOwotICB9Ci0KLSAgcmV0dXJuIGhhc1RoaXMgIT0gMDsKLX0KLQotLy8gY2hlY2tzIHdoZXRoZXIgdGhlIE1ldGhvZERlZlNpZyBhdCBvZmZzZXQgY29udGFpbnMgZ2VuZXJpYyBwYXJhbWV0ZXJzCi1ib29sIEFzc2VtYmx5Ojppc0dlbmVyaWNNZXRob2QodWludDMyJiBvZmZzZXQpIHsKLSAgdW5jb21wcmVzc1NpZ25hdHVyZShvZmZzZXQpOyAvLyBjb3VudAotCi0gIHVpbnQzMiBjYWxsaW5nQ29udmVudGlvbiA9IFJFQURfVTEoYnl0ZXMsIG9mZnNldCk7Ci0KLSAgcmV0dXJuIGNhbGxpbmdDb252ZW50aW9uICYgQ09OU1RBTlRfR2VuZXJpYyA/IHRydWUgOiBmYWxzZTsKLX0KLQotdm9pZCBBc3NlbWJseTo6bWV0aG9kU3BlY1NpZ25hdHVyZSh1aW50MzImIG9mZnNldCwKLSAgICBzdGQ6OnZlY3RvcjxWTUNvbW1vbkNsYXNzKj4mIGdlbkFyZ3MsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgdW5jb21wcmVzc1NpZ25hdHVyZShvZmZzZXQpOyAvLyBjb3VudAotICB1aW50MzIgZ2VuZXJpY1NpZyA9IHVuY29tcHJlc3NTaWduYXR1cmUob2Zmc2V0KTsKLQotICBpZiAoZ2VuZXJpY1NpZyAhPSAweDBhKSB7Ci0gICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigidW5rbm93biBtZXRob2RTcGVjIHNpZyAleCIsIGdlbmVyaWNTaWcpOwotICB9Ci0KLSAgdWludDMyIGdlbkFyZ0NvdW50ID0gdW5jb21wcmVzc1NpZ25hdHVyZShvZmZzZXQpOwotCi0gIGZvciAodWludDMyIGkgPSAwOyBpIDwgZ2VuQXJnQ291bnQ7IGkrKykgewotICAgIGdlbkFyZ3MucHVzaF9iYWNrKGV4cGxvcmVUeXBlKG9mZnNldCwgZ2VuQ2xhc3MsIGdlbk1ldGhvZCkpOwotICB9Ci19Ci0KLXZvaWQgQXNzZW1ibHk6OmxvY2FsVmFyU2lnbmF0dXJlKHVpbnQzMiYgb2Zmc2V0LAotICAgIHN0ZDo6dmVjdG9yPFZNQ29tbW9uQ2xhc3MqPiYgbG9jYWxzLCBWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKSB7Ci0gIC8vdWludDMyIGNvdW50ICAgICAgPSAKLSAgdW5jb21wcmVzc1NpZ25hdHVyZShvZmZzZXQpOwotICB1aW50MzIgbG9jYWxTaWcgPSB1bmNvbXByZXNzU2lnbmF0dXJlKG9mZnNldCk7Ci0gIHVpbnQzMiBuYkxvY2FscyA9IHVuY29tcHJlc3NTaWduYXR1cmUob2Zmc2V0KTsKLQotICBpZiAobG9jYWxTaWcgIT0gMHg3KSB7Ci0gICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigidW5rbm93biBsb2NhbCBzaWcgJXgiLCBsb2NhbFNpZyk7Ci0gIH0KLQotICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IG5iTG9jYWxzOyArK2kpIHsKLSAgICBWTUNvbW1vbkNsYXNzKiBjbCA9IGV4cGxvcmVUeXBlKG9mZnNldCwgZ2VuQ2xhc3MsIGdlbk1ldGhvZCk7Ci0gICAgaWYgKCFjbCkKLSAgICAgIC0taTsgLy8gUElOTkVECi0gICAgZWxzZQotICAgICAgbG9jYWxzLnB1c2hfYmFjayhjbCk7Ci0gIH0KLX0KLQotVk1Db21tb25DbGFzcyogQXNzZW1ibHk6OmV4dHJhY3RGaWVsZFNpZ25hdHVyZSh1aW50MzImIG9mZnNldCwgVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCkgewotICAvL3VpbnQzMiBjb3VudCAgICAgID0gCi0gIHVuY29tcHJlc3NTaWduYXR1cmUob2Zmc2V0KTsKLSAgdWludDMyIGZpZWxkU2lnID0gdW5jb21wcmVzc1NpZ25hdHVyZShvZmZzZXQpOwotCi0gIGlmIChmaWVsZFNpZyAhPSAweDYpIHsKLSAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJ1bmtub3duIGZpZWxkIHNpZyAleCIsIGZpZWxkU2lnKTsKLSAgfQotCi0gIC8vIFRPRE8gaW1wbGVtZW50IHN1cHBvcnQgZm9yIGN1c3RvbSBtb2RpZmllcnMKLSAgLy8gICAgICBzZWUgRUNNQSAzMzUgMjMuMi40LCAyMy4yLjcgCi0KLSAgcmV0dXJuIGV4cGxvcmVUeXBlKG9mZnNldCwgZ2VuQ2xhc3MsIGdlbk1ldGhvZCk7Ci0KLX0KLQotVk1Db21tb25DbGFzcyogQXNzZW1ibHk6OmV4dHJhY3RUeXBlSW5TaWduYXR1cmUodWludDMyJiBvZmZzZXQsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgLy91aW50MzIgY291bnQgICAgICA9IAotICB1bmNvbXByZXNzU2lnbmF0dXJlKG9mZnNldCk7Ci0gIHJldHVybiBleHBsb3JlVHlwZShvZmZzZXQsIGdlbkNsYXNzLCBnZW5NZXRob2QpOwotfQotCi1WTUNvbW1vbkNsYXNzKiBBc3NlbWJseTo6ZXhwbG9yZVR5cGUodWludDMyJiBvZmZzZXQsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgdWludDMyIG9wID0gUkVBRF9VMShieXRlcywgb2Zmc2V0KTsKLSAgYXNzZXJ0KG9wIDwgMHg0NiAmJiAidW5rbm93biBzaWduYXR1cmUgdHlwZSIpOwotICByZXR1cm4gKHNpZ25hdHVyZVZlY3RvcltvcF0pIChvcCwgdGhpcywgb2Zmc2V0LCBnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLX0KLQotdWludDMyIEFzc2VtYmx5Ojp1bmNvbXByZXNzU2lnbmF0dXJlKHVpbnQzMiYgb2Zmc2V0KSB7Ci0gIHVpbnQzMiB2YWx1ZSA9IFJFQURfVTEoYnl0ZXMsIG9mZnNldCk7Ci0KLSAgaWYgKCh2YWx1ZSAmIDB4ODApID09IDApIHsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0gZWxzZSBpZiAoKHZhbHVlICYgMHg0MCkgPT0gMCkgewotICAgIHVpbnQzMiB2YWwyID0gUkVBRF9VMShieXRlcywgb2Zmc2V0KTsKLSAgICByZXR1cm4gKCgodmFsdWUgJiAweDNmKSA8PCA4KSB8IHZhbDIpOwotICB9IGVsc2UgewotICAgIHVpbnQzMiB2YWwyID0gUkVBRF9VMShieXRlcywgb2Zmc2V0KTsKLSAgICB1aW50MzIgdmFsMyA9IFJFQURfVTEoYnl0ZXMsIG9mZnNldCk7Ci0gICAgdWludDMyIHZhbDQgPSBSRUFEX1UxKGJ5dGVzLCBvZmZzZXQpOwotICAgIHJldHVybiAoKHZhbHVlICYgMHgxZikgPDwgMjQpIHwgKHZhbDIgPDwgMTYpIHwgKHZhbDMgPDwgOCkgfCB2YWw0OwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvTjMvVk1Db3JlL0NMSVN0cmluZy5oIGIvdm1raXQvbGliL04zL1ZNQ29yZS9DTElTdHJpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3NDdjMC4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTjMvVk1Db3JlL0NMSVN0cmluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy89PT0tLS0tLSBDTElTdHJpbmcuaCAtIEludGVybmFsIGNvcnJlc3BvbmRhbmNlIHdpdGggQ0xJIFN0cmluZ3MgLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMwotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgTjNfQ0xJX1NUUklOR19ICi0jZGVmaW5lIE4zX0NMSV9TVFJJTkdfSAotCi0jaW5jbHVkZSAibGx2bS9HbG9iYWxWYXJpYWJsZS5oIgotCi0jaW5jbHVkZSAidHlwZXMuaCIKLSNpbmNsdWRlICJtdm0vUHJpbnRCdWZmZXIuaCIKLQotI2luY2x1ZGUgIlZNT2JqZWN0LmgiCi0KLW5hbWVzcGFjZSBuMyB7Ci0KLWNsYXNzIE4zOwotY2xhc3MgQXJyYXlDaGFyOwotCi1jbGFzcyBDTElTdHJpbmcgOiBwdWJsaWMgVk1PYmplY3QgewotCUNMSVN0cmluZygpIHt9Ci1wdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBwcmludChtdm06OlByaW50QnVmZmVyKiBidWYpIGNvbnN0IHsKLSAgICBidWYtPndyaXRlKCJDTEkgc3RyaW5nIik7Ci0gIH0KLSAgCi0gIHN0YXRpYyBsbHZtOjpHbG9iYWxWYXJpYWJsZSogbGx2bVZhcihDTElTdHJpbmcgKnNlbGYpOwotCi0gIAotICBzdGF0aWMgQ0xJU3RyaW5nKiBzdHJpbmdEdXAoY29uc3QgQXJyYXlDaGFyKiBhcnJheSwgTjMqIHZtKTsKLX07Ci0KLX0gLy8gZW5kIG5hbWVzcGFjZSBqbmp2bQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvTGlua04zUnVudGltZS5oIGIvdm1raXQvbGliL04zL1ZNQ29yZS9MaW5rTjNSdW50aW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZGYwMjYuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL04zL1ZNQ29yZS9MaW5rTjNSdW50aW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpbmtOM1J1bnRpbWUuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy89PT0gLS0tLS0tLS0tLS0tLSBSZWZlcmVuY2UgYWxsIHJ1bnRpbWUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgSk5KVk1fTElOS19OM19SVU5USU1FX0gKLSNkZWZpbmUgSk5KVk1fTElOS19OM19SVU5USU1FX0gKLQotbmFtZXNwYWNlIG12bSB7Ci0JY2xhc3MgVVRGODsKLX0KLQotbmFtZXNwYWNlIG4zIHsKLQl1c2luZyBtdm06OlVURjg7Ci0gIGNsYXNzIENhY2hlTm9kZTsKLSAgY2xhc3MgVk1DbGFzczsKLSAgY2xhc3MgVk1DbGFzc0FycmF5OwotICBjbGFzcyBWTUNvbW1vbkNsYXNzOwotICBjbGFzcyBWTU9iamVjdDsKLX0KLQotdXNpbmcgbmFtZXNwYWNlIG4zOwotCi0KLWV4dGVybiAiQyIgVk1PYmplY3QqIGluaXRpYWxpc2VDbGFzcyhWTUNsYXNzKiBjbCk7Ci1leHRlcm4gIkMiIHZvaWQgbjNDbGFzc0Nhc3RFeGNlcHRpb24oKTsKLWV4dGVybiAiQyIgdm9pZCBuM051bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci1leHRlcm4gIkMiIHZvaWQgaW5kZXhPdXRPZkJvdW5kcygpOwotZXh0ZXJuICJDIiBWTU9iamVjdCogbmV3U3RyaW5nKGNvbnN0IFVURjgqIHV0ZjgpOwotZXh0ZXJuICJDIiBib29sIG4zSW5zdGFuY2VPZihWTU9iamVjdCogb2JqLCBWTUNvbW1vbkNsYXNzKiBjbCk7Ci1leHRlcm4gIkMiIHZvaWQqIEdldENwcEV4Y2VwdGlvbigpOwotZXh0ZXJuICJDIiB2b2lkIFRocm93RXhjZXB0aW9uKFZNT2JqZWN0KiBvYmopOwotZXh0ZXJuICJDIiBWTU9iamVjdCogR2V0Q0xJRXhjZXB0aW9uKCk7Ci1leHRlcm4gIkMiIGJvb2wgQ29tcGFyZUV4Y2VwdGlvbihWTUNsYXNzKiBjbCk7Ci1leHRlcm4gIkMiIHZvaWQgQ2xlYXJFeGNlcHRpb24oKTsKLWV4dGVybiAiQyIgVk1PYmplY3QqIGRvTXVsdGlOZXcoVk1DbGFzc0FycmF5KiBjbCwgLi4uKTsKLWV4dGVybiAiQyIgQ2FjaGVOb2RlKiBuM1ZpcnR1YWxMb29rdXAoQ2FjaGVOb2RlKiBjYWNoZSwgVk1PYmplY3QgKm9iaik7Ci1leHRlcm4gIkMiIFZNT2JqZWN0KiBuZXdPYmplY3QoVk1DbGFzcyogY2wpOwotZXh0ZXJuICJDIiBWTU9iamVjdCogbmV3QXJyYXkoVk1DbGFzc0FycmF5KiBjbCwgc2ludDMyIG5iKTsKLQotbmFtZXNwYWNlIHsKLSAgc3RydWN0IEZvcmNlUnVudGltZUxpbmtpbmcgewotICAgIEZvcmNlUnVudGltZUxpbmtpbmcoKSB7Ci0gICAgICAvLyBXZSBtdXN0IHJlZmVyZW5jZSB0aGUgcGFzc2VzIGluIHN1Y2ggYSB3YXkgdGhhdCBjb21waWxlcnMgd2lsbCBub3QKLSAgICAgIC8vIGRlbGV0ZSBpdCBhbGwgYXMgZGVhZCBjb2RlLCBldmVuIHdpdGggd2hvbGUgcHJvZ3JhbSBvcHRpbWl6YXRpb24sCi0gICAgICAvLyB5ZXQgaXMgZWZmZWN0aXZlbHkgYSBOTy1PUC4gQXMgdGhlIGNvbXBpbGVyIGlzbid0IHNtYXJ0IGVub3VnaAotICAgICAgLy8gdG8ga25vdyB0aGF0IGdldGVudigpIG5ldmVyIHJldHVybnMgLTEsIHRoaXMgd2lsbCBkbyB0aGUgam9iLgotICAgICAgaWYgKHN0ZDo6Z2V0ZW52KCJiYXIiKSAhPSAoY2hhciopIC0xKSAKLSAgICAgICAgcmV0dXJuOwotICAgICAgKHZvaWQpIGluaXRpYWxpc2VDbGFzcygwKTsKLSAgICAgICh2b2lkKSBuM0NsYXNzQ2FzdEV4Y2VwdGlvbigpOwotICAgICAgKHZvaWQgKW4zTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgICh2b2lkKSBpbmRleE91dE9mQm91bmRzKCk7Ci0gICAgICAodm9pZCkgbmV3U3RyaW5nKDApOwotICAgICAgKHZvaWQpIG4zSW5zdGFuY2VPZigwLCAwKTsKLSAgICAgICh2b2lkKSBHZXRDcHBFeGNlcHRpb24oKTsKLSAgICAgICh2b2lkKSBUaHJvd0V4Y2VwdGlvbigwKTsKLSAgICAgICh2b2lkKSBHZXRDTElFeGNlcHRpb24oKTsKLSAgICAgICh2b2lkKSBDb21wYXJlRXhjZXB0aW9uKDApOwotICAgICAgKHZvaWQpIENsZWFyRXhjZXB0aW9uKCk7Ci0gICAgICAodm9pZCkgZG9NdWx0aU5ldygwKTsKLSAgICAgICh2b2lkKSBuM1ZpcnR1YWxMb29rdXAoMCwgMCk7Ci0gICAgICAodm9pZCkgbmV3T2JqZWN0KDApOwotICAgICAgKHZvaWQpIG5ld0FycmF5KDAsIDApOwotICAgIH0KLSAgfSBGb3JjZVBhc3NMaW5raW5nOyAvLyBGb3JjZSBsaW5rIGJ5IGNyZWF0aW5nIGEgZ2xvYmFsIGRlZmluaXRpb24uCi19Ci0gIAotCi0KLSNlbmRpZiAvL0pOSlZNX0xJTktfTjNfUlVOVElNRV9ICmRpZmYgLS1naXQgYS92bWtpdC9saWIvTjMvVk1Db3JlL0xvY2tlZE1hcC5jcHAgYi92bWtpdC9saWIvTjMvVk1Db3JlL0xvY2tlZE1hcC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Yzc3YmMuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL04zL1ZNQ29yZS9Mb2NrZWRNYXAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLy89PT0tLS0tLS0tIExvY2tlZE1hcC5jcHAgLSBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgVVRGOCBtYXAgLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMwotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlIDxtYXA+Ci0KLSNpbmNsdWRlICJBc3NlbWJseS5oIgotI2luY2x1ZGUgIkxvY2tlZE1hcC5oIgotI2luY2x1ZGUgIk1TQ29ybGliLmgiCi0jaW5jbHVkZSAiTjMuaCIKLSNpbmNsdWRlICJWTUFycmF5LmgiCi0jaW5jbHVkZSAiVk1DbGFzcy5oIgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBuMzsKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvTG9ja2VkTWFwLmggYi92bWtpdC9saWIvTjMvVk1Db3JlL0xvY2tlZE1hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWQyNTY0Li4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvTG9ja2VkTWFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLy89PT0tLS0tLS0tIExvY2tlZE1hcC5oIC0gQSB0aHJlYWQtc2FmZSBtYXAgaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMwotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgTjNfTE9DS0VEX01BUF9ICi0jZGVmaW5lIE4zX0xPQ0tFRF9NQVBfSAotCi0jaW5jbHVkZSA8bWFwPgotCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgIm12bS9PYmplY3QuaCIKLSNpbmNsdWRlICJtdm0vUHJpbnRCdWZmZXIuaCIKLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9Mb2Nrcy5oIgotCi0jaW5jbHVkZSAidHlwZXMuaCIKLQotI2luY2x1ZGUgIkNMSVN0cmluZy5oIgotI2luY2x1ZGUgIlZNQXJyYXkuaCIKLQotI2luY2x1ZGUgIlVURjguaCIKLQotbmFtZXNwYWNlIG4zIHsKLQotY2xhc3MgQXNzZW1ibHk7Ci1jbGFzcyBOMzsKLWNsYXNzIFZNQ2xhc3M7Ci1jbGFzcyBWTUNvbW1vbkNsYXNzOwotY2xhc3MgVk1GaWVsZDsKLWNsYXNzIFZNT2JqZWN0OwotY2xhc3MgVk1NZXRob2Q7Ci1jbGFzcyBWTUZpZWxkOwotCi10ZW1wbGF0ZTxjbGFzcyBLZXksIGNsYXNzIENvbnRhaW5lciwgY2xhc3MgQ29tcGFyZSwgY2xhc3MgVXBjYWxsPgotY2xhc3MgTG9ja2VkTWFwIDogcHVibGljIG12bTo6UGVybWFuZW50T2JqZWN0IHsKLXB1YmxpYzoKLQotICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6bWFwPGNvbnN0IEtleSwgQ29udGFpbmVyKiwgQ29tcGFyZT46Oml0ZXJhdG9yIGl0ZXJhdG9yOwotICB0eXBlZGVmIENvbnRhaW5lciogKCpmdW5jQ3JlYXRlKShLZXkmIFYsIFVwY2FsbCogYXNzKTsKLQotICBtdm06OkxvY2sgKmxvY2s7Ci0gIHN0ZDo6bWFwPEtleSwgQ29udGFpbmVyKiwgQ29tcGFyZSwKLSAgICAgICAgICAgZ2NfYWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBLZXksIENvbnRhaW5lcio+ID4gPiBtYXA7Ci0KLQlMb2NrZWRNYXAobXZtOjpMb2NrICpsb2NrKSB7Ci0JCXRoaXMtPmxvY2sgPSBsb2NrOwotCX0KLSAgCi0gIGlubGluZSBDb250YWluZXIqIGxvb2t1cE9yQ3JlYXRlKEtleSYgViwgVXBjYWxsKiBhc3MsIGZ1bmNDcmVhdGUgZnVuYykgewotICAgIGxvY2stPmxvY2soKTsKLSAgICBpdGVyYXRvciBFbmQgPSBtYXAuZW5kKCk7Ci0gICAgaXRlcmF0b3IgSSA9IG1hcC5maW5kKFYpOwotICAgIGlmIChJID09IEVuZCkgewotICAgICAgQ29udGFpbmVyKiByZXMgPSBmdW5jKFYsIGFzcyk7Ci0gICAgICBtYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFYsIHJlcykpOwotICAgICAgbG9jay0+dW5sb2NrKCk7Ci0gICAgICByZXR1cm4gcmVzOwotICAgIH0gZWxzZSB7Ci0gICAgICBsb2NrLT51bmxvY2soKTsKLSAgICAgIHJldHVybiAoKENvbnRhaW5lciopKEktPnNlY29uZCkpOwotICAgIH0KLSAgfQotICAKLSAgaW5saW5lIENvbnRhaW5lciogbG9va3VwT3JDcmVhdGUoS2V5JlYsIENvbnRhaW5lciogQykgewotICAgIGxvY2stPmxvY2soKTsKLSAgICBpdGVyYXRvciBFbmQgPSBtYXAuZW5kKCk7Ci0gICAgaXRlcmF0b3IgSSA9IG1hcC5maW5kKFYpOwotICAgIGlmIChJID09IEVuZCkgewotICAgICAgbWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihWLCBDKSk7Ci0gICAgICBsb2NrLT51bmxvY2soKTsKLSAgICAgIHJldHVybiBDOwotICAgIH0gZWxzZSB7Ci0gICAgICBsb2NrLT51bmxvY2soKTsKLSAgICAgIHJldHVybiAoKENvbnRhaW5lciopKEktPnNlY29uZCkpOwotICAgIH0KLSAgfQotCi0gIGlubGluZSBDb250YWluZXIqIGxvb2t1cChLZXkmIFYpIHsKLSAgICBsb2NrLT5sb2NrKCk7Ci0gICAgaXRlcmF0b3IgRW5kID0gbWFwLmVuZCgpOwotICAgIGl0ZXJhdG9yIEkgPSBtYXAuZmluZChWKTsKLSAgICBsb2NrLT51bmxvY2soKTsKLSAgICByZXR1cm4gSSAhPSBFbmQgPyAoKENvbnRhaW5lciopKEktPnNlY29uZCkpIDogMDsgCi0gIH0KLQotICBpbmxpbmUgdm9pZCBoYXNoKEtleSYgaywgQ29udGFpbmVyKiBjKSB7Ci0gICAgbG9jay0+bG9jaygpOwotICAgIG1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoaywgYykpOwotICAgIGxvY2stPnVubG9jaygpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIHRyYWNlcigpIHsKLSAgICAvL2xvY2stPk1BUktfQU5EX1RSQUNFOwotICAgIGZvciAoaXRlcmF0b3IgaSA9IG1hcC5iZWdpbigpLCBlID0gbWFwLmVuZCgpOyBpIT0gZTsgKytpKSB7Ci0gICAgICBpLT5zZWNvbmQtPnRyYWNlcigpOwotICAgIH0KLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBwcmludChtdm06OlByaW50QnVmZmVyKiBidWYpIGNvbnN0IHsKLSAgICBidWYtPndyaXRlKCJIYXNodGFibGU8PiIpOwotICB9Ci0KLX07Ci0KLWNsYXNzIENsYXNzTmFtZUNtcCB7Ci1wdWJsaWM6Ci0gIGNvbnN0IFVURjgqIG5hbWU7Ci0gIGNvbnN0IFVURjgqIG5hbWVTcGFjZTsKLQotICBDbGFzc05hbWVDbXAoY29uc3QgVVRGOCogdSwgY29uc3QgVVRGOCogbikgOiBuYW1lKHUpLCBuYW1lU3BhY2Uobikge30KLQotICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgQ2xhc3NOYW1lQ21wICZjbXApIGNvbnN0IHsKLSAgICBpZiAobmFtZSA8IGNtcC5uYW1lKSByZXR1cm4gdHJ1ZTsKLSAgICBlbHNlIGlmIChuYW1lID4gY21wLm5hbWUpIHJldHVybiBmYWxzZTsKLSAgICBlbHNlIHJldHVybiBuYW1lU3BhY2UgPCBjbXAubmFtZVNwYWNlOwotICB9Ci19OwotCi0KLWNsYXNzIENsYXNzTmFtZU1hcCA6IHB1YmxpYyBMb2NrZWRNYXA8Q2xhc3NOYW1lQ21wLCBWTUNvbW1vbkNsYXNzLCBzdGQ6Omxlc3M8Q2xhc3NOYW1lQ21wPiwgQXNzZW1ibHkgPiB7Ci1wdWJsaWM6Ci0JQ2xhc3NOYW1lTWFwKCkgOiBMb2NrZWRNYXA8Q2xhc3NOYW1lQ21wLCBWTUNvbW1vbkNsYXNzLCBzdGQ6Omxlc3M8Q2xhc3NOYW1lQ21wPiwgQXNzZW1ibHkgPihuZXcgbXZtOjpMb2NrTm9ybWFsKCkpIHt9Ci19OwotCi1jbGFzcyBDbGFzc1Rva2VuTWFwIDogcHVibGljIExvY2tlZE1hcDx1aW50MzIsIFZNQ29tbW9uQ2xhc3MsIHN0ZDo6bGVzczx1aW50MzI+LCBBc3NlbWJseSA+IHsKLXB1YmxpYzoKLQlDbGFzc1Rva2VuTWFwKCkgOiBMb2NrZWRNYXA8dWludDMyLCBWTUNvbW1vbkNsYXNzLCBzdGQ6Omxlc3M8dWludDMyPiwgQXNzZW1ibHkgPihuZXcgbXZtOjpMb2NrTm9ybWFsKCkpIHt9Ci19OwotCi1jbGFzcyBGaWVsZFRva2VuTWFwIDogcHVibGljIExvY2tlZE1hcDx1aW50MzIsIFZNRmllbGQsIHN0ZDo6bGVzczx1aW50MzI+LCBBc3NlbWJseSA+IHsKLXB1YmxpYzoKLQlGaWVsZFRva2VuTWFwKCkgOiBMb2NrZWRNYXA8dWludDMyLCBWTUZpZWxkLCBzdGQ6Omxlc3M8dWludDMyPiwgQXNzZW1ibHkgPihuZXcgbXZtOjpMb2NrTm9ybWFsKCkpIHt9Ci19OwotCi1jbGFzcyBNZXRob2RUb2tlbk1hcCA6IHB1YmxpYyBMb2NrZWRNYXA8dWludDMyLCBWTU1ldGhvZCwgc3RkOjpsZXNzPHVpbnQzMj4sIEFzc2VtYmx5ID4gewotcHVibGljOgotCU1ldGhvZFRva2VuTWFwKCkgOiBMb2NrZWRNYXA8dWludDMyLCBWTU1ldGhvZCwgc3RkOjpsZXNzPHVpbnQzMj4sIEFzc2VtYmx5ID4obmV3IG12bTo6TG9ja05vcm1hbCgpKSB7fQotfTsKLQotY2xhc3MgQXNzZW1ibHlNYXAgOiBwdWJsaWMgTG9ja2VkTWFwPGNvbnN0IFVURjgqLCBBc3NlbWJseSwgc3RkOjpsZXNzPGNvbnN0IFVURjgqPiwgTjMgPiB7Ci1wdWJsaWM6Ci0JQXNzZW1ibHlNYXAoKSA6IExvY2tlZE1hcDxjb25zdCBVVEY4KiwgQXNzZW1ibHksIHN0ZDo6bGVzczxjb25zdCBVVEY4Kj4sIE4zID4obmV3IG12bTo6TG9ja05vcm1hbCgpKSB7fQotfTsKLQotCi1jbGFzcyBTdHJpbmdNYXAgOiBwdWJsaWMgTG9ja2VkTWFwPGNvbnN0IFVURjgqLCBDTElTdHJpbmcsIHN0ZDo6bGVzczxjb25zdCBVVEY4Kj4sIE4zID4geyAKLXB1YmxpYzoKLQlTdHJpbmdNYXAoKSA6IExvY2tlZE1hcDxjb25zdCBVVEY4KiwgQ0xJU3RyaW5nLCBzdGQ6Omxlc3M8Y29uc3QgVVRGOCo+LCBOMyA+KG5ldyBtdm06OkxvY2tSZWN1cnNpdmUoKSkge30KLX07Ci0KLWNsYXNzIEZ1bmN0aW9uTWFwIDogcHVibGljIExvY2tlZE1hcDxsbHZtOjpGdW5jdGlvbiosIFZNTWV0aG9kLCBzdGQ6Omxlc3M8bGx2bTo6RnVuY3Rpb24qPiwgTjMgPiB7IAotcHVibGljOgotCUZ1bmN0aW9uTWFwKCkgOiBMb2NrZWRNYXA8bGx2bTo6RnVuY3Rpb24qLCBWTU1ldGhvZCwgc3RkOjpsZXNzPGxsdm06OkZ1bmN0aW9uKj4sIE4zID4obmV3IG12bTo6TG9ja05vcm1hbCgpKSB7fQotfTsKLQotfSAvLyBlbmQgbmFtZXNwYWNlIG4zCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL04zL1ZNQ29yZS9Mb3dlckFycmF5TGVuZ3RoLmNwcCBiL3Zta2l0L2xpYi9OMy9WTUNvcmUvTG93ZXJBcnJheUxlbmd0aC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MTdjYzMuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL04zL1ZNQ29yZS9Mb3dlckFycmF5TGVuZ3RoLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vPT09LS0tLS0tLSBMb3dlckFycmF5TGVuZ3RoLmNwcCAtIExvd2VycyBhcnJheSBsZW5ndGggY2FsbHMgLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBOMwotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAibGx2bS9JbnN0cnVjdGlvbnMuaCIKLSNpbmNsdWRlICJsbHZtL0xMVk1Db250ZXh0LmgiCi0jaW5jbHVkZSAibGx2bS9QYXNzLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCi0KLSNpbmNsdWRlICJtdm0vSklULmgiCi0KLSNpbmNsdWRlICJWTUFycmF5LmgiCi0jaW5jbHVkZSAiQ0xJSml0LmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBsbHZtOwotCi1uYW1lc3BhY2UgbXZtIHsKLQotICBjbGFzcyBWSVNJQklMSVRZX0hJRERFTiBMb3dlckFycmF5TGVuZ3RoIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7Ci0gIHB1YmxpYzoKLSAgICBzdGF0aWMgY2hhciBJRDsKLSAgICBMb3dlckFycmF5TGVuZ3RoKCkgOiBGdW5jdGlvblBhc3MoKGludHB0cl90KSZJRCkgeyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRik7Ci0gIHByaXZhdGU6Ci0gIH07Ci0gIGNoYXIgTG93ZXJBcnJheUxlbmd0aDo6SUQgPSAwOwotICBzdGF0aWMgUmVnaXN0ZXJQYXNzPExvd2VyQXJyYXlMZW5ndGg+IFgoIkxvd2VyQXJyYXlMZW5ndGgiLCAiTG93ZXIgQXJyYXkgbGVuZ3RoIik7Ci0KLWJvb2wgTG93ZXJBcnJheUxlbmd0aDo6cnVuT25GdW5jdGlvbihGdW5jdGlvbiYgRikgewotICBib29sIENoYW5nZWQgPSBmYWxzZTsKLSAgIGZvciAoRnVuY3Rpb246Oml0ZXJhdG9yIEJJID0gRi5iZWdpbigpLCBCRSA9IEYuZW5kKCk7IEJJICE9IEJFOyBCSSsrKSB7IAotICAgIEJhc2ljQmxvY2sgKkN1ciA9IEJJOyAKLQotICAgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgSUkgPSBDdXItPmJlZ2luKCksIElFID0gQ3VyLT5lbmQoKTsgSUkgIT0gSUU7ICkgewotICAgICAgSW5zdHJ1Y3Rpb24gKkkgPSBJSTsKLSAgICAgIElJKys7Ci0gICAgICBpZiAoQ2FsbEluc3QgKkNJID0gZHluX2Nhc3Q8Q2FsbEluc3Q+KEkpKSB7Ci0gICAgICAgIGlmIChDSS0+Z2V0T3BlcmFuZCgwKSA9PSBuMzo6Q0xJSml0OjphcnJheUxlbmd0aExMVk0pIHsKLSAgICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICBWYWx1ZSogdmFsID0gQ0ktPmdldE9wZXJhbmQoMSk7IC8vIGdldCB0aGUgYXJyYXkKLSAgICAgICAgICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IGFyZ3M7IC8vc2l6ZT0gIDIKLSAgICAgICAgICBhcmdzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgMCkpOwotICAgICAgICAgIGFyZ3MucHVzaF9iYWNrKG4zOjpWTUFycmF5OjpzaXplT2Zmc2V0KCkpOwotICAgICAgICAgIFZhbHVlKiBwdHIgPSBHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlKHZhbCwgYXJncy5iZWdpbigpLCBhcmdzLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCBDSSk7Ci0gICAgICAgICAgVmFsdWUqIGxvYWQgPSBuZXcgTG9hZEluc3QocHRyLCAiIiwgQ0kpOwotICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgobG9hZCk7Ci0gICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIENoYW5nZWQ7Ci19Ci0KLUxvd2VyQXJyYXlMZW5ndGgqIGNyZWF0ZUxvd2VyQXJyYXlMZW5ndGhQYXNzKCkgewotICByZXR1cm4gbmV3IExvd2VyQXJyYXlMZW5ndGgoKTsKLX0KLQotfQotCmRpZmYgLS1naXQgYS92bWtpdC9saWIvTjMvVk1Db3JlL01TQ29ybGliLmggYi92bWtpdC9saWIvTjMvVk1Db3JlL01TQ29ybGliLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZDA3YWUuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL04zL1ZNQ29yZS9NU0NvcmxpYi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tIE1TQ29ybGliLmggLSBUaGUgTVNDb3JsaWIgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4zCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2lmbmRlZiBOM19NU0NPUkxJQl9ICi0jZGVmaW5lIE4zX01TQ09STElCX0gKLQotI2luY2x1ZGUgIk4zTWV0YVR5cGUuaCIKLQotbmFtZXNwYWNlIG4zIHsKLQotY2xhc3MgTjM7Ci1jbGFzcyBWTUNsYXNzOwotY2xhc3MgVk1DbGFzc0FycmF5OwotY2xhc3MgVk1GaWVsZDsKLWNsYXNzIFZNTWV0aG9kOwotCi1jbGFzcyBNU0NvcmxpYiB7Ci1wdWJsaWM6Ci0gIHN0YXRpYyB2b2lkIGluaXRpYWxpc2UoTjMqIHZtKTsKLSAgc3RhdGljIHZvaWQgbG9hZFN0cmluZ0NsYXNzKE4zKiB2bSk7Ci0gIHN0YXRpYyB2b2lkIGxvYWRCb290c3RyYXAoTjMqIHZtKTsKLSAgCi0gIHN0YXRpYyBjb25zdCBjaGFyKiBsaWJzUGF0aDsKLQotICBzdGF0aWMgVk1NZXRob2QqIGN0b3JDbHJUeXBlOwotICBzdGF0aWMgVk1DbGFzcyogY2xyVHlwZTsKLSAgc3RhdGljIFZNRmllbGQqIHR5cGVDbHJUeXBlOwotICAKLSAgc3RhdGljIFZNTWV0aG9kKiBjdG9yQXNzZW1ibHlSZWZsZWN0aW9uOwotICBzdGF0aWMgVk1DbGFzcyogYXNzZW1ibHlSZWZsZWN0aW9uOwotICBzdGF0aWMgVk1DbGFzcyogdHlwZWRSZWZlcmVuY2U7Ci0gIHN0YXRpYyBWTUZpZWxkKiBhc3NlbWJseUFzc2VtYmx5UmVmbGVjdGlvbjsKLSAgc3RhdGljIFZNQ2xhc3MqIHByb3BlcnR5VHlwZTsKLSAgc3RhdGljIFZNQ2xhc3MqIG1ldGhvZFR5cGU7Ci0gIAotICBzdGF0aWMgVk1NZXRob2QqIGN0b3JQcm9wZXJ0eVR5cGU7Ci0gIHN0YXRpYyBWTU1ldGhvZCogY3Rvck1ldGhvZFR5cGU7Ci0gIHN0YXRpYyBWTUZpZWxkKiBwcm9wZXJ0eVByb3BlcnR5VHlwZTsKLSAgc3RhdGljIFZNRmllbGQqIG1ldGhvZE1ldGhvZFR5cGU7Ci0KLSAgc3RhdGljIFZNQ2xhc3MqIHJlc291cmNlU3RyZWFtVHlwZTsKLSAgc3RhdGljIFZNTWV0aG9kKiBjdG9yUmVzb3VyY2VTdHJlYW1UeXBlOwotCi0jZGVmaW5lIERFRl9UWVBFKG5hbWUsIHR5cGUpICAgICAgICBcCi0Jc3RhdGljIFZNQ2xhc3MqIHAjI25hbWU7Ci0KLSNkZWZpbmUgREVGX0FSUkFZX0FORF9UWVBFKG5hbWUsIHR5cGUpIFwKLQlERUZfVFlQRShuYW1lLCB0eXBlKSBcCi0gIHN0YXRpYyBWTUNsYXNzQXJyYXkqIGFycmF5IyNuYW1lOyBcCi0Jc3RhdGljIFZNRmllbGQqIGN0b3IjI25hbWU7Ci0KLQlPTl9UWVBFUyhERUZfQVJSQVlfQU5EX1RZUEUsIF9GX05UKQotCU9OX1NUUklORyhERUZfQVJSQVlfQU5EX1RZUEUsIF9GX05UKQotCU9OX1ZPSUQoREVGX1RZUEUsIF9GX05UKQotCi0jdW5kZWYgREVGX0FSUkFZX0FORF9UWVBFCi0jdW5kZWYgREVGX1RZUEUKLSAKLSAgc3RhdGljIFZNQ2xhc3MqIHBWYWx1ZTsKLSAgc3RhdGljIFZNQ2xhc3MqIHBFbnVtOwotICBzdGF0aWMgVk1DbGFzcyogcEFycmF5OwotICBzdGF0aWMgVk1DbGFzcyogcERlbGVnYXRlOwotICBzdGF0aWMgVk1DbGFzcyogcEV4Y2VwdGlvbjsKLX07Ci0KLX0gLy8gZW5kIG5hbWVzcGFjZSBuMwotCi0jZW5kaWYgLy8gTjNfTVNDT1JMSUJfSApkaWZmIC0tZ2l0IGEvdm1raXQvbGliL04zL1ZNQ29yZS9NU0NvcmxpYi5pbmMgYi92bWtpdC9saWIvTjMvVk1Db3JlL01TQ29ybGliLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRjM2VkNS4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTjMvVk1Db3JlL01TQ29ybGliLmluYworKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLS0gTVNDb3JsaWIuY3BwIC0gbXNjb3JsaWIgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjMKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSA8bWF0aC5oPgotCi0jaW5jbHVkZSA8ZGxmY24uaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAibXZtL0pJVC5oIgotCi0jaW5jbHVkZSAiQXNzZW1ibHkuaCIKLSNpbmNsdWRlICJDTElBY2Nlc3MuaCIKLSNpbmNsdWRlICJDTElKaXQuaCIKLSNpbmNsdWRlICJOYXRpdmVVdGlsLmgiCi0jaW5jbHVkZSAiTVNDb3JsaWIuaCIKLSNpbmNsdWRlICJOMy5oIgotI2luY2x1ZGUgIlJlYWRlci5oIgotI2luY2x1ZGUgIlZNQXJyYXkuaCIKLSNpbmNsdWRlICJWTUNsYXNzLmgiCi0jaW5jbHVkZSAiVk1PYmplY3QuaCIKLSNpbmNsdWRlICJWTVRocmVhZC5oIgotCi11c2luZyBuYW1lc3BhY2UgbjM7Ci0KLWV4dGVybiAiQyIgdm9pZCBTeXN0ZW1fUnVudGltZV9Db21waWxlclNlcnZpY2VzX1J1bnRpbWVIZWxwZXJzX0luaXRpYWxpemVBcnJheSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk1BcnJheSogYXJyYXksIFZNRmllbGQqIGZpZWxkKSB7Ci0gIGlmICghYXJyYXkgfHwgIWZpZWxkKSByZXR1cm47Ci0KLSAgVk1DbGFzcyogdHlwZSA9IGZpZWxkLT5jbGFzc0RlZjsKLSAgVk1DbGFzc0FycmF5KiB0cyA9IChWTUNsYXNzQXJyYXkqKWFycmF5LT5jbGFzc09mOwotICBWTUNvbW1vbkNsYXNzKiBicyA9IHRzLT5iYXNlQ2xhc3M7Ci0gIEFzc2VtYmx5KiBhc3MgPSB0eXBlLT5hc3NlbWJseTsKLQotICB1aW50MzIgcnZhID0gYXNzLT5nZXRSVkFGcm9tRmllbGQoZmllbGQtPnRva2VuKTsKLSAgU2VjdGlvbiogaW5TZWN0aW9uID0gMDsKLSAgCi0gIGlmIChydmEgPj0gYXNzLT5yc3JjU2VjdGlvbi0+dmlydHVhbEFkZHJlc3MgJiYgcnZhIDwgYXNzLT5yc3JjU2VjdGlvbi0+dmlydHVhbEFkZHJlc3MgKyBhc3MtPnJzcmNTZWN0aW9uLT52aXJ0dWFsU2l6ZSkKLSAgICBpblNlY3Rpb24gPSBhc3MtPnJzcmNTZWN0aW9uOwotICBpZiAocnZhID49IGFzcy0+dGV4dFNlY3Rpb24tPnZpcnR1YWxBZGRyZXNzICYmIHJ2YSA8IGFzcy0+dGV4dFNlY3Rpb24tPnZpcnR1YWxBZGRyZXNzICsgYXNzLT50ZXh0U2VjdGlvbi0+dmlydHVhbFNpemUpCi0gICAgaW5TZWN0aW9uID0gYXNzLT50ZXh0U2VjdGlvbjsKLSAgaWYgKHJ2YSA+PSBhc3MtPnJlbG9jU2VjdGlvbi0+dmlydHVhbEFkZHJlc3MgJiYgcnZhIDwgYXNzLT5yZWxvY1NlY3Rpb24tPnZpcnR1YWxBZGRyZXNzICsgYXNzLT5yZWxvY1NlY3Rpb24tPnZpcnR1YWxTaXplKQotICAgIGluU2VjdGlvbiA9IGFzcy0+cmVsb2NTZWN0aW9uOwotCi0gIHVpbnQzMiBzaXplID0gYXJyYXktPnNpemU7Ci0gIHVpbnQzMiBvZmZzZXQgPSBpblNlY3Rpb24tPnJhd0FkZHJlc3MgKyAocnZhIC0gaW5TZWN0aW9uLT52aXJ0dWFsQWRkcmVzcyk7Ci0gIEJ5dGVDb2RlKiBieXRlcyA9IGFzcy0+Ynl0ZXM7Ci0KLSAgaWYgKGJzID09IE1TQ29ybGliOjpwQ2hhcikgewotICAgIGZvciAodWludDMyIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICAoKEFycmF5VUludDE2KilhcnJheSktPmVsZW1lbnRzW2ldID0gUkVBRF9VMihieXRlcywgb2Zmc2V0KTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoYnMgPT0gTVNDb3JsaWI6OnBTSW50MzIpIHsKLSAgICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgKChBcnJheVNJbnQzMiopYXJyYXkpLT5lbGVtZW50c1tpXSA9IFJFQURfVTQoYnl0ZXMsIG9mZnNldCk7Ci0gICAgfQotICB9IGVsc2UgaWYgKGJzID09IE1TQ29ybGliOjpwRG91YmxlKSB7Ci0gICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgICgoQXJyYXlEb3VibGUqKWFycmF5KS0+ZWxlbWVudHNbaV0gPSBSRUFEX1U4KGJ5dGVzLCBvZmZzZXQpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgfQotfQotCi1leHRlcm4gIkMiIFZNT2JqZWN0KiBTeXN0ZW1fVHlwZV9HZXRUeXBlRnJvbUhhbmRsZShWTUNvbW1vbkNsYXNzKiBjbCkgewotICByZXR1cm4gY2wtPmdldENsYXNzRGVsZWdhdGVlKCk7Ci19Ci0KLQotZXh0ZXJuICJDIiBWTU9iamVjdCogU3lzdGVtX1JlZmxlY3Rpb25fQXNzZW1ibHlfR2V0Q2FsbGluZ0Fzc2VtYmx5KCkgewotICAvLyBDYWxsIHRvIHRoaXMgZnVuY3Rpb24uCi0gIHZvaWQqKiBjdXIgPSAodm9pZCoqKV9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOwotICAKLSAgLy8gU3R1YiBmcm9tIENMSSB0byBuYXRpdmUuCi0gIGN1ciA9ICh2b2lkKiopY3VyWzBdOwotCi0gIC8vIFRoZSBDTEkgZnVuY3Rpb24uCi0gIGN1ciA9ICh2b2lkKiopY3VyWzBdOwotICAKLSAgLy8gVGhlIGNhbGxlciBvZiB0aGUgQ0xJIGZ1bmN0aW9uOwotICBjdXIgPSAodm9pZCoqKWN1clswXTsKLQotICAvLyBUT0RPOiBpbXBsZW1lbnQgbWUgCi0gIGFib3J0KCk7Ci0gIFZNTWV0aG9kKiBtZXRoID0gTlVMTDsgLy92bS0+SVBUb01ldGhvZDxWTU1ldGhvZD4oRlJBTUVfSVAoY3VyKSk7Ci0KLSAgYXNzZXJ0KG1ldGggJiYgIldyb25nIHN0YWNrIik7Ci0gIAotICByZXR1cm4gbWV0aC0+Y2xhc3NEZWYtPmFzc2VtYmx5LT5nZXRBc3NlbWJseURlbGVnYXRlZSgpOwotfQotCi1leHRlcm4gIkMiIFZNT2JqZWN0KiBTeXN0ZW1fUmVmbGVjdGlvbl9Bc3NlbWJseV9HZXRFeGVjdXRpbmdBc3NlbWJseSgpIHsKLSAgLy8gQ2FsbCB0byB0aGlzIGZ1bmN0aW9uLgotICB2b2lkKiogY3VyID0gKHZvaWQqKilfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsKLSAgCi0gIC8vIFN0dWIgZnJvbSBDTEkgdG8gbmF0aXZlLgotICBjdXIgPSAodm9pZCoqKWN1clswXTsKLQotICAvLyBUaGUgQ0xJIGZ1bmN0aW9uLgotICBjdXIgPSAodm9pZCoqKWN1clswXTsKLSAgCi0gIC8vIFRPRE86IGltcGxlbWVudCBtZSAKLSAgYWJvcnQoKTsKLSAgVk1NZXRob2QqIG1ldGggPSBOVUxMOyAvL3ZtLT5JUFRvTWV0aG9kPFZNTWV0aG9kPihGUkFNRV9JUChjdXIpKTsKLSAgYXNzZXJ0KG1ldGggJiYgIldyb25nIHN0YWNrIik7Ci0gIHJldHVybiBtZXRoLT5jbGFzc0RlZi0+YXNzZW1ibHktPmdldEFzc2VtYmx5RGVsZWdhdGVlKCk7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBTeXN0ZW1fUmVmbGVjdGlvbl9Bc3NlbWJseV9Mb2FkRnJvbUZpbGUoKSB7Ci0gIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotfQotCi1leHRlcm4gIkMiIHZvaWQgU3lzdGVtX0FycmF5X0ludGVybmFsQ29weShWTUFycmF5KiBzcmMsIHNpbnQzMiBzc3RhcnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk1BcnJheSogZHN0LCBzaW50MzIgZHN0YXJ0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbnQzMiBsZW4pIHsKLSAgTjMqIHZtID0gKE4zKikoVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpKTsKLSAgdmVyaWZ5TnVsbChzcmMpOwotICB2ZXJpZnlOdWxsKGRzdCk7Ci0gIAotICBpZiAoIShzcmMtPmNsYXNzT2YtPmlzQXJyYXkgJiYgZHN0LT5jbGFzc09mLT5pc0FycmF5KSkgewotICAgIHZtLT5hcnJheVN0b3JlRXhjZXB0aW9uKCk7Ci0gIH0KLSAgCi0gIFZNQ2xhc3NBcnJheSogdHMgPSAoVk1DbGFzc0FycmF5KilzcmMtPmNsYXNzT2Y7Ci0gIFZNQ2xhc3NBcnJheSogdGQgPSAoVk1DbGFzc0FycmF5Kilkc3QtPmNsYXNzT2Y7Ci0gIFZNQ29tbW9uQ2xhc3MqIGRzdFR5cGUgPSB0ZC0+YmFzZUNsYXNzOwotICBWTUNvbW1vbkNsYXNzKiBzcmNUeXBlID0gdHMtPmJhc2VDbGFzczsKLQotICBpZiAobGVuID4gc3JjLT5zaXplKSB7Ci0gICAgdm0tPmluZGV4T3V0T2ZCb3VuZHMoc3JjLCBsZW4pOwotICB9IGVsc2UgaWYgKGxlbiA+IGRzdC0+c2l6ZSkgewotICAgIHZtLT5pbmRleE91dE9mQm91bmRzKGRzdCwgbGVuKTsKLSAgfSBlbHNlIGlmIChsZW4gKyBzc3RhcnQgPiBzcmMtPnNpemUpIHsKLSAgICB2bS0+aW5kZXhPdXRPZkJvdW5kcyhzcmMsIGxlbiArIHNzdGFydCk7Ci0gIH0gZWxzZSBpZiAobGVuICsgZHN0YXJ0ID4gZHN0LT5zaXplKSB7Ci0gICAgdm0tPmluZGV4T3V0T2ZCb3VuZHMoZHN0LCBsZW4gKyBkc3RhcnQpOwotICB9IGVsc2UgaWYgKGRzdGFydCA8IDApIHsKLSAgICB2bS0+aW5kZXhPdXRPZkJvdW5kcyhkc3QsIGRzdGFydCk7Ci0gIH0gZWxzZSBpZiAoc3N0YXJ0IDwgMCkgewotICAgIHZtLT5pbmRleE91dE9mQm91bmRzKHNyYywgc3N0YXJ0KTsKLSAgfSBlbHNlIGlmIChsZW4gPCAwKSB7Ci0gICAgdm0tPmluZGV4T3V0T2ZCb3VuZHMoc3JjLCBsZW4pOwotICB9IAotICAKLSAgYm9vbCBkb1Rocm93ID0gZmFsc2U7Ci0gIAotICBpZiAoc3JjVHlwZS0+c3VwZXIgPT0gTVNDb3JsaWI6OnBWYWx1ZSAmJiBzcmNUeXBlICE9IGRzdFR5cGUpIHsKLSAgICB2bS0+YXJyYXlTdG9yZUV4Y2VwdGlvbigpOwotICB9IGVsc2UgaWYgKHNyY1R5cGUtPnN1cGVyICE9IE1TQ29ybGliOjpwVmFsdWUgJiYgc3JjVHlwZS0+c3VwZXIgIT0gTVNDb3JsaWI6OnBFbnVtKSB7Ci0gICAgc2ludDMyIGkgPSBzc3RhcnQ7Ci0gICAgd2hpbGUgKGkgPCBzc3RhcnQgKyBsZW4gJiYgIWRvVGhyb3cpIHsKLSAgICAgIFZNT2JqZWN0KiBjdXIgPSAoKEFycmF5T2JqZWN0KilzcmMpLT5lbGVtZW50c1tpXTsKLSAgICAgIGlmIChjdXIpIHsKLSAgICAgICAgaWYgKCEoY3VyLT5jbGFzc09mLT5pc0Fzc2lnbmFibGVGcm9tKGRzdFR5cGUpKSkgewotICAgICAgICAgIGRvVGhyb3cgPSB0cnVlOwotICAgICAgICAgIGxlbiA9IGk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgICsraTsKLSAgICB9Ci0gIH0KLSAgCi0gIAotICB1aW50MzIgc2l6ZSA9IHNyY1R5cGUtPm5hdHVyYWxUeXBlLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCkgLyA4OwotICBpZiAoc2l6ZSA9PSAwKSBzaXplID0gc2l6ZW9mKHZvaWQqKTsKLSAgdm9pZCogcHRyRHN0ID0gKHZvaWQqKSgoaW50NjRfdCkoZHN0LT5lbGVtZW50cykgKyBzaXplICogZHN0YXJ0KTsKLSAgdm9pZCogcHRyU3JjID0gKHZvaWQqKSgoaW50NjRfdCkoc3JjLT5lbGVtZW50cykgKyBzaXplICogc3N0YXJ0KTsKLSAgbWVtbW92ZShwdHJEc3QsIHB0clNyYywgc2l6ZSAqIGxlbik7Ci0KLSAgaWYgKGRvVGhyb3cpCi0gICAgdm0tPmFycmF5U3RvcmVFeGNlcHRpb24oKTsKLSAgCi19Ci0KLWV4dGVybiAiQyIgc2ludDMyIFN5c3RlbV9BcnJheV9HZXRSYW5rKFZNT2JqZWN0KiBhcnIpIHsKLSAgdmVyaWZ5TnVsbChhcnIpOwotICBpZiAoYXJyLT5jbGFzc09mLT5pc0FycmF5KSB7Ci0gICAgcmV0dXJuICgoVk1DbGFzc0FycmF5KikoYXJyLT5jbGFzc09mKSktPmRpbXM7Ci0gIH0gZWxzZSB7Ci0gICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLX0KLQotZXh0ZXJuICJDIiBzaW50MzIgU3lzdGVtX0FycmF5X0dldExlbmd0aChWTU9iamVjdCogYXJyKSB7Ci0gIHZlcmlmeU51bGwoYXJyKTsKLSAgaWYgKGFyci0+Y2xhc3NPZi0+aXNBcnJheSkgewotICAgIHJldHVybiAoKFZNQXJyYXkqKWFyciktPnNpemU7Ci0gIH0gZWxzZSB7Ci0gICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLX0KLQotZXh0ZXJuICJDIiBzaW50MzIgU3lzdGVtX0FycmF5X0dldExvd2VyQm91bmQoVk1PYmplY3QqIGFyciwgc2ludDMyIGRpbSkgewotICByZXR1cm4gMDsKLX0KLQotZXh0ZXJuICJDIiBWTU9iamVjdCogU3lzdGVtX09iamVjdF9HZXRUeXBlKFZNT2JqZWN0KiBvYmopIHsKLSAgdmVyaWZ5TnVsbChvYmopOwotICByZXR1cm4gb2JqLT5jbGFzc09mLT5nZXRDbGFzc0RlbGVnYXRlZSgpOwotfQotCi1leHRlcm4gIkMiIGRvdWJsZSBTeXN0ZW1fRGVjaW1hbF9Ub0RvdWJsZSh2b2lkKiBwdHIpIHsKLSAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gIHJldHVybiAwLjA7Ci19Ci0KLWV4dGVybiAiQyIgZG91YmxlIFN5c3RlbV9NYXRoX0xvZzEwKGRvdWJsZSB2YWwpIHsKLSAgcmV0dXJuIGxvZzEwKHZhbCk7Ci19Ci0KLWV4dGVybiAiQyIgZG91YmxlIFN5c3RlbV9NYXRoX0Zsb29yKGRvdWJsZSB2YWwpIHsKLSAgcmV0dXJuIGZsb29yKHZhbCk7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBTeXN0ZW1fR0NfQ29sbGVjdCgpIHsKLSNpZmRlZiBNVUxUSVBMRV9HQwotICBWTVRocmVhZDo6Z2V0KCktPkdDLT5jb2xsZWN0KCk7Ci0jZWxzZQotICBtdm06OkNvbGxlY3Rvcjo6Y29sbGVjdCgpOwotI2VuZGlmCi19Ci0KLWV4dGVybiAiQyIgdm9pZCBTeXN0ZW1fR0NfU3VwcHJlc3NGaW5hbGl6ZShWTU9iamVjdCogb2JqKSB7Ci0gIC8vIFRPRE86IGltcGxlbWVudCBtZQotfQotCmRpZmYgLS1naXQgYS92bWtpdC9saWIvTjMvVk1Db3JlL01ha2VmaWxlIGIvdm1raXQvbGliL04zL1ZNQ29yZS9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA5ZGY5My4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTjMvVk1Db3JlL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyM9PT0tIGxpYi9OMy9WTUNvcmUvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKLSMgCi0jICAgICAgICAgICAgICAgICAgICAgVGhlIHZta2l0IHByb2plY3QKLSMKLSMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0jIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLSMgCi0jIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIwotTEVWRUwgPSAuLi8uLi8uLgotCi1FWFRSQV9ESVNUID0gTVNDb3JsaWIuaW5jCi0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29uZmlnCi0KLWlmZXEgKCQoV0lUSF9MTFZNX0dDQyksIDEpCi0gIE1PRFVMRV9OQU1FID0gTjMKLWVsc2UKLSAgTElCUkFSWU5BTUUgPSBOMwotZW5kaWYKLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KLQotQ1hYLkZsYWdzICs9IC1JJChQUk9KX09CSl9ESVIpLy4uL0xMVk1SdW50aW1lCmRpZmYgLS1naXQgYS92bWtpdC9saWIvTjMvVk1Db3JlL04zLmNwcCBiL3Zta2l0L2xpYi9OMy9WTUNvcmUvTjMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTk1ODIxLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvTjMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzgxICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0tLS0tIE4zLmNwcCAtIFRoZSBOMyB2aXJ0dWFsIG1hY2hpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMwotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKLSNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgotI2luY2x1ZGUgImxsdm0vTExWTUNvbnRleHQuaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKLQotI2luY2x1ZGUgIm12bS9PYmplY3QuaCIKLSNpbmNsdWRlICJtdm0vUHJpbnRCdWZmZXIuaCIKLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9Db25kLmgiCi0jaW5jbHVkZSAibXZtL1RocmVhZHMvTG9ja3MuaCIKLSNpbmNsdWRlICJtdm0vSklULmgiCi0KLSNpbmNsdWRlICJ0eXBlcy5oIgotCi0jaW5jbHVkZSAiQXNzZW1ibHkuaCIKLSNpbmNsdWRlICJMaW5rTjNSdW50aW1lLmgiCi0jaW5jbHVkZSAiTG9ja2VkTWFwLmgiCi0jaW5jbHVkZSAiTVNDb3JsaWIuaCIKLSNpbmNsdWRlICJOMy5oIgotI2luY2x1ZGUgIk4zTW9kdWxlUHJvdmlkZXIuaCIKLSNpbmNsdWRlICJSZWFkZXIuaCIKLSNpbmNsdWRlICJWTUFycmF5LmgiCi0jaW5jbHVkZSAiVk1DbGFzcy5oIgotI2luY2x1ZGUgIlZNT2JqZWN0LmgiCi0jaW5jbHVkZSAiVk1UaHJlYWQuaCIKLSNpbmNsdWRlICJDTElKaXQuaCIKLSNpbmNsdWRlICJDTElTdHJpbmcuaCIKLQotCi11c2luZyBuYW1lc3BhY2UgbjM7Ci0KLSNkZWZpbmUgREVDTEFSRV9FWENFUFRJT04oRVhDUCkgXAotICBjb25zdCBjaGFyKiBOMzo6RVhDUCA9ICNFWENQCi0KLURFQ0xBUkVfRVhDRVBUSU9OKFN5c3RlbUV4Y2VwdGlvbik7Ci1ERUNMQVJFX0VYQ0VQVElPTihPdmVyRmxvd0V4Y2VwdGlvbik7Ci1ERUNMQVJFX0VYQ0VQVElPTihPdXRPZk1lbW9yeUV4Y2VwdGlvbik7Ci1ERUNMQVJFX0VYQ0VQVElPTihJbmRleE91dE9mUmFuZ2VFeGNlcHRpb24pOwotREVDTEFSRV9FWENFUFRJT04oTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbik7Ci1ERUNMQVJFX0VYQ0VQVElPTihTeW5jaHJvbml6YXRpb25Mb2NFeGNlcHRpb24pOwotREVDTEFSRV9FWENFUFRJT04oVGhyZWFkSW50ZXJydXB0ZWRFeGNlcHRpb24pOwotREVDTEFSRV9FWENFUFRJT04oTWlzc2luZ01ldGhvZEV4Y2VwdGlvbik7Ci1ERUNMQVJFX0VYQ0VQVElPTihNaXNzaW5nRmllbGRFeGNlcHRpb24pOwotREVDTEFSRV9FWENFUFRJT04oQXJyYXlUeXBlTWlzbWF0Y2hFeGNlcHRpb24pOwotREVDTEFSRV9FWENFUFRJT04oQXJndW1lbnRFeGNlcHRpb24pOwotCi0vKgotREVDTEFSRV9FWENFUFRJT04oQXJpdGhtZXRpY0V4Y2VwdGlvbik7Ci1ERUNMQVJFX0VYQ0VQVElPTihJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKTsKLURFQ0xBUkVfRVhDRVBUSU9OKEFycmF5U3RvcmVFeGNlcHRpb24pOwotREVDTEFSRV9FWENFUFRJT04oQ2xhc3NDYXN0RXhjZXB0aW9uKTsKLURFQ0xBUkVfRVhDRVBUSU9OKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbik7Ci1ERUNMQVJFX0VYQ0VQVElPTihTZWN1cml0eUV4Y2VwdGlvbik7Ci1ERUNMQVJFX0VYQ0VQVElPTihDbGFzc0Zvcm1hdEVycm9yKTsKLURFQ0xBUkVfRVhDRVBUSU9OKENsYXNzQ2lyY3VsYXJpdHlFcnJvcik7Ci1ERUNMQVJFX0VYQ0VQVElPTihOb0NsYXNzRGVmRm91bmRFcnJvcik7Ci1ERUNMQVJFX0VYQ0VQVElPTihVbnN1cHBvcnRlZENsYXNzVmVyc2lvbkVycm9yKTsKLURFQ0xBUkVfRVhDRVBUSU9OKE5vU3VjaEZpZWxkRXJyb3IpOwotREVDTEFSRV9FWENFUFRJT04oTm9TdWNoTWV0aG9kRXJyb3IpOwotREVDTEFSRV9FWENFUFRJT04oSW5zdGFudGlhdGlvbkVycm9yKTsKLURFQ0xBUkVfRVhDRVBUSU9OKElsbGVnYWxBY2Nlc3NFcnJvcik7Ci1ERUNMQVJFX0VYQ0VQVElPTihJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uKTsKLURFQ0xBUkVfRVhDRVBUSU9OKFZlcmlmeUVycm9yKTsKLURFQ0xBUkVfRVhDRVBUSU9OKEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcik7Ci1ERUNMQVJFX0VYQ0VQVElPTihMaW5rYWdlRXJyb3IpOwotREVDTEFSRV9FWENFUFRJT04oQWJzdHJhY3RNZXRob2RFcnJvcik7Ci1ERUNMQVJFX0VYQ0VQVElPTihVbnNhdGlzZmllZExpbmtFcnJvcik7Ci1ERUNMQVJFX0VYQ0VQVElPTihJbnRlcm5hbEVycm9yKTsKLURFQ0xBUkVfRVhDRVBUSU9OKFN0YWNrT3ZlcmZsb3dFcnJvcik7Ci1ERUNMQVJFX0VYQ0VQVElPTihDbGFzc05vdEZvdW5kRXhjZXB0aW9uKTsKLSovCi0KLSN1bmRlZiBERUNMQVJFX0VYQ0VQVElPTgotCi12b2lkIFRocmVhZFN5c3RlbTo6cHJpbnQobXZtOjpQcmludEJ1ZmZlciogYnVmKSBjb25zdCB7Ci0gIGJ1Zi0+d3JpdGUoIlRocmVhZFN5c3RlbTw+Iik7Ci19Ci0KLVRocmVhZFN5c3RlbTo6VGhyZWFkU3lzdGVtKCkgewotICBub25EYWVtb25UaHJlYWRzID0gMTsKLSAgbm9uRGFlbW9uTG9jayA9IG5ldyBtdm06OkxvY2tOb3JtYWwoKTsKLSAgbm9uRGFlbW9uVmFyICA9IG5ldyBtdm06OkNvbmQoKTsKLX0KLQotTjM6Ok4zKG12bTo6QnVtcFB0ckFsbG9jYXRvciAmYWxsb2NhdG9yLCBjb25zdCBjaGFyICpuYW1lKSA6IG12bTo6VmlydHVhbE1hY2hpbmUoYWxsb2NhdG9yKSB7Ci0gIHRoaXMtPm1vZHVsZSA9ICAgICAgICAgICAgMDsKLSAgdGhpcy0+VGhlTW9kdWxlUHJvdmlkZXIgPSAwOwotCXRoaXMtPm5hbWUgPSAgICAgICAgICAgICAgbmFtZTsKLQotICB0aGlzLT5zY2FubmVyID0gICAgICAgICAgIG5ldyBtdm06OlVucHJlY2lzZVN0YWNrU2Nhbm5lcigpOyAKLSAgdGhpcy0+TExWTU1vZHVsZSA9ICAgICAgICBuZXcgbGx2bTo6TW9kdWxlKG5hbWUsIGxsdm06OmdldEdsb2JhbENvbnRleHQoKSk7Ci0gIHRoaXMtPm1vZHVsZSA9ICAgICAgICAgICAgbmV3IG12bTo6QmFzZUludHJpbnNpY3ModGhpcy0+TExWTU1vZHVsZSk7Ci0KLSAgdGhpcy0+TExWTU1vZHVsZS0+c2V0RGF0YUxheW91dChtdm06Ok12bU1vZHVsZTo6ZXhlY3V0aW9uRW5naW5lLT5nZXRUYXJnZXREYXRhKCktPmdldFN0cmluZ1JlcHJlc2VudGF0aW9uKCkpOwotICB0aGlzLT5wcm90ZWN0TW9kdWxlID0gICAgIG5ldyBtdm06OkxvY2tOb3JtYWwoKTsKLQotICB0aGlzLT5mdW5jdGlvbnMgPSAgICAgICAgIG5ldyhhbGxvY2F0b3IsICJGdW5jdGlvbk1hcCIpIEZ1bmN0aW9uTWFwKCk7Ci0gIHRoaXMtPmxvYWRlZEFzc2VtYmxpZXMgPSAgbmV3KGFsbG9jYXRvciwgIkFzc2VtYmx5TWFwIikgQXNzZW1ibHlNYXAoKTsKLQotICB0aGlzLT5UaGVNb2R1bGVQcm92aWRlciA9IG5ldyBOM01vZHVsZVByb3ZpZGVyKHRoaXMtPkxMVk1Nb2R1bGUsIHRoaXMtPmZ1bmN0aW9ucyk7Ci19Ci0KLU4zOjp+TjMoKSB7Ci0gIGRlbGV0ZSBtb2R1bGU7Ci0gIGRlbGV0ZSBUaGVNb2R1bGVQcm92aWRlcjsKLX0KLQotdm9pZCBOMzo6ZXJyb3IoY29uc3QgY2hhciogY2xhc3NOYW1lLCBjb25zdCBjaGFyKiBmbXQsIHZhX2xpc3QgYXApIHsKLSAgZnByaW50ZihzdGRlcnIsICJJbnRlcm5hbCBleGNlcHRpb24gb2YgdHlwZSAlcyBkdXJpbmcgYm9vdHN0cmFwOiAiLCBjbGFzc05hbWUpOwotICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOwotICB0aHJvdyAxOwotfQotCi12b2lkIE4zOjppbmRleE91dE9mQm91bmRzKGNvbnN0IFZNT2JqZWN0KiBvYmosIHNpbnQzMiBlbnRyeSkgewotICBlcnJvcihJbmRleE91dE9mUmFuZ2VFeGNlcHRpb24sICIlZCIsIGVudHJ5KTsKLX0KLQotdm9pZCBOMzo6bmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24oc2ludDMyIHNpemUpIHsKLSAgZXJyb3IoT3ZlckZsb3dFeGNlcHRpb24sICIlZCIsIHNpemUpOwotfQotCi12b2lkIE4zOjpudWxsUG9pbnRlckV4Y2VwdGlvbihjb25zdCBjaGFyKiBmbXQsIC4uLikgewotICB2YV9saXN0IGFwOwotICB2YV9zdGFydChhcCwgZm10KTsKLSAgZXJyb3IoTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbiwgZm10LCB2YV9hcmcoYXAsIGNoYXIqKSk7Ci19Ci0KLQotdm9pZCBOMzo6aWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbihjb25zdCBWTU9iamVjdCogb2JqKSB7Ci0gIGVycm9yKFN5bmNocm9uaXphdGlvbkxvY0V4Y2VwdGlvbiwgIiIpOwotfQotCi12b2lkIE4zOjppbnRlcnJ1cHRlZEV4Y2VwdGlvbihjb25zdCBWTU9iamVjdCogb2JqKSB7Ci0gIGVycm9yKFRocmVhZEludGVycnVwdGVkRXhjZXB0aW9uLCAiIik7Ci19Ci0KLXZvaWQgTjM6Om91dE9mTWVtb3J5RXJyb3Ioc2ludDMyIG4pIHsKLSAgZXJyb3IoT3V0T2ZNZW1vcnlFeGNlcHRpb24sICIiKTsKLX0KLQotdm9pZCBOMzo6YXJyYXlTdG9yZUV4Y2VwdGlvbigpIHsKLSAgZXJyb3IoQXJyYXlUeXBlTWlzbWF0Y2hFeGNlcHRpb24sICIiKTsKLX0KLQotdm9pZCBOMzo6aWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgZXJyb3IoQXJndW1lbnRFeGNlcHRpb24sIG5hbWUpOwotfQotCi12b2lkIE4zOjp1bmtub3duRXJyb3IoY29uc3QgY2hhciogZm10LCAuLi4pIHsKLSAgdmFfbGlzdCBhcDsKLSAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gIGVycm9yKFN5c3RlbUV4Y2VwdGlvbiwgZm10LCBhcCk7Ci19Ci0KLXZvaWQgTjM6OmVycm9yKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7Ci0gIHZhX2xpc3QgYXA7Ci0gIHZhX3N0YXJ0KGFwLCBmbXQpOwotICBlcnJvcihTeXN0ZW1FeGNlcHRpb24sIGZtdCwgYXApOwotfQotCi12b2lkIE4zOjplcnJvcihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiBmbXQsIC4uLikgewotICB2YV9saXN0IGFwOwotICB2YV9zdGFydChhcCwgZm10KTsKLSAgZXJyb3IobmFtZSwgZm10LCBhcCk7Ci19Ci0KLQotCi0KLXVzaW5nIG5hbWVzcGFjZSBuMzsKLQotdm9pZCBOMzo6cHJpbnQobXZtOjpQcmludEJ1ZmZlciogYnVmKSBjb25zdCB7Ci0gIGJ1Zi0+d3JpdGUoIk4zIHZpcnR1YWwgbWFjaGluZTw+Iik7Ci19Ci0KLXN0YXRpYyBBc3NlbWJseSogYXNzZW1ibHlEdXAoY29uc3QgVVRGOComIG5hbWUsIE4zKiB2bSkgewotCW12bTo6QnVtcFB0ckFsbG9jYXRvciAqYSA9IG5ldyBtdm06OkJ1bXBQdHJBbGxvY2F0b3IoKTsKLSAgcmV0dXJuIG5ldygqYSwgIkFzc2VtYmx5IikgQXNzZW1ibHkoKmEsIHZtLCBuYW1lKTsKLX0KLQotQXNzZW1ibHkqIE4zOjpjb25zdHJ1Y3RBc3NlbWJseShjb25zdCBVVEY4KiBuYW1lKSB7Ci0gIHJldHVybiBsb2FkZWRBc3NlbWJsaWVzLT5sb29rdXBPckNyZWF0ZShuYW1lLCB0aGlzLCBhc3NlbWJseUR1cCk7Ci19Ci0KLUFzc2VtYmx5KiBOMzo6bG9va3VwQXNzZW1ibHkoY29uc3QgVVRGOCogbmFtZSkgewotICByZXR1cm4gbG9hZGVkQXNzZW1ibGllcy0+bG9va3VwKG5hbWUpOwotfQotCi1WTU1ldGhvZCogTjM6Omxvb2t1cEZ1bmN0aW9uKEZ1bmN0aW9uKiBGKSB7Ci0gIHJldHVybiBmdW5jdGlvbnMtPmxvb2t1cChGKTsKLX0KLQotCi1OMyogTjM6OmFsbG9jYXRlQm9vdHN0cmFwKCkgewotICBtdm06OkJ1bXBQdHJBbGxvY2F0b3IgKmEgPSBuZXcgbXZtOjpCdW1wUHRyQWxsb2NhdG9yKCk7Ci0gIE4zICp2bT0gbmV3KCphLCAiVk0iKSBOMygqYSwgImJvb3RzdHJhcE4zIik7Ci0gIAotICB2bS0+aGFzaFVURjggPSAgICAgICAgIG5ldyh2bS0+YWxsb2NhdG9yLCAiVVRGOE1hcCIpICAgICBVVEY4TWFwKHZtLT5hbGxvY2F0b3IpOwotCi0gIENMSUppdDo6aW5pdGlhbGlzZUJvb3RzdHJhcFZNKHZtKTsKLSAgCi0gIHJldHVybiB2bTsKLX0KLQotCi1OMyogTjM6OmFsbG9jYXRlKGNvbnN0IGNoYXIqIG5hbWUsIE4zKiBwYXJlbnQpIHsKLSAgbXZtOjpCdW1wUHRyQWxsb2NhdG9yICphID0gbmV3IG12bTo6QnVtcFB0ckFsbG9jYXRvcigpOwotICBOMyAqdm09IG5ldygqYSwgIlZNIikgTjMoKmEsIG5hbWUpOwotCi0gIHZtLT5oYXNoVVRGOCA9IHBhcmVudC0+aGFzaFVURjg7Ci0gIAotICB2bS0+dGhyZWFkU3lzdGVtID0gbmV3KCphLCAiVGhyZWFkU3lzdGVtIikgVGhyZWFkU3lzdGVtKCk7Ci0KLSAgdm0tPmFzc2VtYmx5UGF0aCA9IHBhcmVudC0+YXNzZW1ibHlQYXRoOwotICB2bS0+Y29yZUFzc2VtYmx5ID0gcGFyZW50LT5jb3JlQXNzZW1ibHk7Ci0gIHZtLT5sb2FkZWRBc3NlbWJsaWVzLT5oYXNoKHBhcmVudC0+Y29yZUFzc2VtYmx5LT5uYW1lLCBwYXJlbnQtPmNvcmVBc3NlbWJseSk7Ci0KLSAgQ0xJSml0Ojppbml0aWFsaXNlQXBwRG9tYWluKHZtKTsKLSAgCi0gIHJldHVybiB2bTsgCi19Ci0KLXZvaWQgQ2xBcmd1bWVudHNJbmZvOjpueWkoKSB7Ci0gIGZwcmludGYoc3Rkb3V0LCAiTm90IHlldCBpbXBsZW1lbnRlZFxuIik7Ci19Ci0KLXZvaWQgQ2xBcmd1bWVudHNJbmZvOjpwcmludFZlcnNpb24oKSB7Ci0gIGZwcmludGYoc3Rkb3V0LCAiTjMgLS0gYSBWVk0gaW1wbGVtZW50YXRpb24gb2YgdGhlIENvbW1vbiBMYW5ndWFnZSBJbmZyYXN0cnVjdHVyZVxuIik7Ci19Ci0KLXZvaWQgQ2xBcmd1bWVudHNJbmZvOjpwcmludEluZm9ybWF0aW9uKCkgewotICBmcHJpbnRmKHN0ZG91dCwgCi0gICJVc2FnZTogbjMgWy1vcHRpb25zXSBhc3NlbWJseSBbYXJncy4uLl0gXG4iCi0gICAgIk5vIG9wdGlvbiBpcyBhdmFpbGFibGVcbiIpOwotfQotCi12b2lkIENsQXJndW1lbnRzSW5mbzo6cmVhZEFyZ3MoaW50IGFyZ2MsIGNoYXIqKiBhcmd2LCBOMyogbjMpIHsKLSAgYXNzZW1ibHkgPSAwOwotICBhcHBBcmd1bWVudHNQb3MgPSAwOwotICBzaW50MzIgaSA9IDE7Ci0gIGlmIChpID09IGFyZ2MpIHByaW50SW5mb3JtYXRpb24oKTsKLSAgd2hpbGUgKGkgPCBhcmdjKSB7Ci0gICAgY2hhciogY3VyID0gYXJndltpXTsKLSAgICBpZiAoY3VyWzBdID09ICctJykgewotICAgIH0gZWxzZSB7Ci0gICAgICBhc3NlbWJseSA9IGN1cjsKLSAgICAgIGFwcEFyZ3VtZW50c1BvcyA9IGk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgICsraTsKLSAgfQotfQotCi0KLXZvaWQgTjM6OndhaXRGb3JFeGl0KCkgeyAKLSAgdGhyZWFkU3lzdGVtLT5ub25EYWVtb25Mb2NrLT5sb2NrKCk7Ci0gIAotICB3aGlsZSAodGhyZWFkU3lzdGVtLT5ub25EYWVtb25UaHJlYWRzKSB7Ci0gICAgdGhyZWFkU3lzdGVtLT5ub25EYWVtb25WYXItPndhaXQodGhyZWFkU3lzdGVtLT5ub25EYWVtb25Mb2NrKTsKLSAgfQotCi0gIHRocmVhZFN5c3RlbS0+bm9uRGFlbW9uTG9jay0+dW5sb2NrKCk7Ci0KLSAgcmV0dXJuOwotfQotCi12b2lkIE4zOjpleGVjdXRlQXNzZW1ibHkoY29uc3QgY2hhciogX25hbWUsIEFycmF5T2JqZWN0KiBhcmdzKSB7Ci0gIGNvbnN0IFVURjgqIG5hbWUgPSBhc2NpaXpUb1VURjgoX25hbWUpOwotICBBc3NlbWJseSogYXNzZW1ibHkgPSBjb25zdHJ1Y3RBc3NlbWJseShuYW1lKTsKLQotCWlmKCFhc3NlbWJseS0+cmVzb2x2ZSgxLCAwKSkKLSAgICBlcnJvcigiQ2FuIG5vdCBmaW5kIGFzc2VtYmx5ICVzIiwgX25hbWUpOwotCWVsc2UgewotCQl1aW50MzIgZW50cnlQb2ludCA9IGFzc2VtYmx5LT5lbnRyeVBvaW50OwotICAgIHVpbnQzMiB0YWJsZSA9IGVudHJ5UG9pbnQgPj4gMjQ7Ci0gICAgaWYgKHRhYmxlICE9IENPTlNUQU5UX01ldGhvZERlZikgewotICAgICAgZXJyb3IoIkVudHJ5IHBvaW50IGRvZXMgbm90IHBvaW50IHRvIGEgbWV0aG9kIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHVpbnQzMiB0eXBlVG9rZW4gPSBhc3NlbWJseS0+Z2V0VHlwZURlZlRva2VuRnJvbU1ldGhvZChlbnRyeVBvaW50KTsKLSAgICAgIGFzc2VtYmx5LT5sb2FkVHlwZSh0aGlzLCB0eXBlVG9rZW4sIHRydWUsIHRydWUsIHRydWUgLHRydWUsIE5VTEwsIE5VTEwpOwotICAgICAgVk1NZXRob2QqIG1haW5NZXRoID0gYXNzZW1ibHktPmxvb2t1cE1ldGhvZEZyb21Ub2tlbihlbnRyeVBvaW50KTsKLSAgICAgIG1haW5NZXRoLT5jb21waWxlVG9OYXRpdmUoKS0+aW52b2tlR2VuZXJpYyhhcmdzKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBOMzo6cnVuTWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgQ2xBcmd1bWVudHNJbmZvJiBpbmZvID0gYXJndW1lbnRzSW5mbzsKLQotICBpbmZvLnJlYWRBcmdzKGFyZ2MsIGFyZ3YsIHRoaXMpOwotICBpZiAoaW5mby5hc3NlbWJseSkgewotICAgIGluZm8uYXJndiA9IGFyZ3YgKyBpbmZvLmFwcEFyZ3VtZW50c1BvcyAtIDE7Ci0gICAgaW5mby5hcmdjID0gYXJnYyAtIGluZm8uYXBwQXJndW1lbnRzUG9zICsgMTsKLSAgICAKLSAgICAKLSAgICBib290c3RyYXBUaHJlYWQgPSBWTVRocmVhZDo6VGhlVGhyZWFkOwotICAgIGJvb3RzdHJhcFRocmVhZC0+TXlWTSA9IHRoaXM7Ci0gICAgYm9vdHN0cmFwVGhyZWFkLT5zdGFydCgodm9pZCAoKikobXZtOjpUaHJlYWQqKSltYWluQ0xJU3RhcnQpOwotCi0gIH0gZWxzZSB7Ci0gICAgLS0odGhyZWFkU3lzdGVtLT5ub25EYWVtb25UaHJlYWRzKTsKLSAgfQotfQotCi12b2lkIE4zOjptYWluQ0xJU3RhcnQoVk1UaHJlYWQqIHRoKSB7Ci0gIE4zKiB2bSA9IChOMyopdGgtPmdldFZNKCk7Ci0gIE1TQ29ybGliOjpsb2FkQm9vdHN0cmFwKHZtKTsKLSAgCi0gIENsQXJndW1lbnRzSW5mbyYgaW5mbyA9IHZtLT5hcmd1bWVudHNJbmZvOyAgCi0gIGRlY2xhcmVfZ2Nyb290KEFycmF5T2JqZWN0KiwgYXJncykgPSAoQXJyYXlPYmplY3QqKU1TQ29ybGliOjphcnJheVN0cmluZy0+ZG9OZXcoaW5mby5hcmdjLTIpOwotICBmb3IgKGludCBpID0gMjsgaSA8IGluZm8uYXJnYzsgKytpKSB7Ci0JCWRlY2xhcmVfZ2Nyb290KEFycmF5Q2hhciosIGFyZ19hcnJheSkgPSB2bS0+YXNjaWl6VG9BcnJheShpbmZvLmFyZ3ZbaV0pOwotCQlkZWNsYXJlX2djcm9vdChWTU9iamVjdCosIGFyZykgPSB2bS0+YXJyYXlUb1N0cmluZyhhcmdfYXJyYXkpOwotICAgIGFyZ3MtPmVsZW1lbnRzW2kgLSAyXSA9IGFyZzsKLSAgfQotICAKLSAgdHJ5ewotICAgIHZtLT5leGVjdXRlQXNzZW1ibHkoaW5mby5hc3NlbWJseSwgYXJncyk7Ci0gIH1jYXRjaCguLi4pIHsKLSAgICBkZWNsYXJlX2djcm9vdChWTU9iamVjdCosIGV4YykgPSB0aC0+b29vX3BlbmRpbmdFeGNlcHRpb247Ci0gICAgcHJpbnRmKCJOMyBjYXVnaHQgJXNcbiIsIG12bTo6UHJpbnRCdWZmZXIoZXhjKS5jU3RyaW5nKCkpOwotICB9Ci0KLSAgdm0tPnRocmVhZFN5c3RlbS0+bm9uRGFlbW9uTG9jay0+bG9jaygpOwotICAtLSh2bS0+dGhyZWFkU3lzdGVtLT5ub25EYWVtb25UaHJlYWRzKTsKLSAgaWYgKHZtLT50aHJlYWRTeXN0ZW0tPm5vbkRhZW1vblRocmVhZHMgPT0gMCkKLSAgICB2bS0+dGhyZWFkU3lzdGVtLT5ub25EYWVtb25WYXItPnNpZ25hbCgpOwotICB2bS0+dGhyZWFkU3lzdGVtLT5ub25EYWVtb25Mb2NrLT51bmxvY2soKTsKLX0KLQotCi0KLUFycmF5Q2hhciogTjM6OmFzY2lpelRvQXJyYXkoY29uc3QgY2hhciogYXNjaWl6KSB7Ci0JdWludDMyIGxlbiA9IHN0cmxlbihhc2NpaXopOwotCWRlY2xhcmVfZ2Nyb290KEFycmF5Q2hhciosIHJlcykgPSAoQXJyYXlDaGFyKilNU0NvcmxpYjo6YXJyYXlDaGFyLT5kb05ldyhsZW4pOwotCWZvcih1aW50MzIgaT0wOyBpPGxlbjsgaSsrKQotCQlyZXMtPmVsZW1lbnRzW2ldID0gYXNjaWl6W2ldOwotCXJldHVybiByZXM7Ci19Ci0KLUFycmF5Q2hhciogTjM6OmJ1ZlRvQXJyYXkoY29uc3QgdWludDE2KiBidWYsIHVpbnQzMiBzaXplKSB7Ci0JZGVjbGFyZV9nY3Jvb3QoQXJyYXlDaGFyKiwgcmVzKSA9IChBcnJheUNoYXIqKU1TQ29ybGliOjphcnJheUNoYXItPmRvTmV3KHNpemUpOwotCW1lbWNweShyZXMtPmVsZW1lbnRzLCBidWYsIHNpemU8PDEpOwotCXJldHVybiByZXM7Ci19Ci0KLUFycmF5Q2hhciogTjM6OlVURjhUb0FycmF5KGNvbnN0IFVURjggKnV0ZjgpIHsKLQlkZWNsYXJlX2djcm9vdChBcnJheUNoYXIqLCByZXMpID0gYnVmVG9BcnJheSh1dGY4LT5lbGVtZW50cywgdXRmOC0+c2l6ZSk7Ci0gIHJldHVybiByZXM7Ci19Ci0KLWNvbnN0IFVURjgqIE4zOjphc2NpaXpUb1VURjgoY29uc3QgY2hhciogYXNjaWl6KSB7Ci0gIHJldHVybiBoYXNoVVRGOC0+bG9va3VwT3JDcmVhdGVBc2NpaXooYXNjaWl6KTsKLX0KLQotY29uc3QgVVRGOCogTjM6OmJ1ZlRvVVRGOChjb25zdCB1aW50MTYqIGJ1ZiwgdWludDMyIGxlbikgewotICByZXR1cm4gaGFzaFVURjgtPmxvb2t1cE9yQ3JlYXRlUmVhZGVyKGJ1ZiwgbGVuKTsKLX0KLQotY29uc3QgVVRGOCogTjM6OmFycmF5VG9VVEY4KGNvbnN0IEFycmF5Q2hhciAqYXJyYXkpIHsKLSAgcmV0dXJuIGJ1ZlRvVVRGOChhcnJheS0+ZWxlbWVudHMsIGFycmF5LT5zaXplKTsKLX0KLQotQ0xJU3RyaW5nICpOMzo6YXJyYXlUb1N0cmluZyhjb25zdCBBcnJheUNoYXIgKmFycmF5KSB7Ci0gIGRlY2xhcmVfZ2Nyb290KENMSVN0cmluZyosIHJlcykgPSAoQ0xJU3RyaW5nKilDTElTdHJpbmc6OnN0cmluZ0R1cChhcnJheSwgdGhpcyk7Ci0JcmV0dXJuIHJlczsKLX0KLQotI2luY2x1ZGUgIk1TQ29ybGliLmluYyIKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvTjMuaCBiL3Zta2l0L2xpYi9OMy9WTUNvcmUvTjMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJlNjlhNS4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTjMvVk1Db3JlL04zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLS0tIE4zLmggLSBUaGUgTjMgdmlydHVhbCBtYWNoaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4zCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotCi0jaWZuZGVmIE4zX04zX0gKLSNkZWZpbmUgTjNfTjNfSAotCi0jaW5jbHVkZSAidHlwZXMuaCIKLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKLQotI2luY2x1ZGUgIm12bS9KSVQuaCIKLSNpbmNsdWRlICJtdm0vT2JqZWN0LmgiCi0jaW5jbHVkZSAibXZtL1ByaW50QnVmZmVyLmgiCi0jaW5jbHVkZSAibXZtL1RocmVhZHMvQ29uZC5oIgotI2luY2x1ZGUgIm12bS9UaHJlYWRzL0xvY2tzLmgiCi0KLSNpbmNsdWRlICJ0eXBlcy5oIgotCi1uYW1lc3BhY2UgbXZtIHsKLQljbGFzcyBVVEY4OwotCWNsYXNzIFVURjhNYXA7Ci19Ci0KLW5hbWVzcGFjZSBuMyB7Ci11c2luZyBtdm06OlVURjg7Ci11c2luZyBtdm06OlVURjhNYXA7Ci1jbGFzcyBBcnJheU9iamVjdDsKLWNsYXNzIEFzc2VtYmx5OwotY2xhc3MgQXNzZW1ibHlNYXA7Ci1jbGFzcyBOMzsKLWNsYXNzIE4zTW9kdWxlUHJvdmlkZXI7Ci1jbGFzcyBTdHJpbmdNYXA7Ci1jbGFzcyBWTUNsYXNzOwotY2xhc3MgVk1DbGFzc0FycmF5OwotY2xhc3MgVk1Db21tb25DbGFzczsKLWNsYXNzIFZNRmllbGQ7Ci1jbGFzcyBWTU1ldGhvZDsKLWNsYXNzIEZ1bmN0aW9uTWFwOwotY2xhc3MgTjNNb2R1bGVQcm92aWRlcjsKLWNsYXNzIFZNTWV0aG9kOwotY2xhc3MgVk1PYmplY3Q7Ci1jbGFzcyBWTVRocmVhZDsKLWNsYXNzIEFycmF5Q2hhcjsKLWNsYXNzIENMSVN0cmluZzsKLQotY2xhc3MgVGhyZWFkU3lzdGVtIDogcHVibGljIG12bTo6UGVybWFuZW50T2JqZWN0IHsKLXB1YmxpYzoKLQlUaHJlYWRTeXN0ZW0oKTsKLQotICB1aW50MTYgbm9uRGFlbW9uVGhyZWFkczsKLSAgbXZtOjpMb2NrKiBub25EYWVtb25Mb2NrOwotICBtdm06OkNvbmQqIG5vbkRhZW1vblZhcjsKLQotICB2aXJ0dWFsIHZvaWQgcHJpbnQobXZtOjpQcmludEJ1ZmZlciogYnVmKSBjb25zdDsKLX07Ci0KLWNsYXNzIENsQXJndW1lbnRzSW5mbyB7Ci1wdWJsaWM6Ci0gIGludCBhcmdjOwotICBjaGFyKiogYXJndjsKLSAgdWludDMyIGFwcEFyZ3VtZW50c1BvczsKLSAgY2hhciogYXNzZW1ibHk7Ci0KLSAgdm9pZCByZWFkQXJncyhpbnQgYXJnYywgY2hhcioqIGFyZ3YsIE4zICp2bSk7Ci0KLSAgdm9pZCBwcmludEluZm9ybWF0aW9uKCk7Ci0gIHZvaWQgbnlpKCk7Ci0gIHZvaWQgcHJpbnRWZXJzaW9uKCk7Ci19OwotCi0KLWNsYXNzIE4zIDogcHVibGljIG12bTo6VmlydHVhbE1hY2hpbmUgewotcHVibGljOgotCS8vIGluc3RhbmNlIGZpZWxkcwotICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgbmFtZTsKLQotICBDbEFyZ3VtZW50c0luZm8gICAgICAgICAgYXJndW1lbnRzSW5mbzsKLSAgQXNzZW1ibHlNYXAqICAgICAgICAgICAgIGxvYWRlZEFzc2VtYmxpZXM7Ci0gIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBhc3NlbWJseVBhdGg7Ci0gIEFzc2VtYmx5KiAgICAgICAgICAgICAgICBjb3JlQXNzZW1ibHk7Ci0KLSAgVGhyZWFkU3lzdGVtKiAgICAgICAgICAgIHRocmVhZFN5c3RlbTsgCi0gIFZNVGhyZWFkKiAgICAgICAgICAgICAgICBib290c3RyYXBUaHJlYWQ7Ci0KLSAgVVRGOE1hcCogICAgICAgICAgICAgICAgIGhhc2hVVEY4OwotCi0gIG12bTo6TG9jayogICAgICAgICAgICAgICBwcm90ZWN0TW9kdWxlOwotICBGdW5jdGlvbk1hcCogICAgICAgICAgICAgZnVuY3Rpb25zOwotCi0gIG12bTo6QmFzZUludHJpbnNpY3MqICAgICBtb2R1bGU7Ci0gIGxsdm06Ok1vZHVsZSogICAgICAgICAgICBMTFZNTW9kdWxlOwotICBOM01vZHVsZVByb3ZpZGVyKiAgICAgICAgVGhlTW9kdWxlUHJvdmlkZXI7Ci0KLQkvLyBjb25zdHJ1Y3RvcnMgLyBkZXN0cnVjdG9ycwotCU4zKG12bTo6QnVtcFB0ckFsbG9jYXRvciAmYWxsb2NhdG9yLCBjb25zdCBjaGFyICpuYW1lKTsKLSAgfk4zKCk7Ci0KLQkvLyB2aXJ0dWFsIG1ldGhvZHMKLSAgdmlydHVhbCB2b2lkIHByaW50KG12bTo6UHJpbnRCdWZmZXIqIGJ1ZikgY29uc3Q7Ci0gIHZpcnR1YWwgdm9pZCBUUkFDRVI7Ci0gIHZpcnR1YWwgdm9pZCBydW5BcHBsaWNhdGlvbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpOwotICB2aXJ0dWFsIHZvaWQgY29tcGlsZShjb25zdCBjaGFyKiBuYW1lKTsKLSAgdmlydHVhbCB2b2lkIHdhaXRGb3JFeGl0KCk7Ci0KLQkvLyBub24gdmlydHVhbCBtZXRob2RzCi0gIHZvaWQgICAgICAgICAgZXhlY3V0ZUFzc2VtYmx5KGNvbnN0IGNoYXIqIG5hbWUsIEFycmF5T2JqZWN0KiBhcmdzKTsKLSAgdm9pZCAgICAgICAgICBydW5NYWluKGludCBhcmdjLCBjaGFyKiogYXJndik7Ci0KLSAgVk1NZXRob2QqICAgICBsb29rdXBGdW5jdGlvbihsbHZtOjpGdW5jdGlvbiogRik7Ci0KLSAgbGx2bTo6TW9kdWxlKiBnZXRMTFZNTW9kdWxlKCkgeyByZXR1cm4gTExWTU1vZHVsZTsgfSAgCi0KLSAgQXNzZW1ibHkqICAgICAgICBjb25zdHJ1Y3RBc3NlbWJseShjb25zdCBVVEY4KiBuYW1lKTsKLSAgQXNzZW1ibHkqICAgICAgICBsb29rdXBBc3NlbWJseShjb25zdCBVVEY4KiBuYW1lKTsKLQotCS8vIHVzZWZ1bGwgc3RyaW5nLCB1aW50MTYgYW5kIHV0ZjggZnVuY3Rpb25zCi0KLQlBcnJheUNoYXIqICAgICAgIGFzY2lpelRvQXJyYXkoY29uc3QgY2hhciAqYXNjaWl6KTsKLQlBcnJheUNoYXIqICAgICAgIGJ1ZlRvQXJyYXkoY29uc3QgdWludDE2ICpidWYsIHVpbnQzMiBsZW4pOwotCUFycmF5Q2hhciogICAgICAgVVRGOFRvQXJyYXkoY29uc3QgVVRGOCAqdXRmOCk7Ci0JY29uc3QgVVRGOCogICAgICBhc2NpaXpUb1VURjgoY29uc3QgY2hhciAqYXNjaWl6KTsKLQljb25zdCBVVEY4KiAgICAgIGJ1ZlRvVVRGOChjb25zdCB1aW50MTYgKmJ1ZiwgdWludDMyIGxlbik7Ci0JY29uc3QgVVRGOCogICAgICBhcnJheVRvVVRGOChjb25zdCBBcnJheUNoYXIgKmFycmF5KTsKLQlDTElTdHJpbmcqICAgICAgIGFycmF5VG9TdHJpbmcoY29uc3QgQXJyYXlDaGFyICphcnJheSk7Ci0KLSAgLyoKLSAgdm9pZCAgICAgICAgICBpbGxlZ2FsQWNjZXNzRXhjZXB0aW9uKGNvbnN0IGNoYXIqIG1zZyk7Ci0gIHZvaWQgICAgICAgICAgaW5pdGlhbGl6ZXJFcnJvcihjb25zdCBWTU9iamVjdCogZXhjcCk7Ci0gIHZvaWQgICAgICAgICAgaW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihjb25zdCBWTU9iamVjdCogb2JqKTsKLSAgdm9pZCAgICAgICAgICBjbGFzc0Nhc3RFeGNlcHRpb24oY29uc3QgY2hhciogbXNnKTsKLSAgdm9pZCAgICAgICAgICBlcnJvcldpdGhFeGNwKGNvbnN0IGNoYXIqIGNsYXNzTmFtZSwgY29uc3QgVk1PYmplY3QqIGV4Y3ApOyovCi0gIHZvaWQgICAgICAgICAgaWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNvbnN0IGNoYXIqIG1zZyk7Ci0gIHZvaWQgICAgICAgICAgYXJyYXlTdG9yZUV4Y2VwdGlvbigpOwotICB2b2lkICAgICAgICAgIGlsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24oY29uc3QgVk1PYmplY3QqIG9iaik7Ci0gIHZvaWQgICAgICAgICAgaW50ZXJydXB0ZWRFeGNlcHRpb24oY29uc3QgVk1PYmplY3QqIG9iaik7Ci0gIHZvaWQgICAgICAgICAgbnVsbFBvaW50ZXJFeGNlcHRpb24oY29uc3QgY2hhciogZm10LCAuLi4pOwotICB2b2lkICAgICAgICAgIG91dE9mTWVtb3J5RXJyb3Ioc2ludDMyIG4pOwotICB2b2lkICAgICAgICAgIGluZGV4T3V0T2ZCb3VuZHMoY29uc3QgVk1PYmplY3QqIG9iaiwgc2ludDMyIGVudHJ5KTsKLSAgdm9pZCAgICAgICAgICBuZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbihpbnQgc2l6ZSk7Ci0gIHZvaWQgICAgICAgICAgdW5rbm93bkVycm9yKGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsgCi0KLSAgdm9pZCAgICAgICAgICBlcnJvcihjb25zdCBjaGFyKiBmbXQsIC4uLik7Ci0gIHZvaWQgICAgICAgICAgZXJyb3IoY29uc3QgY2hhciogY2xhc3NOYW1lLCBjb25zdCBjaGFyKiBmbXQsIC4uLik7Ci0gIHZvaWQgICAgICAgICAgZXJyb3IoY29uc3QgY2hhciogY2xhc3NOYW1lLCBjb25zdCBjaGFyKiBmbXQsIHZhX2xpc3QgYXApOwotCi0JLy8gc3RhdGljIGZpZWxkcwotICBzdGF0aWMgTjMqICAgICAgICAgYm9vdHN0cmFwVk07Ci0gCi0gIHN0YXRpYyBjb25zdCBVVEY4KiBjbGluaXROYW1lOwotICBzdGF0aWMgY29uc3QgVVRGOCogY3Rvck5hbWU7Ci0gIHN0YXRpYyBjb25zdCBVVEY4KiBpbnZva2VOYW1lOwotICBzdGF0aWMgY29uc3QgVVRGOCogbWF0aDsKLSAgc3RhdGljIGNvbnN0IFVURjgqIHN5c3RlbTsKLSAgc3RhdGljIGNvbnN0IFVURjgqIHNxcnQ7Ci0gIHN0YXRpYyBjb25zdCBVVEY4KiBzaW47Ci0gIHN0YXRpYyBjb25zdCBVVEY4KiBjb3M7Ci0gIHN0YXRpYyBjb25zdCBVVEY4KiBleHA7Ci0gIHN0YXRpYyBjb25zdCBVVEY4KiBsb2c7Ci0gIHN0YXRpYyBjb25zdCBVVEY4KiBmbG9vcjsKLSAgc3RhdGljIGNvbnN0IFVURjgqIGxvZzEwOwotICBzdGF0aWMgY29uc3QgVVRGOCogaXNOYW47Ci0gIHN0YXRpYyBjb25zdCBVVEY4KiBwb3c7Ci0gIHN0YXRpYyBjb25zdCBVVEY4KiBmbG9hdE5hbWU7Ci0gIHN0YXRpYyBjb25zdCBVVEY4KiBkb3VibGVOYW1lOwotICBzdGF0aWMgY29uc3QgVVRGOCogdGVzdEluZmluaXR5OwotCi0gIC8vIEV4Y2VwdGlvbnMgbmFtZQotICBzdGF0aWMgY29uc3QgY2hhciogU3lzdGVtRXhjZXB0aW9uOwotICBzdGF0aWMgY29uc3QgY2hhciogT3ZlckZsb3dFeGNlcHRpb247Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBPdXRPZk1lbW9yeUV4Y2VwdGlvbjsKLSAgc3RhdGljIGNvbnN0IGNoYXIqIEluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbjsKLSAgc3RhdGljIGNvbnN0IGNoYXIqIFN5bmNocm9uaXphdGlvbkxvY0V4Y2VwdGlvbjsKLSAgc3RhdGljIGNvbnN0IGNoYXIqIE51bGxSZWZlcmVuY2VFeGNlcHRpb247Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBUaHJlYWRJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLSAgc3RhdGljIGNvbnN0IGNoYXIqIE1pc3NpbmdNZXRob2RFeGNlcHRpb247Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBNaXNzaW5nRmllbGRFeGNlcHRpb247Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBBcnJheVR5cGVNaXNtYXRjaEV4Y2VwdGlvbjsKLSAgc3RhdGljIGNvbnN0IGNoYXIqIEFyZ3VtZW50RXhjZXB0aW9uOwotICAvKnN0YXRpYyBjb25zdCBjaGFyKiBBcml0aG1ldGljRXhjZXB0aW9uOwotICBzdGF0aWMgY29uc3QgY2hhciogQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsKLSAgc3RhdGljIGNvbnN0IGNoYXIqIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBDbGFzc0Nhc3RFeGNlcHRpb247Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb247Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBTZWN1cml0eUV4Y2VwdGlvbjsKLSAgc3RhdGljIGNvbnN0IGNoYXIqIENsYXNzRm9ybWF0RXJyb3I7Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBDbGFzc0NpcmN1bGFyaXR5RXJyb3I7Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBOb0NsYXNzRGVmRm91bmRFcnJvcjsKLSAgc3RhdGljIGNvbnN0IGNoYXIqIFVuc3VwcG9ydGVkQ2xhc3NWZXJzaW9uRXJyb3I7Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBOb1N1Y2hGaWVsZEVycm9yOwotICBzdGF0aWMgY29uc3QgY2hhciogTm9TdWNoTWV0aG9kRXJyb3I7Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBJbnN0YW50aWF0aW9uRXJyb3I7Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBJbGxlZ2FsQWNjZXNzRXJyb3I7Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uOwotICBzdGF0aWMgY29uc3QgY2hhciogVmVyaWZ5RXJyb3I7Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3I7Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBMaW5rYWdlRXJyb3I7Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBBYnN0cmFjdE1ldGhvZEVycm9yOwotICBzdGF0aWMgY29uc3QgY2hhciogVW5zYXRpc2ZpZWRMaW5rRXJyb3I7Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBJbnRlcm5hbEVycm9yOwotICBzdGF0aWMgY29uc3QgY2hhciogU3RhY2tPdmVyZmxvd0Vycm9yOwotICAqLwotICAvLyBFeGNlcHRpb25zCi0KLQkvLyBzdGF0aWMgbWV0aG9kcwotICBzdGF0aWMgTjMqIGFsbG9jYXRlQm9vdHN0cmFwKCk7Ci0gIHN0YXRpYyBOMyogYWxsb2NhdGUoY29uc3QgY2hhciogbmFtZSwgTjMqIHBhcmVudCk7Ci0gIHN0YXRpYyB2b2lkIG1haW5DTElTdGFydChWTVRocmVhZCogdGgpOwotfTsKLQotfSAvLyBlbmQgbmFtZXNwYWNlIG4zCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL04zL1ZNQ29yZS9OM0RlYnVnLmggYi92bWtpdC9saWIvTjMvVk1Db3JlL04zRGVidWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIzMzM4Zi4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTjMvVk1Db3JlL04zRGVidWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNpZm5kZWYgX04zX0RFQlVHX0hfCi0jZGVmaW5lIF9OM19ERUJVR19IXwotCi0jaWYgMAotI2RlZmluZSBERUJVRyAgICAgICAgIDEKLSNkZWZpbmUgV0lUSF9DT0xPUiAgICAxCi0jZGVmaW5lIE4zX0NPTVBJTEUgICAgMgotI2RlZmluZSBOM19FWEVDVVRFICAgIDIKLSNkZWZpbmUgTjNfTE9BRCAgICAgICAxCi0jZWxzZQotI2RlZmluZSBERUJVRyAgICAgICAgIDAKLSNkZWZpbmUgV0lUSF9DT0xPUiAgICAwCi0jZGVmaW5lIE4zX0NPTVBJTEUgICAgMAotI2RlZmluZSBOM19FWEVDVVRFICAgIDAKLSNkZWZpbmUgTjNfTE9BRCAgICAgICAwCi0jZW5kaWYKLQotI2luY2x1ZGUgImRlYnVnLmgiCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL04zL1ZNQ29yZS9OM0luaXRpYWxpc2UuY3BwIGIvdm1raXQvbGliL04zL1ZNQ29yZS9OM0luaXRpYWxpc2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2M2NmYyLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvTjNJbml0aWFsaXNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tIE4zSW5pdGlhbGlzZS5jcHAgLSBJbml0aWFsaXphdGlvbiBvZiBOMyAtLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjMKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJsbHZtL0xMVk1Db250ZXh0LmgiCi0KLSNpbmNsdWRlICJtdm0vQ29tcGlsYXRpb25Vbml0LmgiCi0jaW5jbHVkZSAibXZtL0pJVC5oIgotI2luY2x1ZGUgIm12bS9UaHJlYWRzL0xvY2tzLmgiCi0KLSNpbmNsdWRlICJBc3NlbWJseS5oIgotI2luY2x1ZGUgIkNMSVN0cmluZy5oIgotI2luY2x1ZGUgIkNMSUppdC5oIgotI2luY2x1ZGUgIkxvY2tlZE1hcC5oIgotI2luY2x1ZGUgIk5hdGl2ZVV0aWwuaCIKLSNpbmNsdWRlICJNU0NvcmxpYi5oIgotI2luY2x1ZGUgIk4zLmgiCi0jaW5jbHVkZSAiTjNNb2R1bGVQcm92aWRlci5oIgotI2luY2x1ZGUgIlJlYWRlci5oIgotI2luY2x1ZGUgIlZNQXJyYXkuaCIKLSNpbmNsdWRlICJWTUNhY2hlLmgiCi0jaW5jbHVkZSAiVk1DbGFzcy5oIgotI2luY2x1ZGUgIlZNT2JqZWN0LmgiCi0jaW5jbHVkZSAiVk1UaHJlYWQuaCIKLQotdXNpbmcgbmFtZXNwYWNlIG4zOwotCi1OMyogTjM6OmJvb3RzdHJhcFZNID0gMDsKLW12bTo6TG9jayogVk1PYmplY3Q6Omdsb2JhbExvY2sgPSAwOwotCi1WTUNvbW1vbkNsYXNzKiAgICAgICAgIFZNQ2xhc3NBcnJheTo6U3VwZXJBcnJheSA9IDA7Ci1zdGQ6OnZlY3RvcjxWTUNsYXNzKj4gIFZNQ2xhc3NBcnJheTo6SW50ZXJmYWNlc0FycmF5Owotc3RkOjp2ZWN0b3I8Vk1NZXRob2QqPiBWTUNsYXNzQXJyYXk6OlZpcnR1YWxNZXRob2RzQXJyYXk7Ci1zdGQ6OnZlY3RvcjxWTU1ldGhvZCo+IFZNQ2xhc3NBcnJheTo6U3RhdGljTWV0aG9kc0FycmF5Owotc3RkOjp2ZWN0b3I8Vk1GaWVsZCo+ICBWTUNsYXNzQXJyYXk6OlZpcnR1YWxGaWVsZHNBcnJheTsKLXN0ZDo6dmVjdG9yPFZNRmllbGQqPiAgVk1DbGFzc0FycmF5OjpTdGF0aWNGaWVsZHNBcnJheTsKLQotI2RlZmluZSBERUZfVFlQRShuYW1lLCB0eXBlKQkJCQkJCQkJCQlcCi0JVk1DbGFzcyAqTVNDb3JsaWI6OnAjI25hbWUgPSAwOwotCi0jZGVmaW5lIERFRl9BUlJBWV9MTFZNX1RZUEUobmFtZSwgdHlwZSkJCQkJCVwKLQljb25zdCBsbHZtOjpUeXBlKiBBcnJheSMjbmFtZTo6bGx2bVR5cGUgPSAwOwotCi0jZGVmaW5lIERFRl9BUlJBWV9BTkRfVFlQRShuYW1lLCB0eXBlKQkJCQkJXAotCURFRl9UWVBFKG5hbWUsIHR5cGUpCQkJCQkJCQkJCQkJCVwKLQlWTUNsYXNzQXJyYXkgKk1TQ29ybGliOjphcnJheSMjbmFtZSA9IDA7CQkJXAotCVZNRmllbGQqIE1TQ29ybGliOjpjdG9yIyNuYW1lID0gMDsKLQotT05fVFlQRVMoREVGX0FSUkFZX0FORF9UWVBFLCBfRl9OVCkKLU9OX1RZUEVTKERFRl9BUlJBWV9MTFZNX1RZUEUsIF9GX05UKQotT05fU1RSSU5HKERFRl9BUlJBWV9BTkRfVFlQRSwgX0ZfTlQpCi1PTl9WT0lEKERFRl9UWVBFLCBfRl9OVCkKLQotI3VuZGVmIERFRl9BUlJBWV9MTFZNX1RZUEUKLSN1bmRlZiBERUZfVFlQRQotI3VuZGVmIERFRl9BUlJBWV9BTkRfVFlQRQotCi1WTUNsYXNzKiBNU0NvcmxpYjo6cFZhbHVlID0gMDsKLVZNQ2xhc3MqIE1TQ29ybGliOjpwRW51bSA9IDA7Ci1WTUNsYXNzKiBNU0NvcmxpYjo6cEFycmF5ID0gMDsKLVZNQ2xhc3MqIE1TQ29ybGliOjpwRGVsZWdhdGUgPSAwOwotVk1DbGFzcyogTVNDb3JsaWI6OnBFeGNlcHRpb24gPSAwOwotCi0KLWNvbnN0IGxsdm06OlR5cGUqIFZNQXJyYXk6Omxsdm1UeXBlOwotY29uc3QgbGx2bTo6VHlwZSogVk1PYmplY3Q6Omxsdm1UeXBlOwotY29uc3QgbGx2bTo6VHlwZSogRW52ZWxvcHBlOjpsbHZtVHlwZTsKLWNvbnN0IGxsdm06OlR5cGUqIENhY2hlTm9kZTo6bGx2bVR5cGU7Ci0KLVZNTWV0aG9kKiBNU0NvcmxpYjo6Y3RvclByb3BlcnR5VHlwZTsKLVZNTWV0aG9kKiBNU0NvcmxpYjo6Y3Rvck1ldGhvZFR5cGU7Ci1WTU1ldGhvZCogTVNDb3JsaWI6OmN0b3JDbHJUeXBlOwotVk1DbGFzcyogIE1TQ29ybGliOjpjbHJUeXBlOwotVk1GaWVsZCogIE1TQ29ybGliOjp0eXBlQ2xyVHlwZTsKLVZNRmllbGQqICBNU0NvcmxpYjo6cHJvcGVydHlQcm9wZXJ0eVR5cGU7Ci1WTUZpZWxkKiAgTVNDb3JsaWI6Om1ldGhvZE1ldGhvZFR5cGU7Ci1WTU1ldGhvZCogTVNDb3JsaWI6OmN0b3JBc3NlbWJseVJlZmxlY3Rpb247Ci1WTUNsYXNzKiAgTVNDb3JsaWI6OmFzc2VtYmx5UmVmbGVjdGlvbjsKLVZNQ2xhc3MqICBNU0NvcmxpYjo6dHlwZWRSZWZlcmVuY2U7Ci1WTUZpZWxkKiAgTVNDb3JsaWI6OmFzc2VtYmx5QXNzZW1ibHlSZWZsZWN0aW9uOwotVk1DbGFzcyogIE1TQ29ybGliOjpwcm9wZXJ0eVR5cGU7Ci1WTUNsYXNzKiAgTVNDb3JsaWI6Om1ldGhvZFR5cGU7Ci1WTUNsYXNzKiAgTVNDb3JsaWI6OnJlc291cmNlU3RyZWFtVHlwZTsKLVZNTWV0aG9kKiBNU0NvcmxpYjo6Y3RvclJlc291cmNlU3RyZWFtVHlwZTsKLQotY29uc3QgVVRGOCogTjM6OmNsaW5pdE5hbWUgPSAwOwotY29uc3QgVVRGOCogTjM6OmN0b3JOYW1lID0gMDsKLWNvbnN0IFVURjgqIE4zOjppbnZva2VOYW1lID0gMDsKLWNvbnN0IFVURjgqIE4zOjptYXRoID0gMDsKLWNvbnN0IFVURjgqIE4zOjpzeXN0ZW0gPSAwOwotY29uc3QgVVRGOCogTjM6OnNxcnQgPSAwOwotY29uc3QgVVRGOCogTjM6OnNpbiA9IDA7Ci1jb25zdCBVVEY4KiBOMzo6Y29zID0gMDsKLWNvbnN0IFVURjgqIE4zOjpleHAgPSAwOwotY29uc3QgVVRGOCogTjM6OmxvZyA9IDA7Ci1jb25zdCBVVEY4KiBOMzo6Zmxvb3IgPSAwOwotY29uc3QgVVRGOCogTjM6OmxvZzEwID0gMDsKLWNvbnN0IFVURjgqIE4zOjppc05hbiA9IDA7Ci1jb25zdCBVVEY4KiBOMzo6cG93ID0gMDsKLWNvbnN0IFVURjgqIE4zOjpmbG9hdE5hbWUgPSAwOwotY29uc3QgVVRGOCogTjM6OmRvdWJsZU5hbWUgPSAwOwotY29uc3QgVVRGOCogTjM6OnRlc3RJbmZpbml0eSA9IDA7Ci0KLWxsdm06OkZ1bmN0aW9uKiBDTElKaXQ6OnByaW50RXhlY3V0aW9uTExWTTsKLWxsdm06OkZ1bmN0aW9uKiBDTElKaXQ6OmluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25MTFZNOwotbGx2bTo6RnVuY3Rpb24qIENMSUppdDo6bnVsbFBvaW50ZXJFeGNlcHRpb25MTFZNOwotbGx2bTo6RnVuY3Rpb24qIENMSUppdDo6Y2xhc3NDYXN0RXhjZXB0aW9uTExWTTsKLWxsdm06OkZ1bmN0aW9uKiBDTElKaXQ6OmNsZWFyRXhjZXB0aW9uTExWTTsKLWxsdm06OkZ1bmN0aW9uKiBDTElKaXQ6OmNvbXBhcmVFeGNlcHRpb25MTFZNOwotbGx2bTo6RnVuY3Rpb24qIENMSUppdDo6YXJyYXlMZW5ndGhMTFZNOwotCi0jaWZkZWYgV0lUSF9UUkFDRVIKLWxsdm06OkZ1bmN0aW9uKiBDTElKaXQ6Om1hcmtBbmRUcmFjZUxMVk07Ci1jb25zdCBsbHZtOjpGdW5jdGlvblR5cGUqIENMSUppdDo6bWFya0FuZFRyYWNlTExWTVR5cGU7Ci0jZW5kaWYKLWxsdm06OkZ1bmN0aW9uKiBDTElKaXQ6OnZtT2JqZWN0VHJhY2VyTExWTTsKLWxsdm06OkZ1bmN0aW9uKiBDTElKaXQ6OmluaXRpYWxpc2VDbGFzc0xMVk07Ci1sbHZtOjpGdW5jdGlvbiogQ0xJSml0Ojp2aXJ0dWFsTG9va3VwTExWTTsKLWxsdm06OkZ1bmN0aW9uKiBDTElKaXQ6OmFycmF5Q29uc0xMVk07Ci1sbHZtOjpGdW5jdGlvbiogQ0xJSml0OjphcnJheU11bHRpQ29uc0xMVk07Ci1sbHZtOjpGdW5jdGlvbiogQ0xJSml0OjpvYmpDb25zTExWTTsKLWxsdm06OkZ1bmN0aW9uKiBDTElKaXQ6Om9iakluaXRMTFZNOwotbGx2bTo6RnVuY3Rpb24qIENMSUppdDo6dGhyb3dFeGNlcHRpb25MTFZNOwotbGx2bTo6RnVuY3Rpb24qIENMSUppdDo6aW5zdGFuY2VPZkxMVk07Ci1sbHZtOjpGdW5jdGlvbiogQ0xJSml0OjpnZXRDTElFeGNlcHRpb25MTFZNOwotbGx2bTo6RnVuY3Rpb24qIENMSUppdDo6Z2V0Q3BwRXhjZXB0aW9uTExWTTsKLWxsdm06OkZ1bmN0aW9uKiBDTElKaXQ6Om5ld1N0cmluZ0xMVk07Ci0KLXN0YXRpYyB2b2lkIGluaXRpYWxpc2VWVCgpIHsKLX0KLQotVk1UaHJlYWQqIFZNVGhyZWFkOjpUaGVUaHJlYWQgPSAwOwotCi1zdGF0aWMgdm9pZCBpbml0aWFsaXNlU3RhdGljcygpIHsKLSAgQ0xJSml0Ojppbml0aWFsaXNlKCk7Ci0KLSAgVk1PYmplY3Q6Omdsb2JhbExvY2sgPSBuZXcgbXZtOjpMb2NrTm9ybWFsKCk7Ci0KLSAgTjMqIHZtID0gTjM6OmJvb3RzdHJhcFZNID0gTjM6OmFsbG9jYXRlQm9vdHN0cmFwKCk7Ci0gIFZNVGhyZWFkOjpUaGVUaHJlYWQgPSBuZXcgVk1UaHJlYWQoMCwgdm0pOwotICAKLSAgdm0tPmFzc2VtYmx5UGF0aC5wdXNoX2JhY2soIiIpOwotICB2bS0+YXNzZW1ibHlQYXRoLnB1c2hfYmFjayhNU0NvcmxpYjo6bGlic1BhdGgpOwotICAKLSAgQXNzZW1ibHkqIGFzcyA9IHZtLT5jb25zdHJ1Y3RBc3NlbWJseSh2bS0+YXNjaWl6VG9VVEY4KCJtc2NvcmxpYiIpKTsKLQotICBpZighYXNzLT5yZXNvbHZlKDEsICJkbGwiKSkKLSAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJjYW4gbm90IGxvYWQgbXNjb3JsaWIuZGxsLiBBYm9ydCIpOwotCi0gIHZtLT5jb3JlQXNzZW1ibHkgPSBhc3M7Ci0KLSNkZWZpbmUgSU5JVCh2YXIsIG5hbWVTcGFjZSwgbmFtZSwgdHlwZSwgcHJpbSkge1wKLSAgdmFyID0gKFZNQ2xhc3MqKXZtLT5jb3JlQXNzZW1ibHktPmxvYWRUeXBlRnJvbU5hbWUoIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bS0+YXNjaWl6VG9VVEY4KG5hbWUpLCAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtLT5hc2NpaXpUb1VURjgobmFtZVNwYWNlKSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7IFwKLSAgdmFyLT5pc1ByaW1pdGl2ZSA9IHByaW07IFwKLSAgaWYgKHR5cGUpIHsgXAotICAgIHZhci0+bmF0dXJhbFR5cGUgPSB0eXBlOyAgXAotICAgIHZhci0+dmlydHVhbFR5cGUgPSB0eXBlOyAgXAotICB9fQotCi0JYXNzZXJ0KFZNT2JqZWN0OjpsbHZtVHlwZSk7Ci0gCi0gIElOSVQoTVNDb3JsaWI6OnBPYmplY3QsICAgIlN5c3RlbSIsICJPYmplY3QiLCAgICBWTU9iamVjdDo6bGx2bVR5cGUsIGZhbHNlKTsKLSAgSU5JVChNU0NvcmxpYjo6cFZhbHVlLCAgICAiU3lzdGVtIiwgIlZhbHVlVHlwZSIsIDAsIGZhbHNlKTsKLSAgSU5JVChNU0NvcmxpYjo6cFZvaWQsICAgICAiU3lzdGVtIiwgIlZvaWQiLCAgICAgIGxsdm06OlR5cGU6OmdldFZvaWRUeShnZXRHbG9iYWxDb250ZXh0KCkpLCB0cnVlKTsKLSAgSU5JVChNU0NvcmxpYjo6cEJvb2xlYW4sICAiU3lzdGVtIiwgIkJvb2xlYW4iLCAgIGxsdm06OlR5cGU6OmdldEludDFUeShnZXRHbG9iYWxDb250ZXh0KCkpLCB0cnVlKTsKLSAgSU5JVChNU0NvcmxpYjo6cFVJbnQ4LCAgICAiU3lzdGVtIiwgIkJ5dGUiLCAgICAgIGxsdm06OlR5cGU6OmdldEludDhUeShnZXRHbG9iYWxDb250ZXh0KCkpLCB0cnVlKTsKLSAgSU5JVChNU0NvcmxpYjo6cFNJbnQ4LCAgICAiU3lzdGVtIiwgIlNCeXRlIiwgICAgIGxsdm06OlR5cGU6OmdldEludDhUeShnZXRHbG9iYWxDb250ZXh0KCkpLCB0cnVlKTsKLSAgSU5JVChNU0NvcmxpYjo6cENoYXIsICAgICAiU3lzdGVtIiwgIkNoYXIiLCAgICAgIGxsdm06OlR5cGU6OmdldEludDE2VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgdHJ1ZSk7Ci0gIElOSVQoTVNDb3JsaWI6OnBTSW50MTYsICAgIlN5c3RlbSIsICJJbnQxNiIsICAgICBsbHZtOjpUeXBlOjpnZXRJbnQxNlR5KGdldEdsb2JhbENvbnRleHQoKSksIHRydWUpOwotICBJTklUKE1TQ29ybGliOjpwVUludDE2LCAgICJTeXN0ZW0iLCAiVUludDE2IiwgICAgbGx2bTo6VHlwZTo6Z2V0SW50MTZUeShnZXRHbG9iYWxDb250ZXh0KCkpLCB0cnVlKTsKLSAgSU5JVChNU0NvcmxpYjo6cFNJbnQzMiwgICAiU3lzdGVtIiwgIkludDMyIiwgICAgIGxsdm06OlR5cGU6OmdldEludDMyVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgdHJ1ZSk7Ci0gIElOSVQoTVNDb3JsaWI6OnBVSW50MzIsICAgIlN5c3RlbSIsICJVSW50MzIiLCAgICBsbHZtOjpUeXBlOjpnZXRJbnQzMlR5KGdldEdsb2JhbENvbnRleHQoKSksIHRydWUpOwotICBJTklUKE1TQ29ybGliOjpwU0ludDY0LCAgICJTeXN0ZW0iLCAiSW50NjQiLCAgICAgbGx2bTo6VHlwZTo6Z2V0SW50NjRUeShnZXRHbG9iYWxDb250ZXh0KCkpLCB0cnVlKTsKLSAgSU5JVChNU0NvcmxpYjo6cFVJbnQ2NCwgICAiU3lzdGVtIiwgIlVJbnQ2NCIsICAgIGxsdm06OlR5cGU6OmdldEludDY0VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgdHJ1ZSk7Ci0gIElOSVQoTVNDb3JsaWI6OnBJbnRQdHIsICAgIlN5c3RlbSIsICJJbnRQdHIiLCAgICBsbHZtOjpQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKGxsdm06OlR5cGU6OmdldEludDhUeShnZXRHbG9iYWxDb250ZXh0KCkpKSwgdHJ1ZSk7Ci0gIElOSVQoTVNDb3JsaWI6OnBVSW50UHRyLCAgIlN5c3RlbSIsICJVSW50UHRyIiwgICBsbHZtOjpQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKGxsdm06OlR5cGU6OmdldEludDhUeShnZXRHbG9iYWxDb250ZXh0KCkpKSwgdHJ1ZSk7Ci0gIElOSVQoTVNDb3JsaWI6OnBEb3VibGUsICAgIlN5c3RlbSIsICJEb3VibGUiLCAgICBsbHZtOjpUeXBlOjpnZXREb3VibGVUeShnZXRHbG9iYWxDb250ZXh0KCkpLCB0cnVlKTsKLSAgSU5JVChNU0NvcmxpYjo6cEZsb2F0LCAgICAiU3lzdGVtIiwgIlNpbmdsZSIsICAgIGxsdm06OlR5cGU6OmdldEZsb2F0VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgdHJ1ZSk7Ci0gIElOSVQoTVNDb3JsaWI6OnBFbnVtLCAgICAgIlN5c3RlbSIsICJFbnVtIiwgICAgICBsbHZtOjpUeXBlOjpnZXRJbnQzMlR5KGdldEdsb2JhbENvbnRleHQoKSksIHRydWUpOwotICBJTklUKE1TQ29ybGliOjpwQXJyYXksICAgICJTeXN0ZW0iLCAiQXJyYXkiLCAgICAgMCwgdHJ1ZSk7Ci0gIElOSVQoTVNDb3JsaWI6OnBFeGNlcHRpb24sIlN5c3RlbSIsICJFeGNlcHRpb24iLCAwLCBmYWxzZSk7Ci0gIElOSVQoTVNDb3JsaWI6OnBEZWxlZ2F0ZSwgIlN5c3RlbSIsICJEZWxlZ2F0ZSIsICAwLCBmYWxzZSk7Ci0KLSN1bmRlZiBJTklUCi0KLSAgVk1DbGFzc0FycmF5OjpTdXBlckFycmF5ICAgICAgID0gTVNDb3JsaWI6OnBBcnJheTsKLQotICBNU0NvcmxpYjo6bG9hZFN0cmluZ0NsYXNzKHZtKTsKLQotI2RlZmluZSBCVUlMRF9BUlJBWShuYW1lLCB0eXBlKQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCU1TQ29ybGliOjphcnJheSMjbmFtZSA9IGFzcy0+Y29uc3RydWN0QXJyYXkoTVNDb3JsaWI6OnAjI25hbWUsIDEpOwotCi0JT05fVFlQRVMoQlVJTERfQVJSQVksIF9GX05UKTsKLQlPTl9TVFJJTkcoQlVJTERfQVJSQVksIF9GX05UKTsKLQotICBOMzo6Y2xpbml0TmFtZSAgICAgICAgPSB2bS0+YXNjaWl6VG9VVEY4KCIuY2N0b3IiKTsKLSAgTjM6OmN0b3JOYW1lICAgICAgICAgID0gdm0tPmFzY2lpelRvVVRGOCgiLmN0b3IiKTsKLSAgTjM6Omludm9rZU5hbWUgICAgICAgID0gdm0tPmFzY2lpelRvVVRGOCgiSW52b2tlIik7Ci0gIE4zOjptYXRoICAgICAgICAgICAgICA9IHZtLT5hc2NpaXpUb1VURjgoIk1hdGgiKTsKLSAgTjM6OnN5c3RlbSAgICAgICAgICAgID0gdm0tPmFzY2lpelRvVVRGOCgiU3lzdGVtIik7Ci0gIE4zOjpzcXJ0ICAgICAgICAgICAgICA9IHZtLT5hc2NpaXpUb1VURjgoIlNxcnQiKTsKLSAgTjM6OnNpbiAgICAgICAgICAgICAgID0gdm0tPmFzY2lpelRvVVRGOCgiU2luIik7Ci0gIE4zOjpjb3MgICAgICAgICAgICAgICA9IHZtLT5hc2NpaXpUb1VURjgoIkNvcyIpOwotICBOMzo6ZXhwICAgICAgICAgICAgICAgPSB2bS0+YXNjaWl6VG9VVEY4KCJFeHAiKTsKLSAgTjM6OmxvZyAgICAgICAgICAgICAgID0gdm0tPmFzY2lpelRvVVRGOCgiTG9nIik7Ci0gIE4zOjpmbG9vciAgICAgICAgICAgICA9IHZtLT5hc2NpaXpUb1VURjgoIkZsb29yIik7Ci0gIE4zOjpsb2cxMCAgICAgICAgICAgICA9IHZtLT5hc2NpaXpUb1VURjgoIkxvZzEwIik7Ci0gIE4zOjppc05hbiAgICAgICAgICAgICA9IHZtLT5hc2NpaXpUb1VURjgoIklzTmFOIik7Ci0gIE4zOjpwb3cgICAgICAgICAgICAgICA9IHZtLT5hc2NpaXpUb1VURjgoIlBvdyIpOwotICBOMzo6ZmxvYXROYW1lICAgICAgICAgPSB2bS0+YXNjaWl6VG9VVEY4KCJGbG9hdCIpOwotICBOMzo6ZG91YmxlTmFtZSAgICAgICAgPSB2bS0+YXNjaWl6VG9VVEY4KCJEb3VibGUiKTsKLSAgTjM6OnRlc3RJbmZpbml0eSAgICAgID0gdm0tPmFzY2lpelRvVVRGOCgiVGVzdEluZmluaXR5Iik7Ci0KLQlNU0NvcmxpYjo6cEFycmF5LT5yZXNvbHZlVHlwZSgxLCAwLCAwKTsKLQlNU0NvcmxpYjo6cEFycmF5LT5yZXNvbHZlVlQoKTsKLQotICBNU0NvcmxpYjo6aW5pdGlhbGlzZSh2bSk7Ci19Ci0KLQotbXZtOjpDb21waWxhdGlvblVuaXQqIG12bTo6VmlydHVhbE1hY2hpbmU6OmluaXRpYWxpc2VDTElWTSgpIHsKLSAgaWYgKCFOMzo6Ym9vdHN0cmFwVk0pIHsKLSAgICBpbml0aWFsaXNlVlQoKTsKLSAgICBpbml0aWFsaXNlU3RhdGljcygpOwotICB9Ci0gIHJldHVybiAwOwotfQotCi12b2lkIE4zOjpydW5BcHBsaWNhdGlvbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgKChOMyopdGhpcyktPnJ1bk1haW4oYXJnYywgYXJndik7Ci19Ci0KLXZvaWQgTjM6OmNvbXBpbGUoY29uc3QgY2hhciogYXJndikgewotICBhc3NlcnQoMCAmJiAiVGhpcyB2aXJ0dWFsIG1hY2hpbmUgZG9lcyBub3QgcGVyZm9ybSBzdGF0aWMgY29tcGlsYXRpb24geWV0IVxuIik7Ci19Ci0KLW12bTo6VmlydHVhbE1hY2hpbmUqIG12bTo6VmlydHVhbE1hY2hpbmU6OmNyZWF0ZUNMSVZNKG12bTo6Q29tcGlsYXRpb25Vbml0KiBDKSB7Ci0gIE4zKiB2bSA9IE4zOjphbGxvY2F0ZSgiIiwgTjM6OmJvb3RzdHJhcFZNKTsKLSAgcmV0dXJuIHZtOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL04zL1ZNQ29yZS9OM01ldGFUeXBlLmggYi92bWtpdC9saWIvTjMvVk1Db3JlL04zTWV0YVR5cGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFiYTgxYi4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTjMvVk1Db3JlL04zTWV0YVR5cGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSNpZm5kZWYgX04zX01FVEFfVFlQRV9IXwotI2RlZmluZSBfTjNfTUVUQV9UWVBFX0hfCi0KLSNkZWZpbmUgZG9fbm90aGluZyhvYmosIHZhbCkKLQotI2RlZmluZSBfQVBQKEEsIEIpIEEoQikKLQotI2RlZmluZSBPTl9QUklNSVRJVkVTKF8sIF9GKQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JX0FQUChfLCBfRihCb29sZWFuLCBib29sLCAgICAgIEludFZhbC5nZXRCb29sVmFsdWUoKSwgZG9fbm90aGluZywgIHdyaXRlQm9vbCwgIkFycmF5PCIsICIgIiwgIj4iKSkgXAotCV9BUFAoXywgX0YoVUludDgsICAgdWludDgsICAgICBJbnRWYWwuZ2V0WkV4dFZhbHVlKCksIGRvX25vdGhpbmcsICB3cml0ZVM0LCAgICJBcnJheTwiLCAiICIsICI+IikpIFwKLQlfQVBQKF8sIF9GKFNJbnQ4LCAgIHNpbnQ4LCAgICAgSW50VmFsLmdldFNFeHRWYWx1ZSgpLCBkb19ub3RoaW5nLCAgd3JpdGVTNCwgICAiQXJyYXk8IiwgIiAiLCAiPiIpKSBcCi0JX0FQUChfLCBfRihDaGFyLCAgICB1aW50MTYsICAgIEludFZhbC5nZXRaRXh0VmFsdWUoKSwgZG9fbm90aGluZywgIHdyaXRlQ2hhciwgIiIsICAgICAgICIiLCAgIiIpKSBcCi0JX0FQUChfLCBfRihVSW50MTYsICB1aW50MTYsICAgIEludFZhbC5nZXRaRXh0VmFsdWUoKSwgZG9fbm90aGluZywgIHdyaXRlUzQsICAgIkFycmF5PCIsICIgIiwgIj4iKSkgXAotCV9BUFAoXywgX0YoU0ludDE2LCAgc2ludDE2LCAgICBJbnRWYWwuZ2V0U0V4dFZhbHVlKCksIGRvX25vdGhpbmcsICB3cml0ZVM0LCAgICJBcnJheTwiLCAiICIsICI+IikpIFwKLQlfQVBQKF8sIF9GKFVJbnQzMiwgIHVpbnQzMiwgICAgSW50VmFsLmdldFpFeHRWYWx1ZSgpLCBkb19ub3RoaW5nLCAgd3JpdGVTNCwgICAiQXJyYXk8IiwgIiAiLCAiPiIpKSBcCi0JX0FQUChfLCBfRihTSW50MzIsICBzaW50MzIsICAgIEludFZhbC5nZXRTRXh0VmFsdWUoKSwgZG9fbm90aGluZywgIHdyaXRlUzQsICAgIkFycmF5PCIsICIgIiwgIj4iKSkgXAotCV9BUFAoXywgX0YoVUludDY0LCAgdWludDY0LCAgICBJbnRWYWwuZ2V0WkV4dFZhbHVlKCksIGRvX25vdGhpbmcsICB3cml0ZVM4LCAgICJBcnJheTwiLCAiICIsICI+IikpIFwKLQlfQVBQKF8sIF9GKFNJbnQ2NCwgIHNpbnQ2NCwgICAgSW50VmFsLmdldFNFeHRWYWx1ZSgpLCBkb19ub3RoaW5nLCAgd3JpdGVTOCwgICAiQXJyYXk8IiwgIiAiLCAiPiIpKSBcCi0JX0FQUChfLCBfRihVSW50UHRyLCB1aW50KiwgICAgIFBvaW50ZXJWYWwsICAgICAgICAgICAgZG9fbm90aGluZywgIHdyaXRlUHRyLCAgIkFycmF5PCIsICIgIiwgIj4iKSkgXAotCV9BUFAoXywgX0YoSW50UHRyLCAgaW50KiwgICAgICBQb2ludGVyVmFsLCAgICAgICAgICAgIGRvX25vdGhpbmcsICB3cml0ZVB0ciwgICJBcnJheTwiLCAiICIsICI+IikpIFwKLQlfQVBQKF8sIF9GKEZsb2F0LCAgIGZsb2F0LCAgICAgRmxvYXRWYWwsICAgICAgICAgICAgICBkb19ub3RoaW5nLCAgd3JpdGVGUCwgICAiQXJyYXk8IiwgIiAiLCAiPiIpKSBcCi0JX0FQUChfLCBfRihEb3VibGUsICBkb3VibGUsICAgIERvdWJsZVZhbCwgICAgICAgICAgICAgZG9fbm90aGluZywgIHdyaXRlRlAsICAgIkFycmF5PCIsICIgIiwgIj4iKSkKLQotI2RlZmluZSBPTl9WT0lEKF8sIF9GKQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JX0FQUChfLCBfRihWb2lkLCAgICB2b2lkLCAgICAgIGFib3J0KCksICAgICAgICAgICAgICAgZG9fbm90aGluZywgIGFib3J0KCksICAgIiIsICAgICAgICIiLCAgIiIpKQotCi0jZGVmaW5lIE9OX09CSkVDVChfLCBfRikJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JX0FQUChfLCBfRihPYmplY3QsIFZNT2JqZWN0KiwgIFBvaW50ZXJWYWwsICAgICAgICAgICAgbGx2bV9nY3Jvb3QsIHdyaXRlT2JqLCAgIkFycmF5PCIsICIgIiwgIj4iKSkKLQotI2RlZmluZSBPTl9TVFJJTkcoXywgX0YpCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCV9BUFAoXywgX0YoU3RyaW5nLCB1aW50MTYqLCAgICBQb2ludGVyVmFsLCAgICAgICAgICAgIGxsdm1fZ2Nyb290LCB3cml0ZU9iaiwgICIiLCAgICAgICAiIiwgICIiKSkKLQotI2RlZmluZSBPTl9UWVBFUyhfLCBfRikJCQkJCQkJCQkJCQlcCi0gIE9OX1BSSU1JVElWRVMoXywgX0YpCQkJCQkJCQkJCQkJXAotCU9OX09CSkVDVChfLCBfRikKLQotI2RlZmluZSBfRl9OVCggIG5hbWUsIHR5cGUsIGd2X2V4dHJhY3RvciwgZG9fcm9vdCwgd3JpdGVyLCBwcmUsIHNlcCwgcG9zdCkgICAgbmFtZSwgdHlwZQotI2RlZmluZSBfRl9OVFIoIG5hbWUsIHR5cGUsIGd2X2V4dHJhY3RvciwgZG9fcm9vdCwgd3JpdGVyLCBwcmUsIHNlcCwgcG9zdCkgICAgbmFtZSwgdHlwZSwgZG9fcm9vdAotI2RlZmluZSBfRl9OVEUoIG5hbWUsIHR5cGUsIGd2X2V4dHJhY3RvciwgZG9fcm9vdCwgd3JpdGVyLCBwcmUsIHNlcCwgcG9zdCkgICAgbmFtZSwgdHlwZSwgZ3ZfZXh0cmFjdG9yCi0jZGVmaW5lIF9GX05UUlcobmFtZSwgdHlwZSwgZ3ZfZXh0cmFjdG9yLCBkb19yb290LCB3cml0ZXIsIHByZSwgc2VwLCBwb3N0KSAgICBuYW1lLCB0eXBlLCBkb19yb290LCB3cml0ZXIsIHByZSwgc2VwLCBwb3N0Ci0jZGVmaW5lIF9GX0FMTCggbmFtZSwgdHlwZSwgZ3ZfZXh0cmFjdG9yLCBkb19yb290LCB3cml0ZXIsIHByZSwgc2VwLCBwb3N0KSAgICBuYW1lLCB0eXBlLCBndl9leHRyYWN0b3IsIHdyaXRlciwgZG9fcm9vdCwgcHJlLCBzZXAsIHBvc3QKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvTjNNb2R1bGVQcm92aWRlci5jcHAgYi92bWtpdC9saWIvTjMvVk1Db3JlL04zTW9kdWxlUHJvdmlkZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWRhOGE4Li4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvTjNNb2R1bGVQcm92aWRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLz09PS0tLS0tLSBOM01vZHVsZVByb3ZpZGVyLmNwcCAtIExMVk0gTW9kdWxlIFByb3ZpZGVyIGZvciBOMyAtLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjMKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSA8bGx2bS9Nb2R1bGUuaD4KLSNpbmNsdWRlIDxsbHZtL0dWTWF0ZXJpYWxpemVyLmg+Ci0KLSNpbmNsdWRlICJtdm0vSklULmgiCi0KLSNpbmNsdWRlICJBc3NlbWJseS5oIgotI2luY2x1ZGUgIkNMSUppdC5oIgotI2luY2x1ZGUgIk4zTW9kdWxlUHJvdmlkZXIuaCIKLSNpbmNsdWRlICJWTUNsYXNzLmgiCi0jaW5jbHVkZSAiVk1UaHJlYWQuaCIKLSNpbmNsdWRlICJOMy5oIgotCi11c2luZyBuYW1lc3BhY2UgbGx2bTsKLXVzaW5nIG5hbWVzcGFjZSBuMzsKLQotCi1ib29sIE4zTW9kdWxlUHJvdmlkZXI6Ok1hdGVyaWFsaXplKEdsb2JhbFZhbHVlICpHViwgc3RkOjpzdHJpbmcgKkVyckluZm8pIHsKLSAgRnVuY3Rpb24qIEYgPSBkeW5fY2FzdDxGdW5jdGlvbj4oR1YpOwotICBhc3NlcnQoRiAmJiAiTm90IGEgZnVuY3Rpb24uIik7Ci0gIGlmIChGLT5nZXRMaW5rYWdlKCkgPT0gR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSkgcmV0dXJuIGZhbHNlOwotICBpZiAoIUYtPmVtcHR5KCkpIHJldHVybiBmYWxzZTsKLSAgVk1NZXRob2QqIG1ldGggPSBmdW5jdGlvbnMtPmxvb2t1cChGKTsKLQotICBpZiAoIW1ldGgpIHsKLSAgICAvLyBWVCBtZXRob2RzCi0gICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgewotCQltZXRoLT5jb21waWxlVG9OYXRpdmUoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotYm9vbCBOM01vZHVsZVByb3ZpZGVyOjppc01hdGVyaWFsaXphYmxlKGNvbnN0IGxsdm06Okdsb2JhbFZhbHVlKiBHVikgY29uc3QgewotICByZXR1cm4gR1YtPmdldExpbmthZ2UoKSA9PSBHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxXZWFrTGlua2FnZTsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvTjNNb2R1bGVQcm92aWRlci5oIGIvdm1raXQvbGliL04zL1ZNQ29yZS9OM01vZHVsZVByb3ZpZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwN2ZjZWUuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL04zL1ZNQ29yZS9OM01vZHVsZVByb3ZpZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLz09PS0tLS0tLS0tIE4zTW9kdWxlUHJvdmlkZXIuaCAtIExMVk0gTW9kdWxlIFByb3ZpZGVyIGZvciBOMyAtLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjMKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIE4zX01PRFVMRV9QUk9WSURFUl9ICi0jZGVmaW5lIE4zX01PRFVMRV9QUk9WSURFUl9ICi0KLSNpbmNsdWRlIDxsbHZtL0dWTWF0ZXJpYWxpemVyLmg+Ci0jaW5jbHVkZSA8bGx2bS9Nb2R1bGUuaD4KLQotI2luY2x1ZGUgIkxvY2tlZE1hcC5oIgotCi11c2luZyBuYW1lc3BhY2UgbGx2bTsKLQotbmFtZXNwYWNlIG4zIHsKLQotY2xhc3MgTjNNb2R1bGVQcm92aWRlciA6IHB1YmxpYyBHVk1hdGVyaWFsaXplciB7Ci1wdWJsaWM6Ci0gIEZ1bmN0aW9uTWFwKiBmdW5jdGlvbnM7Ci0gIE1vZHVsZSogVGhlTW9kdWxlOwotCi0gIE4zTW9kdWxlUHJvdmlkZXIoTW9kdWxlICptLCBGdW5jdGlvbk1hcCogZikgewotICAgIFRoZU1vZHVsZSA9IG07Ci0gICAgbS0+c2V0TWF0ZXJpYWxpemVyKHRoaXMpOwotICAgIGZ1bmN0aW9ucyA9IGY7Ci0gIH0KLSAgCi0gIGJvb2wgTWF0ZXJpYWxpemUoR2xvYmFsVmFsdWUgKkdWLCBzdGQ6OnN0cmluZyAqRXJySW5mbyA9IDApOwotICB2aXJ0dWFsIGJvb2wgaXNNYXRlcmlhbGl6YWJsZShjb25zdCBsbHZtOjpHbG9iYWxWYWx1ZSopIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgaXNEZW1hdGVyaWFsaXphYmxlKGNvbnN0IGxsdm06Okdsb2JhbFZhbHVlKikgY29uc3QgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICB2aXJ0dWFsIGJvb2wgTWF0ZXJpYWxpemVNb2R1bGUobGx2bTo6TW9kdWxlKiwgc3RkOjpzdHJpbmcqKSB7IHJldHVybiB0cnVlOyB9Ci0KLSAgVk1NZXRob2QqIGxvb2t1cEZ1bmN0aW9uKEZ1bmN0aW9uKiBGKSB7Ci0gICAgcmV0dXJuIGZ1bmN0aW9ucy0+bG9va3VwKEYpOwotICB9Ci19OwotCi19IC8vIEVuZCBuMyBuYW1lc3BhY2UKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92bWtpdC9saWIvTjMvVk1Db3JlL05hdGl2ZVV0aWwuY3BwIGIvdm1raXQvbGliL04zL1ZNQ29yZS9OYXRpdmVVdGlsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVhZjJmMi4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTjMvVk1Db3JlL05hdGl2ZVV0aWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLy89PT0tLS0tLS0tIE5hdGl2ZVV0aWwuY3BwIC0gTWV0aG9kcyB0byBjYWxsIG5hdGl2ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjMKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSA8ZGxmY24uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImxsdm0vRGVyaXZlZFR5cGVzLmgiCi0KLSNpbmNsdWRlICJOYXRpdmVVdGlsLmgiCi0jaW5jbHVkZSAiTjMuaCIKLSNpbmNsdWRlICJWTUFycmF5LmgiCi0jaW5jbHVkZSAiVk1DbGFzcy5oIgotI2luY2x1ZGUgIlZNVGhyZWFkLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBuMzsKLQotc3RhdGljIHZvaWQgY2xpVG9JbnRlcm5hbChjaGFyKiBidWYpIHsKLSAgdWludDMyIGkgPSAwOwotICB3aGlsZSAoYnVmW2ldICE9IDApIHsKLSAgICBpZiAoYnVmW2ldID09ICcuJykgYnVmW2ldID0gJ18nOwotICAgICsraTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCogbWFrZUZ1bGwoVk1Db21tb25DbGFzcyogY2wsIFZNTWV0aG9kKiBtZXRoKSB7Ci0gIGNoYXIqIGJ1ZiA9IChjaGFyKilhbGxvY2EoNDA5Nik7Ci0gIHNwcmludGYoYnVmLCAKLQkJCQkJIiVzXyVzXyVzIiwgCi0JCQkJCW12bTo6UHJpbnRCdWZmZXIoY2wtPm5hbWVTcGFjZSkuY1N0cmluZygpLCAKLQkJCQkJbXZtOjpQcmludEJ1ZmZlcihjbC0+bmFtZSkuY1N0cmluZygpLAotCQkJCQltdm06OlByaW50QnVmZmVyKG1ldGgtPm5hbWUpLmNTdHJpbmcoKSk7Ci0KLSAgc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+OjppdGVyYXRvciBpID0gbWV0aC0+cGFyYW1ldGVycy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBtZXRoLT5wYXJhbWV0ZXJzLmVuZCgpOwotICAKLSAgLy8gUmVtb3ZlIHJldHVybiB0eXBlOwotICArK2k7Ci0gIGZvciAoIDsgaSE9IGU7ICsraSkgewotICAgIFZNQ29tbW9uQ2xhc3MqIGNsID0gKmk7Ci0gICAgc3ByaW50ZihidWYsICIlc18lc18lcyIsIGJ1ZiwgbXZtOjpQcmludEJ1ZmZlcihjbC0+bmFtZVNwYWNlKS5jU3RyaW5nKCksIG12bTo6UHJpbnRCdWZmZXIoY2wtPm5hbWUpLmNTdHJpbmcoKSk7Ci0gIH0KLQotICBjbGlUb0ludGVybmFsKGJ1Zik7Ci0gIHZvaWQqIHJlcyA9IGRsc3ltKDAsIGJ1Zik7Ci0gIAotICBpZiAoIXJlcykgewotICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoInVuYWJsZSB0byBmaW5kIG5hdGl2ZSBtZXRob2QgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12bTo6UHJpbnRCdWZmZXIobWV0aCkuY1N0cmluZygpKTsKLSAgfQotCi0gIHJldHVybiByZXM7Ci19Ci0KLXZvaWQqIE5hdGl2ZVV0aWw6Om5hdGl2ZUxvb2t1cChWTUNvbW1vbkNsYXNzKiBjbCwgVk1NZXRob2QqIG1ldGgpIHsKLQltdm06OlByaW50QnVmZmVyIF9uYW1lKGNsLT5uYW1lKTsKLQltdm06OlByaW50QnVmZmVyIF9uYW1lU3BhY2UoY2wtPm5hbWVTcGFjZSk7Ci0JbXZtOjpQcmludEJ1ZmZlciBfbWV0aE5hbWUobWV0aC0+bmFtZSk7Ci0gIGNoYXIqIG5hbWUgPSBfbmFtZS5jU3RyaW5nKCk7Ci0gIGNoYXIqIG5hbWVTcGFjZSA9IF9uYW1lU3BhY2UuY1N0cmluZygpOwotICBjaGFyKiBtZXRoTmFtZSA9IF9tZXRoTmFtZS5jU3RyaW5nKCk7Ci0KLSAgY2hhciogYnVmID0gKGNoYXIqKWFsbG9jYSg2ICsgc3RybGVuKG5hbWUpICsgc3RybGVuKG5hbWVTcGFjZSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihtZXRoTmFtZSkpOwotICBzcHJpbnRmKGJ1ZiwgIiVzXyVzXyVzIiwgbmFtZVNwYWNlLCBuYW1lLCBtZXRoTmFtZSk7Ci0gIGNsaVRvSW50ZXJuYWwoYnVmKTsKLSAgdm9pZCogcmVzID0gZGxzeW0oMCwgYnVmKTsKLSAgaWYgKCFyZXMpIHsKLSAgICBidWYgPSAoY2hhciopYWxsb2NhKDYgKyBzdHJsZW4obmFtZSkgKyBzdHJsZW4obmFtZVNwYWNlKSArCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4obWV0aE5hbWUpICsgMTApOwotICAgIHNwcmludGYoYnVmLCAiJXNfJXNfJXNfJWQiLCBuYW1lU3BhY2UsIG5hbWUsIG1ldGhOYW1lLCAKLSAgICAgICAgICAgICAgICBtZXRoLT5nZXRTaWduYXR1cmUoTlVMTCktPmdldE51bVBhcmFtcygpKTsKLSAgICBjbGlUb0ludGVybmFsKGJ1Zik7Ci0gICAgcmVzID0gZGxzeW0oMCwgYnVmKTsKLSAgICBpZiAoIXJlcykgewotICAgICAgcmV0dXJuIG1ha2VGdWxsKGNsLCBtZXRoKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlczsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvTmF0aXZlVXRpbC5oIGIvdm1raXQvbGliL04zL1ZNQ29yZS9OYXRpdmVVdGlsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNTE4NjMuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL04zL1ZNQ29yZS9OYXRpdmVVdGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vLz09PS0tLS0tLS0gTmF0aXZlVXRpbC5oIC0gTWV0aG9kcyB0byBjYWxsIG5hdGl2ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjMKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIE4zX05BVElWRV9VVElMX0gKLSNkZWZpbmUgTjNfTkFUSVZFX1VUSUxfSAotCi1uYW1lc3BhY2UgbjMgewotCi1jbGFzcyBWTUNvbW1vbkNsYXNzOwotY2xhc3MgVk1NZXRob2Q7Ci0KLWNsYXNzIE5hdGl2ZVV0aWwgewotcHVibGljOgotCi0gIHN0YXRpYyB2b2lkKiBuYXRpdmVMb29rdXAoVk1Db21tb25DbGFzcyogY2wsIFZNTWV0aG9kKiBtZXRoKTsKLX07Ci0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS92bWtpdC9saWIvTjMvVk1Db3JlL09wY29kZU5hbWVzLmRlZiBiL3Zta2l0L2xpYi9OMy9WTUNvcmUvT3Bjb2RlTmFtZXMuZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzU5Mjk2Li4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvT3Bjb2RlTmFtZXMuZGVmCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0tLS0gT3Bjb2RlTmFtZXMuZGVmIC0gTmFtZSBvZiBvcGNvZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMwotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIE9QQ09ERV9OQU1FU19ERUYKLSNkZWZpbmUgT1BDT0RFX05BTUVTX0RFRgotCi1jb25zdCBjaGFyKiBuMzo6Q0xJSml0OjpPcGNvZGVOYW1lc1sweEUxXSA9IHsKLSAgIm5vcCIsIC8vIDB4MDAKLSAgImJyZWFrIiwgLy8gMHgwMQotICAibGRhcmcuMCIsIC8vIDB4MDIKLSAgImxkYXJnLjEiLCAvLyAweDAzCi0gICJsZGFyZy4yIiwgLy8gMHgwNAotICAibGRhcmcuMyIsIC8vIDB4MDUKLSAgImxkbG9jLjAiLCAvLyAweDA2Ci0gICJsZGxvYy4xIiwgLy8gMHgwNwotICAibGRsb2MuMiIsIC8vIDB4MDgKLSAgImxkbG9jLjMiLCAvLyAweDA5Ci0gICJzdGxvYy4wIiwgLy8gMHgwQQotICAic3Rsb2MuMSIsIC8vIDB4MEIKLSAgInN0bG9jLjIiLCAvLyAweDBDCi0gICJzdGxvYy4zIiwgLy8gMHgwRAotICAibGRhcmcucyIsIC8vIDB4MEUKLSAgImxkYXJnYS5zIiwgLy8gMHgwRgotICAic3RhcmcucyIsIC8vIDB4MTAKLSAgImxkbG9jLnMiLCAvLyAweDExCi0gICJsZGxvY2EucyIsIC8vIDB4MTIKLSAgInN0bG9jLnMiLCAvLyAweDEzCi0gICJsZG51bGwiLCAvLyAweDE0Ci0gICJsZGMuaTQubTEiLCAvLyAweDE1Ci0gICJsZGMuaTQuMCIsIC8vIDB4MTYKLSAgImxkYy5pNC4xIiwgLy8gMHgxNwotICAibGRjLmk0LjIiLCAvLyAweDE4Ci0gICJsZGMuaTQuMyIsIC8vIDB4MTkKLSAgImxkYy5pNC40IiwgLy8gMHgxQQotICAibGRjLmk0LjUiLCAvLyAweDFCCi0gICJsZGMuaTQuNiIsIC8vIDB4MUMKLSAgImxkYy5pNC43IiwgLy8gMHgxRAotICAibGRjLmk0LjgiLCAvLyAweDFFCi0gICJsZGMuaTQucyIsIC8vIDB4MUYKLSAgImxkYy5pNCIsIC8vIDB4MjAKLSAgImxkYy5pOCIsIC8vIDB4MjEKLSAgImxkYy5yNCIsIC8vIDB4MjIKLSAgImxkYy5yOCIsIC8vIDB4MjMKLSAgInVudXNlZDk5IiwgLy8gMHgyNAotICAiZHVwIiwgLy8gMHgyNQotICAicG9wIiwgLy8gMHgyNgotICAiam1wIiwgLy8gMHgyNwotICAiY2FsbCIsIC8vIDB4MjgKLSAgImNhbGxpIiwgLy8gMHgyOQotICAicmV0IiwgLy8gMHgyQQotICAiYnIucyIsIC8vIDB4MkIKLSAgImJyZmFsc2UucyIsIC8vIDB4MkMKLSAgImJydHJ1ZS5zIiwgLy8gMHgyRAotICAiYmVxLnMiLCAvLyAweDJFCi0gICJiZ2UucyIsIC8vIDB4MkYKLSAgImJndC5zIiwgLy8gMHgzMAotICAiYmxlLnMiLCAvLyAweDMxCi0gICJibHQucyIsIC8vIDB4MzIKLSAgImJuZS51bi5zIiwgLy8gMHgzMwotICAiYmdlLnVuLnMiLCAvLyAweDM0Ci0gICJiZ3QudW4ucyIsIC8vIDB4MzUKLSAgImJsZS51bi5zIiwgLy8gMHgzNgotICAiYmx0LnVuLnMiLCAvLyAweDM3Ci0gICJiciIsIC8vIDB4MzgKLSAgImJyZmFsc2UiLCAvLyAweDM5Ci0gICJicnRydWUiLCAvLyAweDNBCi0gICJiZXEiLCAvLyAweDNCCi0gICJiZ2UiLCAvLyAweDNDCi0gICJiZ3QiLCAvLyAweDNECi0gICJibGUiLCAvLyAweDNFCi0gICJibHQiLCAvLyAweDNGCi0gICJibmUudW4iLCAvLyAweDQwCi0gICJiZ2UudW4iLCAvLyAweDQxCi0gICJiZ3QudW4iLCAvLyAweDQyCi0gICJibGUudW4iLCAvLyAweDQzCi0gICJibHQudW4iLCAvLyAweDQ0Ci0gICJzd2l0Y2giLCAvLyAweDQ1Ci0gICJsZGluZC5pMSIsIC8vIDB4NDYKLSAgImxkaW5kLnUxIiwgLy8gMHg0NwotICAibGRpbmQuaTIiLCAvLyAweDQ4Ci0gICJsZGluZC51MiIsIC8vIDB4NDkKLSAgImxkaW5kLmk0IiwgLy8gMHg0QQotICAibGRpbmQudTQiLCAvLyAweDRCCi0gICJsZGluZC5pOCIsIC8vIDB4NEMKLSAgImxkaW5kLmkiLCAvLyAweDRECi0gICJsZGluZC5yNCIsIC8vIDB4NEUKLSAgImxkaW5kLnI4IiwgLy8gMHg0RgotICAibGRpbmQucmVmIiwgLy8gMHg1MAotICAic3RpbmQucmVmIiwgLy8gMHg1MQotICAic3RpbmQuaTEiLCAvLyAweDUyCi0gICJzdGluZC5pMiIsIC8vIDB4NTMKLSAgInN0aW5kLmk0IiwgLy8gMHg1NAotICAic3RpbmQuaTgiLCAvLyAweDU1Ci0gICJzdGluZC5yNCIsIC8vIDB4NTYKLSAgInN0aW5kLnI4IiwgLy8gMHg1NwotICAiYWRkIiwgLy8gMHg1OAotICAic3ViIiwgLy8gMHg1OQotICAibXVsIiwgLy8gMHg1QQotICAiZGl2IiwgLy8gMHg1QgotICAiZGl2LnVuIiwgLy8gMHg1QwotICAicmVtIiwgLy8gMHg1RAotICAicmVtLnVuIiwgLy8gMHg1RQotICAiYW5kIiwgLy8gMHg1RgotICAib3IiLCAvLyAweDYwCi0gICJ4b3IiLCAvLyAweDYxCi0gICJzaGwiLCAvLyAweDYyCi0gICJzaHIiLCAvLyAweDYzCi0gICJzaHIudW4iLCAvLyAweDY0Ci0gICJuZWciLCAvLyAweDY1Ci0gICJub3QiLCAvLyAweDY2Ci0gICJjb252LmkxIiwgLy8gMHg2NwotICAiY29udi5pMiIsIC8vIDB4NjgKLSAgImNvbnYuaTQiLCAvLyAweDY5Ci0gICJjb252Lmk4IiwgLy8gMHg2QQotICAiY29udi5yNCIsIC8vIDB4NkIKLSAgImNvbnYucjgiLCAvLyAweDZDCi0gICJjb252LnU0IiwgLy8gMHg2RAotICAiY29udi51OCIsIC8vIDB4NkUKLSAgImNhbGx2aXJ0IiwgLy8gMHg2RgotICAiY3BvYmoiLCAvLyAweDcwCi0gICJsZG9iaiIsIC8vIDB4NzEKLSAgImxkc3RyIiwgLy8gMHg3MgotICAibmV3b2JqIiwgLy8gMHg3MwotICAiY2FzdGNsYXNzIiwgLy8gMHg3NAotICAiaXNpbnN0IiwgLy8gMHg3NQotICAiY29udi5yLnVuIiwgLy8gMHg3NgotICAidW51c2VkNTgiLCAvLyAweDc3Ci0gICJ1bnVzZWQxIiwgLy8gMHg3OAotICAidW5ib3giLCAvLyAweDc5Ci0gICJ0aHJvdyIsIC8vIDB4N0EKLSAgImxkZmxkIiwgLy8gMHg3QgotICAibGRmbGRhIiwgLy8gMHg3QwotICAic3RmbGQiLCAvLyAweDdECi0gICJsZHNmbGQiLCAvLyAweDdFCi0gICJsZHNmbGRhIiwgLy8gMHg3RgotICAic3RzZmxkIiwgLy8gMHg4MAotICAic3RvYmoiLCAvLyAweDgxCi0gICJjb252Lm92Zi5pMS51biIsIC8vIDB4ODIKLSAgImNvbnYub3ZmLmkyLnVuIiwgLy8gMHg4MwotICAiY29udi5vdmYuaTQudW4iLCAvLyAweDg0Ci0gICJjb252Lm92Zi5pOC51biIsIC8vIDB4ODUKLSAgImNvbnYub3ZmLnUxLnVuIiwgLy8gMHg4NgotICAiY29udi5vdmYudTIudW4iLCAvLyAweDg3Ci0gICJjb252Lm92Zi51NC51biIsIC8vIDB4ODgKLSAgImNvbnYub3ZmLnU4LnVuIiwgLy8gMHg4OQotICAiY29udi5vdmYuaS51biIsIC8vIDB4OEEKLSAgImNvbnYub3ZmLnUudW4iLCAvLyAweDhCCi0gICJib3giLCAvLyAweDhDCi0gICJuZXdhcnIiLCAvLyAweDhECi0gICJsZGxlbiIsIC8vIDB4OEUKLSAgImxkZWxlbWEiLCAvLyAweDhGCi0gICJsZGVsZW0uaTEiLCAvLyAweDkwCi0gICJsZGVsZW0udTEiLCAvLyAweDkxCi0gICJsZGVsZW0uaTIiLCAvLyAweDkyCi0gICJsZGVsZW0udTIiLCAvLyAweDkzCi0gICJsZGVsZW0uaTQiLCAvLyAweDk0Ci0gICJsZGVsZW0udTQiLCAvLyAweDk1Ci0gICJsZGVsZW0uaTgiLCAvLyAweDk2Ci0gICJsZGVsZW0uaSIsIC8vIDB4OTcKLSAgImxkZWxlbS5yNCIsIC8vIDB4OTgKLSAgImxkZWxlbS5yOCIsIC8vIDB4OTkKLSAgImxkZWxlbS5yZWYiLCAvLyAweDlBCi0gICJzdGVsZW0uaSIsIC8vIDB4OUIKLSAgInN0ZWxlbS5pMSIsIC8vIDB4OUMKLSAgInN0ZWxlbS5pMiIsIC8vIDB4OUQKLSAgInN0ZWxlbS5pNCIsIC8vIDB4OUUKLSAgInN0ZWxlbS5pOCIsIC8vIDB4OUYKLSAgInN0ZWxlbS5yNCIsIC8vIDB4QTAKLSAgInN0ZWxlbS5yOCIsIC8vIDB4QTEKLSAgInN0ZWxlbS5yZWYiLCAvLyAweEEyCi0gICJsZGVsZW0iLCAvLyAweEEzCi0gICJzdGVsZW0iLCAvLyAweEE0Ci0gICJ1bmJveC5hbnkiLCAvLyAweEE1Ci0gICJ1bnVzZWQ1IiwgLy8gMHhBNgotICAidW51c2VkNiIsIC8vIDB4QTcKLSAgInVudXNlZDciLCAvLyAweEE4Ci0gICJ1bnVzZWQ4IiwgLy8gMHhBOQotICAidW51c2VkOSIsIC8vIDB4QUEKLSAgInVudXNlZDEwIiwgLy8gMHhBQgotICAidW51c2VkMTEiLCAvLyAweEFDCi0gICJ1bnVzZWQxMiIsIC8vIDB4QUQKLSAgInVudXNlZDEzIiwgLy8gMHhBRQotICAidW51c2VkMTQiLCAvLyAweEFGCi0gICJ1bnVzZWQxNSIsIC8vIDB4QjAKLSAgInVudXNlZDE2IiwgLy8gMHhCMQotICAidW51c2VkMTciLCAvLyAweEIyCi0gICJjb252Lm92Zi5pMSIsIC8vIDB4QjMKLSAgImNvbnYub3ZmLnUxIiwgLy8gMHhCNAotICAiY29udi5vdmYuaTIiLCAvLyAweEI1Ci0gICJjb252Lm92Zi51MiIsIC8vIDB4QjYKLSAgImNvbnYub3ZmLmk0IiwgLy8gMHhCNwotICAiY29udi5vdmYudTQiLCAvLyAweEI4Ci0gICJjb252Lm92Zi5pOCIsIC8vIDB4QjkKLSAgImNvbnYub3ZmLnU4IiwgLy8gMHhCQQotICAidW51c2VkNTAiLCAvLyAweEJCCi0gICJ1bnVzZWQxOCIsIC8vIDB4QkMKLSAgInVudXNlZDE5IiwgLy8gMHhCRAotICAidW51c2VkMjAiLCAvLyAweEJFCi0gICJ1bnVzZWQyMSIsIC8vIDB4QkYKLSAgInVudXNlZDIyIiwgLy8gMHhDMAotICAidW51c2VkMjMiLCAvLyAweEMxCi0gICJyZWZhbnl2YWwiLCAvLyAweEMyCi0gICJja2Zpbml0ZSIsIC8vIDB4QzMKLSAgInVudXNlZDI0IiwgLy8gMHhDNAotICAidW51c2VkMjUiLCAvLyAweEM1Ci0gICJta3JlZmFueSIsIC8vIDB4QzYKLSAgInVudXNlZDU5IiwgLy8gMHhDNwotICAidW51c2VkNjAiLCAvLyAweEM4Ci0gICJ1bnVzZWQ2MSIsIC8vIDB4QzkKLSAgInVudXNlZDYyIiwgLy8gMHhDQQotICAidW51c2VkNjMiLCAvLyAweENCCi0gICJ1bnVzZWQ2NCIsIC8vIDB4Q0MKLSAgInVudXNlZDY1IiwgLy8gMHhDRAotICAidW51c2VkNjYiLCAvLyAweENFCi0gICJ1bnVzZWQ2NyIsIC8vIDB4Q0YKLSAgImxkdG9rZW4iLCAvLyAweEQwCi0gICJjb252LnUyIiwgLy8gMHhEMQotICAiY29udi51MSIsIC8vIDB4RDIKLSAgImNvbnYuaSIsIC8vIDB4RDMKLSAgImNvbnYub3ZmLmkiLCAvLyAweEQ0Ci0gICJjb252Lm92Zi51IiwgLy8gMHhENQotICAiYWRkLm92ZiIsIC8vIDB4RDYKLSAgImFkZC5vdmYudW4iLCAvLyAweEQ3Ci0gICJtdWwub3ZmIiwgLy8gMHhEOAotICAibXVsLm92Zi51biIsIC8vIDB4RDkKLSAgInN1Yi5vdmYiLCAvLyAweERBCi0gICJzdWIub3ZmLnVuIiwgLy8gMHhEQgotICAiZW5kZmluYWxseSIsIC8vIDB4REMKLSAgImxlYXZlIiwgLy8gMHhERAotICAibGVhdmUucyIsIC8vIDB4REUKLSAgInN0aW5kLmkiLCAvLyAweERGCi0gICJjb252LnUiIC8vIDB4RTAKLX07Ci0KLWNvbnN0IGNoYXIqIG4zOjpDTElKaXQ6Ok9wY29kZU5hbWVzRkVbMHgyM10gPSB7Ci0gICJhcmdsaXN0IiwgLy8gMHgwMAotICAiY2VxIiwgLy8gMHgwMQotICAiY2d0IiwgLy8gMHgwMgotICAiY2d0LnVuIiwgLy8gMHgwMwotICAiY2x0IiwgLy8gMHgwNAotICAiY2x0LnVuIiwgLy8gMHgwNQotICAibGRmdG4iLCAvLyAweDA2Ci0gICJsZHZpcnRmdG4iLCAvLyAweDA3Ci0gICJ1bnVzZWQ1NiIsIC8vIDB4MDgKLSAgImxkYXJnIiwgLy8gMHgwOQotICAibGRhcmdhIiwgLy8gMHgwQQotICAic3RhcmciLCAvLyAweDBCCi0gICJsZGxvYyIsIC8vIDB4MEMKLSAgImxkbG9jYSIsIC8vIDB4MEQKLSAgInN0bG9jIiwgLy8gMHgwRQotICAibG9jYWxsb2MiLCAvLyAweDBGCi0gICJ1bnVzZWQ1NyIsIC8vIDB4MTAKLSAgImVuZGZpbHRlciIsIC8vIDB4MTEKLSAgInVuYWxpZ25lZC4iLCAvLyAweDEyCi0gICJ2b2xhdGlsZS4iLCAvLyAweDEzCi0gICJ0YWlsLiIsIC8vIDB4MTQKLSAgImluaXRvYmoiLCAvLyAweDE1Ci0gICJjb25zdHJhaW5lZC4iLCAvLyAweDE2Ci0gICJjcGJsayIsIC8vIDB4MTcKLSAgImluaXRibGsiLCAvLyAweDE4Ci0gICJuby4iLCAvLyAweDE5Ci0gICJyZXRocm93IiwgLy8gMHgxQQotICAidW51c2VkIiwgLy8gMHgxQgotICAic2l6ZW9mIiwgLy8gMHgxQwotICAicmVmYW55dHlwZSIsIC8vIDB4MUQKLSAgInJlYWRvbmx5LiIsIC8vIDB4MUUKLSAgInVudXNlZDUzIiwgLy8gMHgxRgotICAidW51c2VkNTQiLCAvLyAweDIwCi0gICJ1bnVzZWQ1NSIsIC8vIDB4MjEKLSAgInVudXNlZDcwIiAvLyAweDIyCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvT3Bjb2Rlcy5jcHAgYi92bWtpdC9saWIvTjMvVk1Db3JlL09wY29kZXMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjU5NTM1Li4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvT3Bjb2Rlcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNTY3ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0gT3Bjb2Rlcy5jcHAgLSBSZWFkcyBhbmQgY29tcGlsZXMgb3Bjb2RlcyAtLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMwotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJOM0RlYnVnLmgiCi0KLSNpbmNsdWRlIDxjc3RyaW5nPgotCi0jaW5jbHVkZSA8bGx2bS9Db25zdGFudHMuaD4KLSNpbmNsdWRlIDxsbHZtL0Rlcml2ZWRUeXBlcy5oPgotI2luY2x1ZGUgPGxsdm0vTExWTUNvbnRleHQuaD4KLSNpbmNsdWRlIDxsbHZtL01vZHVsZS5oPgotI2luY2x1ZGUgPGxsdm0vVHlwZS5oPgotI2luY2x1ZGUgPGxsdm0vRnVuY3Rpb24uaD4KLSNpbmNsdWRlIDxsbHZtL0luc3RydWN0aW9ucy5oPgotI2luY2x1ZGUgPGxsdm0vUGFzc01hbmFnZXIuaD4KLSNpbmNsdWRlIDxsbHZtL1RyYW5zZm9ybXMvSVBPLmg+Ci0jaW5jbHVkZSA8bGx2bS9UcmFuc2Zvcm1zL1NjYWxhci5oPgotI2luY2x1ZGUgPGxsdm0vVGFyZ2V0L1RhcmdldERhdGEuaD4KLSNpbmNsdWRlIDxsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmg+Ci0jaW5jbHVkZSA8bGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oPgotCi0jaW5jbHVkZSAibXZtL0pJVC5oIgotCi0jaW5jbHVkZSAiQXNzZW1ibHkuaCIKLSNpbmNsdWRlICJDTElKaXQuaCIKLSNpbmNsdWRlICJDTElTdHJpbmcuaCIKLSNpbmNsdWRlICJNU0NvcmxpYi5oIgotI2luY2x1ZGUgIk4zLmgiCi0jaW5jbHVkZSAiUmVhZGVyLmgiCi0jaW5jbHVkZSAiVk1BcnJheS5oIgotI2luY2x1ZGUgIlZNQ2xhc3MuaCIKLSNpbmNsdWRlICJWTU9iamVjdC5oIgotI2luY2x1ZGUgIlZNVGhyZWFkLmgiCi0KLSNpbmNsdWRlICJPcGNvZGVOYW1lcy5kZWYiCi0KLXVzaW5nIG5hbWVzcGFjZSBuMzsKLXVzaW5nIG5hbWVzcGFjZSBsbHZtOwotCi0KLXN0YXRpYyBpbmxpbmUgc2ludDggcmVhZFMxKHVpbnQ4KiBieXRlY29kZSwgdWludDMyJiBpKSB7Ci0gIHJldHVybiAoKHNpbnQ4KilieXRlY29kZSlbKytpXTsKLX0KLQotc3RhdGljIGlubGluZSB1aW50OCByZWFkVTEodWludDgqIGJ5dGVjb2RlLCB1aW50MzImIGkpIHsKLSAgcmV0dXJuIGJ5dGVjb2RlWysraV07Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc2ludDE2IHJlYWRTMih1aW50OCogYnl0ZWNvZGUsIHVpbnQzMiYgaSkgewotICBzaW50MTYgdmFsID0gcmVhZFMxKGJ5dGVjb2RlLCBpKTsKLSAgcmV0dXJuIHZhbCB8IChyZWFkVTEoYnl0ZWNvZGUsIGkpIDw8IDgpOwotfQotCi1zdGF0aWMgaW5saW5lIHVpbnQxNiByZWFkVTIodWludDgqIGJ5dGVjb2RlLCB1aW50MzImIGkpIHsKLSAgdWludDE2IHZhbCA9IHJlYWRVMShieXRlY29kZSwgaSk7Ci0gIHJldHVybiB2YWwgfCAocmVhZFUxKGJ5dGVjb2RlLCBpKSA8PCA4KTsKLX0KLQotc3RhdGljIGlubGluZSBzaW50MzIgcmVhZFM0KHVpbnQ4KiBieXRlY29kZSwgdWludDMyJiBpKSB7Ci0gIHNpbnQzMiB2YWwgPSByZWFkVTIoYnl0ZWNvZGUsIGkpOwotICByZXR1cm4gdmFsIHwgKHJlYWRVMihieXRlY29kZSwgaSkgPDwgMTYpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdWludDMyIHJlYWRVNCh1aW50OCogYnl0ZWNvZGUsIHVpbnQzMiYgaSkgewotICByZXR1cm4gcmVhZFM0KGJ5dGVjb2RlLCBpKTsKLX0KLQotc3RhdGljIGlubGluZSBzaW50NjQgcmVhZFM4KHVpbnQ4KiBieXRlY29kZSwgdWludDMyJiBpKSB7Ci0gIHVpbnQ2NCB2YWwgPSByZWFkVTQoYnl0ZWNvZGUsIGkpOwotICB1aW50NjQgX3ZhbDIgPSByZWFkVTQoYnl0ZWNvZGUsIGkpOwotICB1aW50NjQgdmFsMiA9IF92YWwyIDw8IDMyOwotICByZXR1cm4gdmFsIHwgdmFsMjsKLX0KLQotdHlwZWRlZiB1bmlvbiB1ZmxvYXRfdCB7Ci0gIHVpbnQzMiBpOwotICBmbG9hdCBmOwotfXVmbG9hdF90OwotCi10eXBlZGVmIHVuaW9uIHVkb3VibGVfdCB7Ci0gIHNpbnQ2NCBsOwotICBkb3VibGUgZDsKLX11ZG91YmxlX3Q7Ci0KLQotc3RhdGljIGlubGluZSBmbG9hdCByZWFkRmxvYXQodWludDgqIGJ5dGVjb2RlLCB1aW50MzImIGkpIHsKLSAgdWZsb2F0X3QgdG1wOwotICB0bXAuaSA9IHJlYWRVNChieXRlY29kZSwgaSk7Ci0gIHJldHVybiB0bXAuZjsKLX0KLQotc3RhdGljIGlubGluZSBkb3VibGUgcmVhZERvdWJsZSh1aW50OCogYnl0ZWNvZGUsIHVpbnQzMiYgaSkgewotICB1ZG91YmxlX3QgdG1wOwotICB0bXAubCA9IHJlYWRTOChieXRlY29kZSwgaSk7Ci0gIHJldHVybiB0bXAuZDsKLX0KLQotCi1leHRlcm4gIkMiIHZvaWQgbjNQcmludEV4ZWN1dGlvbihjaGFyKiBvcGNvZGUsIFZNTWV0aG9kKiBtZXRoKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiZXhlY3V0aW5nICVzICVzXG4iLCBtdm06OlByaW50QnVmZmVyKG1ldGgpLmNTdHJpbmcoKSwgb3Bjb2RlKTsKLX0KLQotCi1zdGF0aWMgdm9pZCB2ZXJpZnlUeXBlKFZhbHVlKiYgdmFsMSwgVmFsdWUqJiB2YWwyLCBCYXNpY0Jsb2NrKiBjdXJyZW50QmxvY2spIHsKLSAgY29uc3QgVHlwZSogdDEgPSB2YWwxLT5nZXRUeXBlKCk7Ci0gIGNvbnN0IFR5cGUqIHQyID0gdmFsMi0+Z2V0VHlwZSgpOwotICBpZiAodDEgIT0gdDIpIHsKLSAgICBpZiAodDEtPmlzSW50ZWdlclR5KCkgJiYgdDItPmlzSW50ZWdlclR5KCkpIHsKLSAgICAgIGlmICh0MS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpIDwgdDItPmdldFByaW1pdGl2ZVNpemVJbkJpdHMoKSkgewotICAgICAgICB2YWwxID0gbmV3IFNFeHRJbnN0KHZhbDEsIHQyLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhbDIgPSBuZXcgU0V4dEluc3QodmFsMiwgdDEsICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodDEtPmlzRmxvYXRUeSgpKSB7Ci0gICAgICBpZiAodDEtPmdldFByaW1pdGl2ZVNpemVJbkJpdHMoKSA8IHQyLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCkpIHsKLSAgICAgICAgdmFsMSA9IG5ldyBGUEV4dEluc3QodmFsMSwgdDIsICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdmFsMiA9IG5ldyBGUEV4dEluc3QodmFsMiwgdDEsICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoaXNhPFBvaW50ZXJUeXBlPih0MSkgJiYgaXNhPFBvaW50ZXJUeXBlPih0MikpIHsKLSAgICAgIHZhbDEgPSBuZXcgQml0Q2FzdEluc3QodmFsMSwgVk1PYmplY3Q6Omxsdm1UeXBlLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgIHZhbDIgPSBuZXcgQml0Q2FzdEluc3QodmFsMiwgVk1PYmplY3Q6Omxsdm1UeXBlLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICB9IGVsc2UgaWYgKHQxLT5pc0ludGVnZXJUeSgpICYmIHQyID09IFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVHlwZTo6Z2V0SW50OFR5KGdldEdsb2JhbENvbnRleHQoKSkpKSB7Ci0gICAgICAvLyBDTEkgc2F5cyB0aGF0IHRoaXMgaXMgZmluZSBmb3Igc29tZSBvcGVyYXRpb24KLSAgICAgIHZhbDIgPSBuZXcgUHRyVG9JbnRJbnN0KHZhbDIsIHQxLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICB9IGVsc2UgaWYgKHQyLT5pc0ludGVnZXJUeSgpICYmIHQxID09IFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVHlwZTo6Z2V0SW50OFR5KGdldEdsb2JhbENvbnRleHQoKSkpKSB7Ci0gICAgICAvLyBDTEkgc2F5cyB0aGF0IHRoaXMgaXMgZmluZSBmb3Igc29tZSBvcGVyYXRpb24KLSAgICAgIHZhbDEgPSBuZXcgUHRyVG9JbnRJbnN0KHZhbDEsIHQyLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBjb252ZXJ0VmFsdWUoVmFsdWUqJiB2YWwsIGNvbnN0IFR5cGUqIHQxLCBCYXNpY0Jsb2NrKiBjdXJyZW50QmxvY2spIHsKLSAgY29uc3QgVHlwZSogdDIgPSB2YWwtPmdldFR5cGUoKTsKLSAgaWYgKHQxICE9IHQyKSB7Ci0gICAgaWYgKHQxLT5pc0ludGVnZXJUeSgpICYmIHQyLT5pc0ludGVnZXJUeSgpKSB7Ci0gICAgICBpZiAodDItPmdldFByaW1pdGl2ZVNpemVJbkJpdHMoKSA8IHQxLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCkpIHsKLSAgICAgICAgdmFsID0gbmV3IFNFeHRJbnN0KHZhbCwgdDEsICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdmFsID0gbmV3IFRydW5jSW5zdCh2YWwsIHQxLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHQxLT5pc0Zsb2F0VHkoKSAmJiB0Mi0+aXNGbG9hdFR5KCkpIHsKLSAgICAgIGlmICh0Mi0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpIDwgdDEtPmdldFByaW1pdGl2ZVNpemVJbkJpdHMoKSkgewotICAgICAgICB2YWwgPSBuZXcgRlBFeHRJbnN0KHZhbCwgdDEsICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdmFsID0gbmV3IEZQVHJ1bmNJbnN0KHZhbCwgdDEsICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoaXNhPFBvaW50ZXJUeXBlPih0MSkgJiYgaXNhPFBvaW50ZXJUeXBlPih0MikpIHsKLSAgICAgIHZhbCA9IG5ldyBCaXRDYXN0SW5zdCh2YWwsIHQxLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgc3RvcmUoVmFsdWUqIHZhbCwgVmFsdWUqIGxvY2FsLCBib29sIHZvbCwgCi0gICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrKiBjdXJyZW50QmxvY2ssIG12bTo6QmFzZUludHJpbnNpY3MqIG1vZHVsZSkgewotICBjb25zdCBUeXBlKiBjb250YWluZWQgPSBsb2NhbC0+Z2V0VHlwZSgpLT5nZXRDb250YWluZWRUeXBlKDApOwotICBpZiAoY29udGFpbmVkLT5pc1NpbmdsZVZhbHVlVHlwZSgpKSB7Ci0gICAgaWYgKHZhbC0+Z2V0VHlwZSgpICE9IGNvbnRhaW5lZCkgewotICAgICAgY29udmVydFZhbHVlKHZhbCwgY29udGFpbmVkLCBjdXJyZW50QmxvY2spOwotICAgIH0KLSAgICBuZXcgU3RvcmVJbnN0KHZhbCwgbG9jYWwsIHZvbCwgY3VycmVudEJsb2NrKTsKLSAgfSBlbHNlIGlmIChpc2E8UG9pbnRlclR5cGU+KHZhbC0+Z2V0VHlwZSgpKSkgewotICAgIHVpbnQ2NCBzaXplID0gbXZtOjpNdm1Nb2R1bGU6OmdldFR5cGVTaXplKGNvbnRhaW5lZCk7Ci0gICAgICAgIAotICAgIHN0ZDo6dmVjdG9yPFZhbHVlKj4gcGFyYW1zOwotICAgIHBhcmFtcy5wdXNoX2JhY2sobmV3IEJpdENhc3RJbnN0KGxvY2FsLCBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFR5cGU6OmdldEludDhUeShnZXRHbG9iYWxDb250ZXh0KCkpKSwgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgIHBhcmFtcy5wdXNoX2JhY2sobmV3IEJpdENhc3RJbnN0KHZhbCwgUG9pbnRlclR5cGU6OmdldFVucXVhbChUeXBlOjpnZXRJbnQ4VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSksICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICBwYXJhbXMucHVzaF9iYWNrKENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShnZXRHbG9iYWxDb250ZXh0KCkpLCBzaXplKSk7Ci0gICAgcGFyYW1zLnB1c2hfYmFjayhtb2R1bGUtPmNvbnN0YW50WmVybyk7Ci0gICAgQ2FsbEluc3Q6OkNyZWF0ZShtb2R1bGUtPmxsdm1fbWVtY3B5X2kzMiwgcGFyYW1zLmJlZ2luKCksIHBhcmFtcy5lbmQoKSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIH0gZWxzZSB7Ci0gICAgbmV3IFN0b3JlSW5zdCh2YWwsIGxvY2FsLCB2b2wsIGN1cnJlbnRCbG9jayk7Ci0gIH0KLX0KLQotc3RhdGljIFZhbHVlKiBsb2FkKFZhbHVlKiB2YWwsIGNvbnN0IGNoYXIqIG5hbWUsIEJhc2ljQmxvY2sqIGN1cnJlbnRCbG9jaywgbXZtOjpCYXNlSW50cmluc2ljcyogbW9kdWxlKSB7Ci0gIGNvbnN0IFR5cGUqIGNvbnRhaW5lZCA9IHZhbC0+Z2V0VHlwZSgpLT5nZXRDb250YWluZWRUeXBlKDApOwotICBpZiAoY29udGFpbmVkLT5pc1NpbmdsZVZhbHVlVHlwZSgpKSB7Ci0gICAgcmV0dXJuIG5ldyBMb2FkSW5zdCh2YWwsIG5hbWUsIGN1cnJlbnRCbG9jayk7Ci0gIH0gZWxzZSB7Ci0gICAgdWludDY0IHNpemUgPSBtdm06Ok12bU1vZHVsZTo6Z2V0VHlwZVNpemUoY29udGFpbmVkKTsKLSAgICBWYWx1ZSogcmV0ID0gbmV3IEFsbG9jYUluc3QoY29udGFpbmVkLCAiIiwgY3VycmVudEJsb2NrKTsgCi0gICAgc3RkOjp2ZWN0b3I8VmFsdWUqPiBwYXJhbXM7Ci0gICAgcGFyYW1zLnB1c2hfYmFjayhuZXcgQml0Q2FzdEluc3QocmV0LCBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFR5cGU6OmdldEludDhUeShnZXRHbG9iYWxDb250ZXh0KCkpKSwgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgIHBhcmFtcy5wdXNoX2JhY2sobmV3IEJpdENhc3RJbnN0KHZhbCwgUG9pbnRlclR5cGU6OmdldFVucXVhbChUeXBlOjpnZXRJbnQ4VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSksICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICBwYXJhbXMucHVzaF9iYWNrKENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShnZXRHbG9iYWxDb250ZXh0KCkpLCBzaXplKSk7Ci0gICAgcGFyYW1zLnB1c2hfYmFjayhtb2R1bGUtPmNvbnN0YW50WmVybyk7Ci0gICAgQ2FsbEluc3Q6OkNyZWF0ZShtb2R1bGUtPmxsdm1fbWVtY3B5X2kzMiwgcGFyYW1zLmJlZ2luKCksIHBhcmFtcy5lbmQoKSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotfQotCi12b2lkIENMSUppdDo6Y29tcGlsZU9wY29kZXModWludDgqIGJ5dGVjb2RlcywgdWludDMyIGNvZGVMZW5ndGgsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgdWludDMyIGxlYXZlSW5kZXggPSAwOwotICBib29sIGlzVm9sYXRpbGUgPSBmYWxzZTsKLSAgZm9yKHVpbnQzMiBpID0gMDsgaSA8IGNvZGVMZW5ndGg7ICsraSkgewotICAgIAotICAgIGlmIChieXRlY29kZXNbaV0gIT0gMHhGRSkgewotICAgICAgUFJJTlRfREVCVUcoTjNfQ09NUElMRSwgMSwgQ09MT1JfTk9STUFMLCAiXHRbYXQgJTV4XSAlLTVkICIsIGksCi0gICAgICAgICAgICAgICAgICBieXRlY29kZXNbaV0pOwotICAgICAgUFJJTlRfREVCVUcoTjNfQ09NUElMRSwgMSwgTElHSFRfQkxVRSwgImNvbXBpbGluZyAlczo6IiwgbXZtOjpQcmludEJ1ZmZlcihjb21waWxpbmdNZXRob2QpLmNTdHJpbmcoKSk7Ci0gICAgICBQUklOVF9ERUJVRyhOM19DT01QSUxFLCAxLCBMSUdIVF9DWUFOLCBPcGNvZGVOYW1lc1tieXRlY29kZXNbaV1dKTsKLSAgICAgIFBSSU5UX0RFQlVHKE4zX0NPTVBJTEUsIDEsIExJR0hUX0JMVUUsICJcbiIpOwotICAgIH0KLSAgICAKLSAgICBPcGluZm8qIG9waW5mbyA9ICYob3Bjb2RlSW5mb3NbaV0pOwotICAgIGlmIChvcGluZm8tPm5ld0Jsb2NrKSB7Ci0gICAgICBpZiAoY3VycmVudEJsb2NrLT5nZXRUZXJtaW5hdG9yKCkgPT0gMCkgewotICAgICAgICBicmFuY2gob3BpbmZvLT5uZXdCbG9jaywgY3VycmVudEJsb2NrKTsKLSAgICAgIH0KLSAgICAgIHNldEN1cnJlbnRCbG9jayhvcGluZm8tPm5ld0Jsb2NrKTsKLSAgICB9Ci0gICAgY3VycmVudEV4Y2VwdGlvbkJsb2NrID0gb3BpbmZvLT5leGNlcHRpb25CbG9jazsKLSAgICBpZiAoY3VycmVudEJsb2NrLT5nZXRUZXJtaW5hdG9yKCkgIT0gMCkgeyAvLyBUbyBwcmV2ZW50IGEgZ2NqIGJ1ZyB3aXRoIHVzZWxlc3MgZ290bwotICAgICAgY3VycmVudEJsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygiZ2NqIGJ1ZyIpOwotICAgIH0KLQotI2lmIE4zX0VYRUNVVEUgPiAxCi0gICAgaWYgKGJ5dGVjb2Rlc1tpXSA9PSAweEZFKSB7Ci0gICAgICBzdGQ6OnZlY3RvcjxsbHZtOjpWYWx1ZSo+IGFyZ3M7Ci0gICAgICBhcmdzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgKGludDY0X3QpT3Bjb2RlTmFtZXNGRVtieXRlY29kZXNbaSArIDFdXSkpOwotICAgICAgYXJncy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KGdldEdsb2JhbENvbnRleHQoKSksIChpbnQ2NF90KWNvbXBpbGluZ01ldGhvZCkpOwotICAgICAgQ2FsbEluc3Q6OkNyZWF0ZShwcmludEV4ZWN1dGlvbkxMVk0sIGFyZ3MuYmVnaW4oKSwgYXJncy5lbmQoKSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN0ZDo6dmVjdG9yPGxsdm06OlZhbHVlKj4gYXJnczsKLSAgICAgIGFyZ3MucHVzaF9iYWNrKENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShnZXRHbG9iYWxDb250ZXh0KCkpLCAoaW50NjRfdClPcGNvZGVOYW1lc1tieXRlY29kZXNbaV1dKSk7Ci0gICAgICBhcmdzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgKGludDY0X3QpY29tcGlsaW5nTWV0aG9kKSk7Ci0gICAgICBDYWxsSW5zdDo6Q3JlYXRlKHByaW50RXhlY3V0aW9uTExWTSwgYXJncy5iZWdpbigpLCBhcmdzLmVuZCgpLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICB9Ci0jZW5kaWYKLSAgCi0gICAgaWYgKG9waW5mby0+cmVxU3VwcGwpIHsKLSAgICAgIHB1c2gobmV3IExvYWRJbnN0KHN1cHBsTG9jYWwsICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGJ5dGVjb2Rlc1tpXSkgewotICAgICAgCi0gICAgICBjYXNlIEFERDogewotICAgICAgICBWYWx1ZSogdmFsMiA9IHBvcCgpOwotICAgICAgICBib29sIGlzUG9pbnRlciA9ICh2YWwyLT5nZXRUeXBlKCkgPT0gbW9kdWxlLT5wdHJUeXBlKTsKLSAgICAgICAgVmFsdWUqIHZhbDEgPSBwb3AoKTsKLSAgICAgICAgaXNQb2ludGVyIHw9ICh2YWwxLT5nZXRUeXBlKCkgPT0gbW9kdWxlLT5wdHJUeXBlKTsKLSAgICAgICAgdmVyaWZ5VHlwZSh2YWwxLCB2YWwyLCBjdXJyZW50QmxvY2spOwotICAgICAgICBWYWx1ZSogcmVzID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFkZCh2YWwxLCB2YWwyLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgaWYgKGlzUG9pbnRlcikgewotICAgICAgICAgIHJlcyA9IG5ldyBJbnRUb1B0ckluc3QocmVzLCBtb2R1bGUtPnB0clR5cGUsICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICB9Ci0gICAgICAgIHB1c2gocmVzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgQUREX09WRjogewotICAgICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgQUREX09WRl9VTjogewotICAgICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgQU5EOiB7Ci0gICAgICAgIFZhbHVlKiB2YWwyID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiB2YWwxID0gcG9wKCk7Ci0gICAgICAgIHB1c2goQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZCh2YWwxLCB2YWwyLCAiIiwgY3VycmVudEJsb2NrKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0jZGVmaW5lIFRFU1QobmFtZSwgcmVhZCwgY21wZiwgY21waSwgb2Zmc2V0KSBjYXNlIG5hbWUgOiB7IFwKLSAgICAgICAgdWludDMyIHRtcCA9IGk7ICAgICAgIFwKLSAgICAgICAgVmFsdWUqIHZhbDIgPSBwb3AoKTsgIFwKLSAgICAgICAgVmFsdWUqIHZhbDEgPSBwb3AoKTsgIFwKLSAgICAgICAgQmFzaWNCbG9jayogaWZUcnVlID0gb3Bjb2RlSW5mb3NbdG1wICsgb2Zmc2V0ICsgcmVhZChieXRlY29kZXMsIGkpXS5uZXdCbG9jazsgXAotICAgICAgICBWYWx1ZSogdGVzdCA9IDA7IFwKLSAgICAgICAgdmVyaWZ5VHlwZSh2YWwxLCB2YWwyLCBjdXJyZW50QmxvY2spOyBcCi0gICAgICAgIGlmICh2YWwxLT5nZXRUeXBlKCktPmlzRmxvYXRUeSgpKSB7IFwKLSAgICAgICAgICB0ZXN0ID0gbmV3IEZDbXBJbnN0KCpjdXJyZW50QmxvY2ssIEZDbXBJbnN0OjpjbXBmLCB2YWwxLCB2YWwyLCAiIik7IFwKLSAgICAgICAgfSBlbHNlIHsgIFwKLSAgICAgICAgICB0ZXN0ID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpjbXBpLCB2YWwxLCB2YWwyLCAiIik7IFwKLSAgICAgICAgfSBcCi0gICAgICAgIEJhc2ljQmxvY2sqIGlmRmFsc2UgPSBjcmVhdGVCYXNpY0Jsb2NrKCJmYWxzZSBCRVEiKTsgXAotICAgICAgICBicmFuY2godGVzdCwgaWZUcnVlLCBpZkZhbHNlLCBjdXJyZW50QmxvY2spOyBcCi0gICAgICAgIGN1cnJlbnRCbG9jayA9IGlmRmFsc2U7IFwKLSAgICAgICAgYnJlYWs7IFwKLSAgICAgIH0KLSAgICAgIAotICAgICAgVEVTVChCRVEsIHJlYWRTNCwgRkNNUF9PRVEsIElDTVBfRVEsIDUpOwotICAgICAgVEVTVChCRVFfUywgcmVhZFMxLCBGQ01QX09FUSwgSUNNUF9FUSwgMik7Ci0gICAgICAKLSAgICAgIFRFU1QoQkdFLCByZWFkUzQsIEZDTVBfT0dFLCBJQ01QX1NHRSwgNSk7Ci0gICAgICBURVNUKEJHRV9TLCByZWFkUzEsIEZDTVBfT0dFLCBJQ01QX1NHRSwgMik7Ci0gICAgICBURVNUKEJHRV9VTiwgcmVhZFM0LCBGQ01QX1VHRSwgSUNNUF9VR0UsIDUpOwotICAgICAgVEVTVChCR0VfVU5fUywgcmVhZFMxLCBGQ01QX1VHRSwgSUNNUF9VR0UsIDIpOwotICAgICAgCi0gICAgICBURVNUKEJHVCwgcmVhZFM0LCBGQ01QX09HVCwgSUNNUF9TR1QsIDUpOwotICAgICAgVEVTVChCR1RfUywgcmVhZFMxLCBGQ01QX09HVCwgSUNNUF9TR1QsIDIpOwotICAgICAgVEVTVChCR1RfVU4sIHJlYWRTNCwgRkNNUF9VR1QsIElDTVBfVUdULCA1KTsKLSAgICAgIFRFU1QoQkdUX1VOX1MsIHJlYWRTMSwgRkNNUF9VR1QsIElDTVBfVUdULCAyKTsKLQotICAgICAgVEVTVChCTEUsIHJlYWRTNCwgRkNNUF9PTEUsIElDTVBfU0xFLCA1KTsKLSAgICAgIFRFU1QoQkxFX1MsIHJlYWRTMSwgRkNNUF9PTEUsIElDTVBfU0xFLCAyKTsKLSAgICAgIFRFU1QoQkxFX1VOLCByZWFkUzQsIEZDTVBfVUxFLCBJQ01QX1VMRSwgNSk7Ci0gICAgICBURVNUKEJMRV9VTl9TLCByZWFkUzEsIEZDTVBfVUxFLCBJQ01QX1VMRSwgMik7Ci0gICAgICAKLSAgICAgIFRFU1QoQkxULCByZWFkUzQsIEZDTVBfT0xULCBJQ01QX1NMVCwgNSk7Ci0gICAgICBURVNUKEJMVF9TLCByZWFkUzEsIEZDTVBfT0xULCBJQ01QX1NMVCwgMik7Ci0gICAgICBURVNUKEJMVF9VTiwgcmVhZFM0LCBGQ01QX1VMVCwgSUNNUF9VTFQsIDUpOwotICAgICAgVEVTVChCTFRfVU5fUywgcmVhZFMxLCBGQ01QX1VMVCwgSUNNUF9VTFQsIDIpOwotICAgICAgCi0gICAgICBURVNUKEJORV9VTiwgcmVhZFM0LCBGQ01QX1VORSwgSUNNUF9ORSwgNSk7Ci0gICAgICBURVNUKEJORV9VTl9TLCByZWFkUzEsIEZDTVBfVU5FLCBJQ01QX05FLCAyKTsKLQotI3VuZGVmIFRFU1QgCi0gICAgICAKLSAgICAgIGNhc2UgQlIgOiB7Ci0gICAgICAgIHVpbnQzMiB0bXAgPSBpOwotICAgICAgICBCYXNpY0Jsb2NrKiBiciA9IG9wY29kZUluZm9zW3RtcCArIDUgKyByZWFkUzQoYnl0ZWNvZGVzLCBpKV0ubmV3QmxvY2s7Ci0gICAgICAgIGJyYW5jaChiciwgY3VycmVudEJsb2NrKTsgCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIEJSX1MgOiB7Ci0gICAgICAgIHVpbnQzMiB0bXAgPSBpOwotICAgICAgICBCYXNpY0Jsb2NrKiBiciA9IG9wY29kZUluZm9zW3RtcCArIDIgKyByZWFkUzEoYnl0ZWNvZGVzLCBpKV0ubmV3QmxvY2s7Ci0gICAgICAgIGJyYW5jaChiciwgY3VycmVudEJsb2NrKTsgCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIEJSRUFLOiBicmVhazsKLQotI2RlZmluZSBURVNUKG5hbWUsIHJlYWQsIGNtcGYsIGNtcGksIG9mZnNldCkgY2FzZSBuYW1lIDogeyBcCi0gICAgICAgIHVpbnQzMiB0bXAgPSBpOyAgICAgICBcCi0gICAgICAgIFZhbHVlKiB2YWwyID0gcG9wKCk7ICBcCi0gICAgICAgIFZhbHVlKiB2YWwxID0gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZSh2YWwyLT5nZXRUeXBlKCkpOyAgXAotICAgICAgICBCYXNpY0Jsb2NrKiBpZlRydWUgPSBvcGNvZGVJbmZvc1t0bXAgKyBvZmZzZXQgKyByZWFkKGJ5dGVjb2RlcywgaSldLm5ld0Jsb2NrOyBcCi0gICAgICAgIFZhbHVlKiB0ZXN0ID0gMDsgXAotICAgICAgICBpZiAodmFsMS0+Z2V0VHlwZSgpLT5pc0Zsb2F0VHkoKSkgeyBcCi0gICAgICAgICAgdGVzdCA9IG5ldyBGQ21wSW5zdCgqY3VycmVudEJsb2NrLCBGQ21wSW5zdDo6Y21wZiwgdmFsMSwgdmFsMiwgIiIpOyBcCi0gICAgICAgIH0gZWxzZSB7ICBcCi0gICAgICAgICAgdGVzdCA9IG5ldyBJQ21wSW5zdCgqY3VycmVudEJsb2NrLCBJQ21wSW5zdDo6Y21waSwgdmFsMSwgdmFsMiwgIiIpOyBcCi0gICAgICAgIH0gXAotICAgICAgICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiZmFsc2UgQlIiKTsgXAotICAgICAgICBicmFuY2godGVzdCwgaWZUcnVlLCBpZkZhbHNlLCBjdXJyZW50QmxvY2spOyBcCi0gICAgICAgIGN1cnJlbnRCbG9jayA9IGlmRmFsc2U7IFwKLSAgICAgICAgYnJlYWs7IFwKLSAgICAgIH0KLQotICAgICAgVEVTVChCUkZBTFNFLCByZWFkUzQsIEZDTVBfT0VRLCBJQ01QX0VRLCA1KTsKLSAgICAgIFRFU1QoQlJGQUxTRV9TLCByZWFkUzEsIEZDTVBfT0VRLCBJQ01QX0VRLCAyKTsKLSAgICAgIFRFU1QoQlJUUlVFLCByZWFkUzQsIEZDTVBfT05FLCBJQ01QX05FLCA1KTsKLSAgICAgIFRFU1QoQlJUUlVFX1MsIHJlYWRTMSwgRkNNUF9PTkUsIElDTVBfTkUsIDIpOwotCi0jdW5kZWYgVEVTVAotICAgICAgCi0gICAgICBjYXNlIENBTEw6IHsKLSAgICAgICAgdWludDMyIHZhbHVlID0gcmVhZFU0KGJ5dGVjb2RlcywgaSk7Ci0gICAgICAgIGludm9rZSh2YWx1ZSwgZ2VuQ2xhc3MsIGdlbk1ldGhvZCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIENBTExJOiB7Ci0gICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+dW5rbm93bkVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgQ0tGSU5JVEUgOiB7Ci0gICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+dW5rbm93bkVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgQ09OVl9JMSA6IHsKLSAgICAgICAgVmFsdWUqIHZhbCA9IHBvcCgpOwotICAgICAgICBjb25zdCBUeXBlKiB0eXBlID0gdmFsLT5nZXRUeXBlKCk7Ci0gICAgICAgIGlmICh0eXBlLT5pc0Zsb2F0VHkoKSkgewotICAgICAgICAgIHB1c2gobmV3IEZQVG9TSUluc3QodmFsLCBUeXBlOjpnZXRJbnQ4VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVHlwZTo6Z2V0SW50MTZUeShnZXRHbG9iYWxDb250ZXh0KCkpIHx8IHR5cGUgPT0gVHlwZTo6Z2V0SW50MzJUeShnZXRHbG9iYWxDb250ZXh0KCkpIHx8IAotICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gVHlwZTo6Z2V0SW50NjRUeShnZXRHbG9iYWxDb250ZXh0KCkpKSB7Ci0gICAgICAgICAgcHVzaChuZXcgVHJ1bmNJbnN0KHZhbCwgVHlwZTo6Z2V0SW50OFR5KGdldEdsb2JhbENvbnRleHQoKSksICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPnVua25vd25FcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgQ09OVl9JMiA6IHsKLSAgICAgICAgVmFsdWUqIHZhbCA9IHBvcCgpOwotICAgICAgICBjb25zdCBUeXBlKiB0eXBlID0gdmFsLT5nZXRUeXBlKCk7Ci0gICAgICAgIGlmICh0eXBlLT5pc0Zsb2F0VHkoKSkgewotICAgICAgICAgIHB1c2gobmV3IEZQVG9TSUluc3QodmFsLCBUeXBlOjpnZXRJbnQxNlR5KGdldEdsb2JhbENvbnRleHQoKSksICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFR5cGU6OmdldEludDMyVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSB8fCB0eXBlID09IFR5cGU6OmdldEludDY0VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSkgewotICAgICAgICAgIHB1c2gobmV3IFRydW5jSW5zdCh2YWwsIFR5cGU6OmdldEludDE2VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVHlwZTo6Z2V0SW50OFR5KGdldEdsb2JhbENvbnRleHQoKSkpIHsKLSAgICAgICAgICBwdXNoKG5ldyBTRXh0SW5zdCh2YWwsIFR5cGU6OmdldEludDE2VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+dW5rbm93bkVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBDT05WX0k0IDogewotICAgICAgICBWYWx1ZSogdmFsID0gcG9wKCk7Ci0gICAgICAgIGNvbnN0IFR5cGUqIHR5cGUgPSB2YWwtPmdldFR5cGUoKTsKLSAgICAgICAgaWYgKHR5cGUtPmlzRmxvYXRUeSgpKSB7Ci0gICAgICAgICAgcHVzaChuZXcgRlBUb1NJSW5zdCh2YWwsIFR5cGU6OmdldEludDMyVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVHlwZTo6Z2V0SW50NjRUeShnZXRHbG9iYWxDb250ZXh0KCkpKSB7Ci0gICAgICAgICAgcHVzaChuZXcgVHJ1bmNJbnN0KHZhbCwgVHlwZTo6Z2V0SW50MzJUeShnZXRHbG9iYWxDb250ZXh0KCkpLCAiIiwgY3VycmVudEJsb2NrKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBUeXBlOjpnZXRJbnQ4VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSB8fCB0eXBlID09IFR5cGU6OmdldEludDE2VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSkgewotICAgICAgICAgIHB1c2gobmV3IFNFeHRJbnN0KHZhbCwgVHlwZTo6Z2V0SW50MzJUeShnZXRHbG9iYWxDb250ZXh0KCkpLCAiIiwgY3VycmVudEJsb2NrKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBUeXBlOjpnZXRJbnQzMlR5KGdldEdsb2JhbENvbnRleHQoKSkpIHsKLSAgICAgICAgICBwdXNoKHZhbCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT51bmtub3duRXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIENPTlZfSTggOiB7Ci0gICAgICAgIFZhbHVlKiB2YWwgPSBwb3AoKTsKLSAgICAgICAgY29uc3QgVHlwZSogdHlwZSA9IHZhbC0+Z2V0VHlwZSgpOwotICAgICAgICBpZiAodHlwZS0+aXNGbG9hdFR5KCkpIHsKLSAgICAgICAgICBwdXNoKG5ldyBGUFRvU0lJbnN0KHZhbCwgVHlwZTo6Z2V0SW50NjRUeShnZXRHbG9iYWxDb250ZXh0KCkpLCAiIiwgY3VycmVudEJsb2NrKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBUeXBlOjpnZXRJbnQ4VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSB8fCB0eXBlID09IFR5cGU6OmdldEludDE2VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSB8fCAKLSAgICAgICAgICAgICAgICAgICB0eXBlID09IFR5cGU6OmdldEludDMyVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSkgewotICAgICAgICAgIHB1c2gobmV3IFNFeHRJbnN0KHZhbCwgVHlwZTo6Z2V0SW50NjRUeShnZXRHbG9iYWxDb250ZXh0KCkpLCAiIiwgY3VycmVudEJsb2NrKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT51bmtub3duRXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIENPTlZfUjQgOiB7Ci0gICAgICAgIFZhbHVlKiB2YWwgPSBwb3AoKTsKLSAgICAgICAgY29uc3QgVHlwZSogdHlwZSA9IHZhbC0+Z2V0VHlwZSgpOwotICAgICAgICBpZiAodHlwZSA9PSBUeXBlOjpnZXREb3VibGVUeShnZXRHbG9iYWxDb250ZXh0KCkpKSB7Ci0gICAgICAgICAgcHVzaChuZXcgRlBUcnVuY0luc3QodmFsLCBUeXBlOjpnZXRGbG9hdFR5KGdldEdsb2JhbENvbnRleHQoKSksICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc0ludGVnZXJUeSgpKSB7Ci0gICAgICAgICAgcHVzaChuZXcgU0lUb0ZQSW5zdCh2YWwsIFR5cGU6OmdldEZsb2F0VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+dW5rbm93bkVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBDT05WX1I4IDogewotICAgICAgICBWYWx1ZSogdmFsID0gcG9wKCk7Ci0gICAgICAgIGNvbnN0IFR5cGUqIHR5cGUgPSB2YWwtPmdldFR5cGUoKTsKLSAgICAgICAgaWYgKHR5cGUgPT0gVHlwZTo6Z2V0RmxvYXRUeShnZXRHbG9iYWxDb250ZXh0KCkpKSB7Ci0gICAgICAgICAgcHVzaChuZXcgRlBFeHRJbnN0KHZhbCwgVHlwZTo6Z2V0RG91YmxlVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzSW50ZWdlclR5KCkpIHsKLSAgICAgICAgICBwdXNoKG5ldyBTSVRvRlBJbnN0KHZhbCwgVHlwZTo6Z2V0RG91YmxlVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVHlwZTo6Z2V0RG91YmxlVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSkgewotICAgICAgICAgIHB1c2godmFsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPnVua25vd25FcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgQ09OVl9VMSA6IHsKLSAgICAgICAgVmFsdWUqIHZhbCA9IHBvcCgpOwotICAgICAgICBjb25zdCBUeXBlKiB0eXBlID0gdmFsLT5nZXRUeXBlKCk7Ci0gICAgICAgIGlmICh0eXBlLT5pc0Zsb2F0VHkoKSkgewotICAgICAgICAgIHB1c2gobmV3IEZQVG9VSUluc3QodmFsLCBUeXBlOjpnZXRJbnQ4VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVHlwZTo6Z2V0SW50MTZUeShnZXRHbG9iYWxDb250ZXh0KCkpIHx8IHR5cGUgPT0gVHlwZTo6Z2V0SW50MzJUeShnZXRHbG9iYWxDb250ZXh0KCkpIHx8IAotICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gVHlwZTo6Z2V0SW50NjRUeShnZXRHbG9iYWxDb250ZXh0KCkpKSB7Ci0gICAgICAgICAgcHVzaChuZXcgVHJ1bmNJbnN0KHZhbCwgVHlwZTo6Z2V0SW50OFR5KGdldEdsb2JhbENvbnRleHQoKSksICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPnVua25vd25FcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgQ09OVl9VMiA6IHsKLSAgICAgICAgVmFsdWUqIHZhbCA9IHBvcCgpOwotICAgICAgICBjb25zdCBUeXBlKiB0eXBlID0gdmFsLT5nZXRUeXBlKCk7Ci0gICAgICAgIGlmICh0eXBlLT5pc0Zsb2F0VHkoKSkgewotICAgICAgICAgIHB1c2gobmV3IEZQVG9VSUluc3QodmFsLCBUeXBlOjpnZXRJbnQxNlR5KGdldEdsb2JhbENvbnRleHQoKSksICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFR5cGU6OmdldEludDMyVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSB8fCB0eXBlID09IFR5cGU6OmdldEludDY0VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSkgewotICAgICAgICAgIHB1c2gobmV3IFRydW5jSW5zdCh2YWwsIFR5cGU6OmdldEludDhUeShnZXRHbG9iYWxDb250ZXh0KCkpLCAiIiwgY3VycmVudEJsb2NrKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBUeXBlOjpnZXRJbnQ4VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSkgewotICAgICAgICAgIHB1c2gobmV3IFpFeHRJbnN0KHZhbCwgVHlwZTo6Z2V0SW50MTZUeShnZXRHbG9iYWxDb250ZXh0KCkpLCAiIiwgY3VycmVudEJsb2NrKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT51bmtub3duRXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIENPTlZfVTQgOiB7Ci0gICAgICAgIFZhbHVlKiB2YWwgPSBwb3AoKTsKLSAgICAgICAgY29uc3QgVHlwZSogdHlwZSA9IHZhbC0+Z2V0VHlwZSgpOwotICAgICAgICBpZiAodHlwZS0+aXNGbG9hdFR5KCkpIHsKLSAgICAgICAgICBwdXNoKG5ldyBGUFRvVUlJbnN0KHZhbCwgVHlwZTo6Z2V0SW50MzJUeShnZXRHbG9iYWxDb250ZXh0KCkpLCAiIiwgY3VycmVudEJsb2NrKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBUeXBlOjpnZXRJbnQ2NFR5KGdldEdsb2JhbENvbnRleHQoKSkpIHsKLSAgICAgICAgICBwdXNoKG5ldyBUcnVuY0luc3QodmFsLCBUeXBlOjpnZXRJbnQ4VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVHlwZTo6Z2V0SW50OFR5KGdldEdsb2JhbENvbnRleHQoKSkgfHwgdHlwZSA9PSBUeXBlOjpnZXRJbnQxNlR5KGdldEdsb2JhbENvbnRleHQoKSkpIHsKLSAgICAgICAgICBwdXNoKG5ldyBaRXh0SW5zdCh2YWwsIFR5cGU6OmdldEludDE2VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+dW5rbm93bkVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBDT05WX1U4IDogewotICAgICAgICBWYWx1ZSogdmFsID0gcG9wKCk7Ci0gICAgICAgIGNvbnN0IFR5cGUqIHR5cGUgPSB2YWwtPmdldFR5cGUoKTsKLSAgICAgICAgaWYgKHR5cGUtPmlzRmxvYXRUeSgpKSB7Ci0gICAgICAgICAgcHVzaChuZXcgRlBUb1VJSW5zdCh2YWwsIFR5cGU6OmdldEludDY0VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVHlwZTo6Z2V0SW50OFR5KGdldEdsb2JhbENvbnRleHQoKSkgfHwgdHlwZSA9PSBUeXBlOjpnZXRJbnQxNlR5KGdldEdsb2JhbENvbnRleHQoKSkgfHwgCi0gICAgICAgICAgICAgICAgICAgdHlwZSA9PSBUeXBlOjpnZXRJbnQzMlR5KGdldEdsb2JhbENvbnRleHQoKSkpIHsKLSAgICAgICAgICBwdXNoKG5ldyBaRXh0SW5zdCh2YWwsIFR5cGU6OmdldEludDY0VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+dW5rbm93bkVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBDT05WX0kgOiB7Ci0gICAgICAgIFZhbHVlKiB2YWwgPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIHJlcyA9IDA7Ci0gICAgICAgIAotICAgICAgICBpZiAodmFsLT5nZXRUeXBlKCktPmlzSW50ZWdlclR5KCkpIHsKLSAgICAgICAgICBpZiAodmFsLT5nZXRUeXBlKCkgIT0gVHlwZTo6Z2V0SW50NjRUeShnZXRHbG9iYWxDb250ZXh0KCkpKSB7Ci0gICAgICAgICAgICB2YWwgPSBuZXcgWkV4dEluc3QodmFsLCBUeXBlOjpnZXRJbnQ2NFR5KGdldEdsb2JhbENvbnRleHQoKSksICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXMgPSBuZXcgSW50VG9QdHJJbnN0KHZhbCwgUG9pbnRlclR5cGU6OmdldFVucXVhbChUeXBlOjpnZXRJbnQ4VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSksICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICB9IGVsc2UgaWYgKCF2YWwtPmdldFR5cGUoKS0+aXNGbG9hdFR5KCkpIHsKLSAgICAgICAgICByZXMgPSBuZXcgQml0Q2FzdEluc3QodmFsLCBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFR5cGU6OmdldEludDhUeShnZXRHbG9iYWxDb250ZXh0KCkpKSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT51bmtub3duRXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdXNoKHJlcyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIENPTlZfVSA6IHsKLSAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIENPTlZfUl9VTiA6IHsKLSAgICAgICAgVmFsdWUqIHZhbCA9IHBvcCgpOwotICAgICAgICBjb25zdCBUeXBlKiB0eXBlID0gdmFsLT5nZXRUeXBlKCk7Ci0gICAgICAgIGlmICh0eXBlID09IFR5cGU6OmdldEZsb2F0VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSkgewotICAgICAgICAgIHB1c2gobmV3IEZQRXh0SW5zdCh2YWwsIFR5cGU6OmdldERvdWJsZVR5KGdldEdsb2JhbENvbnRleHQoKSksICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc0ludGVnZXJUeSgpKSB7Ci0gICAgICAgICAgcHVzaChuZXcgVUlUb0ZQSW5zdCh2YWwsIFR5cGU6OmdldERvdWJsZVR5KGdldEdsb2JhbENvbnRleHQoKSksICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFR5cGU6OmdldERvdWJsZVR5KGdldEdsb2JhbENvbnRleHQoKSkpIHsKLSAgICAgICAgICBwdXNoKHZhbCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT51bmtub3duRXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIENPTlZfT1ZGX0kxIDogewotICAgICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgQ09OVl9PVkZfSTIgOiB7Ci0gICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBDT05WX09WRl9JNCA6IHsKLSAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIENPTlZfT1ZGX0k4IDogewotICAgICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgQ09OVl9PVkZfVTEgOiB7Ci0gICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBDT05WX09WRl9VMiA6IHsKLSAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIENPTlZfT1ZGX1U0IDogewotICAgICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgQ09OVl9PVkZfVTggOiB7Ci0gICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBDT05WX09WRl9JIDogewotICAgICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgQ09OVl9PVkZfVSA6IHsKLSAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIENPTlZfT1ZGX0kxX1VOIDogewotICAgICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgQ09OVl9PVkZfSTJfVU4gOiB7Ci0gICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBDT05WX09WRl9JNF9VTiA6IHsKLSAgICAgICAgVmFsdWUqIHZhbCA9IHBvcCgpOwotICAgICAgICBjb25zdCBUeXBlKiB0eXBlID0gdmFsLT5nZXRUeXBlKCk7Ci0gICAgICAgIGlmICh0eXBlLT5pc0Zsb2F0VHkoKSkgewotICAgICAgICAgIHB1c2gobmV3IEZQVG9VSUluc3QodmFsLCBUeXBlOjpnZXRJbnQzMlR5KGdldEdsb2JhbENvbnRleHQoKSksICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFR5cGU6OmdldEludDY0VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSkgewotICAgICAgICAgIHB1c2gobmV3IFRydW5jSW5zdCh2YWwsIFR5cGU6OmdldEludDhUeShnZXRHbG9iYWxDb250ZXh0KCkpLCAiIiwgY3VycmVudEJsb2NrKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBUeXBlOjpnZXRJbnQ4VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSB8fCB0eXBlID09IFR5cGU6OmdldEludDE2VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSkgewotICAgICAgICAgIHB1c2gobmV3IFpFeHRJbnN0KHZhbCwgVHlwZTo6Z2V0SW50MTZUeShnZXRHbG9iYWxDb250ZXh0KCkpLCAiIiwgY3VycmVudEJsb2NrKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBUeXBlOjpnZXRJbnQzMlR5KGdldEdsb2JhbENvbnRleHQoKSkpIHsKLSAgICAgICAgICBwdXNoKHZhbCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT51bmtub3duRXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIENPTlZfT1ZGX0k4X1VOIDogewotICAgICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgQ09OVl9PVkZfVTFfVU4gOiB7Ci0gICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBDT05WX09WRl9VMl9VTiA6IHsKLSAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIENPTlZfT1ZGX1U0X1VOIDogewotICAgICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgQ09OVl9PVkZfVThfVU4gOiB7Ci0gICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotCi0gICAgICBjYXNlIERJVjogewotICAgICAgICBWYWx1ZSogdHdvID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBvbmUgPSBwb3AoKTsKLSAgICAgICAgaWYgKG9uZS0+Z2V0VHlwZSgpLT5pc0Zsb2F0VHkoKSkgewotICAgICAgICAgIGNvbnZlcnRWYWx1ZShvbmUsIHR3by0+Z2V0VHlwZSgpLCBjdXJyZW50QmxvY2spOyAKLSAgICAgICAgICBwdXNoKEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVGRGl2KG9uZSwgdHdvLCAiIiwgY3VycmVudEJsb2NrKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcHVzaChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU0RpdihvbmUsIHR3bywgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIERJVl9VTjogewotICAgICAgICBWYWx1ZSogdHdvID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBvbmUgPSBwb3AoKTsKLSAgICAgICAgaWYgKG9uZS0+Z2V0VHlwZSgpLT5pc0Zsb2F0VHkoKSkgewotICAgICAgICAgIHB1c2goQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUZEaXYob25lLCB0d28sICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBwdXNoKEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVVRGl2KG9uZSwgdHdvLCAiIiwgY3VycmVudEJsb2NrKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgRFVQOiB7Ci0gICAgICAgIHB1c2godG9wKCkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBFTkRGSU5BTExZIDogewotICAgICAgICBWYWx1ZSogdmFsID0gbmV3IExvYWRJbnN0KHN1cHBsTG9jYWwsICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICB2YWwgPSBuZXcgUHRyVG9JbnRJbnN0KHZhbCwgVHlwZTo6Z2V0SW50MzJUeShnZXRHbG9iYWxDb250ZXh0KCkpLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgU3dpdGNoSW5zdCogaW5zdCA9IFN3aXRjaEluc3Q6OkNyZWF0ZSh2YWwsIGxlYXZlc1swXSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWF2ZXMuc2l6ZSgpLCBjdXJyZW50QmxvY2spOwotICAgICAKLSAgICAgICAgdWludDMyIGluZGV4ID0gMDsgCi0gICAgICAgIGZvciAoc3RkOjp2ZWN0b3I8QmFzaWNCbG9jayo+OjppdGVyYXRvciBpID0gbGVhdmVzLmJlZ2luKCksIAotICAgICAgICAgICAgIGUgPSBsZWF2ZXMuZW5kKCk7IGkhPSBlOyArK2ksICsraW5kZXgpIHsKLSAgICAgICAgICBpbnN0LT5hZGRDYXNlKENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShnZXRHbG9iYWxDb250ZXh0KCkpLCBpbmRleCksICppKTsgCi0gICAgICAgIH0KLQotICAgICAgICAvL2N1cnJlbnRCbG9jayA9IGJiMjsKLQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBKTVAgOiB7Ci0gICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOyAKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gCi0gICAgICBjYXNlIExEQVJHX1MgOiB7Ci0gICAgICAgIHB1c2gobmV3IExvYWRJbnN0KGFyZ3VtZW50c1tyZWFkVTEoYnl0ZWNvZGVzLCBpKV0sICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgTERBUkdfMCA6IHsKLSAgICAgICAgcHVzaChuZXcgTG9hZEluc3QoYXJndW1lbnRzWzBdLCAiIiwgY3VycmVudEJsb2NrKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIExEQVJHXzEgOiB7Ci0gICAgICAgIHB1c2gobmV3IExvYWRJbnN0KGFyZ3VtZW50c1sxXSwgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBMREFSR18yIDogewotICAgICAgICBwdXNoKG5ldyBMb2FkSW5zdChhcmd1bWVudHNbMl0sICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgTERBUkdfMyA6IHsKLSAgICAgICAgcHVzaChuZXcgTG9hZEluc3QoYXJndW1lbnRzWzNdLCAiIiwgY3VycmVudEJsb2NrKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIExEQVJHQV9TIDogewotICAgICAgICBwdXNoKGFyZ3VtZW50c1tyZWFkVTEoYnl0ZWNvZGVzLCBpKV0pOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBMRENfSTQgOiB7Ci0gICAgICAgIHB1c2goQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KGdldEdsb2JhbENvbnRleHQoKSksIHJlYWRTNChieXRlY29kZXMsIGkpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIExEQ19JOCA6IHsKLSAgICAgICAgcHVzaChDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDY0VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgcmVhZFM4KGJ5dGVjb2RlcywgaSkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgTERDX1I0IDogewotICAgICAgICBwdXNoKENvbnN0YW50RlA6OmdldChUeXBlOjpnZXRGbG9hdFR5KGdldEdsb2JhbENvbnRleHQoKSksIHJlYWRGbG9hdChieXRlY29kZXMsIGkpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIExEQ19SOCA6IHsKLSAgICAgICAgcHVzaChDb25zdGFudEZQOjpnZXQoVHlwZTo6Z2V0RG91YmxlVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgcmVhZERvdWJsZShieXRlY29kZXMsIGkpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIExEQ19JNF8wIDogewotICAgICAgICBwdXNoKG1vZHVsZS0+Y29uc3RhbnRaZXJvKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgTERDX0k0XzEgOiB7Ci0gICAgICAgIHB1c2gobW9kdWxlLT5jb25zdGFudE9uZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIExEQ19JNF8yIDogewotICAgICAgICBwdXNoKG1vZHVsZS0+Y29uc3RhbnRUd28pOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBMRENfSTRfMyA6IHsKLSAgICAgICAgcHVzaChtb2R1bGUtPmNvbnN0YW50VGhyZWUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBMRENfSTRfNCA6IHsKLSAgICAgICAgcHVzaChtb2R1bGUtPmNvbnN0YW50Rm91cik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIExEQ19JNF81IDogewotICAgICAgICBwdXNoKG1vZHVsZS0+Y29uc3RhbnRGaXZlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgTERDX0k0XzYgOiB7Ci0gICAgICAgIHB1c2gobW9kdWxlLT5jb25zdGFudFNpeCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIExEQ19JNF83IDogewotICAgICAgICBwdXNoKG1vZHVsZS0+Y29uc3RhbnRTZXZlbik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIExEQ19JNF84IDogewotICAgICAgICBwdXNoKG1vZHVsZS0+Y29uc3RhbnRFaWdodCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIExEQ19JNF9NMSA6IHsKLSAgICAgICAgcHVzaChtb2R1bGUtPmNvbnN0YW50TWludXNPbmUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBMRENfSTRfUyA6IHsKLSAgICAgICAgcHVzaChDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgcmVhZFMxKGJ5dGVjb2RlcywgaSkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gCi0gICAgICBjYXNlIExESU5EX1UxIDoKLSAgICAgIGNhc2UgTERJTkRfSTEgOiB7Ci0gICAgICAgIFZhbHVlKiBfdmFsID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiB2YWwgPSBuZXcgQml0Q2FzdEluc3QoX3ZhbCwgUG9pbnRlclR5cGU6OmdldFVucXVhbChUeXBlOjpnZXRJbnQ4VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSksICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICBwdXNoKG5ldyBMb2FkSW5zdCh2YWwsICIiLCBpc1ZvbGF0aWxlLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgaXNWb2xhdGlsZSA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBMRElORF9VMiA6Ci0gICAgICBjYXNlIExESU5EX0kyIDogewotICAgICAgICBWYWx1ZSogX3ZhbCA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogdmFsID0gbmV3IEJpdENhc3RJbnN0KF92YWwsIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVHlwZTo6Z2V0SW50MTZUeShnZXRHbG9iYWxDb250ZXh0KCkpKSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIHB1c2gobmV3IExvYWRJbnN0KHZhbCwgIiIsIGlzVm9sYXRpbGUsIGN1cnJlbnRCbG9jaykpOwotICAgICAgICBpc1ZvbGF0aWxlID0gZmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIExESU5EX1U0IDoKLSAgICAgIGNhc2UgTERJTkRfSTQgOiB7Ci0gICAgICAgIFZhbHVlKiB2YWwgPSBwb3AoKTsKLSAgICAgICAgaWYgKHZhbC0+Z2V0VHlwZSgpLT5pc0ludGVnZXJUeSgpKSB7Ci0gICAgICAgICAgdmFsID0gbmV3IEludFRvUHRySW5zdCh2YWwsIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVHlwZTo6Z2V0SW50MzJUeShnZXRHbG9iYWxDb250ZXh0KCkpKSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdmFsID0gbmV3IEJpdENhc3RJbnN0KHZhbCwgUG9pbnRlclR5cGU6OmdldFVucXVhbChUeXBlOjpnZXRJbnQzMlR5KGdldEdsb2JhbENvbnRleHQoKSkpLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgfQotICAgICAgICBwdXNoKG5ldyBMb2FkSW5zdCh2YWwsICIiLCBpc1ZvbGF0aWxlLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgaXNWb2xhdGlsZSA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBMRElORF9JOCA6IHsKLSAgICAgICAgVmFsdWUqIF92YWwgPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIHZhbCA9IG5ldyBCaXRDYXN0SW5zdChfdmFsLCBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFR5cGU6OmdldEludDY0VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSksICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICBwdXNoKG5ldyBMb2FkSW5zdCh2YWwsICIiLCBpc1ZvbGF0aWxlLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgaXNWb2xhdGlsZSA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBMRElORF9SNCA6IHsKLSAgICAgICAgVmFsdWUqIF92YWwgPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIHZhbCA9IG5ldyBCaXRDYXN0SW5zdChfdmFsLCBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFR5cGU6OmdldEZsb2F0VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSksICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICBwdXNoKG5ldyBMb2FkSW5zdCh2YWwsICIiLCBpc1ZvbGF0aWxlLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgaXNWb2xhdGlsZSA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBMRElORF9SOCA6IHsKLSAgICAgICAgVmFsdWUqIF92YWwgPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIHZhbCA9IG5ldyBCaXRDYXN0SW5zdChfdmFsLCBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFR5cGU6OmdldERvdWJsZVR5KGdldEdsb2JhbENvbnRleHQoKSkpLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgcHVzaChuZXcgTG9hZEluc3QodmFsLCAiIiwgaXNWb2xhdGlsZSwgY3VycmVudEJsb2NrKSk7Ci0gICAgICAgIGlzVm9sYXRpbGUgPSBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgTERJTkRfSSA6IHsKLSAgICAgICAgVmFsdWUqIF92YWwgPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIHZhbCA9IG5ldyBCaXRDYXN0SW5zdChfdmFsLCBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVHlwZTo6Z2V0SW50OFR5KGdldEdsb2JhbENvbnRleHQoKSkpKSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIHB1c2gobmV3IExvYWRJbnN0KHZhbCwgIiIsIGlzVm9sYXRpbGUsIGN1cnJlbnRCbG9jaykpOwotICAgICAgICBpc1ZvbGF0aWxlID0gZmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIExESU5EX1JFRiA6IHsKLSAgICAgICAgVmFsdWUqIF92YWwgPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIHZhbCA9IG5ldyBCaXRDYXN0SW5zdChfdmFsLCBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVk1PYmplY3Q6Omxsdm1UeXBlKSksICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICBwdXNoKG5ldyBMb2FkSW5zdCh2YWwsICIiLCBpc1ZvbGF0aWxlLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgaXNWb2xhdGlsZSA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAKLSAgICAgIGNhc2UgTERMT0NfUyA6IHsKLSAgICAgICAgVmFsdWUqIHZhbCA9IGxvYWQobG9jYWxzW3JlYWRVMShieXRlY29kZXMsIGkpXSwgIiIsIGN1cnJlbnRCbG9jaywgbW9kdWxlKTsKLSAgICAgICAgcHVzaCh2YWwpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBMRExPQ18wIDogewotICAgICAgICBWYWx1ZSogdmFsID0gbG9hZChsb2NhbHNbMF0sICIiLCBjdXJyZW50QmxvY2ssIG1vZHVsZSk7Ci0gICAgICAgIHB1c2godmFsKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgTERMT0NfMSA6IHsKLSAgICAgICAgVmFsdWUqIHZhbCA9IGxvYWQobG9jYWxzWzFdLCAiIiwgY3VycmVudEJsb2NrLCBtb2R1bGUpOwotICAgICAgICBwdXNoKHZhbCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIExETE9DXzIgOiB7Ci0gICAgICAgIFZhbHVlKiB2YWwgPSBsb2FkKGxvY2Fsc1syXSwgIiIsIGN1cnJlbnRCbG9jaywgbW9kdWxlKTsKLSAgICAgICAgcHVzaCh2YWwpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBMRExPQ18zIDogewotICAgICAgICBWYWx1ZSogdmFsID0gbG9hZChsb2NhbHNbM10sICIiLCBjdXJyZW50QmxvY2ssIG1vZHVsZSk7Ci0gICAgICAgIHB1c2godmFsKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgTERMT0NBX1MgOiB7Ci0gICAgICAgIHB1c2gobG9jYWxzW3JlYWRVMShieXRlY29kZXMsIGkpXSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIExETlVMTCA6IHsKLSAgICAgICAgcHVzaChDTElKaXQ6OmNvbnN0YW50Vk1PYmplY3ROdWxsKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgTEVBVkUgOiB7Ci0gICAgICAgIHVpbnQzMiB0bXAgPSBpOwotICAgICAgICB1aW50MzIgaW5kZXggPSB0bXAgKyA1ICsgcmVhZFM0KGJ5dGVjb2RlcywgaSk7Ci0gICAgICAgIEJhc2ljQmxvY2sqIGJiID0gb3Bjb2RlSW5mb3NbaW5kZXhdLm5ld0Jsb2NrOwotICAgICAgICBhc3NlcnQoYmIpOwotICAgICAgICBzdGFjay5jbGVhcigpOwotICAgICAgICBpZiAoZmluYWxseUhhbmRsZXJzLnNpemUoKSkgewotICAgICAgICAgIEV4Y2VwdGlvbkJsb2NrRGVzYyogcmVzID0gMDsKLSAgICAgICAgICBmb3IgKHN0ZDo6dmVjdG9yPEV4Y2VwdGlvbkJsb2NrRGVzYyo+OjppdGVyYXRvciBpID0gZmluYWxseUhhbmRsZXJzLmJlZ2luKCksIAotICAgICAgICAgICAgICAgZSA9IGZpbmFsbHlIYW5kbGVycy5lbmQoKTsgaSE9IGU7ICsraSkgewotICAgICAgICAgICAgRXhjZXB0aW9uQmxvY2tEZXNjKiBleCA9ICgqaSk7Ci0gICAgICAgICAgICBpZiAodG1wID49IGV4LT50cnlPZmZzZXQgJiYgdG1wIDwgZXgtPnRyeU9mZnNldCArIGV4LT50cnlMZW5ndGgpIHsKLSAgICAgICAgICAgICAgcmVzID0gZXg7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAocmVzKSB7Ci0gICAgICAgICAgICBWYWx1ZSogZXhwciA9IENvbnN0YW50RXhwcjo6Z2V0SW50VG9QdHIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDY0VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgKGxlYXZlSW5kZXgrKykpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk1PYmplY3Q6Omxsdm1UeXBlKTsKLQotICAgICAgICAgICAgbmV3IFN0b3JlSW5zdChleHByLCBzdXBwbExvY2FsLCBmYWxzZSwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgICAgIGJyYW5jaChyZXMtPmhhbmRsZXIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJyYW5jaChiYiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgYnJhbmNoKGJiLCBjdXJyZW50QmxvY2spOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIExFQVZFX1MgOiB7Ci0gICAgICAgIHVpbnQzMiB0bXAgPSBpOwotICAgICAgICBCYXNpY0Jsb2NrKiBiYiA9IG9wY29kZUluZm9zW3RtcCArIDIgKyByZWFkUzEoYnl0ZWNvZGVzLCBpKV0ubmV3QmxvY2s7Ci0gICAgICAgIGFzc2VydChiYik7Ci0gICAgICAgIHN0YWNrLmNsZWFyKCk7Ci0gICAgICAgIGlmIChmaW5hbGx5SGFuZGxlcnMuc2l6ZSgpKSB7Ci0gICAgICAgICAgRXhjZXB0aW9uQmxvY2tEZXNjKiByZXMgPSAwOwotICAgICAgICAgIGZvciAoc3RkOjp2ZWN0b3I8RXhjZXB0aW9uQmxvY2tEZXNjKj46Oml0ZXJhdG9yIGkgPSBmaW5hbGx5SGFuZGxlcnMuYmVnaW4oKSwgCi0gICAgICAgICAgICAgICBlID0gZmluYWxseUhhbmRsZXJzLmVuZCgpOyBpIT0gZTsgKytpKSB7Ci0gICAgICAgICAgICBFeGNlcHRpb25CbG9ja0Rlc2MqIGV4ID0gKCppKTsKLSAgICAgICAgICAgIGlmICh0bXAgPj0gZXgtPnRyeU9mZnNldCAmJiB0bXAgPCBleC0+dHJ5T2Zmc2V0ICsgZXgtPnRyeUxlbmd0aCkgewotICAgICAgICAgICAgICByZXMgPSBleDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChyZXMpIHsKLSAgICAgICAgICAgIFZhbHVlKiBleHByID0gQ29uc3RhbnRFeHByOjpnZXRJbnRUb1B0cigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50NjRUeShnZXRHbG9iYWxDb250ZXh0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCAobGVhdmVJbmRleCsrKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWTU9iamVjdDo6bGx2bVR5cGUpOwotCi0gICAgICAgICAgICBuZXcgU3RvcmVJbnN0KGV4cHIsIHN1cHBsTG9jYWwsIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgICAgICAgICAgYnJhbmNoKHJlcy0+aGFuZGxlciwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnJhbmNoKGJiLCBjdXJyZW50QmxvY2spOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBicmFuY2goYmIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgTVVMIDogewotICAgICAgICBWYWx1ZSogdmFsMiA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogdmFsMSA9IHBvcCgpOwotICAgICAgICBjb252ZXJ0VmFsdWUodmFsMSwgdmFsMi0+Z2V0VHlwZSgpLCBjdXJyZW50QmxvY2spOyAKLSAgICAgICAgcHVzaChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTXVsKHZhbDEsIHZhbDIsICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgTVVMX09WRiA6IHsKLSAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIE1VTF9PVkZfVU4gOiB7Ci0gICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBORUcgOiB7Ci0gICAgICAgIFZhbHVlKiB2YWwgPSBwb3AoKTsKLSAgICAgICAgcHVzaChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU3ViKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQ6OmdldE51bGxWYWx1ZSh2YWwtPmdldFR5cGUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwsICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgTk9QIDogYnJlYWs7Ci0KLSAgICAgIGNhc2UgTk9UIDogewotICAgICAgICBwdXNoKEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOb3QocG9wKCksICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgT1IgOiB7Ci0gICAgICAgIFZhbHVlKiB0d28gPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIG9uZSA9IHBvcCgpOwotICAgICAgICBwdXNoKEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVPcihvbmUsIHR3bywgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBQT1AgOiB7Ci0gICAgICAgIHBvcCgpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBSRU0gOiB7Ci0gICAgICAgIFZhbHVlKiB0d28gPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIG9uZSA9IHBvcCgpOwotICAgICAgICBpZiAob25lLT5nZXRUeXBlKCktPmlzRmxvYXRUeSgpKSB7Ci0gICAgICAgICAgcHVzaChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRlJlbShvbmUsIHR3bywgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHB1c2goQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVNSZW0ob25lLCB0d28sICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBSRU1fVU4gOiB7Ci0gICAgICAgIFZhbHVlKiB0d28gPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIG9uZSA9IHBvcCgpOwotICAgICAgICBpZiAob25lLT5nZXRUeXBlKCktPmlzRmxvYXRUeSgpKSB7Ci0gICAgICAgICAgcHVzaChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRlJlbShvbmUsIHR3bywgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHB1c2goQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVVSZW0ob25lLCB0d28sICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBSRVQgOiB7Ci0gICAgICAgIGlmIChjb21waWxpbmdNZXRob2QtPmdldFNpZ25hdHVyZShnZW5NZXRob2QpLT5nZXRSZXR1cm5UeXBlKCkgIT0gVHlwZTo6Z2V0Vm9pZFR5KGdldEdsb2JhbENvbnRleHQoKSkpIHsKLSAgICAgICAgICBWYWx1ZSogdmFsID0gcG9wKCk7Ci0gICAgICAgICAgaWYgKHZhbC0+Z2V0VHlwZSgpID09IFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoZW5kTm9kZS0+Z2V0VHlwZSgpKSkgewotICAgICAgICAgICAgLy8gSW4gY2FzZSBpdCdzIGEgc3RydWN0Ci0gICAgICAgICAgICB2YWwgPSBuZXcgTG9hZEluc3QodmFsLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29udmVydFZhbHVlKHZhbCwgZW5kTm9kZS0+Z2V0VHlwZSgpLCBjdXJyZW50QmxvY2spOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbmROb2RlLT5hZGRJbmNvbWluZyh2YWwsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29tcGlsaW5nTWV0aG9kLT5zdHJ1Y3RSZXR1cm4pIHsKLSAgICAgICAgICBlbmROb2RlLT5hZGRJbmNvbWluZyhwb3AoKSwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgfQotICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoZW5kQmxvY2ssIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIFNITCA6IHsKLSAgICAgICAgVmFsdWUqIHZhbDIgPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIHZhbDEgPSBwb3AoKTsKLSAgICAgICAgdmVyaWZ5VHlwZSh2YWwxLCB2YWwyLCBjdXJyZW50QmxvY2spOwotICAgICAgICBwdXNoKEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVTaGwodmFsMSwgdmFsMiwgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBTSFIgOiB7Ci0gICAgICAgIFZhbHVlKiB2YWwyID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiB2YWwxID0gcG9wKCk7Ci0gICAgICAgIHZlcmlmeVR5cGUodmFsMSwgdmFsMiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgcHVzaChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQVNocih2YWwxLCB2YWwyLCAiIiwgY3VycmVudEJsb2NrKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIFNIUl9VTiA6IHsKLSAgICAgICAgVmFsdWUqIHZhbDIgPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIHZhbDEgPSBwb3AoKTsKLSAgICAgICAgdmVyaWZ5VHlwZSh2YWwxLCB2YWwyLCBjdXJyZW50QmxvY2spOwotICAgICAgICBwdXNoKEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVMU2hyKHZhbDEsIHZhbDIsICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gCi0gICAgICBjYXNlIFNUQVJHX1MgOiB7Ci0gICAgICAgIFZhbHVlKiB2YWwgPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIGFyZyA9IGFyZ3VtZW50c1tyZWFkVTEoYnl0ZWNvZGVzLCBpKV07Ci0gICAgICAgIGNvbnZlcnRWYWx1ZSh2YWwsIGFyZy0+Z2V0VHlwZSgpLT5nZXRDb250YWluZWRUeXBlKDApLCBjdXJyZW50QmxvY2spOwotICAgICAgICBuZXcgU3RvcmVJbnN0KHZhbCwgYXJnLCBmYWxzZSwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgU1RJTkRfSTEgOiB7Ci0gICAgICAgIFZhbHVlKiB2YWwgPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIF9hZGRyID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBhZGRyID0gbmV3IEJpdENhc3RJbnN0KF9hZGRyLCBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFR5cGU6OmdldEludDhUeShnZXRHbG9iYWxDb250ZXh0KCkpKSwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIGNvbnZlcnRWYWx1ZSh2YWwsIFR5cGU6OmdldEludDhUeShnZXRHbG9iYWxDb250ZXh0KCkpLCBjdXJyZW50QmxvY2spOwotICAgICAgICBuZXcgU3RvcmVJbnN0KHZhbCwgYWRkciwgaXNWb2xhdGlsZSwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgaXNWb2xhdGlsZSA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBTVElORF9JMiA6IHsKLSAgICAgICAgVmFsdWUqIHZhbCA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogX2FkZHIgPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIGFkZHIgPSBuZXcgQml0Q2FzdEluc3QoX2FkZHIsIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVHlwZTo6Z2V0SW50MTZUeShnZXRHbG9iYWxDb250ZXh0KCkpKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICBuZXcgU3RvcmVJbnN0KHZhbCwgYWRkciwgaXNWb2xhdGlsZSwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgaXNWb2xhdGlsZSA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBTVElORF9JNCA6IHsKLSAgICAgICAgVmFsdWUqIHZhbCA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogX2FkZHIgPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIGFkZHIgPSBuZXcgQml0Q2FzdEluc3QoX2FkZHIsIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVHlwZTo6Z2V0SW50MzJUeShnZXRHbG9iYWxDb250ZXh0KCkpKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICBuZXcgU3RvcmVJbnN0KHZhbCwgYWRkciwgaXNWb2xhdGlsZSwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgaXNWb2xhdGlsZSA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBTVElORF9JOCA6IHsKLSAgICAgICAgVmFsdWUqIHZhbCA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogX2FkZHIgPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIGFkZHIgPSBuZXcgQml0Q2FzdEluc3QoX2FkZHIsIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVHlwZTo6Z2V0SW50NjRUeShnZXRHbG9iYWxDb250ZXh0KCkpKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICBuZXcgU3RvcmVJbnN0KHZhbCwgYWRkciwgaXNWb2xhdGlsZSwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgaXNWb2xhdGlsZSA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBTVElORF9SNCA6IHsKLSAgICAgICAgVmFsdWUqIHZhbCA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogX2FkZHIgPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIGFkZHIgPSBuZXcgQml0Q2FzdEluc3QoX2FkZHIsIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVHlwZTo6Z2V0RmxvYXRUeShnZXRHbG9iYWxDb250ZXh0KCkpKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICBuZXcgU3RvcmVJbnN0KHZhbCwgYWRkciwgaXNWb2xhdGlsZSwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgaXNWb2xhdGlsZSA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBTVElORF9SOCA6IHsKLSAgICAgICAgVmFsdWUqIHZhbCA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogX2FkZHIgPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIGFkZHIgPSBuZXcgQml0Q2FzdEluc3QoX2FkZHIsIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVHlwZTo6Z2V0RG91YmxlVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgbmV3IFN0b3JlSW5zdCh2YWwsIGFkZHIsIGlzVm9sYXRpbGUsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIGlzVm9sYXRpbGUgPSBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgU1RJTkRfSSA6IHsKLSAgICAgICAgVmFsdWUqIHZhbCA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogX2FkZHIgPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIGFkZHIgPSBuZXcgQml0Q2FzdEluc3QoX2FkZHIsIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVHlwZTo6Z2V0SW50MzJUeShnZXRHbG9iYWxDb250ZXh0KCkpKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICBuZXcgU3RvcmVJbnN0KHZhbCwgYWRkciwgaXNWb2xhdGlsZSwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgaXNWb2xhdGlsZSA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBTVElORF9SRUYgOiB7Ci0gICAgICAgIFZhbHVlKiB2YWwgPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIF9hZGRyID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBhZGRyID0gbmV3IEJpdENhc3RJbnN0KF9hZGRyLCBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKHZhbC0+Z2V0VHlwZSgpKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICBuZXcgU3RvcmVJbnN0KHZhbCwgYWRkciwgaXNWb2xhdGlsZSwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgaXNWb2xhdGlsZSA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBTVExPQ19TIDogewotICAgICAgICBWYWx1ZSogdmFsID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBsb2NhbCA9IGxvY2Fsc1tyZWFkVTEoYnl0ZWNvZGVzLCBpKV07Ci0gICAgICAgIHN0b3JlKHZhbCwgbG9jYWwsIGZhbHNlLCBjdXJyZW50QmxvY2ssIG1vZHVsZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIFNUTE9DXzAgOiB7Ci0gICAgICAgIFZhbHVlKiB2YWwgPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIGxvY2FsID0gbG9jYWxzWzBdOwotICAgICAgICBzdG9yZSh2YWwsIGxvY2FsLCBmYWxzZSwgY3VycmVudEJsb2NrLCBtb2R1bGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBTVExPQ18xIDogewotICAgICAgICBWYWx1ZSogdmFsID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBsb2NhbCA9IGxvY2Fsc1sxXTsKLSAgICAgICAgc3RvcmUodmFsLCBsb2NhbCwgZmFsc2UsIGN1cnJlbnRCbG9jaywgbW9kdWxlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgU1RMT0NfMiA6IHsKLSAgICAgICAgVmFsdWUqIHZhbCA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogbG9jYWwgPSBsb2NhbHNbMl07Ci0gICAgICAgIHN0b3JlKHZhbCwgbG9jYWwsIGZhbHNlLCBjdXJyZW50QmxvY2ssIG1vZHVsZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIFNUTE9DXzMgOiB7Ci0gICAgICAgIFZhbHVlKiB2YWwgPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIGxvY2FsID0gbG9jYWxzWzNdOwotICAgICAgICBzdG9yZSh2YWwsIGxvY2FsLCBmYWxzZSwgY3VycmVudEJsb2NrLCBtb2R1bGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBTVUIgOiB7Ci0gICAgICAgIFZhbHVlKiB2YWwyID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiB2YWwxID0gcG9wKCk7Ci0gICAgICAgIHZlcmlmeVR5cGUodmFsMSwgdmFsMiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgcHVzaChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU3ViKHZhbDEsIHZhbDIsICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgU1VCX09WRiA6IHsKLSAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIFNVQl9PVkZfVU4gOiB7Ci0gICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBTV0lUQ0ggOiB7Ci0gICAgICAgIHVpbnQzMiB2YWx1ZSA9IHJlYWRVNChieXRlY29kZXMsIGkpOwotICAgICAgICBWYWx1ZSogdmFsID0gcG9wKCk7Ci0gICAgICAgIHVpbnQzMiBuZXh0ID0gaSArIHZhbHVlICogc2l6ZW9mKHNpbnQzMikgKyAxOwotICAgICAgICBCYXNpY0Jsb2NrKiBkZWZCQiA9IG9wY29kZUluZm9zW25leHRdLm5ld0Jsb2NrOwotICAgICAgICBTd2l0Y2hJbnN0KiBTSSA9IFN3aXRjaEluc3Q6OkNyZWF0ZSh2YWwsIGRlZkJCLCB2YWx1ZSwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgZm9yICh1aW50MzIgdCA9IDA7IHQgPCB2YWx1ZTsgdCsrKSB7Ci0gICAgICAgICAgc2ludDMyIG9mZnNldCA9IHJlYWRTNChieXRlY29kZXMsIGkpOwotICAgICAgICAgIHNpbnQzMiBpbmRleCA9IG5leHQgKyBvZmZzZXQ7Ci0gICAgICAgICAgYXNzZXJ0KGluZGV4ID4gMCk7Ci0gICAgICAgICAgQmFzaWNCbG9jayogQkIgPSBvcGNvZGVJbmZvc1tpbmRleF0ubmV3QmxvY2s7Ci0gICAgICAgICAgU0ktPmFkZENhc2UoQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KGdldEdsb2JhbENvbnRleHQoKSksIHQpLCBCQik7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgWE9SIDogewotICAgICAgICBWYWx1ZSogdHdvID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBvbmUgPSBwb3AoKTsKLSAgICAgICAgY29udmVydFZhbHVlKHR3bywgb25lLT5nZXRUeXBlKCksIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIHB1c2goQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVhvcihvbmUsIHR3bywgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBCT1ggOiB7Ci0gICAgICAgIHVpbnQzMiB0b2tlbiA9IHJlYWRVNChieXRlY29kZXMsIGkpOwotICAgICAgICBBc3NlbWJseSogYXNzZW1ibHkgPSBjb21waWxpbmdDbGFzcy0+YXNzZW1ibHk7Ci0gICAgICAgIE4zKiB2bSA9IChOMyopKFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKSk7Ci0gICAgICAgIFZNQ29tbW9uQ2xhc3MqIHR5cGUgPSBhc3NlbWJseS0+bG9hZFR5cGUodm0sIHRva2VuLCB0cnVlLCBmYWxzZSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZ2VuQ2xhc3MsIGdlbk1ldGhvZCk7Ci0gICAgICAgIGFzc2VydCh0eXBlKTsKLSAgICAgICAgCi0gICAgICAgIGlmICghdHlwZS0+aXNQcmltaXRpdmUpIHsKLSAgICAgICAgICAvLyB0aGUgYm94IGluc3RydWN0aW9uIGhhcyBubyBlZmZlY3Qgb24gbm9uLXByaW1pdGl2ZSB0eXBlcwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgVmFsdWUqIHZhciA9IG5ldyBMb2FkSW5zdCh0eXBlLT5sbHZtVmFyKCksICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICBWYWx1ZSogb2JqID0gQ2FsbEluc3Q6OkNyZWF0ZShvYmpDb25zTExWTSwgdmFyLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgVmFsdWUqIHZhbCA9IHBvcCgpOwotICAgICAgICBvYmogPSBuZXcgQml0Q2FzdEluc3Qob2JqLCB0eXBlLT52aXJ0dWFsVHlwZSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgCi0KLSAgICAgICAgc3RkOjp2ZWN0b3I8VmFsdWUqPiBwdHJzOwotICAgICAgICBwdHJzLnB1c2hfYmFjayhtb2R1bGUtPmNvbnN0YW50WmVybyk7Ci0gICAgICAgIHB0cnMucHVzaF9iYWNrKG1vZHVsZS0+Y29uc3RhbnRPbmUpOwotICAgICAgICBWYWx1ZSogcHRyID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShvYmosIHB0cnMuYmVnaW4oKSwgcHRycy5lbmQoKSwgIiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0KLSAgICAgICAgaWYgKHZhbC0+Z2V0VHlwZSgpLT5nZXRUeXBlSUQoKSAhPSBUeXBlOjpQb2ludGVyVHlJRCkgewotICAgICAgICAgIGNvbnZlcnRWYWx1ZSh2YWwsIHR5cGUtPm5hdHVyYWxUeXBlLCBjdXJyZW50QmxvY2spOyAKLSAgICAgICAgICBWYWx1ZSogdG1wID0gbmV3IEFsbG9jYUluc3QodHlwZS0+bmF0dXJhbFR5cGUsICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICAgIG5ldyBTdG9yZUluc3QodmFsLCB0bXAsIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgICAgICAgIHZhbCA9IHRtcDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIHVpbnQ2NCBzaXplID0gbXZtOjpNdm1Nb2R1bGU6OmdldFR5cGVTaXplKHR5cGUtPm5hdHVyYWxUeXBlKTsKLSAgICAgICAgCi0gICAgICAgIHN0ZDo6dmVjdG9yPFZhbHVlKj4gcGFyYW1zOwotICAgICAgICBwYXJhbXMucHVzaF9iYWNrKG5ldyBCaXRDYXN0SW5zdChwdHIsIFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVHlwZTo6Z2V0SW50OFR5KGdldEdsb2JhbENvbnRleHQoKSkpLCAiIiwgY3VycmVudEJsb2NrKSk7Ci0gICAgICAgIHBhcmFtcy5wdXNoX2JhY2sobmV3IEJpdENhc3RJbnN0KHZhbCwgUG9pbnRlclR5cGU6OmdldFVucXVhbChUeXBlOjpnZXRJbnQ4VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSksICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgcGFyYW1zLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgc2l6ZSkpOwotICAgICAgICBwYXJhbXMucHVzaF9iYWNrKG1vZHVsZS0+Y29uc3RhbnRaZXJvKTsKLSAgICAgICAgQ2FsbEluc3Q6OkNyZWF0ZShtb2R1bGUtPmxsdm1fbWVtY3B5X2kzMiwgcGFyYW1zLmJlZ2luKCksIHBhcmFtcy5lbmQoKSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIAotCi0gICAgICAgIHB1c2gob2JqKTsKLSAgICAgICAgYnJlYWs7IAotICAgICAgfQotCi0gICAgICBjYXNlIENBTExWSVJUIDogewotICAgICAgICB1aW50MzIgdmFsdWUgPSByZWFkVTQoYnl0ZWNvZGVzLCBpKTsKLSAgICAgICAgaW52b2tlSW50ZXJmYWNlT3JWaXJ0dWFsKHZhbHVlLCBnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLSAgICAgICAgYnJlYWs7IAotICAgICAgfQotCi0gICAgICBjYXNlIENBU1RDTEFTUyA6IHsKLSAgICAgICAgQXNzZW1ibHkqIGFzc2VtYmx5ID0gY29tcGlsaW5nQ2xhc3MtPmFzc2VtYmx5OwotICAgICAgICBOMyogdm0gPSAoTjMqKShWTVRocmVhZDo6Z2V0KCktPmdldFZNKCkpOwotICAgICAgICB1aW50MzIgdG9rZW4gPSByZWFkVTQoYnl0ZWNvZGVzLCBpKTsKLSAgICAgICAgVk1Db21tb25DbGFzcyogZGNsID0gYXNzZW1ibHktPmxvYWRUeXBlKHZtLCB0b2tlbiwgdHJ1ZSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCB0cnVlLCBnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLSAgICAgICAgVmFsdWUqIG9iaiA9IG5ldyBCaXRDYXN0SW5zdChwb3AoKSwgVk1PYmplY3Q6Omxsdm1UeXBlLCAiIiwgY3VycmVudEJsb2NrKTsKLQotICAgICAgICBWYWx1ZSogY21wID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX0VRLCBvYmosIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMSUppdDo6Y29uc3RhbnRWTU9iamVjdE51bGwsICIiKTsKLSAgICAgCi0gICAgICAgIEJhc2ljQmxvY2sqIGlmVHJ1ZSA9IGNyZWF0ZUJhc2ljQmxvY2soIm51bGwgY2hlY2tjYXN0Iik7Ci0gICAgICAgIEJhc2ljQmxvY2sqIGlmRmFsc2UgPSBjcmVhdGVCYXNpY0Jsb2NrKCJub24gbnVsbCBjaGVja2Nhc3QiKTsKLQotICAgICAgICBicmFuY2goY21wLCBpZlRydWUsIGlmRmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0KLSAgICAgICAgVmFsdWUqIGNsVmFyID0gbmV3IExvYWRJbnN0KGRjbC0+bGx2bVZhcigpLCAiIiwgaWZGYWxzZSk7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPFZhbHVlKj4gYXJnczsKLSAgICAgICAgYXJncy5wdXNoX2JhY2sob2JqKTsKLSAgICAgICAgYXJncy5wdXNoX2JhY2soY2xWYXIpOwotICAgICAgICBWYWx1ZSogY2FsbCA9IENhbGxJbnN0OjpDcmVhdGUoaW5zdGFuY2VPZkxMVk0sIGFyZ3MuYmVnaW4oKSwgYXJncy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIGlmRmFsc2UpOwotICAgICAKLSAgICAgICAgY21wID0gbmV3IElDbXBJbnN0KCppZkZhbHNlLCBJQ21wSW5zdDo6SUNNUF9FUSwgY2FsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS0+Y29uc3RhbnRaZXJvLCAiIik7Ci0KLSAgICAgICAgQmFzaWNCbG9jayogZXggPSBjcmVhdGVCYXNpY0Jsb2NrKCJmYWxzZSBjaGVja2Nhc3QiKTsKLSAgICAgICAgYnJhbmNoKGNtcCwgZXgsIGlmVHJ1ZSwgaWZGYWxzZSk7Ci0gICAgICAgIAotICAgICAgICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IGV4QXJnczsKLSAgICAgICAgaWYgKGN1cnJlbnRFeGNlcHRpb25CbG9jayAhPSBlbmRFeGNlcHRpb25CbG9jaykgewotICAgICAgICAgIEludm9rZUluc3Q6OkNyZWF0ZShjbGFzc0Nhc3RFeGNlcHRpb25MTFZNLCB1bmlmaWVkVW5yZWFjaGFibGUsIGN1cnJlbnRFeGNlcHRpb25CbG9jaywgZXhBcmdzLmJlZ2luKCksIGV4QXJncy5lbmQoKSwgIiIsIGV4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBDYWxsSW5zdDo6Q3JlYXRlKGNsYXNzQ2FzdEV4Y2VwdGlvbkxMVk0sIGV4QXJncy5iZWdpbigpLCBleEFyZ3MuZW5kKCksICIiLCBleCk7Ci0gICAgICAgICAgbmV3IFVucmVhY2hhYmxlSW5zdChnZXRHbG9iYWxDb250ZXh0KCksIGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIGN1cnJlbnRCbG9jayA9IGlmVHJ1ZTsKLSAgICAgICAgcHVzaChuZXcgQml0Q2FzdEluc3Qob2JqLCBkY2wtPnZpcnR1YWxUeXBlLCAiIiwgY3VycmVudEJsb2NrKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSAKLSAgICAgICAgCi0KLSAgICAgIGNhc2UgQ1BPQkogOiB7Ci0gICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICBicmVhazsgIAotICAgICAgfQotICAgICAgIAotICAgICAgY2FzZSBJU0lOU1QgOiB7Ci0gICAgICAgIEFzc2VtYmx5KiBhc3NlbWJseSA9IGNvbXBpbGluZ0NsYXNzLT5hc3NlbWJseTsKLSAgICAgICAgTjMqIHZtID0gKE4zKikoVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpKTsKLSAgICAgICAgdWludDMyIHRva2VuID0gcmVhZFU0KGJ5dGVjb2RlcywgaSk7Ci0gICAgICAgIFZNQ29tbW9uQ2xhc3MqIGRjbCA9IGFzc2VtYmx5LT5sb2FkVHlwZSh2bSwgdG9rZW4sIHRydWUsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSwgZ2VuQ2xhc3MsIGdlbk1ldGhvZCk7Ci0gICAgICAgIFZhbHVlKiBvYmogPSBwb3AoKTsKLQotICAgICAgICBWYWx1ZSogY21wID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX0VRLCBvYmosIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50OjpnZXROdWxsVmFsdWUob2JqLT5nZXRUeXBlKCkpLCAiIik7Ci0gICAgICAgIENvbnN0YW50KiBudWxsVmlydHVhbCA9IENvbnN0YW50OjpnZXROdWxsVmFsdWUoZGNsLT52aXJ0dWFsVHlwZSk7Ci0KLSAgICAgCi0gICAgICAgIEJhc2ljQmxvY2sqIGlzSW5zdEVuZEJsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygiZW5kIGlzaW5zdCIpOwotICAgICAgICBQSElOb2RlKiBub2RlID0gUEhJTm9kZTo6Q3JlYXRlKGRjbC0+dmlydHVhbFR5cGUsICIiLCBpc0luc3RFbmRCbG9jayk7Ci0KLSAgICAgICAgQmFzaWNCbG9jayogaWZGYWxzZSA9IGNyZWF0ZUJhc2ljQmxvY2soIm5vbiBudWxsIGlzaW5zdCIpOwotICAgICAgICBCYXNpY0Jsb2NrKiBpZlRydWUgPSBjcmVhdGVCYXNpY0Jsb2NrKCJudWxsIGlzaW5zdCIpOwotICAgICAgICAKLSAgICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKGlmVHJ1ZSwgaWZGYWxzZSwgY21wLCBjdXJyZW50QmxvY2spOwotICAgICAgICBub2RlLT5hZGRJbmNvbWluZyhudWxsVmlydHVhbCwgaWZUcnVlKTsKLSAgICAgICAgQnJhbmNoSW5zdDo6Q3JlYXRlKGlzSW5zdEVuZEJsb2NrLCBpZlRydWUpOwotCi0KLSAgICAgICAgVmFsdWUqIGNsVmFyID0gbmV3IExvYWRJbnN0KGRjbC0+bGx2bVZhcigpLCAiIiwgaWZGYWxzZSk7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPFZhbHVlKj4gYXJnczsKLSAgICAgICAgYXJncy5wdXNoX2JhY2sobmV3IEJpdENhc3RJbnN0KG9iaiwgVk1PYmplY3Q6Omxsdm1UeXBlLCAiIiwgaWZGYWxzZSkpOwotICAgICAgICBhcmdzLnB1c2hfYmFjayhjbFZhcik7Ci0gICAgICAgIFZhbHVlKiBjYWxsID0gQ2FsbEluc3Q6OkNyZWF0ZShpbnN0YW5jZU9mTExWTSwgYXJncy5iZWdpbigpLCBhcmdzLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgaWZGYWxzZSk7Ci0gICAgIAotICAgICAgICBjbXAgPSBuZXcgSUNtcEluc3QoKmlmRmFsc2UsIElDbXBJbnN0OjpJQ01QX0VRLCBjYWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLT5jb25zdGFudFplcm8sICIiKTsKLQotICAgICAgICBCYXNpY0Jsb2NrKiBmYWxzZUluc3QgPSBjcmVhdGVCYXNpY0Jsb2NrKCJmYWxzZSBpc2luc3QiKTsKLSAgICAgICAgQmFzaWNCbG9jayogdHJ1ZUluc3QgPSBjcmVhdGVCYXNpY0Jsb2NrKCJ0cnVlIGlzaW5zdCIpOwotICAgICAgICBCcmFuY2hJbnN0OjpDcmVhdGUoZmFsc2VJbnN0LCB0cnVlSW5zdCwgY21wLCBpZkZhbHNlKTsKLQotICAgICAgICBub2RlLT5hZGRJbmNvbWluZyhuZXcgQml0Q2FzdEluc3Qob2JqLCBkY2wtPnZpcnR1YWxUeXBlLCAiIiwgdHJ1ZUluc3QpLCB0cnVlSW5zdCk7Ci0gICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShpc0luc3RFbmRCbG9jaywgdHJ1ZUluc3QpOwotICAgICAgICAKLSAgICAgICAgbm9kZS0+YWRkSW5jb21pbmcobnVsbFZpcnR1YWwsIGZhbHNlSW5zdCk7Ci0gICAgICAgIEJyYW5jaEluc3Q6OkNyZWF0ZShpc0luc3RFbmRCbG9jaywgZmFsc2VJbnN0KTsKLSAgICAgICAKLSAgICAgICAgY3VycmVudEJsb2NrID0gaXNJbnN0RW5kQmxvY2s7Ci0gICAgICAgIHB1c2gobm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIExERUxFTSA6IHsKLSAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgICAgIGJyZWFrOyAgCi0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgTERFTEVNX0kxIDogewotICAgICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgICAgICAgYnJlYWs7ICAKLSAgICAgIH0KLQotICAgICAgY2FzZSBMREVMRU1fSTIgOiB7Ci0gICAgICAgIFZhbHVlKiBpbmRleCA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogb2JqID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBwdHIgPSB2ZXJpZnlBbmRDb21wdXRlUHRyKG9iaiwgaW5kZXgsIEFycmF5U0ludDE2OjpsbHZtVHlwZSk7Ci0gICAgICAgIHB1c2gobmV3IExvYWRJbnN0KHB0ciwgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBMREVMRU1fSTQgOiB7Ci0gICAgICAgIFZhbHVlKiBpbmRleCA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogb2JqID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBwdHIgPSB2ZXJpZnlBbmRDb21wdXRlUHRyKG9iaiwgaW5kZXgsIEFycmF5U0ludDMyOjpsbHZtVHlwZSk7Ci0gICAgICAgIHB1c2gobmV3IExvYWRJbnN0KHB0ciwgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBMREVMRU1fSTggOiB7Ci0gICAgICAgIFZhbHVlKiBpbmRleCA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogb2JqID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBwdHIgPSB2ZXJpZnlBbmRDb21wdXRlUHRyKG9iaiwgaW5kZXgsIEFycmF5VUludDY0OjpsbHZtVHlwZSk7Ci0gICAgICAgIHB1c2gobmV3IExvYWRJbnN0KHB0ciwgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBMREVMRU1fVTEgOiB7Ci0gICAgICAgIFZhbHVlKiBpbmRleCA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogb2JqID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBwdHIgPSB2ZXJpZnlBbmRDb21wdXRlUHRyKG9iaiwgaW5kZXgsIEFycmF5VUludDg6Omxsdm1UeXBlKTsKLSAgICAgICAgcHVzaChuZXcgTG9hZEluc3QocHRyLCAiIiwgY3VycmVudEJsb2NrKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIExERUxFTV9VMiA6IHsKLSAgICAgICAgVmFsdWUqIGluZGV4ID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBvYmogPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIHB0ciA9IHZlcmlmeUFuZENvbXB1dGVQdHIob2JqLCBpbmRleCwgQXJyYXlVSW50MTY6Omxsdm1UeXBlKTsKLSAgICAgICAgcHVzaChuZXcgTG9hZEluc3QocHRyLCAiIiwgY3VycmVudEJsb2NrKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIExERUxFTV9VNCA6IHsKLSAgICAgICAgVmFsdWUqIGluZGV4ID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBvYmogPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIHB0ciA9IHZlcmlmeUFuZENvbXB1dGVQdHIob2JqLCBpbmRleCwgQXJyYXlVSW50MzI6Omxsdm1UeXBlKTsKLSAgICAgICAgcHVzaChuZXcgTG9hZEluc3QocHRyLCAiIiwgY3VycmVudEJsb2NrKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIExERUxFTV9SNCA6IHsKLSAgICAgICAgVmFsdWUqIGluZGV4ID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBvYmogPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIHB0ciA9IHZlcmlmeUFuZENvbXB1dGVQdHIob2JqLCBpbmRleCwgQXJyYXlGbG9hdDo6bGx2bVR5cGUpOwotICAgICAgICBwdXNoKG5ldyBMb2FkSW5zdChwdHIsICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgTERFTEVNX1I4IDogewotICAgICAgICBWYWx1ZSogaW5kZXggPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIG9iaiA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogcHRyID0gdmVyaWZ5QW5kQ29tcHV0ZVB0cihvYmosIGluZGV4LCBBcnJheURvdWJsZTo6bGx2bVR5cGUpOwotICAgICAgICBwdXNoKG5ldyBMb2FkSW5zdChwdHIsICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgTERFTEVNX0kgOiB7Ci0gICAgICAgIFZhbHVlKiBpbmRleCA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogb2JqID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBwdHIgPSB2ZXJpZnlBbmRDb21wdXRlUHRyKG9iaiwgaW5kZXgsIEFycmF5U0ludDMyOjpsbHZtVHlwZSk7Ci0gICAgICAgIHB1c2gobmV3IExvYWRJbnN0KHB0ciwgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBMREVMRU1fUkVGIDogewotICAgICAgICBWYWx1ZSogaW5kZXggPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIG9iaiA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogcHRyID0gdmVyaWZ5QW5kQ29tcHV0ZVB0cihvYmosIGluZGV4LCBBcnJheU9iamVjdDo6bGx2bVR5cGUpOwotICAgICAgICBwdXNoKG5ldyBMb2FkSW5zdChwdHIsICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgTERFTEVNQSA6IHsKLSAgICAgICAgQXNzZW1ibHkqIGFzc2VtYmx5ID0gY29tcGlsaW5nQ2xhc3MtPmFzc2VtYmx5OwotICAgICAgICBOMyogdm0gPSAoTjMqKShWTVRocmVhZDo6Z2V0KCktPmdldFZNKCkpOwotICAgICAgICB1aW50MzIgdG9rZW4gPSByZWFkVTQoYnl0ZWNvZGVzLCBpKTsKLSAgICAgICAgVk1Db21tb25DbGFzcyogY2wgPSBhc3NlbWJseS0+bG9hZFR5cGUodm0sIHRva2VuLCB0cnVlLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHRydWUsIGdlbkNsYXNzLCBnZW5NZXRob2QpOwotICAgICAgICBWTUNsYXNzQXJyYXkqIGFycmF5ID0gYXNzZW1ibHktPmNvbnN0cnVjdEFycmF5KGNsLCAxKTsKLSAgICAgICAgYXJyYXktPnJlc29sdmVUeXBlKGZhbHNlLCBmYWxzZSwgZ2VuTWV0aG9kKTsKLSAgICAgICAgVmFsdWUqIGluZGV4ID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBvYmogPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIHB0ciA9IHZlcmlmeUFuZENvbXB1dGVQdHIob2JqLCBpbmRleCwgYXJyYXktPm5hdHVyYWxUeXBlKTsKLSAgICAgICAgcHVzaChwdHIpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBMREZMRCA6IHsKLSAgICAgICAgdWludDMyIHZhbHVlID0gcmVhZFU0KGJ5dGVjb2RlcywgaSk7Ci0gICAgICAgIFZhbHVlKiB2YWwgPSBnZXRWaXJ0dWFsRmllbGQodmFsdWUsIGdlbkNsYXNzLCBnZW5NZXRob2QpOwotICAgICAgICBwdXNoKG5ldyBMb2FkSW5zdCh2YWwsICIiLCBpc1ZvbGF0aWxlLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgaXNWb2xhdGlsZSA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBMREZMREEgOiB7Ci0gICAgICAgIHVpbnQzMiB2YWx1ZSA9IHJlYWRVNChieXRlY29kZXMsIGkpOwotICAgICAgICBwdXNoKGdldFZpcnR1YWxGaWVsZCh2YWx1ZSwgZ2VuQ2xhc3MsIGdlbk1ldGhvZCkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBMRExFTiA6IHsKLSAgICAgICAgcHVzaChhcnJheVNpemUocG9wKCkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgTERPQkogOiB7Ci0gICAgICAgIEFzc2VtYmx5KiBhc3NlbWJseSA9IGNvbXBpbGluZ0NsYXNzLT5hc3NlbWJseTsKLSAgICAgICAgTjMqIHZtID0gKE4zKikoVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpKTsKLSAgICAgICAgdWludDMyIHRva2VuID0gcmVhZFU0KGJ5dGVjb2RlcywgaSk7Ci0gICAgICAgIFZNQ29tbW9uQ2xhc3MqIGNsID0gYXNzZW1ibHktPmxvYWRUeXBlKHZtLCB0b2tlbiwgdHJ1ZSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCB0cnVlLCBnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLSAgICAgICAgaWYgKCEoY2wtPnN1cGVyID09IE1TQ29ybGliOjpwVmFsdWUgfHwgY2wtPnN1cGVyID09IE1TQ29ybGliOjpwRW51bSkpIHsKLSAgICAgICAgICBwdXNoKG5ldyBMb2FkSW5zdChwb3AoKSwgIiIsIGlzVm9sYXRpbGUsIGN1cnJlbnRCbG9jaykpOwotICAgICAgICAgIGlzVm9sYXRpbGUgPSBmYWxzZTsKLSAgICAgICAgfSAKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgTERTRkxEIDogewotICAgICAgICB1aW50MzIgdmFsdWUgPSByZWFkVTQoYnl0ZWNvZGVzLCBpKTsKLSAgICAgICAgVmFsdWUqIHZhbCA9IGdldFN0YXRpY0ZpZWxkKHZhbHVlLCBnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLSAgICAgICAgcHVzaChuZXcgTG9hZEluc3QodmFsLCAiIiwgaXNWb2xhdGlsZSwgY3VycmVudEJsb2NrKSk7Ci0gICAgICAgIGlzVm9sYXRpbGUgPSBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgTERTRkxEQSA6IHsKLSAgICAgICAgdWludDMyIHZhbHVlID0gcmVhZFU0KGJ5dGVjb2RlcywgaSk7Ci0gICAgICAgIHB1c2goZ2V0U3RhdGljRmllbGQodmFsdWUsIGdlbkNsYXNzLCBnZW5NZXRob2QpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgTERTVFIgOiB7Ci0gICAgICAgIHVpbnQzMiB2YWx1ZSA9IHJlYWRVNChieXRlY29kZXMsIGkpOwotICAgICAgICB1aW50MzIgaW5kZXggPSB2YWx1ZSAmIDB4ZmZmZmZmZjsKLQkJCQkvLyBtdXN0IG1vZGlmeSB0aGlzIG9wY29kZQotICAgICAgICBkZWNsYXJlX2djcm9vdChjb25zdCBBcnJheUNoYXIqLCBhcnJheSkgPSBjb21waWxpbmdDbGFzcy0+YXNzZW1ibHktPnJlYWRVc2VyU3RyaW5nKGluZGV4KTsKLSAgICAgICAgVmFsdWUqIHZhbCA9IENvbnN0YW50RXhwcjo6Z2V0SW50VG9QdHIoQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ2NFR5KGdldEdsb2JhbENvbnRleHQoKSksIChpbnQ2NF90KWFycmF5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLT5wdHJUeXBlKTsKLSAgICAgICAgVmFsdWUqIHJlcyA9IENhbGxJbnN0OjpDcmVhdGUobmV3U3RyaW5nTExWTSwgdmFsLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgLypDTElTdHJpbmcgKiBzdHIgPSAKLSAgICAgICAgICAoQ0xJU3RyaW5nKikoKChOMyopVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpKS0+VVRGOFRvU3RyKHV0ZjgpKTsKLSAgICAgICAgR2xvYmFsVmFyaWFibGUqIGd2ID0gc3RyLT5sbHZtVmFyKCk7Ci0gICAgICAgIHB1c2gobmV3IEJpdENhc3RJbnN0KG5ldyBMb2FkSW5zdChndiwgIiIsIGN1cnJlbnRCbG9jayksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU0NvcmxpYjo6cFN0cmluZy0+bmF0dXJhbFR5cGUsICIiLCBjdXJyZW50QmxvY2spKTsqLwotICAgICAgICBwdXNoKG5ldyBCaXRDYXN0SW5zdChyZXMsIE1TQ29ybGliOjpwU3RyaW5nLT5uYXR1cmFsVHlwZSwgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBMRFRPS0VOIDogewotICAgICAgICB1aW50MzIgdG9rZW4gPSByZWFkVTQoYnl0ZWNvZGVzLCBpKTsKLSAgICAgICAgdWludDMyIHRhYmxlID0gdG9rZW4gPj4gMjQ7Ci0gICAgICAgIEFzc2VtYmx5KiBhc3NlbWJseSA9IGNvbXBpbGluZ0NsYXNzLT5hc3NlbWJseTsKLSAgICAgICAgTjMqIHZtID0gKE4zKikoVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpKTsKLSAgICAgICAgc3dpdGNoICh0YWJsZSkgewotICAgICAgICAgIGNhc2UgQ09OU1RBTlRfRmllbGQgOiB7Ci0gICAgICAgICAgICB1aW50MzIgdHlwZVRva2VuID0gYXNzZW1ibHktPmdldFR5cGVkZWZUb2tlbkZyb21GaWVsZCh0b2tlbik7Ci0gICAgICAgICAgICBhc3NlbWJseS0+bG9hZFR5cGUodm0sIHR5cGVUb2tlbiwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIGdlbkNsYXNzLCBnZW5NZXRob2QpOwotICAgICAgICAgICAgVk1GaWVsZCogZmllbGQgPSBhc3NlbWJseS0+bG9va3VwRmllbGRGcm9tVG9rZW4odG9rZW4pOwotICAgICAgICAgICAgaWYgKCFmaWVsZCkgewotICAgICAgICAgICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFZhbHVlKiBhcmcgPSBuZXcgTG9hZEluc3QoZmllbGQtPmxsdm1WYXIoKSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgICAgICBwdXNoKGFyZyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgY2FzZSBDT05TVEFOVF9NZXRob2REZWYgOiB7Ci0gICAgICAgICAgICB1aW50MzIgdHlwZVRva2VuID0gYXNzZW1ibHktPmdldFR5cGVkZWZUb2tlbkZyb21NZXRob2QodG9rZW4pOwotICAgICAgICAgICAgYXNzZW1ibHktPmxvYWRUeXBlKHZtLCB0eXBlVG9rZW4sIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlLCBnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLSAgICAgICAgICAgIFZNTWV0aG9kKiBtZXRoID0gYXNzZW1ibHktPmxvb2t1cE1ldGhvZEZyb21Ub2tlbih0b2tlbik7Ci0gICAgICAgICAgICBpZiAoIW1ldGgpIHsKLSAgICAgICAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBWYWx1ZSogYXJnID0gbmV3IExvYWRJbnN0KG1ldGgtPmxsdm1WYXIoKSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgICAgICBwdXNoKGFyZyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBjYXNlIENPTlNUQU5UX1R5cGVEZWYgOgotICAgICAgICAgIGNhc2UgQ09OU1RBTlRfVHlwZVJlZiA6IHsKLSAgICAgICAgICAgIFZNQ29tbW9uQ2xhc3MqIGNsID0gYXNzZW1ibHktPmxvYWRUeXBlKHZtLCB0b2tlbiwgdHJ1ZSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSwgZ2VuQ2xhc3MsIGdlbk1ldGhvZCk7Ci0gICAgICAgICAgICBWYWx1ZSogYXJnID0gbmV3IExvYWRJbnN0KGNsLT5sbHZtVmFyKCksICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICAgICAgcHVzaChhcmcpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBNS1JFRkFOWSA6IHsKLSAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIE5FV0FSUiA6IHsKLSAgICAgICAgdWludDMyIHZhbHVlID0gcmVhZFU0KGJ5dGVjb2RlcywgaSk7Ci0gICAgICAgIEFzc2VtYmx5KiBhc3MgPSBjb21waWxpbmdDbGFzcy0+YXNzZW1ibHk7Ci0gICAgICAgIFZNQ29tbW9uQ2xhc3MqIGJhc2VUeXBlID0gYXNzLT5sb2FkVHlwZSgoTjMqKShWTVRocmVhZDo6Z2V0KCktPmdldFZNKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIHRydWUsIGZhbHNlLCBmYWxzZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLQotICAgICAgICBWTUNsYXNzQXJyYXkqIHR5cGUgPSBhc3MtPmNvbnN0cnVjdEFycmF5KGJhc2VUeXBlLCAxKTsKLSAgICAgICAgdHlwZS0+cmVzb2x2ZVR5cGUoZmFsc2UsIGZhbHNlLCBnZW5NZXRob2QpOwotICAgICAgICBWYWx1ZSogdmFyID0gbmV3IExvYWRJbnN0KHR5cGUtPmxsdm1WYXIoKSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPFZhbHVlKj4gYXJnczsKLSAgICAgICAgYXJncy5wdXNoX2JhY2sodmFyKTsKLSAgICAgICAgYXJncy5wdXNoX2JhY2socG9wKCkpOwotICAgICAgICBWYWx1ZSogdmFsID0gQ2FsbEluc3Q6OkNyZWF0ZShhcnJheUNvbnNMTFZNLCBhcmdzLmJlZ2luKCksIGFyZ3MuZW5kKCksICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIHB1c2gobmV3IEJpdENhc3RJbnN0KHZhbCwgdHlwZS0+bmF0dXJhbFR5cGUsICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgTkVXT0JKIDogewotICAgICAgICB1aW50MzIgdmFsdWUgPSByZWFkVTQoYnl0ZWNvZGVzLCBpKTsKLSAgICAgICAgaW52b2tlTmV3KHZhbHVlLCBnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgUkVGQU5ZVkFMIDogewotICAgICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgU1RFTEVNIDogewotICAgICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgU1RFTEVNX0kxIDogewotICAgICAgICBWYWx1ZSogdmFsID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBpbmRleCA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogb2JqID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBwdHIgPSB2ZXJpZnlBbmRDb21wdXRlUHRyKG9iaiwgaW5kZXgsIEFycmF5U0ludDg6Omxsdm1UeXBlKTsKLSAgICAgICAgY29udmVydFZhbHVlKHZhbCwgVHlwZTo6Z2V0SW50OFR5KGdldEdsb2JhbENvbnRleHQoKSksIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIG5ldyBTdG9yZUluc3QodmFsLCBwdHIsIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBTVEVMRU1fSTIgOiB7Ci0gICAgICAgIFZhbHVlKiB2YWwgPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIGluZGV4ID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBvYmogPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIHB0ciA9IHZlcmlmeUFuZENvbXB1dGVQdHIob2JqLCBpbmRleCwgQXJyYXlTSW50MTY6Omxsdm1UeXBlKTsKLSAgICAgICAgY29udmVydFZhbHVlKHZhbCwgVHlwZTo6Z2V0SW50MTZUeShnZXRHbG9iYWxDb250ZXh0KCkpLCBjdXJyZW50QmxvY2spOwotICAgICAgICBuZXcgU3RvcmVJbnN0KHZhbCwgcHRyLCBmYWxzZSwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgU1RFTEVNX0k0IDogewotICAgICAgICBWYWx1ZSogdmFsID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBpbmRleCA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogb2JqID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBwdHIgPSB2ZXJpZnlBbmRDb21wdXRlUHRyKG9iaiwgaW5kZXgsIEFycmF5U0ludDMyOjpsbHZtVHlwZSk7Ci0gICAgICAgIGNvbnZlcnRWYWx1ZSh2YWwsIFR5cGU6OmdldEludDMyVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgbmV3IFN0b3JlSW5zdCh2YWwsIHB0ciwgZmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIFNURUxFTV9JOCA6IHsKLSAgICAgICAgVmFsdWUqIHZhbCA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogaW5kZXggPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIG9iaiA9IHBvcCgpOwotICAgICAgICBWYWx1ZSogcHRyID0gdmVyaWZ5QW5kQ29tcHV0ZVB0cihvYmosIGluZGV4LCBBcnJheVVJbnQ2NDo6bGx2bVR5cGUpOwotICAgICAgICBjb252ZXJ0VmFsdWUodmFsLCBUeXBlOjpnZXRJbnQ2NFR5KGdldEdsb2JhbENvbnRleHQoKSksIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIG5ldyBTdG9yZUluc3QodmFsLCBwdHIsIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBTVEVMRU1fUjQgOiB7Ci0gICAgICAgIFZhbHVlKiB2YWwgPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIGluZGV4ID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBvYmogPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIHB0ciA9IHZlcmlmeUFuZENvbXB1dGVQdHIob2JqLCBpbmRleCwgQXJyYXlGbG9hdDo6bGx2bVR5cGUpOwotICAgICAgICBjb252ZXJ0VmFsdWUodmFsLCBUeXBlOjpnZXRGbG9hdFR5KGdldEdsb2JhbENvbnRleHQoKSksIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIG5ldyBTdG9yZUluc3QodmFsLCBwdHIsIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBTVEVMRU1fUjggOiB7Ci0gICAgICAgIFZhbHVlKiB2YWwgPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIGluZGV4ID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBvYmogPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIHB0ciA9IHZlcmlmeUFuZENvbXB1dGVQdHIob2JqLCBpbmRleCwgQXJyYXlEb3VibGU6Omxsdm1UeXBlKTsKLSAgICAgICAgY29udmVydFZhbHVlKHZhbCwgVHlwZTo6Z2V0RG91YmxlVHkoZ2V0R2xvYmFsQ29udGV4dCgpKSwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgbmV3IFN0b3JlSW5zdCh2YWwsIHB0ciwgZmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIFNURUxFTV9JIDogewotICAgICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgU1RFTEVNX1JFRiA6IHsKLSAgICAgICAgVmFsdWUqIHZhbCA9IG5ldyBCaXRDYXN0SW5zdChwb3AoKSwgVk1PYmplY3Q6Omxsdm1UeXBlLCAiIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLSAgICAgICAgVmFsdWUqIGluZGV4ID0gcG9wKCk7Ci0gICAgICAgIFZhbHVlKiBvYmogPSBwb3AoKTsKLSAgICAgICAgVmFsdWUqIHB0ciA9IHZlcmlmeUFuZENvbXB1dGVQdHIob2JqLCBpbmRleCwgQXJyYXlPYmplY3Q6Omxsdm1UeXBlKTsKLSAgICAgICAgbmV3IFN0b3JlSW5zdCh2YWwsIHB0ciwgZmFsc2UsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIFNURkxEIDogewotICAgICAgICB1aW50MzIgaW5kZXggPSByZWFkVTQoYnl0ZWNvZGVzLCBpKTsKLSAgICAgICAgc2V0VmlydHVhbEZpZWxkKGluZGV4LCBpc1ZvbGF0aWxlLCBnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLSAgICAgICAgaXNWb2xhdGlsZSA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBTVE9CSiA6IHsKLSAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgICAgIGlzVm9sYXRpbGUgPSBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgU1RTRkxEIDogewotICAgICAgICB1aW50MzIgaW5kZXggPSByZWFkVTQoYnl0ZWNvZGVzLCBpKTsKLSAgICAgICAgc2V0U3RhdGljRmllbGQoaW5kZXgsIGlzVm9sYXRpbGUsIGdlbkNsYXNzLCBnZW5NZXRob2QpOwotICAgICAgICBpc1ZvbGF0aWxlID0gZmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIFRIUk9XIDogewotICAgICAgICBsbHZtOjpWYWx1ZSogYXJnID0gcG9wKCk7Ci0gICAgICAgIGFyZyA9IG5ldyBCaXRDYXN0SW5zdChhcmcsIFZNT2JqZWN0OjpsbHZtVHlwZSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPFZhbHVlKj4gYXJnczsKLSAgICAgICAgYXJncy5wdXNoX2JhY2soYXJnKTsKLSAgICAgICAgaWYgKGN1cnJlbnRFeGNlcHRpb25CbG9jayAhPSBlbmRFeGNlcHRpb25CbG9jaykgewotICAgICAgICAgIEludm9rZUluc3Q6OkNyZWF0ZSh0aHJvd0V4Y2VwdGlvbkxMVk0sIHVuaWZpZWRVbnJlYWNoYWJsZSwgY3VycmVudEV4Y2VwdGlvbkJsb2NrLCBhcmdzLmJlZ2luKCksIGFyZ3MuZW5kKCksICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIENhbGxJbnN0OjpDcmVhdGUodGhyb3dFeGNlcHRpb25MTFZNLCBhcmdzLmJlZ2luKCksIGFyZ3MuZW5kKCksICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICAgIG5ldyBVbnJlYWNoYWJsZUluc3QoZ2V0R2xvYmFsQ29udGV4dCgpLCBjdXJyZW50QmxvY2spOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIFVOQk9YIDogewotICAgICAgICB1aW50MzIgdG9rZW4gPSByZWFkVTQoYnl0ZWNvZGVzLCBpKTsKLSAgICAgICAgQXNzZW1ibHkqIGFzc2VtYmx5ID0gY29tcGlsaW5nQ2xhc3MtPmFzc2VtYmx5OwotICAgICAgICBOMyogdm0gPSAoTjMqKShWTVRocmVhZDo6Z2V0KCktPmdldFZNKCkpOwotICAgICAgICBWTUNvbW1vbkNsYXNzKiB0eXBlID0gYXNzZW1ibHktPmxvYWRUeXBlKHZtLCB0b2tlbiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGdlbkNsYXNzLCBnZW5NZXRob2QpOwotICAgICAgICBhc3NlcnQodHlwZSk7Ci0KLSAgICAgICAgVmFsdWUqIHZhbCA9IG5ldyBBbGxvY2FJbnN0KHR5cGUtPm5hdHVyYWxUeXBlLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgVmFsdWUqIG9iaiA9IHBvcCgpOwotCi0gICAgICAgIGlmIChvYmotPmdldFR5cGUoKSAhPSB0eXBlLT52aXJ0dWFsVHlwZSkgewotICAgICAgICAgIG9iaiA9IG5ldyBCaXRDYXN0SW5zdChvYmosIHR5cGUtPnZpcnR1YWxUeXBlLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgc3RkOjp2ZWN0b3I8VmFsdWUqPiBwdHJzOwotICAgICAgICBwdHJzLnB1c2hfYmFjayhtb2R1bGUtPmNvbnN0YW50WmVybyk7Ci0gICAgICAgIHB0cnMucHVzaF9iYWNrKG1vZHVsZS0+Y29uc3RhbnRPbmUpOwotICAgICAgICBWYWx1ZSogcHRyID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShvYmosIHB0cnMuYmVnaW4oKSwgcHRycy5lbmQoKSwgIiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayk7Ci0KLSAgICAgICAgdWludDY0IHNpemUgPSBtdm06Ok12bU1vZHVsZTo6Z2V0VHlwZVNpemUodHlwZS0+bmF0dXJhbFR5cGUpOwotICAgICAgICAKLSAgICAgICAgc3RkOjp2ZWN0b3I8VmFsdWUqPiBwYXJhbXM7Ci0gICAgICAgIHBhcmFtcy5wdXNoX2JhY2sobmV3IEJpdENhc3RJbnN0KHZhbCwgUG9pbnRlclR5cGU6OmdldFVucXVhbChUeXBlOjpnZXRJbnQ4VHkoZ2V0R2xvYmFsQ29udGV4dCgpKSksICIiLCBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgcGFyYW1zLnB1c2hfYmFjayhuZXcgQml0Q2FzdEluc3QocHRyLCBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFR5cGU6OmdldEludDhUeShnZXRHbG9iYWxDb250ZXh0KCkpKSwgIiIsIGN1cnJlbnRCbG9jaykpOwotICAgICAgICBwYXJhbXMucHVzaF9iYWNrKENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShnZXRHbG9iYWxDb250ZXh0KCkpLCBzaXplKSk7Ci0gICAgICAgIHBhcmFtcy5wdXNoX2JhY2sobW9kdWxlLT5jb25zdGFudFplcm8pOwotICAgICAgICBDYWxsSW5zdDo6Q3JlYXRlKG1vZHVsZS0+bGx2bV9tZW1jcHlfaTMyLCBwYXJhbXMuYmVnaW4oKSwgcGFyYW1zLmVuZCgpLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgCi0KLSAgICAgICAgcHVzaCh2YWwpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBVTkJPWF9BTlkgOiB7Ci0gICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSAweEZFIDogewotICAgICAgICBQUklOVF9ERUJVRyhOM19DT01QSUxFLCAxLCBDT0xPUl9OT1JNQUwsICJcdFthdCAlNXhdICUtNWQgIiwgaSwKLSAgICAgICAgICAgICAgICAgICAgYnl0ZWNvZGVzW2kgKyAxXSk7Ci0gICAgICAgIFBSSU5UX0RFQlVHKE4zX0NPTVBJTEUsIDEsIExJR0hUX0JMVUUsICJjb21waWxpbmcgJXM6OiIsIG12bTo6UHJpbnRCdWZmZXIoY29tcGlsaW5nTWV0aG9kKS5jU3RyaW5nKCkpOwotICAgICAgICBQUklOVF9ERUJVRyhOM19DT01QSUxFLCAxLCBMSUdIVF9DWUFOLCBPcGNvZGVOYW1lc0ZFW2J5dGVjb2Rlc1tpICsgMV1dKTsKLSAgICAgICAgUFJJTlRfREVCVUcoTjNfQ09NUElMRSwgMSwgTElHSFRfQkxVRSwgIlxuIik7Ci0KLSAgICAgICAgc3dpdGNoIChieXRlY29kZXNbKytpXSkgewotCi0jZGVmaW5lIFRFU1QobmFtZSwgY21wZiwgY21waSkgY2FzZSBuYW1lIDogeyBcCi0gICAgICAgICAgVmFsdWUqIHZhbDIgPSBwb3AoKTsgXAotICAgICAgICAgIFZhbHVlKiB2YWwxID0gcG9wKCk7IFwKLSAgICAgICAgICBWYWx1ZSogdGVzdCA9IDA7IFwKLSAgICAgICAgICBpZiAodmFsMS0+Z2V0VHlwZSgpLT5pc0Zsb2F0VHkoKSkgeyBcCi0gICAgICAgICAgICB0ZXN0ID0gbmV3IEZDbXBJbnN0KCpjdXJyZW50QmxvY2ssIEZDbXBJbnN0OjpjbXBmLCB2YWwxLCB2YWwyLCAiIik7IFwKLSAgICAgICAgICB9IGVsc2UgeyBcCi0gICAgICAgICAgICBjb252ZXJ0VmFsdWUodmFsMiwgdmFsMS0+Z2V0VHlwZSgpLCBjdXJyZW50QmxvY2spOyBcCi0gICAgICAgICAgICB0ZXN0ID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpjbXBpLCB2YWwxLCB2YWwyLCAiIik7IFwKLSAgICAgICAgICB9IFwKLSAgICAgICAgICBwdXNoKHRlc3QpOyBcCi0gICAgICAgICAgYnJlYWs7IFwKLSAgICAgICAgfQotICAgICAgCi0gICAgICAgIFRFU1QoQ0VRLCBGQ01QX09FUSwgSUNNUF9FUSk7Ci0gICAgICAgIFRFU1QoQ0dULCBGQ01QX09HVCwgSUNNUF9TR1QpOwotICAgICAgICBURVNUKENHVF9VTiwgRkNNUF9VR1QsIElDTVBfVUdUKTsKLSAgICAgICAgVEVTVChDTFQsIEZDTVBfT0xULCBJQ01QX1NMVCk7Ci0gICAgICAgIFRFU1QoQ0xUX1VOLCBGQ01QX1VMVCwgSUNNUF9VTFQpOwotCi0jdW5kZWYgVEVTVAotICAgICAgICAgIAotICAgICAgICAgIGNhc2UgQ1BCTEsgOiB7Ci0gICAgICAgICAgICBWYWx1ZSogdGhyZWUgPSBwb3AoKTsKLSAgICAgICAgICAgIFZhbHVlKiB0d28gPSBwb3AoKTsKLSAgICAgICAgICAgIFZhbHVlKiBvbmUgPSBwb3AoKTsKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFZhbHVlKj4gYXJnczsKLSAgICAgICAgICAgIGFyZ3MucHVzaF9iYWNrKG9uZSk7Ci0gICAgICAgICAgICBhcmdzLnB1c2hfYmFjayh0d28pOwotICAgICAgICAgICAgYXJncy5wdXNoX2JhY2sodGhyZWUpOwotICAgICAgICAgICAgQ2FsbEluc3Q6OkNyZWF0ZShtb2R1bGUtPmxsdm1fbWVtY3B5X2kzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmJlZ2luKCksIGFyZ3MuZW5kKCksICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICAgICAgaXNWb2xhdGlsZSA9IGZhbHNlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgCi0gICAgICAgICAgY2FzZSBFTkRGSUxURVI6IHsKLSAgICAgICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIGNhc2UgTERBUkcgOiB7Ci0gICAgICAgICAgICBwdXNoKG5ldyBMb2FkSW5zdChhcmd1bWVudHNbcmVhZFUyKGJ5dGVjb2RlcywgaSldLCAiIiwgY3VycmVudEJsb2NrKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgY2FzZSBMREFSR0EgOiB7Ci0gICAgICAgICAgICBwdXNoKGFyZ3VtZW50c1tyZWFkVTIoYnl0ZWNvZGVzLCBpKV0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIGNhc2UgTERGVE4gOiB7Ci0gICAgICAgICAgICBBc3NlbWJseSogYXNzZW1ibHkgPSBjb21waWxpbmdDbGFzcy0+YXNzZW1ibHk7Ci0gICAgICAgICAgICBOMyogdm0gPSAoTjMqKShWTVRocmVhZDo6Z2V0KCktPmdldFZNKCkpOwotICAgICAgICAgICAgdWludDMyIHRva2VuID0gcmVhZFU0KGJ5dGVjb2RlcywgaSk7Ci0gICAgICAgICAgICB1aW50MzIgdGFibGUgPSB0b2tlbiA+PiAyNDsKLSAgICAgICAgICAgIGlmICh0YWJsZSA9PSBDT05TVEFOVF9NZXRob2REZWYpIHsKLSAgICAgICAgICAgICAgdWludDMyIHR5cGVUb2tlbiA9IGFzc2VtYmx5LT5nZXRUeXBlZGVmVG9rZW5Gcm9tTWV0aG9kKHRva2VuKTsKLSAgICAgICAgICAgICAgYXNzZW1ibHktPmxvYWRUeXBlKHZtLCB0eXBlVG9rZW4sIHRydWUsIGZhbHNlLCAgZmFsc2UsIHRydWUsIGdlbkNsYXNzLCBnZW5NZXRob2QpOwotICAgICAgICAgICAgICBWTU1ldGhvZCogbWV0aCA9IGFzc2VtYmx5LT5sb29rdXBNZXRob2RGcm9tVG9rZW4odG9rZW4pOwotICAgICAgICAgICAgICBpZiAoIW1ldGgpIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICAgICAgICBWYWx1ZSogYXJnID0gbmV3IExvYWRJbnN0KG1ldGgtPmxsdm1WYXIoKSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgICAgICAgIHB1c2goYXJnKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgY2FzZSBJTklUQkxLIDogewotICAgICAgICAgICAgVmFsdWUqIHRocmVlID0gcG9wKCk7Ci0gICAgICAgICAgICBWYWx1ZSogdHdvID0gcG9wKCk7Ci0gICAgICAgICAgICBWYWx1ZSogb25lID0gcG9wKCk7Ci0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IGFyZ3M7Ci0gICAgICAgICAgICBhcmdzLnB1c2hfYmFjayhvbmUpOwotICAgICAgICAgICAgYXJncy5wdXNoX2JhY2sodHdvKTsKLSAgICAgICAgICAgIGFyZ3MucHVzaF9iYWNrKHRocmVlKTsKLSAgICAgICAgICAgIENhbGxJbnN0OjpDcmVhdGUobW9kdWxlLT5sbHZtX21lbXNldF9pMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5iZWdpbigpLCBhcmdzLmVuZCgpLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgICAgIGlzVm9sYXRpbGUgPSBmYWxzZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgIAotICAgICAgICAgIGNhc2UgTERMT0MgOiB7Ci0gICAgICAgICAgICBwdXNoKG5ldyBMb2FkSW5zdChsb2NhbHNbcmVhZFUyKGJ5dGVjb2RlcywgaSldLCAiIiwgY3VycmVudEJsb2NrKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgY2FzZSBMT0NBTExPQyA6IHsKLSAgICAgICAgICAgIHB1c2gobmV3IEFsbG9jYUluc3QoVHlwZTo6Z2V0SW50OFR5KGdldEdsb2JhbENvbnRleHQoKSksIHBvcCgpLCAiIiwgY3VycmVudEJsb2NrKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgY2FzZSBTVEFSRyA6IHsKLSAgICAgICAgICAgIG5ldyBTdG9yZUluc3QocG9wKCksIGFyZ3VtZW50c1tyZWFkVTIoYnl0ZWNvZGVzLCBpKV0sIGZhbHNlLCBjdXJyZW50QmxvY2spOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIGNhc2UgU1RMT0MgOiB7Ci0gICAgICAgICAgICBWYWx1ZSogdmFsID0gcG9wKCk7Ci0gICAgICAgICAgICBWYWx1ZSogbG9jYWwgPSBsb2NhbHNbcmVhZFUyKGJ5dGVjb2RlcywgaSldOwotICAgICAgICAgICAgc3RvcmUodmFsLCBsb2NhbCwgZmFsc2UsIGN1cnJlbnRCbG9jaywgbW9kdWxlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBjYXNlIExETE9DQSA6IHsKLSAgICAgICAgICAgIHB1c2gobG9jYWxzW3JlYWRVMihieXRlY29kZXMsIGkpXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAKLSAgICAgICAgICBjYXNlIEFSR0xJU1QgOiB7Ci0gICAgICAgICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgIAotICAgICAgICAgIGNhc2UgSU5JVE9CSiA6IHsKLSAgICAgICAgICAgIHVpbnQzMiB0b2tlbiA9IHJlYWRVNChieXRlY29kZXMsIGkpOwotICAgICAgICAgICAgQXNzZW1ibHkqIGFzc2VtYmx5ID0gY29tcGlsaW5nQ2xhc3MtPmFzc2VtYmx5OwotICAgICAgICAgICAgTjMqIHZtID0gKE4zKikoVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpKTsKLSAgICAgICAgICAgIFZNQ29tbW9uQ2xhc3MqIHR5cGUgPSBhc3NlbWJseS0+bG9hZFR5cGUodm0sIHRva2VuLCB0cnVlLCBmYWxzZSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGdlbkNsYXNzLCBnZW5NZXRob2QpOwotICAgICAgICAgICAgaWYgKHR5cGUtPnN1cGVyID09IE1TQ29ybGliOjpwVmFsdWUpIHsKLSAgICAgICAgICAgICAgdWludDY0IHNpemUgPSBtdm06Ok12bU1vZHVsZTo6Z2V0VHlwZVNpemUodHlwZS0+bmF0dXJhbFR5cGUpOwotICAgICAgICAKLSAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VmFsdWUqPiBwYXJhbXM7Ci0gICAgICAgICAgICAgIHBhcmFtcy5wdXNoX2JhY2sobmV3IEJpdENhc3RJbnN0KHBvcCgpLCBtb2R1bGUtPnB0clR5cGUsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2spKTsKLSAgICAgICAgICAgICAgcGFyYW1zLnB1c2hfYmFjayhtb2R1bGUtPmNvbnN0YW50SW50OFplcm8pOwotICAgICAgICAgICAgICBwYXJhbXMucHVzaF9iYWNrKENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShnZXRHbG9iYWxDb250ZXh0KCkpLCBzaXplKSk7Ci0gICAgICAgICAgICAgIHBhcmFtcy5wdXNoX2JhY2sobW9kdWxlLT5jb25zdGFudFplcm8pOwotICAgICAgICAgICAgICBDYWxsSW5zdDo6Q3JlYXRlKG1vZHVsZS0+bGx2bV9tZW1zZXRfaTMyLCBwYXJhbXMuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuZW5kKCksICIiLCBjdXJyZW50QmxvY2spOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsgIAotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBjYXNlIExEVklSVEZUTiA6IHsKLSAgICAgICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIGNhc2UgUkVGQU5ZVFlQRSA6IHsKLSAgICAgICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIGNhc2UgUkVUSFJPVyA6IHsKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFZhbHVlKj4gYXJnczsKLSAgICAgICAgICAgIGlmIChvcGluZm8tPmV4Y2VwdGlvbikgewotICAgICAgICAgICAgICBhcmdzLnB1c2hfYmFjayhvcGluZm8tPmV4Y2VwdGlvbik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBhcmdzLnB1c2hfYmFjayhDTElKaXQ6OmNvbnN0YW50Vk1PYmplY3ROdWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjdXJyZW50RXhjZXB0aW9uQmxvY2sgIT0gZW5kRXhjZXB0aW9uQmxvY2spIHsKLSAgICAgICAgICAgICAgSW52b2tlSW5zdDo6Q3JlYXRlKHRocm93RXhjZXB0aW9uTExWTSwgdW5pZmllZFVucmVhY2hhYmxlLCBjdXJyZW50RXhjZXB0aW9uQmxvY2ssIGFyZ3MuYmVnaW4oKSwgYXJncy5lbmQoKSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBDYWxsSW5zdDo6Q3JlYXRlKHRocm93RXhjZXB0aW9uTExWTSwgYXJncy5iZWdpbigpLCBhcmdzLmVuZCgpLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgICAgICAgICAgICAgbmV3IFVucmVhY2hhYmxlSW5zdChnZXRHbG9iYWxDb250ZXh0KCksIGN1cnJlbnRCbG9jayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAgIGNhc2UgU0laRU9GIDogewotICAgICAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBjYXNlIFZPTEFUSUxFXyA6IHsKLSAgICAgICAgICAgIGlzVm9sYXRpbGUgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT51bmtub3duRXJyb3IoInVua25vd24gYnl0ZWNvZGUiKTsKLSAgICAgICAgfSAKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGRlZmF1bHQgOgotICAgICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPnVua25vd25FcnJvcigidW5rbm93biBieXRlY29kZSIpOwotICAgIH0gCi0gIH0KLX0KLQotdm9pZCBDTElKaXQ6OmV4cGxvcmVPcGNvZGVzKHVpbnQ4KiBieXRlY29kZXMsIHVpbnQzMiBjb2RlTGVuZ3RoKSB7Ci0gIGZvcih1aW50MzIgaSA9IDA7IGkgPCBjb2RlTGVuZ3RoOyArK2kpIHsKLSAgICAKLSAgICBpZiAoYnl0ZWNvZGVzW2ldICE9IDB4RkUpIHsKLSAgICAgIFBSSU5UX0RFQlVHKE4zX0NPTVBJTEUsIDEsIENPTE9SX05PUk1BTCwgIlx0W2F0ICU1eF0gJS01ZCAiLCBpLAotICAgICAgICAgICAgICAgICAgYnl0ZWNvZGVzW2ldKTsKLSAgICAgIFBSSU5UX0RFQlVHKE4zX0NPTVBJTEUsIDEsIExJR0hUX0JMVUUsICJleHBsb3JpbmcgJXM6OiIsIG12bTo6UHJpbnRCdWZmZXIoY29tcGlsaW5nTWV0aG9kKS5jU3RyaW5nKCkpOwotICAgICAgUFJJTlRfREVCVUcoTjNfQ09NUElMRSwgMSwgTElHSFRfQ1lBTiwgT3Bjb2RlTmFtZXNbYnl0ZWNvZGVzW2ldXSk7Ci0gICAgICBQUklOVF9ERUJVRyhOM19DT01QSUxFLCAxLCBMSUdIVF9CTFVFLCAiXG4iKTsKLSAgICB9Ci0gICAgCi0gICAgc3dpdGNoIChieXRlY29kZXNbaV0pIHsKLSAgICAgIAotICAgICAgY2FzZSBBREQ6Ci0gICAgICBjYXNlIEFERF9PVkY6Ci0gICAgICBjYXNlIEFERF9PVkZfVU46Ci0gICAgICBjYXNlIEFORDogYnJlYWs7Ci0gICAgICAKLSNkZWZpbmUgVEVTVChuYW1lLCByZWFkLCBvZmZzZXQpIGNhc2UgbmFtZSA6IHsgXAotICAgICAgICB1aW50MzIgdG1wID0gaTsgXAotICAgICAgICB1aW50MTYgaW5kZXggPSB0bXAgKyBvZmZzZXQgKyByZWFkKGJ5dGVjb2RlcywgaSk7IFwKLSAgICAgICAgaWYgKCEob3Bjb2RlSW5mb3NbaW5kZXhdLm5ld0Jsb2NrKSkgXAotICAgICAgICAgIG9wY29kZUluZm9zW2luZGV4XS5uZXdCbG9jayA9IGNyZWF0ZUJhc2ljQmxvY2soIkJyYW5jaGVzIik7IFwKLSAgICAgICAgYnJlYWs7IFwKLSAgICAgIH0KLSAgICAgIAotICAgICAgVEVTVChCRVEsIHJlYWRTNCwgNSk7Ci0gICAgICBURVNUKEJFUV9TLCByZWFkUzEsIDIpOwotICAgICAgCi0gICAgICBURVNUKEJHRSwgcmVhZFM0LCA1KTsKLSAgICAgIFRFU1QoQkdFX1MsIHJlYWRTMSwgMik7Ci0gICAgICBURVNUKEJHRV9VTiwgcmVhZFM0LCA1KTsKLSAgICAgIFRFU1QoQkdFX1VOX1MsIHJlYWRTMSwgMik7Ci0gICAgICAKLSAgICAgIFRFU1QoQkdULCByZWFkUzQsIDUpOwotICAgICAgVEVTVChCR1RfUywgcmVhZFMxLCAyKTsKLSAgICAgIFRFU1QoQkdUX1VOLCByZWFkUzQsIDUpOwotICAgICAgVEVTVChCR1RfVU5fUywgcmVhZFMxLCAyKTsKLQotICAgICAgVEVTVChCTEUsIHJlYWRTNCwgNSk7Ci0gICAgICBURVNUKEJMRV9TLCByZWFkUzEsIDIpOwotICAgICAgVEVTVChCTEVfVU4sIHJlYWRTNCwgNSk7Ci0gICAgICBURVNUKEJMRV9VTl9TLCByZWFkUzEsIDIpOwotICAgICAgCi0gICAgICBURVNUKEJMVCwgcmVhZFM0LCA1KTsKLSAgICAgIFRFU1QoQkxUX1MsIHJlYWRTMSwgMik7Ci0gICAgICBURVNUKEJMVF9VTiwgcmVhZFM0LCA1KTsKLSAgICAgIFRFU1QoQkxUX1VOX1MsIHJlYWRTMSwgMik7Ci0gICAgICAKLSAgICAgIFRFU1QoQk5FX1VOLCByZWFkUzQsIDUpOwotICAgICAgVEVTVChCTkVfVU5fUywgcmVhZFMxLCAyKTsKLQotICAgICAgY2FzZSBCUiA6IHsKLSAgICAgICAgdWludDMyIHRtcCA9IGk7Ci0gICAgICAgIHVpbnQxNiBpbmRleCA9IHRtcCArIDUgKyByZWFkUzQoYnl0ZWNvZGVzLCBpKTsKLSAgICAgICAgaWYgKCEob3Bjb2RlSW5mb3NbaW5kZXhdLm5ld0Jsb2NrKSkKLSAgICAgICAgICBvcGNvZGVJbmZvc1tpbmRleF0ubmV3QmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJCUiIpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBCUl9TIDogewotICAgICAgICB1aW50MzIgdG1wID0gaTsKLSAgICAgICAgdWludDE2IGluZGV4ID0gdG1wICsgMiArIHJlYWRTMShieXRlY29kZXMsIGkpOwotICAgICAgICBpZiAoIShvcGNvZGVJbmZvc1tpbmRleF0ubmV3QmxvY2spKQotICAgICAgICAgIG9wY29kZUluZm9zW2luZGV4XS5uZXdCbG9jayA9IGNyZWF0ZUJhc2ljQmxvY2soIkJSIik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIEJSRUFLOiBicmVhazsKLQotICAgICAgVEVTVChCUkZBTFNFLCByZWFkUzQsIDUpOwotICAgICAgVEVTVChCUkZBTFNFX1MsIHJlYWRTMSwgMik7Ci0gICAgICBURVNUKEJSVFJVRSwgcmVhZFM0LCA1KTsKLSAgICAgIFRFU1QoQlJUUlVFX1MsIHJlYWRTMSwgMik7Ci0KLSN1bmRlZiBURVNUCi0gICAgICAKLSAgICAgIGNhc2UgQ0FMTDogewotICAgICAgICBpKz0gNDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgQ0FMTEk6IHsKLSAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT51bmtub3duRXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBDS0ZJTklURSA6IHsKLSAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT51bmtub3duRXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBDT05WX0kxIDoKLSAgICAgIGNhc2UgQ09OVl9JMiA6Ci0gICAgICBjYXNlIENPTlZfSTQgOgotICAgICAgY2FzZSBDT05WX0k4IDoKLSAgICAgIGNhc2UgQ09OVl9SNCA6Ci0gICAgICBjYXNlIENPTlZfUjggOgotICAgICAgY2FzZSBDT05WX1UxIDoKLSAgICAgIGNhc2UgQ09OVl9VMiA6Ci0gICAgICBjYXNlIENPTlZfVTQgOgotICAgICAgY2FzZSBDT05WX1U4IDoKLSAgICAgIGNhc2UgQ09OVl9JIDoKLSAgICAgIGNhc2UgQ09OVl9VIDoKLSAgICAgIGNhc2UgQ09OVl9SX1VOIDoKLSAgICAgIGNhc2UgQ09OVl9PVkZfSTEgOgotICAgICAgY2FzZSBDT05WX09WRl9JMiA6Ci0gICAgICBjYXNlIENPTlZfT1ZGX0k0IDoKLSAgICAgIGNhc2UgQ09OVl9PVkZfSTggOgotICAgICAgY2FzZSBDT05WX09WRl9VMSA6Ci0gICAgICBjYXNlIENPTlZfT1ZGX1UyIDoKLSAgICAgIGNhc2UgQ09OVl9PVkZfVTQgOgotICAgICAgY2FzZSBDT05WX09WRl9VOCA6Ci0gICAgICBjYXNlIENPTlZfT1ZGX0kgOgotICAgICAgY2FzZSBDT05WX09WRl9VIDoKLSAgICAgIGNhc2UgQ09OVl9PVkZfSTFfVU4gOgotICAgICAgY2FzZSBDT05WX09WRl9JMl9VTiA6Ci0gICAgICBjYXNlIENPTlZfT1ZGX0k0X1VOIDoKLSAgICAgIGNhc2UgQ09OVl9PVkZfSThfVU4gOgotICAgICAgY2FzZSBDT05WX09WRl9VMV9VTiA6Ci0gICAgICBjYXNlIENPTlZfT1ZGX1UyX1VOIDoKLSAgICAgIGNhc2UgQ09OVl9PVkZfVTRfVU4gOgotICAgICAgY2FzZSBDT05WX09WRl9VOF9VTiA6Ci0gICAgICBjYXNlIERJVjoKLSAgICAgIGNhc2UgRElWX1VOOgotICAgICAgY2FzZSBEVVA6Ci0gICAgICBjYXNlIEVOREZJTkFMTFkgOiBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBKTVAgOiB7Ci0gICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOyAKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gCi0gICAgICBjYXNlIExEQVJHX1MgOiB7Ci0gICAgICAgIGkrPSAxOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBMREFSR18wIDoKLSAgICAgIGNhc2UgTERBUkdfMSA6Ci0gICAgICBjYXNlIExEQVJHXzIgOgotICAgICAgY2FzZSBMREFSR18zIDogYnJlYWs7Ci0KLSAgICAgIGNhc2UgTERBUkdBX1MgOiB7Ci0gICAgICAgIGkgKz0gMTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgTERDX0k0IDogewotICAgICAgICBpICs9IDQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIExEQ19JOCA6IHsKLSAgICAgICAgaSArPSA4OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBMRENfUjQgOiB7Ci0gICAgICAgIGkgKz0gNDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgTERDX1I4IDogewotICAgICAgICBpICs9IDg7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIExEQ19JNF8wIDoKLSAgICAgIGNhc2UgTERDX0k0XzEgOgotICAgICAgY2FzZSBMRENfSTRfMiA6Ci0gICAgICBjYXNlIExEQ19JNF8zIDoKLSAgICAgIGNhc2UgTERDX0k0XzQgOgotICAgICAgY2FzZSBMRENfSTRfNSA6Ci0gICAgICBjYXNlIExEQ19JNF82IDoKLSAgICAgIGNhc2UgTERDX0k0XzcgOgotICAgICAgY2FzZSBMRENfSTRfOCA6Ci0gICAgICBjYXNlIExEQ19JNF9NMSA6IGJyZWFrOwotICAgICAgCi0gICAgICBjYXNlIExEQ19JNF9TIDogewotICAgICAgICBpICs9IDE7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotIAotICAgICAgY2FzZSBMRElORF9VMSA6Ci0gICAgICBjYXNlIExESU5EX0kxIDoKLSAgICAgIGNhc2UgTERJTkRfVTIgOgotICAgICAgY2FzZSBMRElORF9JMiA6Ci0gICAgICBjYXNlIExESU5EX1U0IDoKLSAgICAgIGNhc2UgTERJTkRfSTQgOgotICAgICAgY2FzZSBMRElORF9JOCA6Ci0gICAgICBjYXNlIExESU5EX1I0IDoKLSAgICAgIGNhc2UgTERJTkRfUjggOgotICAgICAgY2FzZSBMRElORF9JIDogYnJlYWs7Ci0gICAgICAKLSAgICAgIGNhc2UgTERJTkRfUkVGIDogewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAKLSAgICAgIGNhc2UgTERMT0NfUyA6IHsKLSAgICAgICAgaSArPSAxOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBMRExPQ18wIDoKLSAgICAgIGNhc2UgTERMT0NfMSA6Ci0gICAgICBjYXNlIExETE9DXzIgOgotICAgICAgY2FzZSBMRExPQ18zIDogYnJlYWs7Ci0gICAgICAKLSAgICAgIGNhc2UgTERMT0NBX1MgOiB7Ci0gICAgICAgIGkgKz0gMTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgTEROVUxMIDogYnJlYWs7Ci0KLSAgICAgIGNhc2UgTEVBVkUgOiB7Ci0gICAgICAgIHVpbnQzMiB0bXAgPSBpOwotICAgICAgICB1aW50MzIgdmFsdWUgPSByZWFkUzQoYnl0ZWNvZGVzLCBpKTsKLSAgICAgICAgdWludDMyIGluZGV4ID0gdG1wICsgNSArIHZhbHVlOwotICAgICAgICBpZiAoIShvcGNvZGVJbmZvc1tpbmRleF0ubmV3QmxvY2spKQotICAgICAgICAgIG9wY29kZUluZm9zW2luZGV4XS5uZXdCbG9jayA9IGNyZWF0ZUJhc2ljQmxvY2soIkxFQVZFIik7Ci0gICAgICAgIGxlYXZlcy5wdXNoX2JhY2sob3Bjb2RlSW5mb3NbaW5kZXhdLm5ld0Jsb2NrKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgTEVBVkVfUyA6IHsKLSAgICAgICAgdWludDMyIHRtcCA9IGk7Ci0gICAgICAgIHVpbnQ4IHZhbHVlID0gcmVhZFMxKGJ5dGVjb2RlcywgaSk7Ci0gICAgICAgIHVpbnQzMiBpbmRleCA9IHRtcCArIDIgKyB2YWx1ZTsKLSAgICAgICAgaWYgKCEob3Bjb2RlSW5mb3NbaW5kZXhdLm5ld0Jsb2NrKSkKLSAgICAgICAgICBvcGNvZGVJbmZvc1tpbmRleF0ubmV3QmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJMRUFWRV9TIik7Ci0gICAgICAgIGxlYXZlcy5wdXNoX2JhY2sob3Bjb2RlSW5mb3NbaW5kZXhdLm5ld0Jsb2NrKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgTVVMIDoKLSAgICAgIGNhc2UgTVVMX09WRiA6Ci0gICAgICBjYXNlIE1VTF9PVkZfVU4gOgotICAgICAgY2FzZSBORUcgOgotICAgICAgY2FzZSBOT1AgOgotICAgICAgY2FzZSBOT1QgOgotICAgICAgY2FzZSBPUiA6Ci0gICAgICBjYXNlIFBPUCA6Ci0gICAgICBjYXNlIFJFTSA6Ci0gICAgICBjYXNlIFJFTV9VTiA6Ci0gICAgICBjYXNlIFJFVCA6Ci0gICAgICBjYXNlIFNITCA6Ci0gICAgICBjYXNlIFNIUiA6Ci0gICAgICBjYXNlIFNIUl9VTiA6IGJyZWFrOwotICAgICAgCi0gICAgICBjYXNlIFNUQVJHX1MgOiB7Ci0gICAgICAgIGkgKz0gMTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgU1RJTkRfSTEgOgotICAgICAgY2FzZSBTVElORF9JMiA6Ci0gICAgICBjYXNlIFNUSU5EX0k0IDoKLSAgICAgIGNhc2UgU1RJTkRfSTggOgotICAgICAgY2FzZSBTVElORF9SNCA6Ci0gICAgICBjYXNlIFNUSU5EX1I4IDoKLSAgICAgIGNhc2UgU1RJTkRfSSA6Ci0gICAgICBjYXNlIFNUSU5EX1JFRiA6IGJyZWFrOwotICAgICAgCi0gICAgICBjYXNlIFNUTE9DX1MgOiB7Ci0gICAgICAgIGkgKz0gMTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgU1RMT0NfMCA6Ci0gICAgICBjYXNlIFNUTE9DXzEgOgotICAgICAgY2FzZSBTVExPQ18yIDoKLSAgICAgIGNhc2UgU1RMT0NfMyA6Ci0gICAgICBjYXNlIFNVQiA6Ci0gICAgICBjYXNlIFNVQl9PVkYgOgotICAgICAgY2FzZSBTVUJfT1ZGX1VOIDogYnJlYWs7Ci0KLSAgICAgIGNhc2UgU1dJVENIIDogewotICAgICAgICB1aW50MzIgdmFsdWUgPSByZWFkVTQoYnl0ZWNvZGVzLCBpKTsKLSAgICAgICAgdWludDMyIG5leHQgPSBpICsgdmFsdWUgKiBzaXplb2Yoc2ludDMyKSArIDE7Ci0gICAgICAgIGZvciAodWludDMyIHQgPSAwOyB0IDwgdmFsdWU7IHQrKykgewotICAgICAgICAgIHNpbnQzMiBvZmZzZXQgPSByZWFkUzQoYnl0ZWNvZGVzLCBpKTsKLSAgICAgICAgICBzaW50MzIgaW5kZXggPSBuZXh0ICsgb2Zmc2V0OwotICAgICAgICAgIGFzc2VydChpbmRleCA+IDApOwotICAgICAgICAgIGlmICghKG9wY29kZUluZm9zW2luZGV4XS5uZXdCbG9jaykpIHsKLSAgICAgICAgICAgIEJhc2ljQmxvY2sqIGJsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygic3dpdGNoIik7Ci0gICAgICAgICAgICBvcGNvZGVJbmZvc1tpbmRleF0ubmV3QmxvY2sgPSBibG9jazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCEob3Bjb2RlSW5mb3NbaSArIDFdLm5ld0Jsb2NrKSkgewotICAgICAgICAgIEJhc2ljQmxvY2sqIGJsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygic3dpdGNoIik7Ci0gICAgICAgICAgb3Bjb2RlSW5mb3NbaSArIDFdLm5ld0Jsb2NrID0gYmxvY2s7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgWE9SIDogYnJlYWs7Ci0KLSAgICAgIGNhc2UgQk9YIDogewotICAgICAgICBpICs9IDQ7Ci0gICAgICAgIGJyZWFrOyAKLSAgICAgIH0KLQotICAgICAgY2FzZSBDQUxMVklSVCA6IHsKLSAgICAgICAgaSArPSA0OwotICAgICAgICBicmVhazsgCi0gICAgICB9Ci0KLSAgICAgIGNhc2UgQ0FTVENMQVNTIDogewotICAgICAgICBpICs9IDQ7Ci0gICAgICAgIGJyZWFrOyAgCi0gICAgICB9Ci0KLSAgICAgIGNhc2UgQ1BPQkogOiB7Ci0gICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICBicmVhazsgIAotICAgICAgfQotICAgICAgIAotICAgICAgY2FzZSBJU0lOU1QgOiB7Ci0gICAgICAgIGkgKz0gNDsKLSAgICAgICAgYnJlYWs7ICAKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBMREVMRU0gOiB7Ci0gICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICBicmVhazsgIAotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIExERUxFTV9JMSA6IHsKLSAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgICAgIGJyZWFrOyAgCi0gICAgICB9Ci0KLSAgICAgIGNhc2UgTERFTEVNX0kyIDoKLSAgICAgIGNhc2UgTERFTEVNX0k0IDoKLSAgICAgIGNhc2UgTERFTEVNX0k4IDoKLSAgICAgIGNhc2UgTERFTEVNX1UxIDoKLSAgICAgIGNhc2UgTERFTEVNX1UyIDoKLSAgICAgIGNhc2UgTERFTEVNX1U0IDoKLSAgICAgIGNhc2UgTERFTEVNX1I0IDoKLSAgICAgIGNhc2UgTERFTEVNX1I4IDoKLSAgICAgIGNhc2UgTERFTEVNX0kgOgotICAgICAgY2FzZSBMREVMRU1fUkVGIDoKLSAgICAgIGNhc2UgTERFTEVNQSA6IGJyZWFrOwotCi0gICAgICBjYXNlIExERkxEIDogewotICAgICAgICBpICs9IDQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIExERkxEQSA6IHsKLSAgICAgICAgaSArPSA0OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBMRExFTiA6IGJyZWFrOwotCi0gICAgICBjYXNlIExET0JKIDogewotICAgICAgICBpICs9IDQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIExEU0ZMRCA6IHsKLSAgICAgICAgaSArPSA0OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBMRFNGTERBIDogewotICAgICAgICBpICs9IDQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIExEU1RSIDogewotICAgICAgICBpICs9IDQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIExEVE9LRU4gOiB7Ci0gICAgICAgIGkgKz0gNDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhc2UgTUtSRUZBTlkgOiB7Ci0gICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBORVdBUlIgOiB7Ci0gICAgICAgIGkgKz0gNDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgTkVXT0JKIDogewotICAgICAgICBpICs9IDQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIFJFRkFOWVZBTCA6IHsKLSAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBjYXNlIFNURUxFTSA6IHsKLSAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIFNURUxFTV9JMSA6Ci0gICAgICBjYXNlIFNURUxFTV9JMiA6Ci0gICAgICBjYXNlIFNURUxFTV9JNCA6Ci0gICAgICBjYXNlIFNURUxFTV9JOCA6Ci0gICAgICBjYXNlIFNURUxFTV9SNCA6Ci0gICAgICBjYXNlIFNURUxFTV9SOCA6Ci0gICAgICBjYXNlIFNURUxFTV9JIDoKLSAgICAgIGNhc2UgU1RFTEVNX1JFRiA6IGJyZWFrOwotCi0gICAgICBjYXNlIFNURkxEIDogewotICAgICAgICBpICs9IDQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIFNUT0JKIDogewotICAgICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgU1RTRkxEIDogewotICAgICAgICBpICs9IDQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIFRIUk9XIDogewotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBVTkJPWCA6IHsKLSAgICAgICAgaSArPSA0OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FzZSBVTkJPWF9BTlkgOiB7Ci0gICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSAweEZFIDogewotICAgICAgCi0gICAgICAgIFBSSU5UX0RFQlVHKE4zX0NPTVBJTEUsIDEsIENPTE9SX05PUk1BTCwgIlx0W2F0ICU1eF0gJS01ZCAiLCBpLAotICAgICAgICAgICAgICAgICAgICBieXRlY29kZXNbaSArIDFdKTsKLSAgICAgICAgUFJJTlRfREVCVUcoTjNfQ09NUElMRSwgMSwgTElHSFRfQkxVRSwgImV4cGxvcmluZyAlczo6IiwgbXZtOjpQcmludEJ1ZmZlcihjb21waWxpbmdNZXRob2QpLmNTdHJpbmcoKSk7Ci0gICAgICAgIFBSSU5UX0RFQlVHKE4zX0NPTVBJTEUsIDEsIExJR0hUX0NZQU4sIE9wY29kZU5hbWVzRkVbYnl0ZWNvZGVzW2kgKyAxXV0pOwotICAgICAgICBQUklOVF9ERUJVRyhOM19DT01QSUxFLCAxLCBMSUdIVF9CTFVFLCAiXG4iKTsKLSAgICAgIAotICAgICAgICBzd2l0Y2ggKGJ5dGVjb2Rlc1srK2ldKSB7Ci0KLSAgICAgICAgICBjYXNlIENFUToKLSAgICAgICAgICBjYXNlIENHVDoKLSAgICAgICAgICBjYXNlIENHVF9VTjoKLSAgICAgICAgICBjYXNlIENMVDoKLSAgICAgICAgICBjYXNlIENMVF9VTjoKLSAgICAgICAgICBjYXNlIENQQkxLIDogYnJlYWs7Ci0gICAgICAKLSAgICAgICAgICBjYXNlIEVOREZJTFRFUjogewotICAgICAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgY2FzZSBMREFSRyA6IHsKLSAgICAgICAgICAgIGkgKz0gMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBjYXNlIExEQVJHQSA6IHsKLSAgICAgICAgICAgIGkgKz0gMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBjYXNlIExERlROIDogewotICAgICAgICAgICAgaSArPSA0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgY2FzZSBJTklUQkxLIDogYnJlYWs7Ci0gICAgICAKLSAgICAgICAgICBjYXNlIExETE9DIDogewotICAgICAgICAgICAgaSArPSAyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIGNhc2UgTE9DQUxMT0MgOiBicmVhazsKLSAgICAgICAgICAKLSAgICAgICAgICBjYXNlIFNUQVJHIDogewotICAgICAgICAgICAgaSArPSAyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIGNhc2UgU1RMT0MgOiB7Ci0gICAgICAgICAgICBpICs9IDI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgY2FzZSBMRExPQ0EgOiB7Ci0gICAgICAgICAgICBpICs9IDI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAKLSAgICAgICAgICBjYXNlIEFSR0xJU1QgOiB7Ci0gICAgICAgICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKCJpbXBsZW1lbnQgbWUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgIAotICAgICAgICAgIGNhc2UgSU5JVE9CSiA6IHsKLSAgICAgICAgICAgIGkgKz0gNDsKLSAgICAgICAgICAgIGJyZWFrOyAgCi0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIGNhc2UgTERWSVJURlROIDogewotICAgICAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgY2FzZSBSRUZBTllUWVBFIDogewotICAgICAgICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgY2FzZSBSRVRIUk9XIDogewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgICBjYXNlIFNJWkVPRiA6IHsKLSAgICAgICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoImltcGxlbWVudCBtZSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgY2FzZSBWT0xBVElMRV8gOiB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPnVua25vd25FcnJvcigidW5rbm93biBieXRlY29kZSIpOwotICAgICAgICB9IAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+dW5rbm93bkVycm9yKCJ1bmtub3duIGJ5dGVjb2RlIik7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvTjMvVk1Db3JlL1JlYWRlci5jcHAgYi92bWtpdC9saWIvTjMvVk1Db3JlL1JlYWRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MWFmMTIuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL04zL1ZNQ29yZS9SZWFkZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0tLS0tIFJlYWRlci5jcHAgLSBPcGVuIGFuZCByZWFkIGZpbGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4zCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJ0eXBlcy5oIgotCi0jaW5jbHVkZSAiTVNDb3JsaWIuaCIKLSNpbmNsdWRlICJOMy5oIgotI2luY2x1ZGUgIlZNQXJyYXkuaCIKLSNpbmNsdWRlICJWTUNsYXNzLmgiCi0jaW5jbHVkZSAiVk1UaHJlYWQuaCIKLSNpbmNsdWRlICJSZWFkZXIuaCIKLQotdXNpbmcgbmFtZXNwYWNlIG4zOwotCi1kb3VibGUgUmVhZGVyOjpyZWFkRG91YmxlKGludCBmaXJzdCwgaW50IHNlY29uZCkgewotICBpbnQgdmFsdWVzWzJdOwotICBkb3VibGUgcmVzWzFdOwotI2lmIGRlZmluZWQoX19QUENfXykKLSAgdmFsdWVzWzBdID0gc2Vjb25kOwotICB2YWx1ZXNbMV0gPSBmaXJzdDsKLSNlbHNlCi0gIHZhbHVlc1swXSA9IGZpcnN0OwotICB2YWx1ZXNbMV0gPSBzZWNvbmQ7Ci0jZW5kaWYKLSAgbWVtY3B5KHJlcywgdmFsdWVzLCA4KTsgCi0gIHJldHVybiByZXNbMF07Ci19Ci0KLXNpbnQ2NCBSZWFkZXI6OnJlYWRMb25nKGludCBmaXJzdCwgaW50IHNlY29uZCkgewotICBpbnQgdmFsdWVzWzJdOwotICBzaW50NjQgcmVzWzFdOwotI2lmIGRlZmluZWQoX19QUENfXykKLSAgdmFsdWVzWzBdID0gc2Vjb25kOwotICB2YWx1ZXNbMV0gPSBmaXJzdDsKLSNlbHNlCi0gIHZhbHVlc1swXSA9IGZpcnN0OwotICB2YWx1ZXNbMV0gPSBzZWNvbmQ7Ci0jZW5kaWYKLSAgbWVtY3B5KHJlcywgdmFsdWVzLCA4KTsgCi0gIHJldHVybiByZXNbMF07Ci19Ci0KLWNvbnN0IGludCBSZWFkZXI6OlNlZWtTZXQgPSBTRUVLX1NFVDsKLWNvbnN0IGludCBSZWFkZXI6OlNlZWtDdXIgPSBTRUVLX0NVUjsKLWNvbnN0IGludCBSZWFkZXI6OlNlZWtFbmQgPSBTRUVLX0VORDsKLQotQnl0ZUNvZGU6OkJ5dGVDb2RlKG12bTo6QnVtcFB0ckFsbG9jYXRvciAmYWxsb2NhdG9yLCBpbnQgc2l6ZSkgewotCXRoaXMtPnNpemUgPSBzaXplOwotCXRoaXMtPmVsZW1lbnRzID0gKHVpbnQ4KilhbGxvY2F0b3IuQWxsb2NhdGUoc2l6ZSAqIHNpemVvZih1aW50OCksICJ1aW50OFtdIik7Ci19Ci0KLUJ5dGVDb2RlKiBSZWFkZXI6Om9wZW5GaWxlKG12bTo6QnVtcFB0ckFsbG9jYXRvciAmYWxsb2NhdG9yLCBjaGFyKiBwYXRoKSB7Ci0gIEZJTEUqIGZwID0gZm9wZW4ocGF0aCwgInIiKTsKLSAgQnl0ZUNvZGUqIHJlcyA9IDA7Ci0gIGlmIChmcCAhPSAwKSB7Ci0gICAgZnNlZWsoZnAsIDAsIFNlZWtFbmQpOwotICAgIGxvbmcgbmJiID0gZnRlbGwoZnApOwotICAgIGZzZWVrKGZwLCAwLCBTZWVrU2V0KTsKLQkJcmVzID0gbmV3KGFsbG9jYXRvciwgIkJ5dGVDb2RlIikgQnl0ZUNvZGUoYWxsb2NhdG9yLCBuYmIpOwotICAgIGZyZWFkKHJlcy0+ZWxlbWVudHMsIG5iYiwgMSwgZnApOwotICAgIGZjbG9zZShmcCk7Ci0gIH0KLSAgcmV0dXJuIHJlczsKLX0KLQotdWludDggUmVhZGVyOjpyZWFkVTEoKSB7Ci0JaWYoY3Vyc29yID49ICh1aW50MzIpYnl0ZXMtPnNpemUpCi0JCVZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoInJlYWRVMSBvdXRzaWRlIHRoZSBidWZmZXIiKTsKLSAgcmV0dXJuIGJ5dGVzLT5lbGVtZW50c1tjdXJzb3IrK107Ci19Ci0KLXNpbnQ4IFJlYWRlcjo6cmVhZFMxKCkgewotICByZXR1cm4gcmVhZFUxKCk7Ci19Ci0KLXVpbnQxNiBSZWFkZXI6OnJlYWRVMigpIHsKLSAgdWludDE2IHRtcCA9ICgodWludDE2KShyZWFkVTEoKSkpOwotICByZXR1cm4gdG1wIHwgKCgodWludDE2KShyZWFkVTEoKSkpIDw8IDgpOwotfQotCi1zaW50MTYgUmVhZGVyOjpyZWFkUzIoKSB7Ci0gIHNpbnQxNiB0bXAgPSAoKHNpbnQxNikocmVhZFMxKCkpKTsKLSAgcmV0dXJuIHRtcCB8ICgoKHNpbnQxNikocmVhZFMxKCkpKSA8PCA4KTsKLX0KLQotdWludDMyIFJlYWRlcjo6cmVhZFU0KCkgewotICB1aW50MzIgdG1wID0gKCh1aW50MzIpKHJlYWRVMigpKSk7Ci0gIHJldHVybiB0bXAgfCAoKCh1aW50MzIpKHJlYWRVMigpKSkgPDwgMTYpOwotfQotCi1zaW50MzIgUmVhZGVyOjpyZWFkUzQoKSB7Ci0gIHNpbnQzMiB0bXAgPSAoKHNpbnQzMikocmVhZFMyKCkpKTsKLSAgcmV0dXJuIHRtcCB8ICgoKHNpbnQzMikocmVhZFMyKCkpKSA8PCAxNik7Ci19Ci0KLXVpbnQ2NCBSZWFkZXI6OnJlYWRVOCgpIHsKLSAgdWludDY0IHRtcCA9ICgodWludDY0KShyZWFkVTQoKSkpOwotICByZXR1cm4gdG1wIHwgKCgodWludDY0KShyZWFkVTQoKSkpIDw8IDMyKTsKLX0KLQotc2ludDY0IFJlYWRlcjo6cmVhZFM4KCkgewotICBzaW50NjQgdG1wID0gKChzaW50NjQpKHJlYWRTOCgpKSk7Ci0gIHJldHVybiB0bXAgfCAoKChzaW50NjQpKHJlYWRTOCgpKSkgPDwgMzIpOwotfQotCi1SZWFkZXI6OlJlYWRlcihCeXRlQ29kZSogYXJyYXksIHVpbnQzMiBzdGFydCwgdWludDMyIGVuZCkgewotICBpZiAoIWVuZCkgCi0JCWVuZCA9IGFycmF5LT5zaXplOwotCi0gIGJ5dGVzID0gYXJyYXk7Ci0gIGN1cnNvciA9IHN0YXJ0OwotICBtaW4gPSBzdGFydDsKLSAgbWF4ID0gc3RhcnQgKyBlbmQ7Ci19Ci0KLXVuc2lnbmVkIGludCBSZWFkZXI6OnRlbGwoKSB7Ci0gIHJldHVybiBjdXJzb3IgLSBtaW47Ci19Ci0KLS8vIFJlYWRlciogUmVhZGVyOjpkZXJpdmUodWludDMyIG5iYikgewotLy8gICByZXR1cm4gbmV3KGFsbG9jYXRvciwgIlJlYWRlciIpIFJlYWRlcihhbGxvY2F0b3IsIGJ5dGVzLCBjdXJzb3IsIG5iYik7Ci0vLyB9Ci0KLXZvaWQgUmVhZGVyOjpzZWVrKHVpbnQzMiBwb3MsIGludCBmcm9tKSB7Ci0gIHVpbnQzMiBuID0gMDsKLSAgdWludDMyIHN0YXJ0ID0gbWluOwotICB1aW50MzIgZW5kID0gbWF4OwotICAKLSAgaWYgKGZyb20gPT0gU2Vla0N1cikgbiA9IGN1cnNvciArIHBvczsKLSAgZWxzZSBpZiAoZnJvbSA9PSBTZWVrU2V0KSBuID0gc3RhcnQgKyBwb3M7Ci0gIGVsc2UgaWYgKGZyb20gPT0gU2Vla0VuZCkgbiA9IGVuZCArIHBvczsKLSAgCi0KLSAgaWYgKChuIDwgc3RhcnQpIHx8IChuID4gZW5kKSkKLSAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPnVua25vd25FcnJvcigib3V0IG9mIHJhbmdlICVkICVkIiwgbiwgZW5kKTsKLQotICBjdXJzb3IgPSBuOwotfQotCi12b2lkIFJlYWRlcjo6cHJpbnQobXZtOjpQcmludEJ1ZmZlciogYnVmKSBjb25zdCB7Ci0gIGJ1Zi0+d3JpdGUoIlJlYWRlcjw+Iik7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvTjMvVk1Db3JlL1JlYWRlci5oIGIvdm1raXQvbGliL04zL1ZNQ29yZS9SZWFkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI1MTU4Ni4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTjMvVk1Db3JlL1JlYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0gUmVhZGVyLmggLSBPcGVuIGFuZCByZWFkIGZpbGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4zCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2lmbmRlZiBOM19SRUFERVJfSAotI2RlZmluZSBOM19SRUFERVJfSAotCi0jaW5jbHVkZSAibXZtL09iamVjdC5oIgotCi0jaW5jbHVkZSAidHlwZXMuaCIKLQotbmFtZXNwYWNlIG4zIHsKLQotY2xhc3MgQnl0ZUNvZGUgOiBwdWJsaWMgbXZtOjpQZXJtYW5lbnRPYmplY3QgewotcHVibGljOgotCXNpbnQzMiBzaXplOwotCXVpbnQ4ICAqZWxlbWVudHM7Ci0KLQlCeXRlQ29kZShtdm06OkJ1bXBQdHJBbGxvY2F0b3IgJmFsbG9jYXRvciwgaW50IG5iYik7Ci19OwotCi1jbGFzcyBSZWFkZXIgOiBwdWJsaWMgbXZtOjpQZXJtYW5lbnRPYmplY3QgewotcHVibGljOgotICBCeXRlQ29kZSogYnl0ZXM7Ci0gIHVpbnQzMiBtaW47Ci0gIHVpbnQzMiBjdXJzb3I7Ci0gIHVpbnQzMiBtYXg7Ci0KLSAgUmVhZGVyKEJ5dGVDb2RlKiBhcnJheSwgdWludDMyIHN0YXJ0ID0gMCwgdWludDMyIGVuZCA9IDApOwotCi0gIHN0YXRpYyBkb3VibGUgcmVhZERvdWJsZShpbnQgZmlyc3QsIGludCBzZWNvbmQpOwotICBzdGF0aWMgc2ludDY0IHJlYWRMb25nKGludCBmaXJzdCwgaW50IHNlY29uZCk7Ci0KLSAgc3RhdGljIGNvbnN0IGludCBTZWVrU2V0OwotICBzdGF0aWMgY29uc3QgaW50IFNlZWtDdXI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgU2Vla0VuZDsKLQotICBzdGF0aWMgQnl0ZUNvZGUqIG9wZW5GaWxlKG12bTo6QnVtcFB0ckFsbG9jYXRvciAmYWxsb2NhdG9yLCBjaGFyKiBwYXRoKTsKLSAgdWludDggcmVhZFUxKCk7Ci0gIHNpbnQ4IHJlYWRTMSgpOwotICB1aW50MTYgcmVhZFUyKCk7Ci0gIHNpbnQxNiByZWFkUzIoKTsKLSAgdWludDMyIHJlYWRVNCgpOwotICBzaW50MzIgcmVhZFM0KCk7Ci0gIHVpbnQ2NCByZWFkVTgoKTsKLSAgc2ludDY0IHJlYWRTOCgpOwotICB1bnNpZ25lZCBpbnQgdGVsbCgpOwotCS8vICBSZWFkZXIqIGRlcml2ZSh1aW50MzIgbmJiKTsKLSAgdm9pZCBzZWVrKHVpbnQzMiBwb3MsIGludCBmcm9tKTsKLQotICB2aXJ0dWFsIHZvaWQgcHJpbnQobXZtOjpQcmludEJ1ZmZlciogYnVmKSBjb25zdDsKLX07Ci0KLXN0YXRpYyBzaW50OCBpbmxpbmUgUkVBRF9TMShCeXRlQ29kZSogYnl0ZXMsIHVpbnQzMiYgb2Zmc2V0KSB7Ci0gIHJldHVybiAoc2ludDgpKGJ5dGVzLT5lbGVtZW50c1tvZmZzZXQrK10pOwotfQotCi1zdGF0aWMgdWludDggaW5saW5lIFJFQURfVTEoQnl0ZUNvZGUqIGJ5dGVzLCB1aW50MzImIG9mZnNldCkgewotICByZXR1cm4odWludDgpKGJ5dGVzLT5lbGVtZW50c1tvZmZzZXQrK10pOwotfQotCi1zdGF0aWMgc2ludDE2IGlubGluZSBSRUFEX1MyKEJ5dGVDb2RlKiBieXRlcywgdWludDMyJiBvZmZzZXQpIHsKLSAgc2ludDE2IHZhbCA9IFJFQURfUzEoYnl0ZXMsIG9mZnNldCk7Ci0gIHJldHVybiB2YWwgfCAoUkVBRF9VMShieXRlcywgb2Zmc2V0KSA8PCA4KTsKLX0KLQotc3RhdGljIHVpbnQxNiBpbmxpbmUgUkVBRF9VMihCeXRlQ29kZSogYnl0ZXMsIHVpbnQzMiYgb2Zmc2V0KSB7Ci0gIHVpbnQxNiB2YWwgPSBSRUFEX1UxKGJ5dGVzLCBvZmZzZXQpOwotICByZXR1cm4gdmFsIHwgKFJFQURfVTEoYnl0ZXMsIG9mZnNldCkgPDwgOCk7Ci19Ci0KLXN0YXRpYyBzaW50MzIgaW5saW5lIFJFQURfUzQoQnl0ZUNvZGUqIGJ5dGVzLCB1aW50MzImIG9mZnNldCkgewotICBzaW50MzIgdmFsID0gUkVBRF9VMihieXRlcywgb2Zmc2V0KTsKLSAgcmV0dXJuIHZhbCB8IChSRUFEX1UyKGJ5dGVzLCBvZmZzZXQpIDw8IDE2KTsKLX0KLQotc3RhdGljIHVpbnQzMiBpbmxpbmUgUkVBRF9VMyhCeXRlQ29kZSogYnl0ZXMsIHVpbnQzMiYgb2Zmc2V0KSB7Ci0gIHVpbnQzMiB2YWwgPSBSRUFEX1UyKGJ5dGVzLCBvZmZzZXQpOwotICByZXR1cm4gdmFsIHwgKFJFQURfVTEoYnl0ZXMsIG9mZnNldCkgPDwgMTYpOwotfQotCi1zdGF0aWMgdWludDMyIGlubGluZSBSRUFEX1U0KEJ5dGVDb2RlKiBieXRlcywgdWludDMyJiBvZmZzZXQpIHsKLSAgcmV0dXJuIFJFQURfUzQoYnl0ZXMsIG9mZnNldCk7Ci19Ci0KLXN0YXRpYyB1aW50MzIgaW5saW5lIFJFQURfVTgoQnl0ZUNvZGUqIGJ5dGVzLCB1aW50MzImIG9mZnNldCkgewotICB1aW50NjQgdmFsMSA9IFJFQURfVTQoYnl0ZXMsIG9mZnNldCk7Ci0gIHVpbnQ2NCB2YWwyID0gUkVBRF9VNChieXRlcywgb2Zmc2V0KTsKLSAgcmV0dXJuICh2YWwyIDw8IDMyKSArIHZhbDE7Ci19Ci0KLQotfSAvLyBlbmQgbmFtZXNwYWNlIGpuanZtCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL04zL1ZNQ29yZS9TaWduYXR1cmVOYW1lcy5kZWYgYi92bWtpdC9saWIvTjMvVk1Db3JlL1NpZ25hdHVyZU5hbWVzLmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlkZmVhNS4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTjMvVk1Db3JlL1NpZ25hdHVyZU5hbWVzLmRlZgorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLSBTaWduYXR1cmVOYW1lcy5kZWYgLSBOYW1lcyBvZiBzaWduYXR1cmUgLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMwotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgU0lHTkFUVVJFX05BTUVTX0RFRgotI2RlZmluZSBTSUdOQVRVUkVfTkFNRVNfREVGCi0KLWNvbnN0IGNoYXIqIG4zOjpBc3NlbWJseTo6c2lnbmF0dXJlTmFtZXNbMHg0Nl0gPSB7Ci0gICJFbGVtZW50VHlwZUVuZCIsICAgICAgICAgICAvLyAweDAwCi0gICJFbGVtZW50VHlwZVZvaWQiLCAgICAgICAgICAvLyAweDAxCi0gICJFbGVtZW50VHlwZUJvb2xlYW4iLCAgICAgICAvLyAweDAyCi0gICJFbGVtZW50VHlwZUNoYXIiLCAgICAgICAgICAvLyAweDAzCi0gICJFbGVtZW50VHlwZUkxIiwgICAgICAgICAgICAvLyAweDA0Ci0gICJFbGVtZW50VHlwZVUxIiwgICAgICAgICAgICAvLyAweDA1Ci0gICJFbGVtZW50VHlwZUkyIiwgICAgICAgICAgICAvLyAweDA2Ci0gICJFbGVtZW50VHlwZVUyIiwgICAgICAgICAgICAvLyAweDA3Ci0gICJFbGVtZW50VHlwZUk0IiwgICAgICAgICAgICAvLyAweDA4Ci0gICJFbGVtZW50VHlwZVU0IiwgICAgICAgICAgICAvLyAweDA5Ci0gICJFbGVtZW50VHlwZUk4IiwgICAgICAgICAgICAvLyAweDBBCi0gICJFbGVtZW50VHlwZVU4IiwgICAgICAgICAgICAvLyAweDBCCi0gICJFbGVtZW50VHlwZVI0IiwgICAgICAgICAgICAvLyAweDBDCi0gICJFbGVtZW50VHlwZVI4IiwgICAgICAgICAgICAvLyAweDBECi0gICJFbGVtZW50VHlwZVN0cmluZyIsICAgICAgICAvLyAweDBFCi0gICJFbGVtZW50VHlwZVB0ciIsICAgICAgICAgICAvLyAweDFGCi0gICJFbGVtZW50VHlwZUJ5UmVmIiwgICAgICAgICAvLyAweDEwCi0gICJFbGVtZW50VHlwZVZhbHVlVHlwZSIsICAgICAvLyAweDExCi0gICJFbGVtZW50VHlwZUNsYXNzIiwgICAgICAgICAvLyAweDEyCi0gICJFbGVtZW50VHlwZVZhciIsICAgICAgICAgICAvLyAweDEzCi0gICJFbGVtZW50VHlwZUFycmF5IiwgICAgICAgICAvLyAweDE0Ci0gICJFbGVtZW50VHlwZUdlbmVyaWNJbnN0IiwgICAvLyAweDE1Ci0gICJFbGVtZW50VHlwZWRCeVJlZiIsICAgICAgICAvLyAweDE2Ci0gICJVbmRlZmluZWQgMHgxNyIsICAgICAgICAgICAvLyAweDE3Ci0gICJFbGVtZW50VHlwZUkiLCAgICAgICAgICAgICAvLyAweDE4Ci0gICJFbGVtZW50VHlwZVUiLCAgICAgICAgICAgICAvLyAweDE5Ci0gICJVbmRlZmluZWQgMHgxYSIsICAgICAgICAgICAvLyAweDFBCi0gICJFbGVtZW50VHlwZUZucHRyIiwgICAgICAgICAvLyAweDFCCi0gICJFbGVtZW50VHlwZU9iamVjdCIsICAgICAgICAvLyAweDFDCi0gICJFbGVtZW50VHlwZVN6YXJyYXkiLCAgICAgICAvLyAweDFECi0gICJFbGVtZW50VHlwZU12YXIiLCAgICAgICAgICAvLyAweDFFCi0gICJFbGVtZW50VHlwZUNtb2RSZXFkIiwgICAgICAvLyAweDFGCi0gICJFbGVtZW50VHlwZUNtb2RPcHQiLCAgICAgICAvLyAweDIwCi0gICJFbGVtZW50VHlwZUludGVybmFsIiwgICAgICAvLyAweDIxCi0gICJFbGVtZW50VHlwZU1vZGlmaWVyIiwgICAgICAvLyAweDIyCi0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDIzCi0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDI0Ci0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDI1Ci0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDI2Ci0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDI3Ci0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDI4Ci0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDI5Ci0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDJBCi0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDJCCi0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDJDCi0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDJECi0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDJFCi0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDJGCi0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDMwCi0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDMxCi0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDMyCi0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDMzCi0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDM0Ci0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDM1Ci0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDM2Ci0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDM3Ci0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDM4Ci0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDM5Ci0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDNBCi0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDNCCi0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDNDCi0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDNECi0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDNFCi0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDNGCi0gICJFbGVtZW50VHlwZVNlbnRpbmVsIiwgICAgICAvLyAweDQxCi0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDQyCi0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDQzCi0gICJVbmRlZmluZWQiLCAgICAgICAgICAgICAgICAvLyAweDQ0Ci0gICJFbGVtZW50VHlwZVBpbm5lZCIgICAgICAgICAvLyAweDQ1Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvVVRGOC5jcHAgYi92bWtpdC9saWIvTjMvVk1Db3JlL1VURjguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvVVRGOC5jcHAKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvdm1raXQvbGliL04zL1ZNQ29yZS9VVEY4LmggYi92bWtpdC9saWIvTjMvVk1Db3JlL1VURjguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFkYzhhYi4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTjMvVk1Db3JlL1VURjguaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSNpZm5kZWYgX04zX1VURjhfCi0jZGVmaW5lIF9OM19VVEY4XwotCi0jaW5jbHVkZSAibXZtL1VURjguaCIKLQotbmFtZXNwYWNlIG4zIHsKLQl1c2luZyBtdm06OlVURjg7Ci0JdXNpbmcgbXZtOjpVVEY4TWFwOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvVk1BcnJheS5jcHAgYi92bWtpdC9saWIvTjMvVk1Db3JlL1ZNQXJyYXkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjgyMzA5Li4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvVk1BcnJheS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tIFZNQXJyYXkuY3BwIC0gVk0gYXJyYXlzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjMKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJWTUFycmF5LmgiCi0jaW5jbHVkZSAiVk1DbGFzcy5oIgotI2luY2x1ZGUgIlZNT2JqZWN0LmgiCi0jaW5jbHVkZSAiVk1UaHJlYWQuaCIKLSNpbmNsdWRlICJOMy5oIgotCi0KLXVzaW5nIG5hbWVzcGFjZSBuMzsKLQotY29uc3Qgc2ludDMyIFZNQXJyYXk6Ok1heEFycmF5U2l6ZSA9IDI2ODQzNTQ1NTsKLQotI2RlZmluZSBERUZJTkVfQVJSQVlfUFJJTlQobmFtZSwgdHlwZSwgZG9fcm9vdCwgcHJpbnRlciwgcHJlLCBzZXAsIHBvc3QpIFwKLQl2b2lkIEFycmF5IyNuYW1lOjpkb19wcmludChjb25zdCBBcnJheSMjbmFtZSAqc2VsZiwgbXZtOjpQcmludEJ1ZmZlciAqYnVmKSB7IFwKLQkJbGx2bV9nY3Jvb3Qoc2VsZiwgMCk7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCSAgYnVmLT53cml0ZShwcmUpOwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCSAgZm9yKGludCBpPTA7IGk8c2VsZi0+c2l6ZTsgaSsrKSB7CQkJCQkJCQkJCQkJCQkJCQkJXAotCSAgICBpZihpKQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQkJYnVmLT53cml0ZShzZXApOwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCXR5cGUgY3VyOwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCQkJZG9fcm9vdChjdXIsIDApOwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQljdXIgPSBzZWxmLT5lbGVtZW50c1tpXTsJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQlidWYtPnByaW50ZXIoY3VyKTsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCX0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCQlidWYtPndyaXRlKHBvc3QpOwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCX0KLQotT05fVFlQRVMoREVGSU5FX0FSUkFZX1BSSU5ULCBfRl9OVFJXKQotCi0jdW5kZWYgREVGSU5FX0FSUkFZX1BSSU5UCmRpZmYgLS1naXQgYS92bWtpdC9saWIvTjMvVk1Db3JlL1ZNQXJyYXkuaCBiL3Zta2l0L2xpYi9OMy9WTUNvcmUvVk1BcnJheS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjIzNDcyLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvVk1BcnJheS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLSBWTUFycmF5LmggLSBWTSBhcnJheXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMwotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgTjNfVk1fQVJSQVlfSAotI2RlZmluZSBOM19WTV9BUlJBWV9ICi0KLSNpbmNsdWRlICJtdm0vUHJpbnRCdWZmZXIuaCIKLQotI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCi0jaW5jbHVkZSAibGx2bS9UeXBlLmgiCi0KLSNpbmNsdWRlICJ0eXBlcy5oIgotCi0jaW5jbHVkZSAiVk1PYmplY3QuaCIKLQotI2luY2x1ZGUgIlVURjguaCIKLQotbmFtZXNwYWNlIG4zIHsKLQotY2xhc3MgVk1DbGFzc0FycmF5OwotY2xhc3MgVk1Db21tb25DbGFzczsKLWNsYXNzIFZNT2JqZWN0OwotCi0JLy8gbmV2ZXIgYWxsb2NhdGUgYSBWTUFycmF5LCBpdCBpcyBqdXN0IGEgQysrIHR5cGUgdG8gYWNjZXNzIE4zIG9iamVjdAotY2xhc3MgVk1BcnJheSA6IHB1YmxpYyBWTU9iamVjdCB7Ci0Jdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBuKSB7IHJldHVybiBWTU9iamVjdDo6b3BlcmF0b3IgbmV3KG4sIDApOyB9Ci0KLXB1YmxpYzoKLSAgc2ludDMyIHNpemU7Ci0gIHZvaWQqIGVsZW1lbnRzWzFdOwotCi0gIHN0YXRpYyBjb25zdCBzaW50MzIgTWF4QXJyYXlTaXplOwotICBzdGF0aWMgY29uc3QgbGx2bTo6VHlwZSogbGx2bVR5cGU7Ci0gIHN0YXRpYyBsbHZtOjpDb25zdGFudCogc2l6ZU9mZnNldCgpOwotICBzdGF0aWMgbGx2bTo6Q29uc3RhbnQqIGVsZW1lbnRzT2Zmc2V0KCk7Ci19OwotCi0JLy8gbmV2ZXIgYWxsb2NhdGUgYSBWTUFycmF5LCBpdCBpcyBqdXN0IGEgQysrIHR5cGUgdG8gYWNjZXNzIE4zIG9iamVjdAotI2RlZmluZSBERUZJTkVfQVJSQVlfQ0xBU1MobmFtZSwgdHlwZSkJCQkJCQkJCQkJCQkJCQkJCVwKLQljbGFzcyBBcnJheSMjbmFtZSA6IHB1YmxpYyBWTU9iamVjdCB7CQkJCQkJCQkJCQkJCQkJCQlcCi0JCXZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgbikgeyByZXR1cm4gVk1PYmplY3Q6Om9wZXJhdG9yIG5ldyhuLCAwKTsgfSBcCi0JcHVibGljOgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCQlzdGF0aWMgY29uc3QgbGx2bTo6VHlwZSogbGx2bVR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJc2ludDMyIHNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCXR5cGUgZWxlbWVudHNbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlzdGF0aWMgdm9pZCBkb19wcmludChjb25zdCBBcnJheSMjbmFtZSAqc2VsZiwgbXZtOjpQcmludEJ1ZmZlciogYnVmKTsgXAotCX07Ci0KLU9OX1RZUEVTKERFRklORV9BUlJBWV9DTEFTUywgX0ZfTlQpCi0KLSN1bmRlZiBERUZJTkVfQVJSQVlfQ0xBU1MKLQotCi19IC8vIGVuZCBuYW1lc3BhY2UgbjMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92bWtpdC9saWIvTjMvVk1Db3JlL1ZNQ2FjaGUuY3BwIGIvdm1raXQvbGliL04zL1ZNQ29yZS9WTUNhY2hlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE5ODIwZi4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTjMvVk1Db3JlL1ZNQ2FjaGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8vPT09LS0tLS0tLSBWTUNhY2hlLmNwcCAtIElubGluZSBjYWNoZSBmb3IgdmlydHVhbCBjYWxscyAtLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMwotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJsbHZtL0Rlcml2ZWRUeXBlcy5oIgotI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCi0jaW5jbHVkZSAibGx2bS9MTFZNQ29udGV4dC5oIgotCi0jaW5jbHVkZSAibXZtL0pJVC5oIgotI2luY2x1ZGUgIm12bS9PYmplY3QuaCIKLSNpbmNsdWRlICJtdm0vUHJpbnRCdWZmZXIuaCIKLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9Mb2Nrcy5oIgotCi0jaW5jbHVkZSAiQXNzZW1ibHkuaCIKLSNpbmNsdWRlICJDTElKaXQuaCIKLSNpbmNsdWRlICJNU0NvcmxpYi5oIgotI2luY2x1ZGUgIk4zLmgiCi0jaW5jbHVkZSAiVk1BcnJheS5oIgotI2luY2x1ZGUgIlZNQ2FjaGUuaCIKLSNpbmNsdWRlICJWTUNsYXNzLmgiCi0jaW5jbHVkZSAiVk1UaHJlYWQuaCIKLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBuMzsKLXVzaW5nIG5hbWVzcGFjZSBsbHZtOwotCi12b2lkIENhY2hlTm9kZTo6cHJpbnQobXZtOjpQcmludEJ1ZmZlciogYnVmKSBjb25zdCB7Ci0gIGJ1Zi0+d3JpdGUoIkNhY2hlTm9kZTwiKTsKLSAgaWYgKGxhc3RDaWJsZSkgewotICAgIGxhc3RDaWJsZS0+cHJpbnQoYnVmKTsKLSAgICBidWYtPndyaXRlKCIgLS0gIik7Ci0JCWJ1Zi0+d3JpdGVQdHIobWV0aFB0cik7Ci0gIH0KLSAgYnVmLT53cml0ZSgiIGluICIpOwotICBlbnZlbG9wcGUtPnByaW50KGJ1Zik7Ci0gIGJ1Zi0+d3JpdGUoIj4iKTsKLX0KLQotdm9pZCBFbnZlbG9wcGU6OnByaW50KG12bTo6UHJpbnRCdWZmZXIqIGJ1ZikgY29uc3QgewotICBidWYtPndyaXRlKCJFbnZlbG9wcGU8PiIpOwotfQotCi1DYWNoZU5vZGUqIENhY2hlTm9kZTo6YWxsb2NhdGUobXZtOjpCdW1wUHRyQWxsb2NhdG9yICZhbGxvY2F0b3IpIHsKLSAgQ2FjaGVOb2RlKiBjYWNoZSA9IG5ldyhhbGxvY2F0b3IsICJDYWNoZU5vZGUiKSBDYWNoZU5vZGUoKTsKLSAgY2FjaGUtPmxhc3RDaWJsZSA9IDA7Ci0gIGNhY2hlLT5tZXRoUHRyID0gMDsKLSAgY2FjaGUtPm5leHQgPSAwOwotICByZXR1cm4gY2FjaGU7Ci19Ci0KLUVudmVsb3BwZSogRW52ZWxvcHBlOjphbGxvY2F0ZShtdm06OkJ1bXBQdHJBbGxvY2F0b3IgJmFsbG9jYXRvciwgVk1NZXRob2QqIG1ldGgpIHsKLSAgRW52ZWxvcHBlKiBlbnZlbG9wcGUgPSBuZXcoYWxsb2NhdG9yLCAiRW52ZWxvcHBlIikgRW52ZWxvcHBlKCk7Ci0gIGVudmVsb3BwZS0+Zmlyc3RDYWNoZSA9IENhY2hlTm9kZTo6YWxsb2NhdGUoYWxsb2NhdG9yKTsKLSAgZW52ZWxvcHBlLT5maXJzdENhY2hlLT5lbnZlbG9wcGUgPSBlbnZlbG9wcGU7Ci0gIGVudmVsb3BwZS0+Y2FjaGVMb2NrID0gbmV3IG12bTo6TG9ja05vcm1hbCgpOwotICBlbnZlbG9wcGUtPm9yaWdpbmFsTWV0aG9kID0gbWV0aDsKLSAgcmV0dXJuIGVudmVsb3BwZTsKLX0KLQotdm9pZCBDTElKaXQ6Omludm9rZUludGVyZmFjZU9yVmlydHVhbCh1aW50MzIgdmFsdWUsIFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgCi0gIFZNTWV0aG9kKiBvcmlnTWV0aCA9IGNvbXBpbGluZ0NsYXNzLT5hc3NlbWJseS0+Z2V0TWV0aG9kRnJvbVRva2VuKHZhbHVlLCBnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLSAgY29uc3QgbGx2bTo6RnVuY3Rpb25UeXBlKiBmdW5jVHlwZSA9IG9yaWdNZXRoLT5nZXRTaWduYXR1cmUoZ2VuTWV0aG9kKTsKLSAgCi0gIHN0ZDo6dmVjdG9yPFZhbHVlKj4gYXJnczsKLSAgbWFrZUFyZ3MoZnVuY1R5cGUsIGFyZ3MsIG9yaWdNZXRoLT5zdHJ1Y3RSZXR1cm4pOwotCi0gIEJhc2ljQmxvY2sqIGNhbGxCbG9jayA9IGNyZWF0ZUJhc2ljQmxvY2soImNhbGwgdmlydHVhbCBpbnZva2UiKTsKLSAgUEhJTm9kZSogbm9kZSA9IFBISU5vZGU6OkNyZWF0ZShDYWNoZU5vZGU6Omxsdm1UeXBlLCAiIiwgY2FsbEJsb2NrKTsKLSAgCi0gIFZhbHVlKiBhcmdPYmogPSBhcmdzWzBdOwotICBpZiAoYXJnT2JqLT5nZXRUeXBlKCkgIT0gVk1PYmplY3Q6Omxsdm1UeXBlKSB7Ci0gICAgYXJnT2JqID0gbmV3IEJpdENhc3RJbnN0KGFyZ09iaiwgVk1PYmplY3Q6Omxsdm1UeXBlLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgfQotICBKSVRWZXJpZnlOdWxsKGFyZ09iaik7Ci0KLSAgLy8gb2sgbm93IHRoZSBjYWNoZQotICBFbnZlbG9wcGUqIGVudmVsb3BwZSA9IEVudmVsb3BwZTo6YWxsb2NhdGUob3JpZ01ldGgtPmNsYXNzRGVmLT5hc3NlbWJseS0+YWxsb2NhdG9yLCBvcmlnTWV0aCk7Ci0gIGNvbXBpbGluZ01ldGhvZC0+Y2FjaGVzLnB1c2hfYmFjayhlbnZlbG9wcGUpOwotICAKLSAgVmFsdWUqIHplcm8gPSBtb2R1bGUtPmNvbnN0YW50WmVybzsKLSAgVmFsdWUqIG9uZSA9IG1vZHVsZS0+Y29uc3RhbnRPbmU7Ci0gIFZhbHVlKiB0d28gPSBtb2R1bGUtPmNvbnN0YW50VHdvOwotICBWYWx1ZSogZml2ZSA9IG1vZHVsZS0+Y29uc3RhbnRGaXZlOwotICAKLSAgVmFsdWUqIGxsdm1FbnYgPSAKLSAgICBDb25zdGFudEV4cHI6OmdldEludFRvUHRyKENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50NjRUeShnZXRHbG9iYWxDb250ZXh0KCkpLCB1aW50NjRfdCAoZW52ZWxvcHBlKSksCi0gICAgICAgICAgICAgICAgICBFbnZlbG9wcGU6Omxsdm1UeXBlKTsKLSAgCi0gIHN0ZDo6dmVjdG9yPFZhbHVlKj4gYXJnczE7Ci0gIGFyZ3MxLnB1c2hfYmFjayh6ZXJvKTsKLSAgYXJnczEucHVzaF9iYWNrKG9uZSk7Ci0gIFZhbHVlKiBjYWNoZVB0ciA9IEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUobGx2bUVudiwgYXJnczEuYmVnaW4oKSwgYXJnczEuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgY3VycmVudEJsb2NrKTsKLSAgVmFsdWUqIGNhY2hlID0gbmV3IExvYWRJbnN0KGNhY2hlUHRyLCAiIiwgY3VycmVudEJsb2NrKTsKLQotICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IGFyZ3MyOwotICBhcmdzMi5wdXNoX2JhY2soemVybyk7Ci0gIGFyZ3MyLnB1c2hfYmFjayhWTU9iamVjdDo6Y2xhc3NPZmZzZXQoKSk7Ci0gIFZhbHVlKiBjbGFzc1B0ciA9IEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUoYXJnT2JqLCBhcmdzMi5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnczIuZW5kKCksICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrKTsKLQotICBWYWx1ZSogY2wgPSBuZXcgTG9hZEluc3QoY2xhc3NQdHIsICIiLCBjdXJyZW50QmxvY2spOwotICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IGFyZ3MzOwotICBhcmdzMy5wdXNoX2JhY2soemVybyk7Ci0gIGFyZ3MzLnB1c2hfYmFjayh0d28pOwotICBWYWx1ZSogbGFzdENpYmxlUHRyID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShjYWNoZSwgYXJnczMuYmVnaW4oKSwgYXJnczMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIFZhbHVlKiBsYXN0Q2libGUgPSBuZXcgTG9hZEluc3QobGFzdENpYmxlUHRyLCAiIiwgY3VycmVudEJsb2NrKTsKLQotICBWYWx1ZSogY21wID0gbmV3IElDbXBJbnN0KCpjdXJyZW50QmxvY2ssIElDbXBJbnN0OjpJQ01QX0VRLCBjbCwgbGFzdENpYmxlLCAiIik7Ci0gIAotICBCYXNpY0Jsb2NrKiBpZkZhbHNlID0gY3JlYXRlQmFzaWNCbG9jaygiY2FjaGUgbm90IG9rIik7Ci0gIEJyYW5jaEluc3Q6OkNyZWF0ZShjYWxsQmxvY2ssIGlmRmFsc2UsIGNtcCwgY3VycmVudEJsb2NrKTsKLSAgbm9kZS0+YWRkSW5jb21pbmcoY2FjaGUsIGN1cnJlbnRCbG9jayk7Ci0gIAotICBjdXJyZW50QmxvY2sgPSBpZkZhbHNlOwotICBWYWx1ZSogbmV3Q2FjaGUgPSBpbnZva2UodmlydHVhbExvb2t1cExMVk0sIGNhY2hlLCBhcmdPYmosICIiLCBpZkZhbHNlLCBmYWxzZSk7Ci0gIG5vZGUtPmFkZEluY29taW5nKG5ld0NhY2hlLCBjdXJyZW50QmxvY2spOwotICBCcmFuY2hJbnN0OjpDcmVhdGUoY2FsbEJsb2NrLCBjdXJyZW50QmxvY2spOwotCi0gIGN1cnJlbnRCbG9jayA9IGNhbGxCbG9jazsKLSAgVmFsdWUqIG1ldGhQdHIgPSBHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlKG5vZGUsIGFyZ3MxLmJlZ2luKCksIGFyZ3MxLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgY3VycmVudEJsb2NrKTsKLQotICBWYWx1ZSogX21ldGggPSBuZXcgTG9hZEluc3QobWV0aFB0ciwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIFZhbHVlKiBtZXRoID0gbmV3IEJpdENhc3RJbnN0KF9tZXRoLCBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKGZ1bmNUeXBlKSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIAotCi0gIAotICBzdGQ6OnZlY3RvcjxWYWx1ZSo+IGFyZ3M0OwotICBhcmdzNC5wdXNoX2JhY2soemVybyk7Ci0gIGFyZ3M0LnB1c2hfYmFjayhmaXZlKTsKLSAgVmFsdWUqIGJveGVkcHRyID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShub2RlLCBhcmdzNC5iZWdpbigpLCBhcmdzNC5lbmQoKSwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIFZhbHVlKiBib3hlZCA9IG5ldyBMb2FkSW5zdChib3hlZHB0ciwgIiIsIGN1cnJlbnRCbG9jayk7Ci0gIC8qIEkgcHV0IFZNQXJyYXk6Omxsdm1UeXBlIGhlcmUsIGJ1dCBpbiBzaG91bGQgYmUgc29tZXRoaW5nIGVsc2UuLi4gKi8KLSAgVmFsdWUqIHVuYm94ZWQgPSBuZXcgQml0Q2FzdEluc3QoYXJnc1swXSwgVk1BcnJheTo6bGx2bVR5cGUsICIiLCBjdXJyZW50QmxvY2spOwotICBWYWx1ZSogdW5ib3hlZHB0ciA9IEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUodW5ib3hlZCwgYXJnczEuYmVnaW4oKSwgYXJnczEuZW5kKCksICIiLCBjdXJyZW50QmxvY2spOwotICBWYWx1ZSogZmFrZXVuYm94ZWRwdHIgPSBuZXcgQml0Q2FzdEluc3QodW5ib3hlZHB0ciwgYXJnc1swXS0+Z2V0VHlwZSgpLCAiIiwgY3VycmVudEJsb2NrKTsKLSAgYXJnc1swXSA9IFNlbGVjdEluc3Q6OkNyZWF0ZShib3hlZCwgZmFrZXVuYm94ZWRwdHIsIGFyZ3NbMF0sICIiLCBjdXJyZW50QmxvY2spOwotICAKLQotICBWYWx1ZSogcmV0ID0gaW52b2tlKG1ldGgsIGFyZ3MsICIiLCBjdXJyZW50QmxvY2ssIG9yaWdNZXRoLT5zdHJ1Y3RSZXR1cm4pOwotCi0KLSAgaWYgKHJldC0+Z2V0VHlwZSgpICE9IFR5cGU6OmdldFZvaWRUeShnZXRHbG9iYWxDb250ZXh0KCkpKSB7Ci0gICAgcHVzaChyZXQpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvTjMvVk1Db3JlL1ZNQ2FjaGUuaCBiL3Zta2l0L2xpYi9OMy9WTUNvcmUvVk1DYWNoZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2U2OGQ5Li4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvVk1DYWNoZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy89PT0tLS0tLS0tLS0gVk1DYWNoZS5oIC0gSW5saW5lIGNhY2hlIGZvciB2aXJ0dWFsIGNhbGxzIC0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4zCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2lmbmRlZiBOM19WTV9DQUNIRV9ICi0jZGVmaW5lIE4zX1ZNX0NBQ0hFX0gKLQotI2luY2x1ZGUgIm12bS9PYmplY3QuaCIKLSNpbmNsdWRlICJtdm0vUHJpbnRCdWZmZXIuaCIKLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9Mb2Nrcy5oIgotCi0jaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLW5hbWVzcGFjZSBuMyB7Ci0KLWNsYXNzIEFzc2VtYmx5OwotY2xhc3MgRW52ZWxvcHBlOwotY2xhc3MgVk1DbGFzczsKLQotY2xhc3MgQ2FjaGVOb2RlIDogcHVibGljIG12bTo6UGVybWFuZW50T2JqZWN0IHsKLXB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIHByaW50KG12bTo6UHJpbnRCdWZmZXIqIGJ1ZikgY29uc3Q7Ci0KLSAgdm9pZCogbWV0aFB0cjsKLSAgVk1DbGFzcyogbGFzdENpYmxlOwotICBDYWNoZU5vZGUqIG5leHQ7Ci0gIEVudmVsb3BwZSogZW52ZWxvcHBlOwotICBib29sIGJveDsKLSAgCi0gIHN0YXRpYyBjb25zdCBsbHZtOjpUeXBlKiBsbHZtVHlwZTsKLQotICBzdGF0aWMgQ2FjaGVOb2RlKiBhbGxvY2F0ZShtdm06OkJ1bXBQdHJBbGxvY2F0b3IgJmFsbG9jYXRvcik7Ci19OwotCi1jbGFzcyBFbnZlbG9wcGUgOiBwdWJsaWMgbXZtOjpQZXJtYW5lbnRPYmplY3QgewotcHVibGljOgotICB2aXJ0dWFsIHZvaWQgcHJpbnQobXZtOjpQcmludEJ1ZmZlciogYnVmKSBjb25zdDsKLSAgCi0gIENhY2hlTm9kZSAqZmlyc3RDYWNoZTsKLSAgbXZtOjpMb2NrKiBjYWNoZUxvY2s7Ci0gIFZNTWV0aG9kKiBvcmlnaW5hbE1ldGhvZDsKLQotICBzdGF0aWMgY29uc3QgbGx2bTo6VHlwZSogbGx2bVR5cGU7Ci0KLSAgc3RhdGljIEVudmVsb3BwZSogYWxsb2NhdGUobXZtOjpCdW1wUHRyQWxsb2NhdG9yICZhbGxvY2F0b3IsIFZNTWV0aG9kKiBvcmlnKTsKLQotfTsKLQotfSAvLyBlbmQgbmFtZXNwYWNlIG4zCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL04zL1ZNQ29yZS9WTUNsYXNzLmNwcCBiL3Zta2l0L2xpYi9OMy9WTUNvcmUvVk1DbGFzcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxN2YxYzkuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL04zL1ZNQ29yZS9WTUNsYXNzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDkwMiArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLSBWTUNsYXNzLmNwcCAtIENMSSBjbGFzcyByZXByZXNlbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjMKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAibGx2bS9EZXJpdmVkVHlwZXMuaCIKLSNpbmNsdWRlICJsbHZtL0xMVk1Db250ZXh0LmgiCi0jaW5jbHVkZSAibGx2bS9Nb2R1bGUuaCIKLQotI2luY2x1ZGUgIk4zRGVidWcuaCIKLSNpbmNsdWRlICJ0eXBlcy5oIgotI2luY2x1ZGUgIm12bS9KSVQuaCIKLSNpbmNsdWRlICJtdm0vUHJpbnRCdWZmZXIuaCIKLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9Mb2Nrcy5oIgotCi0KLSNpbmNsdWRlICJBc3NlbWJseS5oIgotI2luY2x1ZGUgIkNMSUFjY2Vzcy5oIgotI2luY2x1ZGUgIkNMSUppdC5oIgotI2luY2x1ZGUgIk1TQ29ybGliLmgiCi0jaW5jbHVkZSAiTjMuaCIKLSNpbmNsdWRlICJWTUFycmF5LmgiCi0jaW5jbHVkZSAiVk1DbGFzcy5oIgotI2luY2x1ZGUgIlZNVGhyZWFkLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBuMzsKLQotdm9pZCBWTUNvbW1vbkNsYXNzOjpwcmludChtdm06OlByaW50QnVmZmVyKiBidWYpIGNvbnN0IHsKLSAgYnVmLT53cml0ZSgiQ0xJVHlwZTwiKTsKLSAgbmFtZVNwYWNlLT5wcmludChidWYpOwotICBidWYtPndyaXRlKCI6OiIpOwotICBuYW1lLT5wcmludChidWYpOwotICBidWYtPndyaXRlKCI+Iik7Ci19Ci0KLXZvaWQgVk1Db21tb25DbGFzczo6YXF1aXJlKCkgewotICBsb2NrVmFyLT5sb2NrKCk7IAotfQotCi12b2lkIFZNQ29tbW9uQ2xhc3M6OnJlbGVhc2UoKSB7Ci0gIGxvY2tWYXItPnVubG9jaygpOwotfQotCi12b2lkIFZNQ29tbW9uQ2xhc3M6OndhaXRDbGFzcygpIHsKLSAgY29uZFZhci0+d2FpdChsb2NrVmFyKTsKLX0KLQotdm9pZCBWTUNvbW1vbkNsYXNzOjpicm9hZGNhc3RDbGFzcygpIHsKLSAgY29uZFZhci0+YnJvYWRjYXN0KCk7Ci19Ci0KLWJvb2wgVk1Db21tb25DbGFzczo6b3duZXJDbGFzcygpIHsKLSAgcmV0dXJuIGxvY2tWYXItPnNlbGZPd25lcigpOwotfQotCi0KLXZvaWQgVk1DbGFzczo6cHJpbnQobXZtOjpQcmludEJ1ZmZlciogYnVmKSBjb25zdCB7Ci0gIGJ1Zi0+d3JpdGUoIkNMSVR5cGU8Iik7Ci0gIG5hbWVTcGFjZS0+cHJpbnQoYnVmKTsKLSAgYnVmLT53cml0ZSgiOjoiKTsKLSAgbmFtZS0+cHJpbnQoYnVmKTsKLSAgYnVmLT53cml0ZSgiPiIpOwotfQotCi12b2lkIFZNQ2xhc3NBcnJheTo6cHJpbnQobXZtOjpQcmludEJ1ZmZlciogYnVmKSBjb25zdCB7Ci0gIGJ1Zi0+d3JpdGUoIkNMSVR5cGVBcnJheTwiKTsKLSAgbmFtZVNwYWNlLT5wcmludChidWYpOwotICBidWYtPndyaXRlKCI6OiIpOwotICBuYW1lLT5wcmludChidWYpOwotICBidWYtPndyaXRlKCI+Iik7Ci19Ci0KLXZvaWQgVk1DbGFzc1BvaW50ZXI6OnByaW50KG12bTo6UHJpbnRCdWZmZXIqIGJ1ZikgY29uc3QgewotICBidWYtPndyaXRlKCJDTElUeXBlUG9pbnRlcjwiKTsKLSAgbmFtZVNwYWNlLT5wcmludChidWYpOwotICBidWYtPndyaXRlKCI6OiIpOwotICBuYW1lLT5wcmludChidWYpOwotICBidWYtPndyaXRlKCI+Iik7Ci19Ci0KLXZvaWQgVk1NZXRob2Q6OnByaW50KG12bTo6UHJpbnRCdWZmZXIqIGJ1ZikgY29uc3QgewotICBidWYtPndyaXRlKCJDTElNZXRob2Q8Iik7Ci0gIGNsYXNzRGVmLT5uYW1lU3BhY2UtPnByaW50KGJ1Zik7Ci0gIGJ1Zi0+d3JpdGUoIi4iKTsKLSAgY2xhc3NEZWYtPm5hbWUtPnByaW50KGJ1Zik7Ci0gIGJ1Zi0+d3JpdGUoIjo6Iik7Ci0gIG5hbWUtPnByaW50KGJ1Zik7Ci0gIGJ1Zi0+d3JpdGUoIigiKTsKLSAgc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+OjppdGVyYXRvciBpID0gKChWTU1ldGhvZCopdGhpcyktPnBhcmFtZXRlcnMuYmVnaW4oKTsKLSAgc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+OjppdGVyYXRvciBlID0gKChWTU1ldGhvZCopdGhpcyktPnBhcmFtZXRlcnMuZW5kKCk7Ci0KLSAgKytpOwotICBpZiAoaSAhPSBlKSB7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICgqaSktPm5hbWVTcGFjZS0+cHJpbnQoYnVmKTsKLSAgICAgIGJ1Zi0+d3JpdGUoIi4iKTsKLSAgICAgICgqaSktPm5hbWUtPnByaW50KGJ1Zik7Ci0gICAgICArK2k7Ci0gICAgICBpZiAoaSA9PSBlKSBicmVhazsKLSAgICAgIGVsc2UgYnVmLT53cml0ZSgiICwiKTsKLSAgICB9Ci0gIH0KLSAgYnVmLT53cml0ZSgiKSIpOwotICBidWYtPndyaXRlKCI+Iik7Ci19Ci0KLXZvaWQgVk1HZW5lcmljTWV0aG9kOjpwcmludChtdm06OlByaW50QnVmZmVyKiBidWYpIGNvbnN0IHsKLSAgYnVmLT53cml0ZSgiQ0xJR2VuZXJpY01ldGhvZDwiKTsKLSAgY2xhc3NEZWYtPm5hbWVTcGFjZS0+cHJpbnQoYnVmKTsKLSAgYnVmLT53cml0ZSgiLiIpOwotICBjbGFzc0RlZi0+bmFtZS0+cHJpbnQoYnVmKTsKLSAgYnVmLT53cml0ZSgiOjoiKTsKLSAgbmFtZS0+cHJpbnQoYnVmKTsKLSAgYnVmLT53cml0ZSgiKCIpOwotICBzdGQ6OnZlY3RvcjxWTUNvbW1vbkNsYXNzKj46Oml0ZXJhdG9yIGkgPSAoKFZNTWV0aG9kKil0aGlzKS0+cGFyYW1ldGVycy5iZWdpbigpOwotICBzdGQ6OnZlY3RvcjxWTUNvbW1vbkNsYXNzKj46Oml0ZXJhdG9yIGUgPSAoKFZNTWV0aG9kKil0aGlzKS0+cGFyYW1ldGVycy5lbmQoKTsKLQotICArK2k7Ci0gIGlmIChpICE9IGUpIHsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgKCppKS0+bmFtZVNwYWNlLT5wcmludChidWYpOwotICAgICAgYnVmLT53cml0ZSgiLiIpOwotICAgICAgKCppKS0+bmFtZS0+cHJpbnQoYnVmKTsKLSAgICAgICsraTsKLSAgICAgIGlmIChpID09IGUpIGJyZWFrOwotICAgICAgZWxzZSBidWYtPndyaXRlKCIgLCIpOwotICAgIH0KLSAgfQotICBidWYtPndyaXRlKCIpIik7Ci0gIGJ1Zi0+d3JpdGUoIj4iKTsKLX0KLQotdm9pZCBWTUZpZWxkOjpwcmludChtdm06OlByaW50QnVmZmVyKiBidWYpIGNvbnN0IHsKLSAgYnVmLT53cml0ZSgiQ0xJRmllbGQ8Iik7Ci0gIGNsYXNzRGVmLT5uYW1lU3BhY2UtPnByaW50KGJ1Zik7Ci0gIGJ1Zi0+d3JpdGUoIi4iKTsKLSAgY2xhc3NEZWYtPm5hbWUtPnByaW50KGJ1Zik7Ci0gIGJ1Zi0+d3JpdGUoIjo6Iik7Ci0gIG5hbWUtPnByaW50KGJ1Zik7Ci0gIGJ1Zi0+d3JpdGUoIj4iKTsKLX0KLSAgCi12b2lkIFBhcmFtOjpwcmludChtdm06OlByaW50QnVmZmVyKiBidWYpIGNvbnN0IHsKLSAgYnVmLT53cml0ZSgiQ0xJUGFyYW08Iik7Ci0gIG5hbWUtPnByaW50KGJ1Zik7Ci0gIGJ1Zi0+d3JpdGUoIj4iKTsKLX0KLQotdm9pZCBQcm9wZXJ0eTo6cHJpbnQobXZtOjpQcmludEJ1ZmZlciogYnVmKSBjb25zdCB7Ci0gIGJ1Zi0+d3JpdGUoIlByb3BlcnR5IGRlZiB3aXRoIG5hbWUgPCIpOwotICBuYW1lLT5wcmludChidWYpOwotICBidWYtPndyaXRlKCI+Iik7Ci19Ci0KLQotdm9pZCBWTUNvbW1vbkNsYXNzOjppbml0aWFsaXNlKE4zKiB2bSwgYm9vbCBpc0FycmF5KSB7Ci0gIHRoaXMtPmxvY2tWYXIgPSBuZXcgbXZtOjpMb2NrUmVjdXJzaXZlKCk7Ci0gIHRoaXMtPmNvbmRWYXIgPSBuZXcgbXZtOjpDb25kKCk7Ci0gIHRoaXMtPm9vb19kZWxlZ2F0ZWUgPSAwOwotICB0aGlzLT5zdGF0dXMgPSBoYXNoZWQ7Ci0gIHRoaXMtPnZtID0gdm07Ci0gIHRoaXMtPmlzQXJyYXkgPSBpc0FycmF5OwotICB0aGlzLT5pc1BvaW50ZXIgPSBmYWxzZTsKLSAgdGhpcy0+aXNQcmltaXRpdmUgPSBmYWxzZTsKLSAgdGhpcy0+bmF0dXJhbFR5cGUgPSBsbHZtOjpPcGFxdWVUeXBlOjpnZXQobGx2bTo6Z2V0R2xvYmFsQ29udGV4dCgpKTsKLX0KLQotY29uc3QgVVRGOCogVk1DbGFzc0FycmF5Ojpjb25zdHJ1Y3RBcnJheU5hbWUoY29uc3QgVVRGOCogbmFtZSwgdWludDMyIGRpbXMpIHsKLQltdm06OlByaW50QnVmZmVyIF9hc2NpaXoobmFtZSk7Ci0gIGNvbnN0IGNoYXIqIGFzY2lpeiA9IF9hc2NpaXouY1N0cmluZygpOwotICBjaGFyKiByZXMgPSAoY2hhciopYWxsb2NhKHN0cmxlbihhc2NpaXopICsgKGRpbXMgKiAyKSArIDEpOwotICBzcHJpbnRmKHJlcywgYXNjaWl6KTsKLQotICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IGRpbXM7ICsraSkgewotICAgIHNwcmludGYocmVzLCAiJXNbXSIsIHJlcyk7Ci0gIH0KLQotICByZXR1cm4gVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5hc2NpaXpUb1VURjgocmVzKTsKLX0KLQotY29uc3QgVVRGOCogVk1DbGFzc1BvaW50ZXI6OmNvbnN0cnVjdFBvaW50ZXJOYW1lKGNvbnN0IFVURjgqIG5hbWUsIHVpbnQzMiBkaW1zKSB7Ci0JbXZtOjpQcmludEJ1ZmZlciBfYXNjaWl6KG5hbWUpOwotICBjb25zdCBjaGFyKiBhc2NpaXogPSBfYXNjaWl6LmNTdHJpbmcoKTsKLSAgY2hhciogcmVzID0gKGNoYXIqKWFsbG9jYShzdHJsZW4oYXNjaWl6KSArIChkaW1zICogMikgKyAxKTsKLSAgc3ByaW50ZihyZXMsIGFzY2lpeik7Ci0KLSAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBkaW1zOyArK2kpIHsKLSAgICBzcHJpbnRmKHJlcywgIiVzKiIsIHJlcyk7Ci0gIH0KLQotICByZXR1cm4gVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5hc2NpaXpUb1VURjgocmVzKTsKLX0KLQotCi12b2lkIFZNQ29tbW9uQ2xhc3M6OmxvYWRQYXJlbnRzKFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgaWYgKCgweGZmZmYgJiBzdXBlclRva2VuKSA9PSAwKSB7Ci0gICAgZGVwdGggPSAwOwotICAgIGRpc3BsYXkucHVzaF9iYWNrKHRoaXMpOwotICB9IGVsc2UgewotICAgIHN1cGVyID0gYXNzZW1ibHktPmxvYWRUeXBlKChOMyopdm0sIHN1cGVyVG9rZW4sIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZ2VuQ2xhc3MsIGdlbk1ldGhvZCk7Ci0gICAgZGVwdGggPSBzdXBlci0+ZGVwdGggKyAxOwotICAgIGZvciAodWludDMyIGkgPSAwOyBpIDwgc3VwZXItPmRpc3BsYXkuc2l6ZSgpOyArK2kpIHsKLSAgICAgIGRpc3BsYXkucHVzaF9iYWNrKHN1cGVyLT5kaXNwbGF5W2ldKTsKLSAgICB9Ci0gICAgZGlzcGxheS5wdXNoX2JhY2sodGhpcyk7Ci0gIH0KLSAgCi0gIGZvciAoc3RkOjp2ZWN0b3I8dWludDMyPjo6aXRlcmF0b3IgaSA9IGludGVyZmFjZXNUb2tlbi5iZWdpbigpLCAKLSAgICAgICBlID0gaW50ZXJmYWNlc1Rva2VuLmVuZCgpOyBpIT0gZTsgKytpKSB7Ci0gICAgaW50ZXJmYWNlcy5wdXNoX2JhY2soKFZNQ2xhc3MqKWFzc2VtYmx5LT5sb2FkVHlwZSgoTjMqKXZtLCAoKmkpLCB0cnVlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZ2VuQ2xhc3MsIGdlbk1ldGhvZCkpOwotICB9Ci0KLX0KLQotdHlwZWRlZiB2b2lkICgqY2xpbml0X3QpKHZvaWQpOwotCi12b2lkIFZNQ29tbW9uQ2xhc3M6OmNsaW5pdENsYXNzKFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKSB7Ci0JLy8JcHJpbnRmKCItLS0tLSBjbGluaXQ6ICVzXG4iLCBtdm06OlByaW50QnVmZmVyOjpvYmplY3RUb1N0cmluZyh0aGlzKSk7Ci0gIFZNQ29tbW9uQ2xhc3MqIGNsID0gdGhpczsgCi0gIGlmIChjbC0+c3RhdHVzIDwgcmVhZHkpIHsKLSAgICBjbC0+YXF1aXJlKCk7Ci0gICAgaW50IHN0YXR1cyA9IGNsLT5zdGF0dXM7Ci0gICAgaWYgKHN0YXR1cyA9PSByZWFkeSkgewotICAgICAgY2wtPnJlbGVhc2UoKTsKLSAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBzdGF0aWNfcmVzb2x2ZWQpIHsKLSAgICAgIGNsLT5zdGF0dXMgPSBjbGluaXRQYXJlbnQ7Ci0gICAgICBjbC0+cmVsZWFzZSgpOwotICAgICAgaWYgKGNsLT5zdXBlcikgewotICAgICAgICBjbC0+c3VwZXItPnJlc29sdmVTdGF0aWModHJ1ZSwgZ2VuTWV0aG9kKTsKLSAgICAgIH0KLSAgICAgIGZvciAodWludDMyIGkgPSAwOyBpIDwgY2wtPmludGVyZmFjZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY2wtPmludGVyZmFjZXNbaV0tPnJlc29sdmVTdGF0aWModHJ1ZSwgZ2VuTWV0aG9kKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2wtPnN0YXR1cyA9IGluQ2xpbml0OwotICAgICAgcmVzb2x2ZVZUKCk7Ci0gICAgICBzdGQ6OnZlY3RvcjxWTUNvbW1vbkNsYXNzKj4gYXJnczsKLSAgICAgIGFyZ3MucHVzaF9iYWNrKE1TQ29ybGliOjpwVm9pZCk7Ci0gICAgICBWTU1ldGhvZCogbWV0aCA9IGNsLT5sb29rdXBNZXRob2REb250VGhyb3coTjM6OmNsaW5pdE5hbWUsIGFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZmFsc2UpOwotICAgICAgCi0gICAgICBQUklOVF9ERUJVRyhOM19MT0FELCAwLCBDT0xPUl9OT1JNQUwsICIlcyIsICI7ICIpOwotICAgICAgUFJJTlRfREVCVUcoTjNfTE9BRCwgMCwgTElHSFRfR1JFRU4sICIlcyIsICJjbGluaXQgIik7Ci0gICAgICBQUklOVF9ERUJVRyhOM19MT0FELCAwLCBDT0xPUl9OT1JNQUwsICIlczo6JXNcbiIsIG12bTo6UHJpbnRCdWZmZXIodGhpcykuY1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgbXZtOjpQcmludEJ1ZmZlcihjbCkuY1N0cmluZygpKTsKLSAgICAgIAotICAgICAgaWYgKG1ldGgpIHsKLSAgICAgICAgbGx2bTo6RnVuY3Rpb24qIHByZWQgPSBtZXRoLT5jb21waWxlZFB0cihnZW5NZXRob2QpOwotICAgICAgICBjbGluaXRfdCByZXMgPSAoY2xpbml0X3QpCi0gICAgICAgICAgKGludHB0cl90KW12bTo6TXZtTW9kdWxlOjpleGVjdXRpb25FbmdpbmUtPmdldFBvaW50ZXJUb0dsb2JhbChwcmVkKTsKLSAgICAgICAgcmVzKCk7Ci0gICAgICB9Ci0KLSAgICAgIGNsLT5zdGF0dXMgPSByZWFkeTsKLSAgICAgIGNsLT5icm9hZGNhc3RDbGFzcygpOwotICAgIH0gZWxzZSBpZiAoc3RhdHVzIDwgc3RhdGljX3Jlc29sdmVkKSB7Ci0gICAgICBjbC0+cmVsZWFzZSgpOwotICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT51bmtub3duRXJyb3IoInRyeSB0byBjbGluaXQgYSBub3QtcmVhZGVkIGNsYXNzLi4uIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICghY2wtPm93bmVyQ2xhc3MoKSkgewotICAgICAgICB3aGlsZSAoc3RhdHVzIDwgcmVhZHkpIGNsLT53YWl0Q2xhc3MoKTsKLSAgICAgIH0gCi0gICAgICBjbC0+cmVsZWFzZSgpOwotICAgIH0KLSAgfQotfQotCi12b2lkIFZNQ2xhc3M6OnJlc29sdmVTdGF0aWNGaWVsZHMoVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgCi0gIFZNQ2xhc3MqIGNsID0gdGhpczsKLQotICBzdGQ6OnZlY3Rvcjxjb25zdCBsbHZtOjpUeXBlKj4gZmllbGRzOwotICBmaWVsZHMucHVzaF9iYWNrKFZNT2JqZWN0OjpsbHZtVHlwZS0+Z2V0Q29udGFpbmVkVHlwZSgwKSk7Ci0gIHVpbnQ2NCBvZmZzZXQgPSAwOwotICBmb3IgKHN0ZDo6dmVjdG9yPFZNRmllbGQqPjo6aXRlcmF0b3IgaSA9IGNsLT5zdGF0aWNGaWVsZHMuYmVnaW4oKSwKLSAgICAgICAgICAgIGUgPSBjbC0+c3RhdGljRmllbGRzLmVuZCgpOyBpIT0gZTsgKytpKSB7Ci0gICAgLy8gcHJlaW5jcmVtZW50IGJlY2F1c2UgMCBpcyBWTU9iamVjdAotICAgICgqaSktPm9mZnNldCA9IGxsdm06OkNvbnN0YW50SW50OjpnZXQobGx2bTo6VHlwZTo6Z2V0SW50MzJUeShsbHZtOjpnZXRHbG9iYWxDb250ZXh0KCkpLCArK29mZnNldCk7Ci0gIH0KLSAgZm9yIChzdGQ6OnZlY3RvcjxWTUZpZWxkKj46Oml0ZXJhdG9yIGkgPSBjbC0+c3RhdGljRmllbGRzLmJlZ2luKCksCi0gICAgICAgICAgICBlID0gY2wtPnN0YXRpY0ZpZWxkcy5lbmQoKTsgaSE9IGU7ICsraSkgewotICAgICgqaSktPnNpZ25hdHVyZS0+cmVzb2x2ZVR5cGUoZmFsc2UsIGZhbHNlLCBnZW5NZXRob2QpOwotICAgIGZpZWxkcy5wdXNoX2JhY2soKCppKS0+c2lnbmF0dXJlLT5uYXR1cmFsVHlwZSk7Ci0gIH0KLQotICBjbC0+c3RhdGljVHlwZSA9IGxsdm06OlBvaW50ZXJUeXBlOjpnZXRVbnF1YWwobGx2bTo6U3RydWN0VHlwZTo6Z2V0KHZtLT5MTFZNTW9kdWxlLT5nZXRDb250ZXh0KCksIGZpZWxkcywgZmFsc2UpKTsKLQotICBOM1ZpcnR1YWxUYWJsZSogVlQgPSBDTElKaXQ6Om1ha2VWVChjbCwgdHJ1ZSk7Ci0KLSAgdWludDY0IHNpemUgPSBtdm06Ok12bU1vZHVsZTo6Z2V0VHlwZVNpemUoY2wtPnN0YXRpY1R5cGUtPmdldENvbnRhaW5lZFR5cGUoMCkpOwotICBjbC0+c3RhdGljSW5zdGFuY2UgPSAoVk1PYmplY3QqKWdjOjpvcGVyYXRvciBuZXcoc2l6ZSwgVlQpOwotCVZNT2JqZWN0Ojppbml0aWFsaXNlKGNsLT5zdGF0aWNJbnN0YW5jZSwgY2wpOwotCi0gIGZvciAoc3RkOjp2ZWN0b3I8Vk1GaWVsZCo+OjppdGVyYXRvciBpID0gY2wtPnN0YXRpY0ZpZWxkcy5iZWdpbigpLAotICAgICAgICAgICAgZSA9IGNsLT5zdGF0aWNGaWVsZHMuZW5kKCk7IGkhPSBlOyArK2kpIHsKLSAgICAKLSAgICAoKmkpLT5pbml0RmllbGQoY2wtPnN0YXRpY0luc3RhbmNlKTsKLSAgfQotfQotCi12b2lkIFZNQ2xhc3M6OnVuaWZ5VHlwZXMoVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCkgewotICBsbHZtOjpQQVR5cGVIb2xkZXIgUEEgPSBuYXR1cmFsVHlwZTsKLSAgZm9yIChzdGQ6OnZlY3RvcjxWTUZpZWxkKj46Oml0ZXJhdG9yIGkgPSB2aXJ0dWFsRmllbGRzLmJlZ2luKCksIAotICAgICAgIGUgPSB2aXJ0dWFsRmllbGRzLmVuZCgpOyBpIT0gZTsgKytpKSB7Ci0gICAgKCppKS0+c2lnbmF0dXJlLT5yZXNvbHZlVmlydHVhbChnZW5DbGFzcywgZ2VuTWV0aG9kKTsKLSAgfQotICBuYXR1cmFsVHlwZSA9IFBBLmdldCgpOwotfQotCi12b2lkIFZNQ2xhc3M6OnJlc29sdmVWaXJ0dWFsRmllbGRzKFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgY29uc3QgbGx2bTo6VHlwZSogUmVzdWx0VHkgPSAwOwotICBpZiAoaGFzRXhwbGljaXRMYXlvdXQoZmxhZ3MpKSB7Ci0gICAgZXhwbGljaXRMYXlvdXRTaXplID0gYXNzZW1ibHktPmdldEV4cGxpY2l0TGF5b3V0KHRva2VuKTsKLSAgICBSZXN1bHRUeSA9IGxsdm06OkludGVnZXJUeXBlOjpnZXQobGx2bTo6Z2V0R2xvYmFsQ29udGV4dCgpLCBleHBsaWNpdExheW91dFNpemUpOwotICB9IGVsc2UgaWYgKHN1cGVyICE9IDApIHsKLSAgICBpZiAoc3VwZXIgPT0gTVNDb3JsaWI6OnBWYWx1ZSkgewotICAgICAgdWludDMyIHNpemUgPSB2aXJ0dWFsRmllbGRzLnNpemUoKTsKLSAgICAgIGlmIChzaXplID09IDEpIHsKLSAgICAgICAgdmlydHVhbEZpZWxkc1swXS0+b2Zmc2V0ID0gVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5tb2R1bGUtPmNvbnN0YW50WmVybzsKLSAgICAgICAgUmVzdWx0VHkgPSB2aXJ0dWFsRmllbGRzWzBdLT5zaWduYXR1cmUtPm5hdHVyYWxUeXBlOwotICAgICAgfSBlbHNlIGlmIChzaXplID09IDApIHsKLSAgICAgICAgUmVzdWx0VHkgPSBsbHZtOjpUeXBlOjpnZXRWb2lkVHkobGx2bTo6Z2V0R2xvYmFsQ29udGV4dCgpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGxsdm06OlR5cGUqPiBFbHRzOwotICAgICAgICB1aW50MzIgb2Zmc2V0ID0gLTE7Ci0gICAgICAgIGZvciAoc3RkOjp2ZWN0b3I8Vk1GaWVsZCo+OjppdGVyYXRvciBpID0gdmlydHVhbEZpZWxkcy5iZWdpbigpLCAKLSAgICAgICAgICBlID0gdmlydHVhbEZpZWxkcy5lbmQoKTsgaSE9IGU7ICsraSkgewotICAgICAgICAgICgqaSktPm9mZnNldCA9IGxsdm06OkNvbnN0YW50SW50OjpnZXQobGx2bTo6VHlwZTo6Z2V0SW50MzJUeShsbHZtOjpnZXRHbG9iYWxDb250ZXh0KCkpLCArK29mZnNldCk7Ci0gICAgICAgICAgY29uc3QgbGx2bTo6VHlwZSogdHlwZSA9ICgqaSktPnNpZ25hdHVyZS0+bmF0dXJhbFR5cGU7Ci0gICAgICAgICAgRWx0cy5wdXNoX2JhY2sodHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgUmVzdWx0VHkgPSBsbHZtOjpTdHJ1Y3RUeXBlOjpnZXQodm0tPkxMVk1Nb2R1bGUtPmdldENvbnRleHQoKSwgRWx0cyk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChzdXBlciA9PSBNU0NvcmxpYjo6cEVudW0pIHsKLSAgICAgIFJlc3VsdFR5ID0gbGx2bTo6VHlwZTo6Z2V0SW50MzJUeShsbHZtOjpnZXRHbG9iYWxDb250ZXh0KCkpOyAvLyBUT0RPIGZpbmQgbWF4Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGxsdm06OlR5cGUqPiBFbHRzOwotICAgICAgRWx0cy5wdXNoX2JhY2soc3VwZXItPm5hdHVyYWxUeXBlLT5nZXRDb250YWluZWRUeXBlKDApKTsKLSAgICAgIHVpbnQzMiBvZmZzZXQgPSAwOwotICAgICAgZm9yIChzdGQ6OnZlY3RvcjxWTUZpZWxkKj46Oml0ZXJhdG9yIGkgPSB2aXJ0dWFsRmllbGRzLmJlZ2luKCksIAotICAgICAgICAgICBlID0gdmlydHVhbEZpZWxkcy5lbmQoKTsgaSE9IGU7ICsraSkgewotICAgICAgICAoKmkpLT5vZmZzZXQgPSBsbHZtOjpDb25zdGFudEludDo6Z2V0KGxsdm06OlR5cGU6OmdldEludDMyVHkobGx2bTo6Z2V0R2xvYmFsQ29udGV4dCgpKSwgKytvZmZzZXQpOwotICAgICAgICBjb25zdCBsbHZtOjpUeXBlKiB0eXBlID0gKCppKS0+c2lnbmF0dXJlLT5uYXR1cmFsVHlwZTsKLSAgICAgICAgRWx0cy5wdXNoX2JhY2sodHlwZSk7Ci0gICAgICB9Ci0gICAgICBSZXN1bHRUeSA9IGxsdm06OlBvaW50ZXJUeXBlOjpnZXRVbnF1YWwobGx2bTo6U3RydWN0VHlwZTo6Z2V0KHZtLT5MTFZNTW9kdWxlLT5nZXRDb250ZXh0KCksIEVsdHMpKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgUmVzdWx0VHkgPSBWTU9iamVjdDo6bGx2bVR5cGU7Ci0gIH0KLSAgCi0gIAotICBpZiAobmF0dXJhbFR5cGUtPmlzQWJzdHJhY3QoKSkgewotICAgIGNvbnN0IGxsdm06Ok9wYXF1ZVR5cGUgKk9sZFR5ID0gCi0gICAgICBsbHZtOjpkeW5fY2FzdF9vcl9udWxsPGxsdm06Ok9wYXF1ZVR5cGU+KHRoaXMtPm5hdHVyYWxUeXBlKTsKLSAgICBpZiAoT2xkVHkpIHsKLSAgICAgIGNvbnN0X2Nhc3Q8bGx2bTo6T3BhcXVlVHlwZSo+KE9sZFR5KS0+cmVmaW5lQWJzdHJhY3RUeXBlVG8oUmVzdWx0VHkpOwotICAgIH0KLSAgICBuYXR1cmFsVHlwZSA9IFJlc3VsdFR5OwotICB9Ci0gIAotICB1bmlmeVR5cGVzKGdlbkNsYXNzLCBnZW5NZXRob2QpOwotICAKLSAgaWYgKHN1cGVyID09IE1TQ29ybGliOjpwVmFsdWUpIHsKLSAgICBzdGQ6OnZlY3Rvcjxjb25zdCBsbHZtOjpUeXBlKj4gRWx0czsKLSAgICBFbHRzLnB1c2hfYmFjayhWTU9iamVjdDo6bGx2bVR5cGUtPmdldENvbnRhaW5lZFR5cGUoMCkpOwotICAgIGZvciAoc3RkOjp2ZWN0b3I8Vk1GaWVsZCo+OjppdGVyYXRvciBpID0gdmlydHVhbEZpZWxkcy5iZWdpbigpLCAKLSAgICAgICAgIGUgPSB2aXJ0dWFsRmllbGRzLmVuZCgpOyBpIT0gZTsgKytpKSB7Ci0gICAgICBFbHRzLnB1c2hfYmFjaygoKmkpLT5zaWduYXR1cmUtPm5hdHVyYWxUeXBlKTsKLSAgICB9Ci0gICAgdmlydHVhbFR5cGUgPSBsbHZtOjpQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKGxsdm06OlN0cnVjdFR5cGU6OmdldCh2bS0+TExWTU1vZHVsZS0+Z2V0Q29udGV4dCgpLCBFbHRzKSk7IAotICB9IGVsc2UgewotICAgIHZpcnR1YWxUeXBlID0gbmF0dXJhbFR5cGU7Ci0gIH0KLSAgCi0KLX0KLQotCi12b2lkIFZNQ2xhc3NBcnJheTo6bWFrZVR5cGUoKSB7Ci0gIHN0ZDo6dmVjdG9yPGNvbnN0IGxsdm06OlR5cGUqPiBhcnJheUZpZWxkczsKLSAgYXJyYXlGaWVsZHMucHVzaF9iYWNrKFZNT2JqZWN0OjpsbHZtVHlwZS0+Z2V0Q29udGFpbmVkVHlwZSgwKSk7Ci0gIGFycmF5RmllbGRzLnB1c2hfYmFjayhsbHZtOjpUeXBlOjpnZXRJbnQzMlR5KGxsdm06OmdldEdsb2JhbENvbnRleHQoKSkpOwotICBhcnJheUZpZWxkcy5wdXNoX2JhY2sobGx2bTo6QXJyYXlUeXBlOjpnZXQoYmFzZUNsYXNzLT5uYXR1cmFsVHlwZSwgMCkpOwotICBjb25zdCBsbHZtOjpUeXBlKiB0eXBlID0gbGx2bTo6UG9pbnRlclR5cGU6OmdldFVucXVhbChsbHZtOjpTdHJ1Y3RUeXBlOjpnZXQodm0tPkxMVk1Nb2R1bGUtPmdldENvbnRleHQoKSwgYXJyYXlGaWVsZHMsIGZhbHNlKSk7Ci0gICgobGx2bTo6T3BhcXVlVHlwZSopbmF0dXJhbFR5cGUpLT5yZWZpbmVBYnN0cmFjdFR5cGVUbyh0eXBlKTsKLSAgbmF0dXJhbFR5cGUgPSB0eXBlOwotICB2aXJ0dWFsVHlwZSA9IG5hdHVyYWxUeXBlOwotfQotCi12b2lkIFZNQ2xhc3NQb2ludGVyOjptYWtlVHlwZSgpIHsKLSAgY29uc3QgbGx2bTo6VHlwZSogdHlwZSA9IChiYXNlQ2xhc3MtPm5hdHVyYWxUeXBlID09IGxsdm06OlR5cGU6OmdldFZvaWRUeShsbHZtOjpnZXRHbG9iYWxDb250ZXh0KCkpKSA/IGxsdm06OlR5cGU6OmdldEludDhUeShsbHZtOjpnZXRHbG9iYWxDb250ZXh0KCkpIDogYmFzZUNsYXNzLT5uYXR1cmFsVHlwZTsKLSAgY29uc3QgbGx2bTo6VHlwZSogcFR5cGUgPSBsbHZtOjpQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKHR5cGUpOwotICAoKGxsdm06Ok9wYXF1ZVR5cGUqKW5hdHVyYWxUeXBlKS0+cmVmaW5lQWJzdHJhY3RUeXBlVG8ocFR5cGUpOwotICBuYXR1cmFsVHlwZSA9IHBUeXBlOwotfQotCi12b2lkIFZNQ29tbW9uQ2xhc3M6OnJlc29sdmVWaXJ0dWFsKFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kICpnZW5NZXRob2QpIHsKLQkvLwlwcmludGYoIlJlc29sdmUgdmlydHVhbDogJXNcbiIsIG12bTo6UHJpbnRCdWZmZXI6Om9iamVjdFRvU3RyaW5nKHRoaXMpKTsKLSAgVk1Db21tb25DbGFzcyogY2wgPSB0aGlzOwotICAKLSAgaWYgKGNsLT5zdGF0dXMgPCB2aXJ0dWFsX3Jlc29sdmVkKSB7Ci0gICAgY2wtPmFxdWlyZSgpOwotICAgIGludCBzdGF0dXMgPSBjbC0+c3RhdHVzOwotICAgIGlmIChzdGF0dXMgPj0gdmlydHVhbF9yZXNvbHZlZCkgewotICAgICAgY2wtPnJlbGVhc2UoKTsKLSAgICB9IGVsc2UgaWYgKHN0YXR1cyA8ICBsb2FkZWQpIHsKLSAgICAgIGNsLT5yZWxlYXNlKCk7Ci0gICAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPnVua25vd25FcnJvcigidHJ5IHRvIHJlc29sdmUgYSBub3QtcmVhZGVkIGNsYXNzIik7Ci0gICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gbG9hZGVkKSB7Ci0gICAgICBpZiAoY2wtPmlzQXJyYXkpIHsKLSAgICAgICAgVk1DbGFzc0FycmF5KiBhcnJheUNsID0gKFZNQ2xhc3NBcnJheSopY2w7Ci0gICAgICAgIFZNQ29tbW9uQ2xhc3MqIGJhc2VDbGFzcyA9ICBhcnJheUNsLT5iYXNlQ2xhc3M7Ci0JCQkJLy8JCQkJcHJpbnRmKCJSZXNvbHZlaW5nIGJhc2UgY2xhc3M6ICVzXG4iLCBtdm06OlByaW50QnVmZmVyOjpvYmplY3RUb1N0cmluZyhiYXNlQ2xhc3MpKTsKLSAgICAgICAgYmFzZUNsYXNzLT5yZXNvbHZlVHlwZShmYWxzZSwgZmFsc2UsIGdlbk1ldGhvZCk7Ci0JCQkJLy8gIAkJCXByaW50ZigiUmVzb2x2ZWluZyBiYXNlIGNsYXNzOiAlcyBkb25lXG4iLCBtdm06OlByaW50QnVmZmVyOjpvYmplY3RUb1N0cmluZyhiYXNlQ2xhc3MpKTsKLSAgICAgICAgYXJyYXlDbC0+bWFrZVR5cGUoKTsKLSAgICAgICAgY2wtPnN0YXR1cyA9IHZpcnR1YWxfcmVzb2x2ZWQ7Ci0gICAgICB9IGVsc2UgaWYgKGNsLT5pc1BvaW50ZXIpIHsKLSAgICAgICAgVk1DbGFzc1BvaW50ZXIqIHBvaW50ZXJDbCA9IChWTUNsYXNzUG9pbnRlciopY2w7Ci0gICAgICAgIFZNQ29tbW9uQ2xhc3MqIGJhc2VDbGFzcyA9ICBwb2ludGVyQ2wtPmJhc2VDbGFzczsKLSAgICAgICAgYmFzZUNsYXNzLT5yZXNvbHZlVHlwZShmYWxzZSwgZmFsc2UsIGdlbk1ldGhvZCk7Ci0gICAgICAgIHBvaW50ZXJDbC0+bWFrZVR5cGUoKTsKLSAgICAgICAgY2wtPnN0YXR1cyA9IHZpcnR1YWxfcmVzb2x2ZWQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjbC0+cmVsZWFzZSgpOwotICAgICAgICBjbC0+bG9hZFBhcmVudHMoZ2VuQ2xhc3MsIGdlbk1ldGhvZCk7Ci0gICAgICAgIGNsLT5hcXVpcmUoKTsKLSAgICAgICAgY2wtPnN0YXR1cyA9IHByZXBhcmVkOwotICAgICAgICBhc3NlbWJseS0+cmVhZENsYXNzKGNsLCBnZW5NZXRob2QpOwotICAgICAgICBjbC0+c3RhdHVzID0gcmVhZGVkOwotICAgICAgICAoKFZNQ2xhc3MqKWNsKS0+cmVzb2x2ZVZpcnR1YWxGaWVsZHMoZ2VuQ2xhc3MsIGdlbk1ldGhvZCk7Ci0gICAgICAgIGNsLT5zdGF0dXMgPSB2aXJ0dWFsX3Jlc29sdmVkOwotICAgICAgfQotICAgICAgY2wtPnJlbGVhc2UoKTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKCEoY2wtPm93bmVyQ2xhc3MoKSkpIHsKLSAgICAgICAgd2hpbGUgKHN0YXR1cyA8IHZpcnR1YWxfcmVzb2x2ZWQpIHsKLSAgICAgICAgICBjbC0+d2FpdENsYXNzKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNsLT5yZWxlYXNlKCk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgVk1Db21tb25DbGFzczo6cmVzb2x2ZVZUKCkgewotICBWTUNvbW1vbkNsYXNzKiBjbCA9IHRoaXM7Ci0JaWYgKGNsLT5pc0FycmF5KSB7Ci0JCVZNQ2xhc3NBcnJheSogYXJyYXlDbCA9IChWTUNsYXNzQXJyYXkqKWNsOwotCQlhcnJheUNsLT5iYXNlQ2xhc3MtPnJlc29sdmVWVCgpOwotCQkvLwkJcHJpbnRmKCJNYWtpbmcgdnQgb2YgJXNcbiIsIG12bTo6UHJpbnRCdWZmZXIodGhpcykuY1N0cmluZygpKTsKLQkJYXJyYXlDbC0+YXJyYXlWVCA9IENMSUppdDo6bWFrZUFycmF5VlQoYXJyYXlDbCk7Ci0JfSBlbHNlIGlmIChjbC0+aXNQb2ludGVyKSB7Ci0JfSBlbHNlIHsKLQkJVk1DbGFzcyogY2wgPSAoVk1DbGFzcyopdGhpczsKLQkJaWYgKHN1cGVyKQotCQkJc3VwZXItPnJlc29sdmVWVCgpOwotCi0JCS8vIFdlIGNoZWNrIGZvciB2aXJ0dWFsIGluc3RhbmNlIGJlY2F1c2UgdGhlIHN0cmluZyBjbGFzcyBoYXMgYSAKLQkJLy8gYmlnZ2VyIHNpemUgdGhhbiB0aGUgY2xhc3MgZGVjbGFyZXMuCi0JCWlmIChzdXBlciAhPSBNU0NvcmxpYjo6cEVudW0gJiYgIWNsLT52aXJ0dWFsSW5zdGFuY2UpIHsKLQkJCWNsLT52dFNpemUgPSBzdXBlciA/ICgoVk1DbGFzcyopc3VwZXIpLT52dFNpemUgOiBzaXplb2YoTjNWaXJ0dWFsVGFibGUpIC8gc2l6ZW9mKHVpbnRwdHJfdCk7Ci0gICAgICBmb3IgKHN0ZDo6dmVjdG9yPFZNTWV0aG9kKj46Oml0ZXJhdG9yIGkgPSB2aXJ0dWFsTWV0aG9kcy5iZWdpbigpLCAKLQkJCQkJCSBlID0gdmlydHVhbE1ldGhvZHMuZW5kKCk7IGkhPSBlOyArK2kpIHsKLSAgICAgICAgKCppKS0+b2Zmc2V0SW5WdCA9IGNsLT52dFNpemUrKzsKLQkJCX0KLQotCQkJLy8JCQlwcmludGYoIk1ha2luZyB2dCBvZiAlcyB3aXRoICVkIGVsZW1lbnRzXG4iLCBtdm06OlByaW50QnVmZmVyKHRoaXMpLmNTdHJpbmcoKSwgY2wtPnZ0U2l6ZSk7Ci0JCQlOM1ZpcnR1YWxUYWJsZSogVlQgPSBDTElKaXQ6Om1ha2VWVChjbCwgZmFsc2UpOwotICAKLQkJCXVpbnQ2NCBzaXplID0gbXZtOjpNdm1Nb2R1bGU6OmdldFR5cGVTaXplKGNsLT52aXJ0dWFsVHlwZS0+Z2V0Q29udGFpbmVkVHlwZSgwKSk7Ci0JCQljbC0+dmlydHVhbEluc3RhbmNlID0gKFZNT2JqZWN0KilnYzo6b3BlcmF0b3IgbmV3KHNpemUsIFZUKTsKLQkJCVZNT2JqZWN0Ojppbml0aWFsaXNlKGNsLT52aXJ0dWFsSW5zdGFuY2UsIGNsKTsKLQkJCQotCQkJZm9yIChzdGQ6OnZlY3RvcjxWTUZpZWxkKj46Oml0ZXJhdG9yIGkgPSBjbC0+dmlydHVhbEZpZWxkcy5iZWdpbigpLAotCQkJCQkJIGUgPSBjbC0+dmlydHVhbEZpZWxkcy5lbmQoKTsgaSE9IGU7ICsraSkgewotCQkJCQotCQkJCSgqaSktPmluaXRGaWVsZChjbC0+dmlydHVhbEluc3RhbmNlKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotdm9pZCBWTUNvbW1vbkNsYXNzOjpyZXNvbHZlVHlwZShib29sIHN0YXQsIGJvb2wgY2xpbml0LCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCkgewotCS8vCXByaW50ZigiUmVzb2x2ZSB0eXBlOiAlcyAlZCAlZFxuIiwgbXZtOjpQcmludEJ1ZmZlcjo6b2JqZWN0VG9TdHJpbmcodGhpcyksIHN0YXQsIGNsaW5pdCk7Ci0gIHJlc29sdmVWaXJ0dWFsKHN0YXRpY19jYXN0PFZNR2VuZXJpY0NsYXNzKj4odGhpcyksIGdlbk1ldGhvZCk7Ci0gIGlmIChzdGF0KSByZXNvbHZlU3RhdGljKGNsaW5pdCwgZ2VuTWV0aG9kKTsKLX0KLQotdm9pZCBWTUNvbW1vbkNsYXNzOjpyZXNvbHZlU3RhdGljKGJvb2wgY2xpbml0LCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCkgewotCS8vCXByaW50ZigiUmVzb2x2ZSBzdGF0aWM6ICVzICVkXG4iLCBtdm06OlByaW50QnVmZmVyOjpvYmplY3RUb1N0cmluZyh0aGlzKSwgY2xpbml0KTsKLSAgVk1Db21tb25DbGFzcyogY2wgPSB0aGlzOwotICBpZiAoY2wtPnN0YXR1cyA8IHN0YXRpY19yZXNvbHZlZCkgewotICAgIGNsLT5hcXVpcmUoKTsKLSAgICBpbnQgc3RhdHVzID0gY2wtPnN0YXR1czsKLSAgICBpZiAoc3RhdHVzID49IHN0YXRpY19yZXNvbHZlZCkgewotICAgICAgY2wtPnJlbGVhc2UoKTsKLSAgICB9IGVsc2UgaWYgKHN0YXR1cyA8IHZpcnR1YWxfcmVzb2x2ZWQpIHsKLSAgICAgIGNsLT5yZWxlYXNlKCk7Ci0JCQkvLwkJCXByaW50ZigiV2lsbCB0aHJvdyBhbiBleGNlcHRpb246ICVzLi4uLlxuIiwgbXZtOjpQcmludEJ1ZmZlcjo6b2JqZWN0VG9TdHJpbmcodGhpcykpOwotCQkJLy8JCQkoKGNoYXIgKikwKVswXSA9IDIyOwotICAgICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT51bmtub3duRXJyb3IoInRyeSB0byByZXNvbHZlIHN0YXRpYyBvZiBhIG5vdCB2aXJ0dWFsLXJlc29sdmVkIGNsYXNzIik7Ci0gICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gdmlydHVhbF9yZXNvbHZlZCkgewotICAgICAgaWYgKGNsLT5pc0FycmF5KSB7Ci0gICAgICAgIFZNQ2xhc3NBcnJheSogYXJyYXlDbCA9IChWTUNsYXNzQXJyYXkqKWNsOwotICAgICAgICBWTUNvbW1vbkNsYXNzKiBiYXNlQ2xhc3MgPSAgYXJyYXlDbC0+YmFzZUNsYXNzOwotICAgICAgICBiYXNlQ2xhc3MtPnJlc29sdmVTdGF0aWMoZmFsc2UsIGdlbk1ldGhvZCk7Ci0gICAgICAgIGNsLT5zdGF0dXMgPSBzdGF0aWNfcmVzb2x2ZWQ7Ci0gICAgICB9IGVsc2UgaWYgKGNsLT5pc1BvaW50ZXIpIHsKLSAgICAgICAgVk1DbGFzc1BvaW50ZXIqIHBvaW50ZXJDbCA9IChWTUNsYXNzUG9pbnRlciopY2w7Ci0gICAgICAgIFZNQ29tbW9uQ2xhc3MqIGJhc2VDbGFzcyA9ICBwb2ludGVyQ2wtPmJhc2VDbGFzczsKLSAgICAgICAgYmFzZUNsYXNzLT5yZXNvbHZlU3RhdGljKGZhbHNlLCBnZW5NZXRob2QpOwotICAgICAgICBjbC0+c3RhdHVzID0gc3RhdGljX3Jlc29sdmVkOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgKChWTUNsYXNzKiljbCktPnJlc29sdmVTdGF0aWNGaWVsZHMoZ2VuTWV0aG9kKTsKLSAgICAgICAgY2wtPnN0YXR1cyA9IHN0YXRpY19yZXNvbHZlZDsKLSAgICAgIH0KLSAgICAgIGNsLT5yZWxlYXNlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICghKGNsLT5vd25lckNsYXNzKCkpKSB7Ci0gICAgICAgIHdoaWxlIChzdGF0dXMgPCBzdGF0aWNfcmVzb2x2ZWQpIHsKLSAgICAgICAgICBjbC0+d2FpdENsYXNzKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNsLT5yZWxlYXNlKCk7Ci0gICAgfQotICB9Ci0gIGlmIChjbGluaXQpIGNsLT5jbGluaXRDbGFzcyhnZW5NZXRob2QpOwotfQotCi0KLVZNTWV0aG9kKiBWTUNvbW1vbkNsYXNzOjpsb29rdXBNZXRob2REb250VGhyb3coY29uc3QgVVRGOCogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+JiBhcmdzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1N0YXRpYywgYm9vbCByZWN1cnNlKSB7Ci0gIAotICBzdGQ6OnZlY3RvcjxWTU1ldGhvZCo+KiBtZXRocyA9IChpc1N0YXRpYz8gJnN0YXRpY01ldGhvZHMgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2aXJ0dWFsTWV0aG9kcyk7Ci0gIAotICBWTU1ldGhvZCAqY3VyLCAqcmVzID0gMDsKLSAgaW50IGkgPSAwOwotICBpbnQgbmJtID0gbWV0aHMtPnNpemUoKTsKLQotICB3aGlsZSAoIXJlcyAmJiBpIDwgbmJtKSB7Ci0gICAgY3VyID0gbWV0aHMtPmF0KGkpOwotICAgIGlmIChjdXItPm5hbWUgPT0gbmFtZSAmJiBjdXItPnNpZ25hdHVyZUVxdWFscyhhcmdzKSkgewotICAgICAgcmV0dXJuIGN1cjsKLSAgICB9Ci0gICAgKytpOwotICB9Ci0KLSAgaWYgKHJlY3Vyc2UpIHsKLSAgICBpZiAoc3VwZXIpIHJlcyA9IHN1cGVyLT5sb29rdXBNZXRob2REb250VGhyb3cobmFtZSwgYXJncywgaXNTdGF0aWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2UpOwotICAgIGlmICghcmVzICYmIGlzU3RhdGljKSB7Ci0gICAgICBpbnQgbmJpID0gaW50ZXJmYWNlcy5zaXplKCk7Ci0gICAgICBpID0gMDsKLSAgICAgIHdoaWxlIChyZXMgPT0gMCAmJiBpIDwgbmJpKSB7Ci0gICAgICAgIHJlcyA9IGludGVyZmFjZXNbaV0tPmxvb2t1cE1ldGhvZERvbnRUaHJvdyhuYW1lLCBhcmdzLCBpc1N0YXRpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2UpOwotICAgICAgICArK2k7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHJlczsKLX0KLQotVk1NZXRob2QqIFZNQ29tbW9uQ2xhc3M6Omxvb2t1cE1ldGhvZChjb25zdCBVVEY4KiBuYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+JiBhcmdzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1N0YXRpYywgYm9vbCByZWN1cnNlKSB7Ci0gIAotICBWTU1ldGhvZCogcmVzID0gbG9va3VwTWV0aG9kRG9udFRocm93KG5hbWUsIGFyZ3MsIGlzU3RhdGljLCByZWN1cnNlKTsKLSAgaWYgKCFyZXMpIHsKLSAgICBWTVRocmVhZDo6Z2V0KCktPmdldFZNKCktPmVycm9yKE4zOjpNaXNzaW5nTWV0aG9kRXhjZXB0aW9uLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5hYmxlIHRvIGZpbmQgJXMgaW4gJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12bTo6UHJpbnRCdWZmZXIobmFtZSkuY1N0cmluZygpLCBtdm06OlByaW50QnVmZmVyKHRoaXMpLmNTdHJpbmcoKSk7Ci0gIH0KLSAgcmV0dXJuIHJlczsKLX0KLQotVk1GaWVsZCogVk1Db21tb25DbGFzczo6bG9va3VwRmllbGREb250VGhyb3coY29uc3QgVVRGOCogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZNQ29tbW9uQ2xhc3MqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU3RhdGljLCBib29sIHJlY3Vyc2UpIHsKLSAgCi0gIHN0ZDo6dmVjdG9yPFZNRmllbGQqPiogZmllbGRzID0gKGlzU3RhdGljPyAmc3RhdGljRmllbGRzIDogJnZpcnR1YWxGaWVsZHMpOwotICAKLSAgVk1GaWVsZCAqY3VyLCAqcmVzID0gMDsKLSAgaW50IGkgPSAwOwotICBpbnQgbmJtID0gZmllbGRzLT5zaXplKCk7Ci0KLSAgd2hpbGUgKCFyZXMgJiYgaSA8IG5ibSkgewotICAgIGN1ciA9IGZpZWxkcy0+YXQoaSk7Ci0gICAgaWYgKGN1ci0+bmFtZSA9PSBuYW1lICYmIGN1ci0+c2lnbmF0dXJlID09IHR5cGUpIHsKLSAgICAgIHJldHVybiBjdXI7Ci0gICAgfQotICAgICsraTsKLSAgfQotCi0gIGlmIChyZWN1cnNlKSB7Ci0gICAgaWYgKHN1cGVyKSByZXMgPSBzdXBlci0+bG9va3VwRmllbGREb250VGhyb3cobmFtZSwgdHlwZSwgaXNTdGF0aWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzZSk7Ci0gICAgaWYgKCFyZXMgJiYgaXNTdGF0aWMpIHsKLSAgICAgIGludCBuYmkgPSBpbnRlcmZhY2VzLnNpemUoKTsKLSAgICAgIGkgPSAwOwotICAgICAgd2hpbGUgKHJlcyA9PSAwICYmIGkgPCBuYmkpIHsKLSAgICAgICAgcmVzID0gaW50ZXJmYWNlc1tpXS0+bG9va3VwRmllbGREb250VGhyb3cobmFtZSwgdHlwZSwgaXNTdGF0aWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2UpOwotICAgICAgICArK2k7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHJlczsKLX0KLQotVk1GaWVsZCogVk1Db21tb25DbGFzczo6bG9va3VwRmllbGQoY29uc3QgVVRGOCogbmFtZSwgVk1Db21tb25DbGFzcyogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdGF0aWMsIGJvb2wgcmVjdXJzZSkgewotICAKLSAgVk1GaWVsZCogcmVzID0gbG9va3VwRmllbGREb250VGhyb3cobmFtZSwgdHlwZSwgaXNTdGF0aWMsIHJlY3Vyc2UpOwotICBpZiAoIXJlcykgewotICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+ZXJyb3IoTjM6Ok1pc3NpbmdGaWVsZEV4Y2VwdGlvbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuYWJsZSB0byBmaW5kICVzIGluICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdm06OlByaW50QnVmZmVyKG5hbWUpLmNTdHJpbmcoKSwgbXZtOjpQcmludEJ1ZmZlcih0aGlzKS5jU3RyaW5nKCkpOwotICB9Ci0gIHJldHVybiByZXM7Ci19Ci0KLVZNT2JqZWN0KiBWTUNsYXNzOjppbml0aWFsaXNlT2JqZWN0KFZNT2JqZWN0KiBvYmopIHsKLSAgdWludDY0IHNpemUgPSBtdm06Ok12bU1vZHVsZTo6Z2V0VHlwZVNpemUodmlydHVhbFR5cGUtPmdldENvbnRhaW5lZFR5cGUoMCkpOwotICBtZW1jcHkob2JqLCB2aXJ0dWFsSW5zdGFuY2UsIHNpemUpOwotICByZXR1cm4gb2JqOwotfQotCi1WTU9iamVjdCogVk1DbGFzczo6ZG9OZXcoKSB7Ci0gIGlmIChzdGF0dXMgPCBpbkNsaW5pdCkgcmVzb2x2ZVR5cGUodHJ1ZSwgdHJ1ZSwgTlVMTCk7Ci0gIHVpbnQ2NCBzaXplID0gbXZtOjpNdm1Nb2R1bGU6OmdldFR5cGVTaXplKHZpcnR1YWxUeXBlLT5nZXRDb250YWluZWRUeXBlKDApKTsKLSAgZGVjbGFyZV9nY3Jvb3QoVk1PYmplY3QqLCByZXMpID0gKFZNT2JqZWN0KilnYzo6b3BlcmF0b3IgbmV3KHNpemUsIFZNT2JqZWN0OjpnZXROM1ZpcnR1YWxUYWJsZSh2aXJ0dWFsSW5zdGFuY2UpKTsKLSAgbWVtY3B5KHJlcywgdmlydHVhbEluc3RhbmNlLCBzaXplKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotVk1PYmplY3QqIFZNQ2xhc3NBcnJheTo6ZG9OZXcodWludDMyIG5iKSB7Ci0gIGlmIChzdGF0dXMgPCBpbkNsaW5pdCkgcmVzb2x2ZVR5cGUodHJ1ZSwgdHJ1ZSwgTlVMTCk7Ci0gIHVpbnQ2NCBzaXplID0gbXZtOjpNdm1Nb2R1bGU6OmdldFR5cGVTaXplKGJhc2VDbGFzcy0+bmF0dXJhbFR5cGUpOwotICBkZWNsYXJlX2djcm9vdChWTUFycmF5KiwgcmVzKSA9IChWTUFycmF5KilnYzo6b3BlcmF0b3IgbmV3KHNpemUgKiBuYiArIHNpemVvZihWTU9iamVjdCkgKyBzaXplb2Yoc2ludDMyKSwgYXJyYXlWVCk7Ci0gIG1lbXNldChyZXMtPmVsZW1lbnRzLCAwLCBzaXplICogbmIpOwotCVZNT2JqZWN0Ojppbml0aWFsaXNlKHJlcywgdGhpcyk7Ci0gIHJlcy0+c2l6ZSA9IG5iOwotICByZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgdm9pZCBkaXNhc3NlbWJsZVN0cnVjdChzdGQ6OnZlY3Rvcjxjb25zdCBsbHZtOjpUeXBlKj4gJmFyZ3MsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VHlwZSogYXJnKSB7Ci0gIGNvbnN0IGxsdm06OlN0cnVjdFR5cGUqIFNUeSA9IGxsdm06OmR5bl9jYXN0PGxsdm06OlN0cnVjdFR5cGU+KGFyZyk7Ci0gIGZvciAobGx2bTo6U3RydWN0VHlwZTo6ZWxlbWVudF9pdGVyYXRvciBJID0gU1R5LT5lbGVtZW50X2JlZ2luKCksCi0gICAgICAgRSA9IFNUeS0+ZWxlbWVudF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICBpZiAoKCpJKS0+aXNTaW5nbGVWYWx1ZVR5cGUoKSkgewotICAgICAgYXJncy5wdXNoX2JhY2soKkkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBkaXNhc3NlbWJsZVN0cnVjdChhcmdzLCAqSSk7Ci0gICAgfQotICB9Ci19Ci0KLWNvbnN0IGxsdm06OkZ1bmN0aW9uVHlwZSogVk1NZXRob2Q6OnJlc29sdmVTaWduYXR1cmUoCi0gICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxWTUNvbW1vbkNsYXNzKj4gJiBwYXJhbWV0ZXJzLCBib29sIGlzVmlydCwKLSAgICAgICAgICAgICAgICAgIGJvb2wmIHN0cnVjdFJldCwgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpIHsKLSAgICBjb25zdCBsbHZtOjpUeXBlKiByZXQ7Ci0gICAgc3RkOjp2ZWN0b3I8Y29uc3QgbGx2bTo6VHlwZSo+IGFyZ3M7Ci0gICAgc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+OjppdGVyYXRvciBpID0gcGFyYW1ldGVycy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHBhcmFtZXRlcnMuZW5kKCk7Ci0gICAgaWYgKCgqaSktPm5hdHVyYWxUeXBlLT5pc0Fic3RyYWN0KCkpIHsKLSAgICAgICgqaSktPnJlc29sdmVUeXBlKGZhbHNlLCBmYWxzZSwgZ2VuTWV0aG9kKTsKLSAgICB9Ci0gICAgcmV0ID0gKCppKS0+bmF0dXJhbFR5cGU7Ci0gICAgKytpOwotICAgIAotICAgIGlmIChpc1ZpcnQpIHsKLSAgICAgIFZNQ29tbW9uQ2xhc3MqIGN1ciA9ICgqaSk7Ci0gICAgICArK2k7Ci0gICAgICBpZiAoY3VyLT5uYXR1cmFsVHlwZS0+aXNBYnN0cmFjdCgpKSB7Ci0gICAgICAgIGN1ci0+cmVzb2x2ZVR5cGUoZmFsc2UsIGZhbHNlLCBnZW5NZXRob2QpOwotICAgICAgfQotICAgICAgaWYgKGN1ci0+c3VwZXIgIT0gTVNDb3JsaWI6OnBWYWx1ZSAmJiBjdXItPnN1cGVyICE9IE1TQ29ybGliOjpwRW51bSkgewotICAgICAgICBhcmdzLnB1c2hfYmFjayhjdXItPm5hdHVyYWxUeXBlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGFyZ3MucHVzaF9iYWNrKGxsdm06OlBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoY3VyLT5uYXR1cmFsVHlwZSkpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBmb3IgKCA7IGkhPSBlOyArK2kpIHsKLSAgICAgIFZNQ29tbW9uQ2xhc3MqIGN1ciA9ICgqaSk7Ci0gICAgICBpZiAoY3VyLT5uYXR1cmFsVHlwZS0+aXNBYnN0cmFjdCgpKSB7Ci0gICAgICAgIGN1ci0+cmVzb2x2ZVR5cGUoZmFsc2UsIGZhbHNlLCBnZW5NZXRob2QpOwotICAgICAgfQotICAgICAgaWYgKGN1ci0+bmF0dXJhbFR5cGUtPmlzU2luZ2xlVmFsdWVUeXBlKCkpIHsKLSAgICAgICAgYXJncy5wdXNoX2JhY2soY3VyLT5uYXR1cmFsVHlwZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBhcmdzLnB1c2hfYmFjayhsbHZtOjpQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKGN1ci0+bmF0dXJhbFR5cGUpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIShyZXQtPmlzU2luZ2xlVmFsdWVUeXBlKCkpICYmIHJldCAhPSBsbHZtOjpUeXBlOjpnZXRWb2lkVHkobGx2bTo6Z2V0R2xvYmFsQ29udGV4dCgpKSkgewotICAgICAgYXJncy5wdXNoX2JhY2sobGx2bTo6UG9pbnRlclR5cGU6OmdldFVucXVhbChyZXQpKTsKLSAgICAgIHJldCA9IGxsdm06OlR5cGU6OmdldFZvaWRUeShsbHZtOjpnZXRHbG9iYWxDb250ZXh0KCkpOwotICAgICAgc3RydWN0UmV0ID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgc3RydWN0UmV0ID0gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBsbHZtOjpGdW5jdGlvblR5cGU6OmdldChyZXQsIGFyZ3MsIGZhbHNlKTsKLX0KLQotY29uc3QgbGx2bTo6RnVuY3Rpb25UeXBlKiBWTU1ldGhvZDo6Z2V0U2lnbmF0dXJlKFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKSB7Ci0gIGlmICghX3NpZ25hdHVyZSkgewotICAgIF9zaWduYXR1cmUgPSByZXNvbHZlU2lnbmF0dXJlKHBhcmFtZXRlcnMsICFpc1N0YXRpYyhmbGFncyksIHN0cnVjdFJldHVybiwgZ2VuTWV0aG9kKTsKLSAgfQotICByZXR1cm4gX3NpZ25hdHVyZTsKLX0KLQotY29uc3QgbGx2bTo6RnVuY3Rpb25UeXBlKiBQcm9wZXJ0eTo6Z2V0U2lnbmF0dXJlKFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKSB7Ci0gIGlmICghX3NpZ25hdHVyZSkgewotICAgIGJvb2wgc3RydWN0UmV0dXJuID0gZmFsc2U7Ci0gICAgX3NpZ25hdHVyZSA9IFZNTWV0aG9kOjpyZXNvbHZlU2lnbmF0dXJlKHBhcmFtZXRlcnMsIHZpcnQsIHN0cnVjdFJldHVybiwgZ2VuTWV0aG9kKTsKLSAgfQotICByZXR1cm4gX3NpZ25hdHVyZTsKLX0KLQotYm9vbCBWTUNvbW1vbkNsYXNzOjppbXBsZW1lbnRzKFZNQ29tbW9uQ2xhc3MqIGNsKSB7Ci0gIGlmICh0aGlzID09IGNsKSByZXR1cm4gdHJ1ZTsKLSAgZWxzZSB7Ci0gICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICBWTUNvbW1vbkNsYXNzKiBjdXIgPSBpbnRlcmZhY2VzW2ldOwotICAgICAgaWYgKGN1ciA9PSBjbCkgcmV0dXJuIHRydWU7Ci0gICAgICBlbHNlIGlmIChjdXItPmltcGxlbWVudHMoY2wpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKHN1cGVyKSB7Ci0gICAgICByZXR1cm4gc3VwZXItPmltcGxlbWVudHMoY2wpOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgVk1Db21tb25DbGFzczo6aW5zdGFudGlhdGlvbk9mQXJyYXkoVk1Db21tb25DbGFzcyogY2wpIHsKLSAgaWYgKHRoaXMgPT0gY2wpIHJldHVybiB0cnVlOwotICBlbHNlIHsKLSAgICBpZiAoaXNBcnJheSAmJiBjbC0+aXNBcnJheSkgewotICAgICAgVk1Db21tb25DbGFzcyogYmFzZVRoaXMgPSAoKFZNQ2xhc3NBcnJheSopdGhpcyktPmJhc2VDbGFzczsKLSAgICAgIFZNQ29tbW9uQ2xhc3MqIGJhc2VDbCA9ICgoVk1DbGFzc0FycmF5KiljbCktPmJhc2VDbGFzczsKLQotICAgICAgaWYgKGlzSW50ZXJmYWNlKGJhc2VUaGlzLT5mbGFncykgJiYgaXNJbnRlcmZhY2UoYmFzZUNsLT5mbGFncykpIHsKLSAgICAgICAgcmV0dXJuIGJhc2VUaGlzLT5pbXBsZW1lbnRzKGJhc2VDbCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gYmFzZVRoaXMtPmlzQXNzaWduYWJsZUZyb20oYmFzZUNsKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIFZNQ29tbW9uQ2xhc3M6OnN1YmNsYXNzT2YoVk1Db21tb25DbGFzcyogY2wpIHsKLSAgaWYgKGNsLT5kZXB0aCA8IGRpc3BsYXkuc2l6ZSgpKSB7Ci0gICAgcmV0dXJuIGRpc3BsYXlbY2wtPmRlcHRoXSA9PSBjbDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotYm9vbCBWTUNvbW1vbkNsYXNzOjppc0Fzc2lnbmFibGVGcm9tKFZNQ29tbW9uQ2xhc3MqIGNsKSB7Ci0gIGlmICh0aGlzID09IGNsKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiAoaXNJbnRlcmZhY2UoY2wtPmZsYWdzKSkgewotICAgIHJldHVybiB0aGlzLT5pbXBsZW1lbnRzKGNsKTsKLSAgfSBlbHNlIGlmIChjbC0+aXNBcnJheSkgewotICAgIHJldHVybiB0aGlzLT5pbnN0YW50aWF0aW9uT2ZBcnJheShjbCk7Ci0gIH0gZWxzZSBpZiAoY2wtPmlzUG9pbnRlcil7Ci0gICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5lcnJvcigiaW1wbGVtZW50IG1lIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgewotICAgIHJldHVybiB0aGlzLT5zdWJjbGFzc09mKGNsKTsKLSAgfQotfQotCi1WTU1ldGhvZCAqVk1NZXRob2Q6OmNvbXBpbGVUb05hdGl2ZShWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCkgewotCWlmKCFjb2RlKSB7Ci0JCWlmIChjbGFzc0RlZi0+c3RhdHVzIDwgcmVhZHkpCi0JCQljbGFzc0RlZi0+cmVzb2x2ZVR5cGUodHJ1ZSwgdHJ1ZSwgTlVMTCk7Ci0gIAotCQlsbHZtOjpGdW5jdGlvbiAqbWV0aFB0ciA9IGNvbXBpbGVkUHRyKGdlbk1ldGhvZCk7Ci0JCXZvaWQqIHJlcyA9IAotCQkJbXZtOjpNdm1Nb2R1bGU6OmV4ZWN1dGlvbkVuZ2luZS0+Z2V0UG9pbnRlclRvR2xvYmFsSWZBdmFpbGFibGUobWV0aFB0cik7Ci0JCWlmIChyZXMgPT0gMCkgewotCQkJY2xhc3NEZWYtPmFxdWlyZSgpOwotCQkJcmVzID0gCi0JCQkJbXZtOjpNdm1Nb2R1bGU6OmV4ZWN1dGlvbkVuZ2luZS0+Z2V0UG9pbnRlclRvR2xvYmFsSWZBdmFpbGFibGUobWV0aFB0cik7Ci0JCQlpZiAocmVzID09IDApIHsKLQkJCQlDTElKaXQ6OmNvbXBpbGUoY2xhc3NEZWYsIHRoaXMpOwotCQkJCXZvaWQqIHJlcyA9IG12bTo6TXZtTW9kdWxlOjpleGVjdXRpb25FbmdpbmUtPmdldFBvaW50ZXJUb0dsb2JhbChtZXRoUHRyKTsKLQkJCQljb2RlID0gcmVzOwotCQkJCS8vIE4zKiB2bSA9IFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKTsKLQkJCQkvLyB2bS0+YWRkTWV0aG9kSW5GdW5jdGlvbk1hcCh0aGlzLCByZXMpOwotCQkJfQotCQkJY2xhc3NEZWYtPnJlbGVhc2UoKTsKLQkJCWNsYXNzRGVmLT5yZXNvbHZlU3RhdGljKHRydWUsIE5VTEwpOwotCQl9Ci0JfQotCXJldHVybiB0aGlzOwotfQotCi1ib29sIFZNTWV0aG9kOjpzaWduYXR1cmVFcXVhbHMoc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+JiBhcmdzKSB7Ci0gIGJvb2wgc3RhdCA9IGlzU3RhdGljKGZsYWdzKTsKLSAgaWYgKGFyZ3Muc2l6ZSgpICE9IHBhcmFtZXRlcnMuc2l6ZSgpKSByZXR1cm4gZmFsc2U7Ci0gIGVsc2UgewotICAgIHN0ZDo6dmVjdG9yPFZNQ29tbW9uQ2xhc3MqPjo6aXRlcmF0b3IgaSA9IHBhcmFtZXRlcnMuYmVnaW4oKSwgCi0gICAgICAgICAgYSA9IGFyZ3MuYmVnaW4oKSwgZSA9IGFyZ3MuZW5kKCk7IAotICAgIAotICAgIGlmICgoKmkpICE9ICgqYSkpIHJldHVybiBmYWxzZTsKLSAgICArK2k7ICsrYTsKLSAgICBpZiAoIXN0YXQpIHsKLSAgICAgICsraTsgKythOwotICAgIH0KLSAgICBmb3IoIDsgYSAhPSBlOyArK2ksICsrYSkgewotICAgICAgaWYgKCgqaSkgIT0gKCphKSkgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBWTU1ldGhvZDo6c2lnbmF0dXJlRXF1YWxzR2VuZXJpYyhzdGQ6OnZlY3RvcjxWTUNvbW1vbkNsYXNzKj4gJiBhcmdzKSB7Ci0JYm9vbCBzdGF0ID0gaXNTdGF0aWMoZmxhZ3MpOwotCi0JaWYgKGFyZ3Muc2l6ZSgpICE9IHBhcmFtZXRlcnMuc2l6ZSgpKQotCQlyZXR1cm4gZmFsc2U7Ci0JZWxzZSB7Ci0JCXN0ZDo6dmVjdG9yPFZNQ29tbW9uQ2xhc3MqPjo6aXRlcmF0b3IgaSA9IHBhcmFtZXRlcnMuYmVnaW4oKSwgYSA9Ci0JCQkJYXJncy5iZWdpbigpLCBlID0gYXJncy5lbmQoKTsKLQotCQkvLyBkdW1teSBjbGFzc2VzIGZvciBnZW5lcmljIGFyZ3VtZW50cyBoYXZlIGEgTlVMTCBhc3NlbWJseSBmaWVsZAotCQkvLyBjaGVjayB3aGV0aGVyIGJvdGggaSBhbmQgYSBwb2ludCB0byBhIGR1bW15IGNsYXNzCi0JCWlmICgoKCppKS0+YXNzZW1ibHkgPT0gTlVMTCAmJiAoKmEpLT5hc3NlbWJseSAhPSBOVUxMKSB8fAotCQkgICAgKCgqaSktPmFzc2VtYmx5ICE9IE5VTEwgJiYgKCphKS0+YXNzZW1ibHkgPT0gTlVMTCkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQkKLQkJLy8gZHVtbXkgY2xhc3NlcyBmb3IgZ2VuZXJpYyBhcmd1bWVudHMgY29udGFpbiB0aGUgCi0JCS8vIGFyZ3VtZW50IG51bWJlciBpbiB0aGUgdG9rZW4gZmllbGQKLQkJLy8gc2lnbmF0dXJlIGlzIG9ubHkgZXF1YWwgaWYgdGhlIGFyZ3VtZW50IG51bWJlciBtYXRjaGVzCi0JCWlmICgoKmkpLT5hc3NlbWJseSA9PSBOVUxMICYmICgqYSktPmFzc2VtYmx5ID09IE5VTEwpIHsKLQkJICBpZiAoKCppKS0+dG9rZW4gIT0gKCphKS0+dG9rZW4pIHsKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICB9Ci0JCX0KLQkJCi0JCWlmICgoKmkpICE9ICgqYSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSsraTsKLQkJKythOwotCi0JCWlmICghc3RhdCkgewotCQkJKytpOwotCQkJKythOwotCQl9Ci0KLQkJZm9yICg7IGEgIT0gZTsgKytpLCArK2EpIHsKLQkgICAgLy8gZHVtbXkgY2xhc3NlcyBmb3IgZ2VuZXJpYyBhcmd1bWVudHMgaGF2ZSBhIE5VTEwgYXNzZW1ibHkgZmllbGQKLQkgICAgLy8gY2hlY2sgd2hldGhlciBib3RoIGkgYW5kIGEgcG9pbnQgdG8gYSBkdW1teSBjbGFzcwotCSAgICBpZiAoKCgqaSktPmFzc2VtYmx5ID09IE5VTEwgJiYgKCphKS0+YXNzZW1ibHkgIT0gTlVMTCkgfHwKLQkgICAgICAgICgoKmkpLT5hc3NlbWJseSAhPSBOVUxMICYmICgqYSktPmFzc2VtYmx5ID09IE5VTEwpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgCi0JICAgIC8vIGR1bW15IGNsYXNzZXMgZm9yIGdlbmVyaWMgYXJndW1lbnRzIGNvbnRhaW4gdGhlIAotCSAgICAvLyBhcmd1bWVudCBudW1iZXIgaW4gdGhlIHRva2VuIGZpZWxkCi0JICAgIC8vIHNpZ25hdHVyZSBpcyBvbmx5IGVxdWFsIGlmIHRoZSBhcmd1bWVudCBudW1iZXIgbWF0Y2hlcwotCSAgICBpZiAoKCppKS0+YXNzZW1ibHkgPT0gTlVMTCAmJiAoKmEpLT5hc3NlbWJseSA9PSBOVUxMKSB7Ci0JICAgICAgaWYgKCgqaSktPnRva2VuICE9ICgqYSktPnRva2VuKSB7Ci0JICAgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfSBlbHNlIHsKLQkgICAgICAgIGNvbnRpbnVlOwotCSAgICAgIH0KLQkgICAgfQotCSAgICAKLQkJCWlmICgoKmkpICE9ICgqYSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCXJldHVybiB0cnVlOwotfQotCi12b2lkIFZNR2VuZXJpY0NsYXNzOjpwcmludChtdm06OlByaW50QnVmZmVyKiBidWYpIGNvbnN0IHsKLSAgYnVmLT53cml0ZSgiR2VuQ0xJVHlwZTwiKTsKLSAgbmFtZVNwYWNlLT5wcmludChidWYpOwotICBidWYtPndyaXRlKCI6OiIpOwotICBuYW1lLT5wcmludChidWYpOwotICBidWYtPndyaXRlKCI+Iik7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvTjMvVk1Db3JlL1ZNQ2xhc3MuaCBiL3Zta2l0L2xpYi9OMy9WTUNvcmUvVk1DbGFzcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjFmNjA2Li4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvVk1DbGFzcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0tLSBWTUNsYXNzLmggLSBDTEkgY2xhc3MgcmVwcmVzZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMwotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgTjNfVk1fQ0xBU1NfSAotI2RlZmluZSBOM19WTV9DTEFTU19ICi0KLSNpbmNsdWRlICJ0eXBlcy5oIgotCi0jaW5jbHVkZSAibXZtL09iamVjdC5oIgotI2luY2x1ZGUgIm12bS9UaHJlYWRzL0xvY2tzLmgiCi0jaW5jbHVkZSAibXZtL1RocmVhZHMvQ29uZC5oIgotCi0jaW5jbHVkZSAibGx2bS9Db25zdGFudHMuaCIKLSNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9HZW5lcmljVmFsdWUuaCIKLSNpbmNsdWRlICJsbHZtL0Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAibGx2bS9UeXBlLmgiCi0KLSNpbmNsdWRlICJOM01ldGFUeXBlLmgiCi0KLSNpbmNsdWRlIDxjc3RkYXJnPgotCi1uYW1lc3BhY2UgbXZtIHsKLQljbGFzcyBVVEY4OwotfQotCi1uYW1lc3BhY2UgbjMgewotdXNpbmcgbXZtOjpVVEY4OwotCi1jbGFzcyBBcnJheVNJbnQzMjsKLWNsYXNzIEFzc2VtYmx5OwotY2xhc3MgRW52ZWxvcHBlOwotY2xhc3MgUGFyYW07Ci1jbGFzcyBQcm9wZXJ0eTsKLWNsYXNzIFZNQ2xhc3M7Ci1jbGFzcyBWTUZpZWxkOwotY2xhc3MgVk1NZXRob2Q7Ci1jbGFzcyBWTU9iamVjdDsKLWNsYXNzIFZNR2VuZXJpY0NsYXNzOwotY2xhc3MgVk1HZW5lcmljTWV0aG9kOwotY2xhc3MgTjM7Ci0KLXR5cGVkZWYgZW51bSBWTUNsYXNzU3RhdGUgewotICBoYXNoZWQgPSAwLCBsb2FkZWQsIHByZXBhcmVkLCByZWFkZWQsIHZpcnR1YWxfcmVzb2x2ZWQsIHN0YXRpY19yZXNvbHZlZCwgY2xpbml0UGFyZW50LCBpbkNsaW5pdCwgcmVhZHkKLX1WTUNsYXNzU3RhdGU7Ci0KLQotY2xhc3MgVk1Db21tb25DbGFzcyA6IHB1YmxpYyBtdm06OlBlcm1hbmVudE9iamVjdCB7Ci1wdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBwcmludChtdm06OlByaW50QnVmZmVyKiBidWYpIGNvbnN0OwotICB2aXJ0dWFsIHZvaWQgVFJBQ0VSOwotCi0gIHN0ZDo6dmVjdG9yPFZNTWV0aG9kKj4gdmlydHVhbE1ldGhvZHM7Ci0gIHN0ZDo6dmVjdG9yPFZNTWV0aG9kKj4gc3RhdGljTWV0aG9kczsKLSAgc3RkOjp2ZWN0b3I8Vk1GaWVsZCo+ICB2aXJ0dWFsRmllbGRzOwotICBzdGQ6OnZlY3RvcjxWTUZpZWxkKj4gIHN0YXRpY0ZpZWxkczsKLSAgc3RkOjp2ZWN0b3I8Vk1DbGFzcyo+IGludGVyZmFjZXM7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQzMj4gaW50ZXJmYWNlc1Rva2VuOwotICBWTUNvbW1vbkNsYXNzKiBzdXBlcjsKLSAgTjMqIHZtOwotICBjb25zdCBVVEY4KiBuYW1lOwotICBjb25zdCBVVEY4KiBuYW1lU3BhY2U7Ci0gIG12bTo6TG9jayogbG9ja1ZhcjsKLSAgbXZtOjpDb25kKiBjb25kVmFyOwotICBWTU9iamVjdCogb29vX2RlbGVnYXRlZTsKLSAgc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+IGRpc3BsYXk7Ci0gIEFzc2VtYmx5KiBhc3NlbWJseTsKLSAgc3RkOjp2ZWN0b3I8UHJvcGVydHkqLCBnY19hbGxvY2F0b3I8UHJvcGVydHkqPiA+IHByb3BlcnRpZXM7Ci0gIAotICBsbHZtOjpGdW5jdGlvbiogdmlydHVhbFRyYWNlcjsKLSAgbGx2bTo6RnVuY3Rpb24qIHN0YXRpY1RyYWNlcjsKLQotICB1aW50MzIgc3VwZXJUb2tlbjsKLSAgdWludDMyIHRva2VuOwotICBib29sIGlzQXJyYXk7Ci0gIGJvb2wgaXNQb2ludGVyOwotICBib29sIGlzUHJpbWl0aXZlOwotICB1aW50MzIgZGVwdGg7Ci0gIFZNQ2xhc3NTdGF0ZSBzdGF0dXM7Ci0gIHVpbnQzMiBmbGFnczsKLSAgCi0gIHN0YXRpYyBjb25zdCB1aW50MzIgbWF4RGlzcGxheTsKLQotICB2b2lkIGFxdWlyZSgpOwotICB2b2lkIHJlbGVhc2UoKTsKLSAgdm9pZCB3YWl0Q2xhc3MoKTsKLSAgdm9pZCBicm9hZGNhc3RDbGFzcygpOwotICBib29sIG93bmVyQ2xhc3MoKTsKLQotICB2b2lkIGluaXRpYWxpc2UoTjMqIHZtLCBib29sIGlzQXJyYXkpOwotCi0gIGNvbnN0IGxsdm06OlR5cGUqIG5hdHVyYWxUeXBlOyAgLy8gdHJ1ZSB0eXBlCi0gIGNvbnN0IGxsdm06OlR5cGUqIHZpcnR1YWxUeXBlOyAgLy8gdHJ1ZSB0eXBlIG9yIGJveAotICBjb25zdCBsbHZtOjpUeXBlKiBzdGF0aWNUeXBlOyAgIC8vIHN0YXRpYyB0eXBlCi0KLSAgYm9vbCBpbmhlcml0TmFtZShjb25zdCBVVEY4KiBUbmFtZSk7Ci0gIGJvb2wgaXNPZlR5cGVOYW1lKGNvbnN0IFVURjgqIFRuYW1lKTsKLSAgYm9vbCBpbXBsZW1lbnRzKFZNQ29tbW9uQ2xhc3MqIGNsKTsKLSAgYm9vbCBpbnN0YW50aWF0aW9uT2ZBcnJheShWTUNvbW1vbkNsYXNzKiBjbCk7Ci0gIGJvb2wgc3ViY2xhc3NPZihWTUNvbW1vbkNsYXNzKiBjbCk7Ci0gIGJvb2wgaXNBc3NpZ25hYmxlRnJvbShWTUNvbW1vbkNsYXNzKiBjbCk7Ci0gIAotICB2b2lkIGFzc2lnblR5cGUoKTsKLSAgdm9pZCBjbGluaXRDbGFzcyhWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCk7Ci0gIHZvaWQgcmVzb2x2ZVN0YXRpYyhib29sIGNsaW5pdCwgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpOwotICB2b2lkIHJlc29sdmVWaXJ0dWFsKFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpOwotICB2b2lkIHJlc29sdmVWVCgpOwotICB2b2lkIHJlc29sdmVUeXBlKGJvb2wgc3RhdCwgYm9vbCBjbGluaXQsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKTsKLSAgdm9pZCBsb2FkUGFyZW50cyhWTUdlbmVyaWNDbGFzcyogZ2VuQ2xhc3MsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKTsKLSAgCi0gIFZNTWV0aG9kKiBsb29rdXBNZXRob2REb250VGhyb3coY29uc3QgVVRGOCogbmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+JiBhcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdGF0aWMsIGJvb2wgcmVjdXJzZSk7Ci0gIAotICBWTU1ldGhvZCogbG9va3VwTWV0aG9kKGNvbnN0IFVURjgqIG5hbWUsIHN0ZDo6dmVjdG9yPFZNQ29tbW9uQ2xhc3MqPiYgYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU3RhdGljLCBib29sIHJlY3Vyc2UpOwotICAKLSAgVk1GaWVsZCogbG9va3VwRmllbGREb250VGhyb3coY29uc3QgVVRGOCogbmFtZSwgVk1Db21tb25DbGFzcyogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1N0YXRpYywgYm9vbCByZWN1cnNlKTsKLSAgCi0gIFZNRmllbGQqIGxvb2t1cEZpZWxkKGNvbnN0IFVURjgqIG5hbWUsIFZNQ29tbW9uQ2xhc3MqIHR5cGUsIGJvb2wgaXNTdGF0aWMsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVjdXJzZSk7Ci0gIAotICBsbHZtOjpHbG9iYWxWYXJpYWJsZSogbGx2bVZhcigpOwotICBsbHZtOjpHbG9iYWxWYXJpYWJsZSogX2xsdm1WYXI7Ci0gIAotICBWTU9iamVjdCogZ2V0Q2xhc3NEZWxlZ2F0ZWUoKTsKLX07Ci0KLQotCi1jbGFzcyBWTUNsYXNzIDogcHVibGljIFZNQ29tbW9uQ2xhc3MgewotcHVibGljOgotICB2aXJ0dWFsIHZvaWQgcHJpbnQobXZtOjpQcmludEJ1ZmZlciogYnVmKSBjb25zdDsKLSAgdmlydHVhbCB2b2lkIFRSQUNFUjsKLSAgCi0gIHZvaWQgcmVzb2x2ZUZpZWxkcygpOwotICB2b2lkIHJlc29sdmVTdGF0aWNGaWVsZHMoVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpOwotICB2b2lkIHJlc29sdmVWaXJ0dWFsRmllbGRzKFZNR2VuZXJpY0NsYXNzKiBnZW5DbGFzcywgVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpOwotICB2b2lkIHVuaWZ5VHlwZXMoVk1HZW5lcmljQ2xhc3MqIGdlbkNsYXNzLCBWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCk7Ci0gIAotICBWTU9iamVjdCogc3RhdGljSW5zdGFuY2U7Ci0gIFZNT2JqZWN0KiB2aXJ0dWFsSW5zdGFuY2U7Ci0gIHN0ZDo6dmVjdG9yPFZNQ2xhc3MqPiBpbm5lckNsYXNzZXM7Ci0gIFZNQ2xhc3MqIG91dGVyQ2xhc3M7Ci0gIHN0ZDo6dmVjdG9yPFZNTWV0aG9kKj4gZ2VuZXJpY01ldGhvZHM7Ci0JdWludDMyIHZ0U2l6ZTsgLy8gaW4gbnVtYmVyIG9mIG1ldGhvZHMKLSAgCi0gIFZNT2JqZWN0KiBkb05ldygpOwotICBWTU9iamVjdCogaW5pdGlhbGlzZU9iamVjdChWTU9iamVjdCopOwotCi0gIHVpbnQzMiBleHBsaWNpdExheW91dFNpemU7Ci19OwotCi0vLyBGSVhNRSB0cnkgdG8gZ2V0IHJpZCBvZiB0aGlzIGNsYXNzCi0vLyAgICAgICBhZGQgZmxhZyB0byBWTUNsYXNzIGluc3RlYWQKLWNsYXNzIFZNR2VuZXJpY0NsYXNzIDogcHVibGljIFZNQ2xhc3MgewotcHVibGljOgotICB2aXJ0dWFsIHZvaWQgcHJpbnQobXZtOjpQcmludEJ1ZmZlciogYnVmKSBjb25zdDsKLSAgdmlydHVhbCB2b2lkIFRSQUNFUjsKLQotICBzdGQ6OnZlY3RvcjxWTUNvbW1vbkNsYXNzKj4gZ2VuZXJpY1BhcmFtczsKLX07Ci0KLWNsYXNzIFZNQ2xhc3NBcnJheSA6IHB1YmxpYyBWTUNvbW1vbkNsYXNzIHsKLXB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIHByaW50KG12bTo6UHJpbnRCdWZmZXIqIGJ1ZikgY29uc3Q7Ci0gIHZpcnR1YWwgdm9pZCBUUkFDRVI7Ci0KLSAgdWludDMyIGRpbXM7Ci0gIFZNQ29tbW9uQ2xhc3MqIGJhc2VDbGFzczsKLSAgCi0gIHN0YXRpYyBWTUNvbW1vbkNsYXNzKiBTdXBlckFycmF5OwotICBzdGF0aWMgc3RkOjp2ZWN0b3I8Vk1DbGFzcyo+ICAgICAgSW50ZXJmYWNlc0FycmF5OwotICBzdGF0aWMgc3RkOjp2ZWN0b3I8Vk1NZXRob2QqPiAgICAgVmlydHVhbE1ldGhvZHNBcnJheTsKLSAgc3RhdGljIHN0ZDo6dmVjdG9yPFZNTWV0aG9kKj4gICAgIFN0YXRpY01ldGhvZHNBcnJheTsKLSAgc3RhdGljIHN0ZDo6dmVjdG9yPFZNRmllbGQqPiAgICAgIFZpcnR1YWxGaWVsZHNBcnJheTsKLSAgc3RhdGljIHN0ZDo6dmVjdG9yPFZNRmllbGQqPiAgICAgIFN0YXRpY0ZpZWxkc0FycmF5OwotICAKLSAgc3RhdGljIGNvbnN0IFVURjgqIGNvbnN0cnVjdEFycmF5TmFtZShjb25zdCBVVEY4KiBuYW1lLCB1aW50MzIgZGltcyk7Ci0gIHZvaWQgbWFrZVR5cGUoKTsKLSAgVk1PYmplY3QqIGRvTmV3KHVpbnQzMiBuYik7Ci0gIFZpcnR1YWxUYWJsZSogYXJyYXlWVDsKLX07Ci0KLWNsYXNzIFZNQ2xhc3NQb2ludGVyIDogcHVibGljIFZNQ29tbW9uQ2xhc3MgewotcHVibGljOgotICB2aXJ0dWFsIHZvaWQgcHJpbnQobXZtOjpQcmludEJ1ZmZlciogYnVmKSBjb25zdDsKLSAgdmlydHVhbCB2b2lkIFRSQUNFUjsKLQotICB1aW50MzIgZGltczsKLSAgVk1Db21tb25DbGFzcyogYmFzZUNsYXNzOwotICBzdGF0aWMgY29uc3QgVVRGOCogY29uc3RydWN0UG9pbnRlck5hbWUoY29uc3QgVVRGOCogbmFtZSwgdWludDMyIGRpbXMpOwotICB2b2lkIG1ha2VUeXBlKCk7Ci19OwotCi1jbGFzcyBWTU1ldGhvZCA6IHB1YmxpYyBtdm06OlBlcm1hbmVudE9iamVjdCB7Ci1wdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBwcmludChtdm06OlByaW50QnVmZmVyKiBidWYpIGNvbnN0OwotICB2aXJ0dWFsIHZvaWQgVFJBQ0VSOwotCi0JdWludDMyIG9mZnNldEluVnQ7Ci0gIHVpbnQzMiBmbGFnczsKLQl1aW50MzIgb2Zmc2V0SW5UZXh0U2VjdGlvbjsKLSAgdWludDMyIGltcGxGbGFnczsKLSAgdWludDMyIHRva2VuOwotCi0gIFZNT2JqZWN0KiBvb29fZGVsZWdhdGVlOwotICBWTU9iamVjdCogZ2V0TWV0aG9kRGVsZWdhdGVlKCk7Ci0gIHN0ZDo6dmVjdG9yPFBhcmFtKiwgZ2NfYWxsb2NhdG9yPFBhcmFtKj4gPiBwYXJhbXM7Ci0gIHN0ZDo6dmVjdG9yPEVudmVsb3BwZSosIGdjX2FsbG9jYXRvcjxFbnZlbG9wcGUqPiA+IGNhY2hlczsKLSAgc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+IHBhcmFtZXRlcnM7Ci0gIFZNQ2xhc3MqIGNsYXNzRGVmOwotICBsbHZtOjpGdW5jdGlvbiogY29tcGlsZWRQdHIoVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpOwotICBsbHZtOjpGdW5jdGlvbiogbWV0aFB0cjsKLSAgY29uc3QgVVRGOCogbmFtZTsKLSAgY29uc3QgbGx2bTo6RnVuY3Rpb25UeXBlKiBfc2lnbmF0dXJlOwotICBib29sIHN0cnVjdFJldHVybjsKLSAgYm9vbCB2aXJ0OwotICBib29sIGNhbkJlSW5saW5lZDsKLQotICB2b2lkKiBjb2RlOwotCi0JVk1NZXRob2QgKmNvbXBpbGVUb05hdGl2ZShWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZD0wKTsKLQotCWxsdm06OkdlbmVyaWNWYWx1ZSBpbnZva2VHZW5lcmljKHN0ZDo6dmVjdG9yPGxsdm06OkdlbmVyaWNWYWx1ZT4mIGFyZ3MpOwotCWxsdm06OkdlbmVyaWNWYWx1ZSBpbnZva2VHZW5lcmljKHZhX2xpc3QgYXApOwotCWxsdm06OkdlbmVyaWNWYWx1ZSBpbnZva2VHZW5lcmljKC4uLik7Ci0KLSNkZWZpbmUgREVGSU5FX0NBTExFUihuYW1lLCB0eXBlKSBcCi0gIHR5cGUgaW52b2tlIyNuYW1lKC4uLik7Ci0KLQlPTl9UWVBFUyhERUZJTkVfQ0FMTEVSLCBfRl9OVCkKLQlPTl9WT0lEKERFRklORV9DQUxMRVIsIF9GX05UKQotCi0jdW5kZWYgREVGSU5FX0NBTExFUgotICAKLSAgY29uc3QgbGx2bTo6RnVuY3Rpb25UeXBlKiBnZXRTaWduYXR1cmUoVk1HZW5lcmljTWV0aG9kKiBnZW5NZXRob2QpOwotICBzdGF0aWMgY29uc3QgbGx2bTo6RnVuY3Rpb25UeXBlKiByZXNvbHZlU2lnbmF0dXJlKAotICAgICAgc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+JiBwYXJhbXMsIGJvb2wgaXNWaXJ0LCBib29sICZzdHJ1Y3RSZXQsIFZNR2VuZXJpY01ldGhvZCogZ2VuTWV0aG9kKTsKLSAgYm9vbCBzaWduYXR1cmVFcXVhbHMoc3RkOjp2ZWN0b3I8Vk1Db21tb25DbGFzcyo+JiBhcmdzKTsKLSAgYm9vbCBzaWduYXR1cmVFcXVhbHNHZW5lcmljKHN0ZDo6dmVjdG9yPFZNQ29tbW9uQ2xhc3MqPiYgYXJncyk7Ci0gIGxsdm06Okdsb2JhbFZhcmlhYmxlKiBsbHZtVmFyKCk7Ci0gIGxsdm06Okdsb2JhbFZhcmlhYmxlKiBfbGx2bVZhcjsKLX07Ci0KLS8vIEZJWE1FIHRyeSB0byBnZXQgcmlkIG9mIHRoaXMgY2xhc3MKLS8vICAgICAgIGFkZCBmbGFnIHRvIFZNTWV0aG9kIGluc3RlYWQKLWNsYXNzIFZNR2VuZXJpY01ldGhvZCA6IHB1YmxpYyBWTU1ldGhvZCB7Ci1wdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBwcmludChtdm06OlByaW50QnVmZmVyKiBidWYpIGNvbnN0OwotICB2aXJ0dWFsIHZvaWQgVFJBQ0VSOwotCi0gIHN0ZDo6dmVjdG9yPFZNQ29tbW9uQ2xhc3MqPiBnZW5lcmljUGFyYW1zOwotfTsKLQotY2xhc3MgVk1GaWVsZCA6IHB1YmxpYyBtdm06OlBlcm1hbmVudE9iamVjdCB7Ci1wdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBwcmludChtdm06OlByaW50QnVmZmVyKiBidWYpIGNvbnN0OwotICB2aXJ0dWFsIHZvaWQgVFJBQ0VSOwotICAKLSAgdWludDMyIGZsYWdzOwotICBsbHZtOjpDb25zdGFudCogb2Zmc2V0OwotICB1aW50MzIgdG9rZW47Ci0gIGNvbnN0IFVURjgqIG5hbWU7Ci0gIFZNQ2xhc3MqIGNsYXNzRGVmOwotICBWTUNvbW1vbkNsYXNzKiBzaWduYXR1cmU7Ci0gIHVpbnQ2NCBwdHJPZmZzZXQ7Ci0gIAotICB2b2lkIGluaXRGaWVsZChWTU9iamVjdCogb2JqKTsKLQotI2RlZmluZSBERUZfVk1GSUVMRF9BU1NFU1NPUlMobmFtZSwgdHlwZSkJCQkJCQkJCQkJCQkgXAotCXZvaWQgIHNldCMjbmFtZShWTU9iamVjdCAqb2JqLCB0eXBlIHZhbHVlKTsJCQkJCQkJCQkJIFwKLQl0eXBlICBnZXQjI25hbWUoVk1PYmplY3QgKm9iaik7Ci0KLQlPTl9UWVBFUyhERUZfVk1GSUVMRF9BU1NFU1NPUlMsIF9GX05UKQotCi0jdW5kZWYgREVGX1ZNRklFTERfQVNTRVNTT1JTCi0KLSAgbGx2bTo6R2xvYmFsVmFyaWFibGUqIGxsdm1WYXIoKTsKLSAgbGx2bTo6R2xvYmFsVmFyaWFibGUqIF9sbHZtVmFyOwotfTsKLQotY2xhc3MgUGFyYW0gOiBwdWJsaWMgbXZtOjpQZXJtYW5lbnRPYmplY3QgewotcHVibGljOgotICB2aXJ0dWFsIHZvaWQgcHJpbnQobXZtOjpQcmludEJ1ZmZlciogYnVmKSBjb25zdDsKLQotICB1aW50MzIgZmxhZ3M7Ci0gIHVpbnQzMiBzZXF1ZW5jZTsKLSAgVk1NZXRob2QqIG1ldGhvZDsKLSAgY29uc3QgVVRGOCogbmFtZTsKLX07Ci0KLWNsYXNzIFByb3BlcnR5IDogcHVibGljIG12bTo6UGVybWFuZW50T2JqZWN0IHsKLXB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIHByaW50KG12bTo6UHJpbnRCdWZmZXIqIGJ1ZikgY29uc3Q7Ci0gIHZpcnR1YWwgdm9pZCBUUkFDRVI7Ci0gIAotICBzdGQ6OnZlY3RvcjxWTUNvbW1vbkNsYXNzKj4gcGFyYW1ldGVyczsKLSAgVk1Db21tb25DbGFzcyogdHlwZTsKLSAgY29uc3QgbGx2bTo6RnVuY3Rpb25UeXBlKiBfc2lnbmF0dXJlOwotICBjb25zdCBsbHZtOjpGdW5jdGlvblR5cGUqIGdldFNpZ25hdHVyZShWTUdlbmVyaWNNZXRob2QqIGdlbk1ldGhvZCk7Ci0gIGJvb2wgdmlydDsKLSAgY29uc3QgVVRGOCogbmFtZTsKLSAgVk1PYmplY3QqIG9vb19kZWxlZ2F0ZWU7Ci0gIHVpbnQzMiBmbGFnczsKLSAgVk1PYmplY3QqIGdldFByb3BlcnR5RGVsZWdhdGVlKCk7Ci19OwotCi0KLQotfSAvLyBlbmQgbmFtZXNwYWNlIG4zCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL04zL1ZNQ29yZS9WTU9iamVjdC5jcHAgYi92bWtpdC9saWIvTjMvVk1Db3JlL1ZNT2JqZWN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU3NzRiYy4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTjMvVk1Db3JlL1ZNT2JqZWN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLS0gVk1PYmplY3QuY3BwIC0gVk0gb2JqZWN0IGRlZmluaXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMwotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9Mb2Nrcy5oIgotCi0jaW5jbHVkZSAiVk1DbGFzcy5oIgotI2luY2x1ZGUgIlZNT2JqZWN0LmgiCi0jaW5jbHVkZSAiVk1UaHJlYWQuaCIKLSNpbmNsdWRlICJOMy5oIgotCi11c2luZyBuYW1lc3BhY2UgbjM7Ci0KLU4zVmlydHVhbFRhYmxlIExvY2tPYmo6Ol9WVCgodWludHB0cl90KUxvY2tPYmo6Ol9kZXN0cm95LCAKLQkJCQkJCQkJCQkJCQkJKHVpbnRwdHJfdCkwLCAKLQkJCQkJCQkJCQkJCQkJKHVpbnRwdHJfdCltdm06Ok9iamVjdDo6ZGVmYXVsdF90cmFjZXIsIAotCQkJCQkJCQkJCQkJCQkodWludHB0cl90KUxvY2tPYmo6Ol9wcmludCwgCi0JCQkJCQkJCQkJCQkJCSh1aW50cHRyX3QpbXZtOjpPYmplY3Q6OmRlZmF1bHRfaGFzaENvZGUpOwotCi12b2lkICpOM1ZpcnR1YWxUYWJsZTo6b3BlcmF0b3IgbmV3KHNpemVfdCBzaXplLCBtdm06OkJ1bXBQdHJBbGxvY2F0b3IgJmFsbG9jYXRvciwgc2l6ZV90IHRvdGFsVnRTaXplKSB7Ci0JLy9wcmludGYoIkFsbG9jYXRlIE4zVmlydHVhbFRhYmxlIHdpdGggJWQgZWxlbWVudHNcbiIsIHRvdGFsVnRTaXplKTsKLQlyZXR1cm4gYWxsb2NhdG9yLkFsbG9jYXRlKHRvdGFsVnRTaXplICogc2l6ZW9mKHVpbnRwdHJfdCksICJOM1ZpcnR1YWxUYWJsZSIpOwotfQotCi1OM1ZpcnR1YWxUYWJsZTo6TjNWaXJ0dWFsVGFibGUoKSB7Ci19Ci0KLU4zVmlydHVhbFRhYmxlOjpOM1ZpcnR1YWxUYWJsZShOM1ZpcnR1YWxUYWJsZSAqYmFzZVZ0LCB1aW50MzIgYmFzZVZ0U2l6ZSwgdWludDMyIHRvdGFsU2l6ZSkgewotCW1lbWNweSh0aGlzLCBiYXNlVnQsIGJhc2VWdFNpemUgKiBzaXplb2YodWludHB0cl90KSk7Ci19Ci0KLU4zVmlydHVhbFRhYmxlOjpOM1ZpcnR1YWxUYWJsZSh1aW50cHRyX3QgZCwgdWludHB0cl90IG8sIHVpbnRwdHJfdCB0LCB1aW50cHRyX3QgcCwgdWludHB0cl90IGgpIDogVmlydHVhbFRhYmxlKGQsIG8sIHQpIHsKLQlwcmludCA9IHA7Ci0JaGFzaENvZGUgPSBoOwotfQotCi11aW50MzIgTjNWaXJ0dWFsVGFibGU6OmJhc2VWdFNpemUoKSB7Ci0JcmV0dXJuIHNpemVvZihOM1ZpcnR1YWxUYWJsZSkgLyBzaXplb2YodWludHB0cl90KTsKLX0KLQotCi1Mb2NrT2JqKiBMb2NrT2JqOjphbGxvY2F0ZSgpIHsKLSAgZGVjbGFyZV9nY3Jvb3QoTG9ja09iaiosIHJlcykgPSBuZXcoJl9WVCkgTG9ja09iaigpOwotCXJlcy0+dGhyZWFkcyA9IG5ldyBzdGQ6OnZlY3RvcjxWTVRocmVhZCo+KCk7Ci0JcmVzLT5sb2NrICAgID0gbmV3IG12bTo6TG9ja1JlY3Vyc2l2ZSgpOwotICByZXR1cm4gcmVzOwotfQotCi12b2lkIExvY2tPYmo6Ol9wcmludChjb25zdCBMb2NrT2JqICpzZWxmLCBtdm06OlByaW50QnVmZmVyKiBidWYpIHsKLQlsbHZtX2djcm9vdChzZWxmLCAwKTsKLSAgYnVmLT53cml0ZSgiTG9jazw+Iik7Ci19Ci0KLXZvaWQgTG9ja09iajo6X2Rlc3Ryb3koTG9ja09iaiAqc2VsZikgewotCWxsdm1fZ2Nyb290KHNlbGYsIDApOwotCWRlbGV0ZSBzZWxmLT50aHJlYWRzOwotCWRlbGV0ZSBzZWxmLT5sb2NrOwotfQotCi12b2lkIExvY2tPYmo6Om5vdGlmeShMb2NrT2JqICpzZWxmKSB7Ci0JbGx2bV9nY3Jvb3Qoc2VsZiwgMCk7Ci0gIGZvciAoc3RkOjp2ZWN0b3I8Vk1UaHJlYWQqPjo6aXRlcmF0b3IgaSA9IHNlbGYtPnRocmVhZHMtPmJlZ2luKCksIAotCQkJCSBlID0gc2VsZi0+dGhyZWFkcy0+ZW5kKCk7IGkhPSBlOyArK2kpIHsKLSAgICBWTVRocmVhZCogY3VyID0gKmk7Ci0gICAgY3VyLT5sb2NrLT5sb2NrKCk7Ci0gICAgaWYgKGN1ci0+aW50ZXJydXB0RmxhZyAhPSAwKSB7Ci0gICAgICBjdXItPmxvY2stPnVubG9jaygpOwotICAgICAgY29udGludWU7Ci0gICAgfSBlbHNlIHsKLQkJCWRlY2xhcmVfZ2Nyb290KFZNT2JqZWN0ICosIHRoKSA9IGN1ci0+b29vX2FwcFRocmVhZDsKLQkJCWlmICh0aCAhPSAwKSB7Ci0JCQkJY3VyLT52YXJjb25kLT5zaWduYWwoKTsKLQkJCQljdXItPmxvY2stPnVubG9jaygpOwotCQkJCXNlbGYtPnRocmVhZHMtPmVyYXNlKGkpOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsgLy8gZGVhZCB0aHJlYWQKLQkJCQlzZWxmLT50aHJlYWRzLT5lcmFzZShpKTsKLQkJCX0KLQkJfQotICB9Ci19Ci0KLXZvaWQgTG9ja09iajo6bm90aWZ5QWxsKExvY2tPYmogKnNlbGYpIHsKLQlsbHZtX2djcm9vdChzZWxmLCAwKTsKLSAgZm9yIChzdGQ6OnZlY3RvcjxWTVRocmVhZCo+OjppdGVyYXRvciBpID0gc2VsZi0+dGhyZWFkcy0+YmVnaW4oKSwKLQkJCQkgZSA9IHNlbGYtPnRocmVhZHMtPmVuZCgpOyBpIT0gZTsgKytpKSB7Ci0gICAgVk1UaHJlYWQqIGN1ciA9ICppOwotICAgIGN1ci0+bG9jay0+bG9jaygpOwotICAgIGN1ci0+dmFyY29uZC0+c2lnbmFsKCk7Ci0gICAgY3VyLT5sb2NrLT51bmxvY2soKTsKLSAgICBzZWxmLT50aHJlYWRzLT5lcmFzZShpKTsKLSAgfQotfQotCi12b2lkIExvY2tPYmo6OndhaXQoTG9ja09iaiAqc2VsZiwgVk1UaHJlYWQqIHRoKSB7Ci0JbGx2bV9nY3Jvb3Qoc2VsZiwgMCk7Ci0gIHNlbGYtPnRocmVhZHMtPnB1c2hfYmFjayh0aCk7Ci19Ci0KLXZvaWQgTG9ja09iajo6cmVtb3ZlKExvY2tPYmogKnNlbGYsIFZNVGhyZWFkKiB0aCkgewotCWxsdm1fZ2Nyb290KHNlbGYsIDApOwotICBmb3IgKHN0ZDo6dmVjdG9yPFZNVGhyZWFkKj46Oml0ZXJhdG9yIGkgPSBzZWxmLT50aHJlYWRzLT5iZWdpbigpLAotCQkJCSBlID0gc2VsZi0+dGhyZWFkcy0+ZW5kKCk7IGkhPSBlOyArK2kpIHsKLSAgICBpZiAoKmkgPT0gdGgpIHsKLSAgICAgIHNlbGYtPnRocmVhZHMtPmVyYXNlKGkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgTG9ja09iajo6YXF1aXJlKExvY2tPYmogKnNlbGYpIHsKLQlsbHZtX2djcm9vdChzZWxmLCAwKTsKLSAgc2VsZi0+bG9jay0+bG9jaygpOwotfQotCi12b2lkIExvY2tPYmo6OnJlbGVhc2UoTG9ja09iaiAqc2VsZikgewotCWxsdm1fZ2Nyb290KHNlbGYsIDApOwotICBzZWxmLT5sb2NrLT51bmxvY2soKTsKLX0KLQotYm9vbCBMb2NrT2JqOjpvd25lcihMb2NrT2JqICpzZWxmKSB7Ci0JbGx2bV9nY3Jvb3Qoc2VsZiwgMCk7Ci0gIHJldHVybiBzZWxmLT5sb2NrLT5zZWxmT3duZXIoKTsKLX0KLQotc3RhdGljIExvY2tPYmoqIG15TG9jayhWTU9iamVjdCogb2JqKSB7Ci0JbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgdmVyaWZ5TnVsbChvYmopOwotCWRlY2xhcmVfZ2Nyb290KExvY2tPYmoqLCBsb2NrKSA9IG9iai0+bG9ja09iajsKLSAgaWYgKGxvY2sgPT0gMCkgewotICAgIFZNT2JqZWN0OjpnbG9iYWxMb2NrLT5sb2NrKCk7Ci0JCWxvY2sgPSBvYmotPmxvY2tPYmo7Ci0gICAgaWYgKGxvY2sgPT0gMCkgewotCQkJbG9jayA9IExvY2tPYmo6OmFsbG9jYXRlKCk7Ci0gICAgICBvYmotPmxvY2tPYmogPSBsb2NrOwotICAgIH0KLSAgICBWTU9iamVjdDo6Z2xvYmFsTG9jay0+dW5sb2NrKCk7Ci0gIH0KLSAgcmV0dXJuIGxvY2s7Ci19Ci0KLXZvaWQgVk1PYmplY3Q6OmluaXRpYWxpc2UoVk1PYmplY3QqIHNlbGYsIFZNQ29tbW9uQ2xhc3MqIGNsKSB7Ci0JbGx2bV9nY3Jvb3Qoc2VsZiwgMCk7Ci0gIHNlbGYtPmNsYXNzT2YgPSBjbDsKLSAgc2VsZi0+bG9ja09iaiA9IDA7Ci19Ci0KLXZvaWQgVk1PYmplY3Q6Ol9wcmludChjb25zdCBWTU9iamVjdCAqc2VsZiwgbXZtOjpQcmludEJ1ZmZlciogYnVmKSB7Ci0JbGx2bV9nY3Jvb3Qoc2VsZiwgMCk7Ci0gIGJ1Zi0+d3JpdGUoIlZNT2JqZWN0PCIpOwotICBzZWxmLT5jbGFzc09mLT5wcmludChidWYpOwotCWJ1Zi0+d3JpdGUoIkAweCIpOwotCWJ1Zi0+d3JpdGVQdHIoKHZvaWQqKXNlbGYtPmhhc2hDb2RlKCkpOwotICBidWYtPndyaXRlKCI+Iik7Ci19Ci0KLXZvaWQgVk1PYmplY3Q6OmFxdWlyZShWTU9iamVjdCogc2VsZikgewotCWxsdm1fZ2Nyb290KHNlbGYsIDApOwotCWRlY2xhcmVfZ2Nyb290KExvY2tPYmoqLCBsb2NrKSA9IG15TG9jayhzZWxmKTsKLQlMb2NrT2JqOjphcXVpcmUobG9jayk7Ci19Ci0KLXZvaWQgVk1PYmplY3Q6OnVubG9jayhWTU9iamVjdCogc2VsZikgewotCWxsdm1fZ2Nyb290KHNlbGYsIDApOwotICB2ZXJpZnlOdWxsKHNlbGYpOwotCWRlY2xhcmVfZ2Nyb290KExvY2tPYmoqLCBsb2NrKSA9IG15TG9jayhzZWxmKTsKLQlMb2NrT2JqOjpyZWxlYXNlKGxvY2spOwotfQotCi12b2lkIFZNT2JqZWN0Ojp3YWl0SW50ZXJuKFZNT2JqZWN0KiBzZWxmLCBzdHJ1Y3QgdGltZXZhbCogaW5mbywgYm9vbCB0aW1lZCkgewotCWxsdm1fZ2Nyb290KHNlbGYsIDApOwotICBkZWNsYXJlX2djcm9vdChMb2NrT2JqICosIGwpID0gbXlMb2NrKHNlbGYpOwotICBib29sIG93bmVyID0gTG9ja09iajo6b3duZXIobCk7Ci0KLSAgaWYgKG93bmVyKSB7Ci0gICAgVk1UaHJlYWQqIHRocmVhZCA9IFZNVGhyZWFkOjpnZXQoKTsKLSAgICBtdm06OkxvY2sqIG11dGV4VGhyZWFkID0gdGhyZWFkLT5sb2NrOwotICAgIG12bTo6Q29uZCogdmFyY29uZFRocmVhZCA9IHRocmVhZC0+dmFyY29uZDsKLQotICAgIG11dGV4VGhyZWFkLT5sb2NrKCk7Ci0gICAgaWYgKHRocmVhZC0+aW50ZXJydXB0RmxhZyAhPSAwKSB7Ci0gICAgICBtdXRleFRocmVhZC0+dW5sb2NrKCk7Ci0gICAgICB0aHJlYWQtPmludGVycnVwdEZsYWcgPSAwOwotICAgICAgdGhyZWFkLT5nZXRWTSgpLT5pbnRlcnJ1cHRlZEV4Y2VwdGlvbihzZWxmKTsKLSAgICB9IGVsc2UgewotICAgICAgdW5zaWduZWQgaW50IHJlY3VyID0gbC0+bG9jay0+cmVjdXJzaW9uQ291bnQoKTsKLSAgICAgIGJvb2wgdGltZW91dCA9IGZhbHNlOwotICAgICAgbC0+bG9jay0+dW5sb2NrQWxsKCk7Ci0JCQlMb2NrT2JqOjp3YWl0KGwsIHRocmVhZCk7Ci0gICAgICB0aHJlYWQtPnN0YXRlID0gVk1UaHJlYWQ6OlN0YXRlV2FpdGluZzsKLQotICAgICAgaWYgKHRpbWVkKSB7Ci0gICAgICAgIHRpbWVvdXQgPSB2YXJjb25kVGhyZWFkLT50aW1lZFdhaXQobXV0ZXhUaHJlYWQsIGluZm8pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdmFyY29uZFRocmVhZC0+d2FpdChtdXRleFRocmVhZCk7Ci0gICAgICB9Ci0KLSAgICAgIGJvb2wgaW50ZXJydXB0ZWQgPSAodGhyZWFkLT5pbnRlcnJ1cHRGbGFnICE9IDApOwotICAgICAgbXV0ZXhUaHJlYWQtPnVubG9jaygpOwotICAgICAgbC0+bG9jay0+bG9ja0FsbChyZWN1cik7Ci0KLSAgICAgIGlmIChpbnRlcnJ1cHRlZCB8fCB0aW1lb3V0KSB7Ci0JCQkJTG9ja09iajo6cmVtb3ZlKGwsIHRocmVhZCk7Ci0gICAgICB9Ci0KLSAgICAgIHRocmVhZC0+c3RhdGUgPSBWTVRocmVhZDo6U3RhdGVSdW5uaW5nOwotCi0gICAgICBpZiAoaW50ZXJydXB0ZWQpIHsKLSAgICAgICAgdGhyZWFkLT5pbnRlcnJ1cHRGbGFnID0gMDsKLSAgICAgICAgdGhyZWFkLT5nZXRWTSgpLT5pbnRlcnJ1cHRlZEV4Y2VwdGlvbihzZWxmKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgVk1UaHJlYWQ6OmdldCgpLT5nZXRWTSgpLT5pbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uKHNlbGYpOwotICB9Ci19Ci0KLXZvaWQgVk1PYmplY3Q6OndhaXQoVk1PYmplY3QqIHNlbGYpIHsKLQlsbHZtX2djcm9vdChzZWxmLCAwKTsKLSAgd2FpdEludGVybihzZWxmLCAwLCBmYWxzZSk7Ci19Ci0KLXZvaWQgVk1PYmplY3Q6OnRpbWVkV2FpdChWTU9iamVjdCogc2VsZiwgc3RydWN0IHRpbWV2YWwmIGluZm8pIHsKLQlsbHZtX2djcm9vdChzZWxmLCAwKTsKLSAgd2FpdEludGVybihzZWxmLCAmaW5mbywgZmFsc2UpOwotfQotCi12b2lkIFZNT2JqZWN0Ojpub3RpZnkoVk1PYmplY3QqIHNlbGYpIHsKLQlsbHZtX2djcm9vdChzZWxmLCAwKTsKLSAgZGVjbGFyZV9nY3Jvb3QoTG9ja09iaiosIGwpID0gbXlMb2NrKHNlbGYpOwotICBpZiAoTG9ja09iajo6b3duZXIobCkpIHsKLQkJTG9ja09iajo6bm90aWZ5KGwpOwotICB9IGVsc2UgewotICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+aWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbihzZWxmKTsKLSAgfQotfQotCi12b2lkIFZNT2JqZWN0Ojpub3RpZnlBbGwoVk1PYmplY3QqIHNlbGYpIHsKLQlsbHZtX2djcm9vdChzZWxmLCAwKTsKLSAgZGVjbGFyZV9nY3Jvb3QoTG9ja09iaiosIGwpID0gbXlMb2NrKHNlbGYpOwotICBpZiAoTG9ja09iajo6b3duZXIobCkpIHsKLQkJTG9ja09iajo6bm90aWZ5QWxsKGwpOwotICB9IGVsc2UgewotICAgIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+aWxsZWdhbE1vbml0b3JTdGF0ZUV4Y2VwdGlvbihzZWxmKTsKLSAgfSAKLX0KLQotYm9vbCBWTU9iamVjdDo6aW5zdGFuY2VPZihWTU9iamVjdCogc2VsZiwgVk1Db21tb25DbGFzcyogY2wpIHsKLQlsbHZtX2djcm9vdChzZWxmLCAwKTsKLSAgaWYgKCFzZWxmKSByZXR1cm4gZmFsc2U7Ci0gIGVsc2UgcmV0dXJuIHNlbGYtPmNsYXNzT2YtPmlzQXNzaWduYWJsZUZyb20oY2wpOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL04zL1ZNQ29yZS9WTU9iamVjdC5oIGIvdm1raXQvbGliL04zL1ZNQ29yZS9WTU9iamVjdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTcwMTk4Li4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvVk1PYmplY3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLS0tLS0gVk1PYmplY3QuaCAtIFZNIG9iamVjdCBkZWZpbml0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjMKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIE4zX1ZNX09CSkVDVF9ICi0jZGVmaW5lIE4zX1ZNX09CSkVDVF9ICi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJOM01ldGFUeXBlLmgiCi0KLSNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgotI2luY2x1ZGUgImxsdm0vVHlwZS5oIgotI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL0dlbmVyaWNWYWx1ZS5oIgotCi0jaW5jbHVkZSAibXZtL09iamVjdC5oIgotI2luY2x1ZGUgIm12bS9UaHJlYWRzL0xvY2tzLmgiCi0KLSNpbmNsdWRlICJtdm0vR0MvR0MuaCIKLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLW5hbWVzcGFjZSBuMyB7Ci0KLWNsYXNzIFZNQ29tbW9uQ2xhc3M7Ci1jbGFzcyBWTUZpZWxkOwotY2xhc3MgVk1PYmplY3Q7Ci1jbGFzcyBWTVRocmVhZDsKLQotc3RydWN0IE4zVmlydHVhbFRhYmxlIDogVmlydHVhbFRhYmxlIHsKLQl1aW50cHRyX3QgIHByaW50OwotCXVpbnRwdHJfdCAgaGFzaENvZGU7Ci0KLQl2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUsIG12bTo6QnVtcFB0ckFsbG9jYXRvciAmYWxsb2NhdG9yLCBzaXplX3QgdG90YWxWdFNpemUpOwotCi0gIE4zVmlydHVhbFRhYmxlKCk7Ci0gIE4zVmlydHVhbFRhYmxlKE4zVmlydHVhbFRhYmxlICp2bW9ialZ0LCB1aW50MzIgYmFzZVZ0U2l6ZSwgdWludDMyIHRvdGFsVnRTaXplPS0xKTsKLSAgTjNWaXJ0dWFsVGFibGUodWludHB0cl90IGQsIHVpbnRwdHJfdCBvLCB1aW50cHRyX3QgdCwgdWludHB0cl90IHAsIHVpbnRwdHJfdCBoKTsKLQotCXN0YXRpYyB1aW50MzIgYmFzZVZ0U2l6ZSgpOwotfTsKLQotY2xhc3MgTG9ja09iaiA6IHB1YmxpYyBtdm06Ok9iamVjdCB7Ci1wdWJsaWM6Ci0Jc3RhdGljIE4zVmlydHVhbFRhYmxlICBfVlQ7Ci0gIG12bTo6TG9ja1JlY3Vyc2l2ZSAgICAgKmxvY2s7Ci0gIHN0ZDo6dmVjdG9yPFZNVGhyZWFkKj4gKnRocmVhZHM7Ci0KLSAgc3RhdGljIExvY2tPYmoqIGFsbG9jYXRlKCk7Ci0Jc3RhdGljIHZvaWQgX2Rlc3Ryb3koTG9ja09iaiAqKTsKLQlzdGF0aWMgdm9pZCBfcHJpbnQoY29uc3QgTG9ja09iaiAqLCBtdm06OlByaW50QnVmZmVyICopOwotICAKLSAgc3RhdGljIHZvaWQgbm90aWZ5KExvY2tPYmoqKTsKLSAgc3RhdGljIHZvaWQgbm90aWZ5QWxsKExvY2tPYmoqKTsKLSAgc3RhdGljIHZvaWQgd2FpdChMb2NrT2JqKiwgVk1UaHJlYWQqIHRoKTsKLSAgc3RhdGljIHZvaWQgcmVtb3ZlKExvY2tPYmoqLCBWTVRocmVhZCogdGgpOwotCi0gIHN0YXRpYyB2b2lkIGFxdWlyZShMb2NrT2JqKik7Ci0gIHN0YXRpYyB2b2lkIHJlbGVhc2UoTG9ja09iaiopOwotICBzdGF0aWMgYm9vbCBvd25lcihMb2NrT2JqKik7Ci19OwotCi0jZGVmaW5lIFZBTFVFX09GRlNFVCAzCi0KLWNsYXNzIFZNT2JqZWN0IDogcHVibGljIG12bTo6T2JqZWN0IHsKLXB1YmxpYzoKLSAgVk1Db21tb25DbGFzcyogY2xhc3NPZjsKLSAgTG9ja09iaiogICAgICAgbG9ja09iajsKLQotICBzdGF0aWMgbXZtOjpMb2NrKiAgICAgICAgZ2xvYmFsTG9jazsKLSAgc3RhdGljIGNvbnN0IGxsdm06OlR5cGUqIGxsdm1UeXBlOwotCi0Jc3RhdGljIHZvaWQgX3ByaW50KGNvbnN0IFZNT2JqZWN0ICosIG12bTo6UHJpbnRCdWZmZXIgKik7Ci0Jc3RhdGljIHZvaWQgX3RyYWNlKFZNT2JqZWN0ICopOwotICAKLSAgc3RhdGljIHZvaWQgYXF1aXJlKFZNT2JqZWN0ICpzZWxmKTsKLSAgc3RhdGljIHZvaWQgdW5sb2NrKFZNT2JqZWN0ICpzZWxmKTsKLSAgc3RhdGljIHZvaWQgd2FpdEludGVybihWTU9iamVjdCAqc2VsZiwgc3RydWN0IHRpbWV2YWwgKmluZm8sIGJvb2wgdGltZWQpOwotICBzdGF0aWMgdm9pZCB3YWl0KFZNT2JqZWN0ICpzZWxmKTsKLSAgc3RhdGljIHZvaWQgdGltZWRXYWl0KFZNT2JqZWN0ICpzZWxmLCBzdHJ1Y3QgdGltZXZhbCAmaW5mbyk7Ci0gIHN0YXRpYyB2b2lkIG5vdGlmeShWTU9iamVjdCAqc2VsZik7Ci0gIHN0YXRpYyB2b2lkIG5vdGlmeUFsbChWTU9iamVjdCAqc2VsZik7Ci0gIHN0YXRpYyB2b2lkIGluaXRpYWxpc2UoVk1PYmplY3QgKnNlbGYsIFZNQ29tbW9uQ2xhc3MqIGNsKTsKLQotICBzdGF0aWMgbGx2bTo6Q29uc3RhbnQqIGNsYXNzT2Zmc2V0KCk7Ci0gIAotICBzdGF0aWMgYm9vbCBpbnN0YW5jZU9mKFZNT2JqZWN0ICpzZWxmLCBWTUNvbW1vbkNsYXNzKiBjbCk7Ci0KLQotCXN0YXRpYyBOM1ZpcnR1YWxUYWJsZSAqZ2V0TjNWaXJ0dWFsVGFibGUoVk1PYmplY3QgKnNlbGYpIHsgbGx2bV9nY3Jvb3Qoc2VsZiwgMCk7IHJldHVybiAqKChOM1ZpcnR1YWxUYWJsZSoqKXNlbGYpOyB9Ci0KLSNpZmRlZiBTSUdTRUdWX1RIUk9XX05VTEwKLSAgI2RlZmluZSB2ZXJpZnlOdWxsKG9iaikge30KLSNlbHNlCi0gICNkZWZpbmUgdmVyaWZ5TnVsbChvYmopIFwKLSAgICBpZiAob2JqID09IDApIFZNVGhyZWFkOjpnZXQoKS0+Z2V0Vk0oKS0+bnVsbFBvaW50ZXJFeGNlcHRpb24oIiIpOwotI2VuZGlmCi0KLX07Ci0KLQotfSAvLyBlbmQgbmFtZXNwYWNlIG4zCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL04zL1ZNQ29yZS9WTVRocmVhZC5jcHAgYi92bWtpdC9saWIvTjMvVk1Db3JlL1ZNVGhyZWFkLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM2OTBiMC4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTjMvVk1Db3JlL1ZNVGhyZWFkLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLSBWTVRocmVhZC5jcHAgLSBWTSB0aHJlYWQgZGVzY3JpcHRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOMwotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXREYXRhLmgiCi0KLSNpbmNsdWRlICJtdm0vSklULmgiCi0jaW5jbHVkZSAibXZtL1ByaW50QnVmZmVyLmgiCi0jaW5jbHVkZSAibXZtL1RocmVhZHMvTG9ja3MuaCIKLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9UaHJlYWQuaCIKLQotI2luY2x1ZGUgIkFzc2VtYmx5LmgiCi0jaW5jbHVkZSAiQ0xJSml0LmgiCi0jaW5jbHVkZSAiTjNNb2R1bGVQcm92aWRlci5oIgotI2luY2x1ZGUgIlZNQ2xhc3MuaCIKLSNpbmNsdWRlICJWTU9iamVjdC5oIgotI2luY2x1ZGUgIlZNVGhyZWFkLmgiCi0jaW5jbHVkZSAiTjMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIG4zOwotCi1jb25zdCB1bnNpZ25lZCBpbnQgVk1UaHJlYWQ6OlN0YXRlUnVubmluZyA9IDA7Ci1jb25zdCB1bnNpZ25lZCBpbnQgVk1UaHJlYWQ6OlN0YXRlV2FpdGluZyA9IDE7Ci1jb25zdCB1bnNpZ25lZCBpbnQgVk1UaHJlYWQ6OlN0YXRlSW50ZXJydXB0ZWQgPSAyOwotCi12b2lkIFZNVGhyZWFkOjpwcmludChtdm06OlByaW50QnVmZmVyKiBidWYpIGNvbnN0IHsKLSAgYnVmLT53cml0ZSgiVGhyZWFkPD4iKTsKLQlkZWNsYXJlX2djcm9vdChWTU9iamVjdCAqLCBhcHBUaHJlYWQpID0gb29vX2FwcFRocmVhZDsKLSAgYXBwVGhyZWFkLT5wcmludChidWYpOwotfQotCi1leHRlcm4gdm9pZCBBZGRTdGFuZGFyZENvbXBpbGVQYXNzZXMobGx2bTo6RnVuY3Rpb25QYXNzTWFuYWdlciopOwotCi1WTVRocmVhZDo6flZNVGhyZWFkKCkgewotICBkZWxldGUgcGVyRnVuY3Rpb25QYXNzZXM7Ci19Ci0KLVZNVGhyZWFkOjpWTVRocmVhZChWTU9iamVjdCogYXBwVGhyZWFkLCBOMyogdm0pIHsKLQlsbHZtX2djcm9vdChhcHBUaHJlYWQsIDApOwotICB0aGlzLT5wZXJGdW5jdGlvblBhc3NlcyA9IDA7Ci0gIHRoaXMtPm9vb19hcHBUaHJlYWQgPSBhcHBUaHJlYWQ7Ci0gIHRoaXMtPk15Vk0gPSB2bTsKLSAgdGhpcy0+bG9jayA9IG5ldyBtdm06OkxvY2tOb3JtYWwoKTsKLSAgdGhpcy0+dmFyY29uZCA9IG5ldyBtdm06OkNvbmQoKTsKLSAgdGhpcy0+aW50ZXJydXB0RmxhZyA9IDA7Ci0gIHRoaXMtPnN0YXRlID0gU3RhdGVSdW5uaW5nOwotICB0aGlzLT5vb29fcGVuZGluZ0V4Y2VwdGlvbiA9IDA7Ci0gIHRoaXMtPnBlckZ1bmN0aW9uUGFzc2VzID0gbmV3IGxsdm06OkZ1bmN0aW9uUGFzc01hbmFnZXIodm0tPmdldExMVk1Nb2R1bGUoKSk7Ci0gIHRoaXMtPnBlckZ1bmN0aW9uUGFzc2VzLT5hZGQobmV3IGxsdm06OlRhcmdldERhdGEodm0tPmdldExMVk1Nb2R1bGUoKSkpOwotICBBZGRTdGFuZGFyZENvbXBpbGVQYXNzZXModGhpcy0+cGVyRnVuY3Rpb25QYXNzZXMpOwotfQotCi1WTU9iamVjdCogVk1UaHJlYWQ6OmN1cnJlbnRUaHJlYWQoKSB7Ci0gIFZNVGhyZWFkKiByZXN1bHQgPSBnZXQoKTsKLSAgaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCWRlY2xhcmVfZ2Nyb290KFZNT2JqZWN0ICosIGFwcFRocmVhZCkgPSByZXN1bHQtPm9vb19hcHBUaHJlYWQ7Ci0gICAgcmV0dXJuIGFwcFRocmVhZDsKLSAgfSBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQqIFZNVGhyZWFkOjpnZXRDcHBFeGNlcHRpb24oKSB7Ci0gIHJldHVybiAodm9pZCopKChjaGFyKilWTVRocmVhZDo6Z2V0KCktPmludGVybmFsUGVuZGluZ0V4Y2VwdGlvbiAtIDggKiBzaXplb2Yodm9pZCopKTsKLX0KLQotVk1PYmplY3QqIFZNVGhyZWFkOjpnZXRDTElFeGNlcHRpb24oKSB7Ci0gIFZNVGhyZWFkKiB0aCA9IFZNVGhyZWFkOjpnZXQoKTsKLQlkZWNsYXJlX2djcm9vdChWTU9iamVjdCAqLCBwZW5kaW5nRXhjZXB0aW9uKSA9IHRoLT5vb29fcGVuZGluZ0V4Y2VwdGlvbjsKLSAgcmV0dXJuIHBlbmRpbmdFeGNlcHRpb247Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCogX19jeGFfYWxsb2NhdGVfZXhjZXB0aW9uKHVuc2lnbmVkKTsKLWV4dGVybiAiQyIgdm9pZCBfX2N4YV90aHJvdyh2b2lkKiwgdm9pZCosIHZvaWQqKTsKLQotCi12b2lkIFZNVGhyZWFkOjp0aHJvd0V4Y2VwdGlvbihWTU9iamVjdCogb2JqKSB7Ci0JbGx2bV9nY3Jvb3Qob2JqLCAwKTsKLSAgVk1UaHJlYWQqIHRoID0gVk1UaHJlYWQ6OmdldCgpOwotICBhc3NlcnQodGgtPm9vb19wZW5kaW5nRXhjZXB0aW9uID09IDAgJiYgInBlbmRpbmcgZXhjZXB0aW9uIGFscmVhZHkgdGhlcmU/Iik7Ci0gIHRoLT5vb29fcGVuZGluZ0V4Y2VwdGlvbiA9IG9iajsKLSAgdm9pZCogZXhjID0gX19jeGFfYWxsb2NhdGVfZXhjZXB0aW9uKDApOwotICB0aC0+aW50ZXJuYWxQZW5kaW5nRXhjZXB0aW9uID0gZXhjOwotICBfX2N4YV90aHJvdyhleGMsIDAsIDApOyAKLX0KLQotdm9pZCBWTVRocmVhZDo6aW50ZXJuYWxDbGVhckV4Y2VwdGlvbigpIHsKLSAgb29vX3BlbmRpbmdFeGNlcHRpb24gPSAwOwotICBpbnRlcm5hbFBlbmRpbmdFeGNlcHRpb24gPSAwOwotfQotCi1ib29sIFZNVGhyZWFkOjpjb21wYXJlRXhjZXB0aW9uKFZNQ2xhc3MqIGNsKSB7Ci0gIGRlY2xhcmVfZ2Nyb290KFZNT2JqZWN0KiwgcGUpID0gVk1UaHJlYWQ6OmdldCgpLT5vb29fcGVuZGluZ0V4Y2VwdGlvbjsKLSAgYXNzZXJ0KHBlICYmICJubyBwZW5kaW5nIGV4Y2VwdGlvbj8iKTsKLSAgcmV0dXJuIHBlLT5jbGFzc09mLT5zdWJjbGFzc09mKGNsKTsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvVk1UaHJlYWQuaCBiL3Zta2l0L2xpYi9OMy9WTUNvcmUvVk1UaHJlYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYwNWEzMC4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvTjMvVk1Db3JlL1ZNVGhyZWFkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLS0tLSBWTVRocmVhZC5oIC0gVk0gdGhyZWFkIGRlc2NyaXB0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjMKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIE4zX1ZNX1RIUkVBRF9ICi0jZGVmaW5lIE4zX1ZNX1RIUkVBRF9ICi0KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotI2luY2x1ZGUgImxsdm0vUGFzc01hbmFnZXIuaCIKLQotI2luY2x1ZGUgIm12bS9PYmplY3QuaCIKLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9Db25kLmgiCi0jaW5jbHVkZSAibXZtL1RocmVhZHMvTG9ja3MuaCIKLSNpbmNsdWRlICJNdXRhdG9yVGhyZWFkLmgiCi0KLW5hbWVzcGFjZSBuMyB7Ci0KLWNsYXNzIE4zOwotY2xhc3MgVk1DbGFzczsKLWNsYXNzIFZNR2VuZXJpY0NsYXNzOwotY2xhc3MgVk1PYmplY3Q7Ci1jbGFzcyBWTUdlbmVyaWNNZXRob2Q7Ci0KLWNsYXNzIFZNVGhyZWFkIDogcHVibGljIG12bTo6TXV0YXRvclRocmVhZCB7Ci1wdWJsaWM6Ci0gIFZNT2JqZWN0KiBvb29fYXBwVGhyZWFkOwotICAKLSAgTjMqIGdldFZNKCkgewotICAgIHJldHVybiAoTjMqKU15Vk07Ci0gIH0KLSAgCi0gIG12bTo6TG9jayogICBsb2NrOwotICBtdm06OkNvbmQqICAgdmFyY29uZDsKLSAgVk1PYmplY3QqICAgIG9vb19wZW5kaW5nRXhjZXB0aW9uOwotICB2b2lkKiAgICAgICAgaW50ZXJuYWxQZW5kaW5nRXhjZXB0aW9uOwotICB1bnNpZ25lZCBpbnQgaW50ZXJydXB0RmxhZzsKLSAgdW5zaWduZWQgaW50IHN0YXRlOwotICAKLSAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBTdGF0ZVJ1bm5pbmc7Ci0gIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgU3RhdGVXYWl0aW5nOwotICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IFN0YXRlSW50ZXJydXB0ZWQ7Ci0KLSAgdmlydHVhbCB2b2lkIHByaW50KG12bTo6UHJpbnRCdWZmZXIgKmJ1ZikgY29uc3Q7Ci0gIHZpcnR1YWwgdm9pZCBUUkFDRVI7Ci0gIH5WTVRocmVhZCgpOwotICBWTVRocmVhZChWTU9iamVjdCAqdGhyZWFkLCBOMyAqdm0pOwotICAKLSAgLy8gVGVtcG9yYXJ5IHNvbHV0aW9uIHVudGlsIE4zIGNhbiBjbGVhbmx5IGJvb3RzdHJhcCBpdHNlbGYgYW5kCi0gIC8vIGltcGxlbWVudCB0aHJlYWRzLgotICBzdGF0aWMgVk1UaHJlYWQqIFRoZVRocmVhZDsKLSAgc3RhdGljIFZNVGhyZWFkKiBnZXQoKSB7Ci0gICAgcmV0dXJuIFRoZVRocmVhZDsKLSAgfQotICBzdGF0aWMgVk1PYmplY3QqIGN1cnJlbnRUaHJlYWQoKTsKLSAgCi0gIHN0YXRpYyBWTU9iamVjdCogZ2V0Q0xJRXhjZXB0aW9uKCk7Ci0gIHN0YXRpYyB2b2lkKiBnZXRDcHBFeGNlcHRpb24oKTsKLSAgc3RhdGljIHZvaWQgdGhyb3dFeGNlcHRpb24oVk1PYmplY3QqKTsKLSAgc3RhdGljIGJvb2wgY29tcGFyZUV4Y2VwdGlvbihWTUNsYXNzKik7Ci0KLSAgbGx2bTo6RnVuY3Rpb25QYXNzTWFuYWdlciogcGVyRnVuY3Rpb25QYXNzZXM7Ci0gIHN0ZDo6dmVjdG9yPGptcF9idWYqPiBzamxqX2J1ZmZlcnM7Ci0gIAotcHJpdmF0ZToKLSAgdmlydHVhbCB2b2lkIGludGVybmFsQ2xlYXJFeGNlcHRpb24oKTsKLX07Ci0KLX0gLy8gZW5kIG5hbWVzcGFjZSBuMwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvVmlydHVhbFRhYmxlcy5jcHAgYi92bWtpdC9saWIvTjMvVk1Db3JlL1ZpcnR1YWxUYWJsZXMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmQ2ZTE1Li4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9OMy9WTUNvcmUvVmlydHVhbFRhYmxlcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLy89PT0tLS0tLSBWaXJ0dWFsVGFibGVzLmNwcCAtIFZpcnR1YWwgbWV0aG9kcyBmb3IgTjMgb2JqZWN0cyAtLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTjMKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSAibXZtL09iamVjdC5oIgotCi0jaW5jbHVkZSAiQXNzZW1ibHkuaCIKLSNpbmNsdWRlICJDTElTdHJpbmcuaCIKLSNpbmNsdWRlICJDTElKaXQuaCIKLSNpbmNsdWRlICJMb2NrZWRNYXAuaCIKLSNpbmNsdWRlICJOMy5oIgotI2luY2x1ZGUgIlJlYWRlci5oIgotI2luY2x1ZGUgIlZNQXJyYXkuaCIKLSNpbmNsdWRlICJWTUNhY2hlLmgiCi0jaW5jbHVkZSAiVk1DbGFzcy5oIgotI2luY2x1ZGUgIlZNT2JqZWN0LmgiCi0jaW5jbHVkZSAiVk1UaHJlYWQuaCIKLQotdXNpbmcgbmFtZXNwYWNlIG4zOwotCi1leHRlcm4gIkMiIHZvaWQgQ0xJT2JqZWN0VHJhY2VyKFZNT2JqZWN0KiBvYmopIHsKLQlWTU9iamVjdDo6X3RyYWNlKG9iaik7Ci19Ci0KLS8vIE4zIE9iamVjdHMKLXZvaWQgVk1PYmplY3Q6Ol90cmFjZShWTU9iamVjdCAqc2VsZikgewotICBtdm06OkNvbGxlY3Rvcjo6bWFya0FuZFRyYWNlKHNlbGYsICZzZWxmLT5sb2NrT2JqKTsKLX0KLQotI2RlZmluZSBUUkFDRV9WRUNUT1IodHlwZSwgbmFtZSwgYWxsb2MpIHsgXAotICBmb3IgKHN0ZDo6dmVjdG9yPHR5cGUsIGFsbG9jPHR5cGU+ID46Oml0ZXJhdG9yIGkgPSBuYW1lLmJlZ2luKCksIGUgPSBuYW1lLmVuZCgpOyBcCi0gICAgICAgaSE9IGU7ICsraSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbXZtOjpDb2xsZWN0b3I6Om1hcmtBbmRUcmFjZVJvb3QoJigqaSkpOyB9fQotCi0jZGVmaW5lIENBTExfVFJBQ0VSX1ZFQ1RPUih0eXBlLCBuYW1lLCBhbGxvYykgeyBcCi0gIGZvciAoc3RkOjp2ZWN0b3I8dHlwZSwgYWxsb2M8dHlwZT4gPjo6aXRlcmF0b3IgaSA9IG5hbWUuYmVnaW4oKSwgZSA9IG5hbWUuZW5kKCk7IFwKLSAgICAgICBpIT0gZTsgKytpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKmkpLT50cmFjZXIoKTsgfX0KLQotLy8gaW50ZXJuYWwgb2JqZWN0cwotdm9pZCBWTVRocmVhZDo6dHJhY2VyKCkgewotICBtdm06OkNvbGxlY3Rvcjo6bWFya0FuZFRyYWNlUm9vdCgmb29vX2FwcFRocmVhZCk7Ci0gIG12bTo6Q29sbGVjdG9yOjptYXJrQW5kVHJhY2VSb290KCZvb29fcGVuZGluZ0V4Y2VwdGlvbik7Ci0JLy8gSSBzdXBwb3NlIHRoYXQgdGhlIHZtIGlzIGFscmVhZHkgdHJhY2VkIGJ5IHRoZSBnYwotCS8vICB2bS0+dHJhY2VyKCk7Ci19Ci0KLXZvaWQgTjM6OnRyYWNlcigpIHsKLQkvLyBJZiBJIHVuZGVyc3RhbmQsIHRoZSBnYyBhbHJlYWR5IGNhbGwgdHJhY2UgZm9yIGFsbCBWTVRocmVhZAotLy8gICBpZiAoYm9vdHN0cmFwVGhyZWFkKSB7Ci0vLyAgICAgYm9vdHN0cmFwVGhyZWFkLT50cmFjZXIoKTsKLS8vICAgICBmb3IgKFZNVGhyZWFkKiB0aCA9IChWTVRocmVhZCopYm9vdHN0cmFwVGhyZWFkLT5uZXh0KCk7IAotLy8gICAgICAgICAgdGggIT0gYm9vdHN0cmFwVGhyZWFkOyB0aCA9IChWTVRocmVhZCopdGgtPm5leHQoKSkKLS8vICAgICAgIHRoLT50cmFjZXIoKTsKLS8vICAgfQotICBsb2FkZWRBc3NlbWJsaWVzLT50cmFjZXIoKTsKLX0KLQotdm9pZCBBc3NlbWJseTo6dHJhY2VyKCkgewotICBsb2FkZWROYW1lQ2xhc3Nlcy0+dHJhY2VyKCk7Ci0gIG12bTo6Q29sbGVjdG9yOjptYXJrQW5kVHJhY2VSb290KCZvb29fZGVsZWdhdGVlKTsKLX0KLQotdm9pZCBWTUNvbW1vbkNsYXNzOjp0cmFjZXIoKSB7Ci0gIG12bTo6Q29sbGVjdG9yOjptYXJrQW5kVHJhY2VSb290KCZvb29fZGVsZWdhdGVlKTsKLQlDQUxMX1RSQUNFUl9WRUNUT1IoVk1NZXRob2QqLCB2aXJ0dWFsTWV0aG9kcywgc3RkOjphbGxvY2F0b3IpOwotCUNBTExfVFJBQ0VSX1ZFQ1RPUihWTU1ldGhvZCosIHN0YXRpY01ldGhvZHMsIHN0ZDo6YWxsb2NhdG9yKTsKLSAgQ0FMTF9UUkFDRVJfVkVDVE9SKFByb3BlcnR5KiwgcHJvcGVydGllcywgZ2NfYWxsb2NhdG9yKTsKLX0KLQotdm9pZCBWTUNsYXNzOjp0cmFjZXIoKSB7Ci0gIFZNQ29tbW9uQ2xhc3M6OnRyYWNlcigpOwotICBtdm06OkNvbGxlY3Rvcjo6bWFya0FuZFRyYWNlUm9vdCgmc3RhdGljSW5zdGFuY2UpOwotICBtdm06OkNvbGxlY3Rvcjo6bWFya0FuZFRyYWNlUm9vdCgmdmlydHVhbEluc3RhbmNlKTsKLX0KLQotdm9pZCBWTUdlbmVyaWNDbGFzczo6dHJhY2VyKCkgewotICBWTUNsYXNzOjp0cmFjZXIoKTsKLX0KLQotdm9pZCBWTUNsYXNzQXJyYXk6OnRyYWNlcigpIHsKLSAgVk1Db21tb25DbGFzczo6dHJhY2VyKCk7Ci19Ci0KLXZvaWQgVk1DbGFzc1BvaW50ZXI6OnRyYWNlcigpIHsKLSAgVk1Db21tb25DbGFzczo6dHJhY2VyKCk7Ci19Ci0KLXZvaWQgVk1NZXRob2Q6OnRyYWNlcigpIHsKLSAgbXZtOjpDb2xsZWN0b3I6Om1hcmtBbmRUcmFjZVJvb3QoJm9vb19kZWxlZ2F0ZWUpOwotfQotCi12b2lkIFZNR2VuZXJpY01ldGhvZDo6dHJhY2VyKCkgewotICBWTU1ldGhvZDo6dHJhY2VyKCk7Ci19Ci0KLXZvaWQgUHJvcGVydHk6OnRyYWNlcigpIHsKLSAgbXZtOjpDb2xsZWN0b3I6Om1hcmtBbmRUcmFjZVJvb3QoJm9vb19kZWxlZ2F0ZWUpOwotfQotCi0vLyB1c2VsZXNzIChuZXZlciBjYWxsZWQgb3IgdXNlZCkgYnV0IGl0IHNpbXBsaWZpZXMgdGhlIGRlZmluaXRpb24gb2YgTG9ja2VkTWFwCi12b2lkIFZNRmllbGQ6OnRyYWNlcigpIHsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9wMy9NYWtlZmlsZSBiL3Zta2l0L2xpYi9wMy9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxZTc5Yi4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvcDMvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIz09PS0gbGliL0puSlZNL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIwotIyAKLSMgICAgICAgICAgICAgICAgICAgICBUaGUgdm1raXQgcHJvamVjdAotIwotIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLSMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotIyAKLSMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCi1MRVZFTCA9IC4uLy4uCi0KLURJUlMgPSBWTUNvcmUKLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb25maWcKLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCi0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9wMy9WTUNvcmUvTWFrZWZpbGUgYi92bWtpdC9saWIvcDMvVk1Db3JlL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTAwNDIxLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9wMy9WTUNvcmUvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIz09PS0gbGliL0puSlZNL1ZNQ29yZS9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIwotIyAKLSMgICAgICAgICAgICAgICAgICAgICBUaGUgdm1raXQgcHJvamVjdAotIwotIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLSMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotIyAKLSMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCi1MRVZFTCA9IC4uLy4uLy4uCi0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29uZmlnCi0KLU5PX1BFREFOVElDPTEKLQotaWZlcSAoJChXSVRIX0xMVk1fR0NDKSwgMSkKLSAgTU9EVUxFX05BTUUgPSBQMwotZWxzZQotICBMSUJSQVJZTkFNRSA9IFAzCi1lbmRpZgotCi0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCi0KLSNDWFguRmxhZ3MgKz0gCi0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9wMy9WTUNvcmUvUDMuY3BwIGIvdm1raXQvbGliL3AzL1ZNQ29yZS9QMy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMzAxMzQuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL3AzL1ZNQ29yZS9QMy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0jaW5jbHVkZSAiUDMuaCIKLSNpbmNsdWRlICJQM0Vycm9yLmgiCi0jaW5jbHVkZSAiUDNSZWFkZXIuaCIKLSNpbmNsdWRlICJQM0V4dHJhY3Rvci5oIgotI2luY2x1ZGUgIlAzT2JqZWN0LmgiCi0jaW5jbHVkZSAiUDNJbnRlcnByZXRvci5oIgotCi11c2luZyBuYW1lc3BhY2UgcDM7Ci0KLVAzOjpQMyhtdm06OkJ1bXBQdHJBbGxvY2F0b3ImIGFsbG9jLCBtdm06OlZNS2l0KiB2bWtpdCkgOiBtdm06OlZpcnR1YWxNYWNoaW5lKGFsbG9jLCB2bWtpdCkgewotfQotCi12b2lkIFAzOjpmaW5hbGl6ZU9iamVjdChtdm06OmdjKiBvYmopIHsgTkkoKTsgfQotbXZtOjpnYyoqIFAzOjpnZXRSZWZlcmVudChtdm06OmdjKiByZWYpIHsgTkkoKTsgfQotdm9pZCBQMzo6c2V0UmVmZXJlbnQobXZtOjpnYyogcmVmLCBtdm06OmdjKiB2YWwpIHsgTkkoKTsgfQotYm9vbCBQMzo6ZW5xdWV1ZVJlZmVyZW5jZShtdm06OmdjKiBfb2JqKSB7IE5JKCk7IH0KLXNpemVfdCBQMzo6Z2V0T2JqZWN0U2l6ZShtdm06OmdjKiBvYmplY3QpIHsgTkkoKTsgfQotY29uc3QgY2hhciogUDM6OmdldE9iamVjdFR5cGVOYW1lKG12bTo6Z2MqIG9iamVjdCkgeyBOSSgpOyB9Ci0KLXZvaWQgUDM6OnJ1bkZpbGUoY29uc3QgY2hhciogZmlsZU5hbWUpIHsKLQltdm06OkJ1bXBQdHJBbGxvY2F0b3IgYWxsb2NhdG9yOwotCVAzQnl0ZUNvZGUqIGJjID0gUDNSZWFkZXI6Om9wZW5GaWxlKGFsbG9jYXRvciwgZmlsZU5hbWUpOyAKLQlpZighYmMpCi0JCWZhdGFsKCJ1bmFibGUgdG8gb3BlbjogJXMiLCBmaWxlTmFtZSk7Ci0JUDNSZWFkZXIgcmVhZGVyKGJjKTsKLQotCXJlYWRlci5yZWFkVTIoKTsgICAgICAgICAvLyB2ZXJzaW9uIDB4ZjJkMSAoPz8/KQotCXJlYWRlci5yZWFkVTIoKTsgICAgICAgICAvLyBtYWdpYyAweGEwZAotCXJlYWRlci5yZWFkVTQoKTsgICAgICAgICAvLyBsYXN0IG1vZGlmaWNhdGlvbgotCi0JUDNFeHRyYWN0b3IgZXh0cmFjdG9yKCZyZWFkZXIpOyAKLQlQM09iamVjdCogb2JqID0gZXh0cmFjdG9yLnJlYWRPYmplY3QoKTsKLQotCWlmKCFvYmotPmlzQ29kZSgpKQotCQlmYXRhbCgiJXMgZG9lcyBub3QgY29udGFpbiBhIGNvZGUiLCBmaWxlTmFtZSk7Ci0KLQkobmV3IFAzSW50ZXJwcmV0b3Iob2JqLT5hc0NvZGUoKSkpLT5leGVjdXRlKCk7Ci19Ci0KLXZvaWQgUDM6OnJ1bkFwcGxpY2F0aW9uSW1wbChpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLQlpZihhcmdjIDwgMikKLQkJZmF0YWwoInVzYWdlOiAlcyBmaWxlbmFtZSIsIGFyZ3ZbMF0pOwotCi0JcnVuRmlsZShhcmd2WzFdKTsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9wMy9WTUNvcmUvUDMuaCBiL3Zta2l0L2xpYi9wMy9WTUNvcmUvUDMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmYjExYy4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvcDMvVk1Db3JlL1AzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0jaWZuZGVmIF9QM19IXwotI2RlZmluZSBfUDNfSF8KLQotI2luY2x1ZGUgIm12bS9WaXJ0dWFsTWFjaGluZS5oIgotCi1uYW1lc3BhY2UgcDMgewotCi1jbGFzcyBQM1JlYWRlcjsKLQotY2xhc3MgUDMgOiBwdWJsaWMgbXZtOjpWaXJ0dWFsTWFjaGluZSB7Ci1wdWJsaWM6Ci0gIC8vLyBQMyAtIGRlZmF1bHQgY29uc3RydWN0b3IKLSAgLy8vCi0JUDMobXZtOjpCdW1wUHRyQWxsb2NhdG9yJiBhbGxvYywgbXZtOjpWTUtpdCogdm1raXQpOwotCi0KLSAgLy8vIGZpbmFsaXplT2JqZWN0IC0gaW52b2tlIHRoZSBmaW5hbGl6ZXIgb2YgYW4gb2JqZWN0Ci0gIC8vLwotCXZpcnR1YWwgdm9pZCBmaW5hbGl6ZU9iamVjdChtdm06OmdjKiBvYmopOwotCi0gIC8vLyBnZXRSZWZlcmVudFB0ciAtIHJldHVybiB0aGUgcmVmZXJlbnQgb2YgYSByZWZlcmVuY2UKLSAgLy8vCi0JdmlydHVhbCBtdm06OmdjKiogZ2V0UmVmZXJlbnQobXZtOjpnYyogcmVmKTsKLQotICAvLy8gc2V0UmVmZXJlbnRQdHIgLSBzZXQgdGhlIHJlZmVyZW50IG9mIGEgcmVmZXJlbmNlCi0gIC8vLwotCXZpcnR1YWwgdm9pZCBzZXRSZWZlcmVudChtdm06OmdjKiByZWYsIG12bTo6Z2MqIHZhbCk7Ci0KLSAgLy8vIGVucXVldWVSZWZlcmVuY2UgLSBlbnF1ZXVlIHRoZSByZWZlcmVuY2UKLSAgLy8vCi0JdmlydHVhbCBib29sIGVucXVldWVSZWZlcmVuY2UobXZtOjpnYyogX29iaik7Ci0KLSAgLy8vIHRyYWNlciAtIFRyYWNlIHRoaXMgdmlydHVhbCBtYWNoaW5lJ3MgR0Mtb2JqZWN0cy4gCi0JLy8vICAgIENhbGxlZCBvbmNlIGJ5IHZtLiBJZiB5b3UgaGF2ZSBHQy1vYmplY3RzIGluIGEgdGhyZWFkIHNwZWNpZmljIGRhdGEsIHJlZGVmaW5lIHRoZSB0cmFjZXIgb2YgeW91ciBWTVRocmVhZERhdGEuCi0gIC8vLwotICB2aXJ0dWFsIHZvaWQgdHJhY2VyKHVpbnRwdHJfdCBjbG9zdXJlKTsKLQotICAvLy8gZ2V0T2JqZWN0U2l6ZSAtIEdldCB0aGUgc2l6ZSBvZiB0aGlzIG9iamVjdC4gVXNlZCBieSBjb3B5aW5nIGNvbGxlY3RvcnMuCi0gIC8vLwotICB2aXJ0dWFsIHNpemVfdCBnZXRPYmplY3RTaXplKG12bTo6Z2MqIG9iamVjdCk7Ci0KLSAgLy8vIGdldE9iamVjdFR5cGVOYW1lIC0gR2V0IHRoZSB0eXBlIG9mIHRoaXMgb2JqZWN0LiBVc2VkIGJ5IHRoZSBHQyBmb3IKLSAgLy8vIGRlYnVnZ2luZyBwdXJwb3Nlcy4KLSAgLy8vCi0gIHZpcnR1YWwgY29uc3QgY2hhciogZ2V0T2JqZWN0VHlwZU5hbWUobXZtOjpnYyogb2JqZWN0KTsKLQotCS8vLyBydW5BcHBsaWNhdGlvbkltcGwgLSBjb2RlIGV4ZWN1dGVkIGFmdGVyIGEgcnVuQXBwbGljYXRpb24gaW4gYSB2bWtpdCB0aHJlYWQKLQkvLy8KLQl2aXJ0dWFsIHZvaWQgcnVuQXBwbGljYXRpb25JbXBsKGludCBhcmdjLCBjaGFyKiogYXJndik7Ci0KLXB1YmxpYzoKLQkvLy8gcnVuRmlsZSAtIGV4ZWN1dGUgdGhlIGZpbGUgZmlsZU5hbWUKLQkvLy8KLQl2b2lkIHJ1bkZpbGUoY29uc3QgY2hhciogZmlsZU5hbWUpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgcDMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92bWtpdC9saWIvcDMvVk1Db3JlL1AzRXJyb3IuaCBiL3Zta2l0L2xpYi9wMy9WTUNvcmUvUDNFcnJvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDRkNWEwLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9wMy9WTUNvcmUvUDNFcnJvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotI2lmbmRlZiBfUDNfRVJST1JfSF8KLSNkZWZpbmUgX1AzX0VSUk9SX0hfCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jZGVmaW5lIE5JKCkgXAotCWRvIHsgZnByaW50ZihzdGRlcnIsICIlcyBpcyBub3QgaW1wbGVtZW50ZWQgYXQgJXM6OiVkXG4iLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBfX0ZJTEVfXywgX19MSU5FX18pOyBhYm9ydCgpOyB9IHdoaWxlKDApCi0KLSNkZWZpbmUgZmF0YWwoLi4uKSBcCi0JZG8geyBmcHJpbnRmKHN0ZGVyciwgIkZBVEFMOiAiKTsgZnByaW50ZihzdGRlcnIsIF9fVkFfQVJHU19fKTsgZnByaW50ZihzdGRlcnIsICJcbiIpOyBhYm9ydCgpOyB9IHdoaWxlKDApCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL3AzL1ZNQ29yZS9QM0V4dHJhY3Rvci5jcHAgYi92bWtpdC9saWIvcDMvVk1Db3JlL1AzRXh0cmFjdG9yLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlYTgzNC4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvcDMvVk1Db3JlL1AzRXh0cmFjdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLSNpbmNsdWRlICJQM0V4dHJhY3Rvci5oIgotI2luY2x1ZGUgIlAzUmVhZGVyLmgiCi0jaW5jbHVkZSAiUDNFcnJvci5oIgotI2luY2x1ZGUgIlAzT2JqZWN0LmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBwMzsKLQotI2RlZmluZSBUWVBFX05VTEwgICAgICAgICAgICAgICAnMCcKLSNkZWZpbmUgVFlQRV9OT05FICAgICAgICAgICAgICAgJ04nCi0jZGVmaW5lIFRZUEVfRkFMU0UgICAgICAgICAgICAgICdGJwotI2RlZmluZSBUWVBFX1RSVUUgICAgICAgICAgICAgICAnVCcKLSNkZWZpbmUgVFlQRV9TVE9QSVRFUiAgICAgICAgICAgJ1MnCi0jZGVmaW5lIFRZUEVfRUxMSVBTSVMgICAgICAgICAgICcuJwotI2RlZmluZSBUWVBFX0lOVCAgICAgICAgICAgICAgICAnaScKLSNkZWZpbmUgVFlQRV9JTlQ2NCAgICAgICAgICAgICAgJ0knCi0jZGVmaW5lIFRZUEVfRkxPQVQgICAgICAgICAgICAgICdmJwotI2RlZmluZSBUWVBFX0JJTkFSWV9GTE9BVCAgICAgICAnZycKLSNkZWZpbmUgVFlQRV9DT01QTEVYICAgICAgICAgICAgJ3gnCi0jZGVmaW5lIFRZUEVfQklOQVJZX0NPTVBMRVggICAgICd5JwotI2RlZmluZSBUWVBFX0xPTkcgICAgICAgICAgICAgICAnbCcKLSNkZWZpbmUgVFlQRV9TVFJJTkcgICAgICAgICAgICAgJ3MnCi0jZGVmaW5lIFRZUEVfSU5URVJORUQgICAgICAgICAgICd0JwotI2RlZmluZSBUWVBFX1NUUklOR1JFRiAgICAgICAgICAnUicKLSNkZWZpbmUgVFlQRV9UVVBMRSAgICAgICAgICAgICAgJygnCi0jZGVmaW5lIFRZUEVfTElTVCAgICAgICAgICAgICAgICdbJwotI2RlZmluZSBUWVBFX0RJQ1QgICAgICAgICAgICAgICAneycKLSNkZWZpbmUgVFlQRV9DT0RFICAgICAgICAgICAgICAgJ2MnCi0jZGVmaW5lIFRZUEVfVU5JQ09ERSAgICAgICAgICAgICd1JwotI2RlZmluZSBUWVBFX1VOS05PV04gICAgICAgICAgICAnPycKLSNkZWZpbmUgVFlQRV9TRVQgICAgICAgICAgICAgICAgJzwnCi0jZGVmaW5lIFRZUEVfRlJPWkVOU0VUICAgICAgICAgICc+JwotCi1QM09iamVjdCogUDNFeHRyYWN0b3I6OnJlYWRPYmplY3QoKSB7Ci0JdWludDggdHlwZSA9IHJlYWRlci0+cmVhZFUxKCk7Ci0KLQlzd2l0Y2godHlwZSkgewotCQljYXNlIFRZUEVfTk9ORToKLQkJCXJldHVybiBuZXcgUDNOb25lKCk7Ci0KLQkJY2FzZSBUWVBFX1RVUExFOgotCQkJewotCQkJCXVpbnQzMiBsZW5ndGggPSByZWFkZXItPnJlYWRVNCgpOwotCQkJCVAzVHVwbGUqIHJlcyA9IG5ldyBQM1R1cGxlKGxlbmd0aCk7Ci0JCQkJZm9yKHVpbnQzMiBpPTA7IGk8bGVuZ3RoOyBpKyspCi0JCQkJCXJlcy0+Y29udGVudFtpXSA9IHJlYWRPYmplY3QoKTsKLQkJCQlyZXR1cm4gcmVzOwotCQkJfQotCi0JCWNhc2UgVFlQRV9JTlRFUk5FRDoKLQkJY2FzZSBUWVBFX1NUUklORzoKLQkJCXsKLQkJCQl1aW50MzIgbGVuZ3RoID0gcmVhZGVyLT5yZWFkVTQoKTsKLQkJCQlQM1N0cmluZyogcmVzID0gbmV3IFAzU3RyaW5nKGxlbmd0aCk7Ci0JCQkJaWYobGVuZ3RoID4gSU5UX01BWCkKLQkJCQkJZmF0YWwoIndyb25nIGxlbmd0aCBmb3Igc3RyaW5nIik7Ci0JCQkJZm9yKHVpbnQzMiBpPTA7IGk8bGVuZ3RoOyBpKyspCi0JCQkJCXJlcy0+Y29udGVudFtpXSA9IHJlYWRlci0+cmVhZFUxKCk7Ci0JCQkJcmV0dXJuIHJlczsKLQkJCX0KLQotCQljYXNlIFRZUEVfQ09ERToKLQkJCXsKLQkJCQlQM0NvZGUqIHJlcyA9IG5ldyBQM0NvZGUoKTsKLQkJCQlyZXMtPnB5X25hcmdzICAgID0gcmVhZGVyLT5yZWFkVTQoKTsKLQkJCQlyZXMtPnB5X25sb2NhbHMgID0gcmVhZGVyLT5yZWFkVTQoKTsKLQkJCQlyZXMtPnB5X25zdGFja3MgID0gcmVhZGVyLT5yZWFkVTQoKTsKLQkJCQlyZXMtPnB5X2ZsYWcgICAgID0gcmVhZGVyLT5yZWFkVTQoKTsKLQkJCQlyZXMtPnB5X2NvZGUgICAgID0gcmVhZE9iamVjdCgpLT5hc1N0cmluZygpOwotCQkJCXJlcy0+cHlfY29uc3QgICAgPSByZWFkT2JqZWN0KCktPmFzVHVwbGUoKTsKLQkJCQlyZXMtPnB5X25hbWVzICAgID0gcmVhZE9iamVjdCgpOwotCQkJCXJlcy0+cHlfdmFybmFtZXMgPSByZWFkT2JqZWN0KCk7Ci0JCQkJcmVzLT5weV9mcmVldmFycyA9IHJlYWRPYmplY3QoKTsKLQkJCQlyZXMtPnB5X2NlbGx2YXJzID0gcmVhZE9iamVjdCgpOwotCQkJCXJlcy0+cHlfZmlsZW5hbWUgPSByZWFkT2JqZWN0KCk7Ci0JCQkJcmVzLT5weV9uYW1lICAgICA9IHJlYWRPYmplY3QoKTsKLQkJCQlyZXMtPnB5X2xpbmVudW0gID0gcmVhZGVyLT5yZWFkVTQoKTsKLQkJCQlyZXMtPnB5X2xub3RhYiAgID0gcmVhZE9iamVjdCgpOwotCQkJCXJldHVybiByZXM7Ci0JCQl9Ci0KLQkJZGVmYXVsdDoKLQkJCWZhdGFsKCJ3cm9uZyB0eXBlIGluZm86ICVkICgnJWMnKSIsIHR5cGUsIHR5cGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9wMy9WTUNvcmUvUDNFeHRyYWN0b3IuaCBiL3Zta2l0L2xpYi9wMy9WTUNvcmUvUDNFeHRyYWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAwNzBjMy4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvcDMvVk1Db3JlL1AzRXh0cmFjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jaWZuZGVmIF9QM19FWFRSQUNUT1JfSF8KLSNkZWZpbmUgX1AzX0VYVFJBQ1RPUl9IXwotCi1uYW1lc3BhY2UgcDMgewotCi1jbGFzcyBQM09iamVjdDsKLWNsYXNzIFAzUmVhZGVyOwotCi1jbGFzcyBQM0V4dHJhY3RvciB7Ci0JLy8vIHJlYWRlciAtIHRoZSByZWFkZXIKLQlQM1JlYWRlciogcmVhZGVyOwotCi1wdWJsaWM6Ci0JUDNFeHRyYWN0b3IoUDNSZWFkZXIqIHIpIHsgdGhpcy0+cmVhZGVyID0gcjsgfQotCi0JLy8vIHJlYWRPYmplY3QgLSB1bm1hcnNoYWwgYW4gb2JqZWN0Ci0JLy8vCi0JUDNPYmplY3QqIHJlYWRPYmplY3QoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIHAzCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL3AzL1ZNQ29yZS9QM0ludGVycHJldG9yLmNwcCBiL3Zta2l0L2xpYi9wMy9WTUNvcmUvUDNJbnRlcnByZXRvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZDQ1YWUuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL3AzL1ZNQ29yZS9QM0ludGVycHJldG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM5NSArMCwwIEBACi0jaW5jbHVkZSAiUDNJbnRlcnByZXRvci5oIgotI2luY2x1ZGUgIlAzT2JqZWN0LmgiCi0KLSNpbmNsdWRlICJvcGNvZGUuaCIKLQotdXNpbmcgbmFtZXNwYWNlIHAzOwotCi0jZGVmaW5lIGZldGNoX2FyZygpIChwYys9MiwgYmMtPmNvbnRlbnRbcGMtMV08PDgrYmMtPmNvbnRlbnRbcGMtMl0pCi0jZGVmaW5lIHB1c2godmFsKSAgIHN0YWNrLT5jb250ZW50W3N0YWNrLT5sZW5ndGgrK109dmFsCi0jZGVmaW5lIHBvcCgpICAgICAgIHN0YWNrLT5jb250ZW50Wy0tc3RhY2stPmxlbmd0aF0KLQotUDNPYmplY3QqIFAzSW50ZXJwcmV0b3I6OmV4ZWN1dGUoKSB7Ci0JcHJpbnRmKCJFeGVjdXRlOiAiKTsKLQljb2RlLT5wcmludCgpOwotCXByaW50ZigiXG4iKTsKLQlQM1N0YWNrKiAgIHN0YWNrID0gbmV3IFAzU3RhY2soY29kZS0+cHlfbnN0YWNrcyk7Ci0JUDNTdHJpbmcqICBiYyA9IGNvZGUtPnB5X2NvZGU7Ci0JdWludDMyICAgICBwYz0wOwotCi0Jd2hpbGUoMSkgewotCQl1aW50OCBvcCA9IGJjLT5jb250ZW50W3BjKytdOwotCQkKLQkJcHJpbnRmKCIgIC0tIHN0YWNrOiAiKTsKLQkJc3RhY2stPnByaW50KCk7Ci0JCXByaW50ZigiXG4iKTsKLQkJcHJpbnRmKCIgIC0tIGZldGNoIG9wY29kZSAlZCAoJXMpXG4iLCBvcCwgb3Bjb2RlTmFtZXNbb3BdKTsKLQotCQlzd2l0Y2gob3ApIHsKLQkJCWNhc2UgU1RPUF9DT0RFOiAvLzAKLQkJCWNhc2UgUE9QX1RPUDogLy8xCi0JCQljYXNlIFJPVF9UV086IC8vMgotCQkJY2FzZSBST1RfVEhSRUU6IC8vMwotCQkJY2FzZSBEVVBfVE9QOiAvLzQKLQkJCWNhc2UgUk9UX0ZPVVI6IC8vNQotCQkJY2FzZSBOT1A6IC8vOQotCi0JCQljYXNlIFVOQVJZX1BPU0lUSVZFOiAvLzEwCi0JCQljYXNlIFVOQVJZX05FR0FUSVZFOiAvLzExCi0JCQljYXNlIFVOQVJZX05PVDogLy8xMgotCQkJY2FzZSBVTkFSWV9DT05WRVJUOiAvLzEzCi0JCQkKLQkJCWNhc2UgVU5BUllfSU5WRVJUOiAvLzE1Ci0JCQkKLQkJCWNhc2UgTElTVF9BUFBFTkQ6IC8vMTgKLQkJCWNhc2UgQklOQVJZX1BPV0VSOiAvLzE5Ci0JCQkKLQkJCWNhc2UgQklOQVJZX01VTFRJUExZOiAvLzIwCi0JCQljYXNlIEJJTkFSWV9ESVZJREU6IC8vMjEKLQkJCWNhc2UgQklOQVJZX01PRFVMTzogLy8yMgotCQkJY2FzZSBCSU5BUllfQUREOiAvLzIzCi0JCQljYXNlIEJJTkFSWV9TVUJUUkFDVDogLy8yNAotCQkJY2FzZSBCSU5BUllfU1VCU0NSOiAvLzI1Ci0JCQljYXNlIEJJTkFSWV9GTE9PUl9ESVZJREU6IC8vMjYKLQkJCWNhc2UgQklOQVJZX1RSVUVfRElWSURFOiAvLzI3Ci0JCQljYXNlIElOUExBQ0VfRkxPT1JfRElWSURFOiAvLzI4Ci0JCQljYXNlIElOUExBQ0VfVFJVRV9ESVZJREU6IC8vMjkKLQkJCQotCQkJY2FzZSBTTElDRTogLy8zMAotCQkJCS8qIEFsc28gdXNlcyA6IDMxLTMzICovCi0JCQkKLQkJCWNhc2UgU1RPUkVfU0xJQ0U6IC8vNDAKLQkJCQkvKiBBbHNvIHVzZXMgOiA0MS00MyAqLwotCQkJCi0JCQljYXNlIERFTEVURV9TTElDRTogLy81MAotCQkJCS8qIEFsc28gdXNlcyA6IDUxLTUzICovCi0JCQkKLQkJCWNhc2UgU1RPUkVfTUFQOiAvLzU0Ci0JCQljYXNlIElOUExBQ0VfQUREOiAvLzU1Ci0JCQljYXNlIElOUExBQ0VfU1VCVFJBQ1Q6IC8vNTYKLQkJCWNhc2UgSU5QTEFDRV9NVUxUSVBMWTogLy81NwotCQkJY2FzZSBJTlBMQUNFX0RJVklERTogLy81OAotCQkJY2FzZSBJTlBMQUNFX01PRFVMTzogLy81OQotCQkJY2FzZSBTVE9SRV9TVUJTQ1I6IC8vNjAKLQkJCWNhc2UgREVMRVRFX1NVQlNDUjogLy82MQotCQkJCi0JCQljYXNlIEJJTkFSWV9MU0hJRlQ6IC8vNjIKLQkJCWNhc2UgQklOQVJZX1JTSElGVDogLy82MwotCQkJY2FzZSBCSU5BUllfQU5EOiAvLzY0Ci0JCQljYXNlIEJJTkFSWV9YT1I6IC8vNjUKLQkJCWNhc2UgQklOQVJZX09SOiAvLzY2Ci0JCQljYXNlIElOUExBQ0VfUE9XRVI6IC8vNjcKLQkJCWNhc2UgR0VUX0lURVI6IC8vNjgKLQkJCQotCQkJY2FzZSBQUklOVF9FWFBSOiAvLzcwCi0JCQkJTkkoKTsKLQotCQkJY2FzZSBQUklOVF9JVEVNOiAvLzcxCi0JCQkJcG9wKCktPnByaW50KCk7Ci0JCQkJYnJlYWs7Ci0JCQkJCi0JCQljYXNlIFBSSU5UX05FV0xJTkU6IC8vNzIKLQkJCQlwcmludGYoIlxuIik7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgUFJJTlRfSVRFTV9UTzogLy83MwotCQkJY2FzZSBQUklOVF9ORVdMSU5FX1RPOiAvLzc0Ci0JCQljYXNlIElOUExBQ0VfTFNISUZUOiAvLzc1Ci0JCQljYXNlIElOUExBQ0VfUlNISUZUOiAvLzc2Ci0JCQljYXNlIElOUExBQ0VfQU5EOiAvLzc3Ci0JCQljYXNlIElOUExBQ0VfWE9SOiAvLzc4Ci0JCQljYXNlIElOUExBQ0VfT1I6IC8vNzkKLQkJCWNhc2UgQlJFQUtfTE9PUDogLy84MAotCQkJY2FzZSBXSVRIX0NMRUFOVVA6IC8vODEKLQkJCWNhc2UgTE9BRF9MT0NBTFM6IC8vODIKLQkJCQlOSSgpOwotCi0JCQljYXNlIFJFVFVSTl9WQUxVRTogLy84MwotCQkJCXJldHVybiBwb3AoKTsKLQotCQkJY2FzZSBJTVBPUlRfU1RBUjogLy84NAotCQkJY2FzZSBFWEVDX1NUTVQ6IC8vODUKLQkJCWNhc2UgWUlFTERfVkFMVUU6IC8vODYKLQkJCWNhc2UgUE9QX0JMT0NLOiAvLzg3Ci0JCQljYXNlIEVORF9GSU5BTExZOiAvLzg4Ci0JCQljYXNlIEJVSUxEX0NMQVNTOiAvLzg5Ci0KLQkJCWNhc2UgSEFWRV9BUkdVTUVOVDogLy85MAotCQkJCS8qIE9wY29kZXMgZnJvbSBoZXJlIGhhdmUgYW4gYXJndW1lbnQ6ICovCi0KLQkJCQkvLwkJCWNhc2UgU1RPUkVfTkFNRTogLy85MAotCQkJCS8qIEluZGV4IGluIG5hbWUgbGlzdCAqLwotCQkJY2FzZSBERUxFVEVfTkFNRTogLy85MQotCQkJCS8qICIiICovCi0JCQljYXNlIFVOUEFDS19TRVFVRU5DRTogLy85MgotCQkJCS8qIE51bWJlciBvZiBzZXF1ZW5jZSBpdGVtcyAqLwotCQkJY2FzZSBGT1JfSVRFUjogLy85MwotCQkJCi0JCQljYXNlIFNUT1JFX0FUVFI6IC8vOTUKLQkJCQkvKiBJbmRleCBpbiBuYW1lIGxpc3QgKi8KLQkJCWNhc2UgREVMRVRFX0FUVFI6IC8vOTYKLQkJCQkvKiAiIiAqLwotCQkJY2FzZSBTVE9SRV9HTE9CQUw6IC8vOTcKLQkJCQkvKiAiIiAqLwotCQkJY2FzZSBERUxFVEVfR0xPQkFMOiAvLzk4Ci0JCQkJLyogIiIgKi8KLQkJCWNhc2UgRFVQX1RPUFg6IC8vOTkKLQkJCQkvKiBudW1iZXIgb2YgaXRlbXMgdG8gZHVwbGljYXRlICovCi0JCQkJTkkoKTsKLQkJCQkKLQkJCWNhc2UgTE9BRF9DT05TVDogLy8gMTAwCi0JCQkJcHVzaChjb2RlLT5weV9jb25zdC0+YXQoZmV0Y2hfYXJnKCkpKTsKLQkJCQlicmVhazsKLQotCQkJCS8qIEluZGV4IGluIGNvbnN0IGxpc3QgKi8KLQkJCWNhc2UgTE9BRF9OQU1FOiAvLzEwMQotCQkJCS8qIEluZGV4IGluIG5hbWUgbGlzdCAqLwotCQkJY2FzZSBCVUlMRF9UVVBMRTogLy8xMDIKLQkJCQkvKiBOdW1iZXIgb2YgdHVwbGUgaXRlbXMgKi8KLQkJCWNhc2UgQlVJTERfTElTVDogLy8xMDMKLQkJCQkvKiBOdW1iZXIgb2YgbGlzdCBpdGVtcyAqLwotCQkJY2FzZSBCVUlMRF9NQVA6IC8vMTA0Ci0JCQkJLyogQWx3YXlzIHplcm8gZm9yIG5vdyAqLwotCQkJY2FzZSBMT0FEX0FUVFI6IC8vMTA1Ci0JCQkJLyogSW5kZXggaW4gbmFtZSBsaXN0ICovCi0JCQljYXNlIENPTVBBUkVfT1A6IC8vMTA2Ci0JCQkJLyogQ29tcGFyaXNvbiBvcGVyYXRvciAqLwotCQkJY2FzZSBJTVBPUlRfTkFNRTogLy8xMDcKLQkJCQkvKiBJbmRleCBpbiBuYW1lIGxpc3QgKi8KLQkJCWNhc2UgSU1QT1JUX0ZST006IC8vMTA4Ci0JCQkJLyogSW5kZXggaW4gbmFtZSBsaXN0ICovCi0JCQkKLQkJCWNhc2UgSlVNUF9GT1JXQVJEOiAvLzExMAotCQkJCS8qIE51bWJlciBvZiBieXRlcyB0byBza2lwICovCi0JCQljYXNlIEpVTVBfSUZfRkFMU0U6IC8vMTExCi0JCQkJLyogIiIgKi8KLQkJCWNhc2UgSlVNUF9JRl9UUlVFOiAvLzExMgotCQkJCS8qICIiICovCi0JCQljYXNlIEpVTVBfQUJTT0xVVEU6IC8vMTEzCi0JCQkJLyogVGFyZ2V0IGJ5dGUgb2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIGNvZGUgKi8KLQotCQkJY2FzZSBMT0FEX0dMT0JBTDogLy8xMTYKLQkJCQkvKiBJbmRleCBpbiBuYW1lIGxpc3QgKi8KLQotCQkJY2FzZSBDT05USU5VRV9MT09QOiAvLzExOQotCQkJCS8qIFN0YXJ0IG9mIGxvb3AgKGFic29sdXRlKSAqLwotCQkJY2FzZSBTRVRVUF9MT09QOiAvLzEyMAotCQkJCS8qIFRhcmdldCBhZGRyZXNzIChyZWxhdGl2ZSkgKi8KLQkJCWNhc2UgU0VUVVBfRVhDRVBUOiAvLzEyMQotCQkJCS8qICIiICovCi0JCQljYXNlIFNFVFVQX0ZJTkFMTFk6IC8vMTIyCi0JCQkJLyogIiIgKi8KLQotCQkJY2FzZSBMT0FEX0ZBU1Q6IC8vMTI0Ci0JCQkJLyogTG9jYWwgdmFyaWFibGUgbnVtYmVyICovCi0JCQljYXNlIFNUT1JFX0ZBU1Q6IC8vMTI1Ci0JCQkJLyogTG9jYWwgdmFyaWFibGUgbnVtYmVyICovCi0JCQljYXNlIERFTEVURV9GQVNUOiAvLzEyNgotCQkJCS8qIExvY2FsIHZhcmlhYmxlIG51bWJlciAqLwotCi0JCQljYXNlIFJBSVNFX1ZBUkFSR1M6IC8vMTMwCi0JCQkJLyogTnVtYmVyIG9mIHJhaXNlIGFyZ3VtZW50cyAoMSwgMiBvciAzKSAqLwotCQkJCS8qIENBTExfRlVOQ1RJT05fWFhYIG9wY29kZXMgZGVmaW5lZCBiZWxvdyBkZXBlbmQgb24gdGhpcyBkZWZpbml0aW9uICovCi0JCQljYXNlIENBTExfRlVOQ1RJT046IC8vMTMxCi0JCQkJLyogI2FyZ3MgKyAoI2t3YXJnczw8OCkgKi8KLQkJCWNhc2UgTUFLRV9GVU5DVElPTjogLy8xMzIKLQkJCQkvKiAjZGVmYXVsdHMgKi8KLQkJCWNhc2UgQlVJTERfU0xJQ0U6IC8vMTMzCi0JCQkJLyogTnVtYmVyIG9mIGl0ZW1zICovCi0KLQkJCWNhc2UgTUFLRV9DTE9TVVJFOiAvLzEzNAotCQkJCS8qICNmcmVlIHZhcnMgKi8KLQkJCWNhc2UgTE9BRF9DTE9TVVJFOiAvLzEzNQotCQkJCS8qIExvYWQgZnJlZSB2YXJpYWJsZSBmcm9tIGNsb3N1cmUgKi8KLQkJCWNhc2UgTE9BRF9ERVJFRjogLy8xMzYKLQkJCQkvKiBMb2FkIGFuZCBkZXJlZmVyZW5jZSBmcm9tIGNsb3N1cmUgY2VsbCAqLyAKLQkJCWNhc2UgU1RPUkVfREVSRUY6IC8vMTM3Ci0JCQkJLyogU3RvcmUgaW50byBjZWxsICovIAotCi0JCQkJLyogVGhlIG5leHQgMyBvcGNvZGVzIG11c3QgYmUgY29udGlndW91cyBhbmQgc2F0aXNmeQotCQkJCQkgKENBTExfRlVOQ1RJT05fVkFSIC0gQ0FMTF9GVU5DVElPTikgJiAzID09IDEgICovCi0JCQljYXNlIENBTExfRlVOQ1RJT05fVkFSOiAvLzE0MAotCQkJCS8qICNhcmdzICsgKCNrd2FyZ3M8PDgpICovCi0JCQljYXNlIENBTExfRlVOQ1RJT05fS1c6IC8vMTQxCi0JCQkJLyogI2FyZ3MgKyAoI2t3YXJnczw8OCkgKi8KLQkJCWNhc2UgQ0FMTF9GVU5DVElPTl9WQVJfS1c6IC8vMTQyCi0JCQkJLyogI2FyZ3MgKyAoI2t3YXJnczw8OCkgKi8KLQotCQkJCS8qIFN1cHBvcnQgZm9yIG9wYXJncyBtb3JlIHRoYW4gOiAvLzE2IGJpdHMgbG9uZyAqLwotCQkJY2FzZSBFWFRFTkRFRF9BUkc6IC8vMTQzCi0KLQkJCWRlZmF1bHQ6Ci0JCQkJZmF0YWwoInVuYWJsZSB0byBpbnRlcnByZXQgb3Bjb2RlOiAlZCIsIG9wKTsKLQotCQl9Ci0JfQotfQotCi1jb25zdCBjaGFyKiBQM0ludGVycHJldG9yOjpvcGNvZGVOYW1lc1tdID0gewotCSJTVE9QX0NPREUiLCAgICAgICAgICAgICAgLy8gMAotCSJQT1BfVE9QIiwgICAgICAgICAgICAgICAgLy8gMQotCSJST1RfVFdPIiwgICAgICAgICAgICAgICAgLy8gMgotCSJST1RfVEhSRUUiLCAgICAgICAgICAgICAgLy8gMwotCSJEVVBfVE9QIiwgICAgICAgICAgICAgICAgLy8gNAotCSJST1RfRk9VUiIsICAgICAgICAgICAgICAgLy8gNQotCSI2X191bmtub3ciLCAgICAgICAgICAgICAgLy8gNgotCSI3X191bmtub3ciLCAgICAgICAgICAgICAgLy8gNwotCSI4X191bmtub3ciLCAgICAgICAgICAgICAgLy8gOAotCSJOT1AiLCAgICAgICAgICAgICAgICAgICAgLy8gOQotCi0JIlVOQVJZX1BPU0lUSVZFIiwgICAgICAgICAvLyAxMAotCSJVTkFSWV9ORUdBVElWRSIsICAgICAgICAgLy8gMTEKLQkiVU5BUllfTk9UIiwgICAgICAgICAgICAgIC8vIDEyCi0JIlVOQVJZX0NPTlZFUlQiLCAgICAgICAgICAvLyAxMwotCSIxNF9fdW5rbm93IiwgICAgICAgICAgICAgLy8gMTQKLQkiVU5BUllfSU5WRVJUIiwgICAgICAgICAgIC8vIDE1Ci0JIjE2X191bmtub3ciLCAgICAgICAgICAgICAvLyAxNgotCSIxN19fdW5rbm93IiwgICAgICAgICAgICAgLy8gMTcKLQkiTElTVF9BUFBFTkQiLCAgICAgICAgICAgIC8vIDE4Ci0JIkJJTkFSWV9QT1dFUiIsICAgICAgICAgICAvLyAxOQotCi0JIkJJTkFSWV9NVUxUSVBMWSIsICAgICAgICAvLyAyMAotCSJCSU5BUllfRElWSURFIiwgICAgICAgICAgLy8gMjEKLQkiQklOQVJZX01PRFVMTyIsICAgICAgICAgIC8vIDIyCi0JIkJJTkFSWV9BREQiLCAgICAgICAgICAgICAvLyAyMwotCSJCSU5BUllfU1VCVFJBQ1QiLCAgICAgICAgLy8gMjQKLQkiQklOQVJZX1NVQlNDUiIsICAgICAgICAgIC8vIDI1Ci0JIkJJTkFSWV9GTE9PUl9ESVZJREUiLCAgICAvLyAyNgotCSJCSU5BUllfVFJVRV9ESVZJREUiLCAgICAgLy8gMjcKLQkiSU5QTEFDRV9GTE9PUl9ESVZJREUiLCAgIC8vIDI4Ci0JIklOUExBQ0VfVFJVRV9ESVZJREUiLCAgICAvLyAyOQotCi0JIlNMSUNFIiwgICAgICAgICAgICAgICAgICAvLyAzMAotCS8qIEFsc28gdXNlcyAsIC8vIDMxLSwgLy8gMzMgKi8KLQkiMzFfX1NMSUNFIiwgICAgICAgICAgICAgIC8vIDMxCi0JIjMyX19TTElDRSIsICAgICAgICAgICAgICAvLyAzMgotCSIzM19fU0xJQ0UiLCAgICAgICAgICAgICAgLy8gMzMKLQkiMzRfX3Vua25vdyIsICAgICAgICAgICAgIC8vIDM0Ci0JIjM1X191bmtub3ciLCAgICAgICAgICAgICAvLyAzNQotCSIzNl9fdW5rbm93IiwgICAgICAgICAgICAgLy8gMzYKLQkiMzdfX3Vua25vdyIsICAgICAgICAgICAgIC8vIDM3Ci0JIjM4X191bmtub3ciLCAgICAgICAgICAgICAvLyAzOAotCSIzOV9fdW5rbm93IiwgICAgICAgICAgICAgLy8gMzkKLQotCSJTVE9SRV9TTElDRSIsICAgICAgICAgICAgLy8gNDAKLQkvKiBBbHNvIHVzZXMgLCAvLyA0MS0sIC8vIDQzICovCi0JIjQxX19TVE9SRV9TTElDRSIsICAgICAgICAvLyA0MQotCSI0Ml9fU1RPUkVfU0xJQ0UiLCAgICAgICAgLy8gNDIKLQkiNDNfX1NUT1JFX1NMSUNFIiwgICAgICAgIC8vIDQzCi0JIjQ0X191bmtub3ciLCAgICAgICAgICAgICAvLyA0NAotCSI0NV9fdW5rbm93IiwgICAgICAgICAgICAgLy8gNDUKLQkiNDZfX3Vua25vdyIsICAgICAgICAgICAgIC8vIDQ2Ci0JIjQ3X191bmtub3ciLCAgICAgICAgICAgICAvLyA0NwotCSI0OF9fdW5rbm93IiwgICAgICAgICAgICAgLy8gNDgKLQkiNDlfX3Vua25vdyIsICAgICAgICAgICAgIC8vIDQ5Ci0KLQkiREVMRVRFX1NMSUNFIiwgICAgICAgICAgIC8vIDUwCi0JLyogQWxzbyB1c2VzICwgLy8gNTEtLCAvLyA1MyAqLwotCSI1MV9fREVMRVRFX1NMSUNFIiwgICAgICAgLy8gNTEKLQkiNTJfX0RFTEVURV9TTElDRSIsICAgICAgIC8vIDUyCi0JIjUzX19ERUxFVEVfU0xJQ0UiLCAgICAgICAvLyA1MwotCSJTVE9SRV9NQVAiLCAgICAgICAgICAgICAgLy8gNTQKLQkiSU5QTEFDRV9BREQiLCAgICAgICAgICAgIC8vIDU1Ci0JIklOUExBQ0VfU1VCVFJBQ1QiLCAgICAgICAvLyA1NgotCSJJTlBMQUNFX01VTFRJUExZIiwgICAgICAgLy8gNTcKLQkiSU5QTEFDRV9ESVZJREUiLCAgICAgICAgIC8vIDU4Ci0JIklOUExBQ0VfTU9EVUxPIiwgICAgICAgICAvLyA1OQotCi0JIlNUT1JFX1NVQlNDUiIsICAgICAgICAgICAvLyA2MAotCSJERUxFVEVfU1VCU0NSIiwgICAgICAgICAgLy8gNjEKLQkiQklOQVJZX0xTSElGVCIsICAgICAgICAgIC8vIDYyCi0JIkJJTkFSWV9SU0hJRlQiLCAgICAgICAgICAvLyA2MwotCSJCSU5BUllfQU5EIiwgICAgICAgICAgICAgLy8gNjQKLQkiQklOQVJZX1hPUiIsICAgICAgICAgICAgIC8vIDY1Ci0JIkJJTkFSWV9PUiIsICAgICAgICAgICAgICAvLyA2NgotCSJJTlBMQUNFX1BPV0VSIiwgICAgICAgICAgLy8gNjcKLQkiR0VUX0lURVIiLCAgICAgICAgICAgICAgIC8vIDY4Ci0JIjY5X191bmtub3ciLCAgICAgICAgICAgICAvLyA2OQotCi0JIlBSSU5UX0VYUFIiLCAgICAgICAgICAgICAvLyA3MAotCSJQUklOVF9JVEVNIiwgICAgICAgICAgICAgLy8gNzEKLQkiUFJJTlRfTkVXTElORSIsICAgICAgICAgIC8vIDcyCi0JIlBSSU5UX0lURU1fVE8iLCAgICAgICAgICAvLyA3MwotCSJQUklOVF9ORVdMSU5FX1RPIiwgICAgICAgLy8gNzQKLQkiSU5QTEFDRV9MU0hJRlQiLCAgICAgICAgIC8vIDc1Ci0JIklOUExBQ0VfUlNISUZUIiwgICAgICAgICAvLyA3NgotCSJJTlBMQUNFX0FORCIsICAgICAgICAgICAgLy8gNzcKLQkiSU5QTEFDRV9YT1IiLCAgICAgICAgICAgIC8vIDc4Ci0JIklOUExBQ0VfT1IiLCAgICAgICAgICAgICAvLyA3OQotCi0JIkJSRUFLX0xPT1AiLCAgICAgICAgICAgICAvLyA4MAotCSJXSVRIX0NMRUFOVVAiLCAgICAgICAgICAgLy8gODEKLQkiTE9BRF9MT0NBTFMiLCAgICAgICAgICAgIC8vIDgyCi0JIlJFVFVSTl9WQUxVRSIsICAgICAgICAgICAvLyA4MwotCSJJTVBPUlRfU1RBUiIsICAgICAgICAgICAgLy8gODQKLQkiRVhFQ19TVE1UIiwgICAgICAgICAgICAgIC8vIDg1Ci0JIllJRUxEX1ZBTFVFIiwgICAgICAgICAgICAvLyA4NgotCSJQT1BfQkxPQ0siLCAgICAgICAgICAgICAgLy8gODcKLQkiRU5EX0ZJTkFMTFkiLCAgICAgICAgICAgIC8vIDg4Ci0JIkJVSUxEX0NMQVNTIiwgICAgICAgICAgICAvLyA4OQotCi0JIkhBVkVfQVJHVU1FTlQiLCAgICAgICAgICAvLyA5MAkvKiBPcGNvZGVzIGZyb20gaGVyZSBoYXZlIGFuIGFyZ3VtZW50OiAqLwotCS8vCSJTVE9SRV9OQU1FIiwgICAgICAgICAgICAgLy8gOTAJLyogSW5kZXggaW4gbmFtZSBsaXN0ICovCi0JIkRFTEVURV9OQU1FIiwgICAgICAgICAgICAvLyA5MQkvKiAiIiwgKi8KLQkiVU5QQUNLX1NFUVVFTkNFIiwgICAgICAgIC8vIDkyCS8qIE51bWJlciBvZiBzZXF1ZW5jZSBpdGVtcyAqLwotCSJGT1JfSVRFUiIsICAgICAgICAgICAgICAgLy8gOTMKLQkiOTRfX3Vua25vdyIsICAgICAgICAgICAgIC8vIDk0Ci0JIlNUT1JFX0FUVFIiLCAgICAgICAgICAgICAvLyA5NQkvKiBJbmRleCBpbiBuYW1lIGxpc3QgKi8KLQkiREVMRVRFX0FUVFIiLCAgICAgICAgICAgIC8vIDk2CS8qICIiICovCi0JIlNUT1JFX0dMT0JBTCIsICAgICAgICAgICAvLyA5NwkvKiAiIiAqLwotCSJERUxFVEVfR0xPQkFMIiwgICAgICAgICAgLy8gOTgJLyogIiIgKi8KLQkiRFVQX1RPUFgiLCAgICAgICAgICAgICAgIC8vIDk5CS8qIG51bWJlciBvZiBpdGVtcyB0byBkdXBsaWNhdGUgKi8KLQotCSJMT0FEX0NPTlNUIiwgICAgICAgICAgICAgLy8gMTAwCS8qIEluZGV4IGluIGNvbnN0IGxpc3QgKi8KLQkiTE9BRF9OQU1FIiwgICAgICAgICAgICAgIC8vIDEwMQkvKiBJbmRleCBpbiBuYW1lIGxpc3QgKi8KLQkiQlVJTERfVFVQTEUiLCAgICAgICAgICAgIC8vIDEwMgkvKiBOdW1iZXIgb2YgdHVwbGUgaXRlbXMgKi8KLQkiQlVJTERfTElTVCIsICAgICAgICAgICAgIC8vIDEwMwkvKiBOdW1iZXIgb2YgbGlzdCBpdGVtcyAqLwotCSJCVUlMRF9NQVAiLCAgICAgICAgICAgICAgLy8gMTA0CS8qIEFsd2F5cyB6ZXJvIGZvciBub3cgKi8KLQkiTE9BRF9BVFRSIiwgICAgICAgICAgICAgIC8vIDEwNQkvKiBJbmRleCBpbiBuYW1lIGxpc3QgKi8KLQkiQ09NUEFSRV9PUCIsICAgICAgICAgICAgIC8vIDEwNgkvKiBDb21wYXJpc29uIG9wZXJhdG9yICovCi0JIklNUE9SVF9OQU1FIiwgICAgICAgICAgICAvLyAxMDcJLyogSW5kZXggaW4gbmFtZSBsaXN0ICovCi0JIklNUE9SVF9GUk9NIiwgICAgICAgICAgICAvLyAxMDgJLyogSW5kZXggaW4gbmFtZSBsaXN0ICovCi0JIjEwOV9fdW5rbm93IiwgICAgICAgICAgICAvLyAxMDkKLQotCSJKVU1QX0ZPUldBUkQiLCAgICAgICAgICAgLy8gMTEwCS8qIE51bWJlciBvZiBieXRlcyB0byBza2lwICovCi0JIkpVTVBfSUZfRkFMU0UiLCAgICAgICAgICAvLyAxMTEJLyogIiIgKi8KLQkiSlVNUF9JRl9UUlVFIiwgICAgICAgICAgIC8vIDExMgkvKiAiIiAqLwotCSJKVU1QX0FCU09MVVRFIiwgICAgICAgICAgLy8gMTEzCS8qIFRhcmdldCBieXRlIG9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBjb2RlICovCi0JIjExNF9fdW5rbm93IiwgICAgICAgICAgICAvLyAxMTQKLQkiMTE1X191bmtub3ciLCAgICAgICAgICAgIC8vIDExNQotCSJMT0FEX0dMT0JBTCIsICAgICAgICAgICAgLy8gMTE2CS8qIEluZGV4IGluIG5hbWUgbGlzdCAqLwotCSIxMTdfX3Vua25vdyIsICAgICAgICAgICAgLy8gMTE3Ci0JIjExOF9fdW5rbm93IiwgICAgICAgICAgICAvLyAxMTgKLQkiQ09OVElOVUVfTE9PUCIsICAgICAgICAgIC8vIDExOQkvKiBTdGFydCBvZiBsb29wIChhYnNvbHV0ZSkgKi8KLQotCSJTRVRVUF9MT09QIiwgICAgICAgICAgICAgLy8gMTIwCS8qIFRhcmdldCBhZGRyZXNzIChyZWxhdGl2ZSkgKi8KLQkiU0VUVVBfRVhDRVBUIiwgICAgICAgICAgIC8vIDEyMQkvKiAiIiAqLwotCSJTRVRVUF9GSU5BTExZIiwgICAgICAgICAgLy8gMTIyCS8qICIiICovCi0JIjEyM19fdW5rbm93IiwgICAgICAgICAgICAvLyAxMjMKLQkiTE9BRF9GQVNUIiwgICAgICAgICAgICAgIC8vIDEyNAkvKiBMb2NhbCB2YXJpYWJsZSBudW1iZXIgKi8KLQkiU1RPUkVfRkFTVCIsICAgICAgICAgICAgIC8vIDEyNQkvKiBMb2NhbCB2YXJpYWJsZSBudW1iZXIgKi8KLQkiREVMRVRFX0ZBU1QiLCAgICAgICAgICAgIC8vIDEyNgkvKiBMb2NhbCB2YXJpYWJsZSBudW1iZXIgKi8KLQkiMTI3X191bmtub3ciLCAgICAgICAgICAgIC8vIDEyNwotCSIxMjhfX3Vua25vdyIsICAgICAgICAgICAgLy8gMTI4Ci0JIjEyOV9fdW5rbm93IiwgICAgICAgICAgICAvLyAxMjkKLQotCSJSQUlTRV9WQVJBUkdTIiwgICAgICAgICAgLy8gMTMwCS8qIE51bWJlciBvZiByYWlzZSBhcmd1bWVudHMgKCwgLy8gMSwgLCAvLyAyIG9yICwgLy8gMykgKi8KLQkvKiBDQUxMX0ZVTkNUSU9OX1hYWCBvcGNvZGVzIGRlZmluZWQgYmVsb3cgZGVwZW5kIG9uIHRoaXMgZGVmaW5pdGlvbiAqLwotCSJDQUxMX0ZVTkNUSU9OIiwgICAgICAgICAgLy8gMTMxCS8qICNhcmdzICsgKCNrd2FyZ3M8PCwgLy8gOCkgKi8KLQkiTUFLRV9GVU5DVElPTiIsICAgICAgICAgIC8vIDEzMgkvKiAjZGVmYXVsdHMgKi8KLQkiQlVJTERfU0xJQ0UiLCAgICAgICAgICAgIC8vIDEzMwkvKiBOdW1iZXIgb2YgaXRlbXMgKi8KLQkiTUFLRV9DTE9TVVJFIiwgICAgICAgICAgIC8vIDEzNCAgLyogI2ZyZWUgdmFycyAqLwotCSJMT0FEX0NMT1NVUkUiLCAgICAgICAgICAgLy8gMTM1ICAvKiBMb2FkIGZyZWUgdmFyaWFibGUgZnJvbSBjbG9zdXJlICovCi0JIkxPQURfREVSRUYiLCAgICAgICAgICAgICAvLyAxMzYgIC8qIExvYWQgYW5kIGRlcmVmZXJlbmNlIGZyb20gY2xvc3VyZSBjZWxsICovIAotCSJTVE9SRV9ERVJFRiIsICAgICAgICAgICAgLy8gMTM3ICAvKiBTdG9yZSBpbnRvIGNlbGwgKi8gCi0JIjEzOF9fdW5rbm93IiwgICAgICAgICAgICAvLyAxMzgKLQkiMTM5X191bmtub3ciLCAgICAgICAgICAgIC8vIDEzOQotCi0JLyogVGhlIG5leHQgLCAvLyAzIG9wY29kZXMgbXVzdCBiZSBjb250aWd1b3VzIGFuZCBzYXRpc2Z5Ci0JCSAoQ0FMTF9GVU5DVElPTl9WQVIgLSBDQUxMX0ZVTkNUSU9OKSAmICA9PSAxICAqLwotCSJDQUxMX0ZVTkNUSU9OX1ZBUiIsICAgICAgLy8gMTQwCS8qICNhcmdzICsgKCNrd2FyZ3M8PDgpICovCi0JIkNBTExfRlVOQ1RJT05fS1ciLCAgICAgICAvLyAxNDEJLyogI2FyZ3MgKyAoI2t3YXJnczw8LCAvLyA4KSAqLwotCSJDQUxMX0ZVTkNUSU9OX1ZBUl9LVyIsICAgLy8gMTQyCS8qICNhcmdzICsgKCNrd2FyZ3M8PCwgLy8gOCkgKi8KLQkvKiBTdXBwb3J0IGZvciBvcGFyZ3MgbW9yZSB0aGFuIDE2IGJpdHMgbG9uZyAqLwotCSJFWFRFTkRFRF9BUkciLCAgICAgICAgICAgLy8gMTQzCi19OwpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL3AzL1ZNQ29yZS9QM0ludGVycHJldG9yLmggYi92bWtpdC9saWIvcDMvVk1Db3JlL1AzSW50ZXJwcmV0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTljYTNiZi4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvcDMvVk1Db3JlL1AzSW50ZXJwcmV0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSNpZm5kZWYgX1AzX0lOVEVSUFJFVE9SX0hfCi0jZGVmaW5lIF9QM19JTlRFUlBSRVRPUl9IXwotCi1uYW1lc3BhY2UgcDMgewotCi1jbGFzcyBQM0NvZGU7Ci1jbGFzcyBQM09iamVjdDsKLQotY2xhc3MgUDNJbnRlcnByZXRvciB7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKm9wY29kZU5hbWVzW107Ci0JUDNDb2RlKiAgICAgICAgICAgY29kZTsKLQotcHVibGljOgotCVAzSW50ZXJwcmV0b3IoUDNDb2RlKiBjKSB7IHRoaXMtPmNvZGUgPSBjOyB9Ci0KLQlQM09iamVjdCogZXhlY3V0ZSgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgcDMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92bWtpdC9saWIvcDMvVk1Db3JlL1AzT2JqZWN0LmNwcCBiL3Zta2l0L2xpYi9wMy9WTUNvcmUvUDNPYmplY3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTY0MWM5Li4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9wMy9WTUNvcmUvUDNPYmplY3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI2luY2x1ZGUgIlAzT2JqZWN0LmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBwMzsKLQotUDNTdHJpbmc6OlAzU3RyaW5nKHVpbnQzMiBsKSB7Ci0JY29udGVudCA9IG5ldyB1aW50OFtsKzFdOwotCWxlbmd0aCAgPSBsOwotCWNvbnRlbnRbbF0gPSAwOwotfQotCi1QM1R1cGxlOjpQM1R1cGxlKHVpbnQzMiBsKSB7Ci0JY29udGVudCA9IG5ldyBQM09iamVjdCpbbF07Ci0JbGVuZ3RoICA9IGw7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9saWIvcDMvVk1Db3JlL1AzT2JqZWN0LmggYi92bWtpdC9saWIvcDMvVk1Db3JlL1AzT2JqZWN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYzBmMjAuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL3AzL1ZNQ29yZS9QM09iamVjdC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotI2lmbmRlZiBfUDNfT0JKRUNUX0hfCi0jZGVmaW5lIF9QM19PQkpFQ1RfSF8KLQotI2luY2x1ZGUgPHR5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlICJQM0Vycm9yLmgiCi0KLW5hbWVzcGFjZSBwMyB7Ci0KLWNsYXNzIFAzU3RyaW5nOwotY2xhc3MgUDNUdXBsZTsKLWNsYXNzIFAzQ29kZTsKLWNsYXNzIFAzTm9uZTsKLQotY2xhc3MgIFAzT2JqZWN0IHsKLXB1YmxpYzoKLSNkZWZpbmUgZG9fdHlwZSh0eXBlLCBuYW1lKQkJCQkJCQkJCQkJCVwKLQl2aXJ0dWFsIGJvb2wgaXMjI25hbWUoKSB7IHJldHVybiAwOyB9CQkJCQkJXAotCXR5cGUqICAgICAgICBhcyMjbmFtZSgpIHsgaWYoIWlzIyNuYW1lKCkpIGZhdGFsKCIlcCBpcyBub3QgYSAiI25hbWUsICh2b2lkKil0aGlzKTsgcmV0dXJuICh0eXBlKil0aGlzOyB9Ci0KLQlkb190eXBlKFAzU3RyaW5nLCBTdHJpbmcpCi0JZG9fdHlwZShQM1R1cGxlLCAgVHVwbGUpCi0JZG9fdHlwZShQM05vbmUsICAgTm9uZSkKLQlkb190eXBlKFAzQ29kZSwgICBDb2RlKQotCi0jdW5kZWYgZG9fdHlwZQotCi0JdmlydHVhbCB2b2lkIHByaW50KCkgeyBwcmludGYoIm9iamVjdEAlcCIsICh2b2lkKil0aGlzKTsgfQotfTsKLQotY2xhc3MgUDNOb25lIDogcHVibGljIFAzT2JqZWN0IHsKLXB1YmxpYzoKLQl2aXJ0dWFsIHZvaWQgcHJpbnQoKSB7IHByaW50ZigiPG5vbmU+Iik7IH0KLX07Ci0KLWNsYXNzIFAzU3RyaW5nIDogcHVibGljIFAzT2JqZWN0IHsKLXB1YmxpYzoKLQl1aW50MzIgbGVuZ3RoOwotCXVpbnQ4KiBjb250ZW50OwotCi0JUDNTdHJpbmcodWludDMyIG4pOwotCi0JdmlydHVhbCBib29sIGlzU3RyaW5nKCkgeyByZXR1cm4gMTsgfQotCXZpcnR1YWwgdm9pZCBwcmludCgpIHsgcHJpbnRmKCIlcyIsIGNvbnRlbnQpOyB9Ci19OwotCi1jbGFzcyBQM1R1cGxlIDogcHVibGljIFAzT2JqZWN0IHsKLXB1YmxpYzoKLQl1aW50MzIgICAgIGxlbmd0aDsKLQlQM09iamVjdCoqIGNvbnRlbnQ7Ci0KLQlQM1R1cGxlKHVpbnQzMiBuKTsKLQotCVAzT2JqZWN0KiBhdCh1aW50MzIgaWR4KSB7IAotCQlpZihpZHggPj0gbGVuZ3RoKQotCQkJZmF0YWwoImFycmF5IG91dCBvZiBib3VuZDogJWQiLCBpZHgpOwotCQlyZXR1cm4gY29udGVudFtpZHhdOyAKLQl9Ci0KLQl2aXJ0dWFsIGJvb2wgaXNUdXBsZSgpIHsgcmV0dXJuIDE7IH0KLQotCXZpcnR1YWwgdm9pZCBwcmludCgpIHsgcHJpbnRmKCJbIik7IGZvcih1aW50MzIgaT0wOyBpPGxlbmd0aDsgaSsrKSBjb250ZW50W2ldLT5wcmludCgpOyBwcmludGYoIl0iKTsgfQotfTsKLQotY2xhc3MgUDNTdGFjayA6IHB1YmxpYyBQM1R1cGxlIHsKLXB1YmxpYzoKLQl1aW50MzIgY2FwYWNpdHk7Ci0KLQlQM1N0YWNrKHVpbnQzMiBjKSA6IFAzVHVwbGUoYykgeyBsZW5ndGggPSAwOyBjYXBhY2l0eSA9IGM7IH0KLX07Ci0KLWNsYXNzIFAzQ29kZSA6IHB1YmxpYyBQM09iamVjdCB7Ci1wdWJsaWM6Ci0JdWludDMyICAgIHB5X25hcmdzOwotCXVpbnQzMiAgICBweV9ubG9jYWxzOwotCXVpbnQzMiAgICBweV9uc3RhY2tzOwotCXVpbnQzMiAgICBweV9mbGFnOwotCVAzU3RyaW5nKiBweV9jb2RlOwotCVAzVHVwbGUqICBweV9jb25zdDsKLQlQM09iamVjdCogcHlfbmFtZXM7Ci0JUDNPYmplY3QqIHB5X3Zhcm5hbWVzOwotCVAzT2JqZWN0KiBweV9mcmVldmFyczsKLQlQM09iamVjdCogcHlfY2VsbHZhcnM7Ci0JUDNPYmplY3QqIHB5X2ZpbGVuYW1lOwotCVAzT2JqZWN0KiBweV9uYW1lOwotCXVpbnQzMiAgICBweV9saW5lbnVtOwotCVAzT2JqZWN0KiBweV9sbm90YWI7Ci0KLQl2aXJ0dWFsIGJvb2wgaXNDb2RlKCkgeyByZXR1cm4gMTsgfQotCi0JdmlydHVhbCB2b2lkIHByaW50KCkgeyBwcmludGYoIkNvZGU8Iik7IHB5X25hbWUtPnByaW50KCk7IHByaW50ZigiPiIpOyB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBwMwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Zta2l0L2xpYi9wMy9WTUNvcmUvUDNSZWFkZXIuY3BwIGIvdm1raXQvbGliL3AzL1ZNQ29yZS9QM1JlYWRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNmM1ODIuLjAwMDAwMDAKLS0tIGEvdm1raXQvbGliL3AzL1ZNQ29yZS9QM1JlYWRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLS0tLSBQM1JlYWRlci5jcHAgLSBPcGVuIGFuZCByZWFkIGZpbGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSA8Y3N0ZGlvPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0KLSNpbmNsdWRlICJ0eXBlcy5oIgotCi0jaW5jbHVkZSAiUDNSZWFkZXIuaCIKLQotdXNpbmcgbmFtZXNwYWNlIHAzOwotCi1jb25zdCBpbnQgUDNSZWFkZXI6OlNlZWtTZXQgPSBTRUVLX1NFVDsKLWNvbnN0IGludCBQM1JlYWRlcjo6U2Vla0N1ciA9IFNFRUtfQ1VSOwotY29uc3QgaW50IFAzUmVhZGVyOjpTZWVrRW5kID0gU0VFS19FTkQ7Ci0KLVAzQnl0ZUNvZGUqIFAzUmVhZGVyOjpvcGVuRmlsZShtdm06OkJ1bXBQdHJBbGxvY2F0b3ImIGFsbG9jYXRvciwgY29uc3QgY2hhciogcGF0aCkgewotICBQM0J5dGVDb2RlKiByZXMgPSBOVUxMOwotICBGSUxFKiBmcCA9IGZvcGVuKHBhdGgsICJyIik7Ci0gIGlmIChmcCAhPSAwKSB7Ci0gICAgZnNlZWsoZnAsIDAsIFNlZWtFbmQpOwotICAgIHNpemVfdCBuYmIgPSBmdGVsbChmcCk7Ci0gICAgZnNlZWsoZnAsIDAsIFNlZWtTZXQpOwotICAgIHJlcyA9IG5ldyhhbGxvY2F0b3IsIG5iYikgUDNCeXRlQ29kZShuYmIpOwotICAgIGlmIChmcmVhZChyZXMtPmVsZW1lbnRzLCBuYmIsIDEsIGZwKSA9PSAwKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgImZyZWFkIGVycm9yXG4iKTsKLSAgICAgIGFib3J0KCk7ICAKLSAgICB9Ci0gICAgZmNsb3NlKGZwKTsKLSAgfQotICByZXR1cm4gcmVzOwotfQotCi12b2lkIFAzUmVhZGVyOjpzZWVrKHVpbnQzMiBwb3MsIGludCBmcm9tKSB7Ci0gIHVpbnQzMiBuID0gMDsKLSAgdWludDMyIHN0YXJ0ID0gbWluOwotICB1aW50MzIgZW5kID0gbWF4OwotICAKLSAgaWYgKGZyb20gPT0gU2Vla0N1cikgbiA9IGN1cnNvciArIHBvczsKLSAgZWxzZSBpZiAoZnJvbSA9PSBTZWVrU2V0KSBuID0gc3RhcnQgKyBwb3M7Ci0gIGVsc2UgaWYgKGZyb20gPT0gU2Vla0VuZCkgbiA9IGVuZCArIHBvczsKLSAgCi0KLSAgYXNzZXJ0KG4gPj0gc3RhcnQgJiYgbiA8PSBlbmQgJiYgIm91dCBvZiByYW5nZSIpOwotCi0gIGN1cnNvciA9IG47Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvdm1raXQvbGliL3AzL1ZNQ29yZS9QM1JlYWRlci5oIGIvdm1raXQvbGliL3AzL1ZNQ29yZS9QM1JlYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjU4MWExLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9wMy9WTUNvcmUvUDNSZWFkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0jaWZuZGVmIF9QM19SRUFERVJfSF8KLSNkZWZpbmUgX1AzX1JFQURFUl9IXwotCi0jaW5jbHVkZSAibXZtL0FsbG9jYXRvci5oIgotCi1uYW1lc3BhY2UgcDMgewotCi1jbGFzcyBQM0J5dGVDb2RlIHsKLSBwdWJsaWM6Ci0gIFAzQnl0ZUNvZGUoaW50IGwpIHsKLSAgICBzaXplID0gbDsKLSAgfQotCi0gIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qgc3osIG12bTo6QnVtcFB0ckFsbG9jYXRvciYgYWxsb2NhdG9yLCBpbnQgbikgewotICAgIHJldHVybiBhbGxvY2F0b3IuQWxsb2NhdGUoc2l6ZW9mKHVpbnQzMl90KSArIG4gKiBzaXplb2YodWludDhfdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2xhc3MgYnl0ZXMiKTsKLSAgfQotCi0gIHVpbnQzMl90IHNpemU7Ci0gIHVpbnQ4X3QgZWxlbWVudHNbMV07Ci19OwotCi1jbGFzcyBQM1JlYWRlciB7Ci1wdWJsaWM6Ci0gIC8vIGJ5dGVzIC0gUG9pbnRlciB0byBhIHJlZmVyZW5jZSBhcnJheS4gVGhlIGFycmF5IGlzIG5vdCBtYW5pcHVsYXRlZCBkaXJlY3RseQotICAvLyBpbiBvcmRlciB0byBzdXBwb3J0IGNvcHlpbmcgR0MuCi0gIFAzQnl0ZUNvZGUqIGJ5dGVzOwotICB1aW50MzIgbWluOwotICB1aW50MzIgY3Vyc29yOwotICB1aW50MzIgbWF4OwotCi0gIFAzUmVhZGVyKFAzQnl0ZUNvZGUqIGFycmF5LCB1aW50MzIgc3RhcnQgPSAwLCB1aW50MzIgZW5kID0gMCkgewotICAgIGlmICghZW5kKSBlbmQgPSBhcnJheS0+c2l6ZTsKLSAgICB0aGlzLT5ieXRlcyA9IGFycmF5OwotICAgIHRoaXMtPmN1cnNvciA9IHN0YXJ0OwotICAgIHRoaXMtPm1pbiA9IHN0YXJ0OwotICAgIHRoaXMtPm1heCA9IHN0YXJ0ICsgZW5kOwotICB9Ci0KLSAgUDNSZWFkZXIoUDNSZWFkZXImIHIsIHVpbnQzMiBuYmIpIHsKLSAgICBieXRlcyA9IHIuYnl0ZXM7Ci0gICAgY3Vyc29yID0gci5jdXJzb3I7Ci0gICAgbWluID0gci5taW47Ci0gICAgbWF4ID0gbWluICsgbmJiOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IGludCBTZWVrU2V0OwotICBzdGF0aWMgY29uc3QgaW50IFNlZWtDdXI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgU2Vla0VuZDsKLQotICBzdGF0aWMgUDNCeXRlQ29kZSogb3BlbkZpbGUobXZtOjpCdW1wUHRyQWxsb2NhdG9yJiBhbGxvY2F0b3IsIGNvbnN0IGNoYXIqIHBhdGgpOwotICAKLSAgdWludDggcmVhZFUxKCkgewotICAgICsrY3Vyc29yOwotICAgIHJldHVybiBieXRlcy0+ZWxlbWVudHNbY3Vyc29yIC0gMV07Ci0gIH0KLSAgCi0gIHNpbnQ4IHJlYWRTMSgpIHsKLSAgICArK2N1cnNvcjsKLSAgICByZXR1cm4gYnl0ZXMtPmVsZW1lbnRzW2N1cnNvciAtIDFdOwotICB9Ci0gIAotICB1aW50MTYgcmVhZFUyKCkgewotICAgIHVpbnQxNiB0bXAgPSAoKHVpbnQxNikocmVhZFUxKCkpKTsKLSAgICByZXR1cm4gdG1wIHwgKCh1aW50MTYpKHJlYWRVMSgpKSkgPDwgODsKLSAgfQotICAKLSAgc2ludDE2IHJlYWRTMigpIHsKLSAgICBzaW50MTYgdG1wID0gKChzaW50MTYpKHJlYWRTMSgpKSk7Ci0gICAgcmV0dXJuIHRtcCB8ICgoc2ludDE2KShyZWFkVTEoKSkpIDw8IDg7Ci0gIH0KLSAgCi0gIHVpbnQzMiByZWFkVTQoKSB7Ci0gICAgdWludDMyIHRtcCA9ICgodWludDMyKShyZWFkVTIoKSkpOwotICAgIHJldHVybiB0bXAgfCAoKHVpbnQzMikocmVhZFUyKCkpKSA8PCAxNjsKLSAgfQotICAKLSAgc2ludDMyIHJlYWRTNCgpIHsKLSAgICBzaW50MzIgdG1wID0gKChzaW50MzIpKHJlYWRTMigpKSk7Ci0gICAgcmV0dXJuIHRtcCB8ICgoc2ludDMyKShyZWFkVTIoKSkpIDw8IDE2OwotICB9Ci0KLSAgdWludDY0IHJlYWRVOCgpIHsKLSAgICB1aW50NjQgdG1wID0gKCh1aW50NjQpKHJlYWRVNCgpKSk7Ci0gICAgcmV0dXJuIHRtcCB8ICgodWludDY0KShyZWFkVTQoKSkpIDw8IDMyOwotICB9Ci0gIAotICBzaW50NjQgcmVhZFM4KCkgewotICAgIHNpbnQ2NCB0bXAgPSAoKHNpbnQ2NCkocmVhZFM0KCkpKTsKLSAgICByZXR1cm4gdG1wIHwgKChzaW50NjQpKHJlYWRVNCgpKSkgPDwgMzI7Ci0gIH0KLQotICBzdGF0aWMgZG91YmxlIHJlYWRGOChpbnQgZmlyc3QsIGludCBzZWNvbmQpIHsKLSAgICBpbnQgdmFsdWVzWzJdOwotICAgIGRvdWJsZSByZXNbMV07Ci0jaWYgZGVmaW5lZChfX1BQQ19fKQotICAgIHZhbHVlc1swXSA9IHNlY29uZDsKLSAgICB2YWx1ZXNbMV0gPSBmaXJzdDsKLSNlbHNlCi0gICAgdmFsdWVzWzBdID0gZmlyc3Q7Ci0gICAgdmFsdWVzWzFdID0gc2Vjb25kOwotI2VuZGlmCi0gICAgbWVtY3B5KHJlcywgdmFsdWVzLCA4KTsgCi0gICAgcmV0dXJuIHJlc1swXTsKLSAgfQotCi0vLyAgIHN0YXRpYyBzaW50NjQgcmVhZFM4KGludCBmaXJzdCwgaW50IHNlY29uZCkgewotLy8gICAgIGludCB2YWx1ZXNbMl07Ci0vLyAgICAgc2ludDY0IHJlc1sxXTsKLS8vICNpZiBkZWZpbmVkKF9fUFBDX18pCi0vLyAgICAgdmFsdWVzWzBdID0gc2Vjb25kOwotLy8gICAgIHZhbHVlc1sxXSA9IGZpcnN0OwotLy8gI2Vsc2UKLS8vICAgICB2YWx1ZXNbMF0gPSBmaXJzdDsKLS8vICAgICB2YWx1ZXNbMV0gPSBzZWNvbmQ7Ci0vLyAjZW5kaWYKLS8vICAgICBtZW1jcHkocmVzLCB2YWx1ZXMsIDgpOyAKLS8vICAgICByZXR1cm4gcmVzWzBdOwotLy8gICB9Ci0gIAotICB1bnNpZ25lZCBpbnQgdGVsbCgpIHsKLSAgICByZXR1cm4gY3Vyc29yIC0gbWluOwotICB9Ci0gIAotICB2b2lkIHNlZWsodWludDMyIHBvcywgaW50IGZyb20pOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgcDMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS92bWtpdC9saWIvcDMvVk1Db3JlL1AzVHJhY2VyLmNwcCBiL3Zta2l0L2xpYi9wMy9WTUNvcmUvUDNUcmFjZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2JjNmIyLi4wMDAwMDAwCi0tLSBhL3Zta2l0L2xpYi9wMy9WTUNvcmUvUDNUcmFjZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jaW5jbHVkZSAiUDMuaCIKLSNpbmNsdWRlICJQM0Vycm9yLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBwMzsKLQotdm9pZCBQMzo6dHJhY2VyKHVpbnRwdHJfdCBjbG9zdXJlKSB7IAotCU5JKCk7IAotfQotCmRpZmYgLS1naXQgYS92bWtpdC9saWIvcDMvVk1Db3JlL29wY29kZS5oIGIvdm1raXQvbGliL3AzL1ZNQ29yZS9vcGNvZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRkODc0ZS4uMDAwMDAwMAotLS0gYS92bWtpdC9saWIvcDMvVk1Db3JlL29wY29kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLSNpZm5kZWYgUHlfT1BDT0RFX0gKLSNkZWZpbmUgUHlfT1BDT0RFX0gKLQotI2RlZmluZSBQeV9MVCAwCi0jZGVmaW5lIFB5X0xFIDEKLSNkZWZpbmUgUHlfRVEgMgotI2RlZmluZSBQeV9ORSAzCi0jZGVmaW5lIFB5X0dUIDQKLSNkZWZpbmUgUHlfR0UgNQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotLyogSW5zdHJ1Y3Rpb24gb3Bjb2RlcyBmb3IgY29tcGlsZWQgY29kZSAqLwotCi0jZGVmaW5lIFNUT1BfQ09ERQkwCi0jZGVmaW5lIFBPUF9UT1AJCTEKLSNkZWZpbmUgUk9UX1RXTwkJMgotI2RlZmluZSBST1RfVEhSRUUJMwotI2RlZmluZSBEVVBfVE9QCQk0Ci0jZGVmaW5lIFJPVF9GT1VSCTUKLSNkZWZpbmUgTk9QCQk5Ci0KLSNkZWZpbmUgVU5BUllfUE9TSVRJVkUJMTAKLSNkZWZpbmUgVU5BUllfTkVHQVRJVkUJMTEKLSNkZWZpbmUgVU5BUllfTk9UCTEyCi0jZGVmaW5lIFVOQVJZX0NPTlZFUlQJMTMKLQotI2RlZmluZSBVTkFSWV9JTlZFUlQJMTUKLQotI2RlZmluZSBMSVNUX0FQUEVORAkxOAotI2RlZmluZSBCSU5BUllfUE9XRVIJMTkKLQotI2RlZmluZSBCSU5BUllfTVVMVElQTFkJMjAKLSNkZWZpbmUgQklOQVJZX0RJVklERQkyMQotI2RlZmluZSBCSU5BUllfTU9EVUxPCTIyCi0jZGVmaW5lIEJJTkFSWV9BREQJMjMKLSNkZWZpbmUgQklOQVJZX1NVQlRSQUNUCTI0Ci0jZGVmaW5lIEJJTkFSWV9TVUJTQ1IJMjUKLSNkZWZpbmUgQklOQVJZX0ZMT09SX0RJVklERSAyNgotI2RlZmluZSBCSU5BUllfVFJVRV9ESVZJREUgMjcKLSNkZWZpbmUgSU5QTEFDRV9GTE9PUl9ESVZJREUgMjgKLSNkZWZpbmUgSU5QTEFDRV9UUlVFX0RJVklERSAyOQotCi0jZGVmaW5lIFNMSUNFCQkzMAotLyogQWxzbyB1c2VzIDMxLTMzICovCi0KLSNkZWZpbmUgU1RPUkVfU0xJQ0UJNDAKLS8qIEFsc28gdXNlcyA0MS00MyAqLwotCi0jZGVmaW5lIERFTEVURV9TTElDRQk1MAotLyogQWxzbyB1c2VzIDUxLTUzICovCi0KLSNkZWZpbmUgU1RPUkVfTUFQCTU0Ci0jZGVmaW5lIElOUExBQ0VfQURECTU1Ci0jZGVmaW5lIElOUExBQ0VfU1VCVFJBQ1QJNTYKLSNkZWZpbmUgSU5QTEFDRV9NVUxUSVBMWQk1NwotI2RlZmluZSBJTlBMQUNFX0RJVklERQk1OAotI2RlZmluZSBJTlBMQUNFX01PRFVMTwk1OQotI2RlZmluZSBTVE9SRV9TVUJTQ1IJNjAKLSNkZWZpbmUgREVMRVRFX1NVQlNDUgk2MQotCi0jZGVmaW5lIEJJTkFSWV9MU0hJRlQJNjIKLSNkZWZpbmUgQklOQVJZX1JTSElGVAk2MwotI2RlZmluZSBCSU5BUllfQU5ECTY0Ci0jZGVmaW5lIEJJTkFSWV9YT1IJNjUKLSNkZWZpbmUgQklOQVJZX09SCTY2Ci0jZGVmaW5lIElOUExBQ0VfUE9XRVIJNjcKLSNkZWZpbmUgR0VUX0lURVIJNjgKLQotI2RlZmluZSBQUklOVF9FWFBSCTcwCi0jZGVmaW5lIFBSSU5UX0lURU0JNzEKLSNkZWZpbmUgUFJJTlRfTkVXTElORQk3MgotI2RlZmluZSBQUklOVF9JVEVNX1RPICAgNzMKLSNkZWZpbmUgUFJJTlRfTkVXTElORV9UTyA3NAotI2RlZmluZSBJTlBMQUNFX0xTSElGVAk3NQotI2RlZmluZSBJTlBMQUNFX1JTSElGVAk3NgotI2RlZmluZSBJTlBMQUNFX0FORAk3NwotI2RlZmluZSBJTlBMQUNFX1hPUgk3OAotI2RlZmluZSBJTlBMQUNFX09SCTc5Ci0jZGVmaW5lIEJSRUFLX0xPT1AJODAKLSNkZWZpbmUgV0lUSF9DTEVBTlVQICAgIDgxCi0jZGVmaW5lIExPQURfTE9DQUxTCTgyCi0jZGVmaW5lIFJFVFVSTl9WQUxVRQk4MwotI2RlZmluZSBJTVBPUlRfU1RBUgk4NAotI2RlZmluZSBFWEVDX1NUTVQJODUKLSNkZWZpbmUgWUlFTERfVkFMVUUJODYKLSNkZWZpbmUgUE9QX0JMT0NLCTg3Ci0jZGVmaW5lIEVORF9GSU5BTExZCTg4Ci0jZGVmaW5lIEJVSUxEX0NMQVNTCTg5Ci0KLSNkZWZpbmUgSEFWRV9BUkdVTUVOVAk5MAkvKiBPcGNvZGVzIGZyb20gaGVyZSBoYXZlIGFuIGFyZ3VtZW50OiAqLwotCi0jZGVmaW5lIFNUT1JFX05BTUUJOTAJLyogSW5kZXggaW4gbmFtZSBsaXN0ICovCi0jZGVmaW5lIERFTEVURV9OQU1FCTkxCS8qICIiICovCi0jZGVmaW5lIFVOUEFDS19TRVFVRU5DRQk5MgkvKiBOdW1iZXIgb2Ygc2VxdWVuY2UgaXRlbXMgKi8KLSNkZWZpbmUgRk9SX0lURVIJOTMKLQotI2RlZmluZSBTVE9SRV9BVFRSCTk1CS8qIEluZGV4IGluIG5hbWUgbGlzdCAqLwotI2RlZmluZSBERUxFVEVfQVRUUgk5NgkvKiAiIiAqLwotI2RlZmluZSBTVE9SRV9HTE9CQUwJOTcJLyogIiIgKi8KLSNkZWZpbmUgREVMRVRFX0dMT0JBTAk5OAkvKiAiIiAqLwotI2RlZmluZSBEVVBfVE9QWAk5OQkvKiBudW1iZXIgb2YgaXRlbXMgdG8gZHVwbGljYXRlICovCi0jZGVmaW5lIExPQURfQ09OU1QJMTAwCS8qIEluZGV4IGluIGNvbnN0IGxpc3QgKi8KLSNkZWZpbmUgTE9BRF9OQU1FCTEwMQkvKiBJbmRleCBpbiBuYW1lIGxpc3QgKi8KLSNkZWZpbmUgQlVJTERfVFVQTEUJMTAyCS8qIE51bWJlciBvZiB0dXBsZSBpdGVtcyAqLwotI2RlZmluZSBCVUlMRF9MSVNUCTEwMwkvKiBOdW1iZXIgb2YgbGlzdCBpdGVtcyAqLwotI2RlZmluZSBCVUlMRF9NQVAJMTA0CS8qIEFsd2F5cyB6ZXJvIGZvciBub3cgKi8KLSNkZWZpbmUgTE9BRF9BVFRSCTEwNQkvKiBJbmRleCBpbiBuYW1lIGxpc3QgKi8KLSNkZWZpbmUgQ09NUEFSRV9PUAkxMDYJLyogQ29tcGFyaXNvbiBvcGVyYXRvciAqLwotI2RlZmluZSBJTVBPUlRfTkFNRQkxMDcJLyogSW5kZXggaW4gbmFtZSBsaXN0ICovCi0jZGVmaW5lIElNUE9SVF9GUk9NCTEwOAkvKiBJbmRleCBpbiBuYW1lIGxpc3QgKi8KLQotI2RlZmluZSBKVU1QX0ZPUldBUkQJMTEwCS8qIE51bWJlciBvZiBieXRlcyB0byBza2lwICovCi0jZGVmaW5lIEpVTVBfSUZfRkFMU0UJMTExCS8qICIiICovCi0jZGVmaW5lIEpVTVBfSUZfVFJVRQkxMTIJLyogIiIgKi8KLSNkZWZpbmUgSlVNUF9BQlNPTFVURQkxMTMJLyogVGFyZ2V0IGJ5dGUgb2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIGNvZGUgKi8KLQotI2RlZmluZSBMT0FEX0dMT0JBTAkxMTYJLyogSW5kZXggaW4gbmFtZSBsaXN0ICovCi0KLSNkZWZpbmUgQ09OVElOVUVfTE9PUAkxMTkJLyogU3RhcnQgb2YgbG9vcCAoYWJzb2x1dGUpICovCi0jZGVmaW5lIFNFVFVQX0xPT1AJMTIwCS8qIFRhcmdldCBhZGRyZXNzIChyZWxhdGl2ZSkgKi8KLSNkZWZpbmUgU0VUVVBfRVhDRVBUCTEyMQkvKiAiIiAqLwotI2RlZmluZSBTRVRVUF9GSU5BTExZCTEyMgkvKiAiIiAqLwotCi0jZGVmaW5lIExPQURfRkFTVAkxMjQJLyogTG9jYWwgdmFyaWFibGUgbnVtYmVyICovCi0jZGVmaW5lIFNUT1JFX0ZBU1QJMTI1CS8qIExvY2FsIHZhcmlhYmxlIG51bWJlciAqLwotI2RlZmluZSBERUxFVEVfRkFTVAkxMjYJLyogTG9jYWwgdmFyaWFibGUgbnVtYmVyICovCi0KLSNkZWZpbmUgUkFJU0VfVkFSQVJHUwkxMzAJLyogTnVtYmVyIG9mIHJhaXNlIGFyZ3VtZW50cyAoMSwgMiBvciAzKSAqLwotLyogQ0FMTF9GVU5DVElPTl9YWFggb3Bjb2RlcyBkZWZpbmVkIGJlbG93IGRlcGVuZCBvbiB0aGlzIGRlZmluaXRpb24gKi8KLSNkZWZpbmUgQ0FMTF9GVU5DVElPTgkxMzEJLyogI2FyZ3MgKyAoI2t3YXJnczw8OCkgKi8KLSNkZWZpbmUgTUFLRV9GVU5DVElPTgkxMzIJLyogI2RlZmF1bHRzICovCi0jZGVmaW5lIEJVSUxEX1NMSUNFIAkxMzMJLyogTnVtYmVyIG9mIGl0ZW1zICovCi0KLSNkZWZpbmUgTUFLRV9DTE9TVVJFICAgIDEzNCAgICAgLyogI2ZyZWUgdmFycyAqLwotI2RlZmluZSBMT0FEX0NMT1NVUkUgICAgMTM1ICAgICAvKiBMb2FkIGZyZWUgdmFyaWFibGUgZnJvbSBjbG9zdXJlICovCi0jZGVmaW5lIExPQURfREVSRUYgICAgICAxMzYgICAgIC8qIExvYWQgYW5kIGRlcmVmZXJlbmNlIGZyb20gY2xvc3VyZSBjZWxsICovIAotI2RlZmluZSBTVE9SRV9ERVJFRiAgICAgMTM3ICAgICAvKiBTdG9yZSBpbnRvIGNlbGwgKi8gCi0KLS8qIFRoZSBuZXh0IDMgb3Bjb2RlcyBtdXN0IGJlIGNvbnRpZ3VvdXMgYW5kIHNhdGlzZnkKLSAgIChDQUxMX0ZVTkNUSU9OX1ZBUiAtIENBTExfRlVOQ1RJT04pICYgMyA9PSAxICAqLwotI2RlZmluZSBDQUxMX0ZVTkNUSU9OX1ZBUiAgICAgICAgICAxNDAJLyogI2FyZ3MgKyAoI2t3YXJnczw8OCkgKi8KLSNkZWZpbmUgQ0FMTF9GVU5DVElPTl9LVyAgICAgICAgICAgMTQxCS8qICNhcmdzICsgKCNrd2FyZ3M8PDgpICovCi0jZGVmaW5lIENBTExfRlVOQ1RJT05fVkFSX0tXICAgICAgIDE0MgkvKiAjYXJncyArICgja3dhcmdzPDw4KSAqLwotCi0vKiBTdXBwb3J0IGZvciBvcGFyZ3MgbW9yZSB0aGFuIDE2IGJpdHMgbG9uZyAqLwotI2RlZmluZSBFWFRFTkRFRF9BUkcgIDE0MwotCi0KLWVudW0gY21wX29wIHtQeUNtcF9MVD1QeV9MVCwgUHlDbXBfTEU9UHlfTEUsIFB5Q21wX0VRPVB5X0VRLCBQeUNtcF9ORT1QeV9ORSwgUHlDbXBfR1Q9UHlfR1QsIFB5Q21wX0dFPVB5X0dFLAotCSAgICAgUHlDbXBfSU4sIFB5Q21wX05PVF9JTiwgUHlDbXBfSVMsIFB5Q21wX0lTX05PVCwgUHlDbXBfRVhDX01BVENILCBQeUNtcF9CQUR9OwotCi0jZGVmaW5lIEhBU19BUkcob3ApICgob3ApID49IEhBVkVfQVJHVU1FTlQpCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0jZW5kaWYgLyogIVB5X09QQ09ERV9IICovCmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL0xJQ0VOU0UuaHRtbCBiL3Zta2l0L21tdGsvTElDRU5TRS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGE3M2RjLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvTElDRU5TRS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KLTx0aXRsZT5MaWNlbnNlIEluZm9ybWF0aW9uPC90aXRsZT4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci0gIGJvZHkgewotICAgIHNpemU6IDguNWluIDExLjBpbjsKLSAgICBtYXJnaW46IDAuMjVpbiAwLjVpbiAwLjI1aW4gMC41aW47Ci0gICAgdGFiLWludGVydmFsOiAwLjVpbjsKLSAgICB9Ci0gIHAgeyAgCQotICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwotICAgIG1hcmdpbi10b3A6ICAwLjVlbTsKLSAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKLSAgICB9Ci0gIHAubGlzdCB7Ci0gIAltYXJnaW4tbGVmdDogMC41aW47Ci0gICAgbWFyZ2luLXRvcDogIDAuMDVlbTsKLSAgICBtYXJnaW4tYm90dG9tOiAwLjA1ZW07Ci0gICAgfQotICA8L3N0eWxlPgotCi08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLQotPGgyPkdlbmVyYWwgSW5mb3JtYXRpb248L2gyPgotCi08cD5KaWtlcyBSVk0gaXMgZnJlZSwgb3BlbiBzb3VyY2Ugc29mdHdhcmUsIGRpc3RyaWJ1dGVkIGFuZCBmcmVlbHkKLXJlZGlzdHJpYnV0YWJsZSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKS4gIFRoZSBFUEwgaGFzCi1iZWVuIGNlcnRpZmllZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBhcyBhbiBvcGVuIHNvdXJjZQotbGljZW5zZS4gIFRoZSBFUEwgbWVldHMgdGhlIERlYmlhbiBGcmVlIFNvZnR3YXJlIEd1aWRlbGluZXMuPC9wPgotCi08cD5Ob3RlOiBzb21lIGNvZGUgaW4gdGhlIGxpYnJhcnlJbnRlcmZhY2UgdHJlZSBpcyBkaXN0cmlidXRlZCB1bmRlcgotb3RoZXIgb3BlbiBzb3VyY2UgbGljZW5zZXMuICBTZWUgdGhlIHZhcmlvdXMgTElDRU5TRSBmaWxlcyBpbiB0aGF0Ci10cmVlIGZvciBkZXRhaWxzLjwvcD4KLQotPHA+Tm90ZTogc29tZSBjb2RlIGluIHRoZSBleHRlcm5hbCB0cmVlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyCi1vdGhlciBvcGVuIHNvdXJjZSBsaWNlbnNlcy4gIFNlZSB0aGUgdmFyaW91cyBMSUNFTlNFIGZpbGVzIGluIHRoYXQKLXRyZWUgZm9yIGRldGFpbHMuPC9wPgotCi08cD5Ob3RlOiAgcnZtL3NyYy1nZW5lcmF0ZWQvb3B0LWJ1cnMvamJ1cmcgY29udGFpbnMgYSB0b29sLCBqYnVyZywKLXdoaWNoIHdhcyBkZXJpdmVkIGZyb20gaWJ1cmcgYW5kIGlzIG5vdCBkaXN0cmlidXRlZCB1bmRlciB0aGUgRVBMLgotU2VlIHJ2bS9zcmMtZ2VuZXJhdGVkL29wdC1idXJzL2pidXJnL0xJQ0VOU0UgZm9yIGRldGFpbHMuPC9wPgotCi08cD5UaGUgbGVnYWwgdGV4dCBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhcHBlbmRlZCBiZWxvdyBmb3IKLXJlZmVyZW5jZTwvcD4KLQotPGhsaW5lPgotCi08aDI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9oMj4KLQotPHA+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UKLVBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IKLURJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMKLUFHUkVFTUVOVC48L3A+Ci0KLTxwPjxiPjEuIERFRklOSVRJT05TPC9iPjwvcD4KLQotPHA+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbAotY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPC9wPgotPHAgY2xhc3M9Imxpc3QiPmIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3A+Ci08cCBjbGFzcz0ibGlzdCI+aSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9wPgotPHAgY2xhc3M9Imxpc3QiPmlpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9wPgotPHAgY2xhc3M9Imxpc3QiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtCi1vcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQQotQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZQotUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2gKLUNvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbgotY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpCi1hcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uPC9wPgotCi08cD4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzCi10aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMmcXVvdDsgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYQotQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzCi1Db250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLjwvcD4KLQotPHA+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlCi13aXRoIHRoaXMgQWdyZWVtZW50LjwvcD4KLQotPHA+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIKLXRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3A+Ci0KLTxwPjxiPjIuIEdSQU5UIE9GIFJJR0hUUzwvYj48L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5hKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaAotQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCi1yb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3MKLW9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZQotQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4KLXNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmIpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoCi1Db250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKLXJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwKLW9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50Ci1saWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUKLVByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLAotc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQKLWJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlcgotY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvcgotZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzCi1hcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlCi1wYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoCi1Db250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5Ci1hbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi1vciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMKLWdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvcgotZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQKLXRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUKLXRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQKLWhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudAotdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC48L3A+Ci0KLTxwPjxiPjMuIFJFUVVJUkVNRU5UUzwvYj48L3A+Ci0KLTxwPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlCi1mb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YSkgaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcwotQWdyZWVtZW50OyBhbmQ8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5iKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+aSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzCi1hbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMKLW9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IKLWNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTs8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMKLWFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czs8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5paWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMKLUFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyCi1wYXJ0eTsgYW5kPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+aXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUKLWZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYQotcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZQotZXhjaGFuZ2UuPC9wPgotCi08cD5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoCi1jb3B5IG9mIHRoZSBQcm9ncmFtLjwvcD4KLQotPHA+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQKLXdpdGhpbiB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzCi1Db250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50Ci1SZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uPC9wPgotCi08cD48Yj40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvYj48L3A+Ci0KLTxwPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbgotcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlCi1saWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YKLXRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlCi1wb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvcgotaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IKLSgmcXVvdDtDb21tZXJjaWFsIENvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQKLWluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspCi1hZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KQotYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkCi1wYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUKLWFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZQotb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluCi1vcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkKLXRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZQotSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24KLWV4cGVuc2UuPC9wPgotCi08cD5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsCi1Db250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlCi1jbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5Ci1hbG9uZS4gVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvCi1kZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlCi1wZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlcgotQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3A+Ci0KLTxwPjxiPjUuIE5PIFdBUlJBTlRZPC9iPjwvcD4KLQotPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTCi1QUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMKLU9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLAotQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZCi1PUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cwotZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywKLWRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yCi1pbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy48L3A+Ci0KLTxwPjxiPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9iPjwvcD4KLQotPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UCi1OT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORwotV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCi1MSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUgotRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKLUhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9wPgotCi08cD48Yj43LiBHRU5FUkFMPC9iPjwvcD4KLQotPHA+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKLWFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZgotdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uCi1ieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtCi1leHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvcD4KLQotPHA+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5Ci0oaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUKLVByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIKLXNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUKLWRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLjwvcD4KLQotPHA+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQKLWZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzCi1BZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZQotYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzCi11bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLjwvcD4KLQotPHA+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMKLUFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUKLUFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nCi1yZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUKLUFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZQotRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkKLWFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEKLXN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUKLWdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcKLUNvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUKLUFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzCi1leHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubwotcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyCi10aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvcgotb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvcD4KLQotPHA+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZAotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5Ci10byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUKLXRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzCi1yaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3A+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvTWFrZWZpbGUgYi92bWtpdC9tbXRrL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjNjZjcwLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIz09PS0gbW10ay9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIwotIyAKLSMgICAgICAgICAgICAgICAgICAgICBUaGUgdm1raXQgcHJvamVjdAotIwotIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLSMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotIyAKLSMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCi1MRVZFTCA9IC4uCi0KLURJUlMgPSBtYWdpYyBtbXRrLWozIG1tdGstYWxsb2MgamF2YSBpbmxpbmUKLUVYVFJBX0RJU1QgPSBjb25maWcvbWFya3N3ZWVwCi0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29uZmlnCi0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCi0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvY29uZmlnL2NvcHltcy9NTVRrSW5saW5lLmluYyBiL3Zta2l0L21tdGsvY29uZmlnL2NvcHltcy9NTVRrSW5saW5lLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMzNDdkMy4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2NvbmZpZy9jb3B5bXMvTU1Ua0lubGluZS5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLS8vIEdlbmVyYXRlZCBieSBsbHZtMmNwcCAtIERPIE5PVCBNT0RJRlkhCi0KLQotRnVuY3Rpb24qIG1ha2VMTFZNRnVuY3Rpb24oTW9kdWxlICptb2QpIHsKLXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9jb25maWcvY29weW1zL09iamVjdEhlYWRlci5oIGIvdm1raXQvbW10ay9jb25maWcvY29weW1zL09iamVjdEhlYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjM4YjBiLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvY29uZmlnL2NvcHltcy9PYmplY3RIZWFkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8vPT09LS0tLS0gT2JqZWN0SGVhZGVyLmggLSBNYWNyb3MgZm9yIGRlc2NyaWJpbmcgYW4gb2JqZWN0IGhlYWRlciAtLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2lmbmRlZiBNVk1fT0JKRUNUX0hFQURFUl9ICi0jZGVmaW5lIE1WTV9PQkpFQ1RfSEVBREVSX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi1uYW1lc3BhY2UgbXZtIHsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IEdDQml0cyA9IDg7Ci0gIHN0YXRpYyBjb25zdCBib29sIE1vdmVzT2JqZWN0ID0gdHJ1ZTsKLX0KLQotI2VuZGlmIC8vIE1WTV9PQkpFQ1RfSEVBREVSX0gKZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvY29uZmlnL21hcmtzd2VlcC9NTVRrSW5saW5lLmluYyBiL3Zta2l0L21tdGsvY29uZmlnL21hcmtzd2VlcC9NTVRrSW5saW5lLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNhMTdlYS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2NvbmZpZy9tYXJrc3dlZXAvTU1Ua0lubGluZS5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLS8vIEdlbmVyYXRlZCBieSBsbHZtMmNwcCAtIERPIE5PVCBNT0RJRlkhCi0KLQotRnVuY3Rpb24qIG1ha2VMTFZNRnVuY3Rpb24oTW9kdWxlICptb2QpIHsKLQkJCQkJcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2NvbmZpZy9tYXJrc3dlZXAvT2JqZWN0SGVhZGVyLmggYi92bWtpdC9tbXRrL2NvbmZpZy9tYXJrc3dlZXAvT2JqZWN0SGVhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzM2NjMzkuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9jb25maWcvbWFya3N3ZWVwL09iamVjdEhlYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLy89PT0tLS0tLSBPYmplY3RIZWFkZXIuaCAtIE1hY3JvcyBmb3IgZGVzY3JpYmluZyBhbiBvYmplY3QgaGVhZGVyIC0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIE1WTV9PQkpFQ1RfSEVBREVSX0gKLSNkZWZpbmUgTVZNX09CSkVDVF9IRUFERVJfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLW5hbWVzcGFjZSBtdm0gewotICBzdGF0aWMgY29uc3QgdWludDMyX3QgR0NCaXRzID0gODsKLSAgc3RhdGljIGNvbnN0IGJvb2wgTW92ZXNPYmplY3QgPSBmYWxzZTsKLX0KLQotI2VuZGlmIC8vIE1WTV9PQkpFQ1RfSEVBREVSX0gKZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvaW5saW5lL0lubGluZU1ldGhvZHMuY3BwIGIvdm1raXQvbW10ay9pbmxpbmUvSW5saW5lTWV0aG9kcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZjA2ZmUuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9pbmxpbmUvSW5saW5lTWV0aG9kcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLz09PS0tLS0tLS0tIElubGluZU1ldGhvZHMuY3BwIC0gSW5pdGlhbGl6ZSB0aGUgaW5saW5lIG1ldGhvZHMgLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlIDxsbHZtL0NhbGxpbmdDb252Lmg+Ci0jaW5jbHVkZSA8bGx2bS9Db25zdGFudHMuaD4KLSNpbmNsdWRlIDxsbHZtL0Rlcml2ZWRUeXBlcy5oPgotI2luY2x1ZGUgPGxsdm0vSW5zdHJ1Y3Rpb25zLmg+Ci0jaW5jbHVkZSA8bGx2bS9MTFZNQ29udGV4dC5oPgotI2luY2x1ZGUgPGxsdm0vTW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGx2bS9UeXBlLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBsbHZtOwotCi1uYW1lc3BhY2UgbW10ayB7Ci0KLW5hbWVzcGFjZSBtbXRrX3J1bnRpbWUgewotICAjaW5jbHVkZSAiTU1Ua0lubGluZS5pbmMiCi19Ci0KLWV4dGVybiAiQyIgdm9pZCBNTVRrX0lubGluZU1ldGhvZHMobGx2bTo6TW9kdWxlKiBtb2R1bGUpIHsKLSAgbW10a19ydW50aW1lOjptYWtlTExWTUZ1bmN0aW9uKG1vZHVsZSk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvaW5saW5lL01ha2VmaWxlIGIvdm1raXQvbW10ay9pbmxpbmUvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYTRmMDYuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9pbmxpbmUvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIz09PS0gbGliL012bS9Db21tb25UaHJlYWQvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIwotIyAKLSMgICAgICAgICAgICAgICAgICAgICBUaGUgdm1raXQgcHJvamVjdAotIwotIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLSMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotIyAKLSMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCi1MRVZFTCA9IC4uLy4uCi0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29uZmlnCi0KLU1PRFVMRV9OQU1FID0gSW5saW5lTU1UawotCi1pbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgotCmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvTWFrZWZpbGUgYi92bWtpdC9tbXRrL2phdmEvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OWEzNmIuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyM9PT0tIG1tdGsvamF2YS9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKLSMgCi0jICAgICAgICAgICAgICAgICAgICAgVGhlIHZta2l0IHByb2plY3QKLSMKLSMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0jIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLSMgCi0jIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIwotTEVWRUwgPSAuLi8uLgotCi1pbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbmZpZwotCi1SVU5fQU5UID0gMQotSkFSTkFNRSA9IG1tdGstdm1raXQKLUVYVFJBX0RJU1QgPSB2bWtpdC5wcm9wZXJ0aWVzIGJ1aWxkLnhtbC5pbiBzcmMKLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9idWlsZC54bWwgYi92bWtpdC9tbXRrL2phdmEvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWNkNmMzLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9Ik1NVEstVk1LaXQiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotICA8dGFyZ2V0IG5hbWU9Im1haW4iPgotICAgIDxta2RpciBkaXI9ImNsYXNzZXMiLz4KLSAgICA8amF2YWMgc3JjZGlyPSJzcmMiIGRlc3RkaXI9ImNsYXNzZXMiIHNvdXJjZT0iMS41Ii8+Ci0gICAgPGphciBqYXJmaWxlPSJtbXRrLXZta2l0LmphciI+Ci0gICAgICA8ZmlsZXNldCBkaXI9ImNsYXNzZXMiLz4KLSAgICA8L2phcj4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9iaW5kaW5ncy9CaW5kaW5ncy5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvajMvYmluZGluZ3MvQmluZGluZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYzZGE4ZS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9iaW5kaW5ncy9CaW5kaW5ncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmluZGluZ3MuamF2YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi1wYWNrYWdlIG9yZy5qMy5iaW5kaW5nczsKLQotaW1wb3J0IG9yZy5qMy5jb25maWcuU2VsZWN0ZWQ7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5NdXRhdG9yQ29udGV4dDsKLWltcG9ydCBvcmcubW10ay5wbGFuLlBsYW47Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5UcmFjZUxvY2FsOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhbnNpdGl2ZUNsb3N1cmU7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5oZWFwLkhlYXBHcm93dGhNYW5hZ2VyOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS5JbmxpbmU7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC5BZGRyZXNzOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuRXh0ZW50OwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuT2JqZWN0UmVmZXJlbmNlOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluZGluZ3MgewotICBASW5saW5lCi0gIHByaXZhdGUgc3RhdGljIEFkZHJlc3MgZ2NtYWxsb2MoaW50IHNpemUsIE9iamVjdFJlZmVyZW5jZSB2aXJ0dWFsVGFibGUpIHsKLSAgICBTZWxlY3RlZC5NdXRhdG9yIG11dGF0b3IgPSBTZWxlY3RlZC5NdXRhdG9yLmdldCgpOwotICAgIGludCBhbGxvY2F0b3IgPSBtdXRhdG9yLmNoZWNrQWxsb2NhdG9yKHNpemUsIDAsIDApOwotICAgIEFkZHJlc3MgcmVzID0gbXV0YXRvci5hbGxvYyhzaXplLCAwLCAwLCBhbGxvY2F0b3IsIDApOwotICAgIHJlcy5zdG9yZSh2aXJ0dWFsVGFibGUpOwotICAgIG11dGF0b3IucG9zdEFsbG9jKHJlcy50b09iamVjdFJlZmVyZW5jZSgpLCB2aXJ0dWFsVGFibGUsIHNpemUsIGFsbG9jYXRvcik7Ci0gICAgcmV0dXJuIHJlczsKLSAgfQotCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xpdmUoVHJhY2VMb2NhbCBjbG9zdXJlLCBPYmplY3RSZWZlcmVuY2Ugb2JqKSB7Ci0gICAgcmV0dXJuIGNsb3N1cmUuaXNMaXZlKG9iaik7Ci0gIH0KLQotICBASW5saW5lCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgcmVwb3J0RGVsYXllZFJvb3RFZGdlKFRyYWNlTG9jYWwgY2xvc3VyZSwgQWRkcmVzcyBvYmopIHsKLSAgICBjbG9zdXJlLnJlcG9ydERlbGF5ZWRSb290RWRnZShvYmopOwotICB9Ci0KLSAgQElubGluZQotICBwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NSb290RWRnZShUcmFjZUxvY2FsIGNsb3N1cmUsIEFkZHJlc3Mgb2JqLCBib29sZWFuIHRyYWNlZCkgewotICAgIGNsb3N1cmUucHJvY2Vzc1Jvb3RFZGdlKG9iaiwgdHJhY2VkKTsKLSAgfQotCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0UmVmZXJlbmNlIHJldGFpbkZvckZpbmFsaXplKFRyYWNlTG9jYWwgY2xvc3VyZSwgT2JqZWN0UmVmZXJlbmNlIG9iaikgewotICAgIHJldHVybiBjbG9zdXJlLnJldGFpbkZvckZpbmFsaXplKG9iaik7Ci0gIH0KLQotICBASW5saW5lCi0gIHByaXZhdGUgc3RhdGljIE9iamVjdFJlZmVyZW5jZSByZXRhaW5SZWZlcmVudChUcmFjZUxvY2FsIGNsb3N1cmUsIE9iamVjdFJlZmVyZW5jZSBvYmopIHsKLSAgICByZXR1cm4gY2xvc3VyZS5yZXRhaW5SZWZlcmVudChvYmopOwotICB9Ci0KLSAgQElubGluZQotICBwcml2YXRlIHN0YXRpYyBPYmplY3RSZWZlcmVuY2UgZ2V0Rm9yd2FyZGVkUmVmZXJlbmNlKFRyYWNlTG9jYWwgY2xvc3VyZSwgT2JqZWN0UmVmZXJlbmNlIG9iaikgewotICAgIHJldHVybiBjbG9zdXJlLmdldEZvcndhcmRlZFJlZmVyZW5jZShvYmopOwotICB9Ci0KLSAgQElubGluZQotICBwcml2YXRlIHN0YXRpYyBPYmplY3RSZWZlcmVuY2UgZ2V0Rm9yd2FyZGVkUmVmZXJlbnQoVHJhY2VMb2NhbCBjbG9zdXJlLCBPYmplY3RSZWZlcmVuY2Ugb2JqKSB7Ci0gICAgcmV0dXJuIGNsb3N1cmUuZ2V0Rm9yd2FyZGVkUmVmZXJlbnQob2JqKTsKLSAgfQotCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0UmVmZXJlbmNlIGdldEZvcndhcmRlZEZpbmFsaXphYmxlKFRyYWNlTG9jYWwgY2xvc3VyZSwgT2JqZWN0UmVmZXJlbmNlIG9iaikgewotICAgIHJldHVybiBjbG9zdXJlLmdldEZvcndhcmRlZEZpbmFsaXphYmxlKG9iaik7Ci0gIH0KLQotICBASW5saW5lCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc0VkZ2UoVHJhbnNpdGl2ZUNsb3N1cmUgY2xvc3VyZSwgT2JqZWN0UmVmZXJlbmNlIHNvdXJjZSwgQWRkcmVzcyBzbG90KSB7Ci0gICAgY2xvc3VyZS5wcm9jZXNzRWRnZShzb3VyY2UsIHNsb3QpOwotICB9Ci0KLSAgQElubGluZQotICBwcml2YXRlIHN0YXRpYyBNdXRhdG9yQ29udGV4dCBhbGxvY2F0ZU11dGF0b3IoaW50IGlkKSB7Ci0gICAgU2VsZWN0ZWQuTXV0YXRvciBtdXRhdG9yID0gbmV3IFNlbGVjdGVkLk11dGF0b3IoKTsKLSAgICBtdXRhdG9yLmluaXRNdXRhdG9yKGlkKTsKLSAgICByZXR1cm4gbXV0YXRvcjsKLSAgfQotCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmcmVlTXV0YXRvcihNdXRhdG9yQ29udGV4dCBtdXRhdG9yKSB7Ci0gICAgbXV0YXRvci5kZWluaXRNdXRhdG9yKCk7Ci0gIH0KLQotICBASW5saW5lCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgYm9vdChFeHRlbnQgbWluU2l6ZSwgRXh0ZW50IG1heFNpemUpIHsKLSAgICBIZWFwR3Jvd3RoTWFuYWdlci5ib290KG1pblNpemUsIG1heFNpemUpOwotICAgIFBsYW4gcGxhbiA9IFNlbGVjdGVkLlBsYW4uZ2V0KCk7Ci0gICAgcGxhbi5ib290KCk7Ci0gICAgcGxhbi5wb3N0Qm9vdCgpOwotICAgIHBsYW4uZnVsbHlCb290ZWQoKTsKLSAgfQotCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSBzdGF0aWMgQWRkcmVzcyBjb3B5KE9iamVjdFJlZmVyZW5jZSBmcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0UmVmZXJlbmNlIHZpcnR1YWxUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG9jYXRvcikgewotICAgIFNlbGVjdGVkLkNvbGxlY3RvciBwbGFuID0gU2VsZWN0ZWQuQ29sbGVjdG9yLmdldCgpOwotICAgIGFsbG9jYXRvciA9IHBsYW4uY29weUNoZWNrQWxsb2NhdG9yKGZyb20sIHNpemUsIDAsIGFsbG9jYXRvcik7Ci0gICAgQWRkcmVzcyB0byA9IHBsYW4uYWxsb2NDb3B5KGZyb20sIHNpemUsIDAsIDAsIGFsbG9jYXRvcik7Ci0gICAgbWVtY3B5KHRvLnRvT2JqZWN0UmVmZXJlbmNlKCksIGZyb20sIHNpemUpOwotICAgIHBsYW4ucG9zdENvcHkodG8udG9PYmplY3RSZWZlcmVuY2UoKSwgdmlydHVhbFRhYmxlLCBzaXplLCBhbGxvY2F0b3IpOwotICAgIHJldHVybiB0bzsKLSAgfQotCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbWVtY3B5KAotICAgICAgT2JqZWN0UmVmZXJlbmNlIHRvLCBPYmplY3RSZWZlcmVuY2UgZnJvbSwgaW50IHNpemUpOwotCi19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9jb25maWcvU2VsZWN0ZWQuamF2YS5pbiBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL2ozL2NvbmZpZy9TZWxlY3RlZC5qYXZhLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjRlY2QwLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL2ozL2NvbmZpZy9TZWxlY3RlZC5qYXZhLmluCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNlbGVjdGVkLmphdmEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLXBhY2thZ2Ugb3JnLmozLmNvbmZpZzsKLQotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuTG9nOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3RlZCB7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG5hbWUgPSAiQE1NVEtfUExBTkAiOwotICBAVW5pbnRlcnJ1cHRpYmxlCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUGxhbiBleHRlbmRzIEBNTVRLX1BMQU5ACi0gIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQbGFuIHBsYW4gPSBuZXcgUGxhbigpOwotCi0gICAgQElubGluZQotICAgIHB1YmxpYyBzdGF0aWMgUGxhbiBnZXQoKSB7IHJldHVybiBwbGFuOyB9Ci0gIH0KLQotICBAVW5pbnRlcnJ1cHRpYmxlCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ29uc3RyYWludHMgZXh0ZW5kcyBATU1US19QTEFOQENvbnN0cmFpbnRzCi0gIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb25zdHJhaW50cyBjb25zdHJhaW50cyA9IG5ldyBDb25zdHJhaW50cygpOwotCi0gICAgQElubGluZQotICAgIHB1YmxpYyBzdGF0aWMgQ29uc3RyYWludHMgZ2V0KCkgeyByZXR1cm4gY29uc3RyYWludHM7IH0KLSAgfQotCi0gIEBVbmludGVycnVwdGlibGUKLSAgcHVibGljIHN0YXRpYyBjbGFzcyBDb2xsZWN0b3IgZXh0ZW5kcyBATU1US19QTEFOQENvbGxlY3RvcgotICB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sbGVjdG9yIGJvb3RzdHJhcENvbGxlY3RvciA9IG5ldyBDb2xsZWN0b3IoKTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3RhdGljQ29sbGVjdCgpIHsKLSAgICAgIGJvb3RzdHJhcENvbGxlY3Rvci5jb2xsZWN0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbGxlY3RvcigpIHt9Ci0gICAgQElubGluZQotICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdG9yIGdldCgpIHsKLSAgICAgIHJldHVybiBib290c3RyYXBDb2xsZWN0b3I7Ci0gICAgfQotICB9Ci0KLSAgQFVuaW50ZXJydXB0aWJsZQotICBwdWJsaWMgc3RhdGljIGNsYXNzIE11dGF0b3IgZXh0ZW5kcyBATU1US19QTEFOQE11dGF0b3IKLSAgewotICAgCi0gICAgLy8gVW51c2VkIG11dGF0b3IgdXNlZCBieSB0aGUgQU9UIGNvbXBpbGVyIHRvIGtub3cgd2hhdCBpbnN0YW5jZXMKLSAgICAvLyB3aWxsIGJlIGFsaXZlIGR1cmluZyBNTVRrIGV4ZWN1dGlvbi4gVGhpcyBhbGxvd3MgdG8gaW5saW5lCi0gICAgLy8gdmlydHVhbCBjYWxscyBvZiBzaW5nbGV0b24gb2JqZWN0cy4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNdXRhdG9yIHVudXNlZE11dGF0b3IgPSBuZXcgTXV0YXRvcigpOwotICAgIAotICAgIHB1YmxpYyBNdXRhdG9yKCkge30KLQotICAgIEBJbmxpbmUKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBNdXRhdG9yIGdldCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9tbXRrL0FjdGl2ZVBsYW4uamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL2ozL21tdGsvQWN0aXZlUGxhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWY1MjZlLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL2ozL21tdGsvQWN0aXZlUGxhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLS0tIEFjdGl2ZVBsYW4uamF2YSAtIFBsYW4gZm9yIEozIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLXBhY2thZ2Ugb3JnLmozLm1tdGs7Ci0KLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uUGxhbjsKLWltcG9ydCBvcmcubW10ay5wbGFuLkNvbGxlY3RvckNvbnRleHQ7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5NdXRhdG9yQ29udGV4dDsKLWltcG9ydCBvcmcubW10ay5wbGFuLlBsYW5Db25zdHJhaW50czsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkxvZzsKLQotaW1wb3J0IG9yZy5qMy5jb25maWcuU2VsZWN0ZWQ7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotcHVibGljIGZpbmFsIGNsYXNzIEFjdGl2ZVBsYW4gZXh0ZW5kcyBvcmcubW10ay52bS5BY3RpdmVQbGFuIHsKLQotICBPYmplY3QgY3VycmVudFRocmVhZCA9IG51bGw7Ci0KLSAgLyoqIEByZXR1cm4gVGhlIGFjdGl2ZSBQbGFuIGluc3RhbmNlLiAqLwotICBASW5saW5lCi0gIHB1YmxpYyBQbGFuIGdsb2JhbCgpIHsKLSAgICByZXR1cm4gU2VsZWN0ZWQuUGxhbi5nZXQoKTsKLSAgfQotCi0gIC8qKiBAcmV0dXJuIFRoZSBhY3RpdmUgUGxhbkNvbnN0cmFpbnRzIGluc3RhbmNlLiAqLwotICBASW5saW5lCi0gIHB1YmxpYyBQbGFuQ29uc3RyYWludHMgY29uc3RyYWludHMoKSB7Ci0gICAgcmV0dXJuIFNlbGVjdGVkLkNvbnN0cmFpbnRzLmdldCgpOwotICB9Ci0KLSAgLyoqIEByZXR1cm4gVGhlIG51bWJlciBvZiByZWdpc3RlcmVkIENvbGxlY3RvckNvbnRleHQgaW5zdGFuY2VzLiAqLwotICBASW5saW5lCi0gIHB1YmxpYyBuYXRpdmUgaW50IGNvbGxlY3RvckNvdW50KCk7Ci0KLSAgLyoqIEByZXR1cm4gVGhlIGFjdGl2ZSBDb2xsZWN0b3JDb250ZXh0IGluc3RhbmNlLiAqLwotICBASW5saW5lCi0gIHB1YmxpYyBDb2xsZWN0b3JDb250ZXh0IGNvbGxlY3RvcigpIHsKLSAgICByZXR1cm4gU2VsZWN0ZWQuQ29sbGVjdG9yLmdldCgpOwotICB9Ci0KLSAgLyoqIEByZXR1cm4gVGhlIGFjdGl2ZSBNdXRhdG9yQ29udGV4dCBpbnN0YW5jZS4gKi8KLSAgQElubGluZQotICBwdWJsaWMgTXV0YXRvckNvbnRleHQgbXV0YXRvcigpIHsKLSAgICByZXR1cm4gU2VsZWN0ZWQuTXV0YXRvci5nZXQoKTsKLSAgfQotCi0gIC8qKiBAcmV0dXJuIFRoZSBsb2cgZm9yIHRoZSBhY3RpdmUgdGhyZWFkICovCi0gIHB1YmxpYyBMb2cgbG9nKCkgewotICAgIHJldHVybiBTZWxlY3RlZC5NdXRhdG9yLmdldCgpLmdldExvZygpOwotICB9Ci0KLSAgLyoqIFJlc2V0IHRoZSBtdXRhdG9yIGl0ZXJhdG9yICovCi0gIHB1YmxpYyBuYXRpdmUgdm9pZCByZXNldE11dGF0b3JJdGVyYXRvcigpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG5leHQgPGNvZGU+TXV0YXRvckNvbnRleHQ8L2NvZGU+IGluIGEKLSAgICogc3luY2hyb25pemVkIGl0ZXJhdGlvbiBvZiBhbGwgbXV0YXRvcnMuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG5leHQgPGNvZGU+TXV0YXRvckNvbnRleHQ8L2NvZGU+IGluIGEKLSAgICogIHN5bmNocm9uaXplZCBpdGVyYXRpb24gb2YgYWxsIG11dGF0b3JzLCBvcgotICAgKiAgPGNvZGU+bnVsbDwvY29kZT4gd2hlbiBhbGwgbXV0YXRvcnMgaGF2ZSBiZWVuIGRvbmUuCi0gICAqLwotICBwdWJsaWMgbmF0aXZlIE11dGF0b3JDb250ZXh0IGdldE5leHRNdXRhdG9yKCk7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9tbXRrL0Fzc2VydC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvajMvbW10ay9Bc3NlcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUzZWQ0MC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9tbXRrL0Fzc2VydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQXNzZXJ0LmphdmEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLQotcGFja2FnZSBvcmcuajMubW10azsKLQotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcuajMucnVudGltZS5WTTsKLQotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGZpbmFsIGNsYXNzIEFzc2VydCBleHRlbmRzIG9yZy5tbXRrLnZtLkFzc2VydCB7Ci0gIAotICAvKioKLSAgICogPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXNzZXJ0aW9ucyBzaG91bGQgYmUgdmVyaWZpZWQKLSAgICovCi0gIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIGdldFZlcmlmeUFzc2VydGlvbnNDb25zdGFudCgpIHsKLSAgICByZXR1cm4gVk0uVmVyaWZ5QXNzZXJ0aW9uczsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHdoZW5ldmVyIGFuIGVycm9yIGlzIGVuY291bnRlcmVkLgotICAgKgotICAgKiBAcGFyYW0gc3RyIEEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGVycm9yIGNvbmRpdGlvbi4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGVycm9yKFN0cmluZyBzdHIpIHsKLSAgICBTcGFjZS5wcmludFVzYWdlUGFnZXMoKTsKLSAgICBTcGFjZS5wcmludFVzYWdlTUIoKTsKLSAgICBmYWlsKHN0cik7Ci0gIH0KLQotICAvKioKLSAgICogTG9ncyBhIG1lc3NhZ2UgYW5kIHRyYWNlYmFjaywgdGhlbiBleGl0cy4KLSAgICoKLSAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIHN0cmluZyB0byBsb2cKLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGZhaWwoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICBWTS5zeXNGYWlsKG1lc3NhZ2UpOwotICB9Ci0KLSAgQFVuaW50ZXJydXB0aWJsZQotICBwdWJsaWMgZmluYWwgdm9pZCBleGl0KGludCByYykgewotICAgIFZNLnN5c0V4aXQocmMpOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyB0aGF0IHRoZSBnaXZlbiBjb25kaXRpb24gaXMgdHJ1ZS4gIElmIGl0IGlzIG5vdCwgdGhpcwotICAgKiBtZXRob2QgZG9lcyBhIHRyYWNlYmFjayBhbmQgZXhpdHMuIEFsbCBjYWxscyB0byB0aGlzIG1ldGhvZAotICAgKiBtdXN0IGJlIGd1YXJkZWQgYnkgPGNvZGU+Vk0uVkVSSUZZX0FTU0VSVElPTlM8L2NvZGU+LgotICAgKgotICAgKiBAcGFyYW0gY29uZCB0aGUgY29uZGl0aW9uIHRvIGJlIGNoZWNrZWQKLSAgICovCi0gIEBJbmxpbmUodmFsdWU9SW5saW5lLldoZW4uQWxsQXJndW1lbnRzQXJlQ29uc3RhbnQpCi0gIHB1YmxpYyBmaW5hbCB2b2lkIF9hc3NlcnQoYm9vbGVhbiBjb25kKSB7Ci0gICAgaWYgKCFvcmcubW10ay52bS5WTS5WRVJJRllfQVNTRVJUSU9OUykKLSAgICAgIFZNLnN5c0ZhaWwoIkFsbCBhc3NlcnRpb25zIG11c3QgYmUgZ3VhcmRlZCBieSBWTS5WRVJJRllfQVNTRVJUSU9OUzogcGxlYXNlIGNoZWNrIHRoZSBmYWlsaW5nIGFzc2VydGlvbiIpOwotICAgIFZNLl9hc3NlcnQoY29uZCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tzIHRoYXQgdGhlIGdpdmVuIGNvbmRpdGlvbiBpcyB0cnVlLiAgSWYgaXQgaXMgbm90LCB0aGlzCi0gICAqIG1ldGhvZCBwcmludHMgYSBtZXNzYWdlLCBkb2VzIGEgdHJhY2ViYWNrIGFuZCBleGl0cy4gQWxsIGNhbGxzCi0gICAqIHRvIHRoaXMgbWV0aG9kIG11c3QgYmUgZ3VhcmRlZCBieSA8Y29kZT5WTS5WRVJJRllfQVNTRVJUSU9OUzwvY29kZT4uCi0gICAqCi0gICAqIEBwYXJhbSBjb25kIHRoZSBjb25kaXRpb24gdG8gYmUgY2hlY2tlZAotICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBwcmludAotICAgKi8KLSAgQElubGluZSh2YWx1ZT1JbmxpbmUuV2hlbi5Bcmd1bWVudHNBcmVDb25zdGFudCwgYXJndW1lbnRzPXsxfSkKLSAgcHVibGljIGZpbmFsIHZvaWQgX2Fzc2VydChib29sZWFuIGNvbmQsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgaWYgKCFvcmcubW10ay52bS5WTS5WRVJJRllfQVNTRVJUSU9OUykKLSAgICAgIFZNLnN5c0ZhaWwoIkFsbCBhc3NlcnRpb25zIG11c3QgYmUgZ3VhcmRlZCBieSBWTS5WRVJJRllfQVNTRVJUSU9OUzogcGxlYXNlIGNoZWNrIHRoZSBmYWlsaW5nIGFzc2VydGlvbiIpOwotICAgIGlmICghY29uZCkgVk0uc3lzV3JpdGVsbihtZXNzYWdlKTsKLSAgICBWTS5fYXNzZXJ0KGNvbmQpOwotICB9Ci0KLSAgcHVibGljIG5hdGl2ZSBmaW5hbCB2b2lkIGR1bXBTdGFjaygpOwotCi0gIC8qKgotICAgKiBDaGVja3MgaWYgdGhlIHZpcnR1YWwgbWFjaGluZSBpcyBydW5uaW5nLiAgVGhpcyB2YWx1ZSBjaGFuZ2VzLCBzbwotICAgKiB0aGUgY2FsbC10aHJvdWdoIHRvIHRoZSBWTSBtdXN0IGJlIGEgbWV0aG9kLiAKLSAgICoKLSAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdmlydHVhbCBtYWNoaW5lIGlzIHJ1bm5pbmcKLSAgICovCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bm5pbmdWTSgpIHsgcmV0dXJuIFZNLnJ1bm5pbmdWTTsgfQotCi19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9tbXRrL0JhcnJpZXJzLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9tbXRrL0JhcnJpZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZGY2YWMuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvajMvbW10ay9CYXJyaWVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA3ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcuajMubW10azsKLQotaW1wb3J0IG9yZy5qaWtlc3J2bS5TaXplQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5qaWtlc3J2bS5NYWdpYzsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIEJhcnJpZXJzIGV4dGVuZHMgb3JnLm1tdGsudm0uQmFycmllcnMgaW1wbGVtZW50cyBTaXplQ29uc3RhbnRzIHsKLSAgLyoqCi0gICAqIFBlcmZvcm0gdGhlIGFjdHVhbCB3cml0ZSBvZiBhIGJvb2xlYW4gd3JpdGUgYmFycmllci4KLSAgICoKLSAgICogQHBhcmFtIG9ianJlZiBUaGUgb2JqZWN0IHRoYXQgaGFzIHRoZSBib29sZWFuIGZpZWxkCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGUgc2xvdCB3aWxsIGJlIHVwZGF0ZWQgdG8KLSAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGZyb20gdGhlIHJlZgotICAgKiBAcGFyYW0gbG9jYXRpb24gVGhlIEZpZWxkUmVmZXJlbmNlIGluZGV4IHRvIGFzc2lzdCB0aGUgc3RvcmUKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHdyaXRlIGlzIG9jY3VycmluZwotICAgKi8KLSAgQElubGluZQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGZpbmFsIHZvaWQgYm9vbGVhbldyaXRlKE9iamVjdFJlZmVyZW5jZSBvYmpyZWYsIGJvb2xlYW4gdmFsdWUsIFdvcmQgb2Zmc2V0LCBXb3JkIGxvY2F0aW9uLCBpbnQgbW9kZSkgewotICAgIE1hZ2ljLnNldEJvb2xlYW5BdE9mZnNldChvYmpyZWYudG9PYmplY3QoKSwgb2Zmc2V0LnRvT2Zmc2V0KCksIHZhbHVlLCBsb2NhdGlvbi50b0ludCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgcmVhZCBvZiBhIGJvb2xlYW4gcmVhZCBiYXJyaWVyLgotICAgKgotICAgKiBAcGFyYW0gb2JqcmVmIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIGJvb2xlYW4gZmllbGQKLSAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGZyb20gdGhlIHJlZgotICAgKiBAcGFyYW0gdW51c2VkIFVudXNlZAotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgd3JpdGUgaXMgb2NjdXJyaW5nCi0gICAqIEByZXR1cm4gdGhlIHJlYWQgdmFsdWUKLSAgICovCi0gIEBJbmxpbmUKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGJvb2xlYW5SZWFkKE9iamVjdFJlZmVyZW5jZSBvYmpyZWYsIFdvcmQgb2Zmc2V0LCBXb3JkIGxvY2F0aW9uLCBpbnQgbW9kZSkgewotICAgIHJldHVybiBNYWdpYy5nZXRCeXRlQXRPZmZzZXQob2JqcmVmLnRvT2JqZWN0KCksIG9mZnNldC50b09mZnNldCgpKSA9PSAwOwotICB9Ci0KLSAgLyoqCi0gICAqIFBlcmZvcm0gdGhlIGFjdHVhbCB3cml0ZSBvZiBhIGJ5dGUgd3JpdGUgYmFycmllci4KLSAgICoKLSAgICogQHBhcmFtIG9ianJlZiBUaGUgb2JqZWN0IHRoYXQgaGFzIHRoZSBieXRlIGZpZWxkCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGUgc2xvdCB3aWxsIGJlIHVwZGF0ZWQgdG8KLSAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGZyb20gdGhlIHJlZgotICAgKiBAcGFyYW0gbG9jYXRpb24gVGhlIEZpZWxkUmVmZXJlbmNlIGluZGV4IHRvIGFzc2lzdCB0aGUgc3RvcmUKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHdyaXRlIGlzIG9jY3VycmluZwotICAgKi8KLSAgQElubGluZQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGZpbmFsIHZvaWQgYnl0ZVdyaXRlKE9iamVjdFJlZmVyZW5jZSBvYmpyZWYsIGJ5dGUgdmFsdWUsIFdvcmQgb2Zmc2V0LCBXb3JkIGxvY2F0aW9uLCBpbnQgbW9kZSkgewotICAgIE1hZ2ljLnNldEJ5dGVBdE9mZnNldChvYmpyZWYudG9PYmplY3QoKSwgb2Zmc2V0LnRvT2Zmc2V0KCksIHZhbHVlLCBsb2NhdGlvbi50b0ludCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgcmVhZCBvZiBhIGJ5dGUgcmVhZCBiYXJyaWVyLgotICAgKgotICAgKiBAcGFyYW0gb2JqcmVmIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIGJ5dGUgZmllbGQKLSAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGZyb20gdGhlIHJlZgotICAgKiBAcGFyYW0gdW51c2VkIFVudXNlZAotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgd3JpdGUgaXMgb2NjdXJyaW5nCi0gICAqIEByZXR1cm4gdGhlIHJlYWQgdmFsdWUKLSAgICovCi0gIEBJbmxpbmUKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCBieXRlIGJ5dGVSZWFkKE9iamVjdFJlZmVyZW5jZSBvYmpyZWYsIFdvcmQgb2Zmc2V0LCBXb3JkIGxvY2F0aW9uLCBpbnQgbW9kZSkgewotICAgIHJldHVybiBNYWdpYy5nZXRCeXRlQXRPZmZzZXQob2JqcmVmLnRvT2JqZWN0KCksIG9mZnNldC50b09mZnNldCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgd3JpdGUgb2YgYSBjaGFyIHdyaXRlIGJhcnJpZXIuCi0gICAqCi0gICAqIEBwYXJhbSBvYmpyZWYgVGhlIG9iamVjdCB0aGF0IGhhcyB0aGUgY2hhciBmaWVsZAotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgdGhlIHNsb3Qgd2lsbCBiZSB1cGRhdGVkIHRvCi0gICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBmcm9tIHRoZSByZWYKLSAgICogQHBhcmFtIGxvY2F0aW9uIFRoZSBGaWVsZFJlZmVyZW5jZSBpbmRleCB0byBhc3Npc3QgdGhlIHN0b3JlCi0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB3cml0ZSBpcyBvY2N1cnJpbmcKLSAgICovCi0gIEBJbmxpbmUKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGNoYXJXcml0ZShPYmplY3RSZWZlcmVuY2Ugb2JqcmVmLCBjaGFyIHZhbHVlLCBXb3JkIG9mZnNldCwgV29yZCBsb2NhdGlvbiwgaW50IG1vZGUpIHsKLSAgICBNYWdpYy5zZXRDaGFyQXRPZmZzZXQob2JqcmVmLnRvT2JqZWN0KCksIG9mZnNldC50b09mZnNldCgpLCB2YWx1ZSwgbG9jYXRpb24udG9JbnQoKSk7Ci0gIH0KLQotICAvKioKLSAgICogUGVyZm9ybSB0aGUgYWN0dWFsIHJlYWQgb2YgYSBjaGFyIHJlYWQgYmFycmllci4KLSAgICoKLSAgICogQHBhcmFtIG9ianJlZiBUaGUgb2JqZWN0IHRoYXQgaGFzIHRoZSBjaGFyIGZpZWxkCi0gICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBmcm9tIHRoZSByZWYKLSAgICogQHBhcmFtIHVudXNlZCBVbnVzZWQKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHdyaXRlIGlzIG9jY3VycmluZwotICAgKiBAcmV0dXJuIHRoZSByZWFkIHZhbHVlCi0gICAqLwotICBASW5saW5lCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZmluYWwgY2hhciBjaGFyUmVhZChPYmplY3RSZWZlcmVuY2Ugb2JqcmVmLCBXb3JkIG9mZnNldCwgV29yZCBsb2NhdGlvbiwgaW50IG1vZGUpIHsKLSAgICByZXR1cm4gTWFnaWMuZ2V0Q2hhckF0T2Zmc2V0KG9ianJlZi50b09iamVjdCgpLCBvZmZzZXQudG9PZmZzZXQoKSk7Ci0gIH0KLQotICAvKioKLSAgICogUGVyZm9ybSB0aGUgYWN0dWFsIHdyaXRlIG9mIGEgc2hvcnQgd3JpdGUgYmFycmllci4KLSAgICoKLSAgICogQHBhcmFtIG9ianJlZiBUaGUgb2JqZWN0IHRoYXQgaGFzIHRoZSBzaG9ydCBmaWVsZAotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgdGhlIHNsb3Qgd2lsbCBiZSB1cGRhdGVkIHRvCi0gICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBmcm9tIHRoZSByZWYKLSAgICogQHBhcmFtIGxvY2F0aW9uIFRoZSBGaWVsZFJlZmVyZW5jZSBpbmRleCB0byBhc3Npc3QgdGhlIHN0b3JlCi0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB3cml0ZSBpcyBvY2N1cnJpbmcKLSAgICovCi0gIEBJbmxpbmUKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNob3J0V3JpdGUoT2JqZWN0UmVmZXJlbmNlIG9ianJlZiwgc2hvcnQgdmFsdWUsIFdvcmQgb2Zmc2V0LCBXb3JkIGxvY2F0aW9uLCBpbnQgbW9kZSkgewotICAgIE1hZ2ljLnNldFNob3J0QXRPZmZzZXQob2JqcmVmLnRvT2JqZWN0KCksIG9mZnNldC50b09mZnNldCgpLCB2YWx1ZSwgbG9jYXRpb24udG9JbnQoKSk7Ci0gIH0KLQotICAvKioKLSAgICogUGVyZm9ybSB0aGUgYWN0dWFsIHJlYWQgb2YgYSBzaG9ydCByZWFkIGJhcnJpZXIuCi0gICAqCi0gICAqIEBwYXJhbSBvYmpyZWYgVGhlIG9iamVjdCB0aGF0IGhhcyB0aGUgc2hvcnQgZmllbGQKLSAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGZyb20gdGhlIHJlZgotICAgKiBAcGFyYW0gdW51c2VkIFVudXNlZAotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgd3JpdGUgaXMgb2NjdXJyaW5nCi0gICAqIEByZXR1cm4gdGhlIHJlYWQgdmFsdWUKLSAgICovCi0gIEBJbmxpbmUKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCBzaG9ydCBzaG9ydFJlYWQoT2JqZWN0UmVmZXJlbmNlIG9ianJlZiwgV29yZCBvZmZzZXQsIFdvcmQgbG9jYXRpb24sIGludCBtb2RlKSB7Ci0gICAgcmV0dXJuIE1hZ2ljLmdldFNob3J0QXRPZmZzZXQob2JqcmVmLnRvT2JqZWN0KCksIG9mZnNldC50b09mZnNldCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgd3JpdGUgb2YgYSBpbnQgd3JpdGUgYmFycmllci4KLSAgICoKLSAgICogQHBhcmFtIG9ianJlZiBUaGUgb2JqZWN0IHRoYXQgaGFzIHRoZSBpbnQgZmllbGQKLSAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHRoZSBzbG90IHdpbGwgYmUgdXBkYXRlZCB0bwotICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgZnJvbSB0aGUgcmVmCi0gICAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgRmllbGRSZWZlcmVuY2UgaW5kZXggdG8gYXNzaXN0IHRoZSBzdG9yZQotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgd3JpdGUgaXMgb2NjdXJyaW5nCi0gICAqLwotICBASW5saW5lCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZmluYWwgdm9pZCBpbnRXcml0ZShPYmplY3RSZWZlcmVuY2Ugb2JqcmVmLCBpbnQgdmFsdWUsIFdvcmQgb2Zmc2V0LCBXb3JkIGxvY2F0aW9uLCBpbnQgbW9kZSkgewotICAgIE1hZ2ljLnNldEludEF0T2Zmc2V0KG9ianJlZi50b09iamVjdCgpLCBvZmZzZXQudG9PZmZzZXQoKSwgdmFsdWUsIGxvY2F0aW9uLnRvSW50KCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFBlcmZvcm0gdGhlIGFjdHVhbCByZWFkIG9mIGEgaW50IHJlYWQgYmFycmllci4KLSAgICoKLSAgICogQHBhcmFtIG9ianJlZiBUaGUgb2JqZWN0IHRoYXQgaGFzIHRoZSBpbnQgZmllbGQKLSAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGZyb20gdGhlIHJlZgotICAgKiBAcGFyYW0gdW51c2VkIFVudXNlZAotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgd3JpdGUgaXMgb2NjdXJyaW5nCi0gICAqIEByZXR1cm4gdGhlIHJlYWQgdmFsdWUKLSAgICovCi0gIEBJbmxpbmUKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCBpbnQgaW50UmVhZChPYmplY3RSZWZlcmVuY2Ugb2JqcmVmLCBXb3JkIG9mZnNldCwgV29yZCBsb2NhdGlvbiwgaW50IG1vZGUpIHsKLSAgICByZXR1cm4gTWFnaWMuZ2V0SW50QXRPZmZzZXQob2JqcmVmLnRvT2JqZWN0KCksIG9mZnNldC50b09mZnNldCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBBdHRlbXB0IGFuIGF0b21pYyBjb21wYXJlIGFuZCBleGNoYW5nZSBpbiBhIHdyaXRlIGJhcnJpZXIgc2VxdWVuY2UuCi0gICAqCi0gICAqIEBwYXJhbSBvYmpyZWYgVGhlIG9iamVjdCB0aGF0IGhhcyB0aGUgaW50IGZpZWxkCi0gICAqIEBwYXJhbSBleHBlY3RlZCBUaGUgb2xkIGludCB0byBiZSBzd2FwcGVkIG91dAotICAgKiBAcGFyYW0gbmV3VmFsdWUgdGhlIG5ldyBpbnQKLSAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGZyb20gdGhlIHJlZgotICAgKiBAcGFyYW0gdW51c2VkIFVudXNlZAotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgd3JpdGUgaXMgb2NjdXJyaW5nCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY29tcGFyZSBhbmQgc3dhcCB3YXMgc3VjY2Vzc2Z1bAotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGludFRyeUNvbXBhcmVBbmRTd2FwKE9iamVjdFJlZmVyZW5jZSBvYmpyZWYsIGludCBleHBlY3RlZCwgaW50IG5ld1ZhbHVlLCBXb3JkIG9mZnNldCwgV29yZCB1bnVzZWQsIGludCBtb2RlKSB7Ci0gICAgaW50IG9sZFZhbHVlOwotICAgIGRvIHsKLSAgICAgIG9sZFZhbHVlID0gTWFnaWMucHJlcGFyZUludChvYmpyZWYsIG9mZnNldC50b09mZnNldCgpKTsKLSAgICAgIGlmIChvbGRWYWx1ZSAhPSBleHBlY3RlZCkgcmV0dXJuIGZhbHNlOwotICAgIH0gd2hpbGUgKCFNYWdpYy5hdHRlbXB0SW50KG9ianJlZiwgb2Zmc2V0LnRvT2Zmc2V0KCksIG9sZFZhbHVlLCBuZXdWYWx1ZSkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFBlcmZvcm0gdGhlIGFjdHVhbCB3cml0ZSBvZiBhIGxvbmcgd3JpdGUgYmFycmllci4KLSAgICoKLSAgICogQHBhcmFtIG9ianJlZiBUaGUgb2JqZWN0IHRoYXQgaGFzIHRoZSBsb25nIGZpZWxkCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGUgc2xvdCB3aWxsIGJlIHVwZGF0ZWQgdG8KLSAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGZyb20gdGhlIHJlZgotICAgKiBAcGFyYW0gbG9jYXRpb24gVGhlIEZpZWxkUmVmZXJlbmNlIGluZGV4IHRvIGFzc2lzdCB0aGUgc3RvcmUKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHdyaXRlIGlzIG9jY3VycmluZwotICAgKi8KLSAgQElubGluZQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGZpbmFsIHZvaWQgbG9uZ1dyaXRlKE9iamVjdFJlZmVyZW5jZSBvYmpyZWYsIGxvbmcgdmFsdWUsIFdvcmQgb2Zmc2V0LCBXb3JkIGxvY2F0aW9uLCBpbnQgbW9kZSkgewotICAgIE1hZ2ljLnNldExvbmdBdE9mZnNldChvYmpyZWYudG9PYmplY3QoKSwgb2Zmc2V0LnRvT2Zmc2V0KCksIHZhbHVlLCBsb2NhdGlvbi50b0ludCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgcmVhZCBvZiBhIGxvbmcgcmVhZCBiYXJyaWVyLgotICAgKgotICAgKiBAcGFyYW0gb2JqcmVmIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIGxvbmcgZmllbGQKLSAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGZyb20gdGhlIHJlZgotICAgKiBAcGFyYW0gdW51c2VkIFVudXNlZAotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgd3JpdGUgaXMgb2NjdXJyaW5nCi0gICAqIEByZXR1cm4gdGhlIHJlYWQgdmFsdWUKLSAgICovCi0gIEBJbmxpbmUKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCBsb25nIGxvbmdSZWFkKE9iamVjdFJlZmVyZW5jZSBvYmpyZWYsIFdvcmQgb2Zmc2V0LCBXb3JkIGxvY2F0aW9uLCBpbnQgbW9kZSkgewotICAgIHJldHVybiBNYWdpYy5nZXRMb25nQXRPZmZzZXQob2JqcmVmLnRvT2JqZWN0KCksIG9mZnNldC50b09mZnNldCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBBdHRlbXB0IGFuIGF0b21pYyBjb21wYXJlIGFuZCBleGNoYW5nZSBpbiBhIHdyaXRlIGJhcnJpZXIgc2VxdWVuY2UuCi0gICAqCi0gICAqIEBwYXJhbSBvYmpyZWYgVGhlIG9iamVjdCB0aGF0IGhhcyB0aGUgbG9uZyBmaWVsZAotICAgKiBAcGFyYW0gZXhwZWN0ZWQgVGhlIG9sZCBsb25nIHRvIGJlIHN3YXBwZWQgb3V0Ci0gICAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IGxvbmcKLSAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGZyb20gdGhlIHJlZgotICAgKiBAcGFyYW0gdW51c2VkIFVudXNlZAotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgd3JpdGUgaXMgb2NjdXJyaW5nCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY29tcGFyZSBhbmQgc3dhcCB3YXMgc3VjY2Vzc2Z1bAotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGxvbmdUcnlDb21wYXJlQW5kU3dhcChPYmplY3RSZWZlcmVuY2Ugb2JqcmVmLCBsb25nIGV4cGVjdGVkLCBsb25nIG5ld1ZhbHVlLCBXb3JkIG9mZnNldCwgV29yZCB1bnVzZWQsIGludCBtb2RlKSB7Ci0gICAgbG9uZyBvbGRWYWx1ZTsKLSAgICBkbyB7Ci0gICAgICBvbGRWYWx1ZSA9IE1hZ2ljLnByZXBhcmVMb25nKG9ianJlZiwgb2Zmc2V0LnRvT2Zmc2V0KCkpOwotICAgICAgaWYgKG9sZFZhbHVlICE9IGV4cGVjdGVkKSByZXR1cm4gZmFsc2U7Ci0gICAgfSB3aGlsZSAoIU1hZ2ljLmF0dGVtcHRMb25nKG9ianJlZiwgb2Zmc2V0LnRvT2Zmc2V0KCksIG9sZFZhbHVlLCBuZXdWYWx1ZSkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFBlcmZvcm0gdGhlIGFjdHVhbCB3cml0ZSBvZiBhIGZsb2F0IHdyaXRlIGJhcnJpZXIuCi0gICAqCi0gICAqIEBwYXJhbSBvYmpyZWYgVGhlIG9iamVjdCB0aGF0IGhhcyB0aGUgZmxvYXQgZmllbGQKLSAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHRoZSBzbG90IHdpbGwgYmUgdXBkYXRlZCB0bwotICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgZnJvbSB0aGUgcmVmCi0gICAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgRmllbGRSZWZlcmVuY2UgaW5kZXggdG8gYXNzaXN0IHRoZSBzdG9yZQotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgd3JpdGUgaXMgb2NjdXJyaW5nCi0gICAqLwotICBASW5saW5lCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZmluYWwgdm9pZCBmbG9hdFdyaXRlKE9iamVjdFJlZmVyZW5jZSBvYmpyZWYsIGZsb2F0IHZhbHVlLCBXb3JkIG9mZnNldCwgV29yZCBsb2NhdGlvbiwgaW50IG1vZGUpIHsKLSAgICBNYWdpYy5zZXRGbG9hdEF0T2Zmc2V0KG9ianJlZi50b09iamVjdCgpLCBvZmZzZXQudG9PZmZzZXQoKSwgdmFsdWUsIGxvY2F0aW9uLnRvSW50KCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFBlcmZvcm0gdGhlIGFjdHVhbCByZWFkIG9mIGEgZmxvYXQgcmVhZCBiYXJyaWVyLgotICAgKgotICAgKiBAcGFyYW0gb2JqcmVmIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIGZsb2F0IGZpZWxkCi0gICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBmcm9tIHRoZSByZWYKLSAgICogQHBhcmFtIHVudXNlZCBVbnVzZWQKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHdyaXRlIGlzIG9jY3VycmluZwotICAgKiBAcmV0dXJuIHRoZSByZWFkIHZhbHVlCi0gICAqLwotICBASW5saW5lCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZmluYWwgZmxvYXQgZmxvYXRSZWFkKE9iamVjdFJlZmVyZW5jZSBvYmpyZWYsIFdvcmQgb2Zmc2V0LCBXb3JkIGxvY2F0aW9uLCBpbnQgbW9kZSkgewotICAgIHJldHVybiBNYWdpYy5nZXRGbG9hdEF0T2Zmc2V0KG9ianJlZi50b09iamVjdCgpLCBvZmZzZXQudG9PZmZzZXQoKSk7Ci0gIH0KLQotICAvKioKLSAgICogUGVyZm9ybSB0aGUgYWN0dWFsIHdyaXRlIG9mIGEgZG91YmxlIHdyaXRlIGJhcnJpZXIuCi0gICAqCi0gICAqIEBwYXJhbSBvYmpyZWYgVGhlIG9iamVjdCB0aGF0IGhhcyB0aGUgZG91YmxlIGZpZWxkCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGUgc2xvdCB3aWxsIGJlIHVwZGF0ZWQgdG8KLSAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGZyb20gdGhlIHJlZgotICAgKiBAcGFyYW0gbG9jYXRpb24gVGhlIEZpZWxkUmVmZXJlbmNlIGluZGV4IHRvIGFzc2lzdCB0aGUgc3RvcmUKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHdyaXRlIGlzIG9jY3VycmluZwotICAgKi8KLSAgQElubGluZQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGZpbmFsIHZvaWQgZG91YmxlV3JpdGUoT2JqZWN0UmVmZXJlbmNlIG9ianJlZiwgZG91YmxlIHZhbHVlLCBXb3JkIG9mZnNldCwgV29yZCBsb2NhdGlvbiwgaW50IG1vZGUpIHsKLSAgICBNYWdpYy5zZXREb3VibGVBdE9mZnNldChvYmpyZWYudG9PYmplY3QoKSwgb2Zmc2V0LnRvT2Zmc2V0KCksIHZhbHVlLCBsb2NhdGlvbi50b0ludCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgcmVhZCBvZiBhIGRvdWJsZSByZWFkIGJhcnJpZXIuCi0gICAqCi0gICAqIEBwYXJhbSBvYmpyZWYgVGhlIG9iamVjdCB0aGF0IGhhcyB0aGUgZG91YmxlIGZpZWxkCi0gICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBmcm9tIHRoZSByZWYKLSAgICogQHBhcmFtIHVudXNlZCBVbnVzZWQKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHdyaXRlIGlzIG9jY3VycmluZwotICAgKiBAcmV0dXJuIHRoZSByZWFkIHZhbHVlCi0gICAqLwotICBASW5saW5lCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZmluYWwgZG91YmxlIGRvdWJsZVJlYWQoT2JqZWN0UmVmZXJlbmNlIG9ianJlZiwgV29yZCBvZmZzZXQsIFdvcmQgbG9jYXRpb24sIGludCBtb2RlKSB7Ci0gICAgcmV0dXJuIE1hZ2ljLmdldERvdWJsZUF0T2Zmc2V0KG9ianJlZi50b09iamVjdCgpLCBvZmZzZXQudG9PZmZzZXQoKSk7Ci0gIH0KLQotICAvKioKLSAgICogUGVyZm9ybSB0aGUgYWN0dWFsIHdyaXRlIG9mIGFuIG9iamVjdCByZWZlcmVuY2Ugd3JpdGUgYmFycmllci4KLSAgICoKLSAgICogQHBhcmFtIG9ianJlZiBUaGUgb2JqZWN0IHRoYXQgaGFzIHRoZSByZWZlcmVuY2UgZmllbGQKLSAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHRoZSBzbG90IHdpbGwgYmUgdXBkYXRlZCB0bwotICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgZnJvbSB0aGUgcmVmCi0gICAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgaW5kZXggb2YgdGhlIEZpZWxkUmVmZXJlbmNlCi0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB3cml0ZSBpcyBvY2N1cnJpbmcKLSAgICovCi0gIEBJbmxpbmUKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCB2b2lkIG9iamVjdFJlZmVyZW5jZVdyaXRlKE9iamVjdFJlZmVyZW5jZSBvYmpyZWYsIE9iamVjdFJlZmVyZW5jZSB2YWx1ZSwgV29yZCBvZmZzZXQsIFdvcmQgbG9jYXRpb24sIGludCBtb2RlKSB7Ci0gICAgTWFnaWMuc2V0T2JqZWN0QXRPZmZzZXQob2JqcmVmLnRvT2JqZWN0KCksIG9mZnNldC50b09mZnNldCgpLCB2YWx1ZS50b09iamVjdCgpLCBsb2NhdGlvbi50b0ludCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgcmVhZCBvZiBhbiBvYmplY3QgcmVmZXJlbmNlIHJlYWQgYmFycmllci4KLSAgICoKLSAgICogQHBhcmFtIG9ianJlZiBUaGUgb2JqZWN0IHRoYXQgaGFzIHRoZSByZWZlcmVuY2UgZmllbGQKLSAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGZyb20gdGhlIHJlZgotICAgKiBAcGFyYW0gbG9jYXRpb24gVGhlIGluZGV4IG9mIHRoZSBGaWVsZFJlZmVyZW5jZQotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgd3JpdGUgaXMgb2NjdXJyaW5nCi0gICAqIEByZXR1cm4gdGhlIG9iamVjdCByZWZlcmVuY2UgcmVhZCB2YWx1ZQotICAgKi8KLSAgQElubGluZQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGZpbmFsIE9iamVjdFJlZmVyZW5jZSBvYmplY3RSZWZlcmVuY2VSZWFkKE9iamVjdFJlZmVyZW5jZSBvYmpyZWYsIFdvcmQgb2Zmc2V0LCBXb3JkIGxvY2F0aW9uLCBpbnQgbW9kZSkgewotICAgIHJldHVybiBPYmplY3RSZWZlcmVuY2UuZnJvbU9iamVjdChNYWdpYy5nZXRPYmplY3RBdE9mZnNldChvYmpyZWYudG9PYmplY3QoKSwgb2Zmc2V0LnRvT2Zmc2V0KCksIGxvY2F0aW9uLnRvSW50KCkpKTsKLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgd3JpdGUgb2YgdGhlIG5vbi1oZWFwIHdyaXRlIGJhcnJpZXIuICBUaGlzIGlzCi0gICAqIHVzZWQgd2hlbiB0aGUgc3RvcmUgaXMgbm90IHRvIGFuIG9iamVjdCwgYnV0IHRvIGEgbm9uLWhlYXAgbG9jYXRpb24KLSAgICogc3VjaCBhcyBzdGF0aWNzIG9yIHRoZSBzdGFjay4KLSAgICogQHBhcmFtIHRhcmdldCBUaGUgdmFsdWUgdGhhdCB0aGUgc2xvdCB3aWxsIGJlIHVwZGF0ZWQgdG8KLSAgICogQHBhcmFtIHVudXNlZEEgVGhlIG9mZnNldCBmcm9tIHRoZSByZWYKLSAgICogQHBhcmFtIHVudXNlZEIgVW51c2VkCi0gICAqIEBwYXJhbSByZWYgVGhlIG9iamVjdCB0aGF0IGhhcyB0aGUgcmVmZXJlbmNlIGZpZWxkCi0gICAqLwotICBASW5saW5lCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZmluYWwgdm9pZCBvYmplY3RSZWZlcmVuY2VOb25IZWFwV3JpdGUoQWRkcmVzcyBzbG90LCBPYmplY3RSZWZlcmVuY2UgdGFyZ2V0LCBXb3JkIHVudXNlZEEsIFdvcmQgdW51c2VkQikgewotICAgIHNsb3Quc3RvcmUodGFyZ2V0KTsKLSAgfQotCi0gIC8qKgotICAgKiBBdG9taWNhbGx5IHdyaXRlIGEgcmVmZXJlbmNlIGZpZWxkIG9mIGFuIG9iamVjdCBvciBhcnJheSBhbmQgcmV0dXJuCi0gICAqIHRoZSBvbGQgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZSBmaWVsZC4KLSAgICoKLSAgICogQHBhcmFtIG9ianJlZiBUaGUgb2JqZWN0IHRoYXQgaGFzIHRoZSByZWZlcmVuY2UgZmllbGQKLSAgICogQHBhcmFtIHRhcmdldCBUaGUgdmFsdWUgdGhhdCB0aGUgc2xvdCB3aWxsIGJlIHVwZGF0ZWQgdG8KLSAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGZyb20gdGhlIHJlZgotICAgKiBAcGFyYW0gdW51c2VkIFVudXNlZAotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgd3JpdGUgaXMgb2NjdXJyaW5nCi0gICAqIEByZXR1cm4gVGhlIHZhbHVlIHRoYXQgd2FzIHJlcGxhY2VkIGJ5IHRoZSB3cml0ZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCBPYmplY3RSZWZlcmVuY2Ugb2JqZWN0UmVmZXJlbmNlQXRvbWljV3JpdGUoT2JqZWN0UmVmZXJlbmNlIG9ianJlZiwgT2JqZWN0UmVmZXJlbmNlIHRhcmdldCwgV29yZCBvZmZzZXQsIFdvcmQgdW51c2VkLCBpbnQgbW9kZSkgewotICAgIE9iamVjdCBvYmogPSBvYmpyZWYudG9PYmplY3QoKTsKLSAgICBPYmplY3QgbmV3T2JqZWN0ID0gdGFyZ2V0LnRvT2JqZWN0KCk7Ci0gICAgT2JqZWN0IG9sZE9iamVjdDsKLSAgICBkbyB7Ci0gICAgICBvbGRPYmplY3QgPSBNYWdpYy5wcmVwYXJlT2JqZWN0KG9iaiwgb2Zmc2V0LnRvT2Zmc2V0KCkpOwotICAgIH0gd2hpbGUgKCFNYWdpYy5hdHRlbXB0T2JqZWN0KG9iaiwgb2Zmc2V0LnRvT2Zmc2V0KCksIG9sZE9iamVjdCwgbmV3T2JqZWN0KSk7Ci0gICAgcmV0dXJuIE9iamVjdFJlZmVyZW5jZS5mcm9tT2JqZWN0KG9sZE9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogQXR0ZW1wdCBhbiBhdG9taWMgY29tcGFyZSBhbmQgZXhjaGFuZ2UgaW4gYSB3cml0ZSBiYXJyaWVyIHNlcXVlbmNlLgotICAgKgotICAgKiBAcGFyYW0gb2JqcmVmIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIHJlZmVyZW5jZSBmaWVsZAotICAgKiBAcGFyYW0gb2xkIFRoZSBvbGQgcmVmZXJlbmNlIHRvIGJlIHN3YXBwZWQgb3V0Ci0gICAqIEBwYXJhbSB0YXJnZXQgVGhlIHZhbHVlIHRoYXQgdGhlIHNsb3Qgd2lsbCBiZSB1cGRhdGVkIHRvCi0gICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBmcm9tIHRoZSByZWYKLSAgICogQHBhcmFtIHVudXNlZCBVbnVzZWQKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHdyaXRlIGlzIG9jY3VycmluZwotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNvbXBhcmUgYW5kIHN3YXAgd2FzIHN1Y2Nlc3NmdWwKLSAgICovCi0gIEBJbmxpbmUKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIG9iamVjdFJlZmVyZW5jZVRyeUNvbXBhcmVBbmRTd2FwKE9iamVjdFJlZmVyZW5jZSBvYmpyZWYsIE9iamVjdFJlZmVyZW5jZSBvbGQsIE9iamVjdFJlZmVyZW5jZSB0YXJnZXQsIFdvcmQgb2Zmc2V0LCBXb3JkIHVudXNlZCwgaW50IG1vZGUpIHsKLSAgICBPYmplY3Qgb2xkVmFsdWU7Ci0gICAgZG8gewotICAgICAgb2xkVmFsdWUgPSBNYWdpYy5wcmVwYXJlT2JqZWN0KG9ianJlZiwgb2Zmc2V0LnRvT2Zmc2V0KCkpOwotICAgICAgaWYgKG9sZFZhbHVlICE9IG9sZCkgcmV0dXJuIGZhbHNlOwotICAgIH0gd2hpbGUgKCFNYWdpYy5hdHRlbXB0T2JqZWN0KG9ianJlZiwgb2Zmc2V0LnRvT2Zmc2V0KCksIG9sZFZhbHVlLCB0YXJnZXQpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgd3JpdGUgb2YgdGhlIHdyaXRlIGJhcnJpZXIsIHdyaXRpbmcgdGhlIHZhbHVlIGFzIGEgcmF3IFdvcmQuCi0gICAqCi0gICAqIEBwYXJhbSByZWYgVGhlIG9iamVjdCB0aGF0IGhhcyB0aGUgV29yZCBmaWVsZAotICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB2YWx1ZSB0aGF0IHRoZSBzbG90IHdpbGwgYmUgdXBkYXRlZCB0bwotICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgZnJvbSB0aGUgcmVmCi0gICAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgaW5kZXggb2YgdGhlIEZpZWxkUmVmZXJlbmNlCi0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB3cml0ZSBpcyBvY2N1cnJpbmcKLSAgICovCi0gIEBJbmxpbmUKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHdvcmRXcml0ZShPYmplY3RSZWZlcmVuY2UgcmVmLCBXb3JkIHRhcmdldCwKLSAgICAgIFdvcmQgb2Zmc2V0LCBXb3JkIGxvY2F0aW9uLCBpbnQgbW9kZSkgewotICAgIE1hZ2ljLnNldFdvcmRBdE9mZnNldChyZWYudG9PYmplY3QoKSwgb2Zmc2V0LnRvT2Zmc2V0KCksIHRhcmdldCwgbG9jYXRpb24udG9JbnQoKSk7Ci0gIH0KLQotICAvKioKLSAgICogQXRvbWljYWxseSB3cml0ZSBhIHJhdyByZWZlcmVuY2UgZmllbGQgb2YgYW4gb2JqZWN0IG9yIGFycmF5IGFuZCByZXR1cm4KLSAgICogdGhlIG9sZCB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIGZpZWxkLgotICAgKgotICAgKiBAcGFyYW0gcmVmIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIFdvcmQgZmllbGQKLSAgICogQHBhcmFtIHRhcmdldCBUaGUgdmFsdWUgdGhhdCB0aGUgc2xvdCB3aWxsIGJlIHVwZGF0ZWQgdG8KLSAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGZyb20gdGhlIHJlZgotICAgKiBAcGFyYW0gdW51c2VkIFVudXNlZAotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgd3JpdGUgaXMgb2NjdXJyaW5nCi0gICAqIEByZXR1cm4gVGhlIHZhbHVlIHRoYXQgd2FzIHJlcGxhY2VkIGJ5IHRoZSB3cml0ZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCBXb3JkIHdvcmRBdG9taWNXcml0ZShPYmplY3RSZWZlcmVuY2UgcmVmLCBXb3JkIHRhcmdldCwKLSAgICAgIFdvcmQgb2Zmc2V0LCBXb3JkIHVudXNlZCwgaW50IG1vZGUpIHsKLSAgICBXb3JkIG9sZFZhbHVlOwotICAgIGRvIHsKLSAgICAgIG9sZFZhbHVlID0gTWFnaWMucHJlcGFyZVdvcmQocmVmLnRvT2JqZWN0KCksIG9mZnNldC50b09mZnNldCgpKTsKLSAgICB9IHdoaWxlICghTWFnaWMuYXR0ZW1wdFdvcmQocmVmLnRvT2JqZWN0KCksIG9mZnNldC50b09mZnNldCgpLCBvbGRWYWx1ZSwgdGFyZ2V0KSk7Ci0gICAgcmV0dXJuIG9sZFZhbHVlOwotICB9Ci0KLSAgLyoqCi0gICAqIEF0dGVtcHQgYW4gYXRvbWljIGNvbXBhcmUgYW5kIGV4Y2hhbmdlIGluIGEgd3JpdGUgYmFycmllciBzZXF1ZW5jZS4KLSAgICoKLSAgICogQHBhcmFtIHJlZiBUaGUgb2JqZWN0IHRoYXQgaGFzIHRoZSBXb3JkIGZpZWxkCi0gICAqIEBwYXJhbSBvbGQgVGhlIG9sZCBXb3JkIHRvIGJlIHN3YXBwZWQgb3V0Ci0gICAqIEBwYXJhbSB0YXJnZXQgVGhlIHZhbHVlIHRoYXQgdGhlIHNsb3Qgd2lsbCBiZSB1cGRhdGVkIHRvCi0gICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBmcm9tIHRoZSByZWYKLSAgICogQHBhcmFtIHVudXNlZCBVbnVzZWQKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHdyaXRlIGlzIG9jY3VycmluZwotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNvbXBhcmUgYW5kIHN3YXAgd2FzIHN1Y2Nlc3NmdWwKLSAgICovCi0gIEBJbmxpbmUKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHdvcmRUcnlDb21wYXJlQW5kU3dhcChPYmplY3RSZWZlcmVuY2UgcmVmLCBXb3JkIG9sZCwgV29yZCB0YXJnZXQsCi0gICAgICBXb3JkIG9mZnNldCwgV29yZCB1bnVzZWQsIGludCBtb2RlKSB7Ci0gICAgZG8gewotICAgICAgV29yZCBjdXJyZW50VmFsdWUgPSBNYWdpYy5wcmVwYXJlV29yZChyZWYsIG9mZnNldC50b09mZnNldCgpKTsKLSAgICAgIGlmIChjdXJyZW50VmFsdWUgIT0gb2xkKSByZXR1cm4gZmFsc2U7Ci0gICAgfSB3aGlsZSAoIU1hZ2ljLmF0dGVtcHRXb3JkKHJlZiwgb2Zmc2V0LnRvT2Zmc2V0KCksIG9sZCwgdGFyZ2V0KSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogUGVyZm9ybSB0aGUgYWN0dWFsIHJlYWQgb2YgdGhlIHJlYWQgYmFycmllciwgcmV0dXJuaW5nIHRoZSB2YWx1ZSBhcyBhIHJhdyBXb3JkLgotICAgKgotICAgKiBAcGFyYW0gcmVmIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIFdvcmQgZmllbGQKLSAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGZyb20gdGhlIHJlZgotICAgKiBAcGFyYW0gbG9jYXRpb24gVGhlIGluZGV4IG9mIHRoZSBGaWVsZFJlZmVyZW5jZQotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgd3JpdGUgaXMgb2NjdXJyaW5nCi0gICAqIEByZXR1cm4gdGhlIHJlYWQgdmFsdWUKLSAgICovCi0gIEBJbmxpbmUKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCBXb3JkIHdvcmRSZWFkKE9iamVjdFJlZmVyZW5jZSByZWYsCi0gICAgICAgIFdvcmQgb2Zmc2V0LCBXb3JkIGxvY2F0aW9uLCBpbnQgbW9kZSkgewotICAgIHJldHVybiBNYWdpYy5nZXRXb3JkQXRPZmZzZXQocmVmLnRvT2JqZWN0KCksIG9mZnNldC50b09mZnNldCgpLCBsb2NhdGlvbi50b0ludCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgd3JpdGUgb2YgdGhlIHdyaXRlIGJhcnJpZXIsIHdyaXRpbmcgdGhlIHZhbHVlIGFzIGEgcmF3IEFkZHJlc3MuCi0gICAqCi0gICAqIEBwYXJhbSByZWYgVGhlIG9iamVjdCB0aGF0IGhhcyB0aGUgQWRkcmVzcyBmaWVsZAotICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB2YWx1ZSB0aGF0IHRoZSBzbG90IHdpbGwgYmUgdXBkYXRlZCB0bwotICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgZnJvbSB0aGUgcmVmCi0gICAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgaW5kZXggb2YgdGhlIEZpZWxkUmVmZXJlbmNlCi0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB3cml0ZSBpcyBvY2N1cnJpbmcKLSAgICovCi0gIEBJbmxpbmUKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGFkZHJlc3NXcml0ZShPYmplY3RSZWZlcmVuY2UgcmVmLCBBZGRyZXNzIHRhcmdldCwKLSAgICAgIFdvcmQgb2Zmc2V0LCBXb3JkIGxvY2F0aW9uLCBpbnQgbW9kZSkgewotICAgIE1hZ2ljLnNldEFkZHJlc3NBdE9mZnNldChyZWYudG9PYmplY3QoKSwgb2Zmc2V0LnRvT2Zmc2V0KCksIHRhcmdldCwgbG9jYXRpb24udG9JbnQoKSk7Ci0gIH0KLQotICAvKioKLSAgICogUGVyZm9ybSB0aGUgYWN0dWFsIHJlYWQgb2YgdGhlIHJlYWQgYmFycmllciwgcmV0dXJuaW5nIHRoZSB2YWx1ZSBhcyBhIHJhdyBBZGRyZXNzLgotICAgKgotICAgKiBAcGFyYW0gcmVmIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIEFkZHJlc3MgZmllbGQKLSAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGZyb20gdGhlIHJlZgotICAgKiBAcGFyYW0gbG9jYXRpb24gVGhlIGluZGV4IG9mIHRoZSBGaWVsZFJlZmVyZW5jZQotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgd3JpdGUgaXMgb2NjdXJyaW5nCi0gICAqIEByZXR1cm4gdGhlIHJlYWQgdmFsdWUKLSAgICovCi0gIEBJbmxpbmUKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCBBZGRyZXNzIGFkZHJlc3NSZWFkKE9iamVjdFJlZmVyZW5jZSByZWYsCi0gICAgICAgIFdvcmQgb2Zmc2V0LCBXb3JkIGxvY2F0aW9uLCBpbnQgbW9kZSkgewotICAgIHJldHVybiBNYWdpYy5nZXRBZGRyZXNzQXRPZmZzZXQocmVmLnRvT2JqZWN0KCksIG9mZnNldC50b09mZnNldCgpLCBsb2NhdGlvbi50b0ludCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBBdHRlbXB0IGFuIGF0b21pYyBjb21wYXJlIGFuZCBleGNoYW5nZSBpbiBhIHdyaXRlIGJhcnJpZXIgc2VxdWVuY2UuCi0gICAqCi0gICAqIEBwYXJhbSBvYmpyZWYgVGhlIG9iamVjdCB0aGF0IGhhcyB0aGUgQWRkcmVzcyBmaWVsZAotICAgKiBAcGFyYW0gZXhwZWN0ZWQgVGhlIG9sZCBBZGRyZXNzIHRvIGJlIHN3YXBwZWQgb3V0Ci0gICAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IEFkZHJlc3MKLSAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGZyb20gdGhlIHJlZgotICAgKiBAcGFyYW0gdW51c2VkIFVudXNlZAotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgd3JpdGUgaXMgb2NjdXJyaW5nCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY29tcGFyZSBhbmQgc3dhcCB3YXMgc3VjY2Vzc2Z1bAotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGFkZHJlc3NUcnlDb21wYXJlQW5kU3dhcChPYmplY3RSZWZlcmVuY2Ugb2JqcmVmLCBBZGRyZXNzIGV4cGVjdGVkLCBBZGRyZXNzIG5ld1ZhbHVlLCBXb3JkIG9mZnNldCwgV29yZCB1bnVzZWQsIGludCBtb2RlKSB7Ci0gICAgQWRkcmVzcyBvbGRWYWx1ZTsKLSAgICBkbyB7Ci0gICAgICBvbGRWYWx1ZSA9IE1hZ2ljLnByZXBhcmVBZGRyZXNzKG9ianJlZiwgb2Zmc2V0LnRvT2Zmc2V0KCkpOwotICAgICAgaWYgKG9sZFZhbHVlICE9IGV4cGVjdGVkKSByZXR1cm4gZmFsc2U7Ci0gICAgfSB3aGlsZSAoIU1hZ2ljLmF0dGVtcHRBZGRyZXNzKG9ianJlZiwgb2Zmc2V0LnRvT2Zmc2V0KCksIG9sZFZhbHVlLCBuZXdWYWx1ZSkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFBlcmZvcm0gdGhlIGFjdHVhbCB3cml0ZSBvZiB0aGUgd3JpdGUgYmFycmllciwgd3JpdGluZyB0aGUgdmFsdWUgYXMgYSByYXcgT2Zmc2V0LgotICAgKgotICAgKiBAcGFyYW0gcmVmIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIE9mZnNldCBmaWVsZAotICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB2YWx1ZSB0aGF0IHRoZSBzbG90IHdpbGwgYmUgdXBkYXRlZCB0bwotICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgZnJvbSB0aGUgcmVmCi0gICAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgaW5kZXggb2YgdGhlIEZpZWxkUmVmZXJlbmNlCi0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB3cml0ZSBpcyBvY2N1cnJpbmcKLSAgICovCi0gIEBJbmxpbmUKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCB2b2lkIG9mZnNldFdyaXRlKE9iamVjdFJlZmVyZW5jZSByZWYsIE9mZnNldCB0YXJnZXQsCi0gICAgICBXb3JkIG9mZnNldCwgV29yZCBsb2NhdGlvbiwgaW50IG1vZGUpIHsKLSAgICBNYWdpYy5zZXRPZmZzZXRBdE9mZnNldChyZWYudG9PYmplY3QoKSwgb2Zmc2V0LnRvT2Zmc2V0KCksIHRhcmdldCwgbG9jYXRpb24udG9JbnQoKSk7Ci0gIH0KLQotICAvKioKLSAgICogUGVyZm9ybSB0aGUgYWN0dWFsIHJlYWQgb2YgdGhlIHJlYWQgYmFycmllciwgcmV0dXJuaW5nIHRoZSB2YWx1ZSBhcyBhIHJhdyBPZmZzZXQuCi0gICAqCi0gICAqIEBwYXJhbSByZWYgVGhlIG9iamVjdCB0aGF0IGhhcyB0aGUgT2Zmc2V0IGZpZWxkCi0gICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBmcm9tIHRoZSByZWYKLSAgICogQHBhcmFtIGxvY2F0aW9uIFRoZSBpbmRleCBvZiB0aGUgRmllbGRSZWZlcmVuY2UKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHdyaXRlIGlzIG9jY3VycmluZwotICAgKiBAcmV0dXJuIHRoZSByZWFkIHZhbHVlCi0gICAqLwotICBASW5saW5lCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZmluYWwgT2Zmc2V0IG9mZnNldFJlYWQoT2JqZWN0UmVmZXJlbmNlIHJlZiwKLSAgICAgICAgV29yZCBvZmZzZXQsIFdvcmQgbG9jYXRpb24sIGludCBtb2RlKSB7Ci0gICAgcmV0dXJuIE1hZ2ljLmdldE9mZnNldEF0T2Zmc2V0KHJlZi50b09iamVjdCgpLCBvZmZzZXQudG9PZmZzZXQoKSwgbG9jYXRpb24udG9JbnQoKSk7Ci0gIH0KLQotICAvKioKLSAgICogUGVyZm9ybSB0aGUgYWN0dWFsIHdyaXRlIG9mIHRoZSB3cml0ZSBiYXJyaWVyLCB3cml0aW5nIHRoZSB2YWx1ZSBhcyBhIHJhdyBFeHRlbnQuCi0gICAqCi0gICAqIEBwYXJhbSByZWYgVGhlIG9iamVjdCB0aGF0IGhhcyB0aGUgRXh0ZW50IGZpZWxkCi0gICAqIEBwYXJhbSB0YXJnZXQgVGhlIHZhbHVlIHRoYXQgdGhlIHNsb3Qgd2lsbCBiZSB1cGRhdGVkIHRvCi0gICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBmcm9tIHRoZSByZWYKLSAgICogQHBhcmFtIGxvY2F0aW9uIFRoZSBpbmRleCBvZiB0aGUgRmllbGRSZWZlcmVuY2UKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHdyaXRlIGlzIG9jY3VycmluZwotICAgKi8KLSAgQElubGluZQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGZpbmFsIHZvaWQgZXh0ZW50V3JpdGUoT2JqZWN0UmVmZXJlbmNlIHJlZiwgRXh0ZW50IHRhcmdldCwKLSAgICAgIFdvcmQgb2Zmc2V0LCBXb3JkIGxvY2F0aW9uLCBpbnQgbW9kZSkgewotICAgIE1hZ2ljLnNldEV4dGVudEF0T2Zmc2V0KHJlZi50b09iamVjdCgpLCBvZmZzZXQudG9PZmZzZXQoKSwgdGFyZ2V0LCBsb2NhdGlvbi50b0ludCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgcmVhZCBvZiB0aGUgcmVhZCBiYXJyaWVyLCByZXR1cm5pbmcgdGhlIHZhbHVlIGFzIGEgcmF3IEV4dGVudC4KLSAgICoKLSAgICogQHBhcmFtIHJlZiBUaGUgb2JqZWN0IHRoYXQgaGFzIHRoZSBFeHRlbnQgZmllbGQKLSAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGZyb20gdGhlIHJlZgotICAgKiBAcGFyYW0gbG9jYXRpb24gVGhlIGluZGV4IG9mIHRoZSBGaWVsZFJlZmVyZW5jZQotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgd3JpdGUgaXMgb2NjdXJyaW5nCi0gICAqIEByZXR1cm4gdGhlIHJlYWQgdmFsdWUKLSAgICovCi0gIEBJbmxpbmUKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCBFeHRlbnQgZXh0ZW50UmVhZChPYmplY3RSZWZlcmVuY2UgcmVmLAotICAgICAgICBXb3JkIG9mZnNldCwgV29yZCBsb2NhdGlvbiwgaW50IG1vZGUpIHsKLSAgICByZXR1cm4gTWFnaWMuZ2V0RXh0ZW50QXRPZmZzZXQocmVmLnRvT2JqZWN0KCksIG9mZnNldC50b09mZnNldCgpLCBsb2NhdGlvbi50b0ludCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIGFuIGVsZW1lbnQgb2YgYW4gb2JqZWN0IGFycmF5IHdpdGhvdXQgaW52b2tpbmcgYW55IHdyaXRlCi0gICAqIGJhcnJpZXIuICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIE1hcCBjbGFzcyB0byBlbnN1cmUKLSAgICogcG90ZW50aWFsbHktYWxsb2NhdGlvbi10cmlnZ2VyaW5nIHdyaXRlIGJhcnJpZXJzIGRvIG5vdCBvY2N1ciBpbgotICAgKiBhbGxvY2F0aW9uIHNsb3cgcGF0aCBjb2RlLgotICAgKgotICAgKiBAcGFyYW0gZHN0IHRoZSBkZXN0aW5hdGlvbiBhcnJheQotICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHNldAotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGVsZW1lbnQKLSAgICovCi0gIEBVbmludGVycnVwdGlibGVOb1dhcm4KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCB2b2lkIG9iamVjdEFycmF5U3RvcmVOb0dDQmFycmllcihPYmplY3RbXSBkc3QsIGludCBpbmRleCwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgQWRkcmVzcyBiYXNlID0gT2JqZWN0UmVmZXJlbmNlLmZyb21PYmplY3QoZHN0KS50b0FkZHJlc3MoKTsKLSAgICAvLyBBZGQgMyBmb3IgdGhlIGhlYWRlciwgdGhlIGNsYXNzLCBhbmQgdGhlIGxlbmd0aC4KLSAgICBBZGRyZXNzIHNsb3QgPSBiYXNlLnBsdXMoT2Zmc2V0LmZyb21JbnRaZXJvRXh0ZW5kKChpbmRleCArIDMpIDw8IExPR19CWVRFU19JTl9BRERSRVNTKSk7Ci0gICAgVk0uYWN0aXZlUGxhbi5nbG9iYWwoKS5zdG9yZU9iamVjdFJlZmVyZW5jZShzbG90LCBPYmplY3RSZWZlcmVuY2UuZnJvbU9iamVjdCh2YWx1ZSkpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9tbXRrL0J1aWxkVGltZUNvbmZpZy5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvajMvbW10ay9CdWlsZFRpbWVDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRjOGY4Mi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9tbXRrL0J1aWxkVGltZUNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCdWlsZFRpbWVDb25maWcuamF2YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi1wYWNrYWdlIG9yZy5qMy5tbXRrOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmozLnJ1bnRpbWUuVk07Ci1pbXBvcnQgb3JnLmozLmNvbmZpZy5TZWxlY3RlZDsKLQotLyoqCi0gKiBSZWFkIGJ1aWxkLXRpbWUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgTU1UayBmcm9tIGEgSmF2YSBwcm9wZXJ0aWVzCi0gKiBmaWxlLiAgUHJvcGVydGllcyByZWFkIHRocm91Z2ggdGhpcyBtZWNoYW5pc20gc2hvdWxkIGJlIHJlYWQgYXQgYnVpbGQgdGltZQotICogYW5kIHNhdmVkIGluIHN0YXRpYyBmaW5hbCBmaWVsZHMuCi0gKgotICogVGhpcyBpcyBhIHdyYXBwZXIgZm9yIGEgamF2YS51dGlsLlByb3BlcnRpZXMgb2JqZWN0LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQnVpbGRUaW1lQ29uZmlnIGV4dGVuZHMgb3JnLm1tdGsudm0uQnVpbGRUaW1lQ29uZmlnIHsKLQotICAvKioKLSAgICogVGhlIHVuZGVybHlpbmcgcHJvcGVydGllcyBvYmplY3QKLSAgICovCi0gIHByaXZhdGUgUHJvcGVydGllcyBwcm9wczsKLQotICBwdWJsaWMgQnVpbGRUaW1lQ29uZmlnKFN0cmluZyBwcm9wZXJ0eV9maWxlX3Byb3BlcnR5LCBTdHJpbmcgZGVmYXVsdF9wcm9wZXJ0eV9maWxlKSB7Ci0gICAgcHJvcHMgPSBnZXRQcm9wZXJ0aWVzKHByb3BlcnR5X2ZpbGVfcHJvcGVydHksZGVmYXVsdF9wcm9wZXJ0eV9maWxlKTsKLSAgfQotCi0gIHB1YmxpYyBCdWlsZFRpbWVDb25maWcoU3RyaW5nIHByb3BlcnR5X2ZpbGVfcHJvcGVydHkpIHsKLSAgICBwcm9wcyA9IGdldFByb3BlcnRpZXMocHJvcGVydHlfZmlsZV9wcm9wZXJ0eSxudWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gcHJvcGVydHlfZmlsZV9wcm9wZXJ0eSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBzZXRzCi0gICAqIHRoZSBsb2NhdGlvbiBvZiB0aGUgcHJvcGVydGllcyBmaWxlCi0gICAqIEBwYXJhbSBkZWZhdWx0X3Byb3BlcnR5X2ZpbGUgVGhlIGRlZmF1bHQgcHJvcGVydGllcyBmaWxlLgotICAgKgotICAgKi8KLSAgcHJpdmF0ZSBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoU3RyaW5nIHByb3BlcnR5X2ZpbGVfcHJvcGVydHksIFN0cmluZyBkZWZhdWx0X3Byb3BlcnR5X2ZpbGUpIHsKLSAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICBTdHJpbmcgcHJvcEZpbGVOYW1lOwotICAgIGlmIChkZWZhdWx0X3Byb3BlcnR5X2ZpbGUgPT0gbnVsbCkgewotICAgICAgcHJvcEZpbGVOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KHByb3BlcnR5X2ZpbGVfcHJvcGVydHkpOwotICAgICAgaWYgKHByb3BGaWxlTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihwcm9wZXJ0eV9maWxlX3Byb3BlcnR5KyIgbXVzdCBzcGVjaWZ5IGEgcHJvcGVydGllcyBmaWxlIik7Ci0gICAgICAgIFZNLnN5c0V4aXQoMSk7Ci0gICAgICB9ICAgCi0gICAgfSBlbHNlIHsKLSAgICAgIHByb3BGaWxlTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShwcm9wZXJ0eV9maWxlX3Byb3BlcnR5LCBkZWZhdWx0X3Byb3BlcnR5X2ZpbGUpOwotICAgIH0gICAKLSAgICBGaWxlIHByb3BGaWxlID0gbmV3IEZpbGUocHJvcEZpbGVOYW1lKTsKLQotICAgIHRyeSB7Ci0gICAgICBCdWZmZXJlZElucHV0U3RyZWFtIHByb3BGaWxlU3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShwcm9wRmlsZSkpOwotICAgICAgcHJvcHMubG9hZChwcm9wRmlsZVN0cmVhbSk7Ci0gICAgICBwcm9wRmlsZVN0cmVhbS5jbG9zZSgpOwotICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBpZiAoIXByb3BGaWxlTmFtZS5lcXVhbHMoZGVmYXVsdF9wcm9wZXJ0eV9maWxlKSkgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4ocHJvcEZpbGVOYW1lKyIgbm90IGZvdW5kLiIpOwotICAgICAgICBWTS5zeXNFeGl0KDEpOwotICAgICAgfSAgIAotICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICBWTS5zeXNFeGl0KDEpOwotICAgIH0gICAKLSAgICByZXR1cm4gcHJvcHM7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFN0cmluZyBnZXRQbGFuTmFtZSgpIHsKLSAgICByZXR1cm4gU2VsZWN0ZWQubmFtZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nIG5hbWUsIGJvb2xlYW4gZGZsdCkgewotICAgIFN0cmluZyB2YWx1ZSA9IHByb3BzLmdldFByb3BlcnR5KG5hbWUsQm9vbGVhbi50b1N0cmluZyhkZmx0KSk7Ci0gICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZyBuYW1lKSB7Ci0gICAgU3RyaW5nIHZhbHVlID0gcHJvcHMuZ2V0UHJvcGVydHkobmFtZSk7Ci0gICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5kZWZpbmVkIHByb3BlcnR5ICIrbmFtZSk7Ci0gICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBnZXRJbnRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgaW50IGRmbHQpIHsKLSAgICBTdHJpbmcgdmFsdWUgPSBwcm9wcy5nZXRQcm9wZXJ0eShuYW1lLEludGVnZXIudG9TdHJpbmcoZGZsdCkpOwotICAgIHJldHVybiBJbnRlZ2VyLnZhbHVlT2YodmFsdWUpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgZ2V0SW50UHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKLSAgICBTdHJpbmcgdmFsdWUgPSBwcm9wcy5nZXRQcm9wZXJ0eShuYW1lKTsKLSAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmRlZmluZWQgcHJvcGVydHkgIituYW1lKTsKLSAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9mKHZhbHVlKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZ1Byb3BlcnR5KFN0cmluZyBuYW1lLCBTdHJpbmcgZGZsdCkgewotICAgIHJldHVybiBwcm9wcy5nZXRQcm9wZXJ0eShuYW1lLGRmbHQpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nUHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKLSAgICBTdHJpbmcgdmFsdWUgPSBwcm9wcy5nZXRQcm9wZXJ0eShuYW1lKTsKLSAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmRlZmluZWQgcHJvcGVydHkgIituYW1lKTsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9tbXRrL0NvbGxlY3Rpb24uamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL2ozL21tdGsvQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmNhNGY0Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL2ozL21tdGsvQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb2xsZWN0aW9uLmphdmEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi1wYWNrYWdlIG9yZy5qMy5tbXRrOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5QbGFuOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uQ29sbGVjdG9yQ29udGV4dDsKLWltcG9ydCBvcmcubW10ay5wbGFuLk11dGF0b3JDb250ZXh0OwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkub3B0aW9ucy5PcHRpb25zOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLklubGluZTsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuSW50ZXJydXB0aWJsZTsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuVW5pbnRlcnJ1cHRpYmxlOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS5VbmludGVycnVwdGlibGVOb1dhcm47Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLlVucHJlZW1wdGlibGU7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC5BZGRyZXNzOwotCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29sbGVjdGlvbiBleHRlbmRzIG9yZy5tbXRrLnZtLkNvbGxlY3Rpb24gewotCi0gIC8qKgotICAgKiBUcmlnZ2VycyBhIGNvbGxlY3Rpb24uCi0gICAqCi0gICAqIEBwYXJhbSB3aHkgdGhlIHJlYXNvbiB3aHkgYSBjb2xsZWN0aW9uIHdhcyB0cmlnZ2VyZWQuICAwIHRvCi0gICAqIDxjb2RlPlRSSUdHRVJfUkVBU09OUyAtIDE8L2NvZGU+LgotICAgKi8KLSAgQFVucHJlZW1wdGlibGUoIkJlY29taW5nIGFub3RoZXIgdGhyZWFkIGludGVycnVwdHMgdGhlIGN1cnJlbnQgdGhyZWFkLCBhdm9pZCBwcmVlbXB0aW9uIGluIHRoZSBwcm9jZXNzIikKLSAgcHVibGljIG5hdGl2ZSBmaW5hbCB2b2lkIHRyaWdnZXJDb2xsZWN0aW9uKGludCB3aHkpOwotCi0gIC8qKgotICAgKiBKb2lucyBhIGNvbGxlY3Rpb24uCi0gICAqLwotICBAVW5wcmVlbXB0aWJsZSgiQmVjb21pbmcgYW5vdGhlciB0aHJlYWQgaW50ZXJydXB0cyB0aGUgY3VycmVudCB0aHJlYWQsIGF2b2lkIHByZWVtcHRpb24gaW4gdGhlIHByb2Nlc3MiKQotICBwdWJsaWMgbmF0aXZlIGZpbmFsIHZvaWQgam9pbkNvbGxlY3Rpb24oKTsKLQotICAvKioKLSAgICogVGhlIG1heGltdW0gbnVtYmVyIGNvbGxlY3Rpb24gYXR0ZW1wdHMgYWNyb3NzIHRocmVhZHMuCi0gICAqLwotICBwdWJsaWMgbmF0aXZlIGludCBtYXhpbXVtQ29sbGVjdGlvbkF0dGVtcHQoKTsKLQotICAvKioKLSAgICogUmVwb3J0IHRoYXQgdGhlIHRoZSBwaHlzaWNhbCBhbGxvY2F0aW9uIGhhcyBzdWNjZWVkZWQuCi0gICAqLwotICBwdWJsaWMgbmF0aXZlIHZvaWQgcmVwb3J0QWxsb2NhdGlvblN1Y2Nlc3MoKTsKLQotICAvKioKLSAgICogUmVwb3J0IHRoYXQgYSBwaHlzaWNhbCBhbGxvY2F0aW9uIGhhcyBmYWlsZWQuCi0gICAqLwotICBwdWJsaWMgbmF0aXZlIHZvaWQgcmVwb3J0UGh5c2ljYWxBbGxvY2F0aW9uRmFpbGVkKCk7Ci0KLSAgLyoqCi0gICAqIERvZXMgdGhlIFZNIGNvbnNpZGVyIHRoaXMgYW4gZW1lcmdlbmN5IGFsbG9jYXRpb24sIHdoZXJlIHRoZSBub3JtYWwKLSAgICogaGVhcCBzaXplIHJ1bGVzIGNhbiBiZSBpZ25vcmVkLgotICAgKi8KLSAgcHVibGljIG5hdGl2ZSBib29sZWFuIGlzRW1lcmdlbmN5QWxsb2NhdGlvbigpOwotCi0gIC8qKgotICAgKiBUcmlnZ2VyIGFuIGFzeW5jaHJvbm91cyBjb2xsZWN0aW9uLCBjaGVja2luZyBmb3IgbWVtb3J5Ci0gICAqIGV4aGF1c3Rpb24gZmlyc3QuCi0gICAqLwotICBAVW5wcmVlbXB0aWJsZSgiQmVjb21pbmcgYW5vdGhlciB0aHJlYWQgaW50ZXJydXB0cyB0aGUgY3VycmVudCB0aHJlYWQsIGF2b2lkIHByZWVtcHRpb24gaW4gdGhlIHByb2Nlc3MiKQotICBwdWJsaWMgbmF0aXZlIGZpbmFsIHZvaWQgdHJpZ2dlckFzeW5jQ29sbGVjdGlvbihpbnQgd2h5KTsKLQotICAvKioKLSAgICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBjb2xsZWN0aW9uIGN5Y2xlIGhhcyBmdWxseSBjb21wbGV0ZWQgKHRoaXMgaXMKLSAgICogdXNlZCB0byBlbnN1cmUgYSBHQyBpcyBub3QgaW4gdGhlIHByb2Nlc3Mgb2YgY29tcGxldGluZywgdG8KLSAgICogYXZvaWQsIGZvciBleGFtcGxlLCBhbiBhc3luYyBHQyBiZWluZyB0cmlnZ2VyZWQgb24gdGhlIHN3aXRjaAotICAgKiBmcm9tIEdDIHRvIG11dGF0b3IgdGhyZWFkIGJlZm9yZSBhbGwgR0MgdGhyZWFkcyBoYXZlIHN3aXRjaGVkLgotICAgKgotICAgKiBAcmV0dXJuIFRydWUgaWYgR0MgaXMgbm90IGluIHByb2dyZXNzLgotICAgKi8KLSAgQFVuaW50ZXJydXB0aWJsZQotICBwdWJsaWMgbmF0aXZlIGZpbmFsIGJvb2xlYW4gbm9UaHJlYWRzSW5HQygpOwotCi0gIC8qKgotICAgKiBQcmVwYXJlIGEgbXV0YXRvciBmb3IgYSBjb2xsZWN0aW9uLgotICAgKgotICAgKiBAcGFyYW0gbSB0aGUgbXV0YXRvciB0byBwcmVwYXJlCi0gICAqLwotICBwdWJsaWMgbmF0aXZlIGZpbmFsIHZvaWQgcHJlcGFyZU11dGF0b3IoTXV0YXRvckNvbnRleHQgbSk7Ci0KLSAgLyoqCi0gICAqIFByZXBhcmUgYSBjb2xsZWN0b3IgZm9yIGEgY29sbGVjdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIGMgdGhlIGNvbGxlY3RvciB0byBwcmVwYXJlCi0gICAqLwotICBwdWJsaWMgbmF0aXZlIGZpbmFsIHZvaWQgcHJlcGFyZUNvbGxlY3RvcihDb2xsZWN0b3JDb250ZXh0IGMpOwotCi0gIC8qKgotICAgKiBSZW5kZXp2b3VzIHdpdGggYWxsIG90aGVyIHByb2Nlc3NvcnMsIHJldHVybmluZyB0aGUgcmFuawotICAgKiAodGhhdCBpcywgdGhlIG9yZGVyIHRoaXMgcHJvY2Vzc29yIGFycml2ZWQgYXQgdGhlIGJhcnJpZXIpLgotICAgKi8KLSAgcHVibGljIG5hdGl2ZSBmaW5hbCBpbnQgcmVuZGV6dm91cyhpbnQgd2hlcmUpOwotCi0gIC8vIFJFVklFVzogd2hhdCBhcmUgdGhlIHNlbWFudGljcyBvZiB0aGlzIG1ldGhvZCBpbiBhIGNvbmN1cnJlbnQgY29sbGVjdG9yPwotICAvKiogQHJldHVybiBUaGUgbnVtYmVyIG9mIGFjdGl2ZSBjb2xsZWN0b3IgdGhyZWFkcyAqLwotICBwdWJsaWMgbmF0aXZlIGZpbmFsIGludCBhY3RpdmVHQ1RocmVhZHMoKTsKLQotICAvKioKLSAgICogQHJldHVybiBUaGUgb3JkaW5hbCBJRCBvZiB0aGUgcnVubmluZyBjb2xsZWN0b3IgdGhyZWFkIHcuci50LgotICAgKiB0aGUgc2V0IG9mIGFjdGl2ZSBjb2xsZWN0b3IgdGhyZWFkcyAoemVybyBiYXNlZCkKLSAgICovCi0gIHB1YmxpYyBuYXRpdmUgZmluYWwgaW50IGFjdGl2ZUdDVGhyZWFkT3JkaW5hbCgpOwotCi0gIC8qKgotICAgKiBSZXF1ZXN0IGVhY2ggbXV0YXRvciBmbHVzaCByZW1lbWJlcmVkIHNldHMuIFRoaXMgbWV0aG9kCi0gICAqIHdpbGwgdHJpZ2dlciB0aGUgZmx1c2ggYW5kIHRoZW4geWllbGQgdW50aWwgYWxsIHByb2Nlc3NvcnMgaGF2ZQotICAgKiBmbHVzaGVkLgotICAgKi8KLSAgQFVuaW50ZXJydXB0aWJsZU5vV2FybigiVGhpcyBtZXRob2QgaXMgcmVhbGx5IHVucHJlZW1wdGlibGUsIHNpbmNlIGl0IGludm9sdmVzIGJsb2NraW5nIikKLSAgcHVibGljIG5hdGl2ZSB2b2lkIHJlcXVlc3RNdXRhdG9yRmx1c2goKTsKLQotfQotCmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9tbXRrL0RlYnVnLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9tbXRrL0RlYnVnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MjkxYjkuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvajMvbW10ay9EZWJ1Zy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRGVidWcuamF2YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLXBhY2thZ2Ugb3JnLmozLm1tdGs7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuVW5pbnRlcnJ1cHRpYmxlOwotCi0vKioKLSAqIERlYnVnZ2VyIHN1cHBvcnQgZm9yIHRoZSBNTVRrIGhhcm5lc3MKLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGZpbmFsIGNsYXNzIERlYnVnIGV4dGVuZHMgb3JnLm1tdGsudm0uRGVidWcgewotCi0gIC8qKgotICAgKiBFbmFibGUvZGlzYWJsZSBNTVRrIGRlYnVnZ2VyIHN1cHBvcnQKLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL2ozL21tdGsvRmFjdG9yeS5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvajMvbW10ay9GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNmQ1ZTkuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvajMvbW10ay9GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDEgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGYWN0b3J5LmphdmEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLXBhY2thZ2Ugb3JnLmozLm1tdGs7Ci0KLWltcG9ydCBvcmcudm11dGlsLm9wdGlvbnMuT3B0aW9uU2V0OwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZ2NzcHkuQ29sb3I7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5nY3NweS5kcml2ZXJzLkFic3RyYWN0RHJpdmVyOwotaW1wb3J0IG9yZy5tbXRrLnZtLlJlZmVyZW5jZVByb2Nlc3Nvci5TZW1hbnRpY3M7Ci0KLWltcG9ydCBvcmcuajMucnVudGltZS5WTTsKLQotLyoqCi0gKiBUaGlzIGlzIGEgVk0tc3BlY2lmaWMgY2xhc3Mgd2hpY2ggZGVmaW5lcyBmYWN0b3J5IG1ldGhvZHMgZm9yCi0gKiBWTS1zcGVjaWZpYyB0eXBlcyB3aGljaCBtdXN0IGJlIGluc3RhbnRpYXRlZCB3aXRoaW4gTU1Uay4KLSAqCi0gKiBAc2VlIG9yZy5tbXRrLnZtLkZhY3RvcnkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEZhY3RvcnkgZXh0ZW5kcyBvcmcubW10ay52bS5GYWN0b3J5IHsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9NTVRLX1BST1BFUlRJRVMgPSAiLm1tdGsucHJvcGVydGllcyI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfRklMRV9QUk9QRVJUWSA9ICJtbXRrLnByb3BlcnRpZXMiOwotCi0gIC8qKgotICAgKiBDcmVhdGUgb3IgcmV0cmlldmUgdGhlIE9wdGlvblNldCB1c2VkIGZvciBNTVRrIG9wdGlvbnMuCi0gICAqCi0gICAqIEByZXR1cm4gQSBjb25jcmV0ZSBWTS1zcGVjaWZpYyBPcHRpb25TZXQgaW5zdGFuY2UKLSAgICovCi0gIHB1YmxpYyBPcHRpb25TZXQgZ2V0T3B0aW9uU2V0KCkgewotICAgIHJldHVybiBvcmcuajMub3B0aW9ucy5PcHRpb25TZXQuZ2M7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IEFjdGl2ZVBsYW4gaW5zdGFuY2UgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFZNLXNwZWNpZmljCi0gICAqIGNvbmNyZXRlIEFjdGl2ZVBsYW4gc3ViLWNsYXNzLgotICAgKgotICAgKiBAc2VlIEFjdGl2ZVBsYW4KLSAgICogQHJldHVybiBBIGNvbmNyZXRlIFZNLXNwZWNpZmljIEFjdGl2ZVBsYW4gaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgb3JnLm1tdGsudm0uQWN0aXZlUGxhbiBuZXdBY3RpdmVQbGFuKCkgewotICAgIHRyeSB7Ci0gICAgICByZXR1cm4gbmV3IEFjdGl2ZVBsYW4oKTsKLSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgVk0uc3lzRmFpbCgiRmFpbGVkIHRvIGFsbG9jYXRlIG5ldyBBY3RpdmVQbGFuISIpOwotICAgICAgcmV0dXJuIG51bGw7IC8vIG5ldmVyIGdldCBoZXJlCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBBc3NlcnQgaW5zdGFuY2UgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFZNLXNwZWNpZmljCi0gICAqIGNvbmNyZXRlIEFzc2VydCBzdWItY2xhc3MuCi0gICAqCi0gICAqIEBzZWUgQXNzZXJ0Ci0gICAqIEByZXR1cm4gQSBjb25jcmV0ZSBWTS1zcGVjaWZpYyBBc3NlcnQgaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgb3JnLm1tdGsudm0uQXNzZXJ0IG5ld0Fzc2VydCgpIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIG5ldyBBc3NlcnQoKTsKLSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgVk0uc3lzRmFpbCgiRmFpbGVkIHRvIGFsbG9jYXRlIG5ldyBBc3NlcnQhIik7Ci0gICAgICByZXR1cm4gbnVsbDsgLy8gbmV2ZXIgZ2V0IGhlcmUKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IEJhcnJpZXJzIGluc3RhbmNlIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBWTS1zcGVjaWZpYwotICAgKiBjb25jcmV0ZSBCYXJyaWVycyBzdWItY2xhc3MuCi0gICAqCi0gICAqIEBzZWUgQmFycmllcnMKLSAgICogQHJldHVybiBBIGNvbmNyZXRlIFZNLXNwZWNpZmljIEJhcnJpZXJzIGluc3RhbmNlLgotICAgKi8KLSAgcHVibGljIG9yZy5tbXRrLnZtLkJhcnJpZXJzIG5ld0JhcnJpZXJzKCkgewotICAgIHRyeSB7Ci0gICAgICByZXR1cm4gbmV3IEJhcnJpZXJzKCk7Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIFZNLnN5c0ZhaWwoIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgQmFycmllcnMhIik7Ci0gICAgICByZXR1cm4gbnVsbDsgLy8gbmV2ZXIgZ2V0IGhlcmUKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IENvbGxlY3Rpb24gaW5zdGFuY2UgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFZNLXNwZWNpZmljCi0gICAqIGNvbmNyZXRlIENvbGxlY3Rpb24gc3ViLWNsYXNzLgotICAgKgotICAgKiBAc2VlIENvbGxlY3Rpb24KLSAgICogQHJldHVybiBBIGNvbmNyZXRlIFZNLXNwZWNpZmljIENvbGxlY3Rpb24gaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgb3JnLm1tdGsudm0uQ29sbGVjdGlvbiBuZXdDb2xsZWN0aW9uKCkgewotICAgIHRyeSB7Ci0gICAgICByZXR1cm4gbmV3IENvbGxlY3Rpb24oKTsKLSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgVk0uc3lzRmFpbCgiRmFpbGVkIHRvIGFsbG9jYXRlIG5ldyBDb2xsZWN0aW9uISIpOwotICAgICAgcmV0dXJuIG51bGw7IC8vIG5ldmVyIGdldCBoZXJlCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBCdWlsZFRpbWVDb25maWcgaW5zdGFuY2UgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFZNLXNwZWNpZmljCi0gICAqIGNvbmNyZXRlIEJ1aWxkVGltZUNvbmZpZyBzdWItY2xhc3MuCi0gICAqCi0gICAqIEBzZWUgQ29sbGVjdGlvbgotICAgKiBAcmV0dXJuIEEgY29uY3JldGUgVk0tc3BlY2lmaWMgQ29sbGVjdGlvbiBpbnN0YW5jZS4KLSAgICovCi0gIHB1YmxpYyBvcmcubW10ay52bS5CdWlsZFRpbWVDb25maWcgbmV3QnVpbGRUaW1lQ29uZmlnKCkgewotICAgIHRyeSB7Ci0gICAgICByZXR1cm4gbmV3IEJ1aWxkVGltZUNvbmZpZyhDT05GSUdfRklMRV9QUk9QRVJUWSwgREVGQVVMVF9NTVRLX1BST1BFUlRJRVMpOwotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBWTS5zeXNGYWlsKCJGYWlsZWQgdG8gYWxsb2NhdGUgbmV3IEJ1aWxkVGltZUNvbmZpZ3VyYXRpb24hIik7Ci0gICAgICByZXR1cm4gbnVsbDsgLy8gbmV2ZXIgZ2V0IGhlcmUKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IExvY2sgaW5zdGFuY2UgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFZNLXNwZWNpZmljCi0gICAqIGNvbmNyZXRlIExvY2sgc3ViLWNsYXNzLgotICAgKgotICAgKiBAc2VlIExvY2sKLSAgICoKLSAgICogQHBhcmFtIG5hbWUgVGhlIHN0cmluZyB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBsb2NrIGluc3RhbmNlCi0gICAqIEByZXR1cm4gQSBjb25jcmV0ZSBWTS1zcGVjaWZpYyBMb2NrIGluc3RhbmNlLgotICAgKi8KLSAgcHVibGljIG9yZy5tbXRrLnZtLkxvY2sgbmV3TG9jayhTdHJpbmcgbmFtZSkgewotICAgIHRyeSB7Ci0gICAgICByZXR1cm4gbmV3IExvY2sobmFtZSk7Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIFZNLnN5c0ZhaWwoIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgTG9jayEiKTsKLSAgICAgIHJldHVybiBudWxsOyAvLyBuZXZlciBnZXQgaGVyZQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgTWVtb3J5IGluc3RhbmNlIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBWTS1zcGVjaWZpYwotICAgKiBjb25jcmV0ZSBNZW1vcnkgc3ViLWNsYXNzLgotICAgKgotICAgKiBAc2VlIE1lbW9yeQotICAgKiBAcmV0dXJuIEEgY29uY3JldGUgVk0tc3BlY2lmaWMgTWVtb3J5IGluc3RhbmNlLgotICAgKi8KLSAgcHVibGljIG9yZy5tbXRrLnZtLk1lbW9yeSBuZXdNZW1vcnkoKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBuZXcgTWVtb3J5KCk7Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIFZNLnN5c0ZhaWwoIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgTWVtb3J5ISIpOwotICAgICAgcmV0dXJuIG51bGw7IC8vIG5ldmVyIGdldCBoZXJlCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBPYmplY3RNb2RlbCBpbnN0YW5jZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgVk0tc3BlY2lmaWMKLSAgICogY29uY3JldGUgT2JqZWN0TW9kZWwgc3ViLWNsYXNzLgotICAgKgotICAgKiBAc2VlIE9iamVjdE1vZGVsCi0gICAqIEByZXR1cm4gQSBjb25jcmV0ZSBWTS1zcGVjaWZpYyBPYmplY3RNb2RlbCBpbnN0YW5jZS4KLSAgICovCi0gIHB1YmxpYyBvcmcubW10ay52bS5PYmplY3RNb2RlbCBuZXdPYmplY3RNb2RlbCgpIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIG5ldyBPYmplY3RNb2RlbCgpOwotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBWTS5zeXNGYWlsKCJGYWlsZWQgdG8gYWxsb2NhdGUgbmV3IE9iamVjdE1vZGVsISIpOwotICAgICAgcmV0dXJuIG51bGw7IC8vIG5ldmVyIGdldCBoZXJlCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBSZWZlcmVuY2VQcm9jZXNzb3IgaW5zdGFuY2UgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFZNLXNwZWNpZmljCi0gICAqIGNvbmNyZXRlIFJlZmVyZW5jZVByb2Nlc3NvciBzdWItY2xhc3MuCi0gICAqCi0gICAqIEBzZWUgUmVmZXJlbmNlUHJvY2Vzc29yCi0gICAqIEByZXR1cm4gQSBjb25jcmV0ZSBWTS1zcGVjaWZpYyBSZWZlcmVuY2VQcm9jZXNzb3IgaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgb3JnLm1tdGsudm0uUmVmZXJlbmNlUHJvY2Vzc29yIG5ld1JlZmVyZW5jZVByb2Nlc3NvcihTZW1hbnRpY3Mgc2VtYW50aWNzKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBSZWZlcmVuY2VQcm9jZXNzb3IuZ2V0KHNlbWFudGljcyk7Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIFZNLnN5c0ZhaWwoIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgUmVmZXJlbmNlUHJvY2Vzc29yISIpOwotICAgICAgcmV0dXJuIG51bGw7IC8vIG5ldmVyIGdldCBoZXJlCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBGaW5hbGl6YWJsZVByb2Nlc3NvciBpbnN0YW5jZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgVk0tc3BlY2lmaWMKLSAgICogY29uY3JldGUgRmluYWxpemFibGVQcm9jZXNzb3Igc3ViLWNsYXNzLgotICAgKgotICAgKiBAc2VlIFJlZmVyZW5jZVByb2Nlc3NvcgotICAgKiBAcmV0dXJuIEEgY29uY3JldGUgVk0tc3BlY2lmaWMgRmluYWxpemFibGVQcm9jZXNzb3IgaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgb3JnLm1tdGsudm0uRmluYWxpemFibGVQcm9jZXNzb3IgbmV3RmluYWxpemFibGVQcm9jZXNzb3IoKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBGaW5hbGl6YWJsZVByb2Nlc3Nvci5nZXRQcm9jZXNzb3IoKTsKLSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgVk0uc3lzRmFpbCgiRmFpbGVkIHRvIGFsbG9jYXRlIG5ldyBGaW5hbGl6YWJsZVByb2Nlc3NvciEiKTsKLSAgICAgIHJldHVybiBudWxsOyAvLyBuZXZlciBnZXQgaGVyZQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgU2Nhbm5pbmcgaW5zdGFuY2UgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFZNLXNwZWNpZmljCi0gICAqIGNvbmNyZXRlIFNjYW5uaW5nIHN1Yi1jbGFzcy4KLSAgICoKLSAgICogQHNlZSBTY2FubmluZwotICAgKiBAcmV0dXJuIEEgY29uY3JldGUgVk0tc3BlY2lmaWMgU2Nhbm5pbmcgaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgb3JnLm1tdGsudm0uU2Nhbm5pbmcgbmV3U2Nhbm5pbmcoKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBuZXcgU2Nhbm5pbmcoKTsKLSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgVk0uc3lzRmFpbCgiRmFpbGVkIHRvIGFsbG9jYXRlIG5ldyBTY2FubmluZyEiKTsKLSAgICAgIHJldHVybiBudWxsOyAvLyBuZXZlciBnZXQgaGVyZQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgU3RhdGlzdGljcyBpbnN0YW5jZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgVk0tc3BlY2lmaWMKLSAgICogY29uY3JldGUgU3RhdGlzdGljcyBzdWItY2xhc3MuCi0gICAqCi0gICAqIEBzZWUgU3RhdGlzdGljcwotICAgKiBAcmV0dXJuIEEgY29uY3JldGUgVk0tc3BlY2lmaWMgU3RhdGlzdGljcyBpbnN0YW5jZS4KLSAgICovCi0gIHB1YmxpYyBvcmcubW10ay52bS5TdGF0aXN0aWNzIG5ld1N0YXRpc3RpY3MoKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBuZXcgU3RhdGlzdGljcygpOwotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBWTS5zeXNGYWlsKCJGYWlsZWQgdG8gYWxsb2NhdGUgbmV3IFN0YXRpc3RpY3MhIik7Ci0gICAgICByZXR1cm4gbnVsbDsgLy8gbmV2ZXIgZ2V0IGhlcmUKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IFN0cmluZ3MgaW5zdGFuY2UgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFZNLXNwZWNpZmljCi0gICAqIGNvbmNyZXRlIFN0cmluZ3Mgc3ViLWNsYXNzLgotICAgKgotICAgKiBAc2VlIFN0cmluZ3MKLSAgICogQHJldHVybiBBIGNvbmNyZXRlIFZNLXNwZWNpZmljIFN0cmluZ3MgaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgb3JnLm1tdGsudm0uU3RyaW5ncyBuZXdTdHJpbmdzKCkgewotICAgIHRyeSB7Ci0gICAgICByZXR1cm4gbmV3IFN0cmluZ3MoKTsKLSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgVk0uc3lzRmFpbCgiRmFpbGVkIHRvIGFsbG9jYXRlIG5ldyBTdHJpbmdzISIpOwotICAgICAgcmV0dXJuIG51bGw7IC8vIG5ldmVyIGdldCBoZXJlCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBTeW5jaHJvbml6ZWRDb3VudGVyIGluc3RhbmNlIHVzaW5nIHRoZSBhcHByb3ByaWF0ZQotICAgKiBWTS1zcGVjaWZpYyBjb25jcmV0ZSBTeW5jaHJvbml6ZWRDb3VudGVyIHN1Yi1jbGFzcy4KLSAgICoKLSAgICogQHNlZSBTeW5jaHJvbml6ZWRDb3VudGVyCi0gICAqCi0gICAqIEByZXR1cm4gQSBjb25jcmV0ZSBWTS1zcGVjaWZpYyBTeW5jaHJvbml6ZWRDb3VudGVyIGluc3RhbmNlLgotICAgKi8KLSAgcHVibGljIG9yZy5tbXRrLnZtLlN5bmNocm9uaXplZENvdW50ZXIgbmV3U3luY2hyb25pemVkQ291bnRlcigpIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIG5ldyBTeW5jaHJvbml6ZWRDb3VudGVyKCk7Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgVk0uc3lzRmFpbCgiRmFpbGVkIHRvIGFsbG9jYXRlIG5ldyBTeW5jaHJvbml6ZWRDb3VudGVyISIpOwotICAgICAgcmV0dXJuIG51bGw7IC8vIG5ldmVyIGdldCBoZXJlCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBUcmFjZUludGVyZmFjZSBpbnN0YW5jZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgVk0tc3BlY2lmaWMKLSAgICogY29uY3JldGUgVHJhY2VJbnRlcmZhY2Ugc3ViLWNsYXNzLgotICAgKgotICAgKiBAc2VlIFRyYWNlSW50ZXJmYWNlCi0gICAqIEByZXR1cm4gQSBjb25jcmV0ZSBWTS1zcGVjaWZpYyBUcmFjZUludGVyZmFjZSBpbnN0YW5jZS4KLSAgICovCi0gIHB1YmxpYyBvcmcubW10ay52bS5UcmFjZUludGVyZmFjZSBuZXdUcmFjZUludGVyZmFjZSgpIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIG5ldyBUcmFjZUludGVyZmFjZSgpOwotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBWTS5zeXNGYWlsKCJGYWlsZWQgdG8gYWxsb2NhdGUgbmV3IFRyYWNlSW50ZXJmYWNlISIpOwotICAgICAgcmV0dXJuIG51bGw7IC8vIG5ldmVyIGdldCBoZXJlCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBNTVRrX0V2ZW50cyBpbnN0YW5jZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgVk0tc3BlY2lmaWMKLSAgICogY29uY3JldGUgTU1Ua19FdmVudHMgc3ViLWNsYXNzLgotICAgKgotICAgKiBAc2VlIE1NVGtfRXZlbnRzCi0gICAqIEByZXR1cm4gQSBjb25jcmV0ZSBWTS1zcGVjaWZpYyBNTVRrX0V2ZW50cyBpbnN0YW5jZS4KLSAgICovCi0gIHB1YmxpYyBvcmcubW10ay52bS5NTVRrX0V2ZW50cyBuZXdFdmVudHMoKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBuZXcgTU1Ua19FdmVudHMoKTsKLSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgVk0uc3lzRmFpbCgiRmFpbGVkIHRvIGFsbG9jYXRlIG5ldyBNTVRrX0V2ZW50cyEiKTsKLSAgICAgIHJldHVybiBudWxsOyAvLyBuZXZlciBnZXQgaGVyZQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBvcmcubW10ay52bS5EZWJ1ZyBuZXdEZWJ1ZygpIHsKLSAgICByZXR1cm4gbmV3IERlYnVnKCk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBHQ3NweSBtZXRob2RzCi0gICAqLwotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgVXRpbCBpbnN0YW5jZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgVk0tc3BlY2lmaWMKLSAgICogY29uY3JldGUgVXRpbCBzdWItY2xhc3MuCi0gICAqCi0gICAqIEBzZWUgb3JnLm1tdGsudm0uZ2NzcHkuVXRpbAotICAgKiBAcmV0dXJuIEEgY29uY3JldGUgVk0tc3BlY2lmaWMgVXRpbCBpbnN0YW5jZS4KLSAgICovCi0gIHB1YmxpYyBvcmcubW10ay52bS5nY3NweS5VdGlsIG5ld0dDc3B5VXRpbCgpIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIFZNLnN5c0ZhaWwoIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgVXRpbCEiKTsKLSAgICAgIHJldHVybiBudWxsOyAvLyBuZXZlciBnZXQgaGVyZQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgU2VydmVySW50ZXJwcmV0ZXIgaW5zdGFuY2UgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFZNLXNwZWNpZmljCi0gICAqIGNvbmNyZXRlIFNlcnZlckludGVycHJldGVyIHN1Yi1jbGFzcy4KLSAgICoKLSAgICogQHNlZSBvcmcubW10ay52bS5nY3NweS5TZXJ2ZXJJbnRlcnByZXRlcgotICAgKiBAcmV0dXJuIEEgY29uY3JldGUgVk0tc3BlY2lmaWMgU2VydmVySW50ZXJwcmV0ZXIgaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgb3JnLm1tdGsudm0uZ2NzcHkuU2VydmVySW50ZXJwcmV0ZXIgbmV3R0NzcHlTZXJ2ZXJJbnRlcnByZXRlcigpIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIFZNLnN5c0ZhaWwoIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgU2VydmVySW50ZXJwcmV0ZXIhIik7Ci0gICAgICByZXR1cm4gbnVsbDsgLy8gbmV2ZXIgZ2V0IGhlcmUKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IFNlcnZlclNwYWNlIGluc3RhbmNlIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBWTS1zcGVjaWZpYwotICAgKiBjb25jcmV0ZSBTZXJ2ZXJTcGFjZSBzdWItY2xhc3MuCi0gICAqCi0gICAqIEBwYXJhbSBzZXJ2ZXJJbnRlcnByZXRlciBUaGUgc2VydmVyIHRoYXQgb3ducyB0aGlzIHNwYWNlCi0gICAqIEBwYXJhbSBzZXJ2ZXJOYW1lIFRoZSBzZXJ2ZXIncyBuYW1lCi0gICAqIEBwYXJhbSBkcml2ZXJOYW1lIFRoZSBzcGFjZSBkcml2ZXIncyBuYW1lCi0gICAqIEBwYXJhbSB0aXRsZSBUaXRsZSBmb3IgdGhlIHNwYWNlCi0gICAqIEBwYXJhbSBibG9ja0luZm8gQSBsYWJlbCBmb3IgZWFjaCBibG9jawotICAgKiBAcGFyYW0gdGlsZU51bSBNYXggbnVtYmVyIG9mIHRpbGVzIGluIHRoaXMgc3BhY2UKLSAgICogQHBhcmFtIHVudXNlZCBBIGxhYmVsIGZvciB1bnVzZWQgYmxvY2tzCi0gICAqIEBwYXJhbSBtYWluU3BhY2UgV2hldGhlciB0aGlzIHNwYWNlIGlzIHRoZSBtYWluIHNwYWNlCi0gICAqCi0gICAqIEBzZWUgb3JnLm1tdGsudm0uZ2NzcHkuU2VydmVyU3BhY2UKLSAgICogQHJldHVybiBBIGNvbmNyZXRlIFZNLXNwZWNpZmljIFNlcnZlclNwYWNlIGluc3RhbmNlLgotICAgKi8KLSAgcHVibGljIG9yZy5tbXRrLnZtLmdjc3B5LlNlcnZlclNwYWNlIG5ld0dDc3B5U2VydmVyU3BhY2UoCi0gICAgICBvcmcubW10ay52bS5nY3NweS5TZXJ2ZXJJbnRlcnByZXRlciBzZXJ2ZXJJbnRlcnByZXRlciwKLSAgICAgIFN0cmluZyBzZXJ2ZXJOYW1lLAotICAgICAgU3RyaW5nIGRyaXZlck5hbWUsCi0gICAgICBTdHJpbmcgdGl0bGUsCi0gICAgICBTdHJpbmcgYmxvY2tJbmZvLAotICAgICAgaW50IHRpbGVOdW0sCi0gICAgICBTdHJpbmcgdW51c2VkLAotICAgICAgYm9vbGVhbiBtYWluU3BhY2UpewotICAgIHRyeSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgVk0uc3lzRmFpbCgiRmFpbGVkIHRvIGFsbG9jYXRlIG5ldyBTZXJ2ZXJTcGFjZSEiKTsKLSAgICAgIHJldHVybiBudWxsOyAvLyBuZXZlciBnZXQgaGVyZQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgQnl0ZVN0cmVhbSBpbnN0YW5jZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUKLSAgICogVk0tc3BlY2lmaWMgY29uY3JldGUgQnl0ZVN0cmVhbSBzdWItY2xhc3MuCi0gICAqCi0gICAqIEBwYXJhbSBkcml2ZXIgICAgICAgIFRoZSBkcml2ZXIgdGhhdCBvd25zIHRoaXMgU3RyZWFtCi0gICAqIEBwYXJhbSBuYW1lICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgc3RyZWFtIChlLmcuICJVc2VkIHNwYWNlIikKLSAgICogQHBhcmFtIG1pblZhbHVlICAgICAgIFRoZSBtaW5pbXVtIHZhbHVlIGZvciBhbnkgaXRlbSBpbiB0aGlzIHN0cmVhbS4KLSAgICogICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBsZXNzIHRoYW4gdGhpcyB3aWxsIGJlIHJlcHJlc2VudGVkIGFzICJtaW5WYWx1ZS0iCi0gICAqIEBwYXJhbSBtYXhWYWx1ZSAgICAgICBUaGUgbWF4aW11bSB2YWx1ZSBmb3IgYW55IGl0ZW0gaW4gdGhpcyBzdHJlYW0uCi0gICAqICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgZ3JlYXRlciB0aGFuIHRoaXMgd2lsbCBiZSByZXByZXNlbnRlZCBhcyAibWF4VmFsdWUrIgotICAgKiBAcGFyYW0gemVyb1ZhbHVlICAgICAgVGhlIHplcm8gdmFsdWUgZm9yIHRoaXMgc3RyZWFtCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBzdHJlYW0KLSAgICogQHBhcmFtIHN0cmluZ1ByZSAgICAgIEEgc3RyaW5nIHRvIHByZWZpeCB2YWx1ZXMgKGUuZy4gIlVzZWQ6ICIpCi0gICAqIEBwYXJhbSBzdHJpbmdQb3N0ICAgICBBIHN0cmluZyB0byBzdWZmaXggdmFsdWVzIChlLmcuICIgYnl0ZXMuIikKLSAgICogQHBhcmFtIHByZXNlbnRhdGlvbiAgIEhvdyBhIHN0cmVhbSB2YWx1ZSBpcyB0byBiZSBwcmVzZW50ZWQuCi0gICAqIEBwYXJhbSBwYWludFN0eWxlICAgICBIb3cgdGhlIHZhbHVlIGlzIHRvIGJlIHBhaW50ZWQuCi0gICAqIEBwYXJhbSBpbmRleE1heFN0cmVhbSBUaGUgaW5kZXggb2YgdGhlIG1heGltdW0gc3RyZWFtIGlmIHRoZSBwcmVzZW50YXRpb24gaXMgKl9WQVIuCi0gICAqIEBwYXJhbSBjb2xvdXIgICAgICAgICBUaGUgZGVmYXVsdCBjb2xvdXIgZm9yIHRpbGVzIG9mIHRoaXMgc3RyZWFtCi0gICAqIEBzZWUgb3JnLm1tdGsudm0uZ2NzcHkuSW50U3RyZWFtCi0gICAqCi0gICAqIEByZXR1cm4gQSBjb25jcmV0ZSBWTS1zcGVjaWZpYyBCeXRlU3RyZWFtIGluc3RhbmNlLgotICAgKi8KLSAgcHVibGljIG9yZy5tbXRrLnZtLmdjc3B5LkJ5dGVTdHJlYW0gbmV3R0NzcHlCeXRlU3RyZWFtKAotICAgICAgQWJzdHJhY3REcml2ZXIgZHJpdmVyLAotICAgICAgU3RyaW5nIG5hbWUsCi0gICAgICBieXRlIG1pblZhbHVlLAotICAgICAgYnl0ZSBtYXhWYWx1ZSwKLSAgICAgIGJ5dGUgemVyb1ZhbHVlLAotICAgICAgYnl0ZSBkZWZhdWx0VmFsdWUsCi0gICAgICBTdHJpbmcgc3RyaW5nUHJlLAotICAgICAgU3RyaW5nIHN0cmluZ1Bvc3QsCi0gICAgICBpbnQgcHJlc2VudGF0aW9uLAotICAgICAgaW50IHBhaW50U3R5bGUsCi0gICAgICBpbnQgaW5kZXhNYXhTdHJlYW0sCi0gICAgICBDb2xvciBjb2xvdXIsCi0gICAgICBib29sZWFuIHN1bW1hcnkpIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIFZNLnN5c0ZhaWwoIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgQnl0ZVN0cmVhbSEiKTsKLSAgICAgIHJldHVybiBudWxsOyAvLyBuZXZlciBnZXQgaGVyZQotICAgIH0KLSAgfQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IEludFN0cmVhbSBpbnN0YW5jZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUKLSAgICogVk0tc3BlY2lmaWMgY29uY3JldGUgSW50U3RyZWFtIHN1Yi1jbGFzcy4KLSAgICoKLSAgICogQHBhcmFtIGRyaXZlciAgICAgICAgVGhlIGRyaXZlciB0aGF0IG93bnMgdGhpcyBTdHJlYW0KLSAgICogQHBhcmFtIG5hbWUgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBzdHJlYW0gKGUuZy4gIlVzZWQgc3BhY2UiKQotICAgKiBAcGFyYW0gbWluVmFsdWUgICAgICAgVGhlIG1pbmltdW0gdmFsdWUgZm9yIGFueSBpdGVtIGluIHRoaXMgc3RyZWFtLgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGxlc3MgdGhhbiB0aGlzIHdpbGwgYmUgcmVwcmVzZW50ZWQgYXMgIm1pblZhbHVlLSIKLSAgICogQHBhcmFtIG1heFZhbHVlICAgICAgIFRoZSBtYXhpbXVtIHZhbHVlIGZvciBhbnkgaXRlbSBpbiB0aGlzIHN0cmVhbS4KLSAgICogICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBncmVhdGVyIHRoYW4gdGhpcyB3aWxsIGJlIHJlcHJlc2VudGVkIGFzICJtYXhWYWx1ZSsiCi0gICAqIEBwYXJhbSB6ZXJvVmFsdWUgICAgICBUaGUgemVybyB2YWx1ZSBmb3IgdGhpcyBzdHJlYW0KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAgIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIHN0cmVhbQotICAgKiBAcGFyYW0gc3RyaW5nUHJlICAgICAgQSBzdHJpbmcgdG8gcHJlZml4IHZhbHVlcyAoZS5nLiAiVXNlZDogIikKLSAgICogQHBhcmFtIHN0cmluZ1Bvc3QgICAgIEEgc3RyaW5nIHRvIHN1ZmZpeCB2YWx1ZXMgKGUuZy4gIiBieXRlcy4iKQotICAgKiBAcGFyYW0gcHJlc2VudGF0aW9uICAgSG93IGEgc3RyZWFtIHZhbHVlIGlzIHRvIGJlIHByZXNlbnRlZC4KLSAgICogQHBhcmFtIHBhaW50U3R5bGUgICAgIEhvdyB0aGUgdmFsdWUgaXMgdG8gYmUgcGFpbnRlZC4KLSAgICogQHBhcmFtIGluZGV4TWF4U3RyZWFtIFRoZSBpbmRleCBvZiB0aGUgbWF4aW11bSBzdHJlYW0gaWYgdGhlIHByZXNlbnRhdGlvbiBpcyAqX1ZBUi4KLSAgICogQHBhcmFtIGNvbG91ciAgICAgICAgIFRoZSBkZWZhdWx0IGNvbG91ciBmb3IgdGlsZXMgb2YgdGhpcyBzdHJlYW0KLSAgICogQHNlZSBvcmcubW10ay52bS5nY3NweS5JbnRTdHJlYW0KLSAgICoKLSAgICogQHJldHVybiBBIGNvbmNyZXRlIFZNLXNwZWNpZmljIEludFN0cmVhbSBpbnN0YW5jZS4KLSAgICovCi0gIHB1YmxpYyBvcmcubW10ay52bS5nY3NweS5JbnRTdHJlYW0gbmV3R0NzcHlJbnRTdHJlYW0oCi0gICAgICBBYnN0cmFjdERyaXZlciBkcml2ZXIsCi0gICAgICBTdHJpbmcgbmFtZSwKLSAgICAgIGludCBtaW5WYWx1ZSwKLSAgICAgIGludCBtYXhWYWx1ZSwKLSAgICAgIGludCB6ZXJvVmFsdWUsCi0gICAgICBpbnQgZGVmYXVsdFZhbHVlLAotICAgICAgU3RyaW5nIHN0cmluZ1ByZSwKLSAgICAgIFN0cmluZyBzdHJpbmdQb3N0LAotICAgICAgaW50IHByZXNlbnRhdGlvbiwKLSAgICAgIGludCBwYWludFN0eWxlLAotICAgICAgaW50IGluZGV4TWF4U3RyZWFtLAotICAgICAgQ29sb3IgY29sb3VyLAotICAgICAgYm9vbGVhbiBzdW1tYXJ5KSB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBWTS5zeXNGYWlsKCJGYWlsZWQgdG8gYWxsb2NhdGUgbmV3IEludFN0cmVhbSEiKTsKLSAgICAgIHJldHVybiBudWxsOyAvLyBuZXZlciBnZXQgaGVyZQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgU2hvcnRTdHJlYW0gaW5zdGFuY2UgdXNpbmcgdGhlIGFwcHJvcHJpYXRlCi0gICAqIFZNLXNwZWNpZmljIGNvbmNyZXRlIFNob3J0U3RyZWFtIHN1Yi1jbGFzcy4KLSAgICoKLSAgICogQHBhcmFtIGRyaXZlciAgICAgICAgVGhlIGRyaXZlciB0aGF0IG93bnMgdGhpcyBTdHJlYW0KLSAgICogQHBhcmFtIG5hbWUgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBzdHJlYW0gKGUuZy4gIlVzZWQgc3BhY2UiKQotICAgKiBAcGFyYW0gbWluVmFsdWUgICAgICAgVGhlIG1pbmltdW0gdmFsdWUgZm9yIGFueSBpdGVtIGluIHRoaXMgc3RyZWFtLgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGxlc3MgdGhhbiB0aGlzIHdpbGwgYmUgcmVwcmVzZW50ZWQgYXMgIm1pblZhbHVlLSIKLSAgICogQHBhcmFtIG1heFZhbHVlICAgICAgIFRoZSBtYXhpbXVtIHZhbHVlIGZvciBhbnkgaXRlbSBpbiB0aGlzIHN0cmVhbS4KLSAgICogICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBncmVhdGVyIHRoYW4gdGhpcyB3aWxsIGJlIHJlcHJlc2VudGVkIGFzICJtYXhWYWx1ZSsiCi0gICAqIEBwYXJhbSB6ZXJvVmFsdWUgICAgICBUaGUgemVybyB2YWx1ZSBmb3IgdGhpcyBzdHJlYW0KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAgIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIHN0cmVhbQotICAgKiBAcGFyYW0gc3RyaW5nUHJlICAgICAgQSBzdHJpbmcgdG8gcHJlZml4IHZhbHVlcyAoZS5nLiAiVXNlZDogIikKLSAgICogQHBhcmFtIHN0cmluZ1Bvc3QgICAgIEEgc3RyaW5nIHRvIHN1ZmZpeCB2YWx1ZXMgKGUuZy4gIiBieXRlcy4iKQotICAgKiBAcGFyYW0gcHJlc2VudGF0aW9uICAgSG93IGEgc3RyZWFtIHZhbHVlIGlzIHRvIGJlIHByZXNlbnRlZC4KLSAgICogQHBhcmFtIHBhaW50U3R5bGUgICAgIEhvdyB0aGUgdmFsdWUgaXMgdG8gYmUgcGFpbnRlZC4KLSAgICogQHBhcmFtIGluZGV4TWF4U3RyZWFtIFRoZSBpbmRleCBvZiB0aGUgbWF4aW11bSBzdHJlYW0gaWYgdGhlIHByZXNlbnRhdGlvbiBpcyAqX1ZBUi4KLSAgICogQHBhcmFtIGNvbG91ciAgICAgICAgIFRoZSBkZWZhdWx0IGNvbG91ciBmb3IgdGlsZXMgb2YgdGhpcyBzdHJlYW0KLSAgICogQHNlZSBvcmcubW10ay52bS5nY3NweS5JbnRTdHJlYW0KLSAgICoKLSAgICogQHJldHVybiBBIGNvbmNyZXRlIFZNLXNwZWNpZmljIFNob3J0U3RyZWFtIGluc3RhbmNlLgotICAgKi8KLSAgcHVibGljIG9yZy5tbXRrLnZtLmdjc3B5LlNob3J0U3RyZWFtIG5ld0dDc3B5U2hvcnRTdHJlYW0oCi0gICAgICBBYnN0cmFjdERyaXZlciBkcml2ZXIsCi0gICAgICBTdHJpbmcgbmFtZSwKLSAgICAgIHNob3J0IG1pblZhbHVlLAotICAgICAgc2hvcnQgbWF4VmFsdWUsCi0gICAgICBzaG9ydCB6ZXJvVmFsdWUsCi0gICAgICBzaG9ydCBkZWZhdWx0VmFsdWUsCi0gICAgICBTdHJpbmcgc3RyaW5nUHJlLAotICAgICAgU3RyaW5nIHN0cmluZ1Bvc3QsCi0gICAgICBpbnQgcHJlc2VudGF0aW9uLAotICAgICAgaW50IHBhaW50U3R5bGUsCi0gICAgICBpbnQgaW5kZXhNYXhTdHJlYW0sCi0gICAgICBDb2xvciBjb2xvdXIsCi0gICAgICBib29sZWFuIHN1bW1hcnkpIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIFZNLnN5c0ZhaWwoIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgU2hvcnRTdHJlYW0hIik7Ci0gICAgICByZXR1cm4gbnVsbDsgLy8gbmV2ZXIgZ2V0IGhlcmUKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL2ozL21tdGsvRmluYWxpemFibGVQcm9jZXNzb3IuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL2ozL21tdGsvRmluYWxpemFibGVQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwM2NmZS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9tbXRrL0ZpbmFsaXphYmxlUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmluYWxpemFibGVQcm9jZXNzb3IuamF2YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotcGFja2FnZSBvcmcuajMubW10azsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotaW1wb3J0IG9yZy5qMy5ydW50aW1lLlZNOwotaW1wb3J0IG9yZy5qMy5jb25maWcuU2VsZWN0ZWQ7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5UcmFjZUxvY2FsOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyB0aGUgcHJvY2Vzc2luZyBvZiBmaW5hbGl6YWJsZSBvYmplY3RzLgotICovCi0KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBmaW5hbCBjbGFzcyBGaW5hbGl6YWJsZVByb2Nlc3NvciBleHRlbmRzIG9yZy5tbXRrLnZtLkZpbmFsaXphYmxlUHJvY2Vzc29yIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogQ2xhc3MgZmllbGRzCi0gICAqLwotCi0gIC8qKiBUaGUgRmluYWxpemFibGVQcm9jZXNzb3Igc2luZ2xldG9uICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbmFsaXphYmxlUHJvY2Vzc29yIGZpbmFsaXphYmxlUHJvY2Vzc29yID0gbmV3IEZpbmFsaXphYmxlUHJvY2Vzc29yKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBGaW5hbGl6YWJsZVByb2Nlc3NvciBnZXRQcm9jZXNzb3IoKSB7Ci0gICAgcmV0dXJuIGZpbmFsaXphYmxlUHJvY2Vzc29yOwotICB9Ci0KLSAgcHVibGljIG5hdGl2ZSB2b2lkIGNsZWFyKCk7Ci0KLSAgLyoqCi0gICAqIFNjYW4gdGhyb3VnaCBhbGwgZW50cmllcyBpbiB0aGUgdGFibGUgYW5kIGZvcndhcmQuCi0gICAqCi0gICAqIEN1cnJlbnRseSBpZ25vcmVzIHRoZSBudXJzZXJ5IGhpbnQuCi0gICAqCi0gICAqIFRPRE8gcGFyYWxsZWxpc2UgdGhpcyBjb2RlPwotICAgKgotICAgKiBAcGFyYW0gdHJhY2UgVGhlIHRyYWNlCi0gICAqIEBwYXJhbSBudXJzZXJ5IElzIHRoaXMgYSBudXJzZXJ5IGNvbGxlY3Rpb24gPwotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBuYXRpdmUgdm9pZCBmb3J3YXJkKFRyYWNlTG9jYWwgdHJhY2UsIGJvb2xlYW4gbnVyc2VyeSk7Ci0KLSAgLyoqCi0gICAqIFNjYW4gdGhyb3VnaCB0aGUgbGlzdCBvZiByZWZlcmVuY2VzLiBDYWxscyBSZWZlcmVuY2VQcm9jZXNzb3IncwotICAgKiBwcm9jZXNzUmVmZXJlbmNlIG1ldGhvZCBmb3IgZWFjaCByZWZlcmVuY2UgYW5kIGJ1aWxkcyBhIG5ldwotICAgKiBsaXN0IG9mIHRob3NlIHJlZmVyZW5jZXMgc3RpbGwgYWN0aXZlLgotICAgKgotICAgKiBEZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIDxjb2RlPm51cnNlcnk8L2NvZGU+LCB3ZSB3aWxsIGVpdGhlcgotICAgKiBzY2FuIGFsbCByZWZlcmVuY2VzLCBvciBqdXN0IHRob3NlIGNyZWF0ZWQgc2luY2UgdGhlIGxhc3Qgc2Nhbi4KLSAgICoKLSAgICogVE9ETyBwYXJhbGxlbGlzZSB0aGlzIGNvZGUKLSAgICoKLSAgICogQHBhcmFtIG51cnNlcnkgU2NhbiBvbmx5IHRoZSBuZXdseSBjcmVhdGVkIHJlZmVyZW5jZXMKLSAgICovCi0gIEBPdmVycmlkZQotICBAVW5pbnRlcnJ1cHRpYmxlTm9XYXJuCi0gIHB1YmxpYyBuYXRpdmUgdm9pZCBzY2FuKFRyYWNlTG9jYWwgdHJhY2UsIGJvb2xlYW4gbnVyc2VyeSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL2ozL21tdGsvTG9jay5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvajMvbW10ay9Mb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ODA0NDUuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvajMvbW10ay9Mb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMb2NrLmphdmEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotcGFja2FnZSBvcmcuajMubW10azsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotQFVuaW50ZXJydXB0aWJsZSBwdWJsaWMgY2xhc3MgTG9jayBleHRlbmRzIG9yZy5tbXRrLnZtLkxvY2sgewotCi0gIHByaXZhdGUgaW50IHN0YXRlOwotICBwcml2YXRlIFN0cmluZyBuYW1lOyAgICAgICAgLy8gbG9naWNhbCBuYW1lIG9mIGxvY2sKLQotICAvLyBEaWFnbm9zaXMgSW5zdGFuY2UgZmllbGRzCi0gIHB1YmxpYyBMb2NrKFN0cmluZyBuYW1lKSB7Ci0gICAgdGhpcygpOwotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgTG9jaygpIHsKLSAgICBzdGF0ZSA9IDA7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBzdHIpIHsKLSAgICBuYW1lID0gc3RyOwotICB9Ci0KLSAgcHVibGljIG5hdGl2ZSB2b2lkIGFjcXVpcmUoKTsKLQotICBwdWJsaWMgbmF0aXZlIHZvaWQgY2hlY2soaW50IHcpOwotCi0gIHB1YmxpYyBuYXRpdmUgdm9pZCByZWxlYXNlKCk7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9tbXRrL01NVGtfRXZlbnRzLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9tbXRrL01NVGtfRXZlbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYmViZmMuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvajMvbW10ay9NTVRrX0V2ZW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0gTU1Ua19FdmVudHMuamF2YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLXBhY2thZ2Ugb3JnLmozLm1tdGs7Ci0KLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLlVuaW50ZXJydXB0aWJsZTsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLkFkZHJlc3M7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC5FeHRlbnQ7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2Ygc2ltcGxlIE1NVEsgZXZlbnQgZ2VuZXJhdGlvbiBob29rcwotICogdG8gYWxsb3cgTU1UayB0byBnZW5lcmF0ZSBUdW5pbmdGb3JrIGV2ZW50cy4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIE1NVGtfRXZlbnRzIGV4dGVuZHMgb3JnLm1tdGsudm0uTU1Ua19FdmVudHMgewotCi0gIHB1YmxpYyBuYXRpdmUgdm9pZCB0cmFjZVBhZ2VBY3F1aXJlZChTcGFjZSBzcGFjZSwgQWRkcmVzcyBzdGFydEFkZHJlc3MsIGludCBudW1QYWdlcyk7Ci0KLSAgcHVibGljIG5hdGl2ZSB2b2lkIHRyYWNlUGFnZVJlbGVhc2VkKFNwYWNlIHNwYWNlLCBBZGRyZXNzIHN0YXJ0QWRkcmVzcywgaW50IG51bVBhZ2VzKTsKLQotICBwdWJsaWMgbmF0aXZlIHZvaWQgaGVhcFNpemVDaGFuZ2VkKEV4dGVudCBoZWFwU2l6ZSk7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9tbXRrL01lbW9yeS5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvajMvbW10ay9NZW1vcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNlOWFkMC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9tbXRrL01lbW9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWVtb3J5LmphdmEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi1wYWNrYWdlIG9yZy5qMy5tbXRrOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5QbGFuOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5JbW1vcnRhbFNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuaGVhcC5WTVJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuajMucnVudGltZS5WTTsKLWltcG9ydCBvcmcuamlrZXNydm0uTWFnaWM7Ci1pbXBvcnQgb3JnLmppa2VzcnZtLlNpemVDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBmaW5hbCBjbGFzcyBNZW1vcnkgZXh0ZW5kcyBvcmcubW10ay52bS5NZW1vcnkgewotCi0gIHByb3RlY3RlZCBuYXRpdmUgZmluYWwgQWRkcmVzcyBnZXRIZWFwU3RhcnRDb25zdGFudCgpOwotICBwcm90ZWN0ZWQgbmF0aXZlIGZpbmFsIEFkZHJlc3MgZ2V0SGVhcEVuZENvbnN0YW50KCk7Ci0gIHByb3RlY3RlZCBuYXRpdmUgZmluYWwgQWRkcmVzcyBnZXRBdmFpbGFibGVTdGFydENvbnN0YW50KCk7Ci0gIHByb3RlY3RlZCBuYXRpdmUgZmluYWwgQWRkcmVzcyBnZXRBdmFpbGFibGVFbmRDb25zdGFudCgpOwotICBwcm90ZWN0ZWQgZmluYWwgYnl0ZSBnZXRMb2dCeXRlc0luQWRkcmVzc0NvbnN0YW50KCkgeyByZXR1cm4gKGJ5dGUpU2l6ZUNvbnN0YW50cy5MT0dfQllURVNfSU5fQUREUkVTUzsgfQotICBwcm90ZWN0ZWQgZmluYWwgYnl0ZSBnZXRMb2dCeXRlc0luV29yZENvbnN0YW50KCkgeyByZXR1cm4gKGJ5dGUpU2l6ZUNvbnN0YW50cy5MT0dfQllURVNfSU5fV09SRDsgfQotICBwcm90ZWN0ZWQgZmluYWwgYnl0ZSBnZXRMb2dCeXRlc0luUGFnZUNvbnN0YW50KCkgeyByZXR1cm4gKGJ5dGUpU2l6ZUNvbnN0YW50cy5MT0dfQllURVNfSU5fUEFHRTsgfQotICBwcm90ZWN0ZWQgZmluYWwgYnl0ZSBnZXRMb2dNaW5BbGlnbm1lbnRDb25zdGFudCgpIHsgcmV0dXJuIChieXRlKVNpemVDb25zdGFudHMuTE9HX0JZVEVTX0lOX0lOVDt9Ci0gIHByb3RlY3RlZCBmaW5hbCBpbnQgZ2V0TWF4Qnl0ZXNQYWRkaW5nQ29uc3RhbnQoKSB7IHJldHVybiAoYnl0ZSlTaXplQ29uc3RhbnRzLkJZVEVTX0lOX0RPVUJMRTsgfQotICBwcm90ZWN0ZWQgZmluYWwgaW50IGdldEFsaWdubWVudFZhbHVlQ29uc3RhbnQoKSB7IHJldHVybiAweGRlYWRiZWVmOyB9Ci0KLSAgLyogT24gSW50ZWwgd2UgYWxpZ24gY29kZSB0byAxNiBieXRlcyBhcyByZWNvbW1lbmRlZCBpbiB0aGUgb3B0aW1pemF0aW9uIG1hbnVhbCAqLwotICBwcm90ZWN0ZWQgZmluYWwgYnl0ZSBnZXRNYXhBbGlnbm1lbnRTaGlmdENvbnN0YW50KCkgeyAKLSAgICByZXR1cm4gKGJ5dGUpKChWTS5CdWlsZEZvcklBMzIgPyAxIDogMCkgKyBTaXplQ29uc3RhbnRzLkxPR19CWVRFU19JTl9MT05HIC0gU2l6ZUNvbnN0YW50cy5MT0dfQllURVNfSU5fSU5UKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIEltbW9ydGFsU3BhY2UgYm9vdFNwYWNlOwotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHNwYWNlIGFzc29jaWF0ZWQgd2l0aC9yZXNlcnZlZCBmb3IgdGhlIFZNLgotICAgKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHVibGljIGZpbmFsIEltbW9ydGFsU3BhY2UgZ2V0Vk1TcGFjZSgpIHsKLSAgICBpZiAoYm9vdFNwYWNlID09IG51bGwpIHsKLSAgICAgIGJvb3RTcGFjZSA9IG5ldyBJbW1vcnRhbFNwYWNlKCJib290IiwgUGxhbi5ERUZBVUxUX1BPTExfRlJFUVVFTkNZLCBWTVJlcXVlc3QuY3JlYXRlKCkpOwotICAgIH0KLSAgICByZXR1cm4gYm9vdFNwYWNlOwotICB9Ci0KLSAgLyoqIEdsb2JhbCBwcmVwYXJhdGlvbiBmb3IgYSBjb2xsZWN0aW9uLiAqLwotICBwdWJsaWMgZmluYWwgdm9pZCBnbG9iYWxQcmVwYXJlVk1TcGFjZSgpIHsgYm9vdFNwYWNlLnByZXBhcmUoKTsgfQotCi0gIC8qKiBQZXItY29sbGVjdG9yIHByZXBhcmF0aW9uIGZvciBhIGNvbGxlY3Rpb24uICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGNvbGxlY3RvclByZXBhcmVWTVNwYWNlKCkge30KLQotICAvKiogUGVyLWNvbGxlY3RvciBwb3N0LWNvbGxlY3Rpb24gd29yay4gKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgY29sbGVjdG9yUmVsZWFzZVZNU3BhY2UoKSB7fQotCi0gIC8qKiBHbG9iYWwgcG9zdC1jb2xsZWN0aW9uIHdvcmsuICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGdsb2JhbFJlbGVhc2VWTVNwYWNlKCkgeyBib290U3BhY2UucmVsZWFzZSgpOyB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHJhbmdlIG9mIGFkZHJlc3NlcyBhc3NvY2lhdGVkIHdpdGggYSBoZWFwLgotICAgKgotICAgKiBAcGFyYW0gaWQgdGhlIGhlYXAgaWRlbnRpZmllcgotICAgKiBAcGFyYW0gc3RhcnQgdGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBoZWFwCi0gICAqIEBwYXJhbSBlbmQgdGhlIGFkZHJlc3Mgb2YgdGhlIGVuZCBvZiB0aGUgaGVhcAotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0SGVhcFJhbmdlKGludCBpZCwgQWRkcmVzcyBzdGFydCwgQWRkcmVzcyBlbmQpIHt9Ci0KLSAvKioKLSAgICogRGVtYW5kIHplcm8gbW1hcHMgYW4gYXJlYSBvZiB2aXJ0dWFsIG1lbW9yeS4KLSAgICoKLSAgICogQHBhcmFtIHN0YXJ0IHRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgYXJlYSB0byBiZSBtYXBwZWQKLSAgICogQHBhcmFtIHNpemUgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgYXJlYSB0byBiZSBtYXBwZWQKLSAgICogQHJldHVybiAwIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSB0aGUgc3lzdGVtIGVycm5vCi0gICAqLwotICBwdWJsaWMgbmF0aXZlIGZpbmFsIGludCBkem1tYXAoQWRkcmVzcyBzdGFydCwgaW50IHNpemUpOwotCi0gIC8qKgotICAgKiBQcm90ZWN0cyBhY2Nlc3MgdG8gYW4gYXJlYSBvZiB2aXJ0dWFsIG1lbW9yeS4KLSAgICoKLSAgICogQHBhcmFtIHN0YXJ0IHRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgYXJlYSB0byBiZSBtYXBwZWQKLSAgICogQHBhcmFtIHNpemUgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgYXJlYSB0byBiZSBtYXBwZWQKLSAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UKLSAgICogPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAqLwotICBwdWJsaWMgbmF0aXZlIGZpbmFsIGJvb2xlYW4gbXByb3RlY3QoQWRkcmVzcyBzdGFydCwgaW50IHNpemUpOwotCi0gIC8qKgotICAgKiBBbGxvd3MgYWNjZXNzIHRvIGFuIGFyZWEgb2YgdmlydHVhbCBtZW1vcnkuCi0gICAqCi0gICAqIEBwYXJhbSBzdGFydCB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGFyZWEgdG8gYmUgbWFwcGVkCi0gICAqIEBwYXJhbSBzaXplIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIGFyZWEgdG8gYmUgbWFwcGVkCi0gICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlCi0gICAqIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgKi8KLSAgcHVibGljIG5hdGl2ZSBmaW5hbCBib29sZWFuIG11bnByb3RlY3QoQWRkcmVzcyBzdGFydCwgaW50IHNpemUpOwotCi0gIC8qKgotICAgKiBaZXJvIGEgcmVnaW9uIG9mIG1lbW9yeS4KLSAgICogQHBhcmFtIHN0YXJ0IFN0YXJ0IG9mIGFkZHJlc3MgcmFuZ2UgKGluY2x1c2l2ZSkKLSAgICogQHBhcmFtIGxlbiBMZW5ndGggaW4gYnl0ZXMgb2YgcmFuZ2UgdG8gemVybwotICAgKiBSZXR1cm5lZDogbm90aGluZwotICAgKi8KLSAgcHVibGljIG5hdGl2ZSBmaW5hbCB2b2lkIHplcm8oQWRkcmVzcyBzdGFydCwgRXh0ZW50IGxlbik7Ci0KLSAgLyoqCi0gICAqIFplcm8gYSByYW5nZSBvZiBwYWdlcyBvZiBtZW1vcnkuCi0gICAqIEBwYXJhbSBzdGFydCBTdGFydCBvZiBhZGRyZXNzIHJhbmdlIChtdXN0IGJlIGEgcGFnZSBhZGRyZXNzKQotICAgKiBAcGFyYW0gbGVuIExlbmd0aCBpbiBieXRlcyBvZiByYW5nZSAobXVzdCBiZSBtdWx0aXBsZSBvZiBwYWdlIHNpemUpCi0gICAqLwotICBwdWJsaWMgbmF0aXZlIGZpbmFsIHZvaWQgemVyb1BhZ2VzKEFkZHJlc3Mgc3RhcnQsIGludCBsZW4pOwotCi0gIC8qKgotICAgKiBMb2dzIHRoZSBjb250ZW50cyBvZiBhbiBhZGRyZXNzIGFuZCB0aGUgc3Vycm91bmRpbmcgbWVtb3J5IHRvIHRoZQotICAgKiBlcnJvciBvdXRwdXQuCi0gICAqCi0gICAqIEBwYXJhbSBzdGFydCB0aGUgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IHRvIGJlIGR1bXBlZAotICAgKiBAcGFyYW0gYmVmb3JlQnl0ZXMgdGhlIG51bWJlciBvZiBieXRlcyBiZWZvcmUgdGhlIGFkZHJlc3MgdG8gYmUKLSAgICogaW5jbHVkZWQKLSAgICogQHBhcmFtIGFmdGVyQnl0ZXMgdGhlIG51bWJlciBvZiBieXRlcyBhZnRlciB0aGUgYWRkcmVzcyB0byBiZQotICAgKiBpbmNsdWRlZAotICAgKi8KLSAgcHVibGljIG5hdGl2ZSBmaW5hbCB2b2lkIGR1bXBNZW1vcnkoQWRkcmVzcyBzdGFydCwgaW50IGJlZm9yZUJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWZ0ZXJCeXRlcyk7Ci0KLSAgLyoKLSAgICogVXRpbGl0aWVzIGZyb20gdGhlIFZNIGNsYXNzCi0gICAqLwotCi0gIEBJbmxpbmUKLSAgcHVibGljIGZpbmFsIHZvaWQgc3luYygpIHsKLSAgICBNYWdpYy5zeW5jKCk7Ci0gIH0KLQotICBASW5saW5lCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGlzeW5jKCkgewotICAgIE1hZ2ljLmlzeW5jKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL2ozL21tdGsvT2JqZWN0TW9kZWwuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL2ozL21tdGsvT2JqZWN0TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNjZjgyOS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9tbXRrL09iamVjdE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT2JqZWN0TW9kZWwuamF2YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLXBhY2thZ2Ugb3JnLmozLm1tdGs7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBmaW5hbCBjbGFzcyBPYmplY3RNb2RlbCBleHRlbmRzIG9yZy5tbXRrLnZtLk9iamVjdE1vZGVsIHsKLQotICBwcm90ZWN0ZWQgbmF0aXZlIE9mZnNldCBnZXRBcnJheUJhc2VPZmZzZXQoKTsKLQotICAvKioKLSAgICogQ29weSBhbiBvYmplY3QgdXNpbmcgYSBwbGFuJ3MgYWxsb2NDb3B5IHRvIGdldCBzcGFjZSBhbmQgaW5zdGFsbAotICAgKiB0aGUgZm9yd2FyZGluZyBwb2ludGVyLiAgT24gZW50cnksIDxjb2RlPmZyb208L2NvZGU+IG11c3QgaGF2ZQotICAgKiBiZWVuIHJlc2VydmVkIGZvciBjb3B5aW5nIGJ5IHRoZSBjYWxsZXIuICBUaGlzIG1ldGhvZCBjYWxscyB0aGUKLSAgICogcGxhbidzIDxjb2RlPmdldFN0YXR1c0ZvckNvcHkoKTwvY29kZT4gbWV0aG9kIHRvIGVzdGFibGlzaCBhIG5ldwotICAgKiBzdGF0dXMgd29yZCBmb3IgdGhlIGNvcGllZCBvYmplY3QgYW5kIDxjb2RlPnBvc3RDb3B5KCk8L2NvZGU+IHRvCi0gICAqIGFsbG93IHRoZSBwbGFuIHRvIHBlcmZvcm0gYW55IHBvc3QgY29weSBhY3Rpb25zLgotICAgKgotICAgKiBAcGFyYW0gZnJvbSB0aGUgYWRkcmVzcyBvZiB0aGUgb2JqZWN0IHRvIGJlIGNvcGllZAotICAgKiBAcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBuZXcgb2JqZWN0Ci0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBuYXRpdmUgT2JqZWN0UmVmZXJlbmNlIGNvcHkoT2JqZWN0UmVmZXJlbmNlIGZyb20sIGludCBhbGxvY2F0b3IpOwotCi0gIC8qKgotICAgKiBDb3B5IGFuIG9iamVjdCB0byBiZSBwb2ludGVyIHRvIGJ5IHRoZSB0byBhZGRyZXNzLiBUaGlzIGlzIHJlcXVpcmVkCi0gICAqIGZvciBkZWxheWVkLWNvcHkgY29sbGVjdG9ycyBzdWNoIGFzIGNvbXBhY3RpbmcgY29sbGVjdG9ycy4gRHVyaW5nIHRoZQotICAgKiBjb2xsZWN0aW9uLCBNTVRrIHJlc2VydmVzIGEgcmVnaW9uIGluIHRoZSBoZWFwIGZvciBhbiBvYmplY3QgYXMgcGVyCi0gICAqIHJlcXVpcmVtZW50cyBmb3VuZCBmcm9tIE9iamVjdE1vZGVsIGFuZCB0aGVuIGFza3MgT2JqZWN0TW9kZWwgdG8KLSAgICogZGV0ZXJtaW5lIHdoYXQgdGhlIG9iamVjdCdzIHJlZmVyZW5jZSB3aWxsIGJlIHBvc3QtY29weS4KLSAgICoKLSAgICogQHBhcmFtIGZyb20gdGhlIGFkZHJlc3Mgb2YgdGhlIG9iamVjdCB0byBiZSBjb3BpZWQKLSAgICogQHBhcmFtIHRvIFRoZSB0YXJnZXQgbG9jYXRpb24uCi0gICAqIEBwYXJhbSByZWdpb24gVGhlIHN0YXJ0IChvciBhbiBhZGRyZXNzIGxlc3MgdGhhbikgdGhlIHJlZ2lvbiB0aGF0IHdhcyByZXNlcnZlZCBmb3IgdGhpcyBvYmplY3QuCi0gICAqIEByZXR1cm4gQWRkcmVzcyBUaGUgYWRkcmVzcyBwYXN0IHRoZSBlbmQgb2YgdGhlIGNvcGllZCBvYmplY3QKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIG5hdGl2ZSBBZGRyZXNzIGNvcHlUbyhPYmplY3RSZWZlcmVuY2UgZnJvbSwgT2JqZWN0UmVmZXJlbmNlIHRvLCBBZGRyZXNzIHJlZ2lvbik7Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgcmVmZXJlbmNlIHRoYXQgYW4gb2JqZWN0IHdpbGwgYmUgcmVmZXJlZCB0byBhZnRlciBpdCBpcyBjb3BpZWQKLSAgICogdG8gdGhlIHNwZWNpZmllZCByZWdpb24uIFVzZWQgaW4gZGVsYXllZC1jb3B5IGNvbGxlY3RvcnMgc3VjaCBhcyBjb21wYWN0aW5nCi0gICAqIGNvbGxlY3RvcnMuCi0gICAqCi0gICAqIEBwYXJhbSBmcm9tIFRoZSBvYmplY3QgdG8gYmUgY29waWVkLgotICAgKiBAcGFyYW0gdG8gVGhlIHJlZ2lvbiB0byBiZSBjb3BpZWQgdG8uCi0gICAqIEByZXR1cm4gVGhlIHJlc3VsdGluZyByZWZlcmVuY2UuCi0gICAqLwotICBwdWJsaWMgbmF0aXZlIE9iamVjdFJlZmVyZW5jZSBnZXRSZWZlcmVuY2VXaGVuQ29waWVkVG8oT2JqZWN0UmVmZXJlbmNlIGZyb20sIEFkZHJlc3MgdG8pOwotCi0gIC8qKgotICAgKiBHZXRzIGEgcG9pbnRlciB0byB0aGUgYWRkcmVzcyBqdXN0IHBhc3QgdGhlIGVuZCBvZiB0aGUgb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgbmF0aXZlIEFkZHJlc3MgZ2V0T2JqZWN0RW5kQWRkcmVzcyhPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KTsKLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBzaXplIHJlcXVpcmVkIHRvIGNvcHkgYW4gb2JqZWN0Ci0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB3aG9zZSBzaXplIGlzIHRvIGJlIHF1ZXJpZWQKLSAgICogQHJldHVybiBUaGUgc2l6ZSByZXF1aXJlZCB0byBjb3B5IDxjb2RlPm9iajwvY29kZT4KLSAgICovCi0gIHB1YmxpYyBuYXRpdmUgaW50IGdldFNpemVXaGVuQ29waWVkKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGFsaWdubWVudCByZXF1aXJlbWVudCBmb3IgYSBjb3B5IG9mIHRoaXMgb2JqZWN0Ci0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB3aG9zZSBzaXplIGlzIHRvIGJlIHF1ZXJpZWQKLSAgICogQHJldHVybiBUaGUgYWxpZ25tZW50IHJlcXVpcmVkIGZvciBhIGNvcHkgb2YgPGNvZGU+b2JqPC9jb2RlPgotICAgKi8KLSAgcHVibGljIG5hdGl2ZSBpbnQgZ2V0QWxpZ25XaGVuQ29waWVkKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGFsaWdubWVudCBvZmZzZXQgcmVxdWlyZW1lbnRzIGZvciBhIGNvcHkgb2YgdGhpcyBvYmplY3QKLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHdob3NlIHNpemUgaXMgdG8gYmUgcXVlcmllZAotICAgKiBAcmV0dXJuIFRoZSBhbGlnbm1lbnQgb2Zmc2V0IHJlcXVpcmVkIGZvciBhIGNvcHkgb2YgPGNvZGU+b2JqPC9jb2RlPgotICAgKi8KLSAgcHVibGljIG5hdGl2ZSBpbnQgZ2V0QWxpZ25PZmZzZXRXaGVuQ29waWVkKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHNpemUgdXNlZCBieSBhbiBvYmplY3QKLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHdob3NlIHNpemUgaXMgdG8gYmUgcXVlcmllZAotICAgKiBAcmV0dXJuIFRoZSBzaXplIG9mIDxjb2RlPm9iajwvY29kZT4KLSAgICovCi0gIHB1YmxpYyBuYXRpdmUgaW50IGdldEN1cnJlbnRTaXplKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG5leHQgb2JqZWN0IGluIHRoZSBoZWFwIHVuZGVyIGNvbnRpZ3VvdXMgYWxsb2NhdGlvbgotICAgKi8KLSAgcHVibGljIG5hdGl2ZSBPYmplY3RSZWZlcmVuY2UgZ2V0TmV4dE9iamVjdChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KTsKLQotICAvKioKLSAgICogUmV0dXJuIGFuIG9iamVjdCByZWZlcmVuY2UgZnJvbSBrbm93bGVkZ2Ugb2YgdGhlIGxvdyBvcmRlciB3b3JkCi0gICAqLwotICBwdWJsaWMgbmF0aXZlIE9iamVjdFJlZmVyZW5jZSBnZXRPYmplY3RGcm9tU3RhcnRBZGRyZXNzKEFkZHJlc3Mgc3RhcnQpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIHR5cGUgZGVzY3JpcHRvciBmb3IgYW4gb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gcmVmIGFkZHJlc3Mgb2YgdGhlIG9iamVjdAotICAgKiBAcmV0dXJuIGJ5dGUgYXJyYXkgd2l0aCB0aGUgdHlwZSBkZXNjcmlwdG9yCi0gICAqLwotICBwdWJsaWMgbmF0aXZlIGJ5dGUgW10gZ2V0VHlwZURlc2NyaXB0b3IoT2JqZWN0UmVmZXJlbmNlIHJlZik7Ci0KLSAgQElubGluZQotICBwdWJsaWMgbmF0aXZlIGludCBnZXRBcnJheUxlbmd0aChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KTsKLQotICAvKioKLSAgICogSXMgdGhlIHBhc3NlZCBvYmplY3QgYW4gYXJyYXk/Ci0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgYWRkcmVzcyBvZiB0aGUgb2JqZWN0Ci0gICAqLwotICBwdWJsaWMgbmF0aXZlIGJvb2xlYW4gaXNBcnJheShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KTsKLQotICAvKioKLSAgICogSXMgdGhlIHBhc3NlZCBvYmplY3QgYSBwcmltaXRpdmUgYXJyYXk/Ci0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgYWRkcmVzcyBvZiB0aGUgb2JqZWN0Ci0gICAqLwotICBwdWJsaWMgbmF0aXZlIGJvb2xlYW4gaXNQcmltaXRpdmVBcnJheShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KTsKLQotICAvKioKLSAgICogQXR0ZW1wdHMgdG8gc2V0IHRoZSBiaXRzIGF2YWlsYWJsZSBmb3IgbWVtb3J5IG1hbmFnZXIgdXNlIGluIGFuCi0gICAqIG9iamVjdC4gIFRoZSBhdHRlbXB0IHdpbGwgb25seSBiZSBzdWNjZXNzZnVsIGlmIHRoZSBjdXJyZW50IHZhbHVlCi0gICAqIG9mIHRoZSBiaXRzIG1hdGNoZXMgPGNvZGU+b2xkVmFsPC9jb2RlPi4gIFRoZSBjb21wYXJpc29uIHdpdGggdGhlCi0gICAqIGN1cnJlbnQgdmFsdWUgYW5kIHNldHRpbmcgYXJlIGF0b21pYyB3aXRoIHJlc3BlY3QgdG8gb3RoZXIKLSAgICogYWxsb2NhdG9ycy4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCB0aGUgYWRkcmVzcyBvZiB0aGUgb2JqZWN0Ci0gICAqIEBwYXJhbSBvbGRWYWwgdGhlIHJlcXVpcmVkIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGJpdHMKLSAgICogQHBhcmFtIG5ld1ZhbCB0aGUgZGVzaXJlZCBuZXcgdmFsdWUgb2YgdGhlIGJpdHMKLSAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYml0cyB3ZXJlIHNldCwKLSAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIG5hdGl2ZSBib29sZWFuIGF0dGVtcHRBdmFpbGFibGVCaXRzKE9iamVjdFJlZmVyZW5jZSBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkIG9sZFZhbCwgV29yZCBuZXdWYWwpOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBiaXRzIGF2YWlsYWJsZSBmb3IgbWVtb3J5IG1hbmFnZXIgdXNlIGluIGFuCi0gICAqIG9iamVjdCwgaW4gcHJlcGFyYXRpb24gZm9yIHNldHRpbmcgdGhvc2UgYml0cy4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCB0aGUgYWRkcmVzcyBvZiB0aGUgb2JqZWN0Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBiaXRzCi0gICAqLwotICBwdWJsaWMgbmF0aXZlIFdvcmQgcHJlcGFyZUF2YWlsYWJsZUJpdHMoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGJ5dGUgYXZhaWxhYmxlIGZvciBtZW1vcnkgbWFuYWdlciB1c2UgaW4gYW4gb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSBhZGRyZXNzIG9mIHRoZSBvYmplY3QKLSAgICogQHBhcmFtIHZhbCB0aGUgbmV3IHZhbHVlIG9mIHRoZSBieXRlCi0gICAqLwotICBwdWJsaWMgbmF0aXZlIHZvaWQgd3JpdGVBdmFpbGFibGVCeXRlKE9iamVjdFJlZmVyZW5jZSBvYmplY3QsIGJ5dGUgdmFsKTsKLQotICAvKioKLSAgICogUmVhZCB0aGUgYnl0ZSBhdmFpbGFibGUgZm9yIG1lbW9yeSBtYW5hZ2VyIHVzZSBpbiBhbiBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgdGhlIGFkZHJlc3Mgb2YgdGhlIG9iamVjdAotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgYnl0ZQotICAgKi8KLSAgcHVibGljIG5hdGl2ZSBieXRlIHJlYWRBdmFpbGFibGVCeXRlKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBiaXRzIGF2YWlsYWJsZSBmb3IgbWVtb3J5IG1hbmFnZXIgdXNlIGluIGFuIG9iamVjdC4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCB0aGUgYWRkcmVzcyBvZiB0aGUgb2JqZWN0Ci0gICAqIEBwYXJhbSB2YWwgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgYml0cwotICAgKi8KLSAgcHVibGljIG5hdGl2ZSB2b2lkIHdyaXRlQXZhaWxhYmxlQml0c1dvcmQoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCwgV29yZCB2YWwpOwotCi0gIC8qKgotICAgKiBSZWFkIHRoZSBiaXRzIGF2YWlsYWJsZSBmb3IgbWVtb3J5IG1hbmFnZXIgdXNlIGluIGFuIG9iamVjdC4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCB0aGUgYWRkcmVzcyBvZiB0aGUgb2JqZWN0Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBiaXRzCi0gICAqLwotICBwdWJsaWMgbmF0aXZlIFdvcmQgcmVhZEF2YWlsYWJsZUJpdHNXb3JkKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBvZmZzZXQgb2YgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IGhlYWRlciBmcm9tIHRoZSBvYmplY3QKLSAgICogcmVmZXJlbmNlIGFkZHJlc3MuICBYWFggVGhlIG9iamVjdCBtb2RlbCAvIG1lbW9yeSBtYW5hZ2VyCi0gICAqIGludGVyZmFjZSBzaG91bGQgYmUgaW1wcm92ZWQgc28gdGhhdCB0aGUgbWVtb3J5IG1hbmFnZXIgZG9lcyBub3QKLSAgICogbmVlZCB0byBrbm93IHRoaXMuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIG9mZnNldCwgcmVsYXRpdmUgdGhlIG9iamVjdCByZWZlcmVuY2UgYWRkcmVzcwotICAgKi8KLSAgLyogQUpHOiBTaG91bGQgdGhpcyBiZSBhIHZhcmlhYmxlIHJhdGhlciB0aGFuIG1ldGhvZD8gKi8KLSAgcHVibGljIG5hdGl2ZSBPZmZzZXQgR0NfSEVBREVSX09GRlNFVCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsb3dlc3QgYWRkcmVzcyBvZiB0aGUgc3RvcmFnZSBhc3NvY2lhdGVkIHdpdGggYW4gb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSByZWZlcmVuY2UgYWRkcmVzcyBvZiB0aGUgb2JqZWN0Ci0gICAqIEByZXR1cm4gdGhlIGxvd2VzdCBhZGRyZXNzIG9mIHRoZSBvYmplY3QKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIG5hdGl2ZSBBZGRyZXNzIG9iamVjdFN0YXJ0UmVmKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGFkZHJlc3MgZ3VhcmFudGVlZCB0byBiZSBpbnNpZGUgdGhlIHN0b3JhZ2UgYXNzb2NhdGllZAotICAgKiB3aXRoIGFuZCBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHJlZmVyZW5jZSBhZGRyZXNzIG9mIHRoZSBvYmplY3QKLSAgICogQHJldHVybiBhbiBhZGRyZXNzIGluc2lkZSB0aGUgb2JqZWN0Ci0gICAqLwotICBwdWJsaWMgbmF0aXZlIEFkZHJlc3MgcmVmVG9BZGRyZXNzKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpOwotCi0gIC8qKgotICAgKiBDaGVja3MgaWYgYSByZWZlcmVuY2Ugb2YgdGhlIGdpdmVuIHR5cGUgaW4gYW5vdGhlciBvYmplY3QgaXMKLSAgICogaW5oZXJlbnRseSBhY3ljbGljLgotICAgKgotICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgcmVmZXJlbmNlIG9mIHRoZSB0eXBlIGlzCi0gICAqIGluaGVyZW50bHkgYWN5Y2xpYwotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgbmF0aXZlIGJvb2xlYW4gaXNBY3ljbGljKE9iamVjdFJlZmVyZW5jZSB0eXBlUmVmKTsKLQotICAvKioKLSAgICogRHVtcCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGFuIG9iamVjdC4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHdob3NlIGluZm9ybWF0aW9uIGlzIHRvIGJlIGR1bXBlZAotICAgKi8KLSAgcHVibGljIG5hdGl2ZSB2b2lkIGR1bXBPYmplY3QoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCk7Ci19Ci0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL2ozL21tdGsvUmVmZXJlbmNlUHJvY2Vzc29yLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9tbXRrL1JlZmVyZW5jZVByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzE0MDA3Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL2ozL21tdGsvUmVmZXJlbmNlUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVmZXJlbmNlUHJvY2Vzc29yLmphdmEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLQotcGFja2FnZSBvcmcuajMubW10azsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uUGxhbjsKLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYWNlTG9jYWw7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5vcHRpb25zLk9wdGlvbnM7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLWltcG9ydCBvcmcuajMucnVudGltZS5WTTsKLQotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGZpbmFsIGNsYXNzIFJlZmVyZW5jZVByb2Nlc3NvciBleHRlbmRzIG9yZy5tbXRrLnZtLlJlZmVyZW5jZVByb2Nlc3NvciB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIENsYXNzIGZpZWxkcwotICAgKi8KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZWZlcmVuY2VQcm9jZXNzb3Igc29mdFJlZmVyZW5jZVByb2Nlc3NvciA9Ci0gICAgbmV3IFJlZmVyZW5jZVByb2Nlc3NvcihTZW1hbnRpY3MuU09GVCk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFJlZmVyZW5jZVByb2Nlc3NvciB3ZWFrUmVmZXJlbmNlUHJvY2Vzc29yID0KLSAgICBuZXcgUmVmZXJlbmNlUHJvY2Vzc29yKFNlbWFudGljcy5XRUFLKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVmZXJlbmNlUHJvY2Vzc29yIHBoYW50b21SZWZlcmVuY2VQcm9jZXNzb3IgPQotICAgIG5ldyBSZWZlcmVuY2VQcm9jZXNzb3IoU2VtYW50aWNzLlBIQU5UT00pOwotICAKLSAgcHJpdmF0ZSBmaW5hbCBTZW1hbnRpY3Mgc2VtYW50aWNzOwotICBwcml2YXRlIGludCBTZW1hbnRpY3NOdW07Ci0KLSAgcHJpdmF0ZSBSZWZlcmVuY2VQcm9jZXNzb3IoU2VtYW50aWNzIHNlbWFudGljcykgewotICAgIHRoaXMuc2VtYW50aWNzID0gc2VtYW50aWNzOwotICAgIFNlbWFudGljc051bSA9IHNlbWFudGljcy5vcmRpbmFsKCk7Ci0gIH0KLSAgCi0gIC8qKiAKLSAgICogRmFjdG9yeSBtZXRob2QuCi0gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFwcHJvcHJpYXRlIHJlZmVyZW5jZSB0eXBlIHByb2Nlc3Nvci4KLSAgICogQHJldHVybiB0aGUgcmVmZXJlbmNlIHByb2Nlc3NvcgotICAgKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHVibGljIHN0YXRpYyBSZWZlcmVuY2VQcm9jZXNzb3IgZ2V0KFNlbWFudGljcyBzZW1hbnRpY3MpIHsKLSAgICBzd2l0Y2goc2VtYW50aWNzKSB7Ci0gICAgY2FzZSBXRUFLOiAgICByZXR1cm4gd2Vha1JlZmVyZW5jZVByb2Nlc3NvcjsKLSAgICBjYXNlIFNPRlQ6ICAgIHJldHVybiBzb2Z0UmVmZXJlbmNlUHJvY2Vzc29yOwotICAgIGNhc2UgUEhBTlRPTTogcmV0dXJuIHBoYW50b21SZWZlcmVuY2VQcm9jZXNzb3I7Ci0gICAgZGVmYXVsdDoKLSAgICAgIFZNLl9hc3NlcnQoZmFsc2UsIlVucmVjb2duaXplZCBzZW1hbnRpY3MiKTsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0gICAKLSAgfQotCi0gIC8qKgotICAgKiBTY2FuIHRocm91Z2ggYWxsIHJlZmVyZW5jZXMgYW5kIGZvcndhcmQuCi0gICAqCi0gICAqIENvbGxlY3RvcnMgbGlrZSBNYXJrQ29tcGFjdCBkZXRlcm1pbmUgbGl2ZW5lc3MgYW5kIG1vdmUgb2JqZWN0cwotICAgKiB1c2luZyBzZXBhcmF0ZSB0cmFjZXMuCi0gICAqCi0gICAqIEN1cnJlbnRseSBpZ25vcmVzIHRoZSBudXJzZXJ5IGhpbnQuCi0gICAqCi0gICAqIFRPRE8gcGFyYWxsZWxpc2UgdGhpcyBjb2RlCi0gICAqCi0gICAqIEBwYXJhbSB0cmFjZSBUaGUgdHJhY2UKLSAgICogQHBhcmFtIG51cnNlcnkgSXMgdGhpcyBhIG51cnNlcnkgY29sbGVjdGlvbiA/Ci0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIG5hdGl2ZSB2b2lkIGZvcndhcmQoVHJhY2VMb2NhbCB0cmFjZSwgYm9vbGVhbiBudXJzZXJ5KTsKLQotICAvKioKLSAgICogQ2xlYXIgdGhlIGNvbnRlbnRzIG9mIHRoZSB0YWJsZS4gVGhpcyBpcyBjYWxsZWQgd2hlbiByZWZlcmVuY2UgdHlwZXMgYXJlCi0gICAqIGRpc2FibGVkIHRvIG1ha2UgaXQgZWFzaWVyIGZvciBWTXMgdG8gY2hhbmdlIHRoaXMgc2V0dGluZyBhdCBydW50aW1lLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBuYXRpdmUgdm9pZCBjbGVhcigpOwotCi0gIC8qKgotICAgKiBTY2FuIHRocm91Z2ggdGhlIGxpc3Qgb2YgcmVmZXJlbmNlcy4gQ2FsbHMgUmVmZXJlbmNlUHJvY2Vzc29yJ3MKLSAgICogcHJvY2Vzc1JlZmVyZW5jZSBtZXRob2QgZm9yIGVhY2ggcmVmZXJlbmNlIGFuZCBidWlsZHMgYSBuZXcKLSAgICogbGlzdCBvZiB0aG9zZSByZWZlcmVuY2VzIHN0aWxsIGFjdGl2ZS4KLSAgICoKLSAgICogRGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiA8Y29kZT5udXJzZXJ5PC9jb2RlPiwgd2Ugd2lsbCBlaXRoZXIKLSAgICogc2NhbiBhbGwgcmVmZXJlbmNlcywgb3IganVzdCB0aG9zZSBjcmVhdGVkIHNpbmNlIHRoZSBsYXN0IHNjYW4uCi0gICAqCi0gICAqIFRPRE8gcGFyYWxsZWxpc2UgdGhpcyBjb2RlCi0gICAqCi0gICAqIEBwYXJhbSBudXJzZXJ5IFNjYW4gb25seSB0aGUgbmV3bHkgY3JlYXRlZCByZWZlcmVuY2VzCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIG5hdGl2ZSB2b2lkIHNjYW4oVHJhY2VMb2NhbCB0cmFjZSwgYm9vbGVhbiBudXJzZXJ5KTsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogU3RhdGlzdGljcyBhbmQgZGVidWdnaW5nCi0gICAqLwotCi0gIHB1YmxpYyBuYXRpdmUgaW50IGNvdW50V2FpdGluZ1JlZmVyZW5jZXMoKTsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL2ozL21tdGsvU2Nhbm5pbmcuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL2ozL21tdGsvU2Nhbm5pbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk2ZDRmMy4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9tbXRrL1NjYW5uaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNjYW5uaW5nLmphdmEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLXBhY2thZ2Ugb3JnLmozLm1tdGs7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYWNlTG9jYWw7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5UcmFuc2l0aXZlQ2xvc3VyZTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGZpbmFsIGNsYXNzIFNjYW5uaW5nIGV4dGVuZHMgb3JnLm1tdGsudm0uU2Nhbm5pbmcgewotICAKLSAgQElubGluZQotICBwdWJsaWMgbmF0aXZlIHZvaWQgc2Nhbk9iamVjdChUcmFuc2l0aXZlQ2xvc3VyZSB0cmFjZSwgT2JqZWN0UmVmZXJlbmNlIG9iamVjdCk7Ci0KLSAgLyoqCi0gICAqIEludm9rZSBhIHNwZWNpYWxpemVkIHNjYW4gbWV0aG9kLiBOb3RlIHRoYXQgdGhlc2UgbWV0aG9kcyBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQKLSAgICogZXhwbGljaXRseSB0aHJvdWdoIFBsYW4gYW5kIFBsYW5Db25zdHJhaW50cy4KLSAgICoKLSAgICogQHBhcmFtIGlkIFRoZSBzcGVjaWFsaXplZCBtZXRob2QgaWQKLSAgICogQHBhcmFtIHRyYWNlIFRoZSB0cmFjZSB0aGUgbWV0aG9kIGhhcyBiZWVuIHNwZWNpYWxpemVkIGZvcgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgc2Nhbm5lZAotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgbmF0aXZlIHZvaWQgc3BlY2lhbGl6ZWRTY2FuT2JqZWN0KGludCBpZCwgVHJhbnNpdGl2ZUNsb3N1cmUgdHJhY2UsIE9iamVjdFJlZmVyZW5jZSBvYmplY3QpOwotCi0KLSAgLyoqCi0gICAqIFByZWNvcHlpbmcgb2YgYSBvYmplY3QncyBmaWVsZHMsIHByb2Nlc3NpbmcgZWFjaCBwb2ludGVyIGZpZWxkIGVuY291bnRlcmVkLgotICAgKgotICAgKiBAcGFyYW0gdHJhY2UgVGhlIHRyYWNlIGJlaW5nIHVzZWQuCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBiZSBzY2FubmVkLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgbmF0aXZlIHZvaWQgcHJlY29weUNoaWxkcmVuKFRyYWNlTG9jYWwgdHJhY2UsIE9iamVjdFJlZmVyZW5jZSBvYmplY3QpOwotCi0gIC8qKgotICAgKiBQcmVwYXJlcyBmb3IgdXNpbmcgdGhlIDxjb2RlPmNvbXB1dGVBbGxSb290czwvY29kZT4gbWV0aG9kLiAgVGhlCi0gICAqIHRocmVhZCBjb3VudGVyIGFsbG93cyBtdWx0aXBsZSBHQyB0aHJlYWRzIHRvIGNvLW9wZXJhdGl2ZWx5Ci0gICAqIGl0ZXJhdGUgdGhyb3VnaCB0aGUgdGhyZWFkIGRhdGEgc3RydWN0dXJlIChpZiBsb2FkIGJhbGFuY2luZwotICAgKiBwYXJhbGxlbCBHQyB0aHJlYWRzIHdlcmUgbm90IGltcG9ydGFudCwgdGhlIHRocmVhZCBjb3VudGVyIGNvdWxkCi0gICAqIHNpbXBseSBiZSByZXBsYWNlZCBieSBhIGZvciBsb29wKS4KLSAgICovCi0gIHB1YmxpYyBuYXRpdmUgdm9pZCByZXNldFRocmVhZENvdW50ZXIoKTsKLQotICAvKioKLSAgICogUHJlLWNvcHkgYWxsIHBvdGVudGlhbGx5IG1vdmFibGUgaW5zdGFuY2VzIHVzZWQgaW4gdGhlIGNvdXJzZSBvZgotICAgKiBHQy4gIFRoaXMgaW5jbHVkZXMgdGhlIHRocmVhZCBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgR0MgdGhyZWFkcwotICAgKiB0aGVtc2VsdmVzLiAgSXQgaXMgY3J1Y2lhbCB0aGF0IHRoZXNlIGluc3RhbmNlcyBhcmUgZm9yd2FyZGVkCi0gICAqIDxpPnByaW9yPC9pPiB0byB0aGUgR0MgcHJvcGVyLiAgU2luY2UgdGhlc2UgaW5zdGFuY2VzIDxpPmFyZQotICAgKiBub3Q8L2k+IGVucXVldWVkIGZvciBzY2FubmluZywgaXQgaXMgaW1wb3J0YW50IHRoYXQgd2hlbiByb290cwotICAgKiBhcmUgY29tcHV0ZWQgdGhlIHNhbWUgaW5zdGFuY2VzIGFyZSBleHBsaWNpdGx5IHNjYW5uZWQgYW5kCi0gICAqIGluY2x1ZGVkIGluIHRoZSBzZXQgb2Ygcm9vdHMuICBUaGUgZXhpc3RlbmNlIG9mIHRoaXMgbWV0aG9kCi0gICAqIGFsbG93cyB0aGUgYWN0aW9ucyBvZiBjYWxjdWxhdGluZyByb290cyBhbmQgZm9yd2FyZGluZyBHQwotICAgKiBpbnN0YW5jZXMgdG8gYmUgZGVjb3VwbGVkLgotICAgKgotICAgKiBUaGUgdGhyZWFkIHRhYmxlIGlzIHNjYW5uZWQgaW4gcGFyYWxsZWwgYnkgZWFjaCBwcm9jZXNzb3IsIGJ5IHN0cmlkaW5nCi0gICAqIHRocm91Z2ggdGhlIHRhYmxlIGF0IGEgZ2FwIG9mIGNodW5rU2l6ZSpudW1Qcm9jcy4gIEZlZWwgZnJlZSB0byBhZGp1c3QKLSAgICogY2h1bmtTaXplIGlmIHlvdSB3YW50IHRvIHR1bmUgYSBwYXJhbGxlbCBjb2xsZWN0b3IuCi0gICAqCi0gICAqIEV4cGxpY2l0bHkgbm8taW5saW5lZCB0byBwcmV2ZW50IG92ZXItaW5saW5pbmcgb2YgY29sbGVjdGlvblBoYXNlLgotICAgKgotICAgKiBUT0RPIEV4cGVyaW1lbnQgd2l0aCBzcGVjaWFsaXphdGlvbiB0byByZW1vdmUgdmlydHVhbCBkaXNwYXRjaCA/Ci0gICAqLwotICBATm9JbmxpbmUKLSAgcHVibGljIG5hdGl2ZSB2b2lkIHByZUNvcHlHQ0luc3RhbmNlcyhUcmFjZUxvY2FsIHRyYWNlKTsKLQotICAvKioKLSAgICogQ29tcHV0ZXMgc3RhdGljIHJvb3RzLiAgVGhpcyBtZXRob2QgZXN0YWJsaXNoZXMgYWxsIHN1Y2ggcm9vdHMgZm9yCi0gICAqIGNvbGxlY3Rpb24gYW5kIHBsYWNlcyB0aGVtIGluIHRoZSByb290IGxvY2F0aW9ucyBxdWV1ZS4gIFRoaXMgbWV0aG9kCi0gICAqIHNob3VsZCBub3QgaGF2ZSBzaWRlIGVmZmVjdHMgKHN1Y2ggYXMgY29weWluZyBvciBmb3J3YXJkaW5nIG9mCi0gICAqIG9iamVjdHMpLiAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGltcG9ydGFudCBwcmVjb25kaXRpb25zOgotICAgKgotICAgKiA8dWw+Ci0gICAqIDxsaT4gQWxsIG9iamVjdHMgdXNlZCBpbiB0aGUgY291cnNlIG9mIEdDIChzdWNoIGFzIHRoZSBHQyB0aHJlYWQKLSAgICogb2JqZWN0cykgbmVlZCB0byBiZSAicHJlLWNvcGllZCIgcHJpb3IgdG8gY2FsbGluZyB0aGlzIG1ldGhvZC4KLSAgICogPGxpPiBUaGUgPGNvZGU+dGhyZWFkQ291bnRlcjwvY29kZT4gbXVzdCBiZSByZXNldCBzbyB0aGF0IGxvYWQKLSAgICogYmFsYW5jaW5nIHBhcmFsbGVsIEdDIGNhbiBzaGFyZSB0aGUgd29yayBvZiBzY2FubmluZyB0aHJlYWRzLgotICAgKiA8L3VsPgotICAgKgotICAgKiBAcGFyYW0gdHJhY2UgVGhlIHRyYWNlIHRvIHVzZSBmb3IgY29tcHV0aW5nIHJvb3RzLgotICAgKi8KLSAgcHVibGljIG5hdGl2ZSB2b2lkIGNvbXB1dGVTdGF0aWNSb290cyhUcmFjZUxvY2FsIHRyYWNlKTsKLQotICAvKioKLSAgICogQ29tcHV0ZXMgZ2xvYmFsIHJvb3RzLiAgVGhpcyBtZXRob2QgZXN0YWJsaXNoZXMgYWxsIHN1Y2ggcm9vdHMgZm9yCi0gICAqIGNvbGxlY3Rpb24gYW5kIHBsYWNlcyB0aGVtIGluIHRoZSByb290IGxvY2F0aW9ucyBxdWV1ZS4gIFRoaXMgbWV0aG9kCi0gICAqIHNob3VsZCBub3QgaGF2ZSBzaWRlIGVmZmVjdHMgKHN1Y2ggYXMgY29weWluZyBvciBmb3J3YXJkaW5nIG9mCi0gICAqIG9iamVjdHMpLiAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGltcG9ydGFudCBwcmVjb25kaXRpb25zOgotICAgKgotICAgKiA8dWw+Ci0gICAqIDxsaT4gQWxsIG9iamVjdHMgdXNlZCBpbiB0aGUgY291cnNlIG9mIEdDIChzdWNoIGFzIHRoZSBHQyB0aHJlYWQKLSAgICogb2JqZWN0cykgbmVlZCB0byBiZSAicHJlLWNvcGllZCIgcHJpb3IgdG8gY2FsbGluZyB0aGlzIG1ldGhvZC4KLSAgICogPGxpPiBUaGUgPGNvZGU+dGhyZWFkQ291bnRlcjwvY29kZT4gbXVzdCBiZSByZXNldCBzbyB0aGF0IGxvYWQKLSAgICogYmFsYW5jaW5nIHBhcmFsbGVsIEdDIGNhbiBzaGFyZSB0aGUgd29yayBvZiBzY2FubmluZyB0aHJlYWRzLgotICAgKiA8L3VsPgotICAgKgotICAgKiBAcGFyYW0gdHJhY2UgVGhlIHRyYWNlIHRvIHVzZSBmb3IgY29tcHV0aW5nIHJvb3RzLgotICAgKi8KLSAgcHVibGljIG5hdGl2ZSB2b2lkIGNvbXB1dGVHbG9iYWxSb290cyhUcmFjZUxvY2FsIHRyYWNlKTsKLQotICAvKioKLSAgICogQ29tcHV0ZXMgcm9vdHMgcG9pbnRlZCB0byBieSB0aHJlYWRzLCB0aGVpciBhc3NvY2lhdGVkIHJlZ2lzdGVycwotICAgKiBhbmQgc3RhY2tzLiAgVGhpcyBtZXRob2QgcGxhY2VzIHRoZXNlIHJvb3RzIGluIHRoZSByb290IHZhbHVlcywKLSAgICogcm9vdCBsb2NhdGlvbnMgYW5kIGludGVyaW9yIHJvb3QgbG9jYXRpb25zIHF1ZXVlcy4gIFRoaXMgbWV0aG9kCi0gICAqIHNob3VsZCBub3QgaGF2ZSBzaWRlIGVmZmVjdHMgKHN1Y2ggYXMgY29weWluZyBvciBmb3J3YXJkaW5nIG9mCi0gICAqIG9iamVjdHMpLiAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGltcG9ydGFudCBwcmVjb25kaXRpb25zOgotICAgKgotICAgKiA8dWw+Ci0gICAqIDxsaT4gQWxsIG9iamVjdHMgdXNlZCBpbiB0aGUgY291cnNlIG9mIEdDIChzdWNoIGFzIHRoZSBHQyB0aHJlYWQKLSAgICogb2JqZWN0cykgbmVlZCB0byBiZSAicHJlLWNvcGllZCIgcHJpb3IgdG8gY2FsbGluZyB0aGlzIG1ldGhvZC4KLSAgICogPGxpPiBUaGUgPGNvZGU+dGhyZWFkQ291bnRlcjwvY29kZT4gbXVzdCBiZSByZXNldCBzbyB0aGF0IGxvYWQKLSAgICogYmFsYW5jaW5nIHBhcmFsbGVsIEdDIGNhbiBzaGFyZSB0aGUgd29yayBvZiBzY2FubmluZyB0aHJlYWRzLgotICAgKiA8L3VsPgotICAgKgotICAgKiBUT0RPIHJld3JpdGUgdG8gYXZvaWQgdGhlIHBlci10aHJlYWQgc3luY2hyb25pemF0aW9uLCBsaWtlIHByZWNvcHkuCi0gICAqCi0gICAqIEBwYXJhbSB0cmFjZSBUaGUgdHJhY2UgdG8gdXNlIGZvciBjb21wdXRpbmcgcm9vdHMuCi0gICAqLwotICBwdWJsaWMgbmF0aXZlIHZvaWQgY29tcHV0ZVRocmVhZFJvb3RzKFRyYWNlTG9jYWwgdHJhY2UpOwotCi0gIC8qKgotICAgKiBDb21wdXRlIGFsbCByb290cyBvdXQgb2YgdGhlIFZNJ3MgYm9vdCBpbWFnZSAoaWYgYW55KS4gIFRoaXMgbWV0aG9kIGlzIGEgbm8tb3AKLSAgICogaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIFZNIGRvZXMgbm90IG1haW50YWluIGFuIE1NVGstdmlzaWJsZSBKYXZhIHNwYWNlLiAgIEhvd2V2ZXIsCi0gICAqIHdoZW4gdGhlIFZNIGRvZXMgbWFpbnRhaW4gYSBzcGFjZSAoc3VjaCBhcyBhIGJvb3QgaW1hZ2UpIHdoaWNoIGlzIHZpc2libGUgdG8gTU1UaywKLSAgICogdGhhdCBzcGFjZSBjb3VsZCBlaXRoZXIgYmUgc2Nhbm5lZCBieSBNTVRrIGFzIHBhcnQgb2YgaXRzIHRyYW5zaXRpdmUgY2xvc3VyZSBvdmVyCi0gICAqIHRoZSB3aG9sZSBoZWFwLCBvciBhcyBhIChjb25zaWRlcmFibGUpIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiwgTU1UayBjb3VsZCBhdm9pZAotICAgKiBzY2FubmluZyB0aGUgc3BhY2UgaWYgaXQgaXMgYXdhcmUgb2YgYWxsIHBvaW50ZXJzIG91dCBvZiB0aGF0IHNwYWNlLiAgVGhpcyBtZXRob2QKLSAgICogaXMgdXNlZCB0byBlc3RhYmxpc2ggdGhlIHJvb3Qgc2V0IG91dCBvZiB0aGUgc2Nhbm5hYmxlIHNwYWNlIGluIHRoZSBjYXNlIHdoZXJlCi0gICAqIHN1Y2ggYSBzcGFjZSBleGlzdHMuCi0gICAqCi0gICAqIEBwYXJhbSB0cmFjZSBUaGUgdHJhY2Ugb2JqZWN0IHRvIHVzZSB0byByZXBvcnQgcm9vdCBsb2NhdGlvbnMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBjb21wdXRlQm9vdEltYWdlUm9vdHMoVHJhY2VMb2NhbCB0cmFjZSkgewotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL2ozL21tdGsvU3RhdGlzdGljcy5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvajMvbW10ay9TdGF0aXN0aWNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZDU2NGQuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvajMvbW10ay9TdGF0aXN0aWNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdGF0aXN0aWNzLmphdmEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotcGFja2FnZSBvcmcuajMubW10azsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RhdGlzdGljcyBleHRlbmRzIG9yZy5tbXRrLnZtLlN0YXRpc3RpY3MgewotICAvKioKLSAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbGxlY3Rpb25zIHRoYXQgaGF2ZSBvY2N1cnJlZC4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGNvbGxlY3Rpb25zIHRoYXQgaGF2ZSBvY2N1cnJlZC4KLSAgICovCi0gIEBVbmludGVycnVwdGlibGUKLSAgcHVibGljIG5hdGl2ZSBpbnQgZ2V0Q29sbGVjdGlvbkNvdW50KCk7Ci0KLSAgLyoqCi0gICAqIFJlYWQgbmFub1RpbWUgKGhpZ2ggcmVzb2x1dGlvbiwgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIGNsb2NrKS4KLSAgICogSGFzIHNhbWUgc2VtYW50aWNzIGFzIGphdmEubGFuZy5TeXN0ZW0ubmFub1RpbWUoKS4KLSAgICovCi0gIHB1YmxpYyBuYXRpdmUgbG9uZyBuYW5vVGltZSgpOwotCi0gIC8qKgotICAgKiBSZWFkIGEgY3ljbGUgY291bnRlciAoaGlnaCByZXNvbHV0aW9uLCBub24tbW9ub3RvbmljIGNsb2NrKS4KLSAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgd2l0aCBjYXJlIGFzIHRoZSBjeWNsZSBjb3VudGVycyAoZXNwZWNpYWxseSBvbiBJQTMyIFNNUCBtYWNoaW5lcykKLSAgICogYXJlIG5vdCBhIHJlbGlhYmx5IHRpbWUgc291cmNlLgotICAgKi8KLSAgcHVibGljIG5hdGl2ZSBsb25nIGN5Y2xlcygpOwotCi0gIC8qKgotICAgKiBDb252ZXJ0IG5hbm9zZWNvbmRzIHRvIG1pbGxpc2Vjb25kcwotICAgKi8KLSAgcHVibGljIGRvdWJsZSBuYW5vc1RvTWlsbGlzKGxvbmcgYykgewotICAgIHJldHVybiAoKGRvdWJsZSljKS8xZTY7Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVydCBuYW5vc2Vjb25kcyB0byBzZWNvbmRzCi0gICAqLwotICBwdWJsaWMgZG91YmxlIG5hbm9zVG9TZWNzKGxvbmcgYykgewotICAgIHJldHVybiAoKGRvdWJsZSljKS8xZTk7Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVydCBtaWxsaXNlY29uZHMgdG8gbmFub3NlY29uZHMKLSAgICovCi0gIHB1YmxpYyBsb25nIG1pbGxpc1RvTmFub3MoZG91YmxlIHQpIHsKLSAgICByZXR1cm4gKGxvbmcpKHQgKiAxZTYpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlcnQgc2Vjb25kcyB0byBuYW5vc2Vjb25kcwotICAgKi8KLSAgcHVibGljIGxvbmcgc2Vjc1RvTmFub3MoZG91YmxlIHQpIHsKLSAgICByZXR1cm4gKGxvbmcpKHQgKiAxZTkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemUgcGVyZm9ybWFuY2UgZXZlbnRzCi0gICAqLwotICBASW50ZXJydXB0aWJsZQotICBwdWJsaWMgbmF0aXZlIHZvaWQgcGVyZkV2ZW50SW5pdChTdHJpbmcgZXZlbnRzKTsKLQotICAvKioKLSAgICogUmVhZCBhIHBlcmZvcm1hbmNlIGV2ZW50Ci0gICAqLwotICBwdWJsaWMgbmF0aXZlIHZvaWQgcGVyZkV2ZW50UmVhZChpbnQgaWQsIGxvbmdbXSB2YWx1ZXMpOwotfQotCmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9tbXRrL1N0cmluZ3MuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL2ozL21tdGsvU3RyaW5ncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGIyOWU1Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL2ozL21tdGsvU3RyaW5ncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0cmluZ3MuamF2YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLXBhY2thZ2Ugb3JnLmozLm1tdGs7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuVW5pbnRlcnJ1cHRpYmxlOwotCi0KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBmaW5hbCBjbGFzcyBTdHJpbmdzIGV4dGVuZHMgb3JnLm1tdGsudm0uU3RyaW5ncyB7Ci0gIC8qKgotICAgKiBMb2cgYSBtZXNzYWdlLgotICAgKgotICAgKiBAcGFyYW0gYyBjaGFyYWN0ZXIgYXJyYXkgd2l0aCBtZXNzYWdlIHN0YXJ0aW5nIGF0IGluZGV4IDAKLSAgICogQHBhcmFtIGxlbiBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBtZXNzYWdlCi0gICAqLwotICBwdWJsaWMgbmF0aXZlIHZvaWQgd3JpdGUoY2hhciBbXSBjLCBpbnQgbGVuKTsKLQotICAvKioKLSAgICogTG9nIGEgdGhyZWFkIGlkZW50aWZpZXIgYW5kIGEgbWVzc2FnZS4KLSAgICoKLSAgICogQHBhcmFtIGMgY2hhcmFjdGVyIGFycmF5IHdpdGggbWVzc2FnZSBzdGFydGluZyBhdCBpbmRleCAwCi0gICAqIEBwYXJhbSBsZW4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gbWVzc2FnZQotICAgKi8KLSAgcHVibGljIG5hdGl2ZSB2b2lkIHdyaXRlVGhyZWFkSWQoY2hhciBbXSBjLCBpbnQgbGVuKTsKLQotICAvKioKLSAgICogQ29waWVzIGNoYXJhY3RlcnMgZnJvbSB0aGUgc3RyaW5nIGludG8gdGhlIGNoYXJhY3RlciBhcnJheS4KLSAgICogVGhyZWFkIHN3aXRjaGluZyBpcyBkaXNhYmxlZCBkdXJpbmcgdGhpcyBtZXRob2QncyBleGVjdXRpb24uCi0gICAqIDxwPgotICAgKiA8Yj5UT0RPOjwvYj4gVGhlcmUgYXJlIHNwZWNpYWwgbWVtb3J5IG1hbmFnZW1lbnQgc2VtYW50aWNzIGhlcmUgdGhhdAotICAgKiBzb21lb25lIHNob3VsZCBkb2N1bWVudC4KLSAgICoKLSAgICogQHBhcmFtIHNyYyB0aGUgc291cmNlIHN0cmluZwotICAgKiBAcGFyYW0gZHN0IHRoZSBkZXN0aW5hdGlvbiBhcnJheQotICAgKiBAcGFyYW0gZHN0QmVnaW4gdGhlIHN0YXJ0IG9mZnNldCBpbiB0aGUgZGVzaW5hdGlvbiBhcnJheQotICAgKiBAcGFyYW0gZHN0RW5kIHRoZSBpbmRleCBhZnRlciB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlCi0gICAqIGRlc3RpbmF0aW9uIHRvIGNvcHkgdG8KLSAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29waWVkLgotICAgKi8KLSAgcHVibGljIG5hdGl2ZSBpbnQgY29weVN0cmluZ1RvQ2hhcnMoU3RyaW5nIHNyYywgY2hhciBbXSBkc3QsCi0gICAgICBpbnQgZHN0QmVnaW4sIGludCBkc3RFbmQpOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvajMvbW10ay9TeW5jaHJvbml6ZWRDb3VudGVyLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9tbXRrL1N5bmNocm9uaXplZENvdW50ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg0ZDk4Zi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9tbXRrL1N5bmNocm9uaXplZENvdW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLSBTeW5jaHJvbml6ZWRDb3VudGVyLmphdmEgLSBBdG9taWMgY291bnRlciAtLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi1wYWNrYWdlIG9yZy5qMy5tbXRrOwotCi0vKioKLSAqIEEgY291bnRlciB0aGF0IHN1cHBvcnRzIGF0b21pYyBpbmNyZW1lbnQgYW5kIHJlc2V0LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3luY2hyb25pemVkQ291bnRlciBleHRlbmRzIG9yZy5tbXRrLnZtLlN5bmNocm9uaXplZENvdW50ZXIgewotCi0gIHByaXZhdGUgaW50IGNvdW50ID0gMDsKLQotICBwdWJsaWMgbmF0aXZlIGludCByZXNldCgpOwotICAKLSAgcHVibGljIG5hdGl2ZSBpbnQgaW5jcmVtZW50KCk7Ci0KLSAgcHVibGljIGludCBwZWVrKCkgewotICAgIHJldHVybiBjb3VudDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9tbXRrL1RyYWNlSW50ZXJmYWNlLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9tbXRrL1RyYWNlSW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNTQ0MjcuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvajMvbW10ay9UcmFjZUludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUcmFjZUludGVyZmFjZS5qYXZhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLQotCi1wYWNrYWdlIG9yZy5qMy5tbXRrOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIENsYXNzIHRoYXQgc3VwcG9ydHMgc2Nhbm5pbmcgT2JqZWN0cyBvciBBcnJheXMgZm9yIHJlZmVyZW5jZXMKLSAqIGR1cmluZyB0cmFjaW5nLCBoYW5kbGluZyB0aG9zZSByZWZlcmVuY2VzLCBhbmQgY29tcHV0aW5nIGRlYXRoIHRpbWVzCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBjbGFzcyBUcmFjZUludGVyZmFjZSBleHRlbmRzIG9yZy5tbXRrLnZtLlRyYWNlSW50ZXJmYWNlIHsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBQdWJsaWMgTWV0aG9kcwotICAgKi8KLQotICAvKioKLSAgICogUmV0dXJucyBpZiB0aGUgVk0gaXMgcmVhZHkgZm9yIGEgZ2FyYmFnZSBjb2xsZWN0aW9uLgotICAgKgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIFZNIGlzIHJlYWR5IGZvciBHQywgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIG5hdGl2ZSBib29sZWFuIGdjRW5hYmxlZCgpOwotCi0gIC8qKgotICAgKiBUaGlzIGFkanVzdHMgdGhlIG9mZnNldCBpbnRvIGFuIG9iamVjdCB0byByZWZsZWN0IHdoYXQgaXQgd291bGQgbG9vayBsaWtlCi0gICAqIGlmIHRoZSBmaWVsZHMgd2VyZSBsYWlkIG91dCBpbiBtZW1vcnkgc3BhY2UgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIG9iamVjdAotICAgKiBwb2ludGVyLgotICAgKgotICAgKiBAcGFyYW0gaXNTY2FsYXIgSWYgdGhpcyBpcyBhIHBvaW50ZXIgc3RvcmUgdG8gYSBzY2FsYXIgb2JqZWN0Ci0gICAqIEBwYXJhbSBzcmMgVGhlIGFkZHJlc3Mgb2YgdGhlIHNvdXJjZSBvYmplY3QKLSAgICogQHBhcmFtIHNsb3QgVGhlIGFkZHJlc3Mgd2l0aGluIDxjb2RlPnNyYzwvY29kZT4gaW50byB3aGljaAotICAgKiB0aGUgdXBkYXRlIHdpbGwgYmUgc3RvcmVkCi0gICAqIEByZXR1cm4gVGhlIGVhc3kgdG8gdW5kZXJzdGFuZCBvZmZzZXQgb2YgdGhlIHNsb3QKLSAgICovCi0gIHB1YmxpYyBuYXRpdmUgT2Zmc2V0IGFkanVzdFNsb3RPZmZzZXQoYm9vbGVhbiBpc1NjYWxhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RSZWZlcmVuY2Ugc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3Mgc2xvdCk7Ci0KLSAgLyoqCi0gICAqIFRoaXMgc2tpcHMgb3ZlciB0aGUgZnJhbWVzIGFkZGVkIGJ5IHRoZSB0cmFjaW5nIGFsZ29yaXRobSwgb3V0cHV0cwotICAgKiBpbmZvcm1hdGlvbiBpZGVudGlmeWluZyB0aGUgbWV0aG9kIHRoZSBjb250YWludHMgdGhlICJuZXciIGNhbGwgdHJpZ2dlcmluZwotICAgKiB0aGUgYWxsb2NhdGlvbiwgYW5kIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG5vbi10cmFjZSwgbm9uLWFsbG9jCi0gICAqIHN0YWNrIGZyYW1lLgotICAgKgotICAgKkBwYXJhbSB0eXBlUmVmIFRoZSB0eXBlIHJlZmVyZW5jZSAodGliKSBvZiB0aGUgb2JqZWN0IGp1c3QgYWxsb2NhdGVkCi0gICAqIEByZXR1cm4gVGhlIGZyYW1lIHBvaW50ZXIgYWRkcmVzcyBmb3IgdGhlIG1ldGhvZCB0aGF0IGFsbG9jYXRlZCB0aGUgb2JqZWN0Ci0gICAqLwotICBASW50ZXJydXB0aWJsZQotICBwdWJsaWMgbmF0aXZlIEFkZHJlc3Mgc2tpcE93bkZyYW1lc0FuZER1bXAoT2JqZWN0UmVmZXJlbmNlIHR5cGVSZWYpOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBXcmFwcGVyIG1ldGhvZHMKLSAgICovCi0gIHB1YmxpYyBuYXRpdmUgdm9pZCB1cGRhdGVEZWF0aFRpbWUoT2JqZWN0UmVmZXJlbmNlIG9iaik7Ci0gIHB1YmxpYyBuYXRpdmUgdm9pZCBzZXREZWF0aFRpbWUoT2JqZWN0UmVmZXJlbmNlIHJlZiwgV29yZCB0aW1lXyk7Ci0gIHB1YmxpYyBuYXRpdmUgdm9pZCBzZXRMaW5rKE9iamVjdFJlZmVyZW5jZSByZWYsIE9iamVjdFJlZmVyZW5jZSBsaW5rKTsKLSAgcHVibGljIG5hdGl2ZSB2b2lkIHVwZGF0ZVRpbWUoV29yZCB0aW1lXyk7Ci0gIHB1YmxpYyBuYXRpdmUgV29yZCBnZXRPSUQoT2JqZWN0UmVmZXJlbmNlIHJlZik7Ci0gIHB1YmxpYyBuYXRpdmUgV29yZCBnZXREZWF0aFRpbWUoT2JqZWN0UmVmZXJlbmNlIHJlZik7Ci0gIHB1YmxpYyBuYXRpdmUgT2JqZWN0UmVmZXJlbmNlIGdldExpbmsoT2JqZWN0UmVmZXJlbmNlIHJlZik7Ci0gIHB1YmxpYyBuYXRpdmUgQWRkcmVzcyBnZXRCb290SW1hZ2VMaW5rKCk7Ci0gIHB1YmxpYyBuYXRpdmUgV29yZCBnZXRPSUQoKTsKLSAgcHVibGljIG5hdGl2ZSB2b2lkIHNldE9JRChXb3JkIG9pZCk7Ci0gIHB1YmxpYyBuYXRpdmUgaW50IGdldEhlYWRlclNpemUoKTsKLSAgcHVibGljIG5hdGl2ZSBpbnQgZ2V0SGVhZGVyRW5kT2Zmc2V0KCk7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9vcHRpb25zL09wdGlvblNldC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvajMvb3B0aW9ucy9PcHRpb25TZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIyM2M0My4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9vcHRpb25zL09wdGlvblNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPcHRpb25TZXQuamF2YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi1wYWNrYWdlIG9yZy5qMy5vcHRpb25zOwotCi0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkNvbnN0YW50czsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuVW5pbnRlcnJ1cHRpYmxlOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuRXh0ZW50OwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuV29yZDsKLWltcG9ydCBvcmcudm11dGlsLm9wdGlvbnMuQWRkcmVzc09wdGlvbjsKLWltcG9ydCBvcmcudm11dGlsLm9wdGlvbnMuQm9vbGVhbk9wdGlvbjsKLWltcG9ydCBvcmcudm11dGlsLm9wdGlvbnMuRW51bU9wdGlvbjsKLWltcG9ydCBvcmcudm11dGlsLm9wdGlvbnMuRmxvYXRPcHRpb247Ci1pbXBvcnQgb3JnLnZtdXRpbC5vcHRpb25zLkludE9wdGlvbjsKLWltcG9ydCBvcmcudm11dGlsLm9wdGlvbnMuTWljcm9zZWNvbmRzT3B0aW9uOwotaW1wb3J0IG9yZy52bXV0aWwub3B0aW9ucy5PcHRpb247Ci1pbXBvcnQgb3JnLnZtdXRpbC5vcHRpb25zLlBhZ2VzT3B0aW9uOwotaW1wb3J0IG9yZy52bXV0aWwub3B0aW9ucy5TdHJpbmdPcHRpb247Ci0KLWltcG9ydCBvcmcuamlrZXNydm0uU2l6ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuajMucnVudGltZS5WTTsKLQotLyoqCi0gKiBDbGFzcyB0byBoYW5kbGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBhbmQgb3B0aW9ucyBmb3IgR0MuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBPcHRpb25TZXQgZXh0ZW5kcyBvcmcudm11dGlsLm9wdGlvbnMuT3B0aW9uU2V0IHsKLQotICBwcml2YXRlIFN0cmluZyBwcmVmaXg7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBPcHRpb25TZXQgZ2MgPSBuZXcgT3B0aW9uU2V0KCItWDpnYyIpOwotCi0gIHByaXZhdGUgT3B0aW9uU2V0KFN0cmluZyBwcmVmaXgpIHsKLSAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKLSAgfQotCi0gIC8qKgotICAgKiBGb3JtYXQgYW5kIGxvZyBhbiBvcHRpb24gdmFsdWUuCi0gICAqCi0gICAqIEBwYXJhbSBvIFRoZSBvcHRpb24uCi0gICAqIEBwYXJhbSBmb3JYbWwgSXMgdGhpcyBwYXJ0IG9mIHhtbCBvdXRwdXQ/Ci0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBsb2dWYWx1ZShPcHRpb24gbywgYm9vbGVhbiBmb3JYbWwpIHsKLSAgICBzd2l0Y2ggKG8uZ2V0VHlwZSgpKSB7Ci0gICAgY2FzZSBPcHRpb24uQk9PTEVBTl9PUFRJT046Ci0gICAgICBWTS5zeXNXcml0ZSgoKEJvb2xlYW5PcHRpb24pIG8pLmdldFZhbHVlKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT3B0aW9uLklOVF9PUFRJT046Ci0gICAgICBWTS5zeXNXcml0ZSgoKEludE9wdGlvbikgbykuZ2V0VmFsdWUoKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9wdGlvbi5BRERSRVNTX09QVElPTjoKLSAgICAgIFZNLnN5c1dyaXRlKCgoQWRkcmVzc09wdGlvbikgbykuZ2V0VmFsdWUoKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9wdGlvbi5GTE9BVF9PUFRJT046Ci0gICAgICBWTS5zeXNXcml0ZSgoKEZsb2F0T3B0aW9uKSBvKS5nZXRWYWx1ZSgpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT3B0aW9uLk1JQ1JPU0VDT05EU19PUFRJT046Ci0gICAgICBWTS5zeXNXcml0ZSgoKE1pY3Jvc2Vjb25kc09wdGlvbikgbykuZ2V0TWljcm9zZWNvbmRzKCkpOwotICAgICAgVk0uc3lzV3JpdGUoIiB1c2VjIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9wdGlvbi5QQUdFU19PUFRJT046Ci0gICAgICBWTS5zeXNXcml0ZSgoKFBhZ2VzT3B0aW9uKSBvKS5nZXRCeXRlcygpKTsKLSAgICAgIFZNLnN5c1dyaXRlKCIgYnl0ZXMiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT3B0aW9uLlNUUklOR19PUFRJT046Ci0gICAgICBWTS5zeXNXcml0ZSgoKFN0cmluZ09wdGlvbikgbykuZ2V0VmFsdWUoKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9wdGlvbi5FTlVNX09QVElPTjoKLSAgICAgIFZNLnN5c1dyaXRlKCgoRW51bU9wdGlvbikgbykuZ2V0VmFsdWVTdHJpbmcoKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogTG9nIGEgc3RyaW5nLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgbG9nU3RyaW5nKFN0cmluZyBzKSB7Ci0gICAgVk0uc3lzV3JpdGUocyk7Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnQgYSBuZXcgbGluZS4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGxvZ05ld0xpbmUoKSB7Ci0gICAgVk0uc3lzV3JpdGVsbigpOwotICB9Ci0KLSAgLyoqCi0gICAqIERldGVybWluZSB0aGUgVk0gc3BlY2lmaWMga2V5IGZvciBhIGdpdmVuIG9wdGlvbiBuYW1lLiBPcHRpb24gbmFtZXMgYXJlCi0gICAqIHNwYWNlIGRlbGltaXRlZCB3aXRoIGNhcGl0YWxpc2VkIHdvcmRzIChlLmcuICJHQyBWZXJib3NpdHkgTGV2ZWwiKS4KLSAgICoKLSAgICogQHBhcmFtIG5hbWUgVGhlIG9wdGlvbiBuYW1lLgotICAgKiBAcmV0dXJuIFRoZSBWTSBzcGVjaWZpYyBrZXkuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVLZXkoU3RyaW5nIG5hbWUpIHsKLSAgICBpbnQgc3BhY2UgPSBuYW1lLmluZGV4T2YoJyAnKTsKLSAgICBpZiAoc3BhY2UgPCAwKSByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpOwotCi0gICAgU3RyaW5nIHdvcmQgPSBuYW1lLnN1YnN0cmluZygwLCBzcGFjZSk7Ci0gICAgU3RyaW5nIGtleSA9IHdvcmQudG9Mb3dlckNhc2UoKTsKLQotICAgIGRvIHsKLSAgICAgIGludCBvbGQgPSBzcGFjZSsxOwotICAgICAgc3BhY2UgPSBuYW1lLmluZGV4T2YoJyAnLCBvbGQpOwotICAgICAgaWYgKHNwYWNlIDwgMCkgewotICAgICAgICBrZXkgKz0gbmFtZS5zdWJzdHJpbmcob2xkKTsKLSAgICAgICAgcmV0dXJuIGtleTsKLSAgICAgIH0KLSAgICAgIGtleSArPSBuYW1lLnN1YnN0cmluZyhvbGQsIHNwYWNlKTsKLSAgICB9IHdoaWxlICh0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBBIG5vbi1mYXRhbCBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIHNldHRpbmcgb2YgYW4gb3B0aW9uLiBUaGlzIG1ldGhvZAotICAgKiBjYWxscyBpbnRvIHRoZSBWTSBhbmQgc2hhbGwgbm90IGNhdXNlIHRoZSBzeXN0ZW0gdG8gc3RvcC4KLSAgICoKLSAgICogQHBhcmFtIG8gVGhlIHJlc3BvbnNpYmxlIG9wdGlvbi4KLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXJuaW5nLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgd2FybihPcHRpb24gbywgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICBWTS5zeXNXcml0ZWxuKCJXQVJOSU5HOiBPcHRpb24gJyIgKyBvLmdldEtleSgpICsgIicgOiAiICsgbWVzc2FnZSk7Ci0gIH0KLQotICAvKioKLSAgICogQSBmYXRhbCBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIHNldHRpbmcgb2YgYW4gb3B0aW9uLiBUaGlzIG1ldGhvZAotICAgKiBjYWxscyBpbnRvIHRoZSBWTSBhbmQgaXMgcmVxdWlyZWQgdG8gY2F1c2UgdGhlIHN5c3RlbSB0byBzdG9wLgotICAgKgotICAgKiBAcGFyYW0gbyBUaGUgcmVzcG9uc2libGUgb3B0aW9uLgotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGZhaWx1cmUuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBmYWlsKE9wdGlvbiBvLCBTdHJpbmcgbWVzc2FnZSkgewotICAgIFZNLnN5c0ZhaWwoIkVSUk9SOiBPcHRpb24gJyIgKyBvLmdldEtleSgpICsgIicgOiAiICsgbWVzc2FnZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVydCBieXRlcyBpbnRvIHBhZ2VzLCByb3VuZGluZyB1cCBpZiBuZWNlc3NhcnkuCi0gICAqCi0gICAqIEBwYXJhbSBieXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzLgotICAgKiBAcmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIG51bWJlciBvZiBwYWdlcy4KLSAgICovCi0gIEBVbmludGVycnVwdGlibGUKLSAgcHJvdGVjdGVkIGludCBieXRlc1RvUGFnZXMoRXh0ZW50IGJ5dGVzKSB7Ci0gICAgcmV0dXJuIGJ5dGVzLnBsdXMoQ29uc3RhbnRzLkJZVEVTX0lOX1BBR0UtMSkudG9Xb3JkKCkucnNobChDb25zdGFudHMuTE9HX0JZVEVTX0lOX1BBR0UpLnRvSW50KCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVydCBmcm9tIHBhZ2VzIGludG8gYnl0ZXMuCi0gICAqIEBwYXJhbSBwYWdlcyB0aGUgbnVtYmVyIG9mIHBhZ2VzLgotICAgKiBAcmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIG51bWJlciBvZiBieXRlcy4KLSAgICovCi0gIEBVbmludGVycnVwdGlibGUKLSAgcHJvdGVjdGVkIEV4dGVudCBwYWdlc1RvQnl0ZXMoaW50IHBhZ2VzKSB7Ci0gICAgcmV0dXJuIFdvcmQuZnJvbUludFplcm9FeHRlbmQocGFnZXMpLmxzaChDb25zdGFudHMuTE9HX0JZVEVTX0lOX1BBR0UpLnRvRXh0ZW50KCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL2ozL3J1bnRpbWUvVk0uamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL2ozL3J1bnRpbWUvVk0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVkYWUwZS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qMy9ydW50aW1lL1ZNLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVk0uamF2YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotCi1wYWNrYWdlIG9yZy5qMy5ydW50aW1lOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC5BZGRyZXNzOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuRXh0ZW50OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVk0gewotCi0gIHByaXZhdGUgbmF0aXZlIHN0YXRpYyBib29sZWFuIHZlcmlmeUFzc2VydGlvbnMoKTsKLSAgcHJpdmF0ZSBuYXRpdmUgc3RhdGljIGJvb2xlYW4gYnVpbGRGb3JJQTMyKCk7Ci0gIHByaXZhdGUgbmF0aXZlIHN0YXRpYyBib29sZWFuIGJ1aWxkRm9yNjRBZGRyKCk7Ci0KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIE5PVF9SRUFDSEVEID0gZmFsc2U7Ci0KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIFZlcmlmeUFzc2VydGlvbnMgPSB2ZXJpZnlBc3NlcnRpb25zKCk7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBydW5uaW5nVk0gPSBmYWxzZTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIEJ1aWxkRm9ySUEzMiA9IGJ1aWxkRm9ySUEzMigpOwotICBwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gQnVpbGRGb3I2NEFkZHIgPSBidWlsZEZvcjY0QWRkcigpOwotCi0KLSAgcHVibGljIG5hdGl2ZSBzdGF0aWMgdm9pZCBzeXNGYWlsKFN0cmluZyBhKTsKLSAgcHVibGljIG5hdGl2ZSBzdGF0aWMgdm9pZCBzeXNFeGl0KGludCBhKTsKLSAgcHVibGljIG5hdGl2ZSBzdGF0aWMgdm9pZCBfYXNzZXJ0KGJvb2xlYW4gY29uZCk7Ci0gIHB1YmxpYyBuYXRpdmUgc3RhdGljIHZvaWQgX2Fzc2VydChib29sZWFuIGNvbmQsIFN0cmluZyBtc2cpOwotICBwdWJsaWMgbmF0aXZlIHN0YXRpYyB2b2lkIHN5c1dyaXRlbG4oU3RyaW5nIGEpOwotICBwdWJsaWMgbmF0aXZlIHN0YXRpYyB2b2lkIHN5c1dyaXRlbG4oKTsKLSAgcHVibGljIG5hdGl2ZSBzdGF0aWMgdm9pZCBzeXNXcml0ZShTdHJpbmcgYSk7Ci0gIHB1YmxpYyBuYXRpdmUgc3RhdGljIHZvaWQgc3lzV3JpdGUoaW50IGEpOwotICBwdWJsaWMgbmF0aXZlIHN0YXRpYyB2b2lkIHN5c1dyaXRlKGZsb2F0IGEpOwotICBwdWJsaWMgbmF0aXZlIHN0YXRpYyB2b2lkIHN5c1dyaXRlKEFkZHJlc3MgYSk7Ci0gIHB1YmxpYyBuYXRpdmUgc3RhdGljIHZvaWQgc3lzV3JpdGUoRXh0ZW50IGEpOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvamlrZXNydm0vTWFnaWMuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL2ppa2VzcnZtL01hZ2ljLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMzllYWIuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvamlrZXNydm0vTWFnaWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5MiArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLmppa2VzcnZtOwotCi1pbXBvcnQgb3JnLmozLnJ1bnRpbWUuVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5JbnRyaW5zaWM7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLkVudHJ5cG9pbnQ7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLlVuaW50ZXJydXB0aWJsZTsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLkFkZHJlc3M7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC5FeHRlbnQ7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC5PZmZzZXQ7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC5Xb3JkOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuV29yZEFycmF5OwotCi0vKioKLSAqIE1hZ2ljIG1ldGhvZHMgZm9yIGFjY2Vzc2luZyByYXcgbWFjaGluZSBtZW1vcnksIHJlZ2lzdGVycywgYW5kCi0gKiBvcGVyYXRpbmcgc3lzdGVtIGNhbGxzLgotICoKLSAqIDxwPiBUaGVzZSBhcmUgImlubGluZSBhc3NlbWJsZXIgZnVuY3Rpb25zIiB0aGF0IGNhbm5vdCBiZSBpbXBsZW1lbnRlZCBpbgotICogSmF2YSBjb2RlLiBUaGVpciBuYW1lcyBhcmUgcmVjb2duaXplZCBieSBSVk0ncyBjb21waWxlcnMKLSAqIGFuZCBjYXVzZSBpbmxpbmUgbWFjaGluZSBjb2RlIHRvIGJlIGdlbmVyYXRlZCBpbnN0ZWFkIG9mCi0gKiBhY3R1YWwgbWV0aG9kIGNhbGxzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCi1ASW50cmluc2ljCi1wdWJsaWMgZmluYWwgY2xhc3MgTWFnaWMgewotCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KLSAgLy8gICAgICAgICAgIE1lbW9yeSBBY2Nlc3MuICAgICAgICAgICAgICAvLwotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0KLSAgLyoqCi0gICAqIEdldCB1bnNpZ25lZCBieXRlIGF0IGFyYml0cmFyeSAoYnl0ZSkgb2Zmc2V0IGZyb20gb2JqZWN0LiBUaGUKLSAgICogbW9zdCBzaWduaWZpY2FudCAyNGJpdHMgb2YgdGhlIHJlc3VsdCB3aWxsIGJlIDAuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJ5dGUgZ2V0VW5zaWduZWRCeXRlQXRPZmZzZXQoT2JqZWN0IG9iamVjdCwgT2Zmc2V0IG9mZnNldCkgewotICAgIGlmIChWTS5WZXJpZnlBc3NlcnRpb25zKSBWTS5fYXNzZXJ0KFZNLk5PVF9SRUFDSEVEKTsgIC8vIGNhbGwgc2l0ZSBzaG91bGQgaGF2ZSBiZWVuIGhpamFja2VkIGJ5IG1hZ2ljIGluIGNvbXBpbGVyCi0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBieXRlIGF0IGFyYml0cmFyeSAoYnl0ZSkgb2Zmc2V0IGZyb20gb2JqZWN0LiBUaGUgbW9zdAotICAgKiBzaWduaWZpY2FudCAyNGJpdHMgb2YgdGhlIHJlc3VsdCB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBtb3N0Ci0gICAqIHNpZ25pZmljYW50IGJpdCBpbiB0aGUgYnl0ZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYnl0ZSBnZXRCeXRlQXRPZmZzZXQoT2JqZWN0IG9iamVjdCwgT2Zmc2V0IG9mZnNldCkgewotICAgIGlmIChWTS5WZXJpZnlBc3NlcnRpb25zKSBWTS5fYXNzZXJ0KFZNLk5PVF9SRUFDSEVEKTsgIC8vIGNhbGwgc2l0ZSBzaG91bGQgaGF2ZSBiZWVuIGhpamFja2VkIGJ5IG1hZ2ljIGluIGNvbXBpbGVyCi0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBjaGFyIGF0IGFyYml0cmFyeSAoYnl0ZSkgb2Zmc2V0IGZyb20gb2JqZWN0LiBUaGUgbW9zdAotICAgKiBzaWduaWZpY2FudCAxNmJpdHMgd2lsbCBiZSAwLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjaGFyIGdldENoYXJBdE9mZnNldChPYmplY3Qgb2JqZWN0LCBPZmZzZXQgb2Zmc2V0KSB7Ci0gICAgaWYgKFZNLlZlcmlmeUFzc2VydGlvbnMpIFZNLl9hc3NlcnQoVk0uTk9UX1JFQUNIRUQpOyAgLy8gY2FsbCBzaXRlIHNob3VsZCBoYXZlIGJlZW4gaGlqYWNrZWQgYnkgbWFnaWMgaW4gY29tcGlsZXIKLSAgICByZXR1cm4gKGNoYXIpIC0xOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBzaG9ydCBhdCBhcmJpdHJhcnkgKGJ5dGUpIG9mZnNldCBmcm9tIG9iamVjdC4gVGhlIG1vc3QKLSAgICogc2lnbmlmaWNhbnQgMTZiaXRzIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0Ci0gICAqIGluIHRoZSBzaG9ydC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgc2hvcnQgZ2V0U2hvcnRBdE9mZnNldChPYmplY3Qgb2JqZWN0LCBPZmZzZXQgb2Zmc2V0KSB7Ci0gICAgaWYgKFZNLlZlcmlmeUFzc2VydGlvbnMpIFZNLl9hc3NlcnQoVk0uTk9UX1JFQUNIRUQpOyAgLy8gY2FsbCBzaXRlIHNob3VsZCBoYXZlIGJlZW4gaGlqYWNrZWQgYnkgbWFnaWMgaW4gY29tcGlsZXIKLSAgICByZXR1cm4gKHNob3J0KSAtMTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgaW50IGF0IGFyYml0cmFyeSAoYnl0ZSkgb2Zmc2V0IGZyb20gb2JqZWN0LgotICAgKiBVc2UgZ2V0SW50QXRPZmZzZXQob2JqLCBvZnMpIGluc3RlYWQgb2YgZ2V0TWVtb3J5SW50KG9iamVjdEFzQWRkcmVzcyhvYmopK29mcykKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGdldEludEF0T2Zmc2V0KE9iamVjdCBvYmplY3QsIE9mZnNldCBvZmZzZXQpIHsKLSAgICBpZiAoVk0uVmVyaWZ5QXNzZXJ0aW9ucykgVk0uX2Fzc2VydChWTS5OT1RfUkVBQ0hFRCk7ICAvLyBjYWxsIHNpdGUgc2hvdWxkIGhhdmUgYmVlbiBoaWphY2tlZCBieSBtYWdpYyBpbiBjb21waWxlcgotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgbG9uZyBhdCBhcmJpdHJhcnkgKGJ5dGUpIG9mZnNldCBmcm9tIG9iamVjdC4KLSAgICogVXNlIGdldGxvbmdBdE9mZnNldChvYmosIG9mcykgaW5zdGVhZCBvZiB0d28gZ2V0SW50QXRPZmZzZXQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRMb25nQXRPZmZzZXQoT2JqZWN0IG9iamVjdCwgT2Zmc2V0IG9mZnNldCkgewotICAgIGlmIChWTS5WZXJpZnlBc3NlcnRpb25zKSBWTS5fYXNzZXJ0KFZNLk5PVF9SRUFDSEVEKTsgIC8vIGNhbGwgc2l0ZSBzaG91bGQgaGF2ZSBiZWVuIGhpamFja2VkIGJ5IG1hZ2ljIGluIGNvbXBpbGVyCi0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBmbG9hdCBhdCBhcmJpdHJhcnkgKGJ5dGUpIG9mZnNldCBmcm9tIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmxvYXQgZ2V0RmxvYXRBdE9mZnNldChPYmplY3Qgb2JqZWN0LCBPZmZzZXQgb2Zmc2V0KSB7Ci0gICAgaWYgKFZNLlZlcmlmeUFzc2VydGlvbnMpIFZNLl9hc3NlcnQoVk0uTk9UX1JFQUNIRUQpOyAgLy8gY2FsbCBzaXRlIHNob3VsZCBoYXZlIGJlZW4gaGlqYWNrZWQgYnkgbWFnaWMgaW4gY29tcGlsZXIKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGRvdWJsZSBhdCBhcmJpdHJhcnkgKGJ5dGUpIG9mZnNldCBmcm9tIG9iamVjdC4KLSAgICogVXNlIGdldERvdWJsZUF0T2Zmc2V0KG9iaiwgb2ZzKSBpbnN0ZWFkIG9mIHR3byBnZXRJbnRBdE9mZnNldAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBkb3VibGUgZ2V0RG91YmxlQXRPZmZzZXQoT2JqZWN0IG9iamVjdCwgT2Zmc2V0IG9mZnNldCkgewotICAgIGlmIChWTS5WZXJpZnlBc3NlcnRpb25zKSBWTS5fYXNzZXJ0KFZNLk5PVF9SRUFDSEVEKTsgIC8vIGNhbGwgc2l0ZSBzaG91bGQgaGF2ZSBiZWVuIGhpamFja2VkIGJ5IG1hZ2ljIGluIGNvbXBpbGVyCi0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBPYmplY3QgYXQgYXJiaXRyYXJ5IChieXRlKSBvZmZzZXQgZnJvbSBvYmplY3QuCi0gICAqIFVzZSBnZXRPYmplY3RBdE9mZnNldChvYmosIG9mcykgaW5zdGVhZCBvZgotICAgKiBhZGRyZXNzQXNPYmplY3QoZ2V0TWVtb3J5QWRkcmVzcyhvYmplY3RBc0FkZHJlc3Mob2JqKStvZnMpKQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0T2JqZWN0QXRPZmZzZXQoT2JqZWN0IG9iamVjdCwgT2Zmc2V0IG9mZnNldCkgewotICAgIGlmIChWTS5WZXJpZnlBc3NlcnRpb25zKSBWTS5fYXNzZXJ0KFZNLk5PVF9SRUFDSEVEKTsgIC8vIGNhbGwgc2l0ZSBzaG91bGQgaGF2ZSBiZWVuIGhpamFja2VkIGJ5IG1hZ2ljIGluIGNvbXBpbGVyCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IE9iamVjdCBhdCBhcmJpdHJhcnkgKGJ5dGUpIG9mZnNldCBmcm9tIG9iamVjdC4KLSAgICogVXNlIGdldE9iamVjdEF0T2Zmc2V0KG9iaiwgb2ZzKSBpbnN0ZWFkIG9mCi0gICAqIGFkZHJlc3NBc09iamVjdChnZXRNZW1vcnlBZGRyZXNzKG9iamVjdEFzQWRkcmVzcyhvYmopK29mcykpCi0gICAqLwotICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRPYmplY3RBdE9mZnNldChPYmplY3Qgb2JqZWN0LCBPZmZzZXQgb2Zmc2V0LCBpbnQgbG9jYXRpb25NZXRhZGF0YSkgewotICAgIGlmIChWTS5WZXJpZnlBc3NlcnRpb25zKSBWTS5fYXNzZXJ0KFZNLk5PVF9SRUFDSEVEKTsgIC8vIGNhbGwgc2l0ZSBzaG91bGQgaGF2ZSBiZWVuIGhpamFja2VkIGJ5IG1hZ2ljIGluIGNvbXBpbGVyCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IFdvcmQgYXQgYXJiaXRyYXJ5IChieXRlKSBvZmZzZXQgZnJvbSBvYmplY3QuCi0gICAqIFVzZSBnZXRXb3JkQXRPZmZzZXQob2JqLCBvZnMpIGluc3RlYWQgb2YgZ2V0TWVtb3J5V29yZChvYmplY3RBc0FkZHJlc3Mob2JqKStvZnMpCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFdvcmQgZ2V0V29yZEF0T2Zmc2V0KE9iamVjdCBvYmplY3QsIE9mZnNldCBvZmZzZXQpIHsKLSAgICBpZiAoVk0uVmVyaWZ5QXNzZXJ0aW9ucykgVk0uX2Fzc2VydChWTS5OT1RfUkVBQ0hFRCk7ICAvLyBjYWxsIHNpdGUgc2hvdWxkIGhhdmUgYmVlbiBoaWphY2tlZCBieSBtYWdpYyBpbiBjb21waWxlcgotICAgIHJldHVybiBXb3JkLm1heCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBXb3JkIGF0IGFyYml0cmFyeSAoYnl0ZSkgb2Zmc2V0IGZyb20gb2JqZWN0LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBXb3JkIGdldFdvcmRBdE9mZnNldChPYmplY3Qgb2JqZWN0LCBPZmZzZXQgb2Zmc2V0LCBpbnQgbG9jYXRpb25NZXRhZGF0YSkgewotICAgIGlmIChWTS5WZXJpZnlBc3NlcnRpb25zKSBWTS5fYXNzZXJ0KFZNLk5PVF9SRUFDSEVEKTsgIC8vIGNhbGwgc2l0ZSBzaG91bGQgaGF2ZSBiZWVuIGhpamFja2VkIGJ5IG1hZ2ljIGluIGNvbXBpbGVyCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IEFkZHJlc3MgYXQgYXJiaXRyYXJ5IChieXRlKSBvZmZzZXQgZnJvbSBvYmplY3QuCi0gICAqIFVzZSBnZXRBZGRyZXNzQXRPZmZzZXQob2JqLCBvZnMpIGluc3RlYWQgb2YgZ2V0TWVtb3J5V29yZChvYmplY3RBc0FkZHJlc3Mob2JqKStvZnMpCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEFkZHJlc3MgZ2V0QWRkcmVzc0F0T2Zmc2V0KE9iamVjdCBvYmplY3QsIE9mZnNldCBvZmZzZXQpIHsKLSAgICBpZiAoVk0uVmVyaWZ5QXNzZXJ0aW9ucykgVk0uX2Fzc2VydChWTS5OT1RfUkVBQ0hFRCk7ICAvLyBjYWxsIHNpdGUgc2hvdWxkIGhhdmUgYmVlbiBoaWphY2tlZCBieSBtYWdpYyBpbiBjb21waWxlcgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBBZGRyZXNzIGF0IGFyYml0cmFyeSAoYnl0ZSkgb2Zmc2V0IGZyb20gb2JqZWN0LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBBZGRyZXNzIGdldEFkZHJlc3NBdE9mZnNldChPYmplY3Qgb2JqZWN0LCBPZmZzZXQgb2Zmc2V0LCBpbnQgbG9jYXRpb25NZXRhZGF0YSkgewotICAgIGlmIChWTS5WZXJpZnlBc3NlcnRpb25zKSBWTS5fYXNzZXJ0KFZNLk5PVF9SRUFDSEVEKTsgIC8vIGNhbGwgc2l0ZSBzaG91bGQgaGF2ZSBiZWVuIGhpamFja2VkIGJ5IG1hZ2ljIGluIGNvbXBpbGVyCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IEV4dGVudCBhdCBhcmJpdHJhcnkgKGJ5dGUpIG9mZnNldCBmcm9tIG9iamVjdC4KLSAgICogVXNlIGdldEV4dGVudEF0T2Zmc2V0KG9iaiwgb2ZzKSBpbnN0ZWFkIG9mIGdldE1lbW9yeVdvcmQob2JqZWN0QXNBZGRyZXNzKG9iaikrb2ZzKQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBFeHRlbnQgZ2V0RXh0ZW50QXRPZmZzZXQoT2JqZWN0IG9iamVjdCwgT2Zmc2V0IG9mZnNldCkgewotICAgIGlmIChWTS5WZXJpZnlBc3NlcnRpb25zKSBWTS5fYXNzZXJ0KFZNLk5PVF9SRUFDSEVEKTsgIC8vIGNhbGwgc2l0ZSBzaG91bGQgaGF2ZSBiZWVuIGhpamFja2VkIGJ5IG1hZ2ljIGluIGNvbXBpbGVyCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IEV4dGVudCBhdCBhcmJpdHJhcnkgKGJ5dGUpIG9mZnNldCBmcm9tIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgRXh0ZW50IGdldEV4dGVudEF0T2Zmc2V0KE9iamVjdCBvYmplY3QsIE9mZnNldCBvZmZzZXQsIGludCBsb2NhdGlvbk1ldGFkYXRhKSB7Ci0gICAgaWYgKFZNLlZlcmlmeUFzc2VydGlvbnMpIFZNLl9hc3NlcnQoVk0uTk9UX1JFQUNIRUQpOyAgLy8gY2FsbCBzaXRlIHNob3VsZCBoYXZlIGJlZW4gaGlqYWNrZWQgYnkgbWFnaWMgaW4gY29tcGlsZXIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgT2Zmc2V0IGF0IGFyYml0cmFyeSAoYnl0ZSkgb2Zmc2V0IGZyb20gb2JqZWN0LgotICAgKiBVc2UgZ2V0T2Zmc2V0QXRPZmZzZXQob2JqLCBvZnMpIGluc3RlYWQgb2YgZ2V0TWVtb3J5V29yZChvYmplY3RBc0FkZHJlc3Mob2JqKStvZnMpCi0gICAqLwotICBwdWJsaWMgc3RhdGljIE9mZnNldCBnZXRPZmZzZXRBdE9mZnNldChPYmplY3Qgb2JqZWN0LCBPZmZzZXQgb2Zmc2V0KSB7Ci0gICAgaWYgKFZNLlZlcmlmeUFzc2VydGlvbnMpIFZNLl9hc3NlcnQoVk0uTk9UX1JFQUNIRUQpOyAgLy8gY2FsbCBzaXRlIHNob3VsZCBoYXZlIGJlZW4gaGlqYWNrZWQgYnkgbWFnaWMgaW4gY29tcGlsZXIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgT2Zmc2V0IGF0IGFyYml0cmFyeSAoYnl0ZSkgb2Zmc2V0IGZyb20gb2JqZWN0LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBPZmZzZXQgZ2V0T2Zmc2V0QXRPZmZzZXQoT2JqZWN0IG9iamVjdCwgT2Zmc2V0IG9mZnNldCwgaW50IGxvY2F0aW9uTWV0YWRhdGEpIHsKLSAgICBpZiAoVk0uVmVyaWZ5QXNzZXJ0aW9ucykgVk0uX2Fzc2VydChWTS5OT1RfUkVBQ0hFRCk7ICAvLyBjYWxsIHNpdGUgc2hvdWxkIGhhdmUgYmVlbiBoaWphY2tlZCBieSBtYWdpYyBpbiBjb21waWxlcgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBib29sZWFuIGF0IGFyYml0cmFyeSAoYnl0ZSkgb2Zmc2V0IGZyb20gb2JqZWN0LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldEJvb2xlYW5BdE9mZnNldChPYmplY3Qgb2JqZWN0LCBPZmZzZXQgb2Zmc2V0LCBib29sZWFuIG5ld3ZhbHVlKSB7Ci0gICAgaWYgKFZNLlZlcmlmeUFzc2VydGlvbnMpCi0gICAgICBWTS5fYXNzZXJ0KFZNLk5PVF9SRUFDSEVEKTsgLy8gY2FsbCBzaXRlIHNob3VsZCBoYXZlIGJlZW4gaGlqYWNrZWQgYnkgbWFnaWMgaW4gY29tcGlsZXIKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgYm9vbGVhbiBhdCBhcmJpdHJhcnkgKGJ5dGUpIG9mZnNldCBmcm9tIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRCb29sZWFuQXRPZmZzZXQoT2JqZWN0IG9iamVjdCwgT2Zmc2V0IG9mZnNldCwgYm9vbGVhbiBuZXd2YWx1ZSwgaW50IGxvY2F0aW9uTWV0YWRhdGEpIHsKLSAgICBpZiAoVk0uVmVyaWZ5QXNzZXJ0aW9ucykKLSAgICAgIFZNLl9hc3NlcnQoVk0uTk9UX1JFQUNIRUQpOyAvLyBjYWxsIHNpdGUgc2hvdWxkIGhhdmUgYmVlbiBoaWphY2tlZCBieSBtYWdpYyBpbiBjb21waWxlcgotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBieXRlIGF0IGFyYml0cmFyeSAoYnl0ZSkgb2Zmc2V0IGZyb20gb2JqZWN0LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldEJ5dGVBdE9mZnNldChPYmplY3Qgb2JqZWN0LCBPZmZzZXQgb2Zmc2V0LCBieXRlIG5ld3ZhbHVlKSB7Ci0gICAgaWYgKFZNLlZlcmlmeUFzc2VydGlvbnMpIFZNLl9hc3NlcnQoVk0uTk9UX1JFQUNIRUQpOyAgLy8gY2FsbCBzaXRlIHNob3VsZCBoYXZlIGJlZW4gaGlqYWNrZWQgYnkgbWFnaWMgaW4gY29tcGlsZXIKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgYnl0ZSBhdCBhcmJpdHJhcnkgKGJ5dGUpIG9mZnNldCBmcm9tIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRCeXRlQXRPZmZzZXQoT2JqZWN0IG9iamVjdCwgT2Zmc2V0IG9mZnNldCwgYnl0ZSBuZXd2YWx1ZSwgaW50IGxvY2F0aW9uTWV0YWRhdGEpIHsKLSAgICBpZiAoVk0uVmVyaWZ5QXNzZXJ0aW9ucykKLSAgICAgIFZNLl9hc3NlcnQoVk0uTk9UX1JFQUNIRUQpOyAvLyBjYWxsIHNpdGUgc2hvdWxkIGhhdmUgYmVlbiBoaWphY2tlZCBieSBtYWdpYyBpbiBjb21waWxlcgotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBjaGFyIGF0IGFyYml0cmFyeSAoYnl0ZSkgb2Zmc2V0IGZyb20gb2JqZWN0LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldENoYXJBdE9mZnNldChPYmplY3Qgb2JqZWN0LCBPZmZzZXQgb2Zmc2V0LCBjaGFyIG5ld3ZhbHVlKSB7Ci0gICAgaWYgKFZNLlZlcmlmeUFzc2VydGlvbnMpIFZNLl9hc3NlcnQoVk0uTk9UX1JFQUNIRUQpOyAgLy8gY2FsbCBzaXRlIHNob3VsZCBoYXZlIGJlZW4gaGlqYWNrZWQgYnkgbWFnaWMgaW4gY29tcGlsZXIKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgY2hhciBhdCBhcmJpdHJhcnkgKGJ5dGUpIG9mZnNldCBmcm9tIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDaGFyQXRPZmZzZXQoT2JqZWN0IG9iamVjdCwgT2Zmc2V0IG9mZnNldCwgY2hhciBuZXd2YWx1ZSwgaW50IGxvY2F0aW9uTWV0YWRhdGEpIHsKLSAgICBpZiAoVk0uVmVyaWZ5QXNzZXJ0aW9ucykKLSAgICAgIFZNLl9hc3NlcnQoVk0uTk9UX1JFQUNIRUQpOyAvLyBjYWxsIHNpdGUgc2hvdWxkIGhhdmUgYmVlbiBoaWphY2tlZCBieSBtYWdpYyBpbiBjb21waWxlcgotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBzaG9ydCBhdCBhcmJpdHJhcnkgKGJ5dGUpIG9mZnNldCBmcm9tIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTaG9ydEF0T2Zmc2V0KE9iamVjdCBvYmplY3QsIE9mZnNldCBvZmZzZXQsIHNob3J0IG5ld3ZhbHVlKSB7Ci0gICAgaWYgKFZNLlZlcmlmeUFzc2VydGlvbnMpIFZNLl9hc3NlcnQoVk0uTk9UX1JFQUNIRUQpOyAgLy8gY2FsbCBzaXRlIHNob3VsZCBoYXZlIGJlZW4gaGlqYWNrZWQgYnkgbWFnaWMgaW4gY29tcGlsZXIKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgc2hvcnQgYXQgYXJiaXRyYXJ5IChieXRlKSBvZmZzZXQgZnJvbSBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2hvcnRBdE9mZnNldChPYmplY3Qgb2JqZWN0LCBPZmZzZXQgb2Zmc2V0LCBzaG9ydCBuZXd2YWx1ZSwgaW50IGxvY2F0aW9uTWV0YWRhdGEpIHsKLSAgICBpZiAoVk0uVmVyaWZ5QXNzZXJ0aW9ucykKLSAgICAgIFZNLl9hc3NlcnQoVk0uTk9UX1JFQUNIRUQpOyAvLyBjYWxsIHNpdGUgc2hvdWxkIGhhdmUgYmVlbiBoaWphY2tlZCBieSBtYWdpYyBpbiBjb21waWxlcgotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBpbnQgYXQgYXJiaXRyYXJ5IChieXRlKSBvZmZzZXQgZnJvbSBvYmplY3QuCi0gICAqIFVzZSBzZXRJbnRBdE9mZnNldChvYmosIG9mcywgbmV3KSBpbnN0ZWFkIG9mIHNldE1lbW9yeVdvcmQob2JqZWN0QXNBZGRyZXNzKG9iaikrb2ZzLCBuZXcpCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW50QXRPZmZzZXQoT2JqZWN0IG9iamVjdCwgT2Zmc2V0IG9mZnNldCwgaW50IG5ld3ZhbHVlKSB7Ci0gICAgaWYgKFZNLlZlcmlmeUFzc2VydGlvbnMpIFZNLl9hc3NlcnQoVk0uTk9UX1JFQUNIRUQpOyAgLy8gY2FsbCBzaXRlIHNob3VsZCBoYXZlIGJlZW4gaGlqYWNrZWQgYnkgbWFnaWMgaW4gY29tcGlsZXIKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgaW50IGF0IGFyYml0cmFyeSAoYnl0ZSkgb2Zmc2V0IGZyb20gb2JqZWN0LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldEludEF0T2Zmc2V0KE9iamVjdCBvYmplY3QsIE9mZnNldCBvZmZzZXQsIGludCBuZXd2YWx1ZSwgaW50IGxvY2F0aW9uTWV0YWRhdGEpIHsKLSAgICBpZiAoVk0uVmVyaWZ5QXNzZXJ0aW9ucykKLSAgICAgIFZNLl9hc3NlcnQoVk0uTk9UX1JFQUNIRUQpOyAvLyBjYWxsIHNpdGUgc2hvdWxkIGhhdmUgYmVlbiBoaWphY2tlZCBieSBtYWdpYyBpbiBjb21waWxlcgotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBsb25nIGF0IGFyYml0cmFyeSAoYnl0ZSkgb2Zmc2V0IGZyb20gb2JqZWN0LgotICAgKiBVc2Ugc2V0bG9uZ0F0T2Zmc2V0KG9iaiwgb2ZzKSBpbnN0ZWFkIG9mIHR3byBzZXRJbnRBdE9mZnNldAotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldExvbmdBdE9mZnNldChPYmplY3Qgb2JqZWN0LCBPZmZzZXQgb2Zmc2V0LCBsb25nIG5ld3ZhbHVlKSB7Ci0gICAgaWYgKFZNLlZlcmlmeUFzc2VydGlvbnMpIFZNLl9hc3NlcnQoVk0uTk9UX1JFQUNIRUQpOyAgLy8gY2FsbCBzaXRlIHNob3VsZCBoYXZlIGJlZW4gaGlqYWNrZWQgYnkgbWFnaWMgaW4gY29tcGlsZXIKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgbG9uZyBhdCBhcmJpdHJhcnkgKGJ5dGUpIG9mZnNldCBmcm9tIG9iamVjdC4gVXNlIHNldGxvbmdBdE9mZnNldChvYmosCi0gICAqIG9mcykgaW5zdGVhZCBvZiB0d28gc2V0SW50QXRPZmZzZXQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMb25nQXRPZmZzZXQoT2JqZWN0IG9iamVjdCwgT2Zmc2V0IG9mZnNldCwgbG9uZyBuZXd2YWx1ZSwgaW50IGxvY2F0aW9uTWV0YWRhdGEpIHsKLSAgICBpZiAoVk0uVmVyaWZ5QXNzZXJ0aW9ucykKLSAgICAgIFZNLl9hc3NlcnQoVk0uTk9UX1JFQUNIRUQpOyAvLyBjYWxsIHNpdGUgc2hvdWxkIGhhdmUgYmVlbiBoaWphY2tlZCBieSBtYWdpYyBpbiBjb21waWxlcgotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBmbG9hdCBhdCBhcmJpdHJhcnkgKGJ5dGUpIG9mZnNldCBmcm9tIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGbG9hdEF0T2Zmc2V0KE9iamVjdCBvYmplY3QsIE9mZnNldCBvZmZzZXQsIGZsb2F0IG5ld3ZhbHVlKSB7Ci0gICAgaWYgKFZNLlZlcmlmeUFzc2VydGlvbnMpIFZNLl9hc3NlcnQoVk0uTk9UX1JFQUNIRUQpOyAgLy8gY2FsbCBzaXRlIHNob3VsZCBoYXZlIGJlZW4gaGlqYWNrZWQgYnkgbWFnaWMgaW4gY29tcGlsZXIKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgZmxvYXQgYXQgYXJiaXRyYXJ5IChieXRlKSBvZmZzZXQgZnJvbSBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RmxvYXRBdE9mZnNldChPYmplY3Qgb2JqZWN0LCBPZmZzZXQgb2Zmc2V0LCBmbG9hdCBuZXd2YWx1ZSwgaW50IGxvY2F0aW9uTWV0YWRhdGEpIHsKLSAgICBpZiAoVk0uVmVyaWZ5QXNzZXJ0aW9ucykKLSAgICAgIFZNLl9hc3NlcnQoVk0uTk9UX1JFQUNIRUQpOyAvLyBjYWxsIHNpdGUgc2hvdWxkIGhhdmUgYmVlbiBoaWphY2tlZCBieSBtYWdpYyBpbiBjb21waWxlcgotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBkb3VibGUgYXQgYXJiaXRyYXJ5IChieXRlKSBvZmZzZXQgZnJvbSBvYmplY3QuCi0gICAqIFVzZSBzZXREb3VibGVBdE9mZnNldChvYmosIG9mcykgaW5zdGVhZCBvZiB0d28gc2V0SW50QXRPZmZzZXQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXREb3VibGVBdE9mZnNldChPYmplY3Qgb2JqZWN0LCBPZmZzZXQgb2Zmc2V0LCBkb3VibGUgbmV3dmFsdWUpIHsKLSAgICBpZiAoVk0uVmVyaWZ5QXNzZXJ0aW9ucykgVk0uX2Fzc2VydChWTS5OT1RfUkVBQ0hFRCk7ICAvLyBjYWxsIHNpdGUgc2hvdWxkIGhhdmUgYmVlbiBoaWphY2tlZCBieSBtYWdpYyBpbiBjb21waWxlcgotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBkb3VibGUgYXQgYXJiaXRyYXJ5IChieXRlKSBvZmZzZXQgZnJvbSBvYmplY3QuIFVzZQotICAgKiBzZXREb3VibGVBdE9mZnNldChvYmosIG9mcykgaW5zdGVhZCBvZiB0d28gc2V0SW50QXRPZmZzZXQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXREb3VibGVBdE9mZnNldChPYmplY3Qgb2JqZWN0LCBPZmZzZXQgb2Zmc2V0LCBkb3VibGUgbmV3dmFsdWUsIGludCBsb2NhdGlvbk1ldGFkYXRhKSB7Ci0gICAgaWYgKFZNLlZlcmlmeUFzc2VydGlvbnMpCi0gICAgICBWTS5fYXNzZXJ0KFZNLk5PVF9SRUFDSEVEKTsgLy8gY2FsbCBzaXRlIHNob3VsZCBoYXZlIGJlZW4gaGlqYWNrZWQgYnkgbWFnaWMgaW4gY29tcGlsZXIKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgV29yZCBhdCBhcmJpdHJhcnkgKGJ5dGUpIG9mZnNldCBmcm9tIG9iamVjdC4KLSAgICogVXNlIHNldFdvcmRBdE9mZnNldChvYmosIG9mcywgbmV3KSBpbnN0ZWFkIG9mIHNldE1lbW9yeVdvcmQob2JqZWN0QXNBZGRyZXNzKG9iaikrb2ZzLCBuZXcpCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0V29yZEF0T2Zmc2V0KE9iamVjdCBvYmplY3QsIE9mZnNldCBvZmZzZXQsIFdvcmQgbmV3dmFsdWUpIHsKLSAgICBpZiAoVk0uVmVyaWZ5QXNzZXJ0aW9ucykgVk0uX2Fzc2VydChWTS5OT1RfUkVBQ0hFRCk7ICAvLyBjYWxsIHNpdGUgc2hvdWxkIGhhdmUgYmVlbiBoaWphY2tlZCBieSBtYWdpYyBpbiBjb21waWxlcgotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBXb3JkIGF0IGFyYml0cmFyeSAoYnl0ZSkgb2Zmc2V0IGZyb20gb2JqZWN0LgotICAgKiBVc2Ugc2V0V29yZEF0T2Zmc2V0KG9iaiwgb2ZzLCBuZXcpIGluc3RlYWQgb2Ygc2V0TWVtb3J5V29yZChvYmplY3RBc0FkZHJlc3Mob2JqKStvZnMsIG5ldykKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRXb3JkQXRPZmZzZXQoT2JqZWN0IG9iamVjdCwgT2Zmc2V0IG9mZnNldCwgV29yZCBuZXd2YWx1ZSwgaW50IGxvY2F0aW9uTWV0YWRhdGEpIHsKLSAgICBpZiAoVk0uVmVyaWZ5QXNzZXJ0aW9ucykgVk0uX2Fzc2VydChWTS5OT1RfUkVBQ0hFRCk7ICAvLyBjYWxsIHNpdGUgc2hvdWxkIGhhdmUgYmVlbiBoaWphY2tlZCBieSBtYWdpYyBpbiBjb21waWxlcgotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBBZGRyZXNzIGF0IGFyYml0cmFyeSAoYnl0ZSkgb2Zmc2V0IGZyb20gb2JqZWN0LgotICAgKiBVc2Ugc2V0QWRkcmVzc0F0T2Zmc2V0KG9iaiwgb2ZzLCBuZXcpIGluc3RlYWQgb2Ygc2V0TWVtb3J5V29yZChvYmplY3RBc0FkZHJlc3Mob2JqKStvZnMsIG5ldykKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRBZGRyZXNzQXRPZmZzZXQoT2JqZWN0IG9iamVjdCwgT2Zmc2V0IG9mZnNldCwgQWRkcmVzcyBuZXd2YWx1ZSkgewotICAgIGlmIChWTS5WZXJpZnlBc3NlcnRpb25zKSBWTS5fYXNzZXJ0KFZNLk5PVF9SRUFDSEVEKTsgIC8vIGNhbGwgc2l0ZSBzaG91bGQgaGF2ZSBiZWVuIGhpamFja2VkIGJ5IG1hZ2ljIGluIGNvbXBpbGVyCi0gIH0KLQotICAvKioKLSAgICogU2V0IEFkZHJlc3MgYXQgYXJiaXRyYXJ5IChieXRlKSBvZmZzZXQgZnJvbSBvYmplY3QuCi0gICAqIFVzZSBzZXRBZGRyZXNzQXRPZmZzZXQob2JqLCBvZnMsIG5ldykgaW5zdGVhZCBvZiBzZXRNZW1vcnlXb3JkKG9iamVjdEFzQWRkcmVzcyhvYmopK29mcywgbmV3KQotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldEFkZHJlc3NBdE9mZnNldChPYmplY3Qgb2JqZWN0LCBPZmZzZXQgb2Zmc2V0LCBBZGRyZXNzIG5ld3ZhbHVlLCBpbnQgbG9jYXRpb25NZXRhZGF0YSkgewotICAgIGlmIChWTS5WZXJpZnlBc3NlcnRpb25zKSBWTS5fYXNzZXJ0KFZNLk5PVF9SRUFDSEVEKTsgIC8vIGNhbGwgc2l0ZSBzaG91bGQgaGF2ZSBiZWVuIGhpamFja2VkIGJ5IG1hZ2ljIGluIGNvbXBpbGVyCi0gIH0KLQotICAvKioKLSAgICogU2V0IEV4dGVudCBhdCBhcmJpdHJhcnkgKGJ5dGUpIG9mZnNldCBmcm9tIG9iamVjdC4KLSAgICogVXNlIHNldEV4dGVudEF0T2Zmc2V0KG9iaiwgb2ZzLCBuZXcpIGluc3RlYWQgb2Ygc2V0TWVtb3J5V29yZChvYmplY3RBc0FkZHJlc3Mob2JqKStvZnMsIG5ldykKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRFeHRlbnRBdE9mZnNldChPYmplY3Qgb2JqZWN0LCBPZmZzZXQgb2Zmc2V0LCBFeHRlbnQgbmV3dmFsdWUpIHsKLSAgICBpZiAoVk0uVmVyaWZ5QXNzZXJ0aW9ucykgVk0uX2Fzc2VydChWTS5OT1RfUkVBQ0hFRCk7ICAvLyBjYWxsIHNpdGUgc2hvdWxkIGhhdmUgYmVlbiBoaWphY2tlZCBieSBtYWdpYyBpbiBjb21waWxlcgotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBFeHRlbnQgYXQgYXJiaXRyYXJ5IChieXRlKSBvZmZzZXQgZnJvbSBvYmplY3QuCi0gICAqIFVzZSBzZXRFeHRlbnR0T2Zmc2V0KG9iaiwgb2ZzLCBuZXcpIGluc3RlYWQgb2Ygc2V0TWVtb3J5V29yZChvYmplY3RBc0FkZHJlc3Mob2JqKStvZnMsIG5ldykKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRFeHRlbnRBdE9mZnNldChPYmplY3Qgb2JqZWN0LCBPZmZzZXQgb2Zmc2V0LCBFeHRlbnQgbmV3dmFsdWUsIGludCBsb2NhdGlvbk1ldGFkYXRhKSB7Ci0gICAgaWYgKFZNLlZlcmlmeUFzc2VydGlvbnMpIFZNLl9hc3NlcnQoVk0uTk9UX1JFQUNIRUQpOyAgLy8gY2FsbCBzaXRlIHNob3VsZCBoYXZlIGJlZW4gaGlqYWNrZWQgYnkgbWFnaWMgaW4gY29tcGlsZXIKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgT2Zmc2V0IGF0IGFyYml0cmFyeSAoYnl0ZSkgb2Zmc2V0IGZyb20gb2JqZWN0LgotICAgKiBVc2Ugc2V0T2Zmc2V0QXRPZmZzZXQob2JqLCBvZnMsIG5ldykgaW5zdGVhZCBvZiBzZXRNZW1vcnlXb3JkKG9iamVjdEFzQWRkcmVzcyhvYmopK29mcywgbmV3KQotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldE9mZnNldEF0T2Zmc2V0KE9iamVjdCBvYmplY3QsIE9mZnNldCBvZmZzZXQsIE9mZnNldCBuZXd2YWx1ZSkgewotICAgIGlmIChWTS5WZXJpZnlBc3NlcnRpb25zKSBWTS5fYXNzZXJ0KFZNLk5PVF9SRUFDSEVEKTsgIC8vIGNhbGwgc2l0ZSBzaG91bGQgaGF2ZSBiZWVuIGhpamFja2VkIGJ5IG1hZ2ljIGluIGNvbXBpbGVyCi0gIH0KLQotICAvKioKLSAgICogU2V0IE9mZnNldCBhdCBhcmJpdHJhcnkgKGJ5dGUpIG9mZnNldCBmcm9tIG9iamVjdC4KLSAgICogVXNlIHNldE9mZnNldEF0T2Zmc2V0KG9iaiwgb2ZzLCBuZXcpIGluc3RlYWQgb2Ygc2V0TWVtb3J5V29yZChvYmplY3RBc0FkZHJlc3Mob2JqKStvZnMsIG5ldykKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRPZmZzZXRBdE9mZnNldChPYmplY3Qgb2JqZWN0LCBPZmZzZXQgb2Zmc2V0LCBPZmZzZXQgbmV3dmFsdWUsIGludCBsb2NhdGlvbk1ldGFkYXRhKSB7Ci0gICAgaWYgKFZNLlZlcmlmeUFzc2VydGlvbnMpIFZNLl9hc3NlcnQoVk0uTk9UX1JFQUNIRUQpOyAgLy8gY2FsbCBzaXRlIHNob3VsZCBoYXZlIGJlZW4gaGlqYWNrZWQgYnkgbWFnaWMgaW4gY29tcGlsZXIKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgT2JqZWN0IGF0IGFyYml0cmFyeSAoYnl0ZSkgb2Zmc2V0IGZyb20gb2JqZWN0LgotICAgKiBVc2Ugc2V0T2JqZWN0QXRPZmZzZXQob2JqLCBvZnMsIG5ldykgaW5zdGVhZCBvZiBzZXRNZW1vcnlXb3JkKG9iamVjdEFzQWRkcmVzcyhvYmopK29mcywgb2JqZWN0QXNBZGRyZXNzKG5ldykpCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0T2JqZWN0QXRPZmZzZXQoT2JqZWN0IG9iamVjdCwgT2Zmc2V0IG9mZnNldCwgT2JqZWN0IG5ld3ZhbHVlKSB7Ci0gICAgaWYgKFZNLlZlcmlmeUFzc2VydGlvbnMpIFZNLl9hc3NlcnQoVk0uTk9UX1JFQUNIRUQpOyAgLy8gY2FsbCBzaXRlIHNob3VsZCBoYXZlIGJlZW4gaGlqYWNrZWQgYnkgbWFnaWMgaW4gY29tcGlsZXIKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgT2JqZWN0IGF0IGFyYml0cmFyeSAoYnl0ZSkgb2Zmc2V0IGZyb20gb2JqZWN0LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldE9iamVjdEF0T2Zmc2V0KE9iamVjdCBvYmplY3QsIE9mZnNldCBvZmZzZXQsIE9iamVjdCBuZXd2YWx1ZSwgaW50IGxvY2F0aW9uTWV0YWRhdGEpIHsKLSAgICBpZiAoVk0uVmVyaWZ5QXNzZXJ0aW9ucykgVk0uX2Fzc2VydChWTS5OT1RfUkVBQ0hFRCk7ICAvLyBjYWxsIHNpdGUgc2hvdWxkIGhhdmUgYmVlbiBoaWphY2tlZCBieSBtYWdpYyBpbiBjb21waWxlcgotICB9Ci0KLQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0gIC8vICAgIEF0b21pYyBNZW1vcnkgQWNjZXNzIFByaW1pdGl2ZXMuICAgLy8KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCi0gIC8qKgotICAgKiBHZXQgY29udGVudHMgb2YgKG9iamVjdCArIG9mZnNldCkgYW5kIGJlZ2luIGNvbmRpdGlvbmFsIGNyaXRpY2FsIHNlY3Rpb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBwcmVwYXJlSW50KE9iamVjdCBvYmplY3QsIE9mZnNldCBvZmZzZXQpIHsKLSAgICBpZiAoVk0uVmVyaWZ5QXNzZXJ0aW9ucykgVk0uX2Fzc2VydChWTS5OT1RfUkVBQ0hFRCk7ICAvLyBjYWxsIHNpdGUgc2hvdWxkIGhhdmUgYmVlbiBoaWphY2tlZCBieSBtYWdpYyBpbiBjb21waWxlcgotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgY29udGVudHMgb2YgKG9iamVjdCArIG9mZnNldCkgYW5kIGJlZ2luIGNvbmRpdGlvbmFsIGNyaXRpY2FsIHNlY3Rpb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIE9iamVjdCBwcmVwYXJlT2JqZWN0KE9iamVjdCBvYmplY3QsIE9mZnNldCBvZmZzZXQpIHsKLSAgICBpZiAoVk0uVmVyaWZ5QXNzZXJ0aW9ucykgVk0uX2Fzc2VydChWTS5OT1RfUkVBQ0hFRCk7ICAvLyBjYWxsIHNpdGUgc2hvdWxkIGhhdmUgYmVlbiBoaWphY2tlZCBieSBtYWdpYyBpbiBjb21waWxlcgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBjb250ZW50cyBvZiAob2JqZWN0ICsgb2Zmc2V0KSBhbmQgYmVnaW4gY29uZGl0aW9uYWwgY3JpdGljYWwgc2VjdGlvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQWRkcmVzcyBwcmVwYXJlQWRkcmVzcyhPYmplY3Qgb2JqZWN0LCBPZmZzZXQgb2Zmc2V0KSB7Ci0gICAgaWYgKFZNLlZlcmlmeUFzc2VydGlvbnMpIFZNLl9hc3NlcnQoVk0uTk9UX1JFQUNIRUQpOyAgLy8gY2FsbCBzaXRlIHNob3VsZCBoYXZlIGJlZW4gaGlqYWNrZWQgYnkgbWFnaWMgaW4gY29tcGlsZXIKLSAgICByZXR1cm4gQWRkcmVzcy5tYXgoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgY29udGVudHMgb2YgKG9iamVjdCArIG9mZnNldCkgYW5kIGJlZ2luIGNvbmRpdGlvbmFsIGNyaXRpY2FsIHNlY3Rpb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFdvcmQgcHJlcGFyZVdvcmQoT2JqZWN0IG9iamVjdCwgT2Zmc2V0IG9mZnNldCkgewotICAgIGlmIChWTS5WZXJpZnlBc3NlcnRpb25zKSBWTS5fYXNzZXJ0KFZNLk5PVF9SRUFDSEVEKTsgIC8vIGNhbGwgc2l0ZSBzaG91bGQgaGF2ZSBiZWVuIGhpamFja2VkIGJ5IG1hZ2ljIGluIGNvbXBpbGVyCi0gICAgcmV0dXJuIFdvcmQubWF4KCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGNvbnRlbnRzIG9mIChvYmplY3QgKyBvZmZzZXQpIGFuZCBiZWdpbiBjb25kaXRpb25hbCBjcml0aWNhbCBzZWN0aW9uLgotICAgKi8KLSAgQFVuaW50ZXJydXB0aWJsZQotICBwdWJsaWMgc3RhdGljIGxvbmcgcHJlcGFyZUxvbmcoT2JqZWN0IG9iamVjdCwgT2Zmc2V0IG9mZnNldCkgewotICAgIGlmIChWTS5WZXJpZnlBc3NlcnRpb25zKSBWTS5fYXNzZXJ0KFZNLk5PVF9SRUFDSEVEKTsgIC8vIGNhbGwgc2l0ZSBzaG91bGQgaGF2ZSBiZWVuIGhpamFja2VkIGJ5IG1hZ2ljIGluIGNvbXBpbGVyCi0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIG1lbW9yeSBhdCAob2JqZWN0ICsgb2Zmc2V0KSB0byBuZXdWYWx1ZSBpZiBpdHMgY29udGVudHMgYXJlIG9sZFZhbHVlLgotICAgKiBNdXN0IGJlIHBhaXJlZCB3aXRoIGEgcHJlY2VkaW5nIHByZXBhcmUgKHdoaWNoIHJldHVybmVkIHRoZSBvbGRWYWx1ZSkKLSAgICogUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwuCi0gICAqIEVuZHMgY29uZGl0aW9uYWwgY3JpdGljYWwgc2VjdGlvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhdHRlbXB0SW50KE9iamVjdCBvYmplY3QsIE9mZnNldCBvZmZzZXQsIGludCBvbGRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0gICAgaWYgKFZNLlZlcmlmeUFzc2VydGlvbnMpIFZNLl9hc3NlcnQoVk0uTk9UX1JFQUNIRUQpOyAgLy8gY2FsbCBzaXRlIHNob3VsZCBoYXZlIGJlZW4gaGlqYWNrZWQgYnkgbWFnaWMgaW4gY29tcGlsZXIKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgbWVtb3J5IGF0IChvYmplY3QgKyBvZmZzZXQpIHRvIG5ld1ZhbHVlIGlmIGl0cyBjb250ZW50cyBhcmUgb2xkVmFsdWUuCi0gICAqIE11c3QgYmUgcGFpcmVkIHdpdGggYSBwcmVjZWRpbmcgcHJlcGFyZSAod2hpY2ggcmV0dXJuZWQgdGhlIG9sZFZhbHVlKQotICAgKiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bC4KLSAgICogRW5kcyBjb25kaXRpb25hbCBjcml0aWNhbCBzZWN0aW9uLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGF0dGVtcHRPYmplY3QoT2JqZWN0IG9iamVjdCwgT2Zmc2V0IG9mZnNldCwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLSAgICBpZiAoVk0uVmVyaWZ5QXNzZXJ0aW9ucykgVk0uX2Fzc2VydChWTS5OT1RfUkVBQ0hFRCk7ICAvLyBjYWxsIHNpdGUgc2hvdWxkIGhhdmUgYmVlbiBoaWphY2tlZCBieSBtYWdpYyBpbiBjb21waWxlcgotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBtZW1vcnkgYXQgKG9iamVjdCArIG9mZnNldCkgdG8gbmV3VmFsdWUgaWYgaXRzIGNvbnRlbnRzIGFyZSBvbGRWYWx1ZS4KLSAgICogTXVzdCBiZSBwYWlyZWQgd2l0aCBhIHByZWNlZGluZyBwcmVwYXJlICh3aGljaCByZXR1cm5lZCB0aGUgb2xkVmFsdWUpCi0gICAqIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLgotICAgKiBFbmRzIGNvbmRpdGlvbmFsIGNyaXRpY2FsIHNlY3Rpb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gYXR0ZW1wdEFkZHJlc3MoT2JqZWN0IG9iamVjdCwgT2Zmc2V0IG9mZnNldCwgQWRkcmVzcyBvbGRWYWx1ZSwgQWRkcmVzcyBuZXdWYWx1ZSkgewotICAgIGlmIChWTS5WZXJpZnlBc3NlcnRpb25zKSBWTS5fYXNzZXJ0KFZNLk5PVF9SRUFDSEVEKTsgIC8vIGNhbGwgc2l0ZSBzaG91bGQgaGF2ZSBiZWVuIGhpamFja2VkIGJ5IG1hZ2ljIGluIGNvbXBpbGVyCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIG1lbW9yeSBhdCAob2JqZWN0ICsgb2Zmc2V0KSB0byBuZXdWYWx1ZSBpZiBpdHMgY29udGVudHMgYXJlIG9sZFZhbHVlLgotICAgKiBNdXN0IGJlIHBhaXJlZCB3aXRoIGEgcHJlY2VkaW5nIHByZXBhcmUgKHdoaWNoIHJldHVybmVkIHRoZSBvbGRWYWx1ZSkKLSAgICogUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwuCi0gICAqIEVuZHMgY29uZGl0aW9uYWwgY3JpdGljYWwgc2VjdGlvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhdHRlbXB0V29yZChPYmplY3Qgb2JqZWN0LCBPZmZzZXQgb2Zmc2V0LCBXb3JkIG9sZFZhbHVlLCBXb3JkIG5ld1ZhbHVlKSB7Ci0gICAgaWYgKFZNLlZlcmlmeUFzc2VydGlvbnMpIFZNLl9hc3NlcnQoVk0uTk9UX1JFQUNIRUQpOyAgLy8gY2FsbCBzaXRlIHNob3VsZCBoYXZlIGJlZW4gaGlqYWNrZWQgYnkgbWFnaWMgaW4gY29tcGlsZXIKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgbWVtb3J5IGF0IChvYmplY3QgKyBvZmZzZXQpIHRvIG5ld1ZhbHVlIGlmIGl0cyBjb250ZW50cyBhcmUgb2xkVmFsdWUuCi0gICAqIE11c3QgYmUgcGFpcmVkIHdpdGggYSBwcmVjZWRpbmcgcHJlcGFyZSAod2hpY2ggcmV0dXJuZWQgdGhlIG9sZFZhbHVlKQotICAgKiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bC4KLSAgICogRW5kcyBjb25kaXRpb25hbCBjcml0aWNhbCBzZWN0aW9uLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGF0dGVtcHRMb25nKE9iamVjdCBvYmplY3QsIE9mZnNldCBvZmZzZXQsIGxvbmcgb2xkVmFsdWUsCi0gICAgICBsb25nIG5ld1ZhbHVlKSB7Ci0gICAgaWYgKFZNLlZlcmlmeUFzc2VydGlvbnMpIFZNLl9hc3NlcnQoVk0uTk9UX1JFQUNIRUQpOyAgLy8gY2FsbCBzaXRlIHNob3VsZCBoYXZlIGJlZW4gaGlqYWNrZWQgYnkgbWFnaWMgaW4gY29tcGlsZXIKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0gIC8vICAgICAgICAgICAgQ2FjaGUgTWFuYWdlbWVudC4gICAgICAgICAgLy8KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCi0gIC8qKioqIE5PVEU6IGFsbCBwZXItYWRkcmVzcyBvcGVyYXRpb25zIG5vdyBsaXZlIGluIHZtbWFnaWMuQWRkcmVzcyAqKioqKi8KLQotICAvKioKLSAgICogV2FpdCBmb3IgcHJlY2VlZGluZyBjYWNoZSBmbHVzaC9pbnZhbGlkYXRlIGluc3RydWN0aW9ucyB0bwotICAgKiBjb21wbGV0ZSBvbiBhbGwgcHJvY2Vzc29ycy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzeW5jKCkgewotICAgIGlmIChWTS5ydW5uaW5nVk0gJiYgVk0uVmVyaWZ5QXNzZXJ0aW9ucykgewotICAgICAgVk0uX2Fzc2VydChWTS5OT1RfUkVBQ0hFRCk7ICAvLyBjYWxsIHNpdGUgc2hvdWxkIGhhdmUgYmVlbiBoaWphY2tlZCBieSBtYWdpYyBpbiBjb21waWxlcgotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBXYWl0IGZvciBhbGwgcHJlY2VlZGluZyBpbnN0cnVjdGlvbnMgdG8gY29tcGxldGUgYW5kIGRpc2NhcmQgYW55Ci0gICAqIHByZWZldGNoZWQgaW5zdHJ1Y3Rpb25zIG9uIHRoaXMgcHJvY2Vzc29yLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGlzeW5jKCkgewotICAgIGlmIChWTS5ydW5uaW5nVk0gJiYgVk0uVmVyaWZ5QXNzZXJ0aW9ucykgewotICAgICAgVk0uX2Fzc2VydChWTS5OT1RfUkVBQ0hFRCk7ICAvLyBjYWxsIHNpdGUgc2hvdWxkIGhhdmUgYmVlbiBoaWphY2tlZCBieSBtYWdpYyBpbiBjb21waWxlcgotICAgIH0KLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqICAgIE1pc2MKLSAgICoKLSAgICovCi0KLSAgLyoqCi0gICAqIE9uIElBMzIsIGVtaXQgYSBQQVVTRSBpbnN0cnVjdGlvbiwgdG8gb3B0aW1pemUgc3Bpbi13YWl0IGxvb3BzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHBhdXNlKCkgewotICAgIGlmIChWTS5ydW5uaW5nVk0gJiYgVk0uVmVyaWZ5QXNzZXJ0aW9ucykgewotICAgICAgVk0uX2Fzc2VydChWTS5OT1RfUkVBQ0hFRCk7ICAvLyBjYWxsIHNpdGUgc2hvdWxkIGhhdmUgYmVlbiBoaWphY2tlZCBieSBtYWdpYyBpbiBjb21waWxlcgotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBBIGhhcmR3YXJlIFNRUlQgaW5zdHJ1Y3Rpb24KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmxvYXQgc3FydChmbG9hdCB2YWx1ZSkgewotICAgIGlmIChWTS5ydW5uaW5nVk0gJiYgVk0uVmVyaWZ5QXNzZXJ0aW9ucykgewotICAgICAgVk0uX2Fzc2VydChWTS5OT1RfUkVBQ0hFRCk7ICAvLyBjYWxsIHNpdGUgc2hvdWxkIGhhdmUgYmVlbiBoaWphY2tlZCBieSBtYWdpYyBpbiBjb21waWxlcgotICAgIH0KLSAgICByZXR1cm4gLTEuMGY7IC8vIHdoaWNoIHNob3VsZCB1cHNldCB0aGVtIGV2ZW4gaWYgYXNzZXJ0aW9ucyBhcmVuJ3QgZW5hYmxlZCAuLi4KLSAgfQotCi0gIC8qKgotICAgKiBBIGhhcmR3YXJlIFNRUlQgaW5zdHJ1Y3Rpb24KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZG91YmxlIHNxcnQoZG91YmxlIHZhbHVlKSB7Ci0gICAgaWYgKFZNLnJ1bm5pbmdWTSAmJiBWTS5WZXJpZnlBc3NlcnRpb25zKSB7Ci0gICAgICBWTS5fYXNzZXJ0KFZNLk5PVF9SRUFDSEVEKTsgIC8vIGNhbGwgc2l0ZSBzaG91bGQgaGF2ZSBiZWVuIGhpamFja2VkIGJ5IG1hZ2ljIGluIGNvbXBpbGVyCi0gICAgfQotICAgIHJldHVybiAtMS4wZDsgLy8gd2hpY2ggc2hvdWxkIHVwc2V0IHRoZW0gZXZlbiBpZiBhc3NlcnRpb25zIGFyZW4ndCBlbmFibGVkIC4uLgotICB9Ci0KLSAgLyoqCi0gICAqIEhvdyBkZWVwbHkgaW5saW5lZCBpcyB0aGlzIG1ldGhvZCAoMCBtZWFucyBubyBpbmxpbmluZykuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBnZXRJbmxpbmVEZXB0aCgpIHsKLSAgICBpZiAoVk0ucnVubmluZ1ZNICYmIFZNLlZlcmlmeUFzc2VydGlvbnMpIHsKLSAgICAgIFZNLl9hc3NlcnQoVk0uTk9UX1JFQUNIRUQpOyAgLy8gY2FsbCBzaXRlIHNob3VsZCBoYXZlIGJlZW4gaGlqYWNrZWQgYnkgbWFnaWMgaW4gY29tcGlsZXIKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvKioKLSAgICogSXMgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgY29uc3RhbnQgKGR1ZSB0byBlaXRoZXIgaW5saW5pbmcgb3Igc3BlY2lhbGl6YXRpb24pLgotICAgKiBDb3VudCBzdGFydHMgYXQgemVybyBhbmQgaW5jbHVkZXMgdGhlICd0aGlzJyBwYXJhbWV0ZXIgZm9yIGluc3RhbmNlIG1ldGhvZHMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb25zdGFudFBhcmFtZXRlcihpbnQgaW5kZXgpIHsKLSAgICBpZiAoVk0ucnVubmluZ1ZNICYmIFZNLlZlcmlmeUFzc2VydGlvbnMpIHsKLSAgICAgIFZNLl9hc3NlcnQoVk0uTk9UX1JFQUNIRUQpOyAgLy8gY2FsbCBzaXRlIHNob3VsZCBoYXZlIGJlZW4gaGlqYWNrZWQgYnkgbWFnaWMgaW4gY29tcGlsZXIKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qaWtlc3J2bS9TaXplQ29uc3RhbnRzLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9qaWtlc3J2bS9TaXplQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MWI4M2IuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvamlrZXNydm0vU2l6ZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5qaWtlc3J2bTsKLQotaW1wb3J0IG9yZy5qMy5ydW50aW1lLlZNOwotCi0vKioKLSAqIENvbnN0YW50cyBkZWZpbmluZyB0aGUgYmFzaWMgc2l6ZXMgb2YgcHJpbWl0aXZlIHF1YW50aXRpZXMKLSAqLwotcHVibGljIGludGVyZmFjZSBTaXplQ29uc3RhbnRzIHsKLQotICBpbnQgTE9HX0JZVEVTX0lOX0JZVEUgPSAwOwotICBpbnQgQllURVNfSU5fQllURSA9IDE7Ci0gIGludCBMT0dfQklUU19JTl9CWVRFID0gMzsKLSAgaW50IEJJVFNfSU5fQllURSA9IDEgPDwgTE9HX0JJVFNfSU5fQllURTsKLQotICBpbnQgTE9HX0JZVEVTX0lOX0JPT0xFQU4gPSAwOwotICBpbnQgQllURVNfSU5fQk9PTEVBTiA9IDEgPDwgTE9HX0JZVEVTX0lOX0JPT0xFQU47Ci0gIGludCBMT0dfQklUU19JTl9CT09MRUFOID0gTE9HX0JJVFNfSU5fQllURSArIExPR19CWVRFU19JTl9CT09MRUFOOwotICBpbnQgQklUU19JTl9CT09MRUFOID0gMSA8PCBMT0dfQklUU19JTl9CT09MRUFOOwotCi0gIGludCBMT0dfQllURVNfSU5fQ0hBUiA9IDE7Ci0gIGludCBCWVRFU19JTl9DSEFSID0gMSA8PCBMT0dfQllURVNfSU5fQ0hBUjsKLSAgaW50IExPR19CSVRTX0lOX0NIQVIgPSBMT0dfQklUU19JTl9CWVRFICsgTE9HX0JZVEVTX0lOX0NIQVI7Ci0gIGludCBCSVRTX0lOX0NIQVIgPSAxIDw8IExPR19CSVRTX0lOX0NIQVI7Ci0KLSAgaW50IExPR19CWVRFU19JTl9TSE9SVCA9IDE7Ci0gIGludCBCWVRFU19JTl9TSE9SVCA9IDEgPDwgTE9HX0JZVEVTX0lOX1NIT1JUOwotICBpbnQgTE9HX0JJVFNfSU5fU0hPUlQgPSBMT0dfQklUU19JTl9CWVRFICsgTE9HX0JZVEVTX0lOX1NIT1JUOwotICBpbnQgQklUU19JTl9TSE9SVCA9IDEgPDwgTE9HX0JJVFNfSU5fU0hPUlQ7Ci0KLSAgaW50IExPR19CWVRFU19JTl9JTlQgPSAyOwotICBpbnQgQllURVNfSU5fSU5UID0gMSA8PCBMT0dfQllURVNfSU5fSU5UOwotICBpbnQgTE9HX0JJVFNfSU5fSU5UID0gTE9HX0JJVFNfSU5fQllURSArIExPR19CWVRFU19JTl9JTlQ7Ci0gIGludCBCSVRTX0lOX0lOVCA9IDEgPDwgTE9HX0JJVFNfSU5fSU5UOwotCi0gIGludCBMT0dfQllURVNfSU5fRkxPQVQgPSAyOwotICBpbnQgQllURVNfSU5fRkxPQVQgPSAxIDw8IExPR19CWVRFU19JTl9GTE9BVDsKLSAgaW50IExPR19CSVRTX0lOX0ZMT0FUID0gTE9HX0JJVFNfSU5fQllURSArIExPR19CWVRFU19JTl9GTE9BVDsKLSAgaW50IEJJVFNfSU5fRkxPQVQgPSAxIDw8IExPR19CSVRTX0lOX0ZMT0FUOwotCi0gIGludCBMT0dfQllURVNfSU5fTE9ORyA9IDM7Ci0gIGludCBCWVRFU19JTl9MT05HID0gMSA8PCBMT0dfQllURVNfSU5fTE9ORzsKLSAgaW50IExPR19CSVRTX0lOX0xPTkcgPSBMT0dfQklUU19JTl9CWVRFICsgTE9HX0JZVEVTX0lOX0xPTkc7Ci0gIGludCBCSVRTX0lOX0xPTkcgPSAxIDw8IExPR19CSVRTX0lOX0xPTkc7Ci0KLSAgaW50IExPR19CWVRFU19JTl9ET1VCTEUgPSAzOwotICBpbnQgQllURVNfSU5fRE9VQkxFID0gMSA8PCBMT0dfQllURVNfSU5fRE9VQkxFOwotICBpbnQgTE9HX0JJVFNfSU5fRE9VQkxFID0gTE9HX0JJVFNfSU5fQllURSArIExPR19CWVRFU19JTl9ET1VCTEU7Ci0gIGludCBCSVRTX0lOX0RPVUJMRSA9IDEgPDwgTE9HX0JJVFNfSU5fRE9VQkxFOwotCi0gIGludCBMT0dfQllURVNfSU5fQUREUkVTUyA9IFZNLkJ1aWxkRm9yNjRBZGRyID8gMyA6IDI7Ci0gIGludCBCWVRFU19JTl9BRERSRVNTID0gMSA8PCBMT0dfQllURVNfSU5fQUREUkVTUzsKLSAgaW50IExPR19CSVRTX0lOX0FERFJFU1MgPSBMT0dfQklUU19JTl9CWVRFICsgTE9HX0JZVEVTX0lOX0FERFJFU1M7Ci0gIGludCBCSVRTX0lOX0FERFJFU1MgPSAxIDw8IExPR19CSVRTX0lOX0FERFJFU1M7Ci0KLSAgaW50IExPR19CWVRFU19JTl9XT1JEID0gVk0uQnVpbGRGb3I2NEFkZHIgPyAzIDogMjsKLSAgaW50IEJZVEVTX0lOX1dPUkQgPSAxIDw8IExPR19CWVRFU19JTl9XT1JEOwotICBpbnQgTE9HX0JJVFNfSU5fV09SRCA9IExPR19CSVRTX0lOX0JZVEUgKyBMT0dfQllURVNfSU5fV09SRDsKLSAgaW50IEJJVFNfSU5fV09SRCA9IDEgPDwgTE9HX0JJVFNfSU5fV09SRDsKLQotICBpbnQgTE9HX0JZVEVTX0lOX1BBR0UgPSAxMjsKLSAgaW50IEJZVEVTX0lOX1BBR0UgPSAxIDw8IExPR19CWVRFU19JTl9QQUdFOwotICBpbnQgTE9HX0JJVFNfSU5fUEFHRSA9IExPR19CSVRTX0lOX0JZVEUgKyBMT0dfQllURVNfSU5fUEFHRTsKLSAgaW50IEJJVFNfSU5fUEFHRSA9IDEgPDwgTE9HX0JJVFNfSU5fUEFHRTsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9Db2xsZWN0b3JDb250ZXh0LmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vQ29sbGVjdG9yQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWE0MTAzLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9Db2xsZWN0b3JDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW47Ci0KLWltcG9ydCBvcmcubW10ay5wb2xpY3kuSW1tb3J0YWxMb2NhbDsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LnNhbml0eWNoZWNrZXIuU2FuaXR5Q2hlY2tlckxvY2FsOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuYWxsb2MuQWxsb2NhdG9yOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuYWxsb2MuQnVtcFBvaW50ZXI7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Db25zdGFudHM7Ci0KLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIChhbmQgaXRzIHN1Yi1jbGFzc2VzKSBpbXBsZW1lbnQgPGk+cGVyLWNvbGxlY3RvciB0aHJlYWQ8L2k+Ci0gKiBiZWhhdmlvci4gIFdlIGFzc3VtZSA8aT5OPC9pPiBjb2xsZWN0b3IgdGhyZWFkcyBhbmQgPGk+TTwvaT4KLSAqIG11dGF0b3IgdGhyZWFkcywgd2hlcmUgPGk+TjwvaT4gaXMgb2Z0ZW4gZXF1YWwgdG8gdGhlIG51bWJlciBvZgotICogYXZhaWxhYmxlIHByb2Nlc3NvcnMsIFAgKGZvciBQLXdheSBwYXJhbGxlbGlzbSBhdCBHQy10aW1lKSwgYW5kCi0gKiA8aT5NPC9pPiBtYXkgc2ltcGx5IGJlIHRoZSBudW1iZXIgb2YgbXV0YXRvciAoYXBwbGljYXRpb24pIHRocmVhZHMuCi0gKiBCb3RoIDxpPk48L2k+IGFuZCA8aT5NPC9pPiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgVk0sIG5vdCBNTVRrLiAgSW4KLSAqIHRoZSBjYXNlIHdoZXJlIGEgVk0gdXNlcyBwb3NpeCB0aHJlYWRzIChwdGhyZWFkcykgZm9yIGVhY2ggbXV0YXRvcgotICogKCIxOjEiIHRocmVhZGluZyksIDxpPk08L2k+IHdpbGwgdHlwaWNhbGx5IGJlIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YKLSAqIG11dGF0b3IgdGhyZWFkcy4gIFdoZW4gYSB1c2VzICJncmVlbiB0aHJlYWRzIiBvciBhIGh5YnJpZCB0aHJlYWRpbmcKLSAqIHNjaGVtZSAoc3VjaCBhcyBKaWtlcyBSVk0pLCA8aT5NPC9pPiB3aWxsIHR5cGljYWxseSBiZSBlcXVhbCB0byB0aGUKLSAqIGxldmVsIG9mIDxpPnRydWU8L2k+IHBhcmFsbGVsaXNtIChpZSB0aGUgbnVtYmVyIG9mIHVuZGVybHlpbmcKLSAqIGtlcm5lbCB0aHJlYWRzKS48L3A+Ci0gKgotICogPHA+Q29sbGVjdG9yIG9wZXJhdGlvbnMgYXJlIHNlcGFyYXRlZCBpbnRvIDxpPnBlci1jb2xsZWN0b3IgdGhyZWFkPC9pPgotICogb3BlcmF0aW9ucyAodGhlIGJ1bGsgb2YgdGhlIEdDKSwgYW5kIDxpPnBlci1tdXRhdG9yIHRocmVhZDwvaT4gb3BlcmF0aW9ucwotICogKGltcG9ydGFudCBpbiBmbHVzaGluZyBhbmQgcmVzdG9yaW5nIHBlci1tdXRhdG9yIHN0YXRlIHN1Y2ggYXMgYWxsb2NhdG9yCi0gKiBzdGF0ZSBhbmQgd3JpdGUgYnVmZmVyL3JlbXNldCBzdGF0ZSkuICB7QGxpbmsgU2ltcGxlUGhhc2V9Ci0gKiBlbnN1cmVzIHRoYXQgcGVyLWNvbGxlY3RvciB0aHJlYWQgR0MgcGhhc2VzIGFyZSBwZXJmb3JtZWQgYnkgZWFjaAotICogY29sbGVjdG9yIHRocmVhZCwgYW5kIHRoYXQgdGhlIDxpPk08L2k+IHBlci1tdXRhdG9yIHRocmVhZCBvcGVyYXRpb25zCi0gKiBhcmUgbXVsdGlwbGV4ZWQgYWNyb3NzIHRoZSA8aT5OPC9pPiBhY3RpdmUgY29sbGVjdG9yIHRocmVhZHMuPC9wPgotICoKLSAqIDxwPk1NVGsgYXNzdW1lcyB0aGF0IHRoZSBWTSBpbnN0YW50aWF0ZXMgaW5zdGFuY2VzIG9mIHtAbGluayBDb2xsZWN0b3JDb250ZXh0fQotICogaW4gdGhyZWFkIGxvY2FsIHN0b3JhZ2UgKFRMUykgZm9yIGVhY2ggdGhyZWFkIHBhcnRpY2lwYXRpbmcgaW4KLSAqIGNvbGxlY3Rpb24uICBBY2Nlc3NlcyB0byB0aGlzIHN0YXRlIGFyZSB0aGVyZWZvcmUgYXNzdW1lZCB0byBiZQotICogbG93LWNvc3QgYXQgR0MgdGltZS48cD4KLSAqCi0gKiA8cD5NTVRrIGV4cGxpY2l0bHkgc2VwYXJhdGVzIHRocmVhZC1sb2NhbCAodGhpcyBjbGFzcykgYW5kIGdsb2JhbAotICogb3BlcmF0aW9ucyAoU2VlIHtAbGluayBQbGFufSksIHNvIHRoYXQgc3luY3Job25pemF0aW9uIGlzIGxvY2FsaXplZAotICogYW5kIGV4cGxpY2l0LCBhbmQgdGh1cyBob3BlZnVsbHkgbWluaW1pemVkIChTZWUge0BsaW5rIFBsYW59KS4gR2xvYmFsIChQbGFuKQotICogYW5kIHBlci10aHJlYWQgKHRoaXMgY2xhc3MpIHN0YXRlIGFyZSBhbHNvIGV4cGxpY2l0bHkgc2VwYXJhdGVkLgotICogT3BlcmF0aW9ucyBpbiB0aGlzIGNsYXNzIChhbmQgaXRzIGNoaWxkcmVuKSBhcmUgdGhlcmVmb3JlIHN0cmljdGx5Ci0gKiBsb2NhbCB0byBlYWNoIGNvbGxlY3RvciB0aHJlYWQsIGFuZCBzeW5jaHJvbml6ZWQgb3BlcmF0aW9ucyBhbHdheXMKLSAqIGhhcHBlbiB2aWEgYWNjZXNzIHRvIGV4cGxpY2l0bHkgZ2xvYmFsIGNsYXNzZXMgc3VjaCBhcyBQbGFuIGFuZCBpdHMKLSAqIGNoaWxkcmVuLjwvcD4KLSAqCi0gKiA8cD5UaGlzIGNsYXNzIChhbmQgaXRzIGNoaWxkcmVuKSB0aGVyZWZvcmUgdHlwaWNhbGx5IGltcGxlbWVudCBwZXItY29sbGVjdG9yCi0gKiB0aHJlYWQgc3RydWN0dXJlcyBzdWNoIGFzIGNvbGxlY3Rpb24gd29yayBxdWV1ZXMuPC9wPgotICoKLSAqIEBzZWUgTXV0YXRvckNvbnRleHQKLSAqIEBzZWUgb3JnLm1tdGsudm0uQWN0aXZlUGxhbgotICogQHNlZSBQbGFuCi0gKi8KLUBVbmludGVycnVwdGlibGUgcHVibGljIGFic3RyYWN0IGNsYXNzIENvbGxlY3RvckNvbnRleHQgaW1wbGVtZW50cyBDb25zdGFudHMgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIEluc3RhbmNlIGZpZWxkcwotICAgKi8KLSAgLyoqIFVuaXF1ZSBjb2xsZWN0b3IgaWRlbnRpZmllciAqLwotICBwcml2YXRlIGludCBpZDsKLQotICAvKiogUGVyLWNvbGxlY3RvciBhbGxvY2F0b3IgaW50byB0aGUgaW1tb3J0YWwgc3BhY2UgKi8KLSAgcHJvdGVjdGVkIGZpbmFsIEJ1bXBQb2ludGVyIGltbW9ydGFsID0gbmV3IEltbW9ydGFsTG9jYWwoUGxhbi5pbW1vcnRhbFNwYWNlKTsKLQotICAvKiogVXNlZCBmb3IgYWJvcnRpbmcgY29uY3VycmVudCBwaGFzZXMgcHJlLWVtcHRlZCBieSBzdG9wIHRoZSB3b3JsZCBjb2xsZWN0aW9uICovCi0gIHByb3RlY3RlZCBib29sZWFuIHJlc2V0Q29uY3VycmVudFdvcms7Ci0KLSAgLyoqIFVzZWQgZm9yIHNhbml0eSBjaGVja2luZyAqLwotICBwcm90ZWN0ZWQgZmluYWwgU2FuaXR5Q2hlY2tlckxvY2FsIHNhbml0eUxvY2FsID0gbmV3IFNhbml0eUNoZWNrZXJMb2NhbCgpOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluaXRpYWxpemF0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgQ29sbGVjdG9yQ29udGV4dCgpIHsKLSAgfQotCi0gIC8qKgotICAgKiBOb3RpZnkgdGhhdCB0aGUgY29sbGVjdG9yIGNvbnRleHQgaXMgcmVnaXN0ZXJlZCBhbmQgcmVhZHkgdG8gZXhlY3V0ZS4KLSAgICoKLSAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGlzIGNvbGxlY3RvciBjb250ZXh0LgotICAgKi8KLSAgcHVibGljIHZvaWQgaW5pdENvbGxlY3RvcihpbnQgaWQpIHsKLSAgICB0aGlzLmlkID0gaWQ7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBDb2xsZWN0aW9uLXRpbWUgYWxsb2NhdGlvbi4KLSAgICovCi0KLSAgLyoqCi0gICAqIEFsbG9jYXRlIG1lbW9yeSB3aGVuIGNvcHlpbmcgYW4gb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gb3JpZ2luYWwgVGhlIG9iamVjdCB0aGF0IGlzIGJlaW5nIGNvcGllZC4KLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBjb3B5LgotICAgKiBAcGFyYW0gYWxpZ24gUmVxdWlyZWQgYWxpZ25tZW50IGZvciB0aGUgY29weS4KLSAgICogQHBhcmFtIG9mZnNldCBPZmZzZXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbGlnbm1lbnQuCi0gICAqIEBwYXJhbSBhbGxvY2F0b3IgVGhlIGFsbG9jYXRvciBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXF1ZXN0LgotICAgKiBAcmV0dXJuIFRoZSBhZGRyZXNzIG9mIHRoZSBuZXdseSBhbGxvY2F0ZWQgcmVnaW9uLgotICAgKi8KLSAgcHVibGljIEFkZHJlc3MgYWxsb2NDb3B5KE9iamVjdFJlZmVyZW5jZSBvcmlnaW5hbCwgaW50IGJ5dGVzLAotICAgICAgaW50IGFsaWduLCBpbnQgb2Zmc2V0LCBpbnQgYWxsb2NhdG9yKSB7Ci0gICAgVk0uYXNzZXJ0aW9ucy5mYWlsKCJDb2xsZWN0b3IgaGFzIG5vdCBpbXBsZW1lbnRlZCBhbGxvY0NvcHkiKTsKLSAgICByZXR1cm4gQWRkcmVzcy5tYXgoKTsKLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIGFueSBwb3N0LWNvcHkgYWN0aW9ucy4KLSAgICoKLSAgICogQHBhcmFtIHJlZiBUaGUgbmV3bHkgYWxsb2NhdGVkIG9iamVjdC4KLSAgICogQHBhcmFtIHR5cGVSZWYgdGhlIHR5cGUgcmVmZXJlbmNlIGZvciB0aGUgaW5zdGFuY2UgYmVpbmcgY3JlYXRlZC4KLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBzaXplIG9mIHRoZSBzcGFjZSB0byBiZSBhbGxvY2F0ZWQgKGluIGJ5dGVzKS4KLSAgICogQHBhcmFtIGFsbG9jYXRvciBUaGUgYWxsb2NhdG9yIHN0YXRpY2FsbHkgYXNzaWduZWQgdG8gdGhpcyBhbGxvY2F0aW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgcG9zdENvcHkoT2JqZWN0UmVmZXJlbmNlIHJlZiwgT2JqZWN0UmVmZXJlbmNlIHR5cGVSZWYsCi0gICAgICBpbnQgYnl0ZXMsIGludCBhbGxvY2F0b3IpIHsKLSAgICBWTS5hc3NlcnRpb25zLmZhaWwoIkNvbGxlY3RvciBoYXMgbm90IGltcGxlbWVudGVkIHBvc3RDb3B5Iik7Ci0gIH0KLQotICAvKioKLSAgICogUnVuLXRpbWUgY2hlY2sgb2YgdGhlIGFsbG9jYXRvciB0byB1c2UgZm9yIGEgZ2l2ZW4gY29weSBhbGxvY2F0aW9uCi0gICAqCi0gICAqIEF0IHRoZSBtb21lbnQgdGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IGFsbG9jYXRvcnMgd2lsbCB1c2UgdGhlIHNpbXBsZQotICAgKiAod29yc3QpIG1ldGhvZCBvZiBhbGlnbmluZyB0byBkZXRlcm1pbmUgaWYgdGhlIG9iamVjdCBpcyBhIGxhcmdlIG9iamVjdAotICAgKiB0byBlbnN1cmUgdGhhdCBubyBvYmplY3RzIGFyZSBsYXJnZXIgdGhhbiBvdGhlciBhbGxvY2F0b3JzIGNhbiBoYW5kbGUuCi0gICAqCi0gICAqIEBwYXJhbSBmcm9tIFRoZSBvYmplY3QgdGhhdCBpcyBiZWluZyBjb3BpZWQuCi0gICAqIEBwYXJhbSBieXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGFsbG9jYXRlZC4KLSAgICogQHBhcmFtIGFsaWduIFRoZSByZXF1ZXN0ZWQgYWxpZ25tZW50LgotICAgKiBAcGFyYW0gYWxsb2NhdG9yIFRoZSBhbGxvY2F0b3Igc3RhdGljYWxseSBhc3NpZ25lZCB0byB0aGlzIGFsbG9jYXRpb24uCi0gICAqIEByZXR1cm4gVGhlIGFsbG9jYXRvciBkeW5jYW1pY2FsbHkgYXNzaWduZWQgdG8gdGhpcyBhbGxvY2F0aW9uLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgaW50IGNvcHlDaGVja0FsbG9jYXRvcihPYmplY3RSZWZlcmVuY2UgZnJvbSwgaW50IGJ5dGVzLAotICAgICAgaW50IGFsaWduLCBpbnQgYWxsb2NhdG9yKSB7Ci0gICAgICBib29sZWFuIGxhcmdlID0gQWxsb2NhdG9yLmdldE1heGltdW1BbGlnbmVkU2l6ZShieXRlcywgYWxpZ24pID4gUGxhbi5NQVhfTk9OX0xPU19DT1BZX0JZVEVTOwotICAgICAgcmV0dXJuIGxhcmdlID8gUGxhbi5BTExPQ19MT1MgOiBhbGxvY2F0b3I7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBDb2xsZWN0aW9uLgotICAgKi8KLQotICAvKiogUGVyZm9ybSBhIGdhcmJhZ2UgY29sbGVjdGlvbiAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjb2xsZWN0KCk7Ci0KLSAgLyoqIFBlcmZvcm0gc29tZSBjb25jdXJyZW50IGdhcmJhZ2UgY29sbGVjdGlvbiAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjb25jdXJyZW50Q29sbGVjdCgpOwotCi0gIC8qKgotICAgKiBQZXJmb3JtIGEgKGxvY2FsKSBjb2xsZWN0aW9uIHBoYXNlLgotICAgKgotICAgKiBAcGFyYW0gcGhhc2VJZCBUaGUgdW5pcXVlIHBoYXNlIGlkZW50aWZpZXIKLSAgICogQHBhcmFtIHByaW1hcnkgU2hvdWxkIHRoaXMgdGhyZWFkIGJlIHVzZWQgdG8gZXhlY3V0ZSBhbnkgc2luZ2xlLXRocmVhZGVkCi0gICAqIGxvY2FsIG9wZXJhdGlvbnM/Ci0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjb2xsZWN0aW9uUGhhc2Uoc2hvcnQgcGhhc2VJZCwgYm9vbGVhbiBwcmltYXJ5KTsKLQotICAvKioKLSAgICogUGVyZm9ybSBzb21lIGNvbmN1cnJlbnQgY29sbGVjdGlvbiB3b3JrLgotICAgKgotICAgKiBAcGFyYW0gcGhhc2VJZCBUaGUgdW5pcXVlIHBoYXNlIGlkZW50aWZpZXIKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNvbmN1cnJlbnRDb2xsZWN0aW9uUGhhc2Uoc2hvcnQgcGhhc2VJZCk7Ci0KLSAgLyoqIEByZXR1cm4gVGhlIGN1cnJlbnQgdHJhY2UgaW5zdGFuY2UuICovCi0gIHB1YmxpYyBhYnN0cmFjdCBUcmFjZUxvY2FsIGdldEN1cnJlbnRUcmFjZSgpOwotCi0gIC8qKgotICAgKiBBYm9ydCBjb25jdXJyZW50IHdvcmsgZHVlIHRvIHByZS1lbXB0IGJ5IHN0b3AgdGhlIHdvcmxkIGNvbGxlY3Rpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCByZXNldENvbmN1cnJlbnRXb3JrKCkgewotICAgIHJlc2V0Q29uY3VycmVudFdvcmsgPSB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIEFsbG93IGNvbmN1cnJlbnQgd29yayB0byBjb250aW51ZS4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNsZWFyUmVzZXRDb25jdXJyZW50V29yaygpIHsKLSAgICByZXNldENvbmN1cnJlbnRXb3JrID0gZmFsc2U7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBNaXNjZWxsYW5lb3VzLgotICAgKi8KLQotICAvKiogQHJldHVybiB0aGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgY29sbGVjdG9yIGNvbnRleHQuICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGludCBnZXRJZCgpIHsgcmV0dXJuIGlkOyB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vQ29tcGxleFBoYXNlLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vQ29tcGxleFBoYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1Mjk0OTYuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL0NvbXBsZXhQaGFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuOwotCi1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5zdGF0aXN0aWNzLlRpbWVyOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuTG9nOwotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogUGhhc2VzIG9mIGEgZ2FyYmFnZSBjb2xsZWN0aW9uLgotICoKLSAqIEEgY29tcGxleCBwaGFzZSBpcyBhIHNlcXVlbmNlIG9mIHBoYXNlcy4KLSAqCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBmaW5hbCBjbGFzcyBDb21wbGV4UGhhc2UgZXh0ZW5kcyBQaGFzZQotICBpbXBsZW1lbnRzIENvbnN0YW50cyB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogSW5zdGFuY2UgZmllbGRzCi0gICAqLwotCi0gIC8qKgotICAgKiBUaGUgcGhhc2VzIHRoYXQgY29tcHJpc2UgdGhpcyBwaGFzZS4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgaW50W10gc2NoZWR1bGVkU3ViUGhhc2VzOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYSBjb21wbGV4IHBoYXNlIGZyb20gYW4gYXJyYXkgb2YgcGhhc2UgSURzLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcGhhc2UuCi0gICAqIEBwYXJhbSBzY2hlZHVsZWRTdWJQaGFzZXMgVGhlIHN1YiBwaGFzZXMKLSAgICovCi0gIHByb3RlY3RlZCBDb21wbGV4UGhhc2UoU3RyaW5nIG5hbWUsIGludFtdIHNjaGVkdWxlZFN1YlBoYXNlcykgewotICAgIHN1cGVyKG5hbWUpOwotICAgIHRoaXMuc2NoZWR1bGVkU3ViUGhhc2VzID0gc2NoZWR1bGVkU3ViUGhhc2VzOwotICAgIGNoZWNrUGhhc2VzKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0IGEgY29tcGxleCBwaGFzZSBmcm9tIGFuIGFycmF5IG9mIHBoYXNlIElEcywgYnV0IHVzaW5nCi0gICAqIHRoZSBzcGVjaWZpZWQgdGltZXIgcmF0aGVyIHRoYW4gY3JlYXRpbmcgb25lLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcGhhc2UuCi0gICAqIEBwYXJhbSB0aW1lciBUaGUgdGltZXIgZm9yIHRoaXMgcGhhc2UgdG8gY29udHJpYnV0ZSB0by4KLSAgICogQHBhcmFtIHNjaGVkdWxlZFN1YlBoYXNlcyBUaGUgc3ViIHBoYXNlcwotICAgKi8KLSAgcHJvdGVjdGVkIENvbXBsZXhQaGFzZShTdHJpbmcgbmFtZSwgVGltZXIgdGltZXIsIGludFtdIHNjaGVkdWxlZFN1YlBoYXNlcykgewotICAgIHN1cGVyKG5hbWUsIHRpbWVyKTsKLSAgICB0aGlzLnNjaGVkdWxlZFN1YlBoYXNlcyA9IHNjaGVkdWxlZFN1YlBoYXNlczsKLSAgICBjaGVja1BoYXNlcygpOwotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBzY2hlZHVsZWQgc3ViIHBoYXNlcy4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBjaGVja1BoYXNlcygpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIHsKLSAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChzY2hlZHVsZWRTdWJQaGFzZXMubGVuZ3RoID4gMCk7Ci0gICAgICBmb3IoaW50IHNjaGVkdWxlZFBoYXNlOiBzY2hlZHVsZWRTdWJQaGFzZXMpIHsKLSAgICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGdldFNjaGVkdWxlKHNjaGVkdWxlZFBoYXNlKSA+IDApOwotICAgICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZ2V0UGhhc2VJZChzY2hlZHVsZWRQaGFzZSkgPiAwKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzY2hlZHVsZWQgc3ViIHBoYXNlcy4KLSAgICovCi0gIHByb3RlY3RlZCBpbnQgY291bnQoKSB7Ci0gICAgcmV0dXJuIHNjaGVkdWxlZFN1YlBoYXNlcy5sZW5ndGg7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIGFuIGluZGl2aWR1YWwgc2NoZWR1bGVkIHN1YiBwaGFzZS4KLSAgICoKLSAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleAotICAgKiBAcmV0dXJuIFRoZSBzY2hlZHVsZWQgcGhhc2UuCi0gICAqLwotICBwcm90ZWN0ZWQgaW50IGdldChpbnQgaW5kZXgpIHsKLSAgICByZXR1cm4gc2NoZWR1bGVkU3ViUGhhc2VzW2luZGV4XTsKLSAgfQotCi0gIC8qKgotICAgKiBEaXNwbGF5IGEgZGVzY3JpcHRpb24gb2YgdGhpcyBwaGFzZSwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGxvZ1BoYXNlKCkgewotICAgIExvZy53cml0ZSgiQ29tcGxleFBoYXNlKCIpOwotICAgIExvZy53cml0ZShuYW1lKTsKLSAgICBMb2cud3JpdGUoIiwgPCAiKTsKLSAgICBmb3IgKGludCBzdWJQaGFzZSA6IHNjaGVkdWxlZFN1YlBoYXNlcykgewotICAgICAgc2hvcnQgb3JkZXJpbmcgPSBnZXRTY2hlZHVsZShzdWJQaGFzZSk7Ci0gICAgICBzaG9ydCBwaGFzZUlkID0gZ2V0UGhhc2VJZChzdWJQaGFzZSk7Ci0gICAgICBMb2cud3JpdGUoZ2V0U2NoZWR1bGVOYW1lKG9yZGVyaW5nKSk7Ci0gICAgICBMb2cud3JpdGUoIigiKTsKLSAgICAgIExvZy53cml0ZShnZXROYW1lKHBoYXNlSWQpKTsKLSAgICAgIExvZy53cml0ZSgiKSAiKTsKLSAgICB9Ci0gICAgTG9nLndyaXRlKCI+KSIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlcGxhY2UgYSBzY2hlZHVsZWQgcGhhc2UuIFVzZWQgZm9yIGV4YW1wbGUgdG8gcmVwbGFjZSBhIHBsYWNlaG9sZGVyLgotICAgKgotICAgKiBAcGFyYW0gb2xkU2NoZWR1bGVkUGhhc2UgVGhlIHNjaGVkdWxlZCBwaGFzZSB0byByZXBsYWNlLgotICAgKiBAcGFyYW0gbmV3U2NoZWR1bGVkUGhhc2UgVGhlIG5ldyBzY2hlZHVsZWQgcGhhc2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXBsYWNlUGhhc2UoaW50IG9sZFNjaGVkdWxlZFBoYXNlLCBpbnQgbmV3U2NoZWR1bGVkUGhhc2UpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVkdWxlZFN1YlBoYXNlcy5sZW5ndGg7IGkrKykgewotICAgICAgaW50IHNjaGVkdWxlZFBoYXNlID0gc2NoZWR1bGVkU3ViUGhhc2VzW2ldOwotICAgICAgaWYgKHNjaGVkdWxlZFBoYXNlID09IG9sZFNjaGVkdWxlZFBoYXNlKSB7Ci0gICAgICAgIC8qIFJlcGxhY2UgKi8KLSAgICAgICAgc2NoZWR1bGVkU3ViUGhhc2VzW2ldID0gbmV3U2NoZWR1bGVkUGhhc2U7Ci0gICAgICB9IGVsc2UgaWYgKGdldFNjaGVkdWxlKHNjaGVkdWxlZFBoYXNlKSA9PSBTQ0hFRFVMRV9DT01QTEVYKSB7Ci0gICAgICAgIC8qIFJlY3Vyc2UgKi8KLSAgICAgICAgQ29tcGxleFBoYXNlIHAgPSAoQ29tcGxleFBoYXNlKWdldFBoYXNlKGdldFBoYXNlSWQoc2NoZWR1bGVkUGhhc2UpKTsKLSAgICAgICAgcC5yZXBsYWNlUGhhc2Uob2xkU2NoZWR1bGVkUGhhc2UsIG5ld1NjaGVkdWxlZFBoYXNlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9HQ3NweVBsYW4uamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9HQ3NweVBsYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI5MzFkYi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vR0NzcHlQbGFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbjsKLQotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5JbW1vcnRhbFNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuaGVhcC5WTVJlcXVlc3Q7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgYW4gaW1tb3J0YWwgYWxsb2NhdGlvbiBzcGFjZSBmb3IgR0NzcHkgb2JqZWN0cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBHQ3NweVBsYW4gewotCi0gIC8qKgotICAgKiBBbnkgR0NzcHkgb2JqZWN0cyBhbGxvY2F0ZWQgYWZ0ZXIgYm9vdGluZyBhcmUgYWxsb2NhdGVkCi0gICAqIGluIGEgc2VwYXJhdGUgaW1tb3J0YWwgc3BhY2UuCi0gICAqLwotICBJbW1vcnRhbFNwYWNlIGdjc3B5U3BhY2UgPQotICAgICAgbmV3IEltbW9ydGFsU3BhY2UoImdjc3B5IiwgUGxhbi5ERUZBVUxUX1BPTExfRlJFUVVFTkNZLCBWTVJlcXVlc3QuY3JlYXRlKCkpOwotCi0gIC8qKiBUaGUgZGVzY3JpcHRvciBmb3IgdGhlIEdDc3B5IGFsbG9jYXRpb24gc3BhY2UgKi8KLSAgaW50IEdDU1BZID0gZ2NzcHlTcGFjZS5nZXREZXNjcmlwdG9yKCk7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vTXV0YXRvckNvbnRleHQuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9NdXRhdG9yQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzdiNWRkLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9NdXRhdG9yQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2MiArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbjsKLQotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5NYXJrU3dlZXBMb2NhbDsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LkltbW9ydGFsTG9jYWw7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LkxhcmdlT2JqZWN0TG9jYWw7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5hbGxvYy5BbGxvY2F0b3I7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5hbGxvYy5CdW1wUG9pbnRlcjsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkNvbnN0YW50czsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkxvZzsKLQotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgKGFuZCBpdHMgc3ViLWNsYXNzZXMpIGltcGxlbWVudCA8aT5wZXItbXV0YXRvciB0aHJlYWQ8L2k+Ci0gKiBiZWhhdmlvci4gIFdlIGFzc3VtZSA8aT5OPC9pPiBjb2xsZWN0b3IgdGhyZWFkcyBhbmQgPGk+TTwvaT4KLSAqIG11dGF0b3IgdGhyZWFkcywgd2hlcmUgPGk+TjwvaT4gaXMgb2Z0ZW4gZXF1YWwgdG8gdGhlIG51bWJlciBvZgotICogYXZhaWxhYmxlIHByb2Nlc3NvcnMsIFAgKGZvciBQLXdheSBwYXJhbGxlbGlzbSBhdCBHQy10aW1lKSwgYW5kCi0gKiA8aT5NPC9pPiBtYXkgc2ltcGx5IGJlIHRoZSBudW1iZXIgb2YgbXV0YXRvciAoYXBwbGljYXRpb24pIHRocmVhZHMuCi0gKiBCb3RoIDxpPk48L2k+IGFuZCA8aT5NPC9pPiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgVk0sIG5vdCBNTVRrLiAgSW4KLSAqIHRoZSBjYXNlIHdoZXJlIGEgVk0gdXNlcyBwb3NpeCB0aHJlYWRzIChwdGhyZWFkcykgZm9yIGVhY2ggbXV0YXRvcgotICogKCIxOjEiIHRocmVhZGluZyksIDxpPk08L2k+IHdpbGwgdHlwaWNhbGx5IGJlIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YKLSAqIG11dGF0b3IgdGhyZWFkcy4gIFdoZW4gYSB1c2VzICJncmVlbiB0aHJlYWRzIiBvciBhIGh5YnJpZCB0aHJlYWRpbmcKLSAqIHNjaGVtZSAoc3VjaCBhcyBKaWtlcyBSVk0pLCA8aT5NPC9pPiB3aWxsIHR5cGljYWxseSBiZSBlcXVhbCB0byB0aGUKLSAqIGxldmVsIG9mIDxpPnRydWU8L2k+IHBhcmFsbGVsaXNtIChpZSB0aGUgbnVtYmVyIG9mIHVuZGVybHlpbmcKLSAqIGtlcm5lbCB0aHJlYWRzKS48cD4KLSAqCi0gKiBNTVRrIGFzc3VtZXMgdGhhdCB0aGUgVk0gaW5zdGFudGlhdGVzIGluc3RhbmNlcyBvZiBNdXRhdG9yQ29udGV4dAotICogaW4gdGhyZWFkIGxvY2FsIHN0b3JhZ2UgKFRMUykgZm9yIGVhY2ggdGhyZWFkIHBhcnRpY2lwYXRpbmcgaW4KLSAqIGNvbGxlY3Rpb24uICBBY2Nlc3NlcyB0byB0aGlzIHN0YXRlIGFyZSB0aGVyZWZvcmUgYXNzdW1lZCB0byBiZQotICogbG93LWNvc3QgZHVyaW5nIG11dGF0b3IgdGltZS48cD4KLSAqCi0gKiBUaGlzIGNsYXNzIChhbmQgaXRzIGNoaWxkcmVuKSBpcyB0aGVyZWZvcmUgdXNlZCBmb3IgdW5zeW5jaHJvbml6ZWQKLSAqIHBlci1tdXRhdG9yIG9wZXJhdGlvbnMgc3VjaCBhcyA8aT5hbGxvY2F0aW9uPC9pPiBhbmQgPGk+d3JpdGUgYmFycmllcnM8L2k+LgotICogVGhlIHNlbWFudGljcyBhbmQgbmVjZXNzYXJ5IHN0YXRlIGZvciB0aGVzZSBvcGVyYXRpb25zIGFyZSB0aGVyZWZvcmUKLSAqIHNwZWNpZmllZCBpbiB0aGUgR0Mtc3BlY2lmaWMgc3ViY2xhc3NlcyBvZiB0aGlzIGNsYXNzLgotICoKLSAqIE1NVGsgZXhwbGljaXRseSBzZXBhcmF0ZXMgdGhyZWFkLWxvY2FsICh0aGlzIGNsYXNzKSBhbmQgZ2xvYmFsCi0gKiBvcGVyYXRpb25zIChAc2VlIFBsYW4pLCBzbyB0aGF0IHN5bmNyaG9uaXphdGlvbiBpcyBsb2NhbGl6ZWQKLSAqIGFuZCBleHBsaWNpdCwgYW5kIHRodXMgaG9wZWZ1bGx5IG1pbmltaXplZCAoQHNlZSBQbGFuKS4gR2xvYWJsIChQbGFuKQotICogYW5kIHBlci10aHJlYWQgKHRoaXMgY2xhc3MpIHN0YXRlIGFyZSBhbHNvIGV4cGxpY2l0bHkgc2VwYXJhdGVkLgotICogT3BlcmF0aW9ucyBpbiB0aGlzIGNsYXNzIChhbmQgaXRzIGNoaWxkcmVuKSBhcmUgdGhlcmVmb3JlIHN0cmljdGx5Ci0gKiBsb2NhbCB0byBlYWNoIG11dGF0b3IgdGhyZWFkLCBhbmQgc3luY2hyb25pemVkIG9wZXJhdGlvbnMgYWx3YXlzCi0gKiBoYXBwZW4gdmlhIGFjY2VzcyB0byBleHBsaWNpdGx5IGdsb2JhbCBjbGFzc2VzIHN1Y2ggYXMgUGxhbiBhbmQgaXRzCi0gKiBjaGlsZHJlbi4gIFRoZXJlZm9yZSBvbmx5IDxpPiJmYXN0IHBhdGgiPC9pPiAodW5zeW5jaHJvbml6ZWQpCi0gKiBhbGxvY2F0aW9uIGFuZCBiYXJyaWVyIHNlbWFudGljcyBhcmUgZGVmaW5lZCBpbiBNdXRhdG9yQ29udGV4dCBhbmQKLSAqIGl0cyBzdWJjbGFzc2VzLiAgVGhlc2UgY2FsbCBvdXQgdG8gPGk+InNsb3cgcGF0aCI8L2k+IChzeW5jaHJvbml6ZShkKQotICogbWV0aG9kcyB3aGljaCBoYXZlIGdsb2JhbCBzdGF0ZSBhbmQgYXJlIGdsb2JhbGx5IHN5bmNocm9uaXplZC4gIEZvcgotICogZXhhbXBsZSwgYW4gYWxsb2NhdGlvbiBmYXN0IHBhdGggbWF5IGJ1bXAgYSBwb2ludGVyIHdpdGhvdXQgYW55Ci0gKiBzeW5jcmhvbml6YXRpb24gKHRoZSAiZmFzdCBwYXRoIikgdW50aWwgYSBsaW1pdCBpcyByZWFjaGVkLCBhdCB3aGljaAotICogcG9pbnQgdGhlICJzbG93IHBhdGgiIGlzIGNhbGxlZCwgYW5kIG1vcmUgbWVtb3J5IGlzIGFxdWlyZWQgZnJvbSBhCi0gKiBnbG9iYWwgcmVzb3VyY2UuPHA+Ci0gKgotICogQXMgdGhlIHN1cGVyLWNsYXNzIG9mIGFsbCBwZXItbXV0YXRvciBjb250ZXh0cywgdGhpcyBjbGFzcyBpbXBsZW1lbnRzCi0gKiBiYXNpYyBwZXItbXV0YXRvciBiZWhhdmlvciBjb21tb24gdG8gYWxsIE1NVGsgY29sbGVjdG9ycywgaW5jbHVkaW5nCi0gKiBzdXBwb3J0IGZvciBpbW1vcnRhbCBhbmQgbGFyZ2Ugb2JqZWN0IHNwYWNlIGFsbG9jYXRpb24sIGFzIHdlbGwgYXMKLSAqIGVtcHR5IHN0dWJzIGZvciB3cml0ZSBiYXJyaWVycyAodG8gYmUgb3ZlcnJpZGRlbiBieSBzdWItY2xhc3NlcyBhcwotICogbmVlZGVkKS4KLSAqCi0gKiBAc2VlIENvbGxlY3RvckNvbnRleHQKLSAqIEBzZWUgb3JnLm1tdGsudm0uQWN0aXZlUGxhbgotICogQHNlZSBQbGFuCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNdXRhdG9yQ29udGV4dCBpbXBsZW1lbnRzIENvbnN0YW50cyB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogSW5pdGlhbGl6YXRpb24KLSAgICovCi0KLQotICAvKioKLSAgICogTm90aWZ5IHRoYXQgdGhlIG11dGF0b3IgY29udGV4dCBpcyByZWdpc3RlcmVkIGFuZCByZWFkeSB0byBleGVjdXRlLiBGcm9tCi0gICAqIHRoaXMgcG9pbnQgaXQgd2lsbCBiZSBpbmNsdWRlZCBpbiBpdGVyYXRpb25zIG92ZXIgbXV0YXRvcnMuCi0gICAqCi0gICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhpcyBtdXRhdG9yIGNvbnRleHQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0TXV0YXRvcihpbnQgaWQpIHsKLSAgICB0aGlzLmlkID0gaWQ7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG11dGF0b3IgaXMgYWJvdXQgdG8gYmUgY2xlYW5lZCB1cCwgbWFrZSBzdXJlIGFsbCBsb2NhbCBkYXRhIGlzIHJldHVybmVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgZGVpbml0TXV0YXRvcigpIHsKLSAgICBmbHVzaCgpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogSW5zdGFuY2UgZmllbGRzCi0gICAqLwotCi0gIC8qKiBVbmlxdWUgbXV0YXRvciBpZGVudGlmaWVyICovCi0gIHByaXZhdGUgaW50IGlkOwotCi0gIC8qKiBVc2VkIGZvciBwcmludGluZyBsb2cgaW5mb3JtYXRpb24gaW4gYSB0aHJlYWQgc2FmZSBtYW5uZXIgKi8KLSAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2cgPSBuZXcgTG9nKCk7Ci0KLSAgLyoqIFBlci1tdXRhdG9yIGFsbG9jYXRvciBpbnRvIHRoZSBpbW1vcnRhbCBzcGFjZSAqLwotICBwcm90ZWN0ZWQgZmluYWwgQnVtcFBvaW50ZXIgaW1tb3J0YWwgPSBuZXcgSW1tb3J0YWxMb2NhbChQbGFuLmltbW9ydGFsU3BhY2UpOwotCi0gIC8qKiBQZXItbXV0YXRvciBhbGxvY2F0b3IgaW50byB0aGUgbGFyZ2Ugb2JqZWN0IHNwYWNlICovCi0gIHByb3RlY3RlZCBmaW5hbCBMYXJnZU9iamVjdExvY2FsIGxvcyA9IG5ldyBMYXJnZU9iamVjdExvY2FsKFBsYW4ubG9TcGFjZSk7Ci0KLSAgLyoqIFBlci1tdXRhdG9yIGFsbG9jYXRvciBpbnRvIHRoZSBzbWFsbCBjb2RlIHNwYWNlICovCi0gIHByb3RlY3RlZCBmaW5hbCBNYXJrU3dlZXBMb2NhbCBzbWNvZGUgPSBQbGFuLlVTRV9DT0RFX1NQQUNFID8gbmV3IE1hcmtTd2VlcExvY2FsKFBsYW4uc21hbGxDb2RlU3BhY2UpIDogbnVsbDsKLQotICAvKiogUGVyLW11dGF0b3IgYWxsb2NhdG9yIGludG8gdGhlIGxhcmdlIGNvZGUgc3BhY2UgKi8KLSAgcHJvdGVjdGVkIGZpbmFsIExhcmdlT2JqZWN0TG9jYWwgbGdjb2RlID0gUGxhbi5VU0VfQ09ERV9TUEFDRSA/IG5ldyBMYXJnZU9iamVjdExvY2FsKFBsYW4ubGFyZ2VDb2RlU3BhY2UpIDogbnVsbDsKLQotICAvKiogUGVyLW11dGF0b3IgYWxsb2NhdG9yIGludG8gdGhlIG5vbiBtb3Zpbmcgc3BhY2UgKi8KLSAgcHJvdGVjdGVkIGZpbmFsIE1hcmtTd2VlcExvY2FsIG5vbm1vdmUgPSBuZXcgTWFya1N3ZWVwTG9jYWwoUGxhbi5ub25Nb3ZpbmdTcGFjZSk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDb2xsZWN0aW9uLgotICAgKi8KLQotICAvKioKLSAgICogUGVyZm9ybSBhIHBlci1tdXRhdG9yIGNvbGxlY3Rpb24gcGhhc2UuCi0gICAqCi0gICAqIEBwYXJhbSBwaGFzZUlkIFRoZSB1bmlxdWUgcGhhc2UgaWRlbnRpZmllcgotICAgKiBAcGFyYW0gcHJpbWFyeSBTaG91bGQgdGhpcyB0aHJlYWQgYmUgdXNlZCB0byBleGVjdXRlIGFueSBzaW5nbGUtdGhyZWFkZWQKLSAgICogbG9jYWwgb3BlcmF0aW9ucz8KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNvbGxlY3Rpb25QaGFzZShzaG9ydCBwaGFzZUlkLCBib29sZWFuIHByaW1hcnkpOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEFsbG9jYXRpb24uCi0gICAqLwotCi0gIC8qKgotICAgKiBSdW4tdGltZSBjaGVjayBvZiB0aGUgYWxsb2NhdG9yIHRvIHVzZSBmb3IgYSBnaXZlbiBhbGxvY2F0aW9uCi0gICAqCi0gICAqIEF0IHRoZSBtb21lbnQgdGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IGFsbG9jYXRvcnMgd2lsbCB1c2UgdGhlIHNpbXBsZQotICAgKiAod29yc3QpIG1ldGhvZCBvZiBhbGlnbmluZyB0byBkZXRlcm1pbmUgaWYgdGhlIG9iamVjdCBpcyBhIGxhcmdlIG9iamVjdAotICAgKiB0byBlbnN1cmUgdGhhdCBubyBvYmplY3RzIGFyZSBsYXJnZXIgdGhhbiBvdGhlciBhbGxvY2F0b3JzIGNhbiBoYW5kbGUuCi0gICAqCi0gICAqIEBwYXJhbSBieXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGFsbG9jYXRlZAotICAgKiBAcGFyYW0gYWxpZ24gVGhlIHJlcXVlc3RlZCBhbGlnbm1lbnQuCi0gICAqIEBwYXJhbSBhbGxvY2F0b3IgVGhlIGFsbG9jYXRvciBzdGF0aWNhbGx5IGFzc2lnbmVkIHRvIHRoaXMgYWxsb2NhdGlvbgotICAgKiBAcmV0dXJuIFRoZSBhbGxvY2F0b3IgZHluYW1pY2FsbHkgYXNzaWduZWQgdG8gdGhpcyBhbGxvY2F0aW9uCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBpbnQgY2hlY2tBbGxvY2F0b3IoaW50IGJ5dGVzLCBpbnQgYWxpZ24sIGludCBhbGxvY2F0b3IpIHsKLSAgICBpbnQgbWF4Qnl0ZXMgPSBBbGxvY2F0b3IuZ2V0TWF4aW11bUFsaWduZWRTaXplKGJ5dGVzLCBhbGlnbik7Ci0gICAgaWYgKGFsbG9jYXRvciA9PSBQbGFuLkFMTE9DX0RFRkFVTFQpIHsKLSAgICAgIHJldHVybiAobWF4Qnl0ZXMgPiBQbGFuLk1BWF9OT05fTE9TX0RFRkFVTFRfQUxMT0NfQllURVMpID8gUGxhbi5BTExPQ19MT1MgOiBhbGxvY2F0b3I7Ci0gICAgfQotCi0gICAgaWYgKFBsYW4uVVNFX0NPREVfU1BBQ0UgJiYgYWxsb2NhdG9yID09IFBsYW4uQUxMT0NfQ09ERSkgewotICAgICAgcmV0dXJuIChtYXhCeXRlcyA+IFBsYW4uTUFYX05PTl9MT1NfTk9OTU9WSU5HX0FMTE9DX0JZVEVTKSA/IFBsYW4uQUxMT0NfTEFSR0VfQ09ERSA6IGFsbG9jYXRvcjsKLSAgICB9Ci0KLSAgICBpZiAoYWxsb2NhdG9yID09IFBsYW4uQUxMT0NfTk9OX1JFRkVSRU5DRSkgewotICAgICAgcmV0dXJuIChtYXhCeXRlcyA+IFBsYW4uTUFYX05PTl9MT1NfREVGQVVMVF9BTExPQ19CWVRFUykgPyBQbGFuLkFMTE9DX0xPUyA6IFBsYW4uQUxMT0NfREVGQVVMVDsKLSAgICB9Ci0KLSAgICBpZiAoYWxsb2NhdG9yID09IFBsYW4uQUxMT0NfTk9OX01PVklORykgewotICAgICAgcmV0dXJuIChtYXhCeXRlcyA+IFBsYW4uTUFYX05PTl9MT1NfTk9OTU9WSU5HX0FMTE9DX0JZVEVTKSA/IFBsYW4uQUxMT0NfTE9TIDogYWxsb2NhdG9yOwotICAgIH0KLQotICAgIHJldHVybiBhbGxvY2F0b3I7Ci0gIH0KLQotICAvKioKLSAgICogQWxsb2NhdGUgbWVtb3J5IGZvciBhbiBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBieXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgb2JqZWN0LgotICAgKiBAcGFyYW0gYWxpZ24gUmVxdWlyZWQgYWxpZ25tZW50IGZvciB0aGUgb2JqZWN0LgotICAgKiBAcGFyYW0gb2Zmc2V0IE9mZnNldCBhc3NvY2lhdGVkIHdpdGggdGhlIGFsaWdubWVudC4KLSAgICogQHBhcmFtIGFsbG9jYXRvciBUaGUgYWxsb2NhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QuCi0gICAqIEBwYXJhbSBzaXRlIEFsbG9jYXRpb24gc2l0ZQotICAgKiBAcmV0dXJuIFRoZSBsb3cgYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIGNodW5rLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgQWRkcmVzcyBhbGxvYyhpbnQgYnl0ZXMsIGludCBhbGlnbiwgaW50IG9mZnNldCwgaW50IGFsbG9jYXRvciwgaW50IHNpdGUpIHsKLSAgICBzd2l0Y2ggKGFsbG9jYXRvcikgewotICAgIGNhc2UgICAgICBQbGFuLkFMTE9DX0xPUzogcmV0dXJuIGxvcy5hbGxvYyhieXRlcywgYWxpZ24sIG9mZnNldCk7Ci0gICAgY2FzZSAgICAgIFBsYW4uQUxMT0NfSU1NT1JUQUw6IHJldHVybiBpbW1vcnRhbC5hbGxvYyhieXRlcywgYWxpZ24sIG9mZnNldCk7Ci0gICAgY2FzZSAgICAgIFBsYW4uQUxMT0NfQ09ERTogcmV0dXJuIHNtY29kZS5hbGxvYyhieXRlcywgYWxpZ24sIG9mZnNldCk7Ci0gICAgY2FzZSAgICAgIFBsYW4uQUxMT0NfTEFSR0VfQ09ERTogcmV0dXJuIGxnY29kZS5hbGxvYyhieXRlcywgYWxpZ24sIG9mZnNldCk7Ci0gICAgY2FzZSAgICAgIFBsYW4uQUxMT0NfTk9OX01PVklORzogcmV0dXJuIG5vbm1vdmUuYWxsb2MoYnl0ZXMsIGFsaWduLCBvZmZzZXQpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBWTS5hc3NlcnRpb25zLmZhaWwoIk5vIHN1Y2ggYWxsb2NhdG9yIik7Ci0gICAgICByZXR1cm4gQWRkcmVzcy56ZXJvKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFBlcmZvcm0gcG9zdC1hbGxvY2F0aW9uIGFjdGlvbnMuICBGb3IgbWFueSBhbGxvY2F0b3JzIG5vbmUgYXJlCi0gICAqIHJlcXVpcmVkLgotICAgKgotICAgKiBAcGFyYW0gcmVmIFRoZSBuZXdseSBhbGxvY2F0ZWQgb2JqZWN0Ci0gICAqIEBwYXJhbSB0eXBlUmVmIHRoZSB0eXBlIHJlZmVyZW5jZSBmb3IgdGhlIGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBzaXplIG9mIHRoZSBzcGFjZSB0byBiZSBhbGxvY2F0ZWQgKGluIGJ5dGVzKQotICAgKiBAcGFyYW0gYWxsb2NhdG9yIFRoZSBhbGxvY2F0b3IgbnVtYmVyIHRvIGJlIHVzZWQgZm9yIHRoaXMgYWxsb2NhdGlvbgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgdm9pZCBwb3N0QWxsb2MoT2JqZWN0UmVmZXJlbmNlIHJlZiwgT2JqZWN0UmVmZXJlbmNlIHR5cGVSZWYsCi0gICAgICBpbnQgYnl0ZXMsIGludCBhbGxvY2F0b3IpIHsKLSAgICBzd2l0Y2ggKGFsbG9jYXRvcikgewotICAgIGNhc2UgICAgICAgICAgIFBsYW4uQUxMT0NfTE9TOiBQbGFuLmxvU3BhY2UuaW5pdGlhbGl6ZUhlYWRlcihyZWYsIHRydWUpOyByZXR1cm47Ci0gICAgY2FzZSAgICAgIFBsYW4uQUxMT0NfSU1NT1JUQUw6IFBsYW4uaW1tb3J0YWxTcGFjZS5pbml0aWFsaXplSGVhZGVyKHJlZik7ICByZXR1cm47Ci0gICAgY2FzZSAgICAgICAgICBQbGFuLkFMTE9DX0NPREU6IFBsYW4uc21hbGxDb2RlU3BhY2UuaW5pdGlhbGl6ZUhlYWRlcihyZWYsIHRydWUpOyByZXR1cm47Ci0gICAgY2FzZSAgICBQbGFuLkFMTE9DX0xBUkdFX0NPREU6IFBsYW4ubGFyZ2VDb2RlU3BhY2UuaW5pdGlhbGl6ZUhlYWRlcihyZWYsIHRydWUpOyByZXR1cm47Ci0gICAgY2FzZSAgICBQbGFuLkFMTE9DX05PTl9NT1ZJTkc6IFBsYW4ubm9uTW92aW5nU3BhY2UuaW5pdGlhbGl6ZUhlYWRlcihyZWYsIHRydWUpOyByZXR1cm47Ci0gICAgZGVmYXVsdDoKLSAgICAgIFZNLmFzc2VydGlvbnMuZmFpbCgiTm8gc3VjaCBhbGxvY2F0b3IiKTsKLSAgICB9Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBTcGFjZSAtIEFsbG9jYXRvciBtYXBwaW5nLgotICAgKi8KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBhbGxvY2F0b3IgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGEgc3BhY2UKLSAgICogPGNvZGU+c3BhY2U8L2NvZGU+LCBmb3IgdGhpcyBwbGFuIGluc3RhbmNlLgotICAgKgotICAgKiBAcGFyYW0gc3BhY2UgVGhlIHNwYWNlIGZvciB3aGljaCB0aGUgYWxsb2NhdG9yIGluc3RhbmNlIGlzIGRlc2lyZWQuCi0gICAqIEByZXR1cm4gVGhlIGFsbG9jYXRvciBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwbGFuIGluc3RhbmNlCi0gICAqIHdoaWNoIGlzIGFsbG9jYXRpbmcgaW50byA8Y29kZT5zcGFjZTwvY29kZT4sIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAqIGlmIG5vIGFwcHJvcHJpYXRlIGFsbG9jYXRvciBjYW4gYmUgZXN0YWJsaXNoZWQuCi0gICAqLwotICBwdWJsaWMgQWxsb2NhdG9yIGdldEFsbG9jYXRvckZyb21TcGFjZShTcGFjZSBzcGFjZSkgewotICAgIGlmIChzcGFjZSA9PSBQbGFuLmltbW9ydGFsU3BhY2UpICByZXR1cm4gaW1tb3J0YWw7Ci0gICAgaWYgKHNwYWNlID09IFBsYW4ubG9TcGFjZSkgICAgICAgIHJldHVybiBsb3M7Ci0gICAgaWYgKHNwYWNlID09IFBsYW4ubm9uTW92aW5nU3BhY2UpIHJldHVybiBub25tb3ZlOwotICAgIGlmIChQbGFuLlVTRV9DT0RFX1NQQUNFICYmIHNwYWNlID09IFBsYW4uc21hbGxDb2RlU3BhY2UpIHJldHVybiBzbWNvZGU7Ci0gICAgaWYgKFBsYW4uVVNFX0NPREVfU1BBQ0UgJiYgc3BhY2UgPT0gUGxhbi5sYXJnZUNvZGVTcGFjZSkgcmV0dXJuIGxnY29kZTsKLQotICAgIC8vIEludmFsaWQgcmVxdWVzdCBoYXMgYmVlbiBtYWRlCi0gICAgaWYgKHNwYWNlID09IFBsYW4ubWV0YURhdGFTcGFjZSkgewotICAgICAgVk0uYXNzZXJ0aW9ucy5mYWlsKCJNdXRhdG9yQ29udGV4dC5nZXRBbGxvY2F0b3JGcm9tU3BhY2UgZ2l2ZW4gbWV0YSBzcGFjZSIpOwotICAgIH0gZWxzZSBpZiAoc3BhY2UgIT0gbnVsbCkgewotICAgICAgVk0uYXNzZXJ0aW9ucy5mYWlsKCJNdXRhdG9yQ29udGV4dC5nZXRBbGxvY2F0b3JGcm9tU3BhY2UgZ2l2ZW4gaW52YWxpZCBzcGFjZSIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBWTS5hc3NlcnRpb25zLmZhaWwoIk11dGF0b3JDb250ZXh0LmdldEFsbG9jYXRvckZyb21TcGFjZSBnaXZlbiBudWxsIHNwYWNlIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBXcml0ZSBhbmQgcmVhZCBiYXJyaWVycy4gQnkgZGVmYXVsdCBkbyBub3RoaW5nLCBvdmVycmlkZSBpZgotICAgKiBhcHByb3ByaWF0ZS4KLSAgICovCi0KLSAgLyoqCi0gICAqIFJlYWQgYSByZWZlcmVuY2UgdHlwZS4gSW4gYSBjb25jdXJyZW50IGNvbGxlY3RvciB0aGlzIG1heQotICAgKiBpbnZvbHZlIGFkZGluZyB0aGUgcmVmZXJlbnQgdG8gdGhlIG1hcmtpbmcgcXVldWUuCi0gICAqCi0gICAqIEBwYXJhbSByZWZlcmVudCBUaGUgcmVmZXJlbnQgYmVpbmcgcmVhZC4KLSAgICogQHJldHVybiBUaGUgbmV3IHJlZmVyZW50LgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlIGphdmFMYW5nUmVmZXJlbmNlUmVhZEJhcnJpZXIoT2JqZWN0UmVmZXJlbmNlIHJlZmVyZW50KSB7Ci0gICAgLy8gRWl0aGVyOiByZWFkIGJhcnJpZXJzIGFyZSB1c2VkIGFuZCB0aGlzIGlzIG92ZXJyaWRkZW4sIG9yCi0gICAgLy8gcmVhZCBiYXJyaWVycyBhcmUgbm90IHVzZWQgYW5kIHRoaXMgaXMgbmV2ZXIgY2FsbGVkCi0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZmFsc2UpOwotICAgIHJldHVybiBPYmplY3RSZWZlcmVuY2UubnVsbFJlZmVyZW5jZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlIGEgYm9vbGVhbi4gVGFrZSBhcHByb3ByaWF0ZSB3cml0ZSBiYXJyaWVyIGFjdGlvbnMuPHA+Ci0gICAqCi0gICAqIDxiPkJ5IGRlZmF1bHQgZG8gbm90aGluZywgb3ZlcnJpZGUgaWYgYXBwcm9wcmlhdGUuPC9iPgotICAgKgotICAgKiBAcGFyYW0gc3JjIFRoZSBvYmplY3QgaW50byB3aGljaCB0aGUgbmV3IHJlZmVyZW5jZSB3aWxsIGJlIHN0b3JlZAotICAgKiBAcGFyYW0gc2xvdCBUaGUgYWRkcmVzcyBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUKLSAgICogc3RvcmVkLgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBuZXcgYm9vbGVhbgotICAgKiBAcGFyYW0gbWV0YURhdGFBIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIHN0b3JlCi0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBzdG9yZSBvY2N1cnJlZAotICAgKi8KLSAgcHVibGljIHZvaWQgYm9vbGVhbldyaXRlKE9iamVjdFJlZmVyZW5jZSBzcmMsIEFkZHJlc3Mgc2xvdCwgYm9vbGVhbiB2YWx1ZSwgV29yZCBtZXRhRGF0YUEsIFdvcmQgbWV0YURhdGFCLCBpbnQgbW9kZSkgewotICAgIC8vIEVpdGhlcjogd3JpdGUgYmFycmllcnMgYXJlIHVzZWQgYW5kIHRoaXMgaXMgb3ZlcnJpZGRlbiwgb3IKLSAgICAvLyB3cml0ZSBiYXJyaWVycyBhcmUgbm90IHVzZWQgYW5kIHRoaXMgaXMgbmV2ZXIgY2FsbGVkCi0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgYSBib29sZWFuLiBUYWtlIGFwcHJvcHJpYXRlIHJlYWQgYmFycmllciBhY3Rpb24sIGFuZAotICAgKiByZXR1cm4gdGhlIHZhbHVlIHRoYXQgd2FzIHJlYWQuPHA+IFRoaXMgaXMgYSA8Yj5zdWJzdGl0dXRpbmc8Yj4KLSAgICogYmFycmllci4gIFRoZSBjYWxsIHRvIHRoaXMgYmFycmllciB0YWtlcyB0aGUgcGxhY2Ugb2YgYSBsb2FkLjxwPgotICAgKgotICAgKiBAcGFyYW0gc3JjIFRoZSBvYmplY3QgcmVmZXJlbmNlIGhvbGRpbmcgdGhlIGZpZWxkIGJlaW5nIHJlYWQuCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIG9mIHRoZSBzbG90IGJlaW5nIHJlYWQuCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBsb2FkCi0gICAqIEBwYXJhbSBtZXRhRGF0YUIgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBsb2FkCi0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBsb2FkIG9jY3VycmVkCi0gICAqIEByZXR1cm4gVGhlIGJvb2xlYW4gdGhhdCB3YXMgcmVhZC4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGJvb2xlYW4gYm9vbGVhblJlYWQoT2JqZWN0UmVmZXJlbmNlIHNyYywgQWRkcmVzcyBzbG90LCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKSB7Ci0gICAgLy8gRWl0aGVyOiByZWFkIGJhcnJpZXJzIGFyZSB1c2VkIGFuZCB0aGlzIGlzIG92ZXJyaWRkZW4sIG9yCi0gICAgLy8gcmVhZCBiYXJyaWVycyBhcmUgbm90IHVzZWQgYW5kIHRoaXMgaXMgbmV2ZXIgY2FsbGVkCi0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZmFsc2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBBIG51bWJlciBvZiBib29sZWFucyBhcmUgYWJvdXQgdG8gYmUgY29waWVkIGZyb20gb2JqZWN0Ci0gICAqIDxjb2RlPnNyYzwvY29kZT4gdG8gb2JqZWN0IDxjb2RlPmRzdDwvY29kZT4gKGFzIGluIGFuIGFycmF5Ci0gICAqIGNvcHkpLiAgVGh1cywgPGNvZGU+ZHN0PC9jb2RlPiBpcyB0aGUgbXV0YXRlZCBvYmplY3QuICBUYWtlCi0gICAqIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogQHBhcmFtIHNyYyBUaGUgc291cmNlIGFycmF5Ci0gICAqIEBwYXJhbSBzcmNPZmZzZXQgVGhlIHN0YXJ0aW5nIHNvdXJjZSBvZmZzZXQKLSAgICogQHBhcmFtIGRzdCBUaGUgZGVzdGluYXRpb24gYXJyYXkKLSAgICogQHBhcmFtIGRzdE9mZnNldCBUaGUgc3RhcnRpbmcgZGVzdGluYXRpb24gb2Zmc2V0Ci0gICAqIEBwYXJhbSBieXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGNvcGllZAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHVwZGF0ZSB3YXMgcGVyZm9ybWVkIGJ5IHRoZSBiYXJyaWVyLCBmYWxzZSBpZgotICAgKiBsZWZ0IHRvIHRoZSBjYWxsZXIgKGFsd2F5cyBmYWxzZSBpbiB0aGlzIGNhc2UpLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYm9vbGVhbkJ1bGtDb3B5KE9iamVjdFJlZmVyZW5jZSBzcmMsIE9mZnNldCBzcmNPZmZzZXQsIE9iamVjdFJlZmVyZW5jZSBkc3QsIE9mZnNldCBkc3RPZmZzZXQsIGludCBieXRlcykgewotICAgIC8vIEVpdGhlcjogYnVsayBjb3B5IGlzIHN1cHBvcnRlZCBhbmQgdGhpcyBpcyBvdmVycmlkZGVuLCBvcgotICAgIC8vIHdyaXRlIGJhcnJpZXJzIGFyZSBub3QgdXNlZCBhbmQgdGhpcyBpcyBuZXZlciBjYWxsZWQKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChmYWxzZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlIGEgYnl0ZS4gVGFrZSBhcHByb3ByaWF0ZSB3cml0ZSBiYXJyaWVyIGFjdGlvbnMuPHA+Ci0gICAqCi0gICAqIDxiPkJ5IGRlZmF1bHQgZG8gbm90aGluZywgb3ZlcnJpZGUgaWYgYXBwcm9wcmlhdGUuPC9iPgotICAgKgotICAgKiBAcGFyYW0gc3JjIFRoZSBvYmplY3QgaW50byB3aGljaCB0aGUgbmV3IHJlZmVyZW5jZSB3aWxsIGJlIHN0b3JlZAotICAgKiBAcGFyYW0gc2xvdCBUaGUgYWRkcmVzcyBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUKLSAgICogc3RvcmVkLgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBuZXcgYnl0ZQotICAgKiBAcGFyYW0gbWV0YURhdGFBIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIHN0b3JlCi0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBzdG9yZSBvY2N1cnJlZAotICAgKi8KLSAgcHVibGljIHZvaWQgYnl0ZVdyaXRlKE9iamVjdFJlZmVyZW5jZSBzcmMsIEFkZHJlc3Mgc2xvdCwgYnl0ZSB2YWx1ZSwgV29yZCBtZXRhRGF0YUEsIFdvcmQgbWV0YURhdGFCLCBpbnQgbW9kZSkgewotICAgIC8vIEVpdGhlcjogd3JpdGUgYmFycmllcnMgYXJlIHVzZWQgYW5kIHRoaXMgaXMgb3ZlcnJpZGRlbiwgb3IKLSAgICAvLyB3cml0ZSBiYXJyaWVycyBhcmUgbm90IHVzZWQgYW5kIHRoaXMgaXMgbmV2ZXIgY2FsbGVkCi0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgYSBieXRlLiBUYWtlIGFwcHJvcHJpYXRlIHJlYWQgYmFycmllciBhY3Rpb24sIGFuZAotICAgKiByZXR1cm4gdGhlIHZhbHVlIHRoYXQgd2FzIHJlYWQuPHA+IFRoaXMgaXMgYSA8Yj5zdWJzdGl0dXRpbmc8Yj4KLSAgICogYmFycmllci4gIFRoZSBjYWxsIHRvIHRoaXMgYmFycmllciB0YWtlcyB0aGUgcGxhY2Ugb2YgYSBsb2FkLjxwPgotICAgKgotICAgKiBAcGFyYW0gc3JjIFRoZSBvYmplY3QgcmVmZXJlbmNlIGhvbGRpbmcgdGhlIGZpZWxkIGJlaW5nIHJlYWQuCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIG9mIHRoZSBzbG90IGJlaW5nIHJlYWQuCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBsb2FkCi0gICAqIEBwYXJhbSBtZXRhRGF0YUIgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBsb2FkCi0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBsb2FkIG9jY3VycmVkCi0gICAqIEByZXR1cm4gVGhlIGJ5dGUgdGhhdCB3YXMgcmVhZC4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGJ5dGUgYnl0ZVJlYWQoT2JqZWN0UmVmZXJlbmNlIHNyYywgQWRkcmVzcyBzbG90LCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKSB7Ci0gICAgLy8gRWl0aGVyOiByZWFkIGJhcnJpZXJzIGFyZSB1c2VkIGFuZCB0aGlzIGlzIG92ZXJyaWRkZW4sIG9yCi0gICAgLy8gcmVhZCBiYXJyaWVycyBhcmUgbm90IHVzZWQgYW5kIHRoaXMgaXMgbmV2ZXIgY2FsbGVkCi0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZmFsc2UpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLyoqCi0gICAqIEEgbnVtYmVyIG9mIGJ5dGVzIGFyZSBhYm91dCB0byBiZSBjb3BpZWQgZnJvbSBvYmplY3QKLSAgICogPGNvZGU+c3JjPC9jb2RlPiB0byBvYmplY3QgPGNvZGU+ZHN0PC9jb2RlPiAoYXMgaW4gYW4gYXJyYXkKLSAgICogY29weSkuICBUaHVzLCA8Y29kZT5kc3Q8L2NvZGU+IGlzIHRoZSBtdXRhdGVkIG9iamVjdC4gIFRha2UKLSAgICogYXBwcm9wcmlhdGUgd3JpdGUgYmFycmllciBhY3Rpb25zLjxwPgotICAgKgotICAgKiBAcGFyYW0gc3JjIFRoZSBzb3VyY2UgYXJyYXkKLSAgICogQHBhcmFtIHNyY09mZnNldCBUaGUgc3RhcnRpbmcgc291cmNlIG9mZnNldAotICAgKiBAcGFyYW0gZHN0IFRoZSBkZXN0aW5hdGlvbiBhcnJheQotICAgKiBAcGFyYW0gZHN0T2Zmc2V0IFRoZSBzdGFydGluZyBkZXN0aW5hdGlvbiBvZmZzZXQKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgY29waWVkCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgdXBkYXRlIHdhcyBwZXJmb3JtZWQgYnkgdGhlIGJhcnJpZXIsIGZhbHNlIGlmCi0gICAqIGxlZnQgdG8gdGhlIGNhbGxlciAoYWx3YXlzIGZhbHNlIGluIHRoaXMgY2FzZSkuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBieXRlQnVsa0NvcHkoT2JqZWN0UmVmZXJlbmNlIHNyYywgT2Zmc2V0IHNyY09mZnNldCwgT2JqZWN0UmVmZXJlbmNlIGRzdCwgT2Zmc2V0IGRzdE9mZnNldCwgaW50IGJ5dGVzKSB7Ci0gICAgLy8gRWl0aGVyOiBidWxrIGNvcHkgaXMgc3VwcG9ydGVkIGFuZCB0aGlzIGlzIG92ZXJyaWRkZW4sIG9yCi0gICAgLy8gd3JpdGUgYmFycmllcnMgYXJlIG5vdCB1c2VkIGFuZCB0aGlzIGlzIG5ldmVyIGNhbGxlZAotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGZhbHNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGUgYSBjaGFyLiBUYWtlIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogPGI+QnkgZGVmYXVsdCBkbyBub3RoaW5nLCBvdmVycmlkZSBpZiBhcHByb3ByaWF0ZS48L2I+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUgc3RvcmVkCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZQotICAgKiBzdG9yZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIG5ldyBjaGFyCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbWV0YURhdGFCIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHN0b3JlIG9jY3VycmVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBjaGFyV3JpdGUoT2JqZWN0UmVmZXJlbmNlIHNyYywgQWRkcmVzcyBzbG90LCBjaGFyIHZhbHVlLCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKSB7Ci0gICAgLy8gRWl0aGVyOiB3cml0ZSBiYXJyaWVycyBhcmUgdXNlZCBhbmQgdGhpcyBpcyBvdmVycmlkZGVuLCBvcgotICAgIC8vIHdyaXRlIGJhcnJpZXJzIGFyZSBub3QgdXNlZCBhbmQgdGhpcyBpcyBuZXZlciBjYWxsZWQKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBhIGNoYXIuIFRha2UgYXBwcm9wcmlhdGUgcmVhZCBiYXJyaWVyIGFjdGlvbiwgYW5kCi0gICAqIHJldHVybiB0aGUgdmFsdWUgdGhhdCB3YXMgcmVhZC48cD4gVGhpcyBpcyBhIDxiPnN1YnN0aXR1dGluZzxiPgotICAgKiBiYXJyaWVyLiAgVGhlIGNhbGwgdG8gdGhpcyBiYXJyaWVyIHRha2VzIHRoZSBwbGFjZSBvZiBhIGxvYWQuPHA+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCByZWZlcmVuY2UgaG9sZGluZyB0aGUgZmllbGQgYmVpbmcgcmVhZC4KLSAgICogQHBhcmFtIHNsb3QgVGhlIGFkZHJlc3Mgb2YgdGhlIHNsb3QgYmVpbmcgcmVhZC4KLSAgICogQHBhcmFtIG1ldGFEYXRhQSBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIGxvYWQKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIGxvYWQKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIGxvYWQgb2NjdXJyZWQKLSAgICogQHJldHVybiBUaGUgY2hhciB0aGF0IHdhcyByZWFkLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgY2hhciBjaGFyUmVhZChPYmplY3RSZWZlcmVuY2Ugc3JjLCBBZGRyZXNzIHNsb3QsIFdvcmQgbWV0YURhdGFBLCBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpIHsKLSAgICAvLyBFaXRoZXI6IHJlYWQgYmFycmllcnMgYXJlIHVzZWQgYW5kIHRoaXMgaXMgb3ZlcnJpZGRlbiwgb3IKLSAgICAvLyByZWFkIGJhcnJpZXJzIGFyZSBub3QgdXNlZCBhbmQgdGhpcyBpcyBuZXZlciBjYWxsZWQKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChmYWxzZSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvKioKLSAgICogQSBudW1iZXIgb2YgY2hhcnMgYXJlIGFib3V0IHRvIGJlIGNvcGllZCBmcm9tIG9iamVjdAotICAgKiA8Y29kZT5zcmM8L2NvZGU+IHRvIG9iamVjdCA8Y29kZT5kc3Q8L2NvZGU+IChhcyBpbiBhbiBhcnJheQotICAgKiBjb3B5KS4gIFRodXMsIDxjb2RlPmRzdDwvY29kZT4gaXMgdGhlIG11dGF0ZWQgb2JqZWN0LiAgVGFrZQotICAgKiBhcHByb3ByaWF0ZSB3cml0ZSBiYXJyaWVyIGFjdGlvbnMuPHA+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIHNvdXJjZSBhcnJheQotICAgKiBAcGFyYW0gc3JjT2Zmc2V0IFRoZSBzdGFydGluZyBzb3VyY2Ugb2Zmc2V0Ci0gICAqIEBwYXJhbSBkc3QgVGhlIGRlc3RpbmF0aW9uIGFycmF5Ci0gICAqIEBwYXJhbSBkc3RPZmZzZXQgVGhlIHN0YXJ0aW5nIGRlc3RpbmF0aW9uIG9mZnNldAotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyB0byBiZSBjb3BpZWQKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSB1cGRhdGUgd2FzIHBlcmZvcm1lZCBieSB0aGUgYmFycmllciwgZmFsc2UgaWYKLSAgICogbGVmdCB0byB0aGUgY2FsbGVyIChhbHdheXMgZmFsc2UgaW4gdGhpcyBjYXNlKS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGNoYXJCdWxrQ29weShPYmplY3RSZWZlcmVuY2Ugc3JjLCBPZmZzZXQgc3JjT2Zmc2V0LCBPYmplY3RSZWZlcmVuY2UgZHN0LCBPZmZzZXQgZHN0T2Zmc2V0LCBpbnQgYnl0ZXMpIHsKLSAgICAvLyBFaXRoZXI6IGJ1bGsgY29weSBpcyBzdXBwb3J0ZWQgYW5kIHRoaXMgaXMgb3ZlcnJpZGRlbiwgb3IKLSAgICAvLyB3cml0ZSBiYXJyaWVycyBhcmUgbm90IHVzZWQgYW5kIHRoaXMgaXMgbmV2ZXIgY2FsbGVkCi0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZmFsc2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZSBhIHNob3J0LiBUYWtlIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogPGI+QnkgZGVmYXVsdCBkbyBub3RoaW5nLCBvdmVycmlkZSBpZiBhcHByb3ByaWF0ZS48L2I+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUgc3RvcmVkCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZQotICAgKiBzdG9yZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIG5ldyBzaG9ydAotICAgKiBAcGFyYW0gbWV0YURhdGFBIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIHN0b3JlCi0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBzdG9yZSBvY2N1cnJlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2hvcnRXcml0ZShPYmplY3RSZWZlcmVuY2Ugc3JjLCBBZGRyZXNzIHNsb3QsIHNob3J0IHZhbHVlLCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKSB7Ci0gICAgLy8gRWl0aGVyOiB3cml0ZSBiYXJyaWVycyBhcmUgdXNlZCBhbmQgdGhpcyBpcyBvdmVycmlkZGVuLCBvcgotICAgIC8vIHdyaXRlIGJhcnJpZXJzIGFyZSBub3QgdXNlZCBhbmQgdGhpcyBpcyBuZXZlciBjYWxsZWQKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBhIHNob3J0LiBUYWtlIGFwcHJvcHJpYXRlIHJlYWQgYmFycmllciBhY3Rpb24sIGFuZAotICAgKiByZXR1cm4gdGhlIHZhbHVlIHRoYXQgd2FzIHJlYWQuPHA+IFRoaXMgaXMgYSA8Yj5zdWJzdGl0dXRpbmc8Yj4KLSAgICogYmFycmllci4gIFRoZSBjYWxsIHRvIHRoaXMgYmFycmllciB0YWtlcyB0aGUgcGxhY2Ugb2YgYSBsb2FkLjxwPgotICAgKgotICAgKiBAcGFyYW0gc3JjIFRoZSBvYmplY3QgcmVmZXJlbmNlIGhvbGRpbmcgdGhlIGZpZWxkIGJlaW5nIHJlYWQuCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIG9mIHRoZSBzbG90IGJlaW5nIHJlYWQuCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBsb2FkCi0gICAqIEBwYXJhbSBtZXRhRGF0YUIgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBsb2FkCi0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBsb2FkIG9jY3VycmVkCi0gICAqIEByZXR1cm4gVGhlIHNob3J0IHRoYXQgd2FzIHJlYWQuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBzaG9ydCBzaG9ydFJlYWQoT2JqZWN0UmVmZXJlbmNlIHNyYywgQWRkcmVzcyBzbG90LCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKSB7Ci0gICAgLy8gRWl0aGVyOiByZWFkIGJhcnJpZXJzIGFyZSB1c2VkIGFuZCB0aGlzIGlzIG92ZXJyaWRkZW4sIG9yCi0gICAgLy8gcmVhZCBiYXJyaWVycyBhcmUgbm90IHVzZWQgYW5kIHRoaXMgaXMgbmV2ZXIgY2FsbGVkCi0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZmFsc2UpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLyoqCi0gICAqIEEgbnVtYmVyIG9mIHNob3J0cyBhcmUgYWJvdXQgdG8gYmUgY29waWVkIGZyb20gb2JqZWN0Ci0gICAqIDxjb2RlPnNyYzwvY29kZT4gdG8gb2JqZWN0IDxjb2RlPmRzdDwvY29kZT4gKGFzIGluIGFuIGFycmF5Ci0gICAqIGNvcHkpLiAgVGh1cywgPGNvZGU+ZHN0PC9jb2RlPiBpcyB0aGUgbXV0YXRlZCBvYmplY3QuICBUYWtlCi0gICAqIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogQHBhcmFtIHNyYyBUaGUgc291cmNlIGFycmF5Ci0gICAqIEBwYXJhbSBzcmNPZmZzZXQgVGhlIHN0YXJ0aW5nIHNvdXJjZSBvZmZzZXQKLSAgICogQHBhcmFtIGRzdCBUaGUgZGVzdGluYXRpb24gYXJyYXkKLSAgICogQHBhcmFtIGRzdE9mZnNldCBUaGUgc3RhcnRpbmcgZGVzdGluYXRpb24gb2Zmc2V0Ci0gICAqIEBwYXJhbSBieXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGNvcGllZAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHVwZGF0ZSB3YXMgcGVyZm9ybWVkIGJ5IHRoZSBiYXJyaWVyLCBmYWxzZSBpZgotICAgKiBsZWZ0IHRvIHRoZSBjYWxsZXIgKGFsd2F5cyBmYWxzZSBpbiB0aGlzIGNhc2UpLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2hvcnRCdWxrQ29weShPYmplY3RSZWZlcmVuY2Ugc3JjLCBPZmZzZXQgc3JjT2Zmc2V0LCBPYmplY3RSZWZlcmVuY2UgZHN0LCBPZmZzZXQgZHN0T2Zmc2V0LCBpbnQgYnl0ZXMpIHsKLSAgICAvLyBFaXRoZXI6IGJ1bGsgY29weSBpcyBzdXBwb3J0ZWQgYW5kIHRoaXMgaXMgb3ZlcnJpZGRlbiwgb3IKLSAgICAvLyB3cml0ZSBiYXJyaWVycyBhcmUgbm90IHVzZWQgYW5kIHRoaXMgaXMgbmV2ZXIgY2FsbGVkCi0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZmFsc2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFdyaXRlIGEgaW50LiBUYWtlIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogPGI+QnkgZGVmYXVsdCBkbyBub3RoaW5nLCBvdmVycmlkZSBpZiBhcHByb3ByaWF0ZS48L2I+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUgc3RvcmVkCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZQotICAgKiBzdG9yZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIG5ldyBpbnQKLSAgICogQHBhcmFtIG1ldGFEYXRhQSBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIHN0b3JlCi0gICAqIEBwYXJhbSBtZXRhRGF0YUIgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgc3RvcmUgb2NjdXJyZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGludFdyaXRlKE9iamVjdFJlZmVyZW5jZSBzcmMsIEFkZHJlc3Mgc2xvdCwgaW50IHZhbHVlLCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKSB7Ci0gICAgLy8gRWl0aGVyOiB3cml0ZSBiYXJyaWVycyBhcmUgdXNlZCBhbmQgdGhpcyBpcyBvdmVycmlkZGVuLCBvcgotICAgIC8vIHdyaXRlIGJhcnJpZXJzIGFyZSBub3QgdXNlZCBhbmQgdGhpcyBpcyBuZXZlciBjYWxsZWQKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBhIGludC4gVGFrZSBhcHByb3ByaWF0ZSByZWFkIGJhcnJpZXIgYWN0aW9uLCBhbmQKLSAgICogcmV0dXJuIHRoZSB2YWx1ZSB0aGF0IHdhcyByZWFkLjxwPiBUaGlzIGlzIGEgPGI+c3Vic3RpdHV0aW5nPGI+Ci0gICAqIGJhcnJpZXIuICBUaGUgY2FsbCB0byB0aGlzIGJhcnJpZXIgdGFrZXMgdGhlIHBsYWNlIG9mIGEgbG9hZC48cD4KLSAgICoKLSAgICogQHBhcmFtIHNyYyBUaGUgb2JqZWN0IHJlZmVyZW5jZSBob2xkaW5nIHRoZSBmaWVsZCBiZWluZyByZWFkLgotICAgKiBAcGFyYW0gc2xvdCBUaGUgYWRkcmVzcyBvZiB0aGUgc2xvdCBiZWluZyByZWFkLgotICAgKiBAcGFyYW0gbWV0YURhdGFBIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgbG9hZAotICAgKiBAcGFyYW0gbWV0YURhdGFCIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgbG9hZAotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgbG9hZCBvY2N1cnJlZAotICAgKiBAcmV0dXJuIFRoZSBpbnQgdGhhdCB3YXMgcmVhZC4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGludCBpbnRSZWFkKE9iamVjdFJlZmVyZW5jZSBzcmMsIEFkZHJlc3Mgc2xvdCwgV29yZCBtZXRhRGF0YUEsIFdvcmQgbWV0YURhdGFCLCBpbnQgbW9kZSkgewotICAgIC8vIEVpdGhlcjogcmVhZCBiYXJyaWVycyBhcmUgdXNlZCBhbmQgdGhpcyBpcyBvdmVycmlkZGVuLCBvcgotICAgIC8vIHJlYWQgYmFycmllcnMgYXJlIG5vdCB1c2VkIGFuZCB0aGlzIGlzIG5ldmVyIGNhbGxlZAotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGZhbHNlKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8qKgotICAgKiBBIG51bWJlciBvZiBpbnRzIGFyZSBhYm91dCB0byBiZSBjb3BpZWQgZnJvbSBvYmplY3QKLSAgICogPGNvZGU+c3JjPC9jb2RlPiB0byBvYmplY3QgPGNvZGU+ZHN0PC9jb2RlPiAoYXMgaW4gYW4gYXJyYXkKLSAgICogY29weSkuICBUaHVzLCA8Y29kZT5kc3Q8L2NvZGU+IGlzIHRoZSBtdXRhdGVkIG9iamVjdC4gIFRha2UKLSAgICogYXBwcm9wcmlhdGUgd3JpdGUgYmFycmllciBhY3Rpb25zLjxwPgotICAgKgotICAgKiBAcGFyYW0gc3JjIFRoZSBzb3VyY2UgYXJyYXkKLSAgICogQHBhcmFtIHNyY09mZnNldCBUaGUgc3RhcnRpbmcgc291cmNlIG9mZnNldAotICAgKiBAcGFyYW0gZHN0IFRoZSBkZXN0aW5hdGlvbiBhcnJheQotICAgKiBAcGFyYW0gZHN0T2Zmc2V0IFRoZSBzdGFydGluZyBkZXN0aW5hdGlvbiBvZmZzZXQKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgY29waWVkCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgdXBkYXRlIHdhcyBwZXJmb3JtZWQgYnkgdGhlIGJhcnJpZXIsIGZhbHNlIGlmCi0gICAqIGxlZnQgdG8gdGhlIGNhbGxlciAoYWx3YXlzIGZhbHNlIGluIHRoaXMgY2FzZSkuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpbnRCdWxrQ29weShPYmplY3RSZWZlcmVuY2Ugc3JjLCBPZmZzZXQgc3JjT2Zmc2V0LCBPYmplY3RSZWZlcmVuY2UgZHN0LCBPZmZzZXQgZHN0T2Zmc2V0LCBpbnQgYnl0ZXMpIHsKLSAgICAvLyBFaXRoZXI6IGJ1bGsgY29weSBpcyBzdXBwb3J0ZWQgYW5kIHRoaXMgaXMgb3ZlcnJpZGRlbiwgb3IKLSAgICAvLyB3cml0ZSBiYXJyaWVycyBhcmUgbm90IHVzZWQgYW5kIHRoaXMgaXMgbmV2ZXIgY2FsbGVkCi0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZmFsc2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBBdHRlbXB0IHRvIGF0b21pY2FsbHkgZXhjaGFuZ2UgdGhlIHZhbHVlIGluIHRoZSBnaXZlbiBzbG90Ci0gICAqIHdpdGggdGhlIHBhc3NlZCByZXBsYWNlbWVudCB2YWx1ZS4KLSAgICoKLSAgICogPGI+QnkgZGVmYXVsdCBkbyBub3RoaW5nLCBvdmVycmlkZSBpZiBhcHByb3ByaWF0ZS48L2I+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCBpbnRvIHdoaWNoIHRoZSB2YWx1ZSB3aWxsIGJlIHN0b3JlZAotICAgKiBAcGFyYW0gc2xvdCBUaGUgYWRkcmVzcyBpbnRvIHdoaWNoIHRoZSB2YWx1ZSB3aWxsIGJlCi0gICAqIHN0b3JlZC4KLSAgICogQHBhcmFtIG9sZCBUaGUgb2xkIGludCB0byBiZSBzd2FwcGVkIG91dAotICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyBpbnQKLSAgICogQHBhcmFtIG1ldGFEYXRhQSBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIHN0b3JlCi0gICAqIEBwYXJhbSBtZXRhRGF0YUIgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgc3RvcmUgb2NjdXJyZWQKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBzd2FwIHdhcyBzdWNjZXNzZnVsLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaW50VHJ5Q29tcGFyZUFuZFN3YXAoT2JqZWN0UmVmZXJlbmNlIHNyYywgQWRkcmVzcyBzbG90LCBpbnQgb2xkLCBpbnQgdmFsdWUsIFdvcmQgbWV0YURhdGFBLCBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpIHsKLSAgICAvLyBFaXRoZXI6IHdyaXRlIGJhcnJpZXJzIGFyZSB1c2VkIGFuZCB0aGlzIGlzIG92ZXJyaWRkZW4sIG9yCi0gICAgLy8gd3JpdGUgYmFycmllcnMgYXJlIG5vdCB1c2VkIGFuZCB0aGlzIGlzIG5ldmVyIGNhbGxlZAotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGZhbHNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGUgYSBsb25nLiBUYWtlIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogPGI+QnkgZGVmYXVsdCBkbyBub3RoaW5nLCBvdmVycmlkZSBpZiBhcHByb3ByaWF0ZS48L2I+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUgc3RvcmVkCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZQotICAgKiBzdG9yZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIG5ldyBsb25nCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbWV0YURhdGFCIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHN0b3JlIG9jY3VycmVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBsb25nV3JpdGUoT2JqZWN0UmVmZXJlbmNlIHNyYywgQWRkcmVzcyBzbG90LCBsb25nIHZhbHVlLCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKSB7Ci0gICAgLy8gRWl0aGVyOiB3cml0ZSBiYXJyaWVycyBhcmUgdXNlZCBhbmQgdGhpcyBpcyBvdmVycmlkZGVuLCBvcgotICAgIC8vIHdyaXRlIGJhcnJpZXJzIGFyZSBub3QgdXNlZCBhbmQgdGhpcyBpcyBuZXZlciBjYWxsZWQKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBhIGxvbmcuIFRha2UgYXBwcm9wcmlhdGUgcmVhZCBiYXJyaWVyIGFjdGlvbiwgYW5kCi0gICAqIHJldHVybiB0aGUgdmFsdWUgdGhhdCB3YXMgcmVhZC48cD4gVGhpcyBpcyBhIDxiPnN1YnN0aXR1dGluZzxiPgotICAgKiBiYXJyaWVyLiAgVGhlIGNhbGwgdG8gdGhpcyBiYXJyaWVyIHRha2VzIHRoZSBwbGFjZSBvZiBhIGxvYWQuPHA+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCByZWZlcmVuY2UgaG9sZGluZyB0aGUgZmllbGQgYmVpbmcgcmVhZC4KLSAgICogQHBhcmFtIHNsb3QgVGhlIGFkZHJlc3Mgb2YgdGhlIHNsb3QgYmVpbmcgcmVhZC4KLSAgICogQHBhcmFtIG1ldGFEYXRhQSBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIGxvYWQKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIGxvYWQKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIGxvYWQgb2NjdXJyZWQKLSAgICogQHJldHVybiBUaGUgbG9uZyB0aGF0IHdhcyByZWFkLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgbG9uZyBsb25nUmVhZChPYmplY3RSZWZlcmVuY2Ugc3JjLCBBZGRyZXNzIHNsb3QsIFdvcmQgbWV0YURhdGFBLCBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpIHsKLSAgICAvLyBFaXRoZXI6IHJlYWQgYmFycmllcnMgYXJlIHVzZWQgYW5kIHRoaXMgaXMgb3ZlcnJpZGRlbiwgb3IKLSAgICAvLyByZWFkIGJhcnJpZXJzIGFyZSBub3QgdXNlZCBhbmQgdGhpcyBpcyBuZXZlciBjYWxsZWQKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChmYWxzZSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvKioKLSAgICogQSBudW1iZXIgb2YgbG9uZ3MgYXJlIGFib3V0IHRvIGJlIGNvcGllZCBmcm9tIG9iamVjdAotICAgKiA8Y29kZT5zcmM8L2NvZGU+IHRvIG9iamVjdCA8Y29kZT5kc3Q8L2NvZGU+IChhcyBpbiBhbiBhcnJheQotICAgKiBjb3B5KS4gIFRodXMsIDxjb2RlPmRzdDwvY29kZT4gaXMgdGhlIG11dGF0ZWQgb2JqZWN0LiAgVGFrZQotICAgKiBhcHByb3ByaWF0ZSB3cml0ZSBiYXJyaWVyIGFjdGlvbnMuPHA+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIHNvdXJjZSBhcnJheQotICAgKiBAcGFyYW0gc3JjT2Zmc2V0IFRoZSBzdGFydGluZyBzb3VyY2Ugb2Zmc2V0Ci0gICAqIEBwYXJhbSBkc3QgVGhlIGRlc3RpbmF0aW9uIGFycmF5Ci0gICAqIEBwYXJhbSBkc3RPZmZzZXQgVGhlIHN0YXJ0aW5nIGRlc3RpbmF0aW9uIG9mZnNldAotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyB0byBiZSBjb3BpZWQKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSB1cGRhdGUgd2FzIHBlcmZvcm1lZCBieSB0aGUgYmFycmllciwgZmFsc2UgaWYKLSAgICogbGVmdCB0byB0aGUgY2FsbGVyIChhbHdheXMgZmFsc2UgaW4gdGhpcyBjYXNlKS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGxvbmdCdWxrQ29weShPYmplY3RSZWZlcmVuY2Ugc3JjLCBPZmZzZXQgc3JjT2Zmc2V0LCBPYmplY3RSZWZlcmVuY2UgZHN0LCBPZmZzZXQgZHN0T2Zmc2V0LCBpbnQgYnl0ZXMpIHsKLSAgICAvLyBFaXRoZXI6IGJ1bGsgY29weSBpcyBzdXBwb3J0ZWQgYW5kIHRoaXMgaXMgb3ZlcnJpZGRlbiwgb3IKLSAgICAvLyB3cml0ZSBiYXJyaWVycyBhcmUgbm90IHVzZWQgYW5kIHRoaXMgaXMgbmV2ZXIgY2FsbGVkCi0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZmFsc2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBBdHRlbXB0IHRvIGF0b21pY2FsbHkgZXhjaGFuZ2UgdGhlIHZhbHVlIGluIHRoZSBnaXZlbiBzbG90Ci0gICAqIHdpdGggdGhlIHBhc3NlZCByZXBsYWNlbWVudCB2YWx1ZS4KLSAgICoKLSAgICogPGI+QnkgZGVmYXVsdCBkbyBub3RoaW5nLCBvdmVycmlkZSBpZiBhcHByb3ByaWF0ZS48L2I+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCBpbnRvIHdoaWNoIHRoZSB2YWx1ZSB3aWxsIGJlIHN0b3JlZAotICAgKiBAcGFyYW0gc2xvdCBUaGUgYWRkcmVzcyBpbnRvIHdoaWNoIHRoZSB2YWx1ZSB3aWxsIGJlCi0gICAqIHN0b3JlZC4KLSAgICogQHBhcmFtIG9sZCBUaGUgb2xkIGxvbmcgdG8gYmUgc3dhcHBlZCBvdXQKLSAgICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgbG9uZwotICAgKiBAcGFyYW0gbWV0YURhdGFBIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIHN0b3JlCi0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBzdG9yZSBvY2N1cnJlZAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN3YXAgd2FzIHN1Y2Nlc3NmdWwuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBsb25nVHJ5Q29tcGFyZUFuZFN3YXAoT2JqZWN0UmVmZXJlbmNlIHNyYywgQWRkcmVzcyBzbG90LCBsb25nIG9sZCwgbG9uZyB2YWx1ZSwgV29yZCBtZXRhRGF0YUEsIFdvcmQgbWV0YURhdGFCLCBpbnQgbW9kZSkgewotICAgIC8vIEVpdGhlcjogd3JpdGUgYmFycmllcnMgYXJlIHVzZWQgYW5kIHRoaXMgaXMgb3ZlcnJpZGRlbiwgb3IKLSAgICAvLyB3cml0ZSBiYXJyaWVycyBhcmUgbm90IHVzZWQgYW5kIHRoaXMgaXMgbmV2ZXIgY2FsbGVkCi0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZmFsc2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZSBhIGZsb2F0LiBUYWtlIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogPGI+QnkgZGVmYXVsdCBkbyBub3RoaW5nLCBvdmVycmlkZSBpZiBhcHByb3ByaWF0ZS48L2I+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUgc3RvcmVkCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZQotICAgKiBzdG9yZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIG5ldyBmbG9hdAotICAgKiBAcGFyYW0gbWV0YURhdGFBIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIHN0b3JlCi0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBzdG9yZSBvY2N1cnJlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZmxvYXRXcml0ZShPYmplY3RSZWZlcmVuY2Ugc3JjLCBBZGRyZXNzIHNsb3QsIGZsb2F0IHZhbHVlLCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKSB7Ci0gICAgLy8gRWl0aGVyOiB3cml0ZSBiYXJyaWVycyBhcmUgdXNlZCBhbmQgdGhpcyBpcyBvdmVycmlkZGVuLCBvcgotICAgIC8vIHdyaXRlIGJhcnJpZXJzIGFyZSBub3QgdXNlZCBhbmQgdGhpcyBpcyBuZXZlciBjYWxsZWQKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBhIGZsb2F0LiBUYWtlIGFwcHJvcHJpYXRlIHJlYWQgYmFycmllciBhY3Rpb24sIGFuZAotICAgKiByZXR1cm4gdGhlIHZhbHVlIHRoYXQgd2FzIHJlYWQuPHA+IFRoaXMgaXMgYSA8Yj5zdWJzdGl0dXRpbmc8Yj4KLSAgICogYmFycmllci4gIFRoZSBjYWxsIHRvIHRoaXMgYmFycmllciB0YWtlcyB0aGUgcGxhY2Ugb2YgYSBsb2FkLjxwPgotICAgKgotICAgKiBAcGFyYW0gc3JjIFRoZSBvYmplY3QgcmVmZXJlbmNlIGhvbGRpbmcgdGhlIGZpZWxkIGJlaW5nIHJlYWQuCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIG9mIHRoZSBzbG90IGJlaW5nIHJlYWQuCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBsb2FkCi0gICAqIEBwYXJhbSBtZXRhRGF0YUIgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBsb2FkCi0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBsb2FkIG9jY3VycmVkCi0gICAqIEByZXR1cm4gVGhlIGZsb2F0IHRoYXQgd2FzIHJlYWQuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBmbG9hdCBmbG9hdFJlYWQoT2JqZWN0UmVmZXJlbmNlIHNyYywgQWRkcmVzcyBzbG90LCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKSB7Ci0gICAgLy8gRWl0aGVyOiByZWFkIGJhcnJpZXJzIGFyZSB1c2VkIGFuZCB0aGlzIGlzIG92ZXJyaWRkZW4sIG9yCi0gICAgLy8gcmVhZCBiYXJyaWVycyBhcmUgbm90IHVzZWQgYW5kIHRoaXMgaXMgbmV2ZXIgY2FsbGVkCi0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZmFsc2UpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLyoqCi0gICAqIEEgbnVtYmVyIG9mIGZsb2F0cyBhcmUgYWJvdXQgdG8gYmUgY29waWVkIGZyb20gb2JqZWN0Ci0gICAqIDxjb2RlPnNyYzwvY29kZT4gdG8gb2JqZWN0IDxjb2RlPmRzdDwvY29kZT4gKGFzIGluIGFuIGFycmF5Ci0gICAqIGNvcHkpLiAgVGh1cywgPGNvZGU+ZHN0PC9jb2RlPiBpcyB0aGUgbXV0YXRlZCBvYmplY3QuICBUYWtlCi0gICAqIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogQHBhcmFtIHNyYyBUaGUgc291cmNlIGFycmF5Ci0gICAqIEBwYXJhbSBzcmNPZmZzZXQgVGhlIHN0YXJ0aW5nIHNvdXJjZSBvZmZzZXQKLSAgICogQHBhcmFtIGRzdCBUaGUgZGVzdGluYXRpb24gYXJyYXkKLSAgICogQHBhcmFtIGRzdE9mZnNldCBUaGUgc3RhcnRpbmcgZGVzdGluYXRpb24gb2Zmc2V0Ci0gICAqIEBwYXJhbSBieXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGNvcGllZAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHVwZGF0ZSB3YXMgcGVyZm9ybWVkIGJ5IHRoZSBiYXJyaWVyLCBmYWxzZSBpZgotICAgKiBsZWZ0IHRvIHRoZSBjYWxsZXIgKGFsd2F5cyBmYWxzZSBpbiB0aGlzIGNhc2UpLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZmxvYXRCdWxrQ29weShPYmplY3RSZWZlcmVuY2Ugc3JjLCBPZmZzZXQgc3JjT2Zmc2V0LCBPYmplY3RSZWZlcmVuY2UgZHN0LCBPZmZzZXQgZHN0T2Zmc2V0LCBpbnQgYnl0ZXMpIHsKLSAgICAvLyBFaXRoZXI6IGJ1bGsgY29weSBpcyBzdXBwb3J0ZWQgYW5kIHRoaXMgaXMgb3ZlcnJpZGRlbiwgb3IKLSAgICAvLyB3cml0ZSBiYXJyaWVycyBhcmUgbm90IHVzZWQgYW5kIHRoaXMgaXMgbmV2ZXIgY2FsbGVkCi0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZmFsc2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZSBhIGRvdWJsZS4gVGFrZSBhcHByb3ByaWF0ZSB3cml0ZSBiYXJyaWVyIGFjdGlvbnMuPHA+Ci0gICAqCi0gICAqIDxiPkJ5IGRlZmF1bHQgZG8gbm90aGluZywgb3ZlcnJpZGUgaWYgYXBwcm9wcmlhdGUuPC9iPgotICAgKgotICAgKiBAcGFyYW0gc3JjIFRoZSBvYmplY3QgaW50byB3aGljaCB0aGUgbmV3IHJlZmVyZW5jZSB3aWxsIGJlIHN0b3JlZAotICAgKiBAcGFyYW0gc2xvdCBUaGUgYWRkcmVzcyBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUKLSAgICogc3RvcmVkLgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBuZXcgZG91YmxlCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbWV0YURhdGFCIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHN0b3JlIG9jY3VycmVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBkb3VibGVXcml0ZShPYmplY3RSZWZlcmVuY2Ugc3JjLCBBZGRyZXNzIHNsb3QsIGRvdWJsZSB2YWx1ZSwgV29yZCBtZXRhRGF0YUEsIFdvcmQgbWV0YURhdGFCLCBpbnQgbW9kZSkgewotICAgIC8vIEVpdGhlcjogd3JpdGUgYmFycmllcnMgYXJlIHVzZWQgYW5kIHRoaXMgaXMgb3ZlcnJpZGRlbiwgb3IKLSAgICAvLyB3cml0ZSBiYXJyaWVycyBhcmUgbm90IHVzZWQgYW5kIHRoaXMgaXMgbmV2ZXIgY2FsbGVkCi0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgYSBkb3VibGUuIFRha2UgYXBwcm9wcmlhdGUgcmVhZCBiYXJyaWVyIGFjdGlvbiwgYW5kCi0gICAqIHJldHVybiB0aGUgdmFsdWUgdGhhdCB3YXMgcmVhZC48cD4gVGhpcyBpcyBhIDxiPnN1YnN0aXR1dGluZzxiPgotICAgKiBiYXJyaWVyLiAgVGhlIGNhbGwgdG8gdGhpcyBiYXJyaWVyIHRha2VzIHRoZSBwbGFjZSBvZiBhIGxvYWQuPHA+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCByZWZlcmVuY2UgaG9sZGluZyB0aGUgZmllbGQgYmVpbmcgcmVhZC4KLSAgICogQHBhcmFtIHNsb3QgVGhlIGFkZHJlc3Mgb2YgdGhlIHNsb3QgYmVpbmcgcmVhZC4KLSAgICogQHBhcmFtIG1ldGFEYXRhQSBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIGxvYWQKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIGxvYWQKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIGxvYWQgb2NjdXJyZWQKLSAgICogQHJldHVybiBUaGUgZG91YmxlIHRoYXQgd2FzIHJlYWQuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBkb3VibGUgZG91YmxlUmVhZChPYmplY3RSZWZlcmVuY2Ugc3JjLCBBZGRyZXNzIHNsb3QsIFdvcmQgbWV0YURhdGFBLCBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpIHsKLSAgICAvLyBFaXRoZXI6IHJlYWQgYmFycmllcnMgYXJlIHVzZWQgYW5kIHRoaXMgaXMgb3ZlcnJpZGRlbiwgb3IKLSAgICAvLyByZWFkIGJhcnJpZXJzIGFyZSBub3QgdXNlZCBhbmQgdGhpcyBpcyBuZXZlciBjYWxsZWQKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChmYWxzZSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvKioKLSAgICogQSBudW1iZXIgb2YgZG91YmxlcyBhcmUgYWJvdXQgdG8gYmUgY29waWVkIGZyb20gb2JqZWN0Ci0gICAqIDxjb2RlPnNyYzwvY29kZT4gdG8gb2JqZWN0IDxjb2RlPmRzdDwvY29kZT4gKGFzIGluIGFuIGFycmF5Ci0gICAqIGNvcHkpLiAgVGh1cywgPGNvZGU+ZHN0PC9jb2RlPiBpcyB0aGUgbXV0YXRlZCBvYmplY3QuICBUYWtlCi0gICAqIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogQHBhcmFtIHNyYyBUaGUgc291cmNlIGFycmF5Ci0gICAqIEBwYXJhbSBzcmNPZmZzZXQgVGhlIHN0YXJ0aW5nIHNvdXJjZSBvZmZzZXQKLSAgICogQHBhcmFtIGRzdCBUaGUgZGVzdGluYXRpb24gYXJyYXkKLSAgICogQHBhcmFtIGRzdE9mZnNldCBUaGUgc3RhcnRpbmcgZGVzdGluYXRpb24gb2Zmc2V0Ci0gICAqIEBwYXJhbSBieXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGNvcGllZAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHVwZGF0ZSB3YXMgcGVyZm9ybWVkIGJ5IHRoZSBiYXJyaWVyLCBmYWxzZSBpZgotICAgKiBsZWZ0IHRvIHRoZSBjYWxsZXIgKGFsd2F5cyBmYWxzZSBpbiB0aGlzIGNhc2UpLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZG91YmxlQnVsa0NvcHkoT2JqZWN0UmVmZXJlbmNlIHNyYywgT2Zmc2V0IHNyY09mZnNldCwgT2JqZWN0UmVmZXJlbmNlIGRzdCwgT2Zmc2V0IGRzdE9mZnNldCwgaW50IGJ5dGVzKSB7Ci0gICAgLy8gRWl0aGVyOiBidWxrIGNvcHkgaXMgc3VwcG9ydGVkIGFuZCB0aGlzIGlzIG92ZXJyaWRkZW4sIG9yCi0gICAgLy8gd3JpdGUgYmFycmllcnMgYXJlIG5vdCB1c2VkIGFuZCB0aGlzIGlzIG5ldmVyIGNhbGxlZAotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGZhbHNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGUgYSBXb3JkLiBUYWtlIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogPGI+QnkgZGVmYXVsdCBkbyBub3RoaW5nLCBvdmVycmlkZSBpZiBhcHByb3ByaWF0ZS48L2I+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUgc3RvcmVkCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZQotICAgKiBzdG9yZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIG5ldyBXb3JkCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbWV0YURhdGFCIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHN0b3JlIG9jY3VycmVkCi0gICAqLwotICBwdWJsaWMgdm9pZCB3b3JkV3JpdGUoT2JqZWN0UmVmZXJlbmNlIHNyYywgQWRkcmVzcyBzbG90LCBXb3JkIHZhbHVlLCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKSB7Ci0gICAgLy8gRWl0aGVyOiB3cml0ZSBiYXJyaWVycyBhcmUgdXNlZCBhbmQgdGhpcyBpcyBvdmVycmlkZGVuLCBvcgotICAgIC8vIHdyaXRlIGJhcnJpZXJzIGFyZSBub3QgdXNlZCBhbmQgdGhpcyBpcyBuZXZlciBjYWxsZWQKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBhIFdvcmQuIFRha2UgYXBwcm9wcmlhdGUgcmVhZCBiYXJyaWVyIGFjdGlvbiwgYW5kCi0gICAqIHJldHVybiB0aGUgdmFsdWUgdGhhdCB3YXMgcmVhZC48cD4gVGhpcyBpcyBhIDxiPnN1YnN0aXR1dGluZzxiPgotICAgKiBiYXJyaWVyLiAgVGhlIGNhbGwgdG8gdGhpcyBiYXJyaWVyIHRha2VzIHRoZSBwbGFjZSBvZiBhIGxvYWQuPHA+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCByZWZlcmVuY2UgaG9sZGluZyB0aGUgZmllbGQgYmVpbmcgcmVhZC4KLSAgICogQHBhcmFtIHNsb3QgVGhlIGFkZHJlc3Mgb2YgdGhlIHNsb3QgYmVpbmcgcmVhZC4KLSAgICogQHBhcmFtIG1ldGFEYXRhQSBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIGxvYWQKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIGxvYWQKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIGxvYWQgb2NjdXJyZWQKLSAgICogQHJldHVybiBUaGUgV29yZCB0aGF0IHdhcyByZWFkLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgV29yZCB3b3JkUmVhZChPYmplY3RSZWZlcmVuY2Ugc3JjLCBBZGRyZXNzIHNsb3QsIFdvcmQgbWV0YURhdGFBLCBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpIHsKLSAgICAvLyBFaXRoZXI6IHJlYWQgYmFycmllcnMgYXJlIHVzZWQgYW5kIHRoaXMgaXMgb3ZlcnJpZGRlbiwgb3IKLSAgICAvLyByZWFkIGJhcnJpZXJzIGFyZSBub3QgdXNlZCBhbmQgdGhpcyBpcyBuZXZlciBjYWxsZWQKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChmYWxzZSk7Ci0gICAgcmV0dXJuIFdvcmQuemVybygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEEgbnVtYmVyIG9mIFdvcmRzIGFyZSBhYm91dCB0byBiZSBjb3BpZWQgZnJvbSBvYmplY3QKLSAgICogPGNvZGU+c3JjPC9jb2RlPiB0byBvYmplY3QgPGNvZGU+ZHN0PC9jb2RlPiAoYXMgaW4gYW4gYXJyYXkKLSAgICogY29weSkuICBUaHVzLCA8Y29kZT5kc3Q8L2NvZGU+IGlzIHRoZSBtdXRhdGVkIG9iamVjdC4gIFRha2UKLSAgICogYXBwcm9wcmlhdGUgd3JpdGUgYmFycmllciBhY3Rpb25zLjxwPgotICAgKgotICAgKiBAcGFyYW0gc3JjIFRoZSBzb3VyY2UgYXJyYXkKLSAgICogQHBhcmFtIHNyY09mZnNldCBUaGUgc3RhcnRpbmcgc291cmNlIG9mZnNldAotICAgKiBAcGFyYW0gZHN0IFRoZSBkZXN0aW5hdGlvbiBhcnJheQotICAgKiBAcGFyYW0gZHN0T2Zmc2V0IFRoZSBzdGFydGluZyBkZXN0aW5hdGlvbiBvZmZzZXQKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgY29waWVkCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgdXBkYXRlIHdhcyBwZXJmb3JtZWQgYnkgdGhlIGJhcnJpZXIsIGZhbHNlIGlmCi0gICAqIGxlZnQgdG8gdGhlIGNhbGxlciAoYWx3YXlzIGZhbHNlIGluIHRoaXMgY2FzZSkuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiB3b3JkQnVsa0NvcHkoT2JqZWN0UmVmZXJlbmNlIHNyYywgT2Zmc2V0IHNyY09mZnNldCwgT2JqZWN0UmVmZXJlbmNlIGRzdCwgT2Zmc2V0IGRzdE9mZnNldCwgaW50IGJ5dGVzKSB7Ci0gICAgLy8gRWl0aGVyOiBidWxrIGNvcHkgaXMgc3VwcG9ydGVkIGFuZCB0aGlzIGlzIG92ZXJyaWRkZW4sIG9yCi0gICAgLy8gd3JpdGUgYmFycmllcnMgYXJlIG5vdCB1c2VkIGFuZCB0aGlzIGlzIG5ldmVyIGNhbGxlZAotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGZhbHNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogQXR0ZW1wdCB0byBhdG9taWNhbGx5IGV4Y2hhbmdlIHRoZSB2YWx1ZSBpbiB0aGUgZ2l2ZW4gc2xvdAotICAgKiB3aXRoIHRoZSBwYXNzZWQgcmVwbGFjZW1lbnQgdmFsdWUuCi0gICAqCi0gICAqIDxiPkJ5IGRlZmF1bHQgZG8gbm90aGluZywgb3ZlcnJpZGUgaWYgYXBwcm9wcmlhdGUuPC9iPgotICAgKgotICAgKiBAcGFyYW0gc3JjIFRoZSBvYmplY3QgaW50byB3aGljaCB0aGUgbmV3IHJlZmVyZW5jZSB3aWxsIGJlIHN0b3JlZAotICAgKiBAcGFyYW0gc2xvdCBUaGUgYWRkcmVzcyBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUKLSAgICogc3RvcmVkLgotICAgKiBAcGFyYW0gb2xkIFRoZSBvbGQgV29yZCB0byBiZSBzd2FwcGVkIG91dAotICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyBXb3JkCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbWV0YURhdGFCIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHN0b3JlIG9jY3VycmVkCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3dhcCB3YXMgc3VjY2Vzc2Z1bC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHdvcmRUcnlDb21wYXJlQW5kU3dhcChPYmplY3RSZWZlcmVuY2Ugc3JjLCBBZGRyZXNzIHNsb3QsIFdvcmQgb2xkLCBXb3JkIHZhbHVlLCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKSB7Ci0gICAgLy8gRWl0aGVyOiB3cml0ZSBiYXJyaWVycyBhcmUgdXNlZCBhbmQgdGhpcyBpcyBvdmVycmlkZGVuLCBvcgotICAgIC8vIHdyaXRlIGJhcnJpZXJzIGFyZSBub3QgdXNlZCBhbmQgdGhpcyBpcyBuZXZlciBjYWxsZWQKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChmYWxzZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlIGFuIEFkZHJlc3MuIFRha2UgYXBwcm9wcmlhdGUgd3JpdGUgYmFycmllciBhY3Rpb25zLjxwPgotICAgKgotICAgKiA8Yj5CeSBkZWZhdWx0IGRvIG5vdGhpbmcsIG92ZXJyaWRlIGlmIGFwcHJvcHJpYXRlLjwvYj4KLSAgICoKLSAgICogQHBhcmFtIHNyYyBUaGUgb2JqZWN0IGludG8gd2hpY2ggdGhlIFdvcmQgd2lsbCBiZSBzdG9yZWQKLSAgICogQHBhcmFtIHNsb3QgVGhlIGFkZHJlc3MgaW50byB3aGljaCB0aGUgV29yZCB3aWxsIGJlCi0gICAqIHN0b3JlZC4KLSAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgbmV3IEFkZHJlc3MKLSAgICogQHBhcmFtIG1ldGFEYXRhQSBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIHN0b3JlCi0gICAqIEBwYXJhbSBtZXRhRGF0YUIgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgc3RvcmUgb2NjdXJyZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZHJlc3NXcml0ZShPYmplY3RSZWZlcmVuY2Ugc3JjLCBBZGRyZXNzIHNsb3QsIEFkZHJlc3MgdmFsdWUsIFdvcmQgbWV0YURhdGFBLCBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpIHsKLSAgICAvLyBFaXRoZXI6IHdyaXRlIGJhcnJpZXJzIGFyZSB1c2VkIGFuZCB0aGlzIGlzIG92ZXJyaWRkZW4sIG9yCi0gICAgLy8gd3JpdGUgYmFycmllcnMgYXJlIG5vdCB1c2VkIGFuZCB0aGlzIGlzIG5ldmVyIGNhbGxlZAotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIGFuIEFkZHJlc3MuIFRha2UgYXBwcm9wcmlhdGUgcmVhZCBiYXJyaWVyIGFjdGlvbiwgYW5kCi0gICAqIHJldHVybiB0aGUgdmFsdWUgdGhhdCB3YXMgcmVhZC48cD4gVGhpcyBpcyBhIDxiPnN1YnN0aXR1dGluZzxiPgotICAgKiBiYXJyaWVyLiAgVGhlIGNhbGwgdG8gdGhpcyBiYXJyaWVyIHRha2VzIHRoZSBwbGFjZSBvZiBhIGxvYWQuPHA+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCByZWZlcmVuY2UgaG9sZGluZyB0aGUgZmllbGQgYmVpbmcgcmVhZC4KLSAgICogQHBhcmFtIHNsb3QgVGhlIGFkZHJlc3Mgb2YgdGhlIHNsb3QgYmVpbmcgcmVhZC4KLSAgICogQHBhcmFtIG1ldGFEYXRhQSBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIGxvYWQKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIGxvYWQKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIGxvYWQgb2NjdXJyZWQKLSAgICogQHJldHVybiBUaGUgQWRkcmVzcyB0aGF0IHdhcyByZWFkLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgQWRkcmVzcyBhZGRyZXNzUmVhZChPYmplY3RSZWZlcmVuY2Ugc3JjLCBBZGRyZXNzIHNsb3QsIFdvcmQgbWV0YURhdGFBLCBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpIHsKLSAgICAvLyBFaXRoZXI6IHJlYWQgYmFycmllcnMgYXJlIHVzZWQgYW5kIHRoaXMgaXMgb3ZlcnJpZGRlbiwgb3IKLSAgICAvLyByZWFkIGJhcnJpZXJzIGFyZSBub3QgdXNlZCBhbmQgdGhpcyBpcyBuZXZlciBjYWxsZWQKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChmYWxzZSk7Ci0gICAgcmV0dXJuIEFkZHJlc3MuemVybygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEEgbnVtYmVyIG9mIEFkZHJlc3NlJ3MgYXJlIGFib3V0IHRvIGJlIGNvcGllZCBmcm9tIG9iamVjdAotICAgKiA8Y29kZT5zcmM8L2NvZGU+IHRvIG9iamVjdCA8Y29kZT5kc3Q8L2NvZGU+IChhcyBpbiBhbiBhcnJheQotICAgKiBjb3B5KS4gIFRodXMsIDxjb2RlPmRzdDwvY29kZT4gaXMgdGhlIG11dGF0ZWQgb2JqZWN0LiAgVGFrZQotICAgKiBhcHByb3ByaWF0ZSB3cml0ZSBiYXJyaWVyIGFjdGlvbnMuPHA+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIHNvdXJjZSBhcnJheQotICAgKiBAcGFyYW0gc3JjT2Zmc2V0IFRoZSBzdGFydGluZyBzb3VyY2Ugb2Zmc2V0Ci0gICAqIEBwYXJhbSBkc3QgVGhlIGRlc3RpbmF0aW9uIGFycmF5Ci0gICAqIEBwYXJhbSBkc3RPZmZzZXQgVGhlIHN0YXJ0aW5nIGRlc3RpbmF0aW9uIG9mZnNldAotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyB0byBiZSBjb3BpZWQKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSB1cGRhdGUgd2FzIHBlcmZvcm1lZCBieSB0aGUgYmFycmllciwgZmFsc2UgaWYKLSAgICogbGVmdCB0byB0aGUgY2FsbGVyIChhbHdheXMgZmFsc2UgaW4gdGhpcyBjYXNlKS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGFkZHJlc3NCdWxrQ29weShPYmplY3RSZWZlcmVuY2Ugc3JjLCBPZmZzZXQgc3JjT2Zmc2V0LCBPYmplY3RSZWZlcmVuY2UgZHN0LCBPZmZzZXQgZHN0T2Zmc2V0LCBpbnQgYnl0ZXMpIHsKLSAgICAvLyBFaXRoZXI6IGJ1bGsgY29weSBpcyBzdXBwb3J0ZWQgYW5kIHRoaXMgaXMgb3ZlcnJpZGRlbiwgb3IKLSAgICAvLyB3cml0ZSBiYXJyaWVycyBhcmUgbm90IHVzZWQgYW5kIHRoaXMgaXMgbmV2ZXIgY2FsbGVkCi0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZmFsc2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBBdHRlbXB0IHRvIGF0b21pY2FsbHkgZXhjaGFuZ2UgdGhlIHZhbHVlIGluIHRoZSBnaXZlbiBzbG90Ci0gICAqIHdpdGggdGhlIHBhc3NlZCByZXBsYWNlbWVudCB2YWx1ZS4KLSAgICoKLSAgICogPGI+QnkgZGVmYXVsdCBkbyBub3RoaW5nLCBvdmVycmlkZSBpZiBhcHByb3ByaWF0ZS48L2I+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCBpbnRvIHdoaWNoIHRoZSBBZGRyZXNzIHdpbGwgYmUgc3RvcmVkCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIGludG8gd2hpY2ggdGhlIEFkZHJlc3Mgd2lsbCBiZQotICAgKiBzdG9yZWQuCi0gICAqIEBwYXJhbSBvbGQgVGhlIG9sZCBBZGRyZXNzIHRvIGJlIHN3YXBwZWQgb3V0Ci0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IEFkZHJlc3MKLSAgICogQHBhcmFtIG1ldGFEYXRhQSBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIHN0b3JlCi0gICAqIEBwYXJhbSBtZXRhRGF0YUIgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgc3RvcmUgb2NjdXJyZWQKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBzd2FwIHdhcyBzdWNjZXNzZnVsLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYWRkcmVzc1RyeUNvbXBhcmVBbmRTd2FwKE9iamVjdFJlZmVyZW5jZSBzcmMsIEFkZHJlc3Mgc2xvdCwgQWRkcmVzcyBvbGQsIEFkZHJlc3MgdmFsdWUsIFdvcmQgbWV0YURhdGFBLCBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpIHsKLSAgICAvLyBFaXRoZXI6IHdyaXRlIGJhcnJpZXJzIGFyZSB1c2VkIGFuZCB0aGlzIGlzIG92ZXJyaWRkZW4sIG9yCi0gICAgLy8gd3JpdGUgYmFycmllcnMgYXJlIG5vdCB1c2VkIGFuZCB0aGlzIGlzIG5ldmVyIGNhbGxlZAotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGZhbHNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGUgYW4gRXh0ZW50LiBUYWtlIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogPGI+QnkgZGVmYXVsdCBkbyBub3RoaW5nLCBvdmVycmlkZSBpZiBhcHByb3ByaWF0ZS48L2I+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUgc3RvcmVkCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZQotICAgKiBzdG9yZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIG5ldyBFeHRlbnQKLSAgICogQHBhcmFtIG1ldGFEYXRhQSBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIHN0b3JlCi0gICAqIEBwYXJhbSBtZXRhRGF0YUIgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgc3RvcmUgb2NjdXJyZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGV4dGVudFdyaXRlKE9iamVjdFJlZmVyZW5jZSBzcmMsIEFkZHJlc3Mgc2xvdCwgRXh0ZW50IHZhbHVlLCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKSB7Ci0gICAgLy8gRWl0aGVyOiB3cml0ZSBiYXJyaWVycyBhcmUgdXNlZCBhbmQgdGhpcyBpcyBvdmVycmlkZGVuLCBvcgotICAgIC8vIHdyaXRlIGJhcnJpZXJzIGFyZSBub3QgdXNlZCBhbmQgdGhpcyBpcyBuZXZlciBjYWxsZWQKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBhbiBFeHRlbnQuIFRha2UgYXBwcm9wcmlhdGUgcmVhZCBiYXJyaWVyIGFjdGlvbiwgYW5kCi0gICAqIHJldHVybiB0aGUgdmFsdWUgdGhhdCB3YXMgcmVhZC48cD4gVGhpcyBpcyBhIDxiPnN1YnN0aXR1dGluZzxiPgotICAgKiBiYXJyaWVyLiAgVGhlIGNhbGwgdG8gdGhpcyBiYXJyaWVyIHRha2VzIHRoZSBwbGFjZSBvZiBhIGxvYWQuPHA+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCByZWZlcmVuY2UgaG9sZGluZyB0aGUgZmllbGQgYmVpbmcgcmVhZC4KLSAgICogQHBhcmFtIHNsb3QgVGhlIGFkZHJlc3Mgb2YgdGhlIHNsb3QgYmVpbmcgcmVhZC4KLSAgICogQHBhcmFtIG1ldGFEYXRhQSBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIGxvYWQKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIGxvYWQKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIGxvYWQgb2NjdXJyZWQKLSAgICogQHJldHVybiBUaGUgRXh0ZW50IHRoYXQgd2FzIHJlYWQuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBFeHRlbnQgZXh0ZW50UmVhZChPYmplY3RSZWZlcmVuY2Ugc3JjLCBBZGRyZXNzIHNsb3QsIFdvcmQgbWV0YURhdGFBLCBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpIHsKLSAgICAvLyBFaXRoZXI6IHJlYWQgYmFycmllcnMgYXJlIHVzZWQgYW5kIHRoaXMgaXMgb3ZlcnJpZGRlbiwgb3IKLSAgICAvLyByZWFkIGJhcnJpZXJzIGFyZSBub3QgdXNlZCBhbmQgdGhpcyBpcyBuZXZlciBjYWxsZWQKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChmYWxzZSk7Ci0gICAgcmV0dXJuIEV4dGVudC56ZXJvKCk7Ci0gIH0KLQotICAvKioKLSAgICogQSBudW1iZXIgb2YgRXh0ZW50cyBhcmUgYWJvdXQgdG8gYmUgY29waWVkIGZyb20gb2JqZWN0Ci0gICAqIDxjb2RlPnNyYzwvY29kZT4gdG8gb2JqZWN0IDxjb2RlPmRzdDwvY29kZT4gKGFzIGluIGFuIGFycmF5Ci0gICAqIGNvcHkpLiAgVGh1cywgPGNvZGU+ZHN0PC9jb2RlPiBpcyB0aGUgbXV0YXRlZCBvYmplY3QuICBUYWtlCi0gICAqIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogQHBhcmFtIHNyYyBUaGUgc291cmNlIGFycmF5Ci0gICAqIEBwYXJhbSBzcmNPZmZzZXQgVGhlIHN0YXJ0aW5nIHNvdXJjZSBvZmZzZXQKLSAgICogQHBhcmFtIGRzdCBUaGUgZGVzdGluYXRpb24gYXJyYXkKLSAgICogQHBhcmFtIGRzdE9mZnNldCBUaGUgc3RhcnRpbmcgZGVzdGluYXRpb24gb2Zmc2V0Ci0gICAqIEBwYXJhbSBieXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGNvcGllZAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHVwZGF0ZSB3YXMgcGVyZm9ybWVkIGJ5IHRoZSBiYXJyaWVyLCBmYWxzZSBpZgotICAgKiBsZWZ0IHRvIHRoZSBjYWxsZXIgKGFsd2F5cyBmYWxzZSBpbiB0aGlzIGNhc2UpLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZXh0ZW50QnVsa0NvcHkoT2JqZWN0UmVmZXJlbmNlIHNyYywgT2Zmc2V0IHNyY09mZnNldCwgT2JqZWN0UmVmZXJlbmNlIGRzdCwgT2Zmc2V0IGRzdE9mZnNldCwgaW50IGJ5dGVzKSB7Ci0gICAgLy8gRWl0aGVyOiBidWxrIGNvcHkgaXMgc3VwcG9ydGVkIGFuZCB0aGlzIGlzIG92ZXJyaWRkZW4sIG9yCi0gICAgLy8gd3JpdGUgYmFycmllcnMgYXJlIG5vdCB1c2VkIGFuZCB0aGlzIGlzIG5ldmVyIGNhbGxlZAotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGZhbHNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGUgYW4gT2Zmc2V0LiBUYWtlIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogPGI+QnkgZGVmYXVsdCBkbyBub3RoaW5nLCBvdmVycmlkZSBpZiBhcHByb3ByaWF0ZS48L2I+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUgc3RvcmVkCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZQotICAgKiBzdG9yZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIG5ldyBPZmZzZXQKLSAgICogQHBhcmFtIG1ldGFEYXRhQSBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIHN0b3JlCi0gICAqIEBwYXJhbSBtZXRhRGF0YUIgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgc3RvcmUgb2NjdXJyZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIG9mZnNldFdyaXRlKE9iamVjdFJlZmVyZW5jZSBzcmMsIEFkZHJlc3Mgc2xvdCwgT2Zmc2V0IHZhbHVlLCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKSB7Ci0gICAgLy8gRWl0aGVyOiB3cml0ZSBiYXJyaWVycyBhcmUgdXNlZCBhbmQgdGhpcyBpcyBvdmVycmlkZGVuLCBvcgotICAgIC8vIHdyaXRlIGJhcnJpZXJzIGFyZSBub3QgdXNlZCBhbmQgdGhpcyBpcyBuZXZlciBjYWxsZWQKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBhbiBPZmZzZXQuIFRha2UgYXBwcm9wcmlhdGUgcmVhZCBiYXJyaWVyIGFjdGlvbiwgYW5kCi0gICAqIHJldHVybiB0aGUgdmFsdWUgdGhhdCB3YXMgcmVhZC48cD4gVGhpcyBpcyBhIDxiPnN1YnN0aXR1dGluZzxiPgotICAgKiBiYXJyaWVyLiAgVGhlIGNhbGwgdG8gdGhpcyBiYXJyaWVyIHRha2VzIHRoZSBwbGFjZSBvZiBhIGxvYWQuPHA+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCByZWZlcmVuY2UgaG9sZGluZyB0aGUgZmllbGQgYmVpbmcgcmVhZC4KLSAgICogQHBhcmFtIHNsb3QgVGhlIGFkZHJlc3Mgb2YgdGhlIHNsb3QgYmVpbmcgcmVhZC4KLSAgICogQHBhcmFtIG1ldGFEYXRhQSBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIGxvYWQKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIGxvYWQKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIGxvYWQgb2NjdXJyZWQKLSAgICogQHJldHVybiBUaGUgT2Zmc2V0IHRoYXQgd2FzIHJlYWQuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBPZmZzZXQgb2Zmc2V0UmVhZChPYmplY3RSZWZlcmVuY2Ugc3JjLCBBZGRyZXNzIHNsb3QsIFdvcmQgbWV0YURhdGFBLCBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpIHsKLSAgICAvLyBFaXRoZXI6IHJlYWQgYmFycmllcnMgYXJlIHVzZWQgYW5kIHRoaXMgaXMgb3ZlcnJpZGRlbiwgb3IKLSAgICAvLyByZWFkIGJhcnJpZXJzIGFyZSBub3QgdXNlZCBhbmQgdGhpcyBpcyBuZXZlciBjYWxsZWQKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChmYWxzZSk7Ci0gICAgcmV0dXJuIE9mZnNldC56ZXJvKCk7Ci0gIH0KLQotICAvKioKLSAgICogQSBudW1iZXIgb2YgT2Zmc2V0cyBhcmUgYWJvdXQgdG8gYmUgY29waWVkIGZyb20gb2JqZWN0Ci0gICAqIDxjb2RlPnNyYzwvY29kZT4gdG8gb2JqZWN0IDxjb2RlPmRzdDwvY29kZT4gKGFzIGluIGFuIGFycmF5Ci0gICAqIGNvcHkpLiAgVGh1cywgPGNvZGU+ZHN0PC9jb2RlPiBpcyB0aGUgbXV0YXRlZCBvYmplY3QuICBUYWtlCi0gICAqIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogQHBhcmFtIHNyYyBUaGUgc291cmNlIGFycmF5Ci0gICAqIEBwYXJhbSBzcmNPZmZzZXQgVGhlIHN0YXJ0aW5nIHNvdXJjZSBvZmZzZXQKLSAgICogQHBhcmFtIGRzdCBUaGUgZGVzdGluYXRpb24gYXJyYXkKLSAgICogQHBhcmFtIGRzdE9mZnNldCBUaGUgc3RhcnRpbmcgZGVzdGluYXRpb24gb2Zmc2V0Ci0gICAqIEBwYXJhbSBieXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGNvcGllZAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHVwZGF0ZSB3YXMgcGVyZm9ybWVkIGJ5IHRoZSBiYXJyaWVyLCBmYWxzZSBpZgotICAgKiBsZWZ0IHRvIHRoZSBjYWxsZXIgKGFsd2F5cyBmYWxzZSBpbiB0aGlzIGNhc2UpLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gb2Zmc2V0QnVsa0NvcHkoT2JqZWN0UmVmZXJlbmNlIHNyYywgT2Zmc2V0IHNyY09mZnNldCwgT2JqZWN0UmVmZXJlbmNlIGRzdCwgT2Zmc2V0IGRzdE9mZnNldCwgaW50IGJ5dGVzKSB7Ci0gICAgLy8gRWl0aGVyOiBidWxrIGNvcHkgaXMgc3VwcG9ydGVkIGFuZCB0aGlzIGlzIG92ZXJyaWRkZW4sIG9yCi0gICAgLy8gd3JpdGUgYmFycmllcnMgYXJlIG5vdCB1c2VkIGFuZCB0aGlzIGlzIG5ldmVyIGNhbGxlZAotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGZhbHNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGUgYW4gb2JqZWN0IHJlZmVyZW5jZS4gVGFrZSBhcHByb3ByaWF0ZSB3cml0ZSBiYXJyaWVyIGFjdGlvbnMuPHA+Ci0gICAqCi0gICAqIDxiPkJ5IGRlZmF1bHQgZG8gbm90aGluZywgb3ZlcnJpZGUgaWYgYXBwcm9wcmlhdGUuPC9iPgotICAgKgotICAgKiBAcGFyYW0gc3JjIFRoZSBvYmplY3QgaW50byB3aGljaCB0aGUgbmV3IHJlZmVyZW5jZSB3aWxsIGJlIHN0b3JlZAotICAgKiBAcGFyYW0gc2xvdCBUaGUgYWRkcmVzcyBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUKLSAgICogc3RvcmVkLgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBuZXcgcmVmZXJlbmNlCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbWV0YURhdGFCIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHN0b3JlIG9jY3VycmVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBvYmplY3RSZWZlcmVuY2VXcml0ZShPYmplY3RSZWZlcmVuY2Ugc3JjLCBBZGRyZXNzIHNsb3QsIE9iamVjdFJlZmVyZW5jZSB2YWx1ZSwgV29yZCBtZXRhRGF0YUEsIFdvcmQgbWV0YURhdGFCLCBpbnQgbW9kZSkgewotICAgIC8vIEVpdGhlcjogd3JpdGUgYmFycmllcnMgYXJlIHVzZWQgYW5kIHRoaXMgaXMgb3ZlcnJpZGRlbiwgb3IKLSAgICAvLyB3cml0ZSBiYXJyaWVycyBhcmUgbm90IHVzZWQgYW5kIHRoaXMgaXMgbmV2ZXIgY2FsbGVkCi0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgYW4gb2JqZWN0IHJlZmVyZW5jZS4gVGFrZSBhcHByb3ByaWF0ZSByZWFkIGJhcnJpZXIgYWN0aW9uLCBhbmQKLSAgICogcmV0dXJuIHRoZSB2YWx1ZSB0aGF0IHdhcyByZWFkLjxwPiBUaGlzIGlzIGEgPGI+c3Vic3RpdHV0aW5nPGI+Ci0gICAqIGJhcnJpZXIuICBUaGUgY2FsbCB0byB0aGlzIGJhcnJpZXIgdGFrZXMgdGhlIHBsYWNlIG9mIGEgbG9hZC48cD4KLSAgICoKLSAgICogQHBhcmFtIHNyYyBUaGUgb2JqZWN0IHJlZmVyZW5jZSBob2xkaW5nIHRoZSBmaWVsZCBiZWluZyByZWFkLgotICAgKiBAcGFyYW0gc2xvdCBUaGUgYWRkcmVzcyBvZiB0aGUgc2xvdCBiZWluZyByZWFkLgotICAgKiBAcGFyYW0gbWV0YURhdGFBIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgbG9hZAotICAgKiBAcGFyYW0gbWV0YURhdGFCIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgbG9hZAotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgbG9hZCBvY2N1cnJlZAotICAgKiBAcmV0dXJuIFRoZSByZWZlcmVuY2UgdGhhdCB3YXMgcmVhZC4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIE9iamVjdFJlZmVyZW5jZSBvYmplY3RSZWZlcmVuY2VSZWFkKE9iamVjdFJlZmVyZW5jZSBzcmMsIEFkZHJlc3Mgc2xvdCwgV29yZCBtZXRhRGF0YUEsIFdvcmQgbWV0YURhdGFCLCBpbnQgbW9kZSkgewotICAgIC8vIEVpdGhlcjogcmVhZCBiYXJyaWVycyBhcmUgdXNlZCBhbmQgdGhpcyBpcyBvdmVycmlkZGVuLCBvcgotICAgIC8vIHJlYWQgYmFycmllcnMgYXJlIG5vdCB1c2VkIGFuZCB0aGlzIGlzIG5ldmVyIGNhbGxlZAotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGZhbHNlKTsKLSAgICByZXR1cm4gT2JqZWN0UmVmZXJlbmNlLm51bGxSZWZlcmVuY2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiBBIG51bWJlciBvZiByZWZlcmVuY2VzIGFyZSBhYm91dCB0byBiZSBjb3BpZWQgZnJvbSBvYmplY3QKLSAgICogPGNvZGU+c3JjPC9jb2RlPiB0byBvYmplY3QgPGNvZGU+ZHN0PC9jb2RlPiAoYXMgaW4gYW4gYXJyYXkKLSAgICogY29weSkuICBUaHVzLCA8Y29kZT5kc3Q8L2NvZGU+IGlzIHRoZSBtdXRhdGVkIG9iamVjdC4gIFRha2UKLSAgICogYXBwcm9wcmlhdGUgd3JpdGUgYmFycmllciBhY3Rpb25zLjxwPgotICAgKgotICAgKiBAcGFyYW0gc3JjIFRoZSBzb3VyY2UgYXJyYXkKLSAgICogQHBhcmFtIHNyY09mZnNldCBUaGUgc3RhcnRpbmcgc291cmNlIG9mZnNldAotICAgKiBAcGFyYW0gZHN0IFRoZSBkZXN0aW5hdGlvbiBhcnJheQotICAgKiBAcGFyYW0gZHN0T2Zmc2V0IFRoZSBzdGFydGluZyBkZXN0aW5hdGlvbiBvZmZzZXQKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgY29waWVkCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgdXBkYXRlIHdhcyBwZXJmb3JtZWQgYnkgdGhlIGJhcnJpZXIsIGZhbHNlIGlmCi0gICAqIGxlZnQgdG8gdGhlIGNhbGxlciAoYWx3YXlzIGZhbHNlIGluIHRoaXMgY2FzZSkuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBvYmplY3RSZWZlcmVuY2VCdWxrQ29weShPYmplY3RSZWZlcmVuY2Ugc3JjLCBPZmZzZXQgc3JjT2Zmc2V0LCBPYmplY3RSZWZlcmVuY2UgZHN0LCBPZmZzZXQgZHN0T2Zmc2V0LCBpbnQgYnl0ZXMpIHsKLSAgICAvLyBFaXRoZXI6IGJ1bGsgY29weSBpcyBzdXBwb3J0ZWQgYW5kIHRoaXMgaXMgb3ZlcnJpZGRlbiwgb3IKLSAgICAvLyB3cml0ZSBiYXJyaWVycyBhcmUgbm90IHVzZWQgYW5kIHRoaXMgaXMgbmV2ZXIgY2FsbGVkCi0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZmFsc2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEEgbmV3IHJlZmVyZW5jZSBpcyBhYm91dCB0byBiZSBjcmVhdGVkIGluIGEgbG9jYXRpb24gdGhhdCBpcyBub3QKLSAgICogYSByZWd1bGFyIGhlYXAgb2JqZWN0LiAgVGFrZSBhcHByb3ByaWF0ZSB3cml0ZSBiYXJyaWVyIGFjdGlvbnMuPHA+Ci0gICAqCi0gICAqIDxiPkJ5IGRlZmF1bHQgZG8gbm90aGluZywgb3ZlcnJpZGUgaWYgYXBwcm9wcmlhdGUuPC9iPgotICAgKgotICAgKiBAcGFyYW0gc2xvdCBUaGUgYWRkcmVzcyBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUKLSAgICogc3RvcmVkLgotICAgKiBAcGFyYW0gdGd0IFRoZSB0YXJnZXQgb2YgdGhlIG5ldyByZWZlcmVuY2UKLSAgICogQHBhcmFtIG1ldGFEYXRhQSBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIHN0b3JlCi0gICAqIEBwYXJhbSBtZXRhRGF0YUIgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKi8KLSAgcHVibGljIHZvaWQgb2JqZWN0UmVmZXJlbmNlTm9uSGVhcFdyaXRlKEFkZHJlc3Mgc2xvdCwgT2JqZWN0UmVmZXJlbmNlIHRndCwgV29yZCBtZXRhRGF0YUEsIFdvcmQgbWV0YURhdGFCKSB7Ci0gICAgLy8gRWl0aGVyOiB3cml0ZSBiYXJyaWVycyBhcmUgdXNlZCBhbmQgdGhpcyBpcyBvdmVycmlkZGVuLCBvcgotICAgIC8vIHdyaXRlIGJhcnJpZXJzIGFyZSBub3QgdXNlZCBhbmQgdGhpcyBpcyBuZXZlciBjYWxsZWQKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBhbiBvYmplY3QgcmVmZXJlbmNlLiBUYWtlIGFwcHJvcHJpYXRlIHJlYWQgYmFycmllciBhY3Rpb24sIGFuZAotICAgKiByZXR1cm4gdGhlIHZhbHVlIHRoYXQgd2FzIHJlYWQuPHA+IFRoaXMgaXMgYSA8Yj5zdWJzdGl0dXRpbmc8Yj4KLSAgICogYmFycmllci4gIFRoZSBjYWxsIHRvIHRoaXMgYmFycmllciB0YWtlcyB0aGUgcGxhY2Ugb2YgYSBsb2FkLjxwPgotICAgKgotICAgKiBAcGFyYW0gc2xvdCBUaGUgYWRkcmVzcyBvZiB0aGUgc2xvdCBiZWluZyByZWFkLgotICAgKiBAcGFyYW0gbWV0YURhdGFBIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgbG9hZAotICAgKiBAcGFyYW0gbWV0YURhdGFCIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgbG9hZAotICAgKiBAcmV0dXJuIFRoZSByZWZlcmVuY2UgdGhhdCB3YXMgcmVhZC4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIE9iamVjdFJlZmVyZW5jZSBvYmplY3RSZWZlcmVuY2VOb25IZWFwUmVhZChBZGRyZXNzIHNsb3QsIFdvcmQgbWV0YURhdGFBLCBXb3JkIG1ldGFEYXRhQikgewotICAgIC8vIEVpdGhlcjogcmVhZCBiYXJyaWVycyBhcmUgdXNlZCBhbmQgdGhpcyBpcyBvdmVycmlkZGVuLCBvcgotICAgIC8vIHJlYWQgYmFycmllcnMgYXJlIG5vdCB1c2VkIGFuZCB0aGlzIGlzIG5ldmVyIGNhbGxlZAotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGZhbHNlKTsKLSAgICByZXR1cm4gT2JqZWN0UmVmZXJlbmNlLm51bGxSZWZlcmVuY2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiBBdHRlbXB0IHRvIGF0b21pY2FsbHkgZXhjaGFuZ2UgdGhlIHZhbHVlIGluIHRoZSBnaXZlbiBzbG90Ci0gICAqIHdpdGggdGhlIHBhc3NlZCByZXBsYWNlbWVudCB2YWx1ZS4gSWYgYSBuZXcgcmVmZXJlbmNlIGlzCi0gICAqIGNyZWF0ZWQsIHdlIG11c3QgdGhlbiB0YWtlIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogPGI+QnkgZGVmYXVsdCBkbyBub3RoaW5nLCBvdmVycmlkZSBpZiBhcHByb3ByaWF0ZS48L2I+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUgc3RvcmVkCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZQotICAgKiBzdG9yZWQuCi0gICAqIEBwYXJhbSBvbGQgVGhlIG9sZCByZWZlcmVuY2UgdG8gYmUgc3dhcHBlZCBvdXQKLSAgICogQHBhcmFtIHRndCBUaGUgdGFyZ2V0IG9mIHRoZSBuZXcgcmVmZXJlbmNlCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbWV0YURhdGFCIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHN0b3JlIG9jY3VycmVkCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3dhcCB3YXMgc3VjY2Vzc2Z1bC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIG9iamVjdFJlZmVyZW5jZVRyeUNvbXBhcmVBbmRTd2FwKE9iamVjdFJlZmVyZW5jZSBzcmMsIEFkZHJlc3Mgc2xvdCwgT2JqZWN0UmVmZXJlbmNlIG9sZCwgT2JqZWN0UmVmZXJlbmNlIHRndCwgV29yZCBtZXRhRGF0YUEsIFdvcmQgbWV0YURhdGFCLCBpbnQgbW9kZSkgewotICAgIC8vIEVpdGhlcjogd3JpdGUgYmFycmllcnMgYXJlIHVzZWQgYW5kIHRoaXMgaXMgb3ZlcnJpZGRlbiwgb3IKLSAgICAvLyB3cml0ZSBiYXJyaWVycyBhcmUgbm90IHVzZWQgYW5kIHRoaXMgaXMgbmV2ZXIgY2FsbGVkCi0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZmFsc2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBGbHVzaCBtdXRhdG9yIGNvbnRleHQsIGluIHJlc3BvbnNlIHRvIGEgcmVxdWVzdE11dGF0b3JGbHVzaC4KLSAgICogQWxzbyBjYWxsZWQgYnkgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgZGVpbml0TXV0YXRvci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGZsdXNoKCkgewotICAgIGZsdXNoUmVtZW1iZXJlZFNldHMoKTsKLSAgICBzbWNvZGUuZmx1c2goKTsKLSAgICBub25tb3ZlLmZsdXNoKCk7Ci0gIH0KLQotICAvKioKLSAgICogRmx1c2ggcGVyLW11dGF0b3IgcmVtZW1iZXJlZCBzZXRzIGludG8gdGhlIGdsb2JhbCByZW1zZXQgcG9vbC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGZsdXNoUmVtZW1iZXJlZFNldHMoKSB7Ci0gICAgLy8gRWl0aGVyOiB3cml0ZSBiYXJyaWVycyBhcmUgdXNlZCBhbmQgdGhpcyBpcyBvdmVycmlkZGVuLCBvcgotICAgIC8vIHdyaXRlIGJhcnJpZXJzIGFyZSBub3QgdXNlZCBhbmQgdGhpcyBpcyBhIG5vLW9wCi0gIH0KLQotICAvKioKLSAgICogQXNzZXJ0IHRoYXQgdGhlIHJlbXNldHMgaGF2ZSBiZWVuIGZsdXNoZWQuICBUaGlzIGlzIGNyaXRpY2FsIHRvCi0gICAqIGNvcnJlY3RuZXNzLiAgV2UgbmVlZCB0byBtYWludGFpbiB0aGUgaW52YXJpYW50IHRoYXQgcmVtc2V0IGVudHJpZXMKLSAgICogZG8gbm90IGFjY3J1ZSBkdXJpbmcgR0MuICBJZiB0aGUgaG9zdCBKVk0gZ2VuZXJhdGVzIGJhcnJpZXIgZW50aXJlcwotICAgKiBpdCBpcyBpdHMgb3duIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IHRoZXkgYXJlIGZsdXNoZWQgYmVmb3JlCi0gICAqIHJldHVybmluZyB0byBNTVRrLgotICAgKi8KLSAgcHVibGljIHZvaWQgYXNzZXJ0UmVtc2V0c0ZsdXNoZWQoKSB7Ci0gICAgLy8gRWl0aGVyOiB3cml0ZSBiYXJyaWVycyBhcmUgdXNlZCBhbmQgdGhpcyBpcyBvdmVycmlkZGVuLCBvcgotICAgIC8vIHdyaXRlIGJhcnJpZXJzIGFyZSBub3QgdXNlZCBhbmQgdGhpcyBpcyBhIG5vLW9wCi0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogTWlzY2VsbGFuZW91cwotICAgKi8KLQotICAvKiogQHJldHVybiB0aGUgPGNvZGU+TG9nPC9jb2RlPiBpbnN0YW5jZSBmb3IgdGhpcyBQbGFuTG9jYWwgKi8KLSAgcHVibGljIGZpbmFsIExvZyBnZXRMb2coKSB7Ci0gICAgcmV0dXJuIGxvZzsKLSAgfQotCi0gIC8qKiBAcmV0dXJuIHRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBtdXRhdG9yIGNvbnRleHQuICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGludCBnZXRJZCgpIHsgcmV0dXJuIGlkOyB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9QaGFzZS5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL1BoYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMWI0NDIuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL1BoYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTggKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW47Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkNvbnN0YW50czsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkxvZzsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnMuT3B0aW9uczsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LnN0YXRpc3RpY3MuVGltZXI7Ci1pbXBvcnQgb3JnLm1tdGsudm0uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIEEgZ2FyYmFnZSBjb2xsZWN0aW9uIHByb2NlZWRzIGFzIGEgc2VxdWVuY2Ugb2YgcGhhc2VzLiBFYWNoCi0gKiBwaGFzZSBpcyBlaXRoZXIgc2ltcGxlIChzaW5ndWxhcikgb3IgY29tcGxleCAoYW4gYXJyYXkpLgotICoKLSAqIFRoZSBjb250ZXh0IGFuIGluZGl2aWR1YWwgcGhhc2UgZXhlY3V0ZXMgaW4gbWF5IGJlIGdsb2JhbCwgbXV0YXRvciwKLSAqIG9yIGNvbGxlY3Rvci4KLSAqCi0gKiBQaGFzZXMgYXJlIGV4ZWN1dGVkIHdpdGhpbiBhIHN0YWNrIGFuZCBhbGwgc3luY2hyb25pemF0aW9uIGJldHdlZW4KLSAqIHBhcmFsbGVsIEdDIHRocmVhZHMgaXMgbWFuYWdlZCBmcm9tIHdpdGhpbiB0aGlzIGNsYXNzLgotICoKLSAqIEBzZWUgQ29sbGVjdG9yQ29udGV4dCNjb2xsZWN0aW9uUGhhc2UKLSAqIEBzZWUgTXV0YXRvckNvbnRleHQjY29sbGVjdGlvblBoYXNlCi0gKiBAc2VlIFBsYW4jY29sbGVjdGlvblBoYXNlCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQaGFzZSBpbXBsZW1lbnRzIENvbnN0YW50cyB7Ci0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogUGhhc2UgYWxsb2NhdGlvbiBhbmQgc3RvcmFnZS4KLSAgKi8KLQotICAvKiogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBoYXNlcyAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1BIQVNFUyA9IDY0OwotICAvKiogVGhlIGFycmF5IG9mIHBoYXNlIGluc3RhbmNlcy4gWmVybyBpcyB1bnVzZWQuICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFBoYXNlW10gcGhhc2VzID0gbmV3IFBoYXNlW01BWF9QSEFTRVNdOwotICAvKiogVGhlIGlkIHRvIGJlIGFsbG9jYXRlZCBmb3IgdGhlIG5leHQgcGhhc2UgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgc2hvcnQgbmV4dFBoYXNlSWQgPSAxOwotCi0gIC8qKiBSdW4gdGhlIHBoYXNlIGdsb2JhbGx5LiAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIHNob3J0IFNDSEVEVUxFX0dMT0JBTCA9IDE7Ci0gIC8qKiBSdW4gdGhlIHBoYXNlIG9uIGNvbGxlY3RvcnMuICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgc2hvcnQgU0NIRURVTEVfQ09MTEVDVE9SID0gMjsKLSAgLyoqIFJ1biB0aGUgcGhhc2Ugb24gbXV0YXRvcnMuICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgc2hvcnQgU0NIRURVTEVfTVVUQVRPUiA9IDM7Ci0gIC8qKiBEb24ndCBydW4gdGhpcyBwaGFzZS4gKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBzaG9ydCBTQ0hFRFVMRV9QTEFDRUhPTERFUiA9IDEwMDsKLSAgLyoqIFRoaXMgaXMgYSBjb21wbGV4IHBoYXNlLiAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIHNob3J0IFNDSEVEVUxFX0NPTVBMRVggPSAxMDE7Ci0KLSAgLyoqCi0gICAqIFJldHJpZXZlIGEgcGhhc2UgYnkgdGhlIHVuaXF1ZSBwaGFzZSBpZGVudGlmaWVyLgotICAgKgotICAgKiBAcGFyYW0gaWQgVGhlIHBoYXNlIGlkZW50aWZpZXIuCi0gICAqIEByZXR1cm4gVGhlIFBoYXNlIGluc3RhbmNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBQaGFzZSBnZXRQaGFzZShzaG9ydCBpZCkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgewotICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGlkIDwgbmV4dFBoYXNlSWQsICJQaGFzZSBJRCB1bmtub3duIik7Ci0gICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQocGhhc2VzW2lkXSAhPSBudWxsLCAiVW5pbml0aWFsaXNlZCBwaGFzZSIpOwotICAgIH0KLSAgICByZXR1cm4gcGhhc2VzW2lkXTsKLSAgfQotCi0gIC8qKiBHZXQgdGhlIHBoYXNlIGlkIGNvbXBvbmVudCBvZiBhbiBlbmNvZGVkIHBoYXNlICovCi0gIHByb3RlY3RlZCBzdGF0aWMgc2hvcnQgZ2V0UGhhc2VJZChpbnQgc2NoZWR1bGVkUGhhc2UpIHsKLSAgICBzaG9ydCBwaGFzZUlkID0gKHNob3J0KShzY2hlZHVsZWRQaGFzZSAmIDB4MDAwMEZGRkYpOwotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KHBoYXNlSWQgPiAwKTsKLSAgICByZXR1cm4gcGhhc2VJZDsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gcGhhc2VJZCBUaGUgdW5pcXVlIHBoYXNlIGlkZW50aWZpZXIuCi0gICAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIHBoYXNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZShzaG9ydCBwaGFzZUlkKSB7Ci0gICAgcmV0dXJuIHBoYXNlc1twaGFzZUlkXS5uYW1lOwotICB9Ci0KLSAgLyoqIEdldCB0aGUgb3JkZXJpbmcgY29tcG9uZW50IG9mIGFuIGVuY29kZWQgcGhhc2UgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBzaG9ydCBnZXRTY2hlZHVsZShpbnQgc2NoZWR1bGVkUGhhc2UpIHsKLSAgICBzaG9ydCBvcmRlcmluZyA9IChzaG9ydCkoKHNjaGVkdWxlZFBoYXNlID4+IDE2KSAmIDB4MDAwMEZGRkYpOwotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KG9yZGVyaW5nID4gMCk7Ci0gICAgcmV0dXJuIG9yZGVyaW5nOwotICB9Ci0KLSAgLyoqIEdldCB0aGUgb3JkZXJpbmcgY29tcG9uZW50IG9mIGFuIGVuY29kZWQgcGhhc2UgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0U2NoZWR1bGVOYW1lKHNob3J0IG9yZGVyaW5nKSB7Ci0gICAgc3dpdGNoIChvcmRlcmluZykgewotICAgICAgY2FzZSBTQ0hFRFVMRV9HTE9CQUw6ICAgICAgcmV0dXJuICJHbG9iYWwiOwotICAgICAgY2FzZSBTQ0hFRFVMRV9DT0xMRUNUT1I6ICAgcmV0dXJuICJDb2xsZWN0b3IiOwotICAgICAgY2FzZSBTQ0hFRFVMRV9NVVRBVE9SOiAgICAgcmV0dXJuICJNdXRhdG9yIjsKLSAgICAgIGNhc2UgU0NIRURVTEVfUExBQ0VIT0xERVI6IHJldHVybiAiUGxhY2Vob2xkZXIiOwotICAgICAgY2FzZSBTQ0hFRFVMRV9DT01QTEVYOiAgICAgcmV0dXJuICJDb21wbGV4IjsKLSAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgIHJldHVybiAiVU5LTk9XTiEiOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYSBwaGFzZS4KLSAgICoKLSAgICogQHBhcmFtIG5hbWUgRGlzcGxheSBuYW1lIG9mIHRoZSBwaGFzZQotICAgKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHVibGljIHN0YXRpYyBzaG9ydCBjcmVhdGVTaW1wbGUoU3RyaW5nIG5hbWUpIHsKLSAgICByZXR1cm4gbmV3IFNpbXBsZVBoYXNlKG5hbWUpLmdldElkKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0IGEgcGhhc2UsIHJlLXVzaW5nIGEgc3BlY2lmaWVkIHRpbWVyLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBEaXNwbGF5IG5hbWUgb2YgdGhlIHBoYXNlCi0gICAqLwotICBASW50ZXJydXB0aWJsZQotICBwdWJsaWMgc3RhdGljIHNob3J0IGNyZWF0ZVNpbXBsZShTdHJpbmcgbmFtZSwgVGltZXIgdGltZXIpIHsKLSAgICByZXR1cm4gbmV3IFNpbXBsZVBoYXNlKG5hbWUsIHRpbWVyKS5nZXRJZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdCBhIGNvbXBsZXggcGhhc2UuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIERpc3BsYXkgbmFtZSBvZiB0aGUgcGhhc2UKLSAgICogQHBhcmFtIHNjaGVkdWxlZFBoYXNlcyBUaGUgcGhhc2VzIGluIHRoaXMgY29tcGxleCBwaGFzZS4KLSAgICovCi0gIEBJbnRlcnJ1cHRpYmxlCi0gIHB1YmxpYyBzdGF0aWMgc2hvcnQgY3JlYXRlQ29tcGxleChTdHJpbmcgbmFtZSxpbnQuLi4gc2NoZWR1bGVkUGhhc2VzKSB7Ci0gICAgcmV0dXJuIG5ldyBDb21wbGV4UGhhc2UobmFtZSwgc2NoZWR1bGVkUGhhc2VzKS5nZXRJZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdCBhIGNvbXBsZXggcGhhc2UsIHJlLXVzaW5nIGEgc3BlY2lmaWVkIHRpbWVyLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBEaXNwbGF5IG5hbWUgb2YgdGhlIHBoYXNlCi0gICAqIEBwYXJhbSB0aW1lciBUaW1lciBmb3IgdGhpcyBwaGFzZSB0byBjb250cmlidXRlIHRvCi0gICAqIEBwYXJhbSBzY2hlZHVsZWRQaGFzZXMgVGhlIHBoYXNlcyBpbiB0aGlzIGNvbXBsZXggcGhhc2UuCi0gICAqLwotICBASW50ZXJydXB0aWJsZQotICBwdWJsaWMgc3RhdGljIHNob3J0IGNyZWF0ZUNvbXBsZXgoU3RyaW5nIG5hbWUsIFRpbWVyIHRpbWVyLCBpbnQuLi4gc2NoZWR1bGVkUGhhc2VzKSB7Ci0gICAgcmV0dXJuIG5ldyBDb21wbGV4UGhhc2UobmFtZSwgdGltZXIsIHNjaGVkdWxlZFBoYXNlcykuZ2V0SWQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBUYWtlIHRoZSBwYXNzZWQgcGhhc2UgYW5kIHJldHVybiBhbiBlbmNvZGVkIHBoYXNlIHRvCi0gICAqIHJ1biB0aGF0IHBoYXNlIGFzIGEgY29tcGxleCBwaGFzZS4KLSAgICoKLSAgICogQHBhcmFtIHBoYXNlSWQgVGhlIHBoYXNlIHRvIHJ1biBhcyBjb21wbGV4Ci0gICAqIEByZXR1cm4gVGhlIGVuY29kZWQgcGhhc2UgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBzY2hlZHVsZUNvbXBsZXgoc2hvcnQgcGhhc2VJZCkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KFBoYXNlLmdldFBoYXNlKHBoYXNlSWQpIGluc3RhbmNlb2YgQ29tcGxleFBoYXNlKTsKLSAgICByZXR1cm4gKFNDSEVEVUxFX0NPTVBMRVggPDwgMTYpICsgcGhhc2VJZDsKLSAgfQotCi0gIC8qKgotICAgKiBUYWtlIHRoZSBwYXNzZWQgcGhhc2UgYW5kIHJldHVybiBhbiBlbmNvZGVkIHBoYXNlIHRvCi0gICAqIHJ1biB0aGF0IHBoYXNlIGluIGEgZ2xvYmFsIGNvbnRleHQ7Ci0gICAqCi0gICAqIEBwYXJhbSBwaGFzZUlkIFRoZSBwaGFzZSB0byBydW4gZ2xvYmFsbHkKLSAgICogQHJldHVybiBUaGUgZW5jb2RlZCBwaGFzZSB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IHNjaGVkdWxlR2xvYmFsKHNob3J0IHBoYXNlSWQpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChQaGFzZS5nZXRQaGFzZShwaGFzZUlkKSBpbnN0YW5jZW9mIFNpbXBsZVBoYXNlKTsKLSAgICByZXR1cm4gKFNDSEVEVUxFX0dMT0JBTCA8PCAxNikgKyBwaGFzZUlkOwotICB9Ci0KLSAgLyoqCi0gICAqIFRha2UgdGhlIHBhc3NlZCBwaGFzZSBhbmQgcmV0dXJuIGFuIGVuY29kZWQgcGhhc2UgdG8KLSAgICogcnVuIHRoYXQgcGhhc2UgaW4gYSBjb2xsZWN0b3IgY29udGV4dDsKLSAgICoKLSAgICogQHBhcmFtIHBoYXNlSWQgVGhlIHBoYXNlIHRvIHJ1biBvbiBjb2xsZWN0b3JzCi0gICAqIEByZXR1cm4gVGhlIGVuY29kZWQgcGhhc2UgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBzY2hlZHVsZUNvbGxlY3RvcihzaG9ydCBwaGFzZUlkKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoUGhhc2UuZ2V0UGhhc2UocGhhc2VJZCkgaW5zdGFuY2VvZiBTaW1wbGVQaGFzZSk7Ci0gICAgcmV0dXJuIChTQ0hFRFVMRV9DT0xMRUNUT1IgPDwgMTYpICsgcGhhc2VJZDsKLSAgfQotCi0gIC8qKgotICAgKiBUYWtlIHRoZSBwYXNzZWQgcGhhc2UgYW5kIHJldHVybiBhbiBlbmNvZGVkIHBoYXNlIHRvCi0gICAqIHJ1biB0aGF0IHBoYXNlIGluIGEgbXV0YXRvciBjb250ZXh0OwotICAgKgotICAgKiBAcGFyYW0gcGhhc2VJZCBUaGUgcGhhc2UgdG8gcnVuIG9uIG11dGF0b3JzCi0gICAqIEByZXR1cm4gVGhlIGVuY29kZWQgcGhhc2UgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBzY2hlZHVsZU11dGF0b3Ioc2hvcnQgcGhhc2VJZCkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KFBoYXNlLmdldFBoYXNlKHBoYXNlSWQpIGluc3RhbmNlb2YgU2ltcGxlUGhhc2UpOwotICAgIHJldHVybiAoU0NIRURVTEVfTVVUQVRPUiA8PCAxNikgKyBwaGFzZUlkOwotICB9Ci0KLSAgLyoqCi0gICAqIFRha2UgdGhlIHBhc3NlZCBwaGFzZSBhbmQgcmV0dXJuIGFuIGVuY29kZWQgcGhhc2UgdG8KLSAgICogcnVuIHRoYXQgcGhhc2UgaW4gYSBtdXRhdG9yIGNvbnRleHQ7Ci0gICAqCi0gICAqIEBwYXJhbSBwaGFzZUlkIFRoZSBwaGFzZSB0byBydW4gb24gbXV0YXRvcnMKLSAgICogQHJldHVybiBUaGUgZW5jb2RlZCBwaGFzZSB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IHNjaGVkdWxlUGxhY2Vob2xkZXIoc2hvcnQgcGhhc2VJZCkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KFBoYXNlLmdldFBoYXNlKHBoYXNlSWQpIGluc3RhbmNlb2YgU2ltcGxlUGhhc2UpOwotICAgIHJldHVybiAoU0NIRURVTEVfUExBQ0VIT0xERVIgPDwgMTYpICsgcGhhc2VJZDsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBQaGFzZSBpbnN0YW5jZSBmaWVsZHMvbWV0aG9kcy4KLSAgICovCi0KLSAgLyoqCi0gICAqIFRoZSB1bmlxdWUgcGhhc2UgaWRlbnRpZmllci4KLSAgICovCi0gIHByb3RlY3RlZCBmaW5hbCBzaG9ydCBpZDsKLQotICAvKioKLSAgICogVGhlIG5hbWUgb2YgdGhlIHBoYXNlLgotICAgKi8KLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBuYW1lOwotCi0gIC8qKgotICAgKiBUaGUgVGltZXIgdGhhdCBpcyBzdGFydGVkIGFuZCBzdG9wcGVkIGFyb3VuZCB0aGUgZXhlY3V0aW9uIG9mIHRoaXMKLSAgICogcGhhc2UuCi0gICAqLwotICBwcm90ZWN0ZWQgZmluYWwgVGltZXIgdGltZXI7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBQaGFzZS4gVGhpcyBpbnZvbHZlcyBjcmVhdGluZyBhIGNvcnJlc3BvbmRpbmcgVGltZXIKLSAgICogaW5zdGFuY2UsIGFsbG9jYXRpbmcgYSB1bmlxdWUgaWRlbnRpZmllciwgYW5kIHJlZ2lzdGVyaW5nIHRoZQotICAgKiBQaGFzZS4KLSAgICoKLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgZm9yIHRoZSBwaGFzZS4KLSAgICovCi0gIHByb3RlY3RlZCBQaGFzZShTdHJpbmcgbmFtZSkgewotICAgIHRoaXMobmFtZSwgbmV3IFRpbWVyKG5hbWUsIGZhbHNlLCB0cnVlKSk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IHBoYXNlLiBUaGlzIGludm9sdmVzIHNldHRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgVGltZXIKLSAgICogaW5zdGFuY2UsIGFsbG9jYXRpbmcgYSB1bmlxdWUgaWRlbnRpZmllciwgYW5kIHJlZ2lzdGVyaW5nIHRoZSBQaGFzZS4KLSAgICoKLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHBoYXNlLgotICAgKiBAcGFyYW0gdGltZXIgVGhlIHRpbWVyLCBvciBudWxsIGlmIHRoaXMgaXMgYW4gdW50aW1lZCBwaGFzZS4KLSAgICovCi0gIHByb3RlY3RlZCBQaGFzZShTdHJpbmcgbmFtZSwgVGltZXIgdGltZXIpIHsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIHRoaXMudGltZXIgPSB0aW1lcjsKLSAgICB0aGlzLmlkID0gbmV4dFBoYXNlSWQrKzsKLSAgICBwaGFzZXNbdGhpcy5pZF0gPSB0aGlzOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHBoYXNlLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHNob3J0IGdldElkKCkgewotICAgIHJldHVybiB0aGlzLmlkOwotICB9Ci0KLSAgLyoqCi0gICAqIERpc3BsYXkgYSBwaGFzZSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgotICAgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgbG9nUGhhc2UoKTsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogUGhhc2Ugc3RhY2sKLSAgICovCi0KLSAgLyoqIFRoZSBtYXhpbXVtIHN0YWNrIGRlcHRoIGZvciB0aGUgcGhhc2Ugc3RhY2suICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUEhBU0VfU1RBQ0tfREVQVEggPSBNQVhfUEhBU0VTOwotCi0gIC8qKiBTdG9yZXMgdGhlIGN1cnJlbnQgc3ViIHBoYXNlIGZvciBhIGNvbXBsZXggcGhhc2UuIEVhY2ggZW50cnkgY29ycmVzcG9uZHMgdG8gYSBwaGFzZSBzdGFjayBlbnRyeSAqLwotICBwcml2YXRlIHN0YXRpYyBpbnRbXSBjb21wbGV4UGhhc2VDdXJzb3IgPSBuZXcgaW50W01BWF9QSEFTRV9TVEFDS19ERVBUSF07Ci0KLSAgLyoqIFRoZSBwaGFzZSBzdGFjay4gU3RvcmVzIHRoZSBjdXJyZW50IG5lc3Rpbmcgb2YgcGhhc2VzICovCi0gIHByaXZhdGUgc3RhdGljIGludFtdIHBoYXNlU3RhY2sgPSBuZXcgaW50W01BWF9QSEFTRV9TVEFDS19ERVBUSF07Ci0KLSAgLyoqIFRoZSBjdXJyZW50IHN0YWNrIHBvaW50ZXIgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHBoYXNlU3RhY2tQb2ludGVyID0gLTE7Ci0KLSAgLyoqCi0gICAqIFRoZSBjdXJyZW50IGV2ZW4gKDAgbW9kIDIpIHNjaGVkdWxlZCBwaGFzZS4KLSAgICogQXMgd2Ugb25seSBzeW5jIGF0IHRoZSBlbmQgb2YgYSBwaGFzZSB3ZSBuZWVkIHRoaXMgdG8gZW5zdXJlIHRoYXQKLSAgICogdGhlIHByaW1hcnkgdGhyZWFkIHNldHRpbmcgdGhlIHBoYXNlIGRvZXMgbm90IHJhY2Ugd2l0aCB0aGUgb3RoZXIKLSAgICogdGhyZWFkcyByZWFkaW5nIGl0LgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IGV2ZW5TY2hlZHVsZWRQaGFzZTsKLQotICAvKioKLSAgICogVGhlIGN1cnJlbnQgb2RkICgxIG1vZCAyKSBzY2hlZHVsZWQgcGhhc2UuCi0gICAqIEFzIHdlIG9ubHkgc3luYyBhdCB0aGUgZW5kIG9mIGEgcGhhc2Ugd2UgbmVlZCB0aGlzIHRvIGVuc3VyZSB0aGF0Ci0gICAqIHRoZSBwcmltYXJ5IHRocmVhZCBzZXR0aW5nIHRoZSBwaGFzZSBkb2VzIG5vdCByYWNlIHdpdGggdGhlIG90aGVyCi0gICAqIHRocmVhZHMgcmVhZGluZyBpdC4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGludCBvZGRTY2hlZHVsZWRQaGFzZTsKLQotICAvKioKLSAgICogRG8gd2UgbmVlZCB0byBhZGQgYSBzeW5jIHBvaW50IHRvIHJlc2V0IHRoZSBtdXRhdG9yIGNvdW50LiBUaGlzCi0gICAqIGlzIG5lY2Vzc2FyeSBmb3IgY29uc2VjdXRpdmUgbXV0YXRvciBwaGFzZXMgYW5kIHVubmVjY2Vzc2FyeQotICAgKiBvdGhlcndpc2UuIEFnYWluIHdlIHNlcGFyYXRlIGluIGV2ZW4gYW5kIG9kZCB0byBlbnN1cmUgdGhhdCB0aGVyZQotICAgKiBpcyBubyByYWNlIGJldHdlZW4gdGhlIHByaW1hcnkgdGhyZWFkIHNldHRpbmcgYW5kIHRoZSBoZWxwZXIKLSAgICogdGhyZWFkcyByZWFkaW5nLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBldmVuTXV0YXRvclJlc2V0UmVuZGV6dm91czsKLQotICAvKioKLSAgICogRG8gd2UgbmVlZCB0byBhZGQgYSBzeW5jIHBvaW50IHRvIHJlc2V0IHRoZSBtdXRhdG9yIGNvdW50LiBUaGlzCi0gICAqIGlzIG5lY2Vzc2FyeSBmb3IgY29uc2VjdXRpdmUgbXV0YXRvciBwaGFzZXMgYW5kIHVubmVjY2Vzc2FyeQotICAgKiBvdGhlcndpc2UuIEFnYWluIHdlIHNlcGFyYXRlIGluIGV2ZW4gYW5kIG9kZCB0byBlbnN1cmUgdGhhdCB0aGVyZQotICAgKiBpcyBubyByYWNlIGJldHdlZW4gdGhlIHByaW1hcnkgdGhyZWFkIHNldHRpbmcgYW5kIHRoZSBoZWxwZXIKLSAgICogdGhyZWFkcyByZWFkaW5nLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBvZGRNdXRhdG9yUmVzZXRSZW5kZXp2b3VzOwotCi0gIC8qKgotICAgKiBUaGUgY29tcGxleCBwaGFzZSB3aG9zZSB0aW1lciBzaG91bGQgYmUgc3RhcnRlZCBhZnRlciB0aGUgbmV4dAotICAgKiByZW5kZXp2b3VzLiBXZSBjYW4gbm90IHN0YXJ0IHRoZSB0aW1lciBhdCB0aGUgcG9pbnQgd2UgZGV0ZXJtaW5lCi0gICAqIHRoZSBuZXh0IGNvbXBsZXggcGhhc2UgYXMgd2UgZGV0ZXJtaW5lIHRoZSBuZXh0IHBoYXNlIGF0IHRoZQotICAgKiBlbmQgb2YgdGhlIHByZXZpb3VzIHBoYXNlIGJlZm9yZSB0aGUgc3luYyBwb2ludC4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIHNob3J0IHN0YXJ0Q29tcGxleFRpbWVyOwotCi0gIC8qKgotICAgKiBUaGUgY29tcGxleCBwaGFzZSB3aG9zZSB0aW1lciBzaG91bGQgYmUgc3RvcHBlZCBhZnRlciB0aGUgbmV4dAotICAgKiByZW5kZXp2b3VzLiBXZSBjYW4gbm90IHN0YXJ0IHRoZSB0aW1lciBhdCB0aGUgcG9pbnQgd2UgZGV0ZXJtaW5lCi0gICAqIHRoZSBuZXh0IGNvbXBsZXggcGhhc2UgYXMgd2UgZGV0ZXJtaW5lIHRoZSBuZXh0IHBoYXNlIGF0IHRoZQotICAgKiBlbmQgb2YgdGhlIHByZXZpb3VzIHBoYXNlIGJlZm9yZSB0aGUgc3luYyBwb2ludC4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIHNob3J0IHN0b3BDb21wbGV4VGltZXI7Ci0KLSAgLyoqCi0gICAqIFBsYWNlIGEgcGhhc2Ugb24gdGhlIHBoYXNlIHN0YWNrIGFuZCBiZWdpbiBwcm9jZXNzaW5nLgotICAgKgotICAgKiBAcGFyYW0gc2NoZWR1bGVkUGhhc2UgVGhlIHBoYXNlIHRvIGV4ZWN1dGUKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBwaGFzZSBzdGFjayBpcyBleGhhdXN0ZWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gYmVnaW5OZXdQaGFzZVN0YWNrKGludCBzY2hlZHVsZWRQaGFzZSkgewotICAgIGludCBvcmRlciA9IFZNLmNvbGxlY3Rpb24ucmVuZGV6dm91cygxMDAxKTsKLQotICAgIGlmIChvcmRlciA9PSAxKSB7Ci0gICAgICBwdXNoU2NoZWR1bGVkUGhhc2Uoc2NoZWR1bGVkUGhhc2UpOwotICAgIH0KLSAgICByZXR1cm4gcHJvY2Vzc1BoYXNlU3RhY2soZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByb2Nlc3MgdGhlIHBoYXNlIHN0YWNrLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgbXVsdGlwbGUgdGhyZWFkcy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gcHJvY2Vzc1BoYXNlU3RhY2soYm9vbGVhbiByZXN1bWUpIHsKLSAgICBpbnQgb3JkZXIgPSBWTS5jb2xsZWN0aW9uLnJlbmRlenZvdXMoMTAwMSk7Ci0gICAgZmluYWwgYm9vbGVhbiBwcmltYXJ5ID0gb3JkZXIgPT0gMTsKLQotICAgIGJvb2xlYW4gbG9nID0gT3B0aW9ucy52ZXJib3NlLmdldFZhbHVlKCkgPj0gNjsKLSAgICBib29sZWFuIGxvZ0RldGFpbHMgPSBPcHRpb25zLnZlcmJvc2UuZ2V0VmFsdWUoKSA+PSA3OwotCi0gICAgaWYgKHByaW1hcnkgJiYgcmVzdW1lKSB7Ci0gICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCghUGhhc2UuaXNQaGFzZVN0YWNrRW1wdHkoKSk7Ci0gICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCghUGxhbi5nY0luUHJvZ3Jlc3MoKSk7Ci0gICAgICBQbGFuLnNldEdDU3RhdHVzKFBsYW4uR0NfUFJPUEVSKTsKLSAgICB9Ci0KLSAgICAvKiBJbiBvcmRlciB0byByZWR1Y2UgdGhlIG5lZWQgZm9yIHN5bmNocm9uaXphdGlvbiwgd2Uga2VlcCBhbiBvZGQgb3IgZXZlbgotICAgICAqIGNvdW50ZXIgZm9yIHRoZSBudW1iZXIgb2YgcGhhc2VzIHByb2Nlc3NlZC4gQXMgZWFjaCBwaGFzZSBoYXMgYSBzaW5nbGUKLSAgICAgKiByZW5kZXp2b3VzIGl0IGlzIG9ubHkgcG9zc2libGUgdG8gYmUgb3V0IGJ5IG9uZSBzbyB0aGUgb2RkIG9yIGV2ZW4gY291bnRlcgotICAgICAqIHByb3RlY3RzIHVzLiAqLwotICAgIGJvb2xlYW4gaXNFdmVuUGhhc2UgPSB0cnVlOwotCi0gICAgaWYgKHByaW1hcnkpIHsKLSAgICAgIC8qIEZpcnN0IHBoYXNlIHdpbGwgYmUgZXZlbiwgc28gd2Ugc2F5IHdlIGFyZSBvZGQgaGVyZSBzbyB0aGF0IHRoZSBuZXh0IHBoYXNlIHNldCBpcyBldmVuKi8KLSAgICAgIHNldE5leHRQaGFzZShmYWxzZSwgZ2V0TmV4dFBoYXNlKCksIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKiBNYWtlIHN1cmUgZXZlcnlvbmUgc2VlcyB0aGUgZmlyc3QgcGhhc2UgKi8KLSAgICBWTS5jb2xsZWN0aW9uLnJlbmRlenZvdXMoMTAwMik7Ci0KLSAgICAvKiBHbG9iYWwgYW5kIENvbGxlY3RvciBpbnN0YW5jZXMgdXNlZCBpbiBwaGFzZXMgKi8KLSAgICBQbGFuIHBsYW4gPSBWTS5hY3RpdmVQbGFuLmdsb2JhbCgpOwotICAgIENvbGxlY3RvckNvbnRleHQgY29sbGVjdG9yID0gVk0uYWN0aXZlUGxhbi5jb2xsZWN0b3IoKTsKLQotICAgIC8qIFRoZSBtYWluIHBoYXNlIGV4ZWN1dGlvbiBsb29wICovCi0gICAgaW50IHNjaGVkdWxlZFBoYXNlOwotICAgIHdoaWxlKChzY2hlZHVsZWRQaGFzZSA9IGdldEN1cnJlbnRQaGFzZShpc0V2ZW5QaGFzZSkpID4gMCkgewotICAgICAgc2hvcnQgc2NoZWR1bGUgPSBnZXRTY2hlZHVsZShzY2hlZHVsZWRQaGFzZSk7Ci0gICAgICBzaG9ydCBwaGFzZUlkID0gZ2V0UGhhc2VJZChzY2hlZHVsZWRQaGFzZSk7Ci0gICAgICBQaGFzZSBwID0gZ2V0UGhhc2UocGhhc2VJZCk7Ci0KLSAgICAgIC8qIFN0YXJ0IHRoZSB0aW1lcihzKSAqLwotICAgICAgaWYgKHByaW1hcnkpIHsKLSAgICAgICAgaWYgKHJlc3VtZSkgewotICAgICAgICAgIHJlc3VtZUNvbXBsZXhUaW1lcnMoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocC50aW1lciAhPSBudWxsKSBwLnRpbWVyLnN0YXJ0KCk7Ci0gICAgICAgIGlmIChzdGFydENvbXBsZXhUaW1lciA+IDApIHsKLSAgICAgICAgICBQaGFzZS5nZXRQaGFzZShzdGFydENvbXBsZXhUaW1lcikudGltZXIuc3RhcnQoKTsKLSAgICAgICAgICBzdGFydENvbXBsZXhUaW1lciA9IDA7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKGxvZykgewotICAgICAgICBMb2cud3JpdGUoIkV4ZWN1dGUgIik7Ci0gICAgICAgIHAubG9nUGhhc2UoKTsKLSAgICAgIH0KLQotICAgICAgLyogRXhlY3V0ZSBhIHNpbmdsZSBzaW1wbGUgc2NoZWR1bGVkIHBoYXNlICovCi0gICAgICBzd2l0Y2ggKHNjaGVkdWxlKSB7Ci0gICAgICAgIC8qIEdsb2JhbCBwaGFzZSAqLwotICAgICAgICBjYXNlIFNDSEVEVUxFX0dMT0JBTDogewotICAgICAgICAgIGlmIChsb2dEZXRhaWxzKSBMb2cud3JpdGVsbigiIGFzIEdsb2JhbC4uLiIpOwotICAgICAgICAgIGlmIChwcmltYXJ5KSB7Ci0gICAgICAgICAgICBpZiAoVk0uREVCVUcpIFZNLmRlYnVnZ2luZy5nbG9iYWxQaGFzZShwaGFzZUlkLHRydWUpOwotICAgICAgICAgICAgcGxhbi5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCk7Ci0gICAgICAgICAgICBpZiAoVk0uREVCVUcpIFZNLmRlYnVnZ2luZy5nbG9iYWxQaGFzZShwaGFzZUlkLGZhbHNlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDb2xsZWN0b3IgcGhhc2UgKi8KLSAgICAgICAgY2FzZSBTQ0hFRFVMRV9DT0xMRUNUT1I6IHsKLSAgICAgICAgICBpZiAobG9nRGV0YWlscykgTG9nLndyaXRlbG4oIiBhcyBDb2xsZWN0b3IuLi4iKTsKLSAgICAgICAgICBpZiAoVk0uREVCVUcpIFZNLmRlYnVnZ2luZy5jb2xsZWN0b3JQaGFzZShwaGFzZUlkLG9yZGVyLHRydWUpOwotICAgICAgICAgIGNvbGxlY3Rvci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gICAgICAgICAgaWYgKFZNLkRFQlVHKSBWTS5kZWJ1Z2dpbmcuY29sbGVjdG9yUGhhc2UocGhhc2VJZCxvcmRlcixmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBNdXRhdG9yIHBoYXNlICovCi0gICAgICAgIGNhc2UgU0NIRURVTEVfTVVUQVRPUjogewotICAgICAgICAgIGlmIChsb2dEZXRhaWxzKSBMb2cud3JpdGVsbigiIGFzIE11dGF0b3IuLi4iKTsKLSAgICAgICAgICAvKiBJdGVyYXRlIHRocm91Z2ggYWxsIG11dGF0b3IgY29udGV4dHMgKi8KLSAgICAgICAgICBNdXRhdG9yQ29udGV4dCBtdXRhdG9yOwotICAgICAgICAgIHdoaWxlICgobXV0YXRvciA9IFZNLmFjdGl2ZVBsYW4uZ2V0TmV4dE11dGF0b3IoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKFZNLkRFQlVHKSBWTS5kZWJ1Z2dpbmcubXV0YXRvclBoYXNlKHBoYXNlSWQsbXV0YXRvci5nZXRJZCgpLHRydWUpOwotICAgICAgICAgICAgbXV0YXRvci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gICAgICAgICAgICBpZiAoVk0uREVCVUcpIFZNLmRlYnVnZ2luZy5tdXRhdG9yUGhhc2UocGhhc2VJZCxtdXRhdG9yLmdldElkKCksZmFsc2UpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAvKiBnZXROZXh0UGhhc2UgaGFzIGRvbmUgdGhlIHdyb25nIHRoaW5nICovCi0gICAgICAgICAgVk0uYXNzZXJ0aW9ucy5mYWlsKCJJbnZhbGlkIHNjaGVkdWxlIGluIFBoYXNlLnByb2Nlc3NQaGFzZVN0YWNrIik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHByaW1hcnkpIHsKLSAgICAgICAgLyogU2V0IHRoZSBuZXh0IHBoYXNlIGJ5IHByb2Nlc3NpbmcgdGhlIHN0YWNrICovCi0gICAgICAgIGludCBuZXh0ID0gZ2V0TmV4dFBoYXNlKCk7Ci0gICAgICAgIGJvb2xlYW4gbmVlZHNSZXNldFJlbmRlenZvdXMgPSAobmV4dCA+IDApICYmIChzY2hlZHVsZSA9PSBTQ0hFRFVMRV9NVVRBVE9SICYmIGdldFNjaGVkdWxlKG5leHQpID09IFNDSEVEVUxFX01VVEFUT1IpOwotICAgICAgICBzZXROZXh0UGhhc2UoaXNFdmVuUGhhc2UsIG5leHQsIG5lZWRzUmVzZXRSZW5kZXp2b3VzKTsKLSAgICAgIH0KLQotICAgICAgLyogU3luYyBwb2ludCBhZnRlciBleGVjdXRpb24gb2YgYSBwaGFzZSAqLwotICAgICAgVk0uY29sbGVjdGlvbi5yZW5kZXp2b3VzKDEwMDQpOwotCi0gICAgICAvKiBNdXRhdG9yIHBoYXNlIHJlc2V0ICovCi0gICAgICBpZiAocHJpbWFyeSAmJiBzY2hlZHVsZSA9PSBTQ0hFRFVMRV9NVVRBVE9SKSB7Ci0gICAgICAgIFZNLmFjdGl2ZVBsYW4ucmVzZXRNdXRhdG9ySXRlcmF0b3IoKTsKLSAgICAgIH0KLQotICAgICAgLyogQXQgdGhpcyBwb2ludCwgaW4gdGhlIGNhc2Ugb2YgY29uc2VjdXRpdmUgcGhhc2VzIHdpdGggbXV0YXRvcgotICAgICAgICogc2NoZWR1bGluZywgd2UgaGF2ZSB0byBkb3VibGUtc3luY2hyb25pemUgdG8gZW5zdXJlIGFsbAotICAgICAgICogY29sbGVjdG9yIHRocmVhZHMgc2VlIHRoZSByZXNldCBtdXRhdG9yIGNvdW50ZXIuICovCi0gICAgICBpZiAobmVlZHNNdXRhdG9yUmVzZXRSZW5kZXp2b3VzKGlzRXZlblBoYXNlKSkgewotICAgICAgICBWTS5jb2xsZWN0aW9uLnJlbmRlenZvdXMoMTAwNSk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIFN0b3AgdGhlIHRpbWVyKHMpICovCi0gICAgICBpZiAocHJpbWFyeSkgewotICAgICAgICBpZiAocC50aW1lciAhPSBudWxsKSBwLnRpbWVyLnN0b3AoKTsKLSAgICAgICAgaWYgKHN0b3BDb21wbGV4VGltZXIgPiAwKSB7Ci0gICAgICAgICAgUGhhc2UuZ2V0UGhhc2Uoc3RvcENvbXBsZXhUaW1lcikudGltZXIuc3RvcCgpOwotICAgICAgICAgIHN0b3BDb21wbGV4VGltZXIgPSAwOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIEZsaXAgdGhlIGV2ZW4gLyBvZGQgcGhhc2Ugc2Vuc2UgKi8KLSAgICAgIGlzRXZlblBoYXNlID0gIWlzRXZlblBoYXNlOwotICAgICAgcmVzdW1lID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogUGhhc2Ugc3RhY2sgZXhoYXVzdGVkIHNvIHdlIHJldHVybiB0cnVlICovCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBuZXh0IHBoYXNlLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldEN1cnJlbnRQaGFzZShib29sZWFuIGlzRXZlblBoYXNlKSB7Ci0gICAgcmV0dXJuIGlzRXZlblBoYXNlID8gZXZlblNjaGVkdWxlZFBoYXNlIDogb2RkU2NoZWR1bGVkUGhhc2U7Ci0gIH0KLQotICAvKioKLSAgICogRG8gd2UgbmVlZCBhIG11dGF0b3IgcmVzZXQgcmVuZGV6dm91cyBpbiB0aGlzIHBoYXNlPwotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBuZWVkc011dGF0b3JSZXNldFJlbmRlenZvdXMoYm9vbGVhbiBpc0V2ZW5QaGFzZSkgewotICAgIHJldHVybiBpc0V2ZW5QaGFzZSA/IGV2ZW5NdXRhdG9yUmVzZXRSZW5kZXp2b3VzIDogb2RkTXV0YXRvclJlc2V0UmVuZGV6dm91czsKLSAgfQotICAvKioKLSAgICogU2V0IHRoZSBuZXh0IHBoYXNlLiBJZiB3ZSBhcmUgaW4gYW4gZXZlbiBwaGFzZSB0aGUgbmV4dCBwaGFzZSBpcyBvZGQuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldE5leHRQaGFzZShib29sZWFuIGlzRXZlblBoYXNlLCBpbnQgc2NoZWR1bGVkUGhhc2UsIGJvb2xlYW4gbmVlZHNSZXNldFJlbmRlenZvdXMpIHsKLSAgICBpZiAoaXNFdmVuUGhhc2UpIHsKLSAgICAgIG9kZFNjaGVkdWxlZFBoYXNlID0gc2NoZWR1bGVkUGhhc2U7Ci0gICAgICBldmVuTXV0YXRvclJlc2V0UmVuZGV6dm91cyA9IG5lZWRzUmVzZXRSZW5kZXp2b3VzOwotICAgIH0gZWxzZSB7Ci0gICAgICBldmVuU2NoZWR1bGVkUGhhc2UgPSBzY2hlZHVsZWRQaGFzZTsKLSAgICAgIG9kZE11dGF0b3JSZXNldFJlbmRlenZvdXMgPSBuZWVkc1Jlc2V0UmVuZGV6dm91czsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUHVsbCB0aGUgbmV4dCBzY2hlZHVsZWQgcGhhc2Ugb2ZmIHRoZSBzdGFjay4gVGhpcyBtYXkgaW52b2x2ZQotICAgKiBwcm9jZXNzaW5nIHNldmVyYWwgY29tcGxleCBwaGFzZXMgYW5kIHNraXBwaW5nIHBsYWNlaG9sZGVycywgZXRjLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBuZXh0IHBoYXNlIHRvIHJ1biwgb3IgLTEgaWYgbm8gcGhhc2VzIGFyZSBsZWZ0LgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldE5leHRQaGFzZSgpIHsKLSAgICBib29sZWFuIGFsbG93Q29uY3VycmVudFBoYXNlID0gUGxhbi5jb2xsZWN0aW9uVHJpZ2dlciA9PSBDb2xsZWN0aW9uLklOVEVSTkFMX1BIQVNFX0dDX1RSSUdHRVI7Ci0KLSAgICB3aGlsZSAocGhhc2VTdGFja1BvaW50ZXIgPj0gMCkgewotICAgICAgaW50IHNjaGVkdWxlZFBoYXNlID0gcGVla1NjaGVkdWxlZFBoYXNlKCk7Ci0gICAgICBzaG9ydCBzY2hlZHVsZSA9IGdldFNjaGVkdWxlKHNjaGVkdWxlZFBoYXNlKTsKLSAgICAgIHNob3J0IHBoYXNlSWQgPSBnZXRQaGFzZUlkKHNjaGVkdWxlZFBoYXNlKTsKLQotICAgICAgc3dpdGNoKHNjaGVkdWxlKSB7Ci0gICAgICAgIGNhc2UgU0NIRURVTEVfUExBQ0VIT0xERVI6IHsKLSAgICAgICAgICAvKiBQbGFjZWhvbGRlcnMgYXJlIGlnbm9yZWQgYW5kIHdlIGNvbnRpbnVlIGxvb2tpbmcgKi8KLSAgICAgICAgICBwb3BTY2hlZHVsZWRQaGFzZSgpOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBTQ0hFRFVMRV9HTE9CQUw6Ci0gICAgICAgIGNhc2UgU0NIRURVTEVfQ09MTEVDVE9SOgotICAgICAgICBjYXNlIFNDSEVEVUxFX01VVEFUT1I6IHsKLSAgICAgICAgICAvKiBTaW1wbGUgcGhhc2VzIGFyZSBqdXN0IHBvcHBlZCBvZmYgdGhlIHN0YWNrIGFuZCBleGVjdXRlZCAqLwotICAgICAgICAgIHBvcFNjaGVkdWxlZFBoYXNlKCk7Ci0gICAgICAgICAgcmV0dXJuIHNjaGVkdWxlZFBoYXNlOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBTQ0hFRFVMRV9DT01QTEVYOiB7Ci0gICAgICAgICAgLyogQSBjb21wbGV4IHBoYXNlIG1heSBlaXRoZXIgYmUgYSBuZXdseSBwdXNoZWQgY29tcGxleCBwaGFzZSwKLSAgICAgICAgICAgKiBvciBhIGNvbXBsZXggcGhhc2Ugd2UgYXJlIGluIHRoZSBwcm9jZXNzIG9mIGV4ZWN1dGluZyBpbgotICAgICAgICAgICAqIHdoaWNoIGNhc2Ugd2UgbW92ZSB0byB0aGUgbmV4dCBzdWJwaGFzZS4gKi8KLSAgICAgICAgICBDb21wbGV4UGhhc2UgcCA9IChDb21wbGV4UGhhc2UpZ2V0UGhhc2UocGhhc2VJZCk7Ci0gICAgICAgICAgaW50IGN1cnNvciA9IGluY3JlbWVudENvbXBsZXhQaGFzZUN1cnNvcigpOwotICAgICAgICAgIGlmIChjdXJzb3IgPT0gMCAmJiBwLnRpbWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8qIFRlbGwgdGhlIHByaW1hcnkgdGhyZWFkIHRvIHN0YXJ0IHRoZSB0aW1lciBhZnRlciB0aGUgbmV4dCBzeW5jLiAqLwotICAgICAgICAgICAgc3RhcnRDb21wbGV4VGltZXIgPSBwaGFzZUlkOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoY3Vyc29yIDwgcC5jb3VudCgpKSB7Ci0gICAgICAgICAgICAvKiBUaGVyZSBhcmUgbW9yZSBlbnRyaWVzLCB3ZSBwdXNoIHRoZSBuZXh0IG9uZSBhbmQgY29udGludWUgKi8KLSAgICAgICAgICAgIHB1c2hTY2hlZHVsZWRQaGFzZShwLmdldChjdXJzb3IpKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIFdlIGhhdmUgZmluaXNoZWQgdGhpcyBjb21wbGV4IHBoYXNlICovCi0gICAgICAgICAgcG9wU2NoZWR1bGVkUGhhc2UoKTsKLSAgICAgICAgICBpZiAocC50aW1lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvKiBUZWxsIHRoZSBwcmltYXJ5IHRocmVhZCB0byBzdG9wIHRoZSB0aW1lciBhZnRlciB0aGUgbmV4dCBzeW5jLiAqLwotICAgICAgICAgICAgc3RvcENvbXBsZXhUaW1lciA9IHBoYXNlSWQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgIFZNLmFzc2VydGlvbnMuZmFpbCgiSW52YWxpZCBwaGFzZSB0eXBlIGVuY291bnRlcmVkIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLyoqCi0gICAqIFBhdXNlIGFsbCBvZiB0aGUgdGltZXJzIGZvciB0aGUgY29tcGxleCBwaGFzZXMgc2l0dGluZyBpbiB0aGUgc3RhY2suCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyB2b2lkIHBhdXNlQ29tcGxleFRpbWVycygpIHsKLSAgICBmb3IoaW50IGk9cGhhc2VTdGFja1BvaW50ZXI7IGkgPj0wOyBpLS0pIHsKLSAgICAgIFBoYXNlIHAgPSBnZXRQaGFzZShnZXRQaGFzZUlkKHBoYXNlU3RhY2tbaV0pKTsKLSAgICAgIGlmIChwLnRpbWVyICE9IG51bGwpIHAudGltZXIuc3RvcCgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXN1bWUgYWxsIG9mIHRoZSB0aW1lcnMgZm9yIHRoZSBjb21wbGV4IHBoYXNlcyBzaXR0aW5nIGluIHRoZSBzdGFjay4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgcmVzdW1lQ29tcGxleFRpbWVycygpIHsKLSAgICBmb3IoaW50IGk9cGhhc2VTdGFja1BvaW50ZXI7IGkgPj0wOyBpLS0pIHsKLSAgICAgIFBoYXNlIHAgPSBnZXRQaGFzZShnZXRQaGFzZUlkKHBoYXNlU3RhY2tbaV0pKTsKLSAgICAgIGlmIChwLnRpbWVyICE9IG51bGwpIHAudGltZXIuc3RhcnQoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRydWUgaWYgcGhhc2Ugc3RhY2sgaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4KLSAgICoKLSAgICogQHJldHVybiB0cnVlIGlmIHBoYXNlIHN0YWNrIGlzIGVtcHR5LCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BoYXNlU3RhY2tFbXB0eSgpIHsKLSAgICByZXR1cm4gcGhhc2VTdGFja1BvaW50ZXIgPCAwOwotICB9Ci0KLSAgLyoqCi0gICAqIENsZWFycyB0aGUgc2NoZWR1bGVkIHBoYXNlIHN0YWNrLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRQaGFzZVN0YWNrKCkgewotICAgIHBoYXNlU3RhY2tQb2ludGVyID0gLTE7Ci0gIH0KLQotICAvKioKLSAgICogUHVzaCBhIHNjaGVkdWxlZCBwaGFzZSBvbnRvIHRoZSB0b3Agb2YgdGhlIHdvcmsgc3RhY2suCi0gICAqCi0gICAqIEBwYXJhbSBzY2hlZHVsZWRQaGFzZSBUaGUgc2NoZWR1bGVkIHBoYXNlLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIHZvaWQgcHVzaFNjaGVkdWxlZFBoYXNlKGludCBzY2hlZHVsZWRQaGFzZSkgewotICAgIHBoYXNlU3RhY2tbKytwaGFzZVN0YWNrUG9pbnRlcl0gPSBzY2hlZHVsZWRQaGFzZTsKLSAgICBjb21wbGV4UGhhc2VDdXJzb3JbcGhhc2VTdGFja1BvaW50ZXJdID0gMDsKLSAgfQotCi0gIC8qKgotICAgKiBJbmNyZW1lbnQgdGhlIGN1cnNvciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgcGhhc2UKLSAgICogc3RhY2sgZW50cnkuIFRoaXMgaXMgdXNlZCB0byByZW1lbWJlciB0aGUgY3VycmVudCBzdWIgcGhhc2UKLSAgICogd2hlbiBleGVjdXRpbmcgYSBjb21wbGV4IHBoYXNlLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBvbGQgdmFsdWUgb2YgdGhlIGN1cnNvci4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSBzdGF0aWMgaW50IGluY3JlbWVudENvbXBsZXhQaGFzZUN1cnNvcigpIHsKLSAgICByZXR1cm4gY29tcGxleFBoYXNlQ3Vyc29yW3BoYXNlU3RhY2tQb2ludGVyXSsrOwotICB9Ci0KLSAgLyoqCi0gICAqIFBvcCBvZmYgdGhlIHNjaGVkdWxlZCBwaGFzZSBhdCB0aGUgdG9wIG9mIHRoZSB3b3JrIHN0YWNrLgotICAgKi8KLSAgQElubGluZQotICBwcml2YXRlIHN0YXRpYyBpbnQgcG9wU2NoZWR1bGVkUGhhc2UoKSB7Ci0gICAgcmV0dXJuIHBoYXNlU3RhY2tbcGhhc2VTdGFja1BvaW50ZXItLV07Ci0gIH0KLQotICAvKioKLSAgICogUGVlayB0aGUgc2NoZWR1bGVkIHBoYXNlIGF0IHRoZSB0b3Agb2YgdGhlIHdvcmsgc3RhY2suCi0gICAqLwotICBASW5saW5lCi0gIHByaXZhdGUgc3RhdGljIGludCBwZWVrU2NoZWR1bGVkUGhhc2UoKSB7Ci0gICAgcmV0dXJuIHBoYXNlU3RhY2tbcGhhc2VTdGFja1BvaW50ZXJdOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vUGxhbi5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL1BsYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVkNjQ0Yy4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vUGxhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTg0ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuOwotCi1pbXBvcnQgb3JnLm1tdGsucG9saWN5Lk1hcmtTd2VlcFNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuSW1tb3J0YWxTcGFjZTsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuUmF3UGFnZVNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5MYXJnZU9iamVjdFNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuYWxsb2MuTGluZWFyU2NhbjsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkNvbnN0YW50czsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkNvbnZlcnNpb25zOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuaGVhcC5IZWFwR3Jvd3RoTWFuYWdlcjsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmhlYXAuTWFwOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuaGVhcC5WTVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Mb2c7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5vcHRpb25zLio7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5zYW5pdHljaGVja2VyLlNhbml0eUNoZWNrZXI7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5zdGF0aXN0aWNzLlRpbWVyOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuc3RhdGlzdGljcy5TdGF0czsKLQotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotaW1wb3J0IG9yZy5tbXRrLnZtLkNvbGxlY3Rpb247Ci0KLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIGltcGxlbWVudHMgdGhlIGdsb2JhbCBjb3JlIGZ1bmN0aW9uYWxpdHkgZm9yIGFsbAotICogbWVtb3J5IG1hbmFnZW1lbnQgc2NoZW1lcy4gIEFsbCBnbG9iYWwgTU1UayBwbGFucyBzaG91bGQgaW5oZXJpdCBmcm9tCi0gKiB0aGlzIGNsYXNzLjxwPgotICoKLSAqIEFsbCBwbGFucyBtYWtlIGEgY2xlYXIgZGlzdGluY3Rpb24gYmV0d2VlbiA8aT5nbG9iYWw8L2k+IGFuZAotICogPGk+dGhyZWFkLWxvY2FsPC9pPiBhY3Rpdml0aWVzLCBhbmQgZGl2aWRlcyBnbG9iYWwgYW5kIGxvY2FsIHN0YXRlCi0gKiBpbnRvIHNlcGFyYXRlIGNsYXNzIGhpZXJhcmNoaWVzLiAgR2xvYmFsIGFjdGl2aXRpZXMgbXVzdCBiZQotICogc3luY2hyb25pemVkLCB3aGVyZWFzIG5vIHN5bmNocm9uaXphdGlvbiBpcyByZXF1aXJlZCBmb3IKLSAqIHRocmVhZC1sb2NhbCBhY3Rpdml0aWVzLiAgVGhlcmUgaXMgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgUGxhbiAob3IgdGhlCi0gKiBhcHByb3ByaWF0ZSBzdWItY2xhc3MpLCBhbmQgYSAxOjEgbWFwcGluZyBvZiBQbGFuTG9jYWwgdG8gImtlcm5lbAotICogdGhyZWFkcyIgKGFrYSBDUFVzKS4gIFRodXMgaW5zdGFuY2UKLSAqIG1ldGhvZHMgb2YgUGxhbkxvY2FsIGFsbG93IGZhc3QsIHVuc3luY2hyb25pemVkIGFjY2VzcyB0byBmdW5jdGlvbnMgc3VjaCBhcwotICogYWxsb2NhdGlvbiBhbmQgY29sbGVjdGlvbi4KLSAqCi0gKiBUaGUgZ2xvYmFsIGluc3RhbmNlIGRlZmluZXMgYW5kIG1hbmFnZXMgc3RhdGljIHJlc291cmNlcwotICogKHN1Y2ggYXMgbWVtb3J5IGFuZCB2aXJ0dWFsIG1lbW9yeSByZXNvdXJjZXMpLiAgVGhpcyBtYXBwaW5nIG9mIHRocmVhZHMgdG8KLSAqIGluc3RhbmNlcyBpcyBjcnVjaWFsIHRvIHVuZGVyc3RhbmRpbmcgdGhlIGNvcnJlY3RuZXNzIGFuZAotICogcGVyZm9ybWFuY2UgcHJvcGVydGllcyBvZiBNTVRrIHBsYW5zLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGxhbiBpbXBsZW1lbnRzIENvbnN0YW50cyB7Ci0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIENvbnN0YW50cwotICAgKi8KLQotICAvKiBHQyBTdGF0ZSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RfSU5fR0MgPSAwOyAvLyB0aGlzIG11c3QgYmUgemVybyBmb3IgQyBjb2RlCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdDX1BSRVBBUkUgPSAxOyAvLyBiZWZvcmUgc2V0dXAgYW5kIG9idGFpbmluZyByb290Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdDX1BST1BFUiA9IDI7Ci0KLSAgLyogUG9sbGluZyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1BPTExfRlJFUVVFTkNZID0gKDEyOCA8PCAxMCkgPj4gTE9HX0JZVEVTX0lOX1BBR0U7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEFfREFUQV9QT0xMX0ZSRVFVRU5DWSA9IERFRkFVTFRfUE9MTF9GUkVRVUVOQ1k7Ci0KLSAgLyogU3BhY2UgU2l6ZSBDb25zdGFudHMuICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBVU0VfQ09ERV9TUEFDRSA9IHRydWU7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgUExPU19GUkFDID0gMC4wN2Y7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhFQVBfRlVMTF9NSU5JTVVNID0gKDEgPDwgMTcpID4+IExPR19CWVRFU19JTl9QQUdFOyAvLyAxMjhLCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhFQVBfRlVMTF9QRVJDRU5UQUdFID0gMjsKLQotICAvKiBBbGxvY2F0b3IgQ29uc3RhbnRzICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMTE9DX0RFRkFVTFQgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExPQ19OT05fUkVGRVJFTkNFID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxMT0NfTk9OX01PVklORyA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMTE9DX0lNTU9SVEFMID0gMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxMT0NfTE9TID0gNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxMT0NfUFJJTUlUSVZFX0xPUyA9IDU7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMTE9DX0dDU1BZID0gNjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxMT0NfQ09ERSA9IDc7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMTE9DX0xBUkdFX0NPREUgPSA4OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExPQ19IT1RfQ09ERSA9IFVTRV9DT0RFX1NQQUNFID8gQUxMT0NfQ09ERSA6IEFMTE9DX0RFRkFVTFQ7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMTE9DX0NPTERfQ09ERSA9IFVTRV9DT0RFX1NQQUNFID8gQUxMT0NfQ09ERSA6IEFMTE9DX0RFRkFVTFQ7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMTE9DX1NUQUNLID0gQUxMT0NfTE9TOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExPQ0FUT1JTID0gOTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9TSVRFID0gLTE7Ci0KLSAgLyogTWlzY2VsbGFuZW91cyBDb25zdGFudHMgKi8KLS8vICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT1NfU0laRV9USFJFU0hPTEQgPSBTZWdyZWdhdGVkRnJlZUxpc3RTcGFjZS5NQVhfQ0VMTF9TSVpFOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT05fUEFSVElDSVBBTlQgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gR0FUSEVSX1dSSVRFX0JBUlJJRVJfU1RBVFMgPSBmYWxzZTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NSU5fTlVSU0VSWSA9ICgyNTYgKiAxMDI0KSA+PiBMT0dfQllURVNfSU5fUEFHRTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NQVhfTlVSU0VSWSA9ICgzMiA8PCAyMCkgPj4gTE9HX0JZVEVTX0lOX1BBR0U7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBTQ0FOX0JPT1RfSU1BR0UgPSB0cnVlOyAgLy8gc2NhbiBpdCBmb3Igcm9vdHMgcmF0aGVyIHRoYW4gdHJhY2UgaXQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NPTExFQ1RJT05fQVRURU1QVFMgPSAxMDsKLSAvLyBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVRVUlSRVNfTE9TID0gVk0uYWN0aXZlUGxhbi5jb25zdHJhaW50cygpLnJlcXVpcmVzTE9TKCk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9OT05fTE9TX0RFRkFVTFRfQUxMT0NfQllURVMgPSBWTS5hY3RpdmVQbGFuLmNvbnN0cmFpbnRzKCkubWF4Tm9uTE9TRGVmYXVsdEFsbG9jQnl0ZXMoKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX05PTl9MT1NfTk9OTU9WSU5HX0FMTE9DX0JZVEVTID0gVk0uYWN0aXZlUGxhbi5jb25zdHJhaW50cygpLm1heE5vbkxPU05vbk1vdmluZ0FsbG9jQnl0ZXMoKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX05PTl9MT1NfQ09QWV9CWVRFUyA9IFZNLmFjdGl2ZVBsYW4uY29uc3RyYWludHMoKS5tYXhOb25MT1NDb3B5Qnl0ZXMoKTsKLQotCi0vKiBEbyB3ZSBzdXBwb3J0IGEgbG9nIGJpdCBpbiB0aGUgb2JqZWN0IGhlYWRlcj8gIFNvbWUgd3JpdGUgYmFycmllcnMgbWF5IHVzZSBpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gTkVFRFNfTE9HX0JJVF9JTl9IRUFERVIgPSBWTS5hY3RpdmVQbGFuLmNvbnN0cmFpbnRzKCkubmVlZHNMb2dCaXRJbkhlYWRlcigpOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIENsYXNzIHZhcmlhYmxlcwotICAgKi8KLQotICAvKiogVGhlIHNwYWNlIHRoYXQgaG9sZHMgYW55IFZNIHNwZWNpZmljIG9iamVjdHMgKGUuZy4gYSBib290IGltYWdlKSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFNwYWNlIHZtU3BhY2UgPSBWTS5tZW1vcnkuZ2V0Vk1TcGFjZSgpOwotCi0gIC8qKiBBbnkgaW1tb3J0YWwgb2JqZWN0cyBhbGxvY2F0ZWQgYWZ0ZXIgYm9vdGluZyBhcmUgYWxsb2NhdGVkIGhlcmUuICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1tb3J0YWxTcGFjZSBpbW1vcnRhbFNwYWNlID0gbmV3IEltbW9ydGFsU3BhY2UoImltbW9ydGFsIiwgREVGQVVMVF9QT0xMX0ZSRVFVRU5DWSwgVk1SZXF1ZXN0LmNyZWF0ZSgpKTsKLQotICAvKiogQWxsIG1ldGEgZGF0YSB0aGF0IGlzIHVzZWQgYnkgTU1UayBpcyBhbGxvY2F0ZWQgKGFuZCBhY2NvdW50ZWQgZm9yKSBpbiB0aGUgbWV0YSBkYXRhIHNwYWNlLiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFJhd1BhZ2VTcGFjZSBtZXRhRGF0YVNwYWNlID0gbmV3IFJhd1BhZ2VTcGFjZSgibWV0YSIsIERFRkFVTFRfUE9MTF9GUkVRVUVOQ1ksIFZNUmVxdWVzdC5jcmVhdGUoKSk7Ci0KLSAgLyoqIExhcmdlIG9iamVjdHMgYXJlIGFsbG9jYXRlZCBpbnRvIGEgc3BlY2lhbCBsYXJnZSBvYmplY3Qgc3BhY2UuICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgTGFyZ2VPYmplY3RTcGFjZSBsb1NwYWNlID0gbmV3IExhcmdlT2JqZWN0U3BhY2UoImxvcyIsIERFRkFVTFRfUE9MTF9GUkVRVUVOQ1ksIFZNUmVxdWVzdC5jcmVhdGUoKSk7Ci0KLSAgLyoqIFNwYWNlIHVzZWQgYnkgdGhlIHNhbml0eSBjaGVja2VyICh1c2VkIGF0IHJ1bnRpbWUgb25seSBpZiBzYW5pdHkgY2hlY2tpbmcgZW5hYmxlZCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFJhd1BhZ2VTcGFjZSBzYW5pdHlTcGFjZSA9IG5ldyBSYXdQYWdlU3BhY2UoInNhbml0eSIsIEludGVnZXIuTUFYX1ZBTFVFLCBWTVJlcXVlc3QuY3JlYXRlKCkpOwotCi0gIC8qKiBTcGFjZSB1c2VkIHRvIGFsbG9jYXRlIG9iamVjdHMgdGhhdCBjYW5ub3QgYmUgbW92ZWQuIHdlIGRvIG5vdCBuZWVkIGEgbGFyZ2Ugc3BhY2UgYXMgdGhlIExPUyBpcyBub24tbW92aW5nLiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIE1hcmtTd2VlcFNwYWNlIG5vbk1vdmluZ1NwYWNlID0gbmV3IE1hcmtTd2VlcFNwYWNlKCJub24tbW92aW5nIiwgREVGQVVMVF9QT0xMX0ZSRVFVRU5DWSwgVk1SZXF1ZXN0LmNyZWF0ZSgpKTsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIE1hcmtTd2VlcFNwYWNlIHNtYWxsQ29kZVNwYWNlID0gVVNFX0NPREVfU1BBQ0UgPyBuZXcgTWFya1N3ZWVwU3BhY2UoInNtLWNvZGUiLCBERUZBVUxUX1BPTExfRlJFUVVFTkNZLCBWTVJlcXVlc3QuY3JlYXRlKCkpIDogbnVsbDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBMYXJnZU9iamVjdFNwYWNlIGxhcmdlQ29kZVNwYWNlID0gVVNFX0NPREVfU1BBQ0UgPyBuZXcgTGFyZ2VPYmplY3RTcGFjZSgibGctY29kZSIsIERFRkFVTFRfUE9MTF9GUkVRVUVOQ1ksIFZNUmVxdWVzdC5jcmVhdGUoKSkgOiBudWxsOwotCi0gIC8qIFNwYWNlIGRlc2NyaXB0b3JzICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElNTU9SVEFMID0gaW1tb3J0YWxTcGFjZS5nZXREZXNjcmlwdG9yKCk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZNX1NQQUNFID0gdm1TcGFjZS5nZXREZXNjcmlwdG9yKCk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEEgPSBtZXRhRGF0YVNwYWNlLmdldERlc2NyaXB0b3IoKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9TID0gbG9TcGFjZS5nZXREZXNjcmlwdG9yKCk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNBTklUWSA9IHNhbml0eVNwYWNlLmdldERlc2NyaXB0b3IoKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9OX01PVklORyA9IG5vbk1vdmluZ1NwYWNlLmdldERlc2NyaXB0b3IoKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU01BTExfQ09ERSA9IFVTRV9DT0RFX1NQQUNFID8gc21hbGxDb2RlU3BhY2UuZ2V0RGVzY3JpcHRvcigpIDogMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFSR0VfQ09ERSA9IFVTRV9DT0RFX1NQQUNFID8gbGFyZ2VDb2RlU3BhY2UuZ2V0RGVzY3JpcHRvcigpIDogMDsKLQotICAvKiogVGltZXIgdGhhdCBjb3VudHMgdG90YWwgdGltZSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFRpbWVyIHRvdGFsVGltZSA9IG5ldyBUaW1lcigidGltZSIpOwotCi0gIC8qKiBTdXBwb3J0IGZvciB0aW1lLWxpbWl0ZWQgR0NzICovCi0gIHByb3RlY3RlZCBzdGF0aWMgbG9uZyB0aW1lQ2FwOwotCi0gIC8qKiBTdXBwb3J0IGZvciBhbGxvY2F0aW9uLXNpdGUgaWRlbnRpZmljYXRpb24gKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBpbnQgYWxsb2NhdGlvblNpdGVDb3VudCA9IDA7Ci0KLSAgLyoqIEdsb2JhbCBzYW5pdHkgY2hlY2tpbmcgc3RhdGUgKiovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU2FuaXR5Q2hlY2tlciBzYW5pdHlDaGVja2VyID0gbmV3IFNhbml0eUNoZWNrZXIoKTsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBQbGFuKCkgewotICAgIC8qIENyZWF0ZSBiYXNlIG9wdGlvbiBpbnN0YW5jZXMgKi8KLSAgICBPcHRpb25zLnZlcmJvc2UgPSBuZXcgVmVyYm9zZSgpOwotICAgIE9wdGlvbnMudmVyYm9zZVRpbWluZyA9IG5ldyBWZXJib3NlVGltaW5nKCk7Ci0gICAgT3B0aW9ucy5zdHJlc3NGYWN0b3IgPSBuZXcgU3RyZXNzRmFjdG9yKCk7Ci0gICAgT3B0aW9ucy5ub0ZpbmFsaXplciA9IG5ldyBOb0ZpbmFsaXplcigpOwotICAgIE9wdGlvbnMubm9SZWZlcmVuY2VUeXBlcyA9IG5ldyBOb1JlZmVyZW5jZVR5cGVzKCk7Ci0gICAgT3B0aW9ucy5mdWxsSGVhcFN5c3RlbUdDID0gbmV3IEZ1bGxIZWFwU3lzdGVtR0MoKTsKLSAgICBPcHRpb25zLmhhcm5lc3NBbGwgPSBuZXcgSGFybmVzc0FsbCgpOwotICAgIE9wdGlvbnMuaWdub3JlU3lzdGVtR0MgPSBuZXcgSWdub3JlU3lzdGVtR0MoKTsKLSAgICBPcHRpb25zLm1ldGFEYXRhTGltaXQgPSBuZXcgTWV0YURhdGFMaW1pdCgpOwotICAgIE9wdGlvbnMubnVyc2VyeVNpemUgPSBuZXcgTnVyc2VyeVNpemUoKTsKLSAgICBPcHRpb25zLnZhcmlhYmxlU2l6ZUhlYXAgPSBuZXcgVmFyaWFibGVTaXplSGVhcCgpOwotICAgIE9wdGlvbnMuZWFnZXJNbWFwU3BhY2VzID0gbmV3IEVhZ2VyTW1hcFNwYWNlcygpOwotICAgIE9wdGlvbnMuc2FuaXR5Q2hlY2sgPSBuZXcgU2FuaXR5Q2hlY2soKTsKLSAgICBPcHRpb25zLmRlYnVnQWRkcmVzcyA9IG5ldyBEZWJ1Z0FkZHJlc3MoKTsKLSAgICBPcHRpb25zLnBlcmZFdmVudHMgPSBuZXcgUGVyZkV2ZW50cygpOwotICAgIE1hcC5maW5hbGl6ZVN0YXRpY1NwYWNlTWFwKCk7Ci0gICAgcmVnaXN0ZXJTcGVjaWFsaXplZE1ldGhvZHMoKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIEJvb3QuCi0gICAqLwotCi0gIC8qKgotICAgKiBUaGUgYm9vdCBtZXRob2QgaXMgY2FsbGVkIGVhcmx5IGluIHRoZSBib290IHByb2Nlc3MgYmVmb3JlIGFueQotICAgKiBhbGxvY2F0aW9uLgotICAgKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHVibGljIHZvaWQgYm9vdCgpIHsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgcG9zdEJvb3QgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgcnVudGltZSBpbW1lZGlhdGVseSBhZnRlcgotICAgKiBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGFyZSBhdmFpbGFibGUuICBOb3RlIHRoYXQgYWxsb2NhdGlvbiBtdXN0Ci0gICAqIGJlIHN1cHBvcnRlZCBwcmlvciB0byB0aGlzIHBvaW50IGJlY2F1c2UgdGhlIHJ1bnRpbWUKLSAgICogaW5mcmFzdHJ1Y3R1cmUgbWF5IHJlcXVpcmUgYWxsb2NhdGlvbiBpbiBvcmRlciB0byBwYXJzZSB0aGUKLSAgICogY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4gIEZvciB0aGlzIHJlYXNvbiBhbGwgcGxhbnMgc2hvdWxkIG9wZXJhdGUKLSAgICogZ3JhY2VmdWxseSBvbiB0aGUgZGVmYXVsdCBtaW5pbXVtIGhlYXAgc2l6ZSB1bnRpbCB0aGUgcG9pbnQgdGhhdAotICAgKiBib290IGlzIGNhbGxlZC4KLSAgICovCi0gIEBJbnRlcnJ1cHRpYmxlCi0gIHB1YmxpYyB2b2lkIHBvc3RCb290KCkgewotICAgIFZNLnN0YXRpc3RpY3MucGVyZkV2ZW50SW5pdChPcHRpb25zLnBlcmZFdmVudHMuZ2V0VmFsdWUoKSk7Ci0gICAgaWYgKE9wdGlvbnMudmVyYm9zZS5nZXRWYWx1ZSgpID4gMikgU3BhY2UucHJpbnRWTU1hcCgpOwotICAgIGlmIChPcHRpb25zLnZlcmJvc2UuZ2V0VmFsdWUoKSA+IDMpIFZNLmNvbmZpZy5wcmludENvbmZpZygpOwotICAgIGlmIChPcHRpb25zLnZlcmJvc2UuZ2V0VmFsdWUoKSA+IDApIFN0YXRzLnN0YXJ0QWxsKCk7Ci0gICAgaWYgKE9wdGlvbnMuZWFnZXJNbWFwU3BhY2VzLmdldFZhbHVlKCkpIFNwYWNlLmVhZ2VybHlNbWFwTU1Ua1NwYWNlcygpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBmdWxseUJvb3RlZCBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBydW50aW1lIGp1c3QgYmVmb3JlIG5vcm1hbAotICAgKiBleGVjdXRpb24gY29tbWVuY2VzLgotICAgKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHVibGljIHZvaWQgZnVsbHlCb290ZWQoKSB7Ci0gICAgaW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgIGlmIChPcHRpb25zLmhhcm5lc3NBbGwuZ2V0VmFsdWUoKSkgaGFybmVzc0JlZ2luKCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIFZNIGlzIGFib3V0IHRvIGV4aXQuIFBlcmZvcm0gYW55IGNsZWFuIHVwIG9wZXJhdGlvbnMuCi0gICAqCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgZXhpdCB2YWx1ZQotICAgKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHVibGljIHZvaWQgbm90aWZ5RXhpdChpbnQgdmFsdWUpIHsKLSAgICBpZiAoT3B0aW9ucy5oYXJuZXNzQWxsLmdldFZhbHVlKCkpIGhhcm5lc3NFbmQoKTsKLSAgICBpZiAoT3B0aW9ucy52ZXJib3NlLmdldFZhbHVlKCkgPT0gMSkgewotICAgICAgTG9nLndyaXRlKCJbRW5kICIpOwotICAgICAgdG90YWxUaW1lLnByaW50VG90YWxTZWNzKCk7Ci0gICAgICBMb2cud3JpdGVsbigiIHNdIik7Ci0gICAgfSBlbHNlIGlmIChPcHRpb25zLnZlcmJvc2UuZ2V0VmFsdWUoKSA9PSAyKSB7Ci0gICAgICBMb2cud3JpdGUoIltFbmQgIik7Ci0gICAgICB0b3RhbFRpbWUucHJpbnRUb3RhbE1pbGxpcygpOwotICAgICAgTG9nLndyaXRlbG4oIiBtc10iKTsKLSAgICB9Ci0gICAgaWYgKE9wdGlvbnMudmVyYm9zZVRpbWluZy5nZXRWYWx1ZSgpKSBwcmludERldGFpbGVkVGltaW5nKHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFueSBQbGFuIGNhbiBvdmVycmlkZSB0aGlzIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBwbGFuIHNwZWNpZmljCi0gICAqIHRpbWluZyBpbmZvcm1hdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIHRvdGFscyBQcmludCB0b3RhbHMKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHByaW50RGV0YWlsZWRUaW1pbmcoYm9vbGVhbiB0b3RhbHMpIHt9Ci0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYW55IHJlcXVpcmVkIHdyaXRlIGJhcnJpZXIgYWN0aW9uIHdoZW4gaW5zdGFsbGluZyBhbiBvYmplY3QgcmVmZXJlbmNlCi0gICAqIGEgYm9vdCB0aW1lLgotICAgKgotICAgKiBAcGFyYW0gcmVmZXJlbmNlIHRoZSByZWZlcmVuY2UgdmFsdWUgdGhhdCBpcyB0byBiZSBzdG9yZWQKLSAgICogQHJldHVybiBUaGUgcmF3IHZhbHVlIHRvIGJlCi0gICAqLwotICBwdWJsaWMgV29yZCBib290VGltZVdyaXRlQmFycmllcihXb3JkIHJlZmVyZW5jZSkgewotICAgIHJldHVybiByZWZlcmVuY2U7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBBbGxvY2F0aW9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBnZXRBbGxvY2F0aW9uU2l0ZShib29sZWFuIGNvbXBpbGVUaW1lKSB7Ci0gICAgaWYgKGNvbXBpbGVUaW1lKSAvLyBhIG5ldyBhbGxvY2F0aW9uIHNpdGUgaXMgYmVpbmcgY29tcGlsZWQKLSAgICAgIHJldHVybiBhbGxvY2F0aW9uU2l0ZUNvdW50Kys7Ci0gICAgZWxzZSAgICAgICAgICAgICAvLyBhbiBhbm9ueW1vdXMgc2l0ZQotICAgICAgcmV0dXJuIERFRkFVTFRfU0lURTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIENvbGxlY3Rpb24uCi0gICAqLwotCi0gIC8qKgotICAgKiBQZXJmb3JtIGEgKGdsb2JhbCkgY29sbGVjdGlvbiBwaGFzZS4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNvbGxlY3Rpb25QaGFzZShzaG9ydCBwaGFzZSk7Ci0KLSAgLyoqCi0gICAqIFJlcGxhY2UgYSBwaGFzZS4KLSAgICoKLSAgICogQHBhcmFtIG9sZFNjaGVkdWxlZFBoYXNlIFRoZSBzY2hlZHVsZWQgcGhhc2UgdG8gaW5zZXJ0IGFmdGVyCi0gICAqIEBwYXJhbSBzY2hlZHVsZWRQaGFzZSBUaGUgc2NoZWR1bGVkIHBoYXNlIHRvIGluc2VydAotICAgKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHVibGljIHZvaWQgcmVwbGFjZVBoYXNlKGludCBvbGRTY2hlZHVsZWRQaGFzZSwgaW50IHNjaGVkdWxlZFBoYXNlKSB7Ci0gICAgVk0uYXNzZXJ0aW9ucy5mYWlsKCJyZXBsYWNlUGhhc2Ugbm90IGltcGxlbWVudGVkIGZvciB0aGlzIHBsYW4iKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEluc2VydCBhIHBoYXNlLgotICAgKgotICAgKiBAcGFyYW0gbWFya2VyU2NoZWR1bGVkUGhhc2UgVGhlIHNjaGVkdWxlZCBwaGFzZSB0byBpbnNlcnQgYWZ0ZXIKLSAgICogQHBhcmFtIHNjaGVkdWxlZFBoYXNlIFRoZSBzY2hlZHVsZWQgcGhhc2UgdG8gaW5zZXJ0Ci0gICAqLwotICBASW50ZXJydXB0aWJsZQotICBwdWJsaWMgdm9pZCBpbnNlcnRQaGFzZUFmdGVyKGludCBtYXJrZXJTY2hlZHVsZWRQaGFzZSwgaW50IHNjaGVkdWxlZFBoYXNlKSB7Ci0gICAgc2hvcnQgdGVtcFBoYXNlID0gUGhhc2UuY3JlYXRlQ29tcGxleCgiYXV0by1nZW4iLCBudWxsLCBtYXJrZXJTY2hlZHVsZWRQaGFzZSwgc2NoZWR1bGVkUGhhc2UpOwotICAgIHJlcGxhY2VQaGFzZShtYXJrZXJTY2hlZHVsZWRQaGFzZSwgUGhhc2Uuc2NoZWR1bGVDb21wbGV4KHRlbXBQaGFzZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gV2hldGhlciBsYXN0IEdDIHdhcyBhbiBleGhhdXN0aXZlIGF0dGVtcHQgdG8gY29sbGVjdCB0aGUgaGVhcC4gIEZvciBtYW55IGNvbGxlY3RvcnMgdGhpcyBpcyB0aGUgc2FtZSBhcyBhc2tpbmcgd2hldGhlciB0aGUgbGFzdCBHQyB3YXMgYSBmdWxsIGhlYXAgY29sbGVjdGlvbi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGxhc3RDb2xsZWN0aW9uV2FzRXhoYXVzdGl2ZSgpIHsKLSAgICByZXR1cm4gbGFzdENvbGxlY3Rpb25GdWxsSGVhcCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gV2hldGhlciBsYXN0IEdDIGlzIGEgZnVsbCBHQy4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGxhc3RDb2xsZWN0aW9uRnVsbEhlYXAoKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBJcyBsYXN0IEdDIGEgZnVsbCBjb2xsZWN0aW9uPwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW1lcmdlbmN5Q29sbGVjdGlvbigpIHsKLSAgICByZXR1cm4gZW1lcmdlbmN5Q29sbGVjdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFRydWUgaWYgd2UgaGF2ZSBydW4gb3V0IG9mIGhlYXAgc3BhY2UuCi0gICAqLwotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBsYXN0Q29sbGVjdGlvbkZhaWxlZCgpIHsKLSAgICByZXR1cm4gIShjb2xsZWN0aW9uVHJpZ2dlciA9PSBDb2xsZWN0aW9uLkVYVEVSTkFMX0dDX1RSSUdHRVIgfHwKLSAgICAgICAgICAgICBjb2xsZWN0aW9uVHJpZ2dlciA9PSBDb2xsZWN0aW9uLklOVEVSTkFMX1BIQVNFX0dDX1RSSUdHRVIpICYmCi0gICAgICAoZ2V0UGFnZXNBdmFpbCgpIDwgZ2V0SGVhcEZ1bGxUaHJlc2hvbGQoKSB8fCBnZXRQYWdlc0F2YWlsKCkgPCByZXF1aXJlZEF0U3RhcnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZvcmNlIHRoZSBuZXh0IGNvbGxlY3Rpb24gdG8gYmUgZnVsbCBoZWFwLgotICAgKi8KLSAgcHVibGljIHZvaWQgZm9yY2VGdWxsSGVhcENvbGxlY3Rpb24oKSB7fQotCi0gIC8qKgotICAgKiBAcmV0dXJuIElzIGN1cnJlbnQgR0Mgb25seSBjb2xsZWN0aW5nIG9iamVjdHMgYWxsb2NhdGVkIHNpbmNlIGxhc3QgR0MuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0N1cnJlbnRHQ051cnNlcnkoKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJpdmF0ZSBsb25nIGxhc3RTdHJlc3NQYWdlcyA9IDA7Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgZXhwZWN0ZWQgcmVmZXJlbmNlIGNvdW50LiBGb3Igbm9uLXJlZmVyZW5jZSBjb3VudGluZwotICAgKiBjb2xsZWN0b3JzIHRoaXMgYmVjb21lcyBhIHRydWUvZmFsc2UgcmVsYXRpb25zaGlwLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2hlY2suCi0gICAqIEBwYXJhbSBzYW5pdHlSb290UkMgVGhlIG51bWJlciBvZiByb290IHJlZmVyZW5jZXMgdG8gdGhlIG9iamVjdC4KLSAgICogQHJldHVybiBUaGUgZXhwZWN0ZWQgKHJvb3QgZXhjbHVkZWQpIHJlZmVyZW5jZSBjb3VudC4KLSAgICovCi0gIHB1YmxpYyBpbnQgc2FuaXR5RXhwZWN0ZWRSQyhPYmplY3RSZWZlcmVuY2Ugb2JqZWN0LCBpbnQgc2FuaXR5Um9vdFJDKSB7Ci0gICAgU3BhY2Ugc3BhY2UgPSBTcGFjZS5nZXRTcGFjZUZvck9iamVjdChvYmplY3QpOwotICAgIHJldHVybiBzcGFjZS5pc1JlYWNoYWJsZShvYmplY3QpID8gU2FuaXR5Q2hlY2tlci5BTElWRSA6IFNhbml0eUNoZWNrZXIuREVBRDsKLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIGEgbGluZWFyIHNjYW4gb2YgYWxsIHNwYWNlcyB0byBjaGVjayBmb3IgcG9zc2libGUgbGVha3MuCi0gICAqIFRoaXMgaXMgb25seSBjYWxsZWQgYWZ0ZXIgYSBmdWxsLWhlYXAgR0MuCi0gICAqCi0gICAqIEBwYXJhbSBzY2FubmVyIFRoZSBzY2FubmVyIGNhbGxiYWNrIHRvIHVzZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNhbml0eUxpbmVhclNjYW4oTGluZWFyU2NhbiBzY2FubmVyKSB7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBUcnVlIGlzIGEgc3RyZXNzIHRlc3QgR0MgaXMgcmVxdWlyZWQKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3RyZXNzVGVzdEdDUmVxdWlyZWQoKSB7Ci0gICAgbG9uZyBwYWdlcyA9IFNwYWNlLmN1bXVsYXRpdmVDb21taXR0ZWRQYWdlcygpOwotICAgIGlmIChpbml0aWFsaXplZCAmJgotICAgICAgICAoKHBhZ2VzIF4gbGFzdFN0cmVzc1BhZ2VzKSA+IE9wdGlvbnMuc3RyZXNzRmFjdG9yLmdldFBhZ2VzKCkpKSB7Ci0gICAgICBsYXN0U3RyZXNzUGFnZXMgPSBwYWdlczsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogR0MgU3RhdGUKLSAgICovCi0KLSAgcHJvdGVjdGVkIHN0YXRpYyBpbnQgcmVxdWlyZWRBdFN0YXJ0OwotICBwcm90ZWN0ZWQgc3RhdGljIGludCBjb2xsZWN0aW9uVHJpZ2dlcjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGVtZXJnZW5jeUNvbGxlY3Rpb247Ci0gIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBhd2FpdGluZ0FzeW5jQ29sbGVjdGlvbjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHN0YWNrc1ByZXBhcmVkOwotCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb2xsZWN0aW9uVHJpZ2dlcmVkOwotICBARW50cnlwb2ludAotICBwcml2YXRlIHN0YXRpYyBpbnQgZ2NTdGF0dXMgPSBOT1RfSU5fR0M7IC8vIHNoYXJlZCB2YXJpYWJsZQotCi0gIC8qKiBAcmV0dXJuIElzIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzeXN0ZW0gaW5pdGlhbGl6ZWQ/ICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgewotICAgIHJldHVybiBpbml0aWFsaXplZDsKLSAgfQotCi0gIC8qKgotICAgKiBIYXMgY29sbGVjdGlvbiBoYXMgdHJpZ2dlcmVkPwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29sbGVjdGlvblRyaWdnZXJlZCgpIHsKLSAgICByZXR1cm4gY29sbGVjdGlvblRyaWdnZXJlZDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhhdCBhIGNvbGxlY3Rpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldENvbGxlY3Rpb25UcmlnZ2VyZWQoKSB7Ci0gICAgY29sbGVjdGlvblRyaWdnZXJlZCA9IHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogQSBjb2xsZWN0aW9uIGhhcyBmdWxseSBjb21wbGV0ZWQuICBDbGVhciB0aGUgdHJpZ2dlcmVkIGZsYWcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgY29sbGVjdGlvbkNvbXBsZXRlKCkgewotICAgIGNvbGxlY3Rpb25UcmlnZ2VyZWQgPSBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdHJ1ZSBpZiBzdGFja3MgaGF2ZSBiZWVuIHByZXBhcmVkIGluIHRoaXMgY29sbGVjdGlvbiBjeWNsZS4KLSAgICoKLSAgICogQHJldHVybiBUcnVlIGlmIHN0YWNrcyBoYXZlIGJlZW4gcHJlcGFyZWQgaW4gdGhpcyBjb2xsZWN0aW9uIGN5Y2xlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHN0YWNrc1ByZXBhcmVkKCkgewotICAgIHJldHVybiBzdGFja3NQcmVwYXJlZDsKLSAgfQotICAvKioKLSAgICogUmV0dXJuIHRydWUgaWYgYSBjb2xsZWN0aW9uIGlzIGluIHByb2dyZXNzLgotICAgKgotICAgKiBAcmV0dXJuIFRydWUgaWYgYSBjb2xsZWN0aW9uIGlzIGluIHByb2dyZXNzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGdjSW5Qcm9ncmVzcygpIHsKLSAgICByZXR1cm4gZ2NTdGF0dXMgIT0gTk9UX0lOX0dDOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0cnVlIGlmIGEgY29sbGVjdGlvbiBpcyBpbiBwcm9ncmVzcyBhbmQgcGFzdCB0aGUgcHJlcGFyYXRvcnkgc3RhZ2UuCi0gICAqCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiBhIGNvbGxlY3Rpb24gaXMgaW4gcHJvZ3Jlc3MgYW5kIHBhc3QgdGhlIHByZXBhcmF0b3J5IHN0YWdlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGdjSW5Qcm9ncmVzc1Byb3BlcigpIHsKLSAgICByZXR1cm4gZ2NTdGF0dXMgPT0gR0NfUFJPUEVSOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIEdDIHN0YXR1cy4KLSAgICoKLSAgICogQHBhcmFtIHMgVGhlIG5ldyBHQyBzdGF0dXMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0R0NTdGF0dXMoaW50IHMpIHsKLSAgICBpZiAoZ2NTdGF0dXMgPT0gTk9UX0lOX0dDKSB7Ci0gICAgICAvKiBGcm9tIE5PVF9JTl9HQyB0byBhbnkgcGhhc2UgKi8KLSAgICAgIHN0YWNrc1ByZXBhcmVkID0gZmFsc2U7Ci0gICAgICBpZiAoU3RhdHMuZ2F0aGVyaW5nU3RhdHMoKSkgewotICAgICAgICBTdGF0cy5zdGFydEdDKCk7Ci0gICAgICAgIFZNLmFjdGl2ZVBsYW4uZ2xvYmFsKCkucHJpbnRQcmVTdGF0cygpOwotICAgICAgfQotICAgIH0KLSAgICBWTS5tZW1vcnkuaXN5bmMoKTsKLSAgICBnY1N0YXR1cyA9IHM7Ci0gICAgVk0ubWVtb3J5LnN5bmMoKTsKLSAgICBpZiAoZ2NTdGF0dXMgPT0gTk9UX0lOX0dDKSB7Ci0gICAgICAvKiBGcm9tIGFueSBwaGFzZSB0byBOT1RfSU5fR0MgKi8KLSAgICAgIGlmIChTdGF0cy5nYXRoZXJpbmdTdGF0cygpKSB7Ci0gICAgICAgIFN0YXRzLmVuZEdDKCk7Ci0gICAgICAgIFZNLmFjdGl2ZVBsYW4uZ2xvYmFsKCkucHJpbnRQb3N0U3RhdHMoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnQgb3V0IHN0YXRpc3RpY3MgYXQgdGhlIHN0YXJ0IG9mIGEgR0MKLSAgICovCi0gIHB1YmxpYyB2b2lkIHByaW50UHJlU3RhdHMoKSB7Ci0gICAgaWYgKChPcHRpb25zLnZlcmJvc2UuZ2V0VmFsdWUoKSA9PSAxKSB8fAotICAgICAgICAoT3B0aW9ucy52ZXJib3NlLmdldFZhbHVlKCkgPT0gMikpIHsKLSAgICAgIExvZy53cml0ZSgiW0dDICIpOyBMb2cud3JpdGUoU3RhdHMuZ2NDb3VudCgpKTsKLSAgICAgIGlmIChPcHRpb25zLnZlcmJvc2UuZ2V0VmFsdWUoKSA9PSAxKSB7Ci0gICAgICAgIExvZy53cml0ZSgiIFN0YXJ0ICIpOwotICAgICAgICBQbGFuLnRvdGFsVGltZS5wcmludFRvdGFsU2VjcygpOwotICAgICAgICBMb2cud3JpdGUoIiBzIik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBMb2cud3JpdGUoIiBTdGFydCAiKTsKLSAgICAgICAgUGxhbi50b3RhbFRpbWUucHJpbnRUb3RhbE1pbGxpcygpOwotICAgICAgICBMb2cud3JpdGUoIiBtcyIpOwotICAgICAgfQotICAgICAgTG9nLndyaXRlKCIgICAiKTsKLSAgICAgIExvZy53cml0ZShDb252ZXJzaW9ucy5wYWdlc1RvS0J5dGVzKGdldFBhZ2VzVXNlZCgpKSk7Ci0gICAgICBMb2cud3JpdGUoIktCICIpOwotICAgICAgTG9nLmZsdXNoKCk7Ci0gICAgfQotICAgIGlmIChPcHRpb25zLnZlcmJvc2UuZ2V0VmFsdWUoKSA+IDIpIHsKLSAgICAgIExvZy53cml0ZSgiQ29sbGVjdGlvbiAiKTsgTG9nLndyaXRlKFN0YXRzLmdjQ291bnQoKSk7Ci0gICAgICBMb2cud3JpdGUoIjogICAgICAgICIpOwotICAgICAgcHJpbnRVc2VkUGFnZXMoKTsKLSAgICAgIExvZy53cml0ZSgiICBCZWZvcmUgQ29sbGVjdGlvbjogIik7Ci0gICAgICBTcGFjZS5wcmludFVzYWdlTUIoKTsKLSAgICAgIGlmIChPcHRpb25zLnZlcmJvc2UuZ2V0VmFsdWUoKSA+PSA0KSB7Ci0gICAgICAgIExvZy53cml0ZSgiICAgICAgICAgICAgICAgICAgICAgIik7Ci0gICAgICAgIFNwYWNlLnByaW50VXNhZ2VQYWdlcygpOwotICAgICAgfQotICAgICAgaWYgKE9wdGlvbnMudmVyYm9zZS5nZXRWYWx1ZSgpID49IDUpIHsKLSAgICAgICAgU3BhY2UucHJpbnRWTU1hcCgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQcmludCBvdXQgc3RhdGlzdGljcyBhdCB0aGUgZW5kIG9mIGEgR0MKLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHByaW50UG9zdFN0YXRzKCkgewotICAgIGlmICgoT3B0aW9ucy52ZXJib3NlLmdldFZhbHVlKCkgPT0gMSkgfHwKLSAgICAgICAgKE9wdGlvbnMudmVyYm9zZS5nZXRWYWx1ZSgpID09IDIpKSB7Ci0gICAgICBMb2cud3JpdGUoIi0+ICIpOwotICAgICAgTG9nLndyaXRlRGVjKENvbnZlcnNpb25zLnBhZ2VzVG9CeXRlcyhnZXRQYWdlc1VzZWQoKSkudG9Xb3JkKCkucnNobCgxMCkpOwotICAgICAgTG9nLndyaXRlKCJLQiAgICIpOwotICAgICAgaWYgKE9wdGlvbnMudmVyYm9zZS5nZXRWYWx1ZSgpID09IDEpIHsKLSAgICAgICAgdG90YWxUaW1lLnByaW50TGFzdCgpOwotICAgICAgICBMb2cud3JpdGVsbigiIG1zXSIpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgTG9nLndyaXRlKCJFbmQgIik7Ci0gICAgICAgIHRvdGFsVGltZS5wcmludFRvdGFsKCk7Ci0gICAgICAgIExvZy53cml0ZWxuKCIgbXNdIik7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChPcHRpb25zLnZlcmJvc2UuZ2V0VmFsdWUoKSA+IDIpIHsKLSAgICAgIExvZy53cml0ZSgiICAgQWZ0ZXIgQ29sbGVjdGlvbjogIik7Ci0gICAgICBTcGFjZS5wcmludFVzYWdlTUIoKTsKLSAgICAgIGlmIChPcHRpb25zLnZlcmJvc2UuZ2V0VmFsdWUoKSA+PSA0KSB7Ci0gICAgICAgIExvZy53cml0ZSgiICAgICAgICAgICAgICAgICAgICAgIik7Ci0gICAgICAgIFNwYWNlLnByaW50VXNhZ2VQYWdlcygpOwotICAgICAgfQotICAgICAgaWYgKE9wdGlvbnMudmVyYm9zZS5nZXRWYWx1ZSgpID49IDUpIHsKLSAgICAgICAgU3BhY2UucHJpbnRWTU1hcCgpOwotICAgICAgfQotICAgICAgTG9nLndyaXRlKCIgICAgICAgICAgICAgICAgICAgICAiKTsKLSAgICAgIHByaW50VXNlZFBhZ2VzKCk7Ci0gICAgICBMb2cud3JpdGUoIiAgICBDb2xsZWN0aW9uIHRpbWU6ICIpOwotICAgICAgdG90YWxUaW1lLnByaW50TGFzdCgpOwotICAgICAgTG9nLndyaXRlbG4oIiBtcyIpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHByaW50VXNlZFBhZ2VzKCkgewotICAgIExvZy53cml0ZSgicmVzZXJ2ZWQgPSAiKTsKLSAgICBMb2cud3JpdGUoQ29udmVyc2lvbnMucGFnZXNUb01CeXRlcyhnZXRQYWdlc1Jlc2VydmVkKCkpKTsKLSAgICBMb2cud3JpdGUoIiBNQiAoIik7Ci0gICAgTG9nLndyaXRlKGdldFBhZ2VzUmVzZXJ2ZWQoKSk7Ci0gICAgTG9nLndyaXRlKCIgcGdzKSIpOwotICAgIExvZy53cml0ZSgiICAgICAgdG90YWwgPSAiKTsKLSAgICBMb2cud3JpdGUoQ29udmVyc2lvbnMucGFnZXNUb01CeXRlcyhnZXRUb3RhbFBhZ2VzKCkpKTsKLSAgICBMb2cud3JpdGUoIiBNQiAoIik7Ci0gICAgTG9nLndyaXRlKGdldFRvdGFsUGFnZXMoKSk7Ci0gICAgTG9nLndyaXRlKCIgcGdzKSIpOwotICAgIExvZy53cml0ZWxuKCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBjb2xsZWN0aW9uIHRyaWdnZXIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29sbGVjdGlvblRyaWdnZXIoaW50IHRyaWdnZXIpIHsKLSAgICBjb2xsZWN0aW9uVHJpZ2dlciA9IHRyaWdnZXI7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBIYXJuZXNzCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaW5zaWRlSGFybmVzcyA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBHZW5lcmljIGhvb2sgdG8gYWxsb3cgYmVuY2htYXJrcyB0byBiZSBoYXJuZXNzZWQuICBBIHBsYW4gbWF5IHVzZQotICAgKiB0aGlzIHRvIHBlcmZvcm0gY2VydGFpbiBhY3Rpb25zIHByaW9yIHRvIHRoZSBjb21tZW5jZW1lbnQgb2YgYQotICAgKiBiZW5jaG1hcmssIHN1Y2ggYXMgYSBmdWxsIGhlYXAgY29sbGVjdGlvbiwgdHVybmluZyBvbgotICAgKiBpbnN0cnVtZW50YXRpb24sIGV0Yy4gIEJ5IGRlZmF1bHQgd2UgZG8gYSBmdWxsIGhlYXAgR0MsCi0gICAqIGFuZCB0aGVuIHN0YXJ0IHN0YXRzIGNvbGxlY3Rpb24uCi0gICAqLwotICBASW50ZXJydXB0aWJsZQotICBwdWJsaWMgc3RhdGljIHZvaWQgaGFybmVzc0JlZ2luKCkgewotICAgIC8vIFNhdmUgb2xkIHZhbHVlcy4KLSAgICBib29sZWFuIG9sZEZ1bGxIZWFwID0gT3B0aW9ucy5mdWxsSGVhcFN5c3RlbUdDLmdldFZhbHVlKCk7Ci0gICAgYm9vbGVhbiBvbGRJZ25vcmUgPSBPcHRpb25zLmlnbm9yZVN5c3RlbUdDLmdldFZhbHVlKCk7Ci0KLSAgICAvLyBTZXQgZGVzaXJlZCB2YWx1ZXMuCi0gICAgT3B0aW9ucy5mdWxsSGVhcFN5c3RlbUdDLnNldFZhbHVlKHRydWUpOwotICAgIE9wdGlvbnMuaWdub3JlU3lzdGVtR0Muc2V0VmFsdWUoZmFsc2UpOwotCi0gICAgLy8gVHJpZ2dlciBhIGZ1bGwgaGVhcCBHQy4KLSAgICBTeXN0ZW0uZ2MoKTsKLQotICAgIC8vIFJlc3RvcmUgb2xkIHZhbHVlcy4KLSAgICBPcHRpb25zLmlnbm9yZVN5c3RlbUdDLnNldFZhbHVlKG9sZElnbm9yZSk7Ci0gICAgT3B0aW9ucy5mdWxsSGVhcFN5c3RlbUdDLnNldFZhbHVlKG9sZEZ1bGxIZWFwKTsKLQotICAgIC8vIFN0YXJ0IHN0YXRpc3RpY3MKLSAgICBpbnNpZGVIYXJuZXNzID0gdHJ1ZTsKLSAgICBTdGF0cy5zdGFydEFsbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdlbmVyaWMgaG9vayB0byBhbGxvdyBiZW5jaG1hcmtzIHRvIGJlIGhhcm5lc3NlZC4gIEEgcGxhbiBtYXkgdXNlCi0gICAqIHRoaXMgdG8gcGVyZm9ybSBjZXJ0YWluIGFjdGlvbnMgYWZ0ZXIgdGhlIGNvbXBsZXRpb24gb2YgYQotICAgKiBiZW5jaG1hcmssIHN1Y2ggYXMgYSBmdWxsIGhlYXAgY29sbGVjdGlvbiwgdHVybmluZyBvZmYKLSAgICogaW5zdHJ1bWVudGF0aW9uLCBldGMuICBCeSBkZWZhdWx0IHdlIHN0b3AgYWxsIHN0YXRpc3RpY3Mgb2JqZWN0cwotICAgKiBhbmQgcHJpbnQgdGhlaXIgdmFsdWVzLgotICAgKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHVibGljIHN0YXRpYyB2b2lkIGhhcm5lc3NFbmQoKSAgewotICAgIFN0YXRzLnN0b3BBbGwoKTsKLSAgICBpbnNpZGVIYXJuZXNzID0gZmFsc2U7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBWTSBBY2NvdW50aW5nCi0gICAqLwotCi0gIC8qIEdsb2JhbCBhY2NvdW50aW5nIGFuZCBzdGF0aWMgYWNjZXNzICovCi0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgYW1vdW50IG9mIDxpPmZyZWUgbWVtb3J5PC9pPiwgaW4gYnl0ZXMgKHdoZXJlIGZyZWUgaXMKLSAgICogZGVmaW5lZCBhcyBub3QgaW4gdXNlKS4gIE5vdGUgdGhhdCB0aGlzIG1heSBvdmVyc3RhdGUgdGhlIGFtb3VudAotICAgKiBvZiA8aT5hdmFpbGFibGUgbWVtb3J5PC9pPiwgd2hpY2ggbXVzdCBhY2NvdW50IGZvciB1bnVzZWQgbWVtb3J5Ci0gICAqIHRoYXQgaXMgaGVsZCBpbiByZXNlcnZlIGZvciBjb3B5aW5nLCBhbmQgdGhlcmVmb3JlIHVuYXZhaWxhYmxlCi0gICAqIGZvciBhbGxvY2F0aW9uLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBhbW91bnQgb2YgPGk+ZnJlZSBtZW1vcnk8L2k+LCBpbiBieXRlcyAod2hlcmUgZnJlZSBpcwotICAgKiBkZWZpbmVkIGFzIG5vdCBpbiB1c2UpLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBFeHRlbnQgZnJlZU1lbW9yeSgpIHsKLSAgICByZXR1cm4gdG90YWxNZW1vcnkoKS5taW51cyh1c2VkTWVtb3J5KCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgYW1vdW50IG9mIDxpPmF2YWlsYWJsZSBtZW1vcnk8L2k+LCBpbiBieXRlcy4gIE5vdGUKLSAgICogdGhhdCB0aGlzIGFjY291bnRzIGZvciB1bnVzZWQgbWVtb3J5IHRoYXQgaXMgaGVsZCBpbiByZXNlcnZlCi0gICAqIGZvciBjb3B5aW5nLCBhbmQgdGhlcmVmb3JlIHVuYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBhbW91bnQgb2YgPGk+YXZhaWxhYmxlIG1lbW9yeTwvaT4sIGluIGJ5dGVzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBFeHRlbnQgYXZhaWxhYmxlTWVtb3J5KCkgewotICAgIHJldHVybiB0b3RhbE1lbW9yeSgpLm1pbnVzKHJlc2VydmVkTWVtb3J5KCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgYW1vdW50IG9mIDxpPm1lbW9yeSBpbiB1c2U8L2k+LCBpbiBieXRlcy4gIE5vdGUgdGhhdAotICAgKiB0aGlzIGV4Y2x1ZGVzIHVudXNlZCBtZW1vcnkgdGhhdCBpcyBoZWxkIGluIHJlc2VydmUgZm9yIGNvcHlpbmcsCi0gICAqIGFuZCB0aGVyZWZvcmUgdW5hdmFpbGFibGUgZm9yIGFsbG9jYXRpb24uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGFtb3VudCBvZiA8aT5tZW1vcnkgaW4gdXNlPC9pPiwgaW4gYnl0ZXMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEV4dGVudCB1c2VkTWVtb3J5KCkgewotICAgIHJldHVybiBDb252ZXJzaW9ucy5wYWdlc1RvQnl0ZXMoVk0uYWN0aXZlUGxhbi5nbG9iYWwoKS5nZXRQYWdlc1VzZWQoKSk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGFtb3VudCBvZiA8aT5tZW1vcnkgaW4gdXNlPC9pPiwgaW4gYnl0ZXMuICBOb3RlIHRoYXQKLSAgICogdGhpcyBpbmNsdWRlcyB1bnVzZWQgbWVtb3J5IHRoYXQgaXMgaGVsZCBpbiByZXNlcnZlIGZvciBjb3B5aW5nLAotICAgKiBhbmQgdGhlcmVmb3JlIHVuYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBhbW91bnQgb2YgPGk+bWVtb3J5IGluIHVzZTwvaT4sIGluIGJ5dGVzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBFeHRlbnQgcmVzZXJ2ZWRNZW1vcnkoKSB7Ci0gICAgcmV0dXJuIENvbnZlcnNpb25zLnBhZ2VzVG9CeXRlcyhWTS5hY3RpdmVQbGFuLmdsb2JhbCgpLmdldFBhZ2VzUmVzZXJ2ZWQoKSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSB0b3RhbCBhbW91bnQgb2YgbWVtb3J5IG1hbmFnZWQgdG8gdGhlIG1lbW9yeQotICAgKiBtYW5hZ2VtZW50IHN5c3RlbSwgaW4gYnl0ZXMuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIHRvdGFsIGFtb3VudCBvZiBtZW1vcnkgbWFuYWdlZCB0byB0aGUgbWVtb3J5Ci0gICAqIG1hbmFnZW1lbnQgc3lzdGVtLCBpbiBieXRlcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgRXh0ZW50IHRvdGFsTWVtb3J5KCkgewotICAgIHJldHVybiBIZWFwR3Jvd3RoTWFuYWdlci5nZXRDdXJyZW50SGVhcFNpemUoKTsKLSAgfQotCi0gIC8qIEluc3RhbmNlIG1ldGhvZHMgKi8KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSB0b3RhbCBhbW91bnQgb2YgbWVtb3J5IG1hbmFnZWQgdG8gdGhlIG1lbW9yeQotICAgKiBtYW5hZ2VtZW50IHN5c3RlbSwgaW4gcGFnZXMuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIHRvdGFsIGFtb3VudCBvZiBtZW1vcnkgbWFuYWdlZCB0byB0aGUgbWVtb3J5Ci0gICAqIG1hbmFnZW1lbnQgc3lzdGVtLCBpbiBwYWdlcy4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBpbnQgZ2V0VG90YWxQYWdlcygpIHsKLSAgICByZXR1cm4gdG90YWxNZW1vcnkoKS50b1dvcmQoKS5yc2hsKExPR19CWVRFU19JTl9QQUdFKS50b0ludCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHBhZ2VzIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbi4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHBhZ2VzIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0UGFnZXNBdmFpbCgpIHsKLSAgICByZXR1cm4gZ2V0VG90YWxQYWdlcygpIC0gZ2V0UGFnZXNSZXNlcnZlZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHBhZ2VzIHJlc2VydmVkIGZvciB1c2UgZ2l2ZW4gdGhlIHBlbmRpbmcKLSAgICogYWxsb2NhdGlvbi4gIFN1Yi1jbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhlIGdldENvcHlSZXNlcnZlIG1ldGhvZCwKLSAgICogYXMgdGhlIGFyaXRobWV0aWMgaGVyZSBpcyBmaXhlZC4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHJlc2VydmVkIGdpdmVuIHRoZSBwZW5kaW5nCi0gICAqIGFsbG9jYXRpb24sIGluY2x1ZGluZyBzcGFjZSByZXNlcnZlZCBmb3IgY29weWluZy4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UGFnZXNSZXNlcnZlZCgpIHsKLSAgICByZXR1cm4gZ2V0UGFnZXNVc2VkKCkgKyBnZXRDb2xsZWN0aW9uUmVzZXJ2ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHBhZ2VzIHJlc2VydmVkIGZvciBjb2xsZWN0aW9uLgotICAgKiBJbiBtb3N0IGNhc2VzIHRoaXMgaXMgYSBjb3B5IHJlc2VydmUsIGFsbCBzdWJjbGFzc2VzIHRoYXQKLSAgICogbWFuYWdlIGEgY29weWluZyBzcGFjZSBtdXN0IGFkZCB0aGUgY29weWluZyBjb250cmlidXRpb24uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBwYWdlcyByZXNlcnZlZCBnaXZlbiB0aGUgcGVuZGluZwotICAgKiBhbGxvY2F0aW9uLCBpbmNsdWRpbmcgc3BhY2UgcmVzZXJ2ZWQgZm9yIGNvbGxlY3Rpb24uCi0gICAqLwotICBwdWJsaWMgaW50IGdldENvbGxlY3Rpb25SZXNlcnZlKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHBhZ2VzIHJlc2VydmVkIGZvciB1c2UgZ2l2ZW4gdGhlIHBlbmRpbmcKLSAgICogYWxsb2NhdGlvbi4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHJlc2VydmVkIGdpdmVuIHRoZSBwZW5kaW5nCi0gICAqIGFsbG9jYXRpb24sIGV4Y2x1ZGluZyBzcGFjZSByZXNlcnZlZCBmb3IgY29weWluZy4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0UGFnZXNVc2VkKCkgewotICAgIHJldHVybiBsb1NwYWNlLnJlc2VydmVkUGFnZXMoKSArCi0gICAgICAgICAgIGltbW9ydGFsU3BhY2UucmVzZXJ2ZWRQYWdlcygpICsgbWV0YURhdGFTcGFjZS5yZXNlcnZlZFBhZ2VzKCkgKwotICAgICAgICAgICBub25Nb3ZpbmdTcGFjZS5yZXNlcnZlZFBhZ2VzKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgcGFnZXMgYSBjb2xsZWN0aW9uIGlzIHJlcXVpcmVkIHRvIGZyZWUgdG8gc2F0aXNmeQotICAgKiBvdXRzdGFuZGluZyBhbGxvY2F0aW9uIHJlcXVlc3RzLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcGFnZXMgYSBjb2xsZWN0aW9uIGlzIHJlcXVpcmVkIHRvIGZyZWUgdG8gc2F0aXNmeQotICAgKiBvdXRzdGFuZGluZyBhbGxvY2F0aW9uIHJlcXVlc3RzLgotICAgKi8KLSAgcHVibGljIGludCBnZXRQYWdlc1JlcXVpcmVkKCkgewotICAgIHJldHVybiBsb1NwYWNlLnJlcXVpcmVkUGFnZXMoKSArCi0gICAgICBtZXRhRGF0YVNwYWNlLnJlcXVpcmVkUGFnZXMoKSArIGltbW9ydGFsU3BhY2UucmVxdWlyZWRQYWdlcygpICsKLSAgICAgIG5vbk1vdmluZ1NwYWNlLnJlcXVpcmVkUGFnZXMoKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWluaW11bSBudW1iZXIgb2YgcGFnZXMgYSBHQyBtdXN0IGhhdmUgYXZhaWxhYmxlIGFmdGVyIGEgY29sbGVjdGlvbgotICAgKiBmb3IgdXMgdG8gY29uc2lkZXIgdGhlIGNvbGxlY3Rpb24gc3VjY2Vzc2Z1bC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0SGVhcEZ1bGxUaHJlc2hvbGQoKSB7Ci0gICAgaW50IHRocmVzaG9sZCA9IChnZXRUb3RhbFBhZ2VzKCkgKiBIRUFQX0ZVTExfUEVSQ0VOVEFHRSkgLyAxMDA7Ci0gICAgaWYgKHRocmVzaG9sZCA8IEhFQVBfRlVMTF9NSU5JTVVNKSB0aHJlc2hvbGQgPSBIRUFQX0ZVTExfTUlOSU1VTTsKLSAgICByZXR1cm4gdGhyZXNob2xkOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIG1ldGFkYXRhIHBhZ2VzIHJlc2VydmVkIGZvciB1c2UgZ2l2ZW4gdGhlIHBlbmRpbmcKLSAgICogYWxsb2NhdGlvbi4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHJlc2VydmVkIGdpdmVuIHRoZSBwZW5kaW5nCi0gICAqIGFsbG9jYXRpb24sIGV4Y2x1ZGluZyBzcGFjZSByZXNlcnZlZCBmb3IgY29weWluZy4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TWV0YURhdGFQYWdlc1VzZWQoKSB7Ci0gICAgcmV0dXJuIG1ldGFEYXRhU3BhY2UucmVzZXJ2ZWRQYWdlcygpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgY3ljbGUgdGltZSBhdCB3aGljaCB0aGlzIEdDIHNob3VsZCBjb21wbGV0ZS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgdGltZSBjYXAgZm9yIHRoaXMgR0MgKGkuZS4gdGhlIHRpbWUgYnkgd2hpY2ggaXQKLSAgICogc2hvdWxkIGNvbXBsZXRlKS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRUaW1lQ2FwKCkgewotICAgIHJldHVybiB0aW1lQ2FwOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogSW50ZXJuYWwgcmVhZC93cml0ZSBiYXJyaWVycy4KLSAgICovCi0KLSAgLyoqCi0gICAqIFN0b3JlIGFuIG9iamVjdCByZWZlcmVuY2UKLSAgICoKLSAgICogQHBhcmFtIHNsb3QgVGhlIGxvY2F0aW9uIG9mIHRoZSByZWZlcmVuY2UKLSAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBzdG9yZQotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgdm9pZCBzdG9yZU9iamVjdFJlZmVyZW5jZShBZGRyZXNzIHNsb3QsIE9iamVjdFJlZmVyZW5jZSB2YWx1ZSkgewotICAgIHNsb3Quc3RvcmUodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIExvYWQgYW4gb2JqZWN0IHJlZmVyZW5jZQotICAgKgotICAgKiBAcGFyYW0gc2xvdCBUaGUgbG9jYXRpb24gb2YgdGhlIHJlZmVyZW5jZQotICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgcmVmZXJlbmNlIGxvYWRlZCBmcm9tIHNsb3QKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIE9iamVjdFJlZmVyZW5jZSBsb2FkT2JqZWN0UmVmZXJlbmNlKEFkZHJlc3Mgc2xvdCkgewotICAgIHJldHVybiBzbG90LmxvYWRPYmplY3RSZWZlcmVuY2UoKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIENvbGxlY3Rpb24uCi0gICAqLwotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgcGVyaW9kaWNhbGx5IGJ5IHRoZSBhbGxvY2F0aW9uIHN1YnN5c3RlbQotICAgKiAoYnkgZGVmYXVsdCwgZWFjaCB0aW1lIGEgcGFnZSBpcyBjb25zdW1lZCksIGFuZCBwcm92aWRlcyB0aGUKLSAgICogY29sbGVjdG9yIHdpdGggYW4gb3Bwb3J0dW5pdHkgdG8gY29sbGVjdC4KLSAgICoKLSAgICogQHBhcmFtIHNwYWNlRnVsbCBTcGFjZSByZXF1ZXN0IGZhaWxlZCwgbXVzdCByZWNvdmVyIHBhZ2VzIHdpdGhpbiAnc3BhY2UnLgotICAgKiBAcGFyYW0gc3BhY2UgVGhlIHNwYWNlIHRoYXQgdHJpZ2dlcmVkIHRoZSBwb2xsLgotICAgKiBAcmV0dXJuIHRydWUgaWYgYSBjb2xsZWN0aW9uIGlzIHJlcXVpcmVkLgotICAgKi8KLSAgQExvZ2ljYWxseVVuaW50ZXJydXB0aWJsZQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBwb2xsKGJvb2xlYW4gc3BhY2VGdWxsLCBTcGFjZSBzcGFjZSkgewotICAgIGlmIChpc0NvbGxlY3Rpb25UcmlnZ2VyZWQoKSkgewotICAgICAgaWYgKHNwYWNlID09IG1ldGFEYXRhU3BhY2UpIHsKLSAgICAgICAgLyogVGhpcyBpcyBub3QsIGluIGdlbmVyYWwsIGluIGEgR0Mgc2FmZSBwb2ludC4gKi8KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgLyogU29tZW9uZSBlbHNlIGluaXRpYXRlZCBhIGNvbGxlY3Rpb24sIHdlIHNob3VsZCBqb2luIGl0ICovCi0gICAgICBsb2dQb2xsKHNwYWNlLCAiSm9pbmluZyBjb2xsZWN0aW9uIik7Ci0gICAgICBWTS5jb2xsZWN0aW9uLmpvaW5Db2xsZWN0aW9uKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoY29sbGVjdGlvblJlcXVpcmVkKHNwYWNlRnVsbCkpIHsKLSAgICAgIGlmIChzcGFjZSA9PSBtZXRhRGF0YVNwYWNlKSB7Ci0gICAgICAgIC8qIEluIGdlbmVyYWwgd2UgbXVzdCBub3QgdHJpZ2dlciBhIEdDIG9uIG1ldGFkYXRhIGFsbG9jYXRpb24gc2luY2UKLSAgICAgICAgICogdGhpcyBpcyBub3QsIGluIGdlbmVyYWwsIGluIGEgR0Mgc2FmZSBwb2ludC4gIEluc3RlYWQgd2UgaW5pdGlhdGUKLSAgICAgICAgICogYW4gYXN5bmNocm9ub3VzIEdDLCB3aGljaCB3aWxsIG9jY3VyIGF0IHRoZSBuZXh0IHNhZmUgcG9pbnQuCi0gICAgICAgICAqLwotICAgICAgICBsb2dQb2xsKHNwYWNlLCAiQXN5bmNocm9ub3VzIGNvbGxlY3Rpb24gcmVxdWVzdGVkIik7Ci0gICAgICAgIHNldEF3YWl0aW5nQXN5bmNDb2xsZWN0aW9uKCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGxvZ1BvbGwoc3BhY2UsICJUcmlnZ2VyaW5nIGNvbGxlY3Rpb24iKTsKLSAgICAgIFZNLmNvbGxlY3Rpb24udHJpZ2dlckNvbGxlY3Rpb24oQ29sbGVjdGlvbi5SRVNPVVJDRV9HQ19UUklHR0VSKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmIChjb25jdXJyZW50Q29sbGVjdGlvblJlcXVpcmVkKCkpIHsKLSAgICAgIGxvZ1BvbGwoc3BhY2UsICJUcmlnZ2VyaW5nIGNvbGxlY3Rpb24iKTsKLSAgICAgIFZNLmNvbGxlY3Rpb24udHJpZ2dlckNvbGxlY3Rpb24oQ29sbGVjdGlvbi5JTlRFUk5BTF9QSEFTRV9HQ19UUklHR0VSKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVjayB3aGV0aGVyIGFuIGFzeW5jaHJvbm91cyBjb2xsZWN0aW9uIGlzIHBlbmRpbmcuPHA+Ci0gICAqCi0gICAqIFRoaXMgaXMgZGVjb3VwbGVkIGZyb20gdGhlIHBvbGwoKSBtZWNoYW5pc20gYmVjYXVzZSB0aGUKLSAgICogdHJpZ2dlcmluZyBvZiBhc3luY2hyb25vdXMgY29sbGVjdGlvbnMgY2FuIHRyaWdnZXIgd3JpdGUKLSAgICogYmFycmllcnMsIHdoaWNoIGNhbiB0cmlnZ2VyIGFuIGFzeW5jaHJvbm91cyBjb2xsZWN0aW9uLiAgVGh1cywgaWYKLSAgICogdGhlIHRyaWdnZXJpbmcgd2VyZSB0aWdodGx5IGNvdXBsZWQgd2l0aCB0aGUgcmVxdWVzdCB0byBhbGxvYygpCi0gICAqIHdpdGhpbiB0aGUgd3JpdGUgYnVmZmVyIGNvZGUsIHRoZW4gaW5pZmluaXRlIHJlZ3Jlc3MgY291bGQKLSAgICogcmVzdWx0LiAgVGhlcmUgaXMgbm8gcmFjZSBjb25kaXRpb24gaW4gdGhlIGZvbGxvd2luZyBjb2RlIHNpbmNlCi0gICAqIHRoZXJlIGlzIG5vIGhhcm0gaW4gdHJpZ2dlcmluZyB0aGUgY29sbGVjdGlvbiBtb3JlIHRoYW4gb25jZSwKLSAgICogdGh1cyBpdCBpcyB1bnN5bmNocm9uaXplZC4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrRm9yQXN5bmNDb2xsZWN0aW9uKCkgewotICAgIGlmIChhd2FpdGluZ0FzeW5jQ29sbGVjdGlvbiAmJiBWTS5jb2xsZWN0aW9uLm5vVGhyZWFkc0luR0MoKSkgewotICAgICAgYXdhaXRpbmdBc3luY0NvbGxlY3Rpb24gPSBmYWxzZTsKLSAgICAgIFZNLmNvbGxlY3Rpb24udHJpZ2dlckFzeW5jQ29sbGVjdGlvbihDb2xsZWN0aW9uLlJFU09VUkNFX0dDX1RSSUdHRVIpOwotICAgIH0KLSAgfQotCi0gIC8qKiBSZXF1ZXN0IGFuIGFzeW5jIEdDICovCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBzZXRBd2FpdGluZ0FzeW5jQ29sbGVjdGlvbigpIHsKLSAgICBhd2FpdGluZ0FzeW5jQ29sbGVjdGlvbiA9IHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogTG9nIGEgbWVzc2FnZSBmcm9tIHdpdGhpbiAncG9sbCcKLSAgICogQHBhcmFtIHNwYWNlCi0gICAqIEBwYXJhbSBtZXNzYWdlCi0gICAqLwotICBwcml2YXRlIHZvaWQgbG9nUG9sbChTcGFjZSBzcGFjZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICBpZiAoT3B0aW9ucy52ZXJib3NlLmdldFZhbHVlKCkgPj0gMykgewotICAgICAgTG9nLndyaXRlKCIgIFtQT0xMXSAiKTsKLSAgICAgIExvZy53cml0ZShzcGFjZS5nZXROYW1lKCkpOwotICAgICAgTG9nLndyaXRlKCI6ICIpOwotICAgICAgTG9nLndyaXRlbG4obWVzc2FnZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGNvbnRyb2xzIHRoZSB0cmlnZ2VyaW5nIG9mIGEgR0MuIEl0IGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkKLSAgICogZHVyaW5nIGFsbG9jYXRpb24uIFJldHVybnMgdHJ1ZSB0byB0cmlnZ2VyIGEgY29sbGVjdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIHNwYWNlRnVsbCBTcGFjZSByZXF1ZXN0IGZhaWxlZCwgbXVzdCByZWNvdmVyIHBhZ2VzIHdpdGhpbiAnc3BhY2UnLgotICAgKiBAcmV0dXJuIFRydWUgaWYgYSBjb2xsZWN0aW9uIGlzIHJlcXVlc3RlZCBieSB0aGUgcGxhbi4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGNvbGxlY3Rpb25SZXF1aXJlZChib29sZWFuIHNwYWNlRnVsbCkgewotICAgIGJvb2xlYW4gc3RyZXNzRm9yY2VHQyA9IHN0cmVzc1Rlc3RHQ1JlcXVpcmVkKCk7Ci0gICAgYm9vbGVhbiBoZWFwRnVsbCA9IGdldFBhZ2VzUmVzZXJ2ZWQoKSA+IGdldFRvdGFsUGFnZXMoKTsKLQotICAgIHJldHVybiBzcGFjZUZ1bGwgfHwgc3RyZXNzRm9yY2VHQyB8fCBoZWFwRnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBjb250cm9scyB0aGUgdHJpZ2dlcmluZyBvZiBhbiBhdG9taWMgcGhhc2Ugb2YgYSBjb25jdXJyZW50Ci0gICAqIGNvbGxlY3Rpb24uIEl0IGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkgZHVyaW5nIGFsbG9jYXRpb24uCi0gICAqCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiBhIGNvbGxlY3Rpb24gaXMgcmVxdWVzdGVkIGJ5IHRoZSBwbGFuLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY29uY3VycmVudENvbGxlY3Rpb25SZXF1aXJlZCgpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogU3RhcnQgR0NzcHkgc2VydmVyLgotICAgKgotICAgKiBAcGFyYW0gcG9ydCBUaGUgcG9ydCB0byBsaXN0ZW4gb24sCi0gICAqIEBwYXJhbSB3YWl0IFNob3VsZCB3ZSB3YWl0IGZvciBhIGNsaWVudCB0byBjb25uZWN0PwotICAgKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHVibGljIHZvaWQgc3RhcnRHQ3NweVNlcnZlcihpbnQgcG9ydCwgYm9vbGVhbiB3YWl0KSB7Ci0gICAgVk0uYXNzZXJ0aW9ucy5mYWlsKCJzdGFydEdDc3B5U2VydmVyIGNhbGxlZCBvbiBub24gR0NzcHkgcGxhbiIpOwotICB9Ci0KLSAgLyoqCi0gICAqIENhbiB0aGlzIG9iamVjdCBldmVyIG1vdmUuICBVc2VkIGJ5IHRoZSBWTSB0byBtYWtlIGRlY2lzaW9ucyBhYm91dAotICAgKiB3aGV0aGVyIGl0IG5lZWRzIHRvIGNvcHkgSU8gYnVmZmVycyBldGMuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCBpbiBxdWVzdGlvbgotICAgKiBAcmV0dXJuIFRydWUgaWYgaXQgaXMgbm90IHBvc3NpYmxlIHRoYXQgdGhlIG9iamVjdCB3aWxsIGV2ZXIgbW92ZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHdpbGxOZXZlck1vdmUoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmICghVk0uYWN0aXZlUGxhbi5jb25zdHJhaW50cygpLm1vdmVzT2JqZWN0cygpKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgaWYgKFNwYWNlLmlzSW5TcGFjZShMT1MsIG9iamVjdCkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoU3BhY2UuaXNJblNwYWNlKElNTU9SVEFMLCBvYmplY3QpKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgaWYgKFNwYWNlLmlzSW5TcGFjZShWTV9TUEFDRSwgb2JqZWN0KSkKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGlmIChTcGFjZS5pc0luU3BhY2UoTk9OX01PVklORywgb2JqZWN0KSkKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGlmIChVU0VfQ09ERV9TUEFDRSAmJiBTcGFjZS5pc0luU3BhY2UoU01BTExfQ09ERSwgb2JqZWN0KSkKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGlmIChVU0VfQ09ERV9TUEFDRSAmJiBTcGFjZS5pc0luU3BhY2UoTEFSR0VfQ09ERSwgb2JqZWN0KSkKLSAgICAgIHJldHVybiB0cnVlOwotICAgIC8qCi0gICAgICogRGVmYXVsdCB0byBmYWxzZS0gdGhpcyBwcmVzZXJ2ZXMgY29ycmVjdG5lc3Mgb3ZlciBlZmZpY2llbmN5LgotICAgICAqIEluZGl2aWR1YWwgcGxhbnMgc2hvdWxkIG92ZXJyaWRlIGZvciBub24tbW92aW5nIHNwYWNlcyB0aGV5IGRlZmluZS4KLSAgICAgKi8KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBTcGVjaWFsaXplZCBNZXRob2RzCi0gICAqLwotCi0gIC8qKgotICAgKiBSZWdpc3RlciBzcGVjaWFsaXplZCBtZXRob2RzLgotICAgKi8KLSAgIEBJbnRlcnJ1cHRpYmxlCi0gIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyU3BlY2lhbGl6ZWRNZXRob2RzKCkgewotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgc3BlY2lhbGl6ZWQgc2NhbiB3aXRoIHRoZSBnaXZlbiBpZC4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBDbGFzczw/PiBnZXRTcGVjaWFsaXplZFNjYW5DbGFzcyhpbnQgaWQpIHsKLSAgICByZXR1cm4gVHJhbnNpdGl2ZUNsb3N1cmUuZ2V0U3BlY2lhbGl6ZWRTY2FuQ2xhc3MoaWQpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vUGxhbkNvbnN0cmFpbnRzLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vUGxhbkNvbnN0cmFpbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNWYyMDIuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL1BsYW5Db25zdHJhaW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuOwotCi1pbXBvcnQgb3JnLm1tdGsucG9saWN5LlNlZ3JlZ2F0ZWRGcmVlTGlzdFNwYWNlOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgYW5kIGl0cyBzdWJjbGFzc2VzIGNvbW11bmljYXRlIHRvIHRoZSBob3N0IFZNL1J1bnRpbWUKLSAqIGFueSBmZWF0dXJlcyBvZiB0aGUgc2VsZWN0ZWQgcGxhbiB0aGF0IGl0IG5lZWRzIHRvIGtub3cuICBUaGlzIGlzCi0gKiBzZXBhcmF0ZSBmcm9tIHRoZSBtYWluIFBsYW4vUGxhbkxvY2FsIGNsYXNzIGluIG9yZGVyIHRvIGJ5cGFzcyBhbnkKLSAqIGlzc3VlcyB3aXRoIG9yZGVyaW5nIG9mIHN0YXRpYyBpbml0aWFsaXphdGlvbi4KLSAqLwotQFVuaW50ZXJydXB0aWJsZSBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGxhbkNvbnN0cmFpbnRzIHsKLSAgLyoqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIFBsYW4gcmVxdWlyZXMgcmVhZCBiYXJyaWVycyBvbiBqYXZhLmxhbmcucmVmZXJlbmNlIHR5cGVzLiAqLwotICBwdWJsaWMgYm9vbGVhbiBuZWVkc0phdmFMYW5nUmVmZXJlbmNlUmVhZEJhcnJpZXIoKSB7IHJldHVybiBmYWxzZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIHJlcXVpcmVzIHdyaXRlIGJhcnJpZXJzIG9uIGJvb2xlYW5zLiAqLwotICBwdWJsaWMgYm9vbGVhbiBuZWVkc0Jvb2xlYW5Xcml0ZUJhcnJpZXIoKSB7IHJldHVybiBmYWxzZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIHJlcXVpcmVzIHJlYWQgYmFycmllcnMgb24gYm9vbGVhbnMuICovCi0gIHB1YmxpYyBib29sZWFuIG5lZWRzQm9vbGVhblJlYWRCYXJyaWVyKCkgeyByZXR1cm4gZmFsc2U7IH0KLQotICAvKiogQHJldHVybiBUcnVlIGlmIHRoaXMgUGxhbiBjYW4gcGVyZm9ybSBidWxrIGJvb2xlYW4gYXJyYXljb3B5IGJhcnJpZXJzLiAqLwotICBwdWJsaWMgYm9vbGVhbiBib29sZWFuQnVsa0NvcHlTdXBwb3J0ZWQoKSB7IHJldHVybiBmYWxzZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIHJlcXVpcmVzIHdyaXRlIGJhcnJpZXJzIG9uIGJ5dGVzLiAqLwotICBwdWJsaWMgYm9vbGVhbiBuZWVkc0J5dGVXcml0ZUJhcnJpZXIoKSB7IHJldHVybiBmYWxzZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIHJlcXVpcmVzIHJlYWQgYmFycmllcnMgb24gYnl0ZXMuICovCi0gIHB1YmxpYyBib29sZWFuIG5lZWRzQnl0ZVJlYWRCYXJyaWVyKCkgeyByZXR1cm4gZmFsc2U7IH0KLQotICAvKiogQHJldHVybiBUcnVlIGlmIHRoaXMgUGxhbiBjYW4gcGVyZm9ybSBidWxrIGJ5dGUgYXJyYXljb3B5IGJhcnJpZXJzLiAqLwotICBwdWJsaWMgYm9vbGVhbiBieXRlQnVsa0NvcHlTdXBwb3J0ZWQoKSB7IHJldHVybiBmYWxzZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIHJlcXVpcmVzIHdyaXRlIGJhcnJpZXJzIG9uIGNoYXJzLiAqLwotICBwdWJsaWMgYm9vbGVhbiBuZWVkc0NoYXJXcml0ZUJhcnJpZXIoKSB7IHJldHVybiBmYWxzZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIHJlcXVpcmVzIHJlYWQgYmFycmllcnMgb24gY2hhcnMuICovCi0gIHB1YmxpYyBib29sZWFuIG5lZWRzQ2hhclJlYWRCYXJyaWVyKCkgeyByZXR1cm4gZmFsc2U7IH0KLQotICAvKiogQHJldHVybiBUcnVlIGlmIHRoaXMgUGxhbiBjYW4gcGVyZm9ybSBidWxrIGNoYXIgYXJyYXljb3B5IGJhcnJpZXJzLiAqLwotICBwdWJsaWMgYm9vbGVhbiBjaGFyQnVsa0NvcHlTdXBwb3J0ZWQoKSB7IHJldHVybiBmYWxzZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIHJlcXVpcmVzIHdyaXRlIGJhcnJpZXJzIG9uIHNob3J0cy4gKi8KLSAgcHVibGljIGJvb2xlYW4gbmVlZHNTaG9ydFdyaXRlQmFycmllcigpIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgLyoqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIFBsYW4gcmVxdWlyZXMgcmVhZCBiYXJyaWVycyBvbiBzaG9ydHMuICovCi0gIHB1YmxpYyBib29sZWFuIG5lZWRzU2hvcnRSZWFkQmFycmllcigpIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgLyoqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIFBsYW4gY2FuIHBlcmZvcm0gYnVsayBzaG9ydCBhcnJheWNvcHkgYmFycmllcnMuICovCi0gIHB1YmxpYyBib29sZWFuIHNob3J0QnVsa0NvcHlTdXBwb3J0ZWQoKSB7IHJldHVybiBmYWxzZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIHJlcXVpcmVzIHdyaXRlIGJhcnJpZXJzIG9uIGludHMuICovCi0gIHB1YmxpYyBib29sZWFuIG5lZWRzSW50V3JpdGVCYXJyaWVyKCkgeyByZXR1cm4gZmFsc2U7IH0KLQotICAvKiogQHJldHVybiBUcnVlIGlmIHRoaXMgUGxhbiByZXF1aXJlcyByZWFkIGJhcnJpZXJzIG9uIGludHMuICovCi0gIHB1YmxpYyBib29sZWFuIG5lZWRzSW50UmVhZEJhcnJpZXIoKSB7IHJldHVybiBmYWxzZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIGNhbiBwZXJmb3JtIGJ1bGsgaW50IGFycmF5Y29weSBiYXJyaWVycy4gKi8KLSAgcHVibGljIGJvb2xlYW4gaW50QnVsa0NvcHlTdXBwb3J0ZWQoKSB7IHJldHVybiBmYWxzZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIHJlcXVpcmVzIHdyaXRlIGJhcnJpZXJzIG9uIGxvbmdzLiAqLwotICBwdWJsaWMgYm9vbGVhbiBuZWVkc0xvbmdXcml0ZUJhcnJpZXIoKSB7IHJldHVybiBmYWxzZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIHJlcXVpcmVzIHJlYWQgYmFycmllcnMgb24gbG9uZ3MuICovCi0gIHB1YmxpYyBib29sZWFuIG5lZWRzTG9uZ1JlYWRCYXJyaWVyKCkgeyByZXR1cm4gZmFsc2U7IH0KLQotICAvKiogQHJldHVybiBUcnVlIGlmIHRoaXMgUGxhbiBjYW4gcGVyZm9ybSBidWxrIGxvbmcgYXJyYXljb3B5IGJhcnJpZXJzLiAqLwotICBwdWJsaWMgYm9vbGVhbiBsb25nQnVsa0NvcHlTdXBwb3J0ZWQoKSB7IHJldHVybiBmYWxzZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIHJlcXVpcmVzIHdyaXRlIGJhcnJpZXJzIG9uIGZsb2F0cy4gKi8KLSAgcHVibGljIGJvb2xlYW4gbmVlZHNGbG9hdFdyaXRlQmFycmllcigpIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgLyoqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIFBsYW4gcmVxdWlyZXMgcmVhZCBiYXJyaWVycyBvbiBmbG9hdHMuICovCi0gIHB1YmxpYyBib29sZWFuIG5lZWRzRmxvYXRSZWFkQmFycmllcigpIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgLyoqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIFBsYW4gY2FuIHBlcmZvcm0gYnVsayBmbG9hdCBhcnJheWNvcHkgYmFycmllcnMuICovCi0gIHB1YmxpYyBib29sZWFuIGZsb2F0QnVsa0NvcHlTdXBwb3J0ZWQoKSB7IHJldHVybiBmYWxzZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIHJlcXVpcmVzIHdyaXRlIGJhcnJpZXJzIG9uIGRvdWJsZXMuICovCi0gIHB1YmxpYyBib29sZWFuIG5lZWRzRG91YmxlV3JpdGVCYXJyaWVyKCkgeyByZXR1cm4gZmFsc2U7IH0KLQotICAvKiogQHJldHVybiBUcnVlIGlmIHRoaXMgUGxhbiByZXF1aXJlcyByZWFkIGJhcnJpZXJzIG9uIGRvdWJsZXMuICovCi0gIHB1YmxpYyBib29sZWFuIG5lZWRzRG91YmxlUmVhZEJhcnJpZXIoKSB7IHJldHVybiBmYWxzZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIGNhbiBwZXJmb3JtIGJ1bGsgZG91YmxlIGFycmF5Y29weSBiYXJyaWVycy4gKi8KLSAgcHVibGljIGJvb2xlYW4gZG91YmxlQnVsa0NvcHlTdXBwb3J0ZWQoKSB7IHJldHVybiBmYWxzZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIHJlcXVpcmVzIHdyaXRlIGJhcnJpZXJzIG9uIFdvcmRzLiAqLwotICBwdWJsaWMgYm9vbGVhbiBuZWVkc1dvcmRXcml0ZUJhcnJpZXIoKSB7IHJldHVybiBmYWxzZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIHJlcXVpcmVzIHJlYWQgYmFycmllcnMgb24gV29yZHMuICovCi0gIHB1YmxpYyBib29sZWFuIG5lZWRzV29yZFJlYWRCYXJyaWVyKCkgeyByZXR1cm4gZmFsc2U7IH0KLQotICAvKiogQHJldHVybiBUcnVlIGlmIHRoaXMgUGxhbiBjYW4gcGVyZm9ybSBidWxrIFdvcmQgYXJyYXljb3B5IGJhcnJpZXJzLiAqLwotICBwdWJsaWMgYm9vbGVhbiB3b3JkQnVsa0NvcHlTdXBwb3J0ZWQoKSB7IHJldHVybiBmYWxzZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIHJlcXVpcmVzIHdyaXRlIGJhcnJpZXJzIG9uIEFkZHJlc3Mncy4gKi8KLSAgcHVibGljIGJvb2xlYW4gbmVlZHNBZGRyZXNzV3JpdGVCYXJyaWVyKCkgeyByZXR1cm4gZmFsc2U7IH0KLQotICAvKiogQHJldHVybiBUcnVlIGlmIHRoaXMgUGxhbiByZXF1aXJlcyByZWFkIGJhcnJpZXJzIG9uIEFkZHJlc3Mncy4gKi8KLSAgcHVibGljIGJvb2xlYW4gbmVlZHNBZGRyZXNzUmVhZEJhcnJpZXIoKSB7IHJldHVybiBmYWxzZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIGNhbiBwZXJmb3JtIGJ1bGsgQWRkcmVzcyBhcnJheWNvcHkgYmFycmllcnMuICovCi0gIHB1YmxpYyBib29sZWFuIGFkZHJlc3NCdWxrQ29weVN1cHBvcnRlZCgpIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgLyoqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIFBsYW4gcmVxdWlyZXMgd3JpdGUgYmFycmllcnMgb24gRXh0ZW50cy4gKi8KLSAgcHVibGljIGJvb2xlYW4gbmVlZHNFeHRlbnRXcml0ZUJhcnJpZXIoKSB7IHJldHVybiBmYWxzZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIHJlcXVpcmVzIHJlYWQgYmFycmllcnMgb24gRXh0ZW50cy4gKi8KLSAgcHVibGljIGJvb2xlYW4gbmVlZHNFeHRlbnRSZWFkQmFycmllcigpIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgLyoqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIFBsYW4gY2FuIHBlcmZvcm0gYnVsayBFeHRlbnQgYXJyYXljb3B5IGJhcnJpZXJzLiAqLwotICBwdWJsaWMgYm9vbGVhbiBleHRlbnRCdWxrQ29weVN1cHBvcnRlZCgpIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgLyoqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIFBsYW4gcmVxdWlyZXMgd3JpdGUgYmFycmllcnMgb24gT2Zmc2V0cy4gKi8KLSAgcHVibGljIGJvb2xlYW4gbmVlZHNPZmZzZXRXcml0ZUJhcnJpZXIoKSB7IHJldHVybiBmYWxzZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIHJlcXVpcmVzIHJlYWQgYmFycmllcnMgb24gT2Zmc2V0cy4gKi8KLSAgcHVibGljIGJvb2xlYW4gbmVlZHNPZmZzZXRSZWFkQmFycmllcigpIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgLyoqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIFBsYW4gY2FuIHBlcmZvcm0gYnVsayBPZmZzZXQgYXJyYXljb3B5IGJhcnJpZXJzLiAqLwotICBwdWJsaWMgYm9vbGVhbiBvZmZzZXRCdWxrQ29weVN1cHBvcnRlZCgpIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgLyoqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIFBsYW4gcmVxdWlyZXMgd3JpdGUgYmFycmllcnMgb24gb2JqZWN0IHJlZmVyZW5jZXMuICovCi0gIHB1YmxpYyBib29sZWFuIG5lZWRzT2JqZWN0UmVmZXJlbmNlV3JpdGVCYXJyaWVyKCkgeyByZXR1cm4gZmFsc2U7IH0KLQotICAvKiogQHJldHVybiBUcnVlIGlmIHRoaXMgUGxhbiByZXF1aXJlcyByZWFkIGJhcnJpZXJzIG9uIG9iamVjdCByZWZlcmVuY2VzLiAqLwotICBwdWJsaWMgYm9vbGVhbiBuZWVkc09iamVjdFJlZmVyZW5jZVJlYWRCYXJyaWVyKCkgeyByZXR1cm4gZmFsc2U7IH0KLQotICAvKiogQHJldHVybiBUcnVlIGlmIHRoaXMgUGxhbiByZXF1aXJlcyBub24taGVhcCB3cml0ZSBiYXJyaWVycyBvbiBvYmplY3QgcmVmZXJlbmNlcy4gKi8KLSAgcHVibGljIGJvb2xlYW4gbmVlZHNPYmplY3RSZWZlcmVuY2VOb25IZWFwV3JpdGVCYXJyaWVyKCkgeyByZXR1cm4gZmFsc2U7fQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIHJlcXVpcmVzIG5vbi1oZWFwIHJlYWQgYmFycmllcnMgb24gb2JqZWN0IHJlZmVyZW5jZXMuICovCi0gIHB1YmxpYyBib29sZWFuIG5lZWRzT2JqZWN0UmVmZXJlbmNlTm9uSGVhcFJlYWRCYXJyaWVyKCkgeyByZXR1cm4gZmFsc2U7IH0KLQotICAvKiogQHJldHVybiBUcnVlIGlmIHRoaXMgUGxhbiBjYW4gcGVyZm9ybSBidWxrIG9iamVjdCBhcnJheWNvcHkgYmFycmllcnMuICovCi0gIHB1YmxpYyBib29sZWFuIG9iamVjdFJlZmVyZW5jZUJ1bGtDb3B5U3VwcG9ydGVkKCkgeyByZXR1cm4gZmFsc2U7IH0KLQotICAvKiogQHJldHVybiBUcnVlIGlmIHRoaXMgUGxhbiByZXF1aXJlcyBsaW5lYXIgc2Nhbm5pbmcuICovCi0gIHB1YmxpYyBib29sZWFuIG5lZWRzTGluZWFyU2NhbigpIHsgcmV0dXJuIG9yZy5tbXRrLnV0aWxpdHkuQ29uc3RhbnRzLlNVUFBPUlRfQ0FSRF9TQ0FOTklORzt9Ci0KLSAgLyoqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIFBsYW4gZG9lcyBub3Qgc3VwcG9ydCBwYXJhbGxlbCBjb2xsZWN0aW9uLiAqLwotICBwdWJsaWMgYm9vbGVhbiBub1BhcmFsbGVsR0MoKSB7IHJldHVybiBmYWxzZTt9Ci0KLSAgLyoqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIFBsYW4gbW92ZXMgb2JqZWN0cy4gKi8KLSAgcHVibGljIGJvb2xlYW4gbW92ZXNPYmplY3RzKCkgeyByZXR1cm4gZmFsc2U7fQotCi0gIC8qKiBAcmV0dXJuIFNpemUgKGluIGJ5dGVzKSBiZXlvbmQgd2hpY2ggbmV3IHJlZ3VsYXIgb2JqZWN0cyBtdXN0IGJlIGFsbG9jYXRlZCB0byB0aGUgTE9TICovCi0gIHB1YmxpYyBpbnQgbWF4Tm9uTE9TRGVmYXVsdEFsbG9jQnl0ZXMoKSB7IHJldHVybiBvcmcubW10ay51dGlsaXR5LkNvbnN0YW50cy5NQVhfSU5UO30KLQotICAvKiogQHJldHVybiBTaXplIChpbiBieXRlcykgYmV5b25kIHdoaWNoIG5ldyBub24tbW92aW5nIG9iamVjdHMgbXVzdCBiZSBhbGxvY2F0ZWQgdG8gdGhlIExPUyAqLwotICBwdWJsaWMgaW50IG1heE5vbkxPU05vbk1vdmluZ0FsbG9jQnl0ZXMoKSB7IHJldHVybiBTZWdyZWdhdGVkRnJlZUxpc3RTcGFjZS5NQVhfRlJFRUxJU1RfT0JKRUNUX0JZVEVTO30KLQotICAvKiogQHJldHVybiBTaXplIChpbiBieXRlcykgYmV5b25kIHdoaWNoIGNvcGllZCBvYmplY3RzIG11c3QgYmUgY29waWVkIHRvIHRoZSBMT1MgKi8KLSAgcHVibGljIGludCBtYXhOb25MT1NDb3B5Qnl0ZXMoKSB7IHJldHVybiBvcmcubW10ay51dGlsaXR5LkNvbnN0YW50cy5NQVhfSU5UO30KLQotICAvKiogQHJldHVybiBUcnVlIGlmIHRoaXMgb2JqZWN0IGZvcndhcmRzIG9iamVjdHMgPGk+YWZ0ZXI8L2k+Ci0gICAqIGRldGVybWluaW5nIGdsb2JhbCBvYmplY3QgbGl2ZW5lc3MgKGUuZy4gbWFueSBjb21wYWN0aW5nIGNvbGxlY3RvcnMpLiAqLwotICBwdWJsaWMgYm9vbGVhbiBuZWVkc0ZvcndhcmRBZnRlckxpdmVuZXNzKCkgeyByZXR1cm4gZmFsc2U7fQotCi0gIC8qKiBAcmV0dXJuIElzIHRoaXMgcGxhbiBnZW5lcmF0aW9uYWwgaW4gbmF0dXJlLiAqLwotICBwdWJsaWMgYm9vbGVhbiBnZW5lcmF0aW9uYWwoKSB7IHJldHVybiBmYWxzZTt9Ci0KLSAgLyoqIEByZXR1cm4gVGhlIG51bWJlciBvZiBoZWFkZXIgYml0cyB0aGF0IGFyZSByZXF1aXJlZC4gKi8KLSAgcHVibGljIGFic3RyYWN0IGludCBnY0hlYWRlckJpdHMoKTsKLQotICAvKiogQHJldHVybiBUaGUgbnVtYmVyIG9mIGhlYWRlciB3b3JkcyB0aGF0IGFyZSByZXF1aXJlZC4gKi8KLSAgcHVibGljIGFic3RyYWN0IGludCBnY0hlYWRlcldvcmRzKCk7Ci0KLSAgLyoqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHBsYW4gY29udGFpbnMgR0NzcHkuICovCi0gIHB1YmxpYyBib29sZWFuIHdpdGhHQ3NweSgpIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgLyoqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHBsYW4gY29udGFpbnMgR0NUcmFjZS4gKi8KLSAgcHVibGljIGJvb2xlYW4gZ2VuZXJhdGVHQ1RyYWNlKCkgeyByZXR1cm4gZmFsc2U7IH0KLQotICAvKiogQHJldHVybiBUaGUgc3BlY2lhbGl6ZWQgc2NhbiBtZXRob2RzIHJlcXVpcmVkICovCi0gIHB1YmxpYyBpbnQgbnVtU3BlY2lhbGl6ZWRTY2FucygpIHsgcmV0dXJuIDA7IH0KLQotICAvKiogQHJldHVybiBUcnVlIGlmIHRoaXMgcGxhbiByZXF1aXJlcyBjb25jdXJyZW50IHdvcmtlciB0aHJlYWRzICovCi0gIHB1YmxpYyBib29sZWFuIG5lZWRzQ29uY3VycmVudFdvcmtlcnMoKSB7IHJldHVybiBmYWxzZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIHJlcXVpcmVzIGEgaGVhZGVyIGJpdCBmb3Igb2JqZWN0IGxvZ2dpbmcgKi8KLSAgcHVibGljIGJvb2xlYW4gbmVlZHNMb2dCaXRJbkhlYWRlcigpIHsgcmV0dXJuIGZhbHNlOyB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vU2ltcGxlLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vU2ltcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MjQyMWUuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL1NpbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuOwotCi1pbXBvcnQgb3JnLm1tdGsucG9saWN5LlNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuTG9nOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkub3B0aW9ucy4qOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuc3RhdGlzdGljcy5UaW1lcjsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgaW1wbGVtZW50cyB0aGUgY29yZSBmdW5jdGlvbmFsaXR5IGZvcgotICogc2ltcGxlIGNvbGxlY3RvcnMuPHA+Ci0gKgotICogVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHBoYXNlcywgYW5kIHByb3ZpZGVzIGJhc2UKLSAqIGxldmVsIGltcGxlbWVudGF0aW9ucyBvZiB0aGVtLiAgU3ViY2xhc3NlcyBzaG91bGQgcHJvdmlkZQotICogaW1wbGVtZW50YXRpb25zIGZvciB0aGUgc3BhY2VzIHRoYXQgdGhleSBpbnRyb2R1Y2UsIGFuZAotICogZGVsZWdhdGUgdXAgdGhlIGNsYXNzIGhpZXJhcmNoeS48cD4KLSAqCi0gKiBGb3IgZGV0YWlscyBvZiB0aGUgc3BsaXQgYmV0d2VlbiBnbG9iYWwgYW5kIHRocmVhZC1sb2NhbCBvcGVyYXRpb25zCi0gKiBAc2VlIG9yZy5tbXRrLnBsYW4uUGxhbgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2ltcGxlIGV4dGVuZHMgUGxhbiBpbXBsZW1lbnRzIENvbnN0YW50cyB7Ci0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIENvbnN0YW50cwotICAgKi8KLQotICAvKiBTaGFyZWQgVGltZXJzICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFRpbWVyIHJlZlR5cGVUaW1lID0gbmV3IFRpbWVyKCJyZWZUeXBlIiwgZmFsc2UsIHRydWUpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUaW1lciBzY2FuVGltZSA9IG5ldyBUaW1lcigic2NhbiIsIGZhbHNlLCB0cnVlKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGltZXIgZmluYWxpemVUaW1lID0gbmV3IFRpbWVyKCJmaW5hbGl6ZSIsIGZhbHNlLCB0cnVlKTsKLQotICAvKiBQaGFzZXMgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBTRVRfQ09MTEVDVElPTl9LSU5EID0gUGhhc2UuY3JlYXRlU2ltcGxlKCJzZXQtY29sbGVjdGlvbi1raW5kIiwgbnVsbCk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgSU5JVElBVEUgICAgICAgICAgICA9IFBoYXNlLmNyZWF0ZVNpbXBsZSgiaW5pdGlhdGUiLCBudWxsKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBQUkVQQVJFICAgICAgICAgICAgID0gUGhhc2UuY3JlYXRlU2ltcGxlKCJwcmVwYXJlIik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgUFJFQ09QWSAgICAgICAgICAgICA9IFBoYXNlLmNyZWF0ZVNpbXBsZSgicHJlY29weSIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IFBSRVBBUkVfU1RBQ0tTICAgICAgPSBQaGFzZS5jcmVhdGVTaW1wbGUoInByZXBhcmUtc3RhY2tzIiwgbnVsbCk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgU1RBQ0tfUk9PVFMgICAgICAgICA9IFBoYXNlLmNyZWF0ZVNpbXBsZSgic3RhY2tzIik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgUk9PVFMgICAgICAgICAgICAgICA9IFBoYXNlLmNyZWF0ZVNpbXBsZSgicm9vdCIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IENMT1NVUkUgICAgICAgICAgICAgPSBQaGFzZS5jcmVhdGVTaW1wbGUoImNsb3N1cmUiLCBzY2FuVGltZSk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgU09GVF9SRUZTICAgICAgICAgICA9IFBoYXNlLmNyZWF0ZVNpbXBsZSgic29mdC1yZWYiLCByZWZUeXBlVGltZSk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgV0VBS19SRUZTICAgICAgICAgICA9IFBoYXNlLmNyZWF0ZVNpbXBsZSgid2Vhay1yZWYiLCByZWZUeXBlVGltZSk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgRklOQUxJWkFCTEUgICAgICAgICA9IFBoYXNlLmNyZWF0ZVNpbXBsZSgiZmluYWxpemUiLCBmaW5hbGl6ZVRpbWUpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IFdFQUtfVFJBQ0tfUkVGUyAgICAgPSBQaGFzZS5jcmVhdGVTaW1wbGUoIndlYWstdHJhY2stcmVmIiwgcmVmVHlwZVRpbWUpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IFBIQU5UT01fUkVGUyAgICAgICAgPSBQaGFzZS5jcmVhdGVTaW1wbGUoInBoYW50b20tcmVmIiwgcmVmVHlwZVRpbWUpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IEZPUldBUkQgICAgICAgICAgICAgPSBQaGFzZS5jcmVhdGVTaW1wbGUoImZvcndhcmQiKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBGT1JXQVJEX1JFRlMgICAgICAgID0gUGhhc2UuY3JlYXRlU2ltcGxlKCJmb3J3YXJkLXJlZiIsIHJlZlR5cGVUaW1lKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBGT1JXQVJEX0ZJTkFMSVpBQkxFID0gUGhhc2UuY3JlYXRlU2ltcGxlKCJmb3J3YXJkLWZpbmFsaXplIiwgZmluYWxpemVUaW1lKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBSRUxFQVNFICAgICAgICAgICAgID0gUGhhc2UuY3JlYXRlU2ltcGxlKCJyZWxlYXNlIik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgQ09NUExFVEUgICAgICAgICAgICA9IFBoYXNlLmNyZWF0ZVNpbXBsZSgiY29tcGxldGUiLCBudWxsKTsKLQotICAvKiBTYW5pdHkgcGxhY2Vob2xkZXIgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBQUkVfU0FOSVRZX1BMQUNFSE9MREVSICA9IFBoYXNlLmNyZWF0ZVNpbXBsZSgicHJlLXNhbml0eS1wbGFjZWhvbGRlciIsIG51bGwpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IFBPU1RfU0FOSVRZX1BMQUNFSE9MREVSID0gUGhhc2UuY3JlYXRlU2ltcGxlKCJwb3N0LXNhbml0eS1wbGFjZWhvbGRlciIsIG51bGwpOwotCi0gIC8qIFNhbml0eSBwaGFzZXMgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBTQU5JVFlfU0VUX1BSRUdDICAgID0gUGhhc2UuY3JlYXRlU2ltcGxlKCJzYW5pdHktc2V0cHJlIiwgbnVsbCk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgU0FOSVRZX1NFVF9QT1NUR0MgICA9IFBoYXNlLmNyZWF0ZVNpbXBsZSgic2FuaXR5LXNldHBvc3QiLCBudWxsKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBTQU5JVFlfUFJFUEFSRSAgICAgID0gUGhhc2UuY3JlYXRlU2ltcGxlKCJzYW5pdHktcHJlcGFyZSIsIG51bGwpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IFNBTklUWV9ST09UUyAgICAgICAgPSBQaGFzZS5jcmVhdGVTaW1wbGUoInNhbml0eS1yb290cyIsIG51bGwpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IFNBTklUWV9DT1BZX1JPT1RTICAgPSBQaGFzZS5jcmVhdGVTaW1wbGUoInNhbml0eS1jb3B5LXJvb3RzIiwgbnVsbCk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgU0FOSVRZX0JVSUxEX1RBQkxFICA9IFBoYXNlLmNyZWF0ZVNpbXBsZSgic2FuaXR5LWJ1aWxkLXRhYmxlIiwgbnVsbCk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgU0FOSVRZX0NIRUNLX1RBQkxFICA9IFBoYXNlLmNyZWF0ZVNpbXBsZSgic2FuaXR5LWNoZWNrLXRhYmxlIiwgbnVsbCk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgU0FOSVRZX1JFTEVBU0UgICAgICA9IFBoYXNlLmNyZWF0ZVNpbXBsZSgic2FuaXR5LXJlbGVhc2UiLCBudWxsKTsKLQotICAvLyBDSEVDS1NUWUxFOk9GRgotCi0gIC8qKiBFbnN1cmUgc3RhY2tzIGFyZSByZWFkeSB0byBiZSBzY2FubmVkICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgc2hvcnQgcHJlcGFyZVN0YWNrcyA9IFBoYXNlLmNyZWF0ZUNvbXBsZXgoInByZXBhcmUtc3RhY2tzIiwgbnVsbCwKLSAgICAgIFBoYXNlLnNjaGVkdWxlQ29sbGVjdG9yICAoUFJFUEFSRV9TVEFDS1MpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVNdXRhdG9yICAgIChQUkVQQVJFX1NUQUNLUyksCi0gICAgICBQaGFzZS5zY2hlZHVsZUdsb2JhbCAgICAgKFBSRVBBUkVfU1RBQ0tTKSk7Ci0KLSAgLyoqIFRyYWNlIGFuZCBzZXQgdXAgYSBzYW5pdHkgdGFibGUgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBzaG9ydCBzYW5pdHlCdWlsZFBoYXNlID0gUGhhc2UuY3JlYXRlQ29tcGxleCgic2FuaXR5LWJ1aWxkIiwgbnVsbCwKLSAgICAgIFBoYXNlLnNjaGVkdWxlR2xvYmFsICAgICAoU0FOSVRZX1BSRVBBUkUpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVDb2xsZWN0b3IgIChTQU5JVFlfUFJFUEFSRSksCi0gICAgICBQaGFzZS5zY2hlZHVsZUNvbXBsZXggICAgKHByZXBhcmVTdGFja3MpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVDb2xsZWN0b3IgIChTQU5JVFlfUk9PVFMpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVHbG9iYWwgICAgIChTQU5JVFlfUk9PVFMpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVDb2xsZWN0b3IgIChTQU5JVFlfQ09QWV9ST09UUyksCi0gICAgICBQaGFzZS5zY2hlZHVsZUdsb2JhbCAgICAgKFNBTklUWV9CVUlMRF9UQUJMRSkpOwotCi0gIC8qKiBWYWxpZGF0ZSBhIHNhbml0eSB0YWJsZSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIHNob3J0IHNhbml0eUNoZWNrUGhhc2UgPSBQaGFzZS5jcmVhdGVDb21wbGV4KCJzYW5pdHktY2hlY2siLCBudWxsLAotICAgICAgUGhhc2Uuc2NoZWR1bGVHbG9iYWwgICAgIChTQU5JVFlfQ0hFQ0tfVEFCTEUpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVDb2xsZWN0b3IgIChTQU5JVFlfUkVMRUFTRSksCi0gICAgICBQaGFzZS5zY2hlZHVsZUdsb2JhbCAgICAgKFNBTklUWV9SRUxFQVNFKSk7Ci0KLSAgLyoqIFN0YXJ0IHRoZSBjb2xsZWN0aW9uLCBpbmNsdWRpbmcgcHJlcGFyYXRpb24gZm9yIGFueSBjb2xsZWN0ZWQgc3BhY2VzLiAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIHNob3J0IGluaXRQaGFzZSA9IFBoYXNlLmNyZWF0ZUNvbXBsZXgoImluaXQiLAotICAgICAgUGhhc2Uuc2NoZWR1bGVHbG9iYWwgICAgIChTRVRfQ09MTEVDVElPTl9LSU5EKSwKLSAgICAgIFBoYXNlLnNjaGVkdWxlR2xvYmFsICAgICAoSU5JVElBVEUpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVQbGFjZWhvbGRlcihQUkVfU0FOSVRZX1BMQUNFSE9MREVSKSk7Ci0KLSAgLyoqCi0gICAqIFBlcmZvcm0gdGhlIGluaXRpYWwgZGV0ZXJtaW5hdGlvbiBvZiBsaXZlbmVzcyBmcm9tIHRoZSByb290cy4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgc2hvcnQgcm9vdENsb3N1cmVQaGFzZSA9IFBoYXNlLmNyZWF0ZUNvbXBsZXgoImluaXRpYWwtY2xvc3VyZSIsIG51bGwsCi0gICAgICBQaGFzZS5zY2hlZHVsZU11dGF0b3IgICAgKFBSRVBBUkUpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVHbG9iYWwgICAgIChQUkVQQVJFKSwKLSAgICAgIFBoYXNlLnNjaGVkdWxlQ29sbGVjdG9yICAoUFJFUEFSRSksCi0gICAgICBQaGFzZS5zY2hlZHVsZUNvbXBsZXggICAgKHByZXBhcmVTdGFja3MpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVDb2xsZWN0b3IgIChQUkVDT1BZKSwKLSAgICAgIFBoYXNlLnNjaGVkdWxlQ29sbGVjdG9yICAoU1RBQ0tfUk9PVFMpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVDb2xsZWN0b3IgIChST09UUyksCi0gICAgICBQaGFzZS5zY2hlZHVsZUdsb2JhbCAgICAgKFJPT1RTKSwKLSAgICAgIFBoYXNlLnNjaGVkdWxlR2xvYmFsICAgICAoQ0xPU1VSRSksCi0gICAgICBQaGFzZS5zY2hlZHVsZUNvbGxlY3RvciAgKENMT1NVUkUpKTsKLQotICAvKioKLSAgICogQ29tcGxldGUgY2xvc3VyZSBpbmNsdWRpbmcgcmVmZXJlbmNlIHR5cGVzIGFuZCBmaW5hbGl6YWJsZSBvYmplY3RzLgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBzaG9ydCByZWZUeXBlQ2xvc3VyZVBoYXNlID0gUGhhc2UuY3JlYXRlQ29tcGxleCgicmVmVHlwZS1jbG9zdXJlIiwgbnVsbCwKLSAgICAgIFBoYXNlLnNjaGVkdWxlQ29sbGVjdG9yICAoU09GVF9SRUZTKSwKLSAgICAgIFBoYXNlLnNjaGVkdWxlR2xvYmFsICAgICAoQ0xPU1VSRSksCi0gICAgICBQaGFzZS5zY2hlZHVsZUNvbGxlY3RvciAgKENMT1NVUkUpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVDb2xsZWN0b3IgIChXRUFLX1JFRlMpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVDb2xsZWN0b3IgIChGSU5BTElaQUJMRSksCi0gICAgICBQaGFzZS5zY2hlZHVsZUdsb2JhbCAgICAgKENMT1NVUkUpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVDb2xsZWN0b3IgIChDTE9TVVJFKSwKLSAgICAgIFBoYXNlLnNjaGVkdWxlUGxhY2Vob2xkZXIoV0VBS19UUkFDS19SRUZTKSwKLSAgICAgIFBoYXNlLnNjaGVkdWxlQ29sbGVjdG9yICAoUEhBTlRPTV9SRUZTKSk7Ci0KLSAgLyoqCi0gICAqIEVuc3VyZSB0aGF0IGFsbCByZWZlcmVuY2VzIGluIHRoZSBzeXN0ZW0gYXJlIGNvcnJlY3QuCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIHNob3J0IGZvcndhcmRQaGFzZSA9IFBoYXNlLmNyZWF0ZUNvbXBsZXgoImZvcndhcmQtYWxsIiwgbnVsbCwKLSAgICAgIC8qIEZpbmlzaCB1cCAqLwotICAgICAgUGhhc2Uuc2NoZWR1bGVQbGFjZWhvbGRlcihGT1JXQVJEKSwKLSAgICAgIFBoYXNlLnNjaGVkdWxlQ29sbGVjdG9yICAoRk9SV0FSRF9SRUZTKSwKLSAgICAgIFBoYXNlLnNjaGVkdWxlQ29sbGVjdG9yICAoRk9SV0FSRF9GSU5BTElaQUJMRSkpOwotCi0gIC8qKgotICAgKiBDb21wbGV0ZSBjbG9zdXJlIGluY2x1ZGluZyByZWZlcmVuY2UgdHlwZXMgYW5kIGZpbmFsaXphYmxlIG9iamVjdHMuCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIHNob3J0IGNvbXBsZXRlQ2xvc3VyZVBoYXNlID0gUGhhc2UuY3JlYXRlQ29tcGxleCgicmVsZWFzZSIsIG51bGwsCi0gICAgICBQaGFzZS5zY2hlZHVsZU11dGF0b3IgICAgKFJFTEVBU0UpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVDb2xsZWN0b3IgIChSRUxFQVNFKSwKLSAgICAgIFBoYXNlLnNjaGVkdWxlR2xvYmFsICAgICAoUkVMRUFTRSkpOwotCi0KLSAgLyoqCi0gICAqIFRoZSBjb2xsZWN0aW9uIHNjaGVtZSAtIHRoaXMgaXMgYSBzbWFsbCB0cmVlIG9mIGNvbXBsZXggcGhhc2VzLgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBzaG9ydCBmaW5pc2hQaGFzZSA9IFBoYXNlLmNyZWF0ZUNvbXBsZXgoImZpbmlzaCIsCi0gICAgICBQaGFzZS5zY2hlZHVsZVBsYWNlaG9sZGVyKFBPU1RfU0FOSVRZX1BMQUNFSE9MREVSKSwKLSAgICAgIFBoYXNlLnNjaGVkdWxlQ29sbGVjdG9yICAoQ09NUExFVEUpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVHbG9iYWwgICAgIChDT01QTEVURSkpOwotCi0gIC8qKgotICAgKiBUaGlzIGlzIHRoZSBwaGFzZSB0aGF0IGlzIGV4ZWN1dGVkIHRvIHBlcmZvcm0gYSBjb2xsZWN0aW9uLgotICAgKi8KLSAgcHVibGljIHNob3J0IGNvbGxlY3Rpb24gPSBQaGFzZS5jcmVhdGVDb21wbGV4KCJjb2xsZWN0aW9uIiwgbnVsbCwKLSAgICAgIFBoYXNlLnNjaGVkdWxlQ29tcGxleChpbml0UGhhc2UpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVDb21wbGV4KHJvb3RDbG9zdXJlUGhhc2UpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVDb21wbGV4KHJlZlR5cGVDbG9zdXJlUGhhc2UpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVDb21wbGV4KGZvcndhcmRQaGFzZSksCi0gICAgICBQaGFzZS5zY2hlZHVsZUNvbXBsZXgoY29tcGxldGVDbG9zdXJlUGhhc2UpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVDb21wbGV4KGZpbmlzaFBoYXNlKSk7Ci0KLSAgLy8gQ0hFQ0tTVFlMRTpPTgotCi0gIC8qKgotICAgKiBUaGUgY3VycmVudCBjb2xsZWN0aW9uIGF0dGVtcHQuCi0gICAqLwotICBwcm90ZWN0ZWQgaW50IGNvbGxlY3Rpb25BdHRlbXB0OwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIENvbGxlY3Rpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSAoZ2xvYmFsKSBjb2xsZWN0aW9uIHBoYXNlLgotICAgKgotICAgKiBAcGFyYW0gcGhhc2VJZCBUaGUgdW5pcXVlIG9mIHRoZSBwaGFzZSB0byBwZXJmb3JtLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgdm9pZCBjb2xsZWN0aW9uUGhhc2Uoc2hvcnQgcGhhc2VJZCkgewotICAgIGlmIChwaGFzZUlkID09IFNFVF9DT0xMRUNUSU9OX0tJTkQpIHsKLSAgICAgIHJlcXVpcmVkQXRTdGFydCA9IGdldFBhZ2VzUmVxdWlyZWQoKTsKLSAgICAgIGNvbGxlY3Rpb25BdHRlbXB0ID0gVk0uY29sbGVjdGlvbi5tYXhpbXVtQ29sbGVjdGlvbkF0dGVtcHQoKTsKLSAgICAgIGVtZXJnZW5jeUNvbGxlY3Rpb24gPSBsYXN0Q29sbGVjdGlvbldhc0V4aGF1c3RpdmUoKSAmJiBjb2xsZWN0aW9uQXR0ZW1wdCA+IDE7Ci0gICAgICBpZiAoY29sbGVjdGlvbkF0dGVtcHQgPiBNQVhfQ09MTEVDVElPTl9BVFRFTVBUUykgewotICAgICAgICBWTS5hc3NlcnRpb25zLmZhaWwoIlRvbyBtYW55IGNvbGxlY3Rpb24gYXR0ZW1wdHMuIFN1c3BlY3QgcGxhbiBpcyBub3Qgc2V0dGluZyBGdWxsSGVhcCBmbGFnIik7Ci0gICAgICB9Ci0gICAgICBpZiAoZW1lcmdlbmN5Q29sbGVjdGlvbikgewotICAgICAgICBpZiAoT3B0aW9ucy52ZXJib3NlLmdldFZhbHVlKCkgPj0gMSkgTG9nLndyaXRlKCJbRW1lcmdlbmN5XSIpOwotICAgICAgICBmb3JjZUZ1bGxIZWFwQ29sbGVjdGlvbigpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwaGFzZUlkID09IElOSVRJQVRFKSB7Ci0gICAgICBzZXRHQ1N0YXR1cyhHQ19QUkVQQVJFKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBQUkVQQVJFX1NUQUNLUykgewotICAgICAgc3RhY2tzUHJlcGFyZWQgPSB0cnVlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwaGFzZUlkID09IFBSRVBBUkUpIHsKLSAgICAgIGxvU3BhY2UucHJlcGFyZSh0cnVlKTsKLSAgICAgIG5vbk1vdmluZ1NwYWNlLnByZXBhcmUodHJ1ZSk7Ci0gICAgICBpZiAoVVNFX0NPREVfU1BBQ0UpIHsKLSAgICAgICAgc21hbGxDb2RlU3BhY2UucHJlcGFyZSh0cnVlKTsKLSAgICAgICAgbGFyZ2VDb2RlU3BhY2UucHJlcGFyZSh0cnVlKTsKLSAgICAgIH0KLSAgICAgIGltbW9ydGFsU3BhY2UucHJlcGFyZSgpOwotICAgICAgVk0ubWVtb3J5Lmdsb2JhbFByZXBhcmVWTVNwYWNlKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHBoYXNlSWQgPT0gUk9PVFMpIHsKLSAgICAgIFZNLnNjYW5uaW5nLnJlc2V0VGhyZWFkQ291bnRlcigpOwotICAgICAgc2V0R0NTdGF0dXMoR0NfUFJPUEVSKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBSRUxFQVNFKSB7Ci0gICAgICBsb1NwYWNlLnJlbGVhc2UodHJ1ZSk7Ci0gICAgICBub25Nb3ZpbmdTcGFjZS5yZWxlYXNlKCk7Ci0gICAgICBpZiAoVVNFX0NPREVfU1BBQ0UpIHsKLSAgICAgICAgc21hbGxDb2RlU3BhY2UucmVsZWFzZSgpOwotICAgICAgICBsYXJnZUNvZGVTcGFjZS5yZWxlYXNlKHRydWUpOwotICAgICAgfQotICAgICAgaW1tb3J0YWxTcGFjZS5yZWxlYXNlKCk7Ci0gICAgICBWTS5tZW1vcnkuZ2xvYmFsUmVsZWFzZVZNU3BhY2UoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBDT01QTEVURSkgewotICAgICAgc2V0R0NTdGF0dXMoTk9UX0lOX0dDKTsKLSAgICAgIFNwYWNlLmNsZWFyQWxsQWxsb2NhdGlvbkZhaWxlZCgpOwotICAgICAgYXdhaXRpbmdBc3luY0NvbGxlY3Rpb24gPSBmYWxzZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoT3B0aW9ucy5zYW5pdHlDaGVjay5nZXRWYWx1ZSgpICYmIHNhbml0eUNoZWNrZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQpKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTG9nLndyaXRlKCJHbG9iYWwgcGhhc2UgIik7IExvZy53cml0ZShQaGFzZS5nZXROYW1lKHBoYXNlSWQpKTsKLSAgICBMb2cud3JpdGVsbigiIG5vdCBoYW5kbGVkLiIpOwotICAgIFZNLmFzc2VydGlvbnMuZmFpbCgiR2xvYmFsIHBoYXNlIG5vdCBoYW5kbGVkISIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlcGxhY2UgYSBzY2hlZHVsZWQgcGhhc2UuIFVzZWQgZm9yIGV4YW1wbGUgdG8gcmVwbGFjZSBhIHBsYWNlaG9sZGVyLgotICAgKgotICAgKiBAcGFyYW0gb2xkU2NoZWR1bGVkUGhhc2UgVGhlIHNjaGVkdWxlZCBwaGFzZSB0byByZXBsYWNlLgotICAgKiBAcGFyYW0gbmV3U2NoZWR1bGVkUGhhc2UgVGhlIG5ldyBzY2hlZHVsZWQgcGhhc2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXBsYWNlUGhhc2UoaW50IG9sZFNjaGVkdWxlZFBoYXNlLCBpbnQgbmV3U2NoZWR1bGVkUGhhc2UpIHsKLSAgICBDb21wbGV4UGhhc2UgY3AgPSAoQ29tcGxleFBoYXNlKVBoYXNlLmdldFBoYXNlKGNvbGxlY3Rpb24pOwotICAgIGNwLnJlcGxhY2VQaGFzZShvbGRTY2hlZHVsZWRQaGFzZSwgbmV3U2NoZWR1bGVkUGhhc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlcGxhY2UgYSBwbGFjZWhvbGRlciBwaGFzZS4KLSAgICoKLSAgICogQHBhcmFtIHBsYWNlSG9sZGVyUGhhc2UgVGhlIHBsYWNlaG9sZGVyIHBoYXNlCi0gICAqIEBwYXJhbSBuZXdTY2hlZHVsZWRQaGFzZSBUaGUgbmV3IHNjaGVkdWxlZCBwaGFzZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcGxhY2VQbGFjZWhvbGRlclBoYXNlKHNob3J0IHBsYWNlSG9sZGVyUGhhc2UsIGludCBuZXdTY2hlZHVsZWRQaGFzZSkgewotICAgIENvbXBsZXhQaGFzZSBjcCA9IChDb21wbGV4UGhhc2UpUGhhc2UuZ2V0UGhhc2UoY29sbGVjdGlvbik7Ci0gICAgY3AucmVwbGFjZVBoYXNlKFBoYXNlLnNjaGVkdWxlUGxhY2Vob2xkZXIocGxhY2VIb2xkZXJQaGFzZSksIG5ld1NjaGVkdWxlZFBoYXNlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL1NpbXBsZUNvbGxlY3Rvci5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL1NpbXBsZUNvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzQ4ZGYyLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9TaW1wbGVDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbjsKLQotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuTG9nOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkub3B0aW9ucy5PcHRpb25zOwotCi1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIChhbmQgaXRzIHN1Yi1jbGFzc2VzKSBpbXBsZW1lbnQgPGk+cGVyLWNvbGxlY3RvciB0aHJlYWQ8L2k+Ci0gKiBiZWhhdmlvciBhbmQgc3RhdGUuCi0gKgotICogTU1UayBhc3N1bWVzIHRoYXQgdGhlIFZNIGluc3RhbnRpYXRlcyBpbnN0YW5jZXMgb2YgQ29sbGVjdG9yQ29udGV4dAotICogaW4gdGhyZWFkIGxvY2FsIHN0b3JhZ2UgKFRMUykgZm9yIGVhY2ggdGhyZWFkIHBhcnRpY2lwYXRpbmcgaW4KLSAqIGNvbGxlY3Rpb24uICBBY2Nlc3NlcyB0byB0aGlzIHN0YXRlIGFyZSB0aGVyZWZvcmUgYXNzdW1lZCB0byBiZQotICogbG93LWNvc3QgZHVyaW5nIG11dGF0b3IgdGltZS48cD4KLSAqCi0gKiBAc2VlIENvbGxlY3RvckNvbnRleHQKLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGFic3RyYWN0IGNsYXNzIFNpbXBsZUNvbGxlY3RvciBleHRlbmRzIENvbGxlY3RvckNvbnRleHQgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIEluc3RhbmNlIGZpZWxkcwotICAgKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDb2xsZWN0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBQZXJmb3JtIGEgcGVyLWNvbGxlY3RvciBjb2xsZWN0aW9uIHBoYXNlLgotICAgKgotICAgKiBAcGFyYW0gcGhhc2VJZCBUaGUgdW5pcXVlIHBoYXNlIGlkZW50aWZpZXIKLSAgICogQHBhcmFtIHByaW1hcnkgU2hvdWxkIHRoaXMgdGhyZWFkIGJlIHVzZWQgdG8gZXhlY3V0ZSBhbnkgc2luZ2xlLXRocmVhZGVkCi0gICAqIGxvY2FsIG9wZXJhdGlvbnM/Ci0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyB2b2lkIGNvbGxlY3Rpb25QaGFzZShzaG9ydCBwaGFzZUlkLCBib29sZWFuIHByaW1hcnkpIHsKLSAgICBpZiAocGhhc2VJZCA9PSBTaW1wbGUuUFJFUEFSRV9TVEFDS1MpIHsKLSAgICAgIGlmICghUGxhbi5zdGFja3NQcmVwYXJlZCgpKSB7Ci0gICAgICAgIFZNLmNvbGxlY3Rpb24ucHJlcGFyZUNvbGxlY3Rvcih0aGlzKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBTaW1wbGUuUFJFUEFSRSkgewotICAgICAgLy8gTm90aGluZyB0byBkbwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwaGFzZUlkID09IFNpbXBsZS5QUkVDT1BZKSB7Ci0gICAgICBpZiAoVk0uYWN0aXZlUGxhbi5jb25zdHJhaW50cygpLm1vdmVzT2JqZWN0cygpKSB7Ci0gICAgICAgIFZNLnNjYW5uaW5nLnByZUNvcHlHQ0luc3RhbmNlcyhnZXRDdXJyZW50VHJhY2UoKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHBoYXNlSWQgPT0gU2ltcGxlLlNUQUNLX1JPT1RTKSB7Ci0gICAgICBWTS5zY2FubmluZy5jb21wdXRlVGhyZWFkUm9vdHMoZ2V0Q3VycmVudFRyYWNlKCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwaGFzZUlkID09IFNpbXBsZS5ST09UUykgewotICAgICAgVk0uc2Nhbm5pbmcuY29tcHV0ZUdsb2JhbFJvb3RzKGdldEN1cnJlbnRUcmFjZSgpKTsKLSAgICAgIFZNLnNjYW5uaW5nLmNvbXB1dGVTdGF0aWNSb290cyhnZXRDdXJyZW50VHJhY2UoKSk7Ci0gICAgICBpZiAoUGxhbi5TQ0FOX0JPT1RfSU1BR0UpIHsKLSAgICAgICAgVk0uc2Nhbm5pbmcuY29tcHV0ZUJvb3RJbWFnZVJvb3RzKGdldEN1cnJlbnRUcmFjZSgpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBTaW1wbGUuU09GVF9SRUZTKSB7Ci0gICAgICBpZiAocHJpbWFyeSkgewotICAgICAgICBpZiAoT3B0aW9ucy5ub1JlZmVyZW5jZVR5cGVzLmdldFZhbHVlKCkpCi0gICAgICAgICAgVk0uc29mdFJlZmVyZW5jZXMuY2xlYXIoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIFZNLnNvZnRSZWZlcmVuY2VzLnNjYW4oZ2V0Q3VycmVudFRyYWNlKCksZ2xvYmFsKCkuaXNDdXJyZW50R0NOdXJzZXJ5KCkpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwaGFzZUlkID09IFNpbXBsZS5XRUFLX1JFRlMpIHsKLSAgICAgIGlmIChwcmltYXJ5KSB7Ci0gICAgICAgIGlmIChPcHRpb25zLm5vUmVmZXJlbmNlVHlwZXMuZ2V0VmFsdWUoKSkKLSAgICAgICAgICBWTS53ZWFrUmVmZXJlbmNlcy5jbGVhcigpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgVk0ud2Vha1JlZmVyZW5jZXMuc2NhbihnZXRDdXJyZW50VHJhY2UoKSxnbG9iYWwoKS5pc0N1cnJlbnRHQ051cnNlcnkoKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHBoYXNlSWQgPT0gU2ltcGxlLkZJTkFMSVpBQkxFKSB7Ci0gICAgICBpZiAocHJpbWFyeSkgewotICAgICAgICBpZiAoT3B0aW9ucy5ub0ZpbmFsaXplci5nZXRWYWx1ZSgpKQotICAgICAgICAgIFZNLmZpbmFsaXphYmxlUHJvY2Vzc29yLmNsZWFyKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBWTS5maW5hbGl6YWJsZVByb2Nlc3Nvci5zY2FuKGdldEN1cnJlbnRUcmFjZSgpLGdsb2JhbCgpLmlzQ3VycmVudEdDTnVyc2VyeSgpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBTaW1wbGUuUEhBTlRPTV9SRUZTKSB7Ci0gICAgICBpZiAocHJpbWFyeSkgewotICAgICAgICBpZiAoT3B0aW9ucy5ub1JlZmVyZW5jZVR5cGVzLmdldFZhbHVlKCkpCi0gICAgICAgICAgVk0ucGhhbnRvbVJlZmVyZW5jZXMuY2xlYXIoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIFZNLnBoYW50b21SZWZlcmVuY2VzLnNjYW4oZ2V0Q3VycmVudFRyYWNlKCksZ2xvYmFsKCkuaXNDdXJyZW50R0NOdXJzZXJ5KCkpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwaGFzZUlkID09IFNpbXBsZS5GT1JXQVJEX1JFRlMpIHsKLSAgICAgIGlmIChwcmltYXJ5ICYmICFPcHRpb25zLm5vUmVmZXJlbmNlVHlwZXMuZ2V0VmFsdWUoKSAmJgotICAgICAgICAgIFZNLmFjdGl2ZVBsYW4uY29uc3RyYWludHMoKS5uZWVkc0ZvcndhcmRBZnRlckxpdmVuZXNzKCkpIHsKLSAgICAgICAgVk0uc29mdFJlZmVyZW5jZXMuZm9yd2FyZChnZXRDdXJyZW50VHJhY2UoKSxnbG9iYWwoKS5pc0N1cnJlbnRHQ051cnNlcnkoKSk7Ci0gICAgICAgIFZNLndlYWtSZWZlcmVuY2VzLmZvcndhcmQoZ2V0Q3VycmVudFRyYWNlKCksZ2xvYmFsKCkuaXNDdXJyZW50R0NOdXJzZXJ5KCkpOwotICAgICAgICBWTS5waGFudG9tUmVmZXJlbmNlcy5mb3J3YXJkKGdldEN1cnJlbnRUcmFjZSgpLGdsb2JhbCgpLmlzQ3VycmVudEdDTnVyc2VyeSgpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBTaW1wbGUuRk9SV0FSRF9GSU5BTElaQUJMRSkgewotICAgICAgaWYgKHByaW1hcnkgJiYgIU9wdGlvbnMubm9GaW5hbGl6ZXIuZ2V0VmFsdWUoKSAmJgotICAgICAgICAgIFZNLmFjdGl2ZVBsYW4uY29uc3RyYWludHMoKS5uZWVkc0ZvcndhcmRBZnRlckxpdmVuZXNzKCkpIHsKLSAgICAgICAgVk0uZmluYWxpemFibGVQcm9jZXNzb3IuZm9yd2FyZChnZXRDdXJyZW50VHJhY2UoKSxnbG9iYWwoKS5pc0N1cnJlbnRHQ051cnNlcnkoKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHBoYXNlSWQgPT0gU2ltcGxlLkNPTVBMRVRFKSB7Ci0gICAgICAvLyBOb3RoaW5nIHRvIGRvCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHBoYXNlSWQgPT0gU2ltcGxlLlJFTEVBU0UpIHsKLSAgICAgIC8vIE5vdGhpbmcgdG8gZG8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoT3B0aW9ucy5zYW5pdHlDaGVjay5nZXRWYWx1ZSgpICYmIHNhbml0eUxvY2FsLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIExvZy53cml0ZSgiUGVyLWNvbGxlY3RvciBwaGFzZSAiKTsgTG9nLndyaXRlKFBoYXNlLmdldE5hbWUocGhhc2VJZCkpOwotICAgIExvZy53cml0ZWxuKCIgbm90IGhhbmRsZWQuIik7Ci0gICAgVk0uYXNzZXJ0aW9ucy5mYWlsKCJQZXItY29sbGVjdG9yIHBoYXNlIG5vdCBoYW5kbGVkISIpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogTWlzY2VsbGFuZW91cy4KLSAgICovCi0KLSAgLyoqIEByZXR1cm4gVGhlIGFjdGl2ZSBnbG9iYWwgcGxhbiBhcyBhIDxjb2RlPlNpbXBsZTwvY29kZT4gaW5zdGFuY2UuICovCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSBzdGF0aWMgU2ltcGxlIGdsb2JhbCgpIHsKLSAgICByZXR1cm4gKFNpbXBsZSkgVk0uYWN0aXZlUGxhbi5nbG9iYWwoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL1NpbXBsZUNvbnN0cmFpbnRzLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vU2ltcGxlQ29uc3RyYWludHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA5NjE5Zi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vU2ltcGxlQ29uc3RyYWludHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogQ29uc3RyYWludHMgc3BlY2lmaWMgdG8gc2ltcGxlIGNvbGxlY3RvcnMuCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTaW1wbGVDb25zdHJhaW50cyBleHRlbmRzIFBsYW5Db25zdHJhaW50cyB7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vU2ltcGxlTXV0YXRvci5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL1NpbXBsZU11dGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgxNTZmYy4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vU2ltcGxlTXV0YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW47Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkxvZzsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgKGFuZCBpdHMgc3ViLWNsYXNzZXMpIGltcGxlbWVudCA8aT5wZXItbXV0YXRvciB0aHJlYWQ8L2k+Ci0gKiBiZWhhdmlvciBhbmQgc3RhdGUuCi0gKgotICogTU1UayBhc3N1bWVzIHRoYXQgdGhlIFZNIGluc3RhbnRpYXRlcyBpbnN0YW5jZXMgb2YgTXV0YXRvckNvbnRleHQKLSAqIGluIHRocmVhZCBsb2NhbCBzdG9yYWdlIChUTFMpIGZvciBlYWNoIGFwcGxpY2F0aW9uIHRocmVhZC4gQWNjZXNzZXMKLSAqIHRvIHRoaXMgc3RhdGUgYXJlIHRoZXJlZm9yZSBhc3N1bWVkIHRvIGJlIGxvdy1jb3N0IGR1cmluZyBtdXRhdG9yCi0gKiB0aW1lLjxwPgotICoKLSAqIEBzZWUgTXV0YXRvckNvbnRleHQKLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGFic3RyYWN0IGNsYXNzIFNpbXBsZU11dGF0b3IgZXh0ZW5kcyBNdXRhdG9yQ29udGV4dCB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQ29sbGVjdGlvbi4KLSAgICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSBwZXItbXV0YXRvciBjb2xsZWN0aW9uIHBoYXNlLiAgIFRoaXMgaXMgZXhlY3V0ZWQgYnkKLSAgICogb25lIGNvbGxlY3RvciB0aHJlYWQgb24gYmVoYWxmIG9mIGEgbXV0YXRvciB0aHJlYWQuCi0gICAqCi0gICAqIEBwYXJhbSBwaGFzZUlkIFRoZSB1bmlxdWUgcGhhc2UgaWRlbnRpZmllcgotICAgKiBAcGFyYW0gcHJpbWFyeSBTaG91bGQgdGhpcyB0aHJlYWQgYmUgdXNlZCB0byBleGVjdXRlIGFueSBzaW5nbGUtdGhyZWFkZWQKLSAgICogbG9jYWwgb3BlcmF0aW9ucz8KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHZvaWQgY29sbGVjdGlvblBoYXNlKHNob3J0IHBoYXNlSWQsIGJvb2xlYW4gcHJpbWFyeSkgewotICAgIGlmIChwaGFzZUlkID09IFNpbXBsZS5QUkVQQVJFX1NUQUNLUykgewotICAgICAgaWYgKCFQbGFuLnN0YWNrc1ByZXBhcmVkKCkpIHsKLSAgICAgICAgVk0uY29sbGVjdGlvbi5wcmVwYXJlTXV0YXRvcih0aGlzKTsKLSAgICAgIH0KLSAgICAgIGZsdXNoUmVtZW1iZXJlZFNldHMoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBTaW1wbGUuUFJFUEFSRSkgewotICAgICAgbG9zLnByZXBhcmUodHJ1ZSk7Ci0gICAgICBsZ2NvZGUucHJlcGFyZSh0cnVlKTsKLSAgICAgIHNtY29kZS5wcmVwYXJlKCk7Ci0gICAgICBub25tb3ZlLnByZXBhcmUoKTsKLSAgICAgIFZNLm1lbW9yeS5jb2xsZWN0b3JQcmVwYXJlVk1TcGFjZSgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwaGFzZUlkID09IFNpbXBsZS5SRUxFQVNFKSB7Ci0gICAgICBsb3MucmVsZWFzZSh0cnVlKTsKLSAgICAgIGxnY29kZS5yZWxlYXNlKHRydWUpOwotICAgICAgc21jb2RlLnJlbGVhc2UoKTsKLSAgICAgIG5vbm1vdmUucmVsZWFzZSgpOwotICAgICAgVk0ubWVtb3J5LmNvbGxlY3RvclJlbGVhc2VWTVNwYWNlKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTG9nLndyaXRlKCJQZXItbXV0YXRvciBwaGFzZSBcIiIpOyBQaGFzZS5nZXRQaGFzZShwaGFzZUlkKS5sb2dQaGFzZSgpOwotICAgIExvZy53cml0ZWxuKCJcIiBub3QgaGFuZGxlZC4iKTsKLSAgICBWTS5hc3NlcnRpb25zLmZhaWwoIlBlci1tdXRhdG9yIHBoYXNlIG5vdCBoYW5kbGVkISIpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vU2ltcGxlUGhhc2UuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9TaW1wbGVQaGFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmE4OTk0Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9TaW1wbGVQaGFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW47Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkNvbnN0YW50czsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LnN0YXRpc3RpY3MuVGltZXI7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Mb2c7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBQaGFzZXMgb2YgYSBnYXJiYWdlIGNvbGxlY3Rpb24uCi0gKgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgZmluYWwgY2xhc3MgU2ltcGxlUGhhc2UgZXh0ZW5kcyBQaGFzZQotICBpbXBsZW1lbnRzIENvbnN0YW50cyB7Ci0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIEluc3RhbmNlIGZpZWxkcwotICAgKi8KLQotICAvKioKLSAgICogQ29uc3RydWN0IGEgcGhhc2UgZ2l2ZW4ganVzdCBhIG5hbWUgYW5kIGEgZ2xvYmFsL2xvY2FsIG9yZGVyaW5nCi0gICAqIHNjaGVtZS4KLSAgICoKLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHBoYXNlCi0gICAqLwotICBwcm90ZWN0ZWQgU2ltcGxlUGhhc2UoU3RyaW5nIG5hbWUpIHsKLSAgICBzdXBlcihuYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYSBwaGFzZSwgcmUtdXNpbmcgYSBzcGVjaWZpZWQgdGltZXIuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIERpc3BsYXkgbmFtZSBvZiB0aGUgcGhhc2UKLSAgICogQHBhcmFtIHRpbWVyIFRpbWVyIGZvciB0aGlzIHBoYXNlIHRvIGNvbnRyaWJ1dGUgdG8KLSAgICovCi0gIHByb3RlY3RlZCBTaW1wbGVQaGFzZShTdHJpbmcgbmFtZSwgVGltZXIgdGltZXIpIHsKLSAgICBzdXBlcihuYW1lLCB0aW1lcik7Ci0gIH0KLQotICAvKioKLSAgICogRGlzcGxheSBhIHBoYXNlIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBsb2dQaGFzZSgpIHsKLSAgICBMb2cud3JpdGUoIlNpbXBsZVBoYXNlKCIpOwotICAgIExvZy53cml0ZShuYW1lKTsKLSAgICBMb2cud3JpdGUoIikiKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL1N0b3BUaGVXb3JsZC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL1N0b3BUaGVXb3JsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODk3NDRlLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9TdG9wVGhlV29ybGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuOwotCi1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Mb2c7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5vcHRpb25zLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpbXBsZW1lbnRzIHRoZSBjb3JlIGZ1bmN0aW9uYWxpdHkgZm9yCi0gKiBzdG9wLXRoZS13b3JsZCBjb2xsZWN0b3JzLiAgU3RvcC10aGUtd29ybGQgY29sbGVjdG9ycyBzaG91bGQKLSAqIGluaGVyaXQgZnJvbSB0aGlzIGNsYXNzLjxwPgotICoKLSAqIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgY29sbGVjdGlvbiBwaGFzZXMsIGFuZCBwcm92aWRlcyBiYXNlCi0gKiBsZXZlbCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlbS4gIFN1YmNsYXNzZXMgc2hvdWxkIHByb3ZpZGUKLSAqIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIHNwYWNlcyB0aGF0IHRoZXkgaW50cm9kdWNlLCBhbmQKLSAqIGRlbGVnYXRlIHVwIHRoZSBjbGFzcyBoaWVyYXJjaHkuPHA+Ci0gKgotICogRm9yIGRldGFpbHMgb2YgdGhlIHNwbGl0IGJldHdlZW4gZ2xvYmFsIGFuZCB0aHJlYWQtbG9jYWwgb3BlcmF0aW9ucwotICogQHNlZSBvcmcubW10ay5wbGFuLlBsYW4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGFic3RyYWN0IGNsYXNzIFN0b3BUaGVXb3JsZCBleHRlbmRzIFNpbXBsZSB7Ci0KLSAgLy8gQ0hFQ0tTVFlMRTpPRkYKLQotICAvKiogQnVpbGQgYW5kIHZhbGlkYXRlIGEgc2FuaXR5IHRhYmxlICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgc2hvcnQgcHJlU2FuaXR5UGhhc2UgPSBQaGFzZS5jcmVhdGVDb21wbGV4KCJwcmUtc2FuaXR5IiwgbnVsbCwKLSAgICAgIFBoYXNlLnNjaGVkdWxlR2xvYmFsICAgICAoU0FOSVRZX1NFVF9QUkVHQyksCi0gICAgICBQaGFzZS5zY2hlZHVsZUNvbXBsZXggICAgKHNhbml0eUJ1aWxkUGhhc2UpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVDb21wbGV4ICAgIChzYW5pdHlDaGVja1BoYXNlKSk7Ci0KLSAgLyoqIEJ1aWxkIGFuZCB2YWxpZGF0ZSBhIHNhbml0eSB0YWJsZSAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIHNob3J0IHBvc3RTYW5pdHlQaGFzZSA9IFBoYXNlLmNyZWF0ZUNvbXBsZXgoInBvc3Qtc2FuaXR5IiwgbnVsbCwKLSAgICAgIFBoYXNlLnNjaGVkdWxlR2xvYmFsICAgICAoU0FOSVRZX1NFVF9QT1NUR0MpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVDb21wbGV4ICAgIChzYW5pdHlCdWlsZFBoYXNlKSwKLSAgICAgIFBoYXNlLnNjaGVkdWxlQ29tcGxleCAgICAoc2FuaXR5Q2hlY2tQaGFzZSkpOwotCi0gIC8vIENIRUNLU1RZTEU6T04KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBDb2xsZWN0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBUaGUgYm9vdCBtZXRob2QgaXMgY2FsbGVkIGVhcmx5IGluIHRoZSBib290IHByb2Nlc3MgYmVmb3JlIGFueQotICAgKiBhbGxvY2F0aW9uLgotICAgKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHVibGljIHZvaWQgcG9zdEJvb3QoKSB7Ci0gICAgc3VwZXIucG9zdEJvb3QoKTsKLQotICAgIGlmIChPcHRpb25zLnNhbml0eUNoZWNrLmdldFZhbHVlKCkpIHsKLSAgICAgIExvZy53cml0ZWxuKCJDb2xsZWN0aW9uIHNhbml0eSBjaGVja2luZyBlbmFibGVkLiIpOwotICAgICAgcmVwbGFjZVBoYXNlKFBoYXNlLnNjaGVkdWxlUGxhY2Vob2xkZXIoUFJFX1NBTklUWV9QTEFDRUhPTERFUiksICBQaGFzZS5zY2hlZHVsZUNvbXBsZXgocHJlU2FuaXR5UGhhc2UpKTsKLSAgICAgIHJlcGxhY2VQaGFzZShQaGFzZS5zY2hlZHVsZVBsYWNlaG9sZGVyKFBPU1RfU0FOSVRZX1BMQUNFSE9MREVSKSwgUGhhc2Uuc2NoZWR1bGVDb21wbGV4KHBvc3RTYW5pdHlQaGFzZSkpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL1N0b3BUaGVXb3JsZENvbGxlY3Rvci5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL1N0b3BUaGVXb3JsZENvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmVkYzBhLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9TdG9wVGhlV29ybGRDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuOwotCi1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyAoYW5kIGl0cyBzdWItY2xhc3NlcykgaW1wbGVtZW50IDxpPnBlci1jb2xsZWN0b3IgdGhyZWFkPC9pPgotICogYmVoYXZpb3IgYW5kIHN0YXRlLgotICoKLSAqIE1NVGsgYXNzdW1lcyB0aGF0IHRoZSBWTSBpbnN0YW50aWF0ZXMgaW5zdGFuY2VzIG9mIENvbGxlY3RvckNvbnRleHQKLSAqIGluIHRocmVhZCBsb2NhbCBzdG9yYWdlIChUTFMpIGZvciBlYWNoIHRocmVhZCBwYXJ0aWNpcGF0aW5nIGluCi0gKiBjb2xsZWN0aW9uLiAgQWNjZXNzZXMgdG8gdGhpcyBzdGF0ZSBhcmUgdGhlcmVmb3JlIGFzc3VtZWQgdG8gYmUKLSAqIGxvdy1jb3N0IGR1cmluZyBtdXRhdG9yIHRpbWUuPHA+Ci0gKgotICogQHNlZSBDb2xsZWN0b3JDb250ZXh0Ci0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdG9wVGhlV29ybGRDb2xsZWN0b3IgZXh0ZW5kcyBTaW1wbGVDb2xsZWN0b3IgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbGxlY3Rpb24uCi0gICAqLwotCi0gIC8qKiBQZXJmb3JtIGdhcmJhZ2UgY29sbGVjdGlvbiAqLwotICBwdWJsaWMgdm9pZCBjb2xsZWN0KCkgewotICAgIFBoYXNlLmJlZ2luTmV3UGhhc2VTdGFjayhQaGFzZS5zY2hlZHVsZUNvbXBsZXgoZ2xvYmFsKCkuY29sbGVjdGlvbikpOwotICB9Ci0KLSAgLyoqIFBlcmZvcm0gc29tZSBjb25jdXJyZW50IGdhcmJhZ2UgY29sbGVjdGlvbiAqLwotICBwdWJsaWMgZmluYWwgdm9pZCBjb25jdXJyZW50Q29sbGVjdCgpIHsKLSAgICBWTS5hc3NlcnRpb25zLmZhaWwoImNvbmN1cnJlbnRDb2xsZWN0IGNhbGxlZCBvbiBTdG9wVGhlV29ybGQgY29sbGVjdG9yIik7Ci0gIH0KLQotICAvKioKLSAgICogUGVyZm9ybSBzb21lIGNvbmN1cnJlbnQgY29sbGVjdGlvbiB3b3JrLgotICAgKgotICAgKiBAcGFyYW0gcGhhc2VJZCBUaGUgdW5pcXVlIHBoYXNlIGlkZW50aWZpZXIKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNvbmN1cnJlbnRDb2xsZWN0aW9uUGhhc2Uoc2hvcnQgcGhhc2VJZCkgewotICAgIFZNLmFzc2VydGlvbnMuZmFpbCgiY29uY3VycmVudENvbGxlY3Rpb25QaGFzZSB0cmlnZ2VyZWQgb24gU3RvcFRoZVdvcmxkIGNvbGxlY3RvciIpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogTWlzY2VsbGFuZW91cy4KLSAgICovCi0KLSAgLyoqIEByZXR1cm4gVGhlIGFjdGl2ZSBnbG9iYWwgcGxhbiBhcyBhIDxjb2RlPlN0b3BUaGVXb3JsZDwvY29kZT4gaW5zdGFuY2UuICovCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSBzdGF0aWMgU3RvcFRoZVdvcmxkIGdsb2JhbCgpIHsKLSAgICByZXR1cm4gKFN0b3BUaGVXb3JsZCkgVk0uYWN0aXZlUGxhbi5nbG9iYWwoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL1N0b3BUaGVXb3JsZENvbnN0cmFpbnRzLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vU3RvcFRoZVdvcmxkQ29uc3RyYWludHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIxYWVmMy4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vU3RvcFRoZVdvcmxkQ29uc3RyYWludHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogQ29uc3RyYWludHMgc3BlY2lmaWMgdG8gU3RvcC10aGUtd29ybGQgY29sbGVjdG9ycy4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGFic3RyYWN0IGNsYXNzIFN0b3BUaGVXb3JsZENvbnN0cmFpbnRzIGV4dGVuZHMgU2ltcGxlQ29uc3RyYWludHMgewotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL1N0b3BUaGVXb3JsZE11dGF0b3IuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9TdG9wVGhlV29ybGRNdXRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MGRhMTIuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL1N0b3BUaGVXb3JsZE11dGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyAoYW5kIGl0cyBzdWItY2xhc3NlcykgaW1wbGVtZW50IDxpPnBlci1tdXRhdG9yIHRocmVhZDwvaT4KLSAqIGJlaGF2aW9yIGFuZCBzdGF0ZS4KLSAqCi0gKiBNTVRrIGFzc3VtZXMgdGhhdCB0aGUgVk0gaW5zdGFudGlhdGVzIGluc3RhbmNlcyBvZiBNdXRhdG9yQ29udGV4dAotICogaW4gdGhyZWFkIGxvY2FsIHN0b3JhZ2UgKFRMUykgZm9yIGVhY2ggYXBwbGljYXRpb24gdGhyZWFkLiBBY2Nlc3NlcwotICogdG8gdGhpcyBzdGF0ZSBhcmUgdGhlcmVmb3JlIGFzc3VtZWQgdG8gYmUgbG93LWNvc3QgZHVyaW5nIG11dGF0b3IKLSAqIHRpbWUuPHA+Ci0gKgotICogQHNlZSBNdXRhdG9yQ29udGV4dAotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RvcFRoZVdvcmxkTXV0YXRvciBleHRlbmRzIFNpbXBsZU11dGF0b3IgewotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL1RyYWNlLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vVHJhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzczNjkxZi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vVHJhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuOwotCi1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5kZXF1ZS5TaGFyZWREZXF1ZTsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuUmF3UGFnZVNwYWNlOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpbXBsZW1lbnRzIHRoZSBjb3JlIGZ1bmN0aW9uYWxpdHkgZm9yIGEgdHJhbnNpdGl2ZQotICogY2xvc3VyZSBvdmVyIHRoZSBoZWFwLiAgVGhpcyBjbGFzcyBob2xkcyB0aGUgZ2xvYmFsIHN0YXRlLCBUcmFjZUxvY2FsCi0gKiBhbmQgaXRzIHN1cGVyLWNsYXNzZXMgaGFuZGxlIHBlci10aHJlYWQgc3RhdGUuCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBjbGFzcyBUcmFjZSBpbXBsZW1lbnRzIENvbnN0YW50cyB7Ci0KLSAgLy8gR2xvYmFsIHBvb2xzIGZvciBsb2FkLWJhbGFuY2luZyBkZXF1ZXMKLSAgZmluYWwgU2hhcmVkRGVxdWUgdmFsdWVQb29sOwotICBmaW5hbCBTaGFyZWREZXF1ZSByb290TG9jYXRpb25Qb29sOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIFRyYWNlKFJhd1BhZ2VTcGFjZSBtZXRhRGF0YVNwYWNlKSB7Ci0gICAgdmFsdWVQb29sID0gbmV3IFNoYXJlZERlcXVlKCJ2YWx1ZVBvb2wiLG1ldGFEYXRhU3BhY2UsIDEpOwotICAgIHJvb3RMb2NhdGlvblBvb2wgPSBuZXcgU2hhcmVkRGVxdWUoInJvb3RMb2NhdGlvbnMiLCBtZXRhRGF0YVNwYWNlLCAxKTsKLSAgfQotCi0gIC8qKgotICAgKiBQcmVwYXJlIGZvciBhIG5ldyBjb2xsZWN0aW9uIHBhc3MuCi0gICAqLwotICBwdWJsaWMgdm9pZCBwcmVwYXJlTm9uQmxvY2tpbmcoKSB7Ci0gICAgdmFsdWVQb29sLnByZXBhcmVOb25CbG9ja2luZygpOwotICAgIHJvb3RMb2NhdGlvblBvb2wucHJlcGFyZU5vbkJsb2NraW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogUHJlcGFyZSBmb3IgYSBuZXcgY29sbGVjdGlvbiBwYXNzLgotICAgKiBBbGwgYWN0aXZlIEdDIHRocmVhZHMgdGFrZSBwYXJ0LgotICAgKi8KLSAgcHVibGljIHZvaWQgcHJlcGFyZSgpIHsKLSAgICB2YWx1ZVBvb2wucHJlcGFyZSgpOwotICAgIHJvb3RMb2NhdGlvblBvb2wucHJlcGFyZU5vbkJsb2NraW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmVsZWFzZSByZXNvdXJjZXMgYWZ0ZXIgY29tcGxldGluZyBhIGNvbGxlY3Rpb24gcGFzcy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0gICAgdmFsdWVQb29sLnJlc2V0KCk7Ci0gICAgcm9vdExvY2F0aW9uUG9vbC5yZXNldCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIElzIHRoZXJlIGFueSB3b3JrIG91dHN0YW5kaW5nIGluIHRoaXMgdHJhY2UuIFRoYXQgaXMgYXJlIHRoZXJlIGFueSBwYWdlcyBpbiB0aGUgcG9vbHMuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNXb3JrKCkgewotICAgIHJldHVybiAodmFsdWVQb29sLmVucXVldWVkUGFnZXMoKSArIHJvb3RMb2NhdGlvblBvb2wuZW5xdWV1ZWRQYWdlcygpKSA+IDA7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9UcmFjZUxvY2FsLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vVHJhY2VMb2NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjFjNDE5Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9UcmFjZUxvY2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzEgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW47Ci0KLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Mb2c7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5kZXF1ZS4qOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkub3B0aW9ucy5PcHRpb25zOwotCi1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBhbmQgaXRzIGdsb2JhbCBjb3VudGVycGFydCBpbXBsZW1lbnQgdGhlIGNvcmUKLSAqIGZ1bmN0aW9uYWxpdHkgZm9yIGEgdHJhbnNpdGl2ZSBjbG9zdXJlIG92ZXIgdGhlIGhlYXAgZ3JhcGguIFRoaXMgY2xhc3MKLSAqIHNwZWNpZmljYWxseSBpbXBsZW1lbnRzIHRoZSB1bnN5bmNocm9uaXplZCB0aHJlYWQtbG9jYWwgY29tcG9uZW50Ci0gKiAoaWUgdGhlICdmYXN0IHBhdGgnKSBvZiB0aGUgdHJhY2UgbWVjaGFuaXNtLjxwPgotICoKLSAqIEBzZWUgb3JnLm1tdGsucGxhbi5QbGFuCi0gKiBAc2VlIG9yZy5tbXRrLnBsYW4uVHJhY2UKLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGFic3RyYWN0IGNsYXNzIFRyYWNlTG9jYWwgZXh0ZW5kcyBUcmFuc2l0aXZlQ2xvc3VyZSBpbXBsZW1lbnRzIENvbnN0YW50cyB7Ci0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluc3RhbmNlIHZhcmlhYmxlcwotICAgKi8KLSAgLyogZ3JheSBvYmplY3QgKi8KLSAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdFJlZmVyZW5jZURlcXVlIHZhbHVlczsKLSAgLyogZGVsYXllZCByb290IHNsb3RzICovCi0gIHByb3RlY3RlZCBmaW5hbCBBZGRyZXNzRGVxdWUgcm9vdExvY2F0aW9uczsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbml0aWFsaXphdGlvbgotICAgKi8KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIHRyYWNlIFRoZSBnbG9iYWwgdHJhY2UgY2xhc3MgdG8gdXNlLgotICAgKi8KLSAgcHVibGljIFRyYWNlTG9jYWwoVHJhY2UgdHJhY2UpIHsKLSAgICB0aGlzKC0xLCB0cmFjZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIHNwZWNpYWxpemVkU2NhbiBUaGUgc3BlY2lhbGl6ZWQgc2NhbiBpZC4KLSAgICogQHBhcmFtIHRyYWNlIFRoZSBnbG9iYWwgdHJhY2UgY2xhc3MgdG8gdXNlLgotICAgKi8KLSAgcHVibGljIFRyYWNlTG9jYWwoaW50IHNwZWNpYWxpemVkU2NhbiwgVHJhY2UgdHJhY2UpIHsKLSAgICBzdXBlcihzcGVjaWFsaXplZFNjYW4pOwotICAgIHZhbHVlcyA9IG5ldyBPYmplY3RSZWZlcmVuY2VEZXF1ZSgidmFsdWUiLCB0cmFjZS52YWx1ZVBvb2wpOwotICAgIHJvb3RMb2NhdGlvbnMgPSBuZXcgQWRkcmVzc0RlcXVlKCJyb290cyIsIHRyYWNlLnJvb3RMb2NhdGlvblBvb2wpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW50ZXJuYWxseSB2aXNpYmxlIE9iamVjdCBwcm9jZXNzaW5nIGFuZCB0cmFjaW5nCi0gICAqLwotCi0gIC8qKgotICAgKiBUcmFjZSBhIHJlZmVyZW5jZSBkdXJpbmcgR0MuICBUaGlzIGludm9sdmVzIGRldGVybWluaW5nIHdoaWNoCi0gICAqIGNvbGxlY3Rpb24gcG9saWN5IGFwcGxpZXMgYW5kIGNhbGxpbmcgdGhlIGFwcHJvcHJpYXRlCi0gICAqIDxjb2RlPnRyYWNlPC9jb2RlPiBtZXRob2QuCi0gICAqCi0gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvZiB0aGUgcmVmZXJlbmNlLgotICAgKiBAcGFyYW0gc2xvdCBUaGUgbG9jYXRpb24gY29udGFpbmluZyB0aGUgb2JqZWN0IHJlZmVyZW5jZSB0byBiZQotICAgKiAgICAgICAgdHJhY2VkLiAgVGhlIG9iamVjdCByZWZlcmVuY2UgaXMgPGk+Tk9UPC9pPiBhbiBpbnRlcmlvciBwb2ludGVyLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgdm9pZCBwcm9jZXNzRWRnZShPYmplY3RSZWZlcmVuY2Ugc291cmNlLCBBZGRyZXNzIHNsb3QpIHsKLSAgICBPYmplY3RSZWZlcmVuY2Ugb2JqZWN0ID0gVk0uYWN0aXZlUGxhbi5nbG9iYWwoKS5sb2FkT2JqZWN0UmVmZXJlbmNlKHNsb3QpOwotICAgIE9iamVjdFJlZmVyZW5jZSBuZXdPYmplY3QgPSB0cmFjZU9iamVjdChvYmplY3QsIGZhbHNlKTsKLSAgICBWTS5hY3RpdmVQbGFuLmdsb2JhbCgpLnN0b3JlT2JqZWN0UmVmZXJlbmNlKHNsb3QsIG5ld09iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogUmVwb3J0IGEgcm9vdCBlZGdlIHRvIGJlIHByb2Nlc3NlZCBkdXJpbmcgR0MuIEFzIHRoZSBnaXZlbiByZWZlcmVuY2UKLSAgICogbWF5IHRoZW9yZXRpY2FsbHkgcG9pbnQgdG8gYW4gb2JqZWN0IHJlcXVpcmVkIGR1cmluZyByb290IHNjYW5uaW5nLAotICAgKiB0aGUgY2FsbGVyIGhhcyByZXF1ZXN0ZWQgcHJvY2Vzc2luZyBiZSBkZWxheWVkLgotICAgKgotICAgKiBOT1RFOiBkZWxheWVkIHJvb3RzIGFyZSBhc3N1bWVkIHRvIGJlIHJhdy4KLSAgICoKLSAgICogQHBhcmFtIHNsb3QgVGhlIGxvY2F0aW9uIGNvbnRhaW5pbmcgdGhlIG9iamVjdCByZWZlcmVuY2UgdG8gYmUKLSAgICogdHJhY2VkLiAgVGhlIG9iamVjdCByZWZlcmVuY2UgaXMgPGk+Tk9UPC9pPiBhbiBpbnRlcmlvciBwb2ludGVyLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgdm9pZCByZXBvcnREZWxheWVkUm9vdEVkZ2UoQWRkcmVzcyBzbG90KSB7Ci0gICAgcm9vdExvY2F0aW9ucy5wdXNoKHNsb3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRyYWNlIGEgcmVmZXJlbmNlIGR1cmluZyBHQy4gIFRoaXMgaW52b2x2ZXMgZGV0ZXJtaW5pbmcgd2hpY2gKLSAgICogY29sbGVjdGlvbiBwb2xpY3kgYXBwbGllcyBhbmQgY2FsbGluZyB0aGUgYXBwcm9wcmlhdGUKLSAgICogPGNvZGU+dHJhY2U8L2NvZGU+IG1ldGhvZC4KLSAgICoKLSAgICogQHBhcmFtIHNsb3QgVGhlIGxvY2F0aW9uIGNvbnRhaW5pbmcgdGhlIG9iamVjdCByZWZlcmVuY2UgdG8gYmUKLSAgICogdHJhY2VkLiAgVGhlIG9iamVjdCByZWZlcmVuY2UgaXMgPGk+Tk9UPC9pPiBhbiBpbnRlcmlvciBwb2ludGVyLgotICAgKiBAcGFyYW0gdW50cmFjZWQgVHJ1ZSBpZiA8Y29kZT5vYmpMb2M8L2NvZGU+IGlzIGFuIHVudHJhY2VkIHJvb3QuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHByb2Nlc3NSb290RWRnZShBZGRyZXNzIHNsb3QsIGJvb2xlYW4gdW50cmFjZWQpIHsKLSAgICBPYmplY3RSZWZlcmVuY2Ugb2JqZWN0OwotICAgIGlmICh1bnRyYWNlZCkgb2JqZWN0ID0gc2xvdC5sb2FkT2JqZWN0UmVmZXJlbmNlKCk7Ci0gICAgZWxzZSAgICAgb2JqZWN0ID0gVk0uYWN0aXZlUGxhbi5nbG9iYWwoKS5sb2FkT2JqZWN0UmVmZXJlbmNlKHNsb3QpOwotICAgIE9iamVjdFJlZmVyZW5jZSBuZXdPYmplY3QgPSB0cmFjZU9iamVjdChvYmplY3QsIHRydWUpOwotICAgIGlmICh1bnRyYWNlZCkgc2xvdC5zdG9yZShuZXdPYmplY3QpOwotICAgIGVsc2UgICAgIFZNLmFjdGl2ZVBsYW4uZ2xvYmFsKCkuc3RvcmVPYmplY3RSZWZlcmVuY2Uoc2xvdCwgbmV3T2JqZWN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBUcmFjZSBhIHJlZmVyZW5jZSBkdXJpbmcgR0MuICBUaGlzIGludm9sdmVzIGRldGVybWluaW5nIHdoaWNoCi0gICAqIGNvbGxlY3Rpb24gcG9saWN5IGFwcGxpZXMgYW5kIGNhbGxpbmcgdGhlIGFwcHJvcHJpYXRlCi0gICAqIDxjb2RlPnRyYWNlPC9jb2RlPiBtZXRob2QuCi0gICAqCi0gICAqIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB0aGUgaW50ZXJpb3IgZWRnZSBwb2ludHMgd2l0aGluLgotICAgKiBAcGFyYW0gc2xvdCBUaGUgbG9jYXRpb24gb2YgdGhlIGludGVyaW9yIGVkZ2UuCi0gICAqIEBwYXJhbSByb290IFRydWUgaWYgdGhpcyBpcyBhIHJvb3QgZWRnZS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHByb2Nlc3NJbnRlcmlvckVkZ2UoT2JqZWN0UmVmZXJlbmNlIHRhcmdldCwgQWRkcmVzcyBzbG90LCBib29sZWFuIHJvb3QpIHsKLSAgICBBZGRyZXNzIGludGVyaW9yUmVmID0gc2xvdC5sb2FkQWRkcmVzcygpOwotICAgIE9mZnNldCBvZmZzZXQgPSBpbnRlcmlvclJlZi5kaWZmKHRhcmdldC50b0FkZHJlc3MoKSk7Ci0gICAgT2JqZWN0UmVmZXJlbmNlIG5ld1RhcmdldCA9IHRyYWNlT2JqZWN0KHRhcmdldCwgcm9vdCk7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSB7Ci0gICAgICBpZiAob2Zmc2V0LnNMVChPZmZzZXQuemVybygpKSB8fCBvZmZzZXQuc0dUKE9mZnNldC5mcm9tSW50U2lnbkV4dGVuZCgxPDwyNCkpKSB7Ci0gICAgICAgIC8vIFRoZXJlIGlzIHByb2JhYmx5IG5vIG9iamVjdCB0aGlzIGxhcmdlCi0gICAgICAgIExvZy53cml0ZWxuKCJFUlJPUjogU3VzcGljaW91c2x5IGxhcmdlIGRlbHRhIHRvIGludGVyaW9yIHBvaW50ZXIiKTsKLSAgICAgICAgTG9nLndyaXRlKCIgICAgICAgb2JqZWN0IGJhc2UgPSAiKTsgTG9nLndyaXRlbG4odGFyZ2V0KTsKLSAgICAgICAgTG9nLndyaXRlKCIgICAgICAgaW50ZXJpb3IgcmVmZXJlbmNlID0gIik7IExvZy53cml0ZWxuKGludGVyaW9yUmVmKTsKLSAgICAgICAgTG9nLndyaXRlKCIgICAgICAgZGVsdGEgPSAiKTsgTG9nLndyaXRlbG4ob2Zmc2V0KTsKLSAgICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGZhbHNlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc2xvdC5zdG9yZShuZXdUYXJnZXQudG9BZGRyZXNzKCkucGx1cyhvZmZzZXQpKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb2xsZWN0b3JzIHRoYXQgbW92ZSBvYmplY3RzIDxiPm11c3Q8L2I+IG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotICAgKiBJdCBwZXJmb3JtcyB0aGUgZGVmZXJyZWQgc2Nhbm5pbmcgb2Ygb2JqZWN0cyB3aGljaCBhcmUgZm9yd2FyZGVkCi0gICAqIGR1cmluZyBib290c3RyYXAgb2YgZWFjaCBjb3B5aW5nIGNvbGxlY3Rpb24uICBCZWNhdXNlIG9mIHRoZQotICAgKiBjb21wbGV4aXRpZXMgb2YgdGhlIGNvbGxlY3Rpb24gYm9vdHN0cmFwIChzdWNoIG9iamVjdHMgYXJlCi0gICAqIGdlbmVyYWxseSB0aGVtc2VsdmVzIGdjLWNyaXRpY2FsKSwgdGhlIGZvcndhcmRpbmcgYW5kIHNjYW5uaW5nIG9mCi0gICAqIHRoZSBvYmplY3RzIG11c3QgYmUgZGlzbG9jYXRlZC4gIEl0IGlzIGFuIGVycm9yIGZvciBhIG5vbi1tb3ZpbmcKLSAgICogY29sbGVjdG9yIHRvIGNhbGwgdGhpcyBtZXRob2QuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIGZvcndhcmRlZCBvYmplY3QgdG8gYmUgc2Nhbm5lZAotICAgKi8KLSAgQElubGluZQotICBwcm90ZWN0ZWQgdm9pZCBzY2FuT2JqZWN0KE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAoc3BlY2lhbGl6ZWRTY2FuID49IDApIHsKLSAgICAgIFZNLnNjYW5uaW5nLnNwZWNpYWxpemVkU2Nhbk9iamVjdChzcGVjaWFsaXplZFNjYW4sIHRoaXMsIG9iamVjdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFZNLnNjYW5uaW5nLnNjYW5PYmplY3QodGhpcywgb2JqZWN0KTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEV4dGVybmFsbHkgdmlzaWJsZSBPYmplY3QgcHJvY2Vzc2luZyBhbmQgdHJhY2luZwotICAgKi8KLQotICAvKioKLSAgICogQWRkIGEgZ3JheSBvYmplY3QKLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIGVucXVldWVkCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHByb2Nlc3NOb2RlKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICB2YWx1ZXMucHVzaChvYmplY3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZsdXNoIHRoZSBsb2NhbCBidWZmZXJzIG9mIGFsbCBkZXF1ZXMuCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCBmbHVzaCgpIHsKLSAgICB2YWx1ZXMuZmx1c2hMb2NhbCgpOwotICAgIHJvb3RMb2NhdGlvbnMuZmx1c2hMb2NhbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIElzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGxpdmU/Ci0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdC4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBvYmplY3QgaXMgbGl2ZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGJvb2xlYW4gaXNMaXZlKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBTcGFjZSBzcGFjZSA9IFNwYWNlLmdldFNwYWNlRm9yT2JqZWN0KG9iamVjdCk7Ci0gICAgaWYgKHNwYWNlID09IFBsYW4ubG9TcGFjZSkKLSAgICAgIHJldHVybiBQbGFuLmxvU3BhY2UuaXNMaXZlKG9iamVjdCk7Ci0gICAgZWxzZSBpZiAoc3BhY2UgPT0gUGxhbi5ub25Nb3ZpbmdTcGFjZSkKLSAgICAgIHJldHVybiBQbGFuLm5vbk1vdmluZ1NwYWNlLmlzTGl2ZShvYmplY3QpOwotICAgIGVsc2UgaWYgKFBsYW4uVVNFX0NPREVfU1BBQ0UgJiYgc3BhY2UgPT0gUGxhbi5zbWFsbENvZGVTcGFjZSkKLSAgICAgIHJldHVybiBQbGFuLnNtYWxsQ29kZVNwYWNlLmlzTGl2ZShvYmplY3QpOwotICAgIGVsc2UgaWYgKFBsYW4uVVNFX0NPREVfU1BBQ0UgJiYgc3BhY2UgPT0gUGxhbi5sYXJnZUNvZGVTcGFjZSkKLSAgICAgIHJldHVybiBQbGFuLmxhcmdlQ29kZVNwYWNlLmlzTGl2ZShvYmplY3QpOwotICAgIGVsc2UgaWYgKHNwYWNlID09IG51bGwpIHsKLSAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgewotICAgICAgICBMb2cud3JpdGUoInNwYWNlIGZhaWx1cmU6ICIpOyBMb2cud3JpdGVsbihvYmplY3QpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBJcyB0aGUgc3BlY2lmaWVkIG9iamVjdCByZWFjaGFibGU/IFVzZWQgZm9yIEdDIFRyYWNlCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdC4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBvYmplY3QgaXMgbGl2ZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGJvb2xlYW4gaXNSZWFjaGFibGUoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIHJldHVybiBTcGFjZS5nZXRTcGFjZUZvck9iamVjdChvYmplY3QpLmlzUmVhY2hhYmxlKG9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogSXMgdGhlIHNwZWNpZmllZCByZWZlcmVudCBvZiBhIHJlZmVyZW5jZSB0eXBlIG9iamVjdCBsaXZlPwotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcmVmZXJlbmNlIG9iamVjdCBpcyBsaXZlLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgYm9vbGVhbiBpc1JlZmVyZW50TGl2ZShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgcmV0dXJuIGlzTGl2ZShvYmplY3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIHRoZSBjb3JlIG1ldGhvZCBkdXJpbmcgdGhlIHRyYWNlIG9mIHRoZSBvYmplY3QgZ3JhcGguCi0gICAqIFRoZSByb2xlIG9mIHRoaXMgbWV0aG9kIGlzIHRvOgotICAgKgotICAgKiAxLiBFbnN1cmUgdGhlIHRyYWNlZCBvYmplY3QgaXMgbm90IGNvbGxlY3RlZC4KLSAgICogMi4gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdmlzaXQgdG8gdGhlIG9iamVjdCBlbnF1ZXVlIGl0IHRvIGJlIHNjYW5uZWQuCi0gICAqIDMuIFJldHVybiB0aGUgZm9yd2FyZGVkIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgdHJhY2VkLgotICAgKiBAcmV0dXJuIFRoZSBuZXcgcmVmZXJlbmNlIHRvIHRoZSBzYW1lIG9iamVjdCBpbnN0YW5jZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIE9iamVjdFJlZmVyZW5jZSB0cmFjZU9iamVjdChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKFNwYWNlLmlzSW5TcGFjZShQbGFuLlZNX1NQQUNFLCBvYmplY3QpKQotICAgICAgcmV0dXJuIChQbGFuLlNDQU5fQk9PVF9JTUFHRSkgPyBvYmplY3QgOiBQbGFuLnZtU3BhY2UudHJhY2VPYmplY3QodGhpcywgb2JqZWN0KTsKLSAgICBpZiAoU3BhY2UuaXNJblNwYWNlKFBsYW4uSU1NT1JUQUwsIG9iamVjdCkpCi0gICAgICByZXR1cm4gUGxhbi5pbW1vcnRhbFNwYWNlLnRyYWNlT2JqZWN0KHRoaXMsIG9iamVjdCk7Ci0gICAgaWYgKFNwYWNlLmlzSW5TcGFjZShQbGFuLkxPUywgb2JqZWN0KSkKLSAgICAgIHJldHVybiBQbGFuLmxvU3BhY2UudHJhY2VPYmplY3QodGhpcywgb2JqZWN0KTsKLSAgICBpZiAoU3BhY2UuaXNJblNwYWNlKFBsYW4uTk9OX01PVklORywgb2JqZWN0KSkKLSAgICAgIHJldHVybiBQbGFuLm5vbk1vdmluZ1NwYWNlLnRyYWNlT2JqZWN0KHRoaXMsIG9iamVjdCk7Ci0gICAgaWYgKFBsYW4uVVNFX0NPREVfU1BBQ0UgJiYgU3BhY2UuaXNJblNwYWNlKFBsYW4uU01BTExfQ09ERSwgb2JqZWN0KSkKLSAgICAgIHJldHVybiBQbGFuLnNtYWxsQ29kZVNwYWNlLnRyYWNlT2JqZWN0KHRoaXMsIG9iamVjdCk7Ci0gICAgaWYgKFBsYW4uVVNFX0NPREVfU1BBQ0UgJiYgU3BhY2UuaXNJblNwYWNlKFBsYW4uTEFSR0VfQ09ERSwgb2JqZWN0KSkKLSAgICAgIHJldHVybiBQbGFuLmxhcmdlQ29kZVNwYWNlLnRyYWNlT2JqZWN0KHRoaXMsIG9iamVjdCk7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSB7Ci0gICAgICBMb2cud3JpdGUoIkZhaWxpbmcgb2JqZWN0ID0+ICIpOyBMb2cud3JpdGVsbihvYmplY3QpOwotICAgICAgU3BhY2UucHJpbnRWTU1hcCgpOwotICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGZhbHNlLCAiTm8gc3BlY2lhbCBjYXNlIGZvciBzcGFjZSBpbiB0cmFjZU9iamVjdCIpOwotICAgIH0KLSAgICByZXR1cm4gT2JqZWN0UmVmZXJlbmNlLm51bGxSZWZlcmVuY2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEVuc3VyZSB0aGF0IHRoaXMgb2JqZWN0IHdpbGwgbm90IG1vdmUgZm9yIHRoZSByZXN0IG9mIHRoZSBHQy4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRoYXQgbXVzdCBub3QgbW92ZQotICAgKiBAcmV0dXJuIFRoZSBuZXcgb2JqZWN0LCBndWFyYW50ZWVkIHN0YWJsZSBmb3IgdGhlIHJlc3Qgb2YgdGhlIEdDLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlIHByZWNvcHlPYmplY3QoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIHJldHVybiB0cmFjZU9iamVjdChvYmplY3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHRyYWNlcyBhbiBvYmplY3Qgd2l0aCBrbm93bGVkZ2Ugb2YgdGhlIGZhY3QgdGhhdCBvYmplY3QKLSAgICogaXMgYSByb290IG9yIG5vdC4gSW4gc2ltcGxlIGNvbGxlY3RvcnMgdGhlIGZhY3QgaXQgaXMgYSByb290IGlzIG5vdAotICAgKiBpbXBvcnRhbnQgc28gdGhpcyBpcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBnaXZlbiBoZXJlLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgdHJhY2VkLgotICAgKiBAcmV0dXJuIFRoZSBuZXcgcmVmZXJlbmNlIHRvIHRoZSBzYW1lIG9iamVjdCBpbnN0YW5jZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIE9iamVjdFJlZmVyZW5jZSB0cmFjZU9iamVjdChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0LCBib29sZWFuIHJvb3QpIHsKLSAgICByZXR1cm4gdHJhY2VPYmplY3Qob2JqZWN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBFbnN1cmUgdGhhdCB0aGUgcmVmZXJlbmNlZCBvYmplY3Qgd2lsbCBub3QgbW92ZSBmcm9tIHRoaXMgcG9pbnQgdGhyb3VnaAotICAgKiB0byB0aGUgZW5kIG9mIHRoZSBjb2xsZWN0aW9uLiBUaGlzIGNhbiBpbnZvbHZlIGZvcndhcmRpbmcgdGhlIG9iamVjdAotICAgKiBpZiBuZWNlc3NhcnkuCi0gICAqCi0gICAqIDxpPk5vbi1jb3B5aW5nIGNvbGxlY3RvcnMgZG8gbm90aGluZywgY29weWluZyBjb2xsZWN0b3JzIG11c3QKLSAgICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4gZWFjaCBvZiB0aGVpciB0cmFjZSBjbGFzc2VzLjwvaT4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRoYXQgbXVzdCBub3QgbW92ZSBkdXJpbmcgdGhlIGNvbGxlY3Rpb24uCi0gICAqIEByZXR1cm4gVHJ1ZSBJZiB0aGUgb2JqZWN0IHdpbGwgbm90IG1vdmUgZHVyaW5nIGNvbGxlY3Rpb24KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHdpbGxOb3RNb3ZlSW5DdXJyZW50Q29sbGVjdGlvbihPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKCFWTS5hY3RpdmVQbGFuLmNvbnN0cmFpbnRzKCkubW92ZXNPYmplY3RzKCkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoU3BhY2UuaXNJblNwYWNlKFBsYW4uTE9TLCBvYmplY3QpKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgaWYgKFNwYWNlLmlzSW5TcGFjZShQbGFuLklNTU9SVEFMLCBvYmplY3QpKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgaWYgKFNwYWNlLmlzSW5TcGFjZShQbGFuLlZNX1NQQUNFLCBvYmplY3QpKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgaWYgKFNwYWNlLmlzSW5TcGFjZShQbGFuLk5PTl9NT1ZJTkcsIG9iamVjdCkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoUGxhbi5VU0VfQ09ERV9TUEFDRSAmJiBTcGFjZS5pc0luU3BhY2UoUGxhbi5TTUFMTF9DT0RFLCBvYmplY3QpKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgaWYgKFBsYW4uVVNFX0NPREVfU1BBQ0UgJiYgU3BhY2UuaXNJblNwYWNlKFBsYW4uTEFSR0VfQ09ERSwgb2JqZWN0KSkKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykKLSAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChmYWxzZSwgIndpbGxOb3RNb3ZlIG5vdCBkZWZpbmVkIHByb3Blcmx5IGluIHN1YmNsYXNzIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIGEgRmluYWxpemFibGUgb2JqZWN0IGhhcyBtb3ZlZCwgcmV0dXJuIHRoZSBuZXcgbG9jYXRpb24uCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB3aGljaCBtYXkgaGF2ZSBiZWVuIGZvcndhcmRlZC4KLSAgICogQHJldHVybiBUaGUgbmV3IGxvY2F0aW9uIG9mIDxjb2RlPm9iamVjdDwvY29kZT4uCi0gICAqLwotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlIGdldEZvcndhcmRlZEZpbmFsaXphYmxlKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICByZXR1cm4gZ2V0Rm9yd2FyZGVkUmVmZXJlbmNlKG9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhlIHJlZmVyZW5jZSBvYmplY3QgKGZyb20gYSBSZWZlcmVuY2UgVHlwZSkgaGFzIG9iamVjdCBoYXMgbW92ZWQsCi0gICAqIHJldHVybiB0aGUgbmV3IGxvY2F0aW9uLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3Qgd2hpY2ggbWF5IGhhdmUgYmVlbiBmb3J3YXJkZWQuCi0gICAqIEByZXR1cm4gVGhlIG5ldyBsb2NhdGlvbiBvZiA8Y29kZT5vYmplY3Q8L2NvZGU+LgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlIGdldEZvcndhcmRlZFJlZmVyZW50KE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICByZXR1cm4gZ2V0Rm9yd2FyZGVkUmVmZXJlbmNlKG9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhlIFJlZmVyZW5jZSBUeXBlIG9iamVjdCBoYXMgbW92ZWQsIHJldHVybiB0aGUgbmV3IGxvY2F0aW9uLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3Qgd2hpY2ggbWF5IGhhdmUgYmVlbiBmb3J3YXJkZWQuCi0gICAqIEByZXR1cm4gVGhlIG5ldyBsb2NhdGlvbiBvZiA8Y29kZT5vYmplY3Q8L2NvZGU+LgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlIGdldEZvcndhcmRlZFJlZmVyZW5jZVR5cGUoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIHJldHVybiBnZXRGb3J3YXJkZWRSZWZlcmVuY2Uob2JqZWN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGUgcmVmZXJlbmNlZCBvYmplY3QgaGFzIG1vdmVkLCByZXR1cm4gdGhlIG5ldyBsb2NhdGlvbi4KLSAgICoKLSAgICogU29tZSBjb3B5aW5nIGNvbGxlY3RvcnMgd2lsbCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3Qgd2hpY2ggbWF5IGhhdmUgYmVlbiBmb3J3YXJkZWQuCi0gICAqIEByZXR1cm4gVGhlIG5ldyBsb2NhdGlvbiBvZiA8Y29kZT5vYmplY3Q8L2NvZGU+LgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlIGdldEZvcndhcmRlZFJlZmVyZW5jZShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgcmV0dXJuIHRyYWNlT2JqZWN0KG9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogTWFrZSBhbGl2ZSBhIHJlZmVyZW50IG9iamVjdCB0aGF0IGlzIGtub3duIG5vdCB0byBiZSBsaXZlCi0gICAqIChpc0xpdmUgaXMgZmFsc2UpLiBUaGlzIGlzIHVzZWQgYnkgdGhlIFJlZmVyZW5jZVByb2Nlc3Nvci4KLSAgICoKLSAgICogPGk+Rm9yIG1hbnkgY29sbGVjdG9ycyB0aGVzZSBzZW1hbnRpY3MgcmVsZmVjdCB0aG9zZSBvZgotICAgKiA8Y29kZT50cmFjZU9iamVjdDwvY29kZT4sIHdoaWNoIGlzIGltcGxlbWVudGVkIGhlcmUuICBPdGhlcgotICAgKiBjb2xsZWN0b3JzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QuPC9pPgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3Qgd2hpY2ggaXMgdG8gYmUgbWFkZSBhbGl2ZS4KLSAgICogQHJldHVybiBUaGUgcG9zc2libHkgZm9yd2FyZGVkIGFkZHJlc3Mgb2YgdGhlIG9iamVjdC4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIE9iamVjdFJlZmVyZW5jZSByZXRhaW5SZWZlcmVudChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgcmV0dXJuIHRyYWNlT2JqZWN0KG9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogQW4gb2JqZWN0IGlzIHVucmVhY2hhYmxlIGFuZCBpcyBhYm91dCB0byBiZSBhZGRlZCB0byB0aGUKLSAgICogZmluYWxpemFibGUgcXVldWUuICBUaGUgY29sbGVjdG9yIG11c3QgZW5zdXJlIHRoZSBvYmplY3QgaXMgbm90Ci0gICAqIGNvbGxlY3RlZCAoZGVzcGl0ZSBiZWluZyBvdGhlcndpc2UgdW5yZWFjaGFibGUpLCBhbmQgc2hvdWxkCi0gICAqIHJldHVybiBpdHMgZm9yd2FyZGVkIGFkZHJlc3MgaWYga2VlcGluZyB0aGUgb2JqZWN0IGFsaXZlIGludm9sdmVzCi0gICAqIGZvcndhcmRpbmcuIFRoaXMgaXMgb25seSBldmVyIGNhbGxlZCBvbmNlIGZvciBhbiBvYmplY3QuPHA+Ci0gICAqCi0gICAqIDxpPkZvciBtYW55IGNvbGxlY3RvcnMgdGhlc2Ugc2VtYW50aWNzIHJlbGZlY3QgdGhvc2Ugb2YKLSAgICogPGNvZGU+dHJhY2VPYmplY3Q8L2NvZGU+LCB3aGljaCBpcyBpbXBsZW1lbnRlZCBoZXJlLiAgT3RoZXIKLSAgICogY29sbGVjdG9ycyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kLjwvaT4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHdoaWNoIG1heSBoYXZlIGJlZW4gZm9yd2FyZGVkLgotICAgKiBAcmV0dXJuIFRoZSBmb3J3YXJkZWQgdmFsdWUgZm9yIDxjb2RlPm9iamVjdDwvY29kZT4uICA8aT5JbiB0aGlzCi0gICAqIGNhc2UgcmV0dXJuIDxjb2RlPm9iamVjdDwvY29kZT4sIGNvcHlpbmcgY29sbGVjdG9ycyBtdXN0IG92ZXJyaWRlCi0gICAqICAgICAgICAgdGhpcyBtZXRob2QuCi0gICAqLwotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlIHJldGFpbkZvckZpbmFsaXplKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICByZXR1cm4gdHJhY2VPYmplY3Qob2JqZWN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdHJ1ZSBpZiBhbiBvYmplY3QgaXMgcmVhZHkgdG8gbW92ZSB0byB0aGUgZmluYWxpemFibGUKLSAgICogcXVldWUsIGkuZS4gaXQgaGFzIG5vIHJlZ3VsYXIgcmVmZXJlbmNlcyB0byBpdC4gIFRoaXMgbWV0aG9kIG1heQotICAgKiAoYW5kIGluIHNvbWUgY2FzZXMgaXMpIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4gSWYgdGhpcyBtZXRob2QKLSAgICogcmV0dXJucyB0cnVlIHRoZW4gaXQgY2FuIGJlIGFzc3VtZWQgdGhhdCByZXRhaW5Gb3JGaW5hbGl6ZSB3aWxsIGJlCi0gICAqIGNhbGxlZCBkdXJpbmcgdGhlIGN1cnJlbnQgY29sbGVjdGlvbi4KLSAgICoKLSAgICogPGk+Rm9yIG1hbnkgY29sbGVjdG9ycyB0aGVzZSBzZW1hbnRpY3MgcmVsZmVjdCB0aG9zZSBvZgotICAgKiA8Y29kZT5pc0xpdmU8L2NvZGU+LCB3aGljaCBpcyBpbXBsZW1lbnRlZCBoZXJlLiAgT3RoZXIKLSAgICogY29sbGVjdG9ycyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kLjwvaT4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IGJlaW5nIHF1ZXJpZWQuCi0gICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBoYXMgbm8gcmVndWxhciByZWZlcmVuY2VzCi0gICAqIHRvIGl0LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcmVhZHlUb0ZpbmFsaXplKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICByZXR1cm4gIWlzTGl2ZShvYmplY3QpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQ29sbGVjdGlvbgotICAgKgotICAgKiBJbXBvcnRhbnQgbm90ZXM6Ci0gICAqICAgLiBHbG9iYWwgYWN0aW9ucyBhcmUgZXhlY3V0ZWQgYnkgb25seSBvbmUgdGhyZWFkCi0gICAqICAgLiBUaHJlYWQtbG9jYWwgYWN0aW9ucyBhcmUgZXhlY3V0ZWQgYnkgYWxsIHRocmVhZHMKLSAgICogICAuIFRoZSBmb2xsb3dpbmcgb3JkZXIgaXMgZ3VhcmFudGVlZCBieSBCYXNlUGxhbiwgd2l0aCBlYWNoCi0gICAqICAgICBzZXBhcmF0ZWQgYnkgYSBzeW5jaHJvbml6YXRpb24gYmFycmllci4KLSAgICogICAgICAxLiBnbG9iYWxQcmVwYXJlKCkKLSAgICogICAgICAyLiB0aHJlYWRMb2NhbFByZXBhcmUoKQotICAgKiAgICAgIDMuIHRocmVhZExvY2FsUmVsZWFzZSgpCi0gICAqICAgICAgNC4gZ2xvYmFsUmVsZWFzZSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBwcmVwYXJlKCkgewotICAgIC8vIE5vdGhpbmcgdG8gZG8KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0gICAgdmFsdWVzLnJlc2V0KCk7Ci0gICAgcm9vdExvY2F0aW9ucy5yZXNldCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByb2Nlc3MgYW55IHJvb3RzIGZvciB3aGljaCBwcm9jZXNzaW5nIHdhcyBkZWxheWVkLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgdm9pZCBwcm9jZXNzUm9vdHMoKSB7Ci0gICAgbG9nTWVzc2FnZSg1LCAicHJvY2Vzc2luZyBkZWxheWVkIHJvb3Qgb2JqZWN0cyIpOwotICAgIHdoaWxlICghcm9vdExvY2F0aW9ucy5pc0VtcHR5KCkpIHsKLSAgICAgIHByb2Nlc3NSb290RWRnZShyb290TG9jYXRpb25zLnBvcCgpLCB0cnVlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogRmluaXNoaW5nIHByb2Nlc3NpbmcgYWxsIEdDIHdvcmsuICBUaGlzIG1ldGhvZCBpdGVyYXRlcyB1bnRpbCBhbGwgd29yayBxdWV1ZXMKLSAgICogYXJlIGVtcHR5LgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgdm9pZCBjb21wbGV0ZVRyYWNlKCkgewotICAgIGxvZ01lc3NhZ2UoNCwgIlByb2Nlc3NpbmcgR0MgaW4gcGFyYWxsZWwiKTsKLSAgICBpZiAoIXJvb3RMb2NhdGlvbnMuaXNFbXB0eSgpKSB7Ci0gICAgICBwcm9jZXNzUm9vdHMoKTsKLSAgICB9Ci0gICAgbG9nTWVzc2FnZSg1LCAicHJvY2Vzc2luZyBncmF5IG9iamVjdHMiKTsKLSAgICBhc3NlcnRNdXRhdG9yUmVtc2V0c0ZsdXNoZWQoKTsKLSAgICBkbyB7Ci0gICAgICB3aGlsZSAoIXZhbHVlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgT2JqZWN0UmVmZXJlbmNlIHYgPSB2YWx1ZXMucG9wKCk7Ci0gICAgICAgIHNjYW5PYmplY3Qodik7Ci0gICAgICB9Ci0gICAgICBwcm9jZXNzUmVtZW1iZXJlZFNldHMoKTsKLSAgICB9IHdoaWxlICghdmFsdWVzLmlzRW1wdHkoKSk7Ci0gICAgYXNzZXJ0TXV0YXRvclJlbXNldHNGbHVzaGVkKCk7Ci0gIH0KLQotICAvKioKLSAgICogUHJvY2VzcyBHQyB3b3JrIHVudGlsIGVpdGhlciBjb21wbGV0ZSBvciB3b3JrTGltaXQKLSAgICogdW5pdHMgb2Ygd29yayBhcmUgY29tcGxldGVkLgotICAgKgotICAgKiBAcGFyYW0gd29ya0xpbWl0IFRoZSBtYXhpbXVtIHVuaXRzIG9mIHdvcmsgdG8gcGVyZm9ybS4KLSAgICogQHJldHVybiBUcnVlIGlmIGFsbCB3b3JrIHdhcyBjb21wbGV0ZWQgd2l0aGluIHdvcmtMaW1pdC4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGJvb2xlYW4gaW5jcmVtZW50YWxUcmFjZShpbnQgd29ya0xpbWl0KSB7Ci0gICAgbG9nTWVzc2FnZSg0LCAiQ29udGludWluZyBHQyBpbiBwYXJhbGxlbCAoaW5jcmVtZW50YWwpIik7Ci0gICAgbG9nTWVzc2FnZSg1LCAicHJvY2Vzc2luZyBncmF5IG9iamVjdHMiKTsKLSAgICBpbnQgdW5pdHMgPSAwOwotICAgIGRvIHsKLSAgICAgIHdoaWxlICghdmFsdWVzLmlzRW1wdHkoKSAmJiB1bml0cyA8IHdvcmtMaW1pdCkgewotICAgICAgICBPYmplY3RSZWZlcmVuY2UgdiA9IHZhbHVlcy5wb3AoKTsKLSAgICAgICAgc2Nhbk9iamVjdCh2KTsKLSAgICAgICAgdW5pdHMrKzsKLSAgICAgIH0KLSAgICB9IHdoaWxlICghdmFsdWVzLmlzRW1wdHkoKSAmJiB1bml0cyA8IHdvcmtMaW1pdCk7Ci0gICAgcmV0dXJuIHZhbHVlcy5pc0VtcHR5KCk7Ci0gIH0KLQotICAvKioKLSAgICogRmx1c2ggYW55IHJlbWVtYmVyZWQgc2V0cyBwZXJ0YWluaW5nIHRvIHRoZSBjdXJyZW50IGNvbGxlY3Rpb24uCi0gICAqIE5vbi1nZW5lcmF0aW9uYWwgY29sbGVjdG9ycyBkbyBub3RoaW5nLgotICAgKi8KLQotICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzUmVtZW1iZXJlZFNldHMoKSB7fQotCi0gIC8qKgotICAgKiBBc3NlcnQgdGhhdCB0aGUgcmVtc2V0cyBoYXZlIGJlZW4gZmx1c2hlZC4gIFRoaXMgaXMgY3JpdGljYWwgdG8KLSAgICogY29ycmVjdG5lc3MuICBXZSBuZWVkIHRvIG1haW50YWluIHRoZSBpbnZhcmlhbnQgdGhhdCByZW1zZXQgZW50cmllcwotICAgKiBkbyBub3QgYWNjcnVlIGR1cmluZyBHQy4gIElmIHRoZSBob3N0IEpWTSBnZW5lcmF0ZXMgYmFycmllciBlbnRpcmVzCi0gICAqIGl0IGlzIGl0cyBvd24gcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgdGhleSBhcmUgZmx1c2hlZCBiZWZvcmUKLSAgICogcmV0dXJuaW5nIHRvIE1NVGsuCi0gICAqLwotICBwcml2YXRlIHZvaWQgYXNzZXJ0TXV0YXRvclJlbXNldHNGbHVzaGVkKCkgewotICAgIC8qIEZJWE1FOiBQTlQKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIHsKLSAgICAgIGZvciAoaW50IG0gPSAwOyBtIDwgVk0uYWN0aXZlUGxhbi5tdXRhdG9yQ291bnQoKTsgbSsrKSB7Ci0gICAgICAgIFZNLmFjdGl2ZVBsYW4ubXV0YXRvcihtKS5hc3NlcnRSZW1zZXRzRmx1c2hlZCgpOwotICAgICAgfQotICAgIH0KLSAgICAqLwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGxvZ3MgYSBtZXNzYWdlIHdpdGggcHJlcHJlbmRlZCB0aHJlYWQgaWQsIGlmIHRoZQotICAgKiB2ZXJib3NpdHkgbGV2ZWwgaXMgZ3JlYXRlciBvciBlcXVhbCB0byB0aGUgcGFzc2VkIGxldmVsLgotICAgKgotICAgKiBAcGFyYW0gbWluVmVyYm9zZSBUaGUgcmVxdWlyZWQgdmVyYm9zaXR5IGxldmVsCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIEBJbmxpbmUKLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgbG9nTWVzc2FnZShpbnQgbWluVmVyYm9zZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICBpZiAoT3B0aW9ucy52ZXJib3NlLmdldFZhbHVlKCkgPj0gbWluVmVyYm9zZSkgewotICAgICAgTG9nLnByZXBlbmRUaHJlYWRJZCgpOwotICAgICAgTG9nLndyaXRlKCIgICAgIik7Ci0gICAgICBMb2cud3JpdGVsbihtZXNzYWdlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2l2ZW4gYSBzbG90IChpZSB0aGUgYWRkcmVzcyBvZiBhbiBPYmplY3RSZWZlcmVuY2UpLCBlbnN1cmUgdGhhdCB0aGUKLSAgICogcmVmZXJlbnQgd2lsbCBub3QgbW92ZSBmb3IgdGhlIHJlc3Qgb2YgdGhlIEdDLiBUaGlzIGlzIGFjaGlldmVkIGJ5Ci0gICAqIGNhbGxpbmcgdGhlIHByZWNvcHlPYmplY3QgbWV0aG9kLgotICAgKgotICAgKiBAcGFyYW0gc2xvdCBUaGUgc2xvdCB0byBjaGVjawotICAgKiBAcGFyYW0gdW50cmFjZWQgSXMgdGhpcyBpcyBhbiB1bnRyYWNlZCByZWZlcmVuY2U/Ci0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHByb2Nlc3NQcmVjb3B5RWRnZShBZGRyZXNzIHNsb3QsIGJvb2xlYW4gdW50cmFjZWQpIHsKLSAgICBPYmplY3RSZWZlcmVuY2UgY2hpbGQ7Ci0gICAgaWYgKHVudHJhY2VkKSBjaGlsZCA9IHNsb3QubG9hZE9iamVjdFJlZmVyZW5jZSgpOwotICAgIGVsc2UgICAgICAgICAgY2hpbGQgPSBWTS5hY3RpdmVQbGFuLmdsb2JhbCgpLmxvYWRPYmplY3RSZWZlcmVuY2Uoc2xvdCk7Ci0gICAgaWYgKCFjaGlsZC5pc051bGwoKSkgewotICAgICAgY2hpbGQgPSBwcmVjb3B5T2JqZWN0KGNoaWxkKTsKLSAgICAgIGlmICh1bnRyYWNlZCkgc2xvdC5zdG9yZShjaGlsZCk7Ci0gICAgICBlbHNlICAgICAgICAgIFZNLmFjdGl2ZVBsYW4uZ2xvYmFsKCkuc3RvcmVPYmplY3RSZWZlcmVuY2Uoc2xvdCwgY2hpbGQpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL1RyYWNlV3JpdGVCdWZmZXIuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9UcmFjZVdyaXRlQnVmZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1OTVlYmEuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL1RyYWNlV3JpdGVCdWZmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuOwotCi1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5kZXF1ZS5Xcml0ZUJ1ZmZlcjsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHB1c2ggdmFsdWVzIGluIG9uZSBkaXJlY3Rpb24gZHVyaW5nIGEgdHJhY2UuIEl0Ci0gKiB3YXMgZGVzaWduZWQgZm9yIHVzZSBpbiBtdXRhdG9ycyB0aGF0IHVzZSB3cml0ZSBiYXJyaWVycyB0byBwdXNoCi0gKiB3b3JrIHRvIGNvbGxlY3RvciB0aHJlYWRzIGR1cmluZyBjb25jdXJyZW50IHRyYWNpbmcuCi0gKgotICogQHNlZSBvcmcubW10ay5wbGFuLlRyYWNlTG9jYWwKLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGZpbmFsIGNsYXNzIFRyYWNlV3JpdGVCdWZmZXIgZXh0ZW5kcyBUcmFuc2l0aXZlQ2xvc3VyZSB7Ci0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluc3RhbmNlIHZhcmlhYmxlcwotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBXcml0ZUJ1ZmZlciBidWZmZXI7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5pdGlhbGl6YXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSB0cmFjZSBUaGUgZ2xvYmFsIHRyYWNlIGNsYXNzIHRvIHVzZS4KLSAgICovCi0gIHB1YmxpYyBUcmFjZVdyaXRlQnVmZmVyKFRyYWNlIHRyYWNlKSB7Ci0gICAgYnVmZmVyID0gbmV3IFdyaXRlQnVmZmVyKHRyYWNlLnZhbHVlUG9vbCk7Ci0gIH0KLQotICAvKioKLSAgICogRmx1c2ggdGhlIGJ1ZmZlciB0byB0aGUgdHJhY2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBmbHVzaCgpIHsKLSAgICBidWZmZXIuZmx1c2hMb2NhbCgpOwotICB9Ci0KLQotICAvKioKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBidWZmZXIgaXMgZmx1c2hlZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRmx1c2hlZCgpIHsKLSAgICByZXR1cm4gYnVmZmVyLmlzRmx1c2hlZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEVucXVldWUgYW4gb2JqZWN0IGR1cmluZyBhIHRyYWNlLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gZW5xdWV1ZQotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgdm9pZCBwcm9jZXNzTm9kZShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgYnVmZmVyLmluc2VydChvYmplY3QudG9BZGRyZXNzKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vVHJhbnNpdGl2ZUNsb3N1cmUuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9UcmFuc2l0aXZlQ2xvc3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTdmMDQ2Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9UcmFuc2l0aXZlQ2xvc3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW47Ci0KLWltcG9ydCBvcmcubW10ay52bS5WTTsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyB0aGUgZnVuZGFtZW50YWwgbWVjaGFuaXNtIGZvciBwZXJmb3JtaW5nIGEKLSAqIHRyYW5zaXRpdmUgY2xvc3VyZSBvdmVyIGFuIG9iamVjdCBncmFwaC48cD4KLSAqCi0gKiBTb21lIG1lY2hhbmlzbXMgb25seSBvcGVyYXRlIG9uIG5vZGVzIG9yIGVkZ2VzLCBidXQgZHVlIHRvIGxpbWl0YXRpb25zCi0gKiBvZiBpbmhlcml0YW5jZSB3ZSBoYXZlIGNvbWJpbmVkIHRoZXNlIHR3byBoZXJlLgotICoKLSAqIEBzZWUgb3JnLm1tdGsucGxhbi5UcmFjZUxvY2FsCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmFuc2l0aXZlQ2xvc3VyZSB7Ci0KLSAgLyoqIERhdGFiYXNlIG9mIHNwZWNpYWxpemVkIHNjYW4gY2xhc3Nlcy4gKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz5bXSBzcGVjaWFsaXplZFNjYW5zID0gbmV3IENsYXNzW1ZNLmFjdGl2ZVBsYW4uY29uc3RyYWludHMoKS5udW1TcGVjaWFsaXplZFNjYW5zKCldOwotCi0gIC8qKgotICAgKiBBIHRyYW5zaXRpdmUgY2xvc3VyZSBoYXMgYmVlbiBjcmVhdGVkIHRoYXQgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIGEgc3BlY2lhbGl6ZWQgc2NhbiBtZXRob2QuIFdlIG11c3QKLSAgICogcmVnaXN0ZXIgaXQgaGVyZSBzbyB0aGUgc3BlY2lhbGl6ZXIgY2FuIHJldHVybiB0aGUgY2xhc3Mgd2hlbiBxdWVyaWVkLgotICAgKgotICAgKiBAcGFyYW0gaWQgVGhlIG1ldGhvZCBpZCB0byByZWdpc3Rlci4KLSAgICogQHBhcmFtIHNwZWNpYWxpemVkU2NhbkNsYXNzIFRoZSBjbGFzcyB0byByZWdpc3Rlci4KLSAgICovCi0gIEBJbnRlcnJ1cHRpYmxlCi0gIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgcmVnaXN0ZXJTcGVjaWFsaXplZFNjYW4oaW50IGlkLCBDbGFzczw/PiBzcGVjaWFsaXplZFNjYW5DbGFzcykgewotICAgIHNwZWNpYWxpemVkU2NhbnNbaWRdID0gc3BlY2lhbGl6ZWRTY2FuQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBzcGVjaWFsaXplZCBzY2FuIHdpdGggdGhlIGdpdmVuIGlkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBDbGFzczw/PiBnZXRTcGVjaWFsaXplZFNjYW5DbGFzcyhpbnQgaWQpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChzcGVjaWFsaXplZFNjYW5zW2lkXSAhPSBudWxsKTsKLSAgICByZXR1cm4gc3BlY2lhbGl6ZWRTY2Fuc1tpZF07Ci0gIH0KLQotICAvKiogVGhlIHNwZWNpYWxpemVkIHNjYW4gaWRlbnRpZmllciAqLwotICBwcm90ZWN0ZWQgZmluYWwgaW50IHNwZWNpYWxpemVkU2NhbjsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICovCi0gIHByb3RlY3RlZCBUcmFuc2l0aXZlQ2xvc3VyZSgpIHsKLSAgICB0aGlzKC0xKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKgotICAgKiBAcGFyYW0gc3BlY2lhbGl6ZWRTY2FuIFRoZSBzcGVjaWFsaXplZCBzY2FuIGZvciB0aGlzIHRyYWNlLgotICAgKi8KLSAgcHJvdGVjdGVkIFRyYW5zaXRpdmVDbG9zdXJlKGludCBzcGVjaWFsaXplZFNjYW4pIHsKLSAgICB0aGlzLnNwZWNpYWxpemVkU2NhbiA9IHNwZWNpYWxpemVkU2NhbjsKLSAgICBpZiAoc3BlY2lhbGl6ZWRTY2FuID49IDApIHsKLSAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGdldENsYXNzKCkgPT0gZ2V0U3BlY2lhbGl6ZWRTY2FuQ2xhc3Moc3BlY2lhbGl6ZWRTY2FuKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRyYWNlIGFuIGVkZ2UgZHVyaW5nIEdDLgotICAgKgotICAgKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugb2YgdGhlIHJlZmVyZW5jZS4KLSAgICogQHBhcmFtIHNsb3QgVGhlIGxvY2F0aW9uIGNvbnRhaW5pbmcgdGhlIG9iamVjdCByZWZlcmVuY2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBwcm9jZXNzRWRnZShPYmplY3RSZWZlcmVuY2Ugc291cmNlLCBBZGRyZXNzIHNsb3QpIHsKLSAgICBWTS5hc3NlcnRpb25zLmZhaWwoInByb2Nlc3NFZGdlIG5vdCBpbXBsZW1lbnRlZC4iKTsKLSAgfQotCi0gIC8qKgotICAgKiBUcmFjZSBhIG5vZGUgZHVyaW5nIEdDLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgcHVibGljIHZvaWQgcHJvY2Vzc05vZGUoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIFZNLmFzc2VydGlvbnMuZmFpbCgicHJvY2Vzc05vZGUgbm90IGltcGxlbWVudGVkLiIpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vY29weW1zL0NvcHlNUy5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL2NvcHltcy9Db3B5TVMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQzZDU1Zi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vY29weW1zL0NvcHlNUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLmNvcHltczsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uKjsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuQ29weVNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5NYXJrU3dlZXBTcGFjZTsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5oZWFwLlZNUmVxdWVzdDsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnMuT3B0aW9uczsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LnNhbml0eWNoZWNrZXIuU2FuaXR5Q2hlY2tlcjsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuT2JqZWN0UmVmZXJlbmNlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgZ2xvYmFsIHN0YXRlIG9mIGEgZnVsbC1oZWFwIGNvbGxlY3RvcgotICogd2l0aCBhIGNvcHlpbmcgbnVyc2VyeSBhbmQgbWFyay1zd2VlcCBtYXR1cmUgc3BhY2UuICBVbmxpa2UgYSBmdWxsCi0gKiBnZW5lcmF0aW9uYWwgY29sbGVjdG9yLCB0aGVyZSBpcyBubyB3cml0ZSBiYXJyaWVyLCBubyByZW1lbWJlcmVkIHNldCwgYW5kCi0gKiBldmVyeSBjb2xsZWN0aW9uIGlzIGZ1bGwtaGVhcC4KLSAqCi0gKiBBbGwgcGxhbnMgbWFrZSBhIGNsZWFyIGRpc3RpbmN0aW9uIGJldHdlZW4gPGk+Z2xvYmFsPC9pPiBhbmQKLSAqIDxpPnRocmVhZC1sb2NhbDwvaT4gYWN0aXZpdGllcywgYW5kIGRpdmlkZXMgZ2xvYmFsIGFuZCBsb2NhbCBzdGF0ZQotICogaW50byBzZXBhcmF0ZSBjbGFzcyBoaWVyYXJjaGllcy4gIEdsb2JhbCBhY3Rpdml0aWVzIG11c3QgYmUKLSAqIHN5bmNocm9uaXplZCwgd2hlcmVhcyBubyBzeW5jaHJvbml6YXRpb24gaXMgcmVxdWlyZWQgZm9yCi0gKiB0aHJlYWQtbG9jYWwgYWN0aXZpdGllcy4gIFRoZXJlIGlzIGEgc2luZ2xlIGluc3RhbmNlIG9mIFBsYW4gKG9yIHRoZQotICogYXBwcm9wcmlhdGUgc3ViLWNsYXNzKSwgYW5kIGEgMToxIG1hcHBpbmcgb2YgUGxhbkxvY2FsIHRvICJrZXJuZWwKLSAqIHRocmVhZHMiIChha2EgQ1BVcykuICBUaHVzIGluc3RhbmNlCi0gKiBtZXRob2RzIG9mIFBsYW5Mb2NhbCBhbGxvdyBmYXN0LCB1bnN5Y2hyb25pemVkIGFjY2VzcyB0byBmdW5jdGlvbnMgc3VjaCBhcwotICogYWxsb2NhdGlvbiBhbmQgY29sbGVjdGlvbi4KLSAqCi0gKiBUaGUgZ2xvYmFsIGluc3RhbmNlIGRlZmluZXMgYW5kIG1hbmFnZXMgc3RhdGljIHJlc291cmNlcwotICogKHN1Y2ggYXMgbWVtb3J5IGFuZCB2aXJ0dWFsIG1lbW9yeSByZXNvdXJjZXMpLiAgVGhpcyBtYXBwaW5nIG9mIHRocmVhZHMgdG8KLSAqIGluc3RhbmNlcyBpcyBjcnVjaWFsIHRvIHVuZGVyc3RhbmRpbmcgdGhlIGNvcnJlY3RuZXNzIGFuZAotICogcGVyZm9ybWFuY2UgcHJvcGVydGllcyBvZiBNTVRrIHBsYW5zLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgY2xhc3MgQ29weU1TIGV4dGVuZHMgU3RvcFRoZVdvcmxkIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBDb25zdGFudHMKLSAgICovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogQ2xhc3MgdmFyaWFibGVzCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIENvcHlTcGFjZSBudXJzZXJ5U3BhY2UgPSBuZXcgQ29weVNwYWNlKCJudXJzZXJ5IiwgREVGQVVMVF9QT0xMX0ZSRVFVRU5DWSwgZmFsc2UsIFZNUmVxdWVzdC5jcmVhdGUoMC4xNWYsIHRydWUpKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXJrU3dlZXBTcGFjZSBtc1NwYWNlID0gbmV3IE1hcmtTd2VlcFNwYWNlKCJtcyIsIERFRkFVTFRfUE9MTF9GUkVRVUVOQ1ksIFZNUmVxdWVzdC5jcmVhdGUoKSk7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVSU0VSWSA9IG51cnNlcnlTcGFjZS5nZXREZXNjcmlwdG9yKCk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BUktfU1dFRVAgPSBtc1NwYWNlLmdldERlc2NyaXB0b3IoKTsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExPQ19OVVJTRVJZID0gQUxMT0NfREVGQVVMVDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxMT0NfTVMgPSBTdG9wVGhlV29ybGQuQUxMT0NBVE9SUyArIDE7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9DT1BZTVMgPSAwOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIEluc3RhbmNlIHZhcmlhYmxlcwotICAgKi8KLQotICBwdWJsaWMgZmluYWwgVHJhY2UgdHJhY2U7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICovCi0gIHB1YmxpYyBDb3B5TVMoKSB7Ci0gICAgdHJhY2UgPSBuZXcgVHJhY2UobWV0YURhdGFTcGFjZSk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBDb2xsZWN0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBQZXJmb3JtIGEgKGdsb2JhbCkgY29sbGVjdGlvbiBwaGFzZS4KLSAgICoKLSAgICogQHBhcmFtIHBoYXNlSWQgQ29sbGVjdGlvbiBwaGFzZSB0byBleGVjdXRlLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgdm9pZCBjb2xsZWN0aW9uUGhhc2Uoc2hvcnQgcGhhc2VJZCkgewotICAgIGlmIChwaGFzZUlkID09IFBSRVBBUkUpIHsKLSAgICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkKTsKLSAgICAgIHRyYWNlLnByZXBhcmUoKTsKLSAgICAgIG1zU3BhY2UucHJlcGFyZSh0cnVlKTsKLSAgICAgIG51cnNlcnlTcGFjZS5wcmVwYXJlKHRydWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAocGhhc2VJZCA9PSBDTE9TVVJFKSB7Ci0gICAgICB0cmFjZS5wcmVwYXJlKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChwaGFzZUlkID09IFJFTEVBU0UpIHsKLSAgICAgIHRyYWNlLnJlbGVhc2UoKTsKLSAgICAgIG1zU3BhY2UucmVsZWFzZSgpOwotICAgICAgbnVyc2VyeVNwYWNlLnJlbGVhc2UoKTsKLSAgICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgY29udHJvbHMgdGhlIHRyaWdnZXJpbmcgb2YgYSBHQy4gSXQgaXMgY2FsbGVkIHBlcmlvZGljYWxseQotICAgKiBkdXJpbmcgYWxsb2NhdGlvbi4gUmV0dXJucyB0cnVlIHRvIHRyaWdnZXIgYSBjb2xsZWN0aW9uLgotICAgKgotICAgKiBAcGFyYW0gc3BhY2VGdWxsIFNwYWNlIHJlcXVlc3QgZmFpbGVkLCBtdXN0IHJlY292ZXIgcGFnZXMgd2l0aGluICdzcGFjZScuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiBhIGNvbGxlY3Rpb24gaXMgcmVxdWVzdGVkIGJ5IHRoZSBwbGFuLgotICAgKi8KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gY29sbGVjdGlvblJlcXVpcmVkKGJvb2xlYW4gc3BhY2VGdWxsKSB7Ci0gICAgYm9vbGVhbiBudXJzZXJ5RnVsbCA9IG51cnNlcnlTcGFjZS5yZXNlcnZlZFBhZ2VzKCkgPiBPcHRpb25zLm51cnNlcnlTaXplLmdldE1heE51cnNlcnkoKTsKLQotICAgIHJldHVybiBzdXBlci5jb2xsZWN0aW9uUmVxdWlyZWQoc3BhY2VGdWxsKSB8fCBudXJzZXJ5RnVsbDsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBBY2NvdW50aW5nCi0gICAqLwotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBwYWdlcyByZXNlcnZlZCBmb3IgdXNlIGdpdmVuIHRoZSBwZW5kaW5nCi0gICAqIGFsbG9jYXRpb24uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBwYWdlcyByZXNlcnZlZCBnaXZlbiB0aGUgcGVuZGluZwotICAgKiBhbGxvY2F0aW9uLCBleGNsdWRpbmcgc3BhY2UgcmVzZXJ2ZWQgZm9yIGNvcHlpbmcuCi0gICAqLwotICBwdWJsaWMgaW50IGdldFBhZ2VzVXNlZCgpIHsKLSAgICByZXR1cm4gc3VwZXIuZ2V0UGFnZXNVc2VkKCkgKwotICAgICAgbXNTcGFjZS5yZXNlcnZlZFBhZ2VzKCkgKwotICAgICAgbnVyc2VyeVNwYWNlLnJlc2VydmVkUGFnZXMoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBwYWdlcyByZXNlcnZlZCBmb3IgY29sbGVjdGlvbi4KLSAgICogRm9yIG1hcmsgc3dlZXAgdGhpcyBpcyBhIGZpeGVkIGZyYWN0aW9uIG9mIHRvdGFsIHBhZ2VzLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgcGFnZXMgcmVzZXJ2ZWQgZ2l2ZW4gdGhlIHBlbmRpbmcKLSAgICogYWxsb2NhdGlvbiwgaW5jbHVkaW5nIHNwYWNlIHJlc2VydmVkIGZvciBjb2xsZWN0aW9uLgotICAgKi8KLSAgcHVibGljIGludCBnZXRDb2xsZWN0aW9uUmVzZXJ2ZSgpIHsKLSAgICByZXR1cm4gbnVyc2VyeVNwYWNlLnJlc2VydmVkUGFnZXMoKSArIHN1cGVyLmdldENvbGxlY3Rpb25SZXNlcnZlKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHBhZ2VzIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbiwgPGk+YXNzdW1pbmcKLSAgICogYWxsIGZ1dHVyZSBhbGxvY2F0aW9uIGlzIHRvIHRoZSBudXJzZXJ5PC9pPi4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UGFnZXNBdmFpbCgpIHsKLSAgICByZXR1cm4gKGdldFRvdGFsUGFnZXMoKSAtIGdldFBhZ2VzUmVzZXJ2ZWQoKSkgPj4gMTsKLSAgfQotCi0gIC8qKgotICAgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBwYWdlcyBhIGNvbGxlY3Rpb24gaXMgcmVxdWlyZWQgdG8gZnJlZSB0byBzYXRpc2Z5Ci0gICAqIG91dHN0YW5kaW5nIGFsbG9jYXRpb24gcmVxdWVzdHMuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwYWdlcyBhIGNvbGxlY3Rpb24gaXMgcmVxdWlyZWQgdG8gZnJlZSB0byBzYXRpc2Z5Ci0gICAqIG91dHN0YW5kaW5nIGFsbG9jYXRpb24gcmVxdWVzdHMuCi0gICAqLwotICBwdWJsaWMgaW50IGdldFBhZ2VzUmVxdWlyZWQoKSB7Ci0gICAgcmV0dXJuIHN1cGVyLmdldFBhZ2VzUmVxdWlyZWQoKSArIG1zU3BhY2UucmVxdWlyZWRQYWdlcygpICsKLSAgICAgIChudXJzZXJ5U3BhY2UucmVxdWlyZWRQYWdlcygpIDw8IDEpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgZXhwZWN0ZWQgcmVmZXJlbmNlIGNvdW50LiBGb3Igbm9uLXJlZmVyZW5jZSBjb3VudGluZwotICAgKiBjb2xsZWN0b3JzIHRoaXMgYmVjb21lcyBhIHRydWUvZmFsc2UgcmVsYXRpb25zaGlwLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2hlY2suCi0gICAqIEBwYXJhbSBzYW5pdHlSb290UkMgVGhlIG51bWJlciBvZiByb290IHJlZmVyZW5jZXMgdG8gdGhlIG9iamVjdC4KLSAgICogQHJldHVybiBUaGUgZXhwZWN0ZWQgKHJvb3QgZXhjbHVkZWQpIHJlZmVyZW5jZSBjb3VudC4KLSAgICovCi0gIHB1YmxpYyBpbnQgc2FuaXR5RXhwZWN0ZWRSQyhPYmplY3RSZWZlcmVuY2Ugb2JqZWN0LCBpbnQgc2FuaXR5Um9vdFJDKSB7Ci0gICAgU3BhY2Ugc3BhY2UgPSBTcGFjZS5nZXRTcGFjZUZvck9iamVjdChvYmplY3QpOwotCi0gICAgLy8gTnVyc2VyeQotICAgIGlmIChzcGFjZSA9PSBDb3B5TVMubnVyc2VyeVNwYWNlKSB7Ci0gICAgICByZXR1cm4gU2FuaXR5Q2hlY2tlci5ERUFEOwotICAgIH0KLQotICAgIHJldHVybiBzcGFjZS5pc1JlYWNoYWJsZShvYmplY3QpID8gU2FuaXR5Q2hlY2tlci5BTElWRSA6IFNhbml0eUNoZWNrZXIuREVBRDsKLSAgfQotCi0gIC8qKgotICAgKiBSZWdpc3RlciBzcGVjaWFsaXplZCBtZXRob2RzLgotICAgKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJTcGVjaWFsaXplZE1ldGhvZHMoKSB7Ci0gICAgVHJhbnNpdGl2ZUNsb3N1cmUucmVnaXN0ZXJTcGVjaWFsaXplZFNjYW4oU0NBTl9DT1BZTVMsIENvcHlNU1RyYWNlTG9jYWwuY2xhc3MpOwotICAgIHN1cGVyLnJlZ2lzdGVyU3BlY2lhbGl6ZWRNZXRob2RzKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9jb3B5bXMvQ29weU1TQ29sbGVjdG9yLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vY29weW1zL0NvcHlNU0NvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjBkMGU5Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9jb3B5bXMvQ29weU1TQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4uY29weW1zOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi4qOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5MYXJnZU9iamVjdExvY2FsOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5NYXJrU3dlZXBMb2NhbDsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmFsbG9jLkFsbG9jYXRvcjsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgPGk+cGVyLWNvbGxlY3RvciB0aHJlYWQ8L2k+IGJlaGF2aW9yCi0gKiBhbmQgc3RhdGUgZm9yIHRoZSA8aT5Db3B5TVM8L2k+IHBsYW4uPHA+Ci0gKgotICogU3BlY2lmaWNhbGx5LCB0aGlzIGNsYXNzIGRlZmluZXMgPGk+Q29weU1TPC9pPgotICogY29sbGVjdGlvbiBiZWhhdmlvciAodGhyb3VnaCA8Y29kZT50cmFjZTwvY29kZT4gYW5kCi0gKiB0aGUgPGNvZGU+Y29sbGVjdGlvblBoYXNlPC9jb2RlPiBtZXRob2QpLCBhbmQKLSAqIGNvbGxlY3Rpb24tdGltZSBhbGxvY2F0aW9uIGludG8gdGhlIG1hdHVyZSBzcGFjZS4KLSAqCi0gKiBAc2VlIENvcHlNUwotICogQHNlZSBDb3B5TVNNdXRhdG9yCi0gKiBAc2VlIFN0b3BUaGVXb3JsZENvbGxlY3RvcgotICogQHNlZSBDb2xsZWN0b3JDb250ZXh0Ci0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBjbGFzcyBDb3B5TVNDb2xsZWN0b3IgZXh0ZW5kcyBTdG9wVGhlV29ybGRDb2xsZWN0b3IgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIEluc3RhbmNlIGZpZWxkcwotICAgKi8KLQotICBwcml2YXRlIE1hcmtTd2VlcExvY2FsIG1hdHVyZTsKLSAgcHJpdmF0ZSBDb3B5TVNUcmFjZUxvY2FsIHRyYWNlOwotCi0gIHByb3RlY3RlZCBmaW5hbCBMYXJnZU9iamVjdExvY2FsIGxvczsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbml0aWFsaXphdGlvbgotICAgKi8KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IChsb2NhbCkgaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgQ29weU1TQ29sbGVjdG9yKCkgewotICAgIGxvcyA9IG5ldyBMYXJnZU9iamVjdExvY2FsKFBsYW4ubG9TcGFjZSk7Ci0gICAgbWF0dXJlID0gbmV3IE1hcmtTd2VlcExvY2FsKENvcHlNUy5tc1NwYWNlKTsKLSAgICB0cmFjZSA9IG5ldyBDb3B5TVNUcmFjZUxvY2FsKGdsb2JhbCgpLnRyYWNlKTsKLSB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQ29sbGVjdGlvbi10aW1lIGFsbG9jYXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIEFsbG9jYXRlIHNwYWNlIGZvciBjb3B5aW5nIGFuIG9iamVjdCAodGhpcyBtZXRob2QgPGk+ZG9lcyBub3Q8L2k+Ci0gICAqIGNvcHkgdGhlIG9iamVjdCwgaXQgb25seSBhbGxvY2F0ZXMgc3BhY2UpCi0gICAqCi0gICAqIEBwYXJhbSBvcmlnaW5hbCBBIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgb2JqZWN0Ci0gICAqIEBwYXJhbSBieXRlcyBUaGUgc2l6ZSBvZiB0aGUgc3BhY2UgdG8gYmUgYWxsb2NhdGVkIChpbiBieXRlcykKLSAgICogQHBhcmFtIGFsaWduIFRoZSByZXF1ZXN0ZWQgYWxpZ25tZW50LgotICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBhbGlnbm1lbnQgb2Zmc2V0LgotICAgKiBAcmV0dXJuIFRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBhbGxvY2F0ZWQgcmVnaW9uCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBmaW5hbCBBZGRyZXNzIGFsbG9jQ29weShPYmplY3RSZWZlcmVuY2Ugb3JpZ2luYWwsIGludCBieXRlcywKLSAgICAgIGludCBhbGlnbiwgaW50IG9mZnNldCwgaW50IGFsbG9jYXRvcikgewotICAgIGlmIChhbGxvY2F0b3IgPT0gUGxhbi5BTExPQ19MT1MpIHsKLSAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KEFsbG9jYXRvci5nZXRNYXhpbXVtQWxpZ25lZFNpemUoYnl0ZXMsIGFsaWduKSA+IFBsYW4uTUFYX05PTl9MT1NfQ09QWV9CWVRFUyk7Ci0gICAgICByZXR1cm4gbG9zLmFsbG9jKGJ5dGVzLCBhbGlnbiwgb2Zmc2V0KTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSB7Ci0gICAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChieXRlcyA8PSBQbGFuLk1BWF9OT05fTE9TX0NPUFlfQllURVMpOwotICAgICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQoYWxsb2NhdG9yID09IENvcHlNUy5BTExPQ19NUyk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbWF0dXJlLmFsbG9jKGJ5dGVzLCBhbGlnbiwgb2Zmc2V0KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUGVyZm9ybSBhbnkgcG9zdC1jb3B5IGFjdGlvbnMuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG5ld2x5IGFsbG9jYXRlZCBvYmplY3QKLSAgICogQHBhcmFtIHR5cGVSZWYgdGhlIHR5cGUgcmVmZXJlbmNlIGZvciB0aGUgaW5zdGFuY2UgYmVpbmcgY3JlYXRlZAotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIHNpemUgb2YgdGhlIHNwYWNlIHRvIGJlIGFsbG9jYXRlZCAoaW4gYnl0ZXMpCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHBvc3RDb3B5KE9iamVjdFJlZmVyZW5jZSBvYmplY3QsIE9iamVjdFJlZmVyZW5jZSB0eXBlUmVmLAotICAgICAgaW50IGJ5dGVzLCBpbnQgYWxsb2NhdG9yKSB7Ci0gICAgaWYgKGFsbG9jYXRvciA9PSBQbGFuLkFMTE9DX0xPUykKLSAgICAgIFBsYW4ubG9TcGFjZS5pbml0aWFsaXplSGVhZGVyKG9iamVjdCwgZmFsc2UpOwotICAgIGVsc2UKLSAgICAgIENvcHlNUy5tc1NwYWNlLnBvc3RDb3B5KG9iamVjdCwgdHJ1ZSk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDb2xsZWN0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBQZXJmb3JtIGEgcGVyLWNvbGxlY3RvciBjb2xsZWN0aW9uIHBoYXNlLgotICAgKgotICAgKiBAcGFyYW0gcGhhc2VJZCBUaGUgY29sbGVjdGlvbiBwaGFzZSB0byBwZXJmb3JtCi0gICAqIEBwYXJhbSBwcmltYXJ5IFVzZSB0aGlzIHRocmVhZCBmb3Igc2luZ2xlLXRocmVhZGVkIGxvY2FsIGFjdGl2aXRpZXMuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGNvbGxlY3Rpb25QaGFzZShzaG9ydCBwaGFzZUlkLCBib29sZWFuIHByaW1hcnkpIHsKLSAgICBpZiAocGhhc2VJZCA9PSBDb3B5TVMuUFJFUEFSRSkgewotICAgICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQsIHByaW1hcnkpOwotICAgICAgbWF0dXJlLnByZXBhcmUoKTsKLSAgICAgIHRyYWNlLnByZXBhcmUoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBDb3B5TVMuQ0xPU1VSRSkgewotICAgICAgdHJhY2UuY29tcGxldGVUcmFjZSgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwaGFzZUlkID09IENvcHlNUy5SRUxFQVNFKSB7Ci0gICAgICBtYXR1cmUucmVsZWFzZSgpOwotICAgICAgdHJhY2UucmVsZWFzZSgpOwotICAgICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQsIHByaW1hcnkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIE1pc2NlbGxhbmVvdXMKLSAgICovCi0KLSAgLyoqIEByZXR1cm4gdGhlIGFjdGl2ZSBnbG9iYWwgcGxhbiBhcyBhbiA8Y29kZT5NUzwvY29kZT4gaW5zdGFuY2UuICovCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSBzdGF0aWMgQ29weU1TIGdsb2JhbCgpIHsKLSAgICByZXR1cm4gKENvcHlNUykgVk0uYWN0aXZlUGxhbi5nbG9iYWwoKTsKLSAgfQotCi0gIC8qKiBAcmV0dXJuIFRoZSBjdXJyZW50IHRyYWNlIGluc3RhbmNlLiAqLwotICBwdWJsaWMgZmluYWwgVHJhY2VMb2NhbCBnZXRDdXJyZW50VHJhY2UoKSB7IHJldHVybiB0cmFjZTsgfQotCi19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vY29weW1zL0NvcHlNU0NvbnN0cmFpbnRzLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vY29weW1zL0NvcHlNU0NvbnN0cmFpbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NmRiMzcuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL2NvcHltcy9Db3B5TVNDb25zdHJhaW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4uY29weW1zOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5TdG9wVGhlV29ybGRDb25zdHJhaW50czsKLQotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5Db3B5U3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LlNlZ3JlZ2F0ZWRGcmVlTGlzdFNwYWNlOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBhbmQgaXRzIHN1YmNsYXNzZXMgY29tbXVuaWNhdGUgdG8gdGhlIGhvc3QgVk0vUnVudGltZQotICogYW55IGZlYXR1cmVzIG9mIHRoZSBzZWxlY3RlZCBwbGFuIHRoYXQgaXQgbmVlZHMgdG8ga25vdy4gIFRoaXMgaXMKLSAqIHNlcGFyYXRlIGZyb20gdGhlIG1haW4gUGxhbi9QbGFuTG9jYWwgY2xhc3MgaW4gb3JkZXIgdG8gYnlwYXNzIGFueQotICogaXNzdWVzIHdpdGggb3JkZXJpbmcgb2Ygc3RhdGljIGluaXRpYWxpemF0aW9uLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgY2xhc3MgQ29weU1TQ29uc3RyYWludHMgZXh0ZW5kcyBTdG9wVGhlV29ybGRDb25zdHJhaW50cyB7Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgZ2NIZWFkZXJCaXRzKCkgeyByZXR1cm4gQ29weVNwYWNlLkxPQ0FMX0dDX0JJVFNfUkVRVUlSRUQ7IH0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgZ2NIZWFkZXJXb3JkcygpIHsgcmV0dXJuIENvcHlTcGFjZS5HQ19IRUFERVJfV09SRFNfUkVRVUlSRUQ7IH0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgbnVtU3BlY2lhbGl6ZWRTY2FucygpIHsgcmV0dXJuIDE7IH0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIG1vdmVzT2JqZWN0cygpIHsgcmV0dXJuIHRydWU7IH0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgbWF4Tm9uTE9TQ29weUJ5dGVzKCkgeyByZXR1cm4gU2VncmVnYXRlZEZyZWVMaXN0U3BhY2UuTUFYX0ZSRUVMSVNUX09CSkVDVF9CWVRFUzt9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vY29weW1zL0NvcHlNU011dGF0b3IuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9jb3B5bXMvQ29weU1TTXV0YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmI1YTJlLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9jb3B5bXMvQ29weU1TTXV0YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLmNvcHltczsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uU3RvcFRoZVdvcmxkTXV0YXRvcjsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuQ29weUxvY2FsOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5NYXJrU3dlZXBMb2NhbDsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmFsbG9jLkFsbG9jYXRvcjsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgPGk+cGVyLW11dGF0b3IgdGhyZWFkPC9pPiBiZWhhdmlvcgotICogYW5kIHN0YXRlIGZvciB0aGUgPGk+Q29weU1TPC9pPiBwbGFuLjxwPgotICoKLSAqIFNwZWNpZmljYWxseSwgdGhpcyBjbGFzcyBkZWZpbmVzIDxpPkNvcHlNUzwvaT4gbXV0YXRvci10aW1lCi0gKiBhbGxvY2F0aW9uIGludG8gdGhlIG51cnNlcnkgYW5kIG1hdHVyZSBzcGFjZSAodGhyb3VnaCBwcmUtdGVudXJpbmcpLgotICogUGVyLW11dGF0b3IgdGhyZWFkIGNvbGxlY3Rpb24gc2VtYW50aWNzIGFyZSBhbHNvIGRlZmluZWQgKGZsdXNoaW5nCi0gKiBhbmQgcmVzdG9yaW5nIHBlci1tdXRhdG9yIGFsbG9jYXRvciBzdGF0ZSkuCi0gKgotICogQHNlZSBDb3B5TVMKLSAqIEBzZWUgQ29weU1TQ29sbGVjdG9yCi0gKiBAc2VlIG9yZy5tbXRrLnBsYW4uU3RvcFRoZVdvcmxkTXV0YXRvcgotICogQHNlZSBvcmcubW10ay5wbGFuLk11dGF0b3JDb250ZXh0Ci0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBjbGFzcyBDb3B5TVNNdXRhdG9yIGV4dGVuZHMgU3RvcFRoZVdvcmxkTXV0YXRvciB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogSW5zdGFuY2UgZmllbGRzCi0gICAqLwotCi0gIHByaXZhdGUgZmluYWwgTWFya1N3ZWVwTG9jYWwgbWF0dXJlOwotICBwcml2YXRlIGZpbmFsIENvcHlMb2NhbCBudXJzZXJ5OwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluaXRpYWxpemF0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIENvcHlNU011dGF0b3IoKSB7Ci0gICAgbWF0dXJlID0gbmV3IE1hcmtTd2VlcExvY2FsKENvcHlNUy5tc1NwYWNlKTsKLSAgICBudXJzZXJ5ID0gbmV3IENvcHlMb2NhbChDb3B5TVMubnVyc2VyeVNwYWNlKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIE11dGF0b3ItdGltZSBhbGxvY2F0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFuIG9iamVjdC4gVGhpcyBjbGFzcyBoYW5kbGVzIHRoZSBkZWZhdWx0IGFsbG9jYXRvcgotICAgKiBmcm9tIHRoZSBtYXJrIHN3ZWVwIHNwYWNlLCBhbmQgZGVsZWdhdGVzIGV2ZXJ5dGhpbmcgZWxzZSB0byB0aGUKLSAgICogc3VwZXJjbGFzcy4KLSAgICoKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBvYmplY3QuCi0gICAqIEBwYXJhbSBhbGlnbiBSZXF1aXJlZCBhbGlnbm1lbnQgZm9yIHRoZSBvYmplY3QuCi0gICAqIEBwYXJhbSBvZmZzZXQgT2Zmc2V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYWxpZ25tZW50LgotICAgKiBAcGFyYW0gYWxsb2NhdG9yIFRoZSBhbGxvY2F0b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVxdWVzdC4KLSAgICogQHJldHVybiBUaGUgbG93IGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBBZGRyZXNzIGFsbG9jKGludCBieXRlcywgaW50IGFsaWduLCBpbnQgb2Zmc2V0LCBpbnQgYWxsb2NhdG9yLCBpbnQgc2l0ZSkgewotICAgIGlmIChhbGxvY2F0b3IgPT0gQ29weU1TLkFMTE9DX0RFRkFVTFQpCi0gICAgICByZXR1cm4gbnVyc2VyeS5hbGxvYyhieXRlcywgYWxpZ24sIG9mZnNldCk7Ci0gICAgaWYgKGFsbG9jYXRvciA9PSBDb3B5TVMuQUxMT0NfTVMpCi0gICAgICByZXR1cm4gbWF0dXJlLmFsbG9jKGJ5dGVzLCBhbGlnbiwgb2Zmc2V0KTsKLQotICAgIHJldHVybiBzdXBlci5hbGxvYyhieXRlcywgYWxpZ24sIG9mZnNldCwgYWxsb2NhdG9yLCBzaXRlKTsKLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIHBvc3QtYWxsb2NhdGlvbiBhY3Rpb25zLiAgSW5pdGlhbGl6ZSB0aGUgb2JqZWN0IGhlYWRlciBmb3IKLSAgICogb2JqZWN0cyBpbiB0aGUgbWFyay1zd2VlcCBzcGFjZSwgYW5kIGRlbGVnYXRlIHRvIHRoZSBzdXBlcmNsYXNzIGZvcgotICAgKiBvdGhlciBvYmplY3RzLgotICAgKgotICAgKiBAcGFyYW0gcmVmIFRoZSBuZXdseSBhbGxvY2F0ZWQgb2JqZWN0Ci0gICAqIEBwYXJhbSB0eXBlUmVmIHRoZSB0eXBlIHJlZmVyZW5jZSBmb3IgdGhlIGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBzaXplIG9mIHRoZSBzcGFjZSB0byBiZSBhbGxvY2F0ZWQgKGluIGJ5dGVzKQotICAgKiBAcGFyYW0gYWxsb2NhdG9yIFRoZSBhbGxvY2F0b3IgbnVtYmVyIHRvIGJlIHVzZWQgZm9yIHRoaXMgYWxsb2NhdGlvbgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoeyJVbm5lY2Vzc2FyeVJldHVyblN0YXRlbWVudCJ9KQotICBASW5saW5lCi0gIHB1YmxpYyB2b2lkIHBvc3RBbGxvYyhPYmplY3RSZWZlcmVuY2UgcmVmLCBPYmplY3RSZWZlcmVuY2UgdHlwZVJlZiwKLSAgICAgIGludCBieXRlcywgaW50IGFsbG9jYXRvcikgewotICAgIGlmIChhbGxvY2F0b3IgPT0gQ29weU1TLkFMTE9DX0RFRkFVTFQpCi0gICAgICByZXR1cm47Ci0gICAgZWxzZSBpZiAoYWxsb2NhdG9yID09IENvcHlNUy5BTExPQ19NUykKLSAgICAgIENvcHlNUy5tc1NwYWNlLmluaXRpYWxpemVIZWFkZXIocmVmLCB0cnVlKTsKLSAgICBlbHNlCi0gICAgICBzdXBlci5wb3N0QWxsb2MocmVmLCB0eXBlUmVmLCBieXRlcywgYWxsb2NhdG9yKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGFsbG9jYXRvciBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggYSBzcGFjZQotICAgKiA8Y29kZT5zcGFjZTwvY29kZT4sIGZvciB0aGlzIHBsYW4gaW5zdGFuY2UuCi0gICAqCi0gICAqIEBwYXJhbSBzcGFjZSBUaGUgc3BhY2UgZm9yIHdoaWNoIHRoZSBhbGxvY2F0b3IgaW5zdGFuY2UgaXMgZGVzaXJlZC4KLSAgICogQHJldHVybiBUaGUgYWxsb2NhdG9yIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBsYW4gaW5zdGFuY2UKLSAgICogd2hpY2ggaXMgYWxsb2NhdGluZyBpbnRvIDxjb2RlPnNwYWNlPC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICogaWYgbm8gYXBwcm9wcmlhdGUgYWxsb2NhdG9yIGNhbiBiZSBlc3RhYmxpc2hlZC4KLSAgICovCi0gIHB1YmxpYyBBbGxvY2F0b3IgZ2V0QWxsb2NhdG9yRnJvbVNwYWNlKFNwYWNlIHNwYWNlKSB7Ci0gICAgaWYgKHNwYWNlID09IENvcHlNUy5udXJzZXJ5U3BhY2UpIHJldHVybiBudXJzZXJ5OwotICAgIGlmIChzcGFjZSA9PSBDb3B5TVMubXNTcGFjZSkgcmV0dXJuIG1hdHVyZTsKLSAgICByZXR1cm4gc3VwZXIuZ2V0QWxsb2NhdG9yRnJvbVNwYWNlKHNwYWNlKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbGxlY3Rpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSBwZXItbXV0YXRvciBjb2xsZWN0aW9uIHBoYXNlLgotICAgKgotICAgKiBAcGFyYW0gcGhhc2VJZCBUaGUgY29sbGVjdGlvbiBwaGFzZSB0byBwZXJmb3JtCi0gICAqIEBwYXJhbSBwcmltYXJ5IFVzZSB0aGlzIHRocmVhZCBmb3Igc2luZ2xlLXRocmVhZGVkIGxvY2FsIGFjdGl2aXRpZXMuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGNvbGxlY3Rpb25QaGFzZShzaG9ydCBwaGFzZUlkLCBib29sZWFuIHByaW1hcnkpIHsKLSAgICBpZiAocGhhc2VJZCA9PSBDb3B5TVMuUFJFUEFSRSkgewotICAgICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQsIHByaW1hcnkpOwotICAgICAgbWF0dXJlLnByZXBhcmUoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBDb3B5TVMuUkVMRUFTRSkgewotICAgICAgbnVyc2VyeS5yZXNldCgpOwotICAgICAgbWF0dXJlLnJlbGVhc2UoKTsKLSAgICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gIH0KLQotICAvKioKLSAgICogRmx1c2ggbXV0YXRvciBjb250ZXh0LCBpbiByZXNwb25zZSB0byBhIHJlcXVlc3RNdXRhdG9yRmx1c2guCi0gICAqIEFsc28gY2FsbGVkIGJ5IHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGRlaW5pdE11dGF0b3IuCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgZmx1c2goKSB7Ci0gICAgc3VwZXIuZmx1c2goKTsKLSAgICBtYXR1cmUuZmx1c2goKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL2NvcHltcy9Db3B5TVNUcmFjZUxvY2FsLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vY29weW1zL0NvcHlNU1RyYWNlTG9jYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM3MWI0Ny4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vY29weW1zL0NvcHlNU1RyYWNlTG9jYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5jb3B5bXM7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYWNlTG9jYWw7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5UcmFjZTsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSB0aHJlYWQtbG9jYWwgZnVuY3Rpb25hbGl0eSBmb3IgYQotICogdHJhbnNpdGl2ZSBjbG9zdXJlIG92ZXIgYSBjb3BpbmcvbWFyay1zd2VlcCBoeWJyaWQgY29sbGVjdG9yLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29weU1TVHJhY2VMb2NhbCBleHRlbmRzIFRyYWNlTG9jYWwgewotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIENvcHlNU1RyYWNlTG9jYWwoVHJhY2UgdHJhY2UpIHsKLSAgICBzdXBlcihDb3B5TVMuU0NBTl9DT1BZTVMsIHRyYWNlKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEV4dGVybmFsbHkgdmlzaWJsZSBPYmplY3QgcHJvY2Vzc2luZyBhbmQgdHJhY2luZwotICAgKi8KLQotICAvKioKLSAgICogSXMgdGhlIHNwZWNpZmllZCBvYmplY3QgcmVhY2hhYmxlPwotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGxpdmUuCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gaXNMaXZlKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAob2JqZWN0LmlzTnVsbCgpKSByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKFNwYWNlLmlzSW5TcGFjZShDb3B5TVMuTlVSU0VSWSwgb2JqZWN0KSkgewotICAgICAgcmV0dXJuIENvcHlNUy5udXJzZXJ5U3BhY2UuaXNMaXZlKG9iamVjdCk7Ci0gICAgfQotICAgIGlmIChTcGFjZS5pc0luU3BhY2UoQ29weU1TLk1BUktfU1dFRVAsIG9iamVjdCkpIHsKLSAgICAgIHJldHVybiBDb3B5TVMubXNTcGFjZS5pc0xpdmUob2JqZWN0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLmlzTGl2ZShvYmplY3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIHRoZSBjb3JlIG1ldGhvZCBkdXJpbmcgdGhlIHRyYWNlIG9mIHRoZSBvYmplY3QgZ3JhcGguCi0gICAqIFRoZSByb2xlIG9mIHRoaXMgbWV0aG9kIGlzIHRvOgotICAgKgotICAgKiAxLiBFbnN1cmUgdGhlIHRyYWNlZCBvYmplY3QgaXMgbm90IGNvbGxlY3RlZC4KLSAgICogMi4gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdmlzaXQgdG8gdGhlIG9iamVjdCBlbnF1ZXVlIGl0IHRvIGJlIHNjYW5uZWQuCi0gICAqIDMuIFJldHVybiB0aGUgZm9yd2FyZGVkIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0LgotICAgKgotICAgKiBJbiB0aGlzIGluc3RhbmNlLCB3ZSByZWZlciBvYmplY3RzIGluIHRoZSBtYXJrLXN3ZWVwIHNwYWNlIHRvIHRoZQotICAgKiBtc1NwYWNlIGZvciB0cmFjaW5nLCBhbmQgZGVmZXIgdG8gdGhlIHN1cGVyY2xhc3MgZm9yIGFsbCBvdGhlcnMuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBiZSB0cmFjZWQuCi0gICAqIEByZXR1cm4gVGhlIG5ldyByZWZlcmVuY2UgdG8gdGhlIHNhbWUgb2JqZWN0IGluc3RhbmNlLgotICAgKi8KLSAgQElubGluZQotICBAT3ZlcnJpZGUKLSAgcHVibGljIE9iamVjdFJlZmVyZW5jZSB0cmFjZU9iamVjdChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKG9iamVjdC5pc051bGwoKSkgcmV0dXJuIG9iamVjdDsKLSAgICBpZiAoU3BhY2UuaXNJblNwYWNlKENvcHlNUy5OVVJTRVJZLCBvYmplY3QpKQotICAgICAgcmV0dXJuIENvcHlNUy5udXJzZXJ5U3BhY2UudHJhY2VPYmplY3QodGhpcywgb2JqZWN0LCBDb3B5TVMuQUxMT0NfTVMpOwotICAgIGlmIChTcGFjZS5pc0luU3BhY2UoQ29weU1TLk1BUktfU1dFRVAsIG9iamVjdCkpCi0gICAgICByZXR1cm4gQ29weU1TLm1zU3BhY2UudHJhY2VPYmplY3QodGhpcywgb2JqZWN0KTsKLSAgICByZXR1cm4gc3VwZXIudHJhY2VPYmplY3Qob2JqZWN0KTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEVuc3VyZSB0aGF0IHRoaXMgb2JqZWN0IHdpbGwgbm90IG1vdmUgZm9yIHRoZSByZXN0IG9mIHRoZSBHQy4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRoYXQgbXVzdCBub3QgbW92ZQotICAgKiBAcmV0dXJuIFRoZSBuZXcgb2JqZWN0LCBndWFyYW50ZWVkIHN0YWJsZSBmb3IgdGhlIHJlc3Qgb2YgdGhlIEdDLgotICAgKi8KLSAgQElubGluZQotICBAT3ZlcnJpZGUKLSAgcHVibGljIE9iamVjdFJlZmVyZW5jZSBwcmVjb3B5T2JqZWN0KE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAob2JqZWN0LmlzTnVsbCgpKSByZXR1cm4gb2JqZWN0OwotICAgIGVsc2UgaWYgKFNwYWNlLmlzSW5TcGFjZShDb3B5TVMuTlVSU0VSWSwgb2JqZWN0KSkKLSAgICAgIHJldHVybiBDb3B5TVMubnVyc2VyeVNwYWNlLnRyYWNlT2JqZWN0KHRoaXMsIG9iamVjdCwgQ29weU1TLkFMTE9DX01TKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gb2JqZWN0OwotICB9Ci0KLSAgLyoqCi0gICAqIFdpbGwgdGhpcyBvYmplY3QgbW92ZSBmcm9tIHRoaXMgcG9pbnQgb24sIGR1cmluZyB0aGUgY3VycmVudCBjb2xsZWN0aW9uID8KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9iamVjdCB3aWxsIG5vdCBtb3ZlIGR1cmluZyB0aGlzIGNvbGxlY3Rpb24uCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gd2lsbE5vdE1vdmVJbkN1cnJlbnRDb2xsZWN0aW9uKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICByZXR1cm4gIVNwYWNlLmlzSW5TcGFjZShDb3B5TVMuTlVSU0VSWSwgb2JqZWN0KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL2dlbmVyYXRpb25hbC9HZW4uamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9nZW5lcmF0aW9uYWwvR2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMzdkMWUuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL2dlbmVyYXRpb25hbC9HZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MiArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5nZW5lcmF0aW9uYWw7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLio7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LkNvcHlTcGFjZTsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmRlcXVlLio7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5oZWFwLk1hcDsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmhlYXAuVk1SZXF1ZXN0OwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuTG9nOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkub3B0aW9ucy5PcHRpb25zOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuc2FuaXR5Y2hlY2tlci5TYW5pdHlDaGVja2VyOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuc3RhdGlzdGljcy4qOwotCi1pbXBvcnQgb3JnLm1tdGsudm0uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIGltcGxlbWVudHMgdGhlIGNvcmUgZnVuY3Rpb25hbGl0eSBvZiBnZW5lcmljCi0gKiB0d28tZ2VuZXJhdGlvbmEgY29weWluZyBjb2xsZWN0b3JzLiAgTnVyc2VyeSBjb2xsZWN0aW9ucyBvY2N1ciB3aGVuCi0gKiBlaXRoZXIgdGhlIGhlYXAgaXMgZnVsbCBvciB0aGUgbnVyc2VyeSBpcyBmdWxsLiAgVGhlIG51cnNlcnkgc2l6ZQotICogaXMgZGV0ZXJtaW5lZCBieSBhbiBvcHRpb25hbCBjb21tYW5kIGxpbmUgYXJndW1lbnQuICBJZiB1bmRlZmluZWQsCi0gKiB0aGUgbnVyc2VyeSBzaXplIGlzICJpbmZpbml0ZSIsIHNvIG51cnNlcnkgY29sbGVjdGlvbnMgb25seSBvY2N1cgotICogd2hlbiB0aGUgaGVhcCBpcyBmdWxsICh0aGlzIGlzIGtub3duIGFzIGEgZmxleGlibGUtc2l6ZWQgbnVyc2VyeQotICogY29sbGVjdG9yKS4gIFRodXMgYm90aCBmaXhlZCBhbmQgZmxleGlibGUgbnVyc2VyeSBzaXplcyBhcmUKLSAqIHN1cHBvcnRlZC4gIEZ1bGwgaGVhcCBjb2xsZWN0aW9ucyBvY2N1ciB3aGVuIHRoZSBudXJzZXJ5IHNpemUgaGFzCi0gKiBkcm9wcGVkIHRvIGEgc3RhdGljYWxseSBkZWZpbmVkIHRocmVzaG9sZCwKLSAqIDxjb2RlPk5VUlNFUllfVEhSRVNIT0xEPC9jb2RlPjxwPgotICoKLSAqIFNlZSBhbHNvIFBsYW4uamF2YSBmb3IgZ2VuZXJhbCBjb21tZW50cyBvbiBsb2NhbCB2cyBnbG9iYWwgcGxhbgotICogY2xhc3Nlcy4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGFic3RyYWN0IGNsYXNzIEdlbiBleHRlbmRzIFN0b3BUaGVXb3JsZCB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbnN0YW50cwotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBTVVJWSVZBTF9FU1RJTUFURSA9IDAuOGY7IC8vIGVzdCB5aWVsZAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IE1BVFVSRV9GUkFDVElPTiA9IDAuNWY7IC8vIGVzdCB5aWVsZAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBXT1JTVF9DQVNFX0NPUFlfRVhQQU5TSU9OID0gMS41ZjsgLy8gd29yc3QgY2FzZSBmb3IgYWRkaXRpb24gb2Ygb25lIHdvcmQgb3ZlcmhlYWQgZHVlIHRvIGFkZHJlc3MgYmFzZWQgaGFzaGluZwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gSUdOT1JFX1JFTVNFVFMgPSBmYWxzZTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9OT05fSEVBUF9PQkpFQ1RfUkVGRVJFTkNFX1dSSVRFX0JBUlJJRVIgPSBmYWxzZTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9PQkpFQ1RfQkFSUklFUl9GT1JfQUFTVE9SRSA9IGZhbHNlOyAvLyBjaG9vc2UgYmV0d2VlbiBzbG90IGFuZCBvYmplY3QgYmFycmllcnMKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9PQkpFQ1RfQkFSUklFUl9GT1JfUFVURklFTEQgPSBmYWxzZTsgLy8gY2hvb3NlIGJldHdlZW4gc2xvdCBhbmQgb2JqZWN0IGJhcnJpZXJzCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBVU0VfT0JKRUNUX0JBUlJJRVIgPSBVU0VfT0JKRUNUX0JBUlJJRVJfRk9SX0FBU1RPUkUgfHwgVVNFX09CSkVDVF9CQVJSSUVSX0ZPUl9QVVRGSUVMRDsKLQotICAvKiogRnJhY3Rpb24gb2YgYXZhaWxhYmxlIHZpcnR1YWwgbWVtb3J5IHRvIGdpdmUgdG8gdGhlIG51cnNlcnkgKGlmIGNvbnRpZ3VvdXMpICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgTlVSU0VSWV9WTV9GUkFDVElPTiA9IDAuMTVmOwotCi0gIC8qKiBTd2l0Y2ggYmV0d2VlbiBhIGNvbnRpZ3VvdXMgYW5kIGRpc2NvbnRpZ3VvdXMgbnVyc2VyeSAoZXhwZXJpbWVudGFsKSAqLwotICBzdGF0aWMgZmluYWwgYm9vbGVhbiBVU0VfRElTQ09OVElHVU9VU19OVVJTRVJZID0gZmFsc2U7Ci0KLSAgLy8gQWxsb2NhdG9ycwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExPQ19OVVJTRVJZICAgICAgICA9IEFMTE9DX0RFRkFVTFQ7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMTE9DX01BVFVSRSAgICAgICAgID0gU3RvcFRoZVdvcmxkLkFMTE9DQVRPUlMgKyAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExPQ19NQVRVUkVfTUlOT1JHQyA9IFN0b3BUaGVXb3JsZC5BTExPQ0FUT1JTICsgMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxMT0NfTUFUVVJFX01BSk9SR0MgPSBTdG9wVGhlV29ybGQuQUxMT0NBVE9SUyArIDM7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9OVVJTRVJZID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9NQVRVUkUgID0gMTsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQ2xhc3MgZmllbGRzCi0gICAqLwotCi0gIC8qIFN0YXRpc3RpY3MgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuQ291bnRlciBmdWxsSGVhcCA9IG5ldyBCb29sZWFuQ291bnRlcigibWFqb3JHQyIsIHRydWUsIHRydWUpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUaW1lciBmdWxsSGVhcFRpbWUgPSBuZXcgVGltZXIoIm1ham9yR0NUaW1lIiwgZmFsc2UsIHRydWUpOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEV2ZW50Q291bnRlciB3YkZhc3Q7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgRXZlbnRDb3VudGVyIHdiU2xvdzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTaXplQ291bnRlciBudXJzZXJ5TWFyazsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTaXplQ291bnRlciBudXJzZXJ5Q29uczsKLQotICAvKiogVGhlIG51cnNlcnkgc3BhY2UgaXMgd2hlcmUgYWxsIG5ldyBvYmplY3RzIGFyZSBhbGxvY2F0ZWQgYnkgZGVmYXVsdCAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBWTVJlcXVlc3Qgdm1SZXF1ZXN0ID0gVVNFX0RJU0NPTlRJR1VPVVNfTlVSU0VSWSA/IFZNUmVxdWVzdC5jcmVhdGUoKSA6IFZNUmVxdWVzdC5jcmVhdGUoTlVSU0VSWV9WTV9GUkFDVElPTiwgdHJ1ZSk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29weVNwYWNlIG51cnNlcnlTcGFjZSA9IG5ldyBDb3B5U3BhY2UoIm51cnNlcnkiLCBERUZBVUxUX1BPTExfRlJFUVVFTkNZLCBmYWxzZSwgdm1SZXF1ZXN0KTsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVVJTRVJZID0gbnVyc2VyeVNwYWNlLmdldERlc2NyaXB0b3IoKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWRkcmVzcyBOVVJTRVJZX1NUQVJUID0gbnVyc2VyeVNwYWNlLmdldFN0YXJ0KCk7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluc3RhbmNlIGZpZWxkcwotICAgKi8KLSAgLyogc3RhdHVzIGZpZWxkcyAqLwotICBwdWJsaWMgYm9vbGVhbiBnY0Z1bGxIZWFwID0gZmFsc2U7Ci0gIHB1YmxpYyBib29sZWFuIG5leHRHQ0Z1bGxIZWFwID0gZmFsc2U7Ci0KLSAgLyogVGhlIHRyYWNlIG9iamVjdCAqLwotICBwdWJsaWMgZmluYWwgVHJhY2UgbnVyc2VyeVRyYWNlID0gbmV3IFRyYWNlKG1ldGFEYXRhU3BhY2UpOwotCi0gIC8qKgotICAgKiBSZW1zZXQgcG9vbHMKLSAgICovCi0gIHB1YmxpYyBmaW5hbCBTaGFyZWREZXF1ZSBtb2RidWZQb29sID0gbmV3IFNoYXJlZERlcXVlKCJtb2RCdWZzIixtZXRhRGF0YVNwYWNlLCAxKTsKLSAgcHVibGljIGZpbmFsIFNoYXJlZERlcXVlIHJlbXNldFBvb2wgPSBuZXcgU2hhcmVkRGVxdWUoInJlbVNldHMiLG1ldGFEYXRhU3BhY2UsIDEpOwotICBwdWJsaWMgZmluYWwgU2hhcmVkRGVxdWUgYXJyYXlSZW1zZXRQb29sID0gbmV3IFNoYXJlZERlcXVlKCJhcnJheVJlbVNldHMiLG1ldGFEYXRhU3BhY2UsIDIpOwotCi0gIC8qCi0gICAqIENsYXNzIGluaXRpYWxpemVyCi0gICAqLwotICBzdGF0aWMgewotICAgIGlmIChHQVRIRVJfV1JJVEVfQkFSUklFUl9TVEFUUykgewotICAgICAgd2JGYXN0ID0gbmV3IEV2ZW50Q291bnRlcigid2JGYXN0Iik7Ci0gICAgICB3YlNsb3cgPSBuZXcgRXZlbnRDb3VudGVyKCJ3YlNsb3ciKTsKLSAgICB9IGVsc2UgewotICAgICAgd2JGYXN0ID0gbnVsbDsKLSAgICAgIHdiU2xvdyA9IG51bGw7Ci0gICAgfQotICAgIGlmIChTdGF0cy5HQVRIRVJfTUFSS19DT05TX1NUQVRTKSB7Ci0gICAgICBudXJzZXJ5TWFyayA9IG5ldyBTaXplQ291bnRlcigibnVyc2VyeU1hcmsiLCB0cnVlLCB0cnVlKTsKLSAgICAgIG51cnNlcnlDb25zID0gbmV3IFNpemVDb3VudGVyKCJudXJzZXJ5Q29ucyIsIHRydWUsIHRydWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBudXJzZXJ5TWFyayA9IG51bGw7Ci0gICAgICBudXJzZXJ5Q29ucyA9IG51bGw7Ci0gICAgfQotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbGxlY3Rpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIEZvcmNlIHRoZSBuZXh0IGNvbGxlY3Rpb24gdG8gYmUgZnVsbCBoZWFwLgotICAgKi8KLSAgcHVibGljIHZvaWQgZm9yY2VGdWxsSGVhcENvbGxlY3Rpb24oKSB7Ci0gICAgbmV4dEdDRnVsbEhlYXAgPSB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSAoZ2xvYmFsKSBjb2xsZWN0aW9uIHBoYXNlLgotICAgKgotICAgKiBAcGFyYW0gcGhhc2VJZCBDb2xsZWN0aW9uIHBoYXNlIHRvIGV4ZWN1dGUuCi0gICAqLwotICBATm9JbmxpbmUKLSAgcHVibGljIHZvaWQgY29sbGVjdGlvblBoYXNlKHNob3J0IHBoYXNlSWQpIHsKLSAgICBpZiAocGhhc2VJZCA9PSBTRVRfQ09MTEVDVElPTl9LSU5EKSB7Ci0gICAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCk7Ci0gICAgICBnY0Z1bGxIZWFwID0gcmVxdWlyZXNGdWxsSGVhcENvbGxlY3Rpb24oKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBQUkVQQVJFKSB7Ci0gICAgICBudXJzZXJ5U3BhY2UucHJlcGFyZSh0cnVlKTsKLSAgICAgIGlmICh0cmFjZUZ1bGxIZWFwKCkpewotICAgICAgICBpZiAoZ2NGdWxsSGVhcCkgewotICAgICAgICAgIGlmIChTdGF0cy5nYXRoZXJpbmdTdGF0cygpKSBmdWxsSGVhcC5zZXQoKTsKLSAgICAgICAgICBmdWxsSGVhcFRpbWUuc3RhcnQoKTsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCk7Ci0KLSAgICAgICAgLy8gd2UgY2FuIHRocm93IGF3YXkgdGhlIHJlbXNldHMgKGJ1dCBub3QgbW9kYnVmKSBmb3IgYSBmdWxsIGhlYXAgR0MKLSAgICAgICAgcmVtc2V0UG9vbC5jbGVhckRlcXVlKDEpOwotICAgICAgICBhcnJheVJlbXNldFBvb2wuY2xlYXJEZXF1ZSgyKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBDTE9TVVJFKSB7Ci0gICAgICBpZiAoIXRyYWNlRnVsbEhlYXAoKSkgewotICAgICAgICBudXJzZXJ5VHJhY2UucHJlcGFyZSgpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAocGhhc2VJZCA9PSBSRUxFQVNFKSB7Ci0gICAgICBudXJzZXJ5U3BhY2UucmVsZWFzZSgpOwotICAgICAgbW9kYnVmUG9vbC5jbGVhckRlcXVlKDEpOwotICAgICAgcmVtc2V0UG9vbC5jbGVhckRlcXVlKDEpOwotICAgICAgYXJyYXlSZW1zZXRQb29sLmNsZWFyRGVxdWUoMik7Ci0gICAgICBpZiAoIXRyYWNlRnVsbEhlYXAoKSkgewotICAgICAgICBudXJzZXJ5VHJhY2UucmVsZWFzZSgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQpOwotICAgICAgICBpZiAoZ2NGdWxsSGVhcCkgZnVsbEhlYXBUaW1lLnN0b3AoKTsKLSAgICAgIH0KLSAgICAgIG5leHRHQ0Z1bGxIZWFwID0gKGdldFBhZ2VzQXZhaWwoKSA8IE9wdGlvbnMubnVyc2VyeVNpemUuZ2V0TWluTnVyc2VyeSgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgY29udHJvbHMgdGhlIHRyaWdnZXJpbmcgb2YgYSBHQy4gSXQgaXMgY2FsbGVkIHBlcmlvZGljYWxseQotICAgKiBkdXJpbmcgYWxsb2NhdGlvbi4gUmV0dXJucyB0cnVlIHRvIHRyaWdnZXIgYSBjb2xsZWN0aW9uLgotICAgKgotICAgKiBAcGFyYW0gc3BhY2VGdWxsIFNwYWNlIHJlcXVlc3QgZmFpbGVkLCBtdXN0IHJlY292ZXIgcGFnZXMgd2l0aGluICdzcGFjZScuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiBhIGNvbGxlY3Rpb24gaXMgcmVxdWVzdGVkIGJ5IHRoZSBwbGFuLgotICAgKi8KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gY29sbGVjdGlvblJlcXVpcmVkKGJvb2xlYW4gc3BhY2VGdWxsKSB7Ci0gICAgaW50IG51cnNlcnlQYWdlcyA9IG51cnNlcnlTcGFjZS5yZXNlcnZlZFBhZ2VzKCk7Ci0KLSAgICBpZiAobnVyc2VyeVBhZ2VzID4gT3B0aW9ucy5udXJzZXJ5U2l6ZS5nZXRNYXhOdXJzZXJ5KCkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmICh2aXJ0dWFsTWVtb3J5RXhoYXVzdGVkKCkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHJldHVybiBzdXBlci5jb2xsZWN0aW9uUmVxdWlyZWQoc3BhY2VGdWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiBEZXRlcm1pbmUgaWYgdGhpcyBHQyBzaG91bGQgYmUgYSBmdWxsIGhlYXAgY29sbGVjdGlvbi4KLSAgICoKLSAgICogQHJldHVybiBUcnVlIGlzIHRoaXMgR0Mgc2hvdWxkIGJlIGEgZnVsbCBoZWFwIGNvbGxlY3Rpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiByZXF1aXJlc0Z1bGxIZWFwQ29sbGVjdGlvbigpIHsKLSAgICBpZiAoY29sbGVjdGlvblRyaWdnZXIgPT0gQ29sbGVjdGlvbi5FWFRFUk5BTF9HQ19UUklHR0VSICYmIE9wdGlvbnMuZnVsbEhlYXBTeXN0ZW1HQy5nZXRWYWx1ZSgpKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAobmV4dEdDRnVsbEhlYXAgfHwgY29sbGVjdGlvbkF0dGVtcHQgPiAxKSB7Ci0gICAgICAvLyBGb3JjZXMgZnVsbCBoZWFwIGNvbGxlY3Rpb24KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmIChsb1NwYWNlLmFsbG9jYXRpb25GYWlsZWQoKSB8fAotICAgICAgICBub25Nb3ZpbmdTcGFjZS5hbGxvY2F0aW9uRmFpbGVkKCkgfHwKLSAgICAgICAgKFVTRV9DT0RFX1NQQUNFICYmIChsYXJnZUNvZGVTcGFjZS5hbGxvY2F0aW9uRmFpbGVkKCkgfHwgc21hbGxDb2RlU3BhY2UuYWxsb2NhdGlvbkZhaWxlZCgpKSkpIHsKLSAgICAgIC8vIFdlIG5lZWQgc3BhY2UgZnJvbSB0aGUgbnVyc2VyeQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYgKHZpcnR1YWxNZW1vcnlFeGhhdXN0ZWQoKSkKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgaW50IHNtYWxsTnVyc2VyeVBhZ2VzID0gbnVyc2VyeVNwYWNlLmNvbW1pdHRlZFBhZ2VzKCk7Ci0gICAgaW50IHNtYWxsTnVyc2VyeVlpZWxkID0gKGludCkoKHNtYWxsTnVyc2VyeVBhZ2VzIDw8IDEpICogU1VSVklWQUxfRVNUSU1BVEUpOwotCi0gICAgaWYgKHNtYWxsTnVyc2VyeVlpZWxkIDwgZ2V0UGFnZXNSZXF1aXJlZCgpKSB7Ci0gICAgICAvLyBPdXIgdG90YWwgeWllbGQgaXMgaW5zdWZmaWNlbnQuCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAobnVyc2VyeVNwYWNlLmFsbG9jYXRpb25GYWlsZWQoKSkgewotICAgICAgaWYgKHNtYWxsTnVyc2VyeVlpZWxkIDwgKG51cnNlcnlTcGFjZS5yZXF1aXJlZFBhZ2VzKCkgPDwgMSkpIHsKLSAgICAgICAgLy8gV2UgaGF2ZSBydW4gb3V0IG9mIFZNIHBhZ2VzIGluIHRoZSBudXJzZXJ5Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLQotCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEluZGVwZW5kZW50IG9mIGhvdyBtYW55IHBhZ2VzIHJlbWFpbiBpbiB0aGUgcGFnZSBidWRnZXQgKGEgZnVuY3Rpb24gb2YKLSAgICogaGVhcCBzaXplKSwgd2UgbXVzdCBlbnN1cmUgd2UgbmV2ZXIgZXhoYXVzdCB2aXJ0dWFsIG1lbW9yeS4gIFRoZXJlZm9yZQotICAgKiB3ZSBtdXN0IG5ldmVyIGxldCB0aGUgbnVyc2VyeSBncm93IHRvIHRoZSBleHRlbnQgdGhhdCBpdCBjYW4ndCBiZQotICAgKiBjb3BpZWQgaW50byB0aGUgbWF0dXJlIHNwYWNlLgotICAgKgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG51cnNlcnkgaGFzIGdyb3duIHRvIHRoZSBleHRlbnQgdGhhdCBpdCBtYXkgbm90IGJlCi0gICAqIGFibGUgdG8gYmUgY29waWVkIGludG8gdGhlIG1hdHVyZSBzcGFjZS4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB2aXJ0dWFsTWVtb3J5RXhoYXVzdGVkKCkgewotICAgIHJldHVybiAoKGludCkgKG51cnNlcnlTcGFjZS5yZXNlcnZlZFBhZ2VzKCkqV09SU1RfQ0FTRV9DT1BZX0VYUEFOU0lPTikgPj0gZ2V0TWF0dXJlUGh5c2ljYWxQYWdlc0F2YWlsKCkpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvcnJlY3RuZXNzCi0gICAqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBBY2NvdW50aW5nCi0gICAqLwotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBwYWdlcyBpbiB1c2UgZ2l2ZW4gdGhlIHBlbmRpbmcKLSAgICogYWxsb2NhdGlvbi4gIFNpbXBseSBhZGQgdGhlIG51cnNlcnkncyBjb250cmlidXRpb24gdG8gdGhhdCBvZgotICAgKiB0aGUgc3VwZXJjbGFzcy4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHJlc2VydmVkIGdpdmVuIHRoZSBwZW5kaW5nCi0gICAqIGFsbG9jYXRpb24sIGV4Y2x1ZGluZyBzcGFjZSByZXNlcnZlZCBmb3IgY29weWluZy4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IGdldFBhZ2VzVXNlZCgpIHsKLSAgICByZXR1cm4gKG51cnNlcnlTcGFjZS5yZXNlcnZlZFBhZ2VzKCkgKyBzdXBlci5nZXRQYWdlc1VzZWQoKSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcGFnZXMgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uLCA8aT5hc3N1bWluZwotICAgKiBhbGwgZnV0dXJlIGFsbG9jYXRpb24gaXMgdG8gdGhlIG51cnNlcnk8L2k+LgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgcGFnZXMgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uLCA8aT5hc3N1bWluZwotICAgKiBhbGwgZnV0dXJlIGFsbG9jYXRpb24gaXMgdG8gdGhlIG51cnNlcnk8L2k+LgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgZ2V0UGFnZXNBdmFpbCgpIHsKLSAgICByZXR1cm4gc3VwZXIuZ2V0UGFnZXNBdmFpbCgpID4+IDE7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcGFnZXMgcmVzZXJ2ZWQgZm9yIGNvcHlpbmcuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBwYWdlcyByZXNlcnZlZCBnaXZlbiB0aGUgcGVuZGluZwotICAgKiBhbGxvY2F0aW9uLCBpbmNsdWRpbmcgc3BhY2UgcmVzZXJ2ZWQgZm9yIGNvcHlpbmcuCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBnZXRDb2xsZWN0aW9uUmVzZXJ2ZSgpIHsKLSAgICByZXR1cm4gbnVyc2VyeVNwYWNlLnJlc2VydmVkUGFnZXMoKSArIHN1cGVyLmdldENvbGxlY3Rpb25SZXNlcnZlKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcGFnZXMgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uIGludG8gdGhlIG1hdHVyZQotICAgKiBzcGFjZS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHBhZ2VzIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbiBpbnRvIHRoZSBtYXR1cmUKLSAgICogc3BhY2UuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldE1hdHVyZVBoeXNpY2FsUGFnZXNBdmFpbCgpOwotCi0gIC8qKgotICAgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBwYWdlcyBhIGNvbGxlY3Rpb24gaXMgcmVxdWlyZWQgdG8gZnJlZSB0byBzYXRpc2Z5Ci0gICAqIG91dHN0YW5kaW5nIGFsbG9jYXRpb24gcmVxdWVzdHMuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwYWdlcyBhIGNvbGxlY3Rpb24gaXMgcmVxdWlyZWQgdG8gZnJlZSB0byBzYXRpc2Z5Ci0gICAqIG91dHN0YW5kaW5nIGFsbG9jYXRpb24gcmVxdWVzdHMuCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBnZXRQYWdlc1JlcXVpcmVkKCkgewotICAgIC8qIFdlIGRvbid0IGN1cnJlbnRseSBwcmV0ZW51cmUsIHNvIG1hdHVyZSBzcGFjZSBtdXN0IGJlIHplcm8gKi8KLSAgICByZXR1cm4gc3VwZXIuZ2V0UGFnZXNSZXF1aXJlZCgpICsgKG51cnNlcnlTcGFjZS5yZXF1aXJlZFBhZ2VzKCkgPDwgMSk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogTWlzY2VsbGFuZW91cwotICAgKi8KLQotICAvKioKLSAgICogUmV0dXJuIHRydWUgaWYgdGhlIGFkZHJlc3MgcmVzaWRlcyB3aXRoaW4gdGhlIG51cnNlcnkKLSAgICoKLSAgICogQHBhcmFtIGFkZHIgVGhlIG9iamVjdCB0byBiZSB0ZXN0ZWQKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhZGRyZXNzIHJlc2lkZXMgd2l0aGluIHRoZSBudXJzZXJ5Ci0gICAqLwotICBASW5saW5lCi0gIHN0YXRpYyBib29sZWFuIGluTnVyc2VyeShBZGRyZXNzIGFkZHIpIHsKLSAgICBpZiAoVVNFX0RJU0NPTlRJR1VPVVNfTlVSU0VSWSkKLSAgICAgIHJldHVybiBNYXAuZ2V0RGVzY3JpcHRvckZvckFkZHJlc3MoYWRkcikgPT0gTlVSU0VSWTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gYWRkci5HRShOVVJTRVJZX1NUQVJUKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IHJlc2lkZXMgd2l0aGluIHRoZSBudXJzZXJ5Ci0gICAqCi0gICAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBiZSB0ZXN0ZWQKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgcmVzaWRlcyB3aXRoaW4gdGhlIG51cnNlcnkKLSAgICovCi0gIEBJbmxpbmUKLSAgc3RhdGljIGJvb2xlYW4gaW5OdXJzZXJ5KE9iamVjdFJlZmVyZW5jZSBvYmopIHsKLSAgICByZXR1cm4gaW5OdXJzZXJ5KG9iai50b0FkZHJlc3MoKSk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBEb2VzIHRoZSBtYXR1cmUgc3BhY2UgZG8gY29weWluZyA/Ci0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBjb3B5TWF0dXJlKCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBQcmludCBwcmUtY29sbGVjdGlvbiBzdGF0aXN0aWNzLiBJbiB0aGlzIGNsYXNzIHdlIHByZWZpeCB0aGUgb3V0cHV0Ci0gICAqIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29sbGVjdGlvbiB3YXMgZnVsbCBoZWFwIG9yIG5vdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHByaW50UHJlU3RhdHMoKSB7Ci0gICAgaWYgKChPcHRpb25zLnZlcmJvc2UuZ2V0VmFsdWUoKSA+PSAxKSAmJiAoZ2NGdWxsSGVhcCkpCi0gICAgICBMb2cud3JpdGUoIltGdWxsIGhlYXBdIik7Ci0gICAgc3VwZXIucHJpbnRQcmVTdGF0cygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gVGhlIG1hdHVyZSBzcGFjZSwgc2V0IGJ5IGVhY2ggc3ViY2xhc3Mgb2YgPGNvZGU+R2VuPC9jb2RlPi4KLSAgICovCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBTcGFjZSBhY3RpdmVNYXR1cmVTcGFjZSgpOwotCi0gIC8qKgotICAgKiBAcmV0dXJuIFRydWUgaWYgd2Ugc2hvdWxkIHRyYWNlIHRoZSB3aG9sZSBoZWFwIGR1cmluZyBjb2xsZWN0aW9uLiBUcnVlIGlmCi0gICAqICAgICAgICAgd2UncmUgaWdub3JuaW5nIHJlbXNldHMgb3IgaWYgd2UncmUgZG9pbmcgYSBmdWxsIGhlYXAgR0MuCi0gICAqLwotICBwdWJsaWMgZmluYWwgYm9vbGVhbiB0cmFjZUZ1bGxIZWFwKCkgewotICAgIHJldHVybiBJR05PUkVfUkVNU0VUUyB8fCBnY0Z1bGxIZWFwOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gSXMgY3VycmVudCBHQyBvbmx5IGNvbGxlY3Rpbmcgb2JqZWN0cyBhbGxvY2F0ZWQgc2luY2UgbGFzdCBHQy4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ3VycmVudEdDTnVyc2VyeSgpIHsKLSAgICByZXR1cm4gIWdjRnVsbEhlYXA7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBJcyBsYXN0IEdDIGEgZnVsbCBjb2xsZWN0aW9uPwotICAgKi8KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gbGFzdENvbGxlY3Rpb25GdWxsSGVhcCgpIHsKLSAgICByZXR1cm4gZ2NGdWxsSGVhcDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5tbXRrLnBsYW4uUGxhbiN3aWxsTmV2ZXJNb3ZlCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgT2JqZWN0IGluIHF1ZXN0aW9uCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgb2JqZWN0IHdpbGwgbmV2ZXIgbW92ZQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIHdpbGxOZXZlck1vdmUoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmIChTcGFjZS5pc0luU3BhY2UoTlVSU0VSWSwgb2JqZWN0KSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gc3VwZXIud2lsbE5ldmVyTW92ZShvYmplY3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgZXhwZWN0ZWQgcmVmZXJlbmNlIGNvdW50LiBGb3Igbm9uLXJlZmVyZW5jZSBjb3VudGluZwotICAgKiBjb2xsZWN0b3JzIHRoaXMgYmVjb21lcyBhIHRydWUvZmFsc2UgcmVsYXRpb25zaGlwLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2hlY2suCi0gICAqIEBwYXJhbSBzYW5pdHlSb290UkMgVGhlIG51bWJlciBvZiByb290IHJlZmVyZW5jZXMgdG8gdGhlIG9iamVjdC4KLSAgICogQHJldHVybiBUaGUgZXhwZWN0ZWQgKHJvb3QgZXhjbHVkZWQpIHJlZmVyZW5jZSBjb3VudC4KLSAgICovCi0gIHB1YmxpYyBpbnQgc2FuaXR5RXhwZWN0ZWRSQyhPYmplY3RSZWZlcmVuY2Ugb2JqZWN0LCBpbnQgc2FuaXR5Um9vdFJDKSB7Ci0gICAgU3BhY2Ugc3BhY2UgPSBTcGFjZS5nZXRTcGFjZUZvck9iamVjdChvYmplY3QpOwotCi0gICAgLy8gTnVyc2VyeQotICAgIGlmIChzcGFjZSA9PSBHZW4ubnVyc2VyeVNwYWNlKSB7Ci0gICAgICByZXR1cm4gU2FuaXR5Q2hlY2tlci5ERUFEOwotICAgIH0KLQotICAgIC8vIEltbW9ydGFsIHNwYWNlcwotICAgIGlmIChzcGFjZSA9PSBHZW4uaW1tb3J0YWxTcGFjZSB8fCBzcGFjZSA9PSBHZW4udm1TcGFjZSkgewotICAgICAgcmV0dXJuIHNwYWNlLmlzUmVhY2hhYmxlKG9iamVjdCkgPyBTYW5pdHlDaGVja2VyLkFMSVZFIDogU2FuaXR5Q2hlY2tlci5ERUFEOwotICAgIH0KLQotICAgIC8vIE1hdHVyZSBzcGFjZSAobnVyc2VyeSBjb2xsZWN0aW9uKQotICAgIGlmIChWTS5hY3RpdmVQbGFuLmdsb2JhbCgpLmlzQ3VycmVudEdDTnVyc2VyeSgpKSB7Ci0gICAgICByZXR1cm4gU2FuaXR5Q2hlY2tlci5VTlNVUkU7Ci0gICAgfQotCi0gICAgLy8gTWF0dXJlIHNwYWNlIChmdWxsIGhlYXAgY29sbGVjdGlvbikKLSAgICByZXR1cm4gc3BhY2UuaXNSZWFjaGFibGUob2JqZWN0KSA/IFNhbml0eUNoZWNrZXIuQUxJVkUgOiBTYW5pdHlDaGVja2VyLkRFQUQ7Ci0gIH0KLQotICAvKioKLSAgICogUmVnaXN0ZXIgc3BlY2lhbGl6ZWQgbWV0aG9kcy4KLSAgICovCi0gIEBJbnRlcnJ1cHRpYmxlCi0gIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyU3BlY2lhbGl6ZWRNZXRob2RzKCkgewotICAgIFRyYW5zaXRpdmVDbG9zdXJlLnJlZ2lzdGVyU3BlY2lhbGl6ZWRTY2FuKFNDQU5fTlVSU0VSWSwgR2VuTnVyc2VyeVRyYWNlTG9jYWwuY2xhc3MpOwotICAgIHN1cGVyLnJlZ2lzdGVyU3BlY2lhbGl6ZWRNZXRob2RzKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9nZW5lcmF0aW9uYWwvR2VuQ29sbGVjdG9yLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vZ2VuZXJhdGlvbmFsL0dlbkNvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmE0MThjLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9nZW5lcmF0aW9uYWwvR2VuQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4uZ2VuZXJhdGlvbmFsOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi4qOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5MYXJnZU9iamVjdExvY2FsOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZGVxdWUuKjsKLQotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpbXBsZW1lbnRzIDxpPnBlci1jb2xsZWN0b3IgdGhyZWFkPC9pPgotICogYmVoYXZpb3IgYW5kIHN0YXRlIGZvciA8aT5nZW5lcmF0aW9uYWwgY29weWluZyBjb2xsZWN0b3JzPC9pPi48cD4KLSAqCi0gKiBTcGVjaWZpY2FsbHksIHRoaXMgY2xhc3MgZGVmaW5lcyBudXJzZXJ5IGNvbGxlY3Rpb24gYmVoYXZpb3IgKHRocm91Z2gKLSAqIDxjb2RlPm51cnNlcnlUcmFjZTwvY29kZT4gYW5kIHRoZSA8Y29kZT5jb2xsZWN0aW9uUGhhc2U8L2NvZGU+IG1ldGhvZCkuCi0gKiBQZXItY29sbGVjdG9yIHRocmVhZCByZW1zZXQgY29uc3VtZXJzIGFyZSBpbnN0YW50aWF0ZWQgaGVyZSAodXNlZCBieQotICogc3ViLWNsYXNzZXMpLgotICoKLSAqIEBzZWUgR2VuCi0gKiBAc2VlIEdlbk11dGF0b3IKLSAqIEBzZWUgU3RvcFRoZVdvcmxkQ29sbGVjdG9yCi0gKiBAc2VlIENvbGxlY3RvckNvbnRleHQKLSAqLwotQFVuaW50ZXJydXB0aWJsZSBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgR2VuQ29sbGVjdG9yIGV4dGVuZHMgU3RvcFRoZVdvcmxkQ29sbGVjdG9yIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogSW5zdGFuY2UgZmllbGRzCi0gICAqLwotCi0gIHByb3RlY3RlZCBmaW5hbCBHZW5OdXJzZXJ5VHJhY2VMb2NhbCBudXJzZXJ5VHJhY2U7Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIExhcmdlT2JqZWN0TG9jYWwgbG9zOwotCi0gIC8vIHJlbWVtYmVyZWQgc2V0IGNvbnN1bWVycwotICBwcm90ZWN0ZWQgZmluYWwgT2JqZWN0UmVmZXJlbmNlRGVxdWUgbW9kYnVmOwotICBwcm90ZWN0ZWQgZmluYWwgQWRkcmVzc0RlcXVlIHJlbXNldDsKLSAgcHJvdGVjdGVkIGZpbmFsIEFkZHJlc3NQYWlyRGVxdWUgYXJyYXlSZW1zZXQ7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5pdGlhbGl6YXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqCi0gICAqIE5vdGUgdGhhdCB0aGUgY29sbGVjdG9yIGlzIGEgY29uc3VtZXIgb2YgcmVtc2V0cywgd2hpbGUgdGhlCi0gICAqIG11dGF0b3IgaXMgYSBwcm9kdWNlci4gIFRoZSA8Y29kZT5HZW5NdXRhdG9yPC9jb2RlPiBjbGFzcyBpcwotICAgKiByZXNwb25zaWJsZSBmb3IgY29uc3RydWN0aW9uIG9mIHRoZSBXcml0ZUJ1ZmZlciAocHJvZHVjZXIpLgotICAgKiBAc2VlIEdlbk11dGF0b3IKLSAgICovCi0gIHB1YmxpYyBHZW5Db2xsZWN0b3IoKSB7Ci0gICAgbG9zID0gbmV3IExhcmdlT2JqZWN0TG9jYWwoUGxhbi5sb1NwYWNlKTsKLSAgICBhcnJheVJlbXNldCA9IG5ldyBBZGRyZXNzUGFpckRlcXVlKGdsb2JhbCgpLmFycmF5UmVtc2V0UG9vbCk7Ci0gICAgcmVtc2V0ID0gbmV3IEFkZHJlc3NEZXF1ZSgicmVtc2V0IiwgZ2xvYmFsKCkucmVtc2V0UG9vbCk7Ci0gICAgbW9kYnVmID0gbmV3IE9iamVjdFJlZmVyZW5jZURlcXVlKCJtb2RidWYiLCBnbG9iYWwoKS5tb2RidWZQb29sKTsKLSAgICBudXJzZXJ5VHJhY2UgPSBuZXcgR2VuTnVyc2VyeVRyYWNlTG9jYWwoZ2xvYmFsKCkubnVyc2VyeVRyYWNlLCB0aGlzKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbGxlY3Rpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSBwZXItY29sbGVjdG9yIGNvbGxlY3Rpb24gcGhhc2UuCi0gICAqCi0gICAqIEBwYXJhbSBwaGFzZUlkIFRoZSBjb2xsZWN0aW9uIHBoYXNlIHRvIHBlcmZvcm0KLSAgICogQHBhcmFtIHByaW1hcnkgVXNlIHRoaXMgdGhyZWFkIGZvciBzaW5nbGUtdGhyZWFkZWQgbG9jYWwgYWN0aXZpdGllcy4KLSAgICovCi0gIEBOb0lubGluZQotICBwdWJsaWMgdm9pZCBjb2xsZWN0aW9uUGhhc2Uoc2hvcnQgcGhhc2VJZCwgYm9vbGVhbiBwcmltYXJ5KSB7Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBHZW4uUFJFUEFSRSkgewotICAgICAgbG9zLnByZXBhcmUodHJ1ZSk7Ci0gICAgICBnbG9iYWwoKS5hcnJheVJlbXNldFBvb2wucHJlcGFyZU5vbkJsb2NraW5nKCk7Ci0gICAgICBnbG9iYWwoKS5yZW1zZXRQb29sLnByZXBhcmVOb25CbG9ja2luZygpOwotICAgICAgZ2xvYmFsKCkubW9kYnVmUG9vbC5wcmVwYXJlTm9uQmxvY2tpbmcoKTsKLSAgICAgIG51cnNlcnlUcmFjZS5wcmVwYXJlKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHBoYXNlSWQgPT0gU3RvcFRoZVdvcmxkLlJPT1RTKSB7Ci0gICAgICBWTS5zY2FubmluZy5jb21wdXRlR2xvYmFsUm9vdHMoZ2V0Q3VycmVudFRyYWNlKCkpOwotICAgICAgaWYgKCFHZW4uVVNFX05PTl9IRUFQX09CSkVDVF9SRUZFUkVOQ0VfV1JJVEVfQkFSUklFUiB8fCBnbG9iYWwoKS50cmFjZUZ1bGxIZWFwKCkpIHsKLSAgICAgICAgVk0uc2Nhbm5pbmcuY29tcHV0ZVN0YXRpY1Jvb3RzKGdldEN1cnJlbnRUcmFjZSgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChQbGFuLlNDQU5fQk9PVF9JTUFHRSAmJiBnbG9iYWwoKS50cmFjZUZ1bGxIZWFwKCkpIHsKLSAgICAgICAgVk0uc2Nhbm5pbmcuY29tcHV0ZUJvb3RJbWFnZVJvb3RzKGdldEN1cnJlbnRUcmFjZSgpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBHZW4uQ0xPU1VSRSkgewotICAgICAgaWYgKCFnbG9iYWwoKS5nY0Z1bGxIZWFwKSB7Ci0gICAgICAgIG51cnNlcnlUcmFjZS5jb21wbGV0ZVRyYWNlKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHBoYXNlSWQgPT0gR2VuLlJFTEVBU0UpIHsKLSAgICAgIGxvcy5yZWxlYXNlKHRydWUpOwotICAgICAgaWYgKCFnbG9iYWwoKS50cmFjZUZ1bGxIZWFwKCkpIHsKLSAgICAgICAgbnVyc2VyeVRyYWNlLnJlbGVhc2UoKTsKLSAgICAgICAgZ2xvYmFsKCkuYXJyYXlSZW1zZXRQb29sLnJlc2V0KCk7Ci0gICAgICAgIGdsb2JhbCgpLnJlbXNldFBvb2wucmVzZXQoKTsKLSAgICAgICAgZ2xvYmFsKCkubW9kYnVmUG9vbC5yZXNldCgpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIE1pc2NlbGxhbmVvdXMKLSAgICovCi0KLSAgLyoqIEByZXR1cm4gVGhlIGFjdGl2ZSBnbG9iYWwgcGxhbiBhcyBhIDxjb2RlPkdlbjwvY29kZT4gaW5zdGFuY2UuICovCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSBzdGF0aWMgR2VuIGdsb2JhbCgpIHsKLSAgICByZXR1cm4gKEdlbikgVk0uYWN0aXZlUGxhbi5nbG9iYWwoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBUcmFjZUxvY2FsIGdldEN1cnJlbnRUcmFjZSgpIHsKLSAgICBpZiAoZ2xvYmFsKCkudHJhY2VGdWxsSGVhcCgpKSByZXR1cm4gZ2V0RnVsbEhlYXBUcmFjZSgpOwotICAgIHJldHVybiBudXJzZXJ5VHJhY2U7Ci0gIH0KLQotICAvKiogQHJldHVybiBUaGUgdHJhY2UgdG8gdXNlIHdoZW4gY29sbGVjdGluZyB0aGUgbWF0dXJlIHNwYWNlICovCi0gIHB1YmxpYyBhYnN0cmFjdCBUcmFjZUxvY2FsIGdldEZ1bGxIZWFwVHJhY2UoKTsKLQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL2dlbmVyYXRpb25hbC9HZW5Db25zdHJhaW50cy5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL2dlbmVyYXRpb25hbC9HZW5Db25zdHJhaW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzNhOWYwLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9nZW5lcmF0aW9uYWwvR2VuQ29uc3RyYWludHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLmdlbmVyYXRpb25hbDsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uU3RvcFRoZVdvcmxkQ29uc3RyYWludHM7Ci0KLWltcG9ydCBvcmcubW10ay5wb2xpY3kuQ29weVNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgYW5kIGl0cyBzdWJjbGFzc2VzIGNvbW11bmljYXRlIHRvIHRoZSBob3N0IFZNL1J1bnRpbWUKLSAqIGFueSBmZWF0dXJlcyBvZiB0aGUgc2VsZWN0ZWQgcGxhbiB0aGF0IGl0IG5lZWRzIHRvIGtub3cuICBUaGlzIGlzCi0gKiBzZXBhcmF0ZSBmcm9tIHRoZSBtYWluIFBsYW4vUGxhbkxvY2FsIGNsYXNzIGluIG9yZGVyIHRvIGJ5cGFzcyBhbnkKLSAqIGlzc3VlcyB3aXRoIG9yZGVyaW5nIG9mIHN0YXRpYyBpbml0aWFsaXphdGlvbi4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIEdlbkNvbnN0cmFpbnRzIGV4dGVuZHMgU3RvcFRoZVdvcmxkQ29uc3RyYWludHMgewotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBwbGFuIGlzIGdlbmVyYXRpb25hbC4gKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGdlbmVyYXRpb25hbCgpIHsgcmV0dXJuIHRydWU7IH0KLQotICAvKiogQHJldHVybiBUcnVlIGlmIHRoaXMgcGxhbiBtb3ZlcyBvYmplY3RzLiAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gbW92ZXNPYmplY3RzKCkgeyByZXR1cm4gdHJ1ZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgaGVhZGVyIGJpdHMgdGhhdCBhcmUgcmVxdWlyZWQuICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IGdjSGVhZGVyQml0cygpIHsgcmV0dXJuIENvcHlTcGFjZS5MT0NBTF9HQ19CSVRTX1JFUVVJUkVEOyB9Ci0KLSAgLyoqIEByZXR1cm4gVGhlIG51bWJlciBvZiBoZWFkZXIgd29yZHMgdGhhdCBhcmUgcmVxdWlyZWQuICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IGdjSGVhZGVyV29yZHMoKSB7IHJldHVybiBDb3B5U3BhY2UuR0NfSEVBREVSX1dPUkRTX1JFUVVJUkVEOyB9Ci0KLSAgLyoqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHBsYW4gcmVxdWlyZXMgYSB3cml0ZSBiYXJyaWVyICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBuZWVkc09iamVjdFJlZmVyZW5jZVdyaXRlQmFycmllcigpIHsgcmV0dXJuIHRydWU7IH0KLQotICAvKiogQHJldHVybiBUcnVlIGlmIHRoaXMgcGxhbiByZXF1aXJlcyBhIHN0YXRpYyBiYXJyaWVyICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBuZWVkc09iamVjdFJlZmVyZW5jZU5vbkhlYXBXcml0ZUJhcnJpZXIoKSB7IHJldHVybiBHZW4uVVNFX05PTl9IRUFQX09CSkVDVF9SRUZFUkVOQ0VfV1JJVEVfQkFSUklFUjsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIGNhbiBwZXJmb3JtIGJ1bGsgb2JqZWN0IGFycmF5Y29weSBiYXJyaWVycy4gKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIG9iamVjdFJlZmVyZW5jZUJ1bGtDb3B5U3VwcG9ydGVkKCkgeyByZXR1cm4gdHJ1ZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRoZSBzcGVjaWFsaXplZCBzY2FuIG1ldGhvZHMgcmVxdWlyZWQgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgbnVtU3BlY2lhbGl6ZWRTY2FucygpIHsgcmV0dXJuIDI7IH0KLQotICAvKiogQHJldHVybiBUcnVlIGlmIHRoaXMgUGxhbiByZXF1aXJlcyBhIGhlYWRlciBiaXQgZm9yIG9iamVjdCBsb2dnaW5nICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBuZWVkc0xvZ0JpdEluSGVhZGVyKCkgeyByZXR1cm4gR2VuLlVTRV9PQkpFQ1RfQkFSUklFUjsgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFRoZSBtYXhpbXVtIHNpemUgb2YgYW4gb2JqZWN0IHRoYXQgbWF5IGJlIGFsbG9jYXRlZCBkaXJlY3RseSBpbnRvIHRoZSBudXJzZXJ5Ci0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBtYXhOb25MT1NEZWZhdWx0QWxsb2NCeXRlcygpIHsKLSAgICAvKgotICAgICAqIElmIHRoZSBudXJzZXJ5IGlzIGRpc2NvbnRpZ3VvdXMsIHRoZSBtYXhpbXVtIG9iamVjdCBpcyBlc3NlbnRpYWxseSB1bmJvdW5kZWQuICBJbgotICAgICAqIGEgY29udGlndW91cyBudXJzZXJ5LCB3ZSBjYW4ndCBhdHRlbXB0IHRvIG51cnNlcnktYWxsb2NhdGUgb2JqZWN0cyBsYXJnZXIgdGhhbiB0aGUKLSAgICAgKiBhdmFpbGFibGUgbnVyc2VyeSB2aXJ0dWFsIG1lbW9yeS4KLSAgICAgKi8KLSAgICByZXR1cm4gIEdlbi5VU0VfRElTQ09OVElHVU9VU19OVVJTRVJZID8KLSAgICAgICAgb3JnLm1tdGsudXRpbGl0eS5Db25zdGFudHMuTUFYX0lOVCA6Ci0gICAgICAgIFNwYWNlLmdldEZyYWNBdmFpbGFibGUoR2VuLk5VUlNFUllfVk1fRlJBQ1RJT04pLnRvSW50KCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL2dlbmVyYXRpb25hbC9HZW5NYXR1cmVUcmFjZUxvY2FsLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vZ2VuZXJhdGlvbmFsL0dlbk1hdHVyZVRyYWNlTG9jYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRjYjBiZi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vZ2VuZXJhdGlvbmFsL0dlbk1hdHVyZVRyYWNlTG9jYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5nZW5lcmF0aW9uYWw7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYWNlTG9jYWw7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5UcmFjZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkhlYWRlckJ5dGU7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5kZXF1ZS4qOwotCi1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpbXBsbWVudHMgdGhlIGNvcmUgZnVuY3Rpb25hbGl0eSBmb3IgYSB0cmFuc2l0aXZlCi0gKiBjbG9zdXJlIG92ZXIgdGhlIGhlYXAgZ3JhcGguCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHZW5NYXR1cmVUcmFjZUxvY2FsIGV4dGVuZHMgVHJhY2VMb2NhbCB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5zdGFuY2UgZmllbGRzLgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBPYmplY3RSZWZlcmVuY2VEZXF1ZSBtb2RidWY7Ci0gIHByaXZhdGUgZmluYWwgQWRkcmVzc0RlcXVlIHJlbXNldDsKLSAgcHJpdmF0ZSBmaW5hbCBBZGRyZXNzUGFpckRlcXVlIGFycmF5UmVtc2V0OwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluaXRpYWxpemF0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIEdlbk1hdHVyZVRyYWNlTG9jYWwoaW50IHNwZWNpYWxpemVkU2NhbiwgVHJhY2UgdHJhY2UsIEdlbkNvbGxlY3RvciBwbGFuKSB7Ci0gICAgc3VwZXIoc3BlY2lhbGl6ZWRTY2FuLCB0cmFjZSk7Ci0gICAgdGhpcy5tb2RidWYgPSBwbGFuLm1vZGJ1ZjsKLSAgICB0aGlzLnJlbXNldCA9IHBsYW4ucmVtc2V0OwotICAgIHRoaXMuYXJyYXlSZW1zZXQgPSBwbGFuLmFycmF5UmVtc2V0OwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqLwotICBwdWJsaWMgR2VuTWF0dXJlVHJhY2VMb2NhbChUcmFjZSB0cmFjZSwgR2VuQ29sbGVjdG9yIHBsYW4pIHsKLSAgICBzdXBlcihHZW4uU0NBTl9NQVRVUkUsIHRyYWNlKTsKLSAgICB0aGlzLm1vZGJ1ZiA9IHBsYW4ubW9kYnVmOwotICAgIHRoaXMucmVtc2V0ID0gcGxhbi5yZW1zZXQ7Ci0gICAgdGhpcy5hcnJheVJlbXNldCA9IHBsYW4uYXJyYXlSZW1zZXQ7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBPYmplY3QgcHJvY2Vzc2luZyBhbmQgdHJhY2luZwotICAgKi8KLQotICAvKioKLSAgICogSXMgdGhlIHNwZWNpZmllZCBvYmplY3QgbGl2ZT8KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0LgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9iamVjdCBpcyBsaXZlLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgYm9vbGVhbiBpc0xpdmUoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KCFvYmplY3QuaXNOdWxsKCkpOwotICAgIGlmIChHZW4uaW5OdXJzZXJ5KG9iamVjdCkpIHsKLSAgICAgIHJldHVybiBHZW4ubnVyc2VyeVNwYWNlLmlzTGl2ZShvYmplY3QpOwotICAgIH0KLSAgICByZXR1cm4gc3VwZXIuaXNMaXZlKG9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRydWUgaWYgdGhpcyBvYmplY3QgaXMgZ3VhcmFudGVlZCBub3QgdG8gbW92ZSBkdXJpbmcgdGhpcwotICAgKiBjb2xsZWN0aW9uIChpLmUuIHRoaXMgb2JqZWN0IGlzIGRlZmludGVseSBub3QgYW4gdW5mb3J3YXJkZWQKLSAgICogb2JqZWN0KS4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBvYmplY3QgaXMgZ3VhcmFudGVlZCBub3QgdG8gbW92ZSBkdXJpbmcgdGhpcwotICAgKiAgICAgICAgIGNvbGxlY3Rpb24uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiB3aWxsTm90TW92ZUluQ3VycmVudENvbGxlY3Rpb24oT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmIChHZW4uaW5OdXJzZXJ5KG9iamVjdCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHN1cGVyLndpbGxOb3RNb3ZlSW5DdXJyZW50Q29sbGVjdGlvbihvYmplY3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIHRoZSBjb3JlIG1ldGhvZCBkdXJpbmcgdGhlIHRyYWNlIG9mIHRoZSBvYmplY3QgZ3JhcGguCi0gICAqIFRoZSByb2xlIG9mIHRoaXMgbWV0aG9kIGlzIHRvOgotICAgKgotICAgKiAxLiBFbnN1cmUgdGhlIHRyYWNlZCBvYmplY3QgaXMgbm90IGNvbGxlY3RlZC4KLSAgICogMi4gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdmlzaXQgdG8gdGhlIG9iamVjdCBlbnF1ZXVlIGl0IHRvIGJlIHNjYW5uZWQuCi0gICAqIDMuIFJldHVybiB0aGUgZm9yd2FyZGVkIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgdHJhY2VkLgotICAgKiBAcmV0dXJuIFRoZSBuZXcgcmVmZXJlbmNlIHRvIHRoZSBzYW1lIG9iamVjdCBpbnN0YW5jZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIE9iamVjdFJlZmVyZW5jZSB0cmFjZU9iamVjdChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoIW9iamVjdC5pc051bGwoKSk7Ci0gICAgaWYgKEdlbi5pbk51cnNlcnkob2JqZWN0KSkKLSAgICAgIHJldHVybiBHZW4ubnVyc2VyeVNwYWNlLnRyYWNlT2JqZWN0KHRoaXMsIG9iamVjdCwgR2VuLkFMTE9DX01BVFVSRV9NQUpPUkdDKTsKLSAgICByZXR1cm4gc3VwZXIudHJhY2VPYmplY3Qob2JqZWN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBQcm9jZXNzIGFueSByZW1lbWJlcmVkIHNldCBlbnRyaWVzLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1JlbWVtYmVyZWRTZXRzKCkgewotICAgIGxvZ01lc3NhZ2UoNSwgImNsZWFyaW5nIG1vZGJ1ZiIpOwotICAgIE9iamVjdFJlZmVyZW5jZSBvYmo7Ci0gICAgd2hpbGUgKCEob2JqID0gbW9kYnVmLnBvcCgpKS5pc051bGwoKSkgewotICAgICAgSGVhZGVyQnl0ZS5tYXJrQXNVbmxvZ2dlZChvYmopOwotICAgIH0KLSAgICBsb2dNZXNzYWdlKDUsICJjbGVhcmluZyByZW1zZXQiKTsKLSAgICB3aGlsZSAoIXJlbXNldC5pc0VtcHR5KCkpIHsKLSAgICAgIHJlbXNldC5wb3AoKTsKLSAgICB9Ci0gICAgbG9nTWVzc2FnZSg1LCAiY2xlYXJpbmcgYXJyYXkgcmVtc2V0Iik7Ci0gICAgd2hpbGUgKCFhcnJheVJlbXNldC5pc0VtcHR5KCkpIHsKLSAgICAgIGFycmF5UmVtc2V0LnBvcDEoKTsKLSAgICAgIGFycmF5UmVtc2V0LnBvcDIoKTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL2dlbmVyYXRpb25hbC9HZW5NdXRhdG9yLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vZ2VuZXJhdGlvbmFsL0dlbk11dGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhhMWQyMy4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vZ2VuZXJhdGlvbmFsL0dlbk11dGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5nZW5lcmF0aW9uYWw7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLio7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LkNvcHlMb2NhbDsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5IZWFkZXJCeXRlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZGVxdWUuKjsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmFsbG9jLkFsbG9jYXRvcjsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LnN0YXRpc3RpY3MuU3RhdHM7Ci1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci1pbXBvcnQgc3RhdGljIG9yZy5tbXRrLnBsYW4uZ2VuZXJhdGlvbmFsLkdlbi5VU0VfT0JKRUNUX0JBUlJJRVJfRk9SX0FBU1RPUkU7Ci1pbXBvcnQgc3RhdGljIG9yZy5tbXRrLnBsYW4uZ2VuZXJhdGlvbmFsLkdlbi5VU0VfT0JKRUNUX0JBUlJJRVJfRk9SX1BVVEZJRUxEOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgaW1wbGVtZW50cyA8aT5wZXItbXV0YXRvciB0aHJlYWQ8L2k+IGJlaGF2aW9yCi0gKiBhbmQgc3RhdGUgZm9yIDxpPmdlbmVyYXRpb25hbCBjb3B5aW5nIGNvbGxlY3RvcnM8L2k+LjxwPgotICoKLSAqIFNwZWNpZmljYWxseSwgdGhpcyBjbGFzcyBkZWZpbmVzIG11dGF0b3ItdGltZSBhbGxvY2F0aW9uIGludG8gdGhlIG51cnNlcnk7Ci0gKiB3cml0ZSBiYXJyaWVyIHNlbWFudGljcywgYW5kIHBlci1tdXRhdG9yIHRocmVhZCBjb2xsZWN0aW9uIHNlbWFudGljcwotICogKGZsdXNoaW5nIGFuZCByZXN0b3JpbmcgcGVyLW11dGF0b3IgYWxsb2NhdG9yIGFuZCByZW1zZXQgc3RhdGUpLgotICoKLSAqIEBzZWUgR2VuCi0gKiBAc2VlIEdlbkNvbGxlY3RvcgotICogQHNlZSBTdG9wVGhlV29ybGRNdXRhdG9yCi0gKiBAc2VlIE11dGF0b3JDb250ZXh0Ci0gKi8KLUBVbmludGVycnVwdGlibGUgcHVibGljIGNsYXNzIEdlbk11dGF0b3IgZXh0ZW5kcyBTdG9wVGhlV29ybGRNdXRhdG9yIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5zdGFuY2UgZmllbGRzCi0gICAqLwotICBwcm90ZWN0ZWQgZmluYWwgQ29weUxvY2FsIG51cnNlcnkgPSBuZXcgQ29weUxvY2FsKEdlbi5udXJzZXJ5U3BhY2UpOwotCi0gIHByaXZhdGUgZmluYWwgT2JqZWN0UmVmZXJlbmNlRGVxdWUgbW9kYnVmOyAgICAvKiByZW1lbWJlciBtb2RpZmllZCBzY2FsYXJzICovCi0gIHByb3RlY3RlZCBmaW5hbCBXcml0ZUJ1ZmZlciByZW1zZXQ7ICAgICAgICAgICAvKiByZW1lbWJlciBtb2RpZmllZCBhcnJheSBmaWVsZHMgKi8KLSAgcHJvdGVjdGVkIGZpbmFsIEFkZHJlc3NQYWlyRGVxdWUgYXJyYXlSZW1zZXQ7IC8qIHJlbWVtYmVyIG1vZGlmaWVkIGFycmF5IHJhbmdlcyAqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluaXRpYWxpemF0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKgotICAgKiBOb3RlIHRoYXQgZWFjaCBtdXRhdG9yIGlzIGEgcHJvZHVjZXIgb2YgcmVtc2V0cywgd2hpbGUgZWFjaAotICAgKiBjb2xsZWN0b3IgaXMgYSBjb25zdW1lci4gIFRoZSA8Y29kZT5HZW5Db2xsZWN0b3I8L2NvZGU+IGNsYXNzCi0gICAqIGlzIHJlc3BvbnNpYmxlIGZvciBjb25zdHJ1Y3Rpb24gb2YgdGhlIGNvbnN1bWVyLgotICAgKiBAc2VlIEdlbkNvbGxlY3RvcgotICAgKi8KLSAgcHVibGljIEdlbk11dGF0b3IoKSB7Ci0gICAgbW9kYnVmID0gbmV3IE9iamVjdFJlZmVyZW5jZURlcXVlKCJtb2RidWYiLCBnbG9iYWwoKS5tb2RidWZQb29sKTsKLSAgICByZW1zZXQgPSBuZXcgV3JpdGVCdWZmZXIoZ2xvYmFsKCkucmVtc2V0UG9vbCk7Ci0gICAgYXJyYXlSZW1zZXQgPSBuZXcgQWRkcmVzc1BhaXJEZXF1ZShnbG9iYWwoKS5hcnJheVJlbXNldFBvb2wpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogTXV0YXRvci10aW1lIGFsbG9jYXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIEFsbG9jYXRlIG1lbW9yeSBmb3IgYW4gb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIG9iamVjdC4KLSAgICogQHBhcmFtIGFsaWduIFJlcXVpcmVkIGFsaWdubWVudCBmb3IgdGhlIG9iamVjdC4KLSAgICogQHBhcmFtIG9mZnNldCBPZmZzZXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbGlnbm1lbnQuCi0gICAqIEBwYXJhbSBhbGxvY2F0b3IgVGhlIGFsbG9jYXRvciBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXF1ZXN0LgotICAgKiBAcGFyYW0gc2l0ZSBBbGxvY2F0aW9uIHNpdGUKLSAgICogQHJldHVybiBUaGUgbG93IGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBBZGRyZXNzIGFsbG9jKGludCBieXRlcywgaW50IGFsaWduLCBpbnQgb2Zmc2V0LCBpbnQgYWxsb2NhdG9yLCBpbnQgc2l0ZSkgewotICAgIGlmIChhbGxvY2F0b3IgPT0gR2VuLkFMTE9DX05VUlNFUlkpIHsKLSAgICAgIGlmIChTdGF0cy5HQVRIRVJfTUFSS19DT05TX1NUQVRTKSBHZW4ubnVyc2VyeUNvbnMuaW5jKGJ5dGVzKTsKLSAgICAgIHJldHVybiBudXJzZXJ5LmFsbG9jKGJ5dGVzLCBhbGlnbiwgb2Zmc2V0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLmFsbG9jKGJ5dGVzLCBhbGlnbiwgb2Zmc2V0LCBhbGxvY2F0b3IsIHNpdGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFBlcmZvcm0gcG9zdC1hbGxvY2F0aW9uIGFjdGlvbnMuICBGb3IgbWFueSBhbGxvY2F0b3JzIG5vbmUgYXJlCi0gICAqIHJlcXVpcmVkLgotICAgKgotICAgKiBAcGFyYW0gcmVmIFRoZSBuZXdseSBhbGxvY2F0ZWQgb2JqZWN0Ci0gICAqIEBwYXJhbSB0eXBlUmVmIHRoZSB0eXBlIHJlZmVyZW5jZSBmb3IgdGhlIGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBzaXplIG9mIHRoZSBzcGFjZSB0byBiZSBhbGxvY2F0ZWQgKGluIGJ5dGVzKQotICAgKiBAcGFyYW0gYWxsb2NhdG9yIFRoZSBhbGxvY2F0b3IgbnVtYmVyIHRvIGJlIHVzZWQgZm9yIHRoaXMgYWxsb2NhdGlvbgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgdm9pZCBwb3N0QWxsb2MoT2JqZWN0UmVmZXJlbmNlIHJlZiwgT2JqZWN0UmVmZXJlbmNlIHR5cGVSZWYsCi0gICAgICBpbnQgYnl0ZXMsIGludCBhbGxvY2F0b3IpIHsKLSAgICBpZiAoYWxsb2NhdG9yICE9IEdlbi5BTExPQ19OVVJTRVJZKSB7Ci0gICAgICBzdXBlci5wb3N0QWxsb2MocmVmLCB0eXBlUmVmLCBieXRlcywgYWxsb2NhdG9yKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBhbGxvY2F0b3IgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGEgc3BhY2UKLSAgICogPGNvZGU+c3BhY2U8L2NvZGU+LCBmb3IgdGhpcyBwbGFuIGluc3RhbmNlLgotICAgKgotICAgKiBAcGFyYW0gc3BhY2UgVGhlIHNwYWNlIGZvciB3aGljaCB0aGUgYWxsb2NhdG9yIGluc3RhbmNlIGlzIGRlc2lyZWQuCi0gICAqIEByZXR1cm4gVGhlIGFsbG9jYXRvciBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwbGFuIGluc3RhbmNlCi0gICAqIHdoaWNoIGlzIGFsbG9jYXRpbmcgaW50byA8Y29kZT5zcGFjZTwvY29kZT4sIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAqIGlmIG5vIGFwcHJvcHJpYXRlIGFsbG9jYXRvciBjYW4gYmUgZXN0YWJsaXNoZWQuCi0gICAqLwotICBwdWJsaWMgQWxsb2NhdG9yIGdldEFsbG9jYXRvckZyb21TcGFjZShTcGFjZSBzcGFjZSkgewotICAgIGlmIChzcGFjZSA9PSBHZW4ubnVyc2VyeVNwYWNlKSByZXR1cm4gbnVyc2VyeTsKLSAgICByZXR1cm4gc3VwZXIuZ2V0QWxsb2NhdG9yRnJvbVNwYWNlKHNwYWNlKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEJhcnJpZXJzCi0gICAqLwotCi0gIC8qKgotICAgKiBQZXJmb3JtIHRoZSB3cml0ZSBiYXJyaWVyIGZhc3QgcGF0aCwgd2hpY2ggbWF5IGludm9sdmUgcmVtZW1iZXJpbmcKLSAgICogYSByZWZlcmVuY2UgaWYgbmVjZXNzYXJ5LgotICAgKgotICAgKiBAcGFyYW0gc3JjIFRoZSBvYmplY3QgaW50byB3aGljaCB0aGUgbmV3IHJlZmVyZW5jZSB3aWxsIGJlIHN0b3JlZAotICAgKiBAcGFyYW0gc2xvdCBUaGUgYWRkcmVzcyBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUKLSAgICogc3RvcmVkLgotICAgKiBAcGFyYW0gdGd0IFRoZSB0YXJnZXQgb2YgdGhlIG5ldyByZWZlcmVuY2UKLSAgICogQHBhcmFtIG1vZGUgVGhlIG1vZGUgb2YgdGhlIHN0b3JlIChlZyBwdXRmaWVsZCwgcHV0c3RhdGljIGV0YykKLSAgICovCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSB2b2lkIGZhc3RQYXRoKE9iamVjdFJlZmVyZW5jZSBzcmMsIEFkZHJlc3Mgc2xvdCwgT2JqZWN0UmVmZXJlbmNlIHRndCwgaW50IG1vZGUpIHsKLSAgICBpZiAoR2VuLkdBVEhFUl9XUklURV9CQVJSSUVSX1NUQVRTKSBHZW4ud2JGYXN0LmluYygpOwotICAgIGlmICgobW9kZSA9PSBBUlJBWV9FTEVNRU5UICYmIFVTRV9PQkpFQ1RfQkFSUklFUl9GT1JfQUFTVE9SRSkgfHwKLSAgICAgICAgKG1vZGUgPT0gSU5TVEFOQ0VfRklFTEQgJiYgVVNFX09CSkVDVF9CQVJSSUVSX0ZPUl9QVVRGSUVMRCkpIHsKLSAgICAgIGlmIChIZWFkZXJCeXRlLmlzVW5sb2dnZWQoc3JjKSkgewotICAgICAgICBpZiAoR2VuLkdBVEhFUl9XUklURV9CQVJSSUVSX1NUQVRTKSBHZW4ud2JTbG93LmluYygpOwotICAgICAgICBIZWFkZXJCeXRlLm1hcmtBc0xvZ2dlZChzcmMpOwotICAgICAgICBtb2RidWYuaW5zZXJ0KHNyYyk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICghR2VuLmluTnVyc2VyeShzbG90KSAmJiBHZW4uaW5OdXJzZXJ5KHRndCkpIHsKLSAgICAgICAgaWYgKEdlbi5HQVRIRVJfV1JJVEVfQkFSUklFUl9TVEFUUykgR2VuLndiU2xvdy5pbmMoKTsKLSAgICAgICAgcmVtc2V0Lmluc2VydChzbG90KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQSBuZXcgcmVmZXJlbmNlIGlzIGFib3V0IHRvIGJlIGNyZWF0ZWQuICBUYWtlIGFwcHJvcHJpYXRlIHdyaXRlCi0gICAqIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogSW4gdGhpcyBjYXNlLCB3ZSByZW1lbWJlciB0aGUgYWRkcmVzcyBvZiB0aGUgc291cmNlIG9mIHRoZQotICAgKiBwb2ludGVyIGlmIHRoZSBuZXcgcmVmZXJlbmNlIHBvaW50cyBpbnRvIHRoZSBudXJzZXJ5IGZyb20KLSAgICogbm9uLW51cnNlcnkgc3BhY2UuCi0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUgc3RvcmVkCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZQotICAgKiBzdG9yZWQuCi0gICAqIEBwYXJhbSB0Z3QgVGhlIHRhcmdldCBvZiB0aGUgbmV3IHJlZmVyZW5jZQotICAgKiBAcGFyYW0gbWV0YURhdGFBIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIHN0b3JlCi0gICAqIEBwYXJhbSBtb2RlIFRoZSBtb2RlIG9mIHRoZSBzdG9yZSAoZWcgcHV0ZmllbGQsIHB1dHN0YXRpYyBldGMpCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBmaW5hbCB2b2lkIG9iamVjdFJlZmVyZW5jZVdyaXRlKE9iamVjdFJlZmVyZW5jZSBzcmMsIEFkZHJlc3Mgc2xvdCwKLSAgICAgIE9iamVjdFJlZmVyZW5jZSB0Z3QsIFdvcmQgbWV0YURhdGFBLAotICAgICAgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKSB7Ci0gICAgZmFzdFBhdGgoc3JjLCBzbG90LCB0Z3QsIG1vZGUpOwotICAgIFZNLmJhcnJpZXJzLm9iamVjdFJlZmVyZW5jZVdyaXRlKHNyYywgdGd0LCBtZXRhRGF0YUEsIG1ldGFEYXRhQiwgbW9kZSk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBQZXJmb3JtIHRoZSByb290IHdyaXRlIGJhcnJpZXIgZmFzdCBwYXRoLCB3aGljaCBtYXkgaW52b2x2ZSByZW1lbWJlcmluZwotICAgKiBhIHJlZmVyZW5jZSBpZiBuZWNlc3NhcnkuCi0gICAqCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZQotICAgKiBzdG9yZWQuCi0gICAqIEBwYXJhbSB0Z3QgVGhlIHRhcmdldCBvZiB0aGUgbmV3IHJlZmVyZW5jZQotICAgKiBAcGFyYW0gbW9kZSBUaGUgbW9kZSBvZiB0aGUgc3RvcmUgKGVnIHB1dGZpZWxkLCBwdXRzdGF0aWMgZXRjKQotICAgKi8KLSAgQElubGluZQotICBwcml2YXRlIHZvaWQgZmFzdFBhdGgoQWRkcmVzcyBzbG90LCBPYmplY3RSZWZlcmVuY2UgdGd0KSB7Ci0gICAgaWYgKEdlbi5HQVRIRVJfV1JJVEVfQkFSUklFUl9TVEFUUykgR2VuLndiRmFzdC5pbmMoKTsKLSAgICBpZiAoR2VuLmluTnVyc2VyeSh0Z3QpKSB7Ci0gICAgICBpZiAoR2VuLkdBVEhFUl9XUklURV9CQVJSSUVSX1NUQVRTKSBHZW4ud2JTbG93LmluYygpOwotICAgICAgcmVtc2V0Lmluc2VydChzbG90KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQSBuZXcgcmVmZXJlbmNlIGlzIGFib3V0IHRvIGJlIGNyZWF0ZWQgaW4gYSBsb2NhdGlvbiB0aGF0IGlzIG5vdAotICAgKiBhIHJlZ3VsYXIgaGVhcCBvYmplY3QuICBUYWtlIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogSW4gdGhpcyBjYXNlLCB3ZSByZW1lbWJlciB0aGUgYWRkcmVzcyBvZiB0aGUgc291cmNlIG9mIHRoZQotICAgKiBwb2ludGVyIGlmIHRoZSBuZXcgcmVmZXJlbmNlIHBvaW50cyBpbnRvIHRoZSBudXJzZXJ5IGZyb20KLSAgICogbm9uLW51cnNlcnkgc3BhY2UuCi0gICAqCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZQotICAgKiBzdG9yZWQuCi0gICAqIEBwYXJhbSB0Z3QgVGhlIHRhcmdldCBvZiB0aGUgbmV3IHJlZmVyZW5jZQotICAgKiBAcGFyYW0gbWV0YURhdGFBIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIHN0b3JlCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBmaW5hbCB2b2lkIG9iamVjdFJlZmVyZW5jZU5vbkhlYXBXcml0ZShBZGRyZXNzIHNsb3QsIE9iamVjdFJlZmVyZW5jZSB0Z3QsCi0gICAgICBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIpIHsKLSAgICBmYXN0UGF0aChzbG90LCB0Z3QpOwotICAgIFZNLmJhcnJpZXJzLm9iamVjdFJlZmVyZW5jZU5vbkhlYXBXcml0ZShzbG90LCB0Z3QsIG1ldGFEYXRhQSwgbWV0YURhdGFCKTsKLSAgfQotCi0gIC8qKgotICAgKiBBdHRlbXB0IHRvIGF0b21pY2FsbHkgZXhjaGFuZ2UgdGhlIHZhbHVlIGluIHRoZSBnaXZlbiBzbG90Ci0gICAqIHdpdGggdGhlIHBhc3NlZCByZXBsYWNlbWVudCB2YWx1ZS4gSWYgYSBuZXcgcmVmZXJlbmNlIGlzCi0gICAqIGNyZWF0ZWQsIHdlIG11c3QgdGhlbiB0YWtlIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogSW4gdGhpcyBjYXNlLCB3ZSByZW1lbWJlciB0aGUgYWRkcmVzcyBvZiB0aGUgc291cmNlIG9mIHRoZQotICAgKiBwb2ludGVyIGlmIHRoZSBuZXcgcmVmZXJlbmNlIHBvaW50cyBpbnRvIHRoZSBudXJzZXJ5IGZyb20KLSAgICogbm9uLW51cnNlcnkgc3BhY2UuCi0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUgc3RvcmVkCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZQotICAgKiBzdG9yZWQuCi0gICAqIEBwYXJhbSBvbGQgVGhlIG9sZCByZWZlcmVuY2UgdG8gYmUgc3dhcHBlZCBvdXQKLSAgICogQHBhcmFtIHRndCBUaGUgdGFyZ2V0IG9mIHRoZSBuZXcgcmVmZXJlbmNlCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbWV0YURhdGFCIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHN0b3JlIG9jY3VyZWQKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBzd2FwIHdhcyBzdWNjZXNzZnVsLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgYm9vbGVhbiBvYmplY3RSZWZlcmVuY2VUcnlDb21wYXJlQW5kU3dhcChPYmplY3RSZWZlcmVuY2Ugc3JjLCBBZGRyZXNzIHNsb3QsIE9iamVjdFJlZmVyZW5jZSBvbGQsIE9iamVjdFJlZmVyZW5jZSB0Z3QsCi0gICAgICBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKSB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBWTS5iYXJyaWVycy5vYmplY3RSZWZlcmVuY2VUcnlDb21wYXJlQW5kU3dhcChzcmMsIG9sZCwgdGd0LCBtZXRhRGF0YUEsIG1ldGFEYXRhQiwgbW9kZSk7Ci0gICAgaWYgKHJlc3VsdCkKLSAgICAgIGZhc3RQYXRoKHNyYywgc2xvdCwgdGd0LCBtb2RlKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIEEgbnVtYmVyIG9mIHJlZmVyZW5jZXMgYXJlIGFib3V0IHRvIGJlIGNvcGllZCBmcm9tIG9iamVjdAotICAgKiA8Y29kZT5zcmM8L2NvZGU+IHRvIG9iamVjdCA8Y29kZT5kc3Q8L2NvZGU+IChhcyBpbiBhbiBhcnJheQotICAgKiBjb3B5KS4gIFRodXMsIDxjb2RlPmRzdDwvY29kZT4gaXMgdGhlIG11dGF0ZWQgb2JqZWN0LiAgVGFrZQotICAgKiBhcHByb3ByaWF0ZSB3cml0ZSBiYXJyaWVyIGFjdGlvbnMuPHA+Ci0gICAqCi0gICAqIEluIHRoaXMgY2FzZSwgd2UgcmVtZW1iZXIgdGhlIG11dGF0ZWQgc291cmNlIGFkZHJlc3MgcmFuZ2UgYW5kCi0gICAqIHdpbGwgc2NhbiB0aGF0IGFkZHJlc3MgcmFuZ2UgYXQgR0MgdGltZS4KLSAgICoKLSAgICogQHBhcmFtIHNyYyBUaGUgc291cmNlIG9mIHRoZSB2YWx1ZXMgdG8gYmUgY29waWVkCi0gICAqIEBwYXJhbSBzcmNJZHggVGhlIHN0YXJ0aW5nIHNvdXJjZSBpbmRleAotICAgKiBAcGFyYW0gZHN0IFRoZSBtdXRhdGVkIG9iamVjdCwgaS5lLiB0aGUgZGVzdGluYXRpb24gb2YgdGhlIGNvcHkuCi0gICAqIEBwYXJhbSBzcmNJZHggVGhlIHN0YXJ0aW5nIHNvdXJjZSBpbmRleAotICAgKiBAcGFyYW0gbGVuIFRoZSBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgdG8gYmUgY29waWVkCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgdXBkYXRlIHdhcyBwZXJmb3JtZWQgYnkgdGhlIGJhcnJpZXIsIGZhbHNlIGlmCi0gICAqIGxlZnQgdG8gdGhlIGNhbGxlciAoYWx3YXlzIGZhbHNlIGluIHRoaXMgY2FzZSkuCi0gICAqLwotICBASW5saW5lCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBvYmplY3RSZWZlcmVuY2VCdWxrQ29weShPYmplY3RSZWZlcmVuY2Ugc3JjLCBPZmZzZXQgc3JjT2Zmc2V0LCBPYmplY3RSZWZlcmVuY2UgZHN0LCBPZmZzZXQgZHN0T2Zmc2V0LCBpbnQgYnl0ZXMpIHsKLSAgICBpZiAoIUdlbi5pbk51cnNlcnkoZHN0KSkgewotICAgICAgQWRkcmVzcyBzdGFydCA9IGRzdC50b0FkZHJlc3MoKS5wbHVzKGRzdE9mZnNldCk7Ci0gICAgICBhcnJheVJlbXNldC5pbnNlcnQoc3RhcnQsIHN0YXJ0LnBsdXMoYnl0ZXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEZsdXNoIHBlci1tdXRhdG9yIHJlbWVtYmVyZWQgc2V0cyBpbnRvIHRoZSBnbG9iYWwgcmVtc2V0IHBvb2wuCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCBmbHVzaFJlbWVtYmVyZWRTZXRzKCkgewotICAgIG1vZGJ1Zi5mbHVzaExvY2FsKCk7Ci0gICAgcmVtc2V0LmZsdXNoTG9jYWwoKTsKLSAgICBhcnJheVJlbXNldC5mbHVzaExvY2FsKCk7Ci0gICAgYXNzZXJ0UmVtc2V0c0ZsdXNoZWQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBBc3NlcnQgdGhhdCB0aGUgcmVtc2V0cyBoYXZlIGJlZW4gZmx1c2hlZC4gIFRoaXMgaXMgY3JpdGljYWwgdG8KLSAgICogY29ycmVjdG5lc3MuICBXZSBuZWVkIHRvIG1haW50YWluIHRoZSBpbnZhcmlhbnQgdGhhdCByZW1zZXQgZW50cmllcwotICAgKiBkbyBub3QgYWNjcnVlIGR1cmluZyBHQy4gIElmIHRoZSBob3N0IEpWTSBnZW5lcmF0ZXMgYmFycmllciBlbnRpcmVzCi0gICAqIGl0IGlzIGl0cyBvd24gcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgdGhleSBhcmUgZmx1c2hlZCBiZWZvcmUKLSAgICogcmV0dXJuaW5nIHRvIE1NVGsuCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCBhc3NlcnRSZW1zZXRzRmx1c2hlZCgpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIHsKLSAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChtb2RidWYuaXNGbHVzaGVkKCkpOwotICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KHJlbXNldC5pc0ZsdXNoZWQoKSk7Ci0gICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQoYXJyYXlSZW1zZXQuaXNGbHVzaGVkKCkpOwotICAgIH0KLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbGxlY3Rpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSBwZXItbXV0YXRvciBjb2xsZWN0aW9uIHBoYXNlLgotICAgKi8KLSAgQE5vSW5saW5lCi0gIHB1YmxpYyB2b2lkIGNvbGxlY3Rpb25QaGFzZShzaG9ydCBwaGFzZUlkLCBib29sZWFuIHByaW1hcnkpIHsKLQotICAgIGlmIChwaGFzZUlkID09IEdlbi5QUkVQQVJFKSB7Ci0gICAgICBudXJzZXJ5LnJlc2V0KCk7Ci0gICAgICBpZiAoZ2xvYmFsKCkudHJhY2VGdWxsSGVhcCgpKSB7Ci0gICAgICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KTsKLSAgICAgICAgbW9kYnVmLmZsdXNoTG9jYWwoKTsKLSAgICAgICAgcmVtc2V0LnJlc2V0TG9jYWwoKTsKLSAgICAgICAgYXJyYXlSZW1zZXQucmVzZXRMb2NhbCgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZmx1c2hSZW1lbWJlcmVkU2V0cygpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwaGFzZUlkID09IEdlbi5SRUxFQVNFKSB7Ci0gICAgICBpZiAoZ2xvYmFsKCkudHJhY2VGdWxsSGVhcCgpKSB7Ci0gICAgICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KTsKLSAgICAgIH0KLSAgICAgIGFzc2VydFJlbXNldHNGbHVzaGVkKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQsIHByaW1hcnkpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogTWlzY2VsbGFuZW91cwotICAgKi8KLQotICAvKiogQHJldHVybiBUaGUgYWN0aXZlIGdsb2JhbCBwbGFuIGFzIGEgPGNvZGU+R2VuPC9jb2RlPiBpbnN0YW5jZS4gKi8KLSAgQElubGluZQotICBwcml2YXRlIHN0YXRpYyBHZW4gZ2xvYmFsKCkgewotICAgIHJldHVybiAoR2VuKSBWTS5hY3RpdmVQbGFuLmdsb2JhbCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vZ2VuZXJhdGlvbmFsL0dlbk51cnNlcnlUcmFjZUxvY2FsLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vZ2VuZXJhdGlvbmFsL0dlbk51cnNlcnlUcmFjZUxvY2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNjQ1MjUuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL2dlbmVyYXRpb25hbC9HZW5OdXJzZXJ5VHJhY2VMb2NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLmdlbmVyYXRpb25hbDsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhY2VMb2NhbDsKLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYWNlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuSGVhZGVyQnl0ZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmRlcXVlLio7Ci1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsbWVudHMgdGhlIGNvcmUgZnVuY3Rpb25hbGl0eSBmb3IgYSB0cmFuc2l0aXZlCi0gKiBjbG9zdXJlIG92ZXIgdGhlIGhlYXAgZ3JhcGguCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBmaW5hbCBjbGFzcyBHZW5OdXJzZXJ5VHJhY2VMb2NhbCBleHRlbmRzIFRyYWNlTG9jYWwgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluc3RhbmNlIGZpZWxkcy4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgT2JqZWN0UmVmZXJlbmNlRGVxdWUgbW9kYnVmOwotICBwcml2YXRlIGZpbmFsIEFkZHJlc3NEZXF1ZSByZW1zZXQ7Ci0gIHByaXZhdGUgZmluYWwgQWRkcmVzc1BhaXJEZXF1ZSBhcnJheVJlbXNldDsKLQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIEdlbk51cnNlcnlUcmFjZUxvY2FsKFRyYWNlIHRyYWNlLCBHZW5Db2xsZWN0b3IgcGxhbikgewotICAgIHN1cGVyKEdlbi5TQ0FOX05VUlNFUlksIHRyYWNlKTsKLSAgICB0aGlzLm1vZGJ1ZiA9IHBsYW4ubW9kYnVmOwotICAgIHRoaXMucmVtc2V0ID0gcGxhbi5yZW1zZXQ7Ci0gICAgdGhpcy5hcnJheVJlbXNldCA9IHBsYW4uYXJyYXlSZW1zZXQ7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBFeHRlcm5hbGx5IHZpc2libGUgT2JqZWN0IHByb2Nlc3NpbmcgYW5kIHRyYWNpbmcKLSAgICovCi0KLSAgLyoqCi0gICAqIElzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGxpdmU/Ci0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdC4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBvYmplY3QgaXMgbGl2ZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTGl2ZShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKG9iamVjdC5pc051bGwoKSkgcmV0dXJuIGZhbHNlOwotICAgIGlmIChHZW4uaW5OdXJzZXJ5KG9iamVjdCkpIHsKLSAgICAgIHJldHVybiBHZW4ubnVyc2VyeVNwYWNlLmlzTGl2ZShvYmplY3QpOwotICAgIH0KLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChzdXBlci5pc0xpdmUob2JqZWN0KSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgaXMgdGhlIGNvcmUgbWV0aG9kIGR1cmluZyB0aGUgdHJhY2Ugb2YgdGhlIG9iamVjdCBncmFwaC4KLSAgICogVGhlIHJvbGUgb2YgdGhpcyBtZXRob2QgaXMgdG86Ci0gICAqCi0gICAqIDEuIEVuc3VyZSB0aGUgdHJhY2VkIG9iamVjdCBpcyBub3QgY29sbGVjdGVkLgotICAgKiAyLiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB2aXNpdCB0byB0aGUgb2JqZWN0IGVucXVldWUgaXQgdG8gYmUgc2Nhbm5lZC4KLSAgICogMy4gUmV0dXJuIHRoZSBmb3J3YXJkZWQgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBiZSB0cmFjZWQuCi0gICAqIEByZXR1cm4gVGhlIG5ldyByZWZlcmVuY2UgdG8gdGhlIHNhbWUgb2JqZWN0IGluc3RhbmNlLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlIHRyYWNlT2JqZWN0KE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAoR2VuLmluTnVyc2VyeShvYmplY3QpKSB7Ci0gICAgICByZXR1cm4gR2VuLm51cnNlcnlTcGFjZS50cmFjZU9iamVjdCh0aGlzLCBvYmplY3QsIEdlbi5BTExPQ19NQVRVUkVfTUlOT1JHQyk7Ci0gICAgfQotICAgIHJldHVybiBvYmplY3Q7Ci0gIH0KLQotICAvKioKLSAgICogUHJvY2VzcyBhbnkgcmVtZW1iZXJlZCBzZXQgZW50cmllcy4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1JlbWVtYmVyZWRTZXRzKCkgewotICAgIGxvZ01lc3NhZ2UoNSwgInByb2Nlc3NpbmcgbW9kYnVmIik7Ci0gICAgT2JqZWN0UmVmZXJlbmNlIG9iajsKLSAgICB3aGlsZSAoIShvYmogPSBtb2RidWYucG9wKCkpLmlzTnVsbCgpKSB7Ci0gICAgICBpZiAoVk0uREVCVUcpIFZNLmRlYnVnZ2luZy5tb2RidWZFbnRyeShvYmopOwotICAgICAgSGVhZGVyQnl0ZS5tYXJrQXNVbmxvZ2dlZChvYmopOwotICAgICAgc2Nhbk9iamVjdChvYmopOwotICAgIH0KLSAgICBsb2dNZXNzYWdlKDUsICJwcm9jZXNzaW5nIHJlbXNldCIpOwotICAgIHdoaWxlICghcmVtc2V0LmlzRW1wdHkoKSkgewotICAgICAgQWRkcmVzcyBsb2MgPSByZW1zZXQucG9wKCk7Ci0gICAgICBpZiAoVk0uREVCVUcpIFZNLmRlYnVnZ2luZy5yZW1zZXRFbnRyeShsb2MpOwotICAgICAgcHJvY2Vzc1Jvb3RFZGdlKGxvYywgZmFsc2UpOwotICAgIH0KLSAgICBsb2dNZXNzYWdlKDUsICJwcm9jZXNzaW5nIGFycmF5IHJlbXNldCIpOwotICAgIGFycmF5UmVtc2V0LmZsdXNoTG9jYWwoKTsKLSAgICB3aGlsZSAoIWFycmF5UmVtc2V0LmlzRW1wdHkoKSkgewotICAgICAgQWRkcmVzcyBzdGFydCA9IGFycmF5UmVtc2V0LnBvcDEoKTsKLSAgICAgIEFkZHJlc3MgZ3VhcmQgPSBhcnJheVJlbXNldC5wb3AyKCk7Ci0gICAgICBpZiAoVk0uREVCVUcpIFZNLmRlYnVnZ2luZy5hcnJheVJlbXNldEVudHJ5KHN0YXJ0LGd1YXJkKTsKLSAgICAgIHdoaWxlIChzdGFydC5MVChndWFyZCkpIHsKLSAgICAgICAgcHJvY2Vzc1Jvb3RFZGdlKHN0YXJ0LCBmYWxzZSk7Ci0gICAgICAgIHN0YXJ0ID0gc3RhcnQucGx1cyhCWVRFU19JTl9BRERSRVNTKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogV2lsbCB0aGUgb2JqZWN0IG1vdmUgZnJvbSBub3cgb24gZHVyaW5nIHRoZSBjb2xsZWN0aW9uLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGd1YXJhbnRlZWQgbm90IHRvIG1vdmUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiB3aWxsTm90TW92ZUluQ3VycmVudENvbGxlY3Rpb24oT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmIChvYmplY3QuaXNOdWxsKCkpIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gIUdlbi5pbk51cnNlcnkob2JqZWN0KTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vZ2VuZXJhdGlvbmFsL2NvcHlpbmcvR2VuQ29weS5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL2dlbmVyYXRpb25hbC9jb3B5aW5nL0dlbkNvcHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2MzM4My4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vZ2VuZXJhdGlvbmFsL2NvcHlpbmcvR2VuQ29weS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLmdlbmVyYXRpb25hbC5jb3B5aW5nOwotCi1pbXBvcnQgb3JnLm1tdGsucG9saWN5LkNvcHlTcGFjZTsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5nZW5lcmF0aW9uYWwuKjsKLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYWNlOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhbnNpdGl2ZUNsb3N1cmU7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5oZWFwLlZNUmVxdWVzdDsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhIHN0YW5kYXJkCi0gKiB0d28tZ2VuZXJhdGlvbiBjb3B5aW5nIGNvbGxlY3Rvci4gIE51cnNlcnkgY29sbGVjdGlvbnMgb2NjdXIgd2hlbgotICogZWl0aGVyIHRoZSBoZWFwIGlzIGZ1bGwgb3IgdGhlIG51cnNlcnkgaXMgZnVsbC4gIFRoZSBudXJzZXJ5IHNpemUKLSAqIGlzIGRldGVybWluZWQgYnkgYW4gb3B0aW9uYWwgY29tbWFuZCBsaW5lIGFyZ3VtZW50LiAgSWYgdW5kZWZpbmVkLAotICogdGhlIG51cnNlcnkgc2l6ZSBpcyAiaW5maW5pdGUiLCBzbyBudXJzZXJ5IGNvbGxlY3Rpb25zIG9ubHkgb2NjdXIKLSAqIHdoZW4gdGhlIGhlYXAgaXMgZnVsbCAodGhpcyBpcyBrbm93biBhcyBhIGZsZXhpYmxlLXNpemVkIG51cnNlcnkKLSAqIGNvbGxlY3RvcikuICBUaHVzIGJvdGggZml4ZWQgYW5kIGZsZXhpYmxlIG51cnNlcnkgc2l6ZXMgYXJlCi0gKiBzdXBwb3J0ZWQuICBGdWxsIGhlYXAgY29sbGVjdGlvbnMgb2NjdXIgd2hlbiB0aGUgbnVyc2VyeSBzaXplIGhhcwotICogZHJvcHBlZCB0byBhIHN0YXRpY2FsbHkgZGVmaW5lZCB0aHJlc2hvbGQsCi0gKiA8Y29kZT5OVVJTRVJZX1RIUkVTSE9MRDwvY29kZT48cD4KLSAqCi0gKiBTZWUgdGhlIEpvbmVzICYgTGlucyBHQyBib29rLCBjaGFwdGVyIDcgZm9yIGEgZGV0YWlsZWQgZGlzY3Vzc2lvbgotICogb2YgZ2VuZXJhdGlvbmFsIGNvbGxlY3Rpb24gYW5kIHNlY3Rpb24gNy4zIGZvciBhbiBvdmVydmlldyBvZiB0aGUKLSAqIGZsZXhpYmxlIG51cnNlcnkgYmVoYXZpb3IgKCJUaGUgU3RhbmRhcmQgTUwgb2YgTmV3IEplcnNleQotICogY29sbGVjdG9yIiksIG9yIGdvIHRvIEFwcGVsJ3MgcGFwZXIgIlNpbXBsZSBnZW5lcmF0aW9uYWwgZ2FyYmFnZQotICogY29sbGVjdGlvbiBhbmQgZmFzdCBhbGxvY2F0aW9uLiIgU1AmRSAxOSgyKToxNzEtLTE4MywgMTk4OS48cD4KLSAqCi0gKiBBbGwgcGxhbnMgbWFrZSBhIGNsZWFyIGRpc3RpbmN0aW9uIGJldHdlZW4gPGk+Z2xvYmFsPC9pPiBhbmQKLSAqIDxpPnRocmVhZC1sb2NhbDwvaT4gYWN0aXZpdGllcy4gIEdsb2JhbCBhY3Rpdml0aWVzIG11c3QgYmUKLSAqIHN5bmNocm9uaXplZCwgd2hlcmVhcyBubyBzeW5jaHJvbml6YXRpb24gaXMgcmVxdWlyZWQgZm9yCi0gKiB0aHJlYWQtbG9jYWwgYWN0aXZpdGllcy4gIEluc3RhbmNlcyBvZiBQbGFuIG1hcCAxOjEgdG8gImtlcm5lbAotICogdGhyZWFkcyIgKGFrYSBDUFVzKS4gIFRodXMgaW5zdGFuY2UKLSAqIG1ldGhvZHMgYWxsb3cgZmFzdCwgdW5zeWNocm9uaXplZCBhY2Nlc3MgdG8gUGxhbiB1dGlsaXRpZXMgc3VjaCBhcwotICogYWxsb2NhdGlvbiBhbmQgY29sbGVjdGlvbi4gIEVhY2ggaW5zdGFuY2UgcmVzdHMgb24gc3RhdGljIHJlc291cmNlcwotICogKHN1Y2ggYXMgbWVtb3J5IGFuZCB2aXJ0dWFsIG1lbW9yeSByZXNvdXJjZXMpIHdoaWNoIGFyZSAiZ2xvYmFsIgotICogYW5kIHRoZXJlZm9yZSAic3RhdGljIiBtZW1iZXJzIG9mIFBsYW4uICBUaGlzIG1hcHBpbmcgb2YgdGhyZWFkcyB0bwotICogaW5zdGFuY2VzIGlzIGNydWNpYWwgdG8gdW5kZXJzdGFuZGluZyB0aGUgY29ycmVjdG5lc3MgYW5kCi0gKiBwZXJmb3JtYW5jZSBwcm9wcnRpZXMgb2YgdGhpcyBwbGFuLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlIHB1YmxpYyBjbGFzcyBHZW5Db3B5IGV4dGVuZHMgR2VuIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDbGFzcyB2YXJpYWJsZXMKLSAgICovCi0KLSAgLy8gR0Mgc3RhdGUKLSAgc3RhdGljIGJvb2xlYW4gaGkgPSBmYWxzZTsgLy8gVHJ1ZSBpZiBjb3B5aW5nIHRvICJoaWdoZXIiIHNlbWlzcGFjZQotCi0gIC8qKgotICAgKiBUaGUgbG93IGhhbGYgb2YgdGhlIGNvcHlpbmcgbWF0dXJlIHNwYWNlLiAgV2UgYWxsb2NhdGUgaW50byB0aGlzIHNwYWNlCi0gICAqIHdoZW4gPGNvZGU+aGk8L2NvZGU+IGlzIDxjb2RlPmZhbHNlPC9jb2RlPi4KLSAgICovCi0gIHN0YXRpYyBDb3B5U3BhY2UgbWF0dXJlU3BhY2UwID0gbmV3IENvcHlTcGFjZSgic3MwIiwgREVGQVVMVF9QT0xMX0ZSRVFVRU5DWSwgZmFsc2UsIFZNUmVxdWVzdC5jcmVhdGUoKSk7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgTVMwID0gbWF0dXJlU3BhY2UwLmdldERlc2NyaXB0b3IoKTsKLQotICAvKioKLSAgICogVGhlIGhpZ2ggaGFsZiBvZiB0aGUgY29weWluZyBtYXR1cmUgc3BhY2UuIFdlIGFsbG9jYXRlIGludG8gdGhpcyBzcGFjZQotICAgKiB3aGVuIDxjb2RlPmhpPC9jb2RlPiBpcyA8Y29kZT50cnVlPC9jb2RlPi4KLSAgICovCi0gIHN0YXRpYyBDb3B5U3BhY2UgbWF0dXJlU3BhY2UxID0gbmV3IENvcHlTcGFjZSgic3MxIiwgREVGQVVMVF9QT0xMX0ZSRVFVRU5DWSwgdHJ1ZSwgVk1SZXF1ZXN0LmNyZWF0ZSgpKTsKLSAgc3RhdGljIGZpbmFsIGludCBNUzEgPSBtYXR1cmVTcGFjZTEuZ2V0RGVzY3JpcHRvcigpOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5zdGFuY2UgZmllbGRzCi0gICAqLwotICBmaW5hbCBUcmFjZSBtYXR1cmVUcmFjZTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICovCi0gIHB1YmxpYyBHZW5Db3B5KCkgewotICAgIHN1cGVyKCk7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoIUlHTk9SRV9SRU1TRVRTKTsgLy8gTm90IHN1cHBvcnRlZCBmb3IgR2VuQ29weQotICAgIG1hdHVyZVRyYWNlID0gbmV3IFRyYWNlKG1ldGFEYXRhU3BhY2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gRG9lcyB0aGUgbWF0dXJlIHNwYWNlIGRvIGNvcHlpbmcgPwotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY29weU1hdHVyZSgpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFRoZSBzZW1pc3BhY2Ugd2UgYXJlIGN1cnJlbnRseSBhbGxvY2F0aW5nIGludG8KLSAgICovCi0gIHN0YXRpYyBDb3B5U3BhY2UgdG9TcGFjZSgpIHsKLSAgICByZXR1cm4gaGkgPyBtYXR1cmVTcGFjZTEgOiBtYXR1cmVTcGFjZTA7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBTcGFjZSBkZXNjcmlwdG9yIGZvciB0by1zcGFjZS4KLSAgICovCi0gIHN0YXRpYyBpbnQgdG9TcGFjZURlc2MoKSB7IHJldHVybiBoaSA/IE1TMSA6IE1TMDsgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFRoZSBzZW1pc3BhY2Ugd2UgYXJlIGN1cnJlbnRseSBjb3B5aW5nIGZyb20KLSAgICogKG9yIGNvcGllZCBmcm9tIGF0IGxhc3QgbWFqb3IgR0MpCi0gICAqLwotICBzdGF0aWMgQ29weVNwYWNlIGZyb21TcGFjZSgpIHsKLSAgICByZXR1cm4gaGkgPyBtYXR1cmVTcGFjZTAgOiBtYXR1cmVTcGFjZTE7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBTcGFjZSBkZXNjcmlwdG9yIGZvciBmcm9tLXNwYWNlCi0gICAqLwotICBzdGF0aWMgaW50IGZyb21TcGFjZURlc2MoKSB7IHJldHVybiBoaSA/IE1TMCA6IE1TMTsgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbGxlY3Rpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSBwaGFzZSBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBjb2xsZWN0aW9uLgotICAgKgotICAgKiBAcGFyYW0gcGhhc2VJZCBDb2xsZWN0aW9uIHBoYXNlIHRvIHByb2Nlc3MKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHZvaWQgY29sbGVjdGlvblBoYXNlKHNob3J0IHBoYXNlSWQpIHsKLSAgICBpZiAodHJhY2VGdWxsSGVhcCgpKSB7Ci0gICAgICBpZiAocGhhc2VJZCA9PSBQUkVQQVJFKSB7Ci0gICAgICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkKTsKLSAgICAgICAgaGkgPSAhaGk7IC8vIGZsaXAgdGhlIHNlbWktc3BhY2VzCi0gICAgICAgIG1hdHVyZVNwYWNlMC5wcmVwYXJlKGhpKTsKLSAgICAgICAgbWF0dXJlU3BhY2UxLnByZXBhcmUoIWhpKTsKLSAgICAgICAgbWF0dXJlVHJhY2UucHJlcGFyZSgpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAocGhhc2VJZCA9PSBDTE9TVVJFKSB7Ci0gICAgICAgIG1hdHVyZVRyYWNlLnByZXBhcmUoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKHBoYXNlSWQgPT0gUkVMRUFTRSkgewotICAgICAgICBtYXR1cmVUcmFjZS5yZWxlYXNlKCk7Ci0gICAgICAgIGZyb21TcGFjZSgpLnJlbGVhc2UoKTsKLSAgICAgICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBBY2NvdW50aW5nCi0gICAqLwotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBwYWdlcyByZXNlcnZlZCBmb3IgdXNlIGdpdmVuIHRoZSBwZW5kaW5nCi0gICAqIGFsbG9jYXRpb24uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBwYWdlcyByZXNlcnZlZCBnaXZlbiB0aGUgcGVuZGluZwotICAgKiBhbGxvY2F0aW9uLCBleGNsdWRpbmcgc3BhY2UgcmVzZXJ2ZWQgZm9yIGNvcHlpbmcuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBpbnQgZ2V0UGFnZXNVc2VkKCkgewotICAgIHJldHVybiB0b1NwYWNlKCkucmVzZXJ2ZWRQYWdlcygpICsgc3VwZXIuZ2V0UGFnZXNVc2VkKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcGFnZXMgcmVzZXJ2ZWQgZm9yIGNvcHlpbmcuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwYWdlcyByZXNlcnZlZCBmb3IgY29weWluZy4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Q29sbGVjdGlvblJlc2VydmUoKSB7Ci0gICAgLy8gd2UgbXVzdCBhY2NvdW50IGZvciB0aGUgbnVtYmVyIG9mIHBhZ2VzIHJlcXVpcmVkIGZvciBjb3B5aW5nLAotICAgIC8vIHdoaWNoIGVxdWFscyB0aGUgbnVtYmVyIG9mIHNlbWktc3BhY2UgcGFnZXMgcmVzZXJ2ZWQKLSAgICByZXR1cm4gdG9TcGFjZSgpLnJlc2VydmVkUGFnZXMoKSArIHN1cGVyLmdldENvbGxlY3Rpb25SZXNlcnZlKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgcGFnZXMgYSBjb2xsZWN0aW9uIGlzIHJlcXVpcmVkIHRvIGZyZWUgdG8gc2F0aXNmeQotICAgKiBvdXRzdGFuZGluZyBhbGxvY2F0aW9uIHJlcXVlc3RzLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcGFnZXMgYSBjb2xsZWN0aW9uIGlzIHJlcXVpcmVkIHRvIGZyZWUgdG8gc2F0aXNmeQotICAgKiBvdXRzdGFuZGluZyBhbGxvY2F0aW9uIHJlcXVlc3RzLgotICAgKi8KLSAgcHVibGljIGludCBnZXRQYWdlc1JlcXVpcmVkKCkgewotICAgIHJldHVybiBzdXBlci5nZXRQYWdlc1JlcXVpcmVkKCkgKyAodG9TcGFjZSgpLnJlcXVpcmVkUGFnZXMoKSA8PCAxKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBwYWdlcyBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24gaW50byB0aGUgbWF0dXJlCi0gICAqIHNwYWNlLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgcGFnZXMgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uIGludG8gdGhlIG1hdHVyZQotICAgKiBzcGFjZS4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TWF0dXJlUGh5c2ljYWxQYWdlc0F2YWlsKCkgewotICAgIHJldHVybiB0b1NwYWNlKCkuYXZhaWxhYmxlUGh5c2ljYWxQYWdlcygpID4+IDE7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogTWlzY2VsbGFuZW91cyBtZXRob2RzCi0gICAqLwotCi0gIC8qKgotICAgKiBAcmV0dXJuIFRoZSBtYXR1cmUgc3BhY2Ugd2UgYXJlIGN1cnJlbnRseSBhbGxvY2F0aW5nIGludG8KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIFNwYWNlIGFjdGl2ZU1hdHVyZVNwYWNlKCkgewotICAgIHJldHVybiB0b1NwYWNlKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmVnaXN0ZXIgc3BlY2lhbGl6ZWQgbWV0aG9kcy4KLSAgICovCi0gIEBJbnRlcnJ1cHRpYmxlCi0gIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyU3BlY2lhbGl6ZWRNZXRob2RzKCkgewotICAgIFRyYW5zaXRpdmVDbG9zdXJlLnJlZ2lzdGVyU3BlY2lhbGl6ZWRTY2FuKFNDQU5fTUFUVVJFLCBHZW5Db3B5TWF0dXJlVHJhY2VMb2NhbC5jbGFzcyk7Ci0gICAgc3VwZXIucmVnaXN0ZXJTcGVjaWFsaXplZE1ldGhvZHMoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL2dlbmVyYXRpb25hbC9jb3B5aW5nL0dlbkNvcHlDb2xsZWN0b3IuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9nZW5lcmF0aW9uYWwvY29weWluZy9HZW5Db3B5Q29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NDVlNTY0Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9nZW5lcmF0aW9uYWwvY29weWluZy9HZW5Db3B5Q29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4uZ2VuZXJhdGlvbmFsLmNvcHlpbmc7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLmdlbmVyYXRpb25hbC5HZW47Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5nZW5lcmF0aW9uYWwuR2VuQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uUGxhbjsKLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYWNlTG9jYWw7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LkNvcHlMb2NhbDsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkZvcndhcmRpbmdXb3JkOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuSGVhZGVyQnl0ZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmFsbG9jLkFsbG9jYXRvcjsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgPGk+cGVyLWNvbGxlY3RvciB0aHJlYWQ8L2k+IGJlaGF2aW9yIGFuZCBzdGF0ZSBmb3IKLSAqIHRoZSA8Y29kZT5HZW5Db3B5PC9jb2RlPiB0d28tZ2VuZXJhdGlvbmFsIGNvcHlpbmcgY29sbGVjdG9yLjxwPgotICoKLSAqIFNwZWNpZmljYWxseSwgdGhpcyBjbGFzcyBkZWZpbmVzIHNlbWFudGljcyBzcGVjaWZpYyB0byB0aGUgY29sbGVjdGlvbiBvZgotICogdGhlIG1hdHVyZSBnZW5lcmF0aW9uICg8Y29kZT5HZW5Db2xsZWN0b3I8L2NvZGU+IGRlZmluZXMgbnVyc2VyeSBzZW1hbnRpY3MpLgotICogSW4gcGFydGljdWxhciB0aGUgbWF0dXJlIHNwYWNlIGFsbG9jYXRvciBpcyBkZWZpbmVkIChmb3IgY29sbGVjdGlvbi10aW1lCi0gKiBhbGxvY2F0aW9uIGludG8gdGhlIG1hdHVyZSBzcGFjZSksIGFuZCB0aGUgbWF0dXJlIHNwYWNlIHBlci1jb2xsZWN0b3IgdGhyZWFkCi0gKiBjb2xsZWN0aW9uIHRpbWUgc2VtYW50aWNzIGFyZSBkZWZpbmVkLjxwPgotICoKLSAqIEBzZWUgR2VuQ29weSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgPGNvZGU+R2VuQ29weTwvY29kZT4gYWxnb3JpdGhtLgotICoKLSAqIEBzZWUgR2VuQ29weQotICogQHNlZSBHZW5Db3B5TXV0YXRvcgotICogQHNlZSBHZW5Db2xsZWN0b3IKLSAqIEBzZWUgb3JnLm1tdGsucGxhbi5TdG9wVGhlV29ybGRDb2xsZWN0b3IKLSAqIEBzZWUgb3JnLm1tdGsucGxhbi5Db2xsZWN0b3JDb250ZXh0Ci0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBjbGFzcyBHZW5Db3B5Q29sbGVjdG9yIGV4dGVuZHMgR2VuQ29sbGVjdG9yIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIEluc3RhbmNlIGZpZWxkcwotICAgKi8KLQotICAvKiogVGhlIGFsbG9jYXRvciBmb3IgdGhlIG1hdHVyZSBzcGFjZSAqLwotICBwcml2YXRlIGZpbmFsIENvcHlMb2NhbCBtYXR1cmU7Ci0KLSAgLyoqIFRoZSB0cmFjZSBvYmplY3QgZm9yIGZ1bGwtaGVhcCBjb2xsZWN0aW9ucyAqLwotICBwcml2YXRlIGZpbmFsIEdlbkNvcHlNYXR1cmVUcmFjZUxvY2FsIG1hdHVyZVRyYWNlOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluaXRpYWxpemF0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIEdlbkNvcHlDb2xsZWN0b3IoKSB7Ci0gICAgbWF0dXJlID0gbmV3IENvcHlMb2NhbChHZW5Db3B5LnRvU3BhY2UoKSk7Ci0gICAgbWF0dXJlVHJhY2UgPSBuZXcgR2VuQ29weU1hdHVyZVRyYWNlTG9jYWwoZ2xvYmFsKCkubWF0dXJlVHJhY2UsIHRoaXMpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQ29sbGVjdGlvbi10aW1lIGFsbG9jYXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIEFsbG9jYXRlIHNwYWNlIGZvciBjb3B5aW5nIGFuIG9iamVjdCAodGhpcyBtZXRob2QgPGk+ZG9lcyBub3Q8L2k+Ci0gICAqIGNvcHkgdGhlIG9iamVjdCwgaXQgb25seSBhbGxvY2F0ZXMgc3BhY2UpCi0gICAqCi0gICAqIEBwYXJhbSBvcmlnaW5hbCBBIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgb2JqZWN0Ci0gICAqIEBwYXJhbSBieXRlcyBUaGUgc2l6ZSBvZiB0aGUgc3BhY2UgdG8gYmUgYWxsb2NhdGVkIChpbiBieXRlcykKLSAgICogQHBhcmFtIGFsaWduIFRoZSByZXF1ZXN0ZWQgYWxpZ25tZW50LgotICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBhbGlnbm1lbnQgb2Zmc2V0LgotICAgKiBAcmV0dXJuIFRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBhbGxvY2F0ZWQgcmVnaW9uCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBBZGRyZXNzIGFsbG9jQ29weShPYmplY3RSZWZlcmVuY2Ugb3JpZ2luYWwsIGludCBieXRlcywKLSAgICAgIGludCBhbGlnbiwgaW50IG9mZnNldCwgaW50IGFsbG9jYXRvcikgewotICAgIGlmIChhbGxvY2F0b3IgPT0gUGxhbi5BTExPQ19MT1MpIHsKLSAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KEFsbG9jYXRvci5nZXRNYXhpbXVtQWxpZ25lZFNpemUoYnl0ZXMsIGFsaWduKSA+IFBsYW4uTUFYX05PTl9MT1NfQ09QWV9CWVRFUyk7Ci0gICAgICByZXR1cm4gbG9zLmFsbG9jKGJ5dGVzLCBhbGlnbiwgb2Zmc2V0KTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSB7Ci0gICAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChieXRlcyA8PSBQbGFuLk1BWF9OT05fTE9TX0NPUFlfQllURVMpOwotICAgICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQoYWxsb2NhdG9yID09IEdlbkNvcHkuQUxMT0NfTUFUVVJFX01JTk9SR0MgfHwKLSAgICAgICAgICAgIGFsbG9jYXRvciA9PSBHZW5Db3B5LkFMTE9DX01BVFVSRV9NQUpPUkdDKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBtYXR1cmUuYWxsb2MoYnl0ZXMsIGFsaWduLCBvZmZzZXQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIGFueSBwb3N0LWNvcHkgYWN0aW9ucy4gIEluIHRoaXMgY2FzZSB3ZSBjbGVhciBhbnkgYml0cyB1c2VkCi0gICAqIGZvciB0aGlzIG9iamVjdCdzIEdDIG1ldGFkYXRhLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBuZXdseSBhbGxvY2F0ZWQgb2JqZWN0Ci0gICAqIEBwYXJhbSB0eXBlUmVmIHRoZSB0eXBlIHJlZmVyZW5jZSBmb3IgdGhlIGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBzaXplIG9mIHRoZSBzcGFjZSB0byBiZSBhbGxvY2F0ZWQgKGluIGJ5dGVzKQotICAgKiBAcGFyYW0gYWxsb2NhdG9yIFRoZSBhbGxvY2F0b3IgdG8gYWxsb2NhdGUgZnJvbQotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgdm9pZCBwb3N0Q29weShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0LCBPYmplY3RSZWZlcmVuY2UgdHlwZVJlZiwKLSAgICAgIGludCBieXRlcywgaW50IGFsbG9jYXRvcikgewotICAgIEZvcndhcmRpbmdXb3JkLmNsZWFyRm9yd2FyZGluZ0JpdHMob2JqZWN0KTsKLSAgICBpZiAoYWxsb2NhdG9yID09IFBsYW4uQUxMT0NfTE9TKQotICAgICAgUGxhbi5sb1NwYWNlLmluaXRpYWxpemVIZWFkZXIob2JqZWN0LCBmYWxzZSk7Ci0gICAgZWxzZSBpZiAoR2VuQ29weS5JR05PUkVfUkVNU0VUUykKLSAgICAgIEdlbkNvcHkuaW1tb3J0YWxTcGFjZS50cmFjZU9iamVjdChnZXRDdXJyZW50VHJhY2UoKSwgb2JqZWN0KTsgLy8gRklYTUUgdGhpcyBkb2VzIG5vdCBsb29rIHJpZ2h0Ci0gICAgaWYgKEdlbi5VU0VfT0JKRUNUX0JBUlJJRVIpCi0gICAgICBIZWFkZXJCeXRlLm1hcmtBc1VubG9nZ2VkKG9iamVjdCk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDb2xsZWN0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBFeGVjdXRlIGEgcGVyLWNvbGxlY3RvciBjb2xsZWN0aW9uIHBoYXNlLgotICAgKgotICAgKiBAcGFyYW0gcGhhc2VJZCBUaGUgcGhhc2UgdG8gZXhlY3V0ZS4KLSAgICogQHBhcmFtIHByaW1hcnkgVHJ1ZSBpZiB0aGlzIHRocmVhZCBzaG91bGQgcGVmb3JtIGxvY2FsIHNpbmdsZS10aHJlYWRlZAotICAgKiBhY3Rpb25zLgotICAgKi8KLSAgcHVibGljIHZvaWQgY29sbGVjdGlvblBoYXNlKHNob3J0IHBoYXNlSWQsIGJvb2xlYW4gcHJpbWFyeSkgewotICAgIGlmIChnbG9iYWwoKS50cmFjZUZ1bGxIZWFwKCkpIHsKLSAgICAgIGlmIChwaGFzZUlkID09IEdlbkNvcHkuUFJFUEFSRSkgewotICAgICAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gICAgICAgIGlmIChnbG9iYWwoKS5nY0Z1bGxIZWFwKSBtYXR1cmUucmViaW5kKEdlbkNvcHkudG9TcGFjZSgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChwaGFzZUlkID09IEdlbkNvcHkuQ0xPU1VSRSkgewotICAgICAgICBtYXR1cmVUcmFjZS5jb21wbGV0ZVRyYWNlKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChwaGFzZUlkID09IEdlbkNvcHkuUkVMRUFTRSkgewotICAgICAgICBtYXR1cmVUcmFjZS5yZWxlYXNlKCk7Ci0gICAgICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogTWlzY2VsbGFuZW91cwotICAgKi8KLQotICAvKiogQHJldHVybiBUaGUgYWN0aXZlIGdsb2JhbCBwbGFuIGFzIGEgPGNvZGU+R2VuQ29weTwvY29kZT4gaW5zdGFuY2UuICovCi0gIHByaXZhdGUgc3RhdGljIEdlbkNvcHkgZ2xvYmFsKCkgewotICAgIHJldHVybiAoR2VuQ29weSkgVk0uYWN0aXZlUGxhbi5nbG9iYWwoKTsKLSAgfQotCi0gIC8qKiBTaG93IHRoZSBzdGF0dXMgb2YgdGhlIG1hdHVyZSBhbGxvY2F0b3IuICovCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIHNob3dNYXR1cmUoKSB7Ci0gICAgbWF0dXJlLnNob3coKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBUcmFjZUxvY2FsIGdldEZ1bGxIZWFwVHJhY2UoKSB7IHJldHVybiBtYXR1cmVUcmFjZTsgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL2dlbmVyYXRpb25hbC9jb3B5aW5nL0dlbkNvcHlDb25zdHJhaW50cy5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL2dlbmVyYXRpb25hbC9jb3B5aW5nL0dlbkNvcHlDb25zdHJhaW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mzk2YjU4Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9nZW5lcmF0aW9uYWwvY29weWluZy9HZW5Db3B5Q29uc3RyYWludHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLmdlbmVyYXRpb25hbC5jb3B5aW5nOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5nZW5lcmF0aW9uYWwuR2VuQ29uc3RyYWludHM7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogR2VuQ29weSBjb25zdGFudHMuCi0gKi8KLUBVbmludGVycnVwdGlibGUgcHVibGljIGNsYXNzIEdlbkNvcHlDb25zdHJhaW50cyBleHRlbmRzIEdlbkNvbnN0cmFpbnRzIHsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9nZW5lcmF0aW9uYWwvY29weWluZy9HZW5Db3B5TWF0dXJlVHJhY2VMb2NhbC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL2dlbmVyYXRpb25hbC9jb3B5aW5nL0dlbkNvcHlNYXR1cmVUcmFjZUxvY2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNDgwOWMuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL2dlbmVyYXRpb25hbC9jb3B5aW5nL0dlbkNvcHlNYXR1cmVUcmFjZUxvY2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4uZ2VuZXJhdGlvbmFsLmNvcHlpbmc7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLmdlbmVyYXRpb25hbC5HZW47Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5nZW5lcmF0aW9uYWwuR2VuQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uZ2VuZXJhdGlvbmFsLkdlbk1hdHVyZVRyYWNlTG9jYWw7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5UcmFjZTsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci0KLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxtZW50cyB0aGUgY29yZSBmdW5jdGlvbmFsaXR5IGZvciBhIHRyYW5zaXRpdmUKLSAqIGNsb3N1cmUgb3ZlciB0aGUgaGVhcCBncmFwaCwgc3BlY2lmaWNhbGx5IGluIGEgR2VuZXJhdGlvbmFsIGNvcHlpbmcKLSAqIGNvbGxlY3Rvci4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGZpbmFsIGNsYXNzIEdlbkNvcHlNYXR1cmVUcmFjZUxvY2FsIGV4dGVuZHMgR2VuTWF0dXJlVHJhY2VMb2NhbCB7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqLwotICBwdWJsaWMgR2VuQ29weU1hdHVyZVRyYWNlTG9jYWwoVHJhY2UgZ2xvYmFsLCBHZW5Db2xsZWN0b3IgcGxhbikgewotICAgIHN1cGVyKGdsb2JhbCwgcGxhbik7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBHZW5Db3B5IGdsb2JhbCgpIHsKLSAgICByZXR1cm4gKEdlbkNvcHkpIFZNLmFjdGl2ZVBsYW4uZ2xvYmFsKCk7Ci0gIH0KLQotICAvKioKLSAgICogVHJhY2UgYSByZWZlcmVuY2UgaW50byB0aGUgbWF0dXJlIHNwYWNlIGR1cmluZyBHQy4gVGhpcyBpbnZvbHZlcwotICAgKiBkZXRlcm1pbmluZyB3aGV0aGVyIHRoZSBpbnN0YW5jZSBpcyBpbiBmcm9tIHNwYWNlLCBhbmQgaWYgc28sCi0gICAqIGNhbGxpbmcgdGhlIDxjb2RlPnRyYWNlT2JqZWN0PC9jb2RlPiBtZXRob2Qgb2YgdGhlIENvcHkKLSAgICogY29sbGVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgcmVmZXJlbmNlIHRvIGJlIHRyYWNlZC4gIFRoaXMgaXMgPGk+Tk9UPC9pPiBhbgotICAgKiBpbnRlcmlvciBwb2ludGVyLgotICAgKiBAcmV0dXJuIFRoZSBwb3NzaWJseSBtb3ZlZCByZWZlcmVuY2UuCi0gICAqLwotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlIHRyYWNlT2JqZWN0KE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChnbG9iYWwoKS50cmFjZUZ1bGxIZWFwKCkpOwotICAgIGlmIChvYmplY3QuaXNOdWxsKCkpIHJldHVybiBvYmplY3Q7Ci0KLSAgICBpZiAoU3BhY2UuaXNJblNwYWNlKEdlbkNvcHkuTVMwLCBvYmplY3QpKQotICAgICAgcmV0dXJuIEdlbkNvcHkubWF0dXJlU3BhY2UwLnRyYWNlT2JqZWN0KHRoaXMsIG9iamVjdCwgR2VuLkFMTE9DX01BVFVSRV9NQUpPUkdDKTsKLSAgICBpZiAoU3BhY2UuaXNJblNwYWNlKEdlbkNvcHkuTVMxLCBvYmplY3QpKQotICAgICAgcmV0dXJuIEdlbkNvcHkubWF0dXJlU3BhY2UxLnRyYWNlT2JqZWN0KHRoaXMsIG9iamVjdCwgR2VuLkFMTE9DX01BVFVSRV9NQUpPUkdDKTsKLSAgICByZXR1cm4gc3VwZXIudHJhY2VPYmplY3Qob2JqZWN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdHJ1ZSBpZiA8Y29kZT5vYmo8L2NvZGU+IGlzIGEgbGl2ZSBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCBpbiBxdWVzdGlvbgotICAgKiBAcmV0dXJuIFRydWUgaWYgPGNvZGU+b2JqPC9jb2RlPiBpcyBhIGxpdmUgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNMaXZlKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAob2JqZWN0LmlzTnVsbCgpKSByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKFNwYWNlLmlzSW5TcGFjZShHZW5Db3B5Lk1TMCwgb2JqZWN0KSkKLSAgICAgIHJldHVybiBHZW5Db3B5LmhpID8gR2VuQ29weS5tYXR1cmVTcGFjZTAuaXNMaXZlKG9iamVjdCkgOiB0cnVlOwotICAgIGlmIChTcGFjZS5pc0luU3BhY2UoR2VuQ29weS5NUzEsIG9iamVjdCkpCi0gICAgICByZXR1cm4gR2VuQ29weS5oaSA/IHRydWUgOiBHZW5Db3B5Lm1hdHVyZVNwYWNlMS5pc0xpdmUob2JqZWN0KTsKLSAgICByZXR1cm4gc3VwZXIuaXNMaXZlKG9iamVjdCk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBPYmplY3QgcHJvY2Vzc2luZyBhbmQgdHJhY2luZwotICAgKi8KLQotCi0gIC8qKgotICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG9iamVjdCBpcyBndWFyYW50ZWVkIG5vdCB0byBtb3ZlIGR1cmluZyB0aGlzCi0gICAqIGNvbGxlY3Rpb24gKGkuZS4gdGhpcyBvYmplY3QgaXMgZGVmaW50ZWx5IG5vdCBhbiB1bmZvcndhcmRlZAotICAgKiBvYmplY3QpLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIG9iamVjdCBpcyBndWFyYW50ZWVkIG5vdCB0byBtb3ZlIGR1cmluZyB0aGlzCi0gICAqICAgICAgICAgY29sbGVjdGlvbi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHdpbGxOb3RNb3ZlSW5DdXJyZW50Q29sbGVjdGlvbihPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKFNwYWNlLmlzSW5TcGFjZShHZW5Db3B5LnRvU3BhY2VEZXNjKCksIG9iamVjdCkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpZiAoU3BhY2UuaXNJblNwYWNlKEdlbkNvcHkuZnJvbVNwYWNlRGVzYygpLCBvYmplY3QpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBzdXBlci53aWxsTm90TW92ZUluQ3VycmVudENvbGxlY3Rpb24ob2JqZWN0KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL2dlbmVyYXRpb25hbC9jb3B5aW5nL0dlbkNvcHlNdXRhdG9yLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vZ2VuZXJhdGlvbmFsL2NvcHlpbmcvR2VuQ29weU11dGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFkMmJlMC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vZ2VuZXJhdGlvbmFsL2NvcHlpbmcvR2VuQ29weU11dGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5nZW5lcmF0aW9uYWwuY29weWluZzsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uZ2VuZXJhdGlvbmFsLkdlbk11dGF0b3I7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LkNvcHlMb2NhbDsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5hbGxvYy5BbGxvY2F0b3I7Ci1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIDxpPnBlci1tdXRhdG9yIHRocmVhZDwvaT4gYmVoYXZpb3IgYW5kIHN0YXRlIGZvcgotICogdGhlIDxjb2RlPkdlbkNvcHk8L2NvZGU+IHR3by1nZW5lcmF0aW9uYWwgY29weWluZyBjb2xsZWN0b3IuPHA+Ci0gKgotICogU3BlY2lmaWNhbGx5LCB0aGlzIGNsYXNzIGRlZmluZXMgbXV0YXRvci10aW1lIHNlbWFudGljcyBzcGVjaWZpYyB0byB0aGUKLSAqIG1hdHVyZSBnZW5lcmF0aW9uICg8Y29kZT5HZW5NdXRhdG9yPC9jb2RlPiBkZWZpbmVzIG51cnNlcnkgc2VtYW50aWNzKS4KLSAqIEluIHBhcnRpY3VsYXIgdGhlIG1hdHVyZSBzcGFjZSBhbGxvY2F0b3IgaXMgZGVmaW5lZCAoZm9yIG11dGF0b3ItdGltZQotICogYWxsb2NhdGlvbiBpbnRvIHRoZSBtYXR1cmUgc3BhY2UgdmlhIHByZS10ZW51cmluZyksIGFuZCB0aGUgbWF0dXJlIHNwYWNlCi0gKiBwZXItbXV0YXRvciB0aHJlYWQgY29sbGVjdGlvbiB0aW1lIHNlbWFudGljcyBhcmUgZGVmaW5lZCAocmViaW5kaW5nCi0gKiB0aGUgbWF0dXJlIHNwYWNlIGFsbG9jYXRvcikuPHA+Ci0gKgotICogQHNlZSBHZW5Db3B5IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSA8Y29kZT5HZW5Db3B5PC9jb2RlPiBhbGdvcml0aG0uCi0gKgotICogQHNlZSBHZW5Db3B5Ci0gKiBAc2VlIEdlbkNvcHlDb2xsZWN0b3IKLSAqIEBzZWUgR2VuTXV0YXRvcgotICogQHNlZSBvcmcubW10ay5wbGFuLlN0b3BUaGVXb3JsZE11dGF0b3IKLSAqIEBzZWUgb3JnLm1tdGsucGxhbi5NdXRhdG9yQ29udGV4dAotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgY2xhc3MgR2VuQ29weU11dGF0b3IgZXh0ZW5kcyBHZW5NdXRhdG9yIHsKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBJbnN0YW5jZSBmaWVsZHMKLSAgICovCi0KLSAgLyoqCi0gICAqIFRoZSBhbGxvY2F0b3IgZm9yIHRoZSBjb3B5aW5nIG1hdHVyZSBzcGFjZSAodGhlIG11dGF0b3IgbWF5Ci0gICAqICJwcmV0ZW51cmUiIG9iamVjdHMgaW50byB0aGlzIHNwYWNlIG90aGVyd2lzZSB1c2VkIG9ubHkgYnkKLSAgICogdGhlIGNvbGxlY3RvcikKLSAgICovCi0gIHByaXZhdGUgQ29weUxvY2FsIG1hdHVyZTsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbml0aWFsaXphdGlvbgotICAgKi8KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICovCi0gIHB1YmxpYyBHZW5Db3B5TXV0YXRvcigpIHsKLSAgICBtYXR1cmUgPSBuZXcgQ29weUxvY2FsKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FsbGVkIGJlZm9yZSB0aGUgTXV0YXRvckNvbnRleHQgaXMgdXNlZCwgYnV0IGFmdGVyIHRoZSBjb250ZXh0IGhhcyBiZWVuCi0gICAqIGZ1bGx5IHJlZ2lzdGVyZWQgYW5kIGlzIHZpc2libGUgdG8gY29sbGVjdGlvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXRNdXRhdG9yKGludCBpZCkgewotICAgIHN1cGVyLmluaXRNdXRhdG9yKGlkKTsKLSAgICBtYXR1cmUucmViaW5kKEdlbkNvcHkudG9TcGFjZSgpKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIE11dGF0b3ItdGltZSBhbGxvY2F0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBBbGxvY2F0ZSBzcGFjZSAoZm9yIGFuIG9iamVjdCkgaW4gdGhlIHNwZWNpZmllZCBzcGFjZQotICAgKgotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIHNpemUgb2YgdGhlIHNwYWNlIHRvIGJlIGFsbG9jYXRlZCAoaW4gYnl0ZXMpCi0gICAqIEBwYXJhbSBhbGlnbiBUaGUgcmVxdWVzdGVkIGFsaWdubWVudC4KLSAgICogQHBhcmFtIG9mZnNldCBUaGUgYWxpZ25tZW50IG9mZnNldC4KLSAgICogQHBhcmFtIGFsbG9jYXRvciBUaGUgYWxsb2NhdG9yIHRvIGFsbG9jYXRlIGZyb20KLSAgICogQHBhcmFtIHNpdGUgQWxsb2NhdGlvbiBzaXRlCi0gICAqIEByZXR1cm4gVGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGFsbG9jYXRlZCByZWdpb24KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGZpbmFsIEFkZHJlc3MgYWxsb2MoaW50IGJ5dGVzLCBpbnQgYWxpZ24sIGludCBvZmZzZXQsIGludCBhbGxvY2F0b3IsIGludCBzaXRlKSB7Ci0gICAgaWYgKGFsbG9jYXRvciA9PSBHZW5Db3B5LkFMTE9DX01BVFVSRSkgewotICAgICAgcmV0dXJuIG1hdHVyZS5hbGxvYyhieXRlcywgYWxpZ24sIG9mZnNldCk7Ci0gICAgfQotICAgIHJldHVybiBzdXBlci5hbGxvYyhieXRlcywgYWxpZ24sIG9mZnNldCwgYWxsb2NhdG9yLCBzaXRlKTsKLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIHBvc3QtYWxsb2NhdGlvbiBpbml0aWFsaXphdGlvbiBvZiBhbiBvYmplY3QKLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgbmV3bHkgYWxsb2NhdGVkIG9iamVjdAotICAgKiBAcGFyYW0gdHlwZVJlZiB0aGUgdHlwZSByZWZlcmVuY2UgZm9yIHRoZSBpbnN0YW5jZSBiZWluZyBjcmVhdGVkCi0gICAqIEBwYXJhbSBhbGxvY2F0b3IgVGhlIGFsbG9jYXRvciB0byBhbGxvY2F0ZSBmcm9tCi0gICAqIEBwYXJhbSBieXRlcyBUaGUgc2l6ZSBvZiB0aGUgc3BhY2UgYWxsb2NhdGVkIChpbiBieXRlcykKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGZpbmFsIHZvaWQgcG9zdEFsbG9jKE9iamVjdFJlZmVyZW5jZSBvYmplY3QsIE9iamVjdFJlZmVyZW5jZSB0eXBlUmVmLAotICAgICAgaW50IGJ5dGVzLCBpbnQgYWxsb2NhdG9yKSB7Ci0gICAgLy8gbm90aGluZyB0byBiZSBkb25lCi0gICAgaWYgKGFsbG9jYXRvciA9PSBHZW5Db3B5LkFMTE9DX01BVFVSRSkgcmV0dXJuOwotICAgIHN1cGVyLnBvc3RBbGxvYyhvYmplY3QsIHR5cGVSZWYsIGJ5dGVzLCBhbGxvY2F0b3IpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgYWxsb2NhdG9yIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBhIHNwYWNlCi0gICAqIDxjb2RlPnNwYWNlPC9jb2RlPiwgZm9yIHRoaXMgcGxhbiBpbnN0YW5jZS4KLSAgICoKLSAgICogQHBhcmFtIHNwYWNlIFRoZSBzcGFjZSBmb3Igd2hpY2ggdGhlIGFsbG9jYXRvciBpbnN0YW5jZSBpcyBkZXNpcmVkLgotICAgKiBAcmV0dXJuIFRoZSBhbGxvY2F0b3IgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGxhbiBpbnN0YW5jZQotICAgKiB3aGljaCBpcyBhbGxvY2F0aW5nIGludG8gPGNvZGU+c3BhY2U8L2NvZGU+LCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgKiBpZiBubyBhcHByb3ByaWF0ZSBhbGxvY2F0b3IgY2FuIGJlIGVzdGFibGlzaGVkLgotICAgKi8KLSAgcHVibGljIGZpbmFsIEFsbG9jYXRvciBnZXRBbGxvY2F0b3JGcm9tU3BhY2UoU3BhY2Ugc3BhY2UpIHsKLSAgICBpZiAoc3BhY2UgPT0gR2VuQ29weS5tYXR1cmVTcGFjZTAgfHwgc3BhY2UgPT0gR2VuQ29weS5tYXR1cmVTcGFjZTEpIHJldHVybiBtYXR1cmU7Ci0gICAgcmV0dXJuIHN1cGVyLmdldEFsbG9jYXRvckZyb21TcGFjZShzcGFjZSk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDb2xsZWN0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBFeGVjdXRlIGEgcGVyLW11dGF0b3IgY29sbGVjdGlvbiBwaGFzZS4KLSAgICoKLSAgICogQHBhcmFtIHBoYXNlSWQgVGhlIHBoYXNlIHRvIGV4ZWN1dGUuCi0gICAqIEBwYXJhbSBwcmltYXJ5IFRydWUgaWYgdGhpcyB0aHJlYWQgc2hvdWxkIHBlZm9ybSBsb2NhbCBzaW5nbGUtdGhyZWFkZWQKLSAgICogYWN0aW9ucy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNvbGxlY3Rpb25QaGFzZShzaG9ydCBwaGFzZUlkLCBib29sZWFuIHByaW1hcnkpIHsKLSAgICBpZiAoZ2xvYmFsKCkudHJhY2VGdWxsSGVhcCgpKSB7Ci0gICAgICBpZiAocGhhc2VJZCA9PSBHZW5Db3B5LlJFTEVBU0UpIHsKLSAgICAgICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQsIHByaW1hcnkpOwotICAgICAgICBpZiAoZ2xvYmFsKCkuZ2NGdWxsSGVhcCkgbWF0dXJlLnJlYmluZChHZW5Db3B5LnRvU3BhY2UoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogTWlzY2VsbGFuZW91cwotICAgKi8KLQotICAvKiogQHJldHVybiBUaGUgYWN0aXZlIGdsb2JhbCBwbGFuIGFzIGEgPGNvZGU+R2VuQ29weTwvY29kZT4gaW5zdGFuY2UuICovCi0gIHByaXZhdGUgc3RhdGljIEdlbkNvcHkgZ2xvYmFsKCkgewotICAgIHJldHVybiAoR2VuQ29weSkgVk0uYWN0aXZlUGxhbi5nbG9iYWwoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vZ2VuZXJhdGlvbmFsL2ltbWl4L0dlbkltbWl4LmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vZ2VuZXJhdGlvbmFsL2ltbWl4L0dlbkltbWl4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNmZhOTguLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL2dlbmVyYXRpb25hbC9pbW1peC9HZW5JbW1peC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLmdlbmVyYXRpb25hbC5pbW1peDsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uZ2VuZXJhdGlvbmFsLkdlbjsKLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYWNlOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhbnNpdGl2ZUNsb3N1cmU7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LmltbWl4LkltbWl4U3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LmltbWl4Lk9iamVjdEhlYWRlcjsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5oZWFwLlZNUmVxdWVzdDsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYSB0d28tZ2VuZXJhdGlvbiBjb3B5aW5nCi0gKiBjb2xsZWN0b3Igd2hlcmUgPGI+dGhlIGhpZ2hlciBnZW5lcmF0aW9uIGlzIGFuIGltbWl4IHNwYWNlPC9iPi4KLSAqCi0gKiBOdXJzZXJ5IGNvbGxlY3Rpb25zIG9jY3VyIHdoZW4gZWl0aGVyIHRoZSBoZWFwIGlzIGZ1bGwgb3IgdGhlIG51cnNlcnkKLSAqIGlzIGZ1bGwuICBUaGUgbnVyc2VyeSBzaXplIGlzIGRldGVybWluZWQgYnkgYW4gb3B0aW9uYWwgY29tbWFuZCBsaW5lCi0gKiBhcmd1bWVudC4gSWYgdW5kZWZpbmVkLCB0aGUgbnVyc2VyeSBzaXplIGlzICJpbmZpbml0ZSIsIHNvIG51cnNlcnkKLSAqIGNvbGxlY3Rpb25zIG9ubHkgb2NjdXIgd2hlbiB0aGUgaGVhcCBpcyBmdWxsICh0aGlzIGlzIGtub3duIGFzIGEKLSAqIGZsZXhpYmxlLXNpemVkIG51cnNlcnkgY29sbGVjdG9yKS4gIFRodXMgYm90aCBmaXhlZCBhbmQgZmxleGlibGUKLSAqIG51cnNlcnkgc2l6ZXMgYXJlIHN1cHBvcnRlZC4gIEZ1bGwgaGVhcCBjb2xsZWN0aW9ucyBvY2N1ciB3aGVuIHRoZQotICogbnVyc2VyeSBzaXplIGhhcyBkcm9wcGVkIHRvIGEgc3RhdGljYWxseSBkZWZpbmVkIHRocmVzaG9sZCwKLSAqIDxjb2RlPk5VUlNFUllfVEhSRVNIT0xEPC9jb2RlPjxwPgotICoKLSAqIFNlZSB0aGUgUExESScwOCBwYXBlciBieSBCbGFja2J1cm4gYW5kIE1jS2lubGV5IGZvciBhIGRlc2NyaXB0aW9uCi0gKiBvZiB0aGUgYWxnb3JpdGhtOiBodHRwOi8vZG9pLmFjbS5vcmcvMTAuMTE0NS8xMzc1NTgxLjEzNzU1ODYKLSAqCi0gKiBTZWUgdGhlIEpvbmVzICYgTGlucyBHQyBib29rLCBjaGFwdGVyIDcgZm9yIGEgZGV0YWlsZWQgZGlzY3Vzc2lvbgotICogb2YgZ2VuZXJhdGlvbmFsIGNvbGxlY3Rpb24gYW5kIHNlY3Rpb24gNy4zIGZvciBhbiBvdmVydmlldyBvZiB0aGUKLSAqIGZsZXhpYmxlIG51cnNlcnkgYmVoYXZpb3IgKCJUaGUgU3RhbmRhcmQgTUwgb2YgTmV3IEplcnNleQotICogY29sbGVjdG9yIiksIG9yIGdvIHRvIEFwcGVsJ3MgcGFwZXIgIlNpbXBsZSBnZW5lcmF0aW9uYWwgZ2FyYmFnZQotICogY29sbGVjdGlvbiBhbmQgZmFzdCBhbGxvY2F0aW9uLiIgU1AmRSAxOSgyKToxNzEtLTE4MywgMTk4OS48cD4KLSAqCi0gKgotICogRm9yIGdlbmVyYWwgY29tbWVudHMgYWJvdXQgdGhlIGdsb2JhbC9sb2NhbCBkaXN0aW5jdGlvbiBhbW9uZyBjbGFzc2VzIHJlZmVyCi0gKiB0byBQbGFuLmphdmEgYW5kIFBsYW5Mb2NhbC5qYXZhLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgY2xhc3MgR2VuSW1taXggZXh0ZW5kcyBHZW4gewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDbGFzcyBmaWVsZHMKLSAgICovCi0KLSAgLyoqIFRoZSBtYXR1cmUgc3BhY2UsIHdoaWNoIGZvciBHZW5JbW1peCB1c2VzIGEgbWFyayBzd2VlcCBjb2xsZWN0aW9uIHBvbGljeS4gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBJbW1peFNwYWNlIGltbWl4U3BhY2UgPSBuZXcgSW1taXhTcGFjZSgiaW1taXgiLCBERUZBVUxUX1BPTExfRlJFUVVFTkNZLCBWTVJlcXVlc3QuY3JlYXRlKCkpOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElNTUlYID0gaW1taXhTcGFjZS5nZXREZXNjcmlwdG9yKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9JTU1JWCA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDQU5fREVGUkFHID0gMjsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbnN0YW5jZSBmaWVsZHMKLSAgICovCi0gIC8qIFRoZSB0cmFjZSBjbGFzcyBmb3IgYSBmdWxsLWhlYXAgY29sbGVjdGlvbiAqLwotICBwdWJsaWMgZmluYWwgVHJhY2UgbWF0dXJlVHJhY2UgPSBuZXcgVHJhY2UobWV0YURhdGFTcGFjZSk7Ci0gIHByaXZhdGUgYm9vbGVhbiBsYXN0R0NXYXNEZWZyYWcgPSBmYWxzZTsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQ29sbGVjdGlvbgotICAgKi8KLQotICAvKioKLSAgICogUGVyZm9ybSBhIChnbG9iYWwpIGNvbGxlY3Rpb24gcGhhc2UuCi0gICAqLwotICBASW5saW5lCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZmluYWwgdm9pZCBjb2xsZWN0aW9uUGhhc2Uoc2hvcnQgcGhhc2VJZCkgewotICAgIGlmIChwaGFzZUlkID09IFNFVF9DT0xMRUNUSU9OX0tJTkQpIHsKLSAgICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkKTsKLSAgICAgIGlmIChnY0Z1bGxIZWFwKQotICAgICAgICBpbW1peFNwYWNlLmRlY2lkZVdoZXRoZXJUb0RlZnJhZyhlbWVyZ2VuY3lDb2xsZWN0aW9uLCB0cnVlLCBjb2xsZWN0aW9uQXR0ZW1wdCwgY29sbGVjdGlvblRyaWdnZXIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICh0cmFjZUZ1bGxIZWFwKCkpIHsKLSAgICAgIGlmIChwaGFzZUlkID09IFBSRVBBUkUpIHsKLSAgICAgICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQpOwotICAgICAgICBtYXR1cmVUcmFjZS5wcmVwYXJlKCk7Ci0gICAgICAgIGltbWl4U3BhY2UucHJlcGFyZSh0cnVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBpZiAocGhhc2VJZCA9PSBDTE9TVVJFKSB7Ci0gICAgICAgIG1hdHVyZVRyYWNlLnByZXBhcmUoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBpZiAocGhhc2VJZCA9PSBSRUxFQVNFKSB7Ci0gICAgICAgIG1hdHVyZVRyYWNlLnJlbGVhc2UoKTsKLSAgICAgICAgbGFzdEdDV2FzRGVmcmFnID0gaW1taXhTcGFjZS5yZWxlYXNlKHRydWUpOwotICAgICAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9IGVsc2UKLSAgICAgIGxhc3RHQ1dhc0RlZnJhZyA9IGZhbHNlOwotCi0gICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gV2hldGhlciBsYXN0IEdDIHdhcyBhbiBleGhhdXN0aXZlIGF0dGVtcHQgdG8gY29sbGVjdCB0aGUgaGVhcC4gIEZvciBtYW55IGNvbGxlY3RvcnMgdGhpcyBpcyB0aGUgc2FtZSBhcyBhc2tpbmcgd2hldGhlciB0aGUgbGFzdCBHQyB3YXMgYSBmdWxsIGhlYXAgY29sbGVjdGlvbi4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBsYXN0Q29sbGVjdGlvbldhc0V4aGF1c3RpdmUoKSB7Ci0gICAgcmV0dXJuIGxhc3RHQ1dhc0RlZnJhZzsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBBY2NvdW50aW5nCi0gICAqLwotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBwYWdlcyByZXNlcnZlZCBmb3IgdXNlIGdpdmVuIHRoZSBwZW5kaW5nCi0gICAqIGFsbG9jYXRpb24uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBwYWdlcyByZXNlcnZlZCBnaXZlbiB0aGUgcGVuZGluZwotICAgKiBhbGxvY2F0aW9uLCBleGNsdWRpbmcgc3BhY2UgcmVzZXJ2ZWQgZm9yIGNvcHlpbmcuCi0gICAqLwotICBASW5saW5lCi0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IGdldFBhZ2VzVXNlZCgpIHsKLSAgICByZXR1cm4gaW1taXhTcGFjZS5yZXNlcnZlZFBhZ2VzKCkgKyBzdXBlci5nZXRQYWdlc1VzZWQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBwYWdlcyBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24gaW50byB0aGUgbWF0dXJlCi0gICAqIHNwYWNlLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgcGFnZXMgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uIGludG8gdGhlIG1hdHVyZQotICAgKiBzcGFjZS4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TWF0dXJlUGh5c2ljYWxQYWdlc0F2YWlsKCkgewotICAgIHJldHVybiBpbW1peFNwYWNlLmF2YWlsYWJsZVBoeXNpY2FsUGFnZXMoKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBNaXNjZWxsYW5lb3VzCi0gICAqLwotCi0gIC8qKgotICAgKiBBY2Nlc3NvciBtZXRob2QgdG8gYWxsb3cgdGhlIGdlbmVyaWMgZ2VuZXJhdGlvbmFsIGNvZGUgaW4gR2VuLmphdmEKLSAgICogdG8gYWNjZXNzIHRoZSBtYXR1cmUgc3BhY2UuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGFjdGl2ZSBtYXR1cmUgc3BhY2UKLSAgICovCi0gIEBJbmxpbmUKLSAgcHJvdGVjdGVkIGZpbmFsIFNwYWNlIGFjdGl2ZU1hdHVyZVNwYWNlKCkgewotICAgIHJldHVybiBpbW1peFNwYWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLm1tdGsucGxhbi5QbGFuI3dpbGxOZXZlck1vdmUKLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBPYmplY3QgaW4gcXVlc3Rpb24KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBvYmplY3Qgd2lsbCBuZXZlciBtb3ZlCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gd2lsbE5ldmVyTW92ZShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKFNwYWNlLmlzSW5TcGFjZShJTU1JWCwgb2JqZWN0KSkgewotICAgICAgT2JqZWN0SGVhZGVyLnBpbk9iamVjdChvYmplY3QpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlCi0gICAgICByZXR1cm4gc3VwZXIud2lsbE5ldmVyTW92ZShvYmplY3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlZ2lzdGVyIHNwZWNpYWxpemVkIG1ldGhvZHMuCi0gICAqLwotICBASW50ZXJydXB0aWJsZQotICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlclNwZWNpYWxpemVkTWV0aG9kcygpIHsKLSAgICBUcmFuc2l0aXZlQ2xvc3VyZS5yZWdpc3RlclNwZWNpYWxpemVkU2NhbihTQ0FOX0lNTUlYLCBHZW5JbW1peE1hdHVyZVRyYWNlTG9jYWwuY2xhc3MpOwotICAgIFRyYW5zaXRpdmVDbG9zdXJlLnJlZ2lzdGVyU3BlY2lhbGl6ZWRTY2FuKFNDQU5fREVGUkFHLCBHZW5JbW1peE1hdHVyZURlZnJhZ1RyYWNlTG9jYWwuY2xhc3MpOwotICAgIHN1cGVyLnJlZ2lzdGVyU3BlY2lhbGl6ZWRNZXRob2RzKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9nZW5lcmF0aW9uYWwvaW1taXgvR2VuSW1taXhDb2xsZWN0b3IuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9nZW5lcmF0aW9uYWwvaW1taXgvR2VuSW1taXhDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk5YTEwNi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vZ2VuZXJhdGlvbmFsL2ltbWl4L0dlbkltbWl4Q29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4uZ2VuZXJhdGlvbmFsLmltbWl4OwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5QbGFuOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhY2VMb2NhbDsKLWltcG9ydCBvcmcubW10ay5wbGFuLmdlbmVyYXRpb25hbC4qOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkhlYWRlckJ5dGU7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5hbGxvYy5BbGxvY2F0b3I7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5hbGxvYy5JbW1peEFsbG9jYXRvcjsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LnN0YXRpc3RpY3MuU3RhdHM7Ci0KLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgPGk+cGVyLWNvbGxlY3RvciB0aHJlYWQ8L2k+IGJlaGF2aW9yIGFuZCBzdGF0ZSBmb3IKLSAqIHRoZSA8Y29kZT5HZW5JbW1peDwvY29kZT4gdHdvLWdlbmVyYXRpb25hbCBjb3B5aW5nIGNvbGxlY3Rvci48cD4KLSAqCi0gKiBTcGVjaWZpY2FsbHksIHRoaXMgY2xhc3MgZGVmaW5lcyBzZW1hbnRpY3Mgc3BlY2lmaWMgdG8gdGhlIGNvbGxlY3Rpb24gb2YKLSAqIHRoZSBjb3B5IGdlbmVyYXRpb24gKDxjb2RlPkdlbkNvbGxlY3RvcjwvY29kZT4gZGVmaW5lcyBudXJzZXJ5IHNlbWFudGljcykuCi0gKiBJbiBwYXJ0aWN1bGFyIHRoZSBjb3B5IHNwYWNlIGFsbG9jYXRvciBpcyBkZWZpbmVkIChmb3IgY29sbGVjdGlvbi10aW1lCi0gKiBhbGxvY2F0aW9uIGludG8gdGhlIGNvcHkgc3BhY2UpLCBhbmQgdGhlIGNvcHkgc3BhY2UgcGVyLWNvbGxlY3RvciB0aHJlYWQKLSAqIGNvbGxlY3Rpb24gdGltZSBzZW1hbnRpY3MgYXJlIGRlZmluZWQuPHA+Ci0gKgotICogQHNlZSBHZW5JbW1peCBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgPGNvZGU+R2VuSW1taXg8L2NvZGU+IGFsZ29yaXRobS4KLSAqCi0gKiBAc2VlIEdlbkltbWl4Ci0gKiBAc2VlIEdlbkltbWl4TXV0YXRvcgotICogQHNlZSBHZW5Db2xsZWN0b3IKLSAqIEBzZWUgb3JnLm1tdGsucGxhbi5TdG9wVGhlV29ybGRDb2xsZWN0b3IKLSAqIEBzZWUgb3JnLm1tdGsucGxhbi5Db2xsZWN0b3JDb250ZXh0Ci0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBjbGFzcyBHZW5JbW1peENvbGxlY3RvciBleHRlbmRzIEdlbkNvbGxlY3RvciB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluc3RhbmNlIGZpZWxkcwotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBHZW5JbW1peE1hdHVyZVRyYWNlTG9jYWwgbWF0dXJlVHJhY2UgPSBuZXcgR2VuSW1taXhNYXR1cmVUcmFjZUxvY2FsKGdsb2JhbCgpLm1hdHVyZVRyYWNlLCB0aGlzKTsKLSAgcHJpdmF0ZSBmaW5hbCBHZW5JbW1peE1hdHVyZURlZnJhZ1RyYWNlTG9jYWwgZGVmcmFnVHJhY2UgPSBuZXcgR2VuSW1taXhNYXR1cmVEZWZyYWdUcmFjZUxvY2FsKGdsb2JhbCgpLm1hdHVyZVRyYWNlLCB0aGlzKTsKLQotICBwcml2YXRlIGZpbmFsIG9yZy5tbXRrLnBvbGljeS5pbW1peC5Db2xsZWN0b3JMb2NhbCBpbW1peCA9IG5ldyBvcmcubW10ay5wb2xpY3kuaW1taXguQ29sbGVjdG9yTG9jYWwoR2VuSW1taXguaW1taXhTcGFjZSk7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBJbW1peEFsbG9jYXRvciBjb3B5ID0gbmV3IEltbWl4QWxsb2NhdG9yKEdlbkltbWl4LmltbWl4U3BhY2UsIHRydWUsIGZhbHNlKTsKLSAgcHJpdmF0ZSBmaW5hbCBJbW1peEFsbG9jYXRvciBkZWZyYWdDb3B5ID0gbmV3IEltbWl4QWxsb2NhdG9yKEdlbkltbWl4LmltbWl4U3BhY2UsIHRydWUsIHRydWUpOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbGxlY3Rpb24tdGltZSBhbGxvY2F0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBBbGxvY2F0ZSBzcGFjZSBmb3IgY29weWluZyBhbiBvYmplY3QgKHRoaXMgbWV0aG9kIDxpPmRvZXMgbm90PC9pPgotICAgKiBjb3B5IHRoZSBvYmplY3QsIGl0IG9ubHkgYWxsb2NhdGVzIHNwYWNlKQotICAgKgotICAgKiBAcGFyYW0gb3JpZ2luYWwgQSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIG9iamVjdAotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIHNpemUgb2YgdGhlIHNwYWNlIHRvIGJlIGFsbG9jYXRlZCAoaW4gYnl0ZXMpCi0gICAqIEBwYXJhbSBhbGlnbiBUaGUgcmVxdWVzdGVkIGFsaWdubWVudC4KLSAgICogQHBhcmFtIG9mZnNldCBUaGUgYWxpZ25tZW50IG9mZnNldC4KLSAgICogQHBhcmFtIGFsbG9jYXRvciBUaGUgYWxsb2NhdG9yIHRvIHVzZS4KLSAgICogQHJldHVybiBUaGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgYWxsb2NhdGVkIHJlZ2lvbgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgQWRkcmVzcyBhbGxvY0NvcHkoT2JqZWN0UmVmZXJlbmNlIG9yaWdpbmFsLCBpbnQgYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxpZ24sIGludCBvZmZzZXQsIGludCBhbGxvY2F0b3IpIHsKLQotICAgIGlmIChTdGF0cy5HQVRIRVJfTUFSS19DT05TX1NUQVRTKSB7Ci0gICAgICBpZiAoU3BhY2UuaXNJblNwYWNlKEdlbkltbWl4Lk5VUlNFUlksIG9yaWdpbmFsKSkgR2VuSW1taXgubnVyc2VyeU1hcmsuaW5jKGJ5dGVzKTsKLSAgICB9Ci0gICAgaWYgKGFsbG9jYXRvciA9PSBQbGFuLkFMTE9DX0xPUykgewotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoQWxsb2NhdG9yLmdldE1heGltdW1BbGlnbmVkU2l6ZShieXRlcywgYWxpZ24pID4gUGxhbi5NQVhfTk9OX0xPU19DT1BZX0JZVEVTKTsKLSAgICAgIHJldHVybiBsb3MuYWxsb2MoYnl0ZXMsIGFsaWduLCBvZmZzZXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIHsKLSAgICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGJ5dGVzIDw9IFBsYW4uTUFYX05PTl9MT1NfQ09QWV9CWVRFUyk7Ci0gICAgICAgIGlmIChHZW5JbW1peC5pbW1peFNwYWNlLmluSW1taXhDb2xsZWN0aW9uKCkpCi0gICAgICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGFsbG9jYXRvciA9PSBHZW5JbW1peC5BTExPQ19NQVRVUkVfTUFKT1JHQyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQoYWxsb2NhdG9yID09IEdlbkltbWl4LkFMTE9DX01BVFVSRV9NSU5PUkdDKTsKLSAgICAgIH0KLSAgICAgIGlmIChHZW5JbW1peC5pbW1peFNwYWNlLmluSW1taXhEZWZyYWdDb2xsZWN0aW9uKCkpIHsKLSAgICAgICAgcmV0dXJuIGRlZnJhZ0NvcHkuYWxsb2MoYnl0ZXMsIGFsaWduLCBvZmZzZXQpOwotICAgICAgfSBlbHNlCi0gICAgICAgIHJldHVybiBjb3B5LmFsbG9jKGJ5dGVzLCBhbGlnbiwgb2Zmc2V0KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUGVyZm9ybSBhbnkgcG9zdC1jb3B5IGFjdGlvbnMuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG5ld2x5IGFsbG9jYXRlZCBvYmplY3QKLSAgICogQHBhcmFtIHR5cGVSZWYgdGhlIHR5cGUgcmVmZXJlbmNlIGZvciB0aGUgaW5zdGFuY2UgYmVpbmcgY3JlYXRlZAotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIHNpemUgb2YgdGhlIHNwYWNlIHRvIGJlIGFsbG9jYXRlZCAoaW4gYnl0ZXMpCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHBvc3RDb3B5KE9iamVjdFJlZmVyZW5jZSBvYmplY3QsIE9iamVjdFJlZmVyZW5jZSB0eXBlUmVmLAotICAgICAgaW50IGJ5dGVzLCBpbnQgYWxsb2NhdG9yKSB7Ci0gICAgaWYgKGFsbG9jYXRvciA9PSBQbGFuLkFMTE9DX0xPUykKLSAgICAgIFBsYW4ubG9TcGFjZS5pbml0aWFsaXplSGVhZGVyKG9iamVjdCwgZmFsc2UpOwotICAgIGVsc2UgewotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSB7Ci0gICAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydCgoIUdlbkltbWl4LmltbWl4U3BhY2UuaW5JbW1peENvbGxlY3Rpb24oKSAmJiBhbGxvY2F0b3IgPT0gR2VuSW1taXguQUxMT0NfTUFUVVJFX01JTk9SR0MpIHx8Ci0gICAgICAgICAgICAoR2VuSW1taXguaW1taXhTcGFjZS5pbkltbWl4Q29sbGVjdGlvbigpICYmIGFsbG9jYXRvciA9PSBHZW5JbW1peC5BTExPQ19NQVRVUkVfTUFKT1JHQykpOwotICAgICAgfQotICAgICAgR2VuSW1taXguaW1taXhTcGFjZS5wb3N0Q29weShvYmplY3QsIGJ5dGVzLCBhbGxvY2F0b3IgPT0gR2VuSW1taXguQUxMT0NfTUFUVVJFX01BSk9SR0MpOwotICAgIH0KLSAgICBpZiAoR2VuLlVTRV9PQkpFQ1RfQkFSUklFUikKLSAgICAgIEhlYWRlckJ5dGUubWFya0FzVW5sb2dnZWQob2JqZWN0KTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDb2xsZWN0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBQZXJmb3JtIGEgKGxvY2FsKSBjb2xsZWN0aW9uIHBoYXNlLgotICAgKgotICAgKiBAcGFyYW0gcGhhc2VJZCBDb2xsZWN0aW9uIHBoYXNlIHRvIHBlcmZvcm0KLSAgICogQHBhcmFtIHByaW1hcnkgSXMgdGhpcyB0aHJlYWQgdG8gZG8gdGhlIG9uZS1vZmYgdGhyZWFkLWxvY2FsIHRhc2tzCi0gICAqLwotICBATm9JbmxpbmUKLSAgcHVibGljIHZvaWQgY29sbGVjdGlvblBoYXNlKHNob3J0IHBoYXNlSWQsIGJvb2xlYW4gcHJpbWFyeSkgewotICAgIFRyYWNlTG9jYWwgdHJhY2UgPSBHZW5JbW1peC5pbW1peFNwYWNlLmluSW1taXhEZWZyYWdDb2xsZWN0aW9uKCkgPyBkZWZyYWdUcmFjZSA6IG1hdHVyZVRyYWNlOwotCi0gICAgaWYgKGdsb2JhbCgpLnRyYWNlRnVsbEhlYXAoKSkgewotICAgICAgaWYgKHBoYXNlSWQgPT0gR2VuSW1taXguUFJFUEFSRSkgewotICAgICAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gICAgICAgIHRyYWNlLnByZXBhcmUoKTsKLSAgICAgICAgY29weS5yZXNldCgpOwotICAgICAgICBpZiAoZ2xvYmFsKCkuZ2NGdWxsSGVhcCkgewotICAgICAgICAgIGltbWl4LnByZXBhcmUodHJ1ZSk7Ci0gICAgICAgICAgZGVmcmFnQ29weS5yZXNldCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgaWYgKHBoYXNlSWQgPT0gR2VuSW1taXguQ0xPU1VSRSkgewotICAgICAgICB0cmFjZS5jb21wbGV0ZVRyYWNlKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgaWYgKHBoYXNlSWQgPT0gR2VuSW1taXguUkVMRUFTRSkgewotICAgICAgICB0cmFjZS5yZWxlYXNlKCk7Ci0gICAgICAgIGlmIChnbG9iYWwoKS5nY0Z1bGxIZWFwKSB7Ci0gICAgICAgICAgaW1taXgucmVsZWFzZSh0cnVlKTsKLSAgICAgICAgICBjb3B5LnJlc2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQsIHByaW1hcnkpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQsIHByaW1hcnkpOwotICB9Ci0KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgVHJhY2VMb2NhbCBnZXRGdWxsSGVhcFRyYWNlKCkgewotICAgIHJldHVybiBHZW5JbW1peC5pbW1peFNwYWNlLmluSW1taXhEZWZyYWdDb2xsZWN0aW9uKCkgPyBkZWZyYWdUcmFjZSA6IG1hdHVyZVRyYWNlOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogTWlzY2VsbGFuZW91cwotICAgKi8KLQotICAvKiogQHJldHVybiBUaGUgYWN0aXZlIGdsb2JhbCBwbGFuIGFzIGEgPGNvZGU+R2VuSW1taXg8L2NvZGU+IGluc3RhbmNlLiAqLwotICBASW5saW5lCi0gIHByaXZhdGUgc3RhdGljIEdlbkltbWl4IGdsb2JhbCgpIHsKLSAgICByZXR1cm4gKEdlbkltbWl4KSBWTS5hY3RpdmVQbGFuLmdsb2JhbCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vZ2VuZXJhdGlvbmFsL2ltbWl4L0dlbkltbWl4Q29uc3RyYWludHMuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9nZW5lcmF0aW9uYWwvaW1taXgvR2VuSW1taXhDb25zdHJhaW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjc5OTYwLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9nZW5lcmF0aW9uYWwvaW1taXgvR2VuSW1taXhDb25zdHJhaW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4uZ2VuZXJhdGlvbmFsLmltbWl4OwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5nZW5lcmF0aW9uYWwuR2VuQ29uc3RyYWludHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5tbXRrLnBvbGljeS5pbW1peC5JbW1peENvbnN0YW50cy5NQVhfSU1NSVhfT0JKRUNUX0JZVEVTOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBhbmQgaXRzIHN1YmNsYXNzZXMgY29tbXVuaWNhdGUgdG8gdGhlIGhvc3QgVk0vUnVudGltZQotICogYW55IGZlYXR1cmVzIG9mIHRoZSBzZWxlY3RlZCBwbGFuIHRoYXQgaXQgbmVlZHMgdG8ga25vdy4gIFRoaXMgaXMKLSAqIHNlcGFyYXRlIGZyb20gdGhlIG1haW4gUGxhbi9QbGFuTG9jYWwgY2xhc3MgaW4gb3JkZXIgdG8gYnlwYXNzIGFueQotICogaXNzdWVzIHdpdGggb3JkZXJpbmcgb2Ygc3RhdGljIGluaXRpYWxpemF0aW9uLgotICoKLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIEdlbkltbWl4Q29uc3RyYWludHMgZXh0ZW5kcyBHZW5Db25zdHJhaW50cyB7Ci0gIC8qKiBAcmV0dXJuIFRoZSBzcGVjaWFsaXplZCBzY2FuIG1ldGhvZHMgcmVxdWlyZWQgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgbnVtU3BlY2lhbGl6ZWRTY2FucygpIHsgcmV0dXJuIDM7IH0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgbWF4Tm9uTE9TQ29weUJ5dGVzKCkgeyByZXR1cm4gTUFYX0lNTUlYX09CSkVDVF9CWVRFUzt9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vZ2VuZXJhdGlvbmFsL2ltbWl4L0dlbkltbWl4TWF0dXJlRGVmcmFnVHJhY2VMb2NhbC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL2dlbmVyYXRpb25hbC9pbW1peC9HZW5JbW1peE1hdHVyZURlZnJhZ1RyYWNlTG9jYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcwYmI1MC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vZ2VuZXJhdGlvbmFsL2ltbWl4L0dlbkltbWl4TWF0dXJlRGVmcmFnVHJhY2VMb2NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLmdlbmVyYXRpb25hbC5pbW1peDsKLQotaW1wb3J0IHN0YXRpYyBvcmcubW10ay5wb2xpY3kuaW1taXguSW1taXhDb25zdGFudHMuTUFSS19MSU5FX0FUX1NDQU5fVElNRTsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uZ2VuZXJhdGlvbmFsLkdlbkNvbGxlY3RvcjsKLWltcG9ydCBvcmcubW10ay5wbGFuLmdlbmVyYXRpb25hbC5HZW5NYXR1cmVUcmFjZUxvY2FsOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhY2U7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LlNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuTG9nOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkub3B0aW9ucy5PcHRpb25zOwotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbG1lbnRzIHRoZSBjb3JlIGZ1bmN0aW9uYWxpdHkgZm9yIGEgdHJhbnNpdGl2ZQotICogY2xvc3VyZSBvdmVyIHRoZSBoZWFwIGdyYXBoLCBzcGVjaWZpY2FsbHkgaW4gYSBkZWZyYWdtZW50aW5nIHBhc3Mgb3ZlcgotICogYSBnZW5lcmF0aW9uYWwgaW1taXggY29sbGVjdG9yLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgZmluYWwgY2xhc3MgR2VuSW1taXhNYXR1cmVEZWZyYWdUcmFjZUxvY2FsIGV4dGVuZHMgR2VuTWF0dXJlVHJhY2VMb2NhbHsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICovCi0gIHB1YmxpYyBHZW5JbW1peE1hdHVyZURlZnJhZ1RyYWNlTG9jYWwoVHJhY2UgZ2xvYmFsLCBHZW5Db2xsZWN0b3IgcGxhbikgewotICAgIHN1cGVyKEdlbkltbWl4LlNDQU5fREVGUkFHLCBnbG9iYWwsIHBsYW4pOwotICB9Ci0KLSAgLyoqCi0gICAqIElzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGxpdmU/Ci0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdC4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBvYmplY3QgaXMgbGl2ZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTGl2ZShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoR2VuSW1taXguaW1taXhTcGFjZS5pbkltbWl4RGVmcmFnQ29sbGVjdGlvbigpKTsKLSAgICBpZiAob2JqZWN0LmlzTnVsbCgpKSByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKFNwYWNlLmlzSW5TcGFjZShHZW5JbW1peC5JTU1JWCwgb2JqZWN0KSkgewotICAgICAgcmV0dXJuIEdlbkltbWl4LmltbWl4U3BhY2UuaXNMaXZlKG9iamVjdCk7Ci0gICAgfQotICAgIHJldHVybiBzdXBlci5pc0xpdmUob2JqZWN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBpcyB0aGUgY29yZSBtZXRob2QgZHVyaW5nIHRoZSB0cmFjZSBvZiB0aGUgb2JqZWN0IGdyYXBoLgotICAgKiBUaGUgcm9sZSBvZiB0aGlzIG1ldGhvZCBpcyB0bzoKLSAgICoKLSAgICogMS4gRW5zdXJlIHRoZSB0cmFjZWQgb2JqZWN0IGlzIG5vdCBjb2xsZWN0ZWQuCi0gICAqIDIuIElmIHRoaXMgaXMgdGhlIGZpcnN0IHZpc2l0IHRvIHRoZSBvYmplY3QgZW5xdWV1ZSBpdCB0byBiZSBzY2FubmVkLgotICAgKiAzLiBSZXR1cm4gdGhlIGZvcndhcmRlZCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdC4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIHRyYWNlZC4KLSAgICogQHJldHVybiBUaGUgbmV3IHJlZmVyZW5jZSB0byB0aGUgc2FtZSBvYmplY3QgaW5zdGFuY2UuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBPYmplY3RSZWZlcmVuY2UgdHJhY2VPYmplY3QoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KEdlbkltbWl4LmltbWl4U3BhY2UuaW5JbW1peERlZnJhZ0NvbGxlY3Rpb24oKSk7Ci0gICAgaWYgKG9iamVjdC5pc051bGwoKSkgcmV0dXJuIG9iamVjdDsKLSAgICBpZiAoU3BhY2UuaXNJblNwYWNlKEdlbkltbWl4LklNTUlYLCBvYmplY3QpKQotICAgICAgcmV0dXJuIEdlbkltbWl4LmltbWl4U3BhY2UudHJhY2VPYmplY3QodGhpcywgb2JqZWN0LCBHZW5JbW1peC5BTExPQ19NQVRVUkVfTUFKT1JHQyk7Ci0gICAgcmV0dXJuIHN1cGVyLnRyYWNlT2JqZWN0KG9iamVjdCk7Ci0gIH0KLQotICBASW5saW5lCi0gIEBPdmVycmlkZQotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlIHByZWNvcHlPYmplY3QoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KEdlbkltbWl4LmltbWl4U3BhY2UuaW5JbW1peERlZnJhZ0NvbGxlY3Rpb24oKSk7Ci0gICAgT2JqZWN0UmVmZXJlbmNlIHJ0biA9IHRyYWNlT2JqZWN0KG9iamVjdCk7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQod2lsbE5vdE1vdmVJbkN1cnJlbnRDb2xsZWN0aW9uKHJ0bikpOwotICAgIHJldHVybiBydG47Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRydWUgaWYgdGhpcyBvYmplY3QgaXMgZ3VhcmFudGVlZCBub3QgdG8gbW92ZSBkdXJpbmcgdGhpcwotICAgKiBjb2xsZWN0aW9uIChpLmUuIHRoaXMgb2JqZWN0IGlzIGRlZmludGVseSBub3QgYW4gdW5mb3J3YXJkZWQKLSAgICogb2JqZWN0KS4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBvYmplY3QgaXMgZ3VhcmFudGVlZCBub3QgdG8gbW92ZSBkdXJpbmcgdGhpcwotICAgKiAgICAgICAgIGNvbGxlY3Rpb24uCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gd2lsbE5vdE1vdmVJbkN1cnJlbnRDb2xsZWN0aW9uKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAoU3BhY2UuaXNJblNwYWNlKEdlbkltbWl4LklNTUlYLCBvYmplY3QpKSB7Ci0gICAgICByZXR1cm4gR2VuSW1taXguaW1taXhTcGFjZS53aWxsTm90TW92ZVRoaXNHQyhvYmplY3QpOwotICAgIH0KLSAgICByZXR1cm4gc3VwZXIud2lsbE5vdE1vdmVJbkN1cnJlbnRDb2xsZWN0aW9uKG9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29sbGVjdG9ycyB0aGF0IG1vdmUgb2JqZWN0cyA8Yj5tdXN0PC9iPiBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLSAgICogSXQgcGVyZm9ybXMgdGhlIGRlZmVycmVkIHNjYW5uaW5nIG9mIG9iamVjdHMgd2hpY2ggYXJlIGZvcndhcmRlZAotICAgKiBkdXJpbmcgYm9vdHN0cmFwIG9mIGVhY2ggY29weWluZyBjb2xsZWN0aW9uLiAgQmVjYXVzZSBvZiB0aGUKLSAgICogY29tcGxleGl0aWVzIG9mIHRoZSBjb2xsZWN0aW9uIGJvb3RzdHJhcCAoc3VjaCBvYmplY3RzIGFyZQotICAgKiBnZW5lcmFsbHkgdGhlbXNlbHZlcyBnYy1jcml0aWNhbCksIHRoZSBmb3J3YXJkaW5nIGFuZCBzY2FubmluZyBvZgotICAgKiB0aGUgb2JqZWN0cyBtdXN0IGJlIGRpc2xvY2F0ZWQuICBJdCBpcyBhbiBlcnJvciBmb3IgYSBub24tbW92aW5nCi0gICAqIGNvbGxlY3RvciB0byBjYWxsIHRoaXMgbWV0aG9kLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBmb3J3YXJkZWQgb2JqZWN0IHRvIGJlIHNjYW5uZWQKLSAgICovCi0gIEBJbmxpbmUKLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCB2b2lkIHNjYW5PYmplY3QoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUyAmJiBPcHRpb25zLnZlcmJvc2UuZ2V0VmFsdWUoKSA+PSA5KSB7Ci0gICAgICBMb2cud3JpdGUoIlNPWyIpOyBMb2cud3JpdGUob2JqZWN0KTsgTG9nLndyaXRlbG4oIl0iKTsKLSAgICB9Ci0gICAgc3VwZXIuc2Nhbk9iamVjdChvYmplY3QpOwotICAgIGlmIChNQVJLX0xJTkVfQVRfU0NBTl9USU1FICYmIFNwYWNlLmlzSW5TcGFjZShHZW5JbW1peC5JTU1JWCwgb2JqZWN0KSkKLSAgICAgIEdlbkltbWl4LmltbWl4U3BhY2UubWFya0xpbmVzKG9iamVjdCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9nZW5lcmF0aW9uYWwvaW1taXgvR2VuSW1taXhNYXR1cmVUcmFjZUxvY2FsLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vZ2VuZXJhdGlvbmFsL2ltbWl4L0dlbkltbWl4TWF0dXJlVHJhY2VMb2NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDdiZjNmLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9nZW5lcmF0aW9uYWwvaW1taXgvR2VuSW1taXhNYXR1cmVUcmFjZUxvY2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4uZ2VuZXJhdGlvbmFsLmltbWl4OwotCi1pbXBvcnQgc3RhdGljIG9yZy5tbXRrLnBvbGljeS5pbW1peC5JbW1peENvbnN0YW50cy5NQVJLX0xJTkVfQVRfU0NBTl9USU1FOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5nZW5lcmF0aW9uYWwuR2VuQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uZ2VuZXJhdGlvbmFsLkdlbk1hdHVyZVRyYWNlTG9jYWw7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5UcmFjZTsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBjb3JlIGZ1bmN0aW9uYWxpdHkgZm9yIGEgdHJhbnNpdGl2ZQotICogY2xvc3VyZSBvdmVyIHRoZSBoZWFwIGdyYXBoLCBzcGVjaWZpY2FsbHkgaW4gYSBnZW5lcmF0aW9uYWwgaW1taXgKLSAqIGNvbGxlY3Rvci4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGZpbmFsIGNsYXNzIEdlbkltbWl4TWF0dXJlVHJhY2VMb2NhbCBleHRlbmRzIEdlbk1hdHVyZVRyYWNlTG9jYWx7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqLwotICBwdWJsaWMgR2VuSW1taXhNYXR1cmVUcmFjZUxvY2FsKFRyYWNlIGdsb2JhbCwgR2VuQ29sbGVjdG9yIHBsYW4pIHsKLSAgICBzdXBlcihHZW5JbW1peC5TQ0FOX0lNTUlYLCBnbG9iYWwsIHBsYW4pOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIHRoZSBjb3JlIG1ldGhvZCBkdXJpbmcgdGhlIHRyYWNlIG9mIHRoZSBvYmplY3QgZ3JhcGguCi0gICAqIFRoZSByb2xlIG9mIHRoaXMgbWV0aG9kIGlzIHRvOgotICAgKgotICAgKiAxLiBFbnN1cmUgdGhlIHRyYWNlZCBvYmplY3QgaXMgbm90IGNvbGxlY3RlZC4KLSAgICogMi4gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdmlzaXQgdG8gdGhlIG9iamVjdCBlbnF1ZXVlIGl0IHRvIGJlIHNjYW5uZWQuCi0gICAqIDMuIFJldHVybiB0aGUgZm9yd2FyZGVkIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgdHJhY2VkLgotICAgKiBAcmV0dXJuIFRoZSBuZXcgcmVmZXJlbmNlIHRvIHRoZSBzYW1lIG9iamVjdCBpbnN0YW5jZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIE9iamVjdFJlZmVyZW5jZSB0cmFjZU9iamVjdChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKG9iamVjdC5pc051bGwoKSkgcmV0dXJuIG9iamVjdDsKLQotICAgIGlmIChTcGFjZS5pc0luU3BhY2UoR2VuSW1taXguSU1NSVgsIG9iamVjdCkpIHsKLSAgICAgIHJldHVybiBHZW5JbW1peC5pbW1peFNwYWNlLmZhc3RUcmFjZU9iamVjdCh0aGlzLCBvYmplY3QpOwotICAgIH0KLSAgICByZXR1cm4gc3VwZXIudHJhY2VPYmplY3Qob2JqZWN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBJcyB0aGUgc3BlY2lmaWVkIG9iamVjdCBsaXZlPwotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGxpdmUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0xpdmUoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmIChvYmplY3QuaXNOdWxsKCkpIHJldHVybiBmYWxzZTsKLSAgICBpZiAoU3BhY2UuaXNJblNwYWNlKEdlbkltbWl4LklNTUlYLCBvYmplY3QpKSB7Ci0gICAgICByZXR1cm4gR2VuSW1taXguaW1taXhTcGFjZS5pc0xpdmUob2JqZWN0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLmlzTGl2ZShvYmplY3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0cnVlIGlmIHRoaXMgb2JqZWN0IGlzIGd1YXJhbnRlZWQgbm90IHRvIG1vdmUgZHVyaW5nIHRoaXMKLSAgICogY29sbGVjdGlvbiAoaS5lLiB0aGlzIG9iamVjdCBpcyBkZWZpbnRlbHkgbm90IGFuIHVuZm9yd2FyZGVkCi0gICAqIG9iamVjdCkuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QKLSAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgb2JqZWN0IGlzIGd1YXJhbnRlZWQgbm90IHRvIG1vdmUgZHVyaW5nIHRoaXMKLSAgICogICAgICAgICBjb2xsZWN0aW9uLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIHdpbGxOb3RNb3ZlSW5DdXJyZW50Q29sbGVjdGlvbihPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKFNwYWNlLmlzSW5TcGFjZShHZW5JbW1peC5JTU1JWCwgb2JqZWN0KSkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBzdXBlci53aWxsTm90TW92ZUluQ3VycmVudENvbGxlY3Rpb24ob2JqZWN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBDb2xsZWN0b3JzIHRoYXQgbW92ZSBvYmplY3RzIDxiPm11c3Q8L2I+IG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotICAgKiBJdCBwZXJmb3JtcyB0aGUgZGVmZXJyZWQgc2Nhbm5pbmcgb2Ygb2JqZWN0cyB3aGljaCBhcmUgZm9yd2FyZGVkCi0gICAqIGR1cmluZyBib290c3RyYXAgb2YgZWFjaCBjb3B5aW5nIGNvbGxlY3Rpb24uICBCZWNhdXNlIG9mIHRoZQotICAgKiBjb21wbGV4aXRpZXMgb2YgdGhlIGNvbGxlY3Rpb24gYm9vdHN0cmFwIChzdWNoIG9iamVjdHMgYXJlCi0gICAqIGdlbmVyYWxseSB0aGVtc2VsdmVzIGdjLWNyaXRpY2FsKSwgdGhlIGZvcndhcmRpbmcgYW5kIHNjYW5uaW5nIG9mCi0gICAqIHRoZSBvYmplY3RzIG11c3QgYmUgZGlzbG9jYXRlZC4gIEl0IGlzIGFuIGVycm9yIGZvciBhIG5vbi1tb3ZpbmcKLSAgICogY29sbGVjdG9yIHRvIGNhbGwgdGhpcyBtZXRob2QuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIGZvcndhcmRlZCBvYmplY3QgdG8gYmUgc2Nhbm5lZAotICAgKi8KLSAgQElubGluZQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIHZvaWQgc2Nhbk9iamVjdChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgc3VwZXIuc2Nhbk9iamVjdChvYmplY3QpOwotICAgIGlmIChNQVJLX0xJTkVfQVRfU0NBTl9USU1FICYmIFNwYWNlLmlzSW5TcGFjZShHZW5JbW1peC5JTU1JWCwgb2JqZWN0KSkKLSAgICAgIEdlbkltbWl4LmltbWl4U3BhY2UubWFya0xpbmVzKG9iamVjdCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9nZW5lcmF0aW9uYWwvaW1taXgvR2VuSW1taXhNdXRhdG9yLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vZ2VuZXJhdGlvbmFsL2ltbWl4L0dlbkltbWl4TXV0YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWI4OTI4Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9nZW5lcmF0aW9uYWwvaW1taXgvR2VuSW1taXhNdXRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4uZ2VuZXJhdGlvbmFsLmltbWl4OwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5nZW5lcmF0aW9uYWwuKjsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LmltbWl4Lk11dGF0b3JMb2NhbDsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmFsbG9jLkFsbG9jYXRvcjsKLQotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyA8aT5wZXItbXV0YXRvciB0aHJlYWQ8L2k+IGJlaGF2aW9yIGFuZCBzdGF0ZSBmb3IKLSAqIHRoZSA8Y29kZT5HZW5JbW1peDwvY29kZT4gdHdvLWdlbmVyYXRpb25hbCBjb3B5aW5nIGNvbGxlY3Rvci48cD4KLSAqCi0gKiBTcGVjaWZpY2FsbHksIHRoaXMgY2xhc3MgZGVmaW5lcyBtdXRhdG9yLXRpbWUgc2VtYW50aWNzIHNwZWNpZmljIHRvIHRoZQotICogbWF0dXJlIGdlbmVyYXRpb24gKDxjb2RlPkdlbk11dGF0b3I8L2NvZGU+IGRlZmluZXMgbnVyc2VyeSBzZW1hbnRpY3MpLgotICogSW4gcGFydGljdWxhciB0aGUgbWF0dXJlIHNwYWNlIGFsbG9jYXRvciBpcyBkZWZpbmVkIChmb3IgbXV0YXRvci10aW1lCi0gKiBhbGxvY2F0aW9uIGludG8gdGhlIG1hdHVyZSBzcGFjZSB2aWEgcHJlLXRlbnVyaW5nKSwgYW5kIHRoZSBtYXR1cmUgc3BhY2UKLSAqIHBlci1tdXRhdG9yIHRocmVhZCBjb2xsZWN0aW9uIHRpbWUgc2VtYW50aWNzIGFyZSBkZWZpbmVkIChyZWJpbmRpbmcKLSAqIHRoZSBtYXR1cmUgc3BhY2UgYWxsb2NhdG9yKS48cD4KLSAqCi0gKiBTZWUge0BsaW5rIEdlbkltbWl4fSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgPGNvZGU+R2VuSW1taXg8L2NvZGU+IGFsZ29yaXRobS4KLSAqCi0gKiBAc2VlIEdlbkltbWl4Ci0gKiBAc2VlIEdlbkltbWl4Q29sbGVjdG9yCi0gKiBAc2VlIG9yZy5tbXRrLnBsYW4uZ2VuZXJhdGlvbmFsLkdlbk11dGF0b3IKLSAqIEBzZWUgb3JnLm1tdGsucGxhbi5TdG9wVGhlV29ybGRNdXRhdG9yCi0gKiBAc2VlIG9yZy5tbXRrLnBsYW4uTXV0YXRvckNvbnRleHQKLSAqIEBzZWUgb3JnLm1tdGsucGxhbi5QaGFzZQotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgY2xhc3MgR2VuSW1taXhNdXRhdG9yIGV4dGVuZHMgR2VuTXV0YXRvciB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBJbnN0YW5jZSBmaWVsZHMKLSAgICovCi0KLSAgLyoqCi0gICAqIFRoZSBhbGxvY2F0b3IgZm9yIHRoZSBtYXJrLXN3ZWVwIG1hdHVyZSBzcGFjZSAodGhlIG11dGF0b3IgbWF5Ci0gICAqICJwcmV0ZW51cmUiIG9iamVjdHMgaW50byB0aGlzIHNwYWNlIHdoaWNoIGlzIG90aGVyd2lzZSB1c2VkCi0gICAqIG9ubHkgYnkgdGhlIGNvbGxlY3RvcikKLSAgICovCi0gIHByaXZhdGUgZmluYWwgTXV0YXRvckxvY2FsIG1hdHVyZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluaXRpYWxpemF0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIEdlbkltbWl4TXV0YXRvcigpIHsKLSAgICBtYXR1cmUgPSBuZXcgTXV0YXRvckxvY2FsKEdlbkltbWl4LmltbWl4U3BhY2UsIGZhbHNlKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIE11dGF0b3ItdGltZSBhbGxvY2F0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFuIG9iamVjdC4KLSAgICoKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBvYmplY3QuCi0gICAqIEBwYXJhbSBhbGlnbiBSZXF1aXJlZCBhbGlnbm1lbnQgZm9yIHRoZSBvYmplY3QuCi0gICAqIEBwYXJhbSBvZmZzZXQgT2Zmc2V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYWxpZ25tZW50LgotICAgKiBAcGFyYW0gYWxsb2NhdG9yIFRoZSBhbGxvY2F0b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVxdWVzdC4KLSAgICogQHBhcmFtIHNpdGUgQWxsb2NhdGlvbiBzaXRlCi0gICAqIEByZXR1cm4gVGhlIGxvdyBhZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgQWRkcmVzcyBhbGxvYyhpbnQgYnl0ZXMsIGludCBhbGlnbiwgaW50IG9mZnNldCwgaW50IGFsbG9jYXRvciwgaW50IHNpdGUpIHsKLSAgICBpZiAoYWxsb2NhdG9yID09IEdlbkltbWl4LkFMTE9DX01BVFVSRSkgewotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZmFsc2UpOyAvLyBubyBwcmV0ZW51cmluZyB5ZXQKLSAgICAgIHJldHVybiBtYXR1cmUuYWxsb2MoYnl0ZXMsIGFsaWduLCBvZmZzZXQpOwotICAgIH0KLSAgICByZXR1cm4gc3VwZXIuYWxsb2MoYnl0ZXMsIGFsaWduLCBvZmZzZXQsIGFsbG9jYXRvciwgc2l0ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUGVyZm9ybSBwb3N0LWFsbG9jYXRpb24gYWN0aW9ucy4gIEZvciBtYW55IGFsbG9jYXRvcnMgbm9uZSBhcmUKLSAgICogcmVxdWlyZWQuCi0gICAqCi0gICAqIEBwYXJhbSByZWYgVGhlIG5ld2x5IGFsbG9jYXRlZCBvYmplY3QKLSAgICogQHBhcmFtIHR5cGVSZWYgdGhlIHR5cGUgcmVmZXJlbmNlIGZvciB0aGUgaW5zdGFuY2UgYmVpbmcgY3JlYXRlZAotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIHNpemUgb2YgdGhlIHNwYWNlIHRvIGJlIGFsbG9jYXRlZCAoaW4gYnl0ZXMpCi0gICAqIEBwYXJhbSBhbGxvY2F0b3IgVGhlIGFsbG9jYXRvciBudW1iZXIgdG8gYmUgdXNlZCBmb3IgdGhpcyBhbGxvY2F0aW9uCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHBvc3RBbGxvYyhPYmplY3RSZWZlcmVuY2UgcmVmLCBPYmplY3RSZWZlcmVuY2UgdHlwZVJlZiwKLSAgICAgIGludCBieXRlcywgaW50IGFsbG9jYXRvcikgewotICAgIGlmIChhbGxvY2F0b3IgPT0gR2VuSW1taXguQUxMT0NfTUFUVVJFKSB7Ci0gICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChmYWxzZSk7IC8vIG5vIHByZXRlbnVyaW5nIHlldAotICAgIH0gZWxzZSB7Ci0gICAgICBzdXBlci5wb3N0QWxsb2MocmVmLCB0eXBlUmVmLCBieXRlcywgYWxsb2NhdG9yKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBhbGxvY2F0b3IgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGEgc3BhY2UKLSAgICogPGNvZGU+c3BhY2U8L2NvZGU+LCBmb3IgdGhpcyBwbGFuIGluc3RhbmNlLgotICAgKgotICAgKiBAcGFyYW0gc3BhY2UgVGhlIHNwYWNlIGZvciB3aGljaCB0aGUgYWxsb2NhdG9yIGluc3RhbmNlIGlzIGRlc2lyZWQuCi0gICAqIEByZXR1cm4gVGhlIGFsbG9jYXRvciBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwbGFuIGluc3RhbmNlCi0gICAqIHdoaWNoIGlzIGFsbG9jYXRpbmcgaW50byA8Y29kZT5zcGFjZTwvY29kZT4sIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAqIGlmIG5vIGFwcHJvcHJpYXRlIGFsbG9jYXRvciBjYW4gYmUgZXN0YWJsaXNoZWQuCi0gICAqLwotICBwdWJsaWMgQWxsb2NhdG9yIGdldEFsbG9jYXRvckZyb21TcGFjZShTcGFjZSBzcGFjZSkgewotICAgIGlmIChzcGFjZSA9PSBHZW5JbW1peC5pbW1peFNwYWNlKSByZXR1cm4gbWF0dXJlOwotICAgIHJldHVybiBzdXBlci5nZXRBbGxvY2F0b3JGcm9tU3BhY2Uoc3BhY2UpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbGxlY3Rpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSBwZXItbXV0YXRvciBjb2xsZWN0aW9uIHBoYXNlLgotICAgKgotICAgKiBAcGFyYW0gcGhhc2VJZCBDb2xsZWN0aW9uIHBoYXNlIHRvIHBlcmZvcm0KLSAgICogQHBhcmFtIHByaW1hcnkgSXMgdGhpcyB0aHJlYWQgdG8gZG8gdGhlIG9uZS1vZmYgdGhyZWFkLWxvY2FsIHRhc2tzCi0gICAqLwotICBATm9JbmxpbmUKLSAgcHVibGljIHZvaWQgY29sbGVjdGlvblBoYXNlKHNob3J0IHBoYXNlSWQsIGJvb2xlYW4gcHJpbWFyeSkgewotICAgIGlmIChnbG9iYWwoKS50cmFjZUZ1bGxIZWFwKCkpIHsKLSAgICAgIGlmIChwaGFzZUlkID09IEdlbkltbWl4LlBSRVBBUkUpIHsKLSAgICAgICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQsIHByaW1hcnkpOwotICAgICAgICBpZiAoZ2xvYmFsKCkuZ2NGdWxsSGVhcCkgbWF0dXJlLnByZXBhcmUoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBpZiAocGhhc2VJZCA9PSBHZW5JbW1peC5SRUxFQVNFKSB7Ci0gICAgICAgIGlmIChnbG9iYWwoKS5nY0Z1bGxIZWFwKSBtYXR1cmUucmVsZWFzZSgpOwotICAgICAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBNaXNjZWxsYW5lb3VzCi0gICAqLwotCi0gIC8qKiBAcmV0dXJuIFRoZSBhY3RpdmUgZ2xvYmFsIHBsYW4gYXMgYSA8Y29kZT5HZW5JbW1peDwvY29kZT4gaW5zdGFuY2UuICovCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSBzdGF0aWMgR2VuSW1taXggZ2xvYmFsKCkgewotICAgIHJldHVybiAoR2VuSW1taXgpIFZNLmFjdGl2ZVBsYW4uZ2xvYmFsKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9nZW5lcmF0aW9uYWwvbWFya3N3ZWVwL0dlbk1TLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vZ2VuZXJhdGlvbmFsL21hcmtzd2VlcC9HZW5NUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDUzZTI1Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9nZW5lcmF0aW9uYWwvbWFya3N3ZWVwL0dlbk1TLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4uZ2VuZXJhdGlvbmFsLm1hcmtzd2VlcDsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uZ2VuZXJhdGlvbmFsLkdlbjsKLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYWNlOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhbnNpdGl2ZUNsb3N1cmU7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5Lk1hcmtTd2VlcFNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmhlYXAuVk1SZXF1ZXN0OwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhIHR3by1nZW5lcmF0aW9uIGNvcHlpbmcKLSAqIGNvbGxlY3RvciB3aGVyZSA8Yj50aGUgaGlnaGVyIGdlbmVyYXRpb24gaXMgYSBtYXJrLXN3ZWVwIHNwYWNlPC9iPgotICogKGZyZWUgbGlzdCBhbGxvY2F0aW9uLCBtYXJrLXN3ZWVwIGNvbGxlY3Rpb24pLiAgTnVyc2VyeSBjb2xsZWN0aW9ucwotICogb2NjdXIgd2hlbiBlaXRoZXIgdGhlIGhlYXAgaXMgZnVsbCBvciB0aGUgbnVyc2VyeSBpcyBmdWxsLiAgVGhlCi0gKiBudXJzZXJ5IHNpemUgaXMgZGV0ZXJtaW5lZCBieSBhbiBvcHRpb25hbCBjb21tYW5kIGxpbmUgYXJndW1lbnQuCi0gKiBJZiB1bmRlZmluZWQsIHRoZSBudXJzZXJ5IHNpemUgaXMgImluZmluaXRlIiwgc28gbnVyc2VyeQotICogY29sbGVjdGlvbnMgb25seSBvY2N1ciB3aGVuIHRoZSBoZWFwIGlzIGZ1bGwgKHRoaXMgaXMga25vd24gYXMgYQotICogZmxleGlibGUtc2l6ZWQgbnVyc2VyeSBjb2xsZWN0b3IpLiAgVGh1cyBib3RoIGZpeGVkIGFuZCBmbGV4aWJsZQotICogbnVyc2VyeSBzaXplcyBhcmUgc3VwcG9ydGVkLiAgRnVsbCBoZWFwIGNvbGxlY3Rpb25zIG9jY3VyIHdoZW4gdGhlCi0gKiBudXJzZXJ5IHNpemUgaGFzIGRyb3BwZWQgdG8gYSBzdGF0aWNhbGx5IGRlZmluZWQgdGhyZXNob2xkLAotICogPGNvZGU+TlVSU0VSWV9USFJFU0hPTEQ8L2NvZGU+PHA+Ci0gKgotICogU2VlIHRoZSBKb25lcyAmIExpbnMgR0MgYm9vaywgY2hhcHRlciA3IGZvciBhIGRldGFpbGVkIGRpc2N1c3Npb24KLSAqIG9mIGdlbmVyYXRpb25hbCBjb2xsZWN0aW9uIGFuZCBzZWN0aW9uIDcuMyBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlCi0gKiBmbGV4aWJsZSBudXJzZXJ5IGJlaGF2aW9yICgiVGhlIFN0YW5kYXJkIE1MIG9mIE5ldyBKZXJzZXkKLSAqIGNvbGxlY3RvciIpLCBvciBnbyB0byBBcHBlbCdzIHBhcGVyICJTaW1wbGUgZ2VuZXJhdGlvbmFsIGdhcmJhZ2UKLSAqIGNvbGxlY3Rpb24gYW5kIGZhc3QgYWxsb2NhdGlvbi4iIFNQJkUgMTkoMik6MTcxLS0xODMsIDE5ODkuPHA+Ci0gKgotICoKLSAqIEZvciBnZW5lcmFsIGNvbW1lbnRzIGFib3V0IHRoZSBnbG9iYWwvbG9jYWwgZGlzdGluY3Rpb24gYW1vbmcgY2xhc3NlcyByZWZlcgotICogdG8gUGxhbi5qYXZhIGFuZCBQbGFuTG9jYWwuamF2YS4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIEdlbk1TIGV4dGVuZHMgR2VuIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQ2xhc3MgZmllbGRzCi0gICAqLwotCi0gIC8qKiBUaGUgbWF0dXJlIHNwYWNlLCB3aGljaCBmb3IgR2VuTVMgdXNlcyBhIG1hcmsgc3dlZXAgY29sbGVjdGlvbiBwb2xpY3kuICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFya1N3ZWVwU3BhY2UgbXNTcGFjZSA9IG5ldyBNYXJrU3dlZXBTcGFjZSgibXMiLCBERUZBVUxUX1BPTExfRlJFUVVFTkNZLCBWTVJlcXVlc3QuY3JlYXRlKCkpOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TID0gbXNTcGFjZS5nZXREZXNjcmlwdG9yKCk7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5zdGFuY2UgZmllbGRzCi0gICAqLwotCi0gIC8qIFRoZSB0cmFjZSBjbGFzcyBmb3IgYSBmdWxsLWhlYXAgY29sbGVjdGlvbiAqLwotICBwdWJsaWMgZmluYWwgVHJhY2UgbWF0dXJlVHJhY2UgPSBuZXcgVHJhY2UobWV0YURhdGFTcGFjZSk7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbGxlY3Rpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSAoZ2xvYmFsKSBjb2xsZWN0aW9uIHBoYXNlLgotICAgKi8KLSAgQElubGluZQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGZpbmFsIHZvaWQgY29sbGVjdGlvblBoYXNlKHNob3J0IHBoYXNlSWQpIHsKLSAgICBpZiAodHJhY2VGdWxsSGVhcCgpKSB7Ci0gICAgICBpZiAocGhhc2VJZCA9PSBQUkVQQVJFKSB7Ci0gICAgICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkKTsKLSAgICAgICAgbWF0dXJlVHJhY2UucHJlcGFyZSgpOwotICAgICAgICBtc1NwYWNlLnByZXBhcmUodHJ1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgaWYgKHBoYXNlSWQgPT0gQ0xPU1VSRSkgewotICAgICAgICBtYXR1cmVUcmFjZS5wcmVwYXJlKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChwaGFzZUlkID09IFJFTEVBU0UpIHsKLSAgICAgICAgbWF0dXJlVHJhY2UucmVsZWFzZSgpOwotICAgICAgICBtc1NwYWNlLnJlbGVhc2UoKTsKLSAgICAgICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBBY2NvdW50aW5nCi0gICAqLwotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBwYWdlcyByZXNlcnZlZCBmb3IgdXNlIGdpdmVuIHRoZSBwZW5kaW5nCi0gICAqIGFsbG9jYXRpb24uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBwYWdlcyByZXNlcnZlZCBnaXZlbiB0aGUgcGVuZGluZwotICAgKiBhbGxvY2F0aW9uLCBleGNsdWRpbmcgc3BhY2UgcmVzZXJ2ZWQgZm9yIGNvcHlpbmcuCi0gICAqLwotICBASW5saW5lCi0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IGdldFBhZ2VzVXNlZCgpIHsKLSAgICByZXR1cm4gbXNTcGFjZS5yZXNlcnZlZFBhZ2VzKCkgKyBzdXBlci5nZXRQYWdlc1VzZWQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBwYWdlcyBhIGNvbGxlY3Rpb24gaXMgcmVxdWlyZWQgdG8gZnJlZSB0byBzYXRpc2Z5Ci0gICAqIG91dHN0YW5kaW5nIGFsbG9jYXRpb24gcmVxdWVzdHMuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwYWdlcyBhIGNvbGxlY3Rpb24gaXMgcmVxdWlyZWQgdG8gZnJlZSB0byBzYXRpc2Z5Ci0gICAqIG91dHN0YW5kaW5nIGFsbG9jYXRpb24gcmVxdWVzdHMuCi0gICAqLwotICBwdWJsaWMgaW50IGdldFBhZ2VzUmVxdWlyZWQoKSB7Ci0gICAgcmV0dXJuIHN1cGVyLmdldFBhZ2VzUmVxdWlyZWQoKSArIG1zU3BhY2UucmVxdWlyZWRQYWdlcygpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHBhZ2VzIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbiBpbnRvIHRoZSBtYXR1cmUKLSAgICogc3BhY2UuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBwYWdlcyBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24gaW50byB0aGUgbWF0dXJlCi0gICAqIHNwYWNlLgotICAgKi8KLSAgcHVibGljIGludCBnZXRNYXR1cmVQaHlzaWNhbFBhZ2VzQXZhaWwoKSB7Ci0gICAgcmV0dXJuIChpbnQpIChtc1NwYWNlLmF2YWlsYWJsZVBoeXNpY2FsUGFnZXMoKS9NYXJrU3dlZXBTcGFjZS5XT1JTVF9DQVNFX0ZSQUdNRU5UQVRJT04pOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIE1pc2NlbGxhbmVvdXMKLSAgICovCi0KLSAgLyoqCi0gICAqIEFjY2Vzc29yIG1ldGhvZCB0byBhbGxvdyB0aGUgZ2VuZXJpYyBnZW5lcmF0aW9uYWwgY29kZSBpbiBHZW4uamF2YQotICAgKiB0byBhY2Nlc3MgdGhlIG1hdHVyZSBzcGFjZS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgYWN0aXZlIG1hdHVyZSBzcGFjZQotICAgKi8KLSAgQElubGluZQotICBwcm90ZWN0ZWQgZmluYWwgU3BhY2UgYWN0aXZlTWF0dXJlU3BhY2UoKSB7Ci0gICAgcmV0dXJuIG1zU3BhY2U7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcubW10ay5wbGFuLlBsYW4jd2lsbE5ldmVyTW92ZQotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IE9iamVjdCBpbiBxdWVzdGlvbgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9iamVjdCB3aWxsIG5ldmVyIG1vdmUKLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiB3aWxsTmV2ZXJNb3ZlKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAoU3BhY2UuaXNJblNwYWNlKE1TLCBvYmplY3QpKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIHN1cGVyLndpbGxOZXZlck1vdmUob2JqZWN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWdpc3RlciBzcGVjaWFsaXplZCBtZXRob2RzLgotICAgKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJTcGVjaWFsaXplZE1ldGhvZHMoKSB7Ci0gICAgVHJhbnNpdGl2ZUNsb3N1cmUucmVnaXN0ZXJTcGVjaWFsaXplZFNjYW4oU0NBTl9NQVRVUkUsIEdlbk1TTWF0dXJlVHJhY2VMb2NhbC5jbGFzcyk7Ci0gICAgc3VwZXIucmVnaXN0ZXJTcGVjaWFsaXplZE1ldGhvZHMoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL2dlbmVyYXRpb25hbC9tYXJrc3dlZXAvR2VuTVNDb2xsZWN0b3IuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9nZW5lcmF0aW9uYWwvbWFya3N3ZWVwL0dlbk1TQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMDFjOTEuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL2dlbmVyYXRpb25hbC9tYXJrc3dlZXAvR2VuTVNDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5nZW5lcmF0aW9uYWwubWFya3N3ZWVwOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5QbGFuOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhY2VMb2NhbDsKLWltcG9ydCBvcmcubW10ay5wbGFuLmdlbmVyYXRpb25hbC4qOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5NYXJrU3dlZXBMb2NhbDsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5IZWFkZXJCeXRlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuYWxsb2MuQWxsb2NhdG9yOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuc3RhdGlzdGljcy5TdGF0czsKLQotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyA8aT5wZXItY29sbGVjdG9yIHRocmVhZDwvaT4gYmVoYXZpb3IgYW5kIHN0YXRlIGZvcgotICogdGhlIDxjb2RlPkdlbk1TPC9jb2RlPiB0d28tZ2VuZXJhdGlvbmFsIGNvcHlpbmcgY29sbGVjdG9yLjxwPgotICoKLSAqIFNwZWNpZmljYWxseSwgdGhpcyBjbGFzcyBkZWZpbmVzIHNlbWFudGljcyBzcGVjaWZpYyB0byB0aGUgY29sbGVjdGlvbiBvZgotICogdGhlIG1hdHVyZSBnZW5lcmF0aW9uICg8Y29kZT5HZW5Db2xsZWN0b3I8L2NvZGU+IGRlZmluZXMgbnVyc2VyeSBzZW1hbnRpY3MpLgotICogSW4gcGFydGljdWxhciB0aGUgbWF0dXJlIHNwYWNlIGFsbG9jYXRvciBpcyBkZWZpbmVkIChmb3IgY29sbGVjdGlvbi10aW1lCi0gKiBhbGxvY2F0aW9uIGludG8gdGhlIG1hdHVyZSBzcGFjZSksIGFuZCB0aGUgbWF0dXJlIHNwYWNlIHBlci1jb2xsZWN0b3IgdGhyZWFkCi0gKiBjb2xsZWN0aW9uIHRpbWUgc2VtYW50aWNzIGFyZSBkZWZpbmVkLjxwPgotICoKLSAqIEBzZWUgR2VuTVMgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIDxjb2RlPkdlbk1TPC9jb2RlPiBhbGdvcml0aG0uCi0gKgotICogQHNlZSBHZW5NUwotICogQHNlZSBHZW5NU011dGF0b3IKLSAqIEBzZWUgR2VuQ29sbGVjdG9yCi0gKiBAc2VlIG9yZy5tbXRrLnBsYW4uU3RvcFRoZVdvcmxkQ29sbGVjdG9yCi0gKiBAc2VlIG9yZy5tbXRrLnBsYW4uQ29sbGVjdG9yQ29udGV4dAotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgY2xhc3MgR2VuTVNDb2xsZWN0b3IgZXh0ZW5kcyBHZW5Db2xsZWN0b3IgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbnN0YW5jZSBmaWVsZHMKLSAgICovCi0KLSAgLyoqIFRoZSBhbGxvY2F0b3IgZm9yIHRoZSBtYXR1cmUgc3BhY2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBNYXJrU3dlZXBMb2NhbCBtYXR1cmU7Ci0gIHByaXZhdGUgZmluYWwgR2VuTVNNYXR1cmVUcmFjZUxvY2FsIG1hdHVyZVRyYWNlOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIEdlbk1TQ29sbGVjdG9yKCkgewotICAgIG1hdHVyZSA9IG5ldyBNYXJrU3dlZXBMb2NhbChHZW5NUy5tc1NwYWNlKTsKLSAgICBtYXR1cmVUcmFjZSA9IG5ldyBHZW5NU01hdHVyZVRyYWNlTG9jYWwoZ2xvYmFsKCkubWF0dXJlVHJhY2UsIHRoaXMpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogQ29sbGVjdGlvbi10aW1lIGFsbG9jYXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIEFsbG9jYXRlIHNwYWNlIGZvciBjb3B5aW5nIGFuIG9iamVjdCAodGhpcyBtZXRob2QgPGk+ZG9lcyBub3Q8L2k+Ci0gICAqIGNvcHkgdGhlIG9iamVjdCwgaXQgb25seSBhbGxvY2F0ZXMgc3BhY2UpCi0gICAqCi0gICAqIEBwYXJhbSBvcmlnaW5hbCBBIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgb2JqZWN0Ci0gICAqIEBwYXJhbSBieXRlcyBUaGUgc2l6ZSBvZiB0aGUgc3BhY2UgdG8gYmUgYWxsb2NhdGVkIChpbiBieXRlcykKLSAgICogQHBhcmFtIGFsaWduIFRoZSByZXF1ZXN0ZWQgYWxpZ25tZW50LgotICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBhbGlnbm1lbnQgb2Zmc2V0LgotICAgKiBAcGFyYW0gYWxsb2NhdG9yIFRoZSBhbGxvY2F0b3IgdG8gdXNlLgotICAgKiBAcmV0dXJuIFRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBhbGxvY2F0ZWQgcmVnaW9uCi0gICAqLwotICBASW5saW5lCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZmluYWwgQWRkcmVzcyBhbGxvY0NvcHkoT2JqZWN0UmVmZXJlbmNlIG9yaWdpbmFsLCBpbnQgYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxpZ24sIGludCBvZmZzZXQsIGludCBhbGxvY2F0b3IpIHsKLSAgICBpZiAoU3RhdHMuR0FUSEVSX01BUktfQ09OU19TVEFUUykgewotICAgICAgaWYgKFNwYWNlLmlzSW5TcGFjZShHZW5NUy5OVVJTRVJZLCBvcmlnaW5hbCkpIEdlbk1TLm51cnNlcnlNYXJrLmluYyhieXRlcyk7Ci0gICAgfQotCi0gICAgaWYgKGFsbG9jYXRvciA9PSBQbGFuLkFMTE9DX0xPUykgewotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoQWxsb2NhdG9yLmdldE1heGltdW1BbGlnbmVkU2l6ZShieXRlcywgYWxpZ24pID4gUGxhbi5NQVhfTk9OX0xPU19DT1BZX0JZVEVTKTsKLSAgICAgIHJldHVybiBsb3MuYWxsb2MoYnl0ZXMsIGFsaWduLCBvZmZzZXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIHsKLSAgICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGJ5dGVzIDw9IFBsYW4uTUFYX05PTl9MT1NfQ09QWV9CWVRFUyk7Ci0gICAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChhbGxvY2F0b3IgPT0gR2VuTVMuQUxMT0NfTUFUVVJFX01JTk9SR0MgfHwKLSAgICAgICAgICAgIGFsbG9jYXRvciA9PSBHZW5NUy5BTExPQ19NQVRVUkVfTUFKT1JHQyk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbWF0dXJlLmFsbG9jKGJ5dGVzLCBhbGlnbiwgb2Zmc2V0KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUGVyZm9ybSBhbnkgcG9zdC1jb3B5IGFjdGlvbnMuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG5ld2x5IGFsbG9jYXRlZCBvYmplY3QKLSAgICogQHBhcmFtIHR5cGVSZWYgdGhlIHR5cGUgcmVmZXJlbmNlIGZvciB0aGUgaW5zdGFuY2UgYmVpbmcgY3JlYXRlZAotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIHNpemUgb2YgdGhlIHNwYWNlIHRvIGJlIGFsbG9jYXRlZCAoaW4gYnl0ZXMpCi0gICAqLwotICBASW5saW5lCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZmluYWwgdm9pZCBwb3N0Q29weShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0LCBPYmplY3RSZWZlcmVuY2UgdHlwZVJlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzLCBpbnQgYWxsb2NhdG9yKSB7Ci0gICAgaWYgKGFsbG9jYXRvciA9PSBQbGFuLkFMTE9DX0xPUykKLSAgICAgIFBsYW4ubG9TcGFjZS5pbml0aWFsaXplSGVhZGVyKG9iamVjdCwgZmFsc2UpOwotICAgIGVsc2UKLSAgICAgIEdlbk1TLm1zU3BhY2UucG9zdENvcHkob2JqZWN0LCBhbGxvY2F0b3IgPT0gR2VuTVMuQUxMT0NfTUFUVVJFX01BSk9SR0MpOwotICAgIGlmIChHZW4uVVNFX09CSkVDVF9CQVJSSUVSKQotICAgICAgSGVhZGVyQnl0ZS5tYXJrQXNVbmxvZ2dlZChvYmplY3QpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbGxlY3Rpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSAobG9jYWwpIGNvbGxlY3Rpb24gcGhhc2UuCi0gICAqCi0gICAqIEBwYXJhbSBwaGFzZUlkIENvbGxlY3Rpb24gcGhhc2UgdG8gcGVyZm9ybQotICAgKiBAcGFyYW0gcHJpbWFyeSBJcyB0aGlzIHRocmVhZCB0byBkbyB0aGUgb25lLW9mZiB0aHJlYWQtbG9jYWwgdGFza3MKLSAgICovCi0gIEBOb0lubGluZQotICBwdWJsaWMgdm9pZCBjb2xsZWN0aW9uUGhhc2Uoc2hvcnQgcGhhc2VJZCwgYm9vbGVhbiBwcmltYXJ5KSB7Ci0gICAgaWYgKGdsb2JhbCgpLnRyYWNlRnVsbEhlYXAoKSkgewotICAgICAgaWYgKHBoYXNlSWQgPT0gR2VuTVMuUFJFUEFSRSkgewotICAgICAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gICAgICAgIG1hdHVyZVRyYWNlLnByZXBhcmUoKTsKLSAgICAgICAgaWYgKGdsb2JhbCgpLmdjRnVsbEhlYXApIG1hdHVyZS5wcmVwYXJlKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgaWYgKHBoYXNlSWQgPT0gR2VuTVMuQ0xPU1VSRSkgewotICAgICAgICBtYXR1cmVUcmFjZS5jb21wbGV0ZVRyYWNlKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgaWYgKHBoYXNlSWQgPT0gR2VuTVMuUkVMRUFTRSkgewotICAgICAgICBtYXR1cmVUcmFjZS5yZWxlYXNlKCk7Ci0gICAgICAgIGlmIChnbG9iYWwoKS5nY0Z1bGxIZWFwKSB7Ci0gICAgICAgICAgbWF0dXJlLnJlbGVhc2UoKTsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gIH0KLQotICBASW5saW5lCi0gIHB1YmxpYyBmaW5hbCBUcmFjZUxvY2FsIGdldEZ1bGxIZWFwVHJhY2UoKSB7Ci0gICAgcmV0dXJuIG1hdHVyZVRyYWNlOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogTWlzY2VsbGFuZW91cwotICAgKi8KLQotICAvKiogQHJldHVybiBUaGUgYWN0aXZlIGdsb2JhbCBwbGFuIGFzIGEgPGNvZGU+R2VuTVM8L2NvZGU+IGluc3RhbmNlLiAqLwotICBASW5saW5lCi0gIHByaXZhdGUgc3RhdGljIEdlbk1TIGdsb2JhbCgpIHsKLSAgICByZXR1cm4gKEdlbk1TKSBWTS5hY3RpdmVQbGFuLmdsb2JhbCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vZ2VuZXJhdGlvbmFsL21hcmtzd2VlcC9HZW5NU0NvbnN0cmFpbnRzLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vZ2VuZXJhdGlvbmFsL21hcmtzd2VlcC9HZW5NU0NvbnN0cmFpbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkOWE4Y2YuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL2dlbmVyYXRpb25hbC9tYXJrc3dlZXAvR2VuTVNDb25zdHJhaW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4uZ2VuZXJhdGlvbmFsLm1hcmtzd2VlcDsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uZ2VuZXJhdGlvbmFsLkdlbkNvbnN0cmFpbnRzOwotaW1wb3J0IHN0YXRpYyBvcmcubW10ay5wb2xpY3kuU2VncmVnYXRlZEZyZWVMaXN0U3BhY2UuTUFYX0ZSRUVMSVNUX09CSkVDVF9CWVRFUzsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgYW5kIGl0cyBzdWJjbGFzc2VzIGNvbW11bmljYXRlIHRvIHRoZSBob3N0IFZNL1J1bnRpbWUKLSAqIGFueSBmZWF0dXJlcyBvZiB0aGUgc2VsZWN0ZWQgcGxhbiB0aGF0IGl0IG5lZWRzIHRvIGtub3cuICBUaGlzIGlzCi0gKiBzZXBhcmF0ZSBmcm9tIHRoZSBtYWluIFBsYW4vUGxhbkxvY2FsIGNsYXNzIGluIG9yZGVyIHRvIGJ5cGFzcyBhbnkKLSAqIGlzc3VlcyB3aXRoIG9yZGVyaW5nIG9mIHN0YXRpYyBpbml0aWFsaXphdGlvbi4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIEdlbk1TQ29uc3RyYWludHMgZXh0ZW5kcyBHZW5Db25zdHJhaW50cyB7Ci0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IG1heE5vbkxPU0NvcHlCeXRlcygpIHsgcmV0dXJuIE1BWF9GUkVFTElTVF9PQkpFQ1RfQllURVM7fQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL2dlbmVyYXRpb25hbC9tYXJrc3dlZXAvR2VuTVNNYXR1cmVUcmFjZUxvY2FsLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vZ2VuZXJhdGlvbmFsL21hcmtzd2VlcC9HZW5NU01hdHVyZVRyYWNlTG9jYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0MmFmYi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vZ2VuZXJhdGlvbmFsL21hcmtzd2VlcC9HZW5NU01hdHVyZVRyYWNlTG9jYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLmdlbmVyYXRpb25hbC5tYXJrc3dlZXA7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLmdlbmVyYXRpb25hbC5HZW5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5nZW5lcmF0aW9uYWwuR2VuTWF0dXJlVHJhY2VMb2NhbDsKLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYWNlOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxtZW50cyB0aGUgY29yZSBmdW5jdGlvbmFsaXR5IGZvciBhIHRyYW5zaXRpdmUKLSAqIGNsb3N1cmUgb3ZlciB0aGUgaGVhcCBncmFwaCwgc3BlY2lmaWNhbGx5IGluIGEgR2VuZXJhdGlvbmFsIE1hcmstU3dlZXAKLSAqIGNvbGxlY3Rvci4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGZpbmFsIGNsYXNzIEdlbk1TTWF0dXJlVHJhY2VMb2NhbCBleHRlbmRzIEdlbk1hdHVyZVRyYWNlTG9jYWx7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqLwotICBwdWJsaWMgR2VuTVNNYXR1cmVUcmFjZUxvY2FsKFRyYWNlIGdsb2JhbCwgR2VuQ29sbGVjdG9yIHBsYW4pIHsKLSAgICBzdXBlcihnbG9iYWwsIHBsYW4pOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIHRoZSBjb3JlIG1ldGhvZCBkdXJpbmcgdGhlIHRyYWNlIG9mIHRoZSBvYmplY3QgZ3JhcGguCi0gICAqIFRoZSByb2xlIG9mIHRoaXMgbWV0aG9kIGlzIHRvOgotICAgKgotICAgKiAxLiBFbnN1cmUgdGhlIHRyYWNlZCBvYmplY3QgaXMgbm90IGNvbGxlY3RlZC4KLSAgICogMi4gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdmlzaXQgdG8gdGhlIG9iamVjdCBlbnF1ZXVlIGl0IHRvIGJlIHNjYW5uZWQuCi0gICAqIDMuIFJldHVybiB0aGUgZm9yd2FyZGVkIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgdHJhY2VkLgotICAgKiBAcmV0dXJuIFRoZSBuZXcgcmVmZXJlbmNlIHRvIHRoZSBzYW1lIG9iamVjdCBpbnN0YW5jZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIE9iamVjdFJlZmVyZW5jZSB0cmFjZU9iamVjdChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKG9iamVjdC5pc051bGwoKSkgcmV0dXJuIG9iamVjdDsKLQotICAgIGlmIChTcGFjZS5pc0luU3BhY2UoR2VuTVMuTVMsIG9iamVjdCkpIHsKLSAgICAgIHJldHVybiBHZW5NUy5tc1NwYWNlLnRyYWNlT2JqZWN0KHRoaXMsIG9iamVjdCk7Ci0gICAgfQotICAgIHJldHVybiBzdXBlci50cmFjZU9iamVjdChvYmplY3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIElzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGxpdmU/Ci0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdC4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBvYmplY3QgaXMgbGl2ZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTGl2ZShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKG9iamVjdC5pc051bGwoKSkgcmV0dXJuIGZhbHNlOwotICAgIGlmIChTcGFjZS5pc0luU3BhY2UoR2VuTVMuTVMsIG9iamVjdCkpIHsKLSAgICAgIHJldHVybiBHZW5NUy5tc1NwYWNlLmlzTGl2ZShvYmplY3QpOwotICAgIH0KLSAgICByZXR1cm4gc3VwZXIuaXNMaXZlKG9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRydWUgaWYgdGhpcyBvYmplY3QgaXMgZ3VhcmFudGVlZCBub3QgdG8gbW92ZSBkdXJpbmcgdGhpcwotICAgKiBjb2xsZWN0aW9uIChpLmUuIHRoaXMgb2JqZWN0IGlzIGRlZmludGVseSBub3QgYW4gdW5mb3J3YXJkZWQKLSAgICogb2JqZWN0KS4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBvYmplY3QgaXMgZ3VhcmFudGVlZCBub3QgdG8gbW92ZSBkdXJpbmcgdGhpcwotICAgKiAgICAgICAgIGNvbGxlY3Rpb24uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiB3aWxsTm90TW92ZUluQ3VycmVudENvbGxlY3Rpb24oT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmIChTcGFjZS5pc0luU3BhY2UoR2VuTVMuTVMsIG9iamVjdCkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gc3VwZXIud2lsbE5vdE1vdmVJbkN1cnJlbnRDb2xsZWN0aW9uKG9iamVjdCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9nZW5lcmF0aW9uYWwvbWFya3N3ZWVwL0dlbk1TTXV0YXRvci5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL2dlbmVyYXRpb25hbC9tYXJrc3dlZXAvR2VuTVNNdXRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MDAzZmMuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL2dlbmVyYXRpb25hbC9tYXJrc3dlZXAvR2VuTVNNdXRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4uZ2VuZXJhdGlvbmFsLm1hcmtzd2VlcDsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uZ2VuZXJhdGlvbmFsLio7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5Lk1hcmtTd2VlcExvY2FsOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmFsbG9jLkFsbG9jYXRvcjsKLQotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyA8aT5wZXItbXV0YXRvciB0aHJlYWQ8L2k+IGJlaGF2aW9yIGFuZCBzdGF0ZSBmb3IKLSAqIHRoZSA8Y29kZT5HZW5NUzwvY29kZT4gdHdvLWdlbmVyYXRpb25hbCBjb3B5aW5nIGNvbGxlY3Rvci48cD4KLSAqCi0gKiBTcGVjaWZpY2FsbHksIHRoaXMgY2xhc3MgZGVmaW5lcyBtdXRhdG9yLXRpbWUgc2VtYW50aWNzIHNwZWNpZmljIHRvIHRoZQotICogbWF0dXJlIGdlbmVyYXRpb24gKDxjb2RlPkdlbk11dGF0b3I8L2NvZGU+IGRlZmluZXMgbnVyc2VyeSBzZW1hbnRpY3MpLgotICogSW4gcGFydGljdWxhciB0aGUgbWF0dXJlIHNwYWNlIGFsbG9jYXRvciBpcyBkZWZpbmVkIChmb3IgbXV0YXRvci10aW1lCi0gKiBhbGxvY2F0aW9uIGludG8gdGhlIG1hdHVyZSBzcGFjZSB2aWEgcHJlLXRlbnVyaW5nKSwgYW5kIHRoZSBtYXR1cmUgc3BhY2UKLSAqIHBlci1tdXRhdG9yIHRocmVhZCBjb2xsZWN0aW9uIHRpbWUgc2VtYW50aWNzIGFyZSBkZWZpbmVkIChyZWJpbmRpbmcKLSAqIHRoZSBtYXR1cmUgc3BhY2UgYWxsb2NhdG9yKS48cD4KLSAqCi0gKiBTZWUge0BsaW5rIEdlbk1TfSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgPGNvZGU+R2VuTVM8L2NvZGU+IGFsZ29yaXRobS4KLSAqCi0gKiBAc2VlIEdlbk1TCi0gKiBAc2VlIEdlbk1TQ29sbGVjdG9yCi0gKiBAc2VlIEdlbk11dGF0b3IKLSAqIEBzZWUgb3JnLm1tdGsucGxhbi5TdG9wVGhlV29ybGRNdXRhdG9yCi0gKiBAc2VlIG9yZy5tbXRrLnBsYW4uTXV0YXRvckNvbnRleHQKLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIEdlbk1TTXV0YXRvciBleHRlbmRzIEdlbk11dGF0b3IgewotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIEluc3RhbmNlIGZpZWxkcwotICAgKi8KLQotICAvKioKLSAgICogVGhlIGFsbG9jYXRvciBmb3IgdGhlIG1hcmstc3dlZXAgbWF0dXJlIHNwYWNlICh0aGUgbXV0YXRvciBtYXkKLSAgICogInByZXRlbnVyZSIgb2JqZWN0cyBpbnRvIHRoaXMgc3BhY2Ugd2hpY2ggaXMgb3RoZXJ3aXNlIHVzZWQKLSAgICogb25seSBieSB0aGUgY29sbGVjdG9yKQotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBNYXJrU3dlZXBMb2NhbCBtYXR1cmU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbml0aWFsaXphdGlvbgotICAgKi8KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICovCi0gIHB1YmxpYyBHZW5NU011dGF0b3IoKSB7Ci0gICAgbWF0dXJlID0gbmV3IE1hcmtTd2VlcExvY2FsKEdlbk1TLm1zU3BhY2UpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogTXV0YXRvci10aW1lIGFsbG9jYXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIEFsbG9jYXRlIG1lbW9yeSBmb3IgYW4gb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIG9iamVjdC4KLSAgICogQHBhcmFtIGFsaWduIFJlcXVpcmVkIGFsaWdubWVudCBmb3IgdGhlIG9iamVjdC4KLSAgICogQHBhcmFtIG9mZnNldCBPZmZzZXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbGlnbm1lbnQuCi0gICAqIEBwYXJhbSBhbGxvY2F0b3IgVGhlIGFsbG9jYXRvciBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXF1ZXN0LgotICAgKiBAcGFyYW0gc2l0ZSBBbGxvY2F0aW9uIHNpdGUKLSAgICogQHJldHVybiBUaGUgbG93IGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBmaW5hbCBBZGRyZXNzIGFsbG9jKGludCBieXRlcywgaW50IGFsaWduLCBpbnQgb2Zmc2V0LCBpbnQgYWxsb2NhdG9yLCBpbnQgc2l0ZSkgewotICAgIGlmIChhbGxvY2F0b3IgPT0gR2VuTVMuQUxMT0NfTUFUVVJFKSB7Ci0gICAgICByZXR1cm4gbWF0dXJlLmFsbG9jKGJ5dGVzLCBhbGlnbiwgb2Zmc2V0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLmFsbG9jKGJ5dGVzLCBhbGlnbiwgb2Zmc2V0LCBhbGxvY2F0b3IsIHNpdGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFBlcmZvcm0gcG9zdC1hbGxvY2F0aW9uIGFjdGlvbnMuICBGb3IgbWFueSBhbGxvY2F0b3JzIG5vbmUgYXJlCi0gICAqIHJlcXVpcmVkLgotICAgKgotICAgKiBAcGFyYW0gcmVmIFRoZSBuZXdseSBhbGxvY2F0ZWQgb2JqZWN0Ci0gICAqIEBwYXJhbSB0eXBlUmVmIHRoZSB0eXBlIHJlZmVyZW5jZSBmb3IgdGhlIGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBzaXplIG9mIHRoZSBzcGFjZSB0byBiZSBhbGxvY2F0ZWQgKGluIGJ5dGVzKQotICAgKiBAcGFyYW0gYWxsb2NhdG9yIFRoZSBhbGxvY2F0b3IgbnVtYmVyIHRvIGJlIHVzZWQgZm9yIHRoaXMgYWxsb2NhdGlvbgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgdm9pZCBwb3N0QWxsb2MoT2JqZWN0UmVmZXJlbmNlIHJlZiwgT2JqZWN0UmVmZXJlbmNlIHR5cGVSZWYsCi0gICAgICBpbnQgYnl0ZXMsIGludCBhbGxvY2F0b3IpIHsKLSAgICBpZiAoYWxsb2NhdG9yID09IEdlbk1TLkFMTE9DX01BVFVSRSkgewotICAgICAgR2VuTVMubXNTcGFjZS5pbml0aWFsaXplSGVhZGVyKHJlZiwgdHJ1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN1cGVyLnBvc3RBbGxvYyhyZWYsIHR5cGVSZWYsIGJ5dGVzLCBhbGxvY2F0b3IpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGFsbG9jYXRvciBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggYSBzcGFjZQotICAgKiA8Y29kZT5zcGFjZTwvY29kZT4sIGZvciB0aGlzIHBsYW4gaW5zdGFuY2UuCi0gICAqCi0gICAqIEBwYXJhbSBzcGFjZSBUaGUgc3BhY2UgZm9yIHdoaWNoIHRoZSBhbGxvY2F0b3IgaW5zdGFuY2UgaXMgZGVzaXJlZC4KLSAgICogQHJldHVybiBUaGUgYWxsb2NhdG9yIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBsYW4gaW5zdGFuY2UKLSAgICogd2hpY2ggaXMgYWxsb2NhdGluZyBpbnRvIDxjb2RlPnNwYWNlPC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICogaWYgbm8gYXBwcm9wcmlhdGUgYWxsb2NhdG9yIGNhbiBiZSBlc3RhYmxpc2hlZC4KLSAgICovCi0gIHB1YmxpYyBBbGxvY2F0b3IgZ2V0QWxsb2NhdG9yRnJvbVNwYWNlKFNwYWNlIHNwYWNlKSB7Ci0gICAgaWYgKHNwYWNlID09IEdlbk1TLm1zU3BhY2UpIHJldHVybiBtYXR1cmU7Ci0gICAgcmV0dXJuIHN1cGVyLmdldEFsbG9jYXRvckZyb21TcGFjZShzcGFjZSk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQ29sbGVjdGlvbgotICAgKi8KLQotICAvKioKLSAgICogUGVyZm9ybSBhIHBlci1tdXRhdG9yIGNvbGxlY3Rpb24gcGhhc2UuCi0gICAqCi0gICAqIEBwYXJhbSBwaGFzZUlkIENvbGxlY3Rpb24gcGhhc2UgdG8gcGVyZm9ybQotICAgKiBAcGFyYW0gcHJpbWFyeSBJcyB0aGlzIHRocmVhZCB0byBkbyB0aGUgb25lLW9mZiB0aHJlYWQtbG9jYWwgdGFza3MKLSAgICovCi0gIEBOb0lubGluZQotICBwdWJsaWMgdm9pZCBjb2xsZWN0aW9uUGhhc2Uoc2hvcnQgcGhhc2VJZCwgYm9vbGVhbiBwcmltYXJ5KSB7Ci0gICAgaWYgKGdsb2JhbCgpLnRyYWNlRnVsbEhlYXAoKSkgewotICAgICAgaWYgKHBoYXNlSWQgPT0gR2VuTVMuUFJFUEFSRSkgewotICAgICAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gICAgICAgIGlmIChnbG9iYWwoKS5nY0Z1bGxIZWFwKSBtYXR1cmUucHJlcGFyZSgpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwaGFzZUlkID09IEdlbk1TLlJFTEVBU0UpIHsKLSAgICAgICAgaWYgKGdsb2JhbCgpLmdjRnVsbEhlYXApIG1hdHVyZS5yZWxlYXNlKCk7Ci0gICAgICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLQotICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KTsKLSAgfQotCi0gIC8qKgotICAgKiBGbHVzaCBtdXRhdG9yIGNvbnRleHQsIGluIHJlc3BvbnNlIHRvIGEgcmVxdWVzdE11dGF0b3JGbHVzaC4KLSAgICogQWxzbyBjYWxsZWQgYnkgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgZGVpbml0TXV0YXRvci4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBmbHVzaCgpIHsKLSAgICBzdXBlci5mbHVzaCgpOwotICAgIG1hdHVyZS5mbHVzaCgpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogTWlzY2VsbGFuZW91cwotICAgKi8KLQotICAvKiogQHJldHVybiBUaGUgYWN0aXZlIGdsb2JhbCBwbGFuIGFzIGEgPGNvZGU+R2VuTVM8L2NvZGU+IGluc3RhbmNlLiAqLwotICBASW5saW5lCi0gIHByaXZhdGUgc3RhdGljIEdlbk1TIGdsb2JhbCgpIHsKLSAgICByZXR1cm4gKEdlbk1TKSBWTS5hY3RpdmVQbGFuLmdsb2JhbCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vaW1taXgvSW1taXguamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9pbW1peC9JbW1peC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTMyMjVlLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9pbW1peC9JbW1peC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLmltbWl4OwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi4qOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuaW1taXguSW1taXhTcGFjZTsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuaW1taXguT2JqZWN0SGVhZGVyOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuaGVhcC5WTVJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBnbG9iYWwgc3RhdGUgb2YgYW4gaW1taXggY29sbGVjdG9yLgotICoKLSAqIFNlZSB0aGUgUExESScwOCBwYXBlciBieSBCbGFja2J1cm4gYW5kIE1jS2lubGV5IGZvciBhIGRlc2NyaXB0aW9uCi0gKiBvZiB0aGUgYWxnb3JpdGhtOiBodHRwOi8vZG9pLmFjbS5vcmcvMTAuMTE0NS8xMzc1NTgxLjEzNzU1ODYKLSAqCi0gKiBBbGwgcGxhbnMgbWFrZSBhIGNsZWFyIGRpc3RpbmN0aW9uIGJldHdlZW4gPGk+Z2xvYmFsPC9pPiBhbmQKLSAqIDxpPnRocmVhZC1sb2NhbDwvaT4gYWN0aXZpdGllcywgYW5kIGRpdmlkZXMgZ2xvYmFsIGFuZCBsb2NhbCBzdGF0ZQotICogaW50byBzZXBhcmF0ZSBjbGFzcyBoaWVyYXJjaGllcy4gIEdsb2JhbCBhY3Rpdml0aWVzIG11c3QgYmUKLSAqIHN5bmNocm9uaXplZCwgd2hlcmVhcyBubyBzeW5jaHJvbml6YXRpb24gaXMgcmVxdWlyZWQgZm9yCi0gKiB0aHJlYWQtbG9jYWwgYWN0aXZpdGllcy4gIFRoZXJlIGlzIGEgc2luZ2xlIGluc3RhbmNlIG9mIFBsYW4gKG9yIHRoZQotICogYXBwcm9wcmlhdGUgc3ViLWNsYXNzKSwgYW5kIGEgMToxIG1hcHBpbmcgb2YgUGxhbkxvY2FsIHRvICJrZXJuZWwKLSAqIHRocmVhZHMiIChha2EgQ1BVcyBvciBpbiBKaWtlcyBSVk0sIFByb2Nlc3NvcnMpLiAgVGh1cyBpbnN0YW5jZQotICogbWV0aG9kcyBvZiBQbGFuTG9jYWwgYWxsb3cgZmFzdCwgdW5zeWNocm9uaXplZCBhY2Nlc3MgdG8gZnVuY3Rpb25zIHN1Y2ggYXMKLSAqIGFsbG9jYXRpb24gYW5kIGNvbGxlY3Rpb24uCi0gKgotICogVGhlIGdsb2JhbCBpbnN0YW5jZSBkZWZpbmVzIGFuZCBtYW5hZ2VzIHN0YXRpYyByZXNvdXJjZXMKLSAqIChzdWNoIGFzIG1lbW9yeSBhbmQgdmlydHVhbCBtZW1vcnkgcmVzb3VyY2VzKS4gIFRoaXMgbWFwcGluZyBvZiB0aHJlYWRzIHRvCi0gKiBpbnN0YW5jZXMgaXMgY3J1Y2lhbCB0byB1bmRlcnN0YW5kaW5nIHRoZSBjb3JyZWN0bmVzcyBhbmQKLSAqIHBlcmZvcm1hbmNlIHByb3BlcnRpZXMgb2YgTU1UayBwbGFucy4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIEltbWl4IGV4dGVuZHMgU3RvcFRoZVdvcmxkIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBDb25zdGFudHMKLSAgICovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogQ2xhc3MgdmFyaWFibGVzCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEltbWl4U3BhY2UgaW1taXhTcGFjZSA9IG5ldyBJbW1peFNwYWNlKCJpbW1peCIsIERFRkFVTFRfUE9MTF9GUkVRVUVOQ1ksIFZNUmVxdWVzdC5jcmVhdGUoKSk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElNTUlYID0gaW1taXhTcGFjZS5nZXREZXNjcmlwdG9yKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9JTU1JWCA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDQU5fREVGUkFHID0gMTsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBJbnN0YW5jZSB2YXJpYWJsZXMKLSAgICovCi0KLSAgcHVibGljIGZpbmFsIFRyYWNlIGltbWl4VHJhY2UgPSBuZXcgVHJhY2UobWV0YURhdGFTcGFjZSk7Ci0gIC8qKiB3aWxsIHRoZSBuZXh0IGNvbGxlY3Rpb24gY29sbGVjdCB0aGUgd2hvbGUgaGVhcD8gKi8KLSAgcHVibGljIGJvb2xlYW4gbmV4dEdDV2hvbGVIZWFwID0gdHJ1ZTsKLSAgLyoqIHdpbGwgdGhpcyBjb2xsZWN0aW9uIGNvbGxlY3QgdGhlIHdob2xlIGhlYXAgKi8KLSAgcHVibGljIGJvb2xlYW4gY29sbGVjdFdob2xlSGVhcCA9IG5leHRHQ1dob2xlSGVhcDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gbGFzdEdDV2FzRGVmcmFnID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKgotICAgKi8KLSAgcHVibGljIEltbWl4KCkgewotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbGxlY3Rpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSAoZ2xvYmFsKSBjb2xsZWN0aW9uIHBoYXNlLgotICAgKgotICAgKiBAcGFyYW0gcGhhc2VJZCBDb2xsZWN0aW9uIHBoYXNlIHRvIGV4ZWN1dGUuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyB2b2lkIGNvbGxlY3Rpb25QaGFzZShzaG9ydCBwaGFzZUlkKSB7Ci0gICAgaWYgKHBoYXNlSWQgPT0gU0VUX0NPTExFQ1RJT05fS0lORCkgewotICAgICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQpOwotICAgICAgaW1taXhTcGFjZS5kZWNpZGVXaGV0aGVyVG9EZWZyYWcoZW1lcmdlbmN5Q29sbGVjdGlvbiwgY29sbGVjdFdob2xlSGVhcCwgY29sbGVjdGlvbkF0dGVtcHQsIGNvbGxlY3Rpb25UcmlnZ2VyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBQUkVQQVJFKSB7Ci0gICAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCk7Ci0gICAgICBpbW1peFRyYWNlLnByZXBhcmUoKTsKLSAgICAgIGltbWl4U3BhY2UucHJlcGFyZSh0cnVlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBDTE9TVVJFKSB7Ci0gICAgICBpbW1peFRyYWNlLnByZXBhcmUoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBSRUxFQVNFKSB7Ci0gICAgICBpbW1peFRyYWNlLnJlbGVhc2UoKTsKLSAgICAgIGxhc3RHQ1dhc0RlZnJhZyA9IGltbWl4U3BhY2UucmVsZWFzZSh0cnVlKTsKLSAgICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBXaGV0aGVyIGxhc3QgR0Mgd2FzIGFuIGV4aGF1c3RpdmUgYXR0ZW1wdCB0byBjb2xsZWN0IHRoZSBoZWFwLiAgRm9yIG1hbnkgY29sbGVjdG9ycyB0aGlzIGlzIHRoZSBzYW1lIGFzIGFza2luZyB3aGV0aGVyIHRoZSBsYXN0IEdDIHdhcyBhIGZ1bGwgaGVhcCBjb2xsZWN0aW9uLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGxhc3RDb2xsZWN0aW9uV2FzRXhoYXVzdGl2ZSgpIHsKLSAgICByZXR1cm4gbGFzdEdDV2FzRGVmcmFnOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEFjY291bnRpbmcKLSAgICovCi0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHBhZ2VzIHJlc2VydmVkIGZvciB1c2UgZ2l2ZW4gdGhlIHBlbmRpbmcKLSAgICogYWxsb2NhdGlvbi4gIFRoZSBzdXBlcmNsYXNzIGFjY291bnRzIGZvciBpdHMgc3BhY2VzLCB3ZSBqdXN0Ci0gICAqIGF1Z21lbnQgdGhpcyB3aXRoIHRoZSBtYXJrLXN3ZWVwIHNwYWNlJ3MgY29udHJpYnV0aW9uLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgcGFnZXMgcmVzZXJ2ZWQgZ2l2ZW4gdGhlIHBlbmRpbmcKLSAgICogYWxsb2NhdGlvbiwgZXhjbHVkaW5nIHNwYWNlIHJlc2VydmVkIGZvciBjb3B5aW5nLgotICAgKi8KLSAgcHVibGljIGludCBnZXRQYWdlc1VzZWQoKSB7Ci0gICAgcmV0dXJuIGltbWl4U3BhY2UucmVzZXJ2ZWRQYWdlcygpICsgc3VwZXIuZ2V0UGFnZXNVc2VkKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgcGFnZXMgYSBjb2xsZWN0aW9uIGlzIHJlcXVpcmVkIHRvIGZyZWUgdG8gc2F0aXNmeQotICAgKiBvdXRzdGFuZGluZyBhbGxvY2F0aW9uIHJlcXVlc3RzLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcGFnZXMgYSBjb2xsZWN0aW9uIGlzIHJlcXVpcmVkIHRvIGZyZWUgdG8gc2F0aXNmeQotICAgKiBvdXRzdGFuZGluZyBhbGxvY2F0aW9uIHJlcXVlc3RzLgotICAgKi8KLSAgcHVibGljIGludCBnZXRQYWdlc1JlcXVpcmVkKCkgewotICAgIHJldHVybiBzdXBlci5nZXRQYWdlc1JlcXVpcmVkKCkgKyBpbW1peFNwYWNlLnJlcXVpcmVkUGFnZXMoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5tbXRrLnBsYW4uUGxhbiN3aWxsTmV2ZXJNb3ZlCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgT2JqZWN0IGluIHF1ZXN0aW9uCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgb2JqZWN0IHdpbGwgbmV2ZXIgbW92ZQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIHdpbGxOZXZlck1vdmUoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmIChTcGFjZS5pc0luU3BhY2UoSU1NSVgsIG9iamVjdCkpIHsKLSAgICAgIE9iamVjdEhlYWRlci5waW5PYmplY3Qob2JqZWN0KTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZQotICAgICAgcmV0dXJuIHN1cGVyLndpbGxOZXZlck1vdmUob2JqZWN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWdpc3RlciBzcGVjaWFsaXplZCBtZXRob2RzLgotICAgKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJTcGVjaWFsaXplZE1ldGhvZHMoKSB7Ci0gICAgVHJhbnNpdGl2ZUNsb3N1cmUucmVnaXN0ZXJTcGVjaWFsaXplZFNjYW4oU0NBTl9JTU1JWCwgSW1taXhUcmFjZUxvY2FsLmNsYXNzKTsKLSAgICBUcmFuc2l0aXZlQ2xvc3VyZS5yZWdpc3RlclNwZWNpYWxpemVkU2NhbihTQ0FOX0RFRlJBRywgSW1taXhEZWZyYWdUcmFjZUxvY2FsLmNsYXNzKTsKLSAgICBzdXBlci5yZWdpc3RlclNwZWNpYWxpemVkTWV0aG9kcygpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vaW1taXgvSW1taXhDb2xsZWN0b3IuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9pbW1peC9JbW1peENvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTZhZmM5Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9pbW1peC9JbW1peENvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLmltbWl4OwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi4qOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5JbW1vcnRhbExvY2FsOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5pbW1peC5Db2xsZWN0b3JMb2NhbDsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmFsbG9jLkJ1bXBQb2ludGVyOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuYWxsb2MuSW1taXhBbGxvY2F0b3I7Ci1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLkFkZHJlc3M7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC5PYmplY3RSZWZlcmVuY2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIDxpPnBlci1jb2xsZWN0b3IgdGhyZWFkPC9pPiBiZWhhdmlvcgotICogYW5kIHN0YXRlIGZvciB0aGUgPGk+SW1taXg8L2k+IHBsYW4sIHdoaWNoIGltcGxlbWVudHMgYSBmdWxsLWhlYXAKLSAqIGltbWl4IGNvbGxlY3Rvci48cD4KLSAqCi0gKiBTcGVjaWZpY2FsbHksIHRoaXMgY2xhc3MgZGVmaW5lcyA8aT5JbW1peDwvaT4gY29sbGVjdGlvbiBiZWhhdmlvcgotICogKHRocm91Z2ggPGNvZGU+ZmFzdFRyYWNlPC9jb2RlPiBhbmQgdGhlIDxjb2RlPmNvbGxlY3Rpb25QaGFzZTwvY29kZT4KLSAqIG1ldGhvZCkuPHA+Ci0gKgotICogQHNlZSBJbW1peCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIGltbWl4IGFsZ29yaXRobS48cD4KLSAqCi0gKiBGSVhNRSBUaGUgU2VncmVnYXRlZEZyZWVMaXN0IGNsYXNzIChhbmQgaXRzIGRlY2VuZGVudHMgc3VjaCBhcwotICogTWFya1N3ZWVwTG9jYWwpIGRvZXMgbm90IHByb3Blcmx5IHNlcGFyYXRlIG11dGF0b3IgYW5kIGNvbGxlY3RvcgotICogYmVoYXZpb3JzLCBzbyB0aGUgaW1taXggZmllbGQgYmVsb3cgc2hvdWxkIHJlYWxseSBub3QgZXhpc3QgaW4KLSAqIHRoaXMgY2xhc3MgYXMgdGhlcmUgaXMgbm8gY29sbGVjdGlvbi10aW1lIGFsbG9jYXRpb24gaW4gdGhpcwotICogY29sbGVjdG9yLgotICoKLSAqIEBzZWUgSW1taXgKLSAqIEBzZWUgb3JnLm1tdGsucG9saWN5LmltbWl4Lk11dGF0b3JMb2NhbAotICogQHNlZSBTdG9wVGhlV29ybGRDb2xsZWN0b3IKLSAqIEBzZWUgQ29sbGVjdG9yQ29udGV4dAotICogQHNlZSBQaGFzZQotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgY2xhc3MgSW1taXhDb2xsZWN0b3IgZXh0ZW5kcyBTdG9wVGhlV29ybGRDb2xsZWN0b3IgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIEluc3RhbmNlIGZpZWxkcwotICAgKi8KLSAgIHByb3RlY3RlZCBJbW1peFRyYWNlTG9jYWwgZmFzdFRyYWNlOwotICAgcHJvdGVjdGVkIEltbWl4RGVmcmFnVHJhY2VMb2NhbCBkZWZyYWdUcmFjZTsKLSAgIHByb3RlY3RlZCBDb2xsZWN0b3JMb2NhbCBpbW1peDsKLSAgIHByb3RlY3RlZCBmaW5hbCBJbW1peEFsbG9jYXRvciBjb3B5OwotICAgcHJvdGVjdGVkIGZpbmFsIEJ1bXBQb2ludGVyIGltbW9ydGFsOwotICAgcHJvdGVjdGVkIFRyYWNlTG9jYWwgY3VycmVudFRyYWNlOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIEluaXRpYWxpemF0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIEltbWl4Q29sbGVjdG9yKCkgewotICAgIGZhc3RUcmFjZSA9IG5ldyBJbW1peFRyYWNlTG9jYWwoZ2xvYmFsKCkuaW1taXhUcmFjZSwgbnVsbCk7Ci0gICAgZGVmcmFnVHJhY2UgPSBuZXcgSW1taXhEZWZyYWdUcmFjZUxvY2FsKGdsb2JhbCgpLmltbWl4VHJhY2UsIG51bGwpOwotICAgIGltbWl4ID0gbmV3IENvbGxlY3RvckxvY2FsKEltbWl4LmltbWl4U3BhY2UpOwotICAgIGNvcHkgPSBuZXcgSW1taXhBbGxvY2F0b3IoSW1taXguaW1taXhTcGFjZSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgaW1tb3J0YWwgPSBuZXcgSW1tb3J0YWxMb2NhbChQbGFuLmltbW9ydGFsU3BhY2UpOwotICB9Ci0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQ29sbGVjdGlvbi10aW1lIGFsbG9jYXRpb24KLSAgKi8KLQotIC8qKgotICAqIEFsbG9jYXRlIHNwYWNlIGZvciBjb3B5aW5nIGFuIG9iamVjdCAodGhpcyBtZXRob2QgPGk+ZG9lcyBub3Q8L2k+Ci0gICogY29weSB0aGUgb2JqZWN0LCBpdCBvbmx5IGFsbG9jYXRlcyBzcGFjZSkKLSAgKgotICAqIEBwYXJhbSBvcmlnaW5hbCBBIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgb2JqZWN0Ci0gICogQHBhcmFtIGJ5dGVzIFRoZSBzaXplIG9mIHRoZSBzcGFjZSB0byBiZSBhbGxvY2F0ZWQgKGluIGJ5dGVzKQotICAqIEBwYXJhbSBhbGlnbiBUaGUgcmVxdWVzdGVkIGFsaWdubWVudC4KLSAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBhbGlnbm1lbnQgb2Zmc2V0LgotICAqIEByZXR1cm4gVGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGFsbG9jYXRlZCByZWdpb24KLSAgKi8KLSAgQElubGluZQotICBwdWJsaWMgQWRkcmVzcyBhbGxvY0NvcHkoT2JqZWN0UmVmZXJlbmNlIG9yaWdpbmFsLCBpbnQgYnl0ZXMsCi0gICAgICBpbnQgYWxpZ24sIGludCBvZmZzZXQsIGludCBhbGxvY2F0b3IpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIHsKLSAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChieXRlcyA8PSBQbGFuLk1BWF9OT05fTE9TX0NPUFlfQllURVMpOwotICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGFsbG9jYXRvciA9PSBJbW1peC5BTExPQ19ERUZBVUxUKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvcHkuYWxsb2MoYnl0ZXMsIGFsaWduLCBvZmZzZXQpOwotICB9Ci0KLSAvKioKLSAgKiBQZXJmb3JtIGFueSBwb3N0LWNvcHkgYWN0aW9ucy4KLSAgKgotICAqIEBwYXJhbSBvYmplY3QgVGhlIG5ld2x5IGFsbG9jYXRlZCBvYmplY3QKLSAgKiBAcGFyYW0gdHlwZVJlZiB0aGUgdHlwZSByZWZlcmVuY2UgZm9yIHRoZSBpbnN0YW5jZSBiZWluZyBjcmVhdGVkCi0gICogQHBhcmFtIGJ5dGVzIFRoZSBzaXplIG9mIHRoZSBzcGFjZSB0byBiZSBhbGxvY2F0ZWQgKGluIGJ5dGVzKQotICAqLwotICBASW5saW5lCi0gIHB1YmxpYyB2b2lkIHBvc3RDb3B5KE9iamVjdFJlZmVyZW5jZSBvYmplY3QsIE9iamVjdFJlZmVyZW5jZSB0eXBlUmVmLAotICAgICAgaW50IGJ5dGVzLCBpbnQgYWxsb2NhdG9yKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoYWxsb2NhdG9yID09IEltbWl4LkFMTE9DX0RFRkFVTFQpOwotICAgIEltbWl4LmltbWl4U3BhY2UucG9zdENvcHkob2JqZWN0LCBieXRlcywgdHJ1ZSk7Ci0KLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIHsKLSAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChnZXRDdXJyZW50VHJhY2UoKS5pc0xpdmUob2JqZWN0KSk7Ci0gICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZ2V0Q3VycmVudFRyYWNlKCkud2lsbE5vdE1vdmVJbkN1cnJlbnRDb2xsZWN0aW9uKG9iamVjdCkpOwotICAgIH0KLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbGxlY3Rpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSBwZXItY29sbGVjdG9yIGNvbGxlY3Rpb24gcGhhc2UuCi0gICAqCi0gICAqIEBwYXJhbSBwaGFzZUlkIFRoZSBjb2xsZWN0aW9uIHBoYXNlIHRvIHBlcmZvcm0KLSAgICogQHBhcmFtIHByaW1hcnkgUGVyZm9ybSBhbnkgc2luZ2xlLXRocmVhZGVkIGFjdGl2aXRpZXMgdXNpbmcgdGhpcyB0aHJlYWQuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyB2b2lkIGNvbGxlY3Rpb25QaGFzZShzaG9ydCBwaGFzZUlkLCBib29sZWFuIHByaW1hcnkpIHsKLQotICAgIGlmIChwaGFzZUlkID09IEltbWl4LlBSRVBBUkUpIHsKLSAgICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KTsKLSAgICAgIGN1cnJlbnRUcmFjZSA9IEltbWl4LmltbWl4U3BhY2UuaW5JbW1peERlZnJhZ0NvbGxlY3Rpb24oKSA/IGRlZnJhZ1RyYWNlIDogZmFzdFRyYWNlOwotICAgICAgaW1taXgucHJlcGFyZSh0cnVlKTsKLSAgICAgIGN1cnJlbnRUcmFjZS5wcmVwYXJlKCk7Ci0gICAgICBjb3B5LnJlc2V0KCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHBoYXNlSWQgPT0gSW1taXguQ0xPU1VSRSkgewotICAgICAgY3VycmVudFRyYWNlLmNvbXBsZXRlVHJhY2UoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBJbW1peC5SRUxFQVNFKSB7Ci0gICAgICBjdXJyZW50VHJhY2UucmVsZWFzZSgpOwotICAgICAgaW1taXgucmVsZWFzZSh0cnVlKTsKLSAgICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBNaXNjZWxsYW5lb3VzCi0gICAqLwotCi0gIC8qKiBAcmV0dXJuIFRoZSBhY3RpdmUgZ2xvYmFsIHBsYW4gYXMgYW4gPGNvZGU+SW1taXg8L2NvZGU+IGluc3RhbmNlLiAqLwotICBASW5saW5lCi0gIHByaXZhdGUgc3RhdGljIEltbWl4IGdsb2JhbCgpIHsKLSAgICByZXR1cm4gKEltbWl4KSBWTS5hY3RpdmVQbGFuLmdsb2JhbCgpOwotICB9Ci0KLSAgLyoqIEByZXR1cm4gVGhlIGN1cnJlbnQgZmFzdFRyYWNlIGluc3RhbmNlLiAqLwotICBASW5saW5lCi0gIHB1YmxpYyBmaW5hbCBUcmFjZUxvY2FsIGdldEN1cnJlbnRUcmFjZSgpIHsKLSAgICByZXR1cm4gY3VycmVudFRyYWNlOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vaW1taXgvSW1taXhDb25zdHJhaW50cy5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL2ltbWl4L0ltbWl4Q29uc3RyYWludHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk5OGQ4OS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vaW1taXgvSW1taXhDb25zdHJhaW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4uaW1taXg7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlN0b3BUaGVXb3JsZENvbnN0cmFpbnRzOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5pbW1peC5PYmplY3RIZWFkZXI7Ci1pbXBvcnQgc3RhdGljIG9yZy5tbXRrLnBvbGljeS5pbW1peC5JbW1peENvbnN0YW50cy5NQVhfSU1NSVhfT0JKRUNUX0JZVEVTOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBhbmQgaXRzIHN1YmNsYXNzZXMgY29tbXVuaWNhdGUgdG8gdGhlIGhvc3QgVk0vUnVudGltZQotICogYW55IGZlYXR1cmVzIG9mIHRoZSBzZWxlY3RlZCBwbGFuIHRoYXQgaXQgbmVlZHMgdG8ga25vdy4gIFRoaXMgaXMKLSAqIHNlcGFyYXRlIGZyb20gdGhlIG1haW4gUGxhbi9QbGFuTG9jYWwgY2xhc3MgaW4gb3JkZXIgdG8gYnlwYXNzIGFueQotICogaXNzdWVzIHdpdGggb3JkZXJpbmcgb2Ygc3RhdGljIGluaXRpYWxpemF0aW9uLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgY2xhc3MgSW1taXhDb25zdHJhaW50cyBleHRlbmRzIFN0b3BUaGVXb3JsZENvbnN0cmFpbnRzIHsKLQotICAvKiogQHJldHVybiBUaGUgbnVtYmVyIG9mIGhlYWRlciBiaXRzIHRoYXQgYXJlIHJlcXVpcmVkLiAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBnY0hlYWRlckJpdHMoKSB7IHJldHVybiBPYmplY3RIZWFkZXIuTE9DQUxfR0NfQklUU19SRVFVSVJFRDsgfQotCi0gIC8qKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgaGVhZGVyIHdvcmRzIHRoYXQgYXJlIHJlcXVpcmVkLiAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBnY0hlYWRlcldvcmRzKCkgeyByZXR1cm4gT2JqZWN0SGVhZGVyLkdDX0hFQURFUl9XT1JEU19SRVFVSVJFRDsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBwbGFuIG1vdmVzIG9iamVjdHMuICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBtb3Zlc09iamVjdHMoKSB7IHJldHVybiB0cnVlO30KLQotICAvKiogQHJldHVybiBUaGUgc3BlY2lhbGl6ZWQgc2NhbiBtZXRob2RzIHJlcXVpcmVkICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IG51bVNwZWNpYWxpemVkU2NhbnMoKSB7IHJldHVybiAyOyB9Ci0KLSAgLyoqIEByZXR1cm4gU2l6ZSAoaW4gYnl0ZXMpIGJleW9uZCB3aGljaCBuZXcgcmVndWxhciBvYmplY3RzIG11c3QgYmUgYWxsb2NhdGVkIHRvIHRoZSBMT1MgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgbWF4Tm9uTE9TRGVmYXVsdEFsbG9jQnl0ZXMoKSB7IHJldHVybiBNQVhfSU1NSVhfT0JKRUNUX0JZVEVTOyB9Ci0KLSAgLyoqIEByZXR1cm4gU2l6ZSAoaW4gYnl0ZXMpIGJleW9uZCB3aGljaCBjb3BpZWQgb2JqZWN0cyBtdXN0IGJlIGNvcGllZCB0byB0aGUgTE9TICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IG1heE5vbkxPU0NvcHlCeXRlcygpIHsgcmV0dXJuIE1BWF9JTU1JWF9PQkpFQ1RfQllURVM7IH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9pbW1peC9JbW1peERlZnJhZ1RyYWNlTG9jYWwuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9pbW1peC9JbW1peERlZnJhZ1RyYWNlTG9jYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ0NGQyMC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vaW1taXgvSW1taXhEZWZyYWdUcmFjZUxvY2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4uaW1taXg7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLm1tdGsucG9saWN5LmltbWl4LkltbWl4Q29uc3RhbnRzLk1BUktfTElORV9BVF9TQ0FOX1RJTUU7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlBsYW47Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5UcmFjZUxvY2FsOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhY2U7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LlNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuSGVhZGVyQnl0ZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmRlcXVlLk9iamVjdFJlZmVyZW5jZURlcXVlOwotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgdGhyZWFkLWxvY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGEgZGVmcmFnbWVudGluZwotICogdHJhbnNpdGl2ZSBjbG9zdXJlIG92ZXIgYW4gaW1taXggc3BhY2UuCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBmaW5hbCBjbGFzcyBJbW1peERlZnJhZ1RyYWNlTG9jYWwgZXh0ZW5kcyBUcmFjZUxvY2FsIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogSW5zdGFuY2UgZmllbGRzCi0gICovCi0gcHJpdmF0ZSBmaW5hbCBPYmplY3RSZWZlcmVuY2VEZXF1ZSBtb2RCdWZmZXI7Ci0KLSAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICogQHBhcmFtIG1vZEJ1ZmZlciBUT0RPCi0gICAqLwotICBwdWJsaWMgSW1taXhEZWZyYWdUcmFjZUxvY2FsKFRyYWNlIHRyYWNlLCBPYmplY3RSZWZlcmVuY2VEZXF1ZSBtb2RCdWZmZXIpIHsKLSAgICBzdXBlcihJbW1peC5TQ0FOX0RFRlJBRywgdHJhY2UpOwotICAgIHRoaXMubW9kQnVmZmVyID0gbW9kQnVmZmVyOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogRXh0ZXJuYWxseSB2aXNpYmxlIE9iamVjdCBwcm9jZXNzaW5nIGFuZCB0cmFjaW5nCi0gICAqLwotCi0gIC8qKgotICAgKiBJcyB0aGUgc3BlY2lmaWVkIG9iamVjdCBsaXZlPwotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGxpdmUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0xpdmUoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KEltbWl4LmltbWl4U3BhY2UuaW5JbW1peERlZnJhZ0NvbGxlY3Rpb24oKSk7Ci0gICAgaWYgKG9iamVjdC5pc051bGwoKSkgcmV0dXJuIGZhbHNlOwotICAgIGlmIChTcGFjZS5pc0luU3BhY2UoSW1taXguSU1NSVgsIG9iamVjdCkpIHsKLSAgICAgIHJldHVybiBJbW1peC5pbW1peFNwYWNlLmlzTGl2ZShvYmplY3QpOwotICAgIH0KLSAgICByZXR1cm4gc3VwZXIuaXNMaXZlKG9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgaXMgdGhlIGNvcmUgbWV0aG9kIGR1cmluZyB0aGUgdHJhY2Ugb2YgdGhlIG9iamVjdCBncmFwaC4KLSAgICogVGhlIHJvbGUgb2YgdGhpcyBtZXRob2QgaXMgdG86Ci0gICAqCi0gICAqIDEuIEVuc3VyZSB0aGUgdHJhY2VkIG9iamVjdCBpcyBub3QgY29sbGVjdGVkLgotICAgKiAyLiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB2aXNpdCB0byB0aGUgb2JqZWN0IGVucXVldWUgaXQgdG8gYmUgc2Nhbm5lZC4KLSAgICogMy4gUmV0dXJuIHRoZSBmb3J3YXJkZWQgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QuCi0gICAqCi0gICAqIEluIHRoaXMgaW5zdGFuY2UsIHdlIHJlZmVyIG9iamVjdHMgaW4gdGhlIG1hcmstc3dlZXAgc3BhY2UgdG8gdGhlCi0gICAqIGltbWl4U3BhY2UgZm9yIHRyYWNpbmcsIGFuZCBkZWZlciB0byB0aGUgc3VwZXJjbGFzcyBmb3IgYWxsIG90aGVycy4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIHRyYWNlZC4KLSAgICogQHJldHVybiBUaGUgbmV3IHJlZmVyZW5jZSB0byB0aGUgc2FtZSBvYmplY3QgaW5zdGFuY2UuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBPYmplY3RSZWZlcmVuY2UgdHJhY2VPYmplY3QoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KEltbWl4LmltbWl4U3BhY2UuaW5JbW1peERlZnJhZ0NvbGxlY3Rpb24oKSk7Ci0gICAgaWYgKG9iamVjdC5pc051bGwoKSkgcmV0dXJuIG9iamVjdDsKLSAgICBpZiAoU3BhY2UuaXNJblNwYWNlKEltbWl4LklNTUlYLCBvYmplY3QpKQotICAgICAgcmV0dXJuIEltbWl4LmltbWl4U3BhY2UudHJhY2VPYmplY3QodGhpcywgb2JqZWN0LCBQbGFuLkFMTE9DX0RFRkFVTFQpOwotICAgIHJldHVybiBzdXBlci50cmFjZU9iamVjdChvYmplY3QpOwotICB9Ci0KLSAgQElubGluZQotICBAT3ZlcnJpZGUKLSAgcHVibGljIE9iamVjdFJlZmVyZW5jZSBwcmVjb3B5T2JqZWN0KE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChJbW1peC5pbW1peFNwYWNlLmluSW1taXhEZWZyYWdDb2xsZWN0aW9uKCkpOwotICAgIE9iamVjdFJlZmVyZW5jZSBydG4gPSB0cmFjZU9iamVjdChvYmplY3QpOwotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KHdpbGxOb3RNb3ZlSW5DdXJyZW50Q29sbGVjdGlvbihydG4pKTsKLSAgICByZXR1cm4gcnRuOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0cnVlIGlmIHRoaXMgb2JqZWN0IGlzIGd1YXJhbnRlZWQgbm90IHRvIG1vdmUgZHVyaW5nIHRoaXMKLSAgICogY29sbGVjdGlvbiAoaS5lLiB0aGlzIG9iamVjdCBpcyBkZWZpbnRlbHkgbm90IGFuIHVuZm9yd2FyZGVkCi0gICAqIG9iamVjdCkuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QKLSAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgb2JqZWN0IGlzIGd1YXJhbnRlZWQgbm90IHRvIG1vdmUgZHVyaW5nIHRoaXMKLSAgICogICAgICAgICBjb2xsZWN0aW9uLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIHdpbGxOb3RNb3ZlSW5DdXJyZW50Q29sbGVjdGlvbihPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoSW1taXguaW1taXhTcGFjZS5pbkltbWl4RGVmcmFnQ29sbGVjdGlvbigpKTsKLSAgICBpZiAoU3BhY2UuaXNJblNwYWNlKEltbWl4LklNTUlYLCBvYmplY3QpKQotICAgICAgcmV0dXJuIEltbWl4LmltbWl4U3BhY2Uud2lsbE5vdE1vdmVUaGlzR0Mob2JqZWN0KTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBDb2xsZWN0b3JzIHRoYXQgbW92ZSBvYmplY3RzIDxiPm11c3Q8L2I+IG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotICAgKiBJdCBwZXJmb3JtcyB0aGUgZGVmZXJyZWQgc2Nhbm5pbmcgb2Ygb2JqZWN0cyB3aGljaCBhcmUgZm9yd2FyZGVkCi0gICAqIGR1cmluZyBib290c3RyYXAgb2YgZWFjaCBjb3B5aW5nIGNvbGxlY3Rpb24uICBCZWNhdXNlIG9mIHRoZQotICAgKiBjb21wbGV4aXRpZXMgb2YgdGhlIGNvbGxlY3Rpb24gYm9vdHN0cmFwIChzdWNoIG9iamVjdHMgYXJlCi0gICAqIGdlbmVyYWxseSB0aGVtc2VsdmVzIGdjLWNyaXRpY2FsKSwgdGhlIGZvcndhcmRpbmcgYW5kIHNjYW5uaW5nIG9mCi0gICAqIHRoZSBvYmplY3RzIG11c3QgYmUgZGlzbG9jYXRlZC4gIEl0IGlzIGFuIGVycm9yIGZvciBhIG5vbi1tb3ZpbmcKLSAgICogY29sbGVjdG9yIHRvIGNhbGwgdGhpcyBtZXRob2QuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIGZvcndhcmRlZCBvYmplY3QgdG8gYmUgc2Nhbm5lZAotICAgKi8KLSAgQElubGluZQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIHZvaWQgc2Nhbk9iamVjdChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoSW1taXguaW1taXhTcGFjZS5pbkltbWl4RGVmcmFnQ29sbGVjdGlvbigpKTsKLSAgICBzdXBlci5zY2FuT2JqZWN0KG9iamVjdCk7Ci0gICAgaWYgKE1BUktfTElORV9BVF9TQ0FOX1RJTUUgJiYgU3BhY2UuaXNJblNwYWNlKEltbWl4LklNTUlYLCBvYmplY3QpKQotICAgICAgSW1taXguaW1taXhTcGFjZS5tYXJrTGluZXMob2JqZWN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBQcm9jZXNzIGFueSByZW1lbWJlcmVkIHNldCBlbnRyaWVzLiAgVGhpcyBtZWFucyBlbnVtZXJhdGluZyB0aGUKLSAgICogbW9kIGJ1ZmZlciBhbmQgZm9yIGVhY2ggZW50cnksIG1hcmtpbmcgdGhlIG9iamVjdCBhcyB1bmxvZ2dlZAotICAgKiAod2UgZG9uJ3QgZW5xdWV1ZSBmb3Igc2Nhbm5pbmcgc2luY2Ugd2UncmUgZG9pbmcgYSBmdWxsIGhlYXAgR0MpLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1JlbWVtYmVyZWRTZXRzKCkgewotICAgIGlmIChtb2RCdWZmZXIgIT0gbnVsbCkgewotICAgICAgbG9nTWVzc2FnZSg1LCAiY2xlYXJpbmcgbW9kQnVmZmVyIik7Ci0gICAgICB3aGlsZSAoIW1vZEJ1ZmZlci5pc0VtcHR5KCkpIHsKLSAgICAgICAgT2JqZWN0UmVmZXJlbmNlIHNyYyA9IG1vZEJ1ZmZlci5wb3AoKTsKLSAgICAgICAgSGVhZGVyQnl0ZS5tYXJrQXNVbmxvZ2dlZChzcmMpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL2ltbWl4L0ltbWl4TXV0YXRvci5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL2ltbWl4L0ltbWl4TXV0YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2I5NzljLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9pbW1peC9JbW1peE11dGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5pbW1peDsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uKjsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LmltbWl4Lk11dGF0b3JMb2NhbDsKLQotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuYWxsb2MuQWxsb2NhdG9yOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyA8aT5wZXItbXV0YXRvciB0aHJlYWQ8L2k+IGJlaGF2aW9yCi0gKiBhbmQgc3RhdGUgZm9yIHRoZSA8aT5JbW1peDwvaT4gcGxhbiwgd2hpY2ggaW1wbGVtZW50cyBhIGZ1bGwtaGVhcAotICogaW1taXggY29sbGVjdG9yLjxwPgotICoKLSAqIFNwZWNpZmljYWxseSwgdGhpcyBjbGFzcyBkZWZpbmVzIDxpPkltbWl4PC9pPiBtdXRhdG9yLXRpbWUgYWxsb2NhdGlvbgotICogYW5kIHBlci1tdXRhdG9yIHRocmVhZCBjb2xsZWN0aW9uIHNlbWFudGljcyAoZmx1c2hpbmcgYW5kIHJlc3RvcmluZwotICogcGVyLW11dGF0b3IgYWxsb2NhdG9yIHN0YXRlKS48cD4KLSAqCi0gKiBAc2VlIEltbWl4Ci0gKiBAc2VlIG9yZy5tbXRrLnBvbGljeS5pbW1peC5Db2xsZWN0b3JMb2NhbAotICogQHNlZSBTdG9wVGhlV29ybGRNdXRhdG9yCi0gKiBAc2VlIE11dGF0b3JDb250ZXh0Ci0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBjbGFzcyBJbW1peE11dGF0b3IgZXh0ZW5kcyBTdG9wVGhlV29ybGRNdXRhdG9yIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBJbnN0YW5jZSBmaWVsZHMKLSAgICovCi0gIHByb3RlY3RlZCBmaW5hbCBNdXRhdG9yTG9jYWwgaW1taXg7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5pdGlhbGl6YXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqLwotICBwdWJsaWMgSW1taXhNdXRhdG9yKCkgewotICAgIGltbWl4ID0gbmV3IG9yZy5tbXRrLnBvbGljeS5pbW1peC5NdXRhdG9yTG9jYWwoSW1taXguaW1taXhTcGFjZSwgZmFsc2UpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogTXV0YXRvckxvY2FsLXRpbWUgYWxsb2NhdGlvbgotICAgKi8KLQotICAvKioKLSAgICogQWxsb2NhdGUgbWVtb3J5IGZvciBhbiBvYmplY3QuIFRoaXMgY2xhc3MgaGFuZGxlcyB0aGUgZGVmYXVsdCBhbGxvY2F0b3IKLSAgICogZnJvbSB0aGUgbWFyayBzd2VlcCBzcGFjZSwgYW5kIGRlbGVnYXRlcyBldmVyeXRoaW5nIGVsc2UgdG8gdGhlCi0gICAqIHN1cGVyY2xhc3MuCi0gICAqCi0gICAqIEBwYXJhbSBieXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgb2JqZWN0LgotICAgKiBAcGFyYW0gYWxpZ24gUmVxdWlyZWQgYWxpZ25tZW50IGZvciB0aGUgb2JqZWN0LgotICAgKiBAcGFyYW0gb2Zmc2V0IE9mZnNldCBhc3NvY2lhdGVkIHdpdGggdGhlIGFsaWdubWVudC4KLSAgICogQHBhcmFtIGFsbG9jYXRvciBUaGUgYWxsb2NhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QuCi0gICAqIEByZXR1cm4gVGhlIGxvdyBhZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgQWRkcmVzcyBhbGxvYyhpbnQgYnl0ZXMsIGludCBhbGlnbiwgaW50IG9mZnNldCwgaW50IGFsbG9jYXRvciwgaW50IHNpdGUpIHsKLSAgICBpZiAoYWxsb2NhdG9yID09IEltbWl4LkFMTE9DX0RFRkFVTFQpCi0gICAgICByZXR1cm4gaW1taXguYWxsb2MoYnl0ZXMsIGFsaWduLCBvZmZzZXQpOwotICAgIHJldHVybiBzdXBlci5hbGxvYyhieXRlcywgYWxpZ24sIG9mZnNldCwgYWxsb2NhdG9yLCBzaXRlKTsKLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIHBvc3QtYWxsb2NhdGlvbiBhY3Rpb25zLiAgSW5pdGlhbGl6ZSB0aGUgb2JqZWN0IGhlYWRlciBmb3IKLSAgICogb2JqZWN0cyBpbiB0aGUgbWFyay1zd2VlcCBzcGFjZSwgYW5kIGRlbGVnYXRlIHRvIHRoZSBzdXBlcmNsYXNzIGZvcgotICAgKiBvdGhlciBvYmplY3RzLgotICAgKgotICAgKiBAcGFyYW0gcmVmIFRoZSBuZXdseSBhbGxvY2F0ZWQgb2JqZWN0Ci0gICAqIEBwYXJhbSB0eXBlUmVmIHRoZSB0eXBlIHJlZmVyZW5jZSBmb3IgdGhlIGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBzaXplIG9mIHRoZSBzcGFjZSB0byBiZSBhbGxvY2F0ZWQgKGluIGJ5dGVzKQotICAgKiBAcGFyYW0gYWxsb2NhdG9yIFRoZSBhbGxvY2F0b3IgbnVtYmVyIHRvIGJlIHVzZWQgZm9yIHRoaXMgYWxsb2NhdGlvbgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgdm9pZCBwb3N0QWxsb2MoT2JqZWN0UmVmZXJlbmNlIHJlZiwgT2JqZWN0UmVmZXJlbmNlIHR5cGVSZWYsCi0gICAgICBpbnQgYnl0ZXMsIGludCBhbGxvY2F0b3IpIHsKLSAgICBpZiAoYWxsb2NhdG9yID09IEltbWl4LkFMTE9DX0RFRkFVTFQpCi0gICAgICBJbW1peC5pbW1peFNwYWNlLnBvc3RBbGxvYyhyZWYsIGJ5dGVzKTsKLSAgICBlbHNlCi0gICAgICBzdXBlci5wb3N0QWxsb2MocmVmLCB0eXBlUmVmLCBieXRlcywgYWxsb2NhdG9yKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGFsbG9jYXRvciBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggYSBzcGFjZQotICAgKiA8Y29kZT5zcGFjZTwvY29kZT4sIGZvciB0aGlzIHBsYW4gaW5zdGFuY2UuCi0gICAqCi0gICAqIEBwYXJhbSBzcGFjZSBUaGUgc3BhY2UgZm9yIHdoaWNoIHRoZSBhbGxvY2F0b3IgaW5zdGFuY2UgaXMgZGVzaXJlZC4KLSAgICogQHJldHVybiBUaGUgYWxsb2NhdG9yIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBsYW4gaW5zdGFuY2UKLSAgICogd2hpY2ggaXMgYWxsb2NhdGluZyBpbnRvIDxjb2RlPnNwYWNlPC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICogaWYgbm8gYXBwcm9wcmlhdGUgYWxsb2NhdG9yIGNhbiBiZSBlc3RhYmxpc2hlZC4KLSAgICovCi0gIHB1YmxpYyBBbGxvY2F0b3IgZ2V0QWxsb2NhdG9yRnJvbVNwYWNlKFNwYWNlIHNwYWNlKSB7Ci0gICAgaWYgKHNwYWNlID09IEltbWl4LmltbWl4U3BhY2UpIHJldHVybiBpbW1peDsgIC8vIEZJWE1FIGlzIGl0IG5vdCBhIHByb2JsZW0gdGhhdCB3ZSBoYXZlIGEgMjoxIG1hcHBpbmc/Ci0gICAgcmV0dXJuIHN1cGVyLmdldEFsbG9jYXRvckZyb21TcGFjZShzcGFjZSk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDb2xsZWN0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBQZXJmb3JtIGEgcGVyLW11dGF0b3IgY29sbGVjdGlvbiBwaGFzZS4KLSAgICoKLSAgICogQHBhcmFtIHBoYXNlSWQgVGhlIGNvbGxlY3Rpb24gcGhhc2UgdG8gcGVyZm9ybQotICAgKiBAcGFyYW0gcHJpbWFyeSBQZXJmb3JtIGFueSBzaW5nbGUtdGhyZWFkZWQgYWN0aXZpdGllcyB1c2luZyB0aGlzIHRocmVhZC4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHZvaWQgY29sbGVjdGlvblBoYXNlKHNob3J0IHBoYXNlSWQsIGJvb2xlYW4gcHJpbWFyeSkgewotCi0gICAgaWYgKHBoYXNlSWQgPT0gSW1taXguUFJFUEFSRSkgewotICAgICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQsIHByaW1hcnkpOwotICAgICAgaW1taXgucHJlcGFyZSgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwaGFzZUlkID09IEltbWl4LlJFTEVBU0UpIHsKLSAgICAgIGltbWl4LnJlbGVhc2UoKTsKLSAgICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9pbW1peC9JbW1peFRyYWNlTG9jYWwuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9pbW1peC9JbW1peFRyYWNlTG9jYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc5MmMzMy4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vaW1taXgvSW1taXhUcmFjZUxvY2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4uaW1taXg7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLm1tdGsucG9saWN5LmltbWl4LkltbWl4Q29uc3RhbnRzLk1BUktfTElORV9BVF9TQ0FOX1RJTUU7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYWNlTG9jYWw7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5UcmFjZTsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5IZWFkZXJCeXRlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZGVxdWUuT2JqZWN0UmVmZXJlbmNlRGVxdWU7Ci1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSB0aHJlYWQtbG9jYWwgZnVuY3Rpb25hbGl0eSBmb3IgYSB0cmFuc2l0aXZlCi0gKiBjbG9zdXJlIG92ZXIgYW4gaW1taXggc3BhY2UuCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBmaW5hbCBjbGFzcyBJbW1peFRyYWNlTG9jYWwgZXh0ZW5kcyBUcmFjZUxvY2FsIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogSW5zdGFuY2UgZmllbGRzCi0gICovCi0gcHJpdmF0ZSBmaW5hbCBPYmplY3RSZWZlcmVuY2VEZXF1ZSBtb2RCdWZmZXI7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSB0cmFjZSBUaGUgdHJhY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhY2UgbG9jYWwuCi0gICAqIEBwYXJhbSBtb2RCdWZmZXIgVGhlIG1vZGlmaWVkIG9iamVjdHMgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYWNlIGxvY2FsLiAgUG9zc2libHkgbnVsbC4KLSAgICovCi0gIHB1YmxpYyBJbW1peFRyYWNlTG9jYWwoVHJhY2UgdHJhY2UsIE9iamVjdFJlZmVyZW5jZURlcXVlIG1vZEJ1ZmZlcikgewotICAgIHN1cGVyKEltbWl4LlNDQU5fSU1NSVgsIHRyYWNlKTsKLSAgICB0aGlzLm1vZEJ1ZmZlciA9IG1vZEJ1ZmZlcjsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEV4dGVybmFsbHkgdmlzaWJsZSBPYmplY3QgcHJvY2Vzc2luZyBhbmQgdHJhY2luZwotICAgKi8KLQotICAvKioKLSAgICogSXMgdGhlIHNwZWNpZmllZCBvYmplY3QgbGl2ZT8KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0LgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9iamVjdCBpcyBsaXZlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNMaXZlKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAob2JqZWN0LmlzTnVsbCgpKSByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKFNwYWNlLmlzSW5TcGFjZShJbW1peC5JTU1JWCwgb2JqZWN0KSkgewotICAgICAgcmV0dXJuIEltbWl4LmltbWl4U3BhY2UuZmFzdElzTGl2ZShvYmplY3QpOwotICAgIH0KLSAgICByZXR1cm4gc3VwZXIuaXNMaXZlKG9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgaXMgdGhlIGNvcmUgbWV0aG9kIGR1cmluZyB0aGUgdHJhY2Ugb2YgdGhlIG9iamVjdCBncmFwaC4KLSAgICogVGhlIHJvbGUgb2YgdGhpcyBtZXRob2QgaXMgdG86Ci0gICAqCi0gICAqIDEuIEVuc3VyZSB0aGUgdHJhY2VkIG9iamVjdCBpcyBub3QgY29sbGVjdGVkLgotICAgKiAyLiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB2aXNpdCB0byB0aGUgb2JqZWN0IGVucXVldWUgaXQgdG8gYmUgc2Nhbm5lZC4KLSAgICogMy4gUmV0dXJuIHRoZSBmb3J3YXJkZWQgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QuCi0gICAqCi0gICAqIEluIHRoaXMgaW5zdGFuY2UsIHdlIHJlZmVyIG9iamVjdHMgaW4gdGhlIG1hcmstc3dlZXAgc3BhY2UgdG8gdGhlCi0gICAqIGltbWl4U3BhY2UgZm9yIHRyYWNpbmcsIGFuZCBkZWZlciB0byB0aGUgc3VwZXJjbGFzcyBmb3IgYWxsIG90aGVycy4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIHRyYWNlZC4KLSAgICogQHJldHVybiBUaGUgbmV3IHJlZmVyZW5jZSB0byB0aGUgc2FtZSBvYmplY3QgaW5zdGFuY2UuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBPYmplY3RSZWZlcmVuY2UgdHJhY2VPYmplY3QoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmIChvYmplY3QuaXNOdWxsKCkpIHJldHVybiBvYmplY3Q7Ci0gICAgaWYgKFNwYWNlLmlzSW5TcGFjZShJbW1peC5JTU1JWCwgb2JqZWN0KSkKLSAgICAgIHJldHVybiBJbW1peC5pbW1peFNwYWNlLmZhc3RUcmFjZU9iamVjdCh0aGlzLCBvYmplY3QpOwotICAgIHJldHVybiBzdXBlci50cmFjZU9iamVjdChvYmplY3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIEVuc3VyZSB0aGF0IHRoZSByZWZlcmVuY2VkIG9iamVjdCB3aWxsIG5vdCBtb3ZlIGZyb20gdGhpcyBwb2ludCB0aHJvdWdoCi0gICAqIHRvIHRoZSBlbmQgb2YgdGhlIGNvbGxlY3Rpb24uIFRoaXMgY2FuIGludm9sdmUgZm9yd2FyZGluZyB0aGUgb2JqZWN0Ci0gICAqIGlmIG5lY2Vzc2FyeS4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRoYXQgbXVzdCBub3QgbW92ZSBkdXJpbmcgdGhlIGNvbGxlY3Rpb24uCi0gICAqIEByZXR1cm4gVHJ1ZSBJZiB0aGUgb2JqZWN0IHdpbGwgbm90IG1vdmUgZHVyaW5nIGNvbGxlY3Rpb24KLSAgICovCi0gIEBJbmxpbmUKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIHdpbGxOb3RNb3ZlSW5DdXJyZW50Q29sbGVjdGlvbihPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoIUltbWl4LmltbWl4U3BhY2UuaW5JbW1peERlZnJhZ0NvbGxlY3Rpb24oKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogQ29sbGVjdG9ycyB0aGF0IG1vdmUgb2JqZWN0cyA8Yj5tdXN0PC9iPiBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLSAgICogSXQgcGVyZm9ybXMgdGhlIGRlZmVycmVkIHNjYW5uaW5nIG9mIG9iamVjdHMgd2hpY2ggYXJlIGZvcndhcmRlZAotICAgKiBkdXJpbmcgYm9vdHN0cmFwIG9mIGVhY2ggY29weWluZyBjb2xsZWN0aW9uLiAgQmVjYXVzZSBvZiB0aGUKLSAgICogY29tcGxleGl0aWVzIG9mIHRoZSBjb2xsZWN0aW9uIGJvb3RzdHJhcCAoc3VjaCBvYmplY3RzIGFyZQotICAgKiBnZW5lcmFsbHkgdGhlbXNlbHZlcyBnYy1jcml0aWNhbCksIHRoZSBmb3J3YXJkaW5nIGFuZCBzY2FubmluZyBvZgotICAgKiB0aGUgb2JqZWN0cyBtdXN0IGJlIGRpc2xvY2F0ZWQuICBJdCBpcyBhbiBlcnJvciBmb3IgYSBub24tbW92aW5nCi0gICAqIGNvbGxlY3RvciB0byBjYWxsIHRoaXMgbWV0aG9kLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBmb3J3YXJkZWQgb2JqZWN0IHRvIGJlIHNjYW5uZWQKLSAgICovCi0gIEBJbmxpbmUKLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCB2b2lkIHNjYW5PYmplY3QoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIHN1cGVyLnNjYW5PYmplY3Qob2JqZWN0KTsKLSAgICBpZiAoTUFSS19MSU5FX0FUX1NDQU5fVElNRSAmJiBTcGFjZS5pc0luU3BhY2UoSW1taXguSU1NSVgsIG9iamVjdCkpCi0gICAgICBJbW1peC5pbW1peFNwYWNlLm1hcmtMaW5lcyhvYmplY3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByb2Nlc3MgYW55IHJlbWVtYmVyZWQgc2V0IGVudHJpZXMuICBUaGlzIG1lYW5zIGVudW1lcmF0aW5nIHRoZQotICAgKiBtb2QgYnVmZmVyIGFuZCBmb3IgZWFjaCBlbnRyeSwgbWFya2luZyB0aGUgb2JqZWN0IGFzIHVubG9nZ2VkCi0gICAqICh3ZSBkb24ndCBlbnF1ZXVlIGZvciBzY2FubmluZyBzaW5jZSB3ZSdyZSBkb2luZyBhIGZ1bGwgaGVhcCBHQykuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzUmVtZW1iZXJlZFNldHMoKSB7Ci0gICAgaWYgKG1vZEJ1ZmZlciAhPSBudWxsKSB7Ci0gICAgICBsb2dNZXNzYWdlKDUsICJjbGVhcmluZyBtb2RCdWZmZXIiKTsKLSAgICAgIHdoaWxlICghbW9kQnVmZmVyLmlzRW1wdHkoKSkgewotICAgICAgICBPYmplY3RSZWZlcmVuY2Ugc3JjID0gbW9kQnVmZmVyLnBvcCgpOwotICAgICAgICBIZWFkZXJCeXRlLm1hcmtBc1VubG9nZ2VkKHNyYyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vbWFya2NvbXBhY3QvTUMuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9tYXJrY29tcGFjdC9NQy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODE1ZTVhLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9tYXJrY29tcGFjdC9NQy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLm1hcmtjb21wYWN0OwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi4qOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5NYXJrQ29tcGFjdFNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmhlYXAuVk1SZXF1ZXN0OwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuc2FuaXR5Y2hlY2tlci5TYW5pdHlDaGVja2VyOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC5PYmplY3RSZWZlcmVuY2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBnbG9iYWwgc3RhdGUgb2YgYSBzaW1wbGUgc2xpZGluZyBtYXJrLWNvbXBhY3QKLSAqIGNvbGxlY3Rvci4KLSAqCi0gKiBGSVhNRSBOZWVkIGFsZ29yaXRobWljIG92ZXJ2aWV3IGFuZCByZWZlcmVuY2VzLgotICoKLSAqIEFsbCBwbGFucyBtYWtlIGEgY2xlYXIgZGlzdGluY3Rpb24gYmV0d2VlbiA8aT5nbG9iYWw8L2k+IGFuZAotICogPGk+dGhyZWFkLWxvY2FsPC9pPiBhY3Rpdml0aWVzLCBhbmQgZGl2aWRlcyBnbG9iYWwgYW5kIGxvY2FsIHN0YXRlCi0gKiBpbnRvIHNlcGFyYXRlIGNsYXNzIGhpZXJhcmNoaWVzLiAgR2xvYmFsIGFjdGl2aXRpZXMgbXVzdCBiZQotICogc3luY2hyb25pemVkLCB3aGVyZWFzIG5vIHN5bmNocm9uaXphdGlvbiBpcyByZXF1aXJlZCBmb3IKLSAqIHRocmVhZC1sb2NhbCBhY3Rpdml0aWVzLiAgVGhlcmUgaXMgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgUGxhbiAob3IgdGhlCi0gKiBhcHByb3ByaWF0ZSBzdWItY2xhc3MpLCBhbmQgYSAxOjEgbWFwcGluZyBvZiBQbGFuTG9jYWwgdG8gImtlcm5lbAotICogdGhyZWFkcyIgKGFrYSBDUFVzKS4gIFRodXMgaW5zdGFuY2UKLSAqIG1ldGhvZHMgb2YgUGxhbkxvY2FsIGFsbG93IGZhc3QsIHVuc3ljaHJvbml6ZWQgYWNjZXNzIHRvIGZ1bmN0aW9ucyBzdWNoIGFzCi0gKiBhbGxvY2F0aW9uIGFuZCBjb2xsZWN0aW9uLgotICoKLSAqIFRoZSBnbG9iYWwgaW5zdGFuY2UgZGVmaW5lcyBhbmQgbWFuYWdlcyBzdGF0aWMgcmVzb3VyY2VzCi0gKiAoc3VjaCBhcyBtZW1vcnkgYW5kIHZpcnR1YWwgbWVtb3J5IHJlc291cmNlcykuICBUaGlzIG1hcHBpbmcgb2YgdGhyZWFkcyB0bwotICogaW5zdGFuY2VzIGlzIGNydWNpYWwgdG8gdW5kZXJzdGFuZGluZyB0aGUgY29ycmVjdG5lc3MgYW5kCi0gKiBwZXJmb3JtYW5jZSBwcm9wZXJ0aWVzIG9mIE1NVGsgcGxhbnMuCi0gKi8KLUBVbmludGVycnVwdGlibGUgcHVibGljIGNsYXNzIE1DIGV4dGVuZHMgU3RvcFRoZVdvcmxkIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBDbGFzcyB2YXJpYWJsZXMKLSAgICovCi0KLSAgLyoqIFRoZSBtYXJrIGNvbXBhY3Qgc3BhY2UgaXRzZWxmICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFya0NvbXBhY3RTcGFjZSBtY1NwYWNlID0gbmV3IE1hcmtDb21wYWN0U3BhY2UoIm1jIiwgREVGQVVMVF9QT0xMX0ZSRVFVRU5DWSwgVk1SZXF1ZXN0LmNyZWF0ZSgwLjZmKSk7Ci0KLSAgLyoqIFRoZSBzcGFjZSBkZXNjcmlwdG9yICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BUktfQ09NUEFDVCA9IG1jU3BhY2UuZ2V0RGVzY3JpcHRvcigpOwotCi0gIC8qKiBTcGVjaWFsaXplZCBtZXRob2QgaWRlbnRpZmllciBmb3IgdGhlIE1BUksgcGhhc2UgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9NQVJLICAgID0gMDsKLQotICAvKiogU3BlY2lhbGl6ZWQgbWV0aG9kIGlkZW50aWZpZXIgZm9yIHRoZSBGT1JXQVJEIHBoYXNlICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDQU5fRk9SV0FSRCA9IDE7Ci0KLSAgLyogUGhhc2VzICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgUFJFUEFSRV9GT1JXQVJEICAgICA9IFBoYXNlLmNyZWF0ZVNpbXBsZSgiZnctcHJlcGFyZSIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IEZPUldBUkRfQ0xPU1VSRSAgICAgPSBQaGFzZS5jcmVhdGVTaW1wbGUoImZ3LWNsb3N1cmUiKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBSRUxFQVNFX0ZPUldBUkQgICAgID0gUGhhc2UuY3JlYXRlU2ltcGxlKCJmdy1yZWxlYXNlIik7Ci0KLSAgLyoqIENhbGN1bGF0ZSBmb3J3YXJkaW5nIHBvaW50ZXJzIHZpYSBhIGxpbmVhciBzY2FuIG92ZXIgdGhlIGhlYXAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBDQUxDVUxBVEVfRlAgICAgICAgID0gUGhhc2UuY3JlYXRlU2ltcGxlKCJjYWxjLWZwIik7Ci0KLSAgLyoqIFBlcmZvcm0gY29tcGFjdGlvbiB2aWEgYSBsaW5lYXIgc2NhbiBvdmVyIHRoZSBoZWFwICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgQ09NUEFDVCAgICAgICAgICAgICA9IFBoYXNlLmNyZWF0ZVNpbXBsZSgiY29tcGFjdCIpOwotCi0gIC8vIENIRUNLU1RZTEU6T0ZGCi0KLSAgLyoqCi0gICAqIFRoaXMgaXMgdGhlIHBoYXNlIHRoYXQgaXMgZXhlY3V0ZWQgdG8gcGVyZm9ybSBhIG1hcmstY29tcGFjdCBjb2xsZWN0aW9uLgotICAgKgotICAgKiBGSVhNRTogRmFyIHRvbyBtdWNoIGR1cGxpY2F0aW9uIGFuZCBpbnNpZGUga25vd2xlZGdlIG9mIFN0b3BUaGVXb3JsZAotICAgKi8KLSAgcHVibGljIHNob3J0IG1jQ29sbGVjdGlvbiA9IFBoYXNlLmNyZWF0ZUNvbXBsZXgoImNvbGxlY3Rpb24iLCBudWxsLAotICAgICAgUGhhc2Uuc2NoZWR1bGVDb21wbGV4ICAoaW5pdFBoYXNlKSwKLSAgICAgIFBoYXNlLnNjaGVkdWxlQ29tcGxleCAgKHJvb3RDbG9zdXJlUGhhc2UpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVDb21wbGV4ICAocmVmVHlwZUNsb3N1cmVQaGFzZSksCi0gICAgICBQaGFzZS5zY2hlZHVsZUNvbXBsZXggIChjb21wbGV0ZUNsb3N1cmVQaGFzZSksCi0gICAgICBQaGFzZS5zY2hlZHVsZUNvbGxlY3RvcihDQUxDVUxBVEVfRlApLAotICAgICAgUGhhc2Uuc2NoZWR1bGVHbG9iYWwgICAoUFJFUEFSRV9GT1JXQVJEKSwKLSAgICAgIFBoYXNlLnNjaGVkdWxlQ29sbGVjdG9yKFBSRVBBUkVfRk9SV0FSRCksCi0gICAgICBQaGFzZS5zY2hlZHVsZU11dGF0b3IgIChQUkVQQVJFKSwKLSAgICAgIFBoYXNlLnNjaGVkdWxlQ29sbGVjdG9yKFNUQUNLX1JPT1RTKSwKLSAgICAgIFBoYXNlLnNjaGVkdWxlQ29sbGVjdG9yKFJPT1RTKSwKLSAgICAgIFBoYXNlLnNjaGVkdWxlR2xvYmFsICAgKFJPT1RTKSwKLSAgICAgIFBoYXNlLnNjaGVkdWxlQ29tcGxleCAgKGZvcndhcmRQaGFzZSksCi0gICAgICBQaGFzZS5zY2hlZHVsZUNvbGxlY3RvcihGT1JXQVJEX0NMT1NVUkUpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVNdXRhdG9yICAoUkVMRUFTRSksCi0gICAgICBQaGFzZS5zY2hlZHVsZUNvbGxlY3RvcihSRUxFQVNFX0ZPUldBUkQpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVHbG9iYWwgICAoUkVMRUFTRV9GT1JXQVJEKSwKLSAgICAgIFBoYXNlLnNjaGVkdWxlQ29sbGVjdG9yKENPTVBBQ1QpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVDb21wbGV4ICAoZmluaXNoUGhhc2UpKTsKLQotICAvLyBDSEVDS1NUWUxFOk9OCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogSW5zdGFuY2UgdmFyaWFibGVzCi0gICAqLwotCi0gIC8qKiBUaGlzIHRyYWNlIHNldHMgdGhlIG1hcmsgYml0IGluIGxpdmUgb2JqZWN0cyAqLwotICBwdWJsaWMgZmluYWwgVHJhY2UgbWFya1RyYWNlOwotCi0gIC8qKiBUaGlzIHRyYWNlIHVwZGF0ZXMgcG9pbnRlcnMgd2l0aCB0aGUgZm9yd2FyZGVkIHJlZmVyZW5jZXMgKi8KLSAgcHVibGljIGZpbmFsIFRyYWNlIGZvcndhcmRUcmFjZTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gKi8KLSAgcHVibGljIE1DKCkgewotICAgIG1hcmtUcmFjZSA9IG5ldyBUcmFjZShtZXRhRGF0YVNwYWNlKTsKLSAgICBmb3J3YXJkVHJhY2UgPSBuZXcgVHJhY2UobWV0YURhdGFTcGFjZSk7Ci0gICAgY29sbGVjdGlvbiA9IG1jQ29sbGVjdGlvbjsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDb2xsZWN0aW9uCi0gICAqLwotCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSAoZ2xvYmFsKSBjb2xsZWN0aW9uIHBoYXNlLgotICAgKgotICAgKiBAcGFyYW0gcGhhc2VJZCBDb2xsZWN0aW9uIHBoYXNlIHRvIGV4ZWN1dGUuCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgdm9pZCBjb2xsZWN0aW9uUGhhc2Uoc2hvcnQgcGhhc2VJZCkgewotICAgIGlmIChwaGFzZUlkID09IFBSRVBBUkUpIHsKLSAgICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkKTsKLSAgICAgIG1hcmtUcmFjZS5wcmVwYXJlKCk7Ci0gICAgICBtY1NwYWNlLnByZXBhcmUoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHBoYXNlSWQgPT0gQ0xPU1VSRSkgewotICAgICAgbWFya1RyYWNlLnByZXBhcmUoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHBoYXNlSWQgPT0gUkVMRUFTRSkgewotICAgICAgbWFya1RyYWNlLnJlbGVhc2UoKTsKLSAgICAgIG1jU3BhY2UucmVsZWFzZSgpOwotICAgICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwaGFzZUlkID09IFBSRVBBUkVfRk9SV0FSRCkgewotICAgICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKFBSRVBBUkUpOwotICAgICAgZm9yd2FyZFRyYWNlLnByZXBhcmUoKTsKLSAgICAgIG1jU3BhY2UucHJlcGFyZSgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAocGhhc2VJZCA9PSBSRUxFQVNFX0ZPUldBUkQpIHsKLSAgICAgIGZvcndhcmRUcmFjZS5yZWxlYXNlKCk7Ci0gICAgICBtY1NwYWNlLnJlbGVhc2UoKTsKLSAgICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShSRUxFQVNFKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQWNjb3VudGluZwotICAgKi8KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcGFnZXMgcmVzZXJ2ZWQgZm9yIHVzZSBnaXZlbiB0aGUgcGVuZGluZwotICAgKiBhbGxvY2F0aW9uLiAgVGhlIHN1cGVyY2xhc3MgYWNjb3VudHMgZm9yIGl0cyBzcGFjZXMsIHdlIGp1c3QKLSAgICogYXVnbWVudCB0aGlzIHdpdGggdGhlIG1hcmstc3dlZXAgc3BhY2UncyBjb250cmlidXRpb24uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBwYWdlcyByZXNlcnZlZCBnaXZlbiB0aGUgcGVuZGluZwotICAgKiBhbGxvY2F0aW9uLCBleGNsdWRpbmcgc3BhY2UgcmVzZXJ2ZWQgZm9yIGNvcHlpbmcuCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBnZXRQYWdlc1VzZWQoKSB7Ci0gICAgcmV0dXJuIChtY1NwYWNlLnJlc2VydmVkUGFnZXMoKSArIHN1cGVyLmdldFBhZ2VzVXNlZCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBwYWdlcyBhIGNvbGxlY3Rpb24gaXMgcmVxdWlyZWQgdG8gZnJlZSB0byBzYXRpc2Z5Ci0gICAqIG91dHN0YW5kaW5nIGFsbG9jYXRpb24gcmVxdWVzdHMuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwYWdlcyBhIGNvbGxlY3Rpb24gaXMgcmVxdWlyZWQgdG8gZnJlZSB0byBzYXRpc2Z5Ci0gICAqIG91dHN0YW5kaW5nIGFsbG9jYXRpb24gcmVxdWVzdHMuCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBnZXRQYWdlc1JlcXVpcmVkKCkgewotICAgIHJldHVybiBzdXBlci5nZXRQYWdlc1JlcXVpcmVkKCkgKyBtY1NwYWNlLnJlcXVpcmVkUGFnZXMoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5tbXRrLnBsYW4uUGxhbiN3aWxsTmV2ZXJNb3ZlCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgT2JqZWN0IGluIHF1ZXN0aW9uCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgb2JqZWN0IHdpbGwgbmV2ZXIgbW92ZQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIHdpbGxOZXZlck1vdmUoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmIChTcGFjZS5pc0luU3BhY2UoTUFSS19DT01QQUNULCBvYmplY3QpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBzdXBlci53aWxsTmV2ZXJNb3ZlKG9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBleHBlY3RlZCByZWZlcmVuY2UgY291bnQuIEZvciBub24tcmVmZXJlbmNlIGNvdW50aW5nCi0gICAqIGNvbGxlY3RvcnMgdGhpcyBiZWNvbWVzIGEgdHJ1ZS9mYWxzZSByZWxhdGlvbnNoaXAuCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBjaGVjay4KLSAgICogQHBhcmFtIHNhbml0eVJvb3RSQyBUaGUgbnVtYmVyIG9mIHJvb3QgcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0LgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBleHBlY3RlZCAocm9vdCBleGNsdWRlZCkgcmVmZXJlbmNlIGNvdW50LgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgc2FuaXR5RXhwZWN0ZWRSQyhPYmplY3RSZWZlcmVuY2Ugb2JqZWN0LCBpbnQgc2FuaXR5Um9vdFJDKSB7Ci0gICAgU3BhY2Ugc3BhY2UgPSBTcGFjZS5nZXRTcGFjZUZvck9iamVjdChvYmplY3QpOwotCi0gICAgLy8gTnVyc2VyeQotICAgIGlmIChzcGFjZSA9PSBNQy5tY1NwYWNlKSB7Ci0gICAgICAvLyBXZSBhcmUgbmV2ZXIgc3VyZSBhYm91dCBvYmplY3RzIGluIE1DLgotICAgICAgLy8gVGhpcyBpcyBub3QgdmVyeSBzYXRpc2Z5aW5nIGJ1dCBhbGxvd3MgdXMgdG8gdXNlIHRoZSBzYW5pdHkgY2hlY2tlciB0bwotICAgICAgLy8gZGV0ZWN0IGRhbmdsaW5nIHBvaW50ZXJzLgotICAgICAgcmV0dXJuIFNhbml0eUNoZWNrZXIuVU5TVVJFOwotICAgIH0KLSAgICByZXR1cm4gc3VwZXIuc2FuaXR5RXhwZWN0ZWRSQyhvYmplY3QsIHNhbml0eVJvb3RSQyk7Ci0gIH0KLQotICAvKioKLSAgICogUmVnaXN0ZXIgc3BlY2lhbGl6ZWQgbWV0aG9kcy4KLSAgICovCi0gIEBPdmVycmlkZQotICBASW50ZXJydXB0aWJsZQotICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlclNwZWNpYWxpemVkTWV0aG9kcygpIHsKLSAgICBUcmFuc2l0aXZlQ2xvc3VyZS5yZWdpc3RlclNwZWNpYWxpemVkU2NhbihTQ0FOX01BUkssIE1DTWFya1RyYWNlTG9jYWwuY2xhc3MpOwotICAgIFRyYW5zaXRpdmVDbG9zdXJlLnJlZ2lzdGVyU3BlY2lhbGl6ZWRTY2FuKFNDQU5fRk9SV0FSRCwgTUNGb3J3YXJkVHJhY2VMb2NhbC5jbGFzcyk7Ci0gICAgc3VwZXIucmVnaXN0ZXJTcGVjaWFsaXplZE1ldGhvZHMoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL21hcmtjb21wYWN0L01DQ29sbGVjdG9yLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vbWFya2NvbXBhY3QvTUNDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFhNmQyYy4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vbWFya2NvbXBhY3QvTUNDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5tYXJrY29tcGFjdDsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uKjsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuTWFya0NvbXBhY3RDb2xsZWN0b3I7Ci0KLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgPGk+cGVyLWNvbGxlY3RvciB0aHJlYWQ8L2k+IGJlaGF2aW9yCi0gKiBhbmQgc3RhdGUgZm9yIHRoZSA8aT5NQzwvaT4gcGxhbiwgd2hpY2ggaW1wbGVtZW50cyBhIGZ1bGwtaGVhcAotICogbWFyay1jb21wYWN0IGNvbGxlY3Rvci48cD4KLSAqCi0gKiBTcGVjaWZpY2FsbHksIHRoaXMgY2xhc3MgZGVmaW5lcyA8aT5NQzwvaT4gY29sbGVjdGlvbiBiZWhhdmlvcgotICogKHRocm91Z2ggPGNvZGU+dHJhY2U8L2NvZGU+IGFuZCB0aGUgPGNvZGU+Y29sbGVjdGlvblBoYXNlPC9jb2RlPgotICogbWV0aG9kKSwgYW5kIGNvbGxlY3Rpb24tdGltZSBhbGxvY2F0aW9uLjxwPgotICoKLSAqIEBzZWUgTUMgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBtYXJrLWNvbXBhY3QgYWxnb3JpdGhtLjxwPgotICogQHNlZSBNQ011dGF0b3IKLSAqIEBzZWUgU3RvcFRoZVdvcmxkQ29sbGVjdG9yCi0gKiBAc2VlIENvbGxlY3RvckNvbnRleHQKLSAqLwotQFVuaW50ZXJydXB0aWJsZSBwdWJsaWMgY2xhc3MgTUNDb2xsZWN0b3IgZXh0ZW5kcyBTdG9wVGhlV29ybGRDb2xsZWN0b3IgewotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVFJBQ0VfTUFSSyA9IGZhbHNlOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFRSQUNFX0ZPUldBUkQgPSB0cnVlOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIEluc3RhbmNlIGZpZWxkcwotICAgKi8KLQotICBwcml2YXRlIGZpbmFsIE1DTWFya1RyYWNlTG9jYWwgbWFya1RyYWNlOwotICBwcml2YXRlIGZpbmFsIE1DRm9yd2FyZFRyYWNlTG9jYWwgZm9yd2FyZFRyYWNlOwotICBwcml2YXRlIGZpbmFsIE1hcmtDb21wYWN0Q29sbGVjdG9yIG1jOwotICBwcml2YXRlIGJvb2xlYW4gY3VycmVudFRyYWNlOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluaXRpYWxpemF0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIE1DQ29sbGVjdG9yKCkgewotICAgIG1hcmtUcmFjZSA9IG5ldyBNQ01hcmtUcmFjZUxvY2FsKGdsb2JhbCgpLm1hcmtUcmFjZSk7Ci0gICAgZm9yd2FyZFRyYWNlID0gbmV3IE1DRm9yd2FyZFRyYWNlTG9jYWwoZ2xvYmFsKCkuZm9yd2FyZFRyYWNlKTsKLSAgICBtYyA9IG5ldyBNYXJrQ29tcGFjdENvbGxlY3RvcihNQy5tY1NwYWNlKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQ29sbGVjdGlvbi10aW1lIGFsbG9jYXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIEFsbG9jYXRlIHNwYWNlIGZvciBjb3B5aW5nIGFuIG9iamVjdCAodGhpcyBtZXRob2QgPGk+ZG9lcyBub3Q8L2k+Ci0gICAqIGNvcHkgdGhlIG9iamVjdCwgaXQgb25seSBhbGxvY2F0ZXMgc3BhY2UpCi0gICAqCi0gICAqIEBwYXJhbSBvcmlnaW5hbCBBIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgb2JqZWN0Ci0gICAqIEBwYXJhbSBieXRlcyBUaGUgc2l6ZSBvZiB0aGUgc3BhY2UgdG8gYmUgYWxsb2NhdGVkIChpbiBieXRlcykKLSAgICogQHBhcmFtIGFsaWduIFRoZSByZXF1ZXN0ZWQgYWxpZ25tZW50LgotICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBhbGlnbm1lbnQgb2Zmc2V0LgotICAgKiBAcmV0dXJuIFRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBhbGxvY2F0ZWQgcmVnaW9uCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgQElubGluZQotICBwdWJsaWMgQWRkcmVzcyBhbGxvY0NvcHkoT2JqZWN0UmVmZXJlbmNlIG9yaWdpbmFsLCBpbnQgYnl0ZXMsCi0gICAgICBpbnQgYWxpZ24sIGludCBvZmZzZXQsIGludCBhbGxvY2F0b3IpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChhbGxvY2F0b3IgPT0gTUMuQUxMT0NfSU1NT1JUQUwpOwotCi0gICAgcmV0dXJuIGltbW9ydGFsLmFsbG9jKGJ5dGVzLCBhbGlnbiwgb2Zmc2V0KTsKLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIGFueSBwb3N0LWNvcHkgYWN0aW9ucy4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgbmV3bHkgYWxsb2NhdGVkIG9iamVjdAotICAgKiBAcGFyYW0gdHlwZVJlZiB0aGUgdHlwZSByZWZlcmVuY2UgZm9yIHRoZSBpbnN0YW5jZSBiZWluZyBjcmVhdGVkCi0gICAqIEBwYXJhbSBieXRlcyBUaGUgc2l6ZSBvZiB0aGUgc3BhY2UgdG8gYmUgYWxsb2NhdGVkIChpbiBieXRlcykKLSAgICovCi0gIEBPdmVycmlkZQotICBASW5saW5lCi0gIHB1YmxpYyB2b2lkIHBvc3RDb3B5KE9iamVjdFJlZmVyZW5jZSBvYmplY3QsIE9iamVjdFJlZmVyZW5jZSB0eXBlUmVmLAotICAgICAgaW50IGJ5dGVzLCBpbnQgYWxsb2NhdG9yKSB7Ci0gICAgTUMuaW1tb3J0YWxTcGFjZS5pbml0aWFsaXplSGVhZGVyKG9iamVjdCk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDb2xsZWN0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBQZXJmb3JtIGEgcGVyLWNvbGxlY3RvciBjb2xsZWN0aW9uIHBoYXNlLgotICAgKgotICAgKiBAcGFyYW0gcGhhc2VJZCBUaGUgY29sbGVjdGlvbiBwaGFzZSB0byBwZXJmb3JtCi0gICAqIEBwYXJhbSBwcmltYXJ5IFBlcmZvcm0gYW55IHNpbmdsZS10aHJlYWRlZCBhY3Rpdml0aWVzIHVzaW5nIHRoaXMgdGhyZWFkLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIEBJbmxpbmUKLSAgcHVibGljIGZpbmFsIHZvaWQgY29sbGVjdGlvblBoYXNlKHNob3J0IHBoYXNlSWQsIGJvb2xlYW4gcHJpbWFyeSkgewotICAgIGlmIChwaGFzZUlkID09IE1DLlBSRVBBUkUpIHsKLSAgICAgIGN1cnJlbnRUcmFjZSA9IFRSQUNFX01BUks7Ci0gICAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gICAgICBtYXJrVHJhY2UucHJlcGFyZSgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwaGFzZUlkID09IE1DLkNMT1NVUkUpIHsKLSAgICAgIG1hcmtUcmFjZS5jb21wbGV0ZVRyYWNlKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHBoYXNlSWQgPT0gTUMuQ0FMQ1VMQVRFX0ZQKSB7Ci0gICAgICBtYy5jYWxjdWxhdGVGb3J3YXJkaW5nUG9pbnRlcnMoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBNQy5DT01QQUNUKSB7Ci0gICAgICBtYy5jb21wYWN0KCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHBoYXNlSWQgPT0gTUMuUkVMRUFTRSkgewotICAgICAgbWFya1RyYWNlLnJlbGVhc2UoKTsKLSAgICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBNQy5QUkVQQVJFX0ZPUldBUkQpIHsKLSAgICAgIGN1cnJlbnRUcmFjZSA9IFRSQUNFX0ZPUldBUkQ7Ci0gICAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UoTUMuUFJFUEFSRSwgcHJpbWFyeSk7Ci0gICAgICBmb3J3YXJkVHJhY2UucHJlcGFyZSgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwaGFzZUlkID09IE1DLkZPUldBUkRfQ0xPU1VSRSkgewotICAgICAgZm9yd2FyZFRyYWNlLmNvbXBsZXRlVHJhY2UoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBNQy5SRUxFQVNFX0ZPUldBUkQpIHsKLSAgICAgIGZvcndhcmRUcmFjZS5yZWxlYXNlKCk7Ci0gICAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UoTUMuUkVMRUFTRSwgcHJpbWFyeSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQsIHByaW1hcnkpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogTWlzY2VsbGFuZW91cwotICAgKi8KLQotICAvKiogQHJldHVybiBUaGUgY3VycmVudCB0cmFjZSBpbnN0YW5jZS4gKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCBUcmFjZUxvY2FsIGdldEN1cnJlbnRUcmFjZSgpIHsKLSAgICBpZiAoY3VycmVudFRyYWNlID09IFRSQUNFX01BUkspIHsKLSAgICAgIHJldHVybiBtYXJrVHJhY2U7Ci0gICAgfQotICAgIHJldHVybiBmb3J3YXJkVHJhY2U7Ci0gIH0KLQotICAvKiogQHJldHVybiBUaGUgYWN0aXZlIGdsb2JhbCBwbGFuIGFzIGFuIDxjb2RlPk1DPC9jb2RlPiBpbnN0YW5jZS4gKi8KLSAgQElubGluZQotICBwcml2YXRlIHN0YXRpYyBNQyBnbG9iYWwoKSB7Ci0gICAgcmV0dXJuIChNQykgVk0uYWN0aXZlUGxhbi5nbG9iYWwoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL21hcmtjb21wYWN0L01DQ29uc3RyYWludHMuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9tYXJrY29tcGFjdC9NQ0NvbnN0cmFpbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlOTc1MGUuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL21hcmtjb21wYWN0L01DQ29uc3RyYWludHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLm1hcmtjb21wYWN0OwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5TdG9wVGhlV29ybGRDb25zdHJhaW50czsKLQotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5NYXJrQ29tcGFjdFNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5NYXJrQ29tcGFjdExvY2FsOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBhbmQgaXRzIHN1YmNsYXNzZXMgY29tbXVuaWNhdGUgdG8gdGhlIGhvc3QgVk0vUnVudGltZQotICogYW55IGZlYXR1cmVzIG9mIHRoZSBzZWxlY3RlZCBwbGFuIHRoYXQgaXQgbmVlZHMgdG8ga25vdy4gIFRoaXMgaXMKLSAqIHNlcGFyYXRlIGZyb20gdGhlIG1haW4gUGxhbi9QbGFuTG9jYWwgY2xhc3MgaW4gb3JkZXIgdG8gYnlwYXNzIGFueQotICogaXNzdWVzIHdpdGggb3JkZXJpbmcgb2Ygc3RhdGljIGluaXRpYWxpemF0aW9uLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgY2xhc3MgTUNDb25zdHJhaW50cyBleHRlbmRzIFN0b3BUaGVXb3JsZENvbnN0cmFpbnRzIHsKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIG1vdmVzT2JqZWN0cygpIHsgcmV0dXJuIHRydWU7IH0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIG5lZWRzRm9yd2FyZEFmdGVyTGl2ZW5lc3MoKSB7IHJldHVybiB0cnVlOyB9Ci0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBuZWVkc0xpbmVhclNjYW4oKSB7IHJldHVybiB0cnVlOyB9Ci0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IG1heE5vbkxPU0RlZmF1bHRBbGxvY0J5dGVzKCkgeyByZXR1cm4gTWFya0NvbXBhY3RMb2NhbC5NSU5JTVVNX0RBVEFfU0laRTsgfQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBnY0hlYWRlckJpdHMoKSB7IHJldHVybiBNYXJrQ29tcGFjdFNwYWNlLkxPQ0FMX0dDX0JJVFNfUkVRVUlSRUQ7IH0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgZ2NIZWFkZXJXb3JkcygpIHsgcmV0dXJuIE1hcmtDb21wYWN0U3BhY2UuR0NfSEVBREVSX1dPUkRTX1JFUVVJUkVEOyB9Ci0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IG51bVNwZWNpYWxpemVkU2NhbnMoKSB7IHJldHVybiAyOyB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vbWFya2NvbXBhY3QvTUNGb3J3YXJkVHJhY2VMb2NhbC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL21hcmtjb21wYWN0L01DRm9yd2FyZFRyYWNlTG9jYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUyNWIxYi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vbWFya2NvbXBhY3QvTUNGb3J3YXJkVHJhY2VMb2NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLm1hcmtjb21wYWN0OwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5UcmFjZUxvY2FsOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhY2U7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LlNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbG1lbnRzIHRoZSB0aHJlYWQtbG9jYWwgZnVuY3Rpb25hbGl0eSBmb3IgYSB0cmFuc2l0aXZlCi0gKiBjbG9zdXJlIG92ZXIgYSBtYXJrLWNvbXBhY3Qgc3BhY2UgZHVyaW5nIHRoZSBmb3J3YXJkaW5nIHBoYXNlLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgZmluYWwgY2xhc3MgTUNGb3J3YXJkVHJhY2VMb2NhbCBleHRlbmRzIFRyYWNlTG9jYWwgewotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICovCi0gIHB1YmxpYyBNQ0ZvcndhcmRUcmFjZUxvY2FsKFRyYWNlIHRyYWNlKSB7Ci0gICAgc3VwZXIoTUMuU0NBTl9GT1JXQVJELCB0cmFjZSk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBFeHRlcm5hbGx5IHZpc2libGUgT2JqZWN0IHByb2Nlc3NpbmcgYW5kIHRyYWNpbmcKLSAgICovCi0KLSAgLyoqCi0gICAqIElzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGxpdmU/Ci0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdC4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBvYmplY3QgaXMgbGl2ZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTGl2ZShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKG9iamVjdC5pc051bGwoKSkgcmV0dXJuIGZhbHNlOwotICAgIGlmIChTcGFjZS5pc0luU3BhY2UoTUMuTUFSS19DT01QQUNULCBvYmplY3QpKSB7Ci0gICAgICByZXR1cm4gTUMubWNTcGFjZS5pc0xpdmUob2JqZWN0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLmlzTGl2ZShvYmplY3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIHRoZSBjb3JlIG1ldGhvZCBkdXJpbmcgdGhlIHRyYWNlIG9mIHRoZSBvYmplY3QgZ3JhcGguCi0gICAqIFRoZSByb2xlIG9mIHRoaXMgbWV0aG9kIGlzIHRvOgotICAgKgotICAgKiAxLiBFbnN1cmUgdGhlIHRyYWNlZCBvYmplY3QgaXMgbm90IGNvbGxlY3RlZC4KLSAgICogMi4gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdmlzaXQgdG8gdGhlIG9iamVjdCBlbnF1ZXVlIGl0IHRvIGJlIHNjYW5uZWQuCi0gICAqIDMuIFJldHVybiB0aGUgZm9yd2FyZGVkIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0LgotICAgKgotICAgKiBJbiB0aGlzIGluc3RhbmNlLCB3ZSByZWZlciBvYmplY3RzIGluIHRoZSBtYXJrLXN3ZWVwIHNwYWNlIHRvIHRoZQotICAgKiBtc1NwYWNlIGZvciB0cmFjaW5nLCBhbmQgZGVmZXIgdG8gdGhlIHN1cGVyY2xhc3MgZm9yIGFsbCBvdGhlcnMuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBiZSB0cmFjZWQuCi0gICAqIEByZXR1cm4gVGhlIG5ldyByZWZlcmVuY2UgdG8gdGhlIHNhbWUgb2JqZWN0IGluc3RhbmNlLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlIHRyYWNlT2JqZWN0KE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAob2JqZWN0LmlzTnVsbCgpKSByZXR1cm4gb2JqZWN0OwotICAgIGlmIChTcGFjZS5pc0luU3BhY2UoTUMuTUFSS19DT01QQUNULCBvYmplY3QpKQotICAgICAgcmV0dXJuIE1DLm1jU3BhY2UudHJhY2VGb3J3YXJkT2JqZWN0KHRoaXMsIG9iamVjdCk7Ci0gICAgcmV0dXJuIHN1cGVyLnRyYWNlT2JqZWN0KG9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogV2lsbCB0aGlzIG9iamVjdCBtb3ZlIGZyb20gdGhpcyBwb2ludCBvbiwgZHVyaW5nIHRoZSBjdXJyZW50IHRyYWNlID8KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9iamVjdCB3aWxsIG5vdCBtb3ZlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gd2lsbE5vdE1vdmVJbkN1cnJlbnRDb2xsZWN0aW9uKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICByZXR1cm4gIVNwYWNlLmlzSW5TcGFjZShNQy5NQVJLX0NPTVBBQ1QsIG9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogRW5zdXJlIHRoYXQgdGhpcyBvYmplY3Qgd2lsbCBub3QgbW92ZSBmb3IgdGhlIHJlc3Qgb2YgdGhlIEdDLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdGhhdCBtdXN0IG5vdCBtb3ZlCi0gICAqIEByZXR1cm4gVGhlIG5ldyBvYmplY3QsIGd1YXJhbnRlZWQgc3RhYmxlIGZvciB0aGUgcmVzdCBvZiB0aGUgR0MuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBPYmplY3RSZWZlcmVuY2UgcHJlY29weU9iamVjdChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSB7Ci0gICAgICAvLyBBbGwgcHJlY29weWluZyBtdXN0IG9jY3VyIGR1cmluZyB0aGUgaW5pdGlhbCB0cmFjZS4KLSAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydCghU3BhY2UuaXNJblNwYWNlKE1DLk1BUktfQ09NUEFDVCwgb2JqZWN0KSk7Ci0gICAgfQotICAgIHJldHVybiBzdXBlci5wcmVjb3B5T2JqZWN0KG9iamVjdCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL21hcmtjb21wYWN0L01DTWFya1RyYWNlTG9jYWwuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9tYXJrY29tcGFjdC9NQ01hcmtUcmFjZUxvY2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNDQ5NTQuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL21hcmtjb21wYWN0L01DTWFya1RyYWNlTG9jYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5tYXJrY29tcGFjdDsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhY2VMb2NhbDsKLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYWNlOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5NYXJrQ29tcGFjdFNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxtZW50cyB0aGUgdGhyZWFkLWxvY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGEgdHJhbnNpdGl2ZQotICogY2xvc3VyZSBvdmVyIGEgbWFyay1jb21wYWN0IHNwYWNlIGR1cmluZyB0aGUgaW5pdGlhbCBtYXJraW5nIHBoYXNlLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgZmluYWwgY2xhc3MgTUNNYXJrVHJhY2VMb2NhbCBleHRlbmRzIFRyYWNlTG9jYWwgewotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICovCi0gIHB1YmxpYyBNQ01hcmtUcmFjZUxvY2FsKFRyYWNlIHRyYWNlKSB7Ci0gICAgc3VwZXIoTUMuU0NBTl9NQVJLLCB0cmFjZSk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBFeHRlcm5hbGx5IHZpc2libGUgT2JqZWN0IHByb2Nlc3NpbmcgYW5kIHRyYWNpbmcKLSAgICovCi0KLSAgLyoqCi0gICAqIElzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGxpdmU/Ci0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdC4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBvYmplY3QgaXMgbGl2ZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTGl2ZShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKG9iamVjdC5pc051bGwoKSkgcmV0dXJuIGZhbHNlOwotICAgIGlmIChTcGFjZS5pc0luU3BhY2UoTUMuTUFSS19DT01QQUNULCBvYmplY3QpKSB7Ci0gICAgICByZXR1cm4gTUMubWNTcGFjZS5pc0xpdmUob2JqZWN0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLmlzTGl2ZShvYmplY3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIHRoZSBjb3JlIG1ldGhvZCBkdXJpbmcgdGhlIHRyYWNlIG9mIHRoZSBvYmplY3QgZ3JhcGguCi0gICAqIFRoZSByb2xlIG9mIHRoaXMgbWV0aG9kIGlzIHRvOgotICAgKgotICAgKiAxLiBFbnN1cmUgdGhlIHRyYWNlZCBvYmplY3QgaXMgbm90IGNvbGxlY3RlZC4KLSAgICogMi4gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdmlzaXQgdG8gdGhlIG9iamVjdCBlbnF1ZXVlIGl0IHRvIGJlIHNjYW5uZWQuCi0gICAqIDMuIFJldHVybiB0aGUgZm9yd2FyZGVkIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0LgotICAgKgotICAgKiBJbiB0aGlzIGluc3RhbmNlLCB3ZSByZWZlciBvYmplY3RzIGluIHRoZSBtYXJrLXN3ZWVwIHNwYWNlIHRvIHRoZQotICAgKiBtc1NwYWNlIGZvciB0cmFjaW5nLCBhbmQgZGVmZXIgdG8gdGhlIHN1cGVyY2xhc3MgZm9yIGFsbCBvdGhlcnMuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBiZSB0cmFjZWQuCi0gICAqIEByZXR1cm4gVGhlIG5ldyByZWZlcmVuY2UgdG8gdGhlIHNhbWUgb2JqZWN0IGluc3RhbmNlLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlIHRyYWNlT2JqZWN0KE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAob2JqZWN0LmlzTnVsbCgpKSByZXR1cm4gb2JqZWN0OwotICAgIGlmIChTcGFjZS5pc0luU3BhY2UoTUMuTUFSS19DT01QQUNULCBvYmplY3QpKQotICAgICAgcmV0dXJuIE1DLm1jU3BhY2UudHJhY2VNYXJrT2JqZWN0KHRoaXMsIG9iamVjdCk7Ci0gICAgcmV0dXJuIHN1cGVyLnRyYWNlT2JqZWN0KG9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogRW5zdXJlIHRoYXQgdGhpcyBvYmplY3Qgd2lsbCBub3QgbW92ZSBmb3IgdGhlIHJlc3Qgb2YgdGhlIEdDLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdGhhdCBtdXN0IG5vdCBtb3ZlCi0gICAqIEByZXR1cm4gVGhlIG5ldyBvYmplY3QsIGd1YXJhbnRlZWQgc3RhYmxlIGZvciB0aGUgcmVzdCBvZiB0aGUgR0MuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBPYmplY3RSZWZlcmVuY2UgcHJlY29weU9iamVjdChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKFNwYWNlLmlzSW5TcGFjZShNQy5NQVJLX0NPTVBBQ1QsIG9iamVjdCkpIHsKLSAgICAgIGlmIChNYXJrQ29tcGFjdFNwYWNlLnRlc3RBbmRNYXJrKG9iamVjdCkpIHsKLSAgICAgICAgLy8gVE9ETzogSWYgcHJlY29weSByZXR1cm5zIG1hbnkgZGlmZmVyZW50IG9iamVjdHMsIHRoaXMgd2lsbCBjYXVzZSBhIGxlYWsuCi0gICAgICAgIC8vIEN1cnJlbnRseSwgSmlrZXMgUlZNIGRvZXMgbm90IHJlcXVpcmUgbWFueSBvYmplY3RzIHRvIGJlIHByZWNvcGllZC4KLSAgICAgICAgT2JqZWN0UmVmZXJlbmNlIG5ld09iamVjdCA9IFZNLm9iamVjdE1vZGVsLmNvcHkob2JqZWN0LCBNQy5BTExPQ19JTU1PUlRBTCk7Ci0gICAgICAgIE1hcmtDb21wYWN0U3BhY2Uuc2V0Rm9yd2FyZGluZ1BvaW50ZXIob2JqZWN0LCBuZXdPYmplY3QpOwotICAgICAgICBwcm9jZXNzTm9kZShuZXdPYmplY3QpOwotICAgICAgICByZXR1cm4gbmV3T2JqZWN0OwotICAgICAgfQotICAgICAgLy8gU29tZWJvZHkgZWxzZSBnb3QgdG8gaXQgZmlyc3QKLSAgICAgIHdoaWxlIChNYXJrQ29tcGFjdFNwYWNlLmdldEZvcndhcmRpbmdQb2ludGVyKG9iamVjdCkuaXNOdWxsKCkpOwotICAgICAgcmV0dXJuIE1hcmtDb21wYWN0U3BhY2UuZ2V0Rm9yd2FyZGluZ1BvaW50ZXIob2JqZWN0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLnByZWNvcHlPYmplY3Qob2JqZWN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBXaWxsIHRoaXMgb2JqZWN0IG1vdmUgZnJvbSB0aGlzIHBvaW50IG9uLCBkdXJpbmcgdGhlIGN1cnJlbnQgdHJhY2UgPwotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgb2JqZWN0IHdpbGwgbm90IG1vdmUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiB3aWxsTm90TW92ZUluQ3VycmVudENvbGxlY3Rpb24oT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIC8vIEFsbCBvYmplY3RzIGluIHRoZSBNQyBzcGFjZSBtYXkgbW92ZQotICAgIHJldHVybiAhU3BhY2UuaXNJblNwYWNlKE1DLk1BUktfQ09NUEFDVCwgb2JqZWN0KTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vbWFya2NvbXBhY3QvTUNNdXRhdG9yLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vbWFya2NvbXBhY3QvTUNNdXRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YzI1ZTIuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL21hcmtjb21wYWN0L01DTXV0YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLm1hcmtjb21wYWN0OwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5TdG9wVGhlV29ybGRNdXRhdG9yOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5NYXJrQ29tcGFjdExvY2FsOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLQotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuYWxsb2MuQWxsb2NhdG9yOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyA8aT5wZXItbXV0YXRvciB0aHJlYWQ8L2k+IGJlaGF2aW9yCi0gKiBhbmQgc3RhdGUgZm9yIHRoZSA8aT5NQzwvaT4gcGxhbiwgd2hpY2ggaW1wbGVtZW50cyBhIGZ1bGwtaGVhcAotICogbWFyay1jb21wYWN0IGNvbGxlY3Rvci48cD4KLSAqCi0gKiBTcGVjaWZpY2FsbHksIHRoaXMgY2xhc3MgZGVmaW5lcyA8aT5NQzwvaT4gbXV0YXRvci10aW1lIGFsbG9jYXRpb24KLSAqIGFuZCBwZXItbXV0YXRvciB0aHJlYWQgY29sbGVjdGlvbiBzZW1hbnRpY3MgKGZsdXNoaW5nIGFuZCByZXN0b3JpbmcKLSAqIHBlci1tdXRhdG9yIGFsbG9jYXRvciBzdGF0ZSkuCi0gKgotICogU2VlIHtAbGluayBNQ30gZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBtYXJrLWNvbXBhY3QgYWxnb3JpdGhtLjxwPgotICoKLSAqIEBzZWUgTUMKLSAqIEBzZWUgTUNDb2xsZWN0b3IKLSAqIEBzZWUgb3JnLm1tdGsucGxhbi5TdG9wVGhlV29ybGRNdXRhdG9yCi0gKiBAc2VlIG9yZy5tbXRrLnBsYW4uTXV0YXRvckNvbnRleHQKLSAqLwotQFVuaW50ZXJydXB0aWJsZSBwdWJsaWMgY2xhc3MgTUNNdXRhdG9yIGV4dGVuZHMgU3RvcFRoZVdvcmxkTXV0YXRvciB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogSW5zdGFuY2UgZmllbGRzCi0gICAqLwotICBwcml2YXRlIGZpbmFsIE1hcmtDb21wYWN0TG9jYWwgbWM7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5pdGlhbGl6YXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqLwotICBwdWJsaWMgTUNNdXRhdG9yKCkgewotICAgIG1jID0gbmV3IE1hcmtDb21wYWN0TG9jYWwoTUMubWNTcGFjZSk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBNdXRhdG9yLXRpbWUgYWxsb2NhdGlvbgotICAgKi8KLQotICAvKioKLSAgICogQWxsb2NhdGUgbWVtb3J5IGZvciBhbiBvYmplY3QuIFRoaXMgY2xhc3MgaGFuZGxlcyB0aGUgZGVmYXVsdCBhbGxvY2F0b3IKLSAgICogZnJvbSB0aGUgbWFyayBzd2VlcCBzcGFjZSwgYW5kIGRlbGVnYXRlcyBldmVyeXRoaW5nIGVsc2UgdG8gdGhlCi0gICAqIHN1cGVyY2xhc3MuCi0gICAqCi0gICAqIEBwYXJhbSBieXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgb2JqZWN0LgotICAgKiBAcGFyYW0gYWxpZ24gUmVxdWlyZWQgYWxpZ25tZW50IGZvciB0aGUgb2JqZWN0LgotICAgKiBAcGFyYW0gb2Zmc2V0IE9mZnNldCBhc3NvY2lhdGVkIHdpdGggdGhlIGFsaWdubWVudC4KLSAgICogQHBhcmFtIGFsbG9jYXRvciBUaGUgYWxsb2NhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QuCi0gICAqIEBwYXJhbSBzaXRlIEFsbG9jYXRpb24gc2l0ZQotICAgKiBAcmV0dXJuIFRoZSBsb3cgYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeS4KLSAgICovCi0gIEBPdmVycmlkZQotICBASW5saW5lCi0gIHB1YmxpYyBBZGRyZXNzIGFsbG9jKGludCBieXRlcywgaW50IGFsaWduLCBpbnQgb2Zmc2V0LCBpbnQgYWxsb2NhdG9yLCBpbnQgc2l0ZSkgewotICAgIGlmIChhbGxvY2F0b3IgPT0gTUMuQUxMT0NfREVGQVVMVCkgewotICAgICAgcmV0dXJuIG1jLmFsbG9jKGJ5dGVzLCBhbGlnbiwgb2Zmc2V0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLmFsbG9jKGJ5dGVzLCBhbGlnbiwgb2Zmc2V0LCBhbGxvY2F0b3IsIHNpdGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFBlcmZvcm0gcG9zdC1hbGxvY2F0aW9uIGFjdGlvbnMuICBJbml0aWFsaXplIHRoZSBvYmplY3QgaGVhZGVyIGZvcgotICAgKiBvYmplY3RzIGluIHRoZSBtYXJrLXN3ZWVwIHNwYWNlLCBhbmQgZGVsZWdhdGUgdG8gdGhlIHN1cGVyY2xhc3MgZm9yCi0gICAqIG90aGVyIG9iamVjdHMuCi0gICAqCi0gICAqIEBwYXJhbSByZWYgVGhlIG5ld2x5IGFsbG9jYXRlZCBvYmplY3QKLSAgICogQHBhcmFtIHR5cGVSZWYgdGhlIHR5cGUgcmVmZXJlbmNlIGZvciB0aGUgaW5zdGFuY2UgYmVpbmcgY3JlYXRlZAotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIHNpemUgb2YgdGhlIHNwYWNlIHRvIGJlIGFsbG9jYXRlZCAoaW4gYnl0ZXMpCi0gICAqIEBwYXJhbSBhbGxvY2F0b3IgVGhlIGFsbG9jYXRvciBudW1iZXIgdG8gYmUgdXNlZCBmb3IgdGhpcyBhbGxvY2F0aW9uCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgQElubGluZQotICBwdWJsaWMgdm9pZCBwb3N0QWxsb2MoT2JqZWN0UmVmZXJlbmNlIHJlZiwgT2JqZWN0UmVmZXJlbmNlIHR5cGVSZWYsCi0gICAgICBpbnQgYnl0ZXMsIGludCBhbGxvY2F0b3IpIHsKLSAgICBpZiAoYWxsb2NhdG9yID09IE1DLkFMTE9DX0RFRkFVTFQpCi0gICAgICBNQy5tY1NwYWNlLmluaXRpYWxpemVIZWFkZXIocmVmKTsKLSAgICBlbHNlCi0gICAgICBzdXBlci5wb3N0QWxsb2MocmVmLCB0eXBlUmVmLCBieXRlcywgYWxsb2NhdG9yKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGFsbG9jYXRvciBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggYSBzcGFjZQotICAgKiA8Y29kZT5zcGFjZTwvY29kZT4sIGZvciB0aGlzIHBsYW4gaW5zdGFuY2UuCi0gICAqCi0gICAqIEBwYXJhbSBzcGFjZSBUaGUgc3BhY2UgZm9yIHdoaWNoIHRoZSBhbGxvY2F0b3IgaW5zdGFuY2UgaXMgZGVzaXJlZC4KLSAgICogQHJldHVybiBUaGUgYWxsb2NhdG9yIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBsYW4gaW5zdGFuY2UKLSAgICogd2hpY2ggaXMgYWxsb2NhdGluZyBpbnRvIDxjb2RlPnNwYWNlPC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICogaWYgbm8gYXBwcm9wcmlhdGUgYWxsb2NhdG9yIGNhbiBiZSBlc3RhYmxpc2hlZC4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgQWxsb2NhdG9yIGdldEFsbG9jYXRvckZyb21TcGFjZShTcGFjZSBzcGFjZSkgewotICAgIGlmIChzcGFjZSA9PSBNQy5tY1NwYWNlKSByZXR1cm4gbWM7Ci0gICAgcmV0dXJuIHN1cGVyLmdldEFsbG9jYXRvckZyb21TcGFjZShzcGFjZSk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbGxlY3Rpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSBwZXItbXV0YXRvciBjb2xsZWN0aW9uIHBoYXNlLgotICAgKgotICAgKiBAcGFyYW0gcGhhc2VJZCBUaGUgY29sbGVjdGlvbiBwaGFzZSB0byBwZXJmb3JtCi0gICAqIEBwYXJhbSBwcmltYXJ5IFBlcmZvcm0gYW55IHNpbmdsZS10aHJlYWRlZCBhY3Rpdml0aWVzIHVzaW5nIHRoaXMgdGhyZWFkLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIEBJbmxpbmUKLSAgcHVibGljIGZpbmFsIHZvaWQgY29sbGVjdGlvblBoYXNlKHNob3J0IHBoYXNlSWQsIGJvb2xlYW4gcHJpbWFyeSkgewotICAgIGlmIChwaGFzZUlkID09IE1DLlBSRVBBUkUpIHsKLSAgICAgIG1jLnByZXBhcmUoKTsKLSAgICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBNQy5SRUxFQVNFKSB7Ci0gICAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KTsKLSAgfQotCi0gIC8qKgotICAgKiBGbHVzaCB0aGUgcGFnZXMgdGhpcyBtdXRhdG9yIGhhcyBhbGxvY2F0ZWQgYmFjayB0byB0aGUgZ2xvYmFsCi0gICAqIGRpcnR5IHBhZ2UgbGlzdCwgd2hlcmUgdGhlIGNvbGxlY3RvcnMgY2FuIGZpbmQgdGhlbS4KLSAgICoKLSAgICogQHNlZSBvcmcubW10ay5wbGFuLk11dGF0b3JDb250ZXh0I2ZsdXNoKCkKLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBmbHVzaCgpIHsKLSAgICBzdXBlci5mbHVzaCgpOwotICAgIG1jLmZsdXNoKCk7Ci0gIH0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9tYXJrc3dlZXAvTVMuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9tYXJrc3dlZXAvTVMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyZDIyMy4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vbWFya3N3ZWVwL01TLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4ubWFya3N3ZWVwOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi4qOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5NYXJrU3dlZXBTcGFjZTsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5oZWFwLlZNUmVxdWVzdDsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGdsb2JhbCBzdGF0ZSBvZiBhIHNpbXBsZSBtYXJrLXN3ZWVwIGNvbGxlY3Rvci4KLSAqCi0gKiBBbGwgcGxhbnMgbWFrZSBhIGNsZWFyIGRpc3RpbmN0aW9uIGJldHdlZW4gPGk+Z2xvYmFsPC9pPiBhbmQKLSAqIDxpPnRocmVhZC1sb2NhbDwvaT4gYWN0aXZpdGllcywgYW5kIGRpdmlkZXMgZ2xvYmFsIGFuZCBsb2NhbCBzdGF0ZQotICogaW50byBzZXBhcmF0ZSBjbGFzcyBoaWVyYXJjaGllcy4gIEdsb2JhbCBhY3Rpdml0aWVzIG11c3QgYmUKLSAqIHN5bmNocm9uaXplZCwgd2hlcmVhcyBubyBzeW5jaHJvbml6YXRpb24gaXMgcmVxdWlyZWQgZm9yCi0gKiB0aHJlYWQtbG9jYWwgYWN0aXZpdGllcy4gIFRoZXJlIGlzIGEgc2luZ2xlIGluc3RhbmNlIG9mIFBsYW4gKG9yIHRoZQotICogYXBwcm9wcmlhdGUgc3ViLWNsYXNzKSwgYW5kIGEgMToxIG1hcHBpbmcgb2YgUGxhbkxvY2FsIHRvICJrZXJuZWwKLSAqIHRocmVhZHMiIChha2EgQ1BVcykuICBUaHVzIGluc3RhbmNlCi0gKiBtZXRob2RzIG9mIFBsYW5Mb2NhbCBhbGxvdyBmYXN0LCB1bnN5Y2hyb25pemVkIGFjY2VzcyB0byBmdW5jdGlvbnMgc3VjaCBhcwotICogYWxsb2NhdGlvbiBhbmQgY29sbGVjdGlvbi4KLSAqCi0gKiBUaGUgZ2xvYmFsIGluc3RhbmNlIGRlZmluZXMgYW5kIG1hbmFnZXMgc3RhdGljIHJlc291cmNlcwotICogKHN1Y2ggYXMgbWVtb3J5IGFuZCB2aXJ0dWFsIG1lbW9yeSByZXNvdXJjZXMpLiAgVGhpcyBtYXBwaW5nIG9mIHRocmVhZHMgdG8KLSAqIGluc3RhbmNlcyBpcyBjcnVjaWFsIHRvIHVuZGVyc3RhbmRpbmcgdGhlIGNvcnJlY3RuZXNzIGFuZAotICogcGVyZm9ybWFuY2UgcHJvcGVydGllcyBvZiBNTVRrIHBsYW5zLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgY2xhc3MgTVMgZXh0ZW5kcyBTdG9wVGhlV29ybGQgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIENsYXNzIHZhcmlhYmxlcwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXJrU3dlZXBTcGFjZSBtc1NwYWNlID0gbmV3IE1hcmtTd2VlcFNwYWNlKCJtcyIsIERFRkFVTFRfUE9MTF9GUkVRVUVOQ1ksIFZNUmVxdWVzdC5jcmVhdGUoKSk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BUktfU1dFRVAgPSBtc1NwYWNlLmdldERlc2NyaXB0b3IoKTsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ0FOX01BUksgPSAwOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogSW5zdGFuY2UgdmFyaWFibGVzCi0gICAqLwotICBwdWJsaWMgZmluYWwgVHJhY2UgbXNUcmFjZSA9IG5ldyBUcmFjZShtZXRhRGF0YVNwYWNlKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBDb2xsZWN0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBQZXJmb3JtIGEgKGdsb2JhbCkgY29sbGVjdGlvbiBwaGFzZS4KLSAgICoKLSAgICogQHBhcmFtIHBoYXNlSWQgQ29sbGVjdGlvbiBwaGFzZSB0byBleGVjdXRlLgotICAgKi8KLSAgQElubGluZQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgY29sbGVjdGlvblBoYXNlKHNob3J0IHBoYXNlSWQpIHsKLQotICAgIGlmIChwaGFzZUlkID09IFBSRVBBUkUpIHsKLSAgICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkKTsKLSAgICAgIG1zVHJhY2UucHJlcGFyZSgpOwotICAgICAgbXNTcGFjZS5wcmVwYXJlKHRydWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwaGFzZUlkID09IENMT1NVUkUpIHsKLSAgICAgIG1zVHJhY2UucHJlcGFyZSgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAocGhhc2VJZCA9PSBSRUxFQVNFKSB7Ci0gICAgICBtc1RyYWNlLnJlbGVhc2UoKTsKLSAgICAgIG1zU3BhY2UucmVsZWFzZSgpOwotICAgICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBBY2NvdW50aW5nCi0gICAqLwotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBwYWdlcyByZXNlcnZlZCBmb3IgdXNlIGdpdmVuIHRoZSBwZW5kaW5nCi0gICAqIGFsbG9jYXRpb24uICBUaGUgc3VwZXJjbGFzcyBhY2NvdW50cyBmb3IgaXRzIHNwYWNlcywgd2UganVzdAotICAgKiBhdWdtZW50IHRoaXMgd2l0aCB0aGUgbWFyay1zd2VlcCBzcGFjZSdzIGNvbnRyaWJ1dGlvbi4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHJlc2VydmVkIGdpdmVuIHRoZSBwZW5kaW5nCi0gICAqIGFsbG9jYXRpb24sIGV4Y2x1ZGluZyBzcGFjZSByZXNlcnZlZCBmb3IgY29weWluZy4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IGdldFBhZ2VzVXNlZCgpIHsKLSAgICByZXR1cm4gKG1zU3BhY2UucmVzZXJ2ZWRQYWdlcygpICsgc3VwZXIuZ2V0UGFnZXNVc2VkKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHBhZ2VzIGEgY29sbGVjdGlvbiBpcyByZXF1aXJlZCB0byBmcmVlIHRvIHNhdGlzZnkKLSAgICogb3V0c3RhbmRpbmcgYWxsb2NhdGlvbiByZXF1ZXN0cy4KLSAgICoKLSAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHBhZ2VzIGEgY29sbGVjdGlvbiBpcyByZXF1aXJlZCB0byBmcmVlIHRvIHNhdGlzZnkKLSAgICogb3V0c3RhbmRpbmcgYWxsb2NhdGlvbiByZXF1ZXN0cy4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IGdldFBhZ2VzUmVxdWlyZWQoKSB7Ci0gICAgcmV0dXJuIHN1cGVyLmdldFBhZ2VzUmVxdWlyZWQoKSArIG1zU3BhY2UucmVxdWlyZWRQYWdlcygpOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogTWlzY2VsbGFuZW91cwotICAgKi8KLQotICAvKioKLSAgICogQHNlZSBvcmcubW10ay5wbGFuLlBsYW4jd2lsbE5ldmVyTW92ZQotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IE9iamVjdCBpbiBxdWVzdGlvbgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9iamVjdCB3aWxsIG5ldmVyIG1vdmUKLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiB3aWxsTmV2ZXJNb3ZlKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAoU3BhY2UuaXNJblNwYWNlKE1BUktfU1dFRVAsIG9iamVjdCkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gc3VwZXIud2lsbE5ldmVyTW92ZShvYmplY3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlZ2lzdGVyIHNwZWNpYWxpemVkIG1ldGhvZHMuCi0gICAqLwotICBASW50ZXJydXB0aWJsZQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJTcGVjaWFsaXplZE1ldGhvZHMoKSB7Ci0gICAgVHJhbnNpdGl2ZUNsb3N1cmUucmVnaXN0ZXJTcGVjaWFsaXplZFNjYW4oU0NBTl9NQVJLLCBNU1RyYWNlTG9jYWwuY2xhc3MpOwotICAgIHN1cGVyLnJlZ2lzdGVyU3BlY2lhbGl6ZWRNZXRob2RzKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9tYXJrc3dlZXAvTVNDb2xsZWN0b3IuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9tYXJrc3dlZXAvTVNDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIzZWQyNC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vbWFya3N3ZWVwL01TQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5tYXJrc3dlZXA7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLio7Ci1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgPGk+cGVyLWNvbGxlY3RvciB0aHJlYWQ8L2k+IGJlaGF2aW9yCi0gKiBhbmQgc3RhdGUgZm9yIHRoZSA8aT5NUzwvaT4gcGxhbiwgd2hpY2ggaW1wbGVtZW50cyBhIGZ1bGwtaGVhcAotICogbWFyay1zd2VlcCBjb2xsZWN0b3IuPHA+Ci0gKgotICogU3BlY2lmaWNhbGx5LCB0aGlzIGNsYXNzIGRlZmluZXMgPGk+TVM8L2k+IGNvbGxlY3Rpb24gYmVoYXZpb3IKLSAqICh0aHJvdWdoIDxjb2RlPnRyYWNlPC9jb2RlPiBhbmQgdGhlIDxjb2RlPmNvbGxlY3Rpb25QaGFzZTwvY29kZT4KLSAqIG1ldGhvZCkuPHA+Ci0gKgotICogQHNlZSBNUyBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIG1hcmstc3dlZXAgYWxnb3JpdGhtLjxwPgotICoKLSAqIEBzZWUgTVMKLSAqIEBzZWUgTVNNdXRhdG9yCi0gKiBAc2VlIFN0b3BUaGVXb3JsZENvbGxlY3RvcgotICogQHNlZSBDb2xsZWN0b3JDb250ZXh0Ci0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBjbGFzcyBNU0NvbGxlY3RvciBleHRlbmRzIFN0b3BUaGVXb3JsZENvbGxlY3RvciB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogSW5zdGFuY2UgZmllbGRzCi0gICAqLwotICBwcm90ZWN0ZWQgTVNUcmFjZUxvY2FsIGZ1bGxUcmFjZSA9IG5ldyBNU1RyYWNlTG9jYWwoZ2xvYmFsKCkubXNUcmFjZSwgbnVsbCk7OwotICBwcm90ZWN0ZWQgVHJhY2VMb2NhbCBjdXJyZW50VHJhY2UgPSBmdWxsVHJhY2U7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBDb2xsZWN0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBQZXJmb3JtIGEgcGVyLWNvbGxlY3RvciBjb2xsZWN0aW9uIHBoYXNlLgotICAgKgotICAgKiBAcGFyYW0gcGhhc2VJZCBUaGUgY29sbGVjdGlvbiBwaGFzZSB0byBwZXJmb3JtCi0gICAqIEBwYXJhbSBwcmltYXJ5IFBlcmZvcm0gYW55IHNpbmdsZS10aHJlYWRlZCBhY3Rpdml0aWVzIHVzaW5nIHRoaXMgdGhyZWFkLgotICAgKi8KLSAgQElubGluZQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgY29sbGVjdGlvblBoYXNlKHNob3J0IHBoYXNlSWQsIGJvb2xlYW4gcHJpbWFyeSkgewotICAgIGlmIChwaGFzZUlkID09IE1TLlBSRVBBUkUpIHsKLSAgICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KTsKLSAgICAgIGZ1bGxUcmFjZS5wcmVwYXJlKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHBoYXNlSWQgPT0gTVMuQ0xPU1VSRSkgewotICAgICAgZnVsbFRyYWNlLmNvbXBsZXRlVHJhY2UoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBNUy5SRUxFQVNFKSB7Ci0gICAgICBmdWxsVHJhY2UucmVsZWFzZSgpOwotICAgICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQsIHByaW1hcnkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogTWlzY2VsbGFuZW91cwotICAgKi8KLQotICAvKiogQHJldHVybiBUaGUgYWN0aXZlIGdsb2JhbCBwbGFuIGFzIGFuIDxjb2RlPk1TPC9jb2RlPiBpbnN0YW5jZS4gKi8KLSAgQElubGluZQotICBwcml2YXRlIHN0YXRpYyBNUyBnbG9iYWwoKSB7Ci0gICAgcmV0dXJuIChNUykgVk0uYWN0aXZlUGxhbi5nbG9iYWwoKTsKLSAgfQotCi0gIC8qKiBAcmV0dXJuIFRoZSBjdXJyZW50IHRyYWNlIGluc3RhbmNlLiAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGZpbmFsIFRyYWNlTG9jYWwgZ2V0Q3VycmVudFRyYWNlKCkgewotICAgIHJldHVybiBjdXJyZW50VHJhY2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9tYXJrc3dlZXAvTVNDb25zdHJhaW50cy5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL21hcmtzd2VlcC9NU0NvbnN0cmFpbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZjgyODguLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL21hcmtzd2VlcC9NU0NvbnN0cmFpbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5tYXJrc3dlZXA7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlN0b3BUaGVXb3JsZENvbnN0cmFpbnRzOwotCi1pbXBvcnQgb3JnLm1tdGsucG9saWN5Lk1hcmtTd2VlcFNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TZWdyZWdhdGVkRnJlZUxpc3RTcGFjZTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgYW5kIGl0cyBzdWJjbGFzc2VzIGNvbW11bmljYXRlIHRvIHRoZSBob3N0IFZNL1J1bnRpbWUKLSAqIGFueSBmZWF0dXJlcyBvZiB0aGUgc2VsZWN0ZWQgcGxhbiB0aGF0IGl0IG5lZWRzIHRvIGtub3cuICBUaGlzIGlzCi0gKiBzZXBhcmF0ZSBmcm9tIHRoZSBtYWluIFBsYW4vUGxhbkxvY2FsIGNsYXNzIGluIG9yZGVyIHRvIGJ5cGFzcyBhbnkKLSAqIGlzc3VlcyB3aXRoIG9yZGVyaW5nIG9mIHN0YXRpYyBpbml0aWFsaXphdGlvbi4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIE1TQ29uc3RyYWludHMgZXh0ZW5kcyBTdG9wVGhlV29ybGRDb25zdHJhaW50cyB7Ci0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IGdjSGVhZGVyQml0cygpIHsgcmV0dXJuIE1hcmtTd2VlcFNwYWNlLkxPQ0FMX0dDX0JJVFNfUkVRVUlSRUQ7IH0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgZ2NIZWFkZXJXb3JkcygpIHsgcmV0dXJuIE1hcmtTd2VlcFNwYWNlLkdDX0hFQURFUl9XT1JEU19SRVFVSVJFRDsgfQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBtYXhOb25MT1NEZWZhdWx0QWxsb2NCeXRlcygpIHsgcmV0dXJuIFNlZ3JlZ2F0ZWRGcmVlTGlzdFNwYWNlLk1BWF9GUkVFTElTVF9PQkpFQ1RfQllURVM7IH0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgbnVtU3BlY2lhbGl6ZWRTY2FucygpIHsgcmV0dXJuIDE7IH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9tYXJrc3dlZXAvTVNNdXRhdG9yLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vbWFya3N3ZWVwL01TTXV0YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGZhYTUxLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9tYXJrc3dlZXAvTVNNdXRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4ubWFya3N3ZWVwOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi4qOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5NYXJrU3dlZXBMb2NhbDsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5hbGxvYy5BbGxvY2F0b3I7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIDxpPnBlci1tdXRhdG9yIHRocmVhZDwvaT4gYmVoYXZpb3IKLSAqIGFuZCBzdGF0ZSBmb3IgdGhlIDxpPk1TPC9pPiBwbGFuLCB3aGljaCBpbXBsZW1lbnRzIGEgZnVsbC1oZWFwCi0gKiBtYXJrLXN3ZWVwIGNvbGxlY3Rvci48cD4KLSAqCi0gKiBTcGVjaWZpY2FsbHksIHRoaXMgY2xhc3MgZGVmaW5lcyA8aT5NUzwvaT4gbXV0YXRvci10aW1lIGFsbG9jYXRpb24KLSAqIGFuZCBwZXItbXV0YXRvciB0aHJlYWQgY29sbGVjdGlvbiBzZW1hbnRpY3MgKGZsdXNoaW5nIGFuZCByZXN0b3JpbmcKLSAqIHBlci1tdXRhdG9yIGFsbG9jYXRvciBzdGF0ZSkuPHA+Ci0gKgotICogQHNlZSBNUwotICogQHNlZSBNU0NvbGxlY3RvcgotICogQHNlZSBTdG9wVGhlV29ybGRNdXRhdG9yCi0gKiBAc2VlIE11dGF0b3JDb250ZXh0Ci0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBjbGFzcyBNU011dGF0b3IgZXh0ZW5kcyBTdG9wVGhlV29ybGRNdXRhdG9yIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBJbnN0YW5jZSBmaWVsZHMKLSAgICovCi0gIHByb3RlY3RlZCBNYXJrU3dlZXBMb2NhbCBtcyA9IG5ldyBNYXJrU3dlZXBMb2NhbChNUy5tc1NwYWNlKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIE11dGF0b3ItdGltZSBhbGxvY2F0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFuIG9iamVjdC4gVGhpcyBjbGFzcyBoYW5kbGVzIHRoZSBkZWZhdWx0IGFsbG9jYXRvcgotICAgKiBmcm9tIHRoZSBtYXJrIHN3ZWVwIHNwYWNlLCBhbmQgZGVsZWdhdGVzIGV2ZXJ5dGhpbmcgZWxzZSB0byB0aGUKLSAgICogc3VwZXJjbGFzcy4KLSAgICoKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBvYmplY3QuCi0gICAqIEBwYXJhbSBhbGlnbiBSZXF1aXJlZCBhbGlnbm1lbnQgZm9yIHRoZSBvYmplY3QuCi0gICAqIEBwYXJhbSBvZmZzZXQgT2Zmc2V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYWxpZ25tZW50LgotICAgKiBAcGFyYW0gYWxsb2NhdG9yIFRoZSBhbGxvY2F0b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVxdWVzdC4KLSAgICogQHJldHVybiBUaGUgbG93IGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkuCi0gICAqLwotICBASW5saW5lCi0gIEBPdmVycmlkZQotICBwdWJsaWMgQWRkcmVzcyBhbGxvYyhpbnQgYnl0ZXMsIGludCBhbGlnbiwgaW50IG9mZnNldCwgaW50IGFsbG9jYXRvciwgaW50IHNpdGUpIHsKLSAgICBpZiAoYWxsb2NhdG9yID09IE1TLkFMTE9DX0RFRkFVTFQpIHsKLSAgICAgIHJldHVybiBtcy5hbGxvYyhieXRlcywgYWxpZ24sIG9mZnNldCk7Ci0gICAgfQotICAgIHJldHVybiBzdXBlci5hbGxvYyhieXRlcywgYWxpZ24sIG9mZnNldCwgYWxsb2NhdG9yLCBzaXRlKTsKLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIHBvc3QtYWxsb2NhdGlvbiBhY3Rpb25zLiAgSW5pdGlhbGl6ZSB0aGUgb2JqZWN0IGhlYWRlciBmb3IKLSAgICogb2JqZWN0cyBpbiB0aGUgbWFyay1zd2VlcCBzcGFjZSwgYW5kIGRlbGVnYXRlIHRvIHRoZSBzdXBlcmNsYXNzIGZvcgotICAgKiBvdGhlciBvYmplY3RzLgotICAgKgotICAgKiBAcGFyYW0gcmVmIFRoZSBuZXdseSBhbGxvY2F0ZWQgb2JqZWN0Ci0gICAqIEBwYXJhbSB0eXBlUmVmIHRoZSB0eXBlIHJlZmVyZW5jZSBmb3IgdGhlIGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBzaXplIG9mIHRoZSBzcGFjZSB0byBiZSBhbGxvY2F0ZWQgKGluIGJ5dGVzKQotICAgKiBAcGFyYW0gYWxsb2NhdG9yIFRoZSBhbGxvY2F0b3IgbnVtYmVyIHRvIGJlIHVzZWQgZm9yIHRoaXMgYWxsb2NhdGlvbgotICAgKi8KLSAgQElubGluZQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgcG9zdEFsbG9jKE9iamVjdFJlZmVyZW5jZSByZWYsIE9iamVjdFJlZmVyZW5jZSB0eXBlUmVmLAotICAgICAgaW50IGJ5dGVzLCBpbnQgYWxsb2NhdG9yKSB7Ci0gICAgaWYgKGFsbG9jYXRvciA9PSBNUy5BTExPQ19ERUZBVUxUKQotICAgICAgTVMubXNTcGFjZS5wb3N0QWxsb2MocmVmKTsKLSAgICBlbHNlCi0gICAgICBzdXBlci5wb3N0QWxsb2MocmVmLCB0eXBlUmVmLCBieXRlcywgYWxsb2NhdG9yKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGFsbG9jYXRvciBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggYSBzcGFjZQotICAgKiA8Y29kZT5zcGFjZTwvY29kZT4sIGZvciB0aGlzIHBsYW4gaW5zdGFuY2UuCi0gICAqCi0gICAqIEBwYXJhbSBzcGFjZSBUaGUgc3BhY2UgZm9yIHdoaWNoIHRoZSBhbGxvY2F0b3IgaW5zdGFuY2UgaXMgZGVzaXJlZC4KLSAgICogQHJldHVybiBUaGUgYWxsb2NhdG9yIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBsYW4gaW5zdGFuY2UKLSAgICogd2hpY2ggaXMgYWxsb2NhdGluZyBpbnRvIDxjb2RlPnNwYWNlPC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICogaWYgbm8gYXBwcm9wcmlhdGUgYWxsb2NhdG9yIGNhbiBiZSBlc3RhYmxpc2hlZC4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgQWxsb2NhdG9yIGdldEFsbG9jYXRvckZyb21TcGFjZShTcGFjZSBzcGFjZSkgewotICAgIGlmIChzcGFjZSA9PSBNUy5tc1NwYWNlKSByZXR1cm4gbXM7Ci0gICAgcmV0dXJuIHN1cGVyLmdldEFsbG9jYXRvckZyb21TcGFjZShzcGFjZSk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIENvbGxlY3Rpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSBwZXItbXV0YXRvciBjb2xsZWN0aW9uIHBoYXNlLgotICAgKgotICAgKiBAcGFyYW0gcGhhc2VJZCBUaGUgY29sbGVjdGlvbiBwaGFzZSB0byBwZXJmb3JtCi0gICAqIEBwYXJhbSBwcmltYXJ5IFBlcmZvcm0gYW55IHNpbmdsZS10aHJlYWRlZCBhY3Rpdml0aWVzIHVzaW5nIHRoaXMgdGhyZWFkLgotICAgKi8KLSAgQElubGluZQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgY29sbGVjdGlvblBoYXNlKHNob3J0IHBoYXNlSWQsIGJvb2xlYW4gcHJpbWFyeSkgewotICAgIGlmIChwaGFzZUlkID09IE1TLlBSRVBBUkUpIHsKLSAgICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KTsKLSAgICAgIG1zLnByZXBhcmUoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBNUy5SRUxFQVNFKSB7Ci0gICAgICBtcy5yZWxlYXNlKCk7Ci0gICAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQsIHByaW1hcnkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZsdXNoIG11dGF0b3IgY29udGV4dCwgaW4gcmVzcG9uc2UgdG8gYSByZXF1ZXN0TXV0YXRvckZsdXNoLgotICAgKiBBbHNvIGNhbGxlZCBieSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBkZWluaXRNdXRhdG9yLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGZsdXNoKCkgewotICAgIHN1cGVyLmZsdXNoKCk7Ci0gICAgbXMuZmx1c2goKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL21hcmtzd2VlcC9NU1RyYWNlTG9jYWwuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9tYXJrc3dlZXAvTVNUcmFjZUxvY2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNjJiMGIuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL21hcmtzd2VlcC9NU1RyYWNlTG9jYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5tYXJrc3dlZXA7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYWNlTG9jYWw7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5UcmFjZTsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5IZWFkZXJCeXRlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZGVxdWUuT2JqZWN0UmVmZXJlbmNlRGVxdWU7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSB0aHJlYWQtbG9jYWwgZnVuY3Rpb25hbGl0eSBmb3IgYSB0cmFuc2l0aXZlCi0gKiBjbG9zdXJlIG92ZXIgYSBtYXJrLXN3ZWVwIHNwYWNlLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgZmluYWwgY2xhc3MgTVNUcmFjZUxvY2FsIGV4dGVuZHMgVHJhY2VMb2NhbCB7Ci0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIEluc3RhbmNlIGZpZWxkcwotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBPYmplY3RSZWZlcmVuY2VEZXF1ZSBtb2RCdWZmZXI7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqLwotICBwdWJsaWMgTVNUcmFjZUxvY2FsKFRyYWNlIHRyYWNlLCBPYmplY3RSZWZlcmVuY2VEZXF1ZSBtb2RCdWZmZXIpIHsKLSAgICBzdXBlcihNUy5TQ0FOX01BUkssIHRyYWNlKTsKLSAgICB0aGlzLm1vZEJ1ZmZlciA9IG1vZEJ1ZmZlcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogRXh0ZXJuYWxseSB2aXNpYmxlIE9iamVjdCBwcm9jZXNzaW5nIGFuZCB0cmFjaW5nCi0gICAqLwotCi0gIC8qKgotICAgKiBJcyB0aGUgc3BlY2lmaWVkIG9iamVjdCBsaXZlPwotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QuCi0gICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBsaXZlLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGlzTGl2ZShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKG9iamVjdC5pc051bGwoKSkgcmV0dXJuIGZhbHNlOwotICAgIGlmIChTcGFjZS5pc0luU3BhY2UoTVMuTUFSS19TV0VFUCwgb2JqZWN0KSkgewotICAgICAgcmV0dXJuIE1TLm1zU3BhY2UuaXNMaXZlKG9iamVjdCk7Ci0gICAgfQotICAgIHJldHVybiBzdXBlci5pc0xpdmUob2JqZWN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBpcyB0aGUgY29yZSBtZXRob2QgZHVyaW5nIHRoZSB0cmFjZSBvZiB0aGUgb2JqZWN0IGdyYXBoLgotICAgKiBUaGUgcm9sZSBvZiB0aGlzIG1ldGhvZCBpcyB0bzoKLSAgICoKLSAgICogMS4gRW5zdXJlIHRoZSB0cmFjZWQgb2JqZWN0IGlzIG5vdCBjb2xsZWN0ZWQuCi0gICAqIDIuIElmIHRoaXMgaXMgdGhlIGZpcnN0IHZpc2l0IHRvIHRoZSBvYmplY3QgZW5xdWV1ZSBpdCB0byBiZSBzY2FubmVkLgotICAgKiAzLiBSZXR1cm4gdGhlIGZvcndhcmRlZCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdC4KLSAgICoKLSAgICogSW4gdGhpcyBpbnN0YW5jZSwgd2UgcmVmZXIgb2JqZWN0cyBpbiB0aGUgbWFyay1zd2VlcCBzcGFjZSB0byB0aGUKLSAgICogbXNTcGFjZSBmb3IgdHJhY2luZywgYW5kIGRlZmVyIHRvIHRoZSBzdXBlcmNsYXNzIGZvciBhbGwgb3RoZXJzLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgdHJhY2VkLgotICAgKiBAcmV0dXJuIFRoZSBuZXcgcmVmZXJlbmNlIHRvIHRoZSBzYW1lIG9iamVjdCBpbnN0YW5jZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBPYmplY3RSZWZlcmVuY2UgdHJhY2VPYmplY3QoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmIChvYmplY3QuaXNOdWxsKCkpIHJldHVybiBvYmplY3Q7Ci0gICAgaWYgKFNwYWNlLmlzSW5TcGFjZShNUy5NQVJLX1NXRUVQLCBvYmplY3QpKQotICAgICAgcmV0dXJuIE1TLm1zU3BhY2UudHJhY2VPYmplY3QodGhpcywgb2JqZWN0KTsKLSAgICByZXR1cm4gc3VwZXIudHJhY2VPYmplY3Qob2JqZWN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBQcm9jZXNzIGFueSByZW1lbWJlcmVkIHNldCBlbnRyaWVzLiAgVGhpcyBtZWFucyBlbnVtZXJhdGluZyB0aGUKLSAgICogbW9kIGJ1ZmZlciBhbmQgZm9yIGVhY2ggZW50cnksIG1hcmtpbmcgdGhlIG9iamVjdCBhcyB1bmxvZ2dlZAotICAgKiAod2UgZG9uJ3QgZW5xdWV1ZSBmb3Igc2Nhbm5pbmcgc2luY2Ugd2UncmUgZG9pbmcgYSBmdWxsIGhlYXAgR0MpLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1JlbWVtYmVyZWRTZXRzKCkgewotICAgIGlmIChtb2RCdWZmZXIgIT0gbnVsbCkgewotICAgICAgbG9nTWVzc2FnZSg1LCAiY2xlYXJpbmcgbW9kQnVmZmVyIik7Ci0gICAgICB3aGlsZSAoIW1vZEJ1ZmZlci5pc0VtcHR5KCkpIHsKLSAgICAgICAgT2JqZWN0UmVmZXJlbmNlIHNyYyA9IG1vZEJ1ZmZlci5wb3AoKTsKLSAgICAgICAgSGVhZGVyQnl0ZS5tYXJrQXNVbmxvZ2dlZChzcmMpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL25vZ2MvTm9HQy5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL25vZ2MvTm9HQy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTNiNzRmLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9ub2djL05vR0MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLm5vZ2M7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLio7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LkltbW9ydGFsU3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5oZWFwLlZNUmVxdWVzdDsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBnbG9iYWwgc3RhdGUgb2YgYSBhIHNpbXBsZSBhbGxvY2F0b3IKLSAqIHdpdGhvdXQgYSBjb2xsZWN0b3IuCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBjbGFzcyBOb0dDIGV4dGVuZHMgUGxhbiB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIENsYXNzIHZhcmlhYmxlcwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBJbW1vcnRhbFNwYWNlIG5vR0NTcGFjZSA9IG5ldyBJbW1vcnRhbFNwYWNlKCJkZWZhdWx0IiwgREVGQVVMVF9QT0xMX0ZSRVFVRU5DWSwgVk1SZXF1ZXN0LmNyZWF0ZSgpKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9HQyA9IG5vR0NTcGFjZS5nZXREZXNjcmlwdG9yKCk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogSW5zdGFuY2UgdmFyaWFibGVzCi0gICAqLwotICBwdWJsaWMgZmluYWwgVHJhY2UgdHJhY2UgPSBuZXcgVHJhY2UobWV0YURhdGFTcGFjZSk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogQ29sbGVjdGlvbgotICAgKi8KLQotICAvKioKLSAgICogUGVyZm9ybSBhIChnbG9iYWwpIGNvbGxlY3Rpb24gcGhhc2UuCi0gICAqCi0gICAqIEBwYXJhbSBwaGFzZUlkIENvbGxlY3Rpb24gcGhhc2UKLSAgICovCi0gIEBJbmxpbmUKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGNvbGxlY3Rpb25QaGFzZShzaG9ydCBwaGFzZUlkKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZmFsc2UpOwotICAgIC8qCi0gICAgaWYgKHBoYXNlSWQgPT0gUFJFUEFSRSkgewotICAgIH0KLSAgICBpZiAocGhhc2VJZCA9PSBDTE9TVVJFKSB7Ci0gICAgfQotICAgIGlmIChwaGFzZUlkID09IFJFTEVBU0UpIHsKLSAgICB9Ci0gICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQpOwotICAgICovCi0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogQWNjb3VudGluZwotICAgKi8KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcGFnZXMgcmVzZXJ2ZWQgZm9yIHVzZSBnaXZlbiB0aGUgcGVuZGluZwotICAgKiBhbGxvY2F0aW9uLiAgVGhlIHN1cGVyY2xhc3MgYWNjb3VudHMgZm9yIGl0cyBzcGFjZXMsIHdlIGp1c3QKLSAgICogYXVnbWVudCB0aGlzIHdpdGggdGhlIGRlZmF1bHQgc3BhY2UncyBjb250cmlidXRpb24uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBwYWdlcyByZXNlcnZlZCBnaXZlbiB0aGUgcGVuZGluZwotICAgKiBhbGxvY2F0aW9uLCBleGNsdWRpbmcgc3BhY2UgcmVzZXJ2ZWQgZm9yIGNvcHlpbmcuCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBnZXRQYWdlc1VzZWQoKSB7Ci0gICAgcmV0dXJuIChub0dDU3BhY2UucmVzZXJ2ZWRQYWdlcygpICsgc3VwZXIuZ2V0UGFnZXNVc2VkKCkpOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogTWlzY2VsbGFuZW91cwotICAgKi8KLQotICAvKioKLSAgICogUmVnaXN0ZXIgc3BlY2lhbGl6ZWQgbWV0aG9kcy4KLSAgICovCi0gIEBJbnRlcnJ1cHRpYmxlCi0gIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlclNwZWNpYWxpemVkTWV0aG9kcygpIHsKLSAgICBzdXBlci5yZWdpc3RlclNwZWNpYWxpemVkTWV0aG9kcygpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vbm9nYy9Ob0dDQ29sbGVjdG9yLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vbm9nYy9Ob0dDQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmM2Y2NzQuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL25vZ2MvTm9HQ0NvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLm5vZ2M7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLio7Ci1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgPGk+cGVyLWNvbGxlY3RvciB0aHJlYWQ8L2k+IGJlaGF2aW9yIGFuZCBzdGF0ZQotICogZm9yIHRoZSA8aT5Ob0dDPC9pPiBwbGFuLCB3aGljaCBzaW1wbHkgYWxsb2NhdGVzICh3aXRob3V0IGV2ZXIgY29sbGVjdGluZwotICogdW50aWwgdGhlIGF2YWlsYWJsZSBzcGFjZSBpcyBleGhhdXN0ZWQuPHA+Ci0gKgotICogU3BlY2lmaWNhbGx5LCB0aGlzIGNsYXNzIDxpPndvdWxkPC9pPiBkZWZpbmUgPGk+Tm9HQzwvaT4gY29sbGVjdGlvbiB0aW1lIHNlbWFudGljcywKLSAqIGhvd2V2ZXIsIHNpbmNlIHRoaXMgcGxhbiBuZXZlciBjb2xsZWN0cywgdGhpcyBjbGFzcyBjb25zaXN0cyBvbmx5IG9mIHN0dWJzIHdoaWNoCi0gKiBtYXkgYmUgdXNlZnVsIGFzIGEgdGVtcGxhdGUgZm9yIGltcGxlbWVudGluZyBhIGJhc2ljIGNvbGxlY3Rvci4KLSAqCi0gKiBAc2VlIE5vR0MKLSAqIEBzZWUgTm9HQ011dGF0b3IKLSAqIEBzZWUgQ29sbGVjdG9yQ29udGV4dAotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgY2xhc3MgTm9HQ0NvbGxlY3RvciBleHRlbmRzIENvbGxlY3RvckNvbnRleHQgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogSW5zdGFuY2UgZmllbGRzCi0gICAqLwotICBwcml2YXRlIGZpbmFsIE5vR0NUcmFjZUxvY2FsIHRyYWNlID0gbmV3IE5vR0NUcmFjZUxvY2FsKGdsb2JhbCgpLnRyYWNlKTsKLSAgcHJvdGVjdGVkIGZpbmFsIFRyYWNlTG9jYWwgY3VycmVudFRyYWNlID0gdHJhY2U7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBDb2xsZWN0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBQZXJmb3JtIGEgZ2FyYmFnZSBjb2xsZWN0aW9uCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGZpbmFsIHZvaWQgY29sbGVjdCgpIHsKLSAgICBWTS5hc3NlcnRpb25zLmZhaWwoIkdDIFRyaWdnZXJlZCBpbiBOb0dDIFBsYW4uIElzIC1YOmdjOmlnbm9yZVN5c3RlbUdDPXRydWUgPyIpOwotICB9Ci0KLSAgLyoqIFBlcmZvcm0gc29tZSBjb25jdXJyZW50IGdhcmJhZ2UgY29sbGVjdGlvbiAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGZpbmFsIHZvaWQgY29uY3VycmVudENvbGxlY3QoKSB7Ci0gICAgVk0uYXNzZXJ0aW9ucy5mYWlsKCJDb25jdXJyZW50IEdDIFRyaWdnZXJlZCBpbiBOb0dDIFBsYW4uIik7Ci0gIH0KLQotICAvKioKLSAgICogUGVyZm9ybSBhIHBlci1jb2xsZWN0b3IgY29sbGVjdGlvbiBwaGFzZS4KLSAgICoKLSAgICogQHBhcmFtIHBoYXNlSWQgVGhlIGNvbGxlY3Rpb24gcGhhc2UgdG8gcGVyZm9ybQotICAgKiBAcGFyYW0gcHJpbWFyeSBwZXJmb3JtIGFueSBzaW5nbGUtdGhyZWFkZWQgbG9jYWwgYWN0aXZpdGllcy4KLSAgICovCi0gIEBJbmxpbmUKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGNvbGxlY3Rpb25QaGFzZShzaG9ydCBwaGFzZUlkLCBib29sZWFuIHByaW1hcnkpIHsKLSAgICBWTS5hc3NlcnRpb25zLmZhaWwoIkdDIFRyaWdnZXJlZCBpbiBOb0dDIFBsYW4uIik7Ci0gICAgLyoKLSAgICBpZiAocGhhc2VJZCA9PSBOb0dDLlBSRVBBUkUpIHsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBOb0dDLkNMT1NVUkUpIHsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBOb0dDLlJFTEVBU0UpIHsKLSAgICB9Ci0KLSAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gICAgKi8KLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIHNvbWUgY29uY3VycmVudCBjb2xsZWN0aW9uIHdvcmsuCi0gICAqCi0gICAqIEBwYXJhbSBwaGFzZUlkIFRoZSB1bmlxdWUgcGhhc2UgaWRlbnRpZmllcgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGNvbmN1cnJlbnRDb2xsZWN0aW9uUGhhc2Uoc2hvcnQgcGhhc2VJZCkgewotICAgIFZNLmFzc2VydGlvbnMuZmFpbCgiR0MgVHJpZ2dlcmVkIGluIE5vR0MgUGxhbi4iKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogTWlzY2VsbGFuZW91cwotICAgKi8KLQotICAvKiogQHJldHVybiBUaGUgYWN0aXZlIGdsb2JhbCBwbGFuIGFzIGEgPGNvZGU+Tm9HQzwvY29kZT4gaW5zdGFuY2UuICovCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSBzdGF0aWMgTm9HQyBnbG9iYWwoKSB7Ci0gICAgcmV0dXJuIChOb0dDKSBWTS5hY3RpdmVQbGFuLmdsb2JhbCgpOwotICB9Ci0KLSAgLyoqIEByZXR1cm4gVGhlIGN1cnJlbnQgdHJhY2UgaW5zdGFuY2UuICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZmluYWwgVHJhY2VMb2NhbCBnZXRDdXJyZW50VHJhY2UoKSB7Ci0gICAgcmV0dXJuIGN1cnJlbnRUcmFjZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL25vZ2MvTm9HQ0NvbnN0cmFpbnRzLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vbm9nYy9Ob0dDQ29uc3RyYWludHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMwMjkxNi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vbm9nYy9Ob0dDQ29uc3RyYWludHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLm5vZ2M7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlBsYW5Db25zdHJhaW50czsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgYW5kIGl0cyBzdWJjbGFzc2VzIGNvbW11bmljYXRlIHRvIHRoZSBob3N0IFZNL1J1bnRpbWUKLSAqIGFueSBmZWF0dXJlcyBvZiB0aGUgc2VsZWN0ZWQgcGxhbiB0aGF0IGl0IG5lZWRzIHRvIGtub3cuICBUaGlzIGlzCi0gKiBzZXBhcmF0ZSBmcm9tIHRoZSBtYWluIFBsYW4vUGxhbkxvY2FsIGNsYXNzIGluIG9yZGVyIHRvIGJ5cGFzcyBhbnkKLSAqIGlzc3VlcyB3aXRoIG9yZGVyaW5nIG9mIHN0YXRpYyBpbml0aWFsaXphdGlvbi4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIE5vR0NDb25zdHJhaW50cyBleHRlbmRzIFBsYW5Db25zdHJhaW50cyB7Ci0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IGdjSGVhZGVyQml0cygpIHsgcmV0dXJuIDA7IH0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgZ2NIZWFkZXJXb3JkcygpIHsgcmV0dXJuIDA7IH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9ub2djL05vR0NNdXRhdG9yLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vbm9nYy9Ob0dDTXV0YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTY1OGNlLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9ub2djL05vR0NNdXRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4ubm9nYzsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uTXV0YXRvckNvbnRleHQ7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LkltbW9ydGFsTG9jYWw7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LlNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuYWxsb2MuQWxsb2NhdG9yOwotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyA8aT5wZXItbXV0YXRvciB0aHJlYWQ8L2k+IGJlaGF2aW9yIGFuZCBzdGF0ZQotICogZm9yIHRoZSA8aT5Ob0dDPC9pPiBwbGFuLCB3aGljaCBzaW1wbHkgYWxsb2NhdGVzICh3aXRob3V0IGV2ZXIgY29sbGVjdGluZwotICogdW50aWwgdGhlIGF2YWlsYWJsZSBzcGFjZSBpcyBleGhhdXN0ZWQuPHA+Ci0gKgotICogU3BlY2lmaWNhbGx5LCB0aGlzIGNsYXNzIGRlZmluZXMgPGk+Tm9HQzwvaT4gbXV0YXRvci10aW1lIGFsbG9jYXRpb24KLSAqIHRocm91Z2ggYSBidW1wIHBvaW50ZXIgKDxjb2RlPmRlZjwvY29kZT4pIGFuZCBpbmNsdWRlcyBzdHVicyBmb3IKLSAqIHBlci1tdXRhdG9yIHRocmVhZCBjb2xsZWN0aW9uIHNlbWFudGljcyAoc2luY2UgdGhlcmUgaXMgbm8gY29sbGVjdGlvbgotICogaW4gdGhpcyBwbGFuLCB0aGVzZSByZW1haW4ganVzdCBzdHVicykuCi0gKgotICogQHNlZSBOb0dDCi0gKiBAc2VlIE5vR0NDb2xsZWN0b3IKLSAqIEBzZWUgb3JnLm1tdGsucGxhbi5TdG9wVGhlV29ybGRNdXRhdG9yCi0gKiBAc2VlIG9yZy5tbXRrLnBsYW4uTXV0YXRvckNvbnRleHQKLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIE5vR0NNdXRhdG9yIGV4dGVuZHMgTXV0YXRvckNvbnRleHQgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogSW5zdGFuY2UgZmllbGRzCi0gICAqLwotICBwcml2YXRlIGZpbmFsIEltbW9ydGFsTG9jYWwgbm9nYyA9IG5ldyBJbW1vcnRhbExvY2FsKE5vR0Mubm9HQ1NwYWNlKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIE11dGF0b3ItdGltZSBhbGxvY2F0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFuIG9iamVjdC4KLSAgICoKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBvYmplY3QuCi0gICAqIEBwYXJhbSBhbGlnbiBSZXF1aXJlZCBhbGlnbm1lbnQgZm9yIHRoZSBvYmplY3QuCi0gICAqIEBwYXJhbSBvZmZzZXQgT2Zmc2V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYWxpZ25tZW50LgotICAgKiBAcGFyYW0gYWxsb2NhdG9yIFRoZSBhbGxvY2F0b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVxdWVzdC4KLSAgICogQHBhcmFtIHNpdGUgQWxsb2NhdGlvbiBzaXRlCi0gICAqIEByZXR1cm4gVGhlIGFkZHJlc3Mgb2YgdGhlIG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkuCi0gICAqLwotICBASW5saW5lCi0gIEBPdmVycmlkZQotICBwdWJsaWMgQWRkcmVzcyBhbGxvYyhpbnQgYnl0ZXMsIGludCBhbGlnbiwgaW50IG9mZnNldCwgaW50IGFsbG9jYXRvciwgaW50IHNpdGUpIHsKLSAgICBpZiAoYWxsb2NhdG9yID09IE5vR0MuQUxMT0NfREVGQVVMVCkgewotICAgICAgcmV0dXJuIG5vZ2MuYWxsb2MoYnl0ZXMsIGFsaWduLCBvZmZzZXQpOwotICAgIH0KLSAgICByZXR1cm4gc3VwZXIuYWxsb2MoYnl0ZXMsIGFsaWduLCBvZmZzZXQsIGFsbG9jYXRvciwgc2l0ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUGVyZm9ybSBwb3N0LWFsbG9jYXRpb24gYWN0aW9ucy4gIEZvciBtYW55IGFsbG9jYXRvcnMgbm9uZSBhcmUKLSAgICogcmVxdWlyZWQuCi0gICAqCi0gICAqIEBwYXJhbSByZWYgVGhlIG5ld2x5IGFsbG9jYXRlZCBvYmplY3QKLSAgICogQHBhcmFtIHR5cGVSZWYgdGhlIHR5cGUgcmVmZXJlbmNlIGZvciB0aGUgaW5zdGFuY2UgYmVpbmcgY3JlYXRlZAotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIHNpemUgb2YgdGhlIHNwYWNlIHRvIGJlIGFsbG9jYXRlZCAoaW4gYnl0ZXMpCi0gICAqIEBwYXJhbSBhbGxvY2F0b3IgVGhlIGFsbG9jYXRvciBudW1iZXIgdG8gYmUgdXNlZCBmb3IgdGhpcyBhbGxvY2F0aW9uCi0gICAqLwotICBASW5saW5lCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBwb3N0QWxsb2MoT2JqZWN0UmVmZXJlbmNlIHJlZiwgT2JqZWN0UmVmZXJlbmNlIHR5cGVSZWYsCi0gICAgICBpbnQgYnl0ZXMsIGludCBhbGxvY2F0b3IpIHsKLSAgICBpZiAoYWxsb2NhdG9yICE9IE5vR0MuQUxMT0NfREVGQVVMVCkgewotICAgICAgc3VwZXIucG9zdEFsbG9jKHJlZiwgdHlwZVJlZiwgYnl0ZXMsIGFsbG9jYXRvcik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgYWxsb2NhdG9yIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBhIHNwYWNlCi0gICAqIDxjb2RlPnNwYWNlPC9jb2RlPiwgZm9yIHRoaXMgcGxhbiBpbnN0YW5jZS4KLSAgICoKLSAgICogQHBhcmFtIHNwYWNlIFRoZSBzcGFjZSBmb3Igd2hpY2ggdGhlIGFsbG9jYXRvciBpbnN0YW5jZSBpcyBkZXNpcmVkLgotICAgKiBAcmV0dXJuIFRoZSBhbGxvY2F0b3IgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGxhbiBpbnN0YW5jZQotICAgKiB3aGljaCBpcyBhbGxvY2F0aW5nIGludG8gPGNvZGU+c3BhY2U8L2NvZGU+LCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgKiBpZiBubyBhcHByb3ByaWF0ZSBhbGxvY2F0b3IgY2FuIGJlIGVzdGFibGlzaGVkLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBBbGxvY2F0b3IgZ2V0QWxsb2NhdG9yRnJvbVNwYWNlKFNwYWNlIHNwYWNlKSB7Ci0gICAgaWYgKHNwYWNlID09IE5vR0Mubm9HQ1NwYWNlKSByZXR1cm4gbm9nYzsKLSAgICByZXR1cm4gc3VwZXIuZ2V0QWxsb2NhdG9yRnJvbVNwYWNlKHNwYWNlKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogQ29sbGVjdGlvbgotICAgKi8KLQotICAvKioKLSAgICogUGVyZm9ybSBhIHBlci1tdXRhdG9yIGNvbGxlY3Rpb24gcGhhc2UuCi0gICAqCi0gICAqIEBwYXJhbSBwaGFzZUlkIFRoZSBjb2xsZWN0aW9uIHBoYXNlIHRvIHBlcmZvcm0KLSAgICogQHBhcmFtIHByaW1hcnkgcGVyZm9ybSBhbnkgc2luZ2xlLXRocmVhZGVkIGxvY2FsIGFjdGl2aXRpZXMuCi0gICAqLwotICBASW5saW5lCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZmluYWwgdm9pZCBjb2xsZWN0aW9uUGhhc2Uoc2hvcnQgcGhhc2VJZCwgYm9vbGVhbiBwcmltYXJ5KSB7Ci0gICAgVk0uYXNzZXJ0aW9ucy5mYWlsKCJHQyBUcmlnZ2VyZWQgaW4gTm9HQyBQbGFuLiIpOwotICAgIC8qCi0gICAgIGlmIChwaGFzZUlkID09IE5vR0MuUFJFUEFSRSkgewotICAgICB9Ci0KLSAgICAgaWYgKHBoYXNlSWQgPT0gTm9HQy5SRUxFQVNFKSB7Ci0gICAgIH0KLSAgICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQsIHByaW1hcnkpOwotICAgICAqLwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vbm9nYy9Ob0dDVHJhY2VMb2NhbC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL25vZ2MvTm9HQ1RyYWNlTG9jYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM1YjFkNC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vbm9nYy9Ob0dDVHJhY2VMb2NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4ubm9nYzsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhY2VMb2NhbDsKLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYWNlOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIHRocmVhZC1sb2NhbCBjb3JlIGZ1bmN0aW9uYWxpdHkgZm9yIGEgdHJhbnNpdGl2ZQotICogY2xvc3VyZSBvdmVyIHRoZSBoZWFwIGdyYXBoLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgZmluYWwgY2xhc3MgTm9HQ1RyYWNlTG9jYWwgZXh0ZW5kcyBUcmFjZUxvY2FsIHsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICovCi0gIHB1YmxpYyBOb0dDVHJhY2VMb2NhbChUcmFjZSB0cmFjZSkgewotICAgIHN1cGVyKHRyYWNlKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogRXh0ZXJuYWxseSB2aXNpYmxlIE9iamVjdCBwcm9jZXNzaW5nIGFuZCB0cmFjaW5nCi0gICAqLwotCi0gIC8qKgotICAgKiBJcyB0aGUgc3BlY2lmaWVkIG9iamVjdCBsaXZlPwotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QuCi0gICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBsaXZlLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGlzTGl2ZShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKG9iamVjdC5pc051bGwoKSkgcmV0dXJuIGZhbHNlOwotICAgIGlmIChTcGFjZS5pc0luU3BhY2UoTm9HQy5OT0dDLCBvYmplY3QpKSB7Ci0gICAgICByZXR1cm4gTm9HQy5ub0dDU3BhY2UuaXNMaXZlKG9iamVjdCk7Ci0gICAgfQotICAgIHJldHVybiBzdXBlci5pc0xpdmUob2JqZWN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBpcyB0aGUgY29yZSBtZXRob2QgZHVyaW5nIHRoZSB0cmFjZSBvZiB0aGUgb2JqZWN0IGdyYXBoLgotICAgKiBUaGUgcm9sZSBvZiB0aGlzIG1ldGhvZCBpcyB0bzoKLSAgICoKLSAgICogMS4gRW5zdXJlIHRoZSB0cmFjZWQgb2JqZWN0IGlzIG5vdCBjb2xsZWN0ZWQuCi0gICAqIDIuIElmIHRoaXMgaXMgdGhlIGZpcnN0IHZpc2l0IHRvIHRoZSBvYmplY3QgZW5xdWV1ZSBpdCB0byBiZSBzY2FubmVkLgotICAgKiAzLiBSZXR1cm4gdGhlIGZvcndhcmRlZCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdC4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIHRyYWNlZC4KLSAgICogQHJldHVybiBUaGUgbmV3IHJlZmVyZW5jZSB0byB0aGUgc2FtZSBvYmplY3QgaW5zdGFuY2UuCi0gICAqLwotICBASW5saW5lCi0gIEBPdmVycmlkZQotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlIHRyYWNlT2JqZWN0KE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAob2JqZWN0LmlzTnVsbCgpKSByZXR1cm4gb2JqZWN0OwotICAgIGlmIChTcGFjZS5pc0luU3BhY2UoTm9HQy5OT0dDLCBvYmplY3QpKQotICAgICAgcmV0dXJuIE5vR0Mubm9HQ1NwYWNlLnRyYWNlT2JqZWN0KHRoaXMsIG9iamVjdCk7Ci0gICAgcmV0dXJuIHN1cGVyLnRyYWNlT2JqZWN0KG9iamVjdCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9wb2lzb25lZC9Qb2lzb25lZC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3BvaXNvbmVkL1BvaXNvbmVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNjFjZDYuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3BvaXNvbmVkL1BvaXNvbmVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5wb2lzb25lZDsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4ubWFya3N3ZWVwLk1TOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC5BZGRyZXNzOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuT2JqZWN0UmVmZXJlbmNlOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuV29yZDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBwb2lzb25lZCBjb2xsZWN0b3IsIHRoYXQgaXMgZXNzZW50aWFsbHkgYSB0ZXN0Ci0gKiBjYXNlIGZvciByZWFkIGFuZCB3cml0ZSBiYXJyaWVycyBpbiB0aGUgVk0uCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBjbGFzcyBQb2lzb25lZCBleHRlbmRzIE1TIHsKLSAgLyoqCi0gICAqIFBlcmZvcm0gYW55IHJlcXVpcmVkIHdyaXRlIGJhcnJpZXIgYWN0aW9uIHdoZW4gaW5zdGFsbGluZyBhbiBvYmplY3QgcmVmZXJlbmNlCi0gICAqIGEgYm9vdCB0aW1lLgotICAgKgotICAgKiBAcGFyYW0gcmVmZXJlbmNlIHRoZSByZWZlcmVuY2UgdmFsdWUgdGhhdCBpcyB0byBiZSBzdG9yZWQKLSAgICogQHJldHVybiBUaGUgcmF3IHZhbHVlIHRvIGJlCi0gICAqLwotICBwdWJsaWMgV29yZCBib290VGltZVdyaXRlQmFycmllcihXb3JkIHJlZmVyZW5jZSkgewotICAgIHJldHVybiByZWZlcmVuY2Uub3IoV29yZC5vbmUoKSk7Ci0gIH0KLQotICAvKioKLSAgICogUG9pc29uIGEgcmVmZXJlbmNlIHZhbHVlLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIFdvcmQgcG9pc29uKE9iamVjdFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKLSAgICByZXR1cm4gcmVmZXJlbmNlLnRvQWRkcmVzcygpLnRvV29yZCgpLm9yKFdvcmQub25lKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIERlUG9pc29uIGEgcmVmZXJlbmNlIHZhbHVlLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIE9iamVjdFJlZmVyZW5jZSBkZXBvaXNvbihXb3JkIHZhbHVlKSB7Ci0gICAgcmV0dXJuIHZhbHVlLmFuZChXb3JkLm9uZSgpLm5vdCgpKS50b0FkZHJlc3MoKS50b09iamVjdFJlZmVyZW5jZSgpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogSW50ZXJuYWwgcmVhZC93cml0ZSBiYXJyaWVycy4KLSAgICovCi0KLSAgLyoqCi0gICAqIFN0b3JlIGFuIG9iamVjdCByZWZlcmVuY2UKLSAgICoKLSAgICogQHBhcmFtIHNsb3QgVGhlIGxvY2F0aW9uIG9mIHRoZSByZWZlcmVuY2UKLSAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBzdG9yZQotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgdm9pZCBzdG9yZU9iamVjdFJlZmVyZW5jZShBZGRyZXNzIHNsb3QsIE9iamVjdFJlZmVyZW5jZSB2YWx1ZSkgewotICAgIHNsb3Quc3RvcmUocG9pc29uKHZhbHVlKSk7Ci0gIH0KLQotICAvKioKLSAgICogTG9hZCBhbiBvYmplY3QgcmVmZXJlbmNlCi0gICAqCi0gICAqIEBwYXJhbSBzbG90IFRoZSBsb2NhdGlvbiBvZiB0aGUgcmVmZXJlbmNlCi0gICAqIEByZXR1cm4gdGhlIG9iamVjdCByZWZlcmVuY2UgbG9hZGVkIGZyb20gc2xvdAotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlIGxvYWRPYmplY3RSZWZlcmVuY2UoQWRkcmVzcyBzbG90KSB7Ci0gICAgcmV0dXJuIGRlcG9pc29uKHNsb3QubG9hZFdvcmQoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9wb2lzb25lZC9Qb2lzb25lZENvbGxlY3Rvci5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3BvaXNvbmVkL1BvaXNvbmVkQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNTc2ZDcuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3BvaXNvbmVkL1BvaXNvbmVkQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5wb2lzb25lZDsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4ubWFya3N3ZWVwLk1TQ29sbGVjdG9yOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLlVuaW50ZXJydXB0aWJsZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBwb2lzb25lZCBjb2xsZWN0b3IsIHRoYXQgaXMgZXNzZW50aWFsbHkgYSB0ZXN0Ci0gKiBjYXNlIGZvciByZWFkIGFuZCB3cml0ZSBiYXJyaWVycyBpbiB0aGUgVk0uCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBjbGFzcyBQb2lzb25lZENvbGxlY3RvciBleHRlbmRzIE1TQ29sbGVjdG9yIHsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9wb2lzb25lZC9Qb2lzb25lZENvbnN0cmFpbnRzLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcG9pc29uZWQvUG9pc29uZWRDb25zdHJhaW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWQwMmU5Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9wb2lzb25lZC9Qb2lzb25lZENvbnN0cmFpbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5wb2lzb25lZDsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4ubWFya3N3ZWVwLk1TQ29uc3RyYWludHM7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBhbmQgaXRzIHN1YmNsYXNzZXMgY29tbXVuaWNhdGUgdG8gdGhlIGhvc3QgVk0vUnVudGltZQotICogYW55IGZlYXR1cmVzIG9mIHRoZSBzZWxlY3RlZCBwbGFuIHRoYXQgaXQgbmVlZHMgdG8ga25vdy4gIFRoaXMgaXMKLSAqIHNlcGFyYXRlIGZyb20gdGhlIG1haW4gUGxhbi9QbGFuTG9jYWwgY2xhc3MgaW4gb3JkZXIgdG8gYnlwYXNzIGFueQotICogaXNzdWVzIHdpdGggb3JkZXJpbmcgb2Ygc3RhdGljIGluaXRpYWxpemF0aW9uLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgY2xhc3MgUG9pc29uZWRDb25zdHJhaW50cyBleHRlbmRzIE1TQ29uc3RyYWludHMgewotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gbmVlZHNPYmplY3RSZWZlcmVuY2VXcml0ZUJhcnJpZXIoKSB7IHJldHVybiB0cnVlOyB9Ci0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBuZWVkc09iamVjdFJlZmVyZW5jZVJlYWRCYXJyaWVyKCkgeyByZXR1cm4gdHJ1ZTsgfQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gbmVlZHNPYmplY3RSZWZlcmVuY2VOb25IZWFwV3JpdGVCYXJyaWVyKCkgeyByZXR1cm4gZmFsc2U7IH0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIG5lZWRzT2JqZWN0UmVmZXJlbmNlTm9uSGVhcFJlYWRCYXJyaWVyKCkgeyByZXR1cm4gZmFsc2U7IH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9wb2lzb25lZC9Qb2lzb25lZE11dGF0b3IuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9wb2lzb25lZC9Qb2lzb25lZE11dGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhmZjhkNS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcG9pc29uZWQvUG9pc29uZWRNdXRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5wb2lzb25lZDsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4ubWFya3N3ZWVwLk1TTXV0YXRvcjsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuQWRkcmVzczsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLk9iamVjdFJlZmVyZW5jZTsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLldvcmQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgcG9pc29uZWQgY29sbGVjdG9yLCB0aGF0IGlzIGVzc2VudGlhbGx5IGEgdGVzdAotICogY2FzZSBmb3IgcmVhZCBhbmQgd3JpdGUgYmFycmllcnMgaW4gdGhlIFZNLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgY2xhc3MgUG9pc29uZWRNdXRhdG9yIGV4dGVuZHMgTVNNdXRhdG9yIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBXcml0ZSBhbmQgcmVhZCBiYXJyaWVycy4gQnkgZGVmYXVsdCBkbyBub3RoaW5nLCBvdmVycmlkZSBpZgotICAgKiBhcHByb3ByaWF0ZS4KLSAgICovCi0KLSAgLyoqCi0gICAqIEEgbmV3IHJlZmVyZW5jZSBpcyBhYm91dCB0byBiZSBjcmVhdGVkLiBUYWtlIGFwcHJvcHJpYXRlIHdyaXRlCi0gICAqIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogPGI+QnkgZGVmYXVsdCBkbyBub3RoaW5nLCBvdmVycmlkZSBpZiBhcHByb3ByaWF0ZS48L2I+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUgc3RvcmVkCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZQotICAgKiBzdG9yZWQuCi0gICAqIEBwYXJhbSB0Z3QgVGhlIHRhcmdldCBvZiB0aGUgbmV3IHJlZmVyZW5jZQotICAgKiBAcGFyYW0gbWV0YURhdGFBIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIHN0b3JlCi0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBzdG9yZSBvY2N1cnJlZAotICAgKi8KLSAgQElubGluZQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgb2JqZWN0UmVmZXJlbmNlV3JpdGUoT2JqZWN0UmVmZXJlbmNlIHNyYywgQWRkcmVzcyBzbG90LCBPYmplY3RSZWZlcmVuY2UgdGd0LCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKSB7Ci0gICAgVk0uYmFycmllcnMud29yZFdyaXRlKHNyYywgUG9pc29uZWQucG9pc29uKHRndCksIG1ldGFEYXRhQSwgbWV0YURhdGFCLCBtb2RlKTsKLSAgfQotCi0gIC8qKgotICAgKiBBdHRlbXB0IHRvIGF0b21pY2FsbHkgZXhjaGFuZ2UgdGhlIHZhbHVlIGluIHRoZSBnaXZlbiBzbG90Ci0gICAqIHdpdGggdGhlIHBhc3NlZCByZXBsYWNlbWVudCB2YWx1ZS4gSWYgYSBuZXcgcmVmZXJlbmNlIGlzCi0gICAqIGNyZWF0ZWQsIHdlIG11c3QgdGhlbiB0YWtlIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogPGI+QnkgZGVmYXVsdCBkbyBub3RoaW5nLCBvdmVycmlkZSBpZiBhcHByb3ByaWF0ZS48L2I+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUgc3RvcmVkCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZQotICAgKiBzdG9yZWQuCi0gICAqIEBwYXJhbSBvbGQgVGhlIG9sZCByZWZlcmVuY2UgdG8gYmUgc3dhcHBlZCBvdXQKLSAgICogQHBhcmFtIHRndCBUaGUgdGFyZ2V0IG9mIHRoZSBuZXcgcmVmZXJlbmNlCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbWV0YURhdGFCIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHN0b3JlIG9jY3VycmVkCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3dhcCB3YXMgc3VjY2Vzc2Z1bC4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBvYmplY3RSZWZlcmVuY2VUcnlDb21wYXJlQW5kU3dhcChPYmplY3RSZWZlcmVuY2Ugc3JjLCBBZGRyZXNzIHNsb3QsIE9iamVjdFJlZmVyZW5jZSBvbGQsIE9iamVjdFJlZmVyZW5jZSB0Z3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQgbWV0YURhdGFBLCBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpIHsKLSAgICByZXR1cm4gVk0uYmFycmllcnMud29yZFRyeUNvbXBhcmVBbmRTd2FwKHNyYywgUG9pc29uZWQucG9pc29uKG9sZCksIFBvaXNvbmVkLnBvaXNvbih0Z3QpLCBtZXRhRGF0YUEsIG1ldGFEYXRhQiwgbW9kZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBhIHJlZmVyZW5jZS4gVGFrZSBhcHByb3ByaWF0ZSByZWFkIGJhcnJpZXIgYWN0aW9uLCBhbmQKLSAgICogcmV0dXJuIHRoZSB2YWx1ZSB0aGF0IHdhcyByZWFkLjxwPiBUaGlzIGlzIGEgPGI+c3Vic3RpdHV0aW5nPGI+Ci0gICAqIGJhcnJpZXIuICBUaGUgY2FsbCB0byB0aGlzIGJhcnJpZXIgdGFrZXMgdGhlIHBsYWNlIG9mIGEgbG9hZC48cD4KLSAgICoKLSAgICogQHBhcmFtIHNyYyBUaGUgb2JqZWN0IHJlZmVyZW5jZSBob2xkaW5nIHRoZSBmaWVsZCBiZWluZyByZWFkLgotICAgKiBAcGFyYW0gc2xvdCBUaGUgYWRkcmVzcyBvZiB0aGUgc2xvdCBiZWluZyByZWFkLgotICAgKiBAcGFyYW0gbWV0YURhdGFBIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgbG9hZAotICAgKiBAcGFyYW0gbWV0YURhdGFCIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgbG9hZAotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgbG9hZCBvY2N1cnJlZAotICAgKiBAcmV0dXJuIFRoZSByZWZlcmVuY2UgdGhhdCB3YXMgcmVhZC4KLSAgICovCi0gIEBJbmxpbmUKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBPYmplY3RSZWZlcmVuY2Ugb2JqZWN0UmVmZXJlbmNlUmVhZChPYmplY3RSZWZlcmVuY2Ugc3JjLCBBZGRyZXNzIHNsb3QsIFdvcmQgbWV0YURhdGFBLCBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpIHsKLSAgICByZXR1cm4gUG9pc29uZWQuZGVwb2lzb24oVk0uYmFycmllcnMud29yZFJlYWQoc3JjLCBtZXRhRGF0YUEsIG1ldGFEYXRhQiwgbW9kZSkpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvUkNCYXNlLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvUkNCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MzczZTQuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3JlZmNvdW50L1JDQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLnJlZmNvdW50OwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5QaGFzZTsKLWltcG9ydCBvcmcubW10ay5wbGFuLlN0b3BUaGVXb3JsZDsKLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYWNlOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4ucmVmY291bnQuYmFja3VwdHJhY2UuQlRGcmVlTGFyZ2VPYmplY3RTd2VlcGVyOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4ucmVmY291bnQuYmFja3VwdHJhY2UuQlRTY2FuTGFyZ2VPYmplY3RTd2VlcGVyOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4ucmVmY291bnQuYmFja3VwdHJhY2UuQlRTd2VlcGVyOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5FeHBsaWNpdEZyZWVMaXN0U3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LkV4cGxpY2l0TGFyZ2VPYmplY3RTcGFjZTsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Mb2c7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5hbGxvYy5MaW5lYXJTY2FuOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZGVxdWUuU2hhcmVkRGVxdWU7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5oZWFwLlZNUmVxdWVzdDsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnMuT3B0aW9uczsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LnNhbml0eWNoZWNrZXIuU2FuaXR5Q2hlY2tlcjsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuT2JqZWN0UmVmZXJlbmNlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgZ2xvYmFsIHN0YXRlIG9mIGEgYSBzaW1wbGUgcmVmZXJlbmNlIGNvdW50aW5nIGNvbGxlY3Rvci4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIFJDQmFzZSBleHRlbmRzIFN0b3BUaGVXb3JsZCB7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgUFJPQ0VTU19PTERST09UQlVGRkVSICA9IFBoYXNlLmNyZWF0ZVNpbXBsZSgib2xkLXJvb3QiKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBQUk9DRVNTX05FV1JPT1RCVUZGRVIgID0gUGhhc2UuY3JlYXRlU2ltcGxlKCJuZXctcm9vdCIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IFBST0NFU1NfTU9EQlVGRkVSICAgICAgPSBQaGFzZS5jcmVhdGVTaW1wbGUoIm1vZHMiKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBQUk9DRVNTX0RFQ0JVRkZFUiAgICAgID0gUGhhc2UuY3JlYXRlU2ltcGxlKCJkZWNzIik7Ci0KLSAgLyoqIElzIGN5Y2xlIGNvbGxlY3Rpb24gZW5hYmxlZD8gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIENDX0VOQUJMRUQgICAgICAgICAgID0gdHJ1ZTsKLSAgLyoqIEZvcmNlIGZ1bGwgY3ljbGUgY29sbGVjdGlvbiBhdCBlYWNoIEdDPyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ0NfRk9SQ0VfRlVMTCAgICAgICAgPSBmYWxzZTsKLSAgLyoqIFVzZSBiYWNrdXAgdHJhY2luZyBmb3IgY3ljbGUgY29sbGVjdGlvbiAoY3VycmVudGx5IHRoZSBvbmx5IG9wdGlvbikgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIENDX0JBQ0tVUF9UUkFDRSAgICAgID0gdHJ1ZTsKLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcGVyZm9ybUN5Y2xlQ29sbGVjdGlvbjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBCVF9DTE9TVVJFICAgICAgICAgICAgID0gUGhhc2UuY3JlYXRlU2ltcGxlKCJjbG9zdXJlLWJ0Iik7Ci0KLSAgLy8gQ0hFQ0tTVFlMRTpPRkYKLQotICAvKioKLSAgICogUmVmZXJlbmNlIGNvdW50aW5nIHNwZWNpZmljIGNvbGxlY3Rpb24gc3RlcHMuCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIHNob3J0IHJlZkNvdW50Q29sbGVjdGlvblBoYXNlID0gUGhhc2UuY3JlYXRlQ29tcGxleCgicmVsZWFzZSIsIG51bGwsCi0gICAgICBQaGFzZS5zY2hlZHVsZUdsb2JhbCAgICAgKFBST0NFU1NfT0xEUk9PVEJVRkZFUiksCi0gICAgICBQaGFzZS5zY2hlZHVsZUNvbGxlY3RvciAgKFBST0NFU1NfT0xEUk9PVEJVRkZFUiksCi0gICAgICBQaGFzZS5zY2hlZHVsZUdsb2JhbCAgICAgKFBST0NFU1NfTkVXUk9PVEJVRkZFUiksCi0gICAgICBQaGFzZS5zY2hlZHVsZUNvbGxlY3RvciAgKFBST0NFU1NfTkVXUk9PVEJVRkZFUiksCi0gICAgICBQaGFzZS5zY2hlZHVsZU11dGF0b3IgICAgKFBST0NFU1NfREVDQlVGRkVSKSwKLSAgICAgIFBoYXNlLnNjaGVkdWxlR2xvYmFsICAgICAoUFJPQ0VTU19ERUNCVUZGRVIpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVDb2xsZWN0b3IgIChQUk9DRVNTX0RFQ0JVRkZFUiksCi0gICAgICBQaGFzZS5zY2hlZHVsZUdsb2JhbCAgICAgKEJUX0NMT1NVUkUpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVDb2xsZWN0b3IgIChCVF9DTE9TVVJFKSk7Ci0KLSAgLyoqCi0gICAqIFBlcmZvcm0gdGhlIGluaXRpYWwgZGV0ZXJtaW5hdGlvbiBvZiBsaXZlbmVzcyBmcm9tIHRoZSByb290cy4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgc2hvcnQgcm9vdENsb3N1cmVQaGFzZSA9IFBoYXNlLmNyZWF0ZUNvbXBsZXgoImluaXRpYWwtY2xvc3VyZSIsIG51bGwsCi0gICAgICBQaGFzZS5zY2hlZHVsZU11dGF0b3IgICAgKFBSRVBBUkUpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVHbG9iYWwgICAgIChQUkVQQVJFKSwKLSAgICAgIFBoYXNlLnNjaGVkdWxlQ29sbGVjdG9yICAoUFJFUEFSRSksCi0gICAgICBQaGFzZS5zY2hlZHVsZUNvbXBsZXggICAgKHByZXBhcmVTdGFja3MpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVDb2xsZWN0b3IgIChQUkVDT1BZKSwKLSAgICAgIFBoYXNlLnNjaGVkdWxlQ29sbGVjdG9yICAoU1RBQ0tfUk9PVFMpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVDb2xsZWN0b3IgIChST09UUyksCi0gICAgICBQaGFzZS5zY2hlZHVsZUdsb2JhbCAgICAgKFJPT1RTKSwKLSAgICAgIFBoYXNlLnNjaGVkdWxlTXV0YXRvciAgICAoUFJPQ0VTU19NT0RCVUZGRVIpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVHbG9iYWwgICAgIChQUk9DRVNTX01PREJVRkZFUiksCi0gICAgICBQaGFzZS5zY2hlZHVsZUNvbGxlY3RvciAgKFBST0NFU1NfTU9EQlVGRkVSKSwKLSAgICAgIFBoYXNlLnNjaGVkdWxlR2xvYmFsICAgICAoQ0xPU1VSRSksCi0gICAgICBQaGFzZS5zY2hlZHVsZUNvbGxlY3RvciAgKENMT1NVUkUpKTsKLQotICAvKioKLSAgICogVGhpcyBpcyB0aGUgcGhhc2UgdGhhdCBpcyBleGVjdXRlZCB0byBwZXJmb3JtIGEgY29sbGVjdGlvbi4KLSAgICovCi0gIHB1YmxpYyBzaG9ydCBjb2xsZWN0aW9uID0gUGhhc2UuY3JlYXRlQ29tcGxleCgiY29sbGVjdGlvbiIsIG51bGwsCi0gICAgICBQaGFzZS5zY2hlZHVsZUNvbXBsZXgoaW5pdFBoYXNlKSwKLSAgICAgIFBoYXNlLnNjaGVkdWxlQ29tcGxleChyb290Q2xvc3VyZVBoYXNlKSwKLSAgICAgIFBoYXNlLnNjaGVkdWxlQ29tcGxleChyZWZDb3VudENvbGxlY3Rpb25QaGFzZSksCi0gICAgICBQaGFzZS5zY2hlZHVsZUNvbXBsZXgoY29tcGxldGVDbG9zdXJlUGhhc2UpLAotICAgICAgUGhhc2Uuc2NoZWR1bGVDb21wbGV4KGZpbmlzaFBoYXNlKSk7Ci0KLSAgLy8gQ0hFQ0tTVFlMRTpPTgotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDbGFzcyBmaWVsZHMKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgRXhwbGljaXRGcmVlTGlzdFNwYWNlIHJjU3BhY2UgPSBuZXcgRXhwbGljaXRGcmVlTGlzdFNwYWNlKCJyYyIsIERFRkFVTFRfUE9MTF9GUkVRVUVOQ1ksIFZNUmVxdWVzdC5jcmVhdGUoKSk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgRXhwbGljaXRMYXJnZU9iamVjdFNwYWNlIHJjbG9TcGFjZSA9IG5ldyBFeHBsaWNpdExhcmdlT2JqZWN0U3BhY2UoInJjbG9zIiwgREVGQVVMVF9QT0xMX0ZSRVFVRU5DWSwgVk1SZXF1ZXN0LmNyZWF0ZSgpKTsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUZfQ09VTlQgPSByY1NwYWNlLmdldERlc2NyaXB0b3IoKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVGX0NPVU5UX0xPUyA9IHJjbG9TcGFjZS5nZXREZXNjcmlwdG9yKCk7Ci0KLSAgcHVibGljIGZpbmFsIFNoYXJlZERlcXVlIG1vZFBvb2wgPSBuZXcgU2hhcmVkRGVxdWUoIm1vZCIsIG1ldGFEYXRhU3BhY2UsIDEpOwotICBwdWJsaWMgZmluYWwgU2hhcmVkRGVxdWUgZGVjUG9vbCA9IG5ldyBTaGFyZWREZXF1ZSgiZGVjIiwgbWV0YURhdGFTcGFjZSwgMSk7Ci0gIHB1YmxpYyBmaW5hbCBTaGFyZWREZXF1ZSBuZXdSb290UG9vbCA9IG5ldyBTaGFyZWREZXF1ZSgibmV3Um9vdCIsIG1ldGFEYXRhU3BhY2UsIDEpOwotICBwdWJsaWMgZmluYWwgU2hhcmVkRGVxdWUgb2xkUm9vdFBvb2wgPSBuZXcgU2hhcmVkRGVxdWUoIm9sZFJvb3QiLCBtZXRhRGF0YVNwYWNlLCAxKTsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5zdGFuY2UgZmllbGRzCi0gICAqLwotICBwdWJsaWMgZmluYWwgVHJhY2Ugcm9vdFRyYWNlOwotICBwdWJsaWMgZmluYWwgVHJhY2UgYmFja3VwVHJhY2U7Ci0gIHByaXZhdGUgZmluYWwgQlRTd2VlcGVyIHJjU3dlZXBlcjsKLSAgcHJpdmF0ZSBmaW5hbCBCVFNjYW5MYXJnZU9iamVjdFN3ZWVwZXIgbG9TY2FuU3dlZXBlcjsKLSAgcHJpdmF0ZSBmaW5hbCBCVEZyZWVMYXJnZU9iamVjdFN3ZWVwZXIgbG9GcmVlU3dlZXBlcjsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICovCi0gIHB1YmxpYyBSQ0Jhc2UoKSB7Ci0gICAgT3B0aW9ucy5ub1JlZmVyZW5jZVR5cGVzLnNldERlZmF1bHRWYWx1ZSh0cnVlKTsKLSAgICBPcHRpb25zLm5vRmluYWxpemVyLnNldERlZmF1bHRWYWx1ZSh0cnVlKTsKLQotICAgIHJvb3RUcmFjZSA9IG5ldyBUcmFjZShtZXRhRGF0YVNwYWNlKTsKLSAgICBiYWNrdXBUcmFjZSA9IG5ldyBUcmFjZShtZXRhRGF0YVNwYWNlKTsKLSAgICByY1N3ZWVwZXIgPSBuZXcgQlRTd2VlcGVyKCk7Ci0gICAgbG9TY2FuU3dlZXBlciA9IG5ldyBCVFNjYW5MYXJnZU9iamVjdFN3ZWVwZXIoKTsKLSAgICBsb0ZyZWVTd2VlcGVyID0gbmV3IEJURnJlZUxhcmdlT2JqZWN0U3dlZXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBib290IG1ldGhvZCBpcyBjYWxsZWQgZWFybHkgaW4gdGhlIGJvb3QgcHJvY2VzcyBiZWZvcmUgYW55Ci0gICAqIGFsbG9jYXRpb24uCi0gICAqLwotICBASW50ZXJydXB0aWJsZQotICBwdWJsaWMgdm9pZCBwb3N0Qm9vdCgpIHsKLSAgICBzdXBlci5wb3N0Qm9vdCgpOwotCi0gICAgaWYgKCFPcHRpb25zLm5vUmVmZXJlbmNlVHlwZXMuZ2V0VmFsdWUoKSkgewotICAgICAgVk0uYXNzZXJ0aW9ucy5mYWlsKCJSZWZlcmVuY2UgVHlwZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgUkMiKTsKLSAgICB9Ci0gICAgaWYgKCFPcHRpb25zLm5vRmluYWxpemVyLmdldFZhbHVlKCkpIHsKLSAgICAgIFZNLmFzc2VydGlvbnMuZmFpbCgiRmluYWxpemVycyBhcmUgbm90IHN1cHBvcnRlZCBieSBSQyIpOwotICAgIH0KLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDb2xsZWN0aW9uCi0gICAqLwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1JDT2JqZWN0KE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICByZXR1cm4gIW9iamVjdC5pc051bGwoKSAmJiAhU3BhY2UuaXNJblNwYWNlKFZNX1NQQUNFLCBvYmplY3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gV2hldGhlciBsYXN0IEdDIGlzIGEgZnVsbCBHQy4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGxhc3RDb2xsZWN0aW9uRnVsbEhlYXAoKSB7Ci0gICAgcmV0dXJuIHBlcmZvcm1DeWNsZUNvbGxlY3Rpb247Ci0gIH0KLQotICAvKioKLSAgICogUGVyZm9ybSBhIChnbG9iYWwpIGNvbGxlY3Rpb24gcGhhc2UuCi0gICAqCi0gICAqIEBwYXJhbSBwaGFzZUlkIENvbGxlY3Rpb24gcGhhc2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNvbGxlY3Rpb25QaGFzZShzaG9ydCBwaGFzZUlkKSB7Ci0gICAgaWYgKHBoYXNlSWQgPT0gU0VUX0NPTExFQ1RJT05fS0lORCkgewotICAgICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQpOwotICAgICAgaWYgKENDX0VOQUJMRUQpIHsKLSAgICAgICAgcGVyZm9ybUN5Y2xlQ29sbGVjdGlvbiA9IChjb2xsZWN0aW9uQXR0ZW1wdCA+IDEpIHx8IGVtZXJnZW5jeUNvbGxlY3Rpb24gfHwgQ0NfRk9SQ0VfRlVMTDsKLSAgICAgICAgaWYgKHBlcmZvcm1DeWNsZUNvbGxlY3Rpb24gJiYgT3B0aW9ucy52ZXJib3NlLmdldFZhbHVlKCkgPiAwKSBMb2cud3JpdGUoIiBbQ0NdICIpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwaGFzZUlkID09IFBSRVBBUkUpIHsKLSAgICAgIFZNLmZpbmFsaXphYmxlUHJvY2Vzc29yLmNsZWFyKCk7Ci0gICAgICBWTS53ZWFrUmVmZXJlbmNlcy5jbGVhcigpOwotICAgICAgVk0uc29mdFJlZmVyZW5jZXMuY2xlYXIoKTsKLSAgICAgIFZNLnBoYW50b21SZWZlcmVuY2VzLmNsZWFyKCk7Ci0gICAgICByb290VHJhY2UucHJlcGFyZSgpOwotICAgICAgcmNTcGFjZS5wcmVwYXJlKCk7Ci0gICAgICBpZiAoQ0NfQkFDS1VQX1RSQUNFICYmIHBlcmZvcm1DeWNsZUNvbGxlY3Rpb24pIHsKLSAgICAgICAgYmFja3VwVHJhY2UucHJlcGFyZSgpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwaGFzZUlkID09IENMT1NVUkUpIHsKLSAgICAgIHJvb3RUcmFjZS5wcmVwYXJlKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHBoYXNlSWQgPT0gQlRfQ0xPU1VSRSkgewotICAgICAgaWYgKENDX0JBQ0tVUF9UUkFDRSAmJiBwZXJmb3JtQ3ljbGVDb2xsZWN0aW9uKSB7Ci0gICAgICAgIGJhY2t1cFRyYWNlLnByZXBhcmUoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBQUk9DRVNTX09MRFJPT1RCVUZGRVIpIHsKLSAgICAgIG9sZFJvb3RQb29sLnByZXBhcmUoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBQUk9DRVNTX05FV1JPT1RCVUZGRVIpIHsKLSAgICAgIG5ld1Jvb3RQb29sLnByZXBhcmUoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLQotICAgIGlmIChwaGFzZUlkID09IFBST0NFU1NfTU9EQlVGRkVSKSB7Ci0gICAgICBtb2RQb29sLnByZXBhcmUoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBQUk9DRVNTX0RFQ0JVRkZFUikgewotICAgICAgZGVjUG9vbC5wcmVwYXJlKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHBoYXNlSWQgPT0gUkVMRUFTRSkgewotICAgICAgcm9vdFRyYWNlLnJlbGVhc2UoKTsKLSAgICAgIGlmIChDQ19CQUNLVVBfVFJBQ0UgJiYgcGVyZm9ybUN5Y2xlQ29sbGVjdGlvbikgewotICAgICAgICBiYWNrdXBUcmFjZS5yZWxlYXNlKCk7Ci0gICAgICAgIHJjU3BhY2Uuc3dlZXBDZWxscyhyY1N3ZWVwZXIpOwotICAgICAgICByY2xvU3BhY2Uuc3dlZXAobG9TY2FuU3dlZXBlcik7Ci0gICAgICAgIHJjbG9TcGFjZS5zd2VlcChsb0ZyZWVTd2VlcGVyKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJjU3BhY2UucmVsZWFzZSgpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBBY2NvdW50aW5nCi0gICAqLwotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBwYWdlcyB1c2VkIGdpdmVuIHRoZSBwZW5kaW5nCi0gICAqIGFsbG9jYXRpb24uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBwYWdlcyByZXNlcnZlZCBnaXZlbiB0aGUgcGVuZGluZwotICAgKiBhbGxvY2F0aW9uLCBleGNsdWRpbmcgc3BhY2UgcmVzZXJ2ZWQgZm9yIGNvcHlpbmcuCi0gICAqLwotICBwdWJsaWMgaW50IGdldFBhZ2VzVXNlZCgpIHsKLSAgICByZXR1cm4gKHJjU3BhY2UucmVzZXJ2ZWRQYWdlcygpICsgcmNsb1NwYWNlLnJlc2VydmVkUGFnZXMoKSArIHN1cGVyLmdldFBhZ2VzVXNlZCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIGEgbGluZWFyIHNjYW4gYWNyb3NzIGFsbCBvYmplY3RzIGluIHRoZSBoZWFwIHRvIGNoZWNrIGZvciBsZWFrcy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNhbml0eUxpbmVhclNjYW4oTGluZWFyU2NhbiBzY2FuKSB7Ci0gICAgLy9yY1NwYWNlLmxpbmVhclNjYW4oc2Nhbik7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBleHBlY3RlZCByZWZlcmVuY2UgY291bnQuIEZvciBub24tcmVmZXJlbmNlIGNvdW50aW5nCi0gICAqIGNvbGxlY3RvcnMgdGhpcyBiZWNvbWVzIGEgdHJ1ZS9mYWxzZSByZWxhdGlvbnNoaXAuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBjaGVjay4KLSAgICogQHBhcmFtIHNhbml0eVJvb3RSQyBUaGUgbnVtYmVyIG9mIHJvb3QgcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0LgotICAgKiBAcmV0dXJuIFRoZSBleHBlY3RlZCAocm9vdCBleGNsdWRlZCkgcmVmZXJlbmNlIGNvdW50LgotICAgKi8KLSAgcHVibGljIGludCBzYW5pdHlFeHBlY3RlZFJDKE9iamVjdFJlZmVyZW5jZSBvYmplY3QsIGludCBzYW5pdHlSb290UkMpIHsKLSAgICBpZiAoUkNCYXNlLmlzUkNPYmplY3Qob2JqZWN0KSkgewotICAgICAgaW50IGZ1bGxSQyA9IFJDSGVhZGVyLmdldFJDKG9iamVjdCk7Ci0gICAgICBpZiAoZnVsbFJDID09IDApIHsKLSAgICAgICAgcmV0dXJuIFNhbml0eUNoZWNrZXIuREVBRDsKLSAgICAgIH0KLSAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGZ1bGxSQyA+PSBzYW5pdHlSb290UkMpOwotICAgICAgcmV0dXJuIGZ1bGxSQyAtIHNhbml0eVJvb3RSQzsKLSAgICB9Ci0gICAgcmV0dXJuIFNhbml0eUNoZWNrZXIuQUxJVkU7Ci0gIH0KLQotICAvKioKLSAgICogUmVnaXN0ZXIgc3BlY2lhbGl6ZWQgbWV0aG9kcy4KLSAgICovCi0gIEBJbnRlcnJ1cHRpYmxlCi0gIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyU3BlY2lhbGl6ZWRNZXRob2RzKCkgewotICAgIHN1cGVyLnJlZ2lzdGVyU3BlY2lhbGl6ZWRNZXRob2RzKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9yZWZjb3VudC9SQ0Jhc2VDb2xsZWN0b3IuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9yZWZjb3VudC9SQ0Jhc2VDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI5OWRhMS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvUkNCYXNlQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4ucmVmY291bnQ7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlBoYXNlOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uU3RvcFRoZVdvcmxkQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhY2VMb2NhbDsKLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYW5zaXRpdmVDbG9zdXJlOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4ucmVmY291bnQuYmFja3VwdHJhY2UuQlRUcmFjZUxvY2FsOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmRlcXVlLk9iamVjdFJlZmVyZW5jZURlcXVlOwotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS5JbmxpbmU7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLlVuaW50ZXJydXB0aWJsZTsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLk9iamVjdFJlZmVyZW5jZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGNvbGxlY3RvciBjb250ZXh0IGZvciBhIHNpbXBsZSByZWZlcmVuY2UgY291bnRpbmcKLSAqIGNvbGxlY3Rvci4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGFic3RyYWN0IGNsYXNzIFJDQmFzZUNvbGxlY3RvciBleHRlbmRzIFN0b3BUaGVXb3JsZENvbGxlY3RvciB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBJbml0aWFsaXphdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdFJlZmVyZW5jZURlcXVlIG5ld1Jvb3RCdWZmZXI7Ci0gIHByaXZhdGUgZmluYWwgQlRUcmFjZUxvY2FsIGJhY2t1cFRyYWNlOwotICBwcml2YXRlIGZpbmFsIE9iamVjdFJlZmVyZW5jZURlcXVlIG1vZEJ1ZmZlcjsKLSAgcHJpdmF0ZSBmaW5hbCBPYmplY3RSZWZlcmVuY2VEZXF1ZSBvbGRSb290QnVmZmVyOwotICBwcml2YXRlIGZpbmFsIFJDRGVjQnVmZmVyIGRlY0J1ZmZlcjsKLSAgcHJpdmF0ZSBmaW5hbCBSQ1plcm8gemVybzsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgUkNCYXNlQ29sbGVjdG9yKCkgewotICAgIG5ld1Jvb3RCdWZmZXIgPSBuZXcgT2JqZWN0UmVmZXJlbmNlRGVxdWUoIm5ldy1yb290IiwgZ2xvYmFsKCkubmV3Um9vdFBvb2wpOwotICAgIG9sZFJvb3RCdWZmZXIgPSBuZXcgT2JqZWN0UmVmZXJlbmNlRGVxdWUoIm9sZC1yb290IiwgZ2xvYmFsKCkub2xkUm9vdFBvb2wpOwotICAgIG1vZEJ1ZmZlciA9IG5ldyBPYmplY3RSZWZlcmVuY2VEZXF1ZSgibW9kIGJ1ZiIsIGdsb2JhbCgpLm1vZFBvb2wpOwotICAgIGRlY0J1ZmZlciA9IG5ldyBSQ0RlY0J1ZmZlcihnbG9iYWwoKS5kZWNQb29sKTsKLSAgICBiYWNrdXBUcmFjZSA9IG5ldyBCVFRyYWNlTG9jYWwoZ2xvYmFsKCkuYmFja3VwVHJhY2UpOwotICAgIHplcm8gPSBuZXcgUkNaZXJvKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBtb2RpZmllZCBwcm9jZXNzb3IgdG8gdXNlLgotICAgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IFRyYW5zaXRpdmVDbG9zdXJlIGdldE1vZGlmaWVkUHJvY2Vzc29yKCk7Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgcm9vdCB0cmFjZSB0byB1c2UuCi0gICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgVHJhY2VMb2NhbCBnZXRSb290VHJhY2UoKTsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDb2xsZWN0aW9uCi0gICAqLwotCi0gIC8qKiBQZXJmb3JtIGdhcmJhZ2UgY29sbGVjdGlvbiAqLwotICBwdWJsaWMgdm9pZCBjb2xsZWN0KCkgewotICAgIFBoYXNlLmJlZ2luTmV3UGhhc2VTdGFjayhQaGFzZS5zY2hlZHVsZUNvbXBsZXgoZ2xvYmFsKCkuY29sbGVjdGlvbikpOwotICB9Ci0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSBwZXItY29sbGVjdG9yIGNvbGxlY3Rpb24gcGhhc2UuCi0gICAqCi0gICAqIEBwYXJhbSBwaGFzZUlkIFRoZSBjb2xsZWN0aW9uIHBoYXNlIHRvIHBlcmZvcm0KLSAgICogQHBhcmFtIHByaW1hcnkgcGVyZm9ybSBhbnkgc2luZ2xlLXRocmVhZGVkIGxvY2FsIGFjdGl2aXRpZXMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBjb2xsZWN0aW9uUGhhc2Uoc2hvcnQgcGhhc2VJZCwgYm9vbGVhbiBwcmltYXJ5KSB7Ci0gICAgaWYgKHBoYXNlSWQgPT0gUkNCYXNlLlBSRVBBUkUpIHsKLSAgICAgIGdldFJvb3RUcmFjZSgpLnByZXBhcmUoKTsKLSAgICAgIGlmIChSQ0Jhc2UuQ0NfQkFDS1VQX1RSQUNFICYmIFJDQmFzZS5wZXJmb3JtQ3ljbGVDb2xsZWN0aW9uKSBiYWNrdXBUcmFjZS5wcmVwYXJlKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHBoYXNlSWQgPT0gUkNCYXNlLkNMT1NVUkUpIHsKLSAgICAgIGdldFJvb3RUcmFjZSgpLmNvbXBsZXRlVHJhY2UoKTsKLSAgICAgIG5ld1Jvb3RCdWZmZXIuZmx1c2hMb2NhbCgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwaGFzZUlkID09IFJDQmFzZS5CVF9DTE9TVVJFKSB7Ci0gICAgICBpZiAoUkNCYXNlLkNDX0JBQ0tVUF9UUkFDRSAmJiBSQ0Jhc2UucGVyZm9ybUN5Y2xlQ29sbGVjdGlvbikgewotICAgICAgICBiYWNrdXBUcmFjZS5jb21wbGV0ZVRyYWNlKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHBoYXNlSWQgPT0gUkNCYXNlLlBST0NFU1NfT0xEUk9PVEJVRkZFUikgewotICAgICAgT2JqZWN0UmVmZXJlbmNlIGN1cnJlbnQ7Ci0gICAgICB3aGlsZSghKGN1cnJlbnQgPSBvbGRSb290QnVmZmVyLnBvcCgpKS5pc051bGwoKSkgewotICAgICAgICBkZWNCdWZmZXIucHVzaChjdXJyZW50KTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBSQ0Jhc2UuUFJPQ0VTU19ORVdST09UQlVGRkVSKSB7Ci0gICAgICBPYmplY3RSZWZlcmVuY2UgY3VycmVudDsKLSAgICAgIHdoaWxlKCEoY3VycmVudCA9IG5ld1Jvb3RCdWZmZXIucG9wKCkpLmlzTnVsbCgpKSB7Ci0gICAgICAgIFJDSGVhZGVyLmluY1JDKGN1cnJlbnQpOwotICAgICAgICBvbGRSb290QnVmZmVyLnB1c2goY3VycmVudCk7Ci0gICAgICAgIGlmIChSQ0Jhc2UuQ0NfQkFDS1VQX1RSQUNFICYmIFJDQmFzZS5wZXJmb3JtQ3ljbGVDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgaWYgKFJDSGVhZGVyLnRlc3RBbmRNYXJrKGN1cnJlbnQpKSB7Ci0gICAgICAgICAgICBiYWNrdXBUcmFjZS5wcm9jZXNzTm9kZShjdXJyZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIG9sZFJvb3RCdWZmZXIuZmx1c2hMb2NhbCgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwaGFzZUlkID09IFJDQmFzZS5QUk9DRVNTX01PREJVRkZFUikgewotICAgICAgT2JqZWN0UmVmZXJlbmNlIGN1cnJlbnQ7Ci0gICAgICB3aGlsZSghKGN1cnJlbnQgPSBtb2RCdWZmZXIucG9wKCkpLmlzTnVsbCgpKSB7Ci0gICAgICAgIFJDSGVhZGVyLm1ha2VVbmxvZ2dlZChjdXJyZW50KTsKLSAgICAgICAgVk0uc2Nhbm5pbmcuc2Nhbk9iamVjdChnZXRNb2RpZmllZFByb2Nlc3NvcigpLCBjdXJyZW50KTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBSQ0Jhc2UuUFJPQ0VTU19ERUNCVUZGRVIpIHsKLSAgICAgIE9iamVjdFJlZmVyZW5jZSBjdXJyZW50OwotICAgICAgd2hpbGUoIShjdXJyZW50ID0gZGVjQnVmZmVyLnBvcCgpKS5pc051bGwoKSkgewotICAgICAgICBpZiAoUkNIZWFkZXIuZGVjUkMoY3VycmVudCkgPT0gUkNIZWFkZXIuREVDX0tJTEwpIHsKLSAgICAgICAgICBkZWNCdWZmZXIucHJvY2Vzc0NoaWxkcmVuKGN1cnJlbnQpOwotICAgICAgICAgIGlmIChTcGFjZS5pc0luU3BhY2UoUkNCYXNlLlJFRl9DT1VOVCwgY3VycmVudCkpIHsKLSAgICAgICAgICAgIFJDQmFzZS5yY1NwYWNlLmZyZWUoY3VycmVudCk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChTcGFjZS5pc0luU3BhY2UoUkNCYXNlLlJFRl9DT1VOVF9MT1MsIGN1cnJlbnQpKSB7Ci0gICAgICAgICAgICBSQ0Jhc2UucmNsb1NwYWNlLmZyZWUoY3VycmVudCk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChTcGFjZS5pc0luU3BhY2UoUkNCYXNlLklNTU9SVEFMLCBjdXJyZW50KSkgewotICAgICAgICAgICAgVk0uc2Nhbm5pbmcuc2Nhbk9iamVjdCh6ZXJvLCBjdXJyZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBSQ0Jhc2UuUkVMRUFTRSkgewotICAgICAgaWYgKFJDQmFzZS5DQ19CQUNLVVBfVFJBQ0UgJiYgUkNCYXNlLnBlcmZvcm1DeWNsZUNvbGxlY3Rpb24pIHsKLSAgICAgICAgYmFja3VwVHJhY2UucmVsZWFzZSgpOwotICAgICAgfQotICAgICAgZ2V0Um9vdFRyYWNlKCkucmVsZWFzZSgpOwotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSB7Ci0gICAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChuZXdSb290QnVmZmVyLmlzRW1wdHkoKSk7Ci0gICAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChtb2RCdWZmZXIuaXNFbXB0eSgpKTsKLSAgICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGRlY0J1ZmZlci5pc0VtcHR5KCkpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIE1pc2NlbGxhbmVvdXMKLSAgICovCi0KLSAgLyoqIEByZXR1cm4gVGhlIGFjdGl2ZSBnbG9iYWwgcGxhbiBhcyBhbiA8Y29kZT5SQzwvY29kZT4gaW5zdGFuY2UuICovCi0gIEBJbmxpbmUKLSAgcHJvdGVjdGVkIHN0YXRpYyBSQ0Jhc2UgZ2xvYmFsKCkgewotICAgIHJldHVybiAoUkNCYXNlKSBWTS5hY3RpdmVQbGFuLmdsb2JhbCgpOwotICB9Ci0KLSAgLyoqIEByZXR1cm4gVGhlIGN1cnJlbnQgdHJhY2UgaW5zdGFuY2UuICovCi0gIHB1YmxpYyBmaW5hbCBUcmFjZUxvY2FsIGdldEN1cnJlbnRUcmFjZSgpIHsKLSAgICByZXR1cm4gZ2V0Um9vdFRyYWNlKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9yZWZjb3VudC9SQ0Jhc2VDb25zdHJhaW50cy5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3JlZmNvdW50L1JDQmFzZUNvbnN0cmFpbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZWFiODIuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3JlZmNvdW50L1JDQmFzZUNvbnN0cmFpbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5yZWZjb3VudDsKLQotaW1wb3J0IHN0YXRpYyBvcmcubW10ay5wb2xpY3kuU2VncmVnYXRlZEZyZWVMaXN0U3BhY2UuTUFYX0ZSRUVMSVNUX09CSkVDVF9CWVRFUzsKLWltcG9ydCBvcmcubW10ay5wbGFuLlN0b3BUaGVXb3JsZENvbnN0cmFpbnRzOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBhbmQgaXRzIHN1YmNsYXNzZXMgY29tbXVuaWNhdGUgdG8gdGhlIGhvc3QgVk0vUnVudGltZQotICogYW55IGZlYXR1cmVzIG9mIHRoZSBzZWxlY3RlZCBwbGFuIHRoYXQgaXQgbmVlZHMgdG8ga25vdy4gIFRoaXMgaXMKLSAqIHNlcGFyYXRlIGZyb20gdGhlIG1haW4gUGxhbi9QbGFuTG9jYWwgY2xhc3MgaW4gb3JkZXIgdG8gYnlwYXNzIGFueQotICogaXNzdWVzIHdpdGggb3JkZXJpbmcgb2Ygc3RhdGljIGluaXRpYWxpemF0aW9uLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgY2xhc3MgUkNCYXNlQ29uc3RyYWludHMgZXh0ZW5kcyBTdG9wVGhlV29ybGRDb25zdHJhaW50cyB7Ci0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IGdjSGVhZGVyQml0cygpIHsgcmV0dXJuIFJDSGVhZGVyLkdMT0JBTF9HQ19CSVRTX1JFUVVJUkVEOyB9Ci0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IGdjSGVhZGVyV29yZHMoKSB7IHJldHVybiBSQ0hlYWRlci5HQ19IRUFERVJfV09SRFNfUkVRVUlSRUQ7IH0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIG5lZWRzT2JqZWN0UmVmZXJlbmNlV3JpdGVCYXJyaWVyKCkgeyByZXR1cm4gdHJ1ZTsgfQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBtYXhOb25MT1NEZWZhdWx0QWxsb2NCeXRlcygpIHsgcmV0dXJuIE1BWF9GUkVFTElTVF9PQkpFQ1RfQllURVM7IH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9yZWZjb3VudC9SQ0Jhc2VNdXRhdG9yLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvUkNCYXNlTXV0YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTAwZWQ4Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9yZWZjb3VudC9SQ0Jhc2VNdXRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4ucmVmY291bnQ7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlN0b3BUaGVXb3JsZE11dGF0b3I7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5yZWZjb3VudC5iYWNrdXB0cmFjZS5CVFN3ZWVwSW1tb3J0YWxTY2FubmVyOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5FeHBsaWNpdEZyZWVMaXN0TG9jYWw7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LkV4cGxpY2l0RnJlZUxpc3RTcGFjZTsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuTGFyZ2VPYmplY3RMb2NhbDsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5hbGxvYy5BbGxvY2F0b3I7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5kZXF1ZS5PYmplY3RSZWZlcmVuY2VEZXF1ZTsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIG11dGF0b3IgY29udGV4dCBmb3IgYSBzaW1wbGUgcmVmZXJlbmNlIGNvdW50aW5nIGNvbGxlY3Rvci4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIFJDQmFzZU11dGF0b3IgZXh0ZW5kcyBTdG9wVGhlV29ybGRNdXRhdG9yIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIEluc3RhbmNlIGZpZWxkcwotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBFeHBsaWNpdEZyZWVMaXN0TG9jYWwgcmM7Ci0gIHByaXZhdGUgZmluYWwgTGFyZ2VPYmplY3RMb2NhbCByY2xvczsKLSAgcHJpdmF0ZSBmaW5hbCBPYmplY3RSZWZlcmVuY2VEZXF1ZSBtb2RCdWZmZXI7Ci0gIHByaXZhdGUgZmluYWwgUkNEZWNCdWZmZXIgZGVjQnVmZmVyOwotICBwcml2YXRlIGZpbmFsIEJUU3dlZXBJbW1vcnRhbFNjYW5uZXIgYnRTd2VlcEltbW9ydGFsOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5pdGlhbGl6YXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLiBPbmUgaW5zdGFuY2UgaXMgY3JlYXRlZCBwZXIgcGh5c2ljYWwgcHJvY2Vzc29yLgotICAgKi8KLSAgcHVibGljIFJDQmFzZU11dGF0b3IoKSB7Ci0gICAgcmMgPSBuZXcgRXhwbGljaXRGcmVlTGlzdExvY2FsKFJDQmFzZS5yY1NwYWNlKTsKLSAgICByY2xvcyA9IG5ldyBMYXJnZU9iamVjdExvY2FsKFJDQmFzZS5yY2xvU3BhY2UpOwotICAgIG1vZEJ1ZmZlciA9IG5ldyBPYmplY3RSZWZlcmVuY2VEZXF1ZSgibW9kIiwgZ2xvYmFsKCkubW9kUG9vbCk7Ci0gICAgZGVjQnVmZmVyID0gbmV3IFJDRGVjQnVmZmVyKGdsb2JhbCgpLmRlY1Bvb2wpOwotICAgIGJ0U3dlZXBJbW1vcnRhbCA9IG5ldyBCVFN3ZWVwSW1tb3J0YWxTY2FubmVyKCk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBNdXRhdG9yLXRpbWUgYWxsb2NhdGlvbgotICAgKi8KLQotICAvKioKLSAgICogQWxsb2NhdGUgbWVtb3J5IGZvciBhbiBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBieXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgb2JqZWN0LgotICAgKiBAcGFyYW0gYWxpZ24gUmVxdWlyZWQgYWxpZ25tZW50IGZvciB0aGUgb2JqZWN0LgotICAgKiBAcGFyYW0gb2Zmc2V0IE9mZnNldCBhc3NvY2lhdGVkIHdpdGggdGhlIGFsaWdubWVudC4KLSAgICogQHBhcmFtIGFsbG9jYXRvciBUaGUgYWxsb2NhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QuCi0gICAqIEBwYXJhbSBzaXRlIEFsbG9jYXRpb24gc2l0ZQotICAgKiBAcmV0dXJuIFRoZSBhZGRyZXNzIG9mIHRoZSBuZXdseSBhbGxvY2F0ZWQgbWVtb3J5LgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgQWRkcmVzcyBhbGxvYyhpbnQgYnl0ZXMsIGludCBhbGlnbiwgaW50IG9mZnNldCwgaW50IGFsbG9jYXRvciwgaW50IHNpdGUpIHsKLSAgICBzd2l0Y2ggKGFsbG9jYXRvcikgewotICAgICAgY2FzZSBSQ0Jhc2UuQUxMT0NfREVGQVVMVDoKLSAgICAgIGNhc2UgUkNCYXNlLkFMTE9DX05PTl9NT1ZJTkc6Ci0gICAgICBjYXNlIFJDQmFzZS5BTExPQ19DT0RFOgotICAgICAgICByZXR1cm4gcmMuYWxsb2MoYnl0ZXMsIGFsaWduLCBvZmZzZXQpOwotICAgICAgY2FzZSBSQ0Jhc2UuQUxMT0NfTE9TOgotICAgICAgY2FzZSBSQ0Jhc2UuQUxMT0NfUFJJTUlUSVZFX0xPUzoKLSAgICAgIGNhc2UgUkNCYXNlLkFMTE9DX0xBUkdFX0NPREU6Ci0gICAgICAgIHJldHVybiByY2xvcy5hbGxvYyhieXRlcywgYWxpZ24sIG9mZnNldCk7Ci0gICAgICBjYXNlIFJDQmFzZS5BTExPQ19JTU1PUlRBTDoKLSAgICAgICAgcmV0dXJuIHN1cGVyLmFsbG9jKGJ5dGVzLCBhbGlnbiwgb2Zmc2V0LCBhbGxvY2F0b3IsIHNpdGUpOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgVk0uYXNzZXJ0aW9ucy5mYWlsKCJBbGxvY2F0b3Igbm90IHVuZGVyc3Rvb2QgYnkgUkMiKTsKLSAgICAgICAgcmV0dXJuIEFkZHJlc3MuemVybygpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIHBvc3QtYWxsb2NhdGlvbiBhY3Rpb25zLiAgRm9yIG1hbnkgYWxsb2NhdG9ycyBub25lIGFyZQotICAgKiByZXF1aXJlZC4KLSAgICoKLSAgICogQHBhcmFtIHJlZiBUaGUgbmV3bHkgYWxsb2NhdGVkIG9iamVjdAotICAgKiBAcGFyYW0gdHlwZVJlZiB0aGUgdHlwZSByZWZlcmVuY2UgZm9yIHRoZSBpbnN0YW5jZSBiZWluZyBjcmVhdGVkCi0gICAqIEBwYXJhbSBieXRlcyBUaGUgc2l6ZSBvZiB0aGUgc3BhY2UgdG8gYmUgYWxsb2NhdGVkIChpbiBieXRlcykKLSAgICogQHBhcmFtIGFsbG9jYXRvciBUaGUgYWxsb2NhdG9yIG51bWJlciB0byBiZSB1c2VkIGZvciB0aGlzIGFsbG9jYXRpb24KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHZvaWQgcG9zdEFsbG9jKE9iamVjdFJlZmVyZW5jZSByZWYsIE9iamVjdFJlZmVyZW5jZSB0eXBlUmVmLCBpbnQgYnl0ZXMsIGludCBhbGxvY2F0b3IpIHsKLSAgICBzd2l0Y2ggKGFsbG9jYXRvcikgewotICAgIGNhc2UgUkNCYXNlLkFMTE9DX0RFRkFVTFQ6Ci0gICAgY2FzZSBSQ0Jhc2UuQUxMT0NfTk9OX01PVklORzoKLSAgICAgIG1vZEJ1ZmZlci5wdXNoKHJlZik7Ci0gICAgY2FzZSBSQ0Jhc2UuQUxMT0NfQ09ERToKLSAgICAgIGRlY0J1ZmZlci5wdXNoKHJlZik7Ci0gICAgICBSQ0hlYWRlci5pbml0aWFsaXplSGVhZGVyKHJlZiwgdHJ1ZSk7Ci0gICAgICBFeHBsaWNpdEZyZWVMaXN0U3BhY2UudW5zeW5jU2V0TGl2ZUJpdChyZWYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSQ0Jhc2UuQUxMT0NfTE9TOgotICAgICAgbW9kQnVmZmVyLnB1c2gocmVmKTsKLSAgICBjYXNlIFJDQmFzZS5BTExPQ19QUklNSVRJVkVfTE9TOgotICAgIGNhc2UgUkNCYXNlLkFMTE9DX0xBUkdFX0NPREU6Ci0gICAgICBkZWNCdWZmZXIucHVzaChyZWYpOwotICAgICAgUkNIZWFkZXIuaW5pdGlhbGl6ZUhlYWRlcihyZWYsIHRydWUpOwotICAgICAgUkNCYXNlLnJjbG9TcGFjZS5pbml0aWFsaXplSGVhZGVyKHJlZiwgdHJ1ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBSQ0Jhc2UuQUxMT0NfSU1NT1JUQUw6Ci0gICAgICBtb2RCdWZmZXIucHVzaChyZWYpOwotICAgICAgZGVjQnVmZmVyLnB1c2gocmVmKTsKLSAgICAgIFJDSGVhZGVyLmluaXRpYWxpemVIZWFkZXIocmVmLCB0cnVlKTsKLSAgICAgIHJldHVybjsKLSAgICBkZWZhdWx0OgotICAgICAgVk0uYXNzZXJ0aW9ucy5mYWlsKCJBbGxvY2F0b3Igbm90IHVuZGVyc3Rvb2QgYnkgUkMiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBhbGxvY2F0b3IgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGEgc3BhY2UKLSAgICogPGNvZGU+c3BhY2U8L2NvZGU+LCBmb3IgdGhpcyBwbGFuIGluc3RhbmNlLgotICAgKgotICAgKiBAcGFyYW0gc3BhY2UgVGhlIHNwYWNlIGZvciB3aGljaCB0aGUgYWxsb2NhdG9yIGluc3RhbmNlIGlzIGRlc2lyZWQuCi0gICAqIEByZXR1cm4gVGhlIGFsbG9jYXRvciBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwbGFuIGluc3RhbmNlCi0gICAqIHdoaWNoIGlzIGFsbG9jYXRpbmcgaW50byA8Y29kZT5zcGFjZTwvY29kZT4sIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAqIGlmIG5vIGFwcHJvcHJpYXRlIGFsbG9jYXRvciBjYW4gYmUgZXN0YWJsaXNoZWQuCi0gICAqLwotICBwdWJsaWMgQWxsb2NhdG9yIGdldEFsbG9jYXRvckZyb21TcGFjZShTcGFjZSBzcGFjZSkgewotICAgIGlmIChzcGFjZSA9PSBSQ0Jhc2UucmNTcGFjZSkgcmV0dXJuIHJjOwotICAgIGlmIChzcGFjZSA9PSBSQ0Jhc2UucmNsb1NwYWNlKSByZXR1cm4gcmNsb3M7Ci0KLSAgICByZXR1cm4gc3VwZXIuZ2V0QWxsb2NhdG9yRnJvbVNwYWNlKHNwYWNlKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbGxlY3Rpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSBwZXItbXV0YXRvciBjb2xsZWN0aW9uIHBoYXNlLgotICAgKgotICAgKiBAcGFyYW0gcGhhc2VJZCBUaGUgY29sbGVjdGlvbiBwaGFzZSB0byBwZXJmb3JtCi0gICAqIEBwYXJhbSBwcmltYXJ5IHBlcmZvcm0gYW55IHNpbmdsZS10aHJlYWRlZCBsb2NhbCBhY3Rpdml0aWVzLgotICAgKi8KLSAgcHVibGljIHZvaWQgY29sbGVjdGlvblBoYXNlKHNob3J0IHBoYXNlSWQsIGJvb2xlYW4gcHJpbWFyeSkgewotICAgIGlmIChwaGFzZUlkID09IFJDQmFzZS5QUkVQQVJFKSB7Ci0gICAgICByYy5wcmVwYXJlKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHBoYXNlSWQgPT0gUkNCYXNlLlBST0NFU1NfTU9EQlVGRkVSKSB7Ci0gICAgICBtb2RCdWZmZXIuZmx1c2hMb2NhbCgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwaGFzZUlkID09IFJDQmFzZS5QUk9DRVNTX0RFQ0JVRkZFUikgewotICAgICAgZGVjQnVmZmVyLmZsdXNoTG9jYWwoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBSQ0Jhc2UuUkVMRUFTRSkgewotICAgICAgaWYgKFJDQmFzZS5DQ19CQUNLVVBfVFJBQ0UgJiYgUkNCYXNlLnBlcmZvcm1DeWNsZUNvbGxlY3Rpb24pIHsKLSAgICAgICAgaW1tb3J0YWwubGluZWFyU2NhbihidFN3ZWVwSW1tb3J0YWwpOwotICAgICAgfQotICAgICAgcmMucmVsZWFzZSgpOwotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQobW9kQnVmZmVyLmlzRW1wdHkoKSk7Ci0gICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChkZWNCdWZmZXIuaXNFbXB0eSgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gIH0KLQotICAvKioKLSAgICogRmx1c2ggcGVyLW11dGF0b3IgcmVtZW1iZXJlZCBzZXRzIGludG8gdGhlIGdsb2JhbCByZW1zZXQgcG9vbC4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGZsdXNoUmVtZW1iZXJlZFNldHMoKSB7Ci0gICAgZGVjQnVmZmVyLmZsdXNoTG9jYWwoKTsKLSAgICBtb2RCdWZmZXIuZmx1c2hMb2NhbCgpOwotICAgIGFzc2VydFJlbXNldHNGbHVzaGVkKCk7Ci0gIH0KLQotICAvKioKLSAgICogQXNzZXJ0IHRoYXQgdGhlIHJlbXNldHMgaGF2ZSBiZWVuIGZsdXNoZWQuICBUaGlzIGlzIGNyaXRpY2FsIHRvCi0gICAqIGNvcnJlY3RuZXNzLiAgV2UgbmVlZCB0byBtYWludGFpbiB0aGUgaW52YXJpYW50IHRoYXQgcmVtc2V0IGVudHJpZXMKLSAgICogZG8gbm90IGFjY3J1ZSBkdXJpbmcgR0MuICBJZiB0aGUgaG9zdCBKVk0gZ2VuZXJhdGVzIGJhcnJpZXIgZW50aXJlcwotICAgKiBpdCBpcyBpdHMgb3duIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IHRoZXkgYXJlIGZsdXNoZWQgYmVmb3JlCi0gICAqIHJldHVybmluZyB0byBNTVRrLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgYXNzZXJ0UmVtc2V0c0ZsdXNoZWQoKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSB7Ci0gICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZGVjQnVmZmVyLmlzRmx1c2hlZCgpKTsKLSAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChtb2RCdWZmZXIuaXNGbHVzaGVkKCkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBGbHVzaCBtdXRhdG9yIGNvbnRleHQsIGluIHJlc3BvbnNlIHRvIGEgcmVxdWVzdE11dGF0b3JGbHVzaC4KLSAgICogQWxzbyBjYWxsZWQgYnkgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgZGVpbml0TXV0YXRvci4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBmbHVzaCgpIHsKLSAgICBzdXBlci5mbHVzaCgpOwotICAgIHJjLmZsdXNoKCk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBXcml0ZSBiYXJyaWVycy4KLSAgICovCi0KLSAgLyoqCi0gICAqIEEgbmV3IHJlZmVyZW5jZSBpcyBhYm91dCB0byBiZSBjcmVhdGVkLiBUYWtlIGFwcHJvcHJpYXRlIHdyaXRlCi0gICAqIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogPGI+QnkgZGVmYXVsdCBkbyBub3RoaW5nLCBvdmVycmlkZSBpZiBhcHByb3ByaWF0ZS48L2I+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUgc3RvcmVkCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZQotICAgKiBzdG9yZWQuCi0gICAqIEBwYXJhbSB0Z3QgVGhlIHRhcmdldCBvZiB0aGUgbmV3IHJlZmVyZW5jZQotICAgKiBAcGFyYW0gbWV0YURhdGFBIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIHN0b3JlCi0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBzdG9yZSBvY2N1cnJlZAotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgdm9pZCBvYmplY3RSZWZlcmVuY2VXcml0ZShPYmplY3RSZWZlcmVuY2Ugc3JjLCBBZGRyZXNzIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RSZWZlcmVuY2UgdGd0LCBXb3JkIG1ldGFEYXRhQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQgbWV0YURhdGFCLCBpbnQgbW9kZSkgewotICAgIGlmIChSQ0hlYWRlci5sb2dSZXF1aXJlZChzcmMpKSB7Ci0gICAgICBjb2FsZXNjaW5nV3JpdGVCYXJyaWVyU2xvdyhzcmMpOwotICAgIH0KLSAgICBWTS5iYXJyaWVycy5vYmplY3RSZWZlcmVuY2VXcml0ZShzcmMsdGd0LG1ldGFEYXRhQSwgbWV0YURhdGFCLCBtb2RlKTsKLSAgfQotCi0gIC8qKgotICAgKiBBdHRlbXB0IHRvIGF0b21pY2FsbHkgZXhjaGFuZ2UgdGhlIHZhbHVlIGluIHRoZSBnaXZlbiBzbG90Ci0gICAqIHdpdGggdGhlIHBhc3NlZCByZXBsYWNlbWVudCB2YWx1ZS4gSWYgYSBuZXcgcmVmZXJlbmNlIGlzCi0gICAqIGNyZWF0ZWQsIHdlIG11c3QgdGhlbiB0YWtlIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogPGI+QnkgZGVmYXVsdCBkbyBub3RoaW5nLCBvdmVycmlkZSBpZiBhcHByb3ByaWF0ZS48L2I+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUgc3RvcmVkCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZQotICAgKiBzdG9yZWQuCi0gICAqIEBwYXJhbSBvbGQgVGhlIG9sZCByZWZlcmVuY2UgdG8gYmUgc3dhcHBlZCBvdXQKLSAgICogQHBhcmFtIHRndCBUaGUgdGFyZ2V0IG9mIHRoZSBuZXcgcmVmZXJlbmNlCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbWV0YURhdGFCIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHN0b3JlIG9jY3VyZWQKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBzd2FwIHdhcyBzdWNjZXNzZnVsLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgYm9vbGVhbiBvYmplY3RSZWZlcmVuY2VUcnlDb21wYXJlQW5kU3dhcChPYmplY3RSZWZlcmVuY2Ugc3JjLCBBZGRyZXNzIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFJlZmVyZW5jZSBvbGQsIE9iamVjdFJlZmVyZW5jZSB0Z3QsIFdvcmQgbWV0YURhdGFBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpIHsKLSAgICBpZiAoUkNIZWFkZXIubG9nUmVxdWlyZWQoc3JjKSkgewotICAgICAgY29hbGVzY2luZ1dyaXRlQmFycmllclNsb3coc3JjKTsKLSAgICB9Ci0gICAgcmV0dXJuIFZNLmJhcnJpZXJzLm9iamVjdFJlZmVyZW5jZVRyeUNvbXBhcmVBbmRTd2FwKHNyYyxvbGQsdGd0LG1ldGFEYXRhQSxtZXRhRGF0YUIsbW9kZSk7Ci0gIH0KLQotICAvKioKLSAgICogQSBudW1iZXIgb2YgcmVmZXJlbmNlcyBhcmUgYWJvdXQgdG8gYmUgY29waWVkIGZyb20gb2JqZWN0Ci0gICAqIDxjb2RlPnNyYzwvY29kZT4gdG8gb2JqZWN0IDxjb2RlPmRzdDwvY29kZT4gKGFzIGluIGFuIGFycmF5Ci0gICAqIGNvcHkpLiAgVGh1cywgPGNvZGU+ZHN0PC9jb2RlPiBpcyB0aGUgbXV0YXRlZCBvYmplY3QuICBUYWtlCi0gICAqIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogQHBhcmFtIHNyYyBUaGUgc291cmNlIG9mIHRoZSB2YWx1ZXMgdG8gYmUgY29waWVkCi0gICAqIEBwYXJhbSBzcmNPZmZzZXQgVGhlIG9mZnNldCBvZiB0aGUgZmlyc3Qgc291cmNlIGFkZHJlc3MsIGluCi0gICAqIGJ5dGVzLCByZWxhdGl2ZSB0byA8Y29kZT5zcmM8L2NvZGU+IChpbiBwcmluY2lwbGUsIHRoaXMgY291bGQgYmUKLSAgICogbmVnYXRpdmUpLgotICAgKiBAcGFyYW0gZHN0IFRoZSBtdXRhdGVkIG9iamVjdCwgaS5lLiB0aGUgZGVzdGluYXRpb24gb2YgdGhlIGNvcHkuCi0gICAqIEBwYXJhbSBkc3RPZmZzZXQgVGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgZGVzdGluYXRpb24gYWRkcmVzcywgaW4KLSAgICogYnl0ZXMgcmVsYXRpdmUgdG8gPGNvZGU+dGd0PC9jb2RlPiAoaW4gcHJpbmNpcGxlLCB0aGlzIGNvdWxkIGJlCi0gICAqIG5lZ2F0aXZlKS4KLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBzaXplIG9mIHRoZSByZWdpb24gYmVpbmcgY29waWVkLCBpbiBieXRlcy4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSB1cGRhdGUgd2FzIHBlcmZvcm1lZCBieSB0aGUgYmFycmllciwgZmFsc2UgaWYKLSAgICogbGVmdCB0byB0aGUgY2FsbGVyIChhbHdheXMgZmFsc2UgaW4gdGhpcyBjYXNlKS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGJvb2xlYW4gb2JqZWN0UmVmZXJlbmNlQnVsa0NvcHkoT2JqZWN0UmVmZXJlbmNlIHNyYywgT2Zmc2V0IHNyY09mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFJlZmVyZW5jZSBkc3QsIE9mZnNldCBkc3RPZmZzZXQsIGludCBieXRlcykgewotICAgIGlmIChSQ0hlYWRlci5sb2dSZXF1aXJlZChkc3QpKSB7Ci0gICAgICBjb2FsZXNjaW5nV3JpdGVCYXJyaWVyU2xvdyhkc3QpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogU2xvdyBwYXRoIG9mIHRoZSBjb2FsZXNjaW5nIHdyaXRlIGJhcnJpZXIuCi0gICAqCi0gICAqIDxwPiBBdHRlbXB0IHRvIGxvZyB0aGUgc291cmNlIG9iamVjdC4gSWYgc3VjY2Vzc2Z1bCBpbiByYWNpbmcgZm9yCi0gICAqIHRoZSBsb2cgYml0LCBwdXNoIGFuIGVudHJ5IGludG8gdGhlIG1vZGlmaWVkIGJ1ZmZlciBhbmQgYWRkIGEKLSAgICogZGVjcmVtZW50IGJ1ZmZlciBlbnRyeSBmb3IgZWFjaCByZWZlcmVudCBvYmplY3QgKGluIHRoZSBSQyBzcGFjZSkKLSAgICogYmVmb3JlIHNldHRpbmcgdGhlIGhlYWRlciBiaXQgdG8gaW5kaWNhdGUgdGhhdCBpdCBoYXMgZmluaXNoZWQKLSAgICogbG9nZ2luZyAoYWxsb3dpbmcgb3RoZXJzIGluIHRoZSByYWNlIHRvIGNvbnRpbnVlKS4KLSAgICoKLSAgICogQHBhcmFtIHNyY09iaiBUaGUgb2JqZWN0IGJlaW5nIG11dGF0ZWQKLSAgICovCi0gIEBOb0lubGluZQotICBwcml2YXRlIHZvaWQgY29hbGVzY2luZ1dyaXRlQmFycmllclNsb3coT2JqZWN0UmVmZXJlbmNlIHNyY09iaikgewotICAgIGlmIChSQ0hlYWRlci5hdHRlbXB0VG9Mb2coc3JjT2JqKSkgewotICAgICAgbW9kQnVmZmVyLnB1c2goc3JjT2JqKTsKLSAgICAgIGRlY0J1ZmZlci5wcm9jZXNzQ2hpbGRyZW4oc3JjT2JqKTsKLSAgICAgIFJDSGVhZGVyLm1ha2VMb2dnZWQoc3JjT2JqKTsKLSAgICB9Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBNaXNjZWxsYW5lb3VzCi0gICAqLwotCi0gIC8qKiBAcmV0dXJuIFRoZSBhY3RpdmUgZ2xvYmFsIHBsYW4gYXMgYW4gPGNvZGU+UkM8L2NvZGU+IGluc3RhbmNlLiAqLwotICBASW5saW5lCi0gIHByaXZhdGUgc3RhdGljIFJDQmFzZSBnbG9iYWwoKSB7Ci0gICAgcmV0dXJuIChSQ0Jhc2UpIFZNLmFjdGl2ZVBsYW4uZ2xvYmFsKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9yZWZjb3VudC9SQ0RlY0J1ZmZlci5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3JlZmNvdW50L1JDRGVjQnVmZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNmJiMmYuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3JlZmNvdW50L1JDRGVjQnVmZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5yZWZjb3VudDsKLQotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZGVxdWUuKjsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBkZWMtYnVmZmVyIGZvciBhIHJlZmVyZW5jZSBjb3VudGluZyBjb2xsZWN0b3IKLSAqCi0gKiBAc2VlIG9yZy5tbXRrLnBsYW4uVHJhbnNpdGl2ZUNsb3N1cmUKLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGZpbmFsIGNsYXNzIFJDRGVjQnVmZmVyIGV4dGVuZHMgT2JqZWN0UmVmZXJlbmNlQnVmZmVyIGltcGxlbWVudHMgQ29uc3RhbnRzIHsKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5pdGlhbGl6YXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSBxdWV1ZSBUaGUgc2hhcmVkIGRlcXVlIHRoYXQgaXMgdXNlZC4KLSAgICovCi0gIHB1YmxpYyBSQ0RlY0J1ZmZlcihTaGFyZWREZXF1ZSBxdWV1ZSkgewotICAgIHN1cGVyKCJkZWMiLCBxdWV1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBpcyB0aGUgbWV0aG9kIHRoYXQgZW5zdXJlcwotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcHJvY2Vzcy4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHJvdGVjdGVkIHZvaWQgcHJvY2VzcyhPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKFJDQmFzZS5pc1JDT2JqZWN0KG9iamVjdCkpIHsKLSAgICAgIHB1c2gob2JqZWN0KTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9yZWZjb3VudC9SQ0hlYWRlci5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3JlZmNvdW50L1JDSGVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ODdiNWEuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3JlZmNvdW50L1JDSGVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4ucmVmY291bnQ7Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkNvbnN0YW50czsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuSW5saW5lOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS5VbmludGVycnVwdGlibGU7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC5PYmplY3RSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC5PZmZzZXQ7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC5Xb3JkOwotCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgY2xhc3MgUkNIZWFkZXIgaW1wbGVtZW50cyBDb25zdGFudHMgewotICAvKiBSZXF1aXJlbWVudHMgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUxfR0NfQklUU19SRVFVSVJFRCA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMT0JBTF9HQ19CSVRTX1JFUVVJUkVEID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0NfSEVBREVSX1dPUkRTX1JFUVVJUkVEID0gMTsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBPYmplY3QgTG9nZ2luZyAoYXBwbGllcyB0byAqYWxsKiBvYmplY3RzKQotICAgKi8KLQotICAvKiBNYXNrIGJpdHMgdG8gc2lnbmlmeSB0aGUgc3RhcnQvZmluaXNoIG9mIGxvZ2dpbmcgYW4gb2JqZWN0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50ICAgICAgTE9HX0JJVCAgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFdvcmQgICAgICAgTE9HR0VEID0gV29yZC56ZXJvKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4uLjAwMDAwCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgV29yZCAgICBVTkxPR0dFRCAgPSBXb3JkLm9uZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLi4uMDAwMDEKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBXb3JkIEJFSU5HX0xPR0dFRCA9IFdvcmQub25lKCkubHNoKDIpLm1pbnVzKFdvcmQub25lKCkpOyAgLy8uLi4wMDAxMQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFdvcmQgTE9HR0lOR19NQVNLID0gTE9HR0VELm9yKFVOTE9HR0VEKS5vcihCRUlOR19MT0dHRUQpOyAvLy4uLjAwMDExCi0KLSAgLyoqCi0gICAqIFJldHVybiB0cnVlIGlmIDxjb2RlPm9iamVjdDwvY29kZT4gaXMgeWV0IHRvIGJlIGxvZ2dlZCAoZm9yCi0gICAqIGNvYWxlc2NpbmcgUkMpLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgaW4gcXVlc3Rpb24KLSAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT5vYmplY3Q8L2NvZGU+IG5lZWRzIHRvIGJlIGxvZ2dlZC4KLSAgICovCi0gIEBJbmxpbmUKLSAgQFVuaW50ZXJydXB0aWJsZQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gbG9nUmVxdWlyZWQoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIFdvcmQgdmFsdWUgPSBWTS5vYmplY3RNb2RlbC5yZWFkQXZhaWxhYmxlQml0c1dvcmQob2JqZWN0KTsKLSAgICByZXR1cm4gdmFsdWUuYW5kKExPR0dJTkdfTUFTSykuRVEoVU5MT0dHRUQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEF0dGVtcHQgdG8gbG9nIDxjb2RlPm9iamVjdDwvY29kZT4gZm9yIGNvYWxlc2NpbmcgUkMuIFRoaXMgaXMKLSAgICogdXNlZCB0byBoYW5kbGUgYSByYWNlIHRvIGxvZyB0aGUgb2JqZWN0LCBhbmQgcmV0dXJucwotICAgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiB3ZSBhcmUgdG8gbG9nIHRoZSBvYmplY3QgYW5kCi0gICAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB3ZSBsb3N0IHRoZSByYWNlIHRvIGxvZyB0aGUgb2JqZWN0LgotICAgKgotICAgKiA8cD5JZiB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LCBpdCBsZWF2ZXMgdGhlIG9iamVjdAotICAgKiBpbiB0aGUgPGNvZGU+QkVJTkdfTE9HR0VEPC9jb2RlPiBzdGF0ZS4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eQotICAgKiBvZiB0aGUgY2FsbGVyIHRvIGNoYW5nZSB0aGUgb2JqZWN0IHRvIDxjb2RlPkxPR0dFRDwvY29kZT4gb25jZQotICAgKiB0aGUgbG9nZ2luZyBpcyBjb21wbGV0ZS4KLSAgICoKLSAgICogQHNlZSAjbWFrZUxvZ2dlZChPYmplY3RSZWZlcmVuY2UpCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCBpbiBxdWVzdGlvbgotICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByYWNlIHRvIGxvZwotICAgKiA8Y29kZT5vYmplY3Q8L2NvZGU+d2FzIHdvbi4KLSAgICovCi0gIEBJbmxpbmUKLSAgQFVuaW50ZXJydXB0aWJsZQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gYXR0ZW1wdFRvTG9nKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBXb3JkIG9sZFZhbHVlOwotICAgIGRvIHsKLSAgICAgIG9sZFZhbHVlID0gVk0ub2JqZWN0TW9kZWwucHJlcGFyZUF2YWlsYWJsZUJpdHMob2JqZWN0KTsKLSAgICAgIGlmIChvbGRWYWx1ZS5hbmQoTE9HR0lOR19NQVNLKS5FUShMT0dHRUQpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9IHdoaWxlICgob2xkVmFsdWUuYW5kKExPR0dJTkdfTUFTSykuRVEoQkVJTkdfTE9HR0VEKSkgfHwKLSAgICAgICAgICAgICAhVk0ub2JqZWN0TW9kZWwuYXR0ZW1wdEF2YWlsYWJsZUJpdHMob2JqZWN0LCBvbGRWYWx1ZSwgb2xkVmFsdWUub3IoQkVJTkdfTE9HR0VEKSkpOwotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgewotICAgICAgV29yZCB2YWx1ZSA9IFZNLm9iamVjdE1vZGVsLnJlYWRBdmFpbGFibGVCaXRzV29yZChvYmplY3QpOwotICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KHZhbHVlLmFuZChMT0dHSU5HX01BU0spLkVRKEJFSU5HX0xPR0dFRCkpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFNpZ25pZnkgY29tcGxldGlvbiBvZiBsb2dnaW5nIDxjb2RlPm9iamVjdDwvY29kZT4uCi0gICAqCi0gICAqIDxjb2RlPm9iamVjdDwvY29kZT4gaXMgbGVmdCBpbiB0aGUgPGNvZGU+TE9HR0VEPC9jb2RlPiBzdGF0ZS4KLSAgICoKLSAgICogQHNlZSAjYXR0ZW1wdFRvTG9nKE9iamVjdFJlZmVyZW5jZSkKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHdob3NlIHN0YXRlIGlzIHRvIGJlIGNoYW5nZWQuCi0gICAqLwotICBASW5saW5lCi0gIEBVbmludGVycnVwdGlibGUKLSAgcHVibGljIHN0YXRpYyB2b2lkIG1ha2VMb2dnZWQoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIFdvcmQgdmFsdWUgPSBWTS5vYmplY3RNb2RlbC5yZWFkQXZhaWxhYmxlQml0c1dvcmQob2JqZWN0KTsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCh2YWx1ZS5hbmQoTE9HR0lOR19NQVNLKS5ORShMT0dHRUQpKTsKLSAgICBWTS5vYmplY3RNb2RlbC53cml0ZUF2YWlsYWJsZUJpdHNXb3JkKG9iamVjdCwgdmFsdWUuYW5kKExPR0dJTkdfTUFTSy5ub3QoKSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENoYW5nZSA8Y29kZT5vYmplY3Q8L2NvZGU+J3Mgc3RhdGUgdG8gPGNvZGU+VU5MT0dHRUQ8L2NvZGU+LgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3Qgd2hvc2Ugc3RhdGUgaXMgdG8gYmUgY2hhbmdlZC4KLSAgICovCi0gIEBJbmxpbmUKLSAgQFVuaW50ZXJydXB0aWJsZQotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFrZVVubG9nZ2VkKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBXb3JkIHZhbHVlID0gVk0ub2JqZWN0TW9kZWwucmVhZEF2YWlsYWJsZUJpdHNXb3JkKG9iamVjdCk7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQodmFsdWUuYW5kKExPR0dJTkdfTUFTSykuRVEoTE9HR0VEKSk7Ci0gICAgVk0ub2JqZWN0TW9kZWwud3JpdGVBdmFpbGFibGVCaXRzV29yZChvYmplY3QsIHZhbHVlLm9yKFVOTE9HR0VEKSk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIFJDIGhlYWRlciB3b3JkCi0gICAqLwotCi0gIC8qIEhlYWRlciBvZmZzZXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBPZmZzZXQgUkNfSEVBREVSX09GRlNFVCA9IFZNLm9iamVjdE1vZGVsLkdDX0hFQURFUl9PRkZTRVQoKTsKLQotICAvKiBSZXNlcnZlZCB0byBhbGxvdyBhbGlnbm1lbnQgaG9sZSBmaWxsaW5nIHRvIHdvcmsgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTRVJWRURfQUxJR05fQklUID0gMDsKLQotICAvKiBUaGUgbWFyayBiaXQgdXNlZCBmb3IgYmFja3VwIHRyYWNpbmcuICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BUktfQklUID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBXb3JkIE1BUktfQklUX01BU0sgPSBXb3JkLm9uZSgpLmxzaChNQVJLX0JJVCk7Ci0KLSAgLyogQ3VycmVudCBub3QgdXNpbmcgYW55IGJpdHMgZm9yIGN5Y2xlIGRldGVjdGlvbiwgZXRjICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJVFNfVVNFRCA9IDI7Ci0KLSAgLyogUmVmZXJlbmNlIGNvdW50aW5nIGluY3JlbWVudHMgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5DUkVNRU5UX1NISUZUID0gQklUU19VU0VEOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFdvcmQgSU5DUkVNRU5UID0gV29yZC5vbmUoKS5sc2goSU5DUkVNRU5UX1NISUZUKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVZBSUxBQkxFX0JJVFMgPSBCSVRTX0lOX0FERFJFU1MgLSBCSVRTX1VTRUQ7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgV29yZCBJTkNSRU1FTlRfTElNSVQgPSBXb3JkLm9uZSgpLmxzaChCSVRTX0lOX0FERFJFU1MtMSkubm90KCk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgV29yZCBMSVZFX1RIUkVTSE9MRCA9IElOQ1JFTUVOVDsKLQotICAvKiBSZXR1cm4gdmFsdWVzIGZyb20gZGVjUkMgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVDX0tJTEwgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUNfQUxJVkUgPSAxOwotCi0gIC8qKgotICAgKiBIYXMgdGhpcyBvYmplY3QgYmVlbiBtYXJrZWQgYnkgdGhlIG1vc3QgcmVjZW50IGJhY2t1cCB0cmFjZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWFya2VkKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICByZXR1cm4gaXNIZWFkZXJNYXJrZWQob2JqZWN0LnRvQWRkcmVzcygpLmxvYWRXb3JkKFJDX0hFQURFUl9PRkZTRVQpKTsKLSAgfQotCi0gIC8qKgotICAgKiBIYXMgdGhpcyBvYmplY3QgYmVlbiBtYXJrZWQgYnkgdGhlIG1vc3QgcmVjZW50IGJhY2t1cCB0cmFjZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyTWFya2VkKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBXb3JkIG9sZFZhbHVlLCBuZXdWYWx1ZTsKLSAgICBkbyB7Ci0gICAgICBvbGRWYWx1ZSA9IG9iamVjdC50b0FkZHJlc3MoKS5wcmVwYXJlV29yZChSQ19IRUFERVJfT0ZGU0VUKTsKLSAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGlzSGVhZGVyTWFya2VkKG9sZFZhbHVlKSk7Ci0gICAgICBuZXdWYWx1ZSA9IG9sZFZhbHVlLmFuZChNQVJLX0JJVF9NQVNLLm5vdCgpKTsKLSAgICB9IHdoaWxlICghb2JqZWN0LnRvQWRkcmVzcygpLmF0dGVtcHQob2xkVmFsdWUsIG5ld1ZhbHVlLCBSQ19IRUFERVJfT0ZGU0VUKSk7Ci0gICAgLyoKLSAgICBXb3JkIGhlYWRlciA9IG9iamVjdC50b0FkZHJlc3MoKS5sb2FkV29yZChSQ19IRUFERVJfT0ZGU0VUKTsKLSAgICBvYmplY3QudG9BZGRyZXNzKCkuc3RvcmUoaGVhZGVyLmFuZChNQVJLX0JJVF9NQVNLLm5vdCgpKSwgUkNfSEVBREVSX09GRlNFVCk7Ki8KLSAgfQotCi0gIC8qKgotICAgKiBIYXMgdGhpcyBvYmplY3QgYmVlbiBtYXJrZWQgYnkgdGhlIG1vc3QgcmVjZW50IGJhY2t1cCB0cmFjZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0hlYWRlck1hcmtlZChXb3JkIGhlYWRlcikgewotICAgIHJldHVybiBoZWFkZXIuYW5kKE1BUktfQklUX01BU0spLkVRKE1BUktfQklUX01BU0spOwotICB9Ci0KLSAgLyoqCi0gICAqIEF0dGVtcHQgdG8gYXRvbWljYWxseSBtYXJrIHRoaXMgb2JqZWN0LiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbWFyayB3YXMgcGVyZm9ybWVkLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdEFuZE1hcmsoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIFdvcmQgb2xkVmFsdWUsIG5ld1ZhbHVlOwotICAgIGRvIHsKLSAgICAgIG9sZFZhbHVlID0gb2JqZWN0LnRvQWRkcmVzcygpLnByZXBhcmVXb3JkKFJDX0hFQURFUl9PRkZTRVQpOwotICAgICAgaWYgKGlzSGVhZGVyTWFya2VkKG9sZFZhbHVlKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBuZXdWYWx1ZSA9IG9sZFZhbHVlLm9yKE1BUktfQklUX01BU0spOwotICAgIH0gd2hpbGUgKCFvYmplY3QudG9BZGRyZXNzKCkuYXR0ZW1wdChvbGRWYWx1ZSwgbmV3VmFsdWUsIFJDX0hFQURFUl9PRkZTRVQpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIGFueSByZXF1aXJlZCBpbml0aWFsaXphdGlvbiBvZiB0aGUgR0MgcG9ydGlvbiBvZiB0aGUgaGVhZGVyLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QKLSAgICogQHBhcmFtIGluaXRpYWxJbmMgc3RhcnQgd2l0aCBhIHJlZmVyZW5jZSBjb3VudCBvZiAxICgwIGlmIGZhbHNlKQotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZUhlYWRlcihPYmplY3RSZWZlcmVuY2Ugb2JqZWN0LCBib29sZWFuIGluaXRpYWxJbmMpIHsKLSAgICBXb3JkIGluaXRpYWxWYWx1ZSA9ICAoaW5pdGlhbEluYykgPyBJTkNSRU1FTlQgOiBXb3JkLnplcm8oKTsKLSAgICBvYmplY3QudG9BZGRyZXNzKCkuc3RvcmUoaW5pdGlhbFZhbHVlLCBSQ19IRUFERVJfT0ZGU0VUKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdHJ1ZSBpZiBnaXZlbiBvYmplY3QgaXMgbGl2ZQotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3Qgd2hvc2UgbGl2ZW5lc3MgaXMgdG8gYmUgdGVzdGVkCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGFsaXZlCi0gICAqLwotICBASW5saW5lCi0gIEBVbmludGVycnVwdGlibGUKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGl2ZVJDKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICByZXR1cm4gb2JqZWN0LnRvQWRkcmVzcygpLmxvYWRXb3JkKFJDX0hFQURFUl9PRkZTRVQpLkdFKExJVkVfVEhSRVNIT0xEKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHJlZmVyZW5jZSBjb3VudCBmb3IgdGhlIG9iamVjdC4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHdob3NlIGxpdmVuZXNzIGlzIHRvIGJlIHRlc3RlZAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9iamVjdCBpcyBhbGl2ZQotICAgKi8KLSAgQElubGluZQotICBAVW5pbnRlcnJ1cHRpYmxlCi0gIHB1YmxpYyBzdGF0aWMgaW50IGdldFJDKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICByZXR1cm4gb2JqZWN0LnRvQWRkcmVzcygpLmxvYWRXb3JkKFJDX0hFQURFUl9PRkZTRVQpLnJzaGwoSU5DUkVNRU5UX1NISUZUKS50b0ludCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGFuIG9iamVjdC4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHdob3NlIHJlZmVyZW5jZSBjb3VudCBpcyB0byBiZSBpbmNyZW1lbnRlZC4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyB2b2lkIGluY1JDKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBXb3JkIG9sZFZhbHVlLCBuZXdWYWx1ZTsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChSQ0Jhc2UuaXNSQ09iamVjdChvYmplY3QpKTsKLSAgICBkbyB7Ci0gICAgICBvbGRWYWx1ZSA9IG9iamVjdC50b0FkZHJlc3MoKS5wcmVwYXJlV29yZChSQ19IRUFERVJfT0ZGU0VUKTsKLSAgICAgIG5ld1ZhbHVlID0gb2xkVmFsdWUucGx1cyhJTkNSRU1FTlQpOwotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQobmV3VmFsdWUuTEUoSU5DUkVNRU5UX0xJTUlUKSk7Ci0gICAgfSB3aGlsZSAoIW9iamVjdC50b0FkZHJlc3MoKS5hdHRlbXB0KG9sZFZhbHVlLCBuZXdWYWx1ZSwgUkNfSEVBREVSX09GRlNFVCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIERlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGFuIG9iamVjdC4gIFJldHVybiBlaXRoZXIKLSAgICogPGNvZGU+REVDX0tJTEw8L2NvZGU+IGlmIHRoZSBjb3VudCB3ZW50IHRvIHplcm8sCi0gICAqIDxjb2RlPkRFQ19BTElWRTwvY29kZT4gaWYgdGhlIGNvdW50IGRpZCBub3QgZ28gdG8gemVyby4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHdob3NlIFJDIGlzIHRvIGJlIGRlY3JlbWVudGVkLgotICAgKiBAcmV0dXJuIDxjb2RlPkRFQ19LSUxMPC9jb2RlPiBpZiB0aGUgY291bnQgd2VudCB0byB6ZXJvLAotICAgKiA8Y29kZT5ERUNfQUxJVkU8L2NvZGU+IGlmIHRoZSBjb3VudCBkaWQgbm90IGdvIHRvIHplcm8uCi0gICAqLwotICBASW5saW5lCi0gIEBVbmludGVycnVwdGlibGUKLSAgcHVibGljIHN0YXRpYyBpbnQgZGVjUkMoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIFdvcmQgb2xkVmFsdWUsIG5ld1ZhbHVlOwotICAgIGludCBydG47Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSB7Ci0gICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQoUkNCYXNlLmlzUkNPYmplY3Qob2JqZWN0KSk7Ci0gICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQoaXNMaXZlUkMob2JqZWN0KSk7Ci0gICAgfQotICAgIGRvIHsKLSAgICAgIG9sZFZhbHVlID0gb2JqZWN0LnRvQWRkcmVzcygpLnByZXBhcmVXb3JkKFJDX0hFQURFUl9PRkZTRVQpOwotICAgICAgbmV3VmFsdWUgPSBvbGRWYWx1ZS5taW51cyhJTkNSRU1FTlQpOwotICAgICAgaWYgKG5ld1ZhbHVlLkxUKExJVkVfVEhSRVNIT0xEKSkgewotICAgICAgICBydG4gPSBERUNfS0lMTDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJ0biA9IERFQ19BTElWRTsKLSAgICAgIH0KLSAgICB9IHdoaWxlICghb2JqZWN0LnRvQWRkcmVzcygpLmF0dGVtcHQob2xkVmFsdWUsIG5ld1ZhbHVlLCBSQ19IRUFERVJfT0ZGU0VUKSk7Ci0gICAgcmV0dXJuIHJ0bjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3JlZmNvdW50L1JDWmVyby5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3JlZmNvdW50L1JDWmVyby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmE1NDVjLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9yZWZjb3VudC9SQ1plcm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLnJlZmNvdW50OwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5UcmFuc2l0aXZlQ2xvc3VyZTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRoZSBmdW5kYW1lbnRhbCBtZWNoYW5pc20gZm9yIHBlcmZvcm1pbmcgYQotICogdHJhbnNpdGl2ZSBjbG9zdXJlIG92ZXIgYW4gb2JqZWN0IGdyYXBoLjxwPgotICoKLSAqIEBzZWUgb3JnLm1tdGsucGxhbi5UcmFjZUxvY2FsCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBmaW5hbCBjbGFzcyBSQ1plcm8gZXh0ZW5kcyBUcmFuc2l0aXZlQ2xvc3VyZSB7Ci0KLSAgLyoqCi0gICAqIFRyYWNlIGFuIGVkZ2UgZHVyaW5nIEdDLgotICAgKgotICAgKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugb2YgdGhlIHJlZmVyZW5jZS4KLSAgICogQHBhcmFtIHNsb3QgVGhlIGxvY2F0aW9uIGNvbnRhaW5pbmcgdGhlIG9iamVjdCByZWZlcmVuY2UuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyB2b2lkIHByb2Nlc3NFZGdlKE9iamVjdFJlZmVyZW5jZSBzb3VyY2UsIEFkZHJlc3Mgc2xvdCkgewotICAgIHNsb3Quc3RvcmUoT2JqZWN0UmVmZXJlbmNlLm51bGxSZWZlcmVuY2UoKSk7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3JlZmNvdW50L2JhY2t1cHRyYWNlL0JURGVjTWFya2VkLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvYmFja3VwdHJhY2UvQlREZWNNYXJrZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEyMTg2OC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvYmFja3VwdHJhY2UvQlREZWNNYXJrZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLnJlZmNvdW50LmJhY2t1cHRyYWNlOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5UcmFuc2l0aXZlQ2xvc3VyZTsKLWltcG9ydCBvcmcubW10ay5wbGFuLnJlZmNvdW50LlJDQmFzZTsKLWltcG9ydCBvcmcubW10ay5wbGFuLnJlZmNvdW50LlJDSGVhZGVyOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRoZSBmdW5kYW1lbnRhbCBtZWNoYW5pc20gZm9yIHBlcmZvcm1pbmcgYQotICogdHJhbnNpdGl2ZSBjbG9zdXJlIG92ZXIgYW4gb2JqZWN0IGdyYXBoLjxwPgotICoKLSAqIEBzZWUgb3JnLm1tdGsucGxhbi5UcmFjZUxvY2FsCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBmaW5hbCBjbGFzcyBCVERlY01hcmtlZCBleHRlbmRzIFRyYW5zaXRpdmVDbG9zdXJlIHsKLQotICAvKioKLSAgICogVHJhY2UgYW4gZWRnZSBkdXJpbmcgR0MuCi0gICAqCi0gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvZiB0aGUgcmVmZXJlbmNlLgotICAgKiBAcGFyYW0gc2xvdCBUaGUgbG9jYXRpb24gY29udGFpbmluZyB0aGUgb2JqZWN0IHJlZmVyZW5jZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHZvaWQgcHJvY2Vzc0VkZ2UoT2JqZWN0UmVmZXJlbmNlIHNvdXJjZSwgQWRkcmVzcyBzbG90KSB7Ci0gICAgT2JqZWN0UmVmZXJlbmNlIG9iamVjdCA9IHNsb3QubG9hZE9iamVjdFJlZmVyZW5jZSgpOwotICAgIGlmICghb2JqZWN0LmlzTnVsbCgpKSB7Ci0gICAgICBpZiAoKFNwYWNlLmlzSW5TcGFjZShSQ0Jhc2UuUkVGX0NPVU5ULCBvYmplY3QpICYmIFJDQmFzZS5yY1NwYWNlLmlzTGl2ZShvYmplY3QpKSB8fAotICAgICAgICAgIFNwYWNlLmlzSW5TcGFjZShSQ0Jhc2UuUkVGX0NPVU5UX0xPUywgb2JqZWN0KSB8fAotICAgICAgICAgIFNwYWNlLmlzSW5TcGFjZShSQ0Jhc2UuSU1NT1JUQUwsIG9iamVjdCkpIHsKLSAgICAgICAgaW50IHJlc3VsdCA9IFJDSGVhZGVyLmRlY1JDKG9iamVjdCk7Ci0gICAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KHJlc3VsdCAhPSBSQ0hlYWRlci5ERUNfS0lMTCB8fCAhUkNIZWFkZXIuaXNNYXJrZWQob2JqZWN0KSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvYmFja3VwdHJhY2UvQlREZWNNYXJrZWRBbmRaZXJvLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvYmFja3VwdHJhY2UvQlREZWNNYXJrZWRBbmRaZXJvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MTlkNjIuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3JlZmNvdW50L2JhY2t1cHRyYWNlL0JURGVjTWFya2VkQW5kWmVyby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4ucmVmY291bnQuYmFja3VwdHJhY2U7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYW5zaXRpdmVDbG9zdXJlOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4ucmVmY291bnQuUkNCYXNlOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4ucmVmY291bnQuUkNIZWFkZXI7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LlNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdGhlIGZ1bmRhbWVudGFsIG1lY2hhbmlzbSBmb3IgcGVyZm9ybWluZyBhCi0gKiB0cmFuc2l0aXZlIGNsb3N1cmUgb3ZlciBhbiBvYmplY3QgZ3JhcGguPHA+Ci0gKgotICogQHNlZSBvcmcubW10ay5wbGFuLlRyYWNlTG9jYWwKLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGZpbmFsIGNsYXNzIEJURGVjTWFya2VkQW5kWmVybyBleHRlbmRzIFRyYW5zaXRpdmVDbG9zdXJlIHsKLQotICAvKioKLSAgICogVHJhY2UgYW4gZWRnZSBkdXJpbmcgR0MuCi0gICAqCi0gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvZiB0aGUgcmVmZXJlbmNlLgotICAgKiBAcGFyYW0gc2xvdCBUaGUgbG9jYXRpb24gY29udGFpbmluZyB0aGUgb2JqZWN0IHJlZmVyZW5jZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHZvaWQgcHJvY2Vzc0VkZ2UoT2JqZWN0UmVmZXJlbmNlIHNvdXJjZSwgQWRkcmVzcyBzbG90KSB7Ci0gICAgT2JqZWN0UmVmZXJlbmNlIG9iamVjdCA9IHNsb3QubG9hZE9iamVjdFJlZmVyZW5jZSgpOwotICAgIHNsb3Quc3RvcmUoT2JqZWN0UmVmZXJlbmNlLm51bGxSZWZlcmVuY2UoKSk7Ci0gICAgaWYgKCFvYmplY3QuaXNOdWxsKCkpIHsKLSAgICAgIGlmICgoU3BhY2UuaXNJblNwYWNlKFJDQmFzZS5SRUZfQ09VTlQsIG9iamVjdCkgJiYgUkNCYXNlLnJjU3BhY2UuaXNMaXZlKG9iamVjdCkpIHx8Ci0gICAgICAgICAgU3BhY2UuaXNJblNwYWNlKFJDQmFzZS5SRUZfQ09VTlRfTE9TLCBvYmplY3QpIHx8Ci0gICAgICAgICAgU3BhY2UuaXNJblNwYWNlKFJDQmFzZS5JTU1PUlRBTCwgb2JqZWN0KSkgewotICAgICAgICBpbnQgcmVzdWx0ID0gUkNIZWFkZXIuZGVjUkMob2JqZWN0KTsKLSAgICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQocmVzdWx0ICE9IFJDSGVhZGVyLkRFQ19LSUxMIHx8ICFSQ0hlYWRlci5pc01hcmtlZChvYmplY3QpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9yZWZjb3VudC9iYWNrdXB0cmFjZS9CVEZyZWVMYXJnZU9iamVjdFN3ZWVwZXIuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9yZWZjb3VudC9iYWNrdXB0cmFjZS9CVEZyZWVMYXJnZU9iamVjdFN3ZWVwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQyYzNjNS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvYmFja3VwdHJhY2UvQlRGcmVlTGFyZ2VPYmplY3RTd2VlcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5yZWZjb3VudC5iYWNrdXB0cmFjZTsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4ucmVmY291bnQuUkNIZWFkZXI7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LkV4cGxpY2l0TGFyZ2VPYmplY3RTcGFjZTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGZyZWVpbmcgb2YgbGFyZ2Ugb2JqZWN0cyBkdXJpbmcgYSBiYWNrdXAgdHJhY2UuCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBmaW5hbCBjbGFzcyBCVEZyZWVMYXJnZU9iamVjdFN3ZWVwZXIgZXh0ZW5kcyBFeHBsaWNpdExhcmdlT2JqZWN0U3BhY2UuU3dlZXBlciB7Ci0KLSAgcHVibGljIGJvb2xlYW4gc3dlZXBMYXJnZU9iamVjdChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKCFSQ0hlYWRlci5pc01hcmtlZChvYmplY3QpKSB7Ci0gICAgICAvLyBGcmVlIHRoZSBvYmplY3QKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAvLyBDbGVhciB0aGUgbWFyay1iaXQgYW5kIHJldGFpbiB0aGUgb2JqZWN0LgotICAgIFJDSGVhZGVyLmNsZWFyTWFya2VkKG9iamVjdCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvYmFja3VwdHJhY2UvQlRTY2FuTGFyZ2VPYmplY3RTd2VlcGVyLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvYmFja3VwdHJhY2UvQlRTY2FuTGFyZ2VPYmplY3RTd2VlcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYmM1N2QuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3JlZmNvdW50L2JhY2t1cHRyYWNlL0JUU2NhbkxhcmdlT2JqZWN0U3dlZXBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4ucmVmY291bnQuYmFja3VwdHJhY2U7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLnJlZmNvdW50LlJDSGVhZGVyOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5FeHBsaWNpdExhcmdlT2JqZWN0U3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBzY2FubmluZyBvZiBkZWFkIGxhcmdlIG9iamVjdHMgZHVyaW5nIGEgYmFja3VwIHRyYWNlLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgZmluYWwgY2xhc3MgQlRTY2FuTGFyZ2VPYmplY3RTd2VlcGVyIGV4dGVuZHMgRXhwbGljaXRMYXJnZU9iamVjdFNwYWNlLlN3ZWVwZXIgewotCi0gIHByaXZhdGUgZmluYWwgQlREZWNNYXJrZWQgc2RtID0gbmV3IEJURGVjTWFya2VkKCk7Ci0KLSAgcHVibGljIGJvb2xlYW4gc3dlZXBMYXJnZU9iamVjdChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKCFSQ0hlYWRlci5pc01hcmtlZChvYmplY3QpKSB7Ci0gICAgICBWTS5zY2FubmluZy5zY2FuT2JqZWN0KHNkbSwgb2JqZWN0KTsKLSAgICB9Ci0gICAgLy8gRG8gbm90IGZyZWUgYW55IG9iamVjdHMgYXQgdGhpcyB0aW1lCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvYmFja3VwdHJhY2UvQlRTd2VlcEltbW9ydGFsU2Nhbm5lci5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3JlZmNvdW50L2JhY2t1cHRyYWNlL0JUU3dlZXBJbW1vcnRhbFNjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM0MzhmNy4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvYmFja3VwdHJhY2UvQlRTd2VlcEltbW9ydGFsU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4ucmVmY291bnQuYmFja3VwdHJhY2U7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLnJlZmNvdW50LlJDSGVhZGVyOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuYWxsb2MuTGluZWFyU2NhbjsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgaW4gYmFja3VwIHRyYWNpbmcgdG8gc3dlZXAgYW5kIHplcm8gYW55IGRlYWQgJ2ltbW9ydGFsJyBvYmplY3RzLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgZmluYWwgY2xhc3MgQlRTd2VlcEltbW9ydGFsU2Nhbm5lciBleHRlbmRzIExpbmVhclNjYW4gewotCi0gIHByaXZhdGUgZmluYWwgQlREZWNNYXJrZWRBbmRaZXJvIHNkbUFaID0gbmV3IEJURGVjTWFya2VkQW5kWmVybygpOwotCi0gIC8qKgotICAgKiBTY2FuIGFuIG9iamVjdCBkdXJpbmcgc3dlZXAuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIHNvdXJjZSBvZiB0aGUgcmVmZXJlbmNlLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgdm9pZCBzY2FuKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAoIVJDSGVhZGVyLmlzTWFya2VkKG9iamVjdCkpIHsKLSAgICAgIFZNLnNjYW5uaW5nLnNjYW5PYmplY3Qoc2RtQVosIG9iamVjdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFJDSGVhZGVyLmNsZWFyTWFya2VkKG9iamVjdCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvYmFja3VwdHJhY2UvQlRTd2VlcGVyLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvYmFja3VwdHJhY2UvQlRTd2VlcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZTI5NzAuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3JlZmNvdW50L2JhY2t1cHRyYWNlL0JUU3dlZXBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4ucmVmY291bnQuYmFja3VwdHJhY2U7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLnJlZmNvdW50LlJDSGVhZGVyOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5FeHBsaWNpdEZyZWVMaXN0U3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSB0aHJlYWQtbG9jYWwgY29yZSBmdW5jdGlvbmFsaXR5IGZvciBhIHRyYW5zaXRpdmUKLSAqIGNsb3N1cmUgb3ZlciB0aGUgaGVhcCBncmFwaC4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGZpbmFsIGNsYXNzIEJUU3dlZXBlciBleHRlbmRzIEV4cGxpY2l0RnJlZUxpc3RTcGFjZS5Td2VlcGVyIHsKLQotICBwcml2YXRlIGZpbmFsIEJURGVjTWFya2VkIHNkbSA9IG5ldyBCVERlY01hcmtlZCgpOwotCi0gIHB1YmxpYyBib29sZWFuIHN3ZWVwQ2VsbChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKCFSQ0hlYWRlci5pc01hcmtlZChvYmplY3QpKSB7Ci0gICAgICBWTS5zY2FubmluZy5zY2FuT2JqZWN0KHNkbSwgb2JqZWN0KTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICBSQ0hlYWRlci5jbGVhck1hcmtlZChvYmplY3QpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9yZWZjb3VudC9iYWNrdXB0cmFjZS9CVFRyYWNlTG9jYWwuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9yZWZjb3VudC9iYWNrdXB0cmFjZS9CVFRyYWNlTG9jYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ0ZGQyMi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvYmFja3VwdHJhY2UvQlRUcmFjZUxvY2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5yZWZjb3VudC5iYWNrdXB0cmFjZTsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhY2VMb2NhbDsKLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYWNlOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4ucmVmY291bnQuUkNCYXNlOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4ucmVmY291bnQuUkNIZWFkZXI7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSB0aHJlYWQtbG9jYWwgY29yZSBmdW5jdGlvbmFsaXR5IGZvciBhIHRyYW5zaXRpdmUKLSAqIGNsb3N1cmUgb3ZlciB0aGUgaGVhcCBncmFwaC4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGZpbmFsIGNsYXNzIEJUVHJhY2VMb2NhbCBleHRlbmRzIFRyYWNlTG9jYWwgewotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICovCi0gIHB1YmxpYyBCVFRyYWNlTG9jYWwoVHJhY2UgdHJhY2UpIHsKLSAgICBzdXBlcih0cmFjZSk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBFeHRlcm5hbGx5IHZpc2libGUgT2JqZWN0IHByb2Nlc3NpbmcgYW5kIHRyYWNpbmcKLSAgICovCi0KLSAgLyoqCi0gICAqIElzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHJlYWNoYWJsZT8KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0LgotICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgcmVhY2hhYmxlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNMaXZlKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICByZXR1cm4gIVJDQmFzZS5pc1JDT2JqZWN0KG9iamVjdCkgfHwgUkNIZWFkZXIuaXNNYXJrZWQob2JqZWN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBXaGVuIHdlIHRyYWNlIGEgbm9uLXJvb3Qgb2JqZWN0IHdlIGRvIG5vdGhpbmcuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBiZSB0cmFjZWQuCi0gICAqIEByZXR1cm4gVGhlIG5ldyByZWZlcmVuY2UgdG8gdGhlIHNhbWUgb2JqZWN0IGluc3RhbmNlLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlIHRyYWNlT2JqZWN0KE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAoUkNCYXNlLmlzUkNPYmplY3Qob2JqZWN0KSkgewotICAgICAgaWYgKFJDSGVhZGVyLnRlc3RBbmRNYXJrKG9iamVjdCkpIHsKLSAgICAgICAgcHJvY2Vzc05vZGUob2JqZWN0KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG9iamVjdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3JlZmNvdW50L2Z1bGxoZWFwL1JDLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvZnVsbGhlYXAvUkMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJjZjgyZS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvZnVsbGhlYXAvUkMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLnJlZmNvdW50LmZ1bGxoZWFwOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5yZWZjb3VudC5SQ0Jhc2U7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBnbG9iYWwgc3RhdGUgb2YgYSBhIHNpbXBsZSByZWZlcmVuY2UgY291bnRpbmcgY29sbGVjdG9yLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgY2xhc3MgUkMgZXh0ZW5kcyBSQ0Jhc2UgewotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3JlZmNvdW50L2Z1bGxoZWFwL1JDQ29sbGVjdG9yLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvZnVsbGhlYXAvUkNDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY1ZWJiYy4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvZnVsbGhlYXAvUkNDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLnJlZmNvdW50LmZ1bGxoZWFwOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5UcmFjZUxvY2FsOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhbnNpdGl2ZUNsb3N1cmU7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5yZWZjb3VudC5SQ0Jhc2VDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBjb2xsZWN0b3IgY29udGV4dCBmb3IgYSBzaW1wbGUgcmVmZXJlbmNlIGNvdW50aW5nCi0gKiBjb2xsZWN0b3IuCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBjbGFzcyBSQ0NvbGxlY3RvciBleHRlbmRzIFJDQmFzZUNvbGxlY3RvciB7Ci0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogSW5pdGlhbGl6YXRpb24KLSAgICovCi0gIHByaXZhdGUgZmluYWwgUkNGaW5kUm9vdFNldFRyYWNlTG9jYWwgcm9vdFRyYWNlOwotICBwcml2YXRlIGZpbmFsIFJDTW9kaWZpZWRQcm9jZXNzb3IgbW9kUHJvY2Vzc29yOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBSQ0NvbGxlY3RvcigpIHsKLSAgICByb290VHJhY2UgPSBuZXcgUkNGaW5kUm9vdFNldFRyYWNlTG9jYWwoZ2xvYmFsKCkucm9vdFRyYWNlLCBuZXdSb290QnVmZmVyKTsKLSAgICBtb2RQcm9jZXNzb3IgPSBuZXcgUkNNb2RpZmllZFByb2Nlc3NvcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbW9kaWZpZWQgcHJvY2Vzc29yIHRvIHVzZS4KLSAgICovCi0gIHByb3RlY3RlZCBmaW5hbCBUcmFuc2l0aXZlQ2xvc3VyZSBnZXRNb2RpZmllZFByb2Nlc3NvcigpIHsKLSAgICByZXR1cm4gbW9kUHJvY2Vzc29yOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgcm9vdCB0cmFjZSB0byB1c2UuCi0gICAqLwotICBwcm90ZWN0ZWQgZmluYWwgVHJhY2VMb2NhbCBnZXRSb290VHJhY2UoKSB7Ci0gICAgcmV0dXJuIHJvb3RUcmFjZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3JlZmNvdW50L2Z1bGxoZWFwL1JDQ29uc3RyYWludHMuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9yZWZjb3VudC9mdWxsaGVhcC9SQ0NvbnN0cmFpbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OTk0ZmUuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3JlZmNvdW50L2Z1bGxoZWFwL1JDQ29uc3RyYWludHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLnJlZmNvdW50LmZ1bGxoZWFwOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5yZWZjb3VudC5SQ0Jhc2VDb25zdHJhaW50czsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGFuZCBpdHMgc3ViY2xhc3NlcyBjb21tdW5pY2F0ZSB0byB0aGUgaG9zdCBWTS9SdW50aW1lCi0gKiBhbnkgZmVhdHVyZXMgb2YgdGhlIHNlbGVjdGVkIHBsYW4gdGhhdCBpdCBuZWVkcyB0byBrbm93LiAgVGhpcyBpcwotICogc2VwYXJhdGUgZnJvbSB0aGUgbWFpbiBQbGFuL1BsYW5Mb2NhbCBjbGFzcyBpbiBvcmRlciB0byBieXBhc3MgYW55Ci0gKiBpc3N1ZXMgd2l0aCBvcmRlcmluZyBvZiBzdGF0aWMgaW5pdGlhbGl6YXRpb24uCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBjbGFzcyBSQ0NvbnN0cmFpbnRzIGV4dGVuZHMgUkNCYXNlQ29uc3RyYWludHMgewotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3JlZmNvdW50L2Z1bGxoZWFwL1JDRmluZFJvb3RTZXRUcmFjZUxvY2FsLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvZnVsbGhlYXAvUkNGaW5kUm9vdFNldFRyYWNlTG9jYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZlZWY2NS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvZnVsbGhlYXAvUkNGaW5kUm9vdFNldFRyYWNlTG9jYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLnJlZmNvdW50LmZ1bGxoZWFwOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5UcmFjZUxvY2FsOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhY2U7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5yZWZjb3VudC5SQ0Jhc2U7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5yZWZjb3VudC5SQ0hlYWRlcjsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmRlcXVlLk9iamVjdFJlZmVyZW5jZURlcXVlOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgdGhyZWFkLWxvY2FsIGNvcmUgZnVuY3Rpb25hbGl0eSBmb3IgYSB0cmFuc2l0aXZlCi0gKiBjbG9zdXJlIG92ZXIgdGhlIGhlYXAgZ3JhcGguCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBmaW5hbCBjbGFzcyBSQ0ZpbmRSb290U2V0VHJhY2VMb2NhbCBleHRlbmRzIFRyYWNlTG9jYWwgewotCi0gIHByaXZhdGUgZmluYWwgT2JqZWN0UmVmZXJlbmNlRGVxdWUgcm9vdEJ1ZmZlcjsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICovCi0gIHB1YmxpYyBSQ0ZpbmRSb290U2V0VHJhY2VMb2NhbChUcmFjZSB0cmFjZSwgT2JqZWN0UmVmZXJlbmNlRGVxdWUgcm9vdEJ1ZmZlcikgewotICAgIHN1cGVyKHRyYWNlKTsKLSAgICB0aGlzLnJvb3RCdWZmZXIgPSByb290QnVmZmVyOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogRXh0ZXJuYWxseSB2aXNpYmxlIE9iamVjdCBwcm9jZXNzaW5nIGFuZCB0cmFjaW5nCi0gICAqLwotCi0gIC8qKgotICAgKiBJcyB0aGUgc3BlY2lmaWVkIG9iamVjdCByZWFjaGFibGU/Ci0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdC4KLSAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIHJlYWNoYWJsZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTGl2ZShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgcmV0dXJuIFJDQmFzZS5pc1JDT2JqZWN0KG9iamVjdCkgJiYgUkNIZWFkZXIuaXNMaXZlUkMob2JqZWN0KSB8fCBzdXBlci5pc0xpdmUob2JqZWN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBXaGVuIHdlIHRyYWNlIGEgbm9uLXJvb3Qgb2JqZWN0IHdlIGRvIG5vdGhpbmcuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBiZSB0cmFjZWQuCi0gICAqIEByZXR1cm4gVGhlIG5ldyByZWZlcmVuY2UgdG8gdGhlIHNhbWUgb2JqZWN0IGluc3RhbmNlLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlIHRyYWNlT2JqZWN0KE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICByZXR1cm4gb2JqZWN0OwotICB9Ci0KLSAgLyoqCi0gICAqIFdoZW4gd2UgdHJhY2UgYSByb290IG9iamVjdCB3ZSByZW1lbWJlciBpdC4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIHRyYWNlZC4KLSAgICogQHJldHVybiBUaGUgbmV3IHJlZmVyZW5jZSB0byB0aGUgc2FtZSBvYmplY3QgaW5zdGFuY2UuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBPYmplY3RSZWZlcmVuY2UgdHJhY2VPYmplY3QoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCwgYm9vbGVhbiByb290KSB7Ci0gICAgaWYgKHJvb3QgJiYgUkNCYXNlLmlzUkNPYmplY3Qob2JqZWN0KSkgewotICAgICAgcm9vdEJ1ZmZlci5wdXNoKG9iamVjdCk7Ci0gICAgfQotICAgIHJldHVybiBvYmplY3Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9yZWZjb3VudC9mdWxsaGVhcC9SQ01vZGlmaWVkUHJvY2Vzc29yLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvZnVsbGhlYXAvUkNNb2RpZmllZFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzliNzI5Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9yZWZjb3VudC9mdWxsaGVhcC9SQ01vZGlmaWVkUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5yZWZjb3VudC5mdWxsaGVhcDsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhbnNpdGl2ZUNsb3N1cmU7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5yZWZjb3VudC5SQ0Jhc2U7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5yZWZjb3VudC5SQ0hlYWRlcjsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRoZSBmdW5kYW1lbnRhbCBtZWNoYW5pc20gZm9yIHBlcmZvcm1pbmcgYQotICogdHJhbnNpdGl2ZSBjbG9zdXJlIG92ZXIgYW4gb2JqZWN0IGdyYXBoLjxwPgotICoKLSAqIEBzZWUgb3JnLm1tdGsucGxhbi5UcmFjZUxvY2FsCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBmaW5hbCBjbGFzcyBSQ01vZGlmaWVkUHJvY2Vzc29yIGV4dGVuZHMgVHJhbnNpdGl2ZUNsb3N1cmUgewotCi0gIC8qKgotICAgKiBUcmFjZSBhbiBlZGdlIGR1cmluZyBHQy4KLSAgICoKLSAgICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIG9mIHRoZSByZWZlcmVuY2UuCi0gICAqIEBwYXJhbSBzbG90IFRoZSBsb2NhdGlvbiBjb250YWluaW5nIHRoZSBvYmplY3QgcmVmZXJlbmNlLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgdm9pZCBwcm9jZXNzRWRnZShPYmplY3RSZWZlcmVuY2Ugc291cmNlLCBBZGRyZXNzIHNsb3QpIHsKLSAgICBPYmplY3RSZWZlcmVuY2Ugb2JqZWN0ID0gc2xvdC5sb2FkT2JqZWN0UmVmZXJlbmNlKCk7Ci0gICAgaWYgKFJDQmFzZS5pc1JDT2JqZWN0KG9iamVjdCkpIHsKLSAgICAgIFJDSGVhZGVyLmluY1JDKG9iamVjdCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvZnVsbGhlYXAvUkNNdXRhdG9yLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvZnVsbGhlYXAvUkNNdXRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZmVjYzAuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3JlZmNvdW50L2Z1bGxoZWFwL1JDTXV0YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4ucmVmY291bnQuZnVsbGhlYXA7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLnJlZmNvdW50LlJDQmFzZU11dGF0b3I7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBtdXRhdG9yIGNvbnRleHQgZm9yIGEgc2ltcGxlIHJlZmVyZW5jZSBjb3VudGluZyBjb2xsZWN0b3IuCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBjbGFzcyBSQ011dGF0b3IgZXh0ZW5kcyBSQ0Jhc2VNdXRhdG9yIHsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9yZWZjb3VudC9nZW5lcmF0aW9uYWwvR2VuUkMuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9yZWZjb3VudC9nZW5lcmF0aW9uYWwvR2VuUkMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc5MjU2OC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvZ2VuZXJhdGlvbmFsL0dlblJDLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4ucmVmY291bnQuZ2VuZXJhdGlvbmFsOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5yZWZjb3VudC5SQ0Jhc2U7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LkNvcHlTcGFjZTsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5oZWFwLlZNUmVxdWVzdDsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnMuT3B0aW9uczsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLk9iamVjdFJlZmVyZW5jZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGdsb2JhbCBzdGF0ZSBvZiBhIGEgc2ltcGxlIHJlZmVyZW5jZSBjb3VudGluZyBjb2xsZWN0b3IuCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBjbGFzcyBHZW5SQyBleHRlbmRzIFJDQmFzZSB7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxMT0NfTlVSU0VSWSA9IEFMTE9DX0RFRkFVTFQ7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMTE9DX1JDICAgICAgPSBSQ0Jhc2UuQUxMT0NBVE9SUyArIDE7Ci0KLSAgLyoqIFRoZSBudXJzZXJ5IHNwYWNlIGlzIHdoZXJlIGFsbCBuZXcgb2JqZWN0cyBhcmUgYWxsb2NhdGVkIGJ5IGRlZmF1bHQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBDb3B5U3BhY2UgbnVyc2VyeVNwYWNlID0gbmV3IENvcHlTcGFjZSgibnVyc2VyeSIsIERFRkFVTFRfUE9MTF9GUkVRVUVOQ1ksIGZhbHNlLCBWTVJlcXVlc3QuY3JlYXRlKDAuMTVmLCB0cnVlKSk7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVSU0VSWSA9IG51cnNlcnlTcGFjZS5nZXREZXNjcmlwdG9yKCk7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbGxlY3Rpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSAoZ2xvYmFsKSBjb2xsZWN0aW9uIHBoYXNlLgotICAgKgotICAgKiBAcGFyYW0gcGhhc2VJZCBDb2xsZWN0aW9uIHBoYXNlCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCBjb2xsZWN0aW9uUGhhc2Uoc2hvcnQgcGhhc2VJZCkgewotICAgaWYgKHBoYXNlSWQgPT0gUFJFUEFSRSkgewotICAgICAgbnVyc2VyeVNwYWNlLnByZXBhcmUodHJ1ZSk7Ci0gICAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHBoYXNlSWQgPT0gUkVMRUFTRSkgewotICAgICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQpOwotICAgICAgbnVyc2VyeVNwYWNlLnJlbGVhc2UoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgY29udHJvbHMgdGhlIHRyaWdnZXJpbmcgb2YgYSBHQy4gSXQgaXMgY2FsbGVkIHBlcmlvZGljYWxseQotICAgKiBkdXJpbmcgYWxsb2NhdGlvbi4gUmV0dXJucyB0cnVlIHRvIHRyaWdnZXIgYSBjb2xsZWN0aW9uLgotICAgKgotICAgKiBAcGFyYW0gc3BhY2VGdWxsIFNwYWNlIHJlcXVlc3QgZmFpbGVkLCBtdXN0IHJlY292ZXIgcGFnZXMgd2l0aGluICdzcGFjZScuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiBhIGNvbGxlY3Rpb24gaXMgcmVxdWVzdGVkIGJ5IHRoZSBwbGFuLgotICAgKi8KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gY29sbGVjdGlvblJlcXVpcmVkKGJvb2xlYW4gc3BhY2VGdWxsKSB7Ci0gICAgYm9vbGVhbiBudXJzZXJ5RnVsbCA9IG51cnNlcnlTcGFjZS5yZXNlcnZlZFBhZ2VzKCkgPiBPcHRpb25zLm51cnNlcnlTaXplLmdldE1heE51cnNlcnkoKTsKLSAgICByZXR1cm4gc3VwZXIuY29sbGVjdGlvblJlcXVpcmVkKHNwYWNlRnVsbCkgfHwgbnVyc2VyeUZ1bGw7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQWNjb3VudGluZwotICAgKi8KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcGFnZXMgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uLCA8aT5hc3N1bWluZwotICAgKiBhbGwgZnV0dXJlIGFsbG9jYXRpb24gaXMgdG8gdGhlIG51cnNlcnk8L2k+LgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgcGFnZXMgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uLCA8aT5hc3N1bWluZwotICAgKiBhbGwgZnV0dXJlIGFsbG9jYXRpb24gaXMgdG8gdGhlIG51cnNlcnk8L2k+LgotICAgKi8KLSAgcHVibGljIGludCBnZXRQYWdlc0F2YWlsKCkgewotICAgIHJldHVybiBzdXBlci5nZXRQYWdlc0F2YWlsKCkgPj4gMTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBwYWdlcyByZXNlcnZlZCBmb3IgY29weWluZy4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHJlc2VydmVkIGdpdmVuIHRoZSBwZW5kaW5nCi0gICAqIGFsbG9jYXRpb24sIGluY2x1ZGluZyBzcGFjZSByZXNlcnZlZCBmb3IgY29weWluZy4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Q29sbGVjdGlvblJlc2VydmUoKSB7Ci0gICAgcmV0dXJuIG51cnNlcnlTcGFjZS5yZXNlcnZlZFBhZ2VzKCkgKyBzdXBlci5nZXRDb2xsZWN0aW9uUmVzZXJ2ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHBhZ2VzIGEgY29sbGVjdGlvbiBpcyByZXF1aXJlZCB0byBmcmVlIHRvIHNhdGlzZnkKLSAgICogb3V0c3RhbmRpbmcgYWxsb2NhdGlvbiByZXF1ZXN0cy4KLSAgICoKLSAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHBhZ2VzIGEgY29sbGVjdGlvbiBpcyByZXF1aXJlZCB0byBmcmVlIHRvIHNhdGlzZnkKLSAgICogb3V0c3RhbmRpbmcgYWxsb2NhdGlvbiByZXF1ZXN0cy4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0UGFnZXNSZXF1aXJlZCgpIHsKLSAgICByZXR1cm4gc3VwZXIuZ2V0UGFnZXNSZXF1aXJlZCgpICsgKG51cnNlcnlTcGFjZS5yZXF1aXJlZFBhZ2VzKCkgPDwgMSk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcubW10ay5wbGFuLlBsYW4jd2lsbE5ldmVyTW92ZQotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IE9iamVjdCBpbiBxdWVzdGlvbgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9iamVjdCB3aWxsIG5ldmVyIG1vdmUKLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiB3aWxsTmV2ZXJNb3ZlKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAoU3BhY2UuaXNJblNwYWNlKE5VUlNFUlksIG9iamVjdCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKFNwYWNlLmlzSW5TcGFjZShSRUZfQ09VTlRfTE9TLCBvYmplY3QpKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLndpbGxOZXZlck1vdmUob2JqZWN0KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3JlZmNvdW50L2dlbmVyYXRpb25hbC9HZW5SQ0NvbGxlY3Rvci5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3JlZmNvdW50L2dlbmVyYXRpb25hbC9HZW5SQ0NvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDY0NjdiLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9yZWZjb3VudC9nZW5lcmF0aW9uYWwvR2VuUkNDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5yZWZjb3VudC5nZW5lcmF0aW9uYWw7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYWNlTG9jYWw7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5UcmFuc2l0aXZlQ2xvc3VyZTsKLWltcG9ydCBvcmcubW10ay5wbGFuLnJlZmNvdW50LlJDQmFzZTsKLWltcG9ydCBvcmcubW10ay5wbGFuLnJlZmNvdW50LlJDQmFzZUNvbGxlY3RvcjsKLWltcG9ydCBvcmcubW10ay5wbGFuLnJlZmNvdW50LlJDSGVhZGVyOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5FeHBsaWNpdEZyZWVMaXN0TG9jYWw7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LkV4cGxpY2l0RnJlZUxpc3RTcGFjZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkZvcndhcmRpbmdXb3JkOwotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuQWRkcmVzczsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLk9iamVjdFJlZmVyZW5jZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGNvbGxlY3RvciBjb250ZXh0IGZvciBhIHNpbXBsZSByZWZlcmVuY2UgY291bnRpbmcKLSAqIGNvbGxlY3Rvci4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIEdlblJDQ29sbGVjdG9yIGV4dGVuZHMgUkNCYXNlQ29sbGVjdG9yIHsKLSAgcHJpdmF0ZSBmaW5hbCBHZW5SQ0ZpbmRSb290U2V0VHJhY2VMb2NhbCByb290VHJhY2U7Ci0gIHByaXZhdGUgZmluYWwgR2VuUkNNb2RpZmllZFByb2Nlc3NvciBtb2RQcm9jZXNzb3I7Ci0gIHByaXZhdGUgZmluYWwgRXhwbGljaXRGcmVlTGlzdExvY2FsIHJjOwotCi0gIHB1YmxpYyBHZW5SQ0NvbGxlY3RvcigpIHsKLSAgICByYyA9IG5ldyBFeHBsaWNpdEZyZWVMaXN0TG9jYWwoR2VuUkMucmNTcGFjZSk7Ci0gICAgcm9vdFRyYWNlID0gbmV3IEdlblJDRmluZFJvb3RTZXRUcmFjZUxvY2FsKGdsb2JhbCgpLnJvb3RUcmFjZSwgbmV3Um9vdEJ1ZmZlcik7Ci0gICAgbW9kUHJvY2Vzc29yID0gbmV3IEdlblJDTW9kaWZpZWRQcm9jZXNzb3Iocm9vdFRyYWNlKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbGxlY3Rpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSBwZXItY29sbGVjdG9yIGNvbGxlY3Rpb24gcGhhc2UuCi0gICAqCi0gICAqIEBwYXJhbSBwaGFzZUlkIFRoZSBjb2xsZWN0aW9uIHBoYXNlIHRvIHBlcmZvcm0KLSAgICogQHBhcmFtIHByaW1hcnkgcGVyZm9ybSBhbnkgc2luZ2xlLXRocmVhZGVkIGxvY2FsIGFjdGl2aXRpZXMuCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCBjb2xsZWN0aW9uUGhhc2Uoc2hvcnQgcGhhc2VJZCwgYm9vbGVhbiBwcmltYXJ5KSB7Ci0gICAgaWYgKHBoYXNlSWQgPT0gUkNCYXNlLlBSRVBBUkUpIHsKLSAgICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KTsKLSAgICAgIHJjLnByZXBhcmUoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBSQ0Jhc2UuUkVMRUFTRSkgewotICAgICAgcmMucmVsZWFzZSgpOwotICAgICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQsIHByaW1hcnkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbGxlY3Rpb24tdGltZSBhbGxvY2F0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBBbGxvY2F0ZSBzcGFjZSBmb3IgY29weWluZyBhbiBvYmplY3QgKHRoaXMgbWV0aG9kIDxpPmRvZXMgbm90PC9pPgotICAgKiBjb3B5IHRoZSBvYmplY3QsIGl0IG9ubHkgYWxsb2NhdGVzIHNwYWNlKQotICAgKgotICAgKiBAcGFyYW0gb3JpZ2luYWwgQSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIG9iamVjdAotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIHNpemUgb2YgdGhlIHNwYWNlIHRvIGJlIGFsbG9jYXRlZCAoaW4gYnl0ZXMpCi0gICAqIEBwYXJhbSBhbGlnbiBUaGUgcmVxdWVzdGVkIGFsaWdubWVudAotICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBhbGlnbm1lbnQgb2Zmc2V0Ci0gICAqIEByZXR1cm4gVGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGFsbG9jYXRlZCByZWdpb24KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGZpbmFsIEFkZHJlc3MgYWxsb2NDb3B5KE9iamVjdFJlZmVyZW5jZSBvcmlnaW5hbCwgaW50IGJ5dGVzLAotICAgICAgaW50IGFsaWduLCBpbnQgb2Zmc2V0LCBpbnQgYWxsb2NhdG9yKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSB7Ci0gICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQoYWxsb2NhdG9yID09IEdlblJDLkFMTE9DX1JDKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJjLmFsbG9jKGJ5dGVzLCBhbGlnbiwgb2Zmc2V0KTsKLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIGFueSBwb3N0LWNvcHkgYWN0aW9ucy4gIEluIHRoaXMgY2FzZSBub3RoaW5nIGlzIHJlcXVpcmVkLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBuZXdseSBhbGxvY2F0ZWQgb2JqZWN0Ci0gICAqIEBwYXJhbSB0eXBlUmVmIHRoZSB0eXBlIHJlZmVyZW5jZSBmb3IgdGhlIGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBzaXplIG9mIHRoZSBzcGFjZSB0byBiZSBhbGxvY2F0ZWQgKGluIGJ5dGVzKQotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgdm9pZCBwb3N0Q29weShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0LCBPYmplY3RSZWZlcmVuY2UgdHlwZVJlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzLCBpbnQgYWxsb2NhdG9yKSB7Ci0gICAgRm9yd2FyZGluZ1dvcmQuY2xlYXJGb3J3YXJkaW5nQml0cyhvYmplY3QpOwotICAgIFJDSGVhZGVyLmluaXRpYWxpemVIZWFkZXIob2JqZWN0LCBmYWxzZSk7Ci0gICAgUkNIZWFkZXIubWFrZVVubG9nZ2VkKG9iamVjdCk7Ci0gICAgRXhwbGljaXRGcmVlTGlzdFNwYWNlLnVuc3luY1NldExpdmVCaXQob2JqZWN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG1vZGlmaWVkIHByb2Nlc3NvciB0byB1c2UuCi0gICAqLwotICBwcm90ZWN0ZWQgZmluYWwgVHJhbnNpdGl2ZUNsb3N1cmUgZ2V0TW9kaWZpZWRQcm9jZXNzb3IoKSB7Ci0gICAgcmV0dXJuIG1vZFByb2Nlc3NvcjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHJvb3QgdHJhY2UgdG8gdXNlLgotICAgKi8KLSAgcHJvdGVjdGVkIGZpbmFsIFRyYWNlTG9jYWwgZ2V0Um9vdFRyYWNlKCkgewotICAgIHJldHVybiByb290VHJhY2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9yZWZjb3VudC9nZW5lcmF0aW9uYWwvR2VuUkNDb25zdHJhaW50cy5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3JlZmNvdW50L2dlbmVyYXRpb25hbC9HZW5SQ0NvbnN0cmFpbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlM2FmMzQuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3JlZmNvdW50L2dlbmVyYXRpb25hbC9HZW5SQ0NvbnN0cmFpbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5yZWZjb3VudC5nZW5lcmF0aW9uYWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLm1tdGsucG9saWN5LlNlZ3JlZ2F0ZWRGcmVlTGlzdFNwYWNlLk1BWF9GUkVFTElTVF9PQkpFQ1RfQllURVM7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLnJlZmNvdW50LlJDQmFzZUNvbnN0cmFpbnRzOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgYW5kIGl0cyBzdWJjbGFzc2VzIGNvbW11bmljYXRlIHRvIHRoZSBob3N0IFZNL1J1bnRpbWUKLSAqIGFueSBmZWF0dXJlcyBvZiB0aGUgc2VsZWN0ZWQgcGxhbiB0aGF0IGl0IG5lZWRzIHRvIGtub3cuICBUaGlzIGlzCi0gKiBzZXBhcmF0ZSBmcm9tIHRoZSBtYWluIFBsYW4vUGxhbkxvY2FsIGNsYXNzIGluIG9yZGVyIHRvIGJ5cGFzcyBhbnkKLSAqIGlzc3VlcyB3aXRoIG9yZGVyaW5nIG9mIHN0YXRpYyBpbml0aWFsaXphdGlvbi4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIEdlblJDQ29uc3RyYWludHMgZXh0ZW5kcyBSQ0Jhc2VDb25zdHJhaW50cyB7Ci0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBtb3Zlc09iamVjdHMoKSB7IHJldHVybiB0cnVlOyB9Ci0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IG1heE5vbkxPU0NvcHlCeXRlcygpIHsgcmV0dXJuIE1BWF9GUkVFTElTVF9PQkpFQ1RfQllURVM7fQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3JlZmNvdW50L2dlbmVyYXRpb25hbC9HZW5SQ0ZpbmRSb290U2V0VHJhY2VMb2NhbC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3JlZmNvdW50L2dlbmVyYXRpb25hbC9HZW5SQ0ZpbmRSb290U2V0VHJhY2VMb2NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2JlZjE2Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9yZWZjb3VudC9nZW5lcmF0aW9uYWwvR2VuUkNGaW5kUm9vdFNldFRyYWNlTG9jYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5yZWZjb3VudC5nZW5lcmF0aW9uYWw7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYWNlTG9jYWw7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5UcmFjZTsKLWltcG9ydCBvcmcubW10ay5wbGFuLnJlZmNvdW50LlJDSGVhZGVyOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmRlcXVlLk9iamVjdFJlZmVyZW5jZURlcXVlOwotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgdGhyZWFkLWxvY2FsIGNvcmUgZnVuY3Rpb25hbGl0eSBmb3IgYSB0cmFuc2l0aXZlCi0gKiBjbG9zdXJlIG92ZXIgdGhlIGhlYXAgZ3JhcGguCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBmaW5hbCBjbGFzcyBHZW5SQ0ZpbmRSb290U2V0VHJhY2VMb2NhbCBleHRlbmRzIFRyYWNlTG9jYWwgewotCi0gIHByaXZhdGUgZmluYWwgT2JqZWN0UmVmZXJlbmNlRGVxdWUgcm9vdEJ1ZmZlcjsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICovCi0gIHB1YmxpYyBHZW5SQ0ZpbmRSb290U2V0VHJhY2VMb2NhbChUcmFjZSB0cmFjZSwgT2JqZWN0UmVmZXJlbmNlRGVxdWUgcm9vdEJ1ZmZlcikgewotICAgIHN1cGVyKHRyYWNlKTsKLSAgICB0aGlzLnJvb3RCdWZmZXIgPSByb290QnVmZmVyOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogRXh0ZXJuYWxseSB2aXNpYmxlIE9iamVjdCBwcm9jZXNzaW5nIGFuZCB0cmFjaW5nCi0gICAqLwotCi0gIC8qKgotICAgKiBJcyB0aGUgc3BlY2lmaWVkIG9iamVjdCByZWFjaGFibGU/Ci0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdC4KLSAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIHJlYWNoYWJsZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTGl2ZShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgcmV0dXJuIEdlblJDLmlzUkNPYmplY3Qob2JqZWN0KSAmJiBSQ0hlYWRlci5pc0xpdmVSQyhvYmplY3QpIHx8Ci0gICAgICAgICAgKCFTcGFjZS5pc0luU3BhY2UoR2VuUkMuTlVSU0VSWSwgb2JqZWN0KSAmJiBzdXBlci5pc0xpdmUob2JqZWN0KSk7Ci0gIH0KLQotICAvKioKLSAgICogV2hlbiB3ZSB0cmFjZSBhIG5vbi1yb290IG9iamVjdCB3ZSBkbyBub3RoaW5nLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgdHJhY2VkLgotICAgKiBAcmV0dXJuIFRoZSBuZXcgcmVmZXJlbmNlIHRvIHRoZSBzYW1lIG9iamVjdCBpbnN0YW5jZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIE9iamVjdFJlZmVyZW5jZSB0cmFjZU9iamVjdChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgcmV0dXJuIHRyYWNlT2JqZWN0KG9iamVjdCwgZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFdoZW4gd2UgdHJhY2UgYSByb290IG9iamVjdCB3ZSByZW1lbWJlciBpdC4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIHRyYWNlZC4KLSAgICogQHJldHVybiBUaGUgbmV3IHJlZmVyZW5jZSB0byB0aGUgc2FtZSBvYmplY3QgaW5zdGFuY2UuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBPYmplY3RSZWZlcmVuY2UgdHJhY2VPYmplY3QoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCwgYm9vbGVhbiByb290KSB7Ci0gICAgaWYgKG9iamVjdC5pc051bGwoKSkgcmV0dXJuIG9iamVjdDsKLQotICAgIGlmIChTcGFjZS5pc0luU3BhY2UoR2VuUkMuTlVSU0VSWSwgb2JqZWN0KSkgewotICAgICAgb2JqZWN0ID0gR2VuUkMubnVyc2VyeVNwYWNlLnRyYWNlT2JqZWN0KHRoaXMsIG9iamVjdCwgR2VuUkMuQUxMT0NfUkMpOwotICAgIH0gZWxzZSBpZiAoIUdlblJDLmlzUkNPYmplY3Qob2JqZWN0KSkgewotICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICB9Ci0KLSAgICBpZiAocm9vdCkgewotICAgICAgcm9vdEJ1ZmZlci5wdXNoKG9iamVjdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFJDSGVhZGVyLmluY1JDKG9iamVjdCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG9iamVjdDsKLSAgfQotCi0gIC8qKgotICAgKiBFbnN1cmUgdGhhdCB0aGUgcmVmZXJlbmNlZCBvYmplY3Qgd2lsbCBub3QgbW92ZSBmcm9tIHRoaXMgcG9pbnQgdGhyb3VnaAotICAgKiB0byB0aGUgZW5kIG9mIHRoZSBjb2xsZWN0aW9uLiBUaGlzIGNhbiBpbnZvbHZlIGZvcndhcmRpbmcgdGhlIG9iamVjdAotICAgKiBpZiBuZWNlc3NhcnkuCi0gICAqCi0gICAqIDxpPk5vbi1jb3B5aW5nIGNvbGxlY3RvcnMgZG8gbm90aGluZywgY29weWluZyBjb2xsZWN0b3JzIG11c3QKLSAgICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4gZWFjaCBvZiB0aGVpciB0cmFjZSBjbGFzc2VzLjwvaT4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRoYXQgbXVzdCBub3QgbW92ZSBkdXJpbmcgdGhlIGNvbGxlY3Rpb24uCi0gICAqIEByZXR1cm4gVHJ1ZSBJZiB0aGUgb2JqZWN0IHdpbGwgbm90IG1vdmUgZHVyaW5nIGNvbGxlY3Rpb24KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHdpbGxOb3RNb3ZlSW5DdXJyZW50Q29sbGVjdGlvbihPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoIW9iamVjdC5pc051bGwoKSk7Ci0gICAgcmV0dXJuICEoU3BhY2UuaXNJblNwYWNlKEdlblJDLk5VUlNFUlksIG9iamVjdCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEVuc3VyZSB0aGF0IHRoaXMgb2JqZWN0IHdpbGwgbm90IG1vdmUgZm9yIHRoZSByZXN0IG9mIHRoZSBHQy4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRoYXQgbXVzdCBub3QgbW92ZQotICAgKiBAcmV0dXJuIFRoZSBuZXcgb2JqZWN0LCBndWFyYW50ZWVkIHN0YWJsZSBmb3IgdGhlIHJlc3Qgb2YgdGhlIEdDLgotICAgKi8KLSAgcHVibGljIE9iamVjdFJlZmVyZW5jZSBwcmVjb3B5T2JqZWN0KE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAoU3BhY2UuaXNJblNwYWNlKEdlblJDLk5VUlNFUlksIG9iamVjdCkpIHsKLSAgICAgIHJldHVybiBHZW5SQy5udXJzZXJ5U3BhY2UudHJhY2VPYmplY3QodGhpcywgb2JqZWN0LCBHZW5SQy5BTExPQ19SQyk7Ci0gICAgfQotICAgIHJldHVybiBvYmplY3Q7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3JlZmNvdW50L2dlbmVyYXRpb25hbC9HZW5SQ01vZGlmaWVkUHJvY2Vzc29yLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvZ2VuZXJhdGlvbmFsL0dlblJDTW9kaWZpZWRQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA2MzEyMy4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvZ2VuZXJhdGlvbmFsL0dlblJDTW9kaWZpZWRQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLnJlZmNvdW50LmdlbmVyYXRpb25hbDsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhbnNpdGl2ZUNsb3N1cmU7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5yZWZjb3VudC5SQ0hlYWRlcjsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB0aGUgZnVuZGFtZW50YWwgbWVjaGFuaXNtIGZvciBwZXJmb3JtaW5nIGEKLSAqIHRyYW5zaXRpdmUgY2xvc3VyZSBvdmVyIGFuIG9iamVjdCBncmFwaC48cD4KLSAqCi0gKiBAc2VlIG9yZy5tbXRrLnBsYW4uVHJhY2VMb2NhbAotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgZmluYWwgY2xhc3MgR2VuUkNNb2RpZmllZFByb2Nlc3NvciBleHRlbmRzIFRyYW5zaXRpdmVDbG9zdXJlIHsKLQotICAgIHByaXZhdGUgZmluYWwgR2VuUkNGaW5kUm9vdFNldFRyYWNlTG9jYWwgdHJhY2U7Ci0KLSAgICBwdWJsaWMgR2VuUkNNb2RpZmllZFByb2Nlc3NvcihHZW5SQ0ZpbmRSb290U2V0VHJhY2VMb2NhbCB0cmFjZSkgewotICAgICAgdGhpcy50cmFjZSA9IHRyYWNlOwotICAgIH0KLQotICAvKioKLSAgICogVHJhY2UgYW4gZWRnZSBkdXJpbmcgR0MuCi0gICAqCi0gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvZiB0aGUgcmVmZXJlbmNlLgotICAgKiBAcGFyYW0gc2xvdCBUaGUgbG9jYXRpb24gY29udGFpbmluZyB0aGUgb2JqZWN0IHJlZmVyZW5jZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHZvaWQgcHJvY2Vzc0VkZ2UoT2JqZWN0UmVmZXJlbmNlIHNvdXJjZSwgQWRkcmVzcyBzbG90KSB7Ci0gICAgT2JqZWN0UmVmZXJlbmNlIG9iamVjdCA9IHNsb3QubG9hZE9iamVjdFJlZmVyZW5jZSgpOwotICAgIGlmICghb2JqZWN0LmlzTnVsbCgpKSB7Ci0gICAgICBpZiAoU3BhY2UuaXNJblNwYWNlKEdlblJDLk5VUlNFUlksIG9iamVjdCkpIHsKLSAgICAgICAgb2JqZWN0ID0gR2VuUkMubnVyc2VyeVNwYWNlLnRyYWNlT2JqZWN0KHRyYWNlLCBvYmplY3QsIEdlblJDLkFMTE9DX1JDKTsKLSAgICAgICAgUkNIZWFkZXIuaW5jUkMob2JqZWN0KTsKLSAgICAgICAgc2xvdC5zdG9yZShvYmplY3QpOwotICAgICAgfSBlbHNlIGlmIChHZW5SQy5pc1JDT2JqZWN0KG9iamVjdCkpIHsKLSAgICAgICAgUkNIZWFkZXIuaW5jUkMob2JqZWN0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9yZWZjb3VudC9nZW5lcmF0aW9uYWwvR2VuUkNNdXRhdG9yLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vcmVmY291bnQvZ2VuZXJhdGlvbmFsL0dlblJDTXV0YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNThhM2Q5Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9yZWZjb3VudC9nZW5lcmF0aW9uYWwvR2VuUkNNdXRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4ucmVmY291bnQuZ2VuZXJhdGlvbmFsOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5yZWZjb3VudC5SQ0Jhc2U7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5yZWZjb3VudC5SQ0Jhc2VNdXRhdG9yOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5Db3B5TG9jYWw7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LlNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuYWxsb2MuQWxsb2NhdG9yOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuQWRkcmVzczsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLk9iamVjdFJlZmVyZW5jZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIG11dGF0b3IgY29udGV4dCBmb3IgYSBzaW1wbGUgcmVmZXJlbmNlIGNvdW50aW5nIGNvbGxlY3Rvci4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIEdlblJDTXV0YXRvciBleHRlbmRzIFJDQmFzZU11dGF0b3IgewotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIEluc3RhbmNlIGZpZWxkcwotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBDb3B5TG9jYWwgbnVyc2VyeTsKLQotICBwdWJsaWMgR2VuUkNNdXRhdG9yKCkgewotICAgIG51cnNlcnkgPSBuZXcgQ29weUxvY2FsKEdlblJDLm51cnNlcnlTcGFjZSk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBNdXRhdG9yLXRpbWUgYWxsb2NhdGlvbgotICAgKi8KLQotICAvKioKLSAgICogQWxsb2NhdGUgbWVtb3J5IGZvciBhbiBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBieXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgb2JqZWN0LgotICAgKiBAcGFyYW0gYWxpZ24gUmVxdWlyZWQgYWxpZ25tZW50IGZvciB0aGUgb2JqZWN0LgotICAgKiBAcGFyYW0gb2Zmc2V0IE9mZnNldCBhc3NvY2lhdGVkIHdpdGggdGhlIGFsaWdubWVudC4KLSAgICogQHBhcmFtIGFsbG9jYXRvciBUaGUgYWxsb2NhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QuCi0gICAqIEBwYXJhbSBzaXRlIEFsbG9jYXRpb24gc2l0ZQotICAgKiBAcmV0dXJuIFRoZSBhZGRyZXNzIG9mIHRoZSBuZXdseSBhbGxvY2F0ZWQgbWVtb3J5LgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgQWRkcmVzcyBhbGxvYyhpbnQgYnl0ZXMsIGludCBhbGlnbiwgaW50IG9mZnNldCwgaW50IGFsbG9jYXRvciwgaW50IHNpdGUpIHsKLSAgICBpZiAoYWxsb2NhdG9yID09IEdlblJDLkFMTE9DX05VUlNFUlkpIHsKLSAgICAgIHJldHVybiBudXJzZXJ5LmFsbG9jKGJ5dGVzLCBhbGlnbiwgb2Zmc2V0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLmFsbG9jKGJ5dGVzLCBhbGlnbiwgb2Zmc2V0LCBhbGxvY2F0b3IsIHNpdGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFBlcmZvcm0gcG9zdC1hbGxvY2F0aW9uIGFjdGlvbnMuICBGb3IgbWFueSBhbGxvY2F0b3JzIG5vbmUgYXJlCi0gICAqIHJlcXVpcmVkLgotICAgKgotICAgKiBAcGFyYW0gcmVmIFRoZSBuZXdseSBhbGxvY2F0ZWQgb2JqZWN0Ci0gICAqIEBwYXJhbSB0eXBlUmVmIHRoZSB0eXBlIHJlZmVyZW5jZSBmb3IgdGhlIGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBzaXplIG9mIHRoZSBzcGFjZSB0byBiZSBhbGxvY2F0ZWQgKGluIGJ5dGVzKQotICAgKiBAcGFyYW0gYWxsb2NhdG9yIFRoZSBhbGxvY2F0b3IgbnVtYmVyIHRvIGJlIHVzZWQgZm9yIHRoaXMgYWxsb2NhdGlvbgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgdm9pZCBwb3N0QWxsb2MoT2JqZWN0UmVmZXJlbmNlIHJlZiwgT2JqZWN0UmVmZXJlbmNlIHR5cGVSZWYsIGludCBieXRlcywgaW50IGFsbG9jYXRvcikgewotICAgIGlmIChhbGxvY2F0b3IgPT0gR2VuUkMuQUxMT0NfTlVSU0VSWSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzdXBlci5wb3N0QWxsb2MocmVmLCB0eXBlUmVmLCBieXRlcywgYWxsb2NhdG9yKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGFsbG9jYXRvciBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggYSBzcGFjZQotICAgKiA8Y29kZT5zcGFjZTwvY29kZT4sIGZvciB0aGlzIHBsYW4gaW5zdGFuY2UuCi0gICAqCi0gICAqIEBwYXJhbSBzcGFjZSBUaGUgc3BhY2UgZm9yIHdoaWNoIHRoZSBhbGxvY2F0b3IgaW5zdGFuY2UgaXMgZGVzaXJlZC4KLSAgICogQHJldHVybiBUaGUgYWxsb2NhdG9yIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBsYW4gaW5zdGFuY2UKLSAgICogd2hpY2ggaXMgYWxsb2NhdGluZyBpbnRvIDxjb2RlPnNwYWNlPC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICogaWYgbm8gYXBwcm9wcmlhdGUgYWxsb2NhdG9yIGNhbiBiZSBlc3RhYmxpc2hlZC4KLSAgICovCi0gIHB1YmxpYyBBbGxvY2F0b3IgZ2V0QWxsb2NhdG9yRnJvbVNwYWNlKFNwYWNlIHNwYWNlKSB7Ci0gICAgaWYgKHNwYWNlID09IEdlblJDLm51cnNlcnlTcGFjZSkgcmV0dXJuIG51cnNlcnk7Ci0KLSAgICByZXR1cm4gc3VwZXIuZ2V0QWxsb2NhdG9yRnJvbVNwYWNlKHNwYWNlKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbGxlY3Rpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSBwZXItbXV0YXRvciBjb2xsZWN0aW9uIHBoYXNlLgotICAgKgotICAgKiBAcGFyYW0gcGhhc2VJZCBUaGUgY29sbGVjdGlvbiBwaGFzZSB0byBwZXJmb3JtCi0gICAqIEBwYXJhbSBwcmltYXJ5IHBlcmZvcm0gYW55IHNpbmdsZS10aHJlYWRlZCBsb2NhbCBhY3Rpdml0aWVzLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgY29sbGVjdGlvblBoYXNlKHNob3J0IHBoYXNlSWQsIGJvb2xlYW4gcHJpbWFyeSkgewotICAgIGlmIChwaGFzZUlkID09IFJDQmFzZS5QUkVQQVJFKSB7Ci0gICAgICBudXJzZXJ5LnJlYmluZChHZW5SQy5udXJzZXJ5U3BhY2UpOwotICAgICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQsIHByaW1hcnkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3NlbWlzcGFjZS9TUy5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3NlbWlzcGFjZS9TUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2JjMzhhLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9zZW1pc3BhY2UvU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5zZW1pc3BhY2U7Ci0KLWltcG9ydCBvcmcubW10ay5wb2xpY3kuQ29weVNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLWltcG9ydCBvcmcubW10ay5wbGFuLio7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5oZWFwLlZNUmVxdWVzdDsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBzaW1wbGUgc2VtaS1zcGFjZSBjb2xsZWN0b3IuIFNlZSB0aGUgSm9uZXMKLSAqICYgTGlucyBHQyBib29rLCBzZWN0aW9uIDIuMiBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIGJhc2ljCi0gKiBhbGdvcml0aG0uIFRoaXMgaW1wbGVtZW50YXRpb24gYWxzbyBpbmNsdWRlcyBhIGxhcmdlIG9iamVjdCBzcGFjZQotICogKExPUyksIGFuZCBhbiB1bmNvbGxlY3RlZCAiaW1tb3J0YWwiIHNwYWNlLjxwPgotICoKLSAqIEFsbCBwbGFucyBtYWtlIGEgY2xlYXIgZGlzdGluY3Rpb24gYmV0d2VlbiA8aT5nbG9iYWw8L2k+IGFuZAotICogPGk+dGhyZWFkLWxvY2FsPC9pPiBhY3Rpdml0aWVzLiAgR2xvYmFsIGFjdGl2aXRpZXMgbXVzdCBiZQotICogc3luY2hyb25pemVkLCB3aGVyZWFzIG5vIHN5bmNocm9uaXphdGlvbiBpcyByZXF1aXJlZCBmb3IKLSAqIHRocmVhZC1sb2NhbCBhY3Rpdml0aWVzLiAgSW5zdGFuY2VzIG9mIFBsYW4gbWFwIDE6MSB0byAia2VybmVsCi0gKiB0aHJlYWRzIiAoYWthIENQVXMpLiAgVGh1cyBpbnN0YW5jZQotICogbWV0aG9kcyBhbGxvdyBmYXN0LCB1bnN5Y2hyb25pemVkIGFjY2VzcyB0byBQbGFuIHV0aWxpdGllcyBzdWNoIGFzCi0gKiBhbGxvY2F0aW9uIGFuZCBjb2xsZWN0aW9uLiAgRWFjaCBpbnN0YW5jZSByZXN0cyBvbiBzdGF0aWMgcmVzb3VyY2VzCi0gKiAoc3VjaCBhcyBtZW1vcnkgYW5kIHZpcnR1YWwgbWVtb3J5IHJlc291cmNlcykgd2hpY2ggYXJlICJnbG9iYWwiCi0gKiBhbmQgdGhlcmVmb3JlICJzdGF0aWMiIG1lbWJlcnMgb2YgUGxhbi4gIFRoaXMgbWFwcGluZyBvZiB0aHJlYWRzIHRvCi0gKiBpbnN0YW5jZXMgaXMgY3J1Y2lhbCB0byB1bmRlcnN0YW5kaW5nIHRoZSBjb3JyZWN0bmVzcyBhbmQKLSAqIHBlcmZvcm1hbmNlIHByb3BydGllcyBvZiB0aGlzIHBsYW4uCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBjbGFzcyBTUyBleHRlbmRzIFN0b3BUaGVXb3JsZCB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQ2xhc3MgdmFyaWFibGVzCi0gICAqLwotCi0gIC8qKiBUcnVlIGlmIGFsbG9jYXRpbmcgaW50byB0aGUgImhpZ2hlciIgc2VtaXNwYWNlICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoaSA9IGZhbHNlOyAvLyBUcnVlIGlmIGFsbG9jaW5nIHRvICJoaWdoZXIiIHNlbWlzcGFjZQotCi0gIC8qKiBPbmUgb2YgdGhlIHR3byBzZW1pIHNwYWNlcyB0aGF0IGFsdGVybmF0ZSByb2xlcyBhdCBlYWNoIGNvbGxlY3Rpb24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBDb3B5U3BhY2UgY29weVNwYWNlMCA9IG5ldyBDb3B5U3BhY2UoInNzMCIsIERFRkFVTFRfUE9MTF9GUkVRVUVOQ1ksIGZhbHNlLCBWTVJlcXVlc3QuY3JlYXRlKCkpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUzAgPSBjb3B5U3BhY2UwLmdldERlc2NyaXB0b3IoKTsKLQotICAvKiogT25lIG9mIHRoZSB0d28gc2VtaSBzcGFjZXMgdGhhdCBhbHRlcm5hdGUgcm9sZXMgYXQgZWFjaCBjb2xsZWN0aW9uICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29weVNwYWNlIGNvcHlTcGFjZTEgPSBuZXcgQ29weVNwYWNlKCJzczEiLCBERUZBVUxUX1BPTExfRlJFUVVFTkNZLCB0cnVlLCBWTVJlcXVlc3QuY3JlYXRlKCkpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUzEgPSBjb3B5U3BhY2UxLmdldERlc2NyaXB0b3IoKTsKLQotICBwdWJsaWMgZmluYWwgVHJhY2Ugc3NUcmFjZTsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbml0aWFsaXphdGlvbgotICAgKi8KLQotICAvKioKLSAgICogQ2xhc3MgdmFyaWFibGVzCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExPQ19TUyA9IFBsYW4uQUxMT0NfREVGQVVMVDsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ0FOX1NTID0gMDsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICovCi0gIHB1YmxpYyBTUygpIHsKLSAgICBzc1RyYWNlID0gbmV3IFRyYWNlKG1ldGFEYXRhU3BhY2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gVGhlIHRvIHNwYWNlIGZvciB0aGUgY3VycmVudCBjb2xsZWN0aW9uLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIENvcHlTcGFjZSB0b1NwYWNlKCkgewotICAgIHJldHVybiBoaSA/IGNvcHlTcGFjZTEgOiBjb3B5U3BhY2UwOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gVGhlIGZyb20gc3BhY2UgZm9yIHRoZSBjdXJyZW50IGNvbGxlY3Rpb24uCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBzdGF0aWMgQ29weVNwYWNlIGZyb21TcGFjZSgpIHsKLSAgICByZXR1cm4gaGkgPyBjb3B5U3BhY2UwIDogY29weVNwYWNlMTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQ29sbGVjdGlvbgotICAgKi8KLQotICAvKioKLSAgICogUGVyZm9ybSBhIChnbG9iYWwpIGNvbGxlY3Rpb24gcGhhc2UuCi0gICAqCi0gICAqIEBwYXJhbSBwaGFzZUlkIENvbGxlY3Rpb24gcGhhc2UKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHZvaWQgY29sbGVjdGlvblBoYXNlKHNob3J0IHBoYXNlSWQpIHsKLSAgICBpZiAocGhhc2VJZCA9PSBTUy5QUkVQQVJFKSB7Ci0gICAgICBoaSA9ICFoaTsgLy8gZmxpcCB0aGUgc2VtaS1zcGFjZXMKLSAgICAgIC8vIHByZXBhcmUgZWFjaCBvZiB0aGUgY29sbGVjdGVkIHJlZ2lvbnMKLSAgICAgIGNvcHlTcGFjZTAucHJlcGFyZShoaSk7Ci0gICAgICBjb3B5U3BhY2UxLnByZXBhcmUoIWhpKTsKLSAgICAgIHNzVHJhY2UucHJlcGFyZSgpOwotICAgICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAocGhhc2VJZCA9PSBDTE9TVVJFKSB7Ci0gICAgICBzc1RyYWNlLnByZXBhcmUoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHBoYXNlSWQgPT0gU1MuUkVMRUFTRSkgewotICAgICAgLy8gcmVsZWFzZSB0aGUgY29sbGVjdGVkIHJlZ2lvbgotICAgICAgZnJvbVNwYWNlKCkucmVsZWFzZSgpOwotCi0gICAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQWNjb3VudGluZwotICAgKi8KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcGFnZXMgcmVzZXJ2ZWQgZm9yIGNvcHlpbmcuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBwYWdlcyByZXNlcnZlZCBnaXZlbiB0aGUgcGVuZGluZwotICAgKiBhbGxvY2F0aW9uLCBpbmNsdWRpbmcgc3BhY2UgcmVzZXJ2ZWQgZm9yIGNvcHlpbmcuCi0gICAqLwotICBwdWJsaWMgZmluYWwgaW50IGdldENvbGxlY3Rpb25SZXNlcnZlKCkgewotICAgIC8vIHdlIG11c3QgYWNjb3VudCBmb3IgdGhlIG51bWJlciBvZiBwYWdlcyByZXF1aXJlZCBmb3IgY29weWluZywKLSAgICAvLyB3aGljaCBlcXVhbHMgdGhlIG51bWJlciBvZiBzZW1pLXNwYWNlIHBhZ2VzIHJlc2VydmVkCi0gICAgcmV0dXJuIHRvU3BhY2UoKS5yZXNlcnZlZFBhZ2VzKCkgKyBzdXBlci5nZXRDb2xsZWN0aW9uUmVzZXJ2ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHBhZ2VzIHJlc2VydmVkIGZvciB1c2UgZ2l2ZW4gdGhlIHBlbmRpbmcKLSAgICogYWxsb2NhdGlvbi4gIFRoaXMgaXMgPGk+ZXhjbHVzaXZlIG9mPC9pPiBzcGFjZSByZXNlcnZlZCBmb3IKLSAgICogY29weWluZy4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHJlc2VydmVkIGdpdmVuIHRoZSBwZW5kaW5nCi0gICAqIGFsbG9jYXRpb24sIGV4Y2x1ZGluZyBzcGFjZSByZXNlcnZlZCBmb3IgY29weWluZy4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0UGFnZXNVc2VkKCkgewotICAgIHJldHVybiBzdXBlci5nZXRQYWdlc1VzZWQoKSArIHRvU3BhY2UoKS5yZXNlcnZlZFBhZ2VzKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcGFnZXMgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uLCA8aT5hc3N1bWluZwotICAgKiBhbGwgZnV0dXJlIGFsbG9jYXRpb24gaXMgdG8gdGhlIHNlbWktc3BhY2U8L2k+LgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgcGFnZXMgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uLCA8aT5hc3N1bWluZwotICAgKiBhbGwgZnV0dXJlIGFsbG9jYXRpb24gaXMgdG8gdGhlIHNlbWktc3BhY2U8L2k+LgotICAgKi8KLSAgcHVibGljIGZpbmFsIGludCBnZXRQYWdlc0F2YWlsKCkgewotICAgIHJldHVybihzdXBlci5nZXRQYWdlc0F2YWlsKCkpID4+IDE7Ci0gIH0KLQotICAvKioKLSAgICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgcGFnZXMgYSBjb2xsZWN0aW9uIGlzIHJlcXVpcmVkIHRvIGZyZWUgdG8gc2F0aXNmeQotICAgKiBvdXRzdGFuZGluZyBhbGxvY2F0aW9uIHJlcXVlc3RzLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcGFnZXMgYSBjb2xsZWN0aW9uIGlzIHJlcXVpcmVkIHRvIGZyZWUgdG8gc2F0aXNmeQotICAgKiBvdXRzdGFuZGluZyBhbGxvY2F0aW9uIHJlcXVlc3RzLgotICAgKi8KLSAgcHVibGljIGludCBnZXRQYWdlc1JlcXVpcmVkKCkgewotICAgIHJldHVybiBzdXBlci5nZXRQYWdlc1JlcXVpcmVkKCkgKyAodG9TcGFjZSgpLnJlcXVpcmVkUGFnZXMoKSA8PCAxKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5tbXRrLnBsYW4uUGxhbiN3aWxsTmV2ZXJNb3ZlCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgT2JqZWN0IGluIHF1ZXN0aW9uCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgb2JqZWN0IHdpbGwgbmV2ZXIgbW92ZQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIHdpbGxOZXZlck1vdmUoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmIChTcGFjZS5pc0luU3BhY2UoU1MwLCBvYmplY3QpIHx8IFNwYWNlLmlzSW5TcGFjZShTUzEsIG9iamVjdCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHN1cGVyLndpbGxOZXZlck1vdmUob2JqZWN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWdpc3RlciBzcGVjaWFsaXplZCBtZXRob2RzLgotICAgKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJTcGVjaWFsaXplZE1ldGhvZHMoKSB7Ci0gICAgVHJhbnNpdGl2ZUNsb3N1cmUucmVnaXN0ZXJTcGVjaWFsaXplZFNjYW4oU0NBTl9TUywgU1NUcmFjZUxvY2FsLmNsYXNzKTsKLSAgICBzdXBlci5yZWdpc3RlclNwZWNpYWxpemVkTWV0aG9kcygpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc2VtaXNwYWNlL1NTQ29sbGVjdG9yLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc2VtaXNwYWNlL1NTQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MjFiOGEuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3NlbWlzcGFjZS9TU0NvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLnNlbWlzcGFjZTsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uKjsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuQ29weUxvY2FsOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5MYXJnZU9iamVjdExvY2FsOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkZvcndhcmRpbmdXb3JkOwotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyA8aT5wZXItY29sbGVjdG9yIHRocmVhZDwvaT4gYmVoYXZpb3IKLSAqIGFuZCBzdGF0ZSBmb3IgdGhlIDxpPlNTPC9pPiBwbGFuLCB3aGljaCBpbXBsZW1lbnRzIGEgZnVsbC1oZWFwCi0gKiBzZW1pLXNwYWNlIGNvbGxlY3Rvci48cD4KLSAqCi0gKiBTcGVjaWZpY2FsbHksIHRoaXMgY2xhc3MgZGVmaW5lcyA8aT5TUzwvaT4gY29sbGVjdGlvbiBiZWhhdmlvcgotICogKHRocm91Z2ggPGNvZGU+dHJhY2U8L2NvZGU+IGFuZCB0aGUgPGNvZGU+Y29sbGVjdGlvblBoYXNlPC9jb2RlPgotICogbWV0aG9kKSwgYW5kIGNvbGxlY3Rpb24tdGltZSBhbGxvY2F0aW9uIChjb3B5aW5nIG9mIG9iamVjdHMpLjxwPgotICoKLSAqIFNlZSB7QGxpbmsgU1N9IGZvciBhbiBvdmVydmlldyBvZiB0aGUgc2VtaS1zcGFjZSBhbGdvcml0aG0uPHA+Ci0gKgotICogQHNlZSBTUwotICogQHNlZSBTU011dGF0b3IKLSAqIEBzZWUgU3RvcFRoZVdvcmxkQ29sbGVjdG9yCi0gKiBAc2VlIENvbGxlY3RvckNvbnRleHQKLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIFNTQ29sbGVjdG9yIGV4dGVuZHMgU3RvcFRoZVdvcmxkQ29sbGVjdG9yIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBJbnN0YW5jZSBmaWVsZHMKLSAgICovCi0KLSAgcHJvdGVjdGVkIGZpbmFsIFNTVHJhY2VMb2NhbCB0cmFjZTsKLSAgcHJvdGVjdGVkIGZpbmFsIENvcHlMb2NhbCBzczsKLSAgcHJvdGVjdGVkIGZpbmFsIExhcmdlT2JqZWN0TG9jYWwgbG9zOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluaXRpYWxpemF0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIFNTQ29sbGVjdG9yKCkgewotICAgIHRoaXMobmV3IFNTVHJhY2VMb2NhbChnbG9iYWwoKS5zc1RyYWNlKSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICogQHBhcmFtIHRyIFRoZSB0cmFjZSB0byB1c2UKLSAgICovCi0gIHByb3RlY3RlZCBTU0NvbGxlY3RvcihTU1RyYWNlTG9jYWwgdHIpIHsKLSAgICBzcyA9IG5ldyBDb3B5TG9jYWwoKTsKLSAgICBsb3MgPSBuZXcgTGFyZ2VPYmplY3RMb2NhbChQbGFuLmxvU3BhY2UpOwotICAgIHRyYWNlID0gdHI7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDb2xsZWN0aW9uLXRpbWUgYWxsb2NhdGlvbgotICAgKi8KLQotICAvKioKLSAgICogQWxsb2NhdGUgc3BhY2UgZm9yIGNvcHlpbmcgYW4gb2JqZWN0ICh0aGlzIG1ldGhvZCA8aT5kb2VzIG5vdDwvaT4KLSAgICogY29weSB0aGUgb2JqZWN0LCBpdCBvbmx5IGFsbG9jYXRlcyBzcGFjZSkKLSAgICoKLSAgICogQHBhcmFtIG9yaWdpbmFsIEEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCBvYmplY3QKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBzaXplIG9mIHRoZSBzcGFjZSB0byBiZSBhbGxvY2F0ZWQgKGluIGJ5dGVzKQotICAgKiBAcGFyYW0gYWxpZ24gVGhlIHJlcXVlc3RlZCBhbGlnbm1lbnQuCi0gICAqIEBwYXJhbSBvZmZzZXQgVGhlIGFsaWdubWVudCBvZmZzZXQuCi0gICAqIEByZXR1cm4gVGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGFsbG9jYXRlZCByZWdpb24KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIEFkZHJlc3MgYWxsb2NDb3B5KE9iamVjdFJlZmVyZW5jZSBvcmlnaW5hbCwgaW50IGJ5dGVzLAotICAgICAgaW50IGFsaWduLCBpbnQgb2Zmc2V0LCBpbnQgYWxsb2NhdG9yKSB7Ci0gICAgaWYgKGFsbG9jYXRvciA9PSBQbGFuLkFMTE9DX0xPUykgewotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoYnl0ZXMgPiBQbGFuLk1BWF9OT05fTE9TX0NPUFlfQllURVMpOwotICAgICAgcmV0dXJuIGxvcy5hbGxvYyhieXRlcywgYWxpZ24sIG9mZnNldCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgewotICAgICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQoYnl0ZXMgPD0gUGxhbi5NQVhfTk9OX0xPU19DT1BZX0JZVEVTKTsKLSAgICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGFsbG9jYXRvciA9PSBTUy5BTExPQ19TUyk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc3MuYWxsb2MoYnl0ZXMsIGFsaWduLCBvZmZzZXQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIGFueSBwb3N0LWNvcHkgYWN0aW9ucy4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgbmV3bHkgYWxsb2NhdGVkIG9iamVjdAotICAgKiBAcGFyYW0gdHlwZVJlZiB0aGUgdHlwZSByZWZlcmVuY2UgZm9yIHRoZSBpbnN0YW5jZSBiZWluZyBjcmVhdGVkCi0gICAqIEBwYXJhbSBieXRlcyBUaGUgc2l6ZSBvZiB0aGUgc3BhY2UgdG8gYmUgYWxsb2NhdGVkIChpbiBieXRlcykKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHZvaWQgcG9zdENvcHkoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCwgT2JqZWN0UmVmZXJlbmNlIHR5cGVSZWYsCi0gICAgICBpbnQgYnl0ZXMsIGludCBhbGxvY2F0b3IpIHsKLSAgICBGb3J3YXJkaW5nV29yZC5jbGVhckZvcndhcmRpbmdCaXRzKG9iamVjdCk7Ci0gICAgaWYgKGFsbG9jYXRvciA9PSBQbGFuLkFMTE9DX0xPUykKLSAgICAgIFBsYW4ubG9TcGFjZS5pbml0aWFsaXplSGVhZGVyKG9iamVjdCwgZmFsc2UpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQ29sbGVjdGlvbgotICAgKi8KLQotICAvKioKLSAgICogUGVyZm9ybSBhIHBlci1jb2xsZWN0b3IgY29sbGVjdGlvbiBwaGFzZS4KLSAgICoKLSAgICogQHBhcmFtIHBoYXNlSWQgVGhlIGNvbGxlY3Rpb24gcGhhc2UgdG8gcGVyZm9ybQotICAgKiBAcGFyYW0gcHJpbWFyeSBQZXJmb3JtIGFueSBzaW5nbGUtdGhyZWFkZWQgYWN0aXZpdGllcyB1c2luZyB0aGlzIHRocmVhZC4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHZvaWQgY29sbGVjdGlvblBoYXNlKHNob3J0IHBoYXNlSWQsIGJvb2xlYW4gcHJpbWFyeSkgewotICAgIGlmIChwaGFzZUlkID09IFNTLlBSRVBBUkUpIHsKLSAgICAgIC8vIHJlYmluZCB0aGUgY29weSBidW1wIHBvaW50ZXIgdG8gdGhlIGFwcHJvcHJpYXRlIHNlbWlzcGFjZS4KLSAgICAgIHNzLnJlYmluZChTUy50b1NwYWNlKCkpOwotICAgICAgbG9zLnByZXBhcmUodHJ1ZSk7Ci0gICAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHBoYXNlSWQgPT0gU1MuQ0xPU1VSRSkgewotICAgICAgdHJhY2UuY29tcGxldGVUcmFjZSgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwaGFzZUlkID09IFNTLlJFTEVBU0UpIHsKLSAgICAgIHRyYWNlLnJlbGVhc2UoKTsKLSAgICAgIGxvcy5yZWxlYXNlKHRydWUpOwotICAgICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQsIHByaW1hcnkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogT2JqZWN0IHByb2Nlc3NpbmcgYW5kIHRyYWNpbmcKLSAgICovCi0KLSAgLyoqCi0gICAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiByZWZlcmVuY2UgaXMgdG8gYW4gb2JqZWN0IHRoYXQgaXMgd2l0aGluCi0gICAqIG9uZSBvZiB0aGUgc2VtaS1zcGFjZXMuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCBpbiBxdWVzdGlvbgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGdpdmVuIHJlZmVyZW5jZSBpcyB0byBhbiBvYmplY3QgdGhhdCBpcyB3aXRoaW4KLSAgICogb25lIG9mIHRoZSBzZW1pLXNwYWNlcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NlbWlTcGFjZU9iamVjdChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgcmV0dXJuIFNwYWNlLmlzSW5TcGFjZShTUy5TUzAsIG9iamVjdCkgfHwgU3BhY2UuaXNJblNwYWNlKFNTLlNTMSwgb2JqZWN0KTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIE1pc2NlbGxhbmVvdXMKLSAgICovCi0KLSAgLyoqIEByZXR1cm4gVGhlIGFjdGl2ZSBnbG9iYWwgcGxhbiBhcyBhbiA8Y29kZT5TUzwvY29kZT4gaW5zdGFuY2UuICovCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSBzdGF0aWMgU1MgZ2xvYmFsKCkgewotICAgIHJldHVybiAoU1MpIFZNLmFjdGl2ZVBsYW4uZ2xvYmFsKCk7Ci0gIH0KLQotICAvKiogQHJldHVybiB0aGUgY3VycmVudCB0cmFjZSBvYmplY3QuICovCi0gIHB1YmxpYyBUcmFjZUxvY2FsIGdldEN1cnJlbnRUcmFjZSgpIHsKLSAgICByZXR1cm4gdHJhY2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9zZW1pc3BhY2UvU1NDb25zdHJhaW50cy5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3NlbWlzcGFjZS9TU0NvbnN0cmFpbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMTU1NjEuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3NlbWlzcGFjZS9TU0NvbnN0cmFpbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5zZW1pc3BhY2U7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLio7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LkNvcHlTcGFjZTsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBTZW1pU3BhY2UgY29tbW9uIGNvbnN0YW50cy4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIFNTQ29uc3RyYWludHMgZXh0ZW5kcyBTdG9wVGhlV29ybGRDb25zdHJhaW50cyB7Ci0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBtb3Zlc09iamVjdHMoKSB7IHJldHVybiB0cnVlOyB9Ci0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IGdjSGVhZGVyQml0cygpIHsgcmV0dXJuIENvcHlTcGFjZS5MT0NBTF9HQ19CSVRTX1JFUVVJUkVEOyB9Ci0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IGdjSGVhZGVyV29yZHMoKSB7IHJldHVybiBDb3B5U3BhY2UuR0NfSEVBREVSX1dPUkRTX1JFUVVJUkVEOyB9Ci0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IG51bVNwZWNpYWxpemVkU2NhbnMoKSB7IHJldHVybiAxOyB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc2VtaXNwYWNlL1NTTXV0YXRvci5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3NlbWlzcGFjZS9TU011dGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE0OTAwZi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc2VtaXNwYWNlL1NTTXV0YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLnNlbWlzcGFjZTsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uKjsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuQ29weUxvY2FsOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmFsbG9jLkFsbG9jYXRvcjsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgPGk+cGVyLW11dGF0b3IgdGhyZWFkPC9pPiBiZWhhdmlvcgotICogYW5kIHN0YXRlIGZvciB0aGUgPGk+U1M8L2k+IHBsYW4sIHdoaWNoIGltcGxlbWVudHMgYSBmdWxsLWhlYXAKLSAqIHNlbWktc3BhY2UgY29sbGVjdG9yLjxwPgotICoKLSAqIFNwZWNpZmljYWxseSwgdGhpcyBjbGFzcyBkZWZpbmVzIDxpPlNTPC9pPiBtdXRhdG9yLXRpbWUgYWxsb2NhdGlvbgotICogYW5kIHBlci1tdXRhdG9yIHRocmVhZCBjb2xsZWN0aW9uIHNlbWFudGljcyAoZmx1c2hpbmcgYW5kIHJlc3RvcmluZwotICogcGVyLW11dGF0b3IgYWxsb2NhdG9yIHN0YXRlKS48cD4KLSAqCi0gKiBTZWUge0BsaW5rIFNTfSBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIHNlbWktc3BhY2UgYWxnb3JpdGhtLjxwPgotICoKLSAqIEBzZWUgU1MKLSAqIEBzZWUgU1NDb2xsZWN0b3IKLSAqIEBzZWUgU3RvcFRoZVdvcmxkTXV0YXRvcgotICogQHNlZSBNdXRhdG9yQ29udGV4dAotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgY2xhc3MgU1NNdXRhdG9yIGV4dGVuZHMgU3RvcFRoZVdvcmxkTXV0YXRvciB7Ci0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIEluc3RhbmNlIGZpZWxkcwotICAgKi8KLSAgcHJvdGVjdGVkIGZpbmFsIENvcHlMb2NhbCBzczsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbml0aWFsaXphdGlvbgotICAgKi8KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICovCi0gIHB1YmxpYyBTU011dGF0b3IoKSB7Ci0gICAgc3MgPSBuZXcgQ29weUxvY2FsKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FsbGVkIGJlZm9yZSB0aGUgTXV0YXRvckNvbnRleHQgaXMgdXNlZCwgYnV0IGFmdGVyIHRoZSBjb250ZXh0IGhhcyBiZWVuCi0gICAqIGZ1bGx5IHJlZ2lzdGVyZWQgYW5kIGlzIHZpc2libGUgdG8gY29sbGVjdGlvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXRNdXRhdG9yKGludCBpZCkgewotICAgIHN1cGVyLmluaXRNdXRhdG9yKGlkKTsKLSAgICBzcy5yZWJpbmQoU1MudG9TcGFjZSgpKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIE11dGF0b3ItdGltZSBhbGxvY2F0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBBbGxvY2F0ZSBzcGFjZSAoZm9yIGFuIG9iamVjdCkKLSAgICoKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBzaXplIG9mIHRoZSBzcGFjZSB0byBiZSBhbGxvY2F0ZWQgKGluIGJ5dGVzKQotICAgKiBAcGFyYW0gYWxpZ24gVGhlIHJlcXVlc3RlZCBhbGlnbm1lbnQuCi0gICAqIEBwYXJhbSBvZmZzZXQgVGhlIGFsaWdubWVudCBvZmZzZXQuCi0gICAqIEBwYXJhbSBhbGxvY2F0b3IgVGhlIGFsbG9jYXRvciBudW1iZXIgdG8gYmUgdXNlZCBmb3IgdGhpcyBhbGxvY2F0aW9uCi0gICAqIEBwYXJhbSBzaXRlIEFsbG9jYXRpb24gc2l0ZQotICAgKiBAcmV0dXJuIFRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBhbGxvY2F0ZWQgcmVnaW9uCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBBZGRyZXNzIGFsbG9jKGludCBieXRlcywgaW50IGFsaWduLCBpbnQgb2Zmc2V0LCBpbnQgYWxsb2NhdG9yLCBpbnQgc2l0ZSkgewotICAgIGlmIChhbGxvY2F0b3IgPT0gU1MuQUxMT0NfU1MpCi0gICAgICByZXR1cm4gc3MuYWxsb2MoYnl0ZXMsIGFsaWduLCBvZmZzZXQpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBzdXBlci5hbGxvYyhieXRlcywgYWxpZ24sIG9mZnNldCwgYWxsb2NhdG9yLCBzaXRlKTsKLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIHBvc3QtYWxsb2NhdGlvbiBhY3Rpb25zLiAgRm9yIG1hbnkgYWxsb2NhdG9ycyBub25lIGFyZQotICAgKiByZXF1aXJlZC4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgbmV3bHkgYWxsb2NhdGVkIG9iamVjdAotICAgKiBAcGFyYW0gdHlwZVJlZiBUaGUgdHlwZSByZWZlcmVuY2UgZm9yIHRoZSBpbnN0YW5jZSBiZWluZyBjcmVhdGVkCi0gICAqIEBwYXJhbSBieXRlcyBUaGUgc2l6ZSBvZiB0aGUgc3BhY2UgdG8gYmUgYWxsb2NhdGVkIChpbiBieXRlcykKLSAgICogQHBhcmFtIGFsbG9jYXRvciBUaGUgYWxsb2NhdG9yIG51bWJlciB0byBiZSB1c2VkIGZvciB0aGlzIGFsbG9jYXRpb24KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHZvaWQgcG9zdEFsbG9jKE9iamVjdFJlZmVyZW5jZSBvYmplY3QsIE9iamVjdFJlZmVyZW5jZSB0eXBlUmVmLAotICAgICAgaW50IGJ5dGVzLCBpbnQgYWxsb2NhdG9yKSB7Ci0gICAgaWYgKGFsbG9jYXRvciA9PSBTUy5BTExPQ19TUykgcmV0dXJuOwotICAgIHN1cGVyLnBvc3RBbGxvYyhvYmplY3QsIHR5cGVSZWYsIGJ5dGVzLCBhbGxvY2F0b3IpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgYWxsb2NhdG9yIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBhIHNwYWNlCi0gICAqIDxjb2RlPnNwYWNlPC9jb2RlPiwgZm9yIHRoaXMgcGxhbiBpbnN0YW5jZS4KLSAgICoKLSAgICogQHBhcmFtIHNwYWNlIFRoZSBzcGFjZSBmb3Igd2hpY2ggdGhlIGFsbG9jYXRvciBpbnN0YW5jZSBpcyBkZXNpcmVkLgotICAgKiBAcmV0dXJuIFRoZSBhbGxvY2F0b3IgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGxhbiBpbnN0YW5jZQotICAgKiB3aGljaCBpcyBhbGxvY2F0aW5nIGludG8gPGNvZGU+c3BhY2U8L2NvZGU+LCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgKiBpZiBubyBhcHByb3ByaWF0ZSBhbGxvY2F0b3IgY2FuIGJlIGVzdGFibGlzaGVkLgotICAgKi8KLSAgcHVibGljIEFsbG9jYXRvciBnZXRBbGxvY2F0b3JGcm9tU3BhY2UoU3BhY2Ugc3BhY2UpIHsKLSAgICBpZiAoc3BhY2UgPT0gU1MuY29weVNwYWNlMCB8fCBzcGFjZSA9PSBTUy5jb3B5U3BhY2UxKSByZXR1cm4gc3M7Ci0gICAgcmV0dXJuIHN1cGVyLmdldEFsbG9jYXRvckZyb21TcGFjZShzcGFjZSk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDb2xsZWN0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBQZXJmb3JtIGEgcGVyLW11dGF0b3IgY29sbGVjdGlvbiBwaGFzZS4KLSAgICoKLSAgICogQHBhcmFtIHBoYXNlSWQgVGhlIGNvbGxlY3Rpb24gcGhhc2UgdG8gcGVyZm9ybQotICAgKiBAcGFyYW0gcHJpbWFyeSBQZXJmb3JtIGFueSBzaW5nbGUtdGhyZWFkZWQgYWN0aXZpdGllcyB1c2luZyB0aGlzIHRocmVhZC4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHZvaWQgY29sbGVjdGlvblBoYXNlKHNob3J0IHBoYXNlSWQsIGJvb2xlYW4gcHJpbWFyeSkgewotICAgIGlmIChwaGFzZUlkID09IFNTLlBSRVBBUkUpIHsKLSAgICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBTUy5SRUxFQVNFKSB7Ci0gICAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gICAgICAvLyByZWJpbmQgdGhlIGFsbG9jYXRpb24gYnVtcCBwb2ludGVyIHRvIHRoZSBhcHByb3ByaWF0ZSBzZW1pc3BhY2UuCi0gICAgICBzcy5yZWJpbmQoU1MudG9TcGFjZSgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIE1pc2NlbGxhbmVvdXMKLSAgICovCi0KLSAgLyoqCi0gICAqIFNob3cgdGhlIHN0YXR1cyBvZiBlYWNoIG9mIHRoZSBhbGxvY2F0b3JzLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgc2hvdygpIHsKLSAgICBzcy5zaG93KCk7Ci0gICAgbG9zLnNob3coKTsKLSAgICBpbW1vcnRhbC5zaG93KCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3NlbWlzcGFjZS9TU1RyYWNlTG9jYWwuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9zZW1pc3BhY2UvU1NUcmFjZUxvY2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlY2ZiZDkuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3NlbWlzcGFjZS9TU1RyYWNlTG9jYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5zZW1pc3BhY2U7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYWNlTG9jYWw7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5UcmFjZTsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsbWVudHMgdGhlIGNvcmUgZnVuY3Rpb25hbGl0eSBmb3IgYSB0cmFuc2l0aXZlCi0gKiBjbG9zdXJlIG92ZXIgdGhlIGhlYXAgZ3JhcGguCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBjbGFzcyBTU1RyYWNlTG9jYWwgZXh0ZW5kcyBUcmFjZUxvY2FsIHsKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqLwotICBwdWJsaWMgU1NUcmFjZUxvY2FsKFRyYWNlIHRyYWNlLCBib29sZWFuIHNwZWNpYWxpemVkKSB7Ci0gICAgc3VwZXIoc3BlY2lhbGl6ZWQgPyBTUy5TQ0FOX1NTIDogLTEsIHRyYWNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIFNTVHJhY2VMb2NhbChUcmFjZSB0cmFjZSkgewotICAgIHRoaXModHJhY2UsIHRydWUpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogRXh0ZXJuYWxseSB2aXNpYmxlIE9iamVjdCBwcm9jZXNzaW5nIGFuZCB0cmFjaW5nCi0gICAqLwotCi0gIC8qKgotICAgKiBSZXR1cm4gdHJ1ZSBpZiA8Y29kZT5vYmo8L2NvZGU+IGlzIGEgbGl2ZSBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCBpbiBxdWVzdGlvbgotICAgKiBAcmV0dXJuIFRydWUgaWYgPGNvZGU+b2JqPC9jb2RlPiBpcyBhIGxpdmUgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNMaXZlKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAob2JqZWN0LmlzTnVsbCgpKSByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKFNwYWNlLmlzSW5TcGFjZShTUy5TUzAsIG9iamVjdCkpCi0gICAgICByZXR1cm4gU1MuaGkgPyBTUy5jb3B5U3BhY2UwLmlzTGl2ZShvYmplY3QpIDogdHJ1ZTsKLSAgICBpZiAoU3BhY2UuaXNJblNwYWNlKFNTLlNTMSwgb2JqZWN0KSkKLSAgICAgIHJldHVybiBTUy5oaSA/IHRydWUgOiBTUy5jb3B5U3BhY2UxLmlzTGl2ZShvYmplY3QpOwotICAgIHJldHVybiBzdXBlci5pc0xpdmUob2JqZWN0KTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIHRoZSBjb3JlIG1ldGhvZCBkdXJpbmcgdGhlIHRyYWNlIG9mIHRoZSBvYmplY3QgZ3JhcGguCi0gICAqIFRoZSByb2xlIG9mIHRoaXMgbWV0aG9kIGlzIHRvOgotICAgKgotICAgKiAxLiBFbnN1cmUgdGhlIHRyYWNlZCBvYmplY3QgaXMgbm90IGNvbGxlY3RlZC4KLSAgICogMi4gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdmlzaXQgdG8gdGhlIG9iamVjdCBlbnF1ZXVlIGl0IHRvIGJlIHNjYW5uZWQuCi0gICAqIDMuIFJldHVybiB0aGUgZm9yd2FyZGVkIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgdHJhY2VkLgotICAgKiBAcmV0dXJuIFRoZSBuZXcgcmVmZXJlbmNlIHRvIHRoZSBzYW1lIG9iamVjdCBpbnN0YW5jZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIE9iamVjdFJlZmVyZW5jZSB0cmFjZU9iamVjdChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKG9iamVjdC5pc051bGwoKSkgcmV0dXJuIG9iamVjdDsKLSAgICBpZiAoU3BhY2UuaXNJblNwYWNlKFNTLlNTMCwgb2JqZWN0KSkKLSAgICAgIHJldHVybiBTUy5jb3B5U3BhY2UwLnRyYWNlT2JqZWN0KHRoaXMsIG9iamVjdCwgU1MuQUxMT0NfU1MpOwotICAgIGlmIChTcGFjZS5pc0luU3BhY2UoU1MuU1MxLCBvYmplY3QpKQotICAgICAgcmV0dXJuIFNTLmNvcHlTcGFjZTEudHJhY2VPYmplY3QodGhpcywgb2JqZWN0LCBTUy5BTExPQ19TUyk7Ci0gICAgcmV0dXJuIHN1cGVyLnRyYWNlT2JqZWN0KG9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogRW5zdXJlIHRoYXQgdGhpcyBvYmplY3Qgd2lsbCBub3QgbW92ZSBmb3IgdGhlIHJlc3Qgb2YgdGhlIEdDLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdGhhdCBtdXN0IG5vdCBtb3ZlCi0gICAqIEByZXR1cm4gVGhlIG5ldyBvYmplY3QsIGd1YXJhbnRlZWQgc3RhYmxlIGZvciB0aGUgcmVzdCBvZiB0aGUgR0MuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBPYmplY3RSZWZlcmVuY2UgcHJlY29weU9iamVjdChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKG9iamVjdC5pc051bGwoKSkgcmV0dXJuIG9iamVjdDsKLSAgICBpZiAoU3BhY2UuaXNJblNwYWNlKFNTLlNTMCwgb2JqZWN0KSkKLSAgICAgIHJldHVybiBTUy5jb3B5U3BhY2UwLnRyYWNlT2JqZWN0KHRoaXMsIG9iamVjdCwgU1MuQUxMT0NfU1MpOwotICAgIGlmIChTcGFjZS5pc0luU3BhY2UoU1MuU1MxLCBvYmplY3QpKQotICAgICAgcmV0dXJuIFNTLmNvcHlTcGFjZTEudHJhY2VPYmplY3QodGhpcywgb2JqZWN0LCBTUy5BTExPQ19TUyk7Ci0gICAgcmV0dXJuIG9iamVjdDsKLSAgfQotCi0gIC8qKgotICAgKiBXaWxsIHRoaXMgb2JqZWN0IG1vdmUgZnJvbSB0aGlzIHBvaW50IG9uLCBkdXJpbmcgdGhlIGN1cnJlbnQgdHJhY2UgPwotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgb2JqZWN0IHdpbGwgbm90IG1vdmUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiB3aWxsTm90TW92ZUluQ3VycmVudENvbGxlY3Rpb24oT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIHJldHVybiAoU1MuaGkgJiYgIVNwYWNlLmlzSW5TcGFjZShTUy5TUzAsIG9iamVjdCkpIHx8Ci0gICAgICAgICAgICghU1MuaGkgJiYgIVNwYWNlLmlzSW5TcGFjZShTUy5TUzEsIG9iamVjdCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc2VtaXNwYWNlL2djc3B5L1NTR0NzcHkuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9zZW1pc3BhY2UvZ2NzcHkvU1NHQ3NweS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGM4OWMxLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9zZW1pc3BhY2UvZ2NzcHkvU1NHQ3NweS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLnNlbWlzcGFjZS5nY3NweTsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uR0NzcHlQbGFuOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uUGhhc2U7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5UcmFuc2l0aXZlQ2xvc3VyZTsKLWltcG9ydCBvcmcubW10ay5wbGFuLnNlbWlzcGFjZS5TUzsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuQ29weVNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5MYXJnZU9iamVjdFNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZ2NzcHkuZHJpdmVycy5BYnN0cmFjdERyaXZlcjsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lmdjc3B5LmRyaXZlcnMuTGluZWFyU3BhY2VEcml2ZXI7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5nY3NweS5kcml2ZXJzLkltbW9ydGFsU3BhY2VEcml2ZXI7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5nY3NweS5kcml2ZXJzLlRyZWFkbWlsbERyaXZlcjsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lmdjc3B5LkdDc3B5OwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuTG9nOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkub3B0aW9ucy5PcHRpb25zOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBleHRlbmRzIGEgc2ltcGxlIHNlbWktc3BhY2UgY29sbGVjdG9yIHRvIGluc3RydW1lbnQgaXQgZm9yCi0gKiBHQ3NweS4gPHA+Ci0gKgotICogU2VlIHRoZSBKb25lcyAmIExpbnMgR0MgYm9vaywgc2VjdGlvbiAyLjIgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBiYXNpYwotICogYWxnb3JpdGhtLiBUaGlzIGltcGxlbWVudGF0aW9uIGFsc28gaW5jbHVkZXMgYSBsYXJnZSBvYmplY3Qgc3BhY2UKLSAqIChMT1MpLCBhbmQgYW4gdW5jb2xsZWN0ZWQgImltbW9ydGFsIiBzcGFjZS48cD4KLSAqCi0gKiBBbGwgcGxhbnMgbWFrZSBhIGNsZWFyIGRpc3RpbmN0aW9uIGJldHdlZW4gPGk+Z2xvYmFsPC9pPiBhbmQKLSAqIDxpPnRocmVhZC1sb2NhbDwvaT4gYWN0aXZpdGllcy4gIEdsb2JhbCBhY3Rpdml0aWVzIG11c3QgYmUKLSAqIHN5bmNocm9uaXplZCwgd2hlcmVhcyBubyBzeW5jaHJvbml6YXRpb24gaXMgcmVxdWlyZWQgZm9yCi0gKiB0aHJlYWQtbG9jYWwgYWN0aXZpdGllcy4gIEluc3RhbmNlcyBvZiBQbGFuIG1hcCAxOjEgdG8gImtlcm5lbAotICogdGhyZWFkcyIgKGFrYSBDUFVzKS4gIFRodXMgaW5zdGFuY2UKLSAqIG1ldGhvZHMgYWxsb3cgZmFzdCwgdW5zeWNocm9uaXplZCBhY2Nlc3MgdG8gUGxhbiB1dGlsaXRpZXMgc3VjaCBhcwotICogYWxsb2NhdGlvbiBhbmQgY29sbGVjdGlvbi4gIEVhY2ggaW5zdGFuY2UgcmVzdHMgb24gc3RhdGljIHJlc291cmNlcwotICogKHN1Y2ggYXMgbWVtb3J5IGFuZCB2aXJ0dWFsIG1lbW9yeSByZXNvdXJjZXMpIHdoaWNoIGFyZSAiZ2xvYmFsIgotICogYW5kIHRoZXJlZm9yZSAic3RhdGljIiBtZW1iZXJzIG9mIFBsYW4uICBUaGlzIG1hcHBpbmcgb2YgdGhyZWFkcyB0bwotICogaW5zdGFuY2VzIGlzIGNydWNpYWwgdG8gdW5kZXJzdGFuZGluZyB0aGUgY29ycmVjdG5lc3MgYW5kCi0gKiBwZXJmb3JtYW5jZSBwcm9wcnRpZXMgb2YgdGhpcyBwbGFuLgotICoKLSAqIEZJWE1FIFRoaXMgc2VlbXMgdG8gaGF2ZSBjaGFuZ2VkCi0gKiBUaGUgb3JkZXIgb2YgcGhhc2VzIGFuZCBHQ3NweSBhY3Rpb25zIGlzIGltcG9ydGFudCBoZXJlLiBJdCBpczoKLSAqICAgUFJFUEFSRSBwaGFzZQotICogICAgICBTU0dDc3B5TXV0YXRvci5nY3NweUdhdGhlckRhdGEoU1NHQ3NweS5CRUZPUkVfQ09MTEVDVElPTik7IC8vIHNhZmVwb2ludAotICogICAgICBTU011dGF0b3IuUFJFUEFSRSAvLyBGSVhNRSBET0VTIE5PVCBzcy5yZWJpbmQoU1MudG9TcGFjZSgpKTsKLSAqCi0gKiAgIFBSRVBBUkUgcGhhc2UKLSAqICAgICAgU1MuUFJFUEFSRSAvLyBmbGlwIHNlbWlzcGFjZXMKLSAqICAgICAgZ2NzcHlTcGFjZS5wcmVwYXJlKCk7Ci0gKiAgICAgIFNTR0NzcHlDb2xsZWN0b3IuZ2NzcHlHYXRoZXJEYXRhKFNTR0NzcHkuQkVGT1JFX0NPTExFQ1RJT04pOwotICogICAgICBTU0NvbGxlY3Rvci5QUkVQQVJFIC8vIHNzLnJlYmluZChTUy50b1NwYWNlKCkpOwotICoKLSAqCi0gKiAgIEZPUldBUkRfRklOQUxJWkFCTEUgcGhhc2UKLSAqICAgICAgU1NDb2xsZWN0b3IuRk9SV0FSRF9GSU5BTElaQUJMRQotICogICAgICBTU0dDc3B5Q29sbGVjdG9yLmdjc3B5R2F0aGVyRGF0YShTU0dDc3B5LlNFTUlTUEFDRV9DT1BJRUQpOwotICoKLSAqICAgUkVMRUFTRSBwaGFzZQotICogICAgICBTU0dDc3B5TXV0YXRvci5nY3NweUdhdGhlckRhdGEoU1NHQ3NweS5TRU1JU1BBQ0VfQ09QSUVEKTsgLy8gc2FmZXBvaW50Ci0gKiAgICAgIFNTTXV0YXRvci5SRUxFQVNFIC8vIEZJWE1FIHNzLnJlYmluZChTUy50b1NwYWNlKCkpOwotICogICAgICBTU0dDc3B5TXV0YXRvci5nY3NweUdhdGhlckRhdGEoU1NHQ3NweS5BRlRFUl9DT0xMRUNUSU9OKTsKLSAqCi0gKiAgIFJFTEVBU0UgcGhhc2UKLSAqICAgICAgU1NDb2xsZWN0b3IuUkVMRUFTRQotICogICAgICBTU0dDc3B5Q29sbGVjdG9yLmdjc3B5R2F0aGVyRGF0YShTU0dDc3B5LkFGVEVSX0NPTExFQ1RJT04pOwotICogICAgICBTUy5SRUxFQVNFCi0gKiAgICAgIGdjc3B5U3BhY2UucmVsZWFzZSgpOwotICogICAgICBTU0dDc3B5Lmdjc3B5R2F0aGVyRGF0YSgpOyAvLyBzYWZlcG9pbnQKLSAqCi0gKiBOb3RlIHRoYXQgU1NNdXRhdG9yIGhhcyBjaGFuZ2VkIHRoZSBwb2ludCBhdCB3aGljaCBpdCByZWJpbmRzIHRvU3BhY2UKLSAqIGZyb20gUFJFUEFSRSAoMi40LjYpIHRvIGFmdGVyIFJFTEVBU0UgKDMueC54KS4KLSAqCi0gLS1QaGFzZSBDb2xsZWN0b3IuaW5pdGlhdGUKLSAtLVBoYXNlIE11dGF0b3IuaW5pdGlhdGUtbXV0YXRvcgotIC0tUGhhc2UgTXV0YXRvci5wcmVwYXJlLW11dGF0b3IKLSAgICAgU1NHQ3NweU11dGF0b3IuZ2NzcHlHYXRoZXJEYXRhLCBldmVudD0wCi0gLS1QaGFzZSBQbGFuLnByZXBhcmUKLSAtLVBoYXNlIENvbGxlY3Rvci5wcmVwYXJlCi0gICAgIFNTR0NzcHlDb2xsZWN0b3IuZ2NzcHlHYXRoZXJEYXRhLCBldmVudD0wCi0gLS1QaGFzZSBDb2xsZWN0b3IucHJlY29weQotIC0tUGhhc2UgQ29sbGVjdG9yLmJvb3RpbWFnZS1yb290Ci0gLS1QaGFzZSBDb2xsZWN0b3Iucm9vdAotIC0tUGhhc2UgUGxhbi5yb290Ci0gLS1QaGFzZSBDb2xsZWN0b3Iuc3RhcnQtY2xvc3VyZQotIC0tUGhhc2UgQ29sbGVjdG9yLnNvZnQtcmVmCi0gLS1QaGFzZSBDb2xsZWN0b3IuY29tcGxldGUtY2xvc3VyZQotIC0tUGhhc2UgQ29sbGVjdG9yLndlYWstcmVmCi0gLS1QaGFzZSBDb2xsZWN0b3IuZmluYWxpemUKLSAtLVBoYXNlIENvbGxlY3Rvci5jb21wbGV0ZS1jbG9zdXJlCi0gLS1QaGFzZSBDb2xsZWN0b3IucGhhbnRvbS1yZWYKLSAtLVBoYXNlIENvbGxlY3Rvci5mb3J3YXJkLXJlZgotIC0tUGhhc2UgQ29sbGVjdG9yLmZvcndhcmQtZmluYWxpemUKLSAgICAgU1NHQ3NweUNvbGxlY3Rvci5nY3NweUdhdGhlckRhdGEsIGV2ZW50PTEKLSAtLVBoYXNlIE11dGF0b3IucmVsZWFzZS1tdXRhdG9yCi0gICAgIFNTR0NzcHlNdXRhdG9yLmdjc3B5R2F0aGVyRGF0YSwgZXZlbnQ9MQotICAgICBTU0dDc3B5TXV0YXRvci5nY3NweUdhdGhlckRhdGEsIGV2ZW50PTIKLSAtLVBoYXNlIENvbGxlY3Rvci5yZWxlYXNlCi0gICAgIFNTR0NzcHlDb2xsZWN0b3IuZ2NzcHlHYXRoZXJEYXRhLCBldmVudD0yCi0gLS1QaGFzZSBQbGFuLnJlbGVhc2UKLSAgICAgU1NHQ3NweS5nY3NweUdhdGhlckRhdGEsIGV2ZW50PTIKLSAtLVBoYXNlIENvbGxlY3Rvci5jb21wbGV0ZQotIC0tUGhhc2UgUGxhbi5jb21wbGV0ZQotICovCi1AVW5pbnRlcnJ1cHRpYmxlIHB1YmxpYyBjbGFzcyBTU0dDc3B5IGV4dGVuZHMgU1MgaW1wbGVtZW50cyBHQ3NweVBsYW4gewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENsYXNzIHZhcmlhYmxlcwotICAgKi8KLQotICAvLyBUaGUgZXZlbnRzLCBCRUZPUkVfQ09MTEVDVElPTiwgU0VNSVNQQUNFX0NPUElFRCBvciBBRlRFUl9DT0xMRUNUSU9OCi0KLSAgLyoqCi0gICAqIEJlZm9yZSBhIGNvbGxlY3Rpb24gaGFzIHN0YXJ0ZWQsCi0gICAqIGkuZS4gYmVmb3JlIFNTLmNvbGxlY3Rpb25QaGFzZShTUy5QUkVQQVJFLC4uKS4KLSAgICovCi0gIHN0YXRpYyBmaW5hbCBpbnQgQkVGT1JFX0NPTExFQ1RJT04gPSAwOwotCi0gIC8qKgotICAgKiBBZnRlciB0aGUgc2VtaXNwYWNlIGhhcyBiZWVuIGNvcGllZCBhbmQgdGhlIGxhcmdlIG9iamVjdCBzcGFjZSBoYXMgYmVlbiB0cmFjZWQKLSAgICogQXQgdGhpcyB0aW1lIHRoZSBMYXJnZSBPYmplY3QgU3BhY2UgaGFzIG5vdCBiZWVuIHN3ZXB0LgotICAgKi8KLSAgc3RhdGljIGZpbmFsIGludCBTRU1JU1BBQ0VfQ09QSUVEICA9IEJFRk9SRV9DT0xMRUNUSU9OICsgMTsKLQotICAvKioKLSAgICogVGhlIGNvbGxlY3Rpb24gaXMgY29tcGxldGUsCi0gICAqIGkuZS4gaW1tZWRpYXRlbHkgYWZ0ZXIgU1MuY29sbGVjdGlvblBoYXNlKFNTLlJFTEVBU0UsLi4pLgotICAgKiBUaGUgTGFyZ2UgT2JqZWN0IFNwYWNlIGhhcyBiZWVuIHN3ZXB0LgotICAgKi8KLSAgc3RhdGljIGZpbmFsIGludCBBRlRFUl9DT0xMRUNUSU9OICA9IFNFTUlTUEFDRV9DT1BJRUQgKyAxOwotCi0gIHN0YXRpYyBpbnQgZ2NzcHlFdmVudF8gPSBCRUZPUkVfQ09MTEVDVElPTjsKLQotICAvLyBUaGUgc3BlY2lmaWMgZHJpdmVycyBmb3IgdGhpcyBjb2xsZWN0b3IKLSAgc3RhdGljIExpbmVhclNwYWNlRHJpdmVyIHNzMERyaXZlcjsKLSAgc3RhdGljIExpbmVhclNwYWNlRHJpdmVyIHNzMURyaXZlcjsKLSAgc3RhdGljIEltbW9ydGFsU3BhY2VEcml2ZXIgaW1tb3J0YWxEcml2ZXI7Ci0gIHN0YXRpYyBUcmVhZG1pbGxEcml2ZXIgbG9zTnVyc2VyeURyaXZlcjsKLSAgc3RhdGljIFRyZWFkbWlsbERyaXZlciBsb3NEcml2ZXI7Ci0gIHN0YXRpYyBUcmVhZG1pbGxEcml2ZXIgcGxvc051cnNlcnlEcml2ZXI7Ci0gIHN0YXRpYyBUcmVhZG1pbGxEcml2ZXIgcGxvc0RyaXZlcjsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0KLQotICBzdGF0aWMgewotICAgIEdDc3B5LmNyZWF0ZU9wdGlvbnMoKTsKLSAgfQotCi0gIC8qKgotICAgKiBTdGFydCB0aGUgc2VydmVyIGFuZCB3YWl0IGlmIG5lY2Vzc2FyeS4KLSAgICogVGhpcyBtZXRob2QgaGFzIHRoZSBmb2xsb3dpbmcgcmVzcG9uc2liaWxpdGllcy4KLSAgICogPG9sPgotICAgKiA8bGk+IENyZWF0ZSBhbmQgaW5pdGlhbGlzZSB0aGUgR0NzcHkgc2VydmVyIGJ5IGNhbGxpbmcuCi0gICAqICAgICAgPHByZT5zZXJ2ZXIgPSBTZXJ2ZXJJbnRlcnByZXRlci5pbml0KG5hbWUsIHBvcnROdW1iZXIsIHZlcmJvc2UpOzwvcHJlPgotICAgKiA8bGk+IEFkZCBlYWNoIGV2ZW50IHRvIHRoZSBTZXJ2ZXJJbnRlcnByZXRlcgotICAgKiAgICAgIDxwcmU+c2VydmVyLmFkZEV2ZW50KGV2ZW50SUQsIGV2ZW50TmFtZSk7PC9wcmU+Ci0gICAqIDxsaT4gU2V0IHNvbWUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VydmVyIChlLmcuIG5hbWUgb2YgdGhlIGNvbGxlY3RvciwgYnVpbGQsIGV0YykuCi0gICAqICAgICAgPHByZT5zZXJ2ZXIuc2V0R2VuZXJhbEluZm8oaW5mbyk7IDwvcHJlPgotICAgKiA8bGk+IENyZWF0ZSBuZXcgZHJpdmVycyBmb3IgZWFjaCBjb21wb25lbnQgdG8gYmUgdmlzdWFsaXNlZC4KLSAgICogICAgICA8cHJlPm15RHJpdmVyID0gbmV3IE15RHJpdmVyKHNlcnZlciwgYXJncy4uLik7PC9wcmU+Ci0gICAqICAgICAgRHJpdmVycyBleHRlbmQgQWJzdHJhY3REcml2ZXIgYW5kIHJlZ2lzdGVyIHRoZWlyIHNwY2Ugd2l0aCB0aGUKLSAgICogICAgICBTZXJ2ZXJJbnRlcnByZXRlci4gSW4gYWRkaXRpb24gdG8gdGhlIHNlcnZlciwgZHJpdmVycyB3aWxsIHRha2UgYXMKLSAgICogICAgICBhcmd1bWVudHMgdGhlIG5hbWUgb2YgdGhlIHNwYWNlLCB0aGUgTU1UayBzcGFjZSwgdGhlIHRpbGVzaXplLCBhbmQKLSAgICogICAgICB3aGV0aGVyIHRoaXMgc3BhY2UgaXMgdG8gYmUgdGhlIG1haW4gc3BhY2UgaW4gdGhlIHZpc3VhbGlzZXIuCi0gICAqIDwvb2w+Ci0gICAqCi0gICAqIFdBUk5JTkc6IGFsbG9jYXRlcyBtZW1vcnkuCi0gICAqIEBwYXJhbSB3YWl0IFdoZXRoZXIgdG8gd2FpdAotICAgKiBAcGFyYW0gcG9ydCBUaGUgcG9ydCB0byB0YWxrIHRvIHRoZSBHQ3NweSBjbGllbnQgKGUuZy4gdmlzdWFsaXNlcikKLSAgICovCi0gIEBJbnRlcnJ1cHRpYmxlCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHN0YXJ0R0NzcHlTZXJ2ZXIoaW50IHBvcnQsIGJvb2xlYW4gd2FpdCkgewotICAgIEdDc3B5LnNlcnZlci5pbml0KCJTZW1pU3BhY2VTZXJ2ZXJJbnRlcnByZXRlciIsIHBvcnQsIHRydWUvKnZlcmJvc2UqLyk7Ci0gICAgaWYgKERFQlVHKSBMb2cud3JpdGVsbigiU1NHQ3NweTogU2VydmVySW50ZXJwcmV0ZXIgaW5pdGlhbGlzZWQiKTsKLQotICAgIEdDc3B5LnNlcnZlci5hZGRFdmVudChCRUZPUkVfQ09MTEVDVElPTiwgIkJlZm9yZSBjb2xsZWN0aW9uIik7Ci0gICAgR0NzcHkuc2VydmVyLmFkZEV2ZW50KFNFTUlTUEFDRV9DT1BJRUQsICJTZW1pc3BhY2UgY29waWVkOyBMT1MgdHJhY2VkIik7Ci0gICAgR0NzcHkuc2VydmVyLmFkZEV2ZW50KEFGVEVSX0NPTExFQ1RJT04sICJBZnRlciBjb2xsZWN0aW9uOyBMT1Mgc3dlcHQiKTsKLSAgICBHQ3NweS5zZXJ2ZXIuc2V0R2VuZXJhbEluZm8oCi0gICAgICAgICJTU0dDc3B5XG5cblJpY2hhcmQgSm9uZXMsIE9jdG9iZXIgMjAwNlxcaHR0cDovL3d3dy5jcy5rZW50LmFjLnVrL35yZWovIik7Ci0gICAgaWYgKERFQlVHKSBMb2cud3JpdGVsbigiU1NHQ3NweTogZXZlbnRzIGFkZGVkIHRvIFNlcnZlckludGVycHJldGVyIik7Ci0KLSAgICAvLyBJbml0aWFsaXNlIGVhY2ggZHJpdmVyCi0gICAgc3MwRHJpdmVyICAgICAgPSBuZXdMaW5lYXJTcGFjZURyaXZlcigiU2VtaXNwYWNlIDAgU3BhY2UiLCBjb3B5U3BhY2UwLCB0cnVlKTsKLSAgICBzczFEcml2ZXIgICAgICA9IG5ld0xpbmVhclNwYWNlRHJpdmVyKCJTZW1pc3BhY2UgMSBTcGFjZSIsIGNvcHlTcGFjZTEsIGZhbHNlKTsKLSAgICBpbW1vcnRhbERyaXZlciA9IG5ldyBJbW1vcnRhbFNwYWNlRHJpdmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgIEdDc3B5LnNlcnZlciwgICJJbW1vcnRhbCBTcGFjZSIsIGltbW9ydGFsU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9ucy5nY3NweVRpbGVTaXplLmdldFZhbHVlKCksIGZhbHNlKTsKLSAgICBsb3NOdXJzZXJ5RHJpdmVyICA9IG5ld1RyZWFkbWlsbERyaXZlcigiTE9TIE51cnNlcnkiLCBsb1NwYWNlKTsKLSAgICBsb3NEcml2ZXIgICAgICAgICA9IG5ld1RyZWFkbWlsbERyaXZlcigiTE9TIiwgbG9TcGFjZSk7Ci0KLSAgICBpZiAoREVCVUcpIExvZy53cml0ZSgiU2VtaVNlcnZlckludGVycHJldGVyIGluaXRpYWxpc2VkXG4iKTsKLQotICAgIC8vIFJlZ2lzdGVyIGRyaXZlcnMgdG8gYWxsb3cgaW1tb3J0YWwgc3BhY2UgdG8gbm90aWZ5IGRpcmVjdCByZWZlcmVuY2VzCi0gICAgaW1tb3J0YWxEcml2ZXIucmVnaXN0ZXJEcml2ZXJzRm9yUmVmZXJlbmNlTm90aWZpY2F0aW9uKAotICAgICAgbmV3IEFic3RyYWN0RHJpdmVyW10ge3NzMERyaXZlciwgc3MxRHJpdmVyLCBpbW1vcnRhbERyaXZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3NOdXJzZXJ5RHJpdmVyLCBsb3NEcml2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvc051cnNlcnlEcml2ZXIsIHBsb3NEcml2ZXJ9KTsKLSAgICBpZiAoREVCVUcpIExvZy53cml0ZWxuKCJTU0dDc3B5OiByZWdpc3RlcmVkIGRyaXZlcnMiKTsKLQotICAgIGdjc3B5RXZlbnRfID0gQkVGT1JFX0NPTExFQ1RJT047Ci0KLSAgICAvLyBTdGFydCB0aGUgc2VydmVyCi0gICAgR0NzcHkuc2VydmVyLnN0YXJ0U2VydmVyKHdhaXQpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBMaW5lYXJTcGFjZURyaXZlcgotICAgKiBUT0RPIGlzIHRoaXMgdGhlIGJlc3QgbmFtZSBvciBzaG91bGQgd2UgY2FsbCBpdCBMYXJnZU9iamVjdFNwYWNlRHJpdmVyPwotICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBzcGFjZQotICAgKiBAcGFyYW0gc3BhY2UgVGhlIHNwYWNlCi0gICAqIEByZXR1cm4gQSBuZXcgR0NzcHkgZHJpdmVyIGZvciB0aGlzIHNwYWNlCi0gICAqLwotICBASW50ZXJydXB0aWJsZQotICBwcml2YXRlIExpbmVhclNwYWNlRHJpdmVyIG5ld0xpbmVhclNwYWNlRHJpdmVyKFN0cmluZyBuYW1lLCBDb3B5U3BhY2Ugc3BhY2UsIGJvb2xlYW4gbWFpblNwYWNlKSB7Ci0gICAgLy8gVE9ETyBXaGF0IGlmIHRpbGVTaXplIGlzIHRvbyBzbWFsbCAoaS5lLiB0b28gbWFueSB0aWxlcyBmb3IgR0NzcHkgYnVmZmVyKQotICAgIC8vIFRPRE8gc3RvcCB0aGUgR0NzcHkgc3BhY2VzIGluIHRoZSB2aXN1YWxpc2VyIGZyb20gZmx1Y3R1YXRpbmcgaW4gc2l6ZQotICAgIC8vIHNvIG11Y2ggYXMgd2UgcmVzaXplIHRoZW0uCi0gICAgcmV0dXJuIG5ldyBMaW5lYXJTcGFjZURyaXZlcihHQ3NweS5zZXJ2ZXIsIG5hbWUsIHNwYWNlLAotICAgICAgICAgICAgT3B0aW9ucy5nY3NweVRpbGVTaXplLmdldFZhbHVlKCksIG1haW5TcGFjZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IFRyZWFkbWlsbERyaXZlcgotICAgKiBUT0RPIGlzIHRoaXMgdGhlIGJlc3QgbmFtZSBvciBzaG91bGQgd2UgY2FsbCBpdCBMYXJnZU9iamVjdFNwYWNlRHJpdmVyPwotICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBzcGFjZQotICAgKiBAcGFyYW0gc3BhY2UgVGhlIHNwYWNlCi0gICAqIEByZXR1cm4gQSBuZXcgR0NzcHkgZHJpdmVyIGZvciB0aGlzIHNwYWNlCi0gICAqLwotICBASW50ZXJydXB0aWJsZQotICBwcml2YXRlIFRyZWFkbWlsbERyaXZlciBuZXdUcmVhZG1pbGxEcml2ZXIoU3RyaW5nIG5hbWUsIExhcmdlT2JqZWN0U3BhY2Ugc3BhY2UpIHsKLSAgICByZXR1cm4gbmV3IFRyZWFkbWlsbERyaXZlcihHQ3NweS5zZXJ2ZXIsIG5hbWUsIHNwYWNlLAotICAgICAgICAgICAgT3B0aW9ucy5nY3NweVRpbGVTaXplLmdldFZhbHVlKCksIE1BWF9OT05fTE9TX0NPUFlfQllURVMsIGZhbHNlKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbGxlY3Rpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSAoZ2xvYmFsKSBjb2xsZWN0aW9uIHBoYXNlLgotICAgKgotICAgKiBAcGFyYW0gcGhhc2VJZCBDb2xsZWN0aW9uIHBoYXNlCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyB2b2lkIGNvbGxlY3Rpb25QaGFzZShzaG9ydCBwaGFzZUlkKSB7Ci0gICAgaWYgKERFQlVHKSB7IExvZy53cml0ZSgiLS1QaGFzZSBQbGFuLiIpOyBMb2cud3JpdGVsbihQaGFzZS5nZXROYW1lKHBoYXNlSWQpKTsgfQotCi0gICAgaWYgKHBoYXNlSWQgPT0gU1NHQ3NweS5QUkVQQVJFKSB7Ci0gICAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCk7Ci0gICAgICBnY3NweVNwYWNlLnByZXBhcmUoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBTU0dDc3B5LlJFTEVBU0UpIHsKLSAgICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkKTsKLSAgICAgIGdjc3B5U3BhY2UucmVsZWFzZSgpOwotICAgICAgLy9pZiAocHJpbWFyeSkKLSAgICAgICBnY3NweUdhdGhlckRhdGEoU1NHQ3NweS5BRlRFUl9DT0xMRUNUSU9OKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCk7Ci0gIH0KLQotICAvKioKLSAgICogR2F0aGVyIGRhdGEgZm9yIEdDc3B5IGZvciB0aGUgc2VtaXNwYWNlcywgdGhlIGltbW9ydGFsIHNwYWNlIGFuZCB0aGUgbGFyZ2UKLSAgICogb2JqZWN0IHNwYWNlLgotICAgKiA8cD4KLSAgICogVGhpcyBtZXRob2Qgc3dlZXBzIHRoZSBzZW1pc3BhY2UgdW5kZXIgY29uc2lkZXJhdGlvbiB0byBnYXRoZXIgZGF0YS4KLSAgICogQWx0ZXJuYXRpdmVseSBhbmQgbW9yZSBlZmZpY2llbnRseSwgJ3VzZWQgc3BhY2UnIGNhbiBvYnZpb3VzbHkgYmUKLSAgICogZGlzY292ZXJlZCBpbiBjb25zdGFudCB0aW1lIHNpbXBseSBieSBjb21wYXJpbmcgdGhlIHN0YXJ0IGFuZCB0aGUgZW5kCi0gICAqIGFkZHJlc3NlcyBvZiB0aGUgc2VtaXNwYWNlLiBIb3dldmVyLCBwZXItb2JqZWN0IGluZm9ybWF0aW9uIGNhbiBvbmx5IGJlCi0gICAqIGdhdGhlcmVkIGJ5IHN3ZWVwaW5nIHRocm91Z2ggdGhlIHNwYWNlIGFuZCB3ZSBkbyB0aGlzIGhlcmUgZm9yIHR1dG9yaWFsCi0gICAqIHB1cnBvc2VzLgotICAgKgotICAgKiBAcGFyYW0gZXZlbnQKLSAgICogICAgICAgICAgVGhlIGV2ZW50LCBlaXRoZXIgQkVGT1JFX0NPTExFQ1RJT04sIFNFTUlTUEFDRV9DT1BJRUQgb3IKLSAgICogICAgICAgICAgQUZURVJfQ09MTEVDVElPTgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGdjc3B5R2F0aGVyRGF0YShpbnQgZXZlbnQpIHsKLSAgICBpZihERUJVRykgewotICAgICAgTG9nLndyaXRlbG4oIlNTR0NzcHkuZ2NzcHlHYXRoZXJEYXRhLCBldmVudD0iLCBldmVudCk7Ci0gICAgICBMb2cud3JpdGVsbigiU1NHQ3NweS5nY3NweUdhdGhlckRhdGEsIHBvcnQ9IiwgR0NzcHkuZ2V0R0NzcHlQb3J0KCkpOwotICAgIH0KLQotICAgIC8vIElmIHBvcnQgPSAwIHRoZXJlIGNhbiBiZSBubyBHQ3NweSBjbGllbnQgY29ubmVjdGVkCi0gICAgaWYgKEdDc3B5LmdldEdDc3B5UG9ydCgpID09IDApCi0gICAgICByZXR1cm47Ci0KLSAgICAvLyBUaGlzIGlzIGEgc2FmZXBvaW50IGZvciB0aGUgc2VydmVyLCBpLmUuIGl0IGlzIGEgcG9pbnQgYXQgd2hpY2gKLSAgICAvLyB0aGUgc2VydmVyIGNhbiBwYXVzZS4KLSAgICAvLyBUaGUgTXV0YXRvciBpcyBjYWxsZWQgYWZ0ZXIgdGhlIENvbGxlY3RvciBzbyB0aGUgTXV0YXRvciBtdXN0IHNldCB0aGUgc2FmZXBvaW50Ci0gICAgaWYoREVCVUcpIExvZy53cml0ZWxuKCJTU0dDc3B5IHNhZmVwb2ludCIpOwotICAgIEdDc3B5LnNlcnZlci5zZXJ2ZXJTYWZlcG9pbnQoZXZlbnQpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQWNjb3VudGluZwotICAgKi8KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcGFnZXMgcmVzZXJ2ZWQgZm9yIHVzZSBnaXZlbiB0aGUgcGVuZGluZwotICAgKiBhbGxvY2F0aW9uLiAgVGhpcyBpcyA8aT5leGNsdXNpdmUgb2Y8L2k+IHNwYWNlIHJlc2VydmVkIGZvcgotICAgKiBjb3B5aW5nLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgcGFnZXMgcmVzZXJ2ZWQgZ2l2ZW4gdGhlIHBlbmRpbmcKLSAgICogYWxsb2NhdGlvbiwgZXhjbHVkaW5nIHNwYWNlIHJlc2VydmVkIGZvciBjb3B5aW5nLgotICAgKi8KLSAgcHVibGljIGZpbmFsIGludCBnZXRQYWdlc1VzZWQoKSB7Ci0gICAgcmV0dXJuIHN1cGVyLmdldFBhZ2VzVXNlZCgpICsgZ2NzcHlTcGFjZS5yZXNlcnZlZFBhZ2VzKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnQgaW5mb3JtYXRpb24gb24gdGhlIHNlbWlzcGFjZXMKLSAgICovCi0gIHN0YXRpYyB2b2lkIHJlcG9ydFNwYWNlcygpIHsKLSAgICBMb2cud3JpdGUoIlxuICBMb3cgc2VtaXNwYWNlOiAgIik7Ci0gICAgTG9nLndyaXRlKFNTR0NzcHkuY29weVNwYWNlMC5nZXRTdGFydCgpKTsKLSAgICBMb2cud3JpdGUoIiAtICIpOwotICAgIExvZy53cml0ZShTU0dDc3B5LmNvcHlTcGFjZTAuZ2V0U3RhcnQoKQotICAgICAgICAucGx1cyhTU0dDc3B5LmNvcHlTcGFjZTAuZ2V0RXh0ZW50KCkpKTsKLSAgICBMb2cud3JpdGUoIlxuICBIaWdoIHNlbWlzcGFjZTogIik7Ci0gICAgTG9nLndyaXRlKFNTR0NzcHkuY29weVNwYWNlMS5nZXRTdGFydCgpKTsKLSAgICBMb2cud3JpdGUoIiAtICIpOwotICAgIExvZy53cml0ZShTU0dDc3B5LmNvcHlTcGFjZTEuZ2V0U3RhcnQoKQotICAgICAgICAucGx1cyhTU0dDc3B5LmNvcHlTcGFjZTEuZ2V0RXh0ZW50KCkpKTsKLSAgICBMb2cuZmx1c2goKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWdpc3RlciBzcGVjaWFsaXplZCBtZXRob2RzLgotICAgKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJTcGVjaWFsaXplZE1ldGhvZHMoKSB7Ci0gICAgc3VwZXIucmVnaXN0ZXJTcGVjaWFsaXplZE1ldGhvZHMoKTsKLSAgICBUcmFuc2l0aXZlQ2xvc3VyZS5yZWdpc3RlclNwZWNpYWxpemVkU2NhbihTQ0FOX1NTLCBTU0dDc3B5VHJhY2VMb2NhbC5jbGFzcyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9zZW1pc3BhY2UvZ2NzcHkvU1NHQ3NweUNvbGxlY3Rvci5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3NlbWlzcGFjZS9nY3NweS9TU0dDc3B5Q29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNmIxNWIuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3NlbWlzcGFjZS9nY3NweS9TU0dDc3B5Q29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4uc2VtaXNwYWNlLmdjc3B5OwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5QaGFzZTsKLWltcG9ydCBvcmcubW10ay5wbGFuLnNlbWlzcGFjZS5TUzsKLWltcG9ydCBvcmcubW10ay5wbGFuLnNlbWlzcGFjZS5TU0NvbGxlY3RvcjsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuQ29weVNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuTG9nOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZ2NzcHkuR0NzcHk7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5nY3NweS5kcml2ZXJzLkxpbmVhclNwYWNlRHJpdmVyOwotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyA8aT5wZXItY29sbGVjdG9yIHRocmVhZDwvaT4gYmVoYXZpb3IgYW5kIHN0YXRlIGZvciB0aGUKLSAqIDxpPlNTR0NzcHk8L2k+IHBsYW4uPHA+Ci0gKgotICogU2VlIHtAbGluayBTU0dDc3B5fSBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIEdDLXNweSBtZWNoYW5pc21zLjxwPgotICoKLSAqIEBzZWUgU1NDb2xsZWN0b3IKLSAqIEBzZWUgU1NHQ3NweQotICogQHNlZSBTU0dDc3B5TXV0YXRvcgotICogQHNlZSBvcmcubW10ay5wbGFuLlN0b3BUaGVXb3JsZENvbGxlY3RvcgotICogQHNlZSBvcmcubW10ay5wbGFuLkNvbGxlY3RvckNvbnRleHQKLSAqIEBzZWUgb3JnLm1tdGsucGxhbi5TaW1wbGVQaGFzZQotICovCi1AVW5pbnRlcnJ1cHRpYmxlIHB1YmxpYyBjbGFzcyBTU0dDc3B5Q29sbGVjdG9yIGV4dGVuZHMgU1NDb2xsZWN0b3IgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluaXRpYWxpemF0aW9uCi0gICAqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBJbnN0YW5jZSBmaWVsZHMKLSAgICovCi0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIFNTR0NzcHlDb2xsZWN0b3IoKSB7Ci0gICAgc3VwZXIobmV3IFNTR0NzcHlUcmFjZUxvY2FsKGdsb2JhbCgpLnNzVHJhY2UpKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogRGF0YSBnYXRoZXJpbmcKLSAgICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSAobG9jYWwpIGNvbGxlY3Rpb24gcGhhc2UuCi0gICAqIEJlZm9yZSBhIGNvbGxlY3Rpb24sIHdlIG5lZWQgdG8gZGlzY292ZXIKLSAgICogPHVsPgotICAgKiA8bGk+dGhlIHRvc3BhY2Ugb2JqZWN0cyBjb3BpZWQgYnkgdGhlIGNvbGxlY3RvciBpbiB0aGUgbGFzdCBHQyBjeWNsZQotICAgKiA8bGk+dGhlIHNlbWlzcGFjZSBvYmplY3RzIGFsbG9jYXRlZCBzaW5jZSBieSB0aGUgbXV0YXRvci4KLSAgICogPGxpPmFsbCBpbW1vcnRhbCBvYmplY3RzIGFsbG9jYXRlZCBieSB0aGUgbXV0YXRvcgotICAgKiA8bGk+YWxsIGxhcmdlIG9iamVjdHMgYWxsb2NhdGVkIGJ5IHRoZSBtdXRhdG9yCi0gICAqIDwvdWw+Ci0gICAqIEFmdGVyIHRoZSBzZW1pc3BhY2UgaGFzIGJlZW4gY29waWVkLCB3ZSBuZWVkIHRvIGRpc2NvdmVyCi0gICAqIDx1bD4KLSAgICogPGxpPnRoZSB0b3NwYWNlIG9iamVjdHMgY29waWVkIGJ5IHRoZSBjb2xsZWN0b3IKLSAgICogPGxpPmFsbCBpbW1vcnRhbCBvYmplY3RzIGFsbG9jYXRlZCBieSB0aGUgbXV0YXRvcgotICAgKiA8bGk+YWxsIGxhcmdlIG9iamVjdHMgYWxsb2NhdGVkIGJ5IHRoZSBtdXRhdG9yCi0gICAqIDwvdWw+Ci0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGNvbGxlY3Rpb25QaGFzZShzaG9ydCBwaGFzZUlkLCBib29sZWFuIHByaW1hcnkpIHsKLSAgICBpZiAoREVCVUcpIHsgTG9nLndyaXRlKCItLVBoYXNlIENvbGxlY3Rvci4iKTsgTG9nLndyaXRlbG4oUGhhc2UuZ2V0TmFtZShwaGFzZUlkKSk7IH0KLQotICAgIC8vVE9ETyBkbyB3ZSBuZWVkIHRvIHdvcnJ5IGFueSBsb25nZXIgYWJvdXQgcHJpbWFyeT8/Ci0gICAgaWYgKHBoYXNlSWQgPT0gU1MuUFJFUEFSRSkgewotICAgICAgLy9pZiAocHJpbWFyeSkKLSAgICAgICAgZ2NzcHlHYXRoZXJEYXRhKFNTR0NzcHkuQkVGT1JFX0NPTExFQ1RJT04pOwotICAgICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQsIHByaW1hcnkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwaGFzZUlkID09IFNTLkZPUldBUkRfRklOQUxJWkFCTEUpIHsKLSAgICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KTsKLSAgICAgIC8vaWYgKHByaW1hcnkpCi0gICAgICAgIGdjc3B5R2F0aGVyRGF0YShTU0dDc3B5LlNFTUlTUEFDRV9DT1BJRUQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwaGFzZUlkID09IFNTLlJFTEVBU0UpIHsKLSAgICAgIC8vaWYgKHByaW1hcnkpCi0gICAgICAgIC8vZ2NzcHlHYXRoZXJEYXRhKFNTR0NzcHkuU0VNSVNQQUNFX0NPUElFRCk7Ci0gICAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gICAgICAvL2lmIChwcmltYXJ5KQotICAgICAgICBnY3NweUdhdGhlckRhdGEoU1NHQ3NweS5BRlRFUl9DT0xMRUNUSU9OKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gIH0KLQotICAvKioKLSAgICogR2F0aGVyIGRhdGEgZm9yIEdDc3B5IGZvciB0aGUgc2VtaXNwYWNlcyBvbmx5LgotICAgKiA8cD4KLSAgICogVGhpcyBtZXRob2Qgc3dlZXBzIHRoZSBzZW1pc3BhY2UgdW5kZXIgY29uc2lkZXJhdGlvbiB0byBnYXRoZXIgZGF0YS4KLSAgICogQWx0ZXJuYXRpdmVseSBhbmQgbW9yZSBlZmZpY2llbnRseSwgJ3VzZWQgc3BhY2UnIGNhbiBvYnZpb3VzbHkgYmUKLSAgICogZGlzY292ZXJlZCBpbiBjb25zdGFudCB0aW1lIHNpbXBseSBieSBjb21wYXJpbmcgdGhlIHN0YXJ0IGFuZCB0aGUgZW5kCi0gICAqIGFkZHJlc3NlcyBvZiB0aGUgc2VtaXNwYWNlLiBIb3dldmVyLCBwZXItb2JqZWN0IGluZm9ybWF0aW9uIGNhbiBvbmx5IGJlCi0gICAqIGdhdGhlcmVkIGJ5IHN3ZWVwaW5nIHRocm91Z2ggdGhlIHNwYWNlIGFuZCB3ZSBkbyB0aGlzIGhlcmUgZm9yIHR1dG9yaWFsCi0gICAqIHB1cnBvc2VzLgotICAgKgotICAgKiBAcGFyYW0gZXZlbnQKLSAgICogICAgICAgICAgVGhlIGV2ZW50LCBlaXRoZXIgQkVGT1JFX0NPTExFQ1RJT04sIFNFTUlTUEFDRV9DT1BJRUQgb3IKLSAgICogICAgICAgICAgQUZURVJfQ09MTEVDVElPTgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGdjc3B5R2F0aGVyRGF0YShpbnQgZXZlbnQpIHsKLSAgICBpZihERUJVRykgewotICAgICAgTG9nLndyaXRlbG4oIlNTR0NzcHlDb2xsZWN0b3IuZ2NzcHlHYXRoZXJEYXRhLCBldmVudD0iLCBldmVudCk7Ci0gICAgICBMb2cud3JpdGVsbigiU1NHQ3NweUNvbGxlY3Rvci5nY3NweUdhdGhlckRhdGEsIHBvcnQ9IiwgR0NzcHkuZ2V0R0NzcHlQb3J0KCkpOwotICAgIH0KLQotICAgIC8vIElmIHBvcnQgPSAwIHRoZXJlIGNhbiBiZSBubyBHQ3NweSBjbGllbnQgY29ubmVjdGVkCi0gICAgaWYgKEdDc3B5LmdldEdDc3B5UG9ydCgpID09IDApCi0gICAgICByZXR1cm47Ci0KLSAgICAvLyBJZiB0aGUgc2VydmVyIGlzIGNvbm5lY3RlZCB0byBhIGNsaWVudCB0aGF0IGlzIGludGVyZXN0ZWQgaW4gdGhpcwotICAgIC8vIGV2ZW50LCB0aGVuIHdlIGdhdGhlciBkYXRhLiBCdXQgZmlyc3Qgd2Ugc3RhcnQgYSB0aW1lciB0bwotICAgIC8vIGNvbXBlbnNhdGUgZm9yIHRoZSB0aW1lIHNwZW50IGdhdGhlcmluZyBkYXRhIGhlcmUuCi0gICAgaWYgKEdDc3B5LnNlcnZlci5pc0Nvbm5lY3RlZChldmVudCkpIHsKLQotICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgIGlmIChTU0dDc3B5LmhpKQotICAgICAgICAgIExvZy53cml0ZSgiXG5Db2xsZWN0b3IgRXhhbWluaW5nIExvd3NwYWNlIChldmVudCAiLCBldmVudCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBMb2cud3JpdGUoIlxuQ29sbGVjdG9yIEV4YW1pbmluZyBIaWdoc3BhY2UgKGV2ZW50ICIsIGV2ZW50KTsKLSAgICAgICAgTG9nLndyaXRlKCIpIik7Ci0gICAgICAgIFNTR0NzcHkucmVwb3J0U3BhY2VzKCk7IExvZy53cml0ZWxuKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChldmVudCA9PSBTU0dDc3B5LkJFRk9SRV9DT0xMRUNUSU9OKSB7Ci0gICAgICAgIGlmIChERUJVRykgZGVidWdTcGFjZXMoU1NHQ3NweS5mcm9tU3BhY2UoKSk7Ci0KLSAgICAgICAgLy8gSnVzdCBzZW5kIHRoZSBvbGQgdmFsdWVzIGFnYWluCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgIExvZy53cml0ZSgiU1NHQ3NweUNvbGxlY3Rvci5nY3NweUdhdGhlckRhdGEgdHJhbnNtaXQgZHJpdmVyLCAiKTsKLSAgICAgICAgICBMb2cud3JpdGVsbihTU0dDc3B5LmZyb21TcGFjZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmcm9tU3BhY2VEcml2ZXIoKS50cmFuc21pdChldmVudCk7Ci0gICAgICAgIC8vIE11dGF0b3IuZ2NzcHlHYXRoZXJEYXRhIGZvbGxvd3Mgc28gbGVhdmUgc2FmZXBvaW50IHRvIHRoZXJlLgotICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBTU0dDc3B5LlNFTUlTUEFDRV9DT1BJRUQpIHsKLSAgICAgICAgaWYgKERFQlVHKSBkZWJ1Z1NwYWNlcyhTU0dDc3B5LnRvU3BhY2UoKSk7Ci0KLSAgICAgICAgLy8gV2UgbmVlZCB0byByZXNldCwgc2NhbiBhbmQgc2VuZCB2YWx1ZXMgZm9yIHRvc3BhY2UKLSAgICAgICAgLy8gV2UnbGwgbGVhdmUgcmVzZXR0aW5nIGZyb21zcGFjZSB0byBBRlRFUl9DT0xMRUNUSU9OCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgIExvZy53cml0ZSgiU1NHQ3NweUNvbGxlY3Rvci5nY3NweUdhdGhlckRhdGEgcmVzZXQsIGdhdGhlciBhbmQgdHJhbnNtaXQgZHJpdmVyICIpOwotICAgICAgICAgIExvZy53cml0ZWxuKFNTR0NzcHkudG9TcGFjZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBHQ3NweS5zZXJ2ZXIuc3RhcnRDb21wZW5zYXRpb25UaW1lcigpOwotICAgICAgICB0b1NwYWNlRHJpdmVyKCkucmVzZXREYXRhKCk7Ci0gICAgICAgIHNzLmdjc3B5R2F0aGVyRGF0YSh0b1NwYWNlRHJpdmVyKCksIFNTR0NzcHkudG9TcGFjZSgpKTsKLSAgICAgICAgR0NzcHkuc2VydmVyLnN0b3BDb21wZW5zYXRpb25UaW1lcigpOwotICAgICAgICB0b1NwYWNlRHJpdmVyKCkudHJhbnNtaXQoZXZlbnQpOwotCi0gICAgICAgIC8vIFdlJ2xsIGxlYXZlIHRoZSBzYWZlcG9pbnQgdG8gUkVMRUFTRQotICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBTU0dDc3B5LkFGVEVSX0NPTExFQ1RJT04pIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgTG9nLndyaXRlKCJTU0dDc3B5Q29sbGVjdG9yLmdjc3B5R2F0aGVyRGF0YSB0cmFuc21pdCB0b1NwYWNlRHJpdmVyLCAiKTsKLSAgICAgICAgICBMb2cud3JpdGVsbihTU0dDc3B5LnRvU3BhY2UoKS5nZXROYW1lKCkpOwotICAgICAgICAgIExvZy53cml0ZSgiU1NHQ3NweUNvbGxlY3Rvci5nY3NweUdhdGhlckRhdGEgcmVzZXQgZnJvbVNwYWNlRHJpdmVyLCAiKTsKLSAgICAgICAgICBMb2cud3JpdGVsbihTU0dDc3B5LmZyb21TcGFjZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0b1NwYWNlRHJpdmVyKCkudHJhbnNtaXQoZXZlbnQpOwotCi0gICAgICAgIC8vIEhlcmUgd2UgcmVzZXQgZnJvbXNwYWNlIGRhdGEKLSAgICAgICAgZnJvbVNwYWNlRHJpdmVyKCkucmVzZXREYXRhKCk7Ci0gICAgICAgIEFkZHJlc3Mgc3RhcnQgPSBTU0dDc3B5LmZyb21TcGFjZSgpLmdldFN0YXJ0KCk7Ci0gICAgICAgIGZyb21TcGFjZURyaXZlcigpLnNldFJhbmdlKHN0YXJ0LCBzdGFydCk7Ci0gICAgICAgIGZyb21TcGFjZURyaXZlcigpLnRyYW5zbWl0KGV2ZW50KTsKLSAgICAgIH0KLQotICAgIH0KLSAgICAvLyBlbHNlIExvZy53cml0ZSgibm90IHRyYW5zbWl0dGluZy4uLiIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByaW50IHNvbWUgZGVidWdnaW5nIGluZm8KLSAgICogQHBhcmFtIHNjYW5uZWRTcGFjZQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGRlYnVnU3BhY2VzKENvcHlTcGFjZSBzY2FubmVkU3BhY2UpIHsKLSAgICBMb2cud3JpdGUoIlNTR0NzcHlDb2xsZWN0b3IuZ2NzcHlHYXRoZXJEYXRhOiBnYXRoZXIgZGF0YSBmb3IgYWN0aXZlIHNlbWlzcGFjZSAiKTsKLSAgICBMb2cud3JpdGUoc2Nhbm5lZFNwYWNlLmdldFN0YXJ0KCkpOyBMb2cud3JpdGUoIi0iLHNzLmdldEN1cnNvcigpKTsgTG9nLmZsdXNoKCk7Ci0gICAgTG9nLndyaXRlKCIuIFRoZSBzcGFjZSBpczogIik7IExvZy53cml0ZWxuKHNzLmdldFNwYWNlKCkuZ2V0TmFtZSgpKTsKLSAgICBMb2cud3JpdGUoInNjYW5uZWRTcGFjZSBpcyAiKTsgTG9nLndyaXRlbG4oc2Nhbm5lZFNwYWNlLmdldE5hbWUoKSk7Ci0gICAgTG9nLndyaXRlKCJUaGUgcmFuZ2UgaXMgIik7IExvZy53cml0ZShzcy5nZXRTcGFjZSgpLmdldFN0YXJ0KCkpOwotICAgIExvZy53cml0ZSgiIHRvICIpOyBMb2cud3JpdGVsbihzcy5nZXRDdXJzb3IoKSk7Ci0gICAgU1NHQ3NweS5yZXBvcnRTcGFjZXMoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXNldCBhbGwgcm9vdCBzdHJlYW1zLjxwPgotICAgKi8KLSAgdm9pZCByZXNldFJvb3RTdHJlYW1zKCkgewotICAgIFNTR0NzcHkuc3MwRHJpdmVyLnJlc2V0Um9vdHNTdHJlYW0oKTsKLSAgICBTU0dDc3B5LnNzMURyaXZlci5yZXNldFJvb3RzU3RyZWFtKCk7Ci0gICAgU1NHQ3NweS5pbW1vcnRhbERyaXZlci5yZXNldFJvb3RzU3RyZWFtKCk7Ci0gICAgU1NHQ3NweS5sb3NOdXJzZXJ5RHJpdmVyLnJlc2V0Um9vdHNTdHJlYW0oKTsKLSAgICBTU0dDc3B5Lmxvc0RyaXZlci5yZXNldFJvb3RzU3RyZWFtKCk7Ci0gICAgU1NHQ3NweS5wbG9zTnVyc2VyeURyaXZlci5yZXNldFJvb3RzU3RyZWFtKCk7Ci0gICAgU1NHQ3NweS5wbG9zRHJpdmVyLnJlc2V0Um9vdHNTdHJlYW0oKTsKLSAgICBzcy5nZXRDdXJzb3IoKTsKLSAgfQotCi0gIC8qKgotICAgKiBQYXNzIGEgcm9vdCB0byBhbGwgZHJpdmVycy48cD4KLSAgICogQHBhcmFtIGFkZHIgVGhlIEFkZHJlc3Mgb2YgdGhlIG9iamVjdCB0byBiZSBjaGVja2VkCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjaGVja0FsbERyaXZlcnNGb3JSb290QWRkcmVzcyhBZGRyZXNzIGFkZHIpIHsKLSAgICBpZihhZGRyLmlzWmVybygpKQotICAgICAgcmV0dXJuOwotCi0gICAgU1NHQ3NweS5zczBEcml2ZXIuaGFuZGxlUm9vdChhZGRyKTsKLSAgICBTU0dDc3B5LnNzMURyaXZlci5oYW5kbGVSb290KGFkZHIpOwotICAgIFNTR0NzcHkuaW1tb3J0YWxEcml2ZXIuaGFuZGxlUm9vdChhZGRyKTsKLSAgICBTU0dDc3B5Lmxvc051cnNlcnlEcml2ZXIuaGFuZGxlUm9vdChhZGRyKTsKLSAgICBTU0dDc3B5Lmxvc0RyaXZlci5oYW5kbGVSb290KGFkZHIpOwotICAgIFNTR0NzcHkucGxvc051cnNlcnlEcml2ZXIuaGFuZGxlUm9vdChhZGRyKTsKLSAgICBTU0dDc3B5LnBsb3NEcml2ZXIuaGFuZGxlUm9vdChhZGRyKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIE1pc2NlbGxhbmVvdXMKLSAgICovCi0KLSAgLyoqIEByZXR1cm4gVGhlIGFjdGl2ZSBnbG9iYWwgcGxhbiBhcyBhbiA8Y29kZT5TU0dDc3B5PC9jb2RlPiBpbnN0YW5jZS4gKi8KLSAgQElubGluZQotICBwcml2YXRlIHN0YXRpYyBTU0dDc3B5IGdsb2JhbCgpIHsKLSAgICByZXR1cm4gKFNTR0NzcHkpIFZNLmFjdGl2ZVBsYW4uZ2xvYmFsKCk7Ci0gIH0KLQotICAvKiogQHJldHVybiB0aGUgZHJpdmVyIGZvciB0b1NwYWNlICovCi0gIHByaXZhdGUgTGluZWFyU3BhY2VEcml2ZXIgdG9TcGFjZURyaXZlcigpIHsKLSAgICByZXR1cm4gU1NHQ3NweS5oaSA/IFNTR0NzcHkuc3MxRHJpdmVyIDogU1NHQ3NweS5zczBEcml2ZXI7Ci0gIH0KLQotICAvKiogQHJldHVybiB0aGUgZHJpdmVyIGZvciBmcm9tU3BhY2UgKi8KLSAgcHJpdmF0ZSBMaW5lYXJTcGFjZURyaXZlciBmcm9tU3BhY2VEcml2ZXIoKSB7Ci0gICAgcmV0dXJuIFNTR0NzcHkuaGkgPyBTU0dDc3B5LnNzMERyaXZlciA6IFNTR0NzcHkuc3MxRHJpdmVyOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc2VtaXNwYWNlL2djc3B5L1NTR0NzcHlDb25zdHJhaW50cy5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3NlbWlzcGFjZS9nY3NweS9TU0dDc3B5Q29uc3RyYWludHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA2YTM5MC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc2VtaXNwYWNlL2djc3B5L1NTR0NzcHlDb25zdHJhaW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4uc2VtaXNwYWNlLmdjc3B5OwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5zZW1pc3BhY2UuU1NDb25zdHJhaW50czsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBTZW1pIHNwYWNlIEdDc3B5IGNvbnN0YW50cy4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIFNTR0NzcHlDb25zdHJhaW50cyBleHRlbmRzIFNTQ29uc3RyYWludHMgewotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gbmVlZHNMaW5lYXJTY2FuKCkgeyByZXR1cm4gdHJ1ZTsgfQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gd2l0aEdDc3B5KCkgeyByZXR1cm4gdHJ1ZTsgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3NlbWlzcGFjZS9nY3NweS9TU0dDc3B5TXV0YXRvci5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3NlbWlzcGFjZS9nY3NweS9TU0dDc3B5TXV0YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGU0MDkxLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9zZW1pc3BhY2UvZ2NzcHkvU1NHQ3NweU11dGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5zZW1pc3BhY2UuZ2NzcHk7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlBoYXNlOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uc2VtaXNwYWNlLlNTTXV0YXRvcjsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuQ29weVNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuSW1tb3J0YWxMb2NhbDsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkxvZzsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmFsbG9jLkJ1bXBQb2ludGVyOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuYWxsb2MuQWxsb2NhdG9yOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZ2NzcHkuR0NzcHk7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5nY3NweS5kcml2ZXJzLkxpbmVhclNwYWNlRHJpdmVyOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyA8aT5wZXItbXV0YXRvciB0aHJlYWQ8L2k+IGJlaGF2aW9yIGFuZCBzdGF0ZSBmb3IgdGhlCi0gKiA8aT5TU0dDc3B5PC9pPiBwbGFuLgotICoKLSAqIFNlZSB7QGxpbmsgU1NHQ3NweX0gZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBHQy1zcHkgbWVjaGFuaXNtcy4KLSAqIDxwPgotICoKLSAqIEBzZWUgU1NNdXRhdG9yCi0gKiBAc2VlIFNTR0NzcHkKLSAqIEBzZWUgU1NHQ3NweUNvbGxlY3RvcgotICogQHNlZSBvcmcubW10ay5wbGFuLlN0b3BUaGVXb3JsZE11dGF0b3IKLSAqIEBzZWUgb3JnLm1tdGsucGxhbi5NdXRhdG9yQ29udGV4dAotICovCi1AVW5pbnRlcnJ1cHRpYmxlIHB1YmxpYyBjbGFzcyBTU0dDc3B5TXV0YXRvciBleHRlbmRzIFNTTXV0YXRvciB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIEluc3RhbmNlIGZpZWxkcwotICAgKi8KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT1NfVE9TUEFDRSA9IHRydWU7ICAgIC8vIGdhdGhlciBmcm9tIHRvc3BhY2UKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT1NfRlJPTVNQQUNFID0gZmFsc2U7IC8vIGdhdGhlciBmcm9tIGZyb21zcGFjZQotCi0gIC8qKiBQZXItbXV0YXRvciBhbGxvY2F0b3IgaW50byBHQ3NweSdzIHNwYWNlICovCi0gIHByaXZhdGUgQnVtcFBvaW50ZXIgZ2NzcHkgPSBuZXcgSW1tb3J0YWxMb2NhbChTU0dDc3B5Lmdjc3B5U3BhY2UpOwotCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogTXV0YXRvci10aW1lIGFsbG9jYXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIEFsbG9jYXRlIHNwYWNlIChmb3IgYW4gb2JqZWN0KQotICAgKgotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIHNpemUgb2YgdGhlIHNwYWNlIHRvIGJlIGFsbG9jYXRlZCAoaW4gYnl0ZXMpCi0gICAqIEBwYXJhbSBhbGlnbiBUaGUgcmVxdWVzdGVkIGFsaWdubWVudC4KLSAgICogQHBhcmFtIG9mZnNldCBUaGUgYWxpZ25tZW50IG9mZnNldC4KLSAgICogQHBhcmFtIGFsbG9jYXRvciBUaGUgYWxsb2NhdG9yIG51bWJlciB0byBiZSB1c2VkIGZvciB0aGlzIGFsbG9jYXRpb24KLSAgICogQHBhcmFtIHNpdGUgQWxsb2NhdGlvbiBzaXRlCi0gICAqIEByZXR1cm4gVGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGFsbG9jYXRlZCByZWdpb24KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIEFkZHJlc3MgYWxsb2MoaW50IGJ5dGVzLCBpbnQgYWxpZ24sIGludCBvZmZzZXQsIGludCBhbGxvY2F0b3IsIGludCBzaXRlKSB7Ci0gICAgaWYgKGFsbG9jYXRvciA9PSBTU0dDc3B5LkFMTE9DX0dDU1BZKQotICAgICAgcmV0dXJuIGdjc3B5LmFsbG9jKGJ5dGVzLCBhbGlnbiwgb2Zmc2V0KTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gc3VwZXIuYWxsb2MoYnl0ZXMsIGFsaWduLCBvZmZzZXQsIGFsbG9jYXRvciwgc2l0ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUGVyZm9ybSBwb3N0LWFsbG9jYXRpb24gYWN0aW9ucy4gRm9yIG1hbnkgYWxsb2NhdG9ycyBub25lIGFyZSByZXF1aXJlZC4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgbmV3bHkgYWxsb2NhdGVkIG9iamVjdAotICAgKiBAcGFyYW0gdHlwZVJlZiBUaGUgdHlwZSByZWZlcmVuY2UgZm9yIHRoZSBpbnN0YW5jZSBiZWluZyBjcmVhdGVkCi0gICAqIEBwYXJhbSBieXRlcyBUaGUgc2l6ZSBvZiB0aGUgc3BhY2UgdG8gYmUgYWxsb2NhdGVkIChpbiBieXRlcykKLSAgICogQHBhcmFtIGFsbG9jYXRvciBUaGUgYWxsb2NhdG9yIG51bWJlciB0byBiZSB1c2VkIGZvciB0aGlzIGFsbG9jYXRpb24KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHZvaWQgcG9zdEFsbG9jKE9iamVjdFJlZmVyZW5jZSBvYmplY3QsIE9iamVjdFJlZmVyZW5jZSB0eXBlUmVmLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzLCBpbnQgYWxsb2NhdG9yKSB7Ci0gICAgaWYgKGFsbG9jYXRvciA9PSBTU0dDc3B5LkFMTE9DX0dDU1BZKQotICAgICAgU1NHQ3NweS5nY3NweVNwYWNlLmluaXRpYWxpemVIZWFkZXIob2JqZWN0KTsKLSAgICBlbHNlCi0gICAgICBzdXBlci5wb3N0QWxsb2Mob2JqZWN0LCB0eXBlUmVmLCBieXRlcywgYWxsb2NhdG9yKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGFsbG9jYXRvciBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggYSBzcGFjZQotICAgKiA8Y29kZT5zcGFjZTwvY29kZT4sIGZvciB0aGlzIHBsYW4gaW5zdGFuY2UuCi0gICAqCi0gICAqIEBwYXJhbSBzcGFjZSBUaGUgc3BhY2UgZm9yIHdoaWNoIHRoZSBhbGxvY2F0b3IgaW5zdGFuY2UgaXMgZGVzaXJlZC4KLSAgICogQHJldHVybiBUaGUgYWxsb2NhdG9yIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBsYW4gaW5zdGFuY2UKLSAgICogd2hpY2ggaXMgYWxsb2NhdGluZyBpbnRvIDxjb2RlPnNwYWNlPC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICogaWYgbm8gYXBwcm9wcmlhdGUgYWxsb2NhdG9yIGNhbiBiZSBlc3RhYmxpc2hlZC4KLSAgICovCi0gIHB1YmxpYyBBbGxvY2F0b3IgZ2V0QWxsb2NhdG9yRnJvbVNwYWNlKFNwYWNlIHNwYWNlKSB7Ci0gICAgaWYgKHNwYWNlID09IFNTR0NzcHkuZ2NzcHlTcGFjZSkgcmV0dXJuIGdjc3B5OwotICAgIHJldHVybiBzdXBlci5nZXRBbGxvY2F0b3JGcm9tU3BhY2Uoc3BhY2UpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbGxlY3Rpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSBwZXItbXV0YXRvciBjb2xsZWN0aW9uIHBoYXNlLgotICAgKiBCZWZvcmUgYSBjb2xsZWN0aW9uLCB3ZSBuZWVkIHRvIGRpc2NvdmVyCi0gICAqIDx1bD4KLSAgICogPGxpPnRoZSB0b3NwYWNlIG9iamVjdHMgY29waWVkIGJ5IHRoZSBjb2xsZWN0b3IgaW4gdGhlIGxhc3QgR0MgY3ljbGUKLSAgICogPGxpPnRoZSBvamVjdHMgYWxsb2NhdGVkIHNpbmNlIGJ5IHRoZSBtdXRhdG9yLgotICAgKiA8bGk+YWxsIGltbW9ydGFsIG9iamVjdHMgYWxsb2NhdGVkIGJ5IHRoZSBtdXRhdG9yCi0gICAqIDxsaT5hbGwgbGFyZ2Ugb2JqZWN0cyBhbGxvY2F0ZWQgYnkgdGhlIG11dGF0b3IKLSAgICogPC91bD4KLSAgICogQWZ0ZXIgdGhlIHNlbWlzcGFjZSBoYXMgYmVlbiBjb3BpZWQsIHdlIG5lZWQgdG8gZGlzY292ZXIKLSAgICogPHVsPgotICAgKiA8bGk+dGhlIHRvc3BhY2Ugb2JqZWN0cyBjb3BpZWQgYnkgdGhlIGNvbGxlY3RvcgotICAgKiA8bGk+YWxsIGltbW9ydGFsIG9iamVjdHMgYWxsb2NhdGVkIGJ5IHRoZSBtdXRhdG9yCi0gICAqIDxsaT5hbGwgbGFyZ2Ugb2JqZWN0cyBhbGxvY2F0ZWQgYnkgdGhlIG11dGF0b3IKLSAgICogPC91bD4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGZpbmFsIHZvaWQgY29sbGVjdGlvblBoYXNlKHNob3J0IHBoYXNlSWQsIGJvb2xlYW4gcHJpbWFyeSkgewotICAgIGlmIChERUJVRykgeyBMb2cud3JpdGUoIi0tUGhhc2UgTXV0YXRvci4iKTsgTG9nLndyaXRlbG4oUGhhc2UuZ2V0TmFtZShwaGFzZUlkKSk7IH0KLQotICAgIC8vIFRPRE8gZG8gd2UgbmVlZCB0byB3b3JyeSBhbnkgbG9uZ2VyIGFib3V0IHByaW1hcnk/PwotICAgIGlmIChwaGFzZUlkID09IFNTR0NzcHkuUFJFUEFSRSkgewotICAgICAgLy9pZiAocHJpbWFyeSkKLSAgICAgICAgZ2NzcHlHYXRoZXJEYXRhKFNTR0NzcHkuQkVGT1JFX0NPTExFQ1RJT04pOwotICAgICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQsIHByaW1hcnkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwaGFzZUlkID09IFNTR0NzcHkuUkVMRUFTRSkgewotICAgICAgLy9pZiAocHJpbWFyeSkKLSAgICAgICAgZ2NzcHlHYXRoZXJEYXRhKFNTR0NzcHkuU0VNSVNQQUNFX0NPUElFRCk7Ci0gICAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gICAgICAvL2lmIChwcmltYXJ5KQotICAgICAgICBnY3NweUdhdGhlckRhdGEoU1NHQ3NweS5BRlRFUl9DT0xMRUNUSU9OKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gIH0KLQotICAvKioKLSAgICogR2F0aGVyIGRhdGEgZm9yIEdDc3B5IGZvciB0aGUgc2VtaXNwYWNlcywgdGhlIGltbW9ydGFsIHNwYWNlIGFuZCB0aGUgbGFyZ2UKLSAgICogb2JqZWN0IHNwYWNlLgotICAgKiA8cD4KLSAgICogVGhpcyBtZXRob2Qgc3dlZXBzIHRoZSBzZW1pc3BhY2UgdW5kZXIgY29uc2lkZXJhdGlvbiB0byBnYXRoZXIgZGF0YS4KLSAgICogQWx0ZXJuYXRpdmVseSBhbmQgbW9yZSBlZmZpY2llbnRseSwgJ3VzZWQgc3BhY2UnIGNhbiBvYnZpb3VzbHkgYmUKLSAgICogZGlzY292ZXJlZCBpbiBjb25zdGFudCB0aW1lIHNpbXBseSBieSBjb21wYXJpbmcgdGhlIHN0YXJ0IGFuZCB0aGUgZW5kCi0gICAqIGFkZHJlc3NlcyBvZiB0aGUgc2VtaXNwYWNlLiBIb3dldmVyLCBwZXItb2JqZWN0IGluZm9ybWF0aW9uIGNhbiBvbmx5IGJlCi0gICAqIGdhdGhlcmVkIGJ5IHN3ZWVwaW5nIHRocm91Z2ggdGhlIHNwYWNlIGFuZCB3ZSBkbyB0aGlzIGhlcmUgZm9yIHR1dG9yaWFsCi0gICAqIHB1cnBvc2VzLgotICAgKgotICAgKiBAcGFyYW0gZXZlbnQKLSAgICogICAgICAgICAgVGhlIGV2ZW50LCBlaXRoZXIgQkVGT1JFX0NPTExFQ1RJT04sIFNFTUlTUEFDRV9DT1BJRUQgb3IKLSAgICogICAgICAgICAgQUZURVJfQ09MTEVDVElPTgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGdjc3B5R2F0aGVyRGF0YShpbnQgZXZlbnQpIHsKLSAgICBpZihERUJVRykgewotICAgICAgTG9nLndyaXRlbG4oIlNTR0NzcHlNdXRhdG9yLmdjc3B5R2F0aGVyRGF0YSwgZXZlbnQ9IiwgZXZlbnQpOwotICAgICAgTG9nLndyaXRlbG4oIlNTR0NzcHlNdXRhdG9yLmdjc3B5R2F0aGVyRGF0YSwgcG9ydD0iLCBHQ3NweS5nZXRHQ3NweVBvcnQoKSk7Ci0gICAgfQotCi0gICAgLy8gSWYgcG9ydCA9IDAgdGhlcmUgY2FuIGJlIG5vIEdDc3B5IGNsaWVudCBjb25uZWN0ZWQKLSAgICBpZiAoR0NzcHkuZ2V0R0NzcHlQb3J0KCkgPT0gMCkKLSAgICAgIHJldHVybjsKLQotICAgIC8vIElmIHRoZSBzZXJ2ZXIgaXMgY29ubmVjdGVkIHRvIGEgY2xpZW50IHRoYXQgaXMgaW50ZXJlc3RlZCBpbiB0aGlzCi0gICAgLy8gZXZlbnQsIHRoZW4gd2UgZ2F0aGVyIGRhdGEuIEJ1dCBmaXJzdCB3ZSBzdGFydCBhIHRpbWVyIHRvCi0gICAgLy8gY29tcGVuc2F0ZSBmb3IgdGhlIHRpbWUgc3BlbnQgZ2F0aGVyaW5nIGRhdGEgaGVyZS4KLSAgICBpZiAoR0NzcHkuc2VydmVyLmlzQ29ubmVjdGVkKGV2ZW50KSkgewotCi0gICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgaWYgKFNTR0NzcHkuaGkpCi0gICAgICAgICAgTG9nLndyaXRlKCJcbk11dGF0b3IgRXhhbWluaW5nIExvd3NwYWNlIChldmVudCAiLCBldmVudCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBMb2cud3JpdGUoIlxuTXV0YXRvciBFeGFtaW5pbmcgSGlnaHNwYWNlIChldmVudCAiLCBldmVudCk7Ci0gICAgICAgIExvZy53cml0ZSgiKSIpOwotICAgICAgICBTU0dDc3B5LnJlcG9ydFNwYWNlcygpOyBMb2cud3JpdGVsbigpOwotICAgICAgfQotCi0gICAgICBpZiAoZXZlbnQgPT0gU1NHQ3NweS5CRUZPUkVfQ09MTEVDVElPTikgewotICAgICAgICAvLyBCZWZvcmUgdGhlIGZsaXAKLSAgICAgICAgLy8gTXV0YXRvciBoYXMgbm90IHJlYm91bmQgdG9TcGFjZSB5ZXQKLSAgICAgICAgR0NzcHkuc2VydmVyLnN0YXJ0Q29tcGVuc2F0aW9uVGltZXIoKTsKLQotICAgICAgICAvLyAtLSBIYW5kbGUgdGhlIHNlbWlzcGFjZXMKLSAgICAgICAgLy8gSGVyZSBJIG5lZWQgdG8gc2NhbiBuZXdseSBhbGxvY2F0ZWQgb2JqZWN0cwotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAvL2RlYnVnU3BhY2VzKFNTR0NzcHkuZnJvbVNwYWNlKCkpOwotICAgICAgICAgIGRlYnVnU3BhY2VzKFNTR0NzcHkudG9TcGFjZSgpKTsKLSAgICAgICAgICBMb2cud3JpdGUoIlNTR0NzcHlNdXRhdG9yLmdjc3B5R2F0aGVyRGF0YSByZXNldCwgZ2F0aGVyIGFuZCB0cmFuc21pdCBkcml2ZXIgIik7Ci0gICAgICAgICAgLy9Mb2cud3JpdGVsbihTU0dDc3B5LmZyb21TcGFjZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgTG9nLndyaXRlbG4oU1NHQ3NweS50b1NwYWNlKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICAvL3NzLmdjc3B5R2F0aGVyRGF0YShmcm9tU3BhY2VEcml2ZXIoKSwgU1NHQ3NweS5mcm9tU3BhY2UoKSk7Ci0gICAgICAgIHNzLmdjc3B5R2F0aGVyRGF0YSh0b1NwYWNlRHJpdmVyKCksIFNTR0NzcHkudG9TcGFjZSgpKTsKLQotICAgICAgICAvLyAtLSBIYW5kbGUgdGhlIGltbW9ydGFsIHNwYWNlIC0tCi0gICAgICAgIGdhdGhlckltbW9ydGFsKGV2ZW50KTsKLQotICAgICAgICAvLyAtLSBIYW5kbGUgdGhlIExPU2VzCi0KLSAgICAgICAgLy8gcmVzZXQsIGNvbGxlY3QgYW5kIHNjYW4gbG9zIGRhdGEgZm9yIHRoZSBudXJzZXJ5IGFuZCB0b3NwYWNlCi0gICAgICAgIFNTR0NzcHkubG9zTnVyc2VyeURyaXZlci5yZXNldERhdGEoKTsKLSAgICAgICAgbG9zLmdjc3B5R2F0aGVyRGF0YShldmVudCwgU1NHQ3NweS5sb3NOdXJzZXJ5RHJpdmVyKTsKLSAgICAgICAgU1NHQ3NweS5sb3NEcml2ZXIucmVzZXREYXRhKCk7Ci0gICAgICAgIGxvcy5nY3NweUdhdGhlckRhdGEoZXZlbnQsIFNTR0NzcHkubG9zRHJpdmVyLCBMT1NfVE9TUEFDRSk7Ci0KLSAgICAgICAgLy8gdHJhbnNtaXQgdGhlIGRhdGEKLSAgICAgICAgR0NzcHkuc2VydmVyLnN0b3BDb21wZW5zYXRpb25UaW1lcigpOwotICAgICAgICAvL2Zyb21TcGFjZURyaXZlcigpLnRyYW5zbWl0KGV2ZW50KTsKLSAgICAgICAgdG9TcGFjZURyaXZlcigpLnRyYW5zbWl0KGV2ZW50KTsKLSAgICAgICAgU1NHQ3NweS5pbW1vcnRhbERyaXZlci50cmFuc21pdChldmVudCk7Ci0gICAgICAgIFNTR0NzcHkubG9zTnVyc2VyeURyaXZlci50cmFuc21pdChldmVudCk7Ci0gICAgICAgIFNTR0NzcHkubG9zRHJpdmVyLnRyYW5zbWl0KGV2ZW50KTsKLSAgICAgICAgU1NHQ3NweS5wbG9zTnVyc2VyeURyaXZlci50cmFuc21pdChldmVudCk7Ci0gICAgICAgIFNTR0NzcHkucGxvc0RyaXZlci50cmFuc21pdChldmVudCk7Ci0KLSAgICAgICAgLy8gQXMgdGhpcyBmb2xsb3dzIENvbGxlY3Rvci5nY3NweUdhdGhlckRhdGEsIEknbGwgc2FmZXBvaW50IGhlcmUKLSAgICAgICAgLy8gVGhpcyBpcyBhIHNhZmVwb2ludCBmb3IgdGhlIHNlcnZlciwgaS5lLiBpdCBpcyBhIHBvaW50IGF0IHdoaWNoCi0gICAgICAgIC8vIHRoZSBzZXJ2ZXIgY2FuIHBhdXNlLgotICAgICAgICBHQ3NweS5zZXJ2ZXIuc2VydmVyU2FmZXBvaW50KGV2ZW50KTsKLSAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gU1NHQ3NweS5TRU1JU1BBQ0VfQ09QSUVEKSB7Ci0gICAgICAgIC8vIFdlIGhhdmUgZmxpcHBlZAotICAgICAgICAvLyB0b1NwYWNlIHN0aWxsIGhhcyBub3QgYmVlbiByZWJvdW5kCi0KLSAgICAgICAgLy8gLS0gSGFuZGxlIHRoZSBzZW1pc3BhY2VzCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgIC8vZGVidWdTcGFjZXMoU1NHQ3NweS50b1NwYWNlKCkpOwotICAgICAgICAgIGRlYnVnU3BhY2VzKFNTR0NzcHkuZnJvbVNwYWNlKCkpOwotICAgICAgICAgIExvZy53cml0ZWxuKCJTU0dDc3B5TXV0YXRvci5nY3NweUdhdGhlckRhdGE6IGRvIG5vdGhpbmciKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIC0tIEhhbmRsZSB0aGUgaW1tb3J0YWwgc3BhY2UgLS0KLSAgICAgICAgR0NzcHkuc2VydmVyLnN0YXJ0Q29tcGVuc2F0aW9uVGltZXIoKTsKLSAgICAgICAgZ2F0aGVySW1tb3J0YWwoZXZlbnQpOwotCi0gICAgICAgIC8vIHJlc2V0LCBzY2FuIGFuZCBzZW5kIHRoZSBsb3MgZm9yIHRoZSBudXJzZXJ5IGFuZCB0b3NwYWNlCi0gICAgICAgIC8vIGFuZCBmcm9tc3BhY2UgYXMgd2VsbCBpZiBmdWxsIGhlYXAgY29sbGVjdGlvbgotICAgICAgICBTU0dDc3B5Lmxvc051cnNlcnlEcml2ZXIucmVzZXREYXRhKCk7Ci0gICAgICAgIGxvcy5nY3NweUdhdGhlckRhdGEoZXZlbnQsIFNTR0NzcHkubG9zTnVyc2VyeURyaXZlcik7Ci0gICAgICAgIFNTR0NzcHkubG9zRHJpdmVyLnJlc2V0RGF0YSgpOwotICAgICAgICBsb3MuZ2NzcHlHYXRoZXJEYXRhKGV2ZW50LCBTU0dDc3B5Lmxvc0RyaXZlciwgTE9TX0ZST01TUEFDRSk7Ci0gICAgICAgIGxvcy5nY3NweUdhdGhlckRhdGEoZXZlbnQsIFNTR0NzcHkubG9zRHJpdmVyLCBMT1NfVE9TUEFDRSk7Ci0KLSAgICAgICAgLy8gdHJhbnNtaXQKLSAgICAgICAgR0NzcHkuc2VydmVyLnN0b3BDb21wZW5zYXRpb25UaW1lcigpOwotICAgICAgICBTU0dDc3B5LmltbW9ydGFsRHJpdmVyLnRyYW5zbWl0KGV2ZW50KTsKLSAgICAgICAgU1NHQ3NweS5sb3NOdXJzZXJ5RHJpdmVyLnRyYW5zbWl0KGV2ZW50KTsKLSAgICAgICAgU1NHQ3NweS5sb3NEcml2ZXIudHJhbnNtaXQoZXZlbnQpOwotICAgICAgICBTU0dDc3B5LnBsb3NOdXJzZXJ5RHJpdmVyLnRyYW5zbWl0KGV2ZW50KTsKLSAgICAgICAgU1NHQ3NweS5wbG9zRHJpdmVyLnRyYW5zbWl0KGV2ZW50KTsKLQotICAgICAgICAvLyBBcyB0aGlzIGZvbGxvd3MgQ29sbGVjdG9yLmdjc3B5R2F0aGVyRGF0YSwgSSdsbCBzYWZlcG9pbnQgaGVyZQotICAgICAgICAvLyBUaGlzIGlzIGEgc2FmZXBvaW50IGZvciB0aGUgc2VydmVyLCBpLmUuIGl0IGlzIGEgcG9pbnQgYXQgd2hpY2gKLSAgICAgICAgLy8gdGhlIHNlcnZlciBjYW4gcGF1c2UuCi0gICAgICAgIEdDc3B5LnNlcnZlci5zZXJ2ZXJTYWZlcG9pbnQoZXZlbnQpOwotICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBTU0dDc3B5LkFGVEVSX0NPTExFQ1RJT04pIHsKLSAgICAgICAgLy8gV2UgaGF2ZSBmbGlwcGVkCi0gICAgICAgIC8vIEFuZCB0b1NwYWNlIGhhcyBiZWVuIHJlYm91bmQKLQotICAgICAgICBHQ3NweS5zZXJ2ZXIuc3RhcnRDb21wZW5zYXRpb25UaW1lcigpOwotCi0gICAgICAgIC8vIC0tIEhhbmRsZSB0aGUgc2VtaXNwYWNlcwotICAgICAgICBpZiAoREVCVUcpIGRlYnVnU3BhY2VzKFNTR0NzcHkudG9TcGFjZSgpKTsKLQotICAgICAgICAvLyAtLSBIYW5kbGUgdGhlIGltbW9ydGFsIHNwYWNlIC0tCi0gICAgICAgIGdhdGhlckltbW9ydGFsKGV2ZW50KTsKLQotICAgICAgICAvLyAtLSBIYW5kbGUgdGhlIExPU2VzCi0KLSAgICAgICAgLy8gcmVzZXQsIHNjYW4gYW5kIHNlbmQgdGhlIGxvcwotICAgICAgICBTU0dDc3B5Lmxvc051cnNlcnlEcml2ZXIucmVzZXREYXRhKCk7Ci0gICAgICAgIFNTR0NzcHkubG9zRHJpdmVyLnJlc2V0RGF0YSgpOwotICAgICAgICAvLyBubyBuZWVkIHRvIHNjYW4gZW1wdHkgbnVyc2VyeQotICAgICAgICBsb3MuZ2NzcHlHYXRoZXJEYXRhKGV2ZW50LCBTU0dDc3B5Lmxvc0RyaXZlciwgTE9TX1RPU1BBQ0UpOwotCi0gICAgICAgIC8vdHJhbnNtaXQKLSAgICAgICAgR0NzcHkuc2VydmVyLnN0b3BDb21wZW5zYXRpb25UaW1lcigpOwotICAgICAgICBTU0dDc3B5LmltbW9ydGFsRHJpdmVyLnRyYW5zbWl0KGV2ZW50KTsKLSAgICAgICAgU1NHQ3NweS5sb3NOdXJzZXJ5RHJpdmVyLnRyYW5zbWl0KGV2ZW50KTsKLSAgICAgICAgU1NHQ3NweS5sb3NEcml2ZXIudHJhbnNtaXQoZXZlbnQpOwotICAgICAgICBTU0dDc3B5LnBsb3NOdXJzZXJ5RHJpdmVyLnRyYW5zbWl0KGV2ZW50KTsKLSAgICAgICAgU1NHQ3NweS5wbG9zRHJpdmVyLnRyYW5zbWl0KGV2ZW50KTsKLQotICAgICAgICAvLyBSZXNldCBmcm9tc3BhY2UKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgTG9nLndyaXRlKCJTU0dDc3B5TXV0YXRvci5nY3NweUdhdGhlckRhdGE6IHJlc2V0IGFuZCB6ZXJvIHJhbmdlIGZvciBkcml2ZXIgIik7Ci0gICAgICAgICAgTG9nLndyaXRlKFNTR0NzcHkudG9TcGFjZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgIH0KLSAgICAvLyBlbHNlIExvZy53cml0ZSgibm90IHRyYW5zbWl0dGluZy4uLiIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdhdGhlciBkYXRhIGZvciB0aGUgaW1tb3J0YWwgc3BhY2UKLSAgICogQHBhcmFtIGV2ZW50Ci0gICAqIFRoZSBldmVudCwgZWl0aGVyIEJFRk9SRV9DT0xMRUNUSU9OLCBTRU1JU1BBQ0VfQ09QSUVEIG9yCi0gICAqICAgICAgICAgIEFGVEVSX0NPTExFQ1RJT04KLSAgICovCi0gIHByaXZhdGUgdm9pZCBnYXRoZXJJbW1vcnRhbChpbnQgZXZlbnQpIHsKLSAgICAvLyBXZSB3YW50IHRvIGRvIHRoaXMgYXQgZXZlcnkgR0NzcHkgZXZlbnQKLSAgICBpZiAoREVCVUcpIHsKLSAgICAgIExvZy53cml0ZSgiU1NHQ3NweU11dGF0b3IuZ2NzcHlHYXRoZXJEYXRhOiBnYXRoZXIgZGF0YSBmb3IgaW1tb3J0YWwgc3BhY2UgIik7Ci0gICAgICBMb2cud3JpdGUoU1NHQ3NweS5pbW1vcnRhbFNwYWNlLmdldFN0YXJ0KCkpOyBMb2cud3JpdGVsbigiLSIsaW1tb3J0YWwuZ2V0Q3Vyc29yKCkpOwotICAgIH0KLSAgICBTU0dDc3B5LmltbW9ydGFsRHJpdmVyLnJlc2V0RGF0YSgpOwotICAgIGltbW9ydGFsLmdjc3B5R2F0aGVyRGF0YShTU0dDc3B5LmltbW9ydGFsRHJpdmVyKTsKLSAgICBpZiAoREVCVUcpIExvZy53cml0ZWxuKCJGaW5pc2hlZCBpbW1vcnRhbCBzcGFjZS4iKTsKLSAgfQotCi0gIC8qKgotICAgKiBEZWJ1Z2dpbmcgaW5mbyBmb3IgdGhlIHNlbWlzcGFjZXMKLSAgICogQHBhcmFtIHNjYW5uZWRTcGFjZSB0aGUgc3BhY2UgdG8gb3V0cHV0IGRlYnVnIGZvci4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBkZWJ1Z1NwYWNlcyhDb3B5U3BhY2Ugc2Nhbm5lZFNwYWNlKSB7Ci0gICAgTG9nLndyaXRlKCJTU0dDc3B5TXV0YXRvci5nY3NweUdhdGhlckRhdGE6IGdhdGhlciBkYXRhIGZvciBhY3RpdmUgc2VtaXNwYWNlICIpOwotICAgIExvZy53cml0ZShzY2FubmVkU3BhY2UuZ2V0U3RhcnQoKSk7IExvZy53cml0ZSgiLSIsc3MuZ2V0Q3Vyc29yKCkpOyBMb2cuZmx1c2goKTsKLSAgICBMb2cud3JpdGUoIi4gVGhlIHNwYWNlIGlzOiAiKTsgTG9nLndyaXRlbG4oc3MuZ2V0U3BhY2UoKS5nZXROYW1lKCkpOwotICAgIExvZy53cml0ZSgic2Nhbm5lZFNwYWNlIGlzICIpOyBMb2cud3JpdGVsbihzY2FubmVkU3BhY2UuZ2V0TmFtZSgpKTsKLSAgICBMb2cud3JpdGUoIlRoZSByYW5nZSBpcyAiKTsgTG9nLndyaXRlKHNzLmdldFNwYWNlKCkuZ2V0U3RhcnQoKSk7Ci0gICAgTG9nLndyaXRlKCIgdG8gIik7IExvZy53cml0ZWxuKHNzLmdldEN1cnNvcigpKTsKLSAgICBTU0dDc3B5LnJlcG9ydFNwYWNlcygpOwotICB9Ci0KLSAgLyoqIEByZXR1cm4gdGhlIGRyaXZlciBmb3IgdG9TcGFjZSAqLwotICBwcml2YXRlIExpbmVhclNwYWNlRHJpdmVyIHRvU3BhY2VEcml2ZXIoKSB7Ci0gICAgcmV0dXJuIFNTR0NzcHkuaGkgPyBTU0dDc3B5LnNzMURyaXZlciA6IFNTR0NzcHkuc3MwRHJpdmVyOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9zZW1pc3BhY2UvZ2NzcHkvU1NHQ3NweVRyYWNlTG9jYWwuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9zZW1pc3BhY2UvZ2NzcHkvU1NHQ3NweVRyYWNlTG9jYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI3OGNkYi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc2VtaXNwYWNlL2djc3B5L1NTR0NzcHlUcmFjZUxvY2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5zZW1pc3BhY2UuZ2NzcHk7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYWNlOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uc2VtaXNwYWNlLlNTVHJhY2VMb2NhbDsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsbWVudHMgdGhlIGNvcmUgZnVuY3Rpb25hbGl0eSBmb3IgYSB0cmFuc2l0aXZlCi0gKiBjbG9zdXJlIG92ZXIgdGhlIGhlYXAgZ3JhcGguCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBmaW5hbCBjbGFzcyBTU0dDc3B5VHJhY2VMb2NhbCBleHRlbmRzIFNTVHJhY2VMb2NhbCB7Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIFNTR0NzcHlUcmFjZUxvY2FsKFRyYWNlIHRyYWNlKSB7Ci0gICAgc3VwZXIodHJhY2UpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogRXh0ZXJuYWxseSB2aXNpYmxlIE9iamVjdCBwcm9jZXNzaW5nIGFuZCB0cmFjaW5nCi0gICAqLwotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBpcyB0aGUgY29yZSBtZXRob2QgZHVyaW5nIHRoZSB0cmFjZSBvZiB0aGUgb2JqZWN0IGdyYXBoLgotICAgKiBUaGUgcm9sZSBvZiB0aGlzIG1ldGhvZCBpcyB0bzoKLSAgICoKLSAgICogMS4gRW5zdXJlIHRoZSB0cmFjZWQgb2JqZWN0IGlzIG5vdCBjb2xsZWN0ZWQuCi0gICAqIDIuIElmIHRoaXMgaXMgdGhlIGZpcnN0IHZpc2l0IHRvIHRoZSBvYmplY3QgZW5xdWV1ZSBpdCB0byBiZSBzY2FubmVkLgotICAgKiAzLiBSZXR1cm4gdGhlIGZvcndhcmRlZCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdC4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIHRyYWNlZC4KLSAgICogQHJldHVybiBUaGUgbmV3IHJlZmVyZW5jZSB0byB0aGUgc2FtZSBvYmplY3QgaW5zdGFuY2UuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBPYmplY3RSZWZlcmVuY2UgdHJhY2VPYmplY3QoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmIChvYmplY3QuaXNOdWxsKCkpIHJldHVybiBvYmplY3Q7Ci0gICAgaWYgKFNwYWNlLmlzSW5TcGFjZShTU0dDc3B5LkdDU1BZLCBvYmplY3QpKQotICAgICAgcmV0dXJuIFNTR0NzcHkuZ2NzcHlTcGFjZS50cmFjZU9iamVjdCh0aGlzLCBvYmplY3QpOwotICAgIHJldHVybiBzdXBlci50cmFjZU9iamVjdChvYmplY3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIFdpbGwgdGhpcyBvYmplY3QgbW92ZSBmcm9tIHRoaXMgcG9pbnQgb24sIGR1cmluZyB0aGUgY3VycmVudCB0cmFjZSA/Ci0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBvYmplY3Qgd2lsbCBub3QgbW92ZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHdpbGxOb3RNb3ZlSW5DdXJyZW50Q29sbGVjdGlvbihPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKFNwYWNlLmlzSW5TcGFjZShTU0dDc3B5LkdDU1BZLCBvYmplY3QpKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIHN1cGVyLndpbGxOb3RNb3ZlSW5DdXJyZW50Q29sbGVjdGlvbihvYmplY3QpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc2VtaXNwYWNlL2djdHJhY2UvR0NUcmFjZS5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3NlbWlzcGFjZS9nY3RyYWNlL0dDVHJhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJlOTdmYi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc2VtaXNwYWNlL2djdHJhY2UvR0NUcmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLnNlbWlzcGFjZS5nY3RyYWNlOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5zZW1pc3BhY2UuKjsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuUmF3UGFnZVNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZGVxdWUuU29ydFRPRFNoYXJlZERlcXVlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuaGVhcC5WTVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5UcmFjZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnMuT3B0aW9uczsKLQotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBwbGFuIGhhcyBiZWVuIG1vZGlmaWVkIHNsaWdodGx5IHRvIHBlcmZvcm0gdGhlIHByb2Nlc3NpbmcgbmVjZXNzYXJ5Ci0gKiBmb3IgR0MgdHJhY2UgZ2VuZXJhdGlvbi4gIFRvIG1heGltaXplIHBlcmZvcm1hbmNlLCBpdCBhdHRlbXB0cyB0byByZW1haW4KLSAqIGFzIGZhaXRoZnVsIGFzIHBvc3NpYmxlIHRvIHNlbWlTcGFjZS9QbGFuLmphdmEuCi0gKgotICogVGhlIGdlbmVyYXRlZCB0cmFjZSBmb3JtYXQgaXMgYXMgZm9sbG93czoKLSAqICAgIEIgMzQ1Njc4IDEyCi0gKiAgICAgIChPYmplY3QgMzQ1Njc4IHdhcyBjcmVhdGVkIGluIHRoZSBib290IGltYWdlIHdpdGggYSBzaXplIG9mIDEyIGJ5dGVzKQotICogICAgVSA1OTg0MyAyMzQgNDcyOTgKLSAqICAgICAgKFVwZGF0ZSBvYmplY3QgNTk4NDMgYXQgdGhlIHNsb3QgYXQgb2Zmc2V0IDIzNCB0byByZWZlciB0byA0NzI5OCkKLSAqICAgIFMgMTIzMyAxMjM0NQotICogICAgICAoVXBkYXRlIHN0YXRpYyBzbG90IDEyMzMgdG8gcmVmZXIgdG8gMTIzNDUpCi0gKiAgICBUIDQ1NjcgNzg5MjQKLSAqICAgICAgKFRoZSBUSUIgb2YgNDU2NyBpcyBzZXQgdG8gcmVmZXIgdG8gNzg5MjQpCi0gKiAgICBEIDM0Mjc4OQotICogICAgICAoT2JqZWN0IDM0Mjc4OSBiZWNhbWUgdW5yZWFjaGFibGUpCi0gKiAgICBBIDY4NjAgMjQgMzQ2NjQ4IDMKLSAqICAgICAgKE9iamVjdCA2ODYwIHdhcyBhbGxvY2F0ZWQsIHJlcXVpcmluZyAyNCBieXRlcywgd2l0aCBmcCAzNDY2NDggb24KLSAqICAgICAgICB0aHJlYWQgMzsgdGhpcyBhbGxvY2F0aW9uIGhhcyBwZXJmZWN0IGtub3dsZWRnZSkKLSAqICAgIGEgNjg4NCAyNCAzNDY2NDAgNQotICogICAgICAoT2JqZWN0IDY4NjQgd2FzIGFsbG9jYXRlZCwgcmVxdWlyaW5nIDI0IGJ5dGVzLCB3aXRoIGZwIDM0NjY0MCBvbgotICogdGhyZWFkIDU7IHRoaXMgYWxsb2NhdGlvbiBET0VTIE5PVCBoYXZlIHBlcmZlY3Qga25vd2xlZGdlKQotICogICAgSSA2ODYwIDI0IDM0NjY0OCAzCi0gKiAgICAgIChPYmplY3QgNjg2MCB3YXMgYWxsb2NhdGVkIGludG8gaW1tb3J0YWwgc3BhY2UsIHJlcXVpcmluZyAyNCBieXRlcywKLSAqICAgICAgICB3aXRoIGZwIDM0NjY0OCBvbiB0aHJlYWQgMzsgdGhpcyBhbGxvY2F0aW9uIGhhcyBwZXJmZWN0IGtub3dsZWRnZSkKLSAqICAgIGkgNjg4NCAyNCAzNDY2NDAgNQotICogICAgICAoT2JqZWN0IDY4NjQgd2FzIGFsbG9jYXRlZCBpbnRvIGltbW9ydGFsIHNwYWNlLCByZXF1aXJpbmcgMjQgYnl0ZXMsCi0gKiAgICAgICAgd2l0aCBmcCAzNDY2NDAgb24gdGhyZWFkIDU7IHRoaXMgYWxsb2NhdGlvbiBET0VTIE5PVCBoYXZlIHBlcmZlY3QKLSAqICAgICAgICBrbm93bGVkZ2UpCi0gKiAgICA0ODk1NC0+WzM0NV1MT2JqZWN0OzpibGFoKClWOjIzICAgTGphdmEvbGFuZy9Gb287Ci0gKiAgICAgIChDaXRhdGlvbiBmb3I6IGEpIHdoZXJlIHRoZSB3YXMgYWxsb2NhdGVkLCBmcCBvZiA0ODk1NCwKLSAqICAgICAgICAgYXQgdGhlIG1ldGhvZCB3aXRoIElEIDM0NSAtLSBvciB2b2lkIE9iamVjdC5ibGFoKCkgLS0gYW5kIGJ5dGVjb2RlCi0gKiAgICAgICAgIHdpdGggb2Zmc2V0IDIzOyBiKSB0aGUgb2JqZWN0IGFsbG9jYXRlZCBpcyBvZiB0eXBlIGphdmEubGFuZy5Gb28pCi0gKiAgICBEIDM0Mjc4OSAzNjE0NjAKLSAqICAgICAgKE9iamVjdCAzNDI3ODkgYmVjYW1lIHVucmVhY2hhYmxlIGFmdGVyIDM2MTQ2MCB3YXMgYWxsb2NhdGVkKQotICoKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHNpbXBsZSBzZW1pLXNwYWNlIGNvbGxlY3Rvci4gU2VlIHRoZSBKb25lcwotICogJiBMaW5zIEdDIGJvb2ssIHNlY3Rpb24gMi4yIGZvciBhbiBvdmVydmlldyBvZiB0aGUgYmFzaWMKLSAqIGFsZ29yaXRobS4gVGhpcyBpbXBsZW1lbnRhdGlvbiBhbHNvIGluY2x1ZGVzIGEgbGFyZ2Ugb2JqZWN0IHNwYWNlCi0gKiAoTE9TKSwgYW5kIGFuIHVuY29sbGVjdGVkICJpbW1vcnRhbCIgc3BhY2UuPHA+Ci0gKgotICogQWxsIHBsYW5zIG1ha2UgYSBjbGVhciBkaXN0aW5jdGlvbiBiZXR3ZWVuIDxpPmdsb2JhbDwvaT4gYW5kCi0gKiA8aT50aHJlYWQtbG9jYWw8L2k+IGFjdGl2aXRpZXMuICBHbG9iYWwgYWN0aXZpdGllcyBtdXN0IGJlCi0gKiBzeW5jaHJvbml6ZWQsIHdoZXJlYXMgbm8gc3luY2hyb25pemF0aW9uIGlzIHJlcXVpcmVkIGZvcgotICogdGhyZWFkLWxvY2FsIGFjdGl2aXRpZXMuICBJbnN0YW5jZXMgb2YgUGxhbiBtYXAgMToxIHRvICJrZXJuZWwKLSAqIHRocmVhZHMiIChha2EgQ1BVcykuICBUaHVzIGluc3RhbmNlCi0gKiBtZXRob2RzIGFsbG93IGZhc3QsIHVuc3ljaHJvbml6ZWQgYWNjZXNzIHRvIFBsYW4gdXRpbGl0aWVzIHN1Y2ggYXMKLSAqIGFsbG9jYXRpb24gYW5kIGNvbGxlY3Rpb24uICBFYWNoIGluc3RhbmNlIHJlc3RzIG9uIHN0YXRpYyByZXNvdXJjZXMKLSAqIChzdWNoIGFzIG1lbW9yeSBhbmQgdmlydHVhbCBtZW1vcnkgcmVzb3VyY2VzKSB3aGljaCBhcmUgImdsb2JhbCIKLSAqIGFuZCB0aGVyZWZvcmUgInN0YXRpYyIgbWVtYmVycyBvZiBQbGFuLiAgVGhpcyBtYXBwaW5nIG9mIHRocmVhZHMgdG8KLSAqIGluc3RhbmNlcyBpcyBjcnVjaWFsIHRvIHVuZGVyc3RhbmRpbmcgdGhlIGNvcnJlY3RuZXNzIGFuZAotICogcGVyZm9ybWFuY2UgcHJvcHJ0aWVzIG9mIHRoaXMgcGxhbi4KLSAqLwotQFVuaW50ZXJydXB0aWJsZSBwdWJsaWMgY2xhc3MgR0NUcmFjZSBleHRlbmRzIFNTIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDbGFzcyB2YXJpYWJsZXMKLSAgICovCi0KLSAgLyogU3BhY2VzICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgUmF3UGFnZVNwYWNlIHRyYWNlU3BhY2UgPSBuZXcgUmF3UGFnZVNwYWNlKCJ0cmFjZSIsIERFRkFVTFRfUE9MTF9GUkVRVUVOQ1ksIFZNUmVxdWVzdC5jcmVhdGUoKSk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQUNFID0gdHJhY2VTcGFjZS5nZXREZXNjcmlwdG9yKCk7Ci0KLSAgLyogR0Mgc3RhdGUgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGxhc3RHQ1dhc1RyYWNpbmcgPSBmYWxzZTsgLy8gVHJ1ZSB3aGVuIHByZXZpb3VzIEdDIHdhcyBmb3IgdHJhY2luZwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdHJhY2VJbmR1Y2VkR0MgPSBmYWxzZTsgLy8gVHJ1ZSBpZiB0cmFjZSB0cmlnZ2VyZWQgR0MKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGRlYXRoU2NhbiA9IGZhbHNlOwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmluYWxEZWFkID0gZmFsc2U7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5pdGlhbGl6YXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqLwotICBwdWJsaWMgR0NUcmFjZSgpIHsKLSAgICBTb3J0VE9EU2hhcmVkRGVxdWUgd29ya0xpc3QgPSBuZXcgU29ydFRPRFNoYXJlZERlcXVlKCJ3b3JrTGlzdCIsdHJhY2VTcGFjZSwgMSk7Ci0gICAgU29ydFRPRFNoYXJlZERlcXVlIHRyYWNlQnVmID0gbmV3IFNvcnRUT0RTaGFyZWREZXF1ZSgidHJhY2VCdWYiLHRyYWNlU3BhY2UsIDEpOwotICAgIHdvcmtMaXN0LnByZXBhcmVOb25CbG9ja2luZygpOwotICAgIHRyYWNlQnVmLnByZXBhcmVOb25CbG9ja2luZygpOwotICAgIFRyYWNlR2VuZXJhdG9yLmluaXQod29ya0xpc3QsIHRyYWNlQnVmKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgcG9zdEJvb3QgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgcnVudGltZSBpbW1lZGlhdGVseSBhZnRlcgotICAgKiBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGFyZSBhdmFpbGFibGUuCi0gICAqLwotICBASW50ZXJydXB0aWJsZQotICBwdWJsaWMgdm9pZCBwb3N0Qm9vdCgpIHsKLSAgICBPcHRpb25zLm5vRmluYWxpemVyLnNldFZhbHVlKHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBwbGFuRXhpdCBtZXRob2QgaXMgY2FsbGVkIGF0IFJWTSB0ZXJtaW5hdGlvbiB0byBhbGxvdyB0aGUKLSAgICogdHJhY2UgcHJvY2VzcyB0byBmaW5pc2guCi0gICAqLwotICBASW50ZXJydXB0aWJsZQotICBwdWJsaWMgZmluYWwgdm9pZCBub3RpZnlFeGl0KGludCB2YWx1ZSkgewotICAgIHN1cGVyLm5vdGlmeUV4aXQodmFsdWUpOwotICAgIGZpbmFsRGVhZCA9IHRydWU7Ci0gICAgdHJhY2VJbmR1Y2VkR0MgPSBmYWxzZTsKLSAgICBkZWF0aFNjYW4gPSB0cnVlOwotICAgIFRyYWNlR2VuZXJhdG9yLm5vdGlmeUV4aXQodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGNvbnRyb2xzIHRoZSB0cmlnZ2VyaW5nIG9mIGEgR0MuIEl0IGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkKLSAgICogZHVyaW5nIGFsbG9jYXRpb24uIFJldHVybnMgdHJ1ZSB0byB0cmlnZ2VyIGEgY29sbGVjdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIHNwYWNlRnVsbCBTcGFjZSByZXF1ZXN0IGZhaWxlZCwgbXVzdCByZWNvdmVyIHBhZ2VzIHdpdGhpbiAnc3BhY2UnLgotICAgKiBAcmV0dXJuIFRydWUgaWYgYSBjb2xsZWN0aW9uIGlzIHJlcXVlc3RlZCBieSB0aGUgcGxhbi4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGNvbGxlY3Rpb25SZXF1aXJlZChib29sZWFuIHNwYWNlRnVsbCkgewotICAgIGlmIChzdXBlci5jb2xsZWN0aW9uUmVxdWlyZWQoc3BhY2VGdWxsKSkgewotICAgICAgdHJhY2VJbmR1Y2VkR0MgPSBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDb2xsZWN0aW9uCi0gICAqLwotCi0gIHB1YmxpYyB2b2lkIGNvbGxlY3Rpb25QaGFzZShzaG9ydCBwaGFzZUlkKSB7Ci0gICAgaWYgKHBoYXNlSWQgPT0gUFJFUEFSRSkgewotICAgICAgbGFzdEdDV2FzVHJhY2luZyA9IHRyYWNlSW5kdWNlZEdDOwotICAgIH0KLSAgICBpZiAocGhhc2VJZCA9PSBSRUxFQVNFKSB7Ci0gICAgICBpZiAodHJhY2VJbmR1Y2VkR0MpIHsKLSAgICAgICAgLyogQ2xlYW4gdXAgZm9sbG93aW5nIGEgdHJhY2UtaW5kdWNlZCBzY2FuICovCi0gICAgICAgIGRlYXRoU2NhbiA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLyogRmluaXNoIHRoZSBjb2xsZWN0aW9uIGJ5IGNhbGN1bGF0aW5nIHRoZSB1bnJlYWNoYWJsZSB0aW1lcyAqLwotICAgICAgICBkZWF0aFNjYW4gPSB0cnVlOwotICAgICAgICBUcmFjZUdlbmVyYXRvci5wb3N0Q29sbGVjdGlvbigpOwotICAgICAgICBkZWF0aFNjYW4gPSBmYWxzZTsKLSAgICAgICAgLyogUGVyZm9ybSB0aGUgc2VtaXNwYWNlIGNvbGxlY3Rpb25zLiAqLwotICAgICAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICghdHJhY2VJbmR1Y2VkR0MgfHwKLSAgICAgICAgICAgICAgIChwaGFzZUlkID09IElOSVRJQVRFKSB8fAotICAgICAgICAgICAgICAgKHBoYXNlSWQgPT0gUFJFUEFSRV9TVEFDS1MpIHx8Ci0gICAgICAgICAgICAgICAocGhhc2VJZCA9PSBST09UUykgfHwKLSAgICAgICAgICAgICAgIChwaGFzZUlkID09IFNUQUNLX1JPT1RTKSB8fAotICAgICAgICAgICAgICAgKHBoYXNlSWQgPT0gQ09NUExFVEUpKSB7Ci0gICAgICAvKiBQZXJmb3JtaW5nIG5vcm1hbCBHQzsgc3BvbmdlIG9mZiBvZiBwYXJlbnQncyB3b3JrLiAqLwotICAgICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQpOwotICAgIH0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogU3BhY2UgbWFuYWdlbWVudAotICAgKi8KLQotICAvKioKLSAgICogQHJldHVybiBTaW5jZSB0cmFjZSBpbmR1Y2VkIGNvbGxlY3Rpb25zIGFyZSBub3QgY2FsbGVkIHRvIGZyZWUgdXAgbWVtb3J5LAotICAgKiAgICAgICAgIHRoZWlyIGZhaWx1cmUgdG8gcmV0dXJuIG1lbW9yeSBpc24ndCBjYXVzZSBmb3IgY29uY2Vybi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTGFzdEdDRnVsbCgpIHsKLSAgICByZXR1cm4gIWxhc3RHQ1dhc1RyYWNpbmc7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiB0aGUgYWN0aXZlIFBsYW5Mb2NhbCBhcyBhIEdDVHJhY2VMb2NhbAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBHQ1RyYWNlQ29sbGVjdG9yIGxvY2FsKCkgewotICAgIHJldHVybiAoKEdDVHJhY2VDb2xsZWN0b3IpIFZNLmFjdGl2ZVBsYW4uY29sbGVjdG9yKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gdGhlIGFjdGl2ZSBQbGFuIGFzIGEgR0NUcmFjZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBHQ1RyYWNlIGdsb2JhbCgpIHsKLSAgICByZXR1cm4gKChHQ1RyYWNlKSBWTS5hY3RpdmVQbGFuLmdsb2JhbCgpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3NlbWlzcGFjZS9nY3RyYWNlL0dDVHJhY2VDb2xsZWN0b3IuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9zZW1pc3BhY2UvZ2N0cmFjZS9HQ1RyYWNlQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxOTg5ZjQuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3NlbWlzcGFjZS9nY3RyYWNlL0dDVHJhY2VDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5zZW1pc3BhY2UuZ2N0cmFjZTsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uKjsKLWltcG9ydCBvcmcubW10ay5wbGFuLnNlbWlzcGFjZS4qOwotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgPGk+cGVyLWNvbGxlY3RvciB0aHJlYWQ8L2k+IGJlaGF2aW9yIGFuZCBzdGF0ZSBmb3IgdGhlCi0gKiA8aT5HQ1RyYWNlPC9pPiBwbGFuLCB3aGljaCBpbXBsZW1lbnRzIGEgR0MgdHJhY2luZyBhbGdvcml0aG0uPHA+Ci0gKgotICogU3BlY2lmaWNhbGx5LCB0aGlzIGNsYXNzIGRlZmluZXMgPGk+U1M8L2k+IGNvbGxlY3Rpb24gYmVoYXZpb3IKLSAqICh0aHJvdWdoIDxjb2RlPmluZHVjZWRUcmFjZTwvY29kZT4gYW5kIHRoZSA8Y29kZT5jb2xsZWN0aW9uUGhhc2U8L2NvZGU+Ci0gKiBtZXRob2QpLCBhbmQgY29sbGVjdGlvbi10aW1lIGFsbG9jYXRpb24gKGNvcHlpbmcgb2Ygb2JqZWN0cykuPHA+Ci0gKgotICogU2VlIHtAbGluayBHQ1RyYWNlfSBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIEdDIHRyYWNlIGFsZ29yaXRobS48cD4KLSAqCi0gKiBAc2VlIFNTQ29sbGVjdG9yCi0gKiBAc2VlIEdDVHJhY2UKLSAqIEBzZWUgR0NUcmFjZU11dGF0b3IKLSAqIEBzZWUgb3JnLm1tdGsucGxhbi5TdG9wVGhlV29ybGRDb2xsZWN0b3IKLSAqIEBzZWUgb3JnLm1tdGsucGxhbi5Db2xsZWN0b3JDb250ZXh0Ci0gKi8KLUBVbmludGVycnVwdGlibGUgcHVibGljIGNsYXNzIEdDVHJhY2VDb2xsZWN0b3IgZXh0ZW5kcyBTU0NvbGxlY3RvciB7Ci0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIEluc3RhbmNlIGZpZWxkcwotICAgKi8KLSAgcHJvdGVjdGVkIGZpbmFsIEdDVHJhY2VUcmFjZUxvY2FsIGluZHVjZWRUcmFjZTsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbml0aWFsaXphdGlvbgotICAgKi8KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICovCi0gIHB1YmxpYyBHQ1RyYWNlQ29sbGVjdG9yKCkgewotICAgIGluZHVjZWRUcmFjZSA9IG5ldyBHQ1RyYWNlVHJhY2VMb2NhbChnbG9iYWwoKS5zc1RyYWNlKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbGxlY3Rpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSBwZXItY29sbGVjdG9yIGNvbGxlY3Rpb24gcGhhc2UuCi0gICAqCi0gICAqIEBwYXJhbSBwaGFzZUlkIFRoZSBjb2xsZWN0aW9uIHBoYXNlIHRvIHBlcmZvcm0KLSAgICogQHBhcmFtIHByaW1hcnkgcGVyZm9ybSBhbnkgc2luZ2xlLXRocmVhZGVkIGxvY2FsIGFjdGl2aXRpZXMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBjb2xsZWN0aW9uUGhhc2Uoc2hvcnQgcGhhc2VJZCwgYm9vbGVhbiBwcmltYXJ5KSB7Ci0gICAgaWYgKHBoYXNlSWQgPT0gR0NUcmFjZS5DTE9TVVJFKSB7Ci0gICAgICBpbmR1Y2VkVHJhY2UuY29tcGxldGVUcmFjZSgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwaGFzZUlkID09IEdDVHJhY2UuUkVMRUFTRSkgewotICAgICAgaW5kdWNlZFRyYWNlLnJlbGVhc2UoKTsKLSAgICAgIGlmICghR0NUcmFjZS50cmFjZUluZHVjZWRHQykgewotICAgICAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogZmFsbCB0aHJvdWdoIGNhc2UgKi8KLSAgICBpZiAoIUdDVHJhY2UudHJhY2VJbmR1Y2VkR0MgfHwKLSAgICAgICAgKChwaGFzZUlkICE9IFN0b3BUaGVXb3JsZC5TT0ZUX1JFRlMpICYmCi0gICAgICAgICAocGhhc2VJZCAhPSBTdG9wVGhlV29ybGQuV0VBS19SRUZTKSAmJgotICAgICAgICAgKHBoYXNlSWQgIT0gU3RvcFRoZVdvcmxkLlBIQU5UT01fUkVGUykgJiYKLSAgICAgICAgIChwaGFzZUlkICE9IFN0b3BUaGVXb3JsZC5GSU5BTElaQUJMRSkgJiYKLSAgICAgICAgIChwaGFzZUlkICE9IFNTLlBSRVBBUkUpKSkgewotICAgICAgLy8gRGVsZWdhdGUgdXAuCi0gICAgICBzdXBlci5jb2xsZWN0aW9uUGhhc2UocGhhc2VJZCwgcHJpbWFyeSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogTWlzY2VsbGFuZW91cwotICAgKi8KLQotICAvKiogQHJldHVybiBUaGUgYWN0aXZlIGdsb2JhbCBwbGFuIGFzIGEgPGNvZGU+R0NUcmFjZTwvY29kZT4gaW5zdGFuY2UuICovCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSBzdGF0aWMgR0NUcmFjZSBnbG9iYWwoKSB7Ci0gICAgcmV0dXJuIChHQ1RyYWNlKSBWTS5hY3RpdmVQbGFuLmdsb2JhbCgpOwotICB9Ci0KLSAgLyoqIEByZXR1cm4gVGhlIGN1cnJlbnQgdHJhY2UgaW5zdGFuY2UgKi8KLSAgcHVibGljIFRyYWNlTG9jYWwgZ2V0Q3VycmVudFRyYWNlKCkgewotICAgIHJldHVybiBpbmR1Y2VkVHJhY2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9zZW1pc3BhY2UvZ2N0cmFjZS9HQ1RyYWNlQ29uc3RyYWludHMuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9zZW1pc3BhY2UvZ2N0cmFjZS9HQ1RyYWNlQ29uc3RyYWludHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU0ZjcwOS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc2VtaXNwYWNlL2djdHJhY2UvR0NUcmFjZUNvbnN0cmFpbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5zZW1pc3BhY2UuZ2N0cmFjZTsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uc2VtaXNwYWNlLlNTQ29uc3RyYWludHM7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBHQ1RyYWNlIGNvbnN0YW50cy4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIEdDVHJhY2VDb25zdHJhaW50cyBleHRlbmRzIFNTQ29uc3RyYWludHMgewotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gbmVlZHNPYmplY3RSZWZlcmVuY2VXcml0ZUJhcnJpZXIoKSB7IHJldHVybiB0cnVlOyB9Ci0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBnZW5lcmF0ZUdDVHJhY2UoKSB7IHJldHVybiB0cnVlOyB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc2VtaXNwYWNlL2djdHJhY2UvR0NUcmFjZU11dGF0b3IuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9zZW1pc3BhY2UvZ2N0cmFjZS9HQ1RyYWNlTXV0YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTgzZWIwLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9zZW1pc3BhY2UvZ2N0cmFjZS9HQ1RyYWNlTXV0YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLnNlbWlzcGFjZS5nY3RyYWNlOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5zZW1pc3BhY2UuU1NNdXRhdG9yOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uKjsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LlRyYWNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyA8aT5wZXItbXV0YXRvciB0aHJlYWQ8L2k+IGJlaGF2aW9yIGFuZCBzdGF0ZSBmb3IgdGhlCi0gKiA8aT5HQ1RyYWNlPC9pPiBwbGFuLCB3aGljaCBpbXBsZW1lbnRzIGEgR0MgdHJhY2luZyBhbGdvcml0aG0uPHA+Ci0gKgotICogU3BlY2lmaWNhbGx5LCB0aGlzIGNsYXNzIGRlZmluZXMgPGk+U1M8L2k+IG11dGF0b3ItdGltZSBhbGxvY2F0aW9uLCB3cml0ZQotICogYmFycmllcnMsIGFuZCBwZXItbXV0YXRvciBjb2xsZWN0aW9uIHNlbWFudGljcy48cD4KLSAqCi0gKiBTZWUge0BsaW5rIEdDVHJhY2V9IGZvciBhbiBvdmVydmlldyBvZiB0aGUgR0MgdHJhY2UgYWxnb3JpdGhtLjxwPgotICoKLSAqIEBzZWUgU1NNdXRhdG9yCi0gKiBAc2VlIEdDVHJhY2UKLSAqIEBzZWUgR0NUcmFjZUNvbGxlY3RvcgotICogQHNlZSBvcmcubW10ay5wbGFuLlN0b3BUaGVXb3JsZE11dGF0b3IKLSAqIEBzZWUgb3JnLm1tdGsucGxhbi5NdXRhdG9yQ29udGV4dAotICovCi1AVW5pbnRlcnJ1cHRpYmxlIHB1YmxpYyBjbGFzcyBHQ1RyYWNlTXV0YXRvciBleHRlbmRzIFNTTXV0YXRvciB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogTXV0YXRvci10aW1lIGFsbG9jYXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gcG9zdC1hbGxvY2F0aW9uIGFjdGlvbnMuICBGb3IgbWFueSBhbGxvY2F0b3JzIG5vbmUgYXJlCi0gICAqIHJlcXVpcmVkLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBuZXdseSBhbGxvY2F0ZWQgb2JqZWN0Ci0gICAqIEBwYXJhbSB0eXBlUmVmIHRoZSB0eXBlIHJlZmVyZW5jZSBmb3IgdGhlIGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBzaXplIG9mIHRoZSBzcGFjZSB0byBiZSBhbGxvY2F0ZWQgKGluIGJ5dGVzKQotICAgKiBAcGFyYW0gYWxsb2NhdG9yIFRoZSBhbGxvY2F0b3IgbnVtYmVyIHRvIGJlIHVzZWQgZm9yIHRoaXMgYWxsb2NhdGlvbgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgdm9pZCBwb3N0QWxsb2MoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCwgT2JqZWN0UmVmZXJlbmNlIHR5cGVSZWYsCi0gICAgICBpbnQgYnl0ZXMsIGludCBhbGxvY2F0b3IpIHsKLSAgICAvKiBNYWtlIHRoZSB0cmFjZSBnZW5lcmF0b3IgYXdhcmUgb2YgdGhlIG5ldyBvYmplY3QuICovCi0gICAgVHJhY2VHZW5lcmF0b3IuYWRkVHJhY2VPYmplY3Qob2JqZWN0LCBhbGxvY2F0b3IpOwotCi0gICAgc3VwZXIucG9zdEFsbG9jKG9iamVjdCwgdHlwZVJlZiwgYnl0ZXMsIGFsbG9jYXRvcik7Ci0KLSAgICAvKiBOb3cgaGF2ZSB0aGUgdHJhY2UgcHJvY2VzcyBhd2FyZSBvZiB0aGUgbmV3IGFsbG9jYXRpb24uICovCi0gICAgR0NUcmFjZS50cmFjZUluZHVjZWRHQyA9IFRyYWNlR2VuZXJhdG9yLk1FUkxJTl9BTkFMWVNJUzsKLSAgICBUcmFjZUdlbmVyYXRvci50cmFjZUFsbG9jKGFsbG9jYXRvciA9PSBHQ1RyYWNlLkFMTE9DX0lNTU9SVEFMLCBvYmplY3QsIHR5cGVSZWYsIGJ5dGVzKTsKLSAgICBHQ1RyYWNlLnRyYWNlSW5kdWNlZEdDID0gZmFsc2U7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIFdyaXRlIGJhcnJpZXIuCi0gICAqLwotCi0gIC8qKgotICAgKiBBIG5ldyByZWZlcmVuY2UgaXMgYWJvdXQgdG8gYmUgY3JlYXRlZC4gIFRha2UgYXBwcm9wcmlhdGUgd3JpdGUKLSAgICogYmFycmllciBhY3Rpb25zLjxwPgotICAgKgotICAgKiBJbiB0aGlzIGNhc2UsIHdlIHJlbWVtYmVyIHRoZSBhZGRyZXNzIG9mIHRoZSBzb3VyY2Ugb2YgdGhlCi0gICAqIHBvaW50ZXIgaWYgdGhlIG5ldyByZWZlcmVuY2UgcG9pbnRzIGludG8gdGhlIG51cnNlcnkgZnJvbQotICAgKiBub24tbnVyc2VyeSBzcGFjZS4KLSAgICoKLSAgICogQHBhcmFtIHNyYyBUaGUgb2JqZWN0IGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZSBzdG9yZWQKLSAgICogQHBhcmFtIHNsb3QgVGhlIGFkZHJlc3MgaW50byB3aGljaCB0aGUgbmV3IHJlZmVyZW5jZSB3aWxsIGJlCi0gICAqIHN0b3JlZC4KLSAgICogQHBhcmFtIHRndCBUaGUgdGFyZ2V0IG9mIHRoZSBuZXcgcmVmZXJlbmNlCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbWV0YURhdGFCIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogYmVpbmcgbW9kaWZpZWQKLSAgICogQHBhcmFtIG1vZGUgVGhlIG1vZGUgb2YgdGhlIHN0b3JlIChlZyBwdXRmaWVsZCwgcHV0c3RhdGljIGV0YykKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGZpbmFsIHZvaWQgb2JqZWN0UmVmZXJlbmNlV3JpdGUoT2JqZWN0UmVmZXJlbmNlIHNyYywgQWRkcmVzcyBzbG90LAotICAgICAgT2JqZWN0UmVmZXJlbmNlIHRndCwgV29yZCBtZXRhRGF0YUEsCi0gICAgICBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpIHsKLSAgICBUcmFjZUdlbmVyYXRvci5wcm9jZXNzUG9pbnRlclVwZGF0ZShtb2RlID09IElOU1RBTkNFX0ZJRUxELAotICAgICAgICBzcmMsIHNsb3QsIHRndCk7Ci0gICAgVk0uYmFycmllcnMub2JqZWN0UmVmZXJlbmNlV3JpdGUoc3JjLCB0Z3QsIG1ldGFEYXRhQSwgbWV0YURhdGFCLCBtb2RlKTsKLSAgfQotCi0gIC8qKgotICAgKiBBdHRlbXB0IHRvIGF0b21pY2FsbHkgZXhjaGFuZ2UgdGhlIHZhbHVlIGluIHRoZSBnaXZlbiBzbG90Ci0gICAqIHdpdGggdGhlIHBhc3NlZCByZXBsYWNlbWVudCB2YWx1ZS4gSWYgYSBuZXcgcmVmZXJlbmNlIGlzCi0gICAqIGNyZWF0ZWQsIHdlIG11c3QgdGhlbiB0YWtlIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogPGI+QnkgZGVmYXVsdCBkbyBub3RoaW5nLCBvdmVycmlkZSBpZiBhcHByb3ByaWF0ZS48L2I+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUgc3RvcmVkCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZQotICAgKiBzdG9yZWQuCi0gICAqIEBwYXJhbSBvbGQgVGhlIG9sZCByZWZlcmVuY2UgdG8gYmUgc3dhcHBlZCBvdXQKLSAgICogQHBhcmFtIHRndCBUaGUgdGFyZ2V0IG9mIHRoZSBuZXcgcmVmZXJlbmNlCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbWV0YURhdGFCIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHN0b3JlIG9jY3VyZWQKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBzd2FwIHdhcyBzdWNjZXNzZnVsLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgYm9vbGVhbiBvYmplY3RSZWZlcmVuY2VUcnlDb21wYXJlQW5kU3dhcChPYmplY3RSZWZlcmVuY2Ugc3JjLCBBZGRyZXNzIHNsb3QsCi0gICAgICBPYmplY3RSZWZlcmVuY2Ugb2xkLCBPYmplY3RSZWZlcmVuY2UgdGd0LCBXb3JkIG1ldGFEYXRhQSwKLSAgICAgIFdvcmQgbWV0YURhdGFCLCBpbnQgbW9kZSkgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gVk0uYmFycmllcnMub2JqZWN0UmVmZXJlbmNlVHJ5Q29tcGFyZUFuZFN3YXAoc3JjLCBvbGQsIHRndCwgbWV0YURhdGFBLCBtZXRhRGF0YUIsIG1vZGUpOwotICAgIGlmIChyZXN1bHQpIHsKLSAgICAgIFRyYWNlR2VuZXJhdG9yLnByb2Nlc3NQb2ludGVyVXBkYXRlKG1vZGUgPT0gSU5TVEFOQ0VfRklFTEQsIHNyYywgc2xvdCwgdGd0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBBIG51bWJlciBvZiByZWZlcmVuY2VzIGFyZSBhYm91dCB0byBiZSBjb3BpZWQgZnJvbSBvYmplY3QKLSAgICogPGNvZGU+c3JjPC9jb2RlPiB0byBvYmplY3QgPGNvZGU+ZHN0PC9jb2RlPiAoYXMgaW4gYW4gYXJyYXkKLSAgICogY29weSkuICBUaHVzLCA8Y29kZT5kc3Q8L2NvZGU+IGlzIHRoZSBtdXRhdGVkIG9iamVjdC4gIFRha2UKLSAgICogYXBwcm9wcmlhdGUgd3JpdGUgYmFycmllciBhY3Rpb25zLjxwPgotICAgKgotICAgKiBAcGFyYW0gc3JjIFRoZSBzb3VyY2Ugb2YgdGhlIHZhbHVlcyB0byBiZSBjb3BpZWQKLSAgICogQHBhcmFtIHNyY09mZnNldCBUaGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBzb3VyY2UgYWRkcmVzcywgaW4KLSAgICogYnl0ZXMsIHJlbGF0aXZlIHRvIDxjb2RlPnNyYzwvY29kZT4gKGluIHByaW5jaXBsZSwgdGhpcyBjb3VsZCBiZQotICAgKiBuZWdhdGl2ZSkuCi0gICAqIEBwYXJhbSBkc3QgVGhlIG11dGF0ZWQgb2JqZWN0LCBpLmUuIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgY29weS4KLSAgICogQHBhcmFtIGRzdE9mZnNldCBUaGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBkZXN0aW5hdGlvbiBhZGRyZXNzLCBpbgotICAgKiBieXRlcyByZWxhdGl2ZSB0byA8Y29kZT50Z3Q8L2NvZGU+IChpbiBwcmluY2lwbGUsIHRoaXMgY291bGQgYmUKLSAgICogbmVnYXRpdmUpLgotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIHNpemUgb2YgdGhlIHJlZ2lvbiBiZWluZyBjb3BpZWQsIGluIGJ5dGVzLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHVwZGF0ZSB3YXMgcGVyZm9ybWVkIGJ5IHRoZSBiYXJyaWVyLCBmYWxzZSBpZgotICAgKiBsZWZ0IHRvIHRoZSBjYWxsZXIgKGFsd2F5cyBmYWxzZSBpbiB0aGlzIGNhc2UpLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gb2JqZWN0UmVmZXJlbmNlQnVsa0NvcHkoT2JqZWN0UmVmZXJlbmNlIHNyYywgT2Zmc2V0IHNyY09mZnNldCwKLSAgICAgIE9iamVjdFJlZmVyZW5jZSBkc3QsIE9mZnNldCBkc3RPZmZzZXQsIGludCBieXRlcykgewotICAgIC8qIFRoZXNlIG5hbWVzIHNlZW0gYmFja3dhcmRzLCBidXQgYXJlIGRlZmluZWQgdG8gYmUgY29tcGF0YWJsZSB3aXRoIHRoZQotICAgICAqIHByZXZpb3VzIHdyaXRlQmFycmllciBtZXRob2QuICovCi0gICAgQWRkcmVzcyBzbG90ID0gZHN0LnRvQWRkcmVzcygpLnBsdXMoZHN0T2Zmc2V0KTsKLSAgICBBZGRyZXNzIHRndExvYyA9IHNyYy50b0FkZHJlc3MoKS5wbHVzKHNyY09mZnNldCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlczsgaSArPSBCWVRFU19JTl9BRERSRVNTKSB7Ci0gICAgICBPYmplY3RSZWZlcmVuY2UgdGd0ID0gdGd0TG9jLmxvYWRPYmplY3RSZWZlcmVuY2UoKTsKLSAgICAgIFRyYWNlR2VuZXJhdG9yLnByb2Nlc3NQb2ludGVyVXBkYXRlKGZhbHNlLCBkc3QsIHNsb3QsIHRndCk7Ci0gICAgICBzbG90ID0gc2xvdC5wbHVzKEJZVEVTX0lOX0FERFJFU1MpOwotICAgICAgdGd0TG9jID0gdGd0TG9jLnBsdXMoQllURVNfSU5fQUREUkVTUyk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbGxlY3Rpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSBwZXItbXV0YXRvciBjb2xsZWN0aW9uIHBoYXNlLgotICAgKgotICAgKiBAcGFyYW0gcGhhc2VJZCBUaGUgY29sbGVjdGlvbiBwaGFzZSB0byBwZXJmb3JtCi0gICAqIEBwYXJhbSBwcmltYXJ5IHBlcmZvcm0gYW55IHNpbmdsZS10aHJlYWRlZCBsb2NhbCBhY3Rpdml0aWVzLgotICAgKi8KLSAgcHVibGljIHZvaWQgY29sbGVjdGlvblBoYXNlKHNob3J0IHBoYXNlSWQsIGJvb2xlYW4gcHJpbWFyeSkgewotICAgIGlmICghR0NUcmFjZS50cmFjZUluZHVjZWRHQyB8fAotICAgICAgICAocGhhc2VJZCAhPSBTdG9wVGhlV29ybGQuUFJFUEFSRSkgJiYKLSAgICAgICAgKHBoYXNlSWQgIT0gU3RvcFRoZVdvcmxkLlJFTEVBU0UpKSB7Ci0gICAgICAvLyBEZWxlZ2F0ZSB1cC4KLSAgICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9zZW1pc3BhY2UvZ2N0cmFjZS9HQ1RyYWNlVHJhY2VMb2NhbC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3NlbWlzcGFjZS9nY3RyYWNlL0dDVHJhY2VUcmFjZUxvY2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZTA2YTEuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3NlbWlzcGFjZS9nY3RyYWNlL0dDVHJhY2VUcmFjZUxvY2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4uc2VtaXNwYWNlLmdjdHJhY2U7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYWNlOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uc2VtaXNwYWNlLio7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LlNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuVHJhY2VHZW5lcmF0b3I7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBwbGFuIGhhcyBiZWVuIG1vZGlmaWVkIHNsaWdodGx5IHRvIHBlcmZvcm0gdGhlIHByb2Nlc3NpbmcgbmVjZXNzYXJ5Ci0gKiBmb3IgR0MgdHJhY2UgZ2VuZXJhdGlvbi4gIFRvIG1heGltaXplIHBlcmZvcm1hbmNlLCBpdCBhdHRlbXB0cyB0byByZW1haW4KLSAqIGFzIGZhaXRoZnVsIGFzIHBvc3NpYmxlIHRvIHNlbWlTcGFjZS9QbGFuLmphdmEuCi0gKgotICogVGhlIGdlbmVyYXRlZCB0cmFjZSBmb3JtYXQgaXMgYXMgZm9sbG93czoKLSAqICAgIEIgMzQ1Njc4IDEyCi0gKiAgICAgIChPYmplY3QgMzQ1Njc4IHdhcyBjcmVhdGVkIGluIHRoZSBib290IGltYWdlIHdpdGggYSBzaXplIG9mIDEyIGJ5dGVzKQotICogICAgVSA1OTg0MyAyMzQgNDcyOTgKLSAqICAgICAgKFVwZGF0ZSBvYmplY3QgNTk4NDMgYXQgdGhlIHNsb3QgYXQgb2Zmc2V0IDIzNCB0byByZWZlciB0byA0NzI5OCkKLSAqICAgIFMgMTIzMyAxMjM0NQotICogICAgICAoVXBkYXRlIHN0YXRpYyBzbG90IDEyMzMgdG8gcmVmZXIgdG8gMTIzNDUpCi0gKiAgICBUIDQ1NjcgNzg5MjQKLSAqICAgICAgKFRoZSBUSUIgb2YgNDU2NyBpcyBzZXQgdG8gcmVmZXIgdG8gNzg5MjQpCi0gKiAgICBEIDM0Mjc4OQotICogICAgICAoT2JqZWN0IDM0Mjc4OSBiZWNhbWUgdW5yZWFjaGFibGUpCi0gKiAgICBBIDY4NjAgMjQgMzQ2NjQ4IDMKLSAqICAgICAgKE9iamVjdCA2ODYwIHdhcyBhbGxvY2F0ZWQsIHJlcXVpcmluZyAyNCBieXRlcywgd2l0aCBmcCAzNDY2NDggb24KLSAqICAgICAgICB0aHJlYWQgMzsgdGhpcyBhbGxvY2F0aW9uIGhhcyBwZXJmZWN0IGtub3dsZWRnZSkKLSAqICAgIGEgNjg4NCAyNCAzNDY2NDAgNQotICogICAgICAoT2JqZWN0IDY4NjQgd2FzIGFsbG9jYXRlZCwgcmVxdWlyaW5nIDI0IGJ5dGVzLCB3aXRoIGZwIDM0NjY0MCBvbgotICogdGhyZWFkIDU7IHRoaXMgYWxsb2NhdGlvbiBET0VTIE5PVCBoYXZlIHBlcmZlY3Qga25vd2xlZGdlKQotICogICAgSSA2ODYwIDI0IDM0NjY0OCAzCi0gKiAgICAgIChPYmplY3QgNjg2MCB3YXMgYWxsb2NhdGVkIGludG8gaW1tb3J0YWwgc3BhY2UsIHJlcXVpcmluZyAyNCBieXRlcywKLSAqICAgICAgICB3aXRoIGZwIDM0NjY0OCBvbiB0aHJlYWQgMzsgdGhpcyBhbGxvY2F0aW9uIGhhcyBwZXJmZWN0IGtub3dsZWRnZSkKLSAqICAgIGkgNjg4NCAyNCAzNDY2NDAgNQotICogICAgICAoT2JqZWN0IDY4NjQgd2FzIGFsbG9jYXRlZCBpbnRvIGltbW9ydGFsIHNwYWNlLCByZXF1aXJpbmcgMjQgYnl0ZXMsCi0gKiAgICAgICAgd2l0aCBmcCAzNDY2NDAgb24gdGhyZWFkIDU7IHRoaXMgYWxsb2NhdGlvbiBET0VTIE5PVCBoYXZlIHBlcmZlY3QKLSAqICAgICAgICBrbm93bGVkZ2UpCi0gKiAgICA0ODk1NC0+WzM0NV1MT2JqZWN0OzpibGFoKClWOjIzICAgTGphdmEvbGFuZy9Gb287Ci0gKiAgICAgIChDaXRhdGlvbiBmb3I6IGEpIHdoZXJlIHRoZSB3YXMgYWxsb2NhdGVkLCBmcCBvZiA0ODk1NCwKLSAqICAgICAgICAgYXQgdGhlIG1ldGhvZCB3aXRoIElEIDM0NSAtLSBvciB2b2lkIE9iamVjdC5ibGFoKCkgLS0gYW5kIGJ5dGVjb2RlCi0gKiAgICAgICAgIHdpdGggb2Zmc2V0IDIzOyBiKSB0aGUgb2JqZWN0IGFsbG9jYXRlZCBpcyBvZiB0eXBlIGphdmEubGFuZy5Gb28pCi0gKiAgICBEIDM0Mjc4OSAzNjE0NjAKLSAqICAgICAgKE9iamVjdCAzNDI3ODkgYmVjYW1lIHVucmVhY2hhYmxlIGFmdGVyIDM2MTQ2MCB3YXMgYWxsb2NhdGVkKQotICoKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHNpbXBsZSBzZW1pLXNwYWNlIGNvbGxlY3Rvci4gU2VlIHRoZSBKb25lcwotICogJiBMaW5zIEdDIGJvb2ssIHNlY3Rpb24gMi4yIGZvciBhbiBvdmVydmlldyBvZiB0aGUgYmFzaWMKLSAqIGFsZ29yaXRobS4gVGhpcyBpbXBsZW1lbnRhdGlvbiBhbHNvIGluY2x1ZGVzIGEgbGFyZ2Ugb2JqZWN0IHNwYWNlCi0gKiAoTE9TKSwgYW5kIGFuIHVuY29sbGVjdGVkICJpbW1vcnRhbCIgc3BhY2UuPHA+Ci0gKgotICogQWxsIHBsYW5zIG1ha2UgYSBjbGVhciBkaXN0aW5jdGlvbiBiZXR3ZWVuIDxpPmdsb2JhbDwvaT4gYW5kCi0gKiA8aT50aHJlYWQtbG9jYWw8L2k+IGFjdGl2aXRpZXMuICBHbG9iYWwgYWN0aXZpdGllcyBtdXN0IGJlCi0gKiBzeW5jaHJvbml6ZWQsIHdoZXJlYXMgbm8gc3luY2hyb25pemF0aW9uIGlzIHJlcXVpcmVkIGZvcgotICogdGhyZWFkLWxvY2FsIGFjdGl2aXRpZXMuICBJbnN0YW5jZXMgb2YgUGxhbiBtYXAgMToxIHRvICJrZXJuZWwKLSAqIHRocmVhZHMiIChha2EgQ1BVcykuICBUaHVzIGluc3RhbmNlCi0gKiBtZXRob2RzIGFsbG93IGZhc3QsIHVuc3ljaHJvbml6ZWQgYWNjZXNzIHRvIFBsYW4gdXRpbGl0aWVzIHN1Y2ggYXMKLSAqIGFsbG9jYXRpb24gYW5kIGNvbGxlY3Rpb24uICBFYWNoIGluc3RhbmNlIHJlc3RzIG9uIHN0YXRpYyByZXNvdXJjZXMKLSAqIChzdWNoIGFzIG1lbW9yeSBhbmQgdmlydHVhbCBtZW1vcnkgcmVzb3VyY2VzKSB3aGljaCBhcmUgImdsb2JhbCIKLSAqIGFuZCB0aGVyZWZvcmUgInN0YXRpYyIgbWVtYmVycyBvZiBQbGFuLiAgVGhpcyBtYXBwaW5nIG9mIHRocmVhZHMgdG8KLSAqIGluc3RhbmNlcyBpcyBjcnVjaWFsIHRvIHVuZGVyc3RhbmRpbmcgdGhlIGNvcnJlY3RuZXNzIGFuZAotICogcGVyZm9ybWFuY2UgcHJvcHJ0aWVzIG9mIHRoaXMgcGxhbi4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGZpbmFsIGNsYXNzIEdDVHJhY2VUcmFjZUxvY2FsIGV4dGVuZHMgU1NUcmFjZUxvY2FsIHsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIHRyYWNlIFRoZSBnbG9iYWwgdHJhY2UgdG8gdXNlLgotICAgKi8KLSAgcHVibGljIEdDVHJhY2VUcmFjZUxvY2FsKFRyYWNlIHRyYWNlKSB7Ci0gICAgc3VwZXIodHJhY2UsIGZhbHNlKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIE9iamVjdCBwcm9jZXNzaW5nIGFuZCB0cmFjaW5nCi0gICAqLwotCi0gIC8qKgotICAgKiBUcmFjZSBhIHJlZmVyZW5jZSBkdXJpbmcgR0MuICBUaGlzIGludm9sdmVzIGRldGVybWluaW5nIHdoaWNoCi0gICAqIGNvbGxlY3Rpb24gcG9saWN5IGFwcGxpZXMgKHN1Y2ggYXMgdGhvc2UgbmVlZGVkIGZvciB0cmFjZSBnZW5lcmF0aW9uKQotICAgKiBhbmQgdGFraW5nIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb25zLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgcmVmZXJlbmNlIHRvIGJlIHRyYWNlZC4gIEluIGNlcnRhaW4KLSAgICogY2FzZXMsIHRoaXMgc2hvdWxkIDxpPk5PVDwvaT4gYmUgYW4gaW50ZXJpb3IgcG9pbnRlci4KLSAgICogQHJldHVybiBUaGUgcG9zc2libHkgbW92ZWQgcmVmZXJlbmNlLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlIHRyYWNlT2JqZWN0KE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAob2JqZWN0LmlzTnVsbCgpKSByZXR1cm4gb2JqZWN0OwotICAgIGlmIChHQ1RyYWNlLnRyYWNlSW5kdWNlZEdDKSB7Ci0gICAgICAvKiBXZSBhcmUgcGVyZm9ybWluZyBhIHJvb3Qgc2NhbiBmb2xsb3dpbmcgYW4gYWxsb2NhdGlvbi4gKi8KLSAgICAgIFRyYWNlR2VuZXJhdG9yLnJvb3RFbnVtZXJhdGUob2JqZWN0KTsKLSAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgfSBlbHNlIGlmIChHQ1RyYWNlLmRlYXRoU2NhbikgewotICAgICAgLyogV2UgYXJlIHBlcmZvcm1pbmcgdGhlIGxhc3Qgc2NhbiBiZWZvcmUgcHJvZ3JhbSB0ZXJtaW5hdGlvbi4gKi8KLSAgICAgIFRyYWNlR2VuZXJhdG9yLnByb3BhZ2F0ZURlYXRoVGltZShvYmplY3QpOwotICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICB9IGVsc2UgewotICAgICAgLyogKmdhc3AqIFdlIGFyZSBhY3R1YWxseSBwZXJmb3JtaW5nIGdhcmJhZ2UgY29sbGVjdGlvbiAqLwotICAgICAgcmV0dXJuIHN1cGVyLnRyYWNlT2JqZWN0KG9iamVjdCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEVuc3VyZSB0aGF0IHRoZSByZWZlcmVuY2VkIG9iamVjdCB3aWxsIG5vdCBtb3ZlIGR1cmluZyBhIGNvbGxlY3Rpb24KLSAgICogYnkgJ3ByZWNvcHlpbmcnIGl0IGF0IHRoZSBiZWdpbm5pbmcuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBlbnN1cmUgd2lsbCBub3QgbW92ZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIE9iamVjdFJlZmVyZW5jZSBwcmVjb3B5T2JqZWN0KE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAob2JqZWN0LmlzTnVsbCgpKSByZXR1cm4gb2JqZWN0OwotICAgIGlmIChHQ1RyYWNlLnRyYWNlSW5kdWNlZEdDKSB7Ci0gICAgICAvKiBXZSBhcmUgcGVyZm9ybWluZyBhIHJvb3Qgc2NhbiBmb2xsb3dpbmcgYW4gYWxsb2NhdGlvbi4gKi8KLSAgICAgIFRyYWNlR2VuZXJhdG9yLnJvb3RFbnVtZXJhdGUob2JqZWN0KTsKLSAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgfSBlbHNlIGlmIChHQ1RyYWNlLmRlYXRoU2NhbikgewotICAgICAgLyogV2UgYXJlIHBlcmZvcm1pbmcgdGhlIGxhc3Qgc2NhbiBiZWZvcmUgcHJvZ3JhbSB0ZXJtaW5hdGlvbi4gKi8KLSAgICAgIFRyYWNlR2VuZXJhdG9yLnByb3BhZ2F0ZURlYXRoVGltZShvYmplY3QpOwotICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHN1cGVyLnByZWNvcHlPYmplY3Qob2JqZWN0KTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBJZiB0aGUgcmVmZXJlbmNlZCBvYmplY3QgaGFzIG1vdmVkLCByZXR1cm4gdGhlIG5ldyBsb2NhdGlvbi4KLSAgICoKLSAgICogU29tZSBjb3B5aW5nIGNvbGxlY3RvcnMgd2lsbCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3Qgd2hpY2ggbWF5IGhhdmUgYmVlbiBmb3J3YXJkZWQuCi0gICAqIEByZXR1cm4gVGhlIG5ldyBsb2NhdGlvbiBvZiA8Y29kZT5vYmplY3Q8L2NvZGU+LgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlIGdldEZvcndhcmRlZFJlZmVyZW5jZShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKG9iamVjdC5pc051bGwoKSkgcmV0dXJuIG9iamVjdDsKLSAgICBpZiAoU1MuaGkgJiYgU3BhY2UuaXNJblNwYWNlKFNTLlNTMCwgb2JqZWN0KSkgewotICAgICAgcmV0dXJuIFNTLmNvcHlTcGFjZTAudHJhY2VPYmplY3QodGhpcywgb2JqZWN0LCBHQ1RyYWNlLkFMTE9DX1NTKTsKLSAgICB9IGVsc2UgaWYgKCFTUy5oaSAmJiBTcGFjZS5pc0luU3BhY2UoU1MuU1MxLCBvYmplY3QpKSB7Ci0gICAgICByZXR1cm4gU1MuY29weVNwYWNlMS50cmFjZU9iamVjdCh0aGlzLCBvYmplY3QsIEdDVHJhY2UuQUxMT0NfU1MpOwotICAgIH0KLSAgICByZXR1cm4gb2JqZWN0OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0cnVlIGlmIDxjb2RlPm9iajwvY29kZT4gaXMgYSBsaXZlIG9iamVjdC4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IGluIHF1ZXN0aW9uCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiA8Y29kZT5vYmo8L2NvZGU+IGlzIGEgbGl2ZSBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0xpdmUoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgICAgaWYgKG9iamVjdC5pc051bGwoKSkgcmV0dXJuIGZhbHNlOwotICAgICAgZWxzZSBpZiAoR0NUcmFjZS50cmFjZUluZHVjZWRHQykgcmV0dXJuIHRydWU7Ci0gICAgICBlbHNlIHJldHVybiBzdXBlci5pc0xpdmUob2JqZWN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdHJ1ZSBpZiA8Y29kZT5vYmo8L2NvZGU+IGlzIGEgcmVhY2hhYmxlIG9iamVjdC4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IGluIHF1ZXN0aW9uCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiA8Y29kZT5vYmo8L2NvZGU+IGlzIGEgcmVhY2hhYmxlIG9iamVjdDsKLSAgICogdW5yZWFjaGFibGUgb2JqZWN0cyBtYXkgc3RpbGwgYmUgbGl2ZSwgaG93ZXZlcgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNSZWFjaGFibGUoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmIChHQ1RyYWNlLmZpbmFsRGVhZCkgcmV0dXJuIGZhbHNlOwotICAgIGVsc2UgaWYgKG9iamVjdC5pc051bGwoKSkgcmV0dXJuIGZhbHNlOwotICAgIGVsc2UgewotICAgICAgU3BhY2Ugc3BhY2UgPSBTcGFjZS5nZXRTcGFjZUZvck9iamVjdChvYmplY3QpOwotICAgICAgcmV0dXJuIHNwYWNlLmlzUmVhY2hhYmxlKG9iamVjdCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIElzIHRoaXMgb2JqZWN0IGd1YXJhbnRlZWQgbm90IHRvIG1vdmUgZHVyaW5nIHRoZSBjb2xsZWN0aW9uLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2hlY2suCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGd1YXJhbnRlZWQgbm90IHRvIG1vdmUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiB3aWxsTm90TW92ZUluQ3VycmVudENvbGxlY3Rpb24oT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmIChHQ1RyYWNlLnRyYWNlSW5kdWNlZEdDKSByZXR1cm4gdHJ1ZTsKLSAgICBlbHNlIHJldHVybiBzdXBlci53aWxsTm90TW92ZUluQ3VycmVudENvbGxlY3Rpb24ob2JqZWN0KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3NlbWlzcGFjZS91c2VQcmltaXRpdmVXcml0ZUJhcnJpZXJzL1VzZVByaW1pdGl2ZVdyaXRlQmFycmllcnMuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9zZW1pc3BhY2UvdXNlUHJpbWl0aXZlV3JpdGVCYXJyaWVycy9Vc2VQcmltaXRpdmVXcml0ZUJhcnJpZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZGQyMjUuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3NlbWlzcGFjZS91c2VQcmltaXRpdmVXcml0ZUJhcnJpZXJzL1VzZVByaW1pdGl2ZVdyaXRlQmFycmllcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLnNlbWlzcGFjZS51c2VQcmltaXRpdmVXcml0ZUJhcnJpZXJzOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5zZW1pc3BhY2UuU1M7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGV4ZXJjaXNlcyBwcmltaXRpdmUgd3JpdGUgYmFycmllcnMgVGhlIHdyaXRlIGJhcnJpZXJzIGNvbnRhaW4gbm8KLSAqIHBheWxvYWRzIGJ1dCBtZXJlbHkgcGVyZm9ybSBhIHdyaXRlIHRvIHRoZSBoZWFwCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBjbGFzcyBVc2VQcmltaXRpdmVXcml0ZUJhcnJpZXJzIGV4dGVuZHMgU1MgewotCi19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc2VtaXNwYWNlL3VzZVByaW1pdGl2ZVdyaXRlQmFycmllcnMvVXNlUHJpbWl0aXZlV3JpdGVCYXJyaWVyc0NvbGxlY3Rvci5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3NlbWlzcGFjZS91c2VQcmltaXRpdmVXcml0ZUJhcnJpZXJzL1VzZVByaW1pdGl2ZVdyaXRlQmFycmllcnNDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczZTlhNS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc2VtaXNwYWNlL3VzZVByaW1pdGl2ZVdyaXRlQmFycmllcnMvVXNlUHJpbWl0aXZlV3JpdGVCYXJyaWVyc0NvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4uc2VtaXNwYWNlLnVzZVByaW1pdGl2ZVdyaXRlQmFycmllcnM7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLnNlbWlzcGFjZS5TU0NvbGxlY3RvcjsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGV4dGVuZHMgdGhlIHtAbGluayBTU0NvbGxlY3Rvcn0gY2xhc3MgYXMgcGFydCBvZiB0aGUKLSAqIHtAbGluayBVc2VQcmltaXRpdmVXcml0ZUJhcnJpZXJzfSBjb2xsZWN0b3IuIEFsbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCi0gKiBjb25jZXJuaW5nIEdDIGFyZSBoYW5kbGVkIGJ5IHtAbGluayBTU0NvbGxlY3Rvcn0KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIFVzZVByaW1pdGl2ZVdyaXRlQmFycmllcnNDb2xsZWN0b3IgZXh0ZW5kcyBTU0NvbGxlY3RvciB7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc2VtaXNwYWNlL3VzZVByaW1pdGl2ZVdyaXRlQmFycmllcnMvVXNlUHJpbWl0aXZlV3JpdGVCYXJyaWVyc0NvbnN0cmFpbnRzLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc2VtaXNwYWNlL3VzZVByaW1pdGl2ZVdyaXRlQmFycmllcnMvVXNlUHJpbWl0aXZlV3JpdGVCYXJyaWVyc0NvbnN0cmFpbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNDdjMDkuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3NlbWlzcGFjZS91c2VQcmltaXRpdmVXcml0ZUJhcnJpZXJzL1VzZVByaW1pdGl2ZVdyaXRlQmFycmllcnNDb25zdHJhaW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4uc2VtaXNwYWNlLnVzZVByaW1pdGl2ZVdyaXRlQmFycmllcnM7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLnNlbWlzcGFjZS5TU0NvbnN0cmFpbnRzOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFVzZVByaW1pdGl2ZVdyaXRlQmFycmllcnMgY29tbW9uIGNvbnN0YW50cy4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIFVzZVByaW1pdGl2ZVdyaXRlQmFycmllcnNDb25zdHJhaW50cyBleHRlbmRzIFNTQ29uc3RyYWludHMgewotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIHJlcXVpcmVzIHdyaXRlIGJhcnJpZXJzIG9uIGJvb2xlYW5zLiAqLwotICBwdWJsaWMgYm9vbGVhbiBuZWVkc0Jvb2xlYW5Xcml0ZUJhcnJpZXIoKSB7IHJldHVybiB0cnVlOyB9Ci0KLSAgLyoqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIFBsYW4gY2FuIHBlcmZvcm0gYnVsayBib29sZWFuIGFycmF5Y29weSBiYXJyaWVycy4gKi8KLSAgcHVibGljIGJvb2xlYW4gYm9vbGVhbkJ1bGtDb3B5U3VwcG9ydGVkKCkgeyByZXR1cm4gdHJ1ZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIHJlcXVpcmVzIHdyaXRlIGJhcnJpZXJzIG9uIGJ5dGVzLiAqLwotICBwdWJsaWMgYm9vbGVhbiBuZWVkc0J5dGVXcml0ZUJhcnJpZXIoKSB7IHJldHVybiB0cnVlOyB9Ci0KLSAgLyoqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIFBsYW4gY2FuIHBlcmZvcm0gYnVsayBieXRlIGFycmF5Y29weSBiYXJyaWVycy4gKi8KLSAgcHVibGljIGJvb2xlYW4gYnl0ZUJ1bGtDb3B5U3VwcG9ydGVkKCkgeyByZXR1cm4gdHJ1ZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIHJlcXVpcmVzIHdyaXRlIGJhcnJpZXJzIG9uIGNoYXJzLiAqLwotICBwdWJsaWMgYm9vbGVhbiBuZWVkc0NoYXJXcml0ZUJhcnJpZXIoKSB7IHJldHVybiB0cnVlOyB9Ci0KLSAgLyoqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIFBsYW4gY2FuIHBlcmZvcm0gYnVsayBjaGFyIGFycmF5Y29weSBiYXJyaWVycy4gKi8KLSAgcHVibGljIGJvb2xlYW4gY2hhckJ1bGtDb3B5U3VwcG9ydGVkKCkgeyByZXR1cm4gdHJ1ZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIHJlcXVpcmVzIHdyaXRlIGJhcnJpZXJzIG9uIHNob3J0cy4gKi8KLSAgcHVibGljIGJvb2xlYW4gbmVlZHNTaG9ydFdyaXRlQmFycmllcigpIHsgcmV0dXJuIHRydWU7IH0KLQotICAvKiogQHJldHVybiBUcnVlIGlmIHRoaXMgUGxhbiBjYW4gcGVyZm9ybSBidWxrIHNob3J0IGFycmF5Y29weSBiYXJyaWVycy4gKi8KLSAgcHVibGljIGJvb2xlYW4gc2hvcnRCdWxrQ29weVN1cHBvcnRlZCgpIHsgcmV0dXJuIHRydWU7IH0KLQotICAvKiogQHJldHVybiBUcnVlIGlmIHRoaXMgUGxhbiByZXF1aXJlcyB3cml0ZSBiYXJyaWVycyBvbiBpbnRzLiAqLwotICBwdWJsaWMgYm9vbGVhbiBuZWVkc0ludFdyaXRlQmFycmllcigpIHsgcmV0dXJuIHRydWU7IH0KLQotICAvKiogQHJldHVybiBUcnVlIGlmIHRoaXMgUGxhbiBjYW4gcGVyZm9ybSBidWxrIGludCBhcnJheWNvcHkgYmFycmllcnMuICovCi0gIHB1YmxpYyBib29sZWFuIGludEJ1bGtDb3B5U3VwcG9ydGVkKCkgeyByZXR1cm4gdHJ1ZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIHJlcXVpcmVzIHdyaXRlIGJhcnJpZXJzIG9uIGxvbmdzLiAqLwotICBwdWJsaWMgYm9vbGVhbiBuZWVkc0xvbmdXcml0ZUJhcnJpZXIoKSB7IHJldHVybiB0cnVlOyB9Ci0KLSAgLyoqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIFBsYW4gY2FuIHBlcmZvcm0gYnVsayBsb25nIGFycmF5Y29weSBiYXJyaWVycy4gKi8KLSAgcHVibGljIGJvb2xlYW4gbG9uZ0J1bGtDb3B5U3VwcG9ydGVkKCkgeyByZXR1cm4gdHJ1ZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIHJlcXVpcmVzIHdyaXRlIGJhcnJpZXJzIG9uIGZsb2F0cy4gKi8KLSAgcHVibGljIGJvb2xlYW4gbmVlZHNGbG9hdFdyaXRlQmFycmllcigpIHsgcmV0dXJuIHRydWU7IH0KLQotICAvKiogQHJldHVybiBUcnVlIGlmIHRoaXMgUGxhbiBjYW4gcGVyZm9ybSBidWxrIGZsb2F0IGFycmF5Y29weSBiYXJyaWVycy4gKi8KLSAgcHVibGljIGJvb2xlYW4gZmxvYXRCdWxrQ29weVN1cHBvcnRlZCgpIHsgcmV0dXJuIHRydWU7IH0KLQotICAvKiogQHJldHVybiBUcnVlIGlmIHRoaXMgUGxhbiByZXF1aXJlcyB3cml0ZSBiYXJyaWVycyBvbiBkb3VibGVzLiAqLwotICBwdWJsaWMgYm9vbGVhbiBuZWVkc0RvdWJsZVdyaXRlQmFycmllcigpIHsgcmV0dXJuIHRydWU7IH0KLQotICAvKiogQHJldHVybiBUcnVlIGlmIHRoaXMgUGxhbiBjYW4gcGVyZm9ybSBidWxrIGRvdWJsZSBhcnJheWNvcHkgYmFycmllcnMuICovCi0gIHB1YmxpYyBib29sZWFuIGRvdWJsZUJ1bGtDb3B5U3VwcG9ydGVkKCkgeyByZXR1cm4gdHJ1ZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIHJlcXVpcmVzIHdyaXRlIGJhcnJpZXJzIG9uIFdvcmRzLiAqLwotICBwdWJsaWMgYm9vbGVhbiBuZWVkc1dvcmRXcml0ZUJhcnJpZXIoKSB7IHJldHVybiB0cnVlOyB9Ci0KLSAgLyoqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIFBsYW4gcmVxdWlyZXMgd3JpdGUgYmFycmllcnMgb24gQWRkcmVzcydzLiAqLwotICBwdWJsaWMgYm9vbGVhbiBuZWVkc0FkZHJlc3NXcml0ZUJhcnJpZXIoKSB7IHJldHVybiB0cnVlOyB9Ci0KLSAgLyoqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIFBsYW4gcmVxdWlyZXMgd3JpdGUgYmFycmllcnMgb24gRXh0ZW50cy4gKi8KLSAgcHVibGljIGJvb2xlYW4gbmVlZHNFeHRlbnRXcml0ZUJhcnJpZXIoKSB7IHJldHVybiB0cnVlOyB9Ci0KLSAgLyoqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIFBsYW4gcmVxdWlyZXMgd3JpdGUgYmFycmllcnMgb24gT2Zmc2V0cy4gKi8KLSAgcHVibGljIGJvb2xlYW4gbmVlZHNPZmZzZXRXcml0ZUJhcnJpZXIoKSB7IHJldHVybiB0cnVlOyB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9zZW1pc3BhY2UvdXNlUHJpbWl0aXZlV3JpdGVCYXJyaWVycy9Vc2VQcmltaXRpdmVXcml0ZUJhcnJpZXJzTXV0YXRvci5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3NlbWlzcGFjZS91c2VQcmltaXRpdmVXcml0ZUJhcnJpZXJzL1VzZVByaW1pdGl2ZVdyaXRlQmFycmllcnNNdXRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiODQ3ODAuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3NlbWlzcGFjZS91c2VQcmltaXRpdmVXcml0ZUJhcnJpZXJzL1VzZVByaW1pdGl2ZVdyaXRlQmFycmllcnNNdXRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjQgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4uc2VtaXNwYWNlLnVzZVByaW1pdGl2ZVdyaXRlQmFycmllcnM7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLnNlbWlzcGFjZS5TU011dGF0b3I7Ci1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBleHRlbmRzIHRoZSB7QGxpbmsgU1NNdXRhdG9yfSBjbGFzcyBhcyBwYXJ0IG9mIHRoZQotICoge0BsaW5rIFVzZVByaW1pdGl2ZVdyaXRlQmFycmllcnN9IGNvbGxlY3Rvci4gSXQgb3ZlcnJpZGVzIHZhcmlvdXMgbWV0aG9kcyBpbgotICoge0BsaW5rIE11dGF0b3J9IHRvIGltcGxlbWVudCBwcmltaXRpdmUgd3JpdGUgYmFycmllcnMuCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBjbGFzcyBVc2VQcmltaXRpdmVXcml0ZUJhcnJpZXJzTXV0YXRvciBleHRlbmRzIFNTTXV0YXRvciB7Ci0KLSAgLyoqCi0gICAqIFdyaXRlIGFuIEFkZHJlc3MuIFRha2UgYXBwcm9wcmlhdGUgd3JpdGUgYmFycmllciBhY3Rpb25zLjxwPgotICAgKgotICAgKiBAcGFyYW0gc3JjIFRoZSBvYmplY3QgaW50byB3aGljaCB0aGUgV29yZCB3aWxsIGJlIHN0b3JlZAotICAgKiBAcGFyYW0gc2xvdCBUaGUgYWRkcmVzcyBpbnRvIHdoaWNoIHRoZSBXb3JkIHdpbGwgYmUKLSAgICogc3RvcmVkLgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBuZXcgQWRkcmVzcwotICAgKiBAcGFyYW0gbWV0YURhdGFBIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIHN0b3JlCi0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBzdG9yZSBvY2N1cnJlZAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkcmVzc1dyaXRlKE9iamVjdFJlZmVyZW5jZSBzcmMsIEFkZHJlc3Mgc2xvdCwgQWRkcmVzcyB2YWx1ZSwgV29yZCBtZXRhRGF0YUEsIFdvcmQgbWV0YURhdGFCLCBpbnQgbW9kZSkgewotICAgIFZNLmJhcnJpZXJzLmFkZHJlc3NXcml0ZShzcmMsIHZhbHVlLCBtZXRhRGF0YUEsIG1ldGFEYXRhQiwgbW9kZSk7Ci0gIH0KLQotICAvKioKLSAgICogQXR0ZW1wdCB0byBhdG9taWNhbGx5IGV4Y2hhbmdlIHRoZSB2YWx1ZSBpbiB0aGUgZ2l2ZW4gc2xvdAotICAgKiB3aXRoIHRoZSBwYXNzZWQgcmVwbGFjZW1lbnQgdmFsdWUuCi0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCBpbnRvIHdoaWNoIHRoZSBBZGRyZXNzIHdpbGwgYmUgc3RvcmVkCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIGludG8gd2hpY2ggdGhlIEFkZHJlc3Mgd2lsbCBiZQotICAgKiBzdG9yZWQuCi0gICAqIEBwYXJhbSBvbGQgVGhlIG9sZCBBZGRyZXNzIHRvIGJlIHN3YXBwZWQgb3V0Ci0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IEFkZHJlc3MKLSAgICogQHBhcmFtIG1ldGFEYXRhQSBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIHN0b3JlCi0gICAqIEBwYXJhbSBtZXRhRGF0YUIgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgc3RvcmUgb2NjdXJyZWQKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBzd2FwIHdhcyBzdWNjZXNzZnVsLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYWRkcmVzc1RyeUNvbXBhcmVBbmRTd2FwKE9iamVjdFJlZmVyZW5jZSBzcmMsIEFkZHJlc3Mgc2xvdCwgQWRkcmVzcyBvbGQsIEFkZHJlc3MgdmFsdWUsIFdvcmQgbWV0YURhdGFBLCBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpIHsKLSAgICByZXR1cm4gVk0uYmFycmllcnMuYWRkcmVzc1RyeUNvbXBhcmVBbmRTd2FwKHNyYywgb2xkLCB2YWx1ZSwgbWV0YURhdGFBLCBtZXRhRGF0YUIsIG1vZGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlIGEgYm9vbGVhbi4gVGFrZSBhcHByb3ByaWF0ZSB3cml0ZSBiYXJyaWVyIGFjdGlvbnMuPHA+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUgc3RvcmVkCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZQotICAgKiBzdG9yZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIG5ldyBib29sZWFuCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbWV0YURhdGFCIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHN0b3JlIG9jY3VycmVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBib29sZWFuV3JpdGUoT2JqZWN0UmVmZXJlbmNlIHNyYywgQWRkcmVzcyBzbG90LCBib29sZWFuIHZhbHVlLCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKSB7Ci0gICAgVk0uYmFycmllcnMuYm9vbGVhbldyaXRlKHNyYywgdmFsdWUsIG1ldGFEYXRhQSwgbWV0YURhdGFCLCBtb2RlKTsKLSAgfQotCi0gIC8qKgotICAgKiBBIG51bWJlciBvZiBib29sZWFucyBhcmUgYWJvdXQgdG8gYmUgY29waWVkIGZyb20gb2JqZWN0Ci0gICAqIDxjb2RlPnNyYzwvY29kZT4gdG8gb2JqZWN0IDxjb2RlPmRzdDwvY29kZT4gKGFzIGluIGFuIGFycmF5Ci0gICAqIGNvcHkpLiAgVGh1cywgPGNvZGU+ZHN0PC9jb2RlPiBpcyB0aGUgbXV0YXRlZCBvYmplY3QuICBUYWtlCi0gICAqIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogQHBhcmFtIHNyYyBUaGUgc291cmNlIGFycmF5Ci0gICAqIEBwYXJhbSBzcmNPZmZzZXQgVGhlIHN0YXJ0aW5nIHNvdXJjZSBvZmZzZXQKLSAgICogQHBhcmFtIGRzdCBUaGUgZGVzdGluYXRpb24gYXJyYXkKLSAgICogQHBhcmFtIGRzdE9mZnNldCBUaGUgc3RhcnRpbmcgZGVzdGluYXRpb24gb2Zmc2V0Ci0gICAqIEBwYXJhbSBieXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGNvcGllZAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHVwZGF0ZSB3YXMgcGVyZm9ybWVkIGJ5IHRoZSBiYXJyaWVyLCBmYWxzZSBpZgotICAgKiBsZWZ0IHRvIHRoZSBjYWxsZXIKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGJvb2xlYW5CdWxrQ29weShPYmplY3RSZWZlcmVuY2Ugc3JjLCBPZmZzZXQgc3JjT2Zmc2V0LCBPYmplY3RSZWZlcmVuY2UgZHN0LCBPZmZzZXQgZHN0T2Zmc2V0LCBpbnQgYnl0ZXMpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGUgYSBieXRlLiBUYWtlIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogQHBhcmFtIHNyYyBUaGUgb2JqZWN0IGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZSBzdG9yZWQKLSAgICogQHBhcmFtIHNsb3QgVGhlIGFkZHJlc3MgaW50byB3aGljaCB0aGUgbmV3IHJlZmVyZW5jZSB3aWxsIGJlCi0gICAqIHN0b3JlZC4KLSAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgbmV3IGJ5dGUKLSAgICogQHBhcmFtIG1ldGFEYXRhQSBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIHN0b3JlCi0gICAqIEBwYXJhbSBtZXRhRGF0YUIgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgc3RvcmUgb2NjdXJyZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGJ5dGVXcml0ZShPYmplY3RSZWZlcmVuY2Ugc3JjLCBBZGRyZXNzIHNsb3QsIGJ5dGUgdmFsdWUsIFdvcmQgbWV0YURhdGFBLCBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpIHsKLSAgICBWTS5iYXJyaWVycy5ieXRlV3JpdGUoc3JjLCB2YWx1ZSwgbWV0YURhdGFBLCBtZXRhRGF0YUIsIG1vZGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEEgbnVtYmVyIG9mIGJ5dGVzIGFyZSBhYm91dCB0byBiZSBjb3BpZWQgZnJvbSBvYmplY3QKLSAgICogPGNvZGU+c3JjPC9jb2RlPiB0byBvYmplY3QgPGNvZGU+ZHN0PC9jb2RlPiAoYXMgaW4gYW4gYXJyYXkKLSAgICogY29weSkuICBUaHVzLCA8Y29kZT5kc3Q8L2NvZGU+IGlzIHRoZSBtdXRhdGVkIG9iamVjdC4gIFRha2UKLSAgICogYXBwcm9wcmlhdGUgd3JpdGUgYmFycmllciBhY3Rpb25zLjxwPgotICAgKgotICAgKiBAcGFyYW0gc3JjIFRoZSBzb3VyY2UgYXJyYXkKLSAgICogQHBhcmFtIHNyY09mZnNldCBUaGUgc3RhcnRpbmcgc291cmNlIG9mZnNldAotICAgKiBAcGFyYW0gZHN0IFRoZSBkZXN0aW5hdGlvbiBhcnJheQotICAgKiBAcGFyYW0gZHN0T2Zmc2V0IFRoZSBzdGFydGluZyBkZXN0aW5hdGlvbiBvZmZzZXQKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgY29waWVkCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgdXBkYXRlIHdhcyBwZXJmb3JtZWQgYnkgdGhlIGJhcnJpZXIsIGZhbHNlIGlmCi0gICAqIGxlZnQgdG8gdGhlIGNhbGxlcgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYnl0ZUJ1bGtDb3B5KE9iamVjdFJlZmVyZW5jZSBzcmMsIE9mZnNldCBzcmNPZmZzZXQsIE9iamVjdFJlZmVyZW5jZSBkc3QsIE9mZnNldCBkc3RPZmZzZXQsIGludCBieXRlcykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZSBhIGNoYXIuIFRha2UgYXBwcm9wcmlhdGUgd3JpdGUgYmFycmllciBhY3Rpb25zLjxwPgotICAgKgotICAgKiBAcGFyYW0gc3JjIFRoZSBvYmplY3QgaW50byB3aGljaCB0aGUgbmV3IHJlZmVyZW5jZSB3aWxsIGJlIHN0b3JlZAotICAgKiBAcGFyYW0gc2xvdCBUaGUgYWRkcmVzcyBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUKLSAgICogc3RvcmVkLgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBuZXcgY2hhcgotICAgKiBAcGFyYW0gbWV0YURhdGFBIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIHN0b3JlCi0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBzdG9yZSBvY2N1cnJlZAotICAgKi8KLSAgcHVibGljIHZvaWQgY2hhcldyaXRlKE9iamVjdFJlZmVyZW5jZSBzcmMsIEFkZHJlc3Mgc2xvdCwgY2hhciB2YWx1ZSwgV29yZCBtZXRhRGF0YUEsIFdvcmQgbWV0YURhdGFCLCBpbnQgbW9kZSkgewotICAgIFZNLmJhcnJpZXJzLmNoYXJXcml0ZShzcmMsIHZhbHVlLCBtZXRhRGF0YUEsIG1ldGFEYXRhQiwgbW9kZSk7Ci0gIH0KLQotICAvKioKLSAgICogQSBudW1iZXIgb2YgY2hhcnMgYXJlIGFib3V0IHRvIGJlIGNvcGllZCBmcm9tIG9iamVjdAotICAgKiA8Y29kZT5zcmM8L2NvZGU+IHRvIG9iamVjdCA8Y29kZT5kc3Q8L2NvZGU+IChhcyBpbiBhbiBhcnJheQotICAgKiBjb3B5KS4gIFRodXMsIDxjb2RlPmRzdDwvY29kZT4gaXMgdGhlIG11dGF0ZWQgb2JqZWN0LiAgVGFrZQotICAgKiBhcHByb3ByaWF0ZSB3cml0ZSBiYXJyaWVyIGFjdGlvbnMuPHA+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIHNvdXJjZSBhcnJheQotICAgKiBAcGFyYW0gc3JjT2Zmc2V0IFRoZSBzdGFydGluZyBzb3VyY2Ugb2Zmc2V0Ci0gICAqIEBwYXJhbSBkc3QgVGhlIGRlc3RpbmF0aW9uIGFycmF5Ci0gICAqIEBwYXJhbSBkc3RPZmZzZXQgVGhlIHN0YXJ0aW5nIGRlc3RpbmF0aW9uIG9mZnNldAotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyB0byBiZSBjb3BpZWQKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSB1cGRhdGUgd2FzIHBlcmZvcm1lZCBieSB0aGUgYmFycmllciwgZmFsc2UgaWYKLSAgICogbGVmdCB0byB0aGUgY2FsbGVyCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBjaGFyQnVsa0NvcHkoT2JqZWN0UmVmZXJlbmNlIHNyYywgT2Zmc2V0IHNyY09mZnNldCwgT2JqZWN0UmVmZXJlbmNlIGRzdCwgT2Zmc2V0IGRzdE9mZnNldCwgaW50IGJ5dGVzKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlIGEgZG91YmxlLiBUYWtlIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogQHBhcmFtIHNyYyBUaGUgb2JqZWN0IGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZSBzdG9yZWQKLSAgICogQHBhcmFtIHNsb3QgVGhlIGFkZHJlc3MgaW50byB3aGljaCB0aGUgbmV3IHJlZmVyZW5jZSB3aWxsIGJlCi0gICAqIHN0b3JlZC4KLSAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgbmV3IGRvdWJsZQotICAgKiBAcGFyYW0gbWV0YURhdGFBIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIHN0b3JlCi0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBzdG9yZSBvY2N1cnJlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZG91YmxlV3JpdGUoT2JqZWN0UmVmZXJlbmNlIHNyYywgQWRkcmVzcyBzbG90LCBkb3VibGUgdmFsdWUsIFdvcmQgbWV0YURhdGFBLCBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpIHsKLSAgICBWTS5iYXJyaWVycy5kb3VibGVXcml0ZShzcmMsIHZhbHVlLCBtZXRhRGF0YUEsIG1ldGFEYXRhQiwgbW9kZSk7Ci0gIH0KLQotICAvKioKLSAgICogQSBudW1iZXIgb2YgZG91YmxlcyBhcmUgYWJvdXQgdG8gYmUgY29waWVkIGZyb20gb2JqZWN0Ci0gICAqIDxjb2RlPnNyYzwvY29kZT4gdG8gb2JqZWN0IDxjb2RlPmRzdDwvY29kZT4gKGFzIGluIGFuIGFycmF5Ci0gICAqIGNvcHkpLiAgVGh1cywgPGNvZGU+ZHN0PC9jb2RlPiBpcyB0aGUgbXV0YXRlZCBvYmplY3QuICBUYWtlCi0gICAqIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogQHBhcmFtIHNyYyBUaGUgc291cmNlIGFycmF5Ci0gICAqIEBwYXJhbSBzcmNPZmZzZXQgVGhlIHN0YXJ0aW5nIHNvdXJjZSBvZmZzZXQKLSAgICogQHBhcmFtIGRzdCBUaGUgZGVzdGluYXRpb24gYXJyYXkKLSAgICogQHBhcmFtIGRzdE9mZnNldCBUaGUgc3RhcnRpbmcgZGVzdGluYXRpb24gb2Zmc2V0Ci0gICAqIEBwYXJhbSBieXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGNvcGllZAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHVwZGF0ZSB3YXMgcGVyZm9ybWVkIGJ5IHRoZSBiYXJyaWVyLCBmYWxzZSBpZgotICAgKiBsZWZ0IHRvIHRoZSBjYWxsZXIKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGRvdWJsZUJ1bGtDb3B5KE9iamVjdFJlZmVyZW5jZSBzcmMsIE9mZnNldCBzcmNPZmZzZXQsIE9iamVjdFJlZmVyZW5jZSBkc3QsIE9mZnNldCBkc3RPZmZzZXQsIGludCBieXRlcykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZSBhbiBFeHRlbnQuIFRha2UgYXBwcm9wcmlhdGUgd3JpdGUgYmFycmllciBhY3Rpb25zLjxwPgotICAgKgotICAgKiBAcGFyYW0gc3JjIFRoZSBvYmplY3QgaW50byB3aGljaCB0aGUgbmV3IHJlZmVyZW5jZSB3aWxsIGJlIHN0b3JlZAotICAgKiBAcGFyYW0gc2xvdCBUaGUgYWRkcmVzcyBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUKLSAgICogc3RvcmVkLgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBuZXcgRXh0ZW50Ci0gICAqIEBwYXJhbSBtZXRhRGF0YUEgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbWV0YURhdGFCIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHN0b3JlIG9jY3VycmVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBleHRlbnRXcml0ZShPYmplY3RSZWZlcmVuY2Ugc3JjLCBBZGRyZXNzIHNsb3QsIEV4dGVudCB2YWx1ZSwgV29yZCBtZXRhRGF0YUEsIFdvcmQgbWV0YURhdGFCLCBpbnQgbW9kZSkgewotICAgIFZNLmJhcnJpZXJzLmV4dGVudFdyaXRlKHNyYywgdmFsdWUsIG1ldGFEYXRhQSwgbWV0YURhdGFCLCBtb2RlKTsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZSBhIGZsb2F0LiBUYWtlIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogQHBhcmFtIHNyYyBUaGUgb2JqZWN0IGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZSBzdG9yZWQKLSAgICogQHBhcmFtIHNsb3QgVGhlIGFkZHJlc3MgaW50byB3aGljaCB0aGUgbmV3IHJlZmVyZW5jZSB3aWxsIGJlCi0gICAqIHN0b3JlZC4KLSAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgbmV3IGZsb2F0Ci0gICAqIEBwYXJhbSBtZXRhRGF0YUEgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbWV0YURhdGFCIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHN0b3JlIG9jY3VycmVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBmbG9hdFdyaXRlKE9iamVjdFJlZmVyZW5jZSBzcmMsIEFkZHJlc3Mgc2xvdCwgZmxvYXQgdmFsdWUsIFdvcmQgbWV0YURhdGFBLCBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpIHsKLSAgICBWTS5iYXJyaWVycy5mbG9hdFdyaXRlKHNyYywgdmFsdWUsIG1ldGFEYXRhQSwgbWV0YURhdGFCLCBtb2RlKTsKLSAgfQotCi0gIC8qKgotICAgKiBBIG51bWJlciBvZiBmbG9hdHMgYXJlIGFib3V0IHRvIGJlIGNvcGllZCBmcm9tIG9iamVjdAotICAgKiA8Y29kZT5zcmM8L2NvZGU+IHRvIG9iamVjdCA8Y29kZT5kc3Q8L2NvZGU+IChhcyBpbiBhbiBhcnJheQotICAgKiBjb3B5KS4gIFRodXMsIDxjb2RlPmRzdDwvY29kZT4gaXMgdGhlIG11dGF0ZWQgb2JqZWN0LiAgVGFrZQotICAgKiBhcHByb3ByaWF0ZSB3cml0ZSBiYXJyaWVyIGFjdGlvbnMuPHA+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIHNvdXJjZSBhcnJheQotICAgKiBAcGFyYW0gc3JjT2Zmc2V0IFRoZSBzdGFydGluZyBzb3VyY2Ugb2Zmc2V0Ci0gICAqIEBwYXJhbSBkc3QgVGhlIGRlc3RpbmF0aW9uIGFycmF5Ci0gICAqIEBwYXJhbSBkc3RPZmZzZXQgVGhlIHN0YXJ0aW5nIGRlc3RpbmF0aW9uIG9mZnNldAotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyB0byBiZSBjb3BpZWQKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSB1cGRhdGUgd2FzIHBlcmZvcm1lZCBieSB0aGUgYmFycmllciwgZmFsc2UgaWYKLSAgICogbGVmdCB0byB0aGUgY2FsbGVyCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBmbG9hdEJ1bGtDb3B5KE9iamVjdFJlZmVyZW5jZSBzcmMsIE9mZnNldCBzcmNPZmZzZXQsIE9iamVjdFJlZmVyZW5jZSBkc3QsIE9mZnNldCBkc3RPZmZzZXQsIGludCBieXRlcykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZSBhIGludC4gVGFrZSBhcHByb3ByaWF0ZSB3cml0ZSBiYXJyaWVyIGFjdGlvbnMuPHA+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUgc3RvcmVkCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZQotICAgKiBzdG9yZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIG5ldyBpbnQKLSAgICogQHBhcmFtIG1ldGFEYXRhQSBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIHN0b3JlCi0gICAqIEBwYXJhbSBtZXRhRGF0YUIgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgc3RvcmUgb2NjdXJyZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGludFdyaXRlKE9iamVjdFJlZmVyZW5jZSBzcmMsIEFkZHJlc3Mgc2xvdCwgaW50IHZhbHVlLCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKSB7Ci0gICAgVk0uYmFycmllcnMuaW50V3JpdGUoc3JjLCB2YWx1ZSwgbWV0YURhdGFBLCBtZXRhRGF0YUIsIG1vZGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEEgbnVtYmVyIG9mIGludHMgYXJlIGFib3V0IHRvIGJlIGNvcGllZCBmcm9tIG9iamVjdAotICAgKiA8Y29kZT5zcmM8L2NvZGU+IHRvIG9iamVjdCA8Y29kZT5kc3Q8L2NvZGU+IChhcyBpbiBhbiBhcnJheQotICAgKiBjb3B5KS4gIFRodXMsIDxjb2RlPmRzdDwvY29kZT4gaXMgdGhlIG11dGF0ZWQgb2JqZWN0LiAgVGFrZQotICAgKiBhcHByb3ByaWF0ZSB3cml0ZSBiYXJyaWVyIGFjdGlvbnMuPHA+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIHNvdXJjZSBhcnJheQotICAgKiBAcGFyYW0gc3JjT2Zmc2V0IFRoZSBzdGFydGluZyBzb3VyY2Ugb2Zmc2V0Ci0gICAqIEBwYXJhbSBkc3QgVGhlIGRlc3RpbmF0aW9uIGFycmF5Ci0gICAqIEBwYXJhbSBkc3RPZmZzZXQgVGhlIHN0YXJ0aW5nIGRlc3RpbmF0aW9uIG9mZnNldAotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyB0byBiZSBjb3BpZWQKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSB1cGRhdGUgd2FzIHBlcmZvcm1lZCBieSB0aGUgYmFycmllciwgZmFsc2UgaWYKLSAgICogbGVmdCB0byB0aGUgY2FsbGVyCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpbnRCdWxrQ29weShPYmplY3RSZWZlcmVuY2Ugc3JjLCBPZmZzZXQgc3JjT2Zmc2V0LCBPYmplY3RSZWZlcmVuY2UgZHN0LCBPZmZzZXQgZHN0T2Zmc2V0LCBpbnQgYnl0ZXMpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogQXR0ZW1wdCB0byBhdG9taWNhbGx5IGV4Y2hhbmdlIHRoZSB2YWx1ZSBpbiB0aGUgZ2l2ZW4gc2xvdAotICAgKiB3aXRoIHRoZSBwYXNzZWQgcmVwbGFjZW1lbnQgdmFsdWUuCi0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCBpbnRvIHdoaWNoIHRoZSB2YWx1ZSB3aWxsIGJlIHN0b3JlZAotICAgKiBAcGFyYW0gc2xvdCBUaGUgYWRkcmVzcyBpbnRvIHdoaWNoIHRoZSB2YWx1ZSB3aWxsIGJlCi0gICAqIHN0b3JlZC4KLSAgICogQHBhcmFtIG9sZCBUaGUgb2xkIGludCB0byBiZSBzd2FwcGVkIG91dAotICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyBpbnQKLSAgICogQHBhcmFtIG1ldGFEYXRhQSBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIHN0b3JlCi0gICAqIEBwYXJhbSBtZXRhRGF0YUIgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgc3RvcmUgb2NjdXJyZWQKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBzd2FwIHdhcyBzdWNjZXNzZnVsLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaW50VHJ5Q29tcGFyZUFuZFN3YXAoT2JqZWN0UmVmZXJlbmNlIHNyYywgQWRkcmVzcyBzbG90LCBpbnQgb2xkLCBpbnQgdmFsdWUsIFdvcmQgbWV0YURhdGFBLCBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpIHsKLSAgICByZXR1cm4gVk0uYmFycmllcnMuaW50VHJ5Q29tcGFyZUFuZFN3YXAoc3JjLCBvbGQsIHZhbHVlLCBtZXRhRGF0YUEsIG1ldGFEYXRhQiwgbW9kZSk7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGUgYSBsb25nLiBUYWtlIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogQHBhcmFtIHNyYyBUaGUgb2JqZWN0IGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZSBzdG9yZWQKLSAgICogQHBhcmFtIHNsb3QgVGhlIGFkZHJlc3MgaW50byB3aGljaCB0aGUgbmV3IHJlZmVyZW5jZSB3aWxsIGJlCi0gICAqIHN0b3JlZC4KLSAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgbmV3IGxvbmcKLSAgICogQHBhcmFtIG1ldGFEYXRhQSBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIHN0b3JlCi0gICAqIEBwYXJhbSBtZXRhRGF0YUIgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgc3RvcmUgb2NjdXJyZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvbmdXcml0ZShPYmplY3RSZWZlcmVuY2Ugc3JjLCBBZGRyZXNzIHNsb3QsIGxvbmcgdmFsdWUsIFdvcmQgbWV0YURhdGFBLCBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpIHsKLSAgICBWTS5iYXJyaWVycy5sb25nV3JpdGUoc3JjLCB2YWx1ZSwgbWV0YURhdGFBLCBtZXRhRGF0YUIsIG1vZGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEEgbnVtYmVyIG9mIGxvbmdzIGFyZSBhYm91dCB0byBiZSBjb3BpZWQgZnJvbSBvYmplY3QKLSAgICogPGNvZGU+c3JjPC9jb2RlPiB0byBvYmplY3QgPGNvZGU+ZHN0PC9jb2RlPiAoYXMgaW4gYW4gYXJyYXkKLSAgICogY29weSkuICBUaHVzLCA8Y29kZT5kc3Q8L2NvZGU+IGlzIHRoZSBtdXRhdGVkIG9iamVjdC4gIFRha2UKLSAgICogYXBwcm9wcmlhdGUgd3JpdGUgYmFycmllciBhY3Rpb25zLjxwPgotICAgKgotICAgKiBAcGFyYW0gc3JjIFRoZSBzb3VyY2UgYXJyYXkKLSAgICogQHBhcmFtIHNyY09mZnNldCBUaGUgc3RhcnRpbmcgc291cmNlIG9mZnNldAotICAgKiBAcGFyYW0gZHN0IFRoZSBkZXN0aW5hdGlvbiBhcnJheQotICAgKiBAcGFyYW0gZHN0T2Zmc2V0IFRoZSBzdGFydGluZyBkZXN0aW5hdGlvbiBvZmZzZXQKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgY29waWVkCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgdXBkYXRlIHdhcyBwZXJmb3JtZWQgYnkgdGhlIGJhcnJpZXIsIGZhbHNlIGlmCi0gICAqIGxlZnQgdG8gdGhlIGNhbGxlcgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gbG9uZ0J1bGtDb3B5KE9iamVjdFJlZmVyZW5jZSBzcmMsIE9mZnNldCBzcmNPZmZzZXQsIE9iamVjdFJlZmVyZW5jZSBkc3QsIE9mZnNldCBkc3RPZmZzZXQsIGludCBieXRlcykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBBdHRlbXB0IHRvIGF0b21pY2FsbHkgZXhjaGFuZ2UgdGhlIHZhbHVlIGluIHRoZSBnaXZlbiBzbG90Ci0gICAqIHdpdGggdGhlIHBhc3NlZCByZXBsYWNlbWVudCB2YWx1ZS4KLSAgICoKLSAgICogQHBhcmFtIHNyYyBUaGUgb2JqZWN0IGludG8gd2hpY2ggdGhlIHZhbHVlIHdpbGwgYmUgc3RvcmVkCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIGludG8gd2hpY2ggdGhlIHZhbHVlIHdpbGwgYmUKLSAgICogc3RvcmVkLgotICAgKiBAcGFyYW0gb2xkIFRoZSBvbGQgbG9uZyB0byBiZSBzd2FwcGVkIG91dAotICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyBsb25nCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbWV0YURhdGFCIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHN0b3JlIG9jY3VycmVkCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3dhcCB3YXMgc3VjY2Vzc2Z1bC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGxvbmdUcnlDb21wYXJlQW5kU3dhcChPYmplY3RSZWZlcmVuY2Ugc3JjLCBBZGRyZXNzIHNsb3QsIGxvbmcgb2xkLCBsb25nIHZhbHVlLCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKSB7Ci0gICAgcmV0dXJuIFZNLmJhcnJpZXJzLmxvbmdUcnlDb21wYXJlQW5kU3dhcChzcmMsIG9sZCwgdmFsdWUsIG1ldGFEYXRhQSwgbWV0YURhdGFCLCBtb2RlKTsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZSBhbiBPZmZzZXQuIFRha2UgYXBwcm9wcmlhdGUgd3JpdGUgYmFycmllciBhY3Rpb25zLjxwPgotICAgKgotICAgKiBAcGFyYW0gc3JjIFRoZSBvYmplY3QgaW50byB3aGljaCB0aGUgbmV3IHJlZmVyZW5jZSB3aWxsIGJlIHN0b3JlZAotICAgKiBAcGFyYW0gc2xvdCBUaGUgYWRkcmVzcyBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUKLSAgICogc3RvcmVkLgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBuZXcgT2Zmc2V0Ci0gICAqIEBwYXJhbSBtZXRhRGF0YUEgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbWV0YURhdGFCIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHN0b3JlIG9jY3VycmVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBvZmZzZXRXcml0ZShPYmplY3RSZWZlcmVuY2Ugc3JjLCBBZGRyZXNzIHNsb3QsIE9mZnNldCB2YWx1ZSwgV29yZCBtZXRhRGF0YUEsIFdvcmQgbWV0YURhdGFCLCBpbnQgbW9kZSkgewotICAgIFZNLmJhcnJpZXJzLm9mZnNldFdyaXRlKHNyYywgdmFsdWUsIG1ldGFEYXRhQSwgbWV0YURhdGFCLCBtb2RlKTsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZSBhIHNob3J0LiBUYWtlIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogQHBhcmFtIHNyYyBUaGUgb2JqZWN0IGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZSBzdG9yZWQKLSAgICogQHBhcmFtIHNsb3QgVGhlIGFkZHJlc3MgaW50byB3aGljaCB0aGUgbmV3IHJlZmVyZW5jZSB3aWxsIGJlCi0gICAqIHN0b3JlZC4KLSAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgbmV3IHNob3J0Ci0gICAqIEBwYXJhbSBtZXRhRGF0YUEgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbWV0YURhdGFCIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHN0b3JlIG9jY3VycmVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzaG9ydFdyaXRlKE9iamVjdFJlZmVyZW5jZSBzcmMsIEFkZHJlc3Mgc2xvdCwgc2hvcnQgdmFsdWUsIFdvcmQgbWV0YURhdGFBLCBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpIHsKLSAgICBWTS5iYXJyaWVycy5zaG9ydFdyaXRlKHNyYywgdmFsdWUsIG1ldGFEYXRhQSwgbWV0YURhdGFCLCBtb2RlKTsKLSAgfQotCi0gIC8qKgotICAgKiBBIG51bWJlciBvZiBzaG9ydHMgYXJlIGFib3V0IHRvIGJlIGNvcGllZCBmcm9tIG9iamVjdAotICAgKiA8Y29kZT5zcmM8L2NvZGU+IHRvIG9iamVjdCA8Y29kZT5kc3Q8L2NvZGU+IChhcyBpbiBhbiBhcnJheQotICAgKiBjb3B5KS4gIFRodXMsIDxjb2RlPmRzdDwvY29kZT4gaXMgdGhlIG11dGF0ZWQgb2JqZWN0LiAgVGFrZQotICAgKiBhcHByb3ByaWF0ZSB3cml0ZSBiYXJyaWVyIGFjdGlvbnMuPHA+Ci0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIHNvdXJjZSBhcnJheQotICAgKiBAcGFyYW0gc3JjT2Zmc2V0IFRoZSBzdGFydGluZyBzb3VyY2Ugb2Zmc2V0Ci0gICAqIEBwYXJhbSBkc3QgVGhlIGRlc3RpbmF0aW9uIGFycmF5Ci0gICAqIEBwYXJhbSBkc3RPZmZzZXQgVGhlIHN0YXJ0aW5nIGRlc3RpbmF0aW9uIG9mZnNldAotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyB0byBiZSBjb3BpZWQKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSB1cGRhdGUgd2FzIHBlcmZvcm1lZCBieSB0aGUgYmFycmllciwgZmFsc2UgaWYKLSAgICogbGVmdCB0byB0aGUgY2FsbGVyCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzaG9ydEJ1bGtDb3B5KE9iamVjdFJlZmVyZW5jZSBzcmMsIE9mZnNldCBzcmNPZmZzZXQsIE9iamVjdFJlZmVyZW5jZSBkc3QsIE9mZnNldCBkc3RPZmZzZXQsIGludCBieXRlcykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZSBhIFdvcmQuIFRha2UgYXBwcm9wcmlhdGUgd3JpdGUgYmFycmllciBhY3Rpb25zLjxwPgotICAgKgotICAgKiBAcGFyYW0gc3JjIFRoZSBvYmplY3QgaW50byB3aGljaCB0aGUgbmV3IHJlZmVyZW5jZSB3aWxsIGJlIHN0b3JlZAotICAgKiBAcGFyYW0gc2xvdCBUaGUgYWRkcmVzcyBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUKLSAgICogc3RvcmVkLgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBuZXcgV29yZAotICAgKiBAcGFyYW0gbWV0YURhdGFBIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIHN0b3JlCi0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBzdG9yZSBvY2N1cnJlZAotICAgKi8KLSAgcHVibGljIHZvaWQgd29yZFdyaXRlKE9iamVjdFJlZmVyZW5jZSBzcmMsIEFkZHJlc3Mgc2xvdCwgV29yZCB2YWx1ZSwgV29yZCBtZXRhRGF0YUEsIFdvcmQgbWV0YURhdGFCLCBpbnQgbW9kZSkgewotICAgIFZNLmJhcnJpZXJzLndvcmRXcml0ZShzcmMsIHZhbHVlLCBtZXRhRGF0YUEsIG1ldGFEYXRhQiwgbW9kZSk7Ci0gIH0KLQotICAvKioKLSAgICogQXR0ZW1wdCB0byBhdG9taWNhbGx5IGV4Y2hhbmdlIHRoZSB2YWx1ZSBpbiB0aGUgZ2l2ZW4gc2xvdAotICAgKiB3aXRoIHRoZSBwYXNzZWQgcmVwbGFjZW1lbnQgdmFsdWUuCi0gICAqCi0gICAqIEBwYXJhbSBzcmMgVGhlIG9iamVjdCBpbnRvIHdoaWNoIHRoZSBuZXcgcmVmZXJlbmNlIHdpbGwgYmUgc3RvcmVkCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZQotICAgKiBzdG9yZWQuCi0gICAqIEBwYXJhbSBvbGQgVGhlIG9sZCBXb3JkIHRvIGJlIHN3YXBwZWQgb3V0Ci0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IFdvcmQKLSAgICogQHBhcmFtIG1ldGFEYXRhQSBBIHZhbHVlIHRoYXQgYXNzaXN0cyB0aGUgaG9zdCBWTSBpbiBjcmVhdGluZyBhIHN0b3JlCi0gICAqIEBwYXJhbSBtZXRhRGF0YUIgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgc3RvcmUgb2NjdXJyZWQKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBzd2FwIHdhcyBzdWNjZXNzZnVsLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gd29yZFRyeUNvbXBhcmVBbmRTd2FwKE9iamVjdFJlZmVyZW5jZSBzcmMsIEFkZHJlc3Mgc2xvdCwgV29yZCBvbGQsIFdvcmQgdmFsdWUsIFdvcmQgbWV0YURhdGFBLCBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpIHsKLSAgICByZXR1cm4gVk0uYmFycmllcnMud29yZFRyeUNvbXBhcmVBbmRTd2FwKHNyYywgb2xkLCB2YWx1ZSwgbWV0YURhdGFBLCBtZXRhRGF0YUIsIG1vZGUpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc3RpY2t5aW1taXgvU3RpY2t5SW1taXguamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9zdGlja3lpbW1peC9TdGlja3lJbW1peC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWJlYjI2Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9zdGlja3lpbW1peC9TdGlja3lJbW1peC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLnN0aWNreWltbWl4OwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5UcmFuc2l0aXZlQ2xvc3VyZTsKLWltcG9ydCBvcmcubW10ay5wbGFuLmltbWl4LkltbWl4OwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuTG9nOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZGVxdWUuU2hhcmVkRGVxdWU7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5vcHRpb25zLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5zdGF0aXN0aWNzLkJvb2xlYW5Db3VudGVyOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuc3RhdGlzdGljcy5TdGF0czsKLWltcG9ydCBvcmcubW10ay52bS5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBnbG9iYWwgc3RhdGUgb2YgYSBzaW1wbGUgc3RpY2t5IG1hcmsgYml0cyBjb2xsZWN0b3IsCi0gKiBiYXNlZCBvbiBhbiBpbW1peCBjb2xsZWN0b3IuICBUaGUgc3RpY2t5IG1hcmsgYml0cyBhbGdvcml0aG0gaXMKLSAqIGR1ZSB0byBEZW1tZXJzIGV0IGFsLiAoaHR0cDovL2RvaS5hY20ub3JnLzEwLjExNDUvOTY3MDkuOTY3MzUpLCBhbmQgYWxsb3dzCi0gKiBnZW5lcmF0aW9uYWwgY29sbGVjdGlvbiB0byBiZSBwZXJmb3JtZWQgaW4gYSBub24tbW92aW5nIGhlYXAgYnkgb3ZlcmxvYWRpbmcKLSAqIHRoZSByb2xlIG9mIG1hcmsgYml0cyB0byBhbHNvIGluZGljYXRlIHdoZXRoZXIgYW4gb2JqZWN0IGlzIG5ldyAobnVyc2VyeSkgb3IKLSAqIG5vdC4gIFRodXMgbnVyc2VyeSBvYmplY3RzIGFyZSBpZGVudGlmaWVkIGJ5IGEgYml0IGluIHRoZWlyIGhlYWRlciwgbm90IGJ5Ci0gKiB3aGVyZSB0aGV5IGxpZSB3aXRoaW4gdGhlIGFkZHJlc3Mgc3BhY2UuICBXaGlsZSBEZW1tZXJzIGV0IGFsLiBkaWQgdGhlaXIgd29yawotICogaW4gYSBjb25zZXJ2YXRpdmUgY29sbGVjdG9yLCBoZXJlIHdlIGhhdmUgYW4gZXhhY3QgY29sbGVjdG9yLCBzbyB3ZSBjYW4gdXNlCi0gKiBhIHJlZ3VsYXIgd3JpdGUgYmFycmllciwgYW5kIGRvbid0IG5lZWQgdG8gdXNlIHBhZ2UgcHJvdGVjdGlvbiBldGMuCi0gKgotICogU2VlIHRoZSBQTERJJzA4IHBhcGVyIGJ5IEJsYWNrYnVybiBhbmQgTWNLaW5sZXkgZm9yIGEgZGVzY3JpcHRpb24KLSAqIG9mIHRoZSBhbGdvcml0aG06IGh0dHA6Ly9kb2kuYWNtLm9yZy8xMC4xMTQ1LzEzNzU1ODEuMTM3NTU4NgotICoKLSAqIEFsbCBwbGFucyBtYWtlIGEgY2xlYXIgZGlzdGluY3Rpb24gYmV0d2VlbiA8aT5nbG9iYWw8L2k+IGFuZAotICogPGk+dGhyZWFkLWxvY2FsPC9pPiBhY3Rpdml0aWVzLCBhbmQgZGl2aWRlcyBnbG9iYWwgYW5kIGxvY2FsIHN0YXRlCi0gKiBpbnRvIHNlcGFyYXRlIGNsYXNzIGhpZXJhcmNoaWVzLiAgR2xvYmFsIGFjdGl2aXRpZXMgbXVzdCBiZQotICogc3luY2hyb25pemVkLCB3aGVyZWFzIG5vIHN5bmNocm9uaXphdGlvbiBpcyByZXF1aXJlZCBmb3IKLSAqIHRocmVhZC1sb2NhbCBhY3Rpdml0aWVzLiAgVGhlcmUgaXMgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgUGxhbiAob3IgdGhlCi0gKiBhcHByb3ByaWF0ZSBzdWItY2xhc3MpLCBhbmQgYSAxOjEgbWFwcGluZyBvZiBQbGFuTG9jYWwgdG8gImtlcm5lbAotICogdGhyZWFkcyIgKGFrYSBDUFVzIG9yIGluIEppa2VzIFJWTSwgUHJvY2Vzc29ycykuICBUaHVzIGluc3RhbmNlCi0gKiBtZXRob2RzIG9mIFBsYW5Mb2NhbCBhbGxvdyBmYXN0LCB1bnN5Y2hyb25pemVkIGFjY2VzcyB0byBmdW5jdGlvbnMgc3VjaCBhcwotICogYWxsb2NhdGlvbiBhbmQgY29sbGVjdGlvbi4KLSAqCi0gKiBUaGUgZ2xvYmFsIGluc3RhbmNlIGRlZmluZXMgYW5kIG1hbmFnZXMgc3RhdGljIHJlc291cmNlcwotICogKHN1Y2ggYXMgbWVtb3J5IGFuZCB2aXJ0dWFsIG1lbW9yeSByZXNvdXJjZXMpLiAgVGhpcyBtYXBwaW5nIG9mIHRocmVhZHMgdG8KLSAqIGluc3RhbmNlcyBpcyBjcnVjaWFsIHRvIHVuZGVyc3RhbmRpbmcgdGhlIGNvcnJlY3RuZXNzIGFuZAotICogcGVyZm9ybWFuY2UgcHJvcGVydGllcyBvZiBNTVRrIHBsYW5zLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgY2xhc3MgU3RpY2t5SW1taXggZXh0ZW5kcyBJbW1peCB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogQ29uc3RhbnRzCi0gICAqLwotICAvKiogSWYgdHJ1ZSwgdGhlbiBuZXcgUExPUyBvYmplY3RzIGFyZSBjb2xsZWN0ZWQgYXQgZWFjaCBudXJzZXJ5IEdDICovCi0gIHN0YXRpYyBmaW5hbCBib29sZWFuIE5VUlNFUllfQ09MTEVDVF9QTE9TID0gdHJ1ZTsKLSAgLyoqIElmIHRydWUgdGhlbiB3ZSBvbmx5IGRvIGZ1bGwgaGVhcCBHQ3MtLS1zbyB3ZSdyZSBsaWtlIE1hcmtTd2VlcCAoKyB3cml0ZSBiYXJyaWVyKSAqLwotICBzdGF0aWMgZmluYWwgYm9vbGVhbiBNQUpPUl9HQ19PTkxZID0gZmFsc2U7Ci0gIC8qKiBlc3RpbWF0ZWQgY29sbGVjdGlvbiB5aWVsZCAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IFNVUlZJVkFMX0VTVElNQVRFID0gKGZsb2F0KSAwLjg7Ci0KLSAgcHVibGljIHN0YXRpYyBpbnQgU0NBTl9OVVJTRVJZID0gMjsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBDbGFzcyB2YXJpYWJsZXMKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGludCBsYXN0Q29tbWl0dGVkSW1taXhQYWdlcyA9IDA7Ci0KLSAgLyogc3RhdGlzdGljcyAqLwotICBwdWJsaWMgc3RhdGljIEJvb2xlYW5Db3VudGVyIGZ1bGxIZWFwID0gbmV3IEJvb2xlYW5Db3VudGVyKCJtYWpvckdDIiwgdHJ1ZSwgdHJ1ZSk7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogSW5zdGFuY2UgdmFyaWFibGVzCi0gICAqLwotICAvKiBSZW1zZXQgcG9vbCAqLwotICBwdWJsaWMgZmluYWwgU2hhcmVkRGVxdWUgbW9kUG9vbCA9IG5ldyBTaGFyZWREZXF1ZSgibXNnZW4gbW9kIG9iamVjdHMiLCBtZXRhRGF0YVNwYWNlLCAxKTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqCi0gICAqLwotICBwdWJsaWMgU3RpY2t5SW1taXgoKSB7Ci0gICAgY29sbGVjdFdob2xlSGVhcCA9IG5leHRHQ1dob2xlSGVhcCA9IGZhbHNlOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbGxlY3Rpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIEEgdXNlci10cmlnZ2VyZWQgR0MgaGFzIGJlZW4gaW5pdGlhdGVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgdXNlclRyaWdnZXJlZEdDKCkgewotICAgIG5leHRHQ1dob2xlSGVhcCB8PSBPcHRpb25zLmZ1bGxIZWFwU3lzdGVtR0MuZ2V0VmFsdWUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBGb3JjZSB0aGUgbmV4dCBjb2xsZWN0aW9uIHRvIGJlIGZ1bGwgaGVhcC4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBmb3JjZUZ1bGxIZWFwQ29sbGVjdGlvbigpIHsKLSAgICBuZXh0R0NXaG9sZUhlYXAgPSB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSAoZ2xvYmFsKSBjb2xsZWN0aW9uIHBoYXNlLgotICAgKgotICAgKiBAcGFyYW0gcGhhc2VJZCBDb2xsZWN0aW9uIHBoYXNlIHRvIGV4ZWN1dGUuCi0gICAqLwotICBASW5saW5lCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZmluYWwgdm9pZCBjb2xsZWN0aW9uUGhhc2Uoc2hvcnQgcGhhc2VJZCkgewotCi0gICAgaWYgKHBoYXNlSWQgPT0gU0VUX0NPTExFQ1RJT05fS0lORCkgewotICAgICAgY29sbGVjdFdob2xlSGVhcCA9IHJlcXVpcmVzRnVsbEhlYXBDb2xsZWN0aW9uKCk7Ci0gICAgICBpZiAoU3RhdHMuZ2F0aGVyaW5nU3RhdHMoKSAmJiBjb2xsZWN0V2hvbGVIZWFwKSBmdWxsSGVhcC5zZXQoKTsKLSAgICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIWNvbGxlY3RXaG9sZUhlYXAgJiYgcGhhc2VJZCA9PSBQUkVQQVJFKSB7Ci0gICAgICBpbW1peFRyYWNlLnByZXBhcmUoKTsKLSAgICAgIGltbWl4U3BhY2UucHJlcGFyZShmYWxzZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHBoYXNlSWQgPT0gUkVMRUFTRSkgewotICAgICAgaWYgKGNvbGxlY3RXaG9sZUhlYXApIHsKLSAgICAgICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKFJFTEVBU0UpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW1taXhUcmFjZS5yZWxlYXNlKCk7Ci0gICAgICAgIGxhc3RHQ1dhc0RlZnJhZyA9IGltbWl4U3BhY2UucmVsZWFzZShmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBtb2RQb29sLnJlc2V0KCk7Ci0gICAgICBsYXN0Q29tbWl0dGVkSW1taXhQYWdlcyA9IGltbWl4U3BhY2UuY29tbWl0dGVkUGFnZXMoKTsKLSAgICAgIG5leHRHQ1dob2xlSGVhcCA9IChnZXRQYWdlc0F2YWlsKCkgPCBPcHRpb25zLm51cnNlcnlTaXplLmdldE1pbk51cnNlcnkoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEFjY291bnRpbmcKLSAgICovCi0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGNvbnRyb2xzIHRoZSB0cmlnZ2VyaW5nIG9mIGEgR0MuIEl0IGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkKLSAgICogZHVyaW5nIGFsbG9jYXRpb24uIFJldHVybnMgdHJ1ZSB0byB0cmlnZ2VyIGEgY29sbGVjdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIHNwYWNlRnVsbCBTcGFjZSByZXF1ZXN0IGZhaWxlZCwgbXVzdCByZWNvdmVyIHBhZ2VzIHdpdGhpbiAnc3BhY2UnLgotICAgKiBAcmV0dXJuIFRydWUgaWYgYSBjb2xsZWN0aW9uIGlzIHJlcXVlc3RlZCBieSB0aGUgcGxhbi4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGNvbGxlY3Rpb25SZXF1aXJlZChib29sZWFuIHNwYWNlRnVsbCkgewotICAgIGJvb2xlYW4gbnVyc2VyeUZ1bGwgPSBpbW1peFNwYWNlLmdldFBhZ2VzQWxsb2NhdGVkKCkgPiBPcHRpb25zLm51cnNlcnlTaXplLmdldE1heE51cnNlcnkoKTsKLSAgICByZXR1cm4gc3VwZXIuY29sbGVjdGlvblJlcXVpcmVkKHNwYWNlRnVsbCkgfHwgbnVyc2VyeUZ1bGw7Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBHQyBzaG91bGQgYmUgYSBmdWxsIGhlYXAgY29sbGVjdGlvbi4KLSAgICoKLSAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgR0Mgc2hvdWxkIGJlIGEgZnVsbCBoZWFwIGNvbGxlY3Rpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiByZXF1aXJlc0Z1bGxIZWFwQ29sbGVjdGlvbigpIHsKLSAgICBpZiAoY29sbGVjdGlvblRyaWdnZXIgPT0gQ29sbGVjdGlvbi5FWFRFUk5BTF9HQ19UUklHR0VSICYmIE9wdGlvbnMuZnVsbEhlYXBTeXN0ZW1HQy5nZXRWYWx1ZSgpKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKG5leHRHQ1dob2xlSGVhcCB8fCBjb2xsZWN0aW9uQXR0ZW1wdCA+IDEpIHsKLSAgICAgIC8vIEZvcmNlcyBmdWxsIGhlYXAgY29sbGVjdGlvbgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmIChsb1NwYWNlLmFsbG9jYXRpb25GYWlsZWQoKSkgewotICAgICAgLy8gV2UgbmVlZCBzcGFjZSBmcm9tIHRoZSBudXJzZXJ5Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBFc3RpbWF0ZSB0aGUgeWllbGQgZnJvbSBzbWFsbCBudXJzZXJ5IHBhZ2VzCi0gICAgaW50IHNtYWxsTnVyc2VyeVBhZ2VzID0gaW1taXhTcGFjZS5jb21taXR0ZWRQYWdlcygpIC0gbGFzdENvbW1pdHRlZEltbWl4UGFnZXM7Ci0gICAgaW50IHNtYWxsTnVyc2VyeVlpZWxkID0gKGludCkoc21hbGxOdXJzZXJ5UGFnZXMgKiBTVVJWSVZBTF9FU1RJTUFURSk7Ci0KLSAgICBpZiAoc21hbGxOdXJzZXJ5WWllbGQgPCBnZXRQYWdlc1JlcXVpcmVkKCkpIHsKLSAgICAgIC8vIE91ciB0b3RhbCB5aWVsZCBpcyBpbnN1ZmZpY2llbnQuCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoaW1taXhTcGFjZS5hbGxvY2F0aW9uRmFpbGVkKCkpIHsKLSAgICAgIGlmIChzbWFsbE51cnNlcnlZaWVsZCA8IGltbWl4U3BhY2UucmVxdWlyZWRQYWdlcygpKSB7Ci0gICAgICAgIC8vIFdlIGhhdmUgcnVuIG91dCBvZiBWTSBwYWdlcyBpbiB0aGUgbnVyc2VyeQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnQgcHJlLWNvbGxlY3Rpb24gc3RhdGlzdGljcy4gSW4gdGhpcyBjbGFzcyB3ZSBwcmVmaXggdGhlIG91dHB1dAotICAgKiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gd2FzIGZ1bGwgaGVhcCBvciBub3QuCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgcHJpbnRQcmVTdGF0cygpIHsKLSAgICBpZiAoKE9wdGlvbnMudmVyYm9zZS5nZXRWYWx1ZSgpID49IDEpICYmIChjb2xsZWN0V2hvbGVIZWFwKSkKLSAgICAgIExvZy53cml0ZSgiW0Z1bGwgaGVhcF0iKTsKLSAgICBzdXBlci5wcmludFByZVN0YXRzKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBJcyBjdXJyZW50IEdDIG9ubHkgY29sbGVjdGluZyBvYmplY3RzIGFsbG9jYXRlZCBzaW5jZSBsYXN0IEdDLgotICAgKi8KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDdXJyZW50R0NOdXJzZXJ5KCkgewotICAgIHJldHVybiAhY29sbGVjdFdob2xlSGVhcDsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIElzIGxhc3QgR0MgYSBmdWxsIGNvbGxlY3Rpb24/Ci0gICAqLwotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0xhc3RHQ0Z1bGwoKSB7Ci0gICAgcmV0dXJuIGNvbGxlY3RXaG9sZUhlYXA7Ci0gIH0KLQotICAvKioKLSAgICogUmVnaXN0ZXIgc3BlY2lhbGl6ZWQgbWV0aG9kcy4KLSAgICovCi0gIEBJbnRlcnJ1cHRpYmxlCi0gIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyU3BlY2lhbGl6ZWRNZXRob2RzKCkgewotICAgIFRyYW5zaXRpdmVDbG9zdXJlLnJlZ2lzdGVyU3BlY2lhbGl6ZWRTY2FuKFNDQU5fTlVSU0VSWSwgU3RpY2t5SW1taXhOdXJzZXJ5VHJhY2VMb2NhbC5jbGFzcyk7Ci0gICAgc3VwZXIucmVnaXN0ZXJTcGVjaWFsaXplZE1ldGhvZHMoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3N0aWNreWltbWl4L1N0aWNreUltbWl4Q29sbGVjdG9yLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc3RpY2t5aW1taXgvU3RpY2t5SW1taXhDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE2N2ExYy4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc3RpY2t5aW1taXgvU3RpY2t5SW1taXhDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5zdGlja3lpbW1peDsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uKjsKLWltcG9ydCBvcmcubW10ay5wbGFuLmltbWl4LkltbWl4OwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uaW1taXguSW1taXhDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5pbW1peC5JbW1peERlZnJhZ1RyYWNlTG9jYWw7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5pbW1peC5JbW1peFRyYWNlTG9jYWw7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LmltbWl4LkNvbGxlY3RvckxvY2FsOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuYWxsb2MuSW1taXhBbGxvY2F0b3I7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5kZXF1ZS5PYmplY3RSZWZlcmVuY2VEZXF1ZTsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyA8aT5wZXItY29sbGVjdG9yIHRocmVhZDwvaT4gYmVoYXZpb3IKLSAqIGFuZCBzdGF0ZSBmb3IgdGhlIDxpPlN0aWNrTVM8L2k+IHBsYW4sIHdoaWNoIGltcGxlbWVudHMgYSBnZW5lcmF0aW9uYWwKLSAqIHN0aWNreSBtYXJrIGJpdHMgaW1taXggY29sbGVjdG9yLjxwPgotICoKLSAqIFNwZWNpZmljYWxseSwgdGhpcyBjbGFzcyBkZWZpbmVzIDxpPlN0aWNreU1TPC9pPiBjb2xsZWN0aW9uIGJlaGF2aW9yCi0gKiAodGhyb3VnaCA8Y29kZT50cmFjZTwvY29kZT4gYW5kIHRoZSA8Y29kZT5jb2xsZWN0aW9uUGhhc2U8L2NvZGU+Ci0gKiBtZXRob2QpLjxwPgotICoKLSAqIEBzZWUgU3RpY2t5SW1taXggZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBhbGdvcml0aG0uPHA+Ci0gKiBAc2VlIFN0aWNreUltbWl4TXV0YXRvcgotICogQHNlZSBTdG9wVGhlV29ybGRDb2xsZWN0b3IKLSAqIEBzZWUgQ29sbGVjdG9yQ29udGV4dAotICogQHNlZSBQaGFzZQotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgY2xhc3MgU3RpY2t5SW1taXhDb2xsZWN0b3IgZXh0ZW5kcyBJbW1peENvbGxlY3RvciB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogSW5zdGFuY2UgZmllbGRzCi0gICAqLwotICBwcml2YXRlIFN0aWNreUltbWl4TnVyc2VyeVRyYWNlTG9jYWwgbnVyc2VyeVRyYWNlOwotICBwcml2YXRlIGZpbmFsIEltbWl4QWxsb2NhdG9yIG51cnNlcnlDb3B5OwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIEluaXRpYWxpemF0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIFN0aWNreUltbWl4Q29sbGVjdG9yKCkgewotICAgIE9iamVjdFJlZmVyZW5jZURlcXVlIG1vZEJ1ZmZlciA9IG5ldyBPYmplY3RSZWZlcmVuY2VEZXF1ZSgibW9kIGJ1ZmZlciIsIGdsb2JhbCgpLm1vZFBvb2wpOwotICAgIGZhc3RUcmFjZSA9IG5ldyBJbW1peFRyYWNlTG9jYWwoZ2xvYmFsKCkuaW1taXhUcmFjZSwgbW9kQnVmZmVyKTsKLSAgICBkZWZyYWdUcmFjZSA9IG5ldyBJbW1peERlZnJhZ1RyYWNlTG9jYWwoZ2xvYmFsKCkuaW1taXhUcmFjZSwgbW9kQnVmZmVyKTsKLSAgICBudXJzZXJ5VHJhY2UgPSBuZXcgU3RpY2t5SW1taXhOdXJzZXJ5VHJhY2VMb2NhbChnbG9iYWwoKS5pbW1peFRyYWNlLCBtb2RCdWZmZXIpOwotICAgIGltbWl4ID0gbmV3IENvbGxlY3RvckxvY2FsKFN0aWNreUltbWl4LmltbWl4U3BhY2UpOwotICAgIG51cnNlcnlDb3B5ID0gbmV3IEltbWl4QWxsb2NhdG9yKEltbWl4LmltbWl4U3BhY2UsIHRydWUsIHRydWUpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQ29sbGVjdGlvbgotICAgKi8KLQotICAvKioKLSAgICogUGVyZm9ybSBhIHBlci1jb2xsZWN0b3IgY29sbGVjdGlvbiBwaGFzZS4KLSAgICoKLSAgICogQHBhcmFtIHBoYXNlSWQgVGhlIGNvbGxlY3Rpb24gcGhhc2UgdG8gcGVyZm9ybQotICAgKiBAcGFyYW0gcHJpbWFyeSBQZXJmb3JtIGFueSBzaW5nbGUtdGhyZWFkZWQgYWN0aXZpdGllcyB1c2luZyB0aGlzIHRocmVhZC4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGZpbmFsIHZvaWQgY29sbGVjdGlvblBoYXNlKHNob3J0IHBoYXNlSWQsIGJvb2xlYW4gcHJpbWFyeSkgewotICAgIGJvb2xlYW4gY29sbGVjdFdob2xlSGVhcCA9IGdsb2JhbCgpLmNvbGxlY3RXaG9sZUhlYXA7Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBTdGlja3lJbW1peC5QUkVQQVJFKSB7Ci0gICAgICBnbG9iYWwoKS5tb2RQb29sLnByZXBhcmVOb25CbG9ja2luZygpOyAgLyogYWx3YXlzIGRvIHRoaXMgKi8KLSAgICB9Ci0KLSAgICBpZiAoIWNvbGxlY3RXaG9sZUhlYXApIHsKLSAgICAgIGlmIChwaGFzZUlkID09IFN0aWNreUltbWl4LlBSRVBBUkUpIHsKLSAgICAgICAgY3VycmVudFRyYWNlID0gKFRyYWNlTG9jYWwpIG51cnNlcnlUcmFjZTsKLSAgICAgICAgaW1taXgucHJlcGFyZShmYWxzZSk7Ci0gICAgICAgIG51cnNlcnlUcmFjZS5wcmVwYXJlKCk7Ci0gICAgICAgIG51cnNlcnlDb3B5LnJlc2V0KCk7Ci0gICAgICAgIGNvcHkucmVzZXQoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBpZiAocGhhc2VJZCA9PSBTdGlja3lJbW1peC5ST09UUykgewotICAgICAgICBWTS5zY2FubmluZy5jb21wdXRlU3RhdGljUm9vdHMoY3VycmVudFRyYWNlKTsKLSAgICAgICAgVk0uc2Nhbm5pbmcuY29tcHV0ZUdsb2JhbFJvb3RzKGN1cnJlbnRUcmFjZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgaWYgKHBoYXNlSWQgPT0gU3RpY2t5SW1taXguQ0xPU1VSRSkgewotICAgICAgICBudXJzZXJ5VHJhY2UuY29tcGxldGVUcmFjZSgpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwaGFzZUlkID09IFN0aWNreUltbWl4LlJFTEVBU0UpIHsKLSAgICAgICAgbnVyc2VyeVRyYWNlLnJlbGVhc2UoKTsKLSAgICAgICAgaW1taXgucmVsZWFzZShmYWxzZSk7Ci0gICAgICAgIGdsb2JhbCgpLm1vZFBvb2wucmVzZXQoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLQotICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIE1pc2NlbGxhbmVvdXMKLSAgICovCi0KLSAgLyoqIEByZXR1cm4gVGhlIGFjdGl2ZSBnbG9iYWwgcGxhbiBhcyBhbiA8Y29kZT5TdGlja3lJbW1peDwvY29kZT4gaW5zdGFuY2UuICovCi0gIHByaXZhdGUgc3RhdGljIFN0aWNreUltbWl4IGdsb2JhbCgpIHsKLSAgICByZXR1cm4gKFN0aWNreUltbWl4KSBWTS5hY3RpdmVQbGFuLmdsb2JhbCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc3RpY2t5aW1taXgvU3RpY2t5SW1taXhDb25zdHJhaW50cy5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3N0aWNreWltbWl4L1N0aWNreUltbWl4Q29uc3RyYWludHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4YWQ5ZS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc3RpY2t5aW1taXgvU3RpY2t5SW1taXhDb25zdHJhaW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4uc3RpY2t5aW1taXg7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLm1tdGsucG9saWN5LmltbWl4LkltbWl4Q29uc3RhbnRzLk1BWF9JTU1JWF9PQkpFQ1RfQllURVM7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLmltbWl4LkltbWl4Q29uc3RyYWludHM7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGFuZCBpdHMgc3ViY2xhc3NlcyBjb21tdW5pY2F0ZSB0byB0aGUgaG9zdCBWTS9SdW50aW1lCi0gKiBhbnkgZmVhdHVyZXMgb2YgdGhlIHNlbGVjdGVkIHBsYW4gdGhhdCBpdCBuZWVkcyB0byBrbm93LiAgVGhpcyBpcwotICogc2VwYXJhdGUgZnJvbSB0aGUgbWFpbiBQbGFuL1BsYW5Mb2NhbCBjbGFzcyBpbiBvcmRlciB0byBieXBhc3MgYW55Ci0gKiBpc3N1ZXMgd2l0aCBvcmRlcmluZyBvZiBzdGF0aWMgaW5pdGlhbGl6YXRpb24uCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBjbGFzcyBTdGlja3lJbW1peENvbnN0cmFpbnRzIGV4dGVuZHMgSW1taXhDb25zdHJhaW50cyB7Ci0gIC8qKiBAcmV0dXJuIFRoZSBudW1iZXIgb2Ygc3BlY2lhbGl6ZWQgc2NhbnMuICBXZSBuZWVkIG51cnNlcnkgJiBmdWxsIGhlYXAuICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IG51bVNwZWNpYWxpemVkU2NhbnMoKSB7IHJldHVybiAzOyB9Ci0KLSAgLyoqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHBsYW4gcmVxdWlyZXMgYSB3cml0ZSBiYXJyaWVyICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBuZWVkc09iamVjdFJlZmVyZW5jZVdyaXRlQmFycmllcigpIHsgcmV0dXJuIHRydWU7IH0KLQotICAvKiogQHJldHVybiBUcnVlIGlmIHRoaXMgUGxhbiByZXF1aXJlcyBhIGhlYWRlciBiaXQgZm9yIG9iamVjdCBsb2dnaW5nICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBuZWVkc0xvZ0JpdEluSGVhZGVyKCkgeyByZXR1cm4gdHJ1ZTsgfQotCi0gIC8qKiBAcmV0dXJuIFNpemUgKGluIGJ5dGVzKSBiZXlvbmQgd2hpY2ggbmV3IHJlZ3VsYXIgb2JqZWN0cyBtdXN0IGJlIGFsbG9jYXRlZCB0byB0aGUgTE9TICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IG1heE5vbkxPU0RlZmF1bHRBbGxvY0J5dGVzKCkgeyByZXR1cm4gTUFYX0lNTUlYX09CSkVDVF9CWVRFUzsgfQotCi0gIC8qKiBAcmV0dXJuIFNpemUgKGluIGJ5dGVzKSBiZXlvbmQgd2hpY2ggY29waWVkIG9iamVjdHMgbXVzdCBiZSBjb3BpZWQgdG8gdGhlIExPUyAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBtYXhOb25MT1NDb3B5Qnl0ZXMoKSB7IHJldHVybiBNQVhfSU1NSVhfT0JKRUNUX0JZVEVTOyB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc3RpY2t5aW1taXgvU3RpY2t5SW1taXhNdXRhdG9yLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc3RpY2t5aW1taXgvU3RpY2t5SW1taXhNdXRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZmEzZjAuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3N0aWNreWltbWl4L1N0aWNreUltbWl4TXV0YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLnN0aWNreWltbWl4OwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi4qOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uaW1taXguSW1taXhNdXRhdG9yOwotCi1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5IZWFkZXJCeXRlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZGVxdWUuT2JqZWN0UmVmZXJlbmNlRGVxdWU7Ci1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIDxpPnBlci1tdXRhdG9yIHRocmVhZDwvaT4gYmVoYXZpb3IKLSAqIGFuZCBzdGF0ZSBmb3IgdGhlIDxpPlN0aWNreUltbWl4PC9pPiBwbGFuLCB3aGljaCBpbXBsZW1lbnRzIGEKLSAqIGdlbmVyYXRpb25hbCBtYXJrLXN3ZWVwIGNvbGxlY3Rvci48cD4KLSAqCi0gKiBTcGVjaWZpY2FsbHksIHRoaXMgY2xhc3MgZGVmaW5lcyA8aT5NUzwvaT4gbXV0YXRvci10aW1lIGFsbG9jYXRpb24KLSAqIGFuZCBwZXItbXV0YXRvciB0aHJlYWQgY29sbGVjdGlvbiBzZW1hbnRpY3MgKGZsdXNoaW5nIGFuZCByZXN0b3JpbmcKLSAqIHBlci1tdXRhdG9yIGFsbG9jYXRvciBzdGF0ZSkuPHA+Ci0gKiAqCi0gKiBAc2VlIFN0aWNreUltbWl4Ci0gKiBAc2VlIFN0aWNreUltbWl4Q29sbGVjdG9yCi0gKiBAc2VlIE11dGF0b3JDb250ZXh0Ci0gKiBAc2VlIFBoYXNlCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBjbGFzcyBTdGlja3lJbW1peE11dGF0b3IgZXh0ZW5kcyBJbW1peE11dGF0b3IgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIEluc3RhbmNlIGZpZWxkcwotICAgKi8KLQotICBwcml2YXRlIE9iamVjdFJlZmVyZW5jZURlcXVlIG1vZEJ1ZmZlcjsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbml0aWFsaXphdGlvbgotICAgKi8KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICovCi0gIHB1YmxpYyBTdGlja3lJbW1peE11dGF0b3IoKSB7Ci0gICAgc3VwZXIoKTsKLSAgICBtb2RCdWZmZXIgPSBuZXcgT2JqZWN0UmVmZXJlbmNlRGVxdWUoIm1vZCBidWYiLCBnbG9iYWwoKS5tb2RQb29sKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEJhcnJpZXJzCi0gICAqLwotCi0gIC8qKgotICAgKiBBIG5ldyByZWZlcmVuY2UgaXMgYWJvdXQgdG8gYmUgY3JlYXRlZC4gIFRha2UgYXBwcm9wcmlhdGUgd3JpdGUKLSAgICogYmFycmllciBhY3Rpb25zLjxwPgotICAgKgotICAgKiBJbiB0aGlzIGNhc2UsIHdlIHJlbWVtYmVyIHRoZSBhZGRyZXNzIG9mIHRoZSBzb3VyY2Ugb2YgdGhlCi0gICAqIHBvaW50ZXIgaWYgdGhlIG5ldyByZWZlcmVuY2UgcG9pbnRzIGludG8gdGhlIG51cnNlcnkgZnJvbQotICAgKiBub24tbnVyc2VyeSBzcGFjZS4KLSAgICoKLSAgICogQHBhcmFtIHNyYyBUaGUgb2JqZWN0IGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZSBzdG9yZWQKLSAgICogQHBhcmFtIHNsb3QgVGhlIGFkZHJlc3MgaW50byB3aGljaCB0aGUgbmV3IHJlZmVyZW5jZSB3aWxsIGJlCi0gICAqIHN0b3JlZC4KLSAgICogQHBhcmFtIHRndCBUaGUgdGFyZ2V0IG9mIHRoZSBuZXcgcmVmZXJlbmNlCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbWV0YURhdGFCIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1vZGUgVGhlIG1vZGUgb2YgdGhlIHN0b3JlIChlZyBwdXRmaWVsZCwgcHV0c3RhdGljIGV0YykKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGZpbmFsIHZvaWQgb2JqZWN0UmVmZXJlbmNlV3JpdGUoT2JqZWN0UmVmZXJlbmNlIHNyYywgQWRkcmVzcyBzbG90LAotICAgICAgT2JqZWN0UmVmZXJlbmNlIHRndCwgV29yZCBtZXRhRGF0YUEsIFdvcmQgbWV0YURhdGFCLCBpbnQgbW9kZSkgewotICAgIGlmIChIZWFkZXJCeXRlLmlzVW5sb2dnZWQoc3JjKSkKLSAgICAgIGxvZ1NvdXJjZShzcmMpOwotICAgIFZNLmJhcnJpZXJzLm9iamVjdFJlZmVyZW5jZVdyaXRlKHNyYywgdGd0LCBtZXRhRGF0YUEsIG1ldGFEYXRhQiwgbW9kZSk7Ci0gIH0KLQotICAvKioKLSAgICogQSBudW1iZXIgb2YgcmVmZXJlbmNlcyBhcmUgYWJvdXQgdG8gYmUgY29waWVkIGZyb20gb2JqZWN0Ci0gICAqIDxjb2RlPnNyYzwvY29kZT4gdG8gb2JqZWN0IDxjb2RlPmRzdDwvY29kZT4gKGFzIGluIGFuIGFycmF5Ci0gICAqIGNvcHkpLiAgVGh1cywgPGNvZGU+ZHN0PC9jb2RlPiBpcyB0aGUgbXV0YXRlZCBvYmplY3QuICBUYWtlCi0gICAqIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogSW4gdGhpcyBjYXNlLCB3ZSByZW1lbWJlciB0aGUgbXV0YXRlZCBzb3VyY2UgYWRkcmVzcyByYW5nZSBhbmQKLSAgICogd2lsbCBzY2FuIHRoYXQgYWRkcmVzcyByYW5nZSBhdCBHQyB0aW1lLgotICAgKgotICAgKiBAcGFyYW0gc3JjIFRoZSBzb3VyY2Ugb2YgdGhlIHZhbHVlcyB0byBjb3BpZWQKLSAgICogQHBhcmFtIHNyY09mZnNldCBUaGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBzb3VyY2UgYWRkcmVzcywgaW4KLSAgICogYnl0ZXMsIHJlbGF0aXZlIHRvIDxjb2RlPnNyYzwvY29kZT4gKGluIHByaW5jaXBsZSwgdGhpcyBjb3VsZCBiZQotICAgKiBuZWdhdGl2ZSkuCi0gICAqIEBwYXJhbSBkc3QgVGhlIG11dGF0ZWQgb2JqZWN0LCBpLmUuIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgY29weS4KLSAgICogQHBhcmFtIGRzdE9mZnNldCBUaGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBkZXN0aW5hdGlvbiBhZGRyZXNzLCBpbgotICAgKiBieXRlcyByZWxhdGl2ZSB0byA8Y29kZT50Z3Q8L2NvZGU+IChpbiBwcmluY2lwbGUsIHRoaXMgY291bGQgYmUKLSAgICogbmVnYXRpdmUpLgotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIHNpemUgb2YgdGhlIHJlZ2lvbiBiZWluZyBjb3BpZWQsIGluIGJ5dGVzLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHVwZGF0ZSB3YXMgcGVyZm9ybWVkIGJ5IHRoZSBiYXJyaWVyLCBmYWxzZSBpZgotICAgKiBsZWZ0IHRvIHRoZSBjYWxsZXIgKGFsd2F5cyBmYWxzZSBpbiB0aGlzIGNhc2UpLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBvYmplY3RSZWZlcmVuY2VCdWxrQ29weShPYmplY3RSZWZlcmVuY2Ugc3JjLCBPZmZzZXQgc3JjT2Zmc2V0LAotICAgICAgT2JqZWN0UmVmZXJlbmNlIGRzdCwgT2Zmc2V0IGRzdE9mZnNldCwgaW50IGJ5dGVzKSB7Ci0gICAgaWYgKEhlYWRlckJ5dGUuaXNVbmxvZ2dlZChzcmMpKQotICAgICAgbG9nU291cmNlKHNyYyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhbiBvYmplY3QgdG8gdGhlIG1vZGlmaWVkIG9iamVjdHMgYnVmZmVyIGFuZCBtYXJrIHRoZQotICAgKiBvYmplY3QgaGFzIGhhdmluZyBiZWVuIGxvZ2dlZC4gIFNpbmNlIGR1cGxpY2F0ZSBlbnRyaWVzIGRvCi0gICAqIG5vdCByYWlzZSBhbnkgY29ycmVjdG5lc3MgaXNzdWVzLCB3ZSBkbyA8aT5ub3Q8L2k+IHdvcnJ5Ci0gICAqIGFib3V0IHN5bmNocm9uaXphdGlvbiBhbmQgYWxsb3cgdGhyZWFkcyB0byByYWNlIHRvIGxvZyB0aGUKLSAgICogb2JqZWN0LCBwb3RlbnRpYWxseSBpbmNsdWRpbmcgaXQgdHdpY2UgKHVubGlrZSByZWZlcmVuY2UKLSAgICogY291bnRpbmcgd2hlcmUgZHVwbGljYXRlcyB3b3VsZCBsZWFkIHRvIGluY29ycmVjdCByZWZlcmVuY2UKLSAgICogY291bnRzKS4KLSAgICoKLSAgICogQHBhcmFtIHNyYyBUaGUgb2JqZWN0IHRvIGJlIGxvZ2dlZAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGxvZ1NvdXJjZShPYmplY3RSZWZlcmVuY2Ugc3JjKSB7Ci0gICAgSGVhZGVyQnl0ZS5tYXJrQXNMb2dnZWQoc3JjKTsKLSAgICBtb2RCdWZmZXIucHVzaChzcmMpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZsdXNoIHBlci1tdXRhdG9yIHJlbWVtYmVyZWQgc2V0cyBpbnRvIHRoZSBnbG9iYWwgcmVtc2V0IHBvb2wuCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCBmbHVzaFJlbWVtYmVyZWRTZXRzKCkgewotICAgIG1vZEJ1ZmZlci5mbHVzaExvY2FsKCk7Ci0gICAgYXNzZXJ0UmVtc2V0Rmx1c2hlZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFzc2VydCB0aGF0IHRoZSByZW1zZXRzIGhhdmUgYmVlbiBmbHVzaGVkLiAgVGhpcyBpcyBjcml0aWNhbCB0bwotICAgKiBjb3JyZWN0bmVzcy4gIFdlIG5lZWQgdG8gbWFpbnRhaW4gdGhlIGludmFyaWFudCB0aGF0IHJlbXNldCBlbnRyaWVzCi0gICAqIGRvIG5vdCBhY2NydWUgZHVyaW5nIEdDLiAgSWYgdGhlIGhvc3QgSlZNIGdlbmVyYXRlcyBiYXJyaWVyIGVudGlyZXMKLSAgICogaXQgaXMgaXRzIG93biByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCB0aGV5IGFyZSBmbHVzaGVkIGJlZm9yZQotICAgKiByZXR1cm5pbmcgdG8gTU1Uay4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGFzc2VydFJlbXNldEZsdXNoZWQoKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSB7Ci0gICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQobW9kQnVmZmVyLmlzRmx1c2hlZCgpKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbGxlY3Rpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSBwZXItbXV0YXRvciBjb2xsZWN0aW9uIHBoYXNlLgotICAgKgotICAgKiBAcGFyYW0gcGhhc2VJZCBUaGUgY29sbGVjdGlvbiBwaGFzZSB0byBwZXJmb3JtCi0gICAqIEBwYXJhbSBwcmltYXJ5IFBlcmZvcm0gYW55IHNpbmdsZS10aHJlYWRlZCBhY3Rpdml0aWVzIHVzaW5nIHRoaXMgdGhyZWFkLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgdm9pZCBjb2xsZWN0aW9uUGhhc2Uoc2hvcnQgcGhhc2VJZCwgYm9vbGVhbiBwcmltYXJ5KSB7Ci0gICAgaWYgKHBoYXNlSWQgPT0gU3RpY2t5SW1taXguUFJFUEFSRSkgewotICAgICAgZmx1c2hSZW1lbWJlcmVkU2V0cygpOwotICAgIH0KLSAgICBpZiAocGhhc2VJZCA9PSBTdGlja3lJbW1peC5SRUxFQVNFKSB7Ci0gICAgICBhc3NlcnRSZW1zZXRGbHVzaGVkKCk7Ci0gICAgfQotCi0gICAgaWYgKCFnbG9iYWwoKS5jb2xsZWN0V2hvbGVIZWFwKSB7Ci0gICAgICBpZiAocGhhc2VJZCA9PSBTdGlja3lJbW1peC5QUkVQQVJFKSB7Ci0gICAgICAgIGltbWl4LnByZXBhcmUoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBpZiAocGhhc2VJZCA9PSBTdGlja3lJbW1peC5SRUxFQVNFKSB7Ci0gICAgICAgIGltbWl4LnJlbGVhc2UoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLQotICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIE1pc2NlbGxhbmVvdXMKLSAgICovCi0KLSAgLyoqIEByZXR1cm4gVGhlIGFjdGl2ZSBnbG9iYWwgcGxhbiBhcyBhbiA8Y29kZT5NU0dlbjwvY29kZT4gaW5zdGFuY2UuICovCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSBzdGF0aWMgU3RpY2t5SW1taXggZ2xvYmFsKCkgewotICAgIHJldHVybiAoU3RpY2t5SW1taXgpIFZNLmFjdGl2ZVBsYW4uZ2xvYmFsKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9zdGlja3lpbW1peC9TdGlja3lJbW1peE51cnNlcnlUcmFjZUxvY2FsLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc3RpY2t5aW1taXgvU3RpY2t5SW1taXhOdXJzZXJ5VHJhY2VMb2NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2NhN2FjLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9zdGlja3lpbW1peC9TdGlja3lJbW1peE51cnNlcnlUcmFjZUxvY2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4uc3RpY2t5aW1taXg7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLm1tdGsucG9saWN5LmltbWl4LkltbWl4Q29uc3RhbnRzLk1BUktfTElORV9BVF9TQ0FOX1RJTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5tbXRrLnBvbGljeS5pbW1peC5JbW1peENvbnN0YW50cy5UTVBfUFJFRkVSX0NPUFlfT05fTlVSU0VSWV9HQzsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhY2VMb2NhbDsKLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYWNlOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkhlYWRlckJ5dGU7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5kZXF1ZS5PYmplY3RSZWZlcmVuY2VEZXF1ZTsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIHRocmVhZC1sb2NhbCBmdW5jdGlvbmFsaXR5IGZvciBhIHRyYW5zaXRpdmUKLSAqIGNsb3N1cmUgb3ZlciBhIHN0aWNreS1pbW1peCBzcGFjZS4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGZpbmFsIGNsYXNzIFN0aWNreUltbWl4TnVyc2VyeVRyYWNlTG9jYWwgZXh0ZW5kcyBUcmFjZUxvY2FsIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogSW5zdGFuY2UgZmllbGRzLgotICAqLwotIHByaXZhdGUgZmluYWwgT2JqZWN0UmVmZXJlbmNlRGVxdWUgbW9kQnVmZmVyOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIFN0aWNreUltbWl4TnVyc2VyeVRyYWNlTG9jYWwoVHJhY2UgdHJhY2UsIE9iamVjdFJlZmVyZW5jZURlcXVlIG1vZEJ1ZmZlcikgewotICAgIHN1cGVyKFN0aWNreUltbWl4LlNDQU5fTlVSU0VSWSwgdHJhY2UpOwotICAgIHRoaXMubW9kQnVmZmVyID0gbW9kQnVmZmVyOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogRXh0ZXJuYWxseSB2aXNpYmxlIE9iamVjdCBwcm9jZXNzaW5nIGFuZCB0cmFjaW5nCi0gICAqLwotCi0gIC8qKgotICAgKiBJcyB0aGUgc3BlY2lmaWVkIG9iamVjdCBsaXZlPwotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGxpdmUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0xpdmUoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmIChvYmplY3QuaXNOdWxsKCkpIHJldHVybiBmYWxzZTsKLSAgICBpZiAoU3BhY2UuaXNJblNwYWNlKFN0aWNreUltbWl4LklNTUlYLCBvYmplY3QpKQotICAgICAgcmV0dXJuIFRNUF9QUkVGRVJfQ09QWV9PTl9OVVJTRVJZX0dDID8gU3RpY2t5SW1taXguaW1taXhTcGFjZS5jb3B5TnVyc2VyeUlzTGl2ZShvYmplY3QpIDogU3RpY2t5SW1taXguaW1taXhTcGFjZS5mYXN0SXNMaXZlKG9iamVjdCk7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoc3VwZXIuaXNMaXZlKG9iamVjdCkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIHRoZSBjb3JlIG1ldGhvZCBkdXJpbmcgdGhlIHRyYWNlIG9mIHRoZSBvYmplY3QgZ3JhcGguCi0gICAqIFRoZSByb2xlIG9mIHRoaXMgbWV0aG9kIGlzIHRvOgotICAgKgotICAgKiAxLiBFbnN1cmUgdGhlIHRyYWNlZCBvYmplY3QgaXMgbm90IGNvbGxlY3RlZC4KLSAgICogMi4gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdmlzaXQgdG8gdGhlIG9iamVjdCBlbnF1ZXVlIGl0IHRvIGJlIHNjYW5uZWQuCi0gICAqIDMuIFJldHVybiB0aGUgZm9yd2FyZGVkIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0LgotICAgKgotICAgKiBJbiB0aGlzIGluc3RhbmNlLCB3ZSByZWZlciBvYmplY3RzIGluIHRoZSBtYXJrLXN3ZWVwIHNwYWNlIHRvIHRoZQotICAgKiBtc1NwYWNlIGZvciB0cmFjaW5nLCBhbmQgZGVmZXIgdG8gdGhlIHN1cGVyY2xhc3MgZm9yIGFsbCBvdGhlcnMuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBiZSB0cmFjZWQuCi0gICAqIEByZXR1cm4gVGhlIG5ldyByZWZlcmVuY2UgdG8gdGhlIHNhbWUgb2JqZWN0IGluc3RhbmNlLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlIHRyYWNlT2JqZWN0KE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAob2JqZWN0LmlzTnVsbCgpKSByZXR1cm4gb2JqZWN0OwotICAgIGlmIChTcGFjZS5pc0luU3BhY2UoU3RpY2t5SW1taXguSU1NSVgsIG9iamVjdCkpCi0gICAgICByZXR1cm4gU3RpY2t5SW1taXguaW1taXhTcGFjZS5udXJzZXJ5VHJhY2VPYmplY3QodGhpcywgb2JqZWN0LCBTdGlja3lJbW1peC5BTExPQ19ERUZBVUxUKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gb2JqZWN0OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0cnVlIGlmIHRoaXMgb2JqZWN0IGlzIGd1YXJhbnRlZWQgbm90IHRvIG1vdmUgZHVyaW5nIHRoaXMKLSAgICogY29sbGVjdGlvbiAoaS5lLiB0aGlzIG9iamVjdCBpcyBkZWZpbml0ZWx5IG5vdCBhbiB1bmZvcndhcmRlZAotICAgKiBvYmplY3QpLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIG9iamVjdCBpcyBndWFyYW50ZWVkIG5vdCB0byBtb3ZlIGR1cmluZyB0aGlzCi0gICAqICAgICAgICAgY29sbGVjdGlvbi4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiB3aWxsTm90TW92ZUluQ3VycmVudENvbGxlY3Rpb24oT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmIChTcGFjZS5pc0luU3BhY2UoU3RpY2t5SW1taXguSU1NSVgsIG9iamVjdCkpIHsKLSAgICAgIGlmICghVE1QX1BSRUZFUl9DT1BZX09OX05VUlNFUllfR0MpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gU3RpY2t5SW1taXguaW1taXhTcGFjZS53aWxsTm90TW92ZVRoaXNOdXJzZXJ5R0Mob2JqZWN0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLndpbGxOb3RNb3ZlSW5DdXJyZW50Q29sbGVjdGlvbihvYmplY3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbGxlY3RvcnMgdGhhdCBtb3ZlIG9iamVjdHMgPGI+bXVzdDwvYj4gb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0gICAqIEl0IHBlcmZvcm1zIHRoZSBkZWZlcnJlZCBzY2FubmluZyBvZiBvYmplY3RzIHdoaWNoIGFyZSBmb3J3YXJkZWQKLSAgICogZHVyaW5nIGJvb3RzdHJhcCBvZiBlYWNoIGNvcHlpbmcgY29sbGVjdGlvbi4gIEJlY2F1c2Ugb2YgdGhlCi0gICAqIGNvbXBsZXhpdGllcyBvZiB0aGUgY29sbGVjdGlvbiBib290c3RyYXAgKHN1Y2ggb2JqZWN0cyBhcmUKLSAgICogZ2VuZXJhbGx5IHRoZW1zZWx2ZXMgZ2MtY3JpdGljYWwpLCB0aGUgZm9yd2FyZGluZyBhbmQgc2Nhbm5pbmcgb2YKLSAgICogdGhlIG9iamVjdHMgbXVzdCBiZSBkaXNsb2NhdGVkLiAgSXQgaXMgYW4gZXJyb3IgZm9yIGEgbm9uLW1vdmluZwotICAgKiBjb2xsZWN0b3IgdG8gY2FsbCB0aGlzIG1ldGhvZC4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgZm9yd2FyZGVkIG9iamVjdCB0byBiZSBzY2FubmVkCi0gICAqLwotICBASW5saW5lCi0gIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgdm9pZCBzY2FuT2JqZWN0KE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBzdXBlci5zY2FuT2JqZWN0KG9iamVjdCk7Ci0gICAgaWYgKE1BUktfTElORV9BVF9TQ0FOX1RJTUUgJiYgU3BhY2UuaXNJblNwYWNlKFN0aWNreUltbWl4LklNTUlYLCBvYmplY3QpKQotICAgICAgU3RpY2t5SW1taXguaW1taXhTcGFjZS5tYXJrTGluZXMob2JqZWN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBQcm9jZXNzIGFueSByZW1lbWJlcmVkIHNldCBlbnRyaWVzLiAgVGhpcyBtZWFucyBlbnVtZXJhdGluZyB0aGUKLSAgICogbW9kIGJ1ZmZlciBhbmQgZm9yIGVhY2ggZW50cnksIG1hcmtpbmcgdGhlIG9iamVjdCBhcyB1bmxvZ2dlZAotICAgKiBhbmQgZW5xdWVpbmcgaXQgZm9yIHNjYW5uaW5nLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1JlbWVtYmVyZWRTZXRzKCkgewotICAgIGxvZ01lc3NhZ2UoMiwgInByb2Nlc3NpbmcgbW9kQnVmZmVyIik7Ci0gICAgd2hpbGUgKCFtb2RCdWZmZXIuaXNFbXB0eSgpKSB7Ci0gICAgICBPYmplY3RSZWZlcmVuY2Ugc3JjID0gbW9kQnVmZmVyLnBvcCgpOwotICAgICAgSGVhZGVyQnl0ZS5tYXJrQXNVbmxvZ2dlZChzcmMpOwotICAgICAgcHJvY2Vzc05vZGUoc3JjKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9zdGlja3ltcy9TdGlja3lNUy5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3N0aWNreW1zL1N0aWNreU1TLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NjI5ZmUuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3N0aWNreW1zL1N0aWNreU1TLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4uc3RpY2t5bXM7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYW5zaXRpdmVDbG9zdXJlOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4ubWFya3N3ZWVwLk1TOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkxvZzsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmRlcXVlLlNoYXJlZERlcXVlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkub3B0aW9ucy5PcHRpb25zOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuc2FuaXR5Y2hlY2tlci5TYW5pdHlDaGVja2VyOwotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC5PYmplY3RSZWZlcmVuY2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBnbG9iYWwgc3RhdGUgb2YgYSBzaW1wbGUgc3RpY2t5IG1hcmsgYml0cyBjb2xsZWN0b3IsCi0gKiBiYXNlZCBhIHNpbXBsZSBvbiBtYXJrLXN3ZWVwIGNvbGxlY3Rvci4gIFRoZSBzdGlja3kgbWFyayBiaXRzIGFsZ29yaXRobSBpcwotICogZHVlIHRvIERlbW1lcnMgZXQgYWwuIChodHRwOi8vZG9pLmFjbS5vcmcvMTAuMTE0NS85NjcwOS45NjczNSksIGFuZCBhbGxvd3MKLSAqIGdlbmVyYXRpb25hbCBjb2xsZWN0aW9uIHRvIGJlIHBlcmZvcm1lZCBpbiBhIG5vbi1tb3ZpbmcgaGVhcCBieSBvdmVybG9hZGluZwotICogdGhlIHJvbGUgb2YgbWFyayBiaXRzIHRvIGFsc28gaW5kaWNhdGUgd2hldGhlciBhbiBvYmplY3QgaXMgbmV3IChudXJzZXJ5KSBvcgotICogbm90LiAgVGh1cyBudXJzZXJ5IG9iamVjdHMgYXJlIGlkZW50aWZpZWQgYnkgYSBiaXQgaW4gdGhlaXIgaGVhZGVyLCBub3QgYnkKLSAqIHdoZXJlIHRoZXkgbGllIHdpdGhpbiB0aGUgYWRkcmVzcyBzcGFjZS4gIFdoaWxlIERlbW1lcnMgZXQgYWwuIGRpZCB0aGVpciB3b3JrCi0gKiBpbiBhIGNvbnNlcnZhdGl2ZSBjb2xsZWN0b3IsIGhlcmUgd2UgaGF2ZSBhbiBleGFjdCBjb2xsZWN0b3IsIHNvIHdlIGNhbiB1c2UKLSAqIGEgcmVndWxhciB3cml0ZSBiYXJyaWVyLCBhbmQgZG9uJ3QgbmVlZCB0byB1c2UgcGFnZSBwcm90ZWN0aW9uIGV0Yy4KLSAqCi0gKiBBbGwgcGxhbnMgbWFrZSBhIGNsZWFyIGRpc3RpbmN0aW9uIGJldHdlZW4gPGk+Z2xvYmFsPC9pPiBhbmQKLSAqIDxpPnRocmVhZC1sb2NhbDwvaT4gYWN0aXZpdGllcywgYW5kIGRpdmlkZXMgZ2xvYmFsIGFuZCBsb2NhbCBzdGF0ZQotICogaW50byBzZXBhcmF0ZSBjbGFzcyBoaWVyYXJjaGllcy4gIEdsb2JhbCBhY3Rpdml0aWVzIG11c3QgYmUKLSAqIHN5bmNocm9uaXplZCwgd2hlcmVhcyBubyBzeW5jaHJvbml6YXRpb24gaXMgcmVxdWlyZWQgZm9yCi0gKiB0aHJlYWQtbG9jYWwgYWN0aXZpdGllcy4gIFRoZXJlIGlzIGEgc2luZ2xlIGluc3RhbmNlIG9mIFBsYW4gKG9yIHRoZQotICogYXBwcm9wcmlhdGUgc3ViLWNsYXNzKSwgYW5kIGEgMToxIG1hcHBpbmcgb2YgUGxhbkxvY2FsIHRvICJrZXJuZWwKLSAqIHRocmVhZHMiIChha2EgQ1BVcyBvciBpbiBKaWtlcyBSVk0sIFByb2Nlc3NvcnMpLiAgVGh1cyBpbnN0YW5jZQotICogbWV0aG9kcyBvZiBQbGFuTG9jYWwgYWxsb3cgZmFzdCwgdW5zeWNocm9uaXplZCBhY2Nlc3MgdG8gZnVuY3Rpb25zIHN1Y2ggYXMKLSAqIGFsbG9jYXRpb24gYW5kIGNvbGxlY3Rpb24uCi0gKgotICogVGhlIGdsb2JhbCBpbnN0YW5jZSBkZWZpbmVzIGFuZCBtYW5hZ2VzIHN0YXRpYyByZXNvdXJjZXMKLSAqIChzdWNoIGFzIG1lbW9yeSBhbmQgdmlydHVhbCBtZW1vcnkgcmVzb3VyY2VzKS4gIFRoaXMgbWFwcGluZyBvZiB0aHJlYWRzIHRvCi0gKiBpbnN0YW5jZXMgaXMgY3J1Y2lhbCB0byB1bmRlcnN0YW5kaW5nIHRoZSBjb3JyZWN0bmVzcyBhbmQKLSAqIHBlcmZvcm1hbmNlIHByb3BlcnRpZXMgb2YgTU1UayBwbGFucy4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIFN0aWNreU1TIGV4dGVuZHMgTVMgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIENvbnN0YW50cwotICAgKi8KLSAgLyoqIElmIHRydWUsIHRoZW4gbmV3IFBMT1Mgb2JqZWN0cyBhcmUgY29sbGVjdGVkIGF0IGVhY2ggbnVyc2VyeSBHQyAqLwotICBzdGF0aWMgZmluYWwgYm9vbGVhbiBOVVJTRVJZX0NPTExFQ1RfUExPUyA9IHRydWU7Ci0gIC8qKiBJZiB0cnVlIHRoZW4gd2Ugb25seSBkbyBmdWxsIGhlYXAgR0NzLS0tc28gd2UncmUgbGlrZSBNYXJrU3dlZXAgKCsgd3JpdGUgYmFycmllcikgKi8KLSAgc3RhdGljIGZpbmFsIGJvb2xlYW4gTUFKT1JfR0NfT05MWSA9IGZhbHNlOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIENsYXNzIHZhcmlhYmxlcwotICAgKi8KLQotICBwdWJsaWMgc3RhdGljIGludCBTQ0FOX05VUlNFUlkgPSAxOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIEluc3RhbmNlIHZhcmlhYmxlcwotICAgKi8KLSAgLyogc3RhdHVzIGZpZWxkcyAqLwotICAvKiogd2lsbCB0aGUgbmV4dCBjb2xsZWN0aW9uIGNvbGxlY3QgdGhlIHdob2xlIGhlYXA/ICovCi0gIHB1YmxpYyBib29sZWFuIG5leHRHQ1dob2xlSGVhcCA9IGZhbHNlOwotICAvKiogd2lsbCB0aGlzIGNvbGxlY3Rpb24gY29sbGVjdCB0aGUgd2hvbGUgaGVhcCAqLwotICBwdWJsaWMgYm9vbGVhbiBjb2xsZWN0V2hvbGVIZWFwID0gbmV4dEdDV2hvbGVIZWFwOwotCi0gIC8qIFJlbXNldCBwb29sICovCi0gIHB1YmxpYyBmaW5hbCBTaGFyZWREZXF1ZSBtb2RQb29sID0gbmV3IFNoYXJlZERlcXVlKCJtc2dlbiBtb2Qgb2JqZWN0cyIsIG1ldGFEYXRhU3BhY2UsIDEpOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIFN0YXRpYyBpbml0aWFsaXphdGlvbgotICAgKi8KLSAgewotICAgIG1zU3BhY2UubWFrZUFnZVNlZ3JlZ2F0ZWRTcGFjZSgpOyAgLyogdGhpcyBzcGFjZSBpcyB0byBiZSBjb2xsZWN0ZWQgZ2VuZXJhdGlvbmFsbHkgKi8KLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDb2xsZWN0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBBIHVzZXItdHJpZ2dlcmVkIEdDIGhhcyBiZWVuIGluaXRpYXRlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHVzZXJUcmlnZ2VyZWRHQygpIHsKLSAgICBuZXh0R0NXaG9sZUhlYXAgfD0gT3B0aW9ucy5mdWxsSGVhcFN5c3RlbUdDLmdldFZhbHVlKCk7Ci0gIH0KLQotICAvKioKLSAgICogRm9yY2UgdGhlIG5leHQgY29sbGVjdGlvbiB0byBiZSBmdWxsIGhlYXAuCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgZm9yY2VGdWxsSGVhcENvbGxlY3Rpb24oKSB7Ci0gICAgbmV4dEdDV2hvbGVIZWFwID0gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIGEgKGdsb2JhbCkgY29sbGVjdGlvbiBwaGFzZS4KLSAgICoKLSAgICogQHBhcmFtIHBoYXNlSWQgQ29sbGVjdGlvbiBwaGFzZSB0byBleGVjdXRlLgotICAgKi8KLSAgQElubGluZQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGZpbmFsIHZvaWQgY29sbGVjdGlvblBoYXNlKHNob3J0IHBoYXNlSWQpIHsKLQotICAgIGlmIChwaGFzZUlkID09IElOSVRJQVRFKSB7Ci0gICAgICBjb2xsZWN0V2hvbGVIZWFwID0gTUFKT1JfR0NfT05MWSB8fCBlbWVyZ2VuY3lDb2xsZWN0aW9uIHx8IG5leHRHQ1dob2xlSGVhcDsKLSAgICAgIG5leHRHQ1dob2xlSGVhcCA9IGZhbHNlOwotICAgICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghY29sbGVjdFdob2xlSGVhcCkgewotICAgICAgaWYgKHBoYXNlSWQgPT0gUFJFUEFSRSkgewotICAgICAgICBtc1RyYWNlLnByZXBhcmUoKTsKLSAgICAgICAgbXNTcGFjZS5wcmVwYXJlKGZhbHNlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBpZiAocGhhc2VJZCA9PSBSRUxFQVNFKSB7Ci0gICAgICAgIG1zVHJhY2UucmVsZWFzZSgpOwotICAgICAgICBtc1NwYWNlLnJlbGVhc2UoKTsKLSAgICAgICAgbW9kUG9vbC5yZXNldCgpOwotICAgICAgICBuZXh0R0NXaG9sZUhlYXAgPSAoZ2V0UGFnZXNBdmFpbCgpIDwgT3B0aW9ucy5udXJzZXJ5U2l6ZS5nZXRNaW5OdXJzZXJ5KCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEFjY291bnRpbmcKLSAgICovCi0KLSAgLyoqCi0gICAqIFByaW50IHByZS1jb2xsZWN0aW9uIHN0YXRpc3RpY3MuIEluIHRoaXMgY2xhc3Mgd2UgcHJlZml4IHRoZSBvdXRwdXQKLSAgICogaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIHdhcyBmdWxsIGhlYXAgb3Igbm90LgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHByaW50UHJlU3RhdHMoKSB7Ci0gICAgaWYgKChPcHRpb25zLnZlcmJvc2UuZ2V0VmFsdWUoKSA+PSAxKSAmJiAoY29sbGVjdFdob2xlSGVhcCkpCi0gICAgICBMb2cud3JpdGUoIltGdWxsIGhlYXBdIik7Ci0gICAgc3VwZXIucHJpbnRQcmVTdGF0cygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gSXMgY3VycmVudCBHQyBvbmx5IGNvbGxlY3Rpbmcgb2JqZWN0cyBhbGxvY2F0ZWQgc2luY2UgbGFzdCBHQy4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ3VycmVudEdDTnVyc2VyeSgpIHsKLSAgICByZXR1cm4gIWNvbGxlY3RXaG9sZUhlYXA7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBJcyBsYXN0IEdDIGEgZnVsbCBjb2xsZWN0aW9uPwotICAgKi8KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNMYXN0R0NGdWxsKCkgewotICAgIHJldHVybiBjb2xsZWN0V2hvbGVIZWFwOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgZXhwZWN0ZWQgcmVmZXJlbmNlIGNvdW50LiBGb3Igbm9uLXJlZmVyZW5jZSBjb3VudGluZwotICAgKiBjb2xsZWN0b3JzIHRoaXMgYmVjb21lcyBhIHRydWUvZmFsc2UgcmVsYXRpb25zaGlwLgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2hlY2suCi0gICAqIEBwYXJhbSBzYW5pdHlSb290UkMgVGhlIG51bWJlciBvZiByb290IHJlZmVyZW5jZXMgdG8gdGhlIG9iamVjdC4KLSAgICoKLSAgICogQHJldHVybiBUaGUgZXhwZWN0ZWQgKHJvb3QgZXhjbHVkZWQpIHJlZmVyZW5jZSBjb3VudC4KLSAgICovCi0gIHB1YmxpYyBpbnQgc2FuaXR5RXhwZWN0ZWRSQyhPYmplY3RSZWZlcmVuY2Ugb2JqZWN0LCBpbnQgc2FuaXR5Um9vdFJDKSB7Ci0gICAgU3BhY2Ugc3BhY2UgPSBTcGFjZS5nZXRTcGFjZUZvck9iamVjdChvYmplY3QpOwotCi0gICAgLy8gSW1tb3J0YWwgc3BhY2VzCi0gICAgaWYgKHNwYWNlID09IFN0aWNreU1TLmltbW9ydGFsU3BhY2UgfHwgc3BhY2UgPT0gU3RpY2t5TVMudm1TcGFjZSkgewotICAgICAgcmV0dXJuIHNwYWNlLmlzUmVhY2hhYmxlKG9iamVjdCkgPyBTYW5pdHlDaGVja2VyLkFMSVZFIDogU2FuaXR5Q2hlY2tlci5ERUFEOwotICAgIH0KLQotICAgIC8vIE1hdHVyZSBzcGFjZSAobnVyc2VyeSBjb2xsZWN0aW9uKQotICAgIGlmIChWTS5hY3RpdmVQbGFuLmdsb2JhbCgpLmlzQ3VycmVudEdDTnVyc2VyeSgpICYmIHNwYWNlICE9IFN0aWNreU1TLm1zU3BhY2UpIHsKLSAgICAgIHJldHVybiBTYW5pdHlDaGVja2VyLlVOU1VSRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3VwZXIuc2FuaXR5RXhwZWN0ZWRSQyhvYmplY3QsIHNhbml0eVJvb3RSQyk7Ci0gIH0KLQotICAvKioKLSAgICogUmVnaXN0ZXIgc3BlY2lhbGl6ZWQgbWV0aG9kcy4KLSAgICovCi0gIEBJbnRlcnJ1cHRpYmxlCi0gIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyU3BlY2lhbGl6ZWRNZXRob2RzKCkgewotICAgIFRyYW5zaXRpdmVDbG9zdXJlLnJlZ2lzdGVyU3BlY2lhbGl6ZWRTY2FuKFNDQU5fTlVSU0VSWSwgU3RpY2t5TVNOdXJzZXJ5VHJhY2VMb2NhbC5jbGFzcyk7Ci0gICAgc3VwZXIucmVnaXN0ZXJTcGVjaWFsaXplZE1ldGhvZHMoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3N0aWNreW1zL1N0aWNreU1TQ29sbGVjdG9yLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc3RpY2t5bXMvU3RpY2t5TVNDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdiNzk0NS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc3RpY2t5bXMvU3RpY2t5TVNDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucGxhbi5zdGlja3ltczsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uKjsKLWltcG9ydCBvcmcubW10ay5wbGFuLm1hcmtzd2VlcC5NU0NvbGxlY3RvcjsKLWltcG9ydCBvcmcubW10ay5wbGFuLm1hcmtzd2VlcC5NU1RyYWNlTG9jYWw7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5kZXF1ZS5PYmplY3RSZWZlcmVuY2VEZXF1ZTsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyA8aT5wZXItY29sbGVjdG9yIHRocmVhZDwvaT4gYmVoYXZpb3IKLSAqIGFuZCBzdGF0ZSBmb3IgdGhlIDxpPlN0aWNrTVM8L2k+IHBsYW4sIHdoaWNoIGltcGxlbWVudHMgYSBnZW5lcmF0aW9uYWwKLSAqIHN0aWNreSBtYXJrIGJpdHMgbWFyay1zd2VlcCBjb2xsZWN0b3IuPHA+Ci0gKgotICogU3BlY2lmaWNhbGx5LCB0aGlzIGNsYXNzIGRlZmluZXMgPGk+U3RpY2t5TVM8L2k+IGNvbGxlY3Rpb24gYmVoYXZpb3IKLSAqICh0aHJvdWdoIDxjb2RlPnRyYWNlPC9jb2RlPiBhbmQgdGhlIDxjb2RlPmNvbGxlY3Rpb25QaGFzZTwvY29kZT4KLSAqIG1ldGhvZCkuPHA+Ci0gKgotICogQHNlZSBTdGlja3lNUyBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIGFsZ29yaXRobS48cD4KLSAqIEBzZWUgU3RpY2t5TVNNdXRhdG9yCi0gKiBAc2VlIFN0b3BUaGVXb3JsZENvbGxlY3RvcgotICogQHNlZSBDb2xsZWN0b3JDb250ZXh0Ci0gKiBAc2VlIFBoYXNlCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBjbGFzcyBTdGlja3lNU0NvbGxlY3RvciBleHRlbmRzIE1TQ29sbGVjdG9yIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBJbnN0YW5jZSBmaWVsZHMKLSAgICovCi0gIHByaXZhdGUgU3RpY2t5TVNOdXJzZXJ5VHJhY2VMb2NhbCBudXJzZXJ5VHJhY2U7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogSW5pdGlhbGl6YXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqLwotICBwdWJsaWMgU3RpY2t5TVNDb2xsZWN0b3IoKSB7Ci0gICAgT2JqZWN0UmVmZXJlbmNlRGVxdWUgbW9kQnVmZmVyID0gbmV3IE9iamVjdFJlZmVyZW5jZURlcXVlKCJtb2QgYnVmZmVyIiwgZ2xvYmFsKCkubW9kUG9vbCk7Ci0gICAgZnVsbFRyYWNlID0gbmV3ICBNU1RyYWNlTG9jYWwoZ2xvYmFsKCkubXNUcmFjZSwgbW9kQnVmZmVyKTsKLSAgICBudXJzZXJ5VHJhY2UgPSBuZXcgU3RpY2t5TVNOdXJzZXJ5VHJhY2VMb2NhbChnbG9iYWwoKS5tc1RyYWNlLCBtb2RCdWZmZXIpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQ29sbGVjdGlvbgotICAgKi8KLQotICAvKioKLSAgICogUGVyZm9ybSBhIHBlci1jb2xsZWN0b3IgY29sbGVjdGlvbiBwaGFzZS4KLSAgICoKLSAgICogQHBhcmFtIHBoYXNlSWQgVGhlIGNvbGxlY3Rpb24gcGhhc2UgdG8gcGVyZm9ybQotICAgKiBAcGFyYW0gcHJpbWFyeSBQZXJmb3JtIGFueSBzaW5nbGUtdGhyZWFkZWQgYWN0aXZpdGllcyB1c2luZyB0aGlzIHRocmVhZC4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGZpbmFsIHZvaWQgY29sbGVjdGlvblBoYXNlKHNob3J0IHBoYXNlSWQsIGJvb2xlYW4gcHJpbWFyeSkgewotICAgIGJvb2xlYW4gY29sbGVjdFdob2xlSGVhcCA9IGdsb2JhbCgpLmNvbGxlY3RXaG9sZUhlYXA7Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBTdGlja3lNUy5QUkVQQVJFKSB7Ci0gICAgICBjdXJyZW50VHJhY2UgPSBjb2xsZWN0V2hvbGVIZWFwID8gKFRyYWNlTG9jYWwpIGZ1bGxUcmFjZSA6IChUcmFjZUxvY2FsKSBudXJzZXJ5VHJhY2U7Ci0gICAgICBnbG9iYWwoKS5tb2RQb29sLnByZXBhcmVOb25CbG9ja2luZygpOyAgLyogYWx3YXlzIGRvIHRoaXMgKi8KLSAgICB9Ci0KLSAgICBpZiAoIWNvbGxlY3RXaG9sZUhlYXApIHsKLSAgICAgIGlmIChwaGFzZUlkID09IFN0aWNreU1TLlBSRVBBUkUpIHsKLSAgICAgICAgbnVyc2VyeVRyYWNlLnByZXBhcmUoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBpZiAocGhhc2VJZCA9PSBTdGlja3lNUy5ST09UUykgewotICAgICAgICBWTS5zY2FubmluZy5jb21wdXRlU3RhdGljUm9vdHMoY3VycmVudFRyYWNlKTsKLSAgICAgICAgVk0uc2Nhbm5pbmcuY29tcHV0ZUdsb2JhbFJvb3RzKGN1cnJlbnRUcmFjZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgaWYgKHBoYXNlSWQgPT0gU3RpY2t5TVMuQ0xPU1VSRSkgewotICAgICAgICBudXJzZXJ5VHJhY2UuY29tcGxldGVUcmFjZSgpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwaGFzZUlkID09IFN0aWNreU1TLlJFTEVBU0UpIHsKLSAgICAgICAgbnVyc2VyeVRyYWNlLnJlbGVhc2UoKTsKLSAgICAgICAgZ2xvYmFsKCkubW9kUG9vbC5yZXNldCgpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgc3VwZXIuY29sbGVjdGlvblBoYXNlKHBoYXNlSWQsIHByaW1hcnkpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogTWlzY2VsbGFuZW91cwotICAgKi8KLQotICAvKiogQHJldHVybiBUaGUgYWN0aXZlIGdsb2JhbCBwbGFuIGFzIGFuIDxjb2RlPk1TPC9jb2RlPiBpbnN0YW5jZS4gKi8KLSAgQElubGluZQotICBwcml2YXRlIHN0YXRpYyBTdGlja3lNUyBnbG9iYWwoKSB7Ci0gICAgcmV0dXJuIChTdGlja3lNUykgVk0uYWN0aXZlUGxhbi5nbG9iYWwoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3N0aWNreW1zL1N0aWNreU1TQ29uc3RyYWludHMuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9zdGlja3ltcy9TdGlja3lNU0NvbnN0cmFpbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OWI4ODQuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3N0aWNreW1zL1N0aWNreU1TQ29uc3RyYWludHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLnN0aWNreW1zOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5tYXJrc3dlZXAuTVNDb25zdHJhaW50czsKLQotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TZWdyZWdhdGVkRnJlZUxpc3RTcGFjZTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgYW5kIGl0cyBzdWJjbGFzc2VzIGNvbW11bmljYXRlIHRvIHRoZSBob3N0IFZNL1J1bnRpbWUKLSAqIGFueSBmZWF0dXJlcyBvZiB0aGUgc2VsZWN0ZWQgcGxhbiB0aGF0IGl0IG5lZWRzIHRvIGtub3cuICBUaGlzIGlzCi0gKiBzZXBhcmF0ZSBmcm9tIHRoZSBtYWluIFBsYW4vUGxhbkxvY2FsIGNsYXNzIGluIG9yZGVyIHRvIGJ5cGFzcyBhbnkKLSAqIGlzc3VlcyB3aXRoIG9yZGVyaW5nIG9mIHN0YXRpYyBpbml0aWFsaXphdGlvbi4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIFN0aWNreU1TQ29uc3RyYWludHMgZXh0ZW5kcyBNU0NvbnN0cmFpbnRzIHsKLSAgLyoqIEByZXR1cm4gVGhlIG51bWJlciBvZiBzcGVjaWFsaXplZCBzY2Fucy4gIFdlIG5lZWQgbnVyc2VyeSAmIGZ1bGwgaGVhcC4gKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgbnVtU3BlY2lhbGl6ZWRTY2FucygpIHsgcmV0dXJuIDI7IH0KLQotICAvKiogQHJldHVybiBUcnVlIGlmIHRoaXMgcGxhbiByZXF1aXJlcyBhIHdyaXRlIGJhcnJpZXIgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIG5lZWRzT2JqZWN0UmVmZXJlbmNlV3JpdGVCYXJyaWVyKCkgeyByZXR1cm4gdHJ1ZTsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBQbGFuIHJlcXVpcmVzIGEgaGVhZGVyIGJpdCBmb3Igb2JqZWN0IGxvZ2dpbmcgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIG5lZWRzTG9nQml0SW5IZWFkZXIoKSB7IHJldHVybiB0cnVlOyB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgbWF4Tm9uTE9TRGVmYXVsdEFsbG9jQnl0ZXMoKSB7IHJldHVybiBTZWdyZWdhdGVkRnJlZUxpc3RTcGFjZS5NQVhfRlJFRUxJU1RfT0JKRUNUX0JZVEVTOyB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc3RpY2t5bXMvU3RpY2t5TVNNdXRhdG9yLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc3RpY2t5bXMvU3RpY2t5TVNNdXRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMTZmN2IuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wbGFuL3N0aWNreW1zL1N0aWNreU1TTXV0YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wbGFuLnN0aWNreW1zOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi4qOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4ubWFya3N3ZWVwLk1TTXV0YXRvcjsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuTWFya1N3ZWVwTG9jYWw7Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkhlYWRlckJ5dGU7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5kZXF1ZS5PYmplY3RSZWZlcmVuY2VEZXF1ZTsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgPGk+cGVyLW11dGF0b3IgdGhyZWFkPC9pPiBiZWhhdmlvcgotICogYW5kIHN0YXRlIGZvciB0aGUgPGk+U3RpY2t5TVM8L2k+IHBsYW4sIHdoaWNoIGltcGxlbWVudHMgYQotICogZ2VuZXJhdGlvbmFsIG1hcmstc3dlZXAgY29sbGVjdG9yLjxwPgotICoKLSAqIFNwZWNpZmljYWxseSwgdGhpcyBjbGFzcyBkZWZpbmVzIDxpPk1TPC9pPiBtdXRhdG9yLXRpbWUgYWxsb2NhdGlvbgotICogYW5kIHBlci1tdXRhdG9yIHRocmVhZCBjb2xsZWN0aW9uIHNlbWFudGljcyAoZmx1c2hpbmcgYW5kIHJlc3RvcmluZwotICogcGVyLW11dGF0b3IgYWxsb2NhdG9yIHN0YXRlKS48cD4KLSAqICoKLSAqIEBzZWUgU3RpY2t5TVMKLSAqIEBzZWUgU3RpY2t5TVNDb2xsZWN0b3IKLSAqIEBzZWUgTXV0YXRvckNvbnRleHQKLSAqIEBzZWUgUGhhc2UKLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIFN0aWNreU1TTXV0YXRvciBleHRlbmRzIE1TTXV0YXRvciB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogSW5zdGFuY2UgZmllbGRzCi0gICAqLwotCi0gIHByaXZhdGUgT2JqZWN0UmVmZXJlbmNlRGVxdWUgbW9kQnVmZmVyOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluaXRpYWxpemF0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIFN0aWNreU1TTXV0YXRvcigpIHsKLSAgICBtcyA9IG5ldyBNYXJrU3dlZXBMb2NhbChTdGlja3lNUy5tc1NwYWNlKTsKLSAgICBtb2RCdWZmZXIgPSBuZXcgT2JqZWN0UmVmZXJlbmNlRGVxdWUoIm1vZCBidWYiLCBnbG9iYWwoKS5tb2RQb29sKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEJhcnJpZXJzCi0gICAqLwotCi0gIC8qKgotICAgKiBBIG5ldyByZWZlcmVuY2UgaXMgYWJvdXQgdG8gYmUgY3JlYXRlZC4gIFRha2UgYXBwcm9wcmlhdGUgd3JpdGUKLSAgICogYmFycmllciBhY3Rpb25zLjxwPgotICAgKgotICAgKiBJbiB0aGlzIGNhc2UsIHdlIHJlbWVtYmVyIHRoZSBhZGRyZXNzIG9mIHRoZSBzb3VyY2Ugb2YgdGhlCi0gICAqIHBvaW50ZXIgaWYgdGhlIG5ldyByZWZlcmVuY2UgcG9pbnRzIGludG8gdGhlIG51cnNlcnkgZnJvbQotICAgKiBub24tbnVyc2VyeSBzcGFjZS4KLSAgICoKLSAgICogQHBhcmFtIHNyYyBUaGUgb2JqZWN0IGludG8gd2hpY2ggdGhlIG5ldyByZWZlcmVuY2Ugd2lsbCBiZSBzdG9yZWQKLSAgICogQHBhcmFtIHNsb3QgVGhlIGFkZHJlc3MgaW50byB3aGljaCB0aGUgbmV3IHJlZmVyZW5jZSB3aWxsIGJlCi0gICAqIHN0b3JlZC4KLSAgICogQHBhcmFtIHRndCBUaGUgdGFyZ2V0IG9mIHRoZSBuZXcgcmVmZXJlbmNlCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgQSB2YWx1ZSB0aGF0IGFzc2lzdHMgdGhlIGhvc3QgVk0gaW4gY3JlYXRpbmcgYSBzdG9yZQotICAgKiBAcGFyYW0gbWV0YURhdGFCIEEgdmFsdWUgdGhhdCBhc3Npc3RzIHRoZSBob3N0IFZNIGluIGNyZWF0aW5nIGEgc3RvcmUKLSAgICogQHBhcmFtIG1vZGUgVGhlIG1vZGUgb2YgdGhlIHN0b3JlIChlZyBwdXRmaWVsZCwgcHV0c3RhdGljIGV0YykKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGZpbmFsIHZvaWQgb2JqZWN0UmVmZXJlbmNlV3JpdGUoT2JqZWN0UmVmZXJlbmNlIHNyYywgQWRkcmVzcyBzbG90LAotICAgICAgT2JqZWN0UmVmZXJlbmNlIHRndCwgV29yZCBtZXRhRGF0YUEsIFdvcmQgbWV0YURhdGFCLCBpbnQgbW9kZSkgewotICAgIGlmIChIZWFkZXJCeXRlLmlzVW5sb2dnZWQoc3JjKSkKLSAgICAgIGxvZ1NvdXJjZShzcmMpOwotICAgIFZNLmJhcnJpZXJzLm9iamVjdFJlZmVyZW5jZVdyaXRlKHNyYywgdGd0LCBtZXRhRGF0YUEsIG1ldGFEYXRhQiwgbW9kZSk7Ci0gIH0KLQotICAvKioKLSAgICogQSBudW1iZXIgb2YgcmVmZXJlbmNlcyBhcmUgYWJvdXQgdG8gYmUgY29waWVkIGZyb20gb2JqZWN0Ci0gICAqIDxjb2RlPnNyYzwvY29kZT4gdG8gb2JqZWN0IDxjb2RlPmRzdDwvY29kZT4gKGFzIGluIGFuIGFycmF5Ci0gICAqIGNvcHkpLiAgVGh1cywgPGNvZGU+ZHN0PC9jb2RlPiBpcyB0aGUgbXV0YXRlZCBvYmplY3QuICBUYWtlCi0gICAqIGFwcHJvcHJpYXRlIHdyaXRlIGJhcnJpZXIgYWN0aW9ucy48cD4KLSAgICoKLSAgICogSW4gdGhpcyBjYXNlLCB3ZSByZW1lbWJlciB0aGUgbXV0YXRlZCBzb3VyY2UgYWRkcmVzcyByYW5nZSBhbmQKLSAgICogd2lsbCBzY2FuIHRoYXQgYWRkcmVzcyByYW5nZSBhdCBHQyB0aW1lLgotICAgKgotICAgKiBAcGFyYW0gc3JjIFRoZSBzb3VyY2Ugb2YgdGhlIHZhbHVlcyB0byBjb3BpZWQKLSAgICogQHBhcmFtIHNyY09mZnNldCBUaGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBzb3VyY2UgYWRkcmVzcywgaW4KLSAgICogYnl0ZXMsIHJlbGF0aXZlIHRvIDxjb2RlPnNyYzwvY29kZT4gKGluIHByaW5jaXBsZSwgdGhpcyBjb3VsZCBiZQotICAgKiBuZWdhdGl2ZSkuCi0gICAqIEBwYXJhbSBkc3QgVGhlIG11dGF0ZWQgb2JqZWN0LCBpLmUuIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgY29weS4KLSAgICogQHBhcmFtIGRzdE9mZnNldCBUaGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBkZXN0aW5hdGlvbiBhZGRyZXNzLCBpbgotICAgKiBieXRlcyByZWxhdGl2ZSB0byA8Y29kZT50Z3Q8L2NvZGU+IChpbiBwcmluY2lwbGUsIHRoaXMgY291bGQgYmUKLSAgICogbmVnYXRpdmUpLgotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIHNpemUgb2YgdGhlIHJlZ2lvbiBiZWluZyBjb3BpZWQsIGluIGJ5dGVzLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHVwZGF0ZSB3YXMgcGVyZm9ybWVkIGJ5IHRoZSBiYXJyaWVyLCBmYWxzZSBpZgotICAgKiBsZWZ0IHRvIHRoZSBjYWxsZXIgKGFsd2F5cyBmYWxzZSBpbiB0aGlzIGNhc2UpLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBvYmplY3RSZWZlcmVuY2VCdWxrQ29weShPYmplY3RSZWZlcmVuY2Ugc3JjLCBPZmZzZXQgc3JjT2Zmc2V0LAotICAgICAgT2JqZWN0UmVmZXJlbmNlIGRzdCwgT2Zmc2V0IGRzdE9mZnNldCwgaW50IGJ5dGVzKSB7Ci0gICAgaWYgKEhlYWRlckJ5dGUuaXNVbmxvZ2dlZChzcmMpKQotICAgICAgbG9nU291cmNlKHNyYyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhbiBvYmplY3QgdG8gdGhlIG1vZGlmaWVkIG9iamVjdHMgYnVmZmVyIGFuZCBtYXJrIHRoZQotICAgKiBvYmplY3QgaGFzIGhhdmluZyBiZWVuIGxvZ2dlZC4gIFNpbmNlIGR1cGxpY2F0ZSBlbnRyaWVzIGRvCi0gICAqIG5vdCByYWlzZSBhbnkgY29ycmVjdG5lc3MgaXNzdWVzLCB3ZSBkbyA8aT5ub3Q8L2k+IHdvcnJ5Ci0gICAqIGFib3V0IHN5bmNocm9uaXphdGlvbiBhbmQgYWxsb3cgdGhyZWFkcyB0byByYWNlIHRvIGxvZyB0aGUKLSAgICogb2JqZWN0LCBwb3RlbnRpYWxseSBpbmNsdWRpbmcgaXQgdHdpY2UgKHVubGlrZSByZWZlcmVuY2UKLSAgICogY291bnRpbmcgd2hlcmUgZHVwbGljYXRlcyB3b3VsZCBsZWFkIHRvIGluY29ycmVjdCByZWZlcmVuY2UKLSAgICogY291bnRzKS4KLSAgICoKLSAgICogQHBhcmFtIHNyYyBUaGUgb2JqZWN0IHRvIGJlIGxvZ2dlZAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGxvZ1NvdXJjZShPYmplY3RSZWZlcmVuY2Ugc3JjKSB7Ci0gICAgSGVhZGVyQnl0ZS5tYXJrQXNMb2dnZWQoc3JjKTsKLSAgICBtb2RCdWZmZXIucHVzaChzcmMpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZsdXNoIHBlci1tdXRhdG9yIHJlbWVtYmVyZWQgc2V0cyBpbnRvIHRoZSBnbG9iYWwgcmVtc2V0IHBvb2wuCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCBmbHVzaFJlbWVtYmVyZWRTZXRzKCkgewotICAgIG1vZEJ1ZmZlci5mbHVzaExvY2FsKCk7Ci0gICAgYXNzZXJ0UmVtc2V0Rmx1c2hlZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFzc2VydCB0aGF0IHRoZSByZW1zZXRzIGhhdmUgYmVlbiBmbHVzaGVkLiAgVGhpcyBpcyBjcml0aWNhbCB0bwotICAgKiBjb3JyZWN0bmVzcy4gIFdlIG5lZWQgdG8gbWFpbnRhaW4gdGhlIGludmFyaWFudCB0aGF0IHJlbXNldCBlbnRyaWVzCi0gICAqIGRvIG5vdCBhY2NydWUgZHVyaW5nIEdDLiAgSWYgdGhlIGhvc3QgSlZNIGdlbmVyYXRlcyBiYXJyaWVyIGVudGlyZXMKLSAgICogaXQgaXMgaXRzIG93biByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCB0aGV5IGFyZSBmbHVzaGVkIGJlZm9yZQotICAgKiByZXR1cm5pbmcgdG8gTU1Uay4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGFzc2VydFJlbXNldEZsdXNoZWQoKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSB7Ci0gICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQobW9kQnVmZmVyLmlzRmx1c2hlZCgpKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbGxlY3Rpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSBwZXItbXV0YXRvciBjb2xsZWN0aW9uIHBoYXNlLgotICAgKgotICAgKiBAcGFyYW0gcGhhc2VJZCBUaGUgY29sbGVjdGlvbiBwaGFzZSB0byBwZXJmb3JtCi0gICAqIEBwYXJhbSBwcmltYXJ5IFBlcmZvcm0gYW55IHNpbmdsZS10aHJlYWRlZCBhY3Rpdml0aWVzIHVzaW5nIHRoaXMgdGhyZWFkLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgdm9pZCBjb2xsZWN0aW9uUGhhc2Uoc2hvcnQgcGhhc2VJZCwgYm9vbGVhbiBwcmltYXJ5KSB7Ci0gICAgaWYgKHBoYXNlSWQgPT0gU3RpY2t5TVMuUFJFUEFSRSkgewotICAgICAgZmx1c2hSZW1lbWJlcmVkU2V0cygpOwotICAgIH0KLSAgICBpZiAocGhhc2VJZCA9PSBTdGlja3lNUy5SRUxFQVNFKSB7Ci0gICAgICBhc3NlcnRSZW1zZXRGbHVzaGVkKCk7Ci0gICAgfQotCi0gICAgaWYgKCFnbG9iYWwoKS5jb2xsZWN0V2hvbGVIZWFwKSB7Ci0gICAgICBpZiAocGhhc2VJZCA9PSBTdGlja3lNUy5QUkVQQVJFKSB7Ci0gICAgICAgIG1zLnByZXBhcmUoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBpZiAocGhhc2VJZCA9PSBTdGlja3lNUy5SRUxFQVNFKSB7Ci0gICAgICAgIG1zLnJlbGVhc2UoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLQotICAgIHN1cGVyLmNvbGxlY3Rpb25QaGFzZShwaGFzZUlkLCBwcmltYXJ5KTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEZsdXNoIG11dGF0b3IgY29udGV4dCwgaW4gcmVzcG9uc2UgdG8gYSByZXF1ZXN0TXV0YXRvckZsdXNoLgotICAgKiBBbHNvIGNhbGxlZCBieSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBkZWluaXRNdXRhdG9yLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGZsdXNoKCkgewotICAgIHN1cGVyLmZsdXNoKCk7Ci0gICAgbXMuZmx1c2goKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIE1pc2NlbGxhbmVvdXMKLSAgICovCi0KLSAgLyoqIEByZXR1cm4gVGhlIGFjdGl2ZSBnbG9iYWwgcGxhbiBhcyBhbiA8Y29kZT5NU0dlbjwvY29kZT4gaW5zdGFuY2UuICovCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSBzdGF0aWMgU3RpY2t5TVMgZ2xvYmFsKCkgewotICAgIHJldHVybiAoU3RpY2t5TVMpIFZNLmFjdGl2ZVBsYW4uZ2xvYmFsKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9zdGlja3ltcy9TdGlja3lNU051cnNlcnlUcmFjZUxvY2FsLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BsYW4vc3RpY2t5bXMvU3RpY2t5TVNOdXJzZXJ5VHJhY2VMb2NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmU5ZTZiLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcGxhbi9zdGlja3ltcy9TdGlja3lNU051cnNlcnlUcmFjZUxvY2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBsYW4uc3RpY2t5bXM7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYWNlTG9jYWw7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5UcmFjZTsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5IZWFkZXJCeXRlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZGVxdWUuT2JqZWN0UmVmZXJlbmNlRGVxdWU7Ci1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSB0aHJlYWQtbG9jYWwgZnVuY3Rpb25hbGl0eSBmb3IgYSB0cmFuc2l0aXZlCi0gKiBjbG9zdXJlIG92ZXIgYSBtYXJrLXN3ZWVwIHNwYWNlLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RpY2t5TVNOdXJzZXJ5VHJhY2VMb2NhbCBleHRlbmRzIFRyYWNlTG9jYWwgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBJbnN0YW5jZSBmaWVsZHMuCi0gICovCi0gcHJpdmF0ZSBmaW5hbCBPYmplY3RSZWZlcmVuY2VEZXF1ZSBtb2RCdWZmZXI7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqLwotICBwdWJsaWMgU3RpY2t5TVNOdXJzZXJ5VHJhY2VMb2NhbChUcmFjZSB0cmFjZSwgT2JqZWN0UmVmZXJlbmNlRGVxdWUgbW9kQnVmZmVyKSB7Ci0gICAgc3VwZXIoU3RpY2t5TVMuU0NBTl9OVVJTRVJZLCB0cmFjZSk7Ci0gICAgdGhpcy5tb2RCdWZmZXIgPSBtb2RCdWZmZXI7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBFeHRlcm5hbGx5IHZpc2libGUgT2JqZWN0IHByb2Nlc3NpbmcgYW5kIHRyYWNpbmcKLSAgICovCi0KLSAgLyoqCi0gICAqIElzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGxpdmU/Ci0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdC4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBvYmplY3QgaXMgbGl2ZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTGl2ZShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKG9iamVjdC5pc051bGwoKSkgcmV0dXJuIGZhbHNlOwotICAgIGlmIChTcGFjZS5pc0luU3BhY2UoU3RpY2t5TVMuTUFSS19TV0VFUCwgb2JqZWN0KSkKLSAgICAgIHJldHVybiBTdGlja3lNUy5tc1NwYWNlLmlzTGl2ZShvYmplY3QpOwotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KHN1cGVyLmlzTGl2ZShvYmplY3QpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBpcyB0aGUgY29yZSBtZXRob2QgZHVyaW5nIHRoZSB0cmFjZSBvZiB0aGUgb2JqZWN0IGdyYXBoLgotICAgKiBUaGUgcm9sZSBvZiB0aGlzIG1ldGhvZCBpcyB0bzoKLSAgICoKLSAgICogMS4gRW5zdXJlIHRoZSB0cmFjZWQgb2JqZWN0IGlzIG5vdCBjb2xsZWN0ZWQuCi0gICAqIDIuIElmIHRoaXMgaXMgdGhlIGZpcnN0IHZpc2l0IHRvIHRoZSBvYmplY3QgZW5xdWV1ZSBpdCB0byBiZSBzY2FubmVkLgotICAgKiAzLiBSZXR1cm4gdGhlIGZvcndhcmRlZCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdC4KLSAgICoKLSAgICogSW4gdGhpcyBpbnN0YW5jZSwgd2UgcmVmZXIgb2JqZWN0cyBpbiB0aGUgbWFyay1zd2VlcCBzcGFjZSB0byB0aGUKLSAgICogbXNTcGFjZSBmb3IgdHJhY2luZywgYW5kIGRlZmVyIHRvIHRoZSBzdXBlcmNsYXNzIGZvciBhbGwgb3RoZXJzLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgdHJhY2VkLgotICAgKiBAcmV0dXJuIFRoZSBuZXcgcmVmZXJlbmNlIHRvIHRoZSBzYW1lIG9iamVjdCBpbnN0YW5jZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIE9iamVjdFJlZmVyZW5jZSB0cmFjZU9iamVjdChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKG9iamVjdC5pc051bGwoKSkgcmV0dXJuIG9iamVjdDsKLSAgICBpZiAoU3BhY2UuaXNJblNwYWNlKFN0aWNreU1TLk1BUktfU1dFRVAsIG9iamVjdCkpCi0gICAgICByZXR1cm4gU3RpY2t5TVMubXNTcGFjZS50cmFjZU9iamVjdCh0aGlzLCBvYmplY3QpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBvYmplY3Q7Ci0gIH0KLQotICAvKioKLSAgICogUHJvY2VzcyBhbnkgcmVtZW1iZXJlZCBzZXQgZW50cmllcy4gIFRoaXMgbWVhbnMgZW51bWVyYXRpbmcgdGhlCi0gICAqIG1vZCBidWZmZXIgYW5kIGZvciBlYWNoIGVudHJ5LCBtYXJraW5nIHRoZSBvYmplY3QgYXMgdW5sb2dnZWQKLSAgICogYW5kIGVucXVlaW5nIGl0IGZvciBzY2FubmluZy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NSZW1lbWJlcmVkU2V0cygpIHsKLSAgICBsb2dNZXNzYWdlKDIsICJwcm9jZXNzaW5nIG1vZEJ1ZmZlciIpOwotICAgIHdoaWxlICghbW9kQnVmZmVyLmlzRW1wdHkoKSkgewotICAgICAgT2JqZWN0UmVmZXJlbmNlIHNyYyA9IG1vZEJ1ZmZlci5wb3AoKTsKLSAgICAgIEhlYWRlckJ5dGUubWFya0FzVW5sb2dnZWQoc3JjKTsKLSAgICAgIHByb2Nlc3NOb2RlKHNyYyk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BvbGljeS9CYXNlTGFyZ2VPYmplY3RTcGFjZS5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvQmFzZUxhcmdlT2JqZWN0U3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ1NDI4OC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BvbGljeS9CYXNlTGFyZ2VPYmplY3RTcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wb2xpY3k7Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmhlYXAuRnJlZUxpc3RQYWdlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5oZWFwLlZNUmVxdWVzdDsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkNvbnN0YW50czsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBFYWNoIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgY29ycmVzcG9uZHMgdG8gb25lIHRyZWFkbWlsbCAqc3BhY2UqLgotICoKLSAqIEVhY2ggb2YgdGhlIGluc3RhbmNlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyBtYXkgYmUgY2FsbGVkIGJ5IGFueQotICogdGhyZWFkIChpLmUuIHN5bmNocm9uaXphdGlvbiBtdXN0IGJlIGV4cGxpY2l0IGluIGFueSBpbnN0YW5jZSBvcgotICogY2xhc3MgbWV0aG9kKS4KLSAqCi0gKiBUaGlzIHN0YW5kcyBpbiBjb250cmFzdCB0byBUcmVhZG1pbGxMb2NhbCwgd2hpY2ggaXMgaW5zdGFudGlhdGVkCi0gKiBhbmQgY2FsbGVkIG9uIGEgcGVyLXRocmVhZCBiYXNpcywgd2hlcmUgZWFjaCBpbnN0YW5jZSBvZgotICogVHJlYWRtaWxsTG9jYWwgY29ycmVzcG9uZHMgdG8gb25lIHRocmVhZCBvcGVyYXRpbmcgb3ZlciBvbmUgc3BhY2UuCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlTGFyZ2VPYmplY3RTcGFjZSBleHRlbmRzIFNwYWNlIGltcGxlbWVudHMgQ29uc3RhbnRzIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDbGFzcyB2YXJpYWJsZXMKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgV29yZCBQQUdFX01BU0sgPSBXb3JkLmZyb21JbnRTaWduRXh0ZW5kKH4oQllURVNfSU5fUEFHRSAtIDEpKTsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbml0aWFsaXphdGlvbgotICAgKi8KLQotICAvKioKLSAgICogVGhlIGNhbGxlciBzcGVjaWZpZXMgdGhlIHJlZ2lvbiBvZiB2aXJ0dWFsIG1lbW9yeSB0byBiZSB1c2VkIGZvcgotICAgKiB0aGlzIHNwYWNlLiAgSWYgdGhpcyByZWdpb24gY29uZmxpY3RzIHdpdGggYW4gZXhpc3Rpbmcgc3BhY2UsCi0gICAqIHRoZW4gdGhlIGNvbnN0cnVjdG9yIHdpbGwgZmFpbC4KLSAgICoKLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhpcyBzcGFjZSAodXNlZCB3aGVuIHByaW50aW5nIGVycm9yIG1lc3NhZ2VzIGV0YykKLSAgICogQHBhcmFtIHBhZ2VCdWRnZXQgVGhlIG51bWJlciBvZiBwYWdlcyB0aGlzIHNwYWNlIG1heSBjb25zdW1lCi0gICAqIGJlZm9yZSBjb25zdWx0aW5nIHRoZSBwbGFuCi0gICAqIEBwYXJhbSB2bVJlcXVlc3QgQW4gb2JqZWN0IGRlc2NyaWJpbmcgdGhlIHZpcnR1YWwgbWVtb3J5IHJlcXVlc3RlZC4KLSAgICovCi0gIHB1YmxpYyBCYXNlTGFyZ2VPYmplY3RTcGFjZShTdHJpbmcgbmFtZSwgaW50IHBhZ2VCdWRnZXQsIFZNUmVxdWVzdCB2bVJlcXVlc3QpIHsKLSAgICBzdXBlcihuYW1lLCBmYWxzZSwgZmFsc2UsIHZtUmVxdWVzdCk7Ci0gICAgaWYgKHZtUmVxdWVzdC5pc0Rpc2NvbnRpZ3VvdXMoKSkgewotICAgICAgcHIgPSBuZXcgRnJlZUxpc3RQYWdlUmVzb3VyY2UocGFnZUJ1ZGdldCwgdGhpcywgMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByID0gbmV3IEZyZWVMaXN0UGFnZVJlc291cmNlKHBhZ2VCdWRnZXQsIHRoaXMsIHN0YXJ0LCBleHRlbnQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDYWxjdWxhdGUgdGhlIGhlYWRlciBzaXplIHJlcXVpcmVkIGZvciB0aGUgbGFyZ2Ugb2JqZWN0LgotICAgKgotICAgKiBNdXN0IGJlIG11bHRpcGxlIG9mIE1JTl9BTElHTk1FTlQuCi0gICAqLwotICBwdWJsaWMgZmluYWwgaW50IGdldEhlYWRlclNpemUoKSB7Ci0gICAgcmV0dXJuIHN1cGVyUGFnZUhlYWRlclNpemUoKSArIGNlbGxIZWFkZXJTaXplKCk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBGcmVlaW5nCi0gICAqLwotCi0gIC8qKgotICAgKiBGcmVlIGEgY2VsbC4gIElmIHRoZSBjZWxsIGlzIGxhcmdlIChvd24gc3VwZXJwYWdlKSB0aGVuIHJlbGVhc2UKLSAgICogdGhlIHN1cGVycGFnZSwgaWYgbm90IGFkZCB0byB0aGUgc3VwZXIgcGFnZSdzIGZyZWUgbGlzdCBhbmQgaWYKLSAgICogYWxsIGNlbGxzIG9uIHRoZSBzdXBlcnBhZ2UgYXJlIGZyZWUsIHRoZW4gcmVsZWFzZSB0aGUKLSAgICogc3VwZXJwYWdlLgotICAgKgotICAgKiBAcGFyYW0gY2VsbCBUaGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgY2VsbCB0byBiZSBmcmVlZAotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgdm9pZCBmcmVlKEFkZHJlc3MgY2VsbCkgewotICAgIHJlbGVhc2UoZ2V0U3VwZXJQYWdlKGNlbGwpKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIFN1cGVycGFnZXMKLSAgICovCi0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IGludCBzdXBlclBhZ2VIZWFkZXJTaXplKCk7Ci0gIHByb3RlY3RlZCBhYnN0cmFjdCBpbnQgY2VsbEhlYWRlclNpemUoKTsKLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBzdXBlcnBhZ2UgZm9yIGEgZ2l2ZW4gY2VsbC4gIElmIHRoZSBjZWxsIGlzIGEgc21hbGwKLSAgICogY2VsbCB0aGVuIHRoaXMgaXMgZm91bmQgYnkgbWFza2luZyB0aGUgY2VsbCBhZGRyZXNzIHRvIGZpbmQgdGhlCi0gICAqIGNvbnRhaW5pbmcgcGFnZS4gIE90aGVyd2lzZSB0aGUgZmlyc3Qgd29yZCBvZiB0aGUgY2VsbCBjb250YWlucwotICAgKiB0aGUgYWRkcmVzcyBvZiB0aGUgcGFnZS4KLSAgICoKLSAgICogQHBhcmFtIGNlbGwgVGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHdvcmQgb2YgdGhlIGNlbGwgKGV4Y2x1c2l2ZQotICAgKiBvZiBhbnkgc3ViLWNsYXNzIHNwZWNpZmljIG1ldGFkYXRhKS4KLSAgICogQHJldHVybiBUaGUgYWRkcmVzcyBvZiB0aGUgZmlyc3Qgd29yZCBvZiB0aGUgc3VwZXJwYWdlIGNvbnRhaW5pbmcKLSAgICogICAgICAgICA8Y29kZT5jZWxsPC9jb2RlPi4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyBBZGRyZXNzIGdldFN1cGVyUGFnZShBZGRyZXNzIGNlbGwpIHsKLSAgICByZXR1cm4gY2VsbC50b1dvcmQoKS5hbmQoUEFHRV9NQVNLKS50b0FkZHJlc3MoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIHN1cGVyIHBhZ2UKLSAgICoKLSAgICogQHBhcmFtIGZpcnN0IHRoZSBBZGRyZXNzIG9mIHRoZSBmaXJzdCB3b3JkIGluIHRoZSBzdXBlcnBhZ2UKLSAgICogQHJldHVybiB0aGUgc2l6ZSBpbiBieXRlcwotICAgKi8KLSAgcHVibGljIEV4dGVudCBnZXRTaXplKEFkZHJlc3MgZmlyc3QpIHsKLSAgICByZXR1cm4gKChGcmVlTGlzdFBhZ2VSZXNvdXJjZSkgcHIpLmdldFNpemUoZmlyc3QpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BvbGljeS9Db3B5TG9jYWwuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L0NvcHlMb2NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGJjNjllLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L0NvcHlMb2NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBvbGljeTsKLQotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuYWxsb2MuQnVtcFBvaW50ZXI7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdW5zeW5jaHJvbml6ZWQgKGxvY2FsKSBlbGVtZW50cyBvZiBhCi0gKiBjb3B5aW5nIGNvbGxlY3Rvci4gQWxsb2NhdGlvbiBpcyB2aWEgdGhlIGJ1bXAgcG9pbnRlcgotICogKEBzZWUgQnVtcFBvaW50ZXIpLgotICoKLSAqIEBzZWUgQnVtcFBvaW50ZXIKLSAqIEBzZWUgQ29weVNwYWNlCi0gKi8KLUBVbmludGVycnVwdGlibGUgcHVibGljIGZpbmFsIGNsYXNzIENvcHlMb2NhbCBleHRlbmRzIEJ1bXBQb2ludGVyIHsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIHNwYWNlIFRoZSBzcGFjZSB0byBidW1wIHBvaW50IGludG8uCi0gICAqLwotICBwdWJsaWMgQ29weUxvY2FsKENvcHlTcGFjZSBzcGFjZSkgewotICAgIHN1cGVyKHNwYWNlLCB0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIENvcHlMb2NhbCgpIHsKLSAgICBzdXBlcihudWxsLCB0cnVlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvQ29weVNwYWNlLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BvbGljeS9Db3B5U3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI1NDQ1Ni4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BvbGljeS9Db3B5U3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucG9saWN5OwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5UcmFuc2l0aXZlQ2xvc3VyZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmhlYXAuKjsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnMuT3B0aW9uczsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkNvbnN0YW50czsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkZvcndhcmRpbmdXb3JkOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuTG9nOwotCi1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRyYWNpbmcgZnVuY3Rpb25hbGl0eSBmb3IgYSBzaW1wbGUgY29weWluZwotICogc3BhY2UuICBTaW5jZSBubyBzdGF0ZSBuZWVkcyB0byBiZSBoZWxkIGdsb2JhbGx5IG9yIGxvY2FsbHksIGFsbAotICogbWV0aG9kcyBhcmUgc3RhdGljLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlIHB1YmxpYyBmaW5hbCBjbGFzcyBDb3B5U3BhY2UgZXh0ZW5kcyBTcGFjZQotICBpbXBsZW1lbnRzIENvbnN0YW50cyB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQ2xhc3MgdmFyaWFibGVzCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTF9HQ19CSVRTX1JFUVVJUkVEID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xPQkFMX0dDX0JJVFNfUkVRVUlSRUQgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHQ19IRUFERVJfV09SRFNfUkVRVUlSRUQgPSAwOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVRBX0RBVEFfUEFHRVNfUEVSX1JFR0lPTiA9IENBUkRfTUVUQV9QQUdFU19QRVJfUkVHSU9OOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5zdGFuY2UgdmFyaWFibGVzCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gZnJvbVNwYWNlID0gdHJ1ZTsKLQotICBwdWJsaWMgYm9vbGVhbiBpc0Zyb21TcGFjZSgpIHsKLSAgICByZXR1cm4gZnJvbVNwYWNlOwotICB9Ci0KLSAgLyoqIGZyb21TcGFjZSBDb3B5U3BhY2UgY2FuIGFsd2F5cyBtb3ZlLCB0b1NwYWNlIHdpbGwgbm90IG1vdmUgZHVyaW5nIGN1cnJlbnQgR0MgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGlzTW92YWJsZSgpIHsKLSAgICByZXR1cm4gZnJvbVNwYWNlOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5pdGlhbGl6YXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFRoZSBjYWxsZXIgc3BlY2lmaWVzIHRoZSByZWdpb24gb2YgdmlydHVhbCBtZW1vcnkgdG8gYmUgdXNlZCBmb3IKLSAgICogdGhpcyBzcGFjZS4gIElmIHRoaXMgcmVnaW9uIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIHNwYWNlLAotICAgKiB0aGVuIHRoZSBjb25zdHJ1Y3RvciB3aWxsIGZhaWwuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoaXMgc3BhY2UgKHVzZWQgd2hlbiBwcmludGluZyBlcnJvciBtZXNzYWdlcyBldGMpCi0gICAqIEBwYXJhbSBwYWdlQnVkZ2V0IFRoZSBudW1iZXIgb2YgcGFnZXMgdGhpcyBzcGFjZSBtYXkgY29uc3VtZQotICAgKiBiZWZvcmUgY29uc3VsdGluZyB0aGUgcGxhbgotICAgKiBAcGFyYW0gZnJvbVNwYWNlIFRoZSBkb2VzIHRoaXMgaW5zdGFuY2Ugc3RhcnQgbGlmZSBhcyBmcm9tLXNwYWNlCi0gICAqIChvciB0by1zcGFjZSk/Ci0gICAqIEBwYXJhbSB2bVJlcXVlc3QgQW4gb2JqZWN0IGRlc2NyaWJpbmcgdGhlIHZpcnR1YWwgbWVtb3J5IHJlcXVlc3RlZC4KLSAgICovCi0gIHB1YmxpYyBDb3B5U3BhY2UoU3RyaW5nIG5hbWUsIGludCBwYWdlQnVkZ2V0LCBib29sZWFuIGZyb21TcGFjZSwgVk1SZXF1ZXN0IHZtUmVxdWVzdCkgewotICAgIHN1cGVyKG5hbWUsIHRydWUsIGZhbHNlLCB2bVJlcXVlc3QpOwotICAgIHRoaXMuZnJvbVNwYWNlID0gZnJvbVNwYWNlOwotICAgIGlmICh2bVJlcXVlc3QuaXNEaXNjb250aWd1b3VzKCkpIHsKLSAgICAgIHByID0gbmV3IE1vbm90b25lUGFnZVJlc291cmNlKHBhZ2VCdWRnZXQsIHRoaXMsIE1FVEFfREFUQV9QQUdFU19QRVJfUkVHSU9OKTsKLSAgICB9IGVsc2UgewotICAgICAgcHIgPSBuZXcgTW9ub3RvbmVQYWdlUmVzb3VyY2UocGFnZUJ1ZGdldCwgdGhpcywgc3RhcnQsIGV4dGVudCwgTUVUQV9EQVRBX1BBR0VTX1BFUl9SRUdJT04pOwotICAgIH0KLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIFByZXBhcmUgYW5kIHJlbGVhc2UKLSAgICovCi0KLSAgLyoqCi0gICAqIFByZXBhcmUgdGhpcyBzcGFjZSBpbnN0YW5jZSBmb3IgYSBjb2xsZWN0aW9uLiAgU2V0IHRoZQotICAgKiAiZnJvbVNwYWNlIiBmaWVsZCBhY2NvcmRpbmcgdG8gd2hldGhlciB0aGlzIHNwYWNlIGlzIHRoZQotICAgKiBzb3VyY2Ugb3IgdGFyZ2V0IG9mIHRoZSBjb2xsZWN0aW9uLgotICAgKgotICAgKiBAcGFyYW0gZnJvbVNwYWNlIFNldCB0aGUgZnJvbVNwYWNlIGZpZWxkIHRvIHRoaXMgdmFsdWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHByZXBhcmUoYm9vbGVhbiBmcm9tU3BhY2UpIHsgdGhpcy5mcm9tU3BhY2UgPSBmcm9tU3BhY2U7IH0KLQotICAvKioKLSAgICogUmVsZWFzZSB0aGlzIGNvcHkgc3BhY2UgYWZ0ZXIgYSBjb2xsZWN0aW9uLiAgVGhpcyBtZWFucyByZWxlYXNpbmcKLSAgICogYWxsIHBhZ2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIChub3cgZW1wdHkpIHNwYWNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLSAgICAoKE1vbm90b25lUGFnZVJlc291cmNlKSBwcikucmVzZXQoKTsKLSAgICBoZWFkRGlzY29udGlndW91c1JlZ2lvbiA9IEFkZHJlc3MuemVybygpOwotICAgIGZyb21TcGFjZSA9IGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlbGVhc2UgYW4gYWxsb2NhdGVkIHBhZ2Ugb3IgcGFnZXMuICBJbiB0aGlzIGNhc2Ugd2UgZG8gbm90aGluZwotICAgKiBiZWNhdXNlIHdlIG9ubHkgcmVsZWFzZSBwYWdlcyBlbm1hc3NlLgotICAgKgotICAgKiBAcGFyYW0gc3RhcnQgVGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBwYWdlIG9yIHBhZ2VzCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyB2b2lkIHJlbGVhc2UoQWRkcmVzcyBzdGFydCkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykKLSAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChmYWxzZSk7IC8vIHRoaXMgcG9saWN5IG9ubHkgcmVsZWFzZXMgcGFnZXMgZW5tYXNzZQotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogVHJhY2luZyBhbmQgZm9yd2FyZGluZwotICAgKi8KLQotICAvKioKLSAgICogVHJhY2UgYW4gb2JqZWN0IHVuZGVyIGEgY29weWluZyBjb2xsZWN0aW9uIHBvbGljeS4KLSAgICoKLSAgICogV2UgdXNlIGEgdHJpLXN0YXRlIGFsZ29yaXRobSB0byBkZWFsIHdpdGggcmFjZXMgdG8gZm9yd2FyZAotICAgKiB0aGUgb2JqZWN0LiAgVGhlIHRyYWNlciBtdXN0IHdhaXQgaWYgdGhlIG9iamVjdCBpcyBjb25jdXJyZW50bHkKLSAgICogYmVpbmcgZm9yd2FyZGVkIGJ5IGFub3RoZXIgdGhyZWFkLgotICAgKgotICAgKiBJZiB0aGUgb2JqZWN0IGlzIGFscmVhZHkgZm9yd2FyZGVkLCB0aGUgY29weSBpcyByZXR1cm5lZC4KLSAgICogT3RoZXJ3aXNlLCB0aGUgb2JqZWN0IGlzIGZvcndhcmRlZCBhbmQgdGhlIGNvcHkgaXMgcmV0dXJuZWQuCi0gICAqCi0gICAqIEBwYXJhbSB0cmFjZSBUaGUgdHJhY2UgYmVpbmcgY29uZHVjdGVkLgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgZm9yd2FyZGVkLgotICAgKiBAcmV0dXJuIFRoZSBmb3J3YXJkZWQgb2JqZWN0LgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlIHRyYWNlT2JqZWN0KFRyYW5zaXRpdmVDbG9zdXJlIHRyYWNlLCBPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgVk0uYXNzZXJ0aW9ucy5mYWlsKCJDb3B5U3BhY2UudHJhY2VMb2NhbCBjYWxsZWQgd2l0aG91dCBhbGxvY2F0b3IiKTsKLSAgICByZXR1cm4gT2JqZWN0UmVmZXJlbmNlLm51bGxSZWZlcmVuY2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiBUcmFjZSBhbiBvYmplY3QgdW5kZXIgYSBjb3B5aW5nIGNvbGxlY3Rpb24gcG9saWN5LgotICAgKgotICAgKiBXZSB1c2UgYSB0cmktc3RhdGUgYWxnb3JpdGhtIHRvIGRlYWwgd2l0aCByYWNlcyB0byBmb3J3YXJkCi0gICAqIHRoZSBvYmplY3QuICBUaGUgdHJhY2VyIG11c3Qgd2FpdCBpZiB0aGUgb2JqZWN0IGlzIGNvbmN1cnJlbnRseQotICAgKiBiZWluZyBmb3J3YXJkZWQgYnkgYW5vdGhlciB0aHJlYWQuCi0gICAqCi0gICAqIElmIHRoZSBvYmplY3QgaXMgYWxyZWFkeSBmb3J3YXJkZWQsIHRoZSBjb3B5IGlzIHJldHVybmVkLgotICAgKiBPdGhlcndpc2UsIHRoZSBvYmplY3QgaXMgZm9yd2FyZGVkIGFuZCB0aGUgY29weSBpcyByZXR1cm5lZC4KLSAgICoKLSAgICogQHBhcmFtIHRyYWNlIFRoZSB0cmFjZSBiZWluZyBjb25kdWN0ZWQuCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBiZSBmb3J3YXJkZWQuCi0gICAqIEBwYXJhbSBhbGxvY2F0b3IgVGhlIGFsbG9jYXRvciB0byB1c2Ugd2hlbiBjb3B5aW5nLgotICAgKiBAcmV0dXJuIFRoZSBmb3J3YXJkZWQgb2JqZWN0LgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlIHRyYWNlT2JqZWN0KFRyYW5zaXRpdmVDbG9zdXJlIHRyYWNlLCBPYmplY3RSZWZlcmVuY2Ugb2JqZWN0LCBpbnQgYWxsb2NhdG9yKSB7Ci0gICAgLyogSWYgdGhlIG9iamVjdCBpbiBxdWVzdGlvbiBpcyBhbHJlYWR5IGluIHRvLXNwYWNlLCB0aGVuIGRvIG5vdGhpbmcgKi8KLSAgICBpZiAoIWZyb21TcGFjZSkgcmV0dXJuIG9iamVjdDsKLQotICAgIC8qIFRyeSB0byBmb3J3YXJkIHRoZSBvYmplY3QgKi8KLSAgICBXb3JkIGZvcndhcmRpbmdXb3JkID0gRm9yd2FyZGluZ1dvcmQuYXR0ZW1wdFRvRm9yd2FyZChvYmplY3QpOwotCi0gICAgaWYgKEZvcndhcmRpbmdXb3JkLnN0YXRlSXNGb3J3YXJkZWRPckJlaW5nRm9yd2FyZGVkKGZvcndhcmRpbmdXb3JkKSkgewotICAgICAgLyogU29tZWJvZHkgZWxzZSBnb3QgdG8gaXQgZmlyc3QuICovCi0KLSAgICAgIC8qIFdlIG11c3Qgd2FpdCAoc3BpbikgaWYgdGhlIG9iamVjdCBpcyBub3QgeWV0IGZ1bGx5IGZvcndhcmRlZCAqLwotICAgICAgd2hpbGUgKEZvcndhcmRpbmdXb3JkLnN0YXRlSXNCZWluZ0ZvcndhcmRlZChmb3J3YXJkaW5nV29yZCkpCi0gICAgICAgIGZvcndhcmRpbmdXb3JkID0gVk0ub2JqZWN0TW9kZWwucmVhZEF2YWlsYWJsZUJpdHNXb3JkKG9iamVjdCk7Ci0KLSAgICAgIC8qIE5vdyBleHRyYWN0IHRoZSBvYmplY3QgcmVmZXJlbmNlIGZyb20gdGhlIGZvcndhcmRpbmcgd29yZCBhbmQgcmV0dXJuIGl0ICovCi0gICAgICByZXR1cm4gRm9yd2FyZGluZ1dvcmQuZXh0cmFjdEZvcndhcmRpbmdQb2ludGVyKGZvcndhcmRpbmdXb3JkKTsKLSAgICB9IGVsc2UgewotICAgICAgLyogV2UgYXJlIHRoZSBkZXNpZ25hdGVkIGNvcGllciwgc28gZm9yd2FyZCBpdCBhbmQgZW5xdWV1ZSBpdCAqLwotICAgICAgT2JqZWN0UmVmZXJlbmNlIG5ld09iamVjdCA9IFZNLm9iamVjdE1vZGVsLmNvcHkob2JqZWN0LCBhbGxvY2F0b3IpOwotICAgICAgRm9yd2FyZGluZ1dvcmQuc2V0Rm9yd2FyZGluZ1BvaW50ZXIob2JqZWN0LCBuZXdPYmplY3QpOwotICAgICAgdHJhY2UucHJvY2Vzc05vZGUobmV3T2JqZWN0KTsgLy8gU2NhbiBpdCBsYXRlcgotCi0gICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMgJiYgT3B0aW9ucy52ZXJib3NlLmdldFZhbHVlKCkgPj0gOSkgewotICAgICAgICBMb2cud3JpdGUoIkNbIik7IExvZy53cml0ZShvYmplY3QpOyBMb2cud3JpdGUoIi8iKTsKLSAgICAgICAgTG9nLndyaXRlKGdldE5hbWUoKSk7IExvZy53cml0ZSgiXSAtPiAiKTsKLSAgICAgICAgTG9nLndyaXRlKG5ld09iamVjdCk7IExvZy53cml0ZSgiLyIpOwotICAgICAgICBMb2cud3JpdGUoU3BhY2UuZ2V0U3BhY2VGb3JPYmplY3QobmV3T2JqZWN0KS5nZXROYW1lKCkpOwotICAgICAgICBMb2cud3JpdGVsbigiXSIpOwotICAgICAgfQotICAgICAgcmV0dXJuIG5ld09iamVjdDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRydWUgaWYgdGhpcyBvYmplY3QgaXMgbGl2ZSBpbiB0aGlzIEdDCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCBpbiBxdWVzdGlvbgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBvYmplY3QgaXMgbGl2ZSBpbiB0aGlzIEdDIChoYXMgaXQgYmVlbiBmb3J3YXJkZWQ/KQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNMaXZlKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICByZXR1cm4gRm9yd2FyZGluZ1dvcmQuaXNGb3J3YXJkZWQob2JqZWN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBIYXMgdGhlIG9iamVjdCBpbiB0aGlzIHNwYWNlIGJlZW4gcmVhY2hlZCBkdXJpbmcgdGhlIGN1cnJlbnQgY29sbGVjdGlvbi4KLSAgICogVGhpcyBpcyB1c2VkIGZvciBHQyBUcmFjaW5nLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgcmVmZXJlbmNlLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9iamVjdCBpcyByZWFjaGFibGUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1JlYWNoYWJsZShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgcmV0dXJuICFmcm9tU3BhY2UgfHwgRm9yd2FyZGluZ1dvcmQuaXNGb3J3YXJkZWQob2JqZWN0KTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEhlYWRlciBtYW5pcHVsYXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYW55IHJlcXVpcmVkIHBvc3QtYWxsb2NhdGlvbiBpbml0aWFsaXphdGlvbgotICAgKgotICAgKiA8aT5Ob3RoaW5nIHRvIGJlIGRvbmUgaW4gdGhpcyBjYXNlPC9pPgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgcmVmIHRvIHRoZSBzdG9yYWdlIHRvIGJlIGluaXRpYWxpemVkCi0gICAqLwotICAgQElubGluZQotICAgcHVibGljIHZvaWQgcG9zdEFsbG9jKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHt9Ci0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L0V4cGxpY2l0RnJlZUxpc3RMb2NhbC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvRXhwbGljaXRGcmVlTGlzdExvY2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYWI4M2MuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvRXhwbGljaXRGcmVlTGlzdExvY2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucG9saWN5OwotCi1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5hbGxvYy5TZWdyZWdhdGVkRnJlZUxpc3RMb2NhbDsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkNvbnN0YW50czsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB1bnN5bmNocm9uaXplZCAobG9jYWwpIGVsZW1lbnRzIG9mIGFuCi0gKiBleHBsaWNpdHkgbWFuYWdlZCBjb2xsZWN0b3IuICBBbGxvY2F0aW9uIGlzIHZpYSB0aGUgc2VncmVnYXRlZCBmcmVlIGxpc3QKLSAqIChAc2VlIG9yZy5tbXRrLnV0aWxpdHkuYWxsb2MuU2VncmVnYXRlZEZyZWVMaXN0KS48cD4KLSAqCi0gKiBAc2VlIG9yZy5tbXRrLnV0aWxpdHkuYWxsb2MuU2VncmVnYXRlZEZyZWVMaXN0Ci0gKiBAc2VlIEV4cGxpY2l0RnJlZUxpc3RTcGFjZQotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgZmluYWwgY2xhc3MgRXhwbGljaXRGcmVlTGlzdExvY2FsIGV4dGVuZHMgU2VncmVnYXRlZEZyZWVMaXN0TG9jYWw8RXhwbGljaXRGcmVlTGlzdFNwYWNlPiBpbXBsZW1lbnRzIENvbnN0YW50cyB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQ2xhc3MgdmFyaWFibGVzCi0gICAqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluc3RhbmNlIHZhcmlhYmxlcwotICAgKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbml0aWFsaXphdGlvbgotICAgKi8KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIHNwYWNlIFRoZSByYyBzcGFjZSB0byB3aGljaCB0aGlzIGFsbG9jYXRvcgotICAgKiBpbnN0YW5jZXMgaXMgYm91bmQuCi0gICAqLwotICBwdWJsaWMgRXhwbGljaXRGcmVlTGlzdExvY2FsKEV4cGxpY2l0RnJlZUxpc3RTcGFjZSBzcGFjZSkgewotICAgIHN1cGVyKHNwYWNlKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEFsbG9jYXRpb24KLSAgICovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQ29sbGVjdGlvbgotICAgKi8KLQotICAvKioKLSAgICogUHJlcGFyZSBmb3IgYSBjb2xsZWN0aW9uLiBJZiBwYXJhbm9pZCwgcGVyZm9ybSBhIHNhbml0eSBjaGVjay4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHByZXBhcmUoKSB7Ci0gICAgZmx1c2goKTsKLSAgfQotCi0gIC8qKgotICAgKiBGaW5pc2ggdXAgYWZ0ZXIgYSBjb2xsZWN0aW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHt9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BvbGljeS9FeHBsaWNpdEZyZWVMaXN0U3BhY2UuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L0V4cGxpY2l0RnJlZUxpc3RTcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjM0NDdjLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L0V4cGxpY2l0RnJlZUxpc3RTcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wb2xpY3k7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYW5zaXRpdmVDbG9zdXJlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuaGVhcC4qOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotCi0vKioKLSAqIEVhY2ggaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBjb3JyZXNwb25kcyB0byBvbmUgKnNwYWNlKi4KLSAqIEVhY2ggb2YgdGhlIGluc3RhbmNlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyBtYXkgYmUgY2FsbGVkIGJ5IGFueQotICogdGhyZWFkIChpLmUuIHN5bmNocm9uaXphdGlvbiBtdXN0IGJlIGV4cGxpY2l0IGluIGFueSBpbnN0YW5jZSBvcgotICogY2xhc3MgbWV0aG9kKS4gIFRoaXMgY29udHJhc3RzIHdpdGggdGhlIE1hcmtTd2VlcExvY2FsLCB3aGVyZQotICogaW5zdGFuY2VzIGNvcnJlc3BvbmQgdG8gKnBsYW4qIGluc3RhbmNlcyBhbmQgdGhlcmVmb3JlIHRvIGtlcm5lbAotICogdGhyZWFkcy4gIFRodXMgdW5saWtlIHRoaXMgY2xhc3MsIHN5bmNocm9uaXphdGlvbiBpcyBub3QgbmVjZXNzYXJ5Ci0gKiBpbiB0aGUgaW5zdGFuY2UgbWV0aG9kcyBvZiBNYXJrU3dlZXBMb2NhbC4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGZpbmFsIGNsYXNzIEV4cGxpY2l0RnJlZUxpc3RTcGFjZSBleHRlbmRzIFNlZ3JlZ2F0ZWRGcmVlTGlzdFNwYWNlIGltcGxlbWVudHMgQ29uc3RhbnRzIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDbGFzcyB2YXJpYWJsZXMKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMX0dDX0JJVFNfUkVRVUlSRUQgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTE9CQUxfR0NfQklUU19SRVFVSVJFRCA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdDX0hFQURFUl9XT1JEU19SRVFVSVJFRCA9IDA7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5pdGlhbGl6YXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFRoZSBjYWxsZXIgc3BlY2lmaWVzIHRoZSByZWdpb24gb2YgdmlydHVhbCBtZW1vcnkgdG8gYmUgdXNlZCBmb3IKLSAgICogdGhpcyBzcGFjZS4gIElmIHRoaXMgcmVnaW9uIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIHNwYWNlLAotICAgKiB0aGVuIHRoZSBjb25zdHJ1Y3RvciB3aWxsIGZhaWwuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoaXMgc3BhY2UgKHVzZWQgd2hlbiBwcmludGluZyBlcnJvciBtZXNzYWdlcyBldGMpCi0gICAqIEBwYXJhbSBwYWdlQnVkZ2V0IFRoZSBudW1iZXIgb2YgcGFnZXMgdGhpcyBzcGFjZSBtYXkgY29uc3VtZQotICAgKiBiZWZvcmUgY29uc3VsdGluZyB0aGUgcGxhbgotICAgKiBAcGFyYW0gdm1SZXF1ZXN0IEFuIG9iamVjdCBkZXNjcmliaW5nIHRoZSB2aXJ0dWFsIG1lbW9yeSByZXF1ZXN0ZWQuCi0gICAqLwotICBwdWJsaWMgRXhwbGljaXRGcmVlTGlzdFNwYWNlKFN0cmluZyBuYW1lLCBpbnQgcGFnZUJ1ZGdldCwgVk1SZXF1ZXN0IHZtUmVxdWVzdCkgewotICAgIHN1cGVyKG5hbWUsIHBhZ2VCdWRnZXQsIDAsIHZtUmVxdWVzdCk7Ci0gIH0KLQotICAvKioKLSAgICogU2hvdWxkIFNlZ3JlZ2F0ZWRGcmVlTGlzdFNwYWNlIG1hbmFnZSBhIHNpZGUgYml0bWFwIHRvIGtlZXAgdHJhY2sgb2YgbGl2ZSBvYmplY3RzPwotICAgKi8KLSAgQElubGluZQotICBwcm90ZWN0ZWQgYm9vbGVhbiBtYWludGFpblNpZGVCaXRtYXAoKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogRG8gd2UgbmVlZCB0byBwcmVzZXJ2ZSBmcmVlIGxpc3RzIGFzIHdlIG1vdmUgYmxvY2tzIGFyb3VuZC4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJlc2VydmVGcmVlTGlzdCgpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDb2xsZWN0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBQcmVwYXJlIHRoZSBuZXh0IGJsb2NrIGluIHRoZSBmcmVlIGJsb2NrIGxpc3QgZm9yIHVzZSBieSB0aGUgZnJlZQotICAgKiBsaXN0IGFsbG9jYXRvci4gIEluIHRoZSBjYXNlIG9mIGxhenkgc3dlZXBpbmcgdGhpcyBpbnZvbHZlcwotICAgKiBzd2VlcGluZyB0aGUgYXZhaWxhYmxlIGNlbGxzLiAgPGI+VGhlIHN3ZWVwaW5nIG9wZXJhdGlvbiBtdXN0Ci0gICAqIGVuc3VyZSB0aGF0IGNlbGxzIGFyZSBwcmUtemVyb2VkPC9iPiwgYXMgdGhpcyBtZXRob2QgbXVzdCByZXR1cm4KLSAgICogcHJlLXplcm9lZCBjZWxscy4KLSAgICoKLSAgICogQHBhcmFtIGJsb2NrIFRoZSBibG9jayB0byBiZSBwcmVwYXJlZCBmb3IgdXNlCi0gICAqIEBwYXJhbSBzaXplQ2xhc3MgVGhlIHNpemUgY2xhc3Mgb2YgdGhlIGJsb2NrCi0gICAqIEByZXR1cm4gVGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHByZS16ZXJvZWQgY2VsbCBpbiB0aGUgZnJlZSBsaXN0Ci0gICAqIGZvciB0aGlzIGJsb2NrLCBvciB6ZXJvIGlmIHRoZXJlIGFyZSBubyBhdmFpbGFibGUgY2VsbHMuCi0gICAqLwotICBwcm90ZWN0ZWQgQWRkcmVzcyBhZHZhbmNlVG9CbG9jayhBZGRyZXNzIGJsb2NrLCBpbnQgc2l6ZUNsYXNzKSB7Ci0gICAgcmV0dXJuIG1ha2VGcmVlTGlzdChibG9jaywgc2l6ZUNsYXNzKTsKLSAgfQotCi0gIC8qKgotICAgKiBOb3RpZnkgdGhhdCBhIG5ldyBibG9jayBoYXMgYmVlbiBpbnN0YWxsZWQuIFRoaXMgaXMgdG8gZW5zdXJlIHRoYXQKLSAgICogYXBwcm9wcmlhdGUgY29sbGVjdGlvbiBzdGF0ZSBjYW4gYmUgaW5pdGlhbGl6ZWQgZm9yIHRoZSBibG9jawotICAgKgotICAgKiBAcGFyYW0gYmxvY2sgVGhlIG5ldyBibG9jawotICAgKiBAcGFyYW0gc2l6ZUNsYXNzIFRoZSBibG9jaydzIHNpemVjbGFzcy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIG5vdGlmeU5ld0Jsb2NrKEFkZHJlc3MgYmxvY2ssIGludCBzaXplQ2xhc3MpIHsKLSAgICBjbGVhckxpdmVCaXRzKGJsb2NrLCBzaXplQ2xhc3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZyZWUgYW4gb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgZnJlZWQuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyB2b2lkIGZyZWUoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGNsZWFyTGl2ZUJpdChvYmplY3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByZXBhcmUgZm9yIGEgbmV3IGNvbGxlY3Rpb24gaW5jcmVtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgcHJlcGFyZSgpIHsKLSAgICBmbHVzaEF2YWlsYWJsZUJsb2NrcygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEEgbmV3IGNvbGxlY3Rpb24gaW5jcmVtZW50IGhhcyBjb21wbGV0ZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotICAgIHN3ZWVwQ29uc3VtZWRCbG9ja3ModHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmVsZWFzZSBhbiBhbGxvY2F0ZWQgcGFnZSBvciBwYWdlcwotICAgKgotICAgKiBAcGFyYW0gc3RhcnQgVGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBwYWdlIG9yIHBhZ2VzCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyB2b2lkIHJlbGVhc2UoQWRkcmVzcyBzdGFydCkgewotICAgICgoRnJlZUxpc3RQYWdlUmVzb3VyY2UpIHByKS5yZWxlYXNlUGFnZXMoc3RhcnQpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogT2JqZWN0IHByb2Nlc3NpbmcgYW5kIHRyYWNpbmcKLSAgICovCi0KLSAgLyoqCi0gICAqIFRyYWNlIGEgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCB1bmRlciBhIG1hcmsgc3dlZXAgY29sbGVjdGlvbgotICAgKiBwb2xpY3kuICBJZiB0aGUgb2JqZWN0IGhlYWRlciBpcyBub3QgYWxyZWFkeSBtYXJrZWQsIG1hcmsgdGhlCi0gICAqIG9iamVjdCBpbiBlaXRoZXIgdGhlIGJpdG1hcCBvciBieSBtb3ZpbmcgaXQgb2ZmIHRoZSB0cmVhZG1pbGwsCi0gICAqIGFuZCBlbnF1ZXVlIHRoZSBvYmplY3QgZm9yIHN1YnNlcXVlbnQgcHJvY2Vzc2luZy4gVGhlIG9iamVjdCBpcwotICAgKiBtYXJrZWQgYXMgKGFuIGF0b21pYykgc2lkZS1lZmZlY3Qgb2YgY2hlY2tpbmcgd2hldGhlciBhbHJlYWR5Ci0gICAqIG1hcmtlZC4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIHRyYWNlZC4KLSAgICogQHJldHVybiBUaGUgb2JqZWN0ICh0aGVyZSBpcyBubyBvYmplY3QgZm9yd2FyZGluZyBpbiB0aGlzCi0gICAqIGNvbGxlY3Rvciwgc28gd2UgYWx3YXlzIHJldHVybiB0aGUgc2FtZSBvYmplY3Q6IHRoaXMgY291bGQgYmUgYQotICAgKiB2b2lkIG1ldGhvZCBidXQgZm9yIGNvbXBsaWFuY2UgdG8gYSBtb3JlIGdlbmVyYWwgaW50ZXJmYWNlKS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIE9iamVjdFJlZmVyZW5jZSB0cmFjZU9iamVjdChUcmFuc2l0aXZlQ2xvc3VyZSB0cmFjZSwgT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIHJldHVybiBvYmplY3Q7Ci0gIH0KLQotICAvKioKLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IGluIHF1ZXN0aW9uCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIG9iamVjdCBpcyBrbm93biB0byBiZSBsaXZlIChpLmUuIGl0IGlzIG1hcmtlZCkKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGJvb2xlYW4gaXNMaXZlKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICByZXR1cm4gbGl2ZUJpdFNldChvYmplY3QpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BvbGljeS9FeHBsaWNpdExhcmdlT2JqZWN0U3BhY2UuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L0V4cGxpY2l0TGFyZ2VPYmplY3RTcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzVkNDQ4Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L0V4cGxpY2l0TGFyZ2VPYmplY3RTcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wb2xpY3k7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYW5zaXRpdmVDbG9zdXJlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuaGVhcC5GcmVlTGlzdFBhZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmhlYXAuVk1SZXF1ZXN0OwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuRG91Ymx5TGlua2VkTGlzdDsKLQotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotCi0vKioKLSAqIEVhY2ggaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBjb3JyZXNwb25kcyB0byBvbmUgZXhwbGljaXRseSBtYW5hZ2VkCi0gKiBsYXJnZSBvYmplY3Qgc3BhY2UuCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBmaW5hbCBjbGFzcyBFeHBsaWNpdExhcmdlT2JqZWN0U3BhY2UgZXh0ZW5kcyBCYXNlTGFyZ2VPYmplY3RTcGFjZSB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5zdGFuY2UgdmFyaWFibGVzCi0gICAqLwotICBwcml2YXRlIGZpbmFsIERvdWJseUxpbmtlZExpc3QgY2VsbHM7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5pdGlhbGl6YXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFRoZSBjYWxsZXIgc3BlY2lmaWVzIHRoZSByZWdpb24gb2YgdmlydHVhbCBtZW1vcnkgdG8gYmUgdXNlZCBmb3IKLSAgICogdGhpcyBzcGFjZS4gIElmIHRoaXMgcmVnaW9uIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIHNwYWNlLAotICAgKiB0aGVuIHRoZSBjb25zdHJ1Y3RvciB3aWxsIGZhaWwuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoaXMgc3BhY2UgKHVzZWQgd2hlbiBwcmludGluZyBlcnJvciBtZXNzYWdlcyBldGMpCi0gICAqIEBwYXJhbSBwYWdlQnVkZ2V0IFRoZSBudW1iZXIgb2YgcGFnZXMgdGhpcyBzcGFjZSBtYXkgY29uc3VtZQotICAgKiBiZWZvcmUgY29uc3VsdGluZyB0aGUgcGxhbgotICAgKiBAcGFyYW0gdm1SZXF1ZXN0IEFuIG9iamVjdCBkZXNjcmliaW5nIHRoZSB2aXJ0dWFsIG1lbW9yeSByZXF1ZXN0ZWQuCi0gICAqLwotICBwdWJsaWMgRXhwbGljaXRMYXJnZU9iamVjdFNwYWNlKFN0cmluZyBuYW1lLCBpbnQgcGFnZUJ1ZGdldCwgVk1SZXF1ZXN0IHZtUmVxdWVzdCkgewotICAgIHN1cGVyKG5hbWUsIHBhZ2VCdWRnZXQsIHZtUmVxdWVzdCk7Ci0gICAgY2VsbHMgPSBuZXcgRG91Ymx5TGlua2VkTGlzdChMT0dfQllURVNfSU5fUEFHRSwgdHJ1ZSk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbGxlY3Rpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFByZXBhcmUgZm9yIGEgbmV3IGNvbGxlY3Rpb24gaW5jcmVtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgcHJlcGFyZSgpIHsKLSAgfQotCi0gIC8qKgotICAgKiBBIG5ldyBjb2xsZWN0aW9uIGluY3JlbWVudCBoYXMgY29tcGxldGVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLSAgfQotCi0gIC8qKgotICAgKiBSZWxlYXNlIGEgZ3JvdXAgb2YgcGFnZXMgdGhhdCB3ZXJlIGFsbG9jYXRlZCB0b2dldGhlci4KLSAgICoKLSAgICogQHBhcmFtIGZpcnN0IFRoZSBmaXJzdCBwYWdlIGluIHRoZSBncm91cCBvZiBwYWdlcyB0aGF0IHdlcmUKLSAgICogYWxsb2NhdGVkIHRvZ2V0aGVyLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgdm9pZCByZWxlYXNlKEFkZHJlc3MgZmlyc3QpIHsKLSAgICAoKEZyZWVMaXN0UGFnZVJlc291cmNlKSBwcikucmVsZWFzZVBhZ2VzKGZpcnN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIGFueSByZXF1aXJlZCBpbml0aWFsaXphdGlvbiBvZiB0aGUgR0MgcG9ydGlvbiBvZiB0aGUgaGVhZGVyLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgcmVmIHRvIHRoZSBzdG9yYWdlIHRvIGJlIGluaXRpYWxpemVkCi0gICAqIEBwYXJhbSBhbGxvYyBpcyB0aGlzIGluaXRpYWxpemF0aW9uIG9jY3VyaW5nIGR1ZSB0byAoaW5pdGlhbCkgYWxsb2NhdGlvbgotICAgKiAodHJ1ZSkgb3IgZHVlIHRvIGNvcHlpbmcgKGZhbHNlKT8KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZUhlYWRlcihPYmplY3RSZWZlcmVuY2Ugb2JqZWN0LCBib29sZWFuIGFsbG9jKSB7Ci0gICAgQWRkcmVzcyBjZWxsID0gVk0ub2JqZWN0TW9kZWwub2JqZWN0U3RhcnRSZWYob2JqZWN0KTsKLSAgICBjZWxscy5hZGQoRG91Ymx5TGlua2VkTGlzdC5taWRQYXlsb2FkVG9Ob2RlKGNlbGwpKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIE9iamVjdCBwcm9jZXNzaW5nIGFuZCB0cmFjaW5nCi0gICAqLwotCi0gIC8qKgotICAgKiBUcmFjZSBhIHJlZmVyZW5jZSB0byBhbiBvYmplY3QgdW5kZXIgYSBtYXJrIHN3ZWVwIGNvbGxlY3Rpb24KLSAgICogcG9saWN5LiAgSWYgdGhlIG9iamVjdCBoZWFkZXIgaXMgbm90IGFscmVhZHkgbWFya2VkLCBtYXJrIHRoZQotICAgKiBvYmplY3QgaW4gZWl0aGVyIHRoZSBiaXRtYXAgb3IgYnkgbW92aW5nIGl0IG9mZiB0aGUgdHJlYWRtaWxsLAotICAgKiBhbmQgZW5xdWV1ZSB0aGUgb2JqZWN0IGZvciBzdWJzZXF1ZW50IHByb2Nlc3NpbmcuIFRoZSBvYmplY3QgaXMKLSAgICogbWFya2VkIGFzIChhbiBhdG9taWMpIHNpZGUtZWZmZWN0IG9mIGNoZWNraW5nIHdoZXRoZXIgYWxyZWFkeQotICAgKiBtYXJrZWQuCi0gICAqCi0gICAqIEBwYXJhbSB0cmFjZSBUaGUgdHJhY2UgYmVpbmcgY29uZHVjdGVkLgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgdHJhY2VkLgotICAgKiBAcmV0dXJuIFRoZSBvYmplY3QgKHRoZXJlIGlzIG5vIG9iamVjdCBmb3J3YXJkaW5nIGluIHRoaXMKLSAgICogY29sbGVjdG9yLCBzbyB3ZSBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIG9iamVjdDogdGhpcyBjb3VsZCBiZSBhCi0gICAqIHZvaWQgbWV0aG9kIGJ1dCBmb3IgY29tcGxpYW5jZSB0byBhIG1vcmUgZ2VuZXJhbCBpbnRlcmZhY2UpLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlIHRyYWNlT2JqZWN0KFRyYW5zaXRpdmVDbG9zdXJlIHRyYWNlLCBPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgcmV0dXJuIG9iamVjdDsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgaW4gcXVlc3Rpb24KLSAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgb2JqZWN0IGlzIGtub3duIHRvIGJlIGxpdmUgKGkuZS4gaXQgaXMgbWFya2VkKQotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgYm9vbGVhbiBpc0xpdmUoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgcGVyLXN1cGVycGFnZSBoZWFkZXIgcmVxdWlyZWQgYnkgdGhpcwotICAgKiBzeXN0ZW0uICBJbiB0aGlzIGNhc2UgaXQgaXMganVzdCB0aGUgdW5kZXJseWluZyBzdXBlcnBhZ2UgaGVhZGVyCi0gICAqIHNpemUuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIHNpemUgb2YgdGhlIHBlci1zdXBlcnBhZ2UgaGVhZGVyIHJlcXVpcmVkIGJ5IHRoaXMKLSAgICogc3lzdGVtLgotICAgKi8KLSAgQElubGluZQotICBwcm90ZWN0ZWQgaW50IHN1cGVyUGFnZUhlYWRlclNpemUoKSB7Ci0gICAgcmV0dXJuIERvdWJseUxpbmtlZExpc3QuaGVhZGVyU2l6ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgcGVyLWNlbGwgaGVhZGVyIGZvciBjZWxscyBvZiBhIGdpdmVuIGNsYXNzCi0gICAqIHNpemUuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIHNpemUgb2YgdGhlIHBlci1jZWxsIGhlYWRlciBmb3IgY2VsbHMgb2YgYSBnaXZlbiBjbGFzcwotICAgKiBzaXplLgotICAgKi8KLSAgQElubGluZQotICBwcm90ZWN0ZWQgaW50IGNlbGxIZWFkZXJTaXplKCkgeyByZXR1cm4gMDsgfQotCi0gIC8qKgotICAgKiBTd2VlcCB0aHJvdWdoIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGlzIHNwYWNlLgotICAgKgotICAgKiBAcGFyYW0gc3dlZXBlciBUaGUgc3dlZXBlciBjYWxsYmFjayB0byB1c2UuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyB2b2lkIHN3ZWVwKFN3ZWVwZXIgc3dlZXBlcikgewotICAgIEFkZHJlc3MgY2VsbCA9IGNlbGxzLmdldEhlYWQoKTsKLSAgICB3aGlsZSAoIWNlbGwuaXNaZXJvKCkpIHsKLSAgICAgIEFkZHJlc3MgbmV4dCA9IGNlbGxzLmdldE5leHQoY2VsbCk7Ci0gICAgICBPYmplY3RSZWZlcmVuY2Ugb2JqID0gVk0ub2JqZWN0TW9kZWwuZ2V0T2JqZWN0RnJvbVN0YXJ0QWRkcmVzcyhjZWxsLnBsdXMoRG91Ymx5TGlua2VkTGlzdC5oZWFkZXJTaXplKCkpKTsKLSAgICAgIGlmIChzd2VlcGVyLnN3ZWVwTGFyZ2VPYmplY3Qob2JqKSkgewotICAgICAgICBmcmVlKG9iaik7Ci0gICAgICB9Ci0gICAgICBjZWxsID0gbmV4dDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogRnJlZSBhbiBvYmplY3QKLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIGZyZWVkLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgdm9pZCBmcmVlKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBBZGRyZXNzIGNlbGwgPSBnZXRTdXBlclBhZ2UoVk0ub2JqZWN0TW9kZWwucmVmVG9BZGRyZXNzKG9iamVjdCkpOwotICAgIGNlbGxzLnJlbW92ZShjZWxsKTsKLSAgICByZWxlYXNlKGNlbGwpOwotICB9Ci0KLSAgLyoqCi0gICAqIEEgY2FsbGJhY2sgdXNlZCB0byBwZXJmb3JtIHN3ZWVwaW5nIG9mIHRoZSBsYXJnZSBvYmplY3Qgc3BhY2UuCi0gICAqLwotICBAVW5pbnRlcnJ1cHRpYmxlCi0gIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgU3dlZXBlciB7Ci0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3dlZXBMYXJnZU9iamVjdChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvSW1tb3J0YWxMb2NhbC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvSW1tb3J0YWxMb2NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmRhZjU3Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L0ltbW9ydGFsTG9jYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wb2xpY3k7Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmFsbG9jLkJ1bXBQb2ludGVyOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHVuc3luY2hyb25pemVkIChsb2NhbCkgZWxlbWVudHMgb2YgYW4KLSAqIGltbW9ydGFsIHNwYWNlLiBBbGxvY2F0aW9uIGlzIHZpYSB0aGUgYnVtcCBwb2ludGVyCi0gKiAoQHNlZSBCdW1wUG9pbnRlcikuCi0gKgotICogQHNlZSBCdW1wUG9pbnRlcgotICogQHNlZSBJbW1vcnRhbFNwYWNlCi0gKi8KLUBVbmludGVycnVwdGlibGUgcHVibGljIGZpbmFsIGNsYXNzIEltbW9ydGFsTG9jYWwgZXh0ZW5kcyBCdW1wUG9pbnRlciB7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSBzcGFjZSBUaGUgc3BhY2UgdG8gYnVtcCBwb2ludCBpbnRvLgotICAgKi8KLSAgcHVibGljIEltbW9ydGFsTG9jYWwoSW1tb3J0YWxTcGFjZSBzcGFjZSkgewotICAgIHN1cGVyKHNwYWNlLCB0cnVlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvSW1tb3J0YWxTcGFjZS5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvSW1tb3J0YWxTcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWZjYTdiLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L0ltbW9ydGFsU3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucG9saWN5OwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5QbGFuOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhbnNpdGl2ZUNsb3N1cmU7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5oZWFwLk1vbm90b25lUGFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuaGVhcC5WTVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5IZWFkZXJCeXRlOwotCi1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRyYWNpbmcgZm9yIGEgc2ltcGxlIGltbW9ydGFsIGNvbGxlY3Rpb24KLSAqIHBvbGljeS4gIFVuZGVyIHRoaXMgcG9saWN5IGFsbCB0aGF0IGlzIHJlcXVpcmVkIGlzIGZvciB0aGUKLSAqICJjb2xsZWN0b3IiIHRvIHByb3BvZ2F0ZSBtYXJrcyBpbiBhIGxpdmVuZXNzIHRyYWNlLiAgSXQgZG9lcyBub3QKLSAqIGFjdHVhbGx5IGNvbGxlY3QuICBUaGlzIGNsYXNzIGRvZXMgbm90IGhvbGQgYW55IHN0YXRlLCBhbGwgbWV0aG9kcwotICogYXJlIHN0YXRpYy4KLSAqLwotQFVuaW50ZXJydXB0aWJsZSBwdWJsaWMgZmluYWwgY2xhc3MgSW1tb3J0YWxTcGFjZSBleHRlbmRzIFNwYWNlCi0gIGltcGxlbWVudHMgQ29uc3RhbnRzIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDbGFzcyB2YXJpYWJsZXMKLSAgICovCi0gIHN0YXRpYyBmaW5hbCBieXRlIEdDX01BUktfQklUX01BU0sgPSAxOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVUQV9EQVRBX1BBR0VTX1BFUl9SRUdJT04gPSBDQVJEX01FVEFfUEFHRVNfUEVSX1JFR0lPTjsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbnN0YW5jZSB2YXJpYWJsZXMKLSAgICovCi0gIHByaXZhdGUgYnl0ZSBtYXJrU3RhdGUgPSAwOyAvLyB3aGVuIEdDIG9mZiwgdGhlIGluaXRpYWxpemF0aW9uIHZhbHVlCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5pdGlhbGl6YXRpb24KLSAgICovCi0gIC8qKgotICAgKiBUaGUgY2FsbGVyIHNwZWNpZmllcyB0aGUgcmVnaW9uIG9mIHZpcnR1YWwgbWVtb3J5IHRvIGJlIHVzZWQgZm9yCi0gICAqIHRoaXMgc3BhY2UuICBJZiB0aGlzIHJlZ2lvbiBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyBzcGFjZSwKLSAgICogdGhlbiB0aGUgY29uc3RydWN0b3Igd2lsbCBmYWlsLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGlzIHNwYWNlICh1c2VkIHdoZW4gcHJpbnRpbmcgZXJyb3IgbWVzc2FnZXMgZXRjKQotICAgKiBAcGFyYW0gcGFnZUJ1ZGdldCBUaGUgbnVtYmVyIG9mIHBhZ2VzIHRoaXMgc3BhY2UgbWF5IGNvbnN1bWUKLSAgICogYmVmb3JlIGNvbnN1bHRpbmcgdGhlIHBsYW4KLSAgICogQHBhcmFtIHZtUmVxdWVzdCBBbiBvYmplY3QgZGVzY3JpYmluZyB0aGUgdmlydHVhbCBtZW1vcnkgcmVxdWVzdGVkLgotICAgKi8KLSAgcHVibGljIEltbW9ydGFsU3BhY2UoU3RyaW5nIG5hbWUsIGludCBwYWdlQnVkZ2V0LCBWTVJlcXVlc3Qgdm1SZXF1ZXN0KSB7Ci0gICAgc3VwZXIobmFtZSwgZmFsc2UsIHRydWUsIHZtUmVxdWVzdCk7Ci0gICAgaWYgKHZtUmVxdWVzdC5pc0Rpc2NvbnRpZ3VvdXMoKSkgewotICAgICAgcHIgPSBuZXcgTW9ub3RvbmVQYWdlUmVzb3VyY2UocGFnZUJ1ZGdldCwgdGhpcywgTUVUQV9EQVRBX1BBR0VTX1BFUl9SRUdJT04pOwotICAgIH0gZWxzZSB7Ci0gICAgICBwciA9IG5ldyBNb25vdG9uZVBhZ2VSZXNvdXJjZShwYWdlQnVkZ2V0LCB0aGlzLCBzdGFydCwgZXh0ZW50LCBNRVRBX0RBVEFfUEFHRVNfUEVSX1JFR0lPTik7Ci0gICAgfQotICB9Ci0KLSAgLyoqIEByZXR1cm4gdGhlIGN1cnJlbnQgbWFyayBzdGF0ZSAqLwotICBASW5saW5lCi0gIHB1YmxpYyBXb3JkIGdldE1hcmtTdGF0ZSgpIHsgcmV0dXJuIFdvcmQuZnJvbUludFplcm9FeHRlbmQobWFya1N0YXRlKTsgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIE9iamVjdCBoZWFkZXIgbWFuaXB1bGF0aW9ucwotICAgKi8KLQotICAvKioKLSAgICogSW5pdGlhbGl6ZSB0aGUgb2JqZWN0IGhlYWRlciBwb3N0LWFsbG9jYXRpb24uICBXZSBuZWVkIHRvIHNldCB0aGUgbWFyayBzdGF0ZQotICAgKiBjb3JyZWN0bHkgYW5kIHNldCB0aGUgbG9nZ2VkIGJpdCBpZiBuZWNlc3NhcnkuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG5ld2x5IGFsbG9jYXRlZCBvYmplY3QgaW5zdGFuY2Ugd2hvc2UgaGVhZGVyIHdlIGFyZSBpbml0aWFsaXppbmcKLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXRpYWxpemVIZWFkZXIoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGJ5dGUgb2xkVmFsdWUgPSBWTS5vYmplY3RNb2RlbC5yZWFkQXZhaWxhYmxlQnl0ZShvYmplY3QpOwotICAgIGJ5dGUgbmV3VmFsdWUgPSAoYnl0ZSkgKChvbGRWYWx1ZSAmIEdDX01BUktfQklUX01BU0spIHwgbWFya1N0YXRlKTsKLSAgICBpZiAoSGVhZGVyQnl0ZS5ORUVEU19VTkxPR0dFRF9CSVQpIG5ld1ZhbHVlIHw9IEhlYWRlckJ5dGUuVU5MT0dHRURfQklUOwotICAgIFZNLm9iamVjdE1vZGVsLndyaXRlQXZhaWxhYmxlQnl0ZShvYmplY3QsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBVc2VkIHRvIG1hcmsgYm9vdCBpbWFnZSBvYmplY3RzIGR1cmluZyBhIHBhcmFsbGVsIHNjYW4gb2Ygb2JqZWN0cyBkdXJpbmcgR0MKLSAgICogUmV0dXJucyB0cnVlIGlmIG1hcmtpbmcgd2FzIGRvbmUuCi0gICAqLwotICBASW5saW5lCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdGVzdEFuZE1hcmsoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCwgYnl0ZSB2YWx1ZSkgewotICAgIFdvcmQgb2xkVmFsdWU7Ci0gICAgZG8gewotICAgICAgb2xkVmFsdWUgPSBWTS5vYmplY3RNb2RlbC5wcmVwYXJlQXZhaWxhYmxlQml0cyhvYmplY3QpOwotICAgICAgYnl0ZSBtYXJrQml0ID0gKGJ5dGUpIChvbGRWYWx1ZS50b0ludCgpICYgR0NfTUFSS19CSVRfTUFTSyk7Ci0gICAgICBpZiAobWFya0JpdCA9PSB2YWx1ZSkgcmV0dXJuIGZhbHNlOwotICAgIH0gd2hpbGUgKCFWTS5vYmplY3RNb2RlbC5hdHRlbXB0QXZhaWxhYmxlQml0cyhvYmplY3QsIG9sZFZhbHVlLAotICAgICAgICBvbGRWYWx1ZS54b3IoV29yZC5mcm9tSW50WmVyb0V4dGVuZChHQ19NQVJLX0JJVF9NQVNLKSkpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBUcmFjZSBhIHJlZmVyZW5jZSB0byBhbiBvYmplY3QgdW5kZXIgYW4gaW1tb3J0YWwgY29sbGVjdGlvbgotICAgKiBwb2xpY3kuICBJZiB0aGUgb2JqZWN0IGlzIG5vdCBhbHJlYWR5IG1hcmtlZCwgZW5xdWV1ZSB0aGUgb2JqZWN0Ci0gICAqIGZvciBzdWJzZXF1ZW50IHByb2Nlc3NpbmcuIFRoZSBvYmplY3QgaXMgbWFya2VkIGFzIChhbiBhdG9taWMpCi0gICAqIHNpZGUtZWZmZWN0IG9mIGNoZWNraW5nIHdoZXRoZXIgYWxyZWFkeSBtYXJrZWQuCi0gICAqCi0gICAqIEBwYXJhbSB0cmFjZSBUaGUgdHJhY2UgYmVpbmcgY29uZHVjdGVkLgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgdHJhY2VkLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlIHRyYWNlT2JqZWN0KFRyYW5zaXRpdmVDbG9zdXJlIHRyYWNlLCBPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKHRlc3RBbmRNYXJrKG9iamVjdCwgbWFya1N0YXRlKSkKLSAgICAgIHRyYWNlLnByb2Nlc3NOb2RlKG9iamVjdCk7Ci0gICAgcmV0dXJuIG9iamVjdDsKLSAgfQotCi0gIC8qKgotICAgKiBQcmVwYXJlIGZvciBhIG5ldyBjb2xsZWN0aW9uIGluY3JlbWVudC4gIEZvciB0aGUgaW1tb3J0YWwKLSAgICogY29sbGVjdG9yIHdlIG11c3QgZmxpcCB0aGUgc3RhdGUgb2YgdGhlIG1hcmsgYml0IGJldHdlZW4KLSAgICogY29sbGVjdGlvbnMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBwcmVwYXJlKCkgewotICAgIG1hcmtTdGF0ZSA9IChieXRlKSAoR0NfTUFSS19CSVRfTUFTSyAtIG1hcmtTdGF0ZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWxlYXNlKCkge30KLQotICAvKioKLSAgICogUmVsZWFzZSBhbiBhbGxvY2F0ZWQgcGFnZSBvciBwYWdlcy4gIEluIHRoaXMgY2FzZSB3ZSBkbyBub3RoaW5nCi0gICAqIGJlY2F1c2Ugd2Ugb25seSByZWxlYXNlIHBhZ2VzIGVubWFzc2UuCi0gICAqCi0gICAqIEBwYXJhbSBzdGFydCBUaGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIHBhZ2Ugb3IgcGFnZXMKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHZvaWQgcmVsZWFzZShBZGRyZXNzIHN0YXJ0KSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKQotICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGZhbHNlKTsgLy8gdGhpcyBwb2xpY3kgb25seSByZWxlYXNlcyBwYWdlcyBlbm1hc3NlCi0gIH0KLQotICBASW5saW5lCi0gIHB1YmxpYyBib29sZWFuIGlzTGl2ZShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBpZiB0aGUgb2JqZWN0IGluIHF1ZXN0aW9uIGlzIGN1cnJlbnRseSB0aG91Z2h0IHRvIGJlIHJlYWNoYWJsZS4KLSAgICogVGhpcyBpcyBkb25lIGJ5IGNvbXBhcmluZyB0aGUgbWFyayBiaXQgdG8gdGhlIGN1cnJlbnQgbWFyayBzdGF0ZS4gRm9yIHRoZQotICAgKiBpbW1vcnRhbCBjb2xsZWN0b3IgcmVhY2hhYmxlIGFuZCBsaXZlIGFyZSBkaWZmZXJlbnQsIG1ha2luZyB0aGlzIG1ldGhvZAotICAgKiBuZWNlc3NhcnkuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIGFkZHJlc3Mgb2YgYW4gb2JqZWN0IGluIGltbW9ydGFsIHNwYWNlIHRvIHRlc3QKLSAgICogQHJldHVybiBUcnVlIGlmIDxjb2RlPnJlZjwvY29kZT4gbWF5IGJlIGEgcmVhY2hhYmxlIG9iamVjdCAoZS5nLiwgaGF2aW5nCi0gICAqICAgICAgICAgdGhlIGN1cnJlbnQgbWFyayBzdGF0ZSkuICBXaGlsZSBhbGwgaW1tb3J0YWwgb2JqZWN0cyBhcmUgbGl2ZSwKLSAgICogICAgICAgICBzb21lIG1heSBiZSB1bnJlYWNoYWJsZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUmVhY2hhYmxlKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAoUGxhbi5TQ0FOX0JPT1RfSU1BR0UgJiYgdGhpcyA9PSBQbGFuLnZtU3BhY2UpCi0gICAgICByZXR1cm4gdHJ1ZTsgIC8vIGlnbm9yZSBib290IGltYWdlICJyZWFjaGFiaWx0eSIgaWYgd2UncmUgbm90IHRyYWNpbmcgaXQKLSAgICBlbHNlCi0gICAgICByZXR1cm4gKFZNLm9iamVjdE1vZGVsLnJlYWRBdmFpbGFibGVCeXRlKG9iamVjdCkgJiBHQ19NQVJLX0JJVF9NQVNLKSA9PSBtYXJrU3RhdGU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L0xhcmdlT2JqZWN0TG9jYWwuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L0xhcmdlT2JqZWN0TG9jYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU3YTEzNi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BvbGljeS9MYXJnZU9iamVjdExvY2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBvbGljeTsKLQotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuYWxsb2MuTGFyZ2VPYmplY3RBbGxvY2F0b3I7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5nY3NweS5kcml2ZXJzLlRyZWFkbWlsbERyaXZlcjsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkNvbnN0YW50czsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIEVhY2ggaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBwcm92aWRlIGZhc3QsCi0gKiB1bnN5bmNocm9uaXplZCBhY2Nlc3MgdG8gYSB0cmVhZG1pbGwuICBUaGVyZWZvcmUgaW5zdGFuY2VzIG11c3Qgbm90Ci0gKiBiZSBzaGFyZWQgYWNyb3NzIHRydWVseSBjb25jdXJyZW50IHRocmVhZHMgKENQVXMpLiAgUmF0aGVyLCBvbmUgb3IKLSAqIG1vcmUgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGJvdW5kIHRvIGVhY2ggQ1BVLiAgVGhlCi0gKiBzaGFyZWQgVk1SZXNvdXJjZSB1c2VkIGJ5IGVhY2ggaW5zdGFuY2UgaXMgdGhlIHBvaW50IG9mIGdsb2JhbAotICogc3luY2hyb25pemF0aW9uLCBhbmQgc3luY2hyb25pemF0aW9uIG9ubHkgb2NjdXJzIGF0IHRoZSBncmFudWxhcml0eQotICogb2YgYXF1aXJpbmcgKGFuZCByZWxlYXNpbmcpIGNodW5rcyBvZiBtZW1vcnkgZnJvbSB0aGUgVk1SZXNvdXJjZS4KLSAqCi0gKiBJZiB0aGVyZSBhcmUgQyBDUFVzIGFuZCBUIFRyZWFkbWlsbFNwYWNlcywgdGhlcmUgbXVzdCBiZSBDIFggVAotICogaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MsIG9uZSBmb3IgZWFjaCBDUFUsIFRyZWFkbWlsbFNwYWNlIHBhaXIuCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBmaW5hbCBjbGFzcyBMYXJnZU9iamVjdExvY2FsIGV4dGVuZHMgTGFyZ2VPYmplY3RBbGxvY2F0b3IgaW1wbGVtZW50cyBDb25zdGFudHMgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENsYXNzIHZhcmlhYmxlcwotICAgKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbnN0YW5jZSB2YXJpYWJsZXMKLSAgICovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5pdGlhbGl6YXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSBzcGFjZSBUaGUgdHJlYWRtaWxsIHNwYWNlIHRvIHdoaWNoIHRoaXMgdGhyZWFkIGluc3RhbmNlIGlzCi0gICAqIGJvdW5kLgotICAgKi8KLSAgcHVibGljIExhcmdlT2JqZWN0TG9jYWwoQmFzZUxhcmdlT2JqZWN0U3BhY2Ugc3BhY2UpIHsKLSAgICBzdXBlcihzcGFjZSk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBBbGxvY2F0aW9uCi0gICAqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbGxlY3Rpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFByZXBhcmUgZm9yIGEgY29sbGVjdGlvbi4gIENsZWFyIHRoZSB0cmVhZG1pbGwgdG8tc3BhY2UgaGVhZCBhbmQKLSAgICogcHJlcGFyZSB0aGUgY29sbGVjdG9yLiAgSWYgcGFyYW5vaWQsIHBlcmZvcm0gYSBzYW5pdHkgY2hlY2suCi0gICAqLwotICBwdWJsaWMgdm9pZCBwcmVwYXJlKGJvb2xlYW4gZnVsbEhlYXApIHsKLSAgfQotCi0gIC8qKgotICAgKiBGaW5pc2ggdXAgYWZ0ZXIgYSBjb2xsZWN0aW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVsZWFzZShib29sZWFuIGZ1bGxIZWFwKSB7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBNaXNjZWxsYW5lb3VzIHNpemUtcmVsYXRlZCBtZXRob2RzCi0gICAqLwotCi0gIC8qKgotICAgKiBHYXRoZXIgZGF0YSBmb3IgR0NTcHkgZnJvbSB0aGUgbnVyc2VyeQotICAgKiBAcGFyYW0gZXZlbnQgdGhlIGdjIGV2ZW50Ci0gICAqIEBwYXJhbSBsb3NEcml2ZXIgdGhlIEdDU3B5IHNwYWNlIGRyaXZlcgotICAgKi8KLSAgcHVibGljIHZvaWQgZ2NzcHlHYXRoZXJEYXRhKGludCBldmVudCwgVHJlYWRtaWxsRHJpdmVyIGxvc0RyaXZlcikgewotICAgIC8vIFRPRE86IGFzc3VtZXMgc2luZ2xlIHRocmVhZGVkCi0gICAgLy8gVE9ETzogYXNzdW1lcyBub24tZXhwbGl0IExPUwotICAgICgoTGFyZ2VPYmplY3RTcGFjZSlzcGFjZSkuZ2V0VHJlYWRtaWxsKCkuZ2NzcHlHYXRoZXJEYXRhKGV2ZW50LCBsb3NEcml2ZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdhdGhlciBkYXRhIGZvciBHQ1NweSBmb3IgYW4gb2xkZXIgc3BhY2UKLSAgICogQHBhcmFtIGV2ZW50IHRoZSBnYyBldmVudAotICAgKiBAcGFyYW0gbG9zRHJpdmVyIHRoZSBHQ1NweSBzcGFjZSBkcml2ZXIKLSAgICogQHBhcmFtIHRvc3BhY2UgZ2F0aGVyIGZyb20gdG9zcGFjZT8KLSAgICovCi0gIHB1YmxpYyB2b2lkIGdjc3B5R2F0aGVyRGF0YShpbnQgZXZlbnQsIFRyZWFkbWlsbERyaXZlciBsb3NEcml2ZXIsIGJvb2xlYW4gdG9zcGFjZSkgewotICAgIC8vIFRPRE86IGFzc3VtZXMgc2luZ2xlIHRocmVhZGVkCi0gICAgKChMYXJnZU9iamVjdFNwYWNlKXNwYWNlKS5nZXRUcmVhZG1pbGwoKS5nY3NweUdhdGhlckRhdGEoZXZlbnQsIGxvc0RyaXZlciwgdG9zcGFjZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L0xhcmdlT2JqZWN0U3BhY2UuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L0xhcmdlT2JqZWN0U3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY1ODU0Yy4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BvbGljeS9MYXJnZU9iamVjdFNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBvbGljeTsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhbnNpdGl2ZUNsb3N1cmU7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5oZWFwLkZyZWVMaXN0UGFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuaGVhcC5WTVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5IZWFkZXJCeXRlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuVHJlYWRtaWxsOwotCi1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogRWFjaCBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGNvcnJlc3BvbmRzIHRvIG9uZSBleHBsaWNpdGx5IG1hbmFnZWQKLSAqIGxhcmdlIG9iamVjdCBzcGFjZS4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGZpbmFsIGNsYXNzIExhcmdlT2JqZWN0U3BhY2UgZXh0ZW5kcyBCYXNlTGFyZ2VPYmplY3RTcGFjZSB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQ2xhc3MgdmFyaWFibGVzCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTF9HQ19CSVRTX1JFUVVJUkVEID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xPQkFMX0dDX0JJVFNfUkVRVUlSRUQgPSAwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIE1BUktfQklUID0gICAgIDE7IC8vIC4uLjAxCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgTlVSU0VSWV9CSVQgPSAgMjsgLy8gLi4uMTAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBMT1NfQklUX01BU0sgPSAzOyAvLyAuLi4xMQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluc3RhbmNlIHZhcmlhYmxlcwotICAgKi8KLSAgcHJpdmF0ZSBieXRlIG1hcmtTdGF0ZTsKLSAgcHJpdmF0ZSBib29sZWFuIGluTnVyc2VyeUdDOwotICBwcml2YXRlIGZpbmFsIFRyZWFkbWlsbCB0cmVhZG1pbGw7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5pdGlhbGl6YXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFRoZSBjYWxsZXIgc3BlY2lmaWVzIHRoZSByZWdpb24gb2YgdmlydHVhbCBtZW1vcnkgdG8gYmUgdXNlZCBmb3IKLSAgICogdGhpcyBzcGFjZS4gIElmIHRoaXMgcmVnaW9uIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIHNwYWNlLAotICAgKiB0aGVuIHRoZSBjb25zdHJ1Y3RvciB3aWxsIGZhaWwuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoaXMgc3BhY2UgKHVzZWQgd2hlbiBwcmludGluZyBlcnJvciBtZXNzYWdlcyBldGMpCi0gICAqIEBwYXJhbSBwYWdlQnVkZ2V0IFRoZSBudW1iZXIgb2YgcGFnZXMgdGhpcyBzcGFjZSBtYXkgY29uc3VtZQotICAgKiBiZWZvcmUgY29uc3VsdGluZyB0aGUgcGxhbgotICAgKiBAcGFyYW0gdm1SZXF1ZXN0IEFuIG9iamVjdCBkZXNjcmliaW5nIHRoZSB2aXJ0dWFsIG1lbW9yeSByZXF1ZXN0ZWQuCi0gICAqLwotICBwdWJsaWMgTGFyZ2VPYmplY3RTcGFjZShTdHJpbmcgbmFtZSwgaW50IHBhZ2VCdWRnZXQsIFZNUmVxdWVzdCB2bVJlcXVlc3QpIHsKLSAgICBzdXBlcihuYW1lLCBwYWdlQnVkZ2V0LCB2bVJlcXVlc3QpOwotICAgIHRyZWFkbWlsbCA9IG5ldyBUcmVhZG1pbGwoTE9HX0JZVEVTX0lOX1BBR0UsIHRydWUpOwotICAgIG1hcmtTdGF0ZSA9IDA7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDb2xsZWN0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBQcmVwYXJlIGZvciBhIG5ldyBjb2xsZWN0aW9uIGluY3JlbWVudC4gIEZvciB0aGUgbWFyay1zd2VlcAotICAgKiBjb2xsZWN0b3Igd2UgbXVzdCBmbGlwIHRoZSBzdGF0ZSBvZiB0aGUgbWFyayBiaXQgYmV0d2VlbgotICAgKiBjb2xsZWN0aW9ucy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHByZXBhcmUoYm9vbGVhbiBmdWxsSGVhcCkgewotICAgIGlmIChmdWxsSGVhcCkgewotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSB7Ci0gICAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydCh0cmVhZG1pbGwuZnJvbVNwYWNlRW1wdHkoKSk7Ci0gICAgICB9Ci0gICAgICBtYXJrU3RhdGUgPSAoYnl0ZSkgKE1BUktfQklUIC0gbWFya1N0YXRlKTsKLSAgICB9Ci0gICAgdHJlYWRtaWxsLmZsaXAoZnVsbEhlYXApOwotICAgIGluTnVyc2VyeUdDID0gIWZ1bGxIZWFwOwotICB9Ci0KLSAgLyoqCi0gICAqIEEgbmV3IGNvbGxlY3Rpb24gaW5jcmVtZW50IGhhcyBjb21wbGV0ZWQuICBGb3IgdGhlIG1hcmstc3dlZXAKLSAgICogY29sbGVjdG9yIHRoaXMgbWVhbnMgd2UgY2FuIHBlcmZvcm0gdGhlIHN3ZWVwIHBoYXNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVsZWFzZShib29sZWFuIGZ1bGxIZWFwKSB7Ci0gICAgLy8gc3dlZXAgdGhlIGxhcmdlIG9iamVjdHMKLSAgICBzd2VlcExhcmdlUGFnZXModHJ1ZSk7ICAgICAgICAgICAgICAgIC8vIHN3ZWVwIHRoZSBudXJzZXJ5Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQodHJlYWRtaWxsLm51cnNlcnlFbXB0eSgpKTsKLSAgICBpZiAoZnVsbEhlYXApIHN3ZWVwTGFyZ2VQYWdlcyhmYWxzZSk7IC8vIHN3ZWVwIHRoZSBtYXR1cmUgc3BhY2UKLSAgfQotCi0gIC8qKgotICAgKiBTd2VlcCB0aHJvdWdoIHRoZSBsYXJnZSBwYWdlcywgcmVsZWFzaW5nIGFsbCBzdXBlcnBhZ2VzIG9uIHRoZQotICAgKiAiZnJvbSBzcGFjZSIgdHJlYWRtaWxsLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHN3ZWVwTGFyZ2VQYWdlcyhib29sZWFuIHN3ZWVwTnVyc2VyeSkgewotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBBZGRyZXNzIGNlbGwgPSBzd2VlcE51cnNlcnkgPyB0cmVhZG1pbGwucG9wTnVyc2VyeSgpIDogdHJlYWRtaWxsLnBvcCgpOwotICAgICAgaWYgKGNlbGwuaXNaZXJvKCkpIGJyZWFrOwotICAgICAgcmVsZWFzZShnZXRTdXBlclBhZ2UoY2VsbCkpOwotICAgIH0KLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChzd2VlcE51cnNlcnkgPyB0cmVhZG1pbGwubnVyc2VyeUVtcHR5KCkgOiB0cmVhZG1pbGwuZnJvbVNwYWNlRW1wdHkoKSk7Ci0gIH0KLQotICAvKioKLSAgICogUmVsZWFzZSBhIGdyb3VwIG9mIHBhZ2VzIHRoYXQgd2VyZSBhbGxvY2F0ZWQgdG9nZXRoZXIuCi0gICAqCi0gICAqIEBwYXJhbSBmaXJzdCBUaGUgZmlyc3QgcGFnZSBpbiB0aGUgZ3JvdXAgb2YgcGFnZXMgdGhhdCB3ZXJlCi0gICAqIGFsbG9jYXRlZCB0b2dldGhlci4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHZvaWQgcmVsZWFzZShBZGRyZXNzIGZpcnN0KSB7Ci0gICAgKChGcmVlTGlzdFBhZ2VSZXNvdXJjZSkgcHIpLnJlbGVhc2VQYWdlcyhmaXJzdCk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBPYmplY3QgcHJvY2Vzc2luZyBhbmQgdHJhY2luZwotICAgKi8KLQotICAvKioKLSAgICogVHJhY2UgYSByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IHVuZGVyIGEgbWFyayBzd2VlcCBjb2xsZWN0aW9uCi0gICAqIHBvbGljeS4gIElmIHRoZSBvYmplY3QgaGVhZGVyIGlzIG5vdCBhbHJlYWR5IG1hcmtlZCwgbWFyayB0aGUKLSAgICogb2JqZWN0IGluIGVpdGhlciB0aGUgYml0bWFwIG9yIGJ5IG1vdmluZyBpdCBvZmYgdGhlIHRyZWFkbWlsbCwKLSAgICogYW5kIGVucXVldWUgdGhlIG9iamVjdCBmb3Igc3Vic2VxdWVudCBwcm9jZXNzaW5nLiBUaGUgb2JqZWN0IGlzCi0gICAqIG1hcmtlZCBhcyAoYW4gYXRvbWljKSBzaWRlLWVmZmVjdCBvZiBjaGVja2luZyB3aGV0aGVyIGFscmVhZHkKLSAgICogbWFya2VkLgotICAgKgotICAgKiBAcGFyYW0gdHJhY2UgVGhlIHRyYWNlIGJlaW5nIGNvbmR1Y3RlZC4KLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIHRyYWNlZC4KLSAgICogQHJldHVybiBUaGUgb2JqZWN0ICh0aGVyZSBpcyBubyBvYmplY3QgZm9yd2FyZGluZyBpbiB0aGlzCi0gICAqIGNvbGxlY3Rvciwgc28gd2UgYWx3YXlzIHJldHVybiB0aGUgc2FtZSBvYmplY3Q6IHRoaXMgY291bGQgYmUgYQotICAgKiB2b2lkIG1ldGhvZCBidXQgZm9yIGNvbXBsaWFuY2UgdG8gYSBtb3JlIGdlbmVyYWwgaW50ZXJmYWNlKS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIE9iamVjdFJlZmVyZW5jZSB0cmFjZU9iamVjdChUcmFuc2l0aXZlQ2xvc3VyZSB0cmFjZSwgT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGJvb2xlYW4gbnVyc2VyeU9iamVjdCA9IGlzSW5OdXJzZXJ5KG9iamVjdCk7Ci0gICAgaWYgKCFpbk51cnNlcnlHQyB8fCBudXJzZXJ5T2JqZWN0KSB7Ci0gICAgICBpZiAodGVzdEFuZE1hcmsob2JqZWN0LCBtYXJrU3RhdGUpKSB7Ci0gICAgICAgIGludGVybmFsTWFya09iamVjdChvYmplY3QsIG51cnNlcnlPYmplY3QpOwotICAgICAgICB0cmFjZS5wcm9jZXNzTm9kZShvYmplY3QpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gb2JqZWN0OwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCBpbiBxdWVzdGlvbgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBvYmplY3QgaXMga25vd24gdG8gYmUgbGl2ZSAoaS5lLiBpdCBpcyBtYXJrZWQpCi0gICAqLwotICAgQElubGluZQotICAgcHVibGljIGJvb2xlYW4gaXNMaXZlKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICByZXR1cm4gdGVzdE1hcmtCaXQob2JqZWN0LCBtYXJrU3RhdGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFuIG9iamVjdCBoYXMgYmVlbiBtYXJrZWQgKGlkZW50aWZpZ2VkIGFzIGxpdmUpLiAgTGFyZ2Ugb2JqZWN0cwotICAgKiBhcmUgYWRkZWQgdG8gdGhlIHRvLXNwYWNlIHRyZWFkbWlsbCwgd2hpbGUgYWxsIG90aGVyIG9iamVjdHMgd2lsbAotICAgKiBoYXZlIGEgbWFyayBiaXQgc2V0IGluIHRoZSBzdXBlcnBhZ2UgaGVhZGVyLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3Qgd2hpY2ggaGFzIGJlZW4gbWFya2VkLgotICAgKi8KLSAgQElubGluZQotICBwcml2YXRlIHZvaWQgaW50ZXJuYWxNYXJrT2JqZWN0KE9iamVjdFJlZmVyZW5jZSBvYmplY3QsIGJvb2xlYW4gbnVyc2VyeU9iamVjdCkgewotCi0gICAgQWRkcmVzcyBjZWxsID0gVk0ub2JqZWN0TW9kZWwub2JqZWN0U3RhcnRSZWYob2JqZWN0KTsKLSAgICBBZGRyZXNzIG5vZGUgPSBUcmVhZG1pbGwubWlkUGF5bG9hZFRvTm9kZShjZWxsKTsKLSAgICB0cmVhZG1pbGwuY29weShub2RlLCBudXJzZXJ5T2JqZWN0KTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEhlYWRlciBtYW5pcHVsYXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYW55IHJlcXVpcmVkIGluaXRpYWxpemF0aW9uIG9mIHRoZSBHQyBwb3J0aW9uIG9mIHRoZSBoZWFkZXIuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCByZWYgdG8gdGhlIHN0b3JhZ2UgdG8gYmUgaW5pdGlhbGl6ZWQKLSAgICogQHBhcmFtIGFsbG9jIGlzIHRoaXMgaW5pdGlhbGl6YXRpb24gb2NjdXJpbmcgZHVlIHRvIChpbml0aWFsKSBhbGxvY2F0aW9uCi0gICAqICh0cnVlKSBvciBkdWUgdG8gY29weWluZyAoZmFsc2UpPwotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgdm9pZCBpbml0aWFsaXplSGVhZGVyKE9iamVjdFJlZmVyZW5jZSBvYmplY3QsIGJvb2xlYW4gYWxsb2MpIHsKLSAgICBieXRlIG9sZFZhbHVlID0gVk0ub2JqZWN0TW9kZWwucmVhZEF2YWlsYWJsZUJ5dGUob2JqZWN0KTsKLSAgICBieXRlIG5ld1ZhbHVlID0gKGJ5dGUpICgob2xkVmFsdWUgJiB+TE9TX0JJVF9NQVNLKSB8IG1hcmtTdGF0ZSk7Ci0gICAgaWYgKGFsbG9jKSBuZXdWYWx1ZSB8PSBOVVJTRVJZX0JJVDsKLSAgICBpZiAoSGVhZGVyQnl0ZS5ORUVEU19VTkxPR0dFRF9CSVQpIG5ld1ZhbHVlIHw9IEhlYWRlckJ5dGUuVU5MT0dHRURfQklUOwotICAgIFZNLm9iamVjdE1vZGVsLndyaXRlQXZhaWxhYmxlQnl0ZShvYmplY3QsIG5ld1ZhbHVlKTsKLSAgICBBZGRyZXNzIGNlbGwgPSBWTS5vYmplY3RNb2RlbC5vYmplY3RTdGFydFJlZihvYmplY3QpOwotICAgIHRyZWFkbWlsbC5hZGRUb1RyZWFkbWlsbChUcmVhZG1pbGwubWlkUGF5bG9hZFRvTm9kZShjZWxsKSwgYWxsb2MpOwotICB9Ci0KLSAgLyoqCi0gICAqIEF0b21pY2FsbHkgYXR0ZW1wdCB0byBzZXQgdGhlIG1hcmsgYml0IG9mIGFuIG9iamVjdC4gIFJldHVybiB0cnVlCi0gICAqIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIGlmIHRoZSBtYXJrIGJpdCB3YXMgYWxyZWFkeSBzZXQuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB3aG9zZSBtYXJrIGJpdCBpcyB0byBiZSB3cml0dGVuCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gd2hpY2ggdGhlIG1hcmsgYml0IHdpbGwgYmUgc2V0Ci0gICAqLwotICBASW5saW5lCi0gIHByaXZhdGUgYm9vbGVhbiB0ZXN0QW5kTWFyayhPYmplY3RSZWZlcmVuY2Ugb2JqZWN0LCBieXRlIHZhbHVlKSB7Ci0gICAgV29yZCBvbGRWYWx1ZTsKLSAgICBkbyB7Ci0gICAgICBvbGRWYWx1ZSA9IFZNLm9iamVjdE1vZGVsLnByZXBhcmVBdmFpbGFibGVCaXRzKG9iamVjdCk7Ci0gICAgICBieXRlIG1hcmtCaXQgPSAoYnl0ZSkgKG9sZFZhbHVlLnRvSW50KCkgJiAoaW5OdXJzZXJ5R0MgPyBMT1NfQklUX01BU0sgOiBNQVJLX0JJVCkpOwotICAgICAgaWYgKG1hcmtCaXQgPT0gdmFsdWUpIHJldHVybiBmYWxzZTsKLSAgICB9IHdoaWxlICghVk0ub2JqZWN0TW9kZWwuYXR0ZW1wdEF2YWlsYWJsZUJpdHMob2JqZWN0LCBvbGRWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkVmFsdWUuYW5kKFdvcmQuZnJvbUludFplcm9FeHRlbmQoTE9TX0JJVF9NQVNLKS5ub3QoKSkub3IoV29yZC5mcm9tSW50WmVyb0V4dGVuZCh2YWx1ZSkpKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRydWUgaWYgdGhlIG1hcmsgYml0IGZvciBhbiBvYmplY3QgaGFzIHRoZSBnaXZlbiB2YWx1ZS4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHdob3NlIG1hcmsgYml0IGlzIHRvIGJlIHRlc3RlZAotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIGFnYWluc3Qgd2hpY2ggdGhlIG1hcmsgYml0IHdpbGwgYmUgdGVzdGVkCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbWFyayBiaXQgZm9yIHRoZSBvYmplY3QgaGFzIHRoZSBnaXZlbiB2YWx1ZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSBib29sZWFuIHRlc3RNYXJrQml0KE9iamVjdFJlZmVyZW5jZSBvYmplY3QsIGJ5dGUgdmFsdWUpIHsKLSAgICByZXR1cm4gKGJ5dGUpIChWTS5vYmplY3RNb2RlbC5yZWFkQXZhaWxhYmxlQnl0ZShvYmplY3QpICYgTUFSS19CSVQpID09IHZhbHVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgaW4gdGhlIGxvZ2ljYWwgbnVyc2VyeQotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3Qgd2hvc2Ugc3RhdHVzIGlzIHRvIGJlIHRlc3RlZAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9iamVjdCBpcyBpbiB0aGUgbG9naWNhbCBudXJzZXJ5Ci0gICAqLwotICBASW5saW5lCi0gIHByaXZhdGUgYm9vbGVhbiBpc0luTnVyc2VyeShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgIHJldHVybiAoYnl0ZSkoVk0ub2JqZWN0TW9kZWwucmVhZEF2YWlsYWJsZUJ5dGUob2JqZWN0KSAmIE5VUlNFUllfQklUKSA9PSBOVVJTRVJZX0JJVDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIHBlci1zdXBlcnBhZ2UgaGVhZGVyIHJlcXVpcmVkIGJ5IHRoaXMKLSAgICogc3lzdGVtLiAgSW4gdGhpcyBjYXNlIGl0IGlzIGp1c3QgdGhlIHVuZGVybHlpbmcgc3VwZXJwYWdlIGhlYWRlcgotICAgKiBzaXplLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBzaXplIG9mIHRoZSBwZXItc3VwZXJwYWdlIGhlYWRlciByZXF1aXJlZCBieSB0aGlzCi0gICAqIHN5c3RlbS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHJvdGVjdGVkIGludCBzdXBlclBhZ2VIZWFkZXJTaXplKCkgewotICAgIHJldHVybiBUcmVhZG1pbGwuaGVhZGVyU2l6ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgcGVyLWNlbGwgaGVhZGVyIGZvciBjZWxscyBvZiBhIGdpdmVuIGNsYXNzCi0gICAqIHNpemUuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIHNpemUgb2YgdGhlIHBlci1jZWxsIGhlYWRlciBmb3IgY2VsbHMgb2YgYSBnaXZlbiBjbGFzcwotICAgKiBzaXplLgotICAgKi8KLSAgQElubGluZQotICBwcm90ZWN0ZWQgaW50IGNlbGxIZWFkZXJTaXplKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgdGhlIHRyZWFkbWlsbCB1c2VkIGJ5IHRoZSBsYXJnZSBvYmplY3Qgc3BhY2UuCi0gICAqCi0gICAqIE5vdGUgdGhhdCBpdCBkZXBlbmRzIG9uIHRoZSBzcGVjaWZpYyBsb2NhbCBpbiB1c2Ugd2hldGhlciB0aGlzCi0gICAqIGlzIGJlaW5nIHVzZWQuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIHRyZWFkbWlsbCBhc3NvY2lhdGVkIHdpdGggdGhpcyBsYXJnZSBvYmplY3Qgc3BhY2UuCi0gICAqLwotICBwdWJsaWMgVHJlYWRtaWxsIGdldFRyZWFkbWlsbCgpIHsKLSAgICByZXR1cm4gdGhpcy50cmVhZG1pbGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L01hcmtDb21wYWN0Q29sbGVjdG9yLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BvbGljeS9NYXJrQ29tcGFjdENvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTdmYzA4Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L01hcmtDb21wYWN0Q29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDQgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBvbGljeTsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4ubWFya2NvbXBhY3QuTUM7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Mb2c7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5hbGxvYy5BbGxvY2F0b3I7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5hbGxvYy5CdW1wUG9pbnRlcjsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuSW5saW5lOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS5VbmludGVycnVwdGlibGU7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC5BZGRyZXNzOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuRXh0ZW50OwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuT2JqZWN0UmVmZXJlbmNlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB1bnN5bmNocm9uaXplZCAobG9jYWwpIHBlci1jb2xsZWN0b3ItdGhyZWFkIGVsZW1lbnRzIG9mIGEKLSAqIHNsaWRpbmcgbWFyay1jb21wYWN0IGNvbGxlY3Rvci4KLSAqCi0gKiBTcGVjaWZpY2FsbHksIHRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIG1ldGhvZHMgdGhhdAotICogLSBDYWxjdWxhdGUgdGhlIGZvcndhcmRpbmcgcG9pbnRlcnMgZm9yIGhlYXAgb2JqZWN0cywgaW4gYSBsaW5lYXIgcGFzcyBvdmVyCi0gKiAgIChwYXJ0IG9mKSB0aGUgaGVhcAotICogLSBQZXJmb3JtcyB0aGUgY29tcGFjdGlvbiBwYXNzIG92ZXIgdGhlIGhlYXAuCi0gKgotICogRWFjaCBjb2xsZWN0b3IgdGhyZWFkIG1haW50YWlucyBhIHByaXZhdGUgbGlzdCBvZiB0aGUgcGFnZXMgdGhhdCBpdCBjb21wYWN0cy4KLSAqIElmIGl0IHJ1bnMgb3V0IG9mIHdvcmsgZHVyaW5nIHRoZSBjYWxjdWxhdGVGb3J3YXJkaW5nUG9pbnRlcnMgcGFzcywgaXQgcmVxdWVzdHMKLSAqIGEgbmV3IHJlZ2lvbiBmcm9tIHRoZSBnbG9iYWwgTWFya0NvbXBhY3RTcGFjZS4gIFJlZ2lvbnMgY29tcGFjdGVkIGJ5IGEgY29sbGVjdG9yCi0gKiByZW1haW4gbG9jYWwgdG8gdGhlIGNvbGxlY3Rvci4KLSAqCi0gKiBAc2VlIE1hcmtDb21wYWN0U3BhY2UKLSAqIEBzZWUgTWFya0NvbXBhY3RMb2NhbAotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgZmluYWwgY2xhc3MgTWFya0NvbXBhY3RDb2xsZWN0b3IgewotCi0gIHN0YXRpYyBmaW5hbCBib29sZWFuIFZFUkJPU0UgPSBmYWxzZTsKLQotICBzdGF0aWMgZmluYWwgYm9vbGVhbiBWRVJZX1ZFUkJPU0UgPSBWRVJCT1NFICYmIGZhbHNlOwotCi0gIHByaXZhdGUgZmluYWwgTWFya0NvbXBhY3RTcGFjZSBzcGFjZTsKLQotICAvKioKLSAgICogVGhpcyBjb2xsZWN0b3IncyB3b3JrIGxpc3QKLSAgICovCi0gIHByaXZhdGUgQWRkcmVzcyByZWdpb25zID0gQWRkcmVzcy56ZXJvKCk7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBGcm9tQ3Vyc29yIGZyb21DdXJzb3IgPSBuZXcgRnJvbUN1cnNvcigpOwotICBwcml2YXRlIGZpbmFsIFRvQ3Vyc29yIHRvQ3Vyc29yID0gbmV3IFRvQ3Vyc29yKCk7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSBzcGFjZSBUaGUgc3BhY2UgdG8gYnVtcCBwb2ludCBpbnRvLgotICAgKi8KLSAgcHVibGljIE1hcmtDb21wYWN0Q29sbGVjdG9yKE1hcmtDb21wYWN0U3BhY2Ugc3BhY2UpIHsKLSAgICB0aGlzLnNwYWNlID0gc3BhY2U7Ci0gIH0KLQotICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiAgICAgICAgICAgICAgICBDdXJzb3IgY2xhc3NlcwotICAgKgotICAgKi8KLQotICAvKioKLSAgICogQm90aCB0aGUgJ2NvbXBhY3QnIGFuZCAnY2FsY3VsYXRlJyBwaGFzZXMgY2FuIGJlIHRob3VnaHQgb2YgYXMgc3dlZXBpbmcKLSAgICogYSBwYWlyIG9mIGN1cnNvcnMgYWNyb3NzIGEgbGlua2VkIGxpc3Qgb2YgcmVnaW9ucy4gIEVhY2ggY3Vyc29yIHJlcXVpcmVzCi0gICAqIG1haW50YWluaW5nIHBvaW50ZXJzIHRvIHRoZSBjdXJyZW50IHJlZ2lvbiwgdGhlIGN1cnJlbnQgYWRkcmVzcyBhbmQgdGhlIGVuZCBvZgotICAgKiB0aGUgcmVnaW9uLiAgVGhlIHJlZ2lvbkN1cnNvciBjbGFzcyBtYWludGFpbnMgdGhlc2UgMyBwb2ludGVycywgd2hpbGUgdGhlCi0gICAqIHN1YmNsYXNzZXMgVG9DdXJzb3IgYW5kIEZyb21DdXJzb3IgcHJvdmlkZSBtZXRob2RzIHNwZWNpZmljIHRvIHRoZQotICAgKiByZWFkIGFuZCB3cml0ZSBwb2ludGVycy4KLSAgICovCi0gIEBVbmludGVycnVwdGlibGUKLSAgcHJpdmF0ZSBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgUmVnaW9uQ3Vyc29yIHsKLQotICAgIC8qKiBOYW1lIG9mIHRoZSBjdXJzb3IgLSBmb3IgZGVidWdnaW5nIG1lc3NhZ2VzICovCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjdXJyZW50IHJlZ2lvbiwgb3IgemVybyBpZiB0aGUgY3Vyc29yIGlzIGludmFsaWQgKGVnIGFmdGVyIGFkdmFuY2luZwotICAgICAqIHBhc3QgdGhlIGVuZCBvZiB0aGUgY3VycmVudCB3b3JrIGxpc3QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQWRkcmVzcyByZWdpb247Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbGltaXQgb2YgdGhlIGN1cnJlbnQgcmVnaW9uLiBXaGVuIHJlYWRpbmcgYSBwb3B1bGF0ZWQgcmVnaW9uLCB0aGlzIGlzIHRoZQotICAgICAqIGFkZHJlc3Mgb2YgdGhlIGxhc3QgdXNlZCBieXRlLiAgV2hlbiB3cml0aW5nIHRvIGEgZnJlc2ggcmVnaW9uLCB0aGlzIGlzIHRoZSBsYXN0Ci0gICAgICogYnl0ZSBpbiB0aGUgcmVnaW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBBZGRyZXNzIGxpbWl0OwotCi0gICAgLyoqIFRoZSBjdXJyZW50IGFkZHJlc3MgKi8KLSAgICBwcm90ZWN0ZWQgQWRkcmVzcyBjdXJzb3I7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcmVnaW9uIC0gZm9yIGRlYnVnZ2luZyBtZXNzYWdlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVnaW9uQ3Vyc29yKFN0cmluZyBuYW1lKSB7Ci0gICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhvb2sgdG8gYWxsb3cgc3ViY2xhc3NlcyB0byBpbml0aWFsaXplIHRoZSBjdXJzb3IgaW4gZGlmZmVyZW50IHdheXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVnaW9uIFRoZSByZWdpb24gdG8gYmUgcHJvY2Vzc2VkLgotICAgICAqLwotICAgIGFic3RyYWN0IHZvaWQgaW5pdChBZGRyZXNzIHJlZ2lvbik7Ci0KLSAgICAvKioKLSAgICAgKiBBc3NlcnQgdGhhdCB0aGUgY3Vyc29yIGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSByZWdpb24uICBDYWxscyB0byB0aGlzCi0gICAgICogbXVzdCBiZSBndWFyZGVkIGJ5IHtAY29kZSBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpfQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEN1cnNvckluQm91bmRzKCkgewotICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KCFyZWdpb24uaXNaZXJvKCkpOwotICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGN1cnNvci5HRShCdW1wUG9pbnRlci5nZXREYXRhU3RhcnQocmVnaW9uKSksCi0gICAgICAiQ3Vyc29yIGlzIGJlbG93IHN0YXJ0IG9mIHJlZ2lvbiIpOwotICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGN1cnNvci5MRShsaW1pdCksIkN1cnNvciBiZXlvbmQgZW5kIG9mIHJlZ2lvbiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluY3JlbWVudCB0aGUgY3Vyc29yLgotICAgICAqIEBwYXJhbSBzaXplIEJ5dGVzIHRvIGluY3JlbWVudCBieQotICAgICAqLwotICAgIHZvaWQgaW5jKGludCBzaXplKSB7Ci0gICAgICB0aGlzLmN1cnNvciA9IGN1cnNvci5wbHVzKHNpemUpOwotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBhc3NlcnRDdXJzb3JJbkJvdW5kcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluY3JlbWVudCB0aGUgY3Vyc29yIHRvIGEgc3BlY2lmaWMgYWRkcmVzcwotICAgICAqIEBwYXJhbSBjdXJzb3IgRGVzdGluYXRpb24gYWRkcmVzcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluY1RvKEFkZHJlc3MgY3Vyc29yKSB7Ci0gICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIGFzc2VydEN1cnNvckluQm91bmRzKCk7Ci0gICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChjdXJzb3IuR0UodGhpcy5jdXJzb3IpKTsKLSAgICAgIHRoaXMuY3Vyc29yID0gY3Vyc29yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBvdGhlciBPdGhlciByZWdpb24KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGN1cnNvciBwb2ludHMgdG8gdGhlIHNhbWUgcmVnaW9uIGFzIHtAY29kZSBvdGhlcn0KLSAgICAgKi8KLSAgICBib29sZWFuIHNhbWVSZWdpb24oUmVnaW9uQ3Vyc29yIG90aGVyKSB7Ci0gICAgICByZXR1cm4gcmVnaW9uLkVRKG90aGVyLmdldFJlZ2lvbigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2l6ZSBTaXplIGluIGJ5dGVzCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIHNpemV9IGJ5dGVzIGFyZSBhdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgcmVnaW9uCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0F2YWlsYWJsZShpbnQgc2l6ZSkgewotICAgICAgcmV0dXJuIGN1cnNvci5wbHVzKHNpemUpLkxFKGxpbWl0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IGN1cnNvcgotICAgICAqLwotICAgIHB1YmxpYyBBZGRyZXNzIGdldCgpIHsKLSAgICAgIHJldHVybiBjdXJzb3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgY3VycmVudCByZWdpb24gcG9pbnRlcgotICAgICAqLwotICAgIHB1YmxpYyBBZGRyZXNzIGdldFJlZ2lvbigpIHsKLSAgICAgIHJldHVybiByZWdpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgY3VycmVudCByZWdpb24gbGltaXQKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRkcmVzcyBnZXRMaW1pdCgpIHsKLSAgICAgIHJldHVybiBsaW1pdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb2xsb3cgdGhlIGxpbmtlZC1saXN0IG9mIHJlZ2lvbnMgdG8gdGhlIG5leHQgcmVnaW9uLgotICAgICAqLwotICAgIHZvaWQgYWR2YW5jZVRvTmV4dFJlZ2lvbigpIHsKLSAgICAgIEFkZHJlc3MgbmV4dFJlZ2lvbiA9IE1hcmtDb21wYWN0TG9jYWwuZ2V0TmV4dFJlZ2lvbihyZWdpb24pOwotICAgICAgaWYgKG5leHRSZWdpb24uaXNaZXJvKCkpIHsKLSAgICAgICAgcmVnaW9uID0gQWRkcmVzcy56ZXJvKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbml0KG5leHRSZWdpb24pOwotICAgICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIGFzc2VydEN1cnNvckluQm91bmRzKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgd2UgaGF2ZW4ndCBhZHZhbmNlZCBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgcmVnaW9uIGxpc3QKLSAgICAgKi8KLSAgICBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICByZXR1cm4gIXJlZ2lvbi5pc1plcm8oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcmVmIFRoZSBvYmplY3QgaW4gcXVlc3Rpb24KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb2JqZWN0J3Mgc3RhcnQgYWRkcmVzcyBpcyBpbiB0aGlzIHJlZ2lvbgotICAgICAqLwotICAgIEBJbmxpbmUKLSAgICBib29sZWFuIGlzSW5SZWdpb24oT2JqZWN0UmVmZXJlbmNlIHJlZikgewotICAgICAgQWRkcmVzcyBhZGRyID0gVk0ub2JqZWN0TW9kZWwucmVmVG9BZGRyZXNzKHJlZik7Ci0gICAgICByZXR1cm4gYWRkci5HRShCdW1wUG9pbnRlci5nZXREYXRhU3RhcnQocmVnaW9uKSkgJiYgYWRkci5MRShsaW1pdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgdGhlIGN1cnNvciAtIGZvciBkZWJ1Z2dpbmcKLSAgICAgKi8KLSAgICB2b2lkIHByaW50KCkgewotICAgICAgTG9nLndyaXRlKG5hbWUpOyBMb2cud3JpdGUoIiBjdXJzb3I6Iik7Ci0gICAgICBMb2cud3JpdGUoIiByZWdpb249Iik7IExvZy53cml0ZShyZWdpb24pOwotICAgICAgTG9nLndyaXRlKCIgbGltaXQ9Iik7IExvZy53cml0ZShsaW1pdCk7Ci0gICAgICBMb2cud3JpdGUoIiBjdXJzb3I9Iik7IExvZy53cml0ZShjdXJzb3IpOwotICAgICAgTG9nLndyaXRlbG4oKTsKLQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTdWJjbGFzcyBmb3IgdGhlIHJlYWQtb25seSBjdXJzb3IgdGhhdCBsZWFkcyB0aGUgc2NhbiBvZiByZWdpb25zLgotICAgKi8KLSAgQFVuaW50ZXJydXB0aWJsZQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBGcm9tQ3Vyc29yIGV4dGVuZHMgUmVnaW9uQ3Vyc29yIHsKLSAgICBwdWJsaWMgRnJvbUN1cnNvcigpIHsKLSAgICAgIHN1cGVyKCJmcm9tIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSB0aGUgY3Vyc29yIC0gdGhlIGxpbWl0IGlzIHRoZSBlbmQgb2YgdGhlIGFsbG9jYXRlZCBkYXRhCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgdm9pZCBpbml0KEFkZHJlc3MgcmVnaW9uKSB7Ci0gICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIEJ1bXBQb2ludGVyLmNoZWNrUmVnaW9uTWV0YWRhdGEocmVnaW9uKTsKLSAgICAgIHRoaXMucmVnaW9uID0gcmVnaW9uOwotICAgICAgdGhpcy5jdXJzb3IgPSBNYXJrQ29tcGFjdExvY2FsLmdldERhdGFTdGFydChyZWdpb24pOwotICAgICAgdGhpcy5saW1pdCA9IE1hcmtDb21wYWN0TG9jYWwuZ2V0RGF0YUVuZChyZWdpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkdmFuY2UgZnJvbSB0aGUgY3Vyc29yIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBvYmplY3QuCi0gICAgICogQHJldHVybiBUaGUgb2JqZWN0IHJlZmVyZW5jZSBvZiB0aGUgbmV4dCBvYmplY3QuCi0gICAgICovCi0gICAgQElubGluZQotICAgIE9iamVjdFJlZmVyZW5jZSBhZHZhbmNlVG9PYmplY3QoKSB7Ci0gICAgICBPYmplY3RSZWZlcmVuY2UgY3VycmVudCA9IFZNLm9iamVjdE1vZGVsLmdldE9iamVjdEZyb21TdGFydEFkZHJlc3MoY3Vyc29yKTsKLSAgICAgIGN1cnNvciA9IFZNLm9iamVjdE1vZGVsLm9iamVjdFN0YXJ0UmVmKGN1cnJlbnQpOwotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSB7Ci0gICAgICAgIEFkZHJlc3MgbG93Qm91bmQgPSBCdW1wUG9pbnRlci5nZXREYXRhU3RhcnQocmVnaW9uKTsKLSAgICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGN1cnNvci5HRShsb3dCb3VuZCkgJiYgY3Vyc29yLkxFKGxpbWl0KSwiQ3Vyc29yIG91dHNpZGUgcmVnaW9uIik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gY3VycmVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZHZhbmNlIHRoZSBjdXJzb3IgdG8gdGhlIGVuZCBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqIEByZXR1cm4gVGhlIG9iamVjdCByZWZlcmVuY2Ugb2YgdGhlIG5leHQgb2JqZWN0LgotICAgICAqLwotICAgIEBJbmxpbmUKLSAgICB2b2lkIGFkdmFuY2VUb09iamVjdEVuZChPYmplY3RSZWZlcmVuY2UgY3VycmVudCkgewotICAgICAgY3Vyc29yID0gVk0ub2JqZWN0TW9kZWwuZ2V0T2JqZWN0RW5kQWRkcmVzcyhjdXJyZW50KTsKLSAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgYXNzZXJ0Q3Vyc29ySW5Cb3VuZHMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZHZhbmNlIHRoZSBjdXJzb3IgZWl0aGVyIHRvIHRoZSBuZXh0IHJlZ2lvbiBpbiB0aGUgbGlzdCwKLSAgICAgKiBvciB0byBhIG5ldyByZWdpb24gYWxsb2NhdGVkIGZyb20gdGhlIGdsb2JhbCBsaXN0LgotICAgICAqIEBwYXJhbSBtCi0gICAgICovCi0gICAgdm9pZCBhZHZhbmNlVG9OZXh0Rm9yd2FyZGFibGVSZWdpb24oTWFya0NvbXBhY3RTcGFjZSBzcGFjZSkgewotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZ2V0KCkuRVEoZ2V0TGltaXQoKSkpOwotICAgICAgQWRkcmVzcyBuZXh0UmVnaW9uID0gQnVtcFBvaW50ZXIuZ2V0TmV4dFJlZ2lvbihyZWdpb24pOwotICAgICAgaWYgKG5leHRSZWdpb24uaXNaZXJvKCkpIHsKLSAgICAgICAgbmV4dFJlZ2lvbiA9IHNwYWNlLmdldE5leHRSZWdpb24oKTsKLSAgICAgICAgaWYgKG5leHRSZWdpb24uaXNaZXJvKCkpIHsKLSAgICAgICAgICByZWdpb24gPSBBZGRyZXNzLnplcm8oKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgTWFya0NvbXBhY3RMb2NhbC5zZXROZXh0UmVnaW9uKHJlZ2lvbixuZXh0UmVnaW9uKTsKLSAgICAgICAgTWFya0NvbXBhY3RMb2NhbC5jbGVhck5leHRSZWdpb24obmV4dFJlZ2lvbik7Ci0gICAgICB9Ci0gICAgICBpbml0KG5leHRSZWdpb24pOwotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBhc3NlcnRDdXJzb3JJbkJvdW5kcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE92ZXJyaWRlIHRoZSBzdXBlcmNsYXNzIHdpdGggYW4gYWRkaXRpb25hbCBhc3NlcnRpb24gLSB3ZSBvbmx5IGFkdmFuY2UKLSAgICAgKiB3aGVuIHdlIGhhdmUgcmVhZCB0byB0aGUgZW5kLCBhbmQgdGhlIGN1cnNvciBtdXN0IHBvaW50ICpwcmVjaXNlbHkqCi0gICAgICogdG8gdGhlIGxhc3QgYWxsb2NhdGVkIGJ5dGUgaW4gdGhlIHJlZ2lvbi4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICB2b2lkIGFkdmFuY2VUb05leHRSZWdpb24oKSB7Ci0gICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChnZXQoKS5FUShnZXRMaW1pdCgpKSk7Ci0gICAgICBzdXBlci5hZHZhbmNlVG9OZXh0UmVnaW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlcmUgYXJlIG1vcmUgb2JqZWN0cyBpbiB0aGlzIHJlZ2lvbgotICAgICAqLwotICAgIGJvb2xlYW4gaGFzTW9yZU9iamVjdHMoKSB7Ci0gICAgICByZXR1cm4gY3Vyc29yLkxUKGxpbWl0KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU3ViY2xhc3MgZm9yIHRoZSByZWFkLW9ubHkgY3Vyc29yIHRoYXQgZm9sbG93cyB0aGUgJ2Zyb20nIGN1cnNvciwKLSAgICogd3JpdGluZyBvciBjYWxjdWxhdGluZyB0aGUgcG9zaXRpb24gb2YgY29waWVkIG9iamVjdHMKLSAgICovCi0gIEBVbmludGVycnVwdGlibGUKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgVG9DdXJzb3IgZXh0ZW5kcyBSZWdpb25DdXJzb3IgewotICAgIHB1YmxpYyBUb0N1cnNvcigpIHsKLSAgICAgIHN1cGVyKCJ0byIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgdGhlIGN1cnNvciB0byBhIGdpdmVuIHJlZ2lvbi4gIFRoZSBsaW1pdCBpcyB0aGUgbGltaXQgb2YKLSAgICAgKiBhdmFpbGFibGUgc3BhY2UgaW4gdGhlIHJlZ2lvbi4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICB2b2lkIGluaXQoQWRkcmVzcyByZWdpb24pIHsKLSAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgQnVtcFBvaW50ZXIuY2hlY2tSZWdpb25NZXRhZGF0YShyZWdpb24pOwotICAgICAgdGhpcy5yZWdpb24gPSByZWdpb247Ci0gICAgICB0aGlzLmN1cnNvciA9IE1hcmtDb21wYWN0TG9jYWwuZ2V0RGF0YVN0YXJ0KHJlZ2lvbik7Ci0gICAgICB0aGlzLmxpbWl0ID0gTWFya0NvbXBhY3RMb2NhbC5nZXRSZWdpb25MaW1pdChyZWdpb24pOwotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBhc3NlcnRDdXJzb3JJbkJvdW5kcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZSB0aGUgbWV0YWRhdGEgb2YgdGhlIGN1cnJlbnQgcmVnaW9uIHdpdGggdGhlIGN1cnJlbnQgdmFsdWUKLSAgICAgKiBvZiB0aGUgY3Vyc29yLiAgWmVybyB0aGUgcmVnaW9uIGZyb20gaGVyZSB0byB0aGUgZW5kLgotICAgICAqLwotICAgIHZvaWQgZmluaXNoKCkgewotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBhc3NlcnRDdXJzb3JJbkJvdW5kcygpOwotICAgICAgRXh0ZW50IHplcm9CeXRlcyA9IGxpbWl0LmRpZmYoY3Vyc29yKS50b1dvcmQoKS50b0V4dGVudCgpOwotICAgICAgVk0ubWVtb3J5Lnplcm8oY3Vyc29yLCB6ZXJvQnl0ZXMpOwotICAgICAgTWFya0NvbXBhY3RMb2NhbC5zZXREYXRhRW5kKHJlZ2lvbiwgY3Vyc29yKTsKLSAgICAgIE1hcmtDb21wYWN0TG9jYWwuY2hlY2tSZWdpb25NZXRhZGF0YShyZWdpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlcm1pbmF0ZSB0aGUgbGlzdCBvZiByZWdpb25zIGhlcmUuCi0gICAgICogQHJldHVybiBUaGUgYWRkcmVzcyBvZiB0aGUgKG9sZCkgbmV4dCByZWdpb24gaW4gdGhlIGxpc3QuCi0gICAgICovCi0gICAgQWRkcmVzcyBzbmlwKCkgewotICAgICAgQWRkcmVzcyBuZXh0UmVnaW9uID0gQnVtcFBvaW50ZXIuZ2V0TmV4dFJlZ2lvbihyZWdpb24pOwotICAgICAgQnVtcFBvaW50ZXIuY2xlYXJOZXh0UmVnaW9uKHJlZ2lvbik7Ci0gICAgICBmaW5pc2goKTsKLSAgICAgIHJldHVybiBuZXh0UmVnaW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvcHkgYW4gb2JqZWN0IHRvIGFuIGFkZHJlc3Mgd2l0aGluIHRoaXMgY3Vyc29yJ3MgcmVnaW9uLgotICAgICAqIEBwYXJhbSBmcm9tIFRoZSBzb3VyY2Ugb2JqZWN0Ci0gICAgICogQHBhcmFtIHRvIFRoZSB0YXJnZXQgb2JqZWN0Ci0gICAgICovCi0gICAgQElubGluZQotICAgIHZvaWQgY29weShPYmplY3RSZWZlcmVuY2UgZnJvbSwgT2JqZWN0UmVmZXJlbmNlIHRvKSB7Ci0gICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIHsKLSAgICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KE1hcmtDb21wYWN0U3BhY2UuZ2V0Rm9yd2FyZGluZ1BvaW50ZXIoZnJvbSkudG9BZGRyZXNzKCkuRVEodG8udG9BZGRyZXNzKCkpKTsKLSAgICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGN1cnNvci5HVChyZWdpb24pICYmIGN1cnNvci5MRShsaW1pdCkpOwotICAgICAgfQotICAgICAgQWRkcmVzcyBzYXZlZEN1cnNvciA9IEFkZHJlc3MuemVybygpOwotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBzYXZlZEN1cnNvciA9IGN1cnNvcjsKLSAgICAgIGN1cnNvciA9IFZNLm9iamVjdE1vZGVsLmNvcHlUbyhmcm9tLCB0bywgY3Vyc29yKTsKLSAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgewotICAgICAgICBpZiAoY3Vyc29yLkxUKEJ1bXBQb2ludGVyLmdldERhdGFTdGFydChyZWdpb24pKSB8fCBjdXJzb3IuR1QobGltaXQpKSB7Ci0gICAgICAgICAgTG9nLndyaXRlKCJDb3B5IG9mICIpOyBMb2cud3JpdGUoZnJvbSk7Ci0gICAgICAgICAgTG9nLndyaXRlKCIgdG8gIik7IExvZy53cml0ZSh0byk7Ci0gICAgICAgICAgTG9nLndyaXRlKCIgcHV0cyBjdXJzb3IgYXQgIik7IExvZy53cml0ZShjdXJzb3IpOwotICAgICAgICAgIExvZy53cml0ZSgiICh3YXM6ICIpOyBMb2cud3JpdGUoc2F2ZWRDdXJzb3IpOwotICAgICAgICAgIExvZy53cml0ZWxuKCIpIik7Ci0gICAgICAgIH0KLSAgICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGN1cnNvci5HVChyZWdpb24pICYmIGN1cnNvci5MRShsaW1pdCkpOwotICAgICAgfQotICAgICAgTWFya0NvbXBhY3RTcGFjZS5zZXRGb3J3YXJkaW5nUG9pbnRlcih0bywgT2JqZWN0UmVmZXJlbmNlLm51bGxSZWZlcmVuY2UoKSk7Ci0gICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpCi0gICAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChWTS5vYmplY3RNb2RlbC5nZXRPYmplY3RFbmRBZGRyZXNzKHRvKS5MRShsaW1pdCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1vdmUgdG8gdGhlIG5leHQgcmVnaW9uLCB1cGRhdGluZyB0aGUgbWV0YWRhdGEgd2l0aCB0aGUgY3VycmVudCAnd3JpdGUnIHN0YXRlLgotICAgICAqLwotICAgIHZvaWQgZmluaXNoQW5kQWR2YW5jZVRvTmV4dFJlZ2lvbigpIHsKLSAgICAgIGZpbmlzaCgpOwotICAgICAgYWR2YW5jZVRvTmV4dFJlZ2lvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1vdmUgdG8gdGhlIG5leHQgcmVnaW9uLCBpbiByZWFkLW9ubHkgbW9kZS4gIEFkZCB0aGUgYXNzZXJ0aW9uIG9mIHZhbGlkaXR5LAotICAgICAqIHNpbmNlIHdlIHNob3VsZG4ndCBiZSBhYmxlIHRvIGZhbGwgb2ZmIHRoZSBlbmQgb2YgdGhlIGxpc3Qgd2hpbGUgd3JpdGluZy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICB2b2lkIGFkdmFuY2VUb05leHRSZWdpb24oKSB7Ci0gICAgICBzdXBlci5hZHZhbmNlVG9OZXh0UmVnaW9uKCk7Ci0gICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChpc1ZhbGlkKCkpOwotICAgIH0KLSAgfQotCi0gIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSBsaW5lYXIgc2NhbiB0aHJvdWdoIHRoZSBvYmplY3RzIGFsbG9jYXRlZCBieSB0aGlzIGJ1bXAgcG9pbnRlciwKLSAgICogY2FsY3VsYXRpbmcgd2hlcmUgZWFjaCBsaXZlIG9iamVjdCB3aWxsIGJlIHBvc3QgY29sbGVjdGlvbi4KLSAgICoKLSAgICogV2UgbWFpbnRhaW4gdHdvIGN1cnNvcnMsIHtAY29kZSBmcm9tQ3Vyc29yfSBhbmQge0Bjb2RlIHRvQ3Vyc29yfSwgYW5kIHNpbXVsYXRlCi0gICAqIGNvcHlpbmcgbGl2ZSBvYmplY3RzIGZyb20gdGhlIGZvcm1lciB0byB0aGUgbGF0dGVyLiAgSW5pdGlhbGx5LCB0aGUgY3Vyc29ycwotICAgKiBwb2ludCB0byB0aGUgZmlyc3QgcmVnaW9uIGluIHRoaXMgY29sbGVjdG9yJ3MgbG9jYWwgbGlzdCwgYW5kIGluY3JlbWVudCBpbgotICAgKiBsb2Nrc3RlcCB1bnRpbCB0aGUgZmlyc3QgZGVhZCBvYmplY3QgaXMgZW5jb3VudGVyZWQuICBBZnRlciB0aGF0LCB0aGUgdG8gY3Vyc29yCi0gICAqIHRyYWlscyB0aGUgZnJvbSBjdXJzb3IuCi0gICAqCi0gICAqIFRoZSBvdXRlciBsb29wIGFkdmFuY2VzIHRoZSAnZnJvbScgcG9pbnRlcgotICAgKi8KLSAgcHVibGljIHZvaWQgY2FsY3VsYXRlRm9yd2FyZGluZ1BvaW50ZXJzKCkgewotICAgIGlmIChyZWdpb25zLmlzWmVybygpKSB7Ci0gICAgICByZWdpb25zID0gc3BhY2UuZ2V0TmV4dFJlZ2lvbigpOwotICAgIH0KLQotICAgIGlmIChyZWdpb25zLmlzWmVybygpKQotICAgICAgcmV0dXJuOwotCi0gICAgZnJvbUN1cnNvci5pbml0KHJlZ2lvbnMpOwotICAgIHRvQ3Vyc29yLmluaXQocmVnaW9ucyk7Ci0KLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCh0cnVlKTsKLQotICAgIC8qIExvb3AgdGhyb3VnaCBhY3RpdmUgcmVnaW9ucyBvciB1bnRpbCB0aGUgbGFzdCByZWdpb24gKi8KLSAgICB3aGlsZSAoZnJvbUN1cnNvci5pc1ZhbGlkKCkpIHsKLSAgICAgIGlmIChWRVJCT1NFKSB7Ci0gICAgICAgIGZyb21DdXJzb3IucHJpbnQoKTsKLSAgICAgICAgdG9DdXJzb3IucHJpbnQoKTsKLSAgICAgIH0KLQotICAgICAgLyogTG9vcCB0aHJvdWdoIHRoZSBvYmplY3RzIGluIHRoZSBjdXJyZW50ICdmcm9tJyByZWdpb24gKi8KLSAgICAgIHdoaWxlIChmcm9tQ3Vyc29yLmhhc01vcmVPYmplY3RzKCkpIHsKLSAgICAgICAgT2JqZWN0UmVmZXJlbmNlIGN1cnJlbnQgPSBmcm9tQ3Vyc29yLmFkdmFuY2VUb09iamVjdCgpOwotICAgICAgICBmcm9tQ3Vyc29yLmFkdmFuY2VUb09iamVjdEVuZChjdXJyZW50KTsKLQotICAgICAgICBpZiAoTWFya0NvbXBhY3RTcGFjZS50b0JlQ29tcGFjdGVkKGN1cnJlbnQpKSB7Ci0gICAgICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoTWFya0NvbXBhY3RTcGFjZS5nZXRGb3J3YXJkaW5nUG9pbnRlcihjdXJyZW50KS5pc051bGwoKSk7Ci0KLSAgICAgICAgICAvLyBGYWtlIC0gYWxsb2NhdGUgaXQuCi0gICAgICAgICAgaW50IHNpemUgPSBWTS5vYmplY3RNb2RlbC5nZXRTaXplV2hlbkNvcGllZChjdXJyZW50KTsKLSAgICAgICAgICBpbnQgYWxpZ24gPSBWTS5vYmplY3RNb2RlbC5nZXRBbGlnbldoZW5Db3BpZWQoY3VycmVudCk7Ci0gICAgICAgICAgaW50IG9mZnNldCA9IFZNLm9iamVjdE1vZGVsLmdldEFsaWduT2Zmc2V0V2hlbkNvcGllZChjdXJyZW50KTsKLSAgICAgICAgICAvLyBNb3ZlIHRvIHRoZSAoYWxpZ25lZCkgc3RhcnQgb2YgdGhlIG5leHQgb2JqZWN0Ci0gICAgICAgICAgdG9DdXJzb3IuaW5jVG8oQWxsb2NhdG9yLmFsaWduQWxsb2NhdGlvbk5vRmlsbCh0b0N1cnNvci5nZXQoKSwgYWxpZ24sIG9mZnNldCkpOwotCi0gICAgICAgICAgLyoKLSAgICAgICAgICAgKiBJZiB3ZSdyZSBhbGxvY2F0aW5nIGludG8gc2VwYXJhdGUgcmVnaW9ucywgYW5kIHdlJ3ZlIGFsbG9jYXRlZCBiZXlvbmQgdGhlIGVuZCBvZiB0aGUKLSAgICAgICAgICAgKiBjdXJyZW50IHJlZ2lvbiwgYWR2YW5jZSB0byB0aGUgbmV4dCBvbmUuICBXZSBhbHdheXMgYWxsb2NhdGUgaW50byByZWdpb25zIHdlIGhhdmUKLSAgICAgICAgICAgKiBzY2FubmVkIGluIHRoaXMgY29sbGVjdG9yLgotICAgICAgICAgICAqLwotICAgICAgICAgIGlmICghdG9DdXJzb3Iuc2FtZVJlZ2lvbihmcm9tQ3Vyc29yKSAmJiAhdG9DdXJzb3IuaXNBdmFpbGFibGUoc2l6ZSkpIHsKLSAgICAgICAgICAgIC8vIFRoZSAndG8nIHBvaW50ZXIgYWx3YXlzIHRyYWlscyB0aGUgJ2Zyb20nIHBvaW50ZXIsIGd1YXJhbnRlZWluZyB0aGF0Ci0gICAgICAgICAgICAvLyB0aGVyZSdzIGEgbmV4dCByZWdpb24gdG8gYWR2YW5jZSB0by4KLSAgICAgICAgICAgIHRvQ3Vyc29yLmFkdmFuY2VUb05leHRSZWdpb24oKTsKLSAgICAgICAgICAgIHRvQ3Vyc29yLmluY1RvKEFsbG9jYXRvci5hbGlnbkFsbG9jYXRpb25Ob0ZpbGwodG9DdXJzb3IuZ2V0KCksIGFsaWduLCBvZmZzZXQpKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBPYmplY3RSZWZlcmVuY2UgdGFyZ2V0ID0gVk0ub2JqZWN0TW9kZWwuZ2V0UmVmZXJlbmNlV2hlbkNvcGllZFRvKGN1cnJlbnQsIHRvQ3Vyc29yLmdldCgpKTsKLSAgICAgICAgICBpZiAodG9DdXJzb3Iuc2FtZVJlZ2lvbihmcm9tQ3Vyc29yKSAmJiB0YXJnZXQudG9BZGRyZXNzKCkuR0UoY3VycmVudC50b0FkZHJlc3MoKSkpIHsKLSAgICAgICAgICAgIC8vIERvbid0IG1vdmUgdGhlIG9iamVjdC4KLSAgICAgICAgICAgIE1hcmtDb21wYWN0U3BhY2Uuc2V0Rm9yd2FyZGluZ1BvaW50ZXIoY3VycmVudCwgY3VycmVudCk7Ci0gICAgICAgICAgICB0b0N1cnNvci5pbmNUbyhWTS5vYmplY3RNb2RlbC5nZXRPYmplY3RFbmRBZGRyZXNzKGN1cnJlbnQpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTWFya0NvbXBhY3RTcGFjZS5zZXRGb3J3YXJkaW5nUG9pbnRlcihjdXJyZW50LCB0YXJnZXQpOwotICAgICAgICAgICAgdG9DdXJzb3IuaW5jKHNpemUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZnJvbUN1cnNvci5hZHZhbmNlVG9OZXh0Rm9yd2FyZGFibGVSZWdpb24oc3BhY2UpOwotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gdGhlIGNvbXBhY3RpbmcgcGhhc2Ugb2YgdGhlIGNvbGxlY3Rpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCBjb21wYWN0KCkgewotICAgIGlmIChyZWdpb25zLmlzWmVybygpKSByZXR1cm47Ci0KLSAgICB0b0N1cnNvci5pbml0KHJlZ2lvbnMpOwotICAgIGZyb21DdXJzb3IuaW5pdChyZWdpb25zKTsKLQotICAgIC8qIExvb3AgdGhyb3VnaCBhY3RpdmUgcmVnaW9ucyBvciB1bnRpbCB0aGUgbGFzdCByZWdpb24gKi8KLSAgICB3aGlsZSAoZnJvbUN1cnNvci5pc1ZhbGlkKCkpIHsKLSAgICAgIGlmIChWRVJCT1NFKSB7Ci0gICAgICAgIExvZy53cml0ZSgiQ29tcGFjdGluZyBmcm9tIHJlZ2lvbiAiKTsgTG9nLndyaXRlKGZyb21DdXJzb3IuZ2V0UmVnaW9uKCkpOwotICAgICAgICBMb2cud3JpdGUoIiB0byByZWdpb24gIik7IExvZy53cml0ZWxuKHRvQ3Vyc29yLmdldFJlZ2lvbigpKTsKLSAgICAgIH0KLQotICAgICAgLyogTG9vcCB0aHJvdWdoIHRoZSBvYmplY3RzIGluIHRoZSByZWdpb24gKi8KLSAgICAgIHdoaWxlIChmcm9tQ3Vyc29yLmhhc01vcmVPYmplY3RzKCkpIHsKLSAgICAgICAgT2JqZWN0UmVmZXJlbmNlIGN1cnJlbnQgPSBmcm9tQ3Vyc29yLmFkdmFuY2VUb09iamVjdCgpOwotICAgICAgICBmcm9tQ3Vyc29yLmFkdmFuY2VUb09iamVjdEVuZChjdXJyZW50KTsKLQotICAgICAgICBPYmplY3RSZWZlcmVuY2UgY29weVRvID0gTWFya0NvbXBhY3RTcGFjZS5nZXRGb3J3YXJkaW5nUG9pbnRlcihjdXJyZW50KTsKLSAgICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoIWNvcHlUby50b0FkZHJlc3MoKS5FUShBZGRyZXNzLmZyb21JbnRaZXJvRXh0ZW5kKFZNLkFMSUdOTUVOVF9WQUxVRSkpKTsKLQotICAgICAgICBpZiAoIWNvcHlUby5pc051bGwoKSAmJiBTcGFjZS5pc0luU3BhY2UoTUMuTUFSS19DT01QQUNULCBjb3B5VG8pKSB7Ci0gICAgICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSB7Ci0gICAgICAgICAgICBpZiAoTWFya0NvbXBhY3RTcGFjZS5pc01hcmtlZChjdXJyZW50KSkgewotICAgICAgICAgICAgICBMb2cud3JpdGUoIk9iamVjdCAiKTsgTG9nLndyaXRlKGN1cnJlbnQpOwotICAgICAgICAgICAgICBMb2cud3JpdGVsbigiIGlzIG1hcmtlZCBkdXJpbmcgdGhlIGNvbXBhY3QgcGhhc2UiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydCghTWFya0NvbXBhY3RTcGFjZS5pc01hcmtlZChjdXJyZW50KSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICghdG9DdXJzb3IuaXNJblJlZ2lvbihjb3B5VG8pKSB7Ci0gICAgICAgICAgICAvLyBVcGRhdGUgbWV0YWRhdGEgYW5kIG1vdmUgb24KLSAgICAgICAgICAgIHRvQ3Vyc29yLmZpbmlzaEFuZEFkdmFuY2VUb05leHRSZWdpb24oKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQodG9DdXJzb3IuaXNJblJlZ2lvbihjb3B5VG8pKTsKLSAgICAgICAgICB0b0N1cnNvci5jb3B5KGN1cnJlbnQsIGNvcHlUbyk7Ci0gICAgICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQodG9DdXJzb3IuaXNJblJlZ2lvbihjb3B5VG8pKTsKLSAgICAgICAgICBNYXJrQ29tcGFjdFNwYWNlLnNldEZvcndhcmRpbmdQb2ludGVyKGNvcHlUbywgT2JqZWN0UmVmZXJlbmNlLm51bGxSZWZlcmVuY2UoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGZyb21DdXJzb3IuYWR2YW5jZVRvTmV4dFJlZ2lvbigpOwotICAgIH0KLQotICAgIC8qIEZpeCB1cCB0aGUgbGFzdCBvYmplY3QgcG9pbnRlciBldGMgKi8KLSAgICB0b0N1cnNvci5maW5pc2goKTsKLQotCi0gICAgLyoKLSAgICAgKiBSZXR1cm4gdW51c2VkIHBhZ2VzIHRvIHRoZSBnbG9iYWwgcGFnZSByZXNvdXJjZQotICAgICAqLwotICAgIEFkZHJlc3MgcmVnaW9uID0gdG9DdXJzb3Iuc25pcCgpOwotICAgIHdoaWxlICghcmVnaW9uLmlzWmVybygpKSB7Ci0gICAgICBBZGRyZXNzIG5leHRSZWdpb24gPSBNYXJrQ29tcGFjdExvY2FsLmdldE5leHRSZWdpb24ocmVnaW9uKTsKLSAgICAgIHNwYWNlLnJlbGVhc2UocmVnaW9uKTsKLSAgICAgIHJlZ2lvbiA9IG5leHRSZWdpb247Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BvbGljeS9NYXJrQ29tcGFjdExvY2FsLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BvbGljeS9NYXJrQ29tcGFjdExvY2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MTA5ZDEuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvTWFya0NvbXBhY3RMb2NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBvbGljeTsKLQotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuYWxsb2MuQnVtcFBvaW50ZXI7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLlVuaW50ZXJydXB0aWJsZTsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLkV4dGVudDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdW5zeW5jaHJvbml6ZWQgKGxvY2FsKSBlbGVtZW50cyBvZiBhCi0gKiBzbGlkaW5nIG1hcmstY29tcGFjdCBjb2xsZWN0b3IuIEFsbG9jYXRpb24gaXMgdmlhIHRoZSBidW1wIHBvaW50ZXIKLSAqIChAc2VlIEJ1bXBQb2ludGVyKS4KLSAqCi0gKiBAc2VlIEJ1bXBQb2ludGVyCi0gKiBAc2VlIE1hcmtDb21wYWN0U3BhY2UKLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGZpbmFsIGNsYXNzIE1hcmtDb21wYWN0TG9jYWwgZXh0ZW5kcyBCdW1wUG9pbnRlciB7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSBzcGFjZSBUaGUgc3BhY2UgdG8gYnVtcCBwb2ludCBpbnRvLgotICAgKi8KLSAgcHVibGljIE1hcmtDb21wYWN0TG9jYWwoTWFya0NvbXBhY3RTcGFjZSBzcGFjZSkgewotICAgIHN1cGVyKHNwYWNlLCB0cnVlKTsKLSAgfQotCi0gIHByaXZhdGUgTWFya0NvbXBhY3RTcGFjZSBtY1NwYWNlKCkgewotICAgIHJldHVybiAoTWFya0NvbXBhY3RTcGFjZSlzcGFjZTsKLSAgfQotCi0gIC8qKgotICAgKiBQcmVwYXJlIGZvciBjb2xsZWN0aW9uOiB1cGRhdGUgdGhlIG1ldGFkYXRhIGZvciB0aGUgY3VycmVudCByZWdpb24sIGFuZCBmbHVzaAotICAgKiB0aGlzIGJ1bXAtcG9pbnRlcidzIGFsbG9jYXRpb25zIHRvIHRoZSBnbG9iYWwgcGFnZSBsaXN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgcHJlcGFyZSgpIHsKLSAgICBpZiAoIWluaXRpYWxSZWdpb24uaXNaZXJvKCkpIHsKLSAgICAgIHNldERhdGFFbmQocmVnaW9uLGN1cnNvcik7Ci0gICAgICBtY1NwYWNlKCkuYXBwZW5kKGluaXRpYWxSZWdpb24pOwotICAgIH0KLSAgICByZXNldCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZsdXNoIHRoaXMgdGhyZWFkLWxvY2FsIGNvbXBvbmVudCBpbiBwcmVwYXJhdGlvbiBmb3IgdGhlIG11dGF0b3IgdGhyZWFkCi0gICAqIHRvIGRpZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGZsdXNoKCkgewotICAgIHByZXBhcmUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBNYXhpbXVtIHNpemUgb2YgYSBzaW5nbGUgcmVnaW9uLiBJbXBvcnRhbnQgZm9yIGNoaWxkcmVuIHRoYXQgaW1wbGVtZW50Ci0gICAqIGxvYWQgYmFsYW5jaW5nIG9yIGluY3JlbWVudHMgYmFzZWQgb24gcmVnaW9uIHNpemUuCi0gICAqIEByZXR1cm4gdGhlIG1heGltdW0gcmVnaW9uIHNpemUKLSAgICovCi0gIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgRXh0ZW50IG1heGltdW1SZWdpb25TaXplKCkgeyByZXR1cm4gRXh0ZW50LmZyb21JbnRaZXJvRXh0ZW5kKDQgPDwgTE9HX0JMT0NLX1NJWkUpIDsgfQotCi19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BvbGljeS9NYXJrQ29tcGFjdFNwYWNlLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BvbGljeS9NYXJrQ29tcGFjdFNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZWM1ZDguLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvTWFya0NvbXBhY3RTcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg4ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wb2xpY3k7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYWNlTG9jYWw7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5UcmFuc2l0aXZlQ2xvc3VyZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmFsbG9jLkJ1bXBQb2ludGVyOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuaGVhcC4qOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuTG9nOwotCi1pbXBvcnQgb3JnLm1tdGsudm0uTG9jazsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgZnVuY3Rpb25hbGl0eSBmb3IgYSBzaW1wbGUgc2xpZGluZyBtYXJrLWNvbXBhY3QKLSAqIHNwYWNlLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlIHB1YmxpYyBmaW5hbCBjbGFzcyBNYXJrQ29tcGFjdFNwYWNlIGV4dGVuZHMgU3BhY2UKLSAgaW1wbGVtZW50cyBDb25zdGFudHMgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENsYXNzIHZhcmlhYmxlcwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUxfR0NfQklUU19SRVFVSVJFRCA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMT0JBTF9HQ19CSVRTX1JFUVVJUkVEID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0NfSEVBREVSX1dPUkRTX1JFUVVJUkVEID0gMTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBXb3JkIEdDX01BUktfQklUX01BU0sgPSBXb3JkLm9uZSgpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPZmZzZXQgRk9SV0FSRElOR19QT0lOVEVSX09GRlNFVCA9IFZNLm9iamVjdE1vZGVsLkdDX0hFQURFUl9PRkZTRVQoKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NrIGxvY2sgPSBWTS5uZXdMb2NrKCJtY1NwYWNlIik7Ci0KLSAgLyoqIFRoZSBsaXN0IG9mIG9jY3VwaWVkIHJlZ2lvbnMgKi8KLSAgcHJpdmF0ZSBBZGRyZXNzIHJlZ2lvbkxpc3QgPSBBZGRyZXNzLnplcm8oKTsKLQotICAvLyBUT0RPIC0gbWFpbnRhaW4gYSBzZXBhcmF0ZSBsaXN0IG9mIHBhcnRpYWxseSBhbGxvY2F0ZWQgcmVnaW9ucwotICAvLyBmb3IgdGhyZWFkcyB0byBhbGxvY2F0ZSBpbnRvIGltbWVkaWF0ZWx5IGFmdGVyIGEgY29sbGVjdGlvbi4KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbnN0YW5jZSB2YXJpYWJsZXMKLSAgICovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5pdGlhbGl6YXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFRoZSBjYWxsZXIgc3BlY2lmaWVzIHRoZSByZWdpb24gb2YgdmlydHVhbCBtZW1vcnkgdG8gYmUgdXNlZCBmb3IKLSAgICogdGhpcyBzcGFjZS4gIElmIHRoaXMgcmVnaW9uIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIHNwYWNlLAotICAgKiB0aGVuIHRoZSBjb25zdHJ1Y3RvciB3aWxsIGZhaWwuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoaXMgc3BhY2UgKHVzZWQgd2hlbiBwcmludGluZyBlcnJvciBtZXNzYWdlcyBldGMpCi0gICAqIEBwYXJhbSBwYWdlQnVkZ2V0IFRoZSBudW1iZXIgb2YgcGFnZXMgdGhpcyBzcGFjZSBtYXkgY29uc3VtZQotICAgKiBiZWZvcmUgY29uc3VsdGluZyB0aGUgcGxhbgotICAgKiBAcGFyYW0gdm1SZXF1ZXN0IEFuIG9iamVjdCBkZXNjcmliaW5nIHRoZSB2aXJ0dWFsIG1lbW9yeSByZXF1ZXN0ZWQuCi0gICAqLwotICBwdWJsaWMgTWFya0NvbXBhY3RTcGFjZShTdHJpbmcgbmFtZSwgaW50IHBhZ2VCdWRnZXQsIFZNUmVxdWVzdCB2bVJlcXVlc3QpIHsKLSAgICBzdXBlcihuYW1lLCB0cnVlLCBmYWxzZSwgdm1SZXF1ZXN0KTsKLSAgICBpZiAodm1SZXF1ZXN0LmlzRGlzY29udGlndW91cygpKSB7Ci0gICAgICBwciA9IG5ldyBGcmVlTGlzdFBhZ2VSZXNvdXJjZShwYWdlQnVkZ2V0LCB0aGlzLCAwKTsKLSAgICB9IGVsc2UgewotICAgICAgcHIgPSBuZXcgRnJlZUxpc3RQYWdlUmVzb3VyY2UocGFnZUJ1ZGdldCwgdGhpcywgc3RhcnQsIGV4dGVudCwgMCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFByZXBhcmUgZm9yIGEgY29sbGVjdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgcHJlcGFyZSgpIHsKLSAgfQotCi0gIC8qKgotICAgKiBSZWxlYXNlIGFmdGVyIGEgY29sbGVjdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLSAgICAvLyBub3RoaW5nIHRvIGRvCi0gIH0KLQotCi0gIC8qKgotICAgKiBSZWxlYXNlIGFuIGFsbG9jYXRlZCBwYWdlIG9yIHBhZ2VzLiAgSW4gdGhpcyBjYXNlIHdlIGRvIG5vdGhpbmcKLSAgICogYmVjYXVzZSB3ZSBvbmx5IHJlbGVhc2UgcGFnZXMgZW5tYXNzZS4KLSAgICoKLSAgICogQHBhcmFtIHN0YXJ0IFRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgcGFnZSBvciBwYWdlcwotICAgKi8KLSAgQE92ZXJyaWRlCi0gIEBJbmxpbmUKLSAgcHVibGljIHZvaWQgcmVsZWFzZShBZGRyZXNzIHN0YXJ0KSB7Ci0gICAgKChGcmVlTGlzdFBhZ2VSZXNvdXJjZSlwcikucmVsZWFzZVBhZ2VzKHN0YXJ0KTsKLSAgfQotCi0gIC8qKgotICAgKiBUcmFjZSBhbiBvYmplY3QgdW5kZXIgYSBjb3B5aW5nIGNvbGxlY3Rpb24gcG9saWN5LgotICAgKiBJZiB0aGUgb2JqZWN0IGlzIGFscmVhZHkgY29waWVkLCB0aGUgY29weSBpcyByZXR1cm5lZC4KLSAgICogT3RoZXJ3aXNlLCBhIGNvcHkgaXMgY3JlYXRlZCBhbmQgcmV0dXJuZWQuCi0gICAqIEluIGVpdGhlciBjYXNlLCB0aGUgb2JqZWN0IHdpbGwgYmUgbWFya2VkIG9uIHJldHVybi4KLSAgICoKLSAgICogQHBhcmFtIHRyYWNlIFRoZSB0cmFjZSBiZWluZyBjb25kdWN0ZWQuCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBiZSBmb3J3YXJkZWQuCi0gICAqIEByZXR1cm4gVGhlIGZvcndhcmRlZCBvYmplY3QuCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgQElubGluZQotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlIHRyYWNlT2JqZWN0KFRyYW5zaXRpdmVDbG9zdXJlIHRyYWNlLCBPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKQotICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGZhbHNlKTsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBUcmFjZSBhbiBvYmplY3QgdW5kZXIgYSBjb3B5aW5nIGNvbGxlY3Rpb24gcG9saWN5LgotICAgKiBJZiB0aGUgb2JqZWN0IGlzIGFscmVhZHkgY29waWVkLCB0aGUgY29weSBpcyByZXR1cm5lZC4KLSAgICogT3RoZXJ3aXNlLCBhIGNvcHkgaXMgY3JlYXRlZCBhbmQgcmV0dXJuZWQuCi0gICAqIEluIGVpdGhlciBjYXNlLCB0aGUgb2JqZWN0IHdpbGwgYmUgbWFya2VkIG9uIHJldHVybi4KLSAgICoKLSAgICogQHBhcmFtIHRyYWNlIFRoZSB0cmFjZSBiZWluZyBjb25kdWN0ZWQuCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBiZSBmb3J3YXJkZWQuCi0gICAqIEByZXR1cm4gVGhlIGZvcndhcmRlZCBvYmplY3QuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBPYmplY3RSZWZlcmVuY2UgdHJhY2VNYXJrT2JqZWN0KFRyYWNlTG9jYWwgdHJhY2UsIE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAoTWFya0NvbXBhY3RDb2xsZWN0b3IuVkVSWV9WRVJCT1NFKSB7Ci0gICAgICBMb2cud3JpdGUoIm1hcmtpbmcgIik7IExvZy53cml0ZShvYmplY3QpOwotICAgIH0KLSAgICBpZiAodGVzdEFuZE1hcmsob2JqZWN0KSkgewotICAgICAgdHJhY2UucHJvY2Vzc05vZGUob2JqZWN0KTsKLSAgICB9IGVsc2UgaWYgKCFnZXRGb3J3YXJkaW5nUG9pbnRlcihvYmplY3QpLmlzTnVsbCgpKSB7Ci0gICAgICBpZiAoTWFya0NvbXBhY3RDb2xsZWN0b3IuVkVSWV9WRVJCT1NFKSB7Ci0gICAgICAgIExvZy53cml0ZSgiIC0+ICIpOyBMb2cud3JpdGVsbihnZXRGb3J3YXJkaW5nUG9pbnRlcihvYmplY3QpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBnZXRGb3J3YXJkaW5nUG9pbnRlcihvYmplY3QpOwotICAgIH0KLSAgICBpZiAoTWFya0NvbXBhY3RDb2xsZWN0b3IuVkVSWV9WRVJCT1NFKSB7Ci0gICAgICBMb2cud3JpdGVsbigpOwotICAgIH0KLSAgICByZXR1cm4gb2JqZWN0OwotICB9Ci0KLSAgLyoqCi0gICAqIFRyYWNlIGFuIG9iamVjdCB1bmRlciBhIGNvcHlpbmcgY29sbGVjdGlvbiBwb2xpY3kuCi0gICAqIElmIHRoZSBvYmplY3QgaXMgYWxyZWFkeSBjb3BpZWQsIHRoZSBjb3B5IGlzIHJldHVybmVkLgotICAgKiBPdGhlcndpc2UsIGEgY29weSBpcyBjcmVhdGVkIGFuZCByZXR1cm5lZC4KLSAgICogSW4gZWl0aGVyIGNhc2UsIHRoZSBvYmplY3Qgd2lsbCBiZSBtYXJrZWQgb24gcmV0dXJuLgotICAgKgotICAgKiBAcGFyYW0gdHJhY2UgVGhlIHRyYWNlIGJlaW5nIGNvbmR1Y3RlZC4KLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIGZvcndhcmRlZC4KLSAgICogQHJldHVybiBUaGUgZm9yd2FyZGVkIG9iamVjdC4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIE9iamVjdFJlZmVyZW5jZSB0cmFjZUZvcndhcmRPYmplY3QoVHJhY2VMb2NhbCB0cmFjZSwgT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmICh0ZXN0QW5kQ2xlYXJNYXJrKG9iamVjdCkpIHsKLSAgICAgIHRyYWNlLnByb2Nlc3NOb2RlKG9iamVjdCk7Ci0gICAgfQotICAgIE9iamVjdFJlZmVyZW5jZSBuZXdPYmplY3QgPSBnZXRGb3J3YXJkaW5nUG9pbnRlcihvYmplY3QpOwotICAgIGlmIChNYXJrQ29tcGFjdENvbGxlY3Rvci5WRVJZX1ZFUkJPU0UpIHsKLSAgICAgIExvZy53cml0ZSgiZm9yd2FyZGluZyAiKTsgTG9nLndyaXRlKG9iamVjdCk7Ci0gICAgICBMb2cud3JpdGUoIiAtPiAiKTsgTG9nLndyaXRlbG4obmV3T2JqZWN0KTsKLSAgICB9Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoIW5ld09iamVjdC5pc051bGwoKSk7Ci0gICAgcmV0dXJuIGdldEZvcndhcmRpbmdQb2ludGVyKG9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogSXMgdGhpcyBvYmplY3QgbGl2ZT8KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0Ci0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGxpdmUKLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBpc0xpdmUoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIHJldHVybiBpc01hcmtlZChvYmplY3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIEhhcyB0aGUgb2JqZWN0IGluIHRoaXMgc3BhY2UgYmVlbiByZWFjaGVkIGR1cmluZyB0aGUgY3VycmVudCBjb2xsZWN0aW9uLgotICAgKiBUaGlzIGlzIHVzZWQgZm9yIEdDIFRyYWNpbmcuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCByZWZlcmVuY2UuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHJlYWNoYWJsZS4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBpc1JlYWNoYWJsZShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgcmV0dXJuIGlzTWFya2VkKG9iamVjdCk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEhlYWRlciBtYW5pcHVsYXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYW55IHJlcXVpcmVkIHBvc3QtYWxsb2NhdGlvbiBpbml0aWFsaXphdGlvbgotICAgKgotICAgKiA8aT5Ob3RoaW5nIHRvIGJlIGRvbmUgaW4gdGhpcyBjYXNlPC9pPgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgcmVmIHRvIHRoZSBzdG9yYWdlIHRvIGJlIGluaXRpYWxpemVkCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyB2b2lkIHBvc3RBbGxvYyhPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gIH0KLQotICAvKioKLSAgICogTm9uLWF0b21pYyByZWFkIG9mIGZvcndhcmRpbmcgcG9pbnRlcgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3Qgd2hvc2UgZm9yd2FyZGluZyBwb2ludGVyIGlzIHRvIGJlIHJlYWQKLSAgICogQHJldHVybiBUaGUgZm9yd2FyZGluZyBwb2ludGVyIHN0b3JlZCBpbiA8Y29kZT5vYmplY3Q8L2NvZGU+J3MKLSAgICogaGVhZGVyLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIE9iamVjdFJlZmVyZW5jZSBnZXRGb3J3YXJkaW5nUG9pbnRlcihPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgcmV0dXJuIG9iamVjdC50b0FkZHJlc3MoKS5sb2FkT2JqZWN0UmVmZXJlbmNlKEZPUldBUkRJTkdfUE9JTlRFUl9PRkZTRVQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpc2UgdGhlIGhlYWRlciBvZiB0aGUgb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5pdGlhbGlzZQotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgdm9pZCBpbml0aWFsaXplSGVhZGVyKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICAvLyBub3RoaW5nIHRvIGRvCi0gIH0KLQotICAvKioKLSAgICogVXNlZCB0byBtYXJrIGJvb3QgaW1hZ2Ugb2JqZWN0cyBkdXJpbmcgYSBwYXJhbGxlbCBzY2FuIG9mIG9iamVjdHMKLSAgICogZHVyaW5nIEdDIFJldHVybnMgdHJ1ZSBpZiBtYXJraW5nIHdhcyBkb25lLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgbWFya2VkCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0QW5kTWFyayhPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgV29yZCBvbGRWYWx1ZTsKLSAgICBkbyB7Ci0gICAgICBvbGRWYWx1ZSA9IFZNLm9iamVjdE1vZGVsLnByZXBhcmVBdmFpbGFibGVCaXRzKG9iamVjdCk7Ci0gICAgICBXb3JkIG1hcmtCaXQgPSBvbGRWYWx1ZS5hbmQoR0NfTUFSS19CSVRfTUFTSyk7Ci0gICAgICBpZiAoIW1hcmtCaXQuaXNaZXJvKCkpIHJldHVybiBmYWxzZTsKLSAgICB9IHdoaWxlICghVk0ub2JqZWN0TW9kZWwuYXR0ZW1wdEF2YWlsYWJsZUJpdHMob2JqZWN0LCBvbGRWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFZhbHVlLm9yKEdDX01BUktfQklUX01BU0spKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogVXNlZCB0byBtYXJrIGJvb3QgaW1hZ2Ugb2JqZWN0cyBkdXJpbmcgYSBwYXJhbGxlbCBzY2FuIG9mIG9iamVjdHMKLSAgICogZHVyaW5nIEdDIFJldHVybnMgdHJ1ZSBpZiBtYXJraW5nIHdhcyBkb25lLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgbWFya2VkCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01hcmtlZChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgV29yZCBvbGRWYWx1ZSA9IFZNLm9iamVjdE1vZGVsLnJlYWRBdmFpbGFibGVCaXRzV29yZChvYmplY3QpOwotICAgIFdvcmQgbWFya0JpdCA9IG9sZFZhbHVlLmFuZChHQ19NQVJLX0JJVF9NQVNLKTsKLSAgICByZXR1cm4gKCFtYXJrQml0LmlzWmVybygpKTsKLSAgfQotCi0gIC8qKgotICAgKiBVc2VkIHRvIG1hcmsgYm9vdCBpbWFnZSBvYmplY3RzIGR1cmluZyBhIHBhcmFsbGVsIHNjYW4gb2Ygb2JqZWN0cwotICAgKiBkdXJpbmcgR0MgUmV0dXJucyB0cnVlIGlmIG1hcmtpbmcgd2FzIGRvbmUuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBiZSBtYXJrZWQKLSAgICovCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB0ZXN0QW5kQ2xlYXJNYXJrKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBXb3JkIG9sZFZhbHVlOwotICAgIGRvIHsKLSAgICAgIG9sZFZhbHVlID0gVk0ub2JqZWN0TW9kZWwucHJlcGFyZUF2YWlsYWJsZUJpdHMob2JqZWN0KTsKLSAgICAgIFdvcmQgbWFya0JpdCA9IG9sZFZhbHVlLmFuZChHQ19NQVJLX0JJVF9NQVNLKTsKLSAgICAgIGlmIChtYXJrQml0LmlzWmVybygpKSByZXR1cm4gZmFsc2U7Ci0gICAgfSB3aGlsZSAoIVZNLm9iamVjdE1vZGVsLmF0dGVtcHRBdmFpbGFibGVCaXRzKG9iamVjdCwgb2xkVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRWYWx1ZS5hbmQoR0NfTUFSS19CSVRfTUFTSy5ub3QoKSkpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFVzZWQgdG8gbWFyayBib290IGltYWdlIG9iamVjdHMgZHVyaW5nIGEgcGFyYWxsZWwgc2NhbiBvZiBvYmplY3RzCi0gICAqIGR1cmluZyBHQyBSZXR1cm5zIHRydWUgaWYgbWFya2luZyB3YXMgZG9uZS4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIG1hcmtlZAotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdG9CZUNvbXBhY3RlZChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgV29yZCBvbGRWYWx1ZSA9IFZNLm9iamVjdE1vZGVsLnJlYWRBdmFpbGFibGVCaXRzV29yZChvYmplY3QpOwotICAgIFdvcmQgbWFya0JpdCA9IG9sZFZhbHVlLmFuZChHQ19NQVJLX0JJVF9NQVNLKTsKLSAgICByZXR1cm4gIW1hcmtCaXQuaXNaZXJvKCkgJiYgZ2V0Rm9yd2FyZGluZ1BvaW50ZXIob2JqZWN0KS5pc051bGwoKTsKLSAgfQotCi0gIC8qKgotICAgKiBVc2VkIHRvIG1hcmsgYm9vdCBpbWFnZSBvYmplY3RzIGR1cmluZyBhIHBhcmFsbGVsIHNjYW4gb2Ygb2JqZWN0cwotICAgKiBkdXJpbmcgR0MgUmV0dXJucyB0cnVlIGlmIG1hcmtpbmcgd2FzIGRvbmUuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBiZSBtYXJrZWQKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyTWFyayhPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgV29yZCBvbGRWYWx1ZSA9IFZNLm9iamVjdE1vZGVsLnJlYWRBdmFpbGFibGVCaXRzV29yZChvYmplY3QpOwotICAgIFZNLm9iamVjdE1vZGVsLndyaXRlQXZhaWxhYmxlQml0c1dvcmQob2JqZWN0LCBvbGRWYWx1ZS5hbmQoR0NfTUFSS19CSVRfTUFTSy5ub3QoKSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIE5vbi1hdG9taWMgd3JpdGUgb2YgZm9yd2FyZGluZyBwb2ludGVyIHdvcmQgKGFzc3VtcHRpb24sIHRocmVhZAotICAgKiBkb2luZyB0aGUgc2V0IGhhcyBkb25lIGF0dGVtcHQgdG8gZm9yd2FyZCBhbmQgb3ducyB0aGUgcmlnaHQgdG8KLSAgICogY29weSB0aGUgb2JqZWN0KQotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3Qgd2hvc2UgZm9yd2FyZGluZyBwb2ludGVyIGlzIHRvIGJlIHNldAotICAgKiBAcGFyYW0gcHRyIFRoZSBmb3J3YXJkaW5nIHBvaW50ZXIgdG8gYmUgc3RvcmVkIGluIHRoZSBvYmplY3QncwotICAgKiBmb3J3YXJkaW5nIHdvcmQKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldEZvcndhcmRpbmdQb2ludGVyKE9iamVjdFJlZmVyZW5jZSBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0UmVmZXJlbmNlIHB0cikgewotICAgIG9iamVjdC50b0FkZHJlc3MoKS5zdG9yZShwdHIudG9BZGRyZXNzKCksIEZPUldBUkRJTkdfUE9JTlRFUl9PRkZTRVQpOwotICB9Ci0KLSAgLyoqCi0gICAqIE5vbi1hdG9taWMgY2xlYXIgb2YgZm9yd2FyZGluZyBwb2ludGVyIHdvcmQgKGFzc3VtcHRpb24sIHRocmVhZAotICAgKiBkb2luZyB0aGUgc2V0IGhhcyBkb25lIGF0dGVtcHQgdG8gZm9yd2FyZCBhbmQgb3ducyB0aGUgcmlnaHQgdG8KLSAgICogY29weSB0aGUgb2JqZWN0KQotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3Qgd2hvc2UgZm9yd2FyZGluZyBwb2ludGVyIGlzIHRvIGJlIHNldAotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJGb3J3YXJkaW5nUG9pbnRlcihPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgb2JqZWN0LnRvQWRkcmVzcygpLnN0b3JlKEFkZHJlc3MuemVybygpLCBGT1JXQVJESU5HX1BPSU5URVJfT0ZGU0VUKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIEEgcmVnaW9uIG9mIHRoaXMgc3BhY2UgdGhhdCBoYXMgbmV0IHlldCBiZWVuIGNvbXBhY3RlZCBkdXJpbmcKLSAgICogICB0aGUgY3VycmVudCBjb2xsZWN0aW9uCi0gICAqLwotICBwdWJsaWMgQWRkcmVzcyBnZXROZXh0UmVnaW9uKCkgewotICAgIGxvY2suYWNxdWlyZSgpOwotICAgIGlmIChyZWdpb25MaXN0LmlzWmVybygpKSB7Ci0gICAgICBsb2NrLnJlbGVhc2UoKTsKLSAgICAgIHJldHVybiBBZGRyZXNzLnplcm8oKTsKLSAgICB9Ci0gICAgQWRkcmVzcyByZXN1bHQgPSByZWdpb25MaXN0OwotICAgIHJlZ2lvbkxpc3QgPSBCdW1wUG9pbnRlci5nZXROZXh0UmVnaW9uKHJlZ2lvbkxpc3QpOwotICAgIEJ1bXBQb2ludGVyLmNsZWFyTmV4dFJlZ2lvbihyZXN1bHQpOwotICAgIGxvY2sucmVsZWFzZSgpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogQXBwZW5kIGEgcmVnaW9uIG9yIGxpc3Qgb2YgcmVnaW9ucyB0byB0aGUgZ2xvYmFsIGxpc3QKLSAgICogQHBhcmFtIHJlZ2lvbgotICAgKi8KLSAgcHVibGljIHZvaWQgYXBwZW5kKEFkZHJlc3MgcmVnaW9uKSB7Ci0gICAgbG9jay5hY3F1aXJlKCk7Ci0gICAgaWYgKE1hcmtDb21wYWN0Q29sbGVjdG9yLlZFUkJPU0UpIHsKLSAgICAgIExvZy53cml0ZSgiQXBwZW5kaW5nIHJlZ2lvbiAiKTsgTG9nLndyaXRlKHJlZ2lvbik7Ci0gICAgICBMb2cud3JpdGVsbigiIHRvIGdsb2JhbCBsaXN0Iik7Ci0gICAgfQotICAgIGlmIChyZWdpb25MaXN0LmlzWmVybygpKSB7Ci0gICAgICByZWdpb25MaXN0ID0gcmVnaW9uOwotICAgIH0gZWxzZSB7Ci0gICAgICBhcHBlbmRSZWdpb24ocmVnaW9uTGlzdCxyZWdpb24pOwotICAgIH0KLSAgICBsb2NrLnJlbGVhc2UoKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhcHBlbmRSZWdpb24oQWRkcmVzcyBsaXN0SGVhZCwgQWRkcmVzcyByZWdpb24pIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCghbGlzdEhlYWQuaXNaZXJvKCkpOwotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KCFyZWdpb24uaXNaZXJvKCkpOwotICAgIEFkZHJlc3MgY3Vyc29yID0gbGlzdEhlYWQ7Ci0gICAgd2hpbGUgKCFCdW1wUG9pbnRlci5nZXROZXh0UmVnaW9uKGN1cnNvcikuaXNaZXJvKCkpIHsKLSAgICAgIGN1cnNvciA9IEJ1bXBQb2ludGVyLmdldE5leHRSZWdpb24oY3Vyc29yKTsKLSAgICB9Ci0gICAgQnVtcFBvaW50ZXIuc2V0TmV4dFJlZ2lvbihjdXJzb3IscmVnaW9uKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvTWFya1N3ZWVwTG9jYWwuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L01hcmtTd2VlcExvY2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NjI5MWUuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvTWFya1N3ZWVwTG9jYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wb2xpY3k7Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmFsbG9jLlNlZ3JlZ2F0ZWRGcmVlTGlzdExvY2FsOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHVuc3luY2hyb25pemVkIChsb2NhbCkgZWxlbWVudHMgb2YgYQotICogbWFyay1zd2VlcCBjb2xsZWN0b3IuICBBbGxvY2F0aW9uIGlzIHZpYSB0aGUgc2VncmVnYXRlZCBmcmVlIGxpc3QKLSAqIChAc2VlIFNlZ3JlZ2F0ZWRGcmVlTGlzdCkuICBNYXJraW5nIGlzIGRvbmUgdXNpbmcgYm90aCBhIGJpdCBpbgotICogZWFjaCBoZWFkZXIncyBvYmplY3Qgd29yZCwgYW5kIGEgbWFyayBiaXRtYXAuICBTd2VlcGluZyBpcwotICogcGVyZm9ybWVkIGxhemlseS48cD4KLSAqCi0gKiBBIGZyZWUgbGlzdCBibG9jayBpcyBhIGNvbnRpZ3VvdXMgcmVnaW9uIG9mIG1lbW9yeSBjb250YWluaW5nIGNlbGxzCi0gKiBvZiBhIHNpbmdsZSBzaXplIGNsYXNzLCBhbmQgaXMgYSBjb25zdHJ1Y3Qgb2YgdGhlCi0gKiBTZWdyZWdhdGVkRnJlZUxpc3QuICBUaGlzIGNsYXNzIGV4dGVuZHMgdGhlIGJsb2NrIHRvIGluY2x1ZGUgYSBtYXJrCi0gKiBiaXRtYXAuICBEdXJpbmcgdGhlIG1hcmsgcGhhc2UsIGlmIGFuIG9iamVjdCBpcyBlbmNvdW50ZXJlZCB3aXRoCi0gKiB0aGUgbWFyayBiaXQgaW4gaXRzIGhlYWRlciB1bnNldCwgaXQgaXMgc2V0IGFuZCB0aGUgbWFyayBiaXQgaW4gdGhlCi0gKiBibG9jayBoZWFkZXIgY29ycmVzcG9uZGluZyB0byB0aGF0IG9iamVjdCBpcyBzZXQuICBUaGUgcmF0aW9uYWxlCi0gKiBiZWhpbmQgdGhpcyBhcHByb2FjaCBpcyB0aGF0IHRlc3RpbmcgKGFuZCBzZXR0aW5nKSB0aGUgbWFyayBiaXQgaW4KLSAqIHRoZSBvYmplY3QgaGVhZGVyIGlzIGNoZWFwLCB3aGlsZSB1c2luZyBhIGJpdG1hcCBtYWtlcyBzd2VlcGluZwotICogbW9yZSBlZmZpY2llbnQuICBUaGlzIGFwcHJvYWNoIG1heGltaXplcyB0aGUgc3BlZWQgb2YgdGhlIGNvbW1vbgotICogY2FzZSB3aGVuIG1hcmtpbmcsIHdoaWxlIGFsc28gYWxsb3dpbmcgZm9yIGZhc3Qgc3dlZXBpbmcsIHdpdGgKLSAqIG1pbmltYWwgc3BhY2Ugb3ZlcmhlYWQgKDIgYml0cyBwZXIgb2JqZWN0KS4KLSAqCi0gKiBAc2VlIG9yZy5tbXRrLnV0aWxpdHkuYWxsb2MuU2VncmVnYXRlZEZyZWVMaXN0Ci0gKiBAc2VlIE1hcmtTd2VlcFNwYWNlCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBmaW5hbCBjbGFzcyBNYXJrU3dlZXBMb2NhbCBleHRlbmRzIFNlZ3JlZ2F0ZWRGcmVlTGlzdExvY2FsPE1hcmtTd2VlcFNwYWNlPiBpbXBsZW1lbnRzIENvbnN0YW50cyB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5pdGlhbGl6YXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSBzcGFjZSBUaGUgbWFyay1zd2VlcCBzcGFjZSB0byB3aGljaCB0aGlzIGFsbG9jYXRvcgotICAgKiBpbnN0YW5jZXMgaXMgYm91bmQuCi0gICAqLwotICBwdWJsaWMgTWFya1N3ZWVwTG9jYWwoTWFya1N3ZWVwU3BhY2Ugc3BhY2UpIHsKLSAgICBzdXBlcihzcGFjZSk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDb2xsZWN0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBQcmVwYXJlIGZvciBhIGNvbGxlY3Rpb24uIElmIHBhcmFub2lkLCBwZXJmb3JtIGEgc2FuaXR5IGNoZWNrLgotICAgKi8KLSAgcHVibGljIHZvaWQgcHJlcGFyZSgpIHsKLSAgICBmbHVzaCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZpbmlzaCB1cCBhZnRlciBhIGNvbGxlY3Rpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWxlYXNlKCkge30KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L01hcmtTd2VlcFNwYWNlLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BvbGljeS9NYXJrU3dlZXBTcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmJmMDYzLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L01hcmtTd2VlcFNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBvbGljeTsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhbnNpdGl2ZUNsb3N1cmU7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5oZWFwLio7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5vcHRpb25zLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5vcHRpb25zLk1hcmtTd2VlcE1hcmtCaXRzOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkub3B0aW9ucy5FYWdlckNvbXBsZXRlU3dlZXA7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5IZWFkZXJCeXRlOwotCi1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogRWFjaCBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGNvcnJlc3BvbmRzIHRvIG9uZSBtYXJrLXN3ZWVwICpzcGFjZSouCi0gKiBFYWNoIG9mIHRoZSBpbnN0YW5jZSBtZXRob2RzIG9mIHRoaXMgY2xhc3MgbWF5IGJlIGNhbGxlZCBieSBhbnkKLSAqIHRocmVhZCAoaS5lLiBzeW5jaHJvbml6YXRpb24gbXVzdCBiZSBleHBsaWNpdCBpbiBhbnkgaW5zdGFuY2Ugb3IKLSAqIGNsYXNzIG1ldGhvZCkuICBUaGlzIGNvbnRyYXN0cyB3aXRoIHRoZSBNYXJrU3dlZXBMb2NhbCwgd2hlcmUKLSAqIGluc3RhbmNlcyBjb3JyZXNwb25kIHRvICpwbGFuKiBpbnN0YW5jZXMgYW5kIHRoZXJlZm9yZSB0byBrZXJuZWwKLSAqIHRocmVhZHMuICBUaHVzIHVubGlrZSB0aGlzIGNsYXNzLCBzeW5jaHJvbml6YXRpb24gaXMgbm90IG5lY2Vzc2FyeQotICogaW4gdGhlIGluc3RhbmNlIG1ldGhvZHMgb2YgTWFya1N3ZWVwTG9jYWwuCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBmaW5hbCBjbGFzcyBNYXJrU3dlZXBTcGFjZSBleHRlbmRzIFNlZ3JlZ2F0ZWRGcmVlTGlzdFNwYWNlIGltcGxlbWVudHMgQ29uc3RhbnRzIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDbGFzcyB2YXJpYWJsZXMKLSAgICovCi0gIC8qKgotICAgKiBTZWxlY3QgYmV0d2VlbiB1c2luZyBtYXJrIGJpdHMgaW4gYSBzaWRlIGJpdG1hcCwgb3IgbWFyayBiaXRzCi0gICAqIGluIHRoZSBoZWFkZXJzIG9mIG9iamVjdCAob3Igb3RoZXIgc3ViLWNsYXNzIHNjaGVtZSksIGFuZCBhIHNpbmdsZQotICAgKiBtYXJrIGJpdCBwZXIgYmxvY2suCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gSEVBREVSX01BUktfQklUUyA9IFZNLmNvbmZpZy5IRUFERVJfTUFSS19CSVRTOwotICAvKiogaGlnaGVzdCBiaXQgYml0cyB3ZSBtYXkgdXNlICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBVkFJTEFCTEVfTE9DQUxfQklUUyA9IDggLSBIZWFkZXJCeXRlLlVTRURfR0xPQkFMX0JJVFM7Ci0KLSAgLyogbWFyayBiaXRzICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT1VOVF9CQVNFID0gMDsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01BUktDT1VOVF9CSVRTID0gNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX01BUktDT1VOVF9CSVRTID0gQVZBSUxBQkxFX0xPQ0FMX0JJVFMgLSBDT1VOVF9CQVNFOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIE1BUktfQ09VTlRfSU5DUkVNRU5UID0gKGJ5dGUpICgxPDxDT1VOVF9CQVNFKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBNQVJLX0NPVU5UX01BU0sgPSAoYnl0ZSkgKCgoMTw8TUFYX01BUktDT1VOVF9CSVRTKS0xKSA8PCBDT1VOVF9CQVNFKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEVBR0VSX01BUktfQ0xFQVIgPSBIZWFkZXJCeXRlLk5FRURTX1VOTE9HR0VEX0JJVDsKLQotICAvKiBoZWFkZXIgcmVxdWlyZW1lbnRzICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMX0dDX0JJVFNfUkVRVUlSRUQgPSBNQVhfTUFSS0NPVU5UX0JJVFM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMT0JBTF9HQ19CSVRTX1JFUVVJUkVEID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0NfSEVBREVSX1dPUkRTX1JFUVVJUkVEID0gMDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluc3RhbmNlIHZhcmlhYmxlcwotICAgKi8KLSAgcHJpdmF0ZSBieXRlIG1hcmtTdGF0ZSA9IDE7Ci0gIHByaXZhdGUgYnl0ZSBhbGxvY1N0YXRlID0gMDsKLSAgcHJpdmF0ZSBib29sZWFuIGluTVNDb2xsZWN0aW9uOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHVzaW5nU3RpY2t5TWFya0JpdHMgPSBWTS5hY3RpdmVQbGFuLmNvbnN0cmFpbnRzKCkubmVlZHNMb2dCaXRJbkhlYWRlcigpOyAvKiBhcmUgc3RpY2t5IG1hcmsgYml0cyBpbiB1c2U/ICovCi0gIHByaXZhdGUgYm9vbGVhbiBpc0FnZVNlZ3JlZ2F0ZWQgPSBmYWxzZTsgLyogaXMgdGhpcyBzcGFjZSBhIG51cnNlcnkgc3BhY2U/ICovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5pdGlhbGl6YXRpb24KLSAgICovCi0KLSAgc3RhdGljIHsKLSAgICBPcHRpb25zLm1hcmtTd2VlcE1hcmtCaXRzID0gbmV3IE1hcmtTd2VlcE1hcmtCaXRzKCk7Ci0gICAgT3B0aW9ucy5lYWdlckNvbXBsZXRlU3dlZXAgPSBuZXcgRWFnZXJDb21wbGV0ZVN3ZWVwKCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIGNhbGxlciBzcGVjaWZpZXMgdGhlIHJlZ2lvbiBvZiB2aXJ0dWFsIG1lbW9yeSB0byBiZSB1c2VkIGZvcgotICAgKiB0aGlzIHNwYWNlLiAgSWYgdGhpcyByZWdpb24gY29uZmxpY3RzIHdpdGggYW4gZXhpc3Rpbmcgc3BhY2UsCi0gICAqIHRoZW4gdGhlIGNvbnN0cnVjdG9yIHdpbGwgZmFpbC4KLSAgICoKLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhpcyBzcGFjZSAodXNlZCB3aGVuIHByaW50aW5nIGVycm9yIG1lc3NhZ2VzIGV0YykKLSAgICogQHBhcmFtIHBhZ2VCdWRnZXQgVGhlIG51bWJlciBvZiBwYWdlcyB0aGlzIHNwYWNlIG1heSBjb25zdW1lCi0gICAqIGJlZm9yZSBjb25zdWx0aW5nIHRoZSBwbGFuCi0gICAqIEBwYXJhbSB2bVJlcXVlc3QgQW4gb2JqZWN0IGRlc2NyaWJpbmcgdGhlIHZpcnR1YWwgbWVtb3J5IHJlcXVlc3RlZC4KLSAgICovCi0gIHB1YmxpYyBNYXJrU3dlZXBTcGFjZShTdHJpbmcgbmFtZSwgaW50IHBhZ2VCdWRnZXQsIFZNUmVxdWVzdCB2bVJlcXVlc3QpIHsKLSAgICBzdXBlcihuYW1lLCBwYWdlQnVkZ2V0LCAwLCB2bVJlcXVlc3QpOwotICAgIGlmICh1c2luZ1N0aWNreU1hcmtCaXRzKSBhbGxvY1N0YXRlIHw9IEhlYWRlckJ5dGUuVU5MT0dHRURfQklUOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgaW5zdGFuY2Ugd2lsbCBiZSBhZ2Utc2VncmVnYXRlZCB1c2luZyB0aGUgc3RpY2t5IG1hcmsgYml0cwotICAgKiBhbGdvcml0aG0uIFBlcmZvcm0gYXBwcm9wcmlhdGUgaW5pdGlhbGl6YXRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIG1ha2VBZ2VTZWdyZWdhdGVkU3BhY2UoKSB7Ci0gICAgLyogd2UgbXVzdCBiZSB1c2luZyBzdGlja3kgbWFyayBiaXRzICovCi0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQodXNpbmdTdGlja3lNYXJrQml0cyk7Ci0gICAgYWxsb2NTdGF0ZSAmPSB+SGVhZGVyQnl0ZS5VTkxPR0dFRF9CSVQ7IC8qIGNsZWFyIHRoZSB1bmxvZ2dlZCBiaXQgZm9yIG51cnNlcnkgYWxsb2NzICovCi0gICAgaXNBZ2VTZWdyZWdhdGVkID0gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBTaG91bGQgU2VncmVnYXRlZEZyZWVMaXN0U3BhY2UgbWFuYWdlIGEgc2lkZSBiaXRtYXAgdG8ga2VlcCB0cmFjayBvZiBsaXZlIG9iamVjdHM/Ci0gICAqLwotICBASW5saW5lCi0gIHByb3RlY3RlZCBib29sZWFuIG1haW50YWluU2lkZUJpdG1hcCgpIHsKLSAgICByZXR1cm4gIUhFQURFUl9NQVJLX0JJVFM7Ci0gIH0KLQotICAvKioKLSAgICogRG8gd2UgbmVlZCB0byBwcmVzZXJ2ZSBmcmVlIGxpc3RzIGFzIHdlIG1vdmUgYmxvY2tzIGFyb3VuZC4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJlc2VydmVGcmVlTGlzdCgpIHsKLSAgICByZXR1cm4gIUxBWllfU1dFRVA7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBBbGxvY2F0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBQcmVwYXJlIHRoZSBuZXh0IGJsb2NrIGluIHRoZSBmcmVlIGJsb2NrIGxpc3QgZm9yIHVzZSBieSB0aGUgZnJlZQotICAgKiBsaXN0IGFsbG9jYXRvci4gIEluIHRoZSBjYXNlIG9mIGxhenkgc3dlZXBpbmcgdGhpcyBpbnZvbHZlcwotICAgKiBzd2VlcGluZyB0aGUgYXZhaWxhYmxlIGNlbGxzLiAgPGI+VGhlIHN3ZWVwaW5nIG9wZXJhdGlvbiBtdXN0Ci0gICAqIGVuc3VyZSB0aGF0IGNlbGxzIGFyZSBwcmUtemVyb2VkPC9iPiwgYXMgdGhpcyBtZXRob2QgbXVzdCByZXR1cm4KLSAgICogcHJlLXplcm9lZCBjZWxscy4KLSAgICoKLSAgICogQHBhcmFtIGJsb2NrIFRoZSBibG9jayB0byBiZSBwcmVwYXJlZCBmb3IgdXNlCi0gICAqIEBwYXJhbSBzaXplQ2xhc3MgVGhlIHNpemUgY2xhc3Mgb2YgdGhlIGJsb2NrCi0gICAqIEByZXR1cm4gVGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHByZS16ZXJvZWQgY2VsbCBpbiB0aGUgZnJlZSBsaXN0Ci0gICAqIGZvciB0aGlzIGJsb2NrLCBvciB6ZXJvIGlmIHRoZXJlIGFyZSBubyBhdmFpbGFibGUgY2VsbHMuCi0gICAqLwotICBwcm90ZWN0ZWQgQWRkcmVzcyBhZHZhbmNlVG9CbG9jayhBZGRyZXNzIGJsb2NrLCBpbnQgc2l6ZUNsYXNzKSB7Ci0gICAgaWYgKEhFQURFUl9NQVJLX0JJVFMpIHsKLSAgICAgIGlmIChpbk1TQ29sbGVjdGlvbikgbWFya0Jsb2NrKGJsb2NrKTsKLSAgICB9Ci0KLSAgICBpZiAoTEFaWV9TV0VFUCkgewotICAgICAgcmV0dXJuIG1ha2VGcmVlTGlzdChibG9jaywgc2l6ZUNsYXNzKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGdldEZyZWVMaXN0KGJsb2NrKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogTm90aWZ5IHRoYXQgYSBuZXcgYmxvY2sgaGFzIGJlZW4gaW5zdGFsbGVkLiBUaGlzIGlzIHRvIGVuc3VyZSB0aGF0Ci0gICAqIGFwcHJvcHJpYXRlIGNvbGxlY3Rpb24gc3RhdGUgY2FuIGJlIGluaXRpYWxpemVkIGZvciB0aGUgYmxvY2sKLSAgICoKLSAgICogQHBhcmFtIGJsb2NrIFRoZSBuZXcgYmxvY2sKLSAgICogQHBhcmFtIHNpemVDbGFzcyBUaGUgYmxvY2sncyBzaXplY2xhc3MuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlOZXdCbG9jayhBZGRyZXNzIGJsb2NrLCBpbnQgc2l6ZUNsYXNzKSB7Ci0gICAgaWYgKEhFQURFUl9NQVJLX0JJVFMpIHsKLSAgICAgIGlmIChpbk1TQ29sbGVjdGlvbikgbWFya0Jsb2NrKGJsb2NrKTsKLSAgICB9Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDb2xsZWN0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBQcmVwYXJlIGZvciBhIG5ldyBjb2xsZWN0aW9uIGluY3JlbWVudC4gIEZvciB0aGUgbWFyay1zd2VlcAotICAgKiBjb2xsZWN0b3Igd2UgbXVzdCBmbGlwIHRoZSBzdGF0ZSBvZiB0aGUgbWFyayBiaXQgYmV0d2VlbgotICAgKiBjb2xsZWN0aW9ucy4KLSAgICoKLSAgICogQHBhcmFtIGdjV2hvbGVNUyBUcnVlIGlmIHdlIGFyZSBnb2luZyB0byBjb2xsZWN0IHRoZSB3aG9sZSBtYXJrc3dlZXAgc3BhY2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIHByZXBhcmUoYm9vbGVhbiBnY1dob2xlTVMpIHsKLSAgICBpZiAoSEVBREVSX01BUktfQklUUyAmJiBPcHRpb25zLmVhZ2VyQ29tcGxldGVTd2VlcC5nZXRWYWx1ZSgpKSB7Ci0gICAgICBjb25zdW1lQmxvY2tzKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZsdXNoQXZhaWxhYmxlQmxvY2tzKCk7Ci0gICAgfQotICAgIGlmIChIRUFERVJfTUFSS19CSVRTKSB7Ci0gICAgICBpZiAoZ2NXaG9sZU1TKSB7Ci0gICAgICAgIGFsbG9jU3RhdGUgPSBtYXJrU3RhdGU7Ci0gICAgICAgIGlmICh1c2luZ1N0aWNreU1hcmtCaXRzICYmICFpc0FnZVNlZ3JlZ2F0ZWQpIC8qIGlmIHRydWUsIHdlIGFsbG9jYXRlIGFzICJtYXR1cmUiLCBub3QgbnVyc2VyeSAqLwotICAgICAgICAgIGFsbG9jU3RhdGUgfD0gSGVhZGVyQnl0ZS5VTkxPR0dFRF9CSVQ7Ci0gICAgICAgIG1hcmtTdGF0ZSA9IGRlbHRhTWFya1N0YXRlKHRydWUpOwotICAgICAgICBpZiAoRUFHRVJfTUFSS19DTEVBUikKLSAgICAgICAgICBjbGVhckFsbEJsb2NrTWFya3MoKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgemVyb0xpdmVCaXRzKCk7Ci0gICAgfQotICAgIGluTVNDb2xsZWN0aW9uID0gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBBIG5ldyBjb2xsZWN0aW9uIGluY3JlbWVudCBoYXMgY29tcGxldGVkLiAgRm9yIHRoZSBtYXJrLXN3ZWVwCi0gICAqIGNvbGxlY3RvciB0aGlzIG1lYW5zIHdlIGNhbiBwZXJmb3JtIHRoZSBzd2VlcCBwaGFzZS4KLSAqLwotICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotICAgIHN3ZWVwQ29uc3VtZWRCbG9ja3MoIUVBR0VSX01BUktfQ0xFQVIpOwotICAgIGluTVNDb2xsZWN0aW9uID0gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogUmVsZWFzZSBhbiBhbGxvY2F0ZWQgcGFnZSBvciBwYWdlcwotICAgKgotICAgKiBAcGFyYW0gc3RhcnQgVGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBwYWdlIG9yIHBhZ2VzCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyB2b2lkIHJlbGVhc2UoQWRkcmVzcyBzdGFydCkgewotICAgICgoRnJlZUxpc3RQYWdlUmVzb3VyY2UpIHByKS5yZWxlYXNlUGFnZXMoc3RhcnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNob3VsZCB0aGUgc3dlZXAgcmVjbGFpbSB0aGUgY2VsbCBjb250YWluaW5nIHRoaXMgb2JqZWN0LiBJcyB0aGlzIG9iamVjdAotICAgKiBsaXZlLiBUaGlzIGlzIG9ubHkgdXNlZCB3aGVuIG1haW50YWluU2lkZUJpdG1hcCBpcyBmYWxzZS4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5Ci0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY2VsbCBzaG91bGQgYmUgcmVjbGFpbWVkCi0gICAqLwotICBASW5saW5lCi0gIHByb3RlY3RlZCBib29sZWFuIGlzQ2VsbExpdmUoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmICghSEVBREVSX01BUktfQklUUykgewotICAgICAgcmV0dXJuIHN1cGVyLmlzQ2VsbExpdmUob2JqZWN0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHRlc3RNYXJrU3RhdGUob2JqZWN0KTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIE9iamVjdCBwcm9jZXNzaW5nIGFuZCB0cmFjaW5nCi0gICAqLwotCi0gIC8qKgotICAgKiBUcmFjZSBhIHJlZmVyZW5jZSB0byBhbiBvYmplY3QgdW5kZXIgYSBtYXJrIHN3ZWVwIGNvbGxlY3Rpb24KLSAgICogcG9saWN5LiAgSWYgdGhlIG9iamVjdCBoZWFkZXIgaXMgbm90IGFscmVhZHkgbWFya2VkLCBtYXJrIHRoZQotICAgKiBvYmplY3QgaW4gZWl0aGVyIHRoZSBiaXRtYXAgb3IgYnkgbW92aW5nIGl0IG9mZiB0aGUgdHJlYWRtaWxsLAotICAgKiBhbmQgZW5xdWV1ZSB0aGUgb2JqZWN0IGZvciBzdWJzZXF1ZW50IHByb2Nlc3NpbmcuIFRoZSBvYmplY3QgaXMKLSAgICogbWFya2VkIGFzIChhbiBhdG9taWMpIHNpZGUtZWZmZWN0IG9mIGNoZWNraW5nIHdoZXRoZXIgYWxyZWFkeQotICAgKiBtYXJrZWQuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBiZSB0cmFjZWQuCi0gICAqIEByZXR1cm4gVGhlIG9iamVjdCAodGhlcmUgaXMgbm8gb2JqZWN0IGZvcndhcmRpbmcgaW4gdGhpcwotICAgKiBjb2xsZWN0b3IsIHNvIHdlIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgb2JqZWN0OiB0aGlzIGNvdWxkIGJlIGEKLSAgICogdm9pZCBtZXRob2QgYnV0IGZvciBjb21wbGlhbmNlIHRvIGEgbW9yZSBnZW5lcmFsIGludGVyZmFjZSkuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBPYmplY3RSZWZlcmVuY2UgdHJhY2VPYmplY3QoVHJhbnNpdGl2ZUNsb3N1cmUgdHJhY2UsIE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAoSEVBREVSX01BUktfQklUUykgewotICAgICAgaWYgKHRlc3RBbmRNYXJrKG9iamVjdCkpIHsKLSAgICAgICAgbWFya0Jsb2NrKG9iamVjdCk7Ci0gICAgICAgIHRyYWNlLnByb2Nlc3NOb2RlKG9iamVjdCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICh0ZXN0QW5kU2V0TGl2ZUJpdChvYmplY3QpKSB7Ci0gICAgICAgIHRyYWNlLnByb2Nlc3NOb2RlKG9iamVjdCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBvYmplY3Q7Ci0gIH0KLQotICAvKioKLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IGluIHF1ZXN0aW9uCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIG9iamVjdCBpcyBrbm93biB0byBiZSBsaXZlIChpLmUuIGl0IGlzIG1hcmtlZCkKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGJvb2xlYW4gaXNMaXZlKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAoSEVBREVSX01BUktfQklUUykgewotICAgICAgcmV0dXJuIHRlc3RNYXJrU3RhdGUob2JqZWN0KTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGxpdmVCaXRTZXQob2JqZWN0KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBwcmV2aW91cyBtYXJrIHN0YXRlLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBwcmV2aW91cyBtYXJrIHN0YXRlLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgYnl0ZSBnZXRQcmV2aW91c01hcmtTdGF0ZSgpIHsKLSAgICByZXR1cm4gZGVsdGFNYXJrU3RhdGUoZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbWFyayBzdGF0ZSBpbmNyZW1lbnRlZCBvciBkZWNyZW1lbnRlZCBieSBvbmUuCi0gICAqCi0gICAqIEBwYXJhbSBpbmNyZW1lbnQgSWYgdHJ1ZSwgdGhlbiByZXR1cm4gdGhlIGluY3JlbWVudGVkIHZhbHVlIGVsc2UgcmV0dXJuIHRoZSBkZWNyZW1lbnRlZCB2YWx1ZQotICAgKiBAcmV0dXJuIHRoZSBtYXJrIHN0YXRlIGluY3JlbWVudGVkIG9yIGRlY3JlbWVudGVkIGJ5IG9uZS4KLSAgICovCi0gIHByaXZhdGUgYnl0ZSBkZWx0YU1hcmtTdGF0ZShib29sZWFuIGluY3JlbWVudCkgewotICAgIGJ5dGUgbWFzayA9IChieXRlKSAoKCgxIDw8IE9wdGlvbnMubWFya1N3ZWVwTWFya0JpdHMuZ2V0VmFsdWUoKSkgLSAxKTw8Q09VTlRfQkFTRSk7Ci0gICAgYnl0ZSBydG4gPSAoYnl0ZSkgKGluY3JlbWVudCA/IG1hcmtTdGF0ZSArIE1BUktfQ09VTlRfSU5DUkVNRU5UIDogbWFya1N0YXRlIC0gTUFSS19DT1VOVF9JTkNSRU1FTlQpOwotICAgIHJ0biAmPSBtYXNrOwotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KChtYXJrU3RhdGUgJiB+TUFSS19DT1VOVF9NQVNLKSA9PSAwKTsKLSAgICByZXR1cm4gcnRuOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSGVhZGVyIG1hbmlwdWxhdGlvbgotICAgKi8KLQotICAvKioKLSAgICogUGVyZm9ybSBhbnkgcmVxdWlyZWQgcG9zdCBhbGxvY2F0aW9uIGluaXRpYWxpemF0aW9uCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCByZWYgdG8gdGhlIHN0b3JhZ2UgdG8gYmUgaW5pdGlhbGl6ZWQKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHZvaWQgcG9zdEFsbG9jKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpbml0aWFsaXplSGVhZGVyKG9iamVjdCwgdHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUGVyZm9ybSBhbnkgcmVxdWlyZWQgcG9zdCBjb3B5IChpLmUuIGluLUdDIGFsbG9jYXRpb24pIGluaXRpYWxpemF0aW9uLgotICAgKiBUaGlzIGlzIHJlbGV2YW50IChmb3IgZXhhbXBsZSkgd2hlbiBNUyBpcyB1c2VkIGFzIHRoZSBtYXR1cmUgc3BhY2UgaW4KLSAgICogYSBjb3B5aW5nIEdDLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgcmVmIHRvIHRoZSBzdG9yYWdlIHRvIGJlIGluaXRpYWxpemVkCi0gICAqIEBwYXJhbSBtYWpvckdDIElzIHRoaXMgY29weSBoYXBwZW5pbmcgZHVyaW5nIGEgbWFqb3IgZ2M/Ci0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyB2b2lkIHBvc3RDb3B5KE9iamVjdFJlZmVyZW5jZSBvYmplY3QsIGJvb2xlYW4gbWFqb3JHQykgewotICAgIGluaXRpYWxpemVIZWFkZXIob2JqZWN0LCBmYWxzZSk7Ci0gICAgaWYgKCFIRUFERVJfTUFSS19CSVRTKSB7Ci0gICAgICB0ZXN0QW5kU2V0TGl2ZUJpdChvYmplY3QpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIGFueSByZXF1aXJlZCBpbml0aWFsaXphdGlvbiBvZiB0aGUgR0MgcG9ydGlvbiBvZiB0aGUgaGVhZGVyLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgcmVmIHRvIHRoZSBzdG9yYWdlIHRvIGJlIGluaXRpYWxpemVkCi0gICAqIEBwYXJhbSBhbGxvYyBpcyB0aGlzIGluaXRpYWxpemF0aW9uIG9jY3VyaW5nIGR1ZSB0byAoaW5pdGlhbCkgYWxsb2NhdGlvbgotICAgKiAodHJ1ZSkgb3IgZHVlIHRvIGNvcHlpbmcgKGZhbHNlKT8KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZUhlYWRlcihPYmplY3RSZWZlcmVuY2Ugb2JqZWN0LCBib29sZWFuIGFsbG9jKSB7Ci0gICAgaWYgKEhFQURFUl9NQVJLX0JJVFMpIHsKLSAgICAgIGJ5dGUgb2xkVmFsdWUgPSBWTS5vYmplY3RNb2RlbC5yZWFkQXZhaWxhYmxlQnl0ZShvYmplY3QpOwotICAgICAgYnl0ZSBuZXdWYWx1ZSA9IChieXRlKSAoKG9sZFZhbHVlICYgfk1BUktfQ09VTlRfTUFTSykgfCAoYWxsb2MgPyBhbGxvY1N0YXRlIDogbWFya1N0YXRlKSk7Ci0gICAgICBpZiAoSGVhZGVyQnl0ZS5ORUVEU19VTkxPR0dFRF9CSVQpIG5ld1ZhbHVlIHw9IEhlYWRlckJ5dGUuVU5MT0dHRURfQklUOwotICAgICAgVk0ub2JqZWN0TW9kZWwud3JpdGVBdmFpbGFibGVCeXRlKG9iamVjdCwgbmV3VmFsdWUpOwotICAgIH0gZWxzZSBpZiAoSGVhZGVyQnl0ZS5ORUVEU19VTkxPR0dFRF9CSVQpCi0gICAgICBIZWFkZXJCeXRlLm1hcmtBc1VubG9nZ2VkKG9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogQXRvbWljYWxseSBhdHRlbXB0IHRvIHNldCB0aGUgbWFyayBiaXQgb2YgYW4gb2JqZWN0LiAgUmV0dXJuIHRydWUKLSAgICogaWYgc3VjY2Vzc2Z1bCwgZmFsc2UgaWYgdGhlIG1hcmsgYml0IHdhcyBhbHJlYWR5IHNldC4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHdob3NlIG1hcmsgYml0IGlzIHRvIGJlIHdyaXR0ZW4KLSAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB3aGljaCB0aGUgbWFyayBiaXRzIHdpbGwgYmUgc2V0Ci0gICAqLwotICBASW5saW5lCi0gIHByaXZhdGUgYm9vbGVhbiB0ZXN0QW5kTWFyayhPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgYnl0ZSBvbGRWYWx1ZSwgbWFya0JpdHM7Ci0gICAgb2xkVmFsdWUgPSBWTS5vYmplY3RNb2RlbC5yZWFkQXZhaWxhYmxlQnl0ZShvYmplY3QpOwotICAgIG1hcmtCaXRzID0gKGJ5dGUpIChvbGRWYWx1ZSAmIE1BUktfQ09VTlRfTUFTSyk7Ci0gICAgaWYgKG1hcmtCaXRzID09IG1hcmtTdGF0ZSkgcmV0dXJuIGZhbHNlOwotICAgIFZNLm9iamVjdE1vZGVsLndyaXRlQXZhaWxhYmxlQnl0ZShvYmplY3QsIChieXRlKSgob2xkVmFsdWUgJiB+TUFSS19DT1VOVF9NQVNLKSB8IG1hcmtTdGF0ZSkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0cnVlIGlmIHRoZSBtYXJrIGNvdW50IGZvciBhbiBvYmplY3QgaGFzIHRoZSBnaXZlbiB2YWx1ZS4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHdob3NlIG1hcmsgYml0IGlzIHRvIGJlIHRlc3RlZAotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIGFnYWluc3Qgd2hpY2ggdGhlIG1hcmsgYml0IHdpbGwgYmUgdGVzdGVkCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbWFyayBiaXQgZm9yIHRoZSBvYmplY3QgaGFzIHRoZSBnaXZlbiB2YWx1ZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSBib29sZWFuIHRlc3RNYXJrU3RhdGUoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KChtYXJrU3RhdGUgJiB+TUFSS19DT1VOVF9NQVNLKSA9PSAwKTsKLSAgICByZXR1cm4gKFZNLm9iamVjdE1vZGVsLnJlYWRBdmFpbGFibGVCeXRlKG9iamVjdCkgJiBNQVJLX0NPVU5UX01BU0spID09IG1hcmtTdGF0ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvUmF3UGFnZVNwYWNlLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BvbGljeS9SYXdQYWdlU3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY2N2MxNy4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BvbGljeS9SYXdQYWdlU3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wb2xpY3k7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYW5zaXRpdmVDbG9zdXJlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuaGVhcC5GcmVlTGlzdFBhZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmhlYXAuVk1SZXF1ZXN0OwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogRWFjaCBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGNvcnJlc3BvbmRzIHRvIG9uZSByYXcgcGFnZSBzcGFjZS4KLSAqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFjY2VzcyB0byByYXcgbWVtb3J5IGZvciBtYW5hZ2luZyBpbnRlcm5hbCBtZXRhCi0gKiBkYXRhLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlIHB1YmxpYyBmaW5hbCBjbGFzcyBSYXdQYWdlU3BhY2UgZXh0ZW5kcyBTcGFjZQotICBpbXBsZW1lbnRzIENvbnN0YW50cyB7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWxsZXIgc3BlY2lmaWVzIHRoZSByZWdpb24gb2YgdmlydHVhbCBtZW1vcnkgdG8gYmUgdXNlZCBmb3IKLSAgICogdGhpcyBzcGFjZS4gIElmIHRoaXMgcmVnaW9uIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIHNwYWNlLAotICAgKiB0aGVuIHRoZSBjb25zdHJ1Y3RvciB3aWxsIGZhaWwuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoaXMgc3BhY2UgKHVzZWQgd2hlbiBwcmludGluZyBlcnJvciBtZXNzYWdlcyBldGMpCi0gICAqIEBwYXJhbSBwYWdlQnVkZ2V0IFRoZSBudW1iZXIgb2YgcGFnZXMgdGhpcyBzcGFjZSBtYXkgY29uc3VtZQotICAgKiBiZWZvcmUgY29uc3VsdGluZyB0aGUgcGxhbgotICAgKiBAcGFyYW0gdm1SZXF1ZXN0IEFuIG9iamVjdCBkZXNjcmliaW5nIHRoZSB2aXJ0dWFsIG1lbW9yeSByZXF1ZXN0ZWQuCi0gICAqLwotICBwdWJsaWMgUmF3UGFnZVNwYWNlKFN0cmluZyBuYW1lLCBpbnQgcGFnZUJ1ZGdldCwgVk1SZXF1ZXN0IHZtUmVxdWVzdCkgewotICAgIHN1cGVyKG5hbWUsIGZhbHNlLCBmYWxzZSwgdm1SZXF1ZXN0KTsKLSAgICBpZiAodm1SZXF1ZXN0LmlzRGlzY29udGlndW91cygpKSB7Ci0gICAgICBwciA9IG5ldyBGcmVlTGlzdFBhZ2VSZXNvdXJjZShwYWdlQnVkZ2V0LCB0aGlzLCAwKTsKLSAgICB9IGVsc2UgewotICAgICAgcHIgPSBuZXcgRnJlZUxpc3RQYWdlUmVzb3VyY2UocGFnZUJ1ZGdldCwgdGhpcywgc3RhcnQsIGV4dGVudCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcHJlcGFyZSgpIHsgfQotICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgeyB9Ci0KLSAgLyoqCi0gICAqIFJlbGVhc2UgYSBncm91cCBvZiBwYWdlcyB0aGF0IHdlcmUgYWxsb2NhdGVkIHRvZ2V0aGVyLgotICAgKgotICAgKiBAcGFyYW0gZmlyc3QgVGhlIGZpcnN0IHBhZ2UgaW4gdGhlIGdyb3VwIG9mIHBhZ2VzIHRoYXQgd2VyZQotICAgKiBhbGxvY2F0ZWQgdG9nZXRoZXIuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyB2b2lkIHJlbGVhc2UoQWRkcmVzcyBmaXJzdCkgewotICAgICgoRnJlZUxpc3RQYWdlUmVzb3VyY2UpIHByKS5yZWxlYXNlUGFnZXMoZmlyc3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRyYWNlIGFuIG9iamVjdC4KLSAgICoKLSAgICogVGhpcyBtYWtlcyBubyBzZW5zZSBmb3IgYSByYXcgcGFnZSBzcGFjZSBhbmQgc2hvdWxkIG5ldmVyIGJlCi0gICAqIGNhbGxlZC4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIHRyYWNlZC4KLSAgICogQHJldHVybiA8Y29kZT56ZXJvPC9jb2RlPjogY2FsbGluZyB0aGlzIGlzIGFuIGVycm9yLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlIHRyYWNlT2JqZWN0KFRyYW5zaXRpdmVDbG9zdXJlIHRyYWNlLCBPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZmFsc2UpOwotICAgIHJldHVybiBPYmplY3RSZWZlcmVuY2UubnVsbFJlZmVyZW5jZSgpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNMaXZlKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvU2VncmVnYXRlZEZyZWVMaXN0U3BhY2UuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L1NlZ3JlZ2F0ZWRGcmVlTGlzdFNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZGRjODcuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvU2VncmVnYXRlZEZyZWVMaXN0U3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMDUgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBvbGljeTsKLQotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuYWxsb2MuQmxvY2tBbGxvY2F0b3I7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5hbGxvYy5FbWJlZGRlZE1ldGFEYXRhOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuaGVhcC5GcmVlTGlzdFBhZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmhlYXAuTWFwOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuaGVhcC5WTVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Db252ZXJzaW9uczsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lk1lbW9yeTsKLQotaW1wb3J0IG9yZy5tbXRrLnZtLkxvY2s7Ci1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogRWFjaCBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGNvcnJlc3BvbmRzIHRvIG9uZSBtYXJrLXN3ZWVwICpzcGFjZSouCi0gKiBFYWNoIG9mIHRoZSBpbnN0YW5jZSBtZXRob2RzIG9mIHRoaXMgY2xhc3MgbWF5IGJlIGNhbGxlZCBieSBhbnkKLSAqIHRocmVhZCAoaS5lLiBzeW5jaHJvbml6YXRpb24gbXVzdCBiZSBleHBsaWNpdCBpbiBhbnkgaW5zdGFuY2Ugb3IKLSAqIGNsYXNzIG1ldGhvZCkuICBUaGlzIGNvbnRyYXN0cyB3aXRoIHRoZSBNYXJrU3dlZXBMb2NhbCwgd2hlcmUKLSAqIGluc3RhbmNlcyBjb3JyZXNwb25kIHRvICpwbGFuKiBpbnN0YW5jZXMgYW5kIHRoZXJlZm9yZSB0byBrZXJuZWwKLSAqIHRocmVhZHMuICBUaHVzIHVubGlrZSB0aGlzIGNsYXNzLCBzeW5jaHJvbml6YXRpb24gaXMgbm90IG5lY2Vzc2FyeQotICogaW4gdGhlIGluc3RhbmNlIG1ldGhvZHMgb2YgTWFya1N3ZWVwTG9jYWwuCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZWdyZWdhdGVkRnJlZUxpc3RTcGFjZSBleHRlbmRzIFNwYWNlIGltcGxlbWVudHMgQ29uc3RhbnRzIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQ2xhc3MgdmFyaWFibGVzCi0gICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBMQVpZX1NXRUVQID0gdHJ1ZTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBDT01QQUNUX1NJWkVfQ0xBU1NFUyA9IGZhbHNlOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNSU5fQ0VMTFMgPSA2OwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNQVhfQ0VMTFMgPSA5OTsgLy8gKDE8PChJTlVTRV9CSVRTLTEpKS0xOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNQVhfQ0VMTF9TSVpFID0gODw8MTA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9GUkVFTElTVF9PQkpFQ1RfQllURVMgPSBNQVhfQ0VMTF9TSVpFOwotCi0gIC8vIGxpdmUgYml0cyBldGMKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9MSVZFX1NISUZUID0gTE9HX01JTl9BTElHTk1FTlQ7IC8vIDQgYnl0ZSByZXNvbHV0aW9uCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0dfQklUX0NPVkVSQUdFID0gT0JKRUNUX0xJVkVfU0hJRlQ7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0dfTElWRV9DT1ZFUkFHRSA9IExPR19CSVRfQ09WRVJBR0UgKyBMT0dfQklUU19JTl9CWVRFOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElWRV9CWVRFU19QRVJfUkVHSU9OID0gMSA8PCAoRW1iZWRkZWRNZXRhRGF0YS5MT0dfQllURVNfSU5fUkVHSU9OIC0gTE9HX0xJVkVfQ09WRVJBR0UpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBXb3JkIFdPUkRfU0hJRlRfTUFTSyA9IFdvcmQub25lKCkubHNoKExPR19CSVRTX0lOX1dPUkQpLm1pbnVzKEV4dGVudC5vbmUoKSk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0dfTElWRV9XT1JEX1NUUklERSA9IExPR19MSVZFX0NPVkVSQUdFICsgTE9HX0JZVEVTX0lOX1dPUkQ7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEV4dGVudCBMSVZFX1dPUkRfU1RSSURFID0gRXh0ZW50LmZyb21JbnRTaWduRXh0ZW5kKDE8PExPR19MSVZFX1dPUkRfU1RSSURFKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgV29yZCBMSVZFX1dPUkRfU1RSSURFX01BU0sgPSBMSVZFX1dPUkRfU1RSSURFLm1pbnVzKDEpLnRvV29yZCgpLm5vdCgpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTkVUX01FVEFfREFUQV9CWVRFU19QRVJfUkVHSU9OID0gQmxvY2tBbGxvY2F0b3IuTUVUQV9EQVRBX0JZVEVTX1BFUl9SRUdJT04gKyBMSVZFX0JZVEVTX1BFUl9SRUdJT047Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1FVEFfREFUQV9QQUdFU19QRVJfUkVHSU9OX1dJVEhfQklUTUFQID0gQ29udmVyc2lvbnMuYnl0ZXNUb1BhZ2VzKEV4dGVudC5mcm9tSW50U2lnbkV4dGVuZChORVRfTUVUQV9EQVRBX0JZVEVTX1BFUl9SRUdJT04pKTsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUVUQV9EQVRBX1BBR0VTX1BFUl9SRUdJT05fTk9fQklUTUFQID0gQ29udmVyc2lvbnMuYnl0ZXNUb1BhZ2VzKEV4dGVudC5mcm9tSW50U2lnbkV4dGVuZChCbG9ja0FsbG9jYXRvci5NRVRBX0RBVEFfQllURVNfUEVSX1JFR0lPTikpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHRlbnQgTUVUQV9EQVRBX09GRlNFVCA9IEJsb2NrQWxsb2NhdG9yLk1FVEFfREFUQV9FWFRFTlQ7Ci0KLQotICAvLyBjYWxjdWxhdGUgd29yc3QgY2FzZSBmcmFnbWVudGF0aW9uIHZlcnkgY29uc2VydmF0aXZlbHkKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5FV19TSVpFQ0xBU1NfT1ZFUkhFQUQgPSBzaXplQ2xhc3NDb3VudCgpOyAgLy8gb25lIHBhZ2Ugd2FzdGVkIHBlciBzaXplIGNsYXNzCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9PVkVSSEVBRCA9IE1FVEFfREFUQV9QQUdFU19QRVJfUkVHSU9OX1dJVEhfQklUTUFQOyAvLyB3b3JzdCBjYXNlIHNjZW5hcmlvCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgV09SU1RfQ0FTRV9GUkFHTUVOVEFUSU9OID0gMSArICgoTkVXX1NJWkVDTEFTU19PVkVSSEVBRCArIE1FVEFEQVRBX09WRVJIRUFEKS8oZmxvYXQpIEVtYmVkZGVkTWV0YURhdGEuQllURVNfSU5fUkVHSU9OKTsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbnN0YW5jZSB2YXJpYWJsZXMKLSAgICovCi0gIHByb3RlY3RlZCBmaW5hbCBMb2NrIGxvY2sgPSBWTS5uZXdMb2NrKCJTZWdyZWdhdGVkRnJlZUxpc3RHbG9iYWwiKTsKLSAgcHJvdGVjdGVkIGZpbmFsIEFkZHJlc3NBcnJheSBjb25zdW1lZEJsb2NrSGVhZCA9IEFkZHJlc3NBcnJheS5jcmVhdGUoc2l6ZUNsYXNzQ291bnQoKSk7Ci0gIHByb3RlY3RlZCBmaW5hbCBBZGRyZXNzQXJyYXkgZmx1c2hlZEJsb2NrSGVhZCA9IEFkZHJlc3NBcnJheS5jcmVhdGUoc2l6ZUNsYXNzQ291bnQoKSk7Ci0gIHByb3RlY3RlZCBmaW5hbCBBZGRyZXNzQXJyYXkgYXZhaWxhYmxlQmxvY2tIZWFkID0gQWRkcmVzc0FycmF5LmNyZWF0ZShzaXplQ2xhc3NDb3VudCgpKTsKLQotICBwcml2YXRlIGZpbmFsIGludFtdIGNlbGxTaXplID0gbmV3IGludFtzaXplQ2xhc3NDb3VudCgpXTsKLSAgcHJpdmF0ZSBmaW5hbCBieXRlW10gYmxvY2tTaXplQ2xhc3MgPSBuZXcgYnl0ZVtzaXplQ2xhc3NDb3VudCgpXTsKLSAgcHJpdmF0ZSBmaW5hbCBpbnRbXSBibG9ja0hlYWRlclNpemUgPSBuZXcgaW50W3NpemVDbGFzc0NvdW50KCldOwotCi0gIC8qKgotICAgKiBUaGUgY2FsbGVyIHNwZWNpZmllcyB0aGUgcmVnaW9uIG9mIHZpcnR1YWwgbWVtb3J5IHRvIGJlIHVzZWQgZm9yCi0gICAqIHRoaXMgc3BhY2UuICBJZiB0aGlzIHJlZ2lvbiBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyBzcGFjZSwKLSAgICogdGhlbiB0aGUgY29uc3RydWN0b3Igd2lsbCBmYWlsLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGlzIHNwYWNlICh1c2VkIHdoZW4gcHJpbnRpbmcgZXJyb3IgbWVzc2FnZXMgZXRjKQotICAgKiBAcGFyYW0gcGFnZUJ1ZGdldCBUaGUgbnVtYmVyIG9mIHBhZ2VzIHRoaXMgc3BhY2UgbWF5IGNvbnN1bWUgYmVmb3JlIGNvbnN1bHRpbmcgdGhlIHBsYW4KLSAgICogQHBhcmFtIGFkZGl0aW9uYWxNZXRhZGF0YSBUaGUgbnVtYmVyIG9mIG1ldGEgZGF0YSBieXRlcyBwZXIgcmVnaW9uIGZvciB0aGUgc3ViY2xhc3MuCi0gICAqIEBwYXJhbSB2bVJlcXVlc3QgQW4gb2JqZWN0IGRlc2NyaWJpbmcgdGhlIHZpcnR1YWwgbWVtb3J5IHJlcXVlc3RlZC4KLSAgICovCi0gIHB1YmxpYyBTZWdyZWdhdGVkRnJlZUxpc3RTcGFjZShTdHJpbmcgbmFtZSwgaW50IHBhZ2VCdWRnZXQsIGludCBhZGRpdGlvbmFsTWV0YWRhdGEsIFZNUmVxdWVzdCB2bVJlcXVlc3QpIHsKLSAgICBzdXBlcihuYW1lLCBmYWxzZSwgZmFsc2UsIHZtUmVxdWVzdCk7Ci0gICAgaW5pdFNpemVDbGFzc2VzKCk7Ci0gICAgaW50IHRvdGFsTWV0YWRhdGEgPSBhZGRpdGlvbmFsTWV0YWRhdGE7Ci0gICAgaWYgKG1haW50YWluU2lkZUJpdG1hcCgpKSB7Ci0gICAgICB0b3RhbE1ldGFkYXRhICs9IE1FVEFfREFUQV9QQUdFU19QRVJfUkVHSU9OX1dJVEhfQklUTUFQOwotICAgIH0gZWxzZSB7Ci0gICAgICB0b3RhbE1ldGFkYXRhICs9IE1FVEFfREFUQV9QQUdFU19QRVJfUkVHSU9OX05PX0JJVE1BUDsKLSAgICB9Ci0gICAgaWYgKHZtUmVxdWVzdC5pc0Rpc2NvbnRpZ3VvdXMoKSkgewotICAgICAgcHIgPSBuZXcgRnJlZUxpc3RQYWdlUmVzb3VyY2UocGFnZUJ1ZGdldCwgdGhpcywgdG90YWxNZXRhZGF0YSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByID0gbmV3IEZyZWVMaXN0UGFnZVJlc291cmNlKHBhZ2VCdWRnZXQsIHRoaXMsIHN0YXJ0LCBleHRlbnQsIHRvdGFsTWV0YWRhdGEpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTaG91bGQgU2VncmVnYXRlZEZyZWVMaXN0U3BhY2UgbWFuYWdlIGEgc2lkZSBiaXRtYXAgdG8ga2VlcCB0cmFjayBvZiBsaXZlIG9iamVjdHM/Ci0gICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBtYWludGFpblNpZGVCaXRtYXAoKTsKLQotICAvKioKLSAgICogRG8gd2UgbmVlZCB0byBwcmVzZXJ2ZSBmcmVlIGxpc3RzIGFzIHdlIG1vdmUgYmxvY2tzIGFyb3VuZC4KLSAgICovCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHByZXNlcnZlRnJlZUxpc3QoKTsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBBbGxvY2F0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBibG9jayB0byB0aGUgZ2xvYmFsIHBvb2wuCi0gICAqCi0gICAqIEBwYXJhbSBibG9jayBUaGUgYmxvY2sgdG8gcmV0dXJuCi0gICAqIEBwYXJhbSBzaXplQ2xhc3MgVGhlIHNpemUgY2xhc3MKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJldHVybkNvbnN1bWVkQmxvY2soQWRkcmVzcyBibG9jaywgaW50IHNpemVDbGFzcykgewotICAgIHJldHVybkJsb2NrKGJsb2NrLCBzaXplQ2xhc3MsIEFkZHJlc3MuemVybygpKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBibG9jayB0byB0aGUgZ2xvYmFsIHBvb2wuCi0gICAqCi0gICAqIEBwYXJhbSBibG9jayBUaGUgYmxvY2sgdG8gcmV0dXJuCi0gICAqIEBwYXJhbSBzaXplQ2xhc3MgVGhlIHNpemUgY2xhc3MKLSAgICogQHBhcmFtIGZyZWVDZWxsIFRoZSBmaXJzdCBmcmVlIGNlbGwgaW4gdGhlIGJsb2NrLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmV0dXJuQmxvY2soQWRkcmVzcyBibG9jaywgaW50IHNpemVDbGFzcywgQWRkcmVzcyBmcmVlQ2VsbCkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgewotICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KEJsb2NrQWxsb2NhdG9yLmdldE5leHQoYmxvY2spLmlzWmVybygpKTsKLSAgICB9Ci0gICAgaWYgKHByZXNlcnZlRnJlZUxpc3QoKSkgewotICAgICAgc2V0RnJlZUxpc3QoYmxvY2ssIGZyZWVDZWxsKTsKLSAgICB9Ci0gICAgbG9jay5hY3F1aXJlKCk7Ci0gICAgQmxvY2tBbGxvY2F0b3Iuc2V0TmV4dChibG9jaywgY29uc3VtZWRCbG9ja0hlYWQuZ2V0KHNpemVDbGFzcykpOwotICAgIGNvbnN1bWVkQmxvY2tIZWFkLnNldChzaXplQ2xhc3MsIGJsb2NrKTsKLSAgICBsb2NrLnJlbGVhc2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiBBY3F1aXJlIGEgbmV3IGJsb2NrIGZyb20gdGhlIGdsb2JhbCBwb29sIHRvIGFsbG9jYXRlIGludG8uIFRoaXMgbWV0aG9kCi0gICAqIHdpdGggZWl0aGVyIHJldHVybiBhIG5vbi1lbXB0eSBmcmVlIGxpc3QsIG9yIHplcm8gd2hlbiBhbGxvY2F0aW9uCi0gICAqIGZhaWxzLgotICAgKgotICAgKiBUaGlzIG1ldGhvZCB3aWxsIHBvcHVsYXRlIHRoZSBwYXNzZWQgaW4gZnJlZSBsaXN0IGZvciB0aGUgZ2l2ZW4gc2l6ZQotICAgKiBjbGFzcyBhbmQgcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBibG9jay4KLSAgICoKLSAgICogQHBhcmFtIHNpemVDbGFzcyBUaGUgc2l6ZSBjbGFzcyB0byBhbGxvY2F0ZSBpbnRvCi0gICAqIEBwYXJhbSBmcmVlTGlzdCBUaGUgZnJlZSBsaXN0IHRvIHBvcHVsYXRlCi0gICAqIEByZXR1cm4gVGhlIGFkZHJlc3Mgb2YgdGhlIGJsb2NrCi0gICAqLwotICBwdWJsaWMgQWRkcmVzcyBnZXRBbGxvY2F0aW9uQmxvY2soaW50IHNpemVDbGFzcywgQWRkcmVzc0FycmF5IGZyZWVMaXN0KSB7Ci0gICAgbG9jay5hY3F1aXJlKCk7Ci0gICAgQWRkcmVzcyBibG9jazsKLSAgICB3aGlsZSghKGJsb2NrID0gYXZhaWxhYmxlQmxvY2tIZWFkLmdldChzaXplQ2xhc3MpKS5pc1plcm8oKSkgewotICAgICAgYXZhaWxhYmxlQmxvY2tIZWFkLnNldChzaXplQ2xhc3MsIEJsb2NrQWxsb2NhdG9yLmdldE5leHQoYmxvY2spKTsKLSAgICAgIGxvY2sucmVsZWFzZSgpOwotCi0gICAgICAvKiBUaGlzIGJsb2NrIGlzIG5vIGxvbmdlciBvbiBhbnkgbGlzdCAqLwotICAgICAgQmxvY2tBbGxvY2F0b3Iuc2V0TmV4dChibG9jaywgQWRkcmVzcy56ZXJvKCkpOwotCi0gICAgICAvKiBDYW4gd2UgYWxsb2NhdGUgaW50byB0aGlzIGJsb2NrPyAqLwotICAgICAgQWRkcmVzcyBjZWxsID0gYWR2YW5jZVRvQmxvY2soYmxvY2ssIHNpemVDbGFzcyk7Ci0gICAgICBpZiAoIWNlbGwuaXNaZXJvKCkpIHsKLSAgICAgICAgZnJlZUxpc3Quc2V0KHNpemVDbGFzcywgY2VsbCk7Ci0gICAgICAgIHJldHVybiBibG9jazsKLSAgICAgIH0KLQotICAgICAgLyogQmxvY2sgd2FzIGZ1bGwgKi8KLSAgICAgIGxvY2suYWNxdWlyZSgpOwotICAgICAgQmxvY2tBbGxvY2F0b3Iuc2V0TmV4dChibG9jaywgY29uc3VtZWRCbG9ja0hlYWQuZ2V0KHNpemVDbGFzcykpOwotICAgICAgY29uc3VtZWRCbG9ja0hlYWQuc2V0KHNpemVDbGFzcywgYmxvY2spOwotICAgIH0KLSAgICBsb2NrLnJlbGVhc2UoKTsKLSAgICByZXR1cm4gZXhwYW5kU2l6ZUNsYXNzKHNpemVDbGFzcywgZnJlZUxpc3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIEV4cGFuZCBhIHBhcnRpY3VsYXIgc2l6ZSBjbGFzcywgYWxsb2NhdGluZyBhIG5ldyBibG9jaywgYnJlYWtpbmcKLSAgICogdGhlIGJsb2NrIGludG8gY2VsbHMgYW5kIHBsYWNpbmcgdGhvc2UgY2VsbHMgb24gYSBmcmVlIGxpc3QgZm9yCi0gICAqIHRoYXQgYmxvY2suICBUaGUgYmxvY2sgYmVjb21lcyB0aGUgY3VycmVudCBoZWFkIGZvciB0aGlzIHNpemUKLSAgICogY2xhc3MgYW5kIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBhdmFpbGFibGUgY2VsbCBpcyByZXR1cm5lZC48cD4KLSAgICoKLSAgICogPGI+VGhpcyBpcyBndWFyYW50ZWVkIHRvIHJldHVybiBwcmUtemVyb2VkIGNlbGxzPC9iPgotICAgKgotICAgKiBAcGFyYW0gc2l6ZUNsYXNzIFRoZSBzaXplIGNsYXNzIHRvIGJlIGV4cGFuZGVkCi0gICAqIEBwYXJhbSBmcmVlTGlzdCBUaGUgZnJlZSBsaXN0IHRvIHBvcHVsYXRlLgotICAgKiBAcmV0dXJuIFRoZSBibG9jayB0aGF0IHdhcyBqdXN0IGFsbG9jYXRlZC4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSBBZGRyZXNzIGV4cGFuZFNpemVDbGFzcyhpbnQgc2l6ZUNsYXNzLCBBZGRyZXNzQXJyYXkgZnJlZUxpc3QpIHsKLSAgICBBZGRyZXNzIGJsb2NrID0gQmxvY2tBbGxvY2F0b3IuYWxsb2ModGhpcywgYmxvY2tTaXplQ2xhc3Nbc2l6ZUNsYXNzXSk7Ci0KLSAgICBpZiAoYmxvY2suaXNaZXJvKCkpIHsKLSAgICAgIHJldHVybiBBZGRyZXNzLnplcm8oKTsKLSAgICB9Ci0KLSAgICBCbG9ja0FsbG9jYXRvci5zZXROZXh0KGJsb2NrLCBBZGRyZXNzLnplcm8oKSk7Ci0gICAgQmxvY2tBbGxvY2F0b3Iuc2V0QWxsQ2xpZW50U2l6ZUNsYXNzKGJsb2NrLCBibG9ja1NpemVDbGFzc1tzaXplQ2xhc3NdLCAoYnl0ZSkgc2l6ZUNsYXNzKTsKLQotICAgIG5vdGlmeU5ld0Jsb2NrKGJsb2NrLCBzaXplQ2xhc3MpOwotCi0gICAgaW50IGNlbGxFeHRlbnQgPSBjZWxsU2l6ZVtzaXplQ2xhc3NdOwotICAgIGludCBibG9ja1NpemUgPSBCbG9ja0FsbG9jYXRvci5ibG9ja1NpemUoYmxvY2tTaXplQ2xhc3Nbc2l6ZUNsYXNzXSk7Ci0gICAgaW50IHVzZWFibGVCbG9ja1NpemUgPSBibG9ja1NpemUgLSBibG9ja0hlYWRlclNpemVbc2l6ZUNsYXNzXTsKLSAgICBBZGRyZXNzIGZpcnN0Q2VsbCA9IGJsb2NrLnBsdXMoYmxvY2tIZWFkZXJTaXplW3NpemVDbGFzc10pOwotICAgIEFkZHJlc3Mgc2VudGluZWwgPSBibG9jay5wbHVzKGJsb2NrU2l6ZSk7Ci0KLSAgICAvKiBwcmUtemVybyB0aGUgYmxvY2sgKi8KLSAgICBWTS5tZW1vcnkuemVybyhmaXJzdENlbGwsIEV4dGVudC5mcm9tSW50WmVyb0V4dGVuZCh1c2VhYmxlQmxvY2tTaXplKSk7Ci0KLSAgICAvKiBjb25zdHJ1Y3QgdGhlIGZyZWUgbGlzdCAqLwotICAgIEFkZHJlc3MgbmV4dENlbGw7Ci0gICAgQWRkcmVzcyBjZWxsID0gZmlyc3RDZWxsOwotICAgIHdoaWxlICgobmV4dENlbGwgPSBjZWxsLnBsdXMoY2VsbEV4dGVudCkpLkxUKHNlbnRpbmVsKSkgewotICAgICAgY2VsbC5zdG9yZShuZXh0Q2VsbCk7Ci0gICAgICBjZWxsID0gbmV4dENlbGw7Ci0gICAgfQotCi0gICAgLyogUG9wdWxhdGUgdGhlIGZyZWUgbGlzdCAqLwotICAgIGZyZWVMaXN0LnNldChzaXplQ2xhc3MsIGZpcnN0Q2VsbCk7Ci0gICAgcmV0dXJuIGJsb2NrOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQmxvY2sgbWFuYWdlbWVudAotICAgKi8KLQotICAvKioKLSAgICogSW5pdGlhbGl6ZSB0aGUgc2l6ZSBjbGFzcyBkYXRhIHN0cnVjdHVyZXMuCi0gICAqLwotICBwcml2YXRlIHZvaWQgaW5pdFNpemVDbGFzc2VzKCkgewotICAgIGZvciAoaW50IHNjID0gMDsgc2MgPCBzaXplQ2xhc3NDb3VudCgpOyBzYysrKSB7Ci0gICAgICBjZWxsU2l6ZVtzY10gPSBnZXRCYXNlQ2VsbFNpemUoc2MpOwotICAgICAgZm9yIChieXRlIGJsayA9IDA7IGJsayA8IEJsb2NrQWxsb2NhdG9yLkJMT0NLX1NJWkVfQ0xBU1NFUzsgYmxrKyspIHsKLSAgICAgICAgaW50IHVzYWJsZUJ5dGVzID0gQmxvY2tBbGxvY2F0b3IuYmxvY2tTaXplKGJsayk7Ci0gICAgICAgIGludCBjZWxscyA9IHVzYWJsZUJ5dGVzIC8gY2VsbFNpemVbc2NdOwotICAgICAgICBibG9ja1NpemVDbGFzc1tzY10gPSBibGs7Ci0gICAgICAgIC8qIGNlbGxzIG11c3Qgc3RhcnQgYXQgbXVsdGlwbGUgb2YgTUlOX0FMSUdOTUVOVCBiZWNhdXNlCi0gICAgICAgICAgIGNlbGxTaXplIGlzIGFsc28gc3VwcG9zZWQgdG8gYmUgbXVsdGlwbGUsIHRoaXMgc2hvdWxkIGRvCi0gICAgICAgICAgIHRoZSB0cmljazogKi8KLSAgICAgICAgYmxvY2tIZWFkZXJTaXplW3NjXSA9IEJsb2NrQWxsb2NhdG9yLmJsb2NrU2l6ZShibGspIC0gY2VsbHMgKiBjZWxsU2l6ZVtzY107Ci0gICAgICAgIGlmICgoKHVzYWJsZUJ5dGVzIDwgQllURVNfSU5fUEFHRSkgJiYgKGNlbGxzKjIgPiBNQVhfQ0VMTFMpKSB8fAotICAgICAgICAgICAgKCh1c2FibGVCeXRlcyA+IChCWVRFU19JTl9QQUdFPj4xKSkgJiYgKGNlbGxzID4gTUlOX0NFTExTKSkpCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgc2l6ZSBjbGFzcyBmb3IgYSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMuCi0gICAqCi0gICAqIFdlIHVzZSBzaXplIGNsYXNzZXMgYmFzZWQgb24gYSB3b3JzdCBjYXNlIGludGVybmFsIGZyYWdtZW50YXRpb24KLSAgICogbG9zcyB0YXJnZXQgb2YgMS84LiAgSW4gZmFjdCwgYWNyb3NzIHNpemVzIGZyb20gOCBieXRlcyB0byA1MTIKLSAgICogdGhlIGF2ZXJhZ2Ugd29yc3QgY2FzZSBsb3NzIGlzIDEzLjMlLCBnaXZpbmcgYW4gZXhwZWN0ZWQgbG9zcwotICAgKiAoYXNzdW1pbmcgdW5pZm9ybSBkaXN0cmlidXRpb24pIG9mIGFib3V0IDclLiAgV2UgYXZvaWQgdXNpbmcgdGhlCi0gICAqIExlYSBjbGFzcyBzaXplcyBiZWNhdXNlIHRoZXkgd2VyZSBzbyBudW1lcm91cyBhbmQgdGhlcmVmb3JlCi0gICAqIGxpYWJsZSB0byBsZWFkIHRvIGV4Y2Vzc2l2ZSBpbnRlci1jbGFzcy1zaXplIGZyYWdtZW50YXRpb24uPHA+Ci0gICAqCi0gICAqIFRoaXMgbWV0aG9kIG1heSBzZWdyZWdhdGUgYXJyYXlzIGFuZCBzY2FsYXJzIChjdXJyZW50bHkgaXQgZG9lcwotICAgKiBub3QpLjxwPgotICAgKgotICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgbW9yZSBpbnRlbGxpZ2VudCBhbmQgdGFrZSBhbGlnbm1lbnQgcmVxdWVzdHMKLSAgICogaW50byBjb25zaWRlcmF0aW9uLiBUaGUgaXNzdWUgd2l0aCB0aGlzIGlzIHRoYXQgdGhlIGJsb2NrIGhlYWRlcgotICAgKiB3aGljaCBjYW4gYmUgdmFyaWVkIGJ5IHN1YmNsYXNzZXMgY2FuIGNoYW5nZSB0aGUgYWxpZ25tZW50IG9mIHRoZQotICAgKiBjZWxscy48cD4KLSAgICoKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gYWNjb21tb2RhdGUgdGhlIG9iamVjdAotICAgKiB0byBiZSBhbGxvY2F0ZWQuCi0gICAqIEByZXR1cm4gVGhlIHNpemUgY2xhc3MgY2FwYWJsZSBvZiBhY2NvbW1vZGF0aW5nIHRoZSBhbGxvY2F0aW9uIHJlcXVlc3QuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBmaW5hbCBpbnQgZ2V0U2l6ZUNsYXNzKGludCBieXRlcykgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KChieXRlcyA+IDApICYmIChieXRlcyA8PSBNQVhfQ0VMTF9TSVpFKSk7Ci0KLSAgICBpbnQgc3oxID0gYnl0ZXMgLSAxOwotCi0gICAgaWYgKEJZVEVTX0lOX0FERFJFU1MgPT0gNCkgeyAvLyAzMi1iaXQKLSAgICAgIGlmIChDT01QQUNUX1NJWkVfQ0xBU1NFUykKLSAgICAgICAgcmV0dXJuICgKLSAgICAgICAgICAgIChzejEgPD0gIDMxKSA/ICAgICAgKHN6MSA+PiAgMikgOiAvLyAgICA0IGJ5dGVzIGFwYXJ0Ci0gICAgICAgICAgICAoc3oxIDw9ICA2MykgPyAgNCArIChzejEgPj4gIDMpIDogLy8gICAgOCBieXRlcyBhcGFydAotICAgICAgICAgICAgKHN6MSA8PSAgOTUpID8gIDggKyAoc3oxID4+ICA0KSA6IC8vICAgMTYgYnl0ZXMgYXBhcnQKLSAgICAgICAgICAgIChzejEgPD0gMjIzKSA/IDE0ICsgKHN6MSA+PiAgNikgOiAvLyAgIDY0IGJ5dGVzIGFwYXJ0Ci0gICAgICAgICAgICAoc3oxIDw9IDczNCkgPyAxNyArIChzejEgPj4gIDgpIDogLy8gIDI1NiBieXRlcyBhcGFydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAgKyAoc3oxID4+IDEwKSk7IC8vIDEwMjQgYnl0ZXMgYXBhcnQKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuICgKLSAgICAgICAgICAgIChzejEgPD0gICA2MykgPyAgICAgIChzejEgPj4gIDIpIDogLy8gICAgNCBieXRlcyBhcGFydAotICAgICAgICAgICAgKHN6MSA8PSAgMTI3KSA/IDEyICsgKHN6MSA+PiAgNCkgOiAvLyAgIDE2IGJ5dGVzIGFwYXJ0Ci0gICAgICAgICAgICAoc3oxIDw9ICAyNTUpID8gMTYgKyAoc3oxID4+ICA1KSA6IC8vICAgMzIgYnl0ZXMgYXBhcnQKLSAgICAgICAgICAgIChzejEgPD0gIDUxMSkgPyAyMCArIChzejEgPj4gIDYpIDogLy8gICA2NCBieXRlcyBhcGFydAotICAgICAgICAgICAgKHN6MSA8PSAyMDQ3KSA/IDI2ICsgKHN6MSA+PiAgOCkgOiAvLyAgMjU2IGJ5dGVzIGFwYXJ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIgKyAoc3oxID4+IDEwKSk7IC8vIDEwMjQgYnl0ZXMgYXBhcnQKLSAgICB9IGVsc2UgeyAvLyA2NC1iaXQKLSAgICAgIGlmIChDT01QQUNUX1NJWkVfQ0xBU1NFUykKLSAgICAgICAgcmV0dXJuICgKLSAgICAgICAgICAgIChzejEgPD0gICA5NSkgPyAgICAgIChzejEgPj4gIDMpIDogLy8gICAgOCBieXRlcyBhcGFydAotICAgICAgICAgICAgKHN6MSA8PSAgMTI3KSA/ICA2ICsgKHN6MSA+PiAgNCkgOiAvLyAgIDE2IGJ5dGVzIGFwYXJ0Ci0gICAgICAgICAgICAoc3oxIDw9ICAxOTEpID8gMTAgKyAoc3oxID4+ICA1KSA6IC8vICAgMzIgYnl0ZXMgYXBhcnQKLSAgICAgICAgICAgIChzejEgPD0gIDM4MykgPyAxMyArIChzejEgPj4gIDYpIDogLy8gICA2NCBieXRlcyBhcGFydAotICAgICAgICAgICAgKHN6MSA8PSAgNTExKSA/IDE2ICsgKHN6MSA+PiAgNykgOiAvLyAgMTI4IGJ5dGVzIGFwYXJ0Ci0gICAgICAgICAgICAoc3oxIDw9IDEwMjMpID8gMTkgKyAoc3oxID4+ICA5KSA6IC8vICA1MTIgYnl0ZXMgYXBhcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMCArIChzejEgPj4gMTApKTsgLy8gMTAyNCBieXRlcyBhcGFydAotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gKAotICAgICAgICAgICAgKHN6MSA8PSAgMTExKSA/ICAgICAgKHN6MSA+PiAgMykgOiAvLyAgICA4IGJ5dGVzIGFwYXJ0Ci0gICAgICAgICAgICAoc3oxIDw9ICAyMjMpID8gIDcgKyAoc3oxID4+ICA0KSA6IC8vICAgMTYgYnl0ZXMgYXBhcnQKLSAgICAgICAgICAgIChzejEgPD0gIDMxOSkgPyAxNCArIChzejEgPj4gIDUpIDogLy8gICAzMiBieXRlcyBhcGFydAotICAgICAgICAgICAgKHN6MSA8PSAgNTc1KSA/IDE5ICsgKHN6MSA+PiAgNikgOiAvLyAgIDY0IGJ5dGVzIGFwYXJ0Ci0gICAgICAgICAgICAoc3oxIDw9IDIwNDcpID8gMjYgKyAoc3oxID4+ICA4KSA6IC8vICAyNTYgYnl0ZXMgYXBhcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiArIChzejEgPj4gMTApKTsgLy8gMTAyNCBieXRlcyBhcGFydAotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHNpemUgb2YgYSBiYXNpYyBjZWxsIChpLmUuIG5vdCBpbmNsdWRpbmcgYW55IGNlbGwKLSAgICogaGVhZGVyKSBmb3IgYSBnaXZlbiBzaXplIGNsYXNzLgotICAgKgotICAgKiBAcGFyYW0gc2MgVGhlIHNpemUgY2xhc3MgaW4gcXVlc3Rpb24KLSAgICogQHJldHVybiBUaGUgc2l6ZSBvZiBhIGJhc2ljIGNlbGwgKGkuZS4gbm90IGluY2x1ZGluZyBhbnkgY2VsbAotICAgKiBoZWFkZXIpLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgaW50IGdldEJhc2VDZWxsU2l6ZShpbnQgc2MpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCgoc2MgPj0gMCkgJiYgKHNjIDwgc2l6ZUNsYXNzQ291bnQoKSkpOwotCi0gICAgaWYgKEJZVEVTX0lOX0FERFJFU1MgPT0gNCkgeyAvLyAzMi1iaXQKLSAgICAgIGlmIChDT01QQUNUX1NJWkVfQ0xBU1NFUykKLSAgICAgICAgcmV0dXJuICgoc2MgPCAgOCkgPyAoc2MgKyAgMSkgPDwgIDI6Ci0gICAgICAgICAgICAgICAgKHNjIDwgMTIpID8gKHNjIC0gIDMpIDw8ICAzOgotICAgICAgICAgICAgICAgIChzYyA8IDE2KSA/IChzYyAtICA3KSA8PCAgNDoKLSAgICAgICAgICAgICAgICAoc2MgPCAxOCkgPyAoc2MgLSAxMykgPDwgIDY6Ci0gICAgICAgICAgICAgICAgKHNjIDwgMjEpID8gKHNjIC0gMTYpIDw8ICA4OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzYyAtIDE5KSA8PCAxMCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiAoKHNjIDwgMTYpID8gKHNjICsgIDEpIDw8ICAyOgotICAgICAgICAgICAgICAgIChzYyA8IDIwKSA/IChzYyAtIDExKSA8PCAgNDoKLSAgICAgICAgICAgICAgICAoc2MgPCAyNCkgPyAoc2MgLSAxNSkgPDwgIDU6Ci0gICAgICAgICAgICAgICAgKHNjIDwgMjgpID8gKHNjIC0gMTkpIDw8ICA2OgotICAgICAgICAgICAgICAgIChzYyA8IDM0KSA/IChzYyAtIDI1KSA8PCAgODoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2MgLSAzMSkgPDwgMTApOwotICAgIH0gZWxzZSB7IC8vIDY0LWJpdAotICAgICAgaWYgKENPTVBBQ1RfU0laRV9DTEFTU0VTKQotICAgICAgICByZXR1cm4gKChzYyA8IDEyKSA/IChzYyArICAxKSA8PCAgMzoKLSAgICAgICAgICAgICAgICAoc2MgPCAxNCkgPyAoc2MgLSAgNSkgPDwgIDQ6Ci0gICAgICAgICAgICAgICAgKHNjIDwgMTYpID8gKHNjIC0gIDkpIDw8ICA1OgotICAgICAgICAgICAgICAgIChzYyA8IDE5KSA/IChzYyAtIDEyKSA8PCAgNjoKLSAgICAgICAgICAgICAgICAoc2MgPCAyMCkgPyAoc2MgLSAxNSkgPDwgIDc6Ci0gICAgICAgICAgICAgICAgKHNjIDwgMjEpID8gKHNjIC0gMTgpIDw8ICA5OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzYyAtIDE5KSA8PCAxMCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiAoKHNjIDwgMTQpID8gKHNjICsgIDEpIDw8ICAzOgotICAgICAgICAgICAgICAgIChzYyA8IDIxKSA/IChzYyAtICA2KSA8PCAgNDoKLSAgICAgICAgICAgICAgICAoc2MgPCAyNCkgPyAoc2MgLSAxMykgPDwgIDU6Ci0gICAgICAgICAgICAgICAgKHNjIDwgMjgpID8gKHNjIC0gMTgpIDw8ICA2OgotICAgICAgICAgICAgICAgIChzYyA8IDM0KSA/IChzYyAtIDI1KSA8PCAgODoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2MgLSAzMSkgPDwgMTApOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IHNpemUgY2xhc3Nlcy4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyBpbnQgc2l6ZUNsYXNzQ291bnQoKSB7Ci0gICAgcmV0dXJuIChDT01QQUNUX1NJWkVfQ0xBU1NFUykgPyAyOCA6IDQwOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogUHJlc2VydmluZyAoc2F2aW5nICYgcmVzdG9yaW5nKSBmcmVlIGxpc3RzCi0gICAqLwotCi0gIC8qKgotICAgKiBQcmVwYXJlIGEgYmxvY2sgZm9yIGFsbG9jYXRpb24sIHJldHVybmluZyBhIGZyZWUgbGlzdCBpbnRvIHRoZSBibG9jay4KLSAgICoKLSAgICogQHBhcmFtIGJsb2NrIFRoZSBuZXcgYmxvY2sKLSAgICogQHBhcmFtIHNpemVDbGFzcyBUaGUgYmxvY2sncyBzaXplY2xhc3MuCi0gICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgQWRkcmVzcyBhZHZhbmNlVG9CbG9jayhBZGRyZXNzIGJsb2NrLCBpbnQgc2l6ZUNsYXNzKTsKLQotICAvKioKLSAgICogTm90aWZ5IHRoYXQgYSBuZXcgYmxvY2sgaGFzIGJlZW4gaW5zdGFsbGVkLgotICAgKgotICAgKiBAcGFyYW0gYmxvY2sgVGhlIG5ldyBibG9jawotICAgKiBAcGFyYW0gc2l6ZUNsYXNzIFRoZSBibG9jaydzIHNpemVjbGFzcy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIG5vdGlmeU5ld0Jsb2NrKEFkZHJlc3MgYmxvY2ssIGludCBzaXplQ2xhc3MpIHt9Ci0KLSAgLyoqCi0gICAqIFNob3VsZCB0aGUgc3dlZXAgcmVjbGFpbSB0aGUgY2VsbCBjb250YWluaW5nIHRoaXMgb2JqZWN0LiBJcyB0aGlzIG9iamVjdAotICAgKiBsaXZlLiBUaGlzIGlzIG9ubHkgdXNlZCB3aGVuIG1haW50YWluU2lkZUJpdG1hcCBpcyBmYWxzZS4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5Ci0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY2VsbCBzaG91bGQgYmUgcmVjbGFpbWVkCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiByZWNsYWltQ2VsbEZvck9iamVjdChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgVk0uYXNzZXJ0aW9ucy5mYWlsKCJNdXN0IGltcGxlbWVudCByZWNsYWltQ2VsbEZvck9iamVjdCBpZiBub3QgbWFpbnRhaW5pbmcgc2lkZSBiaXRtYXAiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBNZXRhZGF0YSBtYW5pcHVsYXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIEluIHRoZSBjYXNlIHdoZXJlIGZyZWUgbGlzdHMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggYmxvY2sgYXJlCi0gICAqIHByZXNlcnZlZCwgZ2V0IHRoZSBmcmVlIGxpc3QgZm9yIGEgZ2l2ZW4gYmxvY2suCi0gICAqCi0gICAqIEBwYXJhbSBibG9jayBUaGUgYmxvY2sgd2hvc2UgZnJlZSBsaXN0IGlzIHRvIGJlIGZvdW5kCi0gICAqIEByZXR1cm4gVGhlIGZyZWUgbGlzdCBmb3IgdGhpcyBibG9jawotICAgKi8KLSAgQElubGluZQotICBwcm90ZWN0ZWQgZmluYWwgQWRkcmVzcyBnZXRGcmVlTGlzdChBZGRyZXNzIGJsb2NrKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQocHJlc2VydmVGcmVlTGlzdCgpKTsKLSAgICByZXR1cm4gQmxvY2tBbGxvY2F0b3IuZ2V0RnJlZUxpc3RNZXRhKGJsb2NrKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbiB0aGUgY2FzZSB3aGVyZSBmcmVlIGxpc3RzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGJsb2NrIGFyZQotICAgKiBwcmVzZXJ2ZWQsIHNldCB0aGUgZnJlZSBsaXN0IGZvciBhIGdpdmVuIGJsb2NrLgotICAgKgotICAgKiBAcGFyYW0gYmxvY2sgVGhlIGJsb2NrIHdob3NlIGZyZWUgbGlzdCBpcyB0byBiZSBmb3VuZAotICAgKiBAcGFyYW0gY2VsbCBUaGUgaGVhZCBvZiB0aGUgZnJlZSBsaXN0IChpLmUuIHRoZSBmaXJzdCBjZWxsIGluIHRoZQotICAgKiBmcmVlIGxpc3QpLgotICAgKi8KLSAgQElubGluZQotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRGcmVlTGlzdChBZGRyZXNzIGJsb2NrLCBBZGRyZXNzIGNlbGwpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChwcmVzZXJ2ZUZyZWVMaXN0KCkpOwotICAgIEJsb2NrQWxsb2NhdG9yLnNldEZyZWVMaXN0TWV0YShibG9jaywgY2VsbCk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDb2xsZWN0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBDbGVhciBhbGwgYmxvY2sgbWFya3MgZm9yIHRoaXMgc3BhY2UuICBUaGlzIG1ldGhvZCBpcyBpbXBvcnRhbnQgd2hlbgotICAgKiBpdCBpcyBkZXNpcmFibGUgdG8gZG8gcGFydGlhbCBjb2xsZWN0aW9ucywgd2hpY2ggbWFuIG1lYW4gdGhhdCBibG9jawotICAgKiBtYXJrcyBuZWVkIHRvIGJlIGV4cGxpY2l0bHkgY2xlYXJlZCB3aGVuIG5lY2Vzc2FyeS4KLSAgICovCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIGNsZWFyQWxsQmxvY2tNYXJrcygpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCghbWFpbnRhaW5TaWRlQml0bWFwKCkpOwotICAgIGZvciAoaW50IHNpemVDbGFzcyA9IDA7IHNpemVDbGFzcyA8IHNpemVDbGFzc0NvdW50KCk7IHNpemVDbGFzcysrKSB7Ci0gICAgICBFeHRlbnQgYmxvY2tTaXplID0gRXh0ZW50LmZyb21JbnRTaWduRXh0ZW5kKEJsb2NrQWxsb2NhdG9yLmJsb2NrU2l6ZShibG9ja1NpemVDbGFzc1tzaXplQ2xhc3NdKSk7Ci0gICAgICAvKiBGbHVzaGVkIGJsb2NrcyAqLwotICAgICAgQWRkcmVzcyBibG9jayA9IGZsdXNoZWRCbG9ja0hlYWQuZ2V0KHNpemVDbGFzcyk7Ci0gICAgICB3aGlsZSAoIWJsb2NrLmlzWmVybygpKSB7Ci0gICAgICAgIEFkZHJlc3MgbmV4dCA9IEJsb2NrQWxsb2NhdG9yLmdldE5leHQoYmxvY2spOwotICAgICAgICBjbGVhckJsb2NrTWFyayhibG9jaywgYmxvY2tTaXplKTsKLSAgICAgICAgYmxvY2sgPSBuZXh0OwotICAgICAgfQotICAgICAgLyogQXZhaWxhYmxlIGJsb2NrcyAqLwotICAgICAgYmxvY2sgPSBjb25zdW1lZEJsb2NrSGVhZC5nZXQoc2l6ZUNsYXNzKTsKLSAgICAgIHdoaWxlICghYmxvY2suaXNaZXJvKCkpIHsKLSAgICAgICAgQWRkcmVzcyBuZXh0ID0gQmxvY2tBbGxvY2F0b3IuZ2V0TmV4dChibG9jayk7Ci0gICAgICAgIGNsZWFyQmxvY2tNYXJrKGJsb2NrLCBibG9ja1NpemUpOwotICAgICAgICBibG9jayA9IG5leHQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFN3ZWVwIGFsbCBibG9ja3MgZm9yIGZyZWUgb2JqZWN0cy4KLSAgICoKLSAgICogQHBhcmFtIGNsZWFyTWFya3Mgc2hvdWxkIHdlIGNsZWFyIGJsb2NrIG1hcmsgYml0cyBhcyB3ZSBwcm9jZXNzLgotICAgKi8KLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgc3dlZXBDb25zdW1lZEJsb2Nrcyhib29sZWFuIGNsZWFyTWFya3MpIHsKLSAgICBmb3IgKGludCBzaXplQ2xhc3MgPSAwOyBzaXplQ2xhc3MgPCBzaXplQ2xhc3NDb3VudCgpOyBzaXplQ2xhc3MrKykgewotICAgICAgRXh0ZW50IGJsb2NrU2l6ZSA9IEV4dGVudC5mcm9tSW50U2lnbkV4dGVuZChCbG9ja0FsbG9jYXRvci5ibG9ja1NpemUoYmxvY2tTaXplQ2xhc3Nbc2l6ZUNsYXNzXSkpOwotICAgICAgQWRkcmVzcyBhdmFpbGFibGVIZWFkID0gQWRkcmVzcy56ZXJvKCk7Ci0gICAgICAvKiBGbHVzaGVkIGJsb2NrcyAqLwotICAgICAgQWRkcmVzcyBibG9jayA9IGZsdXNoZWRCbG9ja0hlYWQuZ2V0KHNpemVDbGFzcyk7Ci0gICAgICBmbHVzaGVkQmxvY2tIZWFkLnNldChzaXplQ2xhc3MsIEFkZHJlc3MuemVybygpKTsKLSAgICAgIHdoaWxlICghYmxvY2suaXNaZXJvKCkpIHsKLSAgICAgICAgQWRkcmVzcyBuZXh0ID0gQmxvY2tBbGxvY2F0b3IuZ2V0TmV4dChibG9jayk7Ci0gICAgICAgIGF2YWlsYWJsZUhlYWQgPSBzd2VlcEJsb2NrKGJsb2NrLCBzaXplQ2xhc3MsIGJsb2NrU2l6ZSwgYXZhaWxhYmxlSGVhZCwgY2xlYXJNYXJrcyk7Ci0gICAgICAgIGJsb2NrID0gbmV4dDsKLSAgICAgIH0KLSAgICAgIC8qIENvbnN1bWVkIGJsb2NrcyAqLwotICAgICAgYmxvY2sgPSBjb25zdW1lZEJsb2NrSGVhZC5nZXQoc2l6ZUNsYXNzKTsKLSAgICAgIGNvbnN1bWVkQmxvY2tIZWFkLnNldChzaXplQ2xhc3MsIEFkZHJlc3MuemVybygpKTsKLSAgICAgIHdoaWxlICghYmxvY2suaXNaZXJvKCkpIHsKLSAgICAgICAgQWRkcmVzcyBuZXh0ID0gQmxvY2tBbGxvY2F0b3IuZ2V0TmV4dChibG9jayk7Ci0gICAgICAgIGF2YWlsYWJsZUhlYWQgPSBzd2VlcEJsb2NrKGJsb2NrLCBzaXplQ2xhc3MsIGJsb2NrU2l6ZSwgYXZhaWxhYmxlSGVhZCwgY2xlYXJNYXJrcyk7Ci0gICAgICAgIGJsb2NrID0gbmV4dDsKLSAgICAgIH0KLSAgICAgIC8qIE1ha2UgYmxvY2tzIGF2YWlsYWJsZSAqLwotICAgICAgYXZhaWxhYmxlQmxvY2tIZWFkLnNldChzaXplQ2xhc3MsIGF2YWlsYWJsZUhlYWQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTd2VlcCBhIGJsb2NrLCBmcmVlaW5nIGl0IGFuZCBhZGRpbmcgdG8gdGhlIGxpc3QgZ2l2ZW4gYnkgYXZhaWxhYmxlSGVhZAotICAgKiBpZiBpdCBjb250YWlucyBubyBmcmVlIG9iamVjdHMuCi0gICAqCi0gICAqIEBwYXJhbSBjbGVhck1hcmtzIHNob3VsZCB3ZSBjbGVhciBibG9jayBtYXJrIGJpdHMgYXMgd2UgcHJvY2Vzcy4KLSAgICovCi0gIHByb3RlY3RlZCBmaW5hbCBBZGRyZXNzIHN3ZWVwQmxvY2soQWRkcmVzcyBibG9jaywgaW50IHNpemVDbGFzcywgRXh0ZW50IGJsb2NrU2l6ZSwgQWRkcmVzcyBhdmFpbGFibGVIZWFkLCBib29sZWFuIGNsZWFyTWFya3MpIHsKLSAgICBib29sZWFuIGxpdmVCbG9jayA9IGNvbnRhaW5zTGl2ZUNlbGwoYmxvY2ssIGJsb2NrU2l6ZSwgY2xlYXJNYXJrcyk7Ci0gICAgaWYgKCFsaXZlQmxvY2spIHsKLSAgICAgIEJsb2NrQWxsb2NhdG9yLnNldE5leHQoYmxvY2ssIEFkZHJlc3MuemVybygpKTsKLSAgICAgIEJsb2NrQWxsb2NhdG9yLmZyZWUodGhpcywgYmxvY2spOwotICAgIH0gZWxzZSB7Ci0gICAgICBCbG9ja0FsbG9jYXRvci5zZXROZXh0KGJsb2NrLCBhdmFpbGFibGVIZWFkKTsKLSAgICAgIGF2YWlsYWJsZUhlYWQgPSBibG9jazsKLSAgICAgIGlmICghTEFaWV9TV0VFUCkgewotICAgICAgICBzZXRGcmVlTGlzdChibG9jaywgbWFrZUZyZWVMaXN0KGJsb2NrLCBzaXplQ2xhc3MpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGF2YWlsYWJsZUhlYWQ7Ci0gIH0KLQotICAvKioKLSAgICogRWFnZXJseSBjb25zdW1lIGFsbCByZW1haW5pbmcgYmxvY2tzLgotICAgKi8KLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgY29uc3VtZUJsb2NrcygpIHsKLSAgICBmb3IgKGludCBzaXplQ2xhc3MgPSAwOyBzaXplQ2xhc3MgPCBzaXplQ2xhc3NDb3VudCgpOyBzaXplQ2xhc3MrKykgewotICAgICAgd2hpbGUgKCFhdmFpbGFibGVCbG9ja0hlYWQuZ2V0KHNpemVDbGFzcykuaXNaZXJvKCkpIHsKLSAgICAgICAgQWRkcmVzcyBibG9jayA9IGF2YWlsYWJsZUJsb2NrSGVhZC5nZXQoc2l6ZUNsYXNzKTsKLSAgICAgICAgYXZhaWxhYmxlQmxvY2tIZWFkLnNldChzaXplQ2xhc3MsIEJsb2NrQWxsb2NhdG9yLmdldE5leHQoYmxvY2spKTsKLSAgICAgICAgYWR2YW5jZVRvQmxvY2soYmxvY2ssIHNpemVDbGFzcyk7Ci0gICAgICAgIEJsb2NrQWxsb2NhdG9yLnNldE5leHQoYmxvY2ssIGNvbnN1bWVkQmxvY2tIZWFkLmdldChzaXplQ2xhc3MpKTsKLSAgICAgICAgY29uc3VtZWRCbG9ja0hlYWQuc2V0KHNpemVDbGFzcywgYmxvY2spOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBGbHVzaCBhbGwgdGhlIGFsbG9jYXRpb24gYmxvY2tzIHRvIHRoZSBjb25zdW1lZCBsaXN0LgotICAgKi8KLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmx1c2hBdmFpbGFibGVCbG9ja3MoKSB7Ci0gICAgZm9yIChpbnQgc2l6ZUNsYXNzID0gMDsgc2l6ZUNsYXNzIDwgc2l6ZUNsYXNzQ291bnQoKTsgc2l6ZUNsYXNzKyspIHsKLSAgICAgIGZsdXNoZWRCbG9ja0hlYWQuc2V0KHNpemVDbGFzcywgYXZhaWxhYmxlQmxvY2tIZWFkLmdldChzaXplQ2xhc3MpKTsKLSAgICAgIGF2YWlsYWJsZUJsb2NrSGVhZC5zZXQoc2l6ZUNsYXNzLCBBZGRyZXNzLnplcm8oKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIERvZXMgdGhpcyBibG9jayBjb250YWluIGFueSBsaXZlIGNlbGxzLgotICAgKgotICAgKiBAcGFyYW0gYmxvY2sgVGhlIGJsb2NrCi0gICAqIEBwYXJhbSBibG9ja1NpemUgVGhlIHNpemUgb2YgdGhlIGJsb2NrCi0gICAqIEBwYXJhbSBjbGVhck1hcmtzIHNob3VsZCB3ZSBjbGVhciBibG9jayBtYXJrIGJpdHMgYXMgd2UgcHJvY2Vzcy4KLSAgICogQHJldHVybiBUcnVlIGlmIGFueSBjZWxscyBpbiB0aGUgYmxvY2sgYXJlIGxpdmUKLSAgICovCi0gIEBJbmxpbmUKLSAgcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNMaXZlQ2VsbChBZGRyZXNzIGJsb2NrLCBFeHRlbnQgYmxvY2tTaXplLCBib29sZWFuIGNsZWFyTWFya3MpIHsKLSAgICBpZiAobWFpbnRhaW5TaWRlQml0bWFwKCkpIHsKLSAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGFsaWduVG9MaXZlU3RyaWRlKGJsb2NrKS5FUShibG9jaykpOwotICAgICAgQWRkcmVzcyBjdXJzb3IgPSBnZXRMaXZlV29yZEFkZHJlc3MoYmxvY2spOwotICAgICAgQWRkcmVzcyBzZW50aW5lbCA9IGdldExpdmVXb3JkQWRkcmVzcyhibG9jay5wbHVzKGJsb2NrU2l6ZS5taW51cygxKSkpOwotICAgICAgd2hpbGUgKGN1cnNvci5MRShzZW50aW5lbCkpIHsKLSAgICAgICAgV29yZCBsaXZlID0gY3Vyc29yLmxvYWRXb3JkKCk7Ci0gICAgICAgIGlmICghbGl2ZS5pc1plcm8oKSkgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGN1cnNvciA9IGN1cnNvci5wbHVzKEJZVEVTX0lOX1dPUkQpOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBib29sZWFuIGxpdmUgPSBmYWxzZTsKLSAgICAgIEFkZHJlc3MgY3Vyc29yID0gYmxvY2s7Ci0gICAgICB3aGlsZShjdXJzb3IuTFQoYmxvY2sucGx1cyhibG9ja1NpemUpKSkgewotICAgICAgICBsaXZlIHw9IEJsb2NrQWxsb2NhdG9yLmNoZWNrQmxvY2tNZXRhKGN1cnNvcik7Ci0gICAgICAgIGlmIChjbGVhck1hcmtzKQotICAgICAgICAgIEJsb2NrQWxsb2NhdG9yLmNsZWFyQmxvY2tNZXRhKGN1cnNvcik7Ci0gICAgICAgIGN1cnNvciA9IGN1cnNvci5wbHVzKDEgPDwgQmxvY2tBbGxvY2F0b3IuTE9HX01JTl9CTE9DSyk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbGl2ZTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDbGVhciBibG9jayBtYXJrcyBmb3IgYSBibG9jawotICAgKgotICAgKiBAcGFyYW0gYmxvY2sgVGhlIGJsb2NrCi0gICAqIEBwYXJhbSBibG9ja1NpemUgVGhlIHNpemUgb2YgdGhlIGJsb2NrCi0gICAqLwotICBASW5saW5lCi0gIHByb3RlY3RlZCB2b2lkIGNsZWFyQmxvY2tNYXJrKEFkZHJlc3MgYmxvY2ssIEV4dGVudCBibG9ja1NpemUpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCghbWFpbnRhaW5TaWRlQml0bWFwKCkpOwotICAgIEFkZHJlc3MgY3Vyc29yID0gYmxvY2s7Ci0gICAgd2hpbGUoY3Vyc29yLkxUKGJsb2NrLnBsdXMoYmxvY2tTaXplKSkpIHsKLSAgICAgIEJsb2NrQWxsb2NhdG9yLmNsZWFyQmxvY2tNZXRhKGN1cnNvcik7Ci0gICAgICBjdXJzb3IgPSBjdXJzb3IucGx1cygxIDw8IEJsb2NrQWxsb2NhdG9yLkxPR19NSU5fQkxPQ0spOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBJbiB0aGUgY2VsbCBjb250YWluaW5nIHRoaXMgb2JqZWN0IGxpdmU/Ci0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNlbGwgaXMgbGl2ZQotICAgKi8KLSAgQElubGluZQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0NlbGxMaXZlKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICAvKiBNdXN0IG92ZXJyaWRlIGlmIG5vdCB1c2luZyB0aGUgc2lkZSBiaXRtYXAgKi8KLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChtYWludGFpblNpZGVCaXRtYXAoKSk7Ci0gICAgcmV0dXJuIGxpdmVCaXRTZXQob2JqZWN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBVc2UgdGhlIGxpdmUgYml0cyBmb3IgYSBibG9jayB0byBpbmZlciBmcmVlIGNlbGxzIGFuZCB0aHVzCi0gICAqIGNvbnN0cnVjdCBhIGZyZWUgbGlzdCBmb3IgdGhlIGJsb2NrLgotICAgKgotICAgKiBAcGFyYW0gYmxvY2sgVGhlIGJsb2NrIHRvIGJlIHByb2Nlc3NlZAotICAgKiBAcGFyYW0gc2l6ZUNsYXNzIFRoZSBzaXplIGNsYXNzIGZvciB0aGUgYmxvY2sKLSAgICogQHJldHVybiBUaGUgaGVhZCBvZiB0aGUgbmV3IGZyZWUgbGlzdAotICAgKi8KLSAgQElubGluZQotICBwcm90ZWN0ZWQgZmluYWwgQWRkcmVzcyBtYWtlRnJlZUxpc3QoQWRkcmVzcyBibG9jaywgaW50IHNpemVDbGFzcykgewotICAgIEV4dGVudCBibG9ja1NpemUgPSBFeHRlbnQuZnJvbUludFNpZ25FeHRlbmQoQmxvY2tBbGxvY2F0b3IuYmxvY2tTaXplKGJsb2NrU2l6ZUNsYXNzW3NpemVDbGFzc10pKTsKLSAgICBBZGRyZXNzIGN1cnNvciA9IGJsb2NrLnBsdXMoYmxvY2tIZWFkZXJTaXplW3NpemVDbGFzc10pOwotICAgIEFkZHJlc3MgbGFzdEZyZWUgPSBBZGRyZXNzLnplcm8oKTsKLSAgICBBZGRyZXNzIGZpcnN0RnJlZSA9IEFkZHJlc3MuemVybygpOwotICAgIEFkZHJlc3MgZW5kID0gYmxvY2sucGx1cyhibG9ja1NpemUpOwotICAgIEV4dGVudCBjZWxsRXh0ZW50ID0gRXh0ZW50LmZyb21JbnRTaWduRXh0ZW5kKGNlbGxTaXplW3NpemVDbGFzc10pOwotICAgIHdoaWxlIChjdXJzb3IuTFQoZW5kKSkgewotICAgICAgT2JqZWN0UmVmZXJlbmNlIGN1cnJlbnQgPSBWTS5vYmplY3RNb2RlbC5nZXRPYmplY3RGcm9tU3RhcnRBZGRyZXNzKGN1cnNvcik7Ci0gICAgICBib29sZWFuIGZyZWUgPSB0cnVlOwotICAgICAgaWYgKCFjdXJyZW50LmlzTnVsbCgpKSB7Ci0gICAgICAgIGZyZWUgPSAhaXNDZWxsTGl2ZShjdXJyZW50KTsKLSAgICAgIH0KLSAgICAgIGlmIChmcmVlKSB7Ci0gICAgICAgIGlmIChmaXJzdEZyZWUuaXNaZXJvKCkpIHsKLSAgICAgICAgICBmaXJzdEZyZWUgPSBjdXJzb3I7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbGFzdEZyZWUuc3RvcmUoY3Vyc29yKTsKLSAgICAgICAgfQotICAgICAgICBNZW1vcnkuemVyb1NtYWxsKGN1cnNvciwgY2VsbEV4dGVudCk7Ci0gICAgICAgIGxhc3RGcmVlID0gY3Vyc29yOwotICAgICAgfQotICAgICAgY3Vyc29yID0gY3Vyc29yLnBsdXMoY2VsbEV4dGVudCk7Ci0gICAgfQotICAgIHJldHVybiBmaXJzdEZyZWU7Ci0gIH0KLQotICAvKioKLSAgICogU3dlZXAgYWxsIGJsb2NrcyBmb3IgZnJlZSBvYmplY3RzLgotICAgKi8KLSAgcHVibGljIHZvaWQgc3dlZXBDZWxscyhTd2VlcGVyIHN3ZWVwZXIpIHsKLSAgICBmb3IgKGludCBzaXplQ2xhc3MgPSAwOyBzaXplQ2xhc3MgPCBzaXplQ2xhc3NDb3VudCgpOyBzaXplQ2xhc3MrKykgewotICAgICAgQWRkcmVzcyBhdmFpbGFibGVIZWFkID0gQWRkcmVzcy56ZXJvKCk7Ci0gICAgICAvKiBGbHVzaGVkIGJsb2NrcyAqLwotICAgICAgQWRkcmVzcyBibG9jayA9IGZsdXNoZWRCbG9ja0hlYWQuZ2V0KHNpemVDbGFzcyk7Ci0gICAgICBmbHVzaGVkQmxvY2tIZWFkLnNldChzaXplQ2xhc3MsIEFkZHJlc3MuemVybygpKTsKLSAgICAgIHdoaWxlICghYmxvY2suaXNaZXJvKCkpIHsKLSAgICAgICAgQWRkcmVzcyBuZXh0ID0gQmxvY2tBbGxvY2F0b3IuZ2V0TmV4dChibG9jayk7Ci0gICAgICAgIGF2YWlsYWJsZUhlYWQgPSBzd2VlcENlbGxzKHN3ZWVwZXIsIGJsb2NrLCBzaXplQ2xhc3MsIGF2YWlsYWJsZUhlYWQpOwotICAgICAgICBibG9jayA9IG5leHQ7Ci0gICAgICB9Ci0gICAgICAvKiBDb25zdW1lZCBibG9ja3MgKi8KLSAgICAgIGJsb2NrID0gY29uc3VtZWRCbG9ja0hlYWQuZ2V0KHNpemVDbGFzcyk7Ci0gICAgICBjb25zdW1lZEJsb2NrSGVhZC5zZXQoc2l6ZUNsYXNzLCBBZGRyZXNzLnplcm8oKSk7Ci0gICAgICB3aGlsZSAoIWJsb2NrLmlzWmVybygpKSB7Ci0gICAgICAgIEFkZHJlc3MgbmV4dCA9IEJsb2NrQWxsb2NhdG9yLmdldE5leHQoYmxvY2spOwotICAgICAgICBhdmFpbGFibGVIZWFkID0gc3dlZXBDZWxscyhzd2VlcGVyLCBibG9jaywgc2l6ZUNsYXNzLCBhdmFpbGFibGVIZWFkKTsKLSAgICAgICAgYmxvY2sgPSBuZXh0OwotICAgICAgfQotICAgICAgLyogTWFrZSBibG9ja3MgYXZhaWxhYmxlICovCi0gICAgICBhdmFpbGFibGVCbG9ja0hlYWQuc2V0KHNpemVDbGFzcywgYXZhaWxhYmxlSGVhZCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFN3ZWVwIGEgYmxvY2ssIGZyZWVpbmcgaXQgYW5kIGFkZGluZyB0byB0aGUgbGlzdCBnaXZlbiBieSBhdmFpbGFibGVIZWFkCi0gICAqIGlmIGl0IGNvbnRhaW5zIG5vIGZyZWUgb2JqZWN0cy4KLSAgICovCi0gIHByaXZhdGUgQWRkcmVzcyBzd2VlcENlbGxzKFN3ZWVwZXIgc3dlZXBlciwgQWRkcmVzcyBibG9jaywgaW50IHNpemVDbGFzcywgQWRkcmVzcyBhdmFpbGFibGVIZWFkKSB7Ci0gICAgYm9vbGVhbiBsaXZlQmxvY2sgPSBzd2VlcENlbGxzKHN3ZWVwZXIsIGJsb2NrLCBzaXplQ2xhc3MpOwotICAgIGlmICghbGl2ZUJsb2NrKSB7Ci0gICAgICBCbG9ja0FsbG9jYXRvci5zZXROZXh0KGJsb2NrLCBBZGRyZXNzLnplcm8oKSk7Ci0gICAgICBCbG9ja0FsbG9jYXRvci5mcmVlKHRoaXMsIGJsb2NrKTsKLSAgICB9IGVsc2UgewotICAgICAgQmxvY2tBbGxvY2F0b3Iuc2V0TmV4dChibG9jaywgYXZhaWxhYmxlSGVhZCk7Ci0gICAgICBhdmFpbGFibGVIZWFkID0gYmxvY2s7Ci0gICAgfQotICAgIHJldHVybiBhdmFpbGFibGVIZWFkOwotICB9Ci0KLSAgLyoqCi0gICAqIFN3ZWVwIGEgYmxvY2ssIGZyZWVpbmcgaXQgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaWYgYW55IGxpdmUgY2VsbHMgd2VyZSBmb3VuZC4KLSAgICogaWYgaXQgY29udGFpbnMgbm8gZnJlZSBvYmplY3RzLgotICAgKgotICAgKiBUaGlzIGlzIGRlc2lnbmVkIHRvIGJlIGNhbGxlZCBpbiBwYXJhbGxlbCBieSBtdWx0aXBsZSBjb2xsZWN0b3IgdGhyZWFkcy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHBhcmFsbGVsU3dlZXBDZWxscyhTd2VlcGVyIHN3ZWVwZXIpIHsKLSAgICBmb3IgKGludCBzaXplQ2xhc3MgPSAwOyBzaXplQ2xhc3MgPCBzaXplQ2xhc3NDb3VudCgpOyBzaXplQ2xhc3MrKykgewotICAgICAgQWRkcmVzcyBibG9jazsKLSAgICAgIHdoaWxlKCEoYmxvY2sgPSBnZXRTd2VlcEJsb2NrKHNpemVDbGFzcykpLmlzWmVybygpKSB7Ci0gICAgICAgIGJvb2xlYW4gbGl2ZUJsb2NrID0gc3dlZXBDZWxscyhzd2VlcGVyLCBibG9jaywgc2l6ZUNsYXNzKTsKLSAgICAgICAgaWYgKCFsaXZlQmxvY2spIHsKLSAgICAgICAgICBCbG9ja0FsbG9jYXRvci5zZXROZXh0KGJsb2NrLCBBZGRyZXNzLnplcm8oKSk7Ci0gICAgICAgICAgQmxvY2tBbGxvY2F0b3IuZnJlZSh0aGlzLCBibG9jayk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgQmxvY2tBbGxvY2F0b3Iuc2V0TmV4dChibG9jaywgYXZhaWxhYmxlQmxvY2tIZWFkLmdldChzaXplQ2xhc3MpKTsKLSAgICAgICAgICBhdmFpbGFibGVCbG9ja0hlYWQuc2V0KHNpemVDbGFzcywgYmxvY2spOwotICAgICAgICAgIGxvY2sucmVsZWFzZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBhIGJsb2NrIGZvciBhIHBhcmFsbGVsIHN3ZWVwLgotICAgKgotICAgKiBAcGFyYW0gc2l6ZUNsYXNzIFRoZSBzaXplIGNsYXNzIG9mIHRoZSBibG9jayB0byBzd2VlcC4KLSAgICogQHJldHVybiBUaGUgYmxvY2sgb3IgemVybyBpZiBubyBibG9ja3MgcmVtYWluIHRvIGJlIHN3ZXB0LgotICAgKi8KLSAgcHJpdmF0ZSBBZGRyZXNzIGdldFN3ZWVwQmxvY2soaW50IHNpemVDbGFzcykgewotICAgIGxvY2suYWNxdWlyZSgpOwotICAgIEFkZHJlc3MgYmxvY2s7Ci0KLSAgICAvKiBGbHVzaGVkIGJsb2NrcyAqLwotICAgIGJsb2NrID0gZmx1c2hlZEJsb2NrSGVhZC5nZXQoc2l6ZUNsYXNzKTsKLSAgICBpZiAoIWJsb2NrLmlzWmVybygpKSB7Ci0gICAgICBmbHVzaGVkQmxvY2tIZWFkLnNldChzaXplQ2xhc3MsIEJsb2NrQWxsb2NhdG9yLmdldE5leHQoYmxvY2spKTsKLSAgICAgIGxvY2sucmVsZWFzZSgpOwotICAgICAgQmxvY2tBbGxvY2F0b3Iuc2V0TmV4dChibG9jaywgQWRkcmVzcy56ZXJvKCkpOwotICAgICAgcmV0dXJuIGJsb2NrOwotICAgIH0KLQotICAgIC8qIENvbnN1bWVkIGJsb2NrcyAqLwotICAgIGJsb2NrID0gY29uc3VtZWRCbG9ja0hlYWQuZ2V0KHNpemVDbGFzcyk7Ci0gICAgaWYgKCFibG9jay5pc1plcm8oKSkgewotICAgICAgZmx1c2hlZEJsb2NrSGVhZC5zZXQoc2l6ZUNsYXNzLCBCbG9ja0FsbG9jYXRvci5nZXROZXh0KGJsb2NrKSk7Ci0gICAgICBsb2NrLnJlbGVhc2UoKTsKLSAgICAgIEJsb2NrQWxsb2NhdG9yLnNldE5leHQoYmxvY2ssIEFkZHJlc3MuemVybygpKTsKLSAgICAgIHJldHVybiBibG9jazsKLSAgICB9Ci0KLSAgICAvKiBBbGwgc3dlcHQhICovCi0gICAgbG9jay5yZWxlYXNlKCk7Ci0gICAgcmV0dXJuIEFkZHJlc3MuemVybygpOwotICB9Ci0KLSAgLyoqCi0gICAqIERvZXMgdGhpcyBibG9jayBjb250YWluIGFueSBsaXZlIGNlbGxzPwotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgYm9vbGVhbiBzd2VlcENlbGxzKFN3ZWVwZXIgc3dlZXBlciwgQWRkcmVzcyBibG9jaywgaW50IHNpemVDbGFzcykgewotICAgIEV4dGVudCBibG9ja1NpemUgPSBFeHRlbnQuZnJvbUludFNpZ25FeHRlbmQoQmxvY2tBbGxvY2F0b3IuYmxvY2tTaXplKGJsb2NrU2l6ZUNsYXNzW3NpemVDbGFzc10pKTsKLSAgICBBZGRyZXNzIGN1cnNvciA9IGJsb2NrLnBsdXMoYmxvY2tIZWFkZXJTaXplW3NpemVDbGFzc10pOwotICAgIEFkZHJlc3MgZW5kID0gYmxvY2sucGx1cyhibG9ja1NpemUpOwotICAgIEV4dGVudCBjZWxsRXh0ZW50ID0gRXh0ZW50LmZyb21JbnRTaWduRXh0ZW5kKGNlbGxTaXplW3NpemVDbGFzc10pOwotICAgIGJvb2xlYW4gY29udGFpbnNMaXZlID0gZmFsc2U7Ci0gICAgd2hpbGUgKGN1cnNvci5MVChlbmQpKSB7Ci0gICAgICBPYmplY3RSZWZlcmVuY2UgY3VycmVudCA9IFZNLm9iamVjdE1vZGVsLmdldE9iamVjdEZyb21TdGFydEFkZHJlc3MoY3Vyc29yKTsKLSAgICAgIGJvb2xlYW4gZnJlZSA9IHRydWU7Ci0gICAgICBpZiAoIWN1cnJlbnQuaXNOdWxsKCkpIHsKLSAgICAgICAgZnJlZSA9ICFsaXZlQml0U2V0KGN1cnJlbnQpOwotICAgICAgICBpZiAoIWZyZWUpIHsKLSAgICAgICAgICBmcmVlID0gc3dlZXBlci5zd2VlcENlbGwoY3VycmVudCk7Ci0gICAgICAgICAgaWYgKGZyZWUpIHVuc3luY0NsZWFyTGl2ZUJpdChjdXJyZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKCFmcmVlKSB7Ci0gICAgICAgIGNvbnRhaW5zTGl2ZSA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBjdXJzb3IgPSBjdXJzb3IucGx1cyhjZWxsRXh0ZW50KTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbnRhaW5zTGl2ZTsKLSAgfQotCi0gIC8qKgotICAgKiBBIGNhbGxiYWNrIHVzZWQgdG8gcGVyZm9ybSBzd2VlcGluZyBvZiBhIGZyZWUgbGlzdCBzcGFjZS4KLSAgICovCi0gIEBVbmludGVycnVwdGlibGUKLSAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBTd2VlcGVyIHsKLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzd2VlcENlbGwoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBMaXZlIGJpdCBtYW5pcHVsYXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIEF0b21pY2FsbHkgc2V0IHRoZSBsaXZlIGJpdCBmb3IgYSBnaXZlbiBvYmplY3QKLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHdob3NlIGxpdmUgYml0IGlzIHRvIGJlIHNldC4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBiaXQgd2FzIGNoYW5nZWQgdG8gdHJ1ZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3RBbmRTZXRMaXZlQml0KE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICByZXR1cm4gdXBkYXRlTGl2ZUJpdChWTS5vYmplY3RNb2RlbC5vYmplY3RTdGFydFJlZihvYmplY3QpLCB0cnVlLCB0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIGxpdmUgYml0IGZvciB0aGUgYmxvY2sgY29udGFpbmluZyB0aGUgZ2l2ZW4gb2JqZWN0Ci0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB3aG9zZSBibG9ja3MgbGl2ZW5lc3MgaXMgdG8gYmUgc2V0LgotICAgKi8KLSAgQElubGluZQotICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgbWFya0Jsb2NrKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBCbG9ja0FsbG9jYXRvci5tYXJrQmxvY2tNZXRhKG9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBsaXZlIGJpdCBmb3IgdGhlIGdpdmVuIGJsb2NrLgotICAgKgotICAgKiBAcGFyYW0gYmxvY2sgVGhlIGJsb2NrIHdob3NlIGxpdmVuZXNzIGlzIHRvIGJlIHNldC4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIG1hcmtCbG9jayhBZGRyZXNzIGJsb2NrKSB7Ci0gICAgQmxvY2tBbGxvY2F0b3IubWFya0Jsb2NrTWV0YShibG9jayk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBsaXZlIGJpdCBmb3IgYSBnaXZlbiBvYmplY3QsIHdpdGhvdXQgdXNpbmcKLSAgICogc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMtLS1tdXN0IG9ubHkgYmUgdXNlZCB3aGVuIGNvbnRlbnRpb24KLSAgICogZm9yIGxpdmUgYml0IGlzIHN0cmljdGx5IG5vdCBwb3NzaWJsZQotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3Qgd2hvc2UgbGl2ZSBiaXQgaXMgdG8gYmUgc2V0LgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdW5zeW5jU2V0TGl2ZUJpdChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgcmV0dXJuIHVwZGF0ZUxpdmVCaXQoVk0ub2JqZWN0TW9kZWwucmVmVG9BZGRyZXNzKG9iamVjdCksIHRydWUsIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIGxpdmUgYml0IGZvciBhIGdpdmVuIGFkZHJlc3MKLSAgICoKLSAgICogQHBhcmFtIGFkZHJlc3MgVGhlIGFkZHJlc3Mgd2hvc2UgbGl2ZSBiaXQgaXMgdG8gYmUgc2V0LgotICAgKiBAcGFyYW0gc2V0IFRydWUgaWYgdGhlIGJpdCBpcyB0byBiZSBzZXQsIGFzIG9wcG9zZWQgdG8gY2xlYXJlZAotICAgKiBAcGFyYW0gYXRvbWljIFRydWUgaWYgd2Ugd2FudCB0byBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIGF0b21pY2FsbHkKLSAgICovCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB1cGRhdGVMaXZlQml0KEFkZHJlc3MgYWRkcmVzcywgYm9vbGVhbiBzZXQsIGJvb2xlYW4gYXRvbWljKSB7Ci0gICAgV29yZCBvbGRWYWx1ZSwgbmV3VmFsdWU7Ci0gICAgQWRkcmVzcyBsaXZlV29yZCA9IGdldExpdmVXb3JkQWRkcmVzcyhhZGRyZXNzKTsKLSAgICBXb3JkIG1hc2sgPSBnZXRNYXNrKGFkZHJlc3MsIHRydWUpOwotICAgIGlmIChhdG9taWMpIHsKLSAgICAgIGRvIHsKLSAgICAgICAgb2xkVmFsdWUgPSBsaXZlV29yZC5wcmVwYXJlV29yZCgpOwotICAgICAgICBuZXdWYWx1ZSA9IChzZXQpID8gb2xkVmFsdWUub3IobWFzaykgOiBvbGRWYWx1ZS5hbmQobWFzay5ub3QoKSk7Ci0gICAgICB9IHdoaWxlICghbGl2ZVdvcmQuYXR0ZW1wdChvbGRWYWx1ZSwgbmV3VmFsdWUpKTsKLSAgICB9IGVsc2UgewotICAgICAgb2xkVmFsdWUgPSBsaXZlV29yZC5sb2FkV29yZCgpOwotICAgICAgbGl2ZVdvcmQuc3RvcmUoc2V0ID8gb2xkVmFsdWUub3IobWFzaykgOiBvbGRWYWx1ZS5hbmQobWFzay5ub3QoKSkpOwotICAgIH0KLSAgICByZXR1cm4gb2xkVmFsdWUuYW5kKG1hc2spLk5FKG1hc2spOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3QgdGhlIGxpdmUgYml0IGZvciBhIGdpdmVuIG9iamVjdAotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3Qgd2hvc2UgbGl2ZSBiaXQgaXMgdG8gYmUgc2V0LgotICAgKi8KLSAgQElubGluZQotICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gbGl2ZUJpdFNldChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgcmV0dXJuIGxpdmVCaXRTZXQoVk0ub2JqZWN0TW9kZWwucmVmVG9BZGRyZXNzKG9iamVjdCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgbGl2ZSBiaXQgZm9yIGEgZ2l2ZW4gYWRkcmVzcwotICAgKgotICAgKiBAcGFyYW0gYWRkcmVzcyBUaGUgYWRkcmVzcyB3aG9zZSBsaXZlIGJpdCBpcyB0byBiZSBzZXQuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIG9wZXJhdGlvbiBjaGFuZ2VkIHRoZSBzdGF0ZSBvZiB0aGUgbGl2ZSBiaXQuCi0gICAqLwotICBASW5saW5lCi0gIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBsaXZlQml0U2V0KEFkZHJlc3MgYWRkcmVzcykgewotICAgIEFkZHJlc3MgbGl2ZVdvcmQgPSBnZXRMaXZlV29yZEFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgV29yZCBtYXNrID0gZ2V0TWFzayhhZGRyZXNzLCB0cnVlKTsKLSAgICBXb3JkIHZhbHVlID0gbGl2ZVdvcmQubG9hZFdvcmQoKTsKLSAgICByZXR1cm4gdmFsdWUuYW5kKG1hc2spLkVRKG1hc2spOwotICB9Ci0KLSAgLyoqCi0gICAqIENsZWFyIHRoZSBsaXZlIGJpdCBmb3IgYSBnaXZlbiBvYmplY3QKLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHdob3NlIGxpdmUgYml0IGlzIHRvIGJlIGNsZWFyZWQuCi0gICAqLwotICBASW5saW5lCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBjbGVhckxpdmVCaXQoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGNsZWFyTGl2ZUJpdChWTS5vYmplY3RNb2RlbC5yZWZUb0FkZHJlc3Mob2JqZWN0KSk7Ci0gIH0KLQotICAvKioKLSAgICogQ2xlYXIgdGhlIGxpdmUgYml0IGZvciBhIGdpdmVuIGFkZHJlc3MKLSAgICoKLSAgICogQHBhcmFtIGFkZHJlc3MgVGhlIGFkZHJlc3Mgd2hvc2UgbGl2ZSBiaXQgaXMgdG8gYmUgY2xlYXJlZC4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGNsZWFyTGl2ZUJpdChBZGRyZXNzIGFkZHJlc3MpIHsKLSAgICB1cGRhdGVMaXZlQml0KGFkZHJlc3MsIGZhbHNlLCB0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDbGVhciB0aGUgbGl2ZSBiaXQgZm9yIGEgZ2l2ZW4gb2JqZWN0Ci0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB3aG9zZSBsaXZlIGJpdCBpcyB0byBiZSBjbGVhcmVkLgotICAgKi8KLSAgQElubGluZQotICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgdW5zeW5jQ2xlYXJMaXZlQml0KE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICB1bnN5bmNDbGVhckxpdmVCaXQoVk0ub2JqZWN0TW9kZWwucmVmVG9BZGRyZXNzKG9iamVjdCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENsZWFyIHRoZSBsaXZlIGJpdCBmb3IgYSBnaXZlbiBhZGRyZXNzCi0gICAqCi0gICAqIEBwYXJhbSBhZGRyZXNzIFRoZSBhZGRyZXNzIHdob3NlIGxpdmUgYml0IGlzIHRvIGJlIGNsZWFyZWQuCi0gICAqLwotICBASW5saW5lCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCB1bnN5bmNDbGVhckxpdmVCaXQoQWRkcmVzcyBhZGRyZXNzKSB7Ci0gICAgdXBkYXRlTGl2ZUJpdChhZGRyZXNzLCBmYWxzZSwgZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIENsZWFyIGFsbCBsaXZlIGJpdHMgZm9yIGEgYmxvY2sKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNsZWFyTGl2ZUJpdHMoQWRkcmVzcyBibG9jaywgaW50IHNpemVDbGFzcykgewotICAgIGludCBibG9ja1NpemUgPSBCbG9ja0FsbG9jYXRvci5ibG9ja1NpemUoYmxvY2tTaXplQ2xhc3Nbc2l6ZUNsYXNzXSk7Ci0gICAgQWRkcmVzcyBjdXJzb3IgPSBnZXRMaXZlV29yZEFkZHJlc3MoYmxvY2spOwotICAgIEFkZHJlc3Mgc2VudGluZWwgPSBnZXRMaXZlV29yZEFkZHJlc3MoYmxvY2sucGx1cyhibG9ja1NpemUgLSAxKSk7Ci0gICAgd2hpbGUgKGN1cnNvci5MRShzZW50aW5lbCkpIHsKLSAgICAgIGN1cnNvci5zdG9yZShXb3JkLnplcm8oKSk7Ci0gICAgICBjdXJzb3IgPSBjdXJzb3IucGx1cyhCWVRFU19JTl9XT1JEKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB6ZXJvTGl2ZUJpdHMoKSB7Ci0gICAgRXh0ZW50IGJ5dGVzID0gRXh0ZW50LmZyb21JbnRTaWduRXh0ZW5kKEVtYmVkZGVkTWV0YURhdGEuQllURVNfSU5fUkVHSU9OPj5MT0dfTElWRV9DT1ZFUkFHRSk7Ci0gICBpZiAoY29udGlndW91cykgewotICAgICAgQWRkcmVzcyBlbmQgPSAoKEZyZWVMaXN0UGFnZVJlc291cmNlKXByKS5nZXRIaWdoV2F0ZXIoKTsKLSAgICAgIEFkZHJlc3MgY3Vyc29yID0gc3RhcnQ7Ci0gICAgICB3aGlsZSAoY3Vyc29yLkxUKGVuZCkpIHsKLSAgICAgICAgQWRkcmVzcyBtZXRhZGF0YSA9IEVtYmVkZGVkTWV0YURhdGEuZ2V0TWV0YURhdGFCYXNlKGN1cnNvcikucGx1cyhNRVRBX0RBVEFfT0ZGU0VUKTsKLSAgICAgICAgVk0ubWVtb3J5Lnplcm8obWV0YWRhdGEsIGJ5dGVzKTsKLSAgICAgICAgY3Vyc29yID0gY3Vyc29yLnBsdXMoRW1iZWRkZWRNZXRhRGF0YS5CWVRFU19JTl9SRUdJT04pOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBmb3IoQWRkcmVzcyBjdXJzb3IgPSBoZWFkRGlzY29udGlndW91c1JlZ2lvbjsgIWN1cnNvci5pc1plcm8oKTsgY3Vyc29yID0gTWFwLmdldE5leHRDb250aWd1b3VzUmVnaW9uKGN1cnNvcikpIHsKLSAgICAgICAgQWRkcmVzcyBtZXRhZGF0YSA9IEVtYmVkZGVkTWV0YURhdGEuZ2V0TWV0YURhdGFCYXNlKGN1cnNvcikucGx1cyhNRVRBX0RBVEFfT0ZGU0VUKTsKLSAgICAgICAgVk0ubWVtb3J5Lnplcm8obWV0YWRhdGEsIGJ5dGVzKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQWxpZ24gYW4gYWRkcmVzcyBzbyB0aGF0IGl0IGNvcnJlc3BvbmRzIHRvIGEgbGl2ZSB3b3JkIGJvdW5kYXJ5LgotICAgKiBJbiBvdGhlciB3b3JkcywgaWYgdGhlIGxpdmUgYml0IGZvciB0aGUgZ2l2ZW4gYWRkcmVzcyBpcyBub3QgdGhlCi0gICAqIHplcm90aCBiaXQgb2YgYSBsaXZlIHdvcmQsIHJvdW5kIHRoZSBhZGRyZXNzIGRvd24gc3VjaCB0aGF0IGl0Ci0gICAqIGRvZXMuCi0gICAqCi0gICAqIEBwYXJhbSBhZGRyZXNzIFRoZSBhZGRyZXNzIHRvIGJlIGFsaWduZWQgdG8gYSBsaXZlIHdvcmQKLSAgICogQHJldHVybiBUaGUgZ2l2ZW4gYWRkcmVzcywgYWxpZ25lZCBkb3duIHNvIHRoYXQgaXQgY29ycmVzcG9uZHMgdG8KLSAgICogYW4gYWRkcmVzcyBvbiBhIGxpdmUgd29yZCBib3VuZGFyeS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIEFkZHJlc3MgYWxpZ25Ub0xpdmVTdHJpZGUoQWRkcmVzcyBhZGRyZXNzKSB7Ci0gICAgcmV0dXJuIGFkZHJlc3MudG9Xb3JkKCkuYW5kKExJVkVfV09SRF9TVFJJREVfTUFTSykudG9BZGRyZXNzKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2l2ZW4gYW4gYWRkcmVzcywgcHJvZHVjZSBhIGJpdCBtYXNrIGZvciB0aGUgbGl2ZSB0YWJsZQotICAgKgotICAgKiBAcGFyYW0gYWRkcmVzcyBUaGUgYWRkcmVzcyB3aG9zZSBsaXZlIGJpdCBtYXNrIGlzIHRvIGJlIGVzdGFibGlzaGVkCi0gICAqIEBwYXJhbSBzZXQgVHJ1ZSBpZiB3ZSB3YW50IHRoZSBtYXNrIGZvciA8aT5zZXR0aW5nPC9pPiB0aGUgYml0LAotICAgKiBmYWxzZSBpZiB3ZSB3YW50IHRoZSBtYXNrIGZvciA8aT5jbGVhcmluZzwvaT4gdGhlIGJpdC4KLSAgICogQHJldHVybiBUaGUgYXBwcm9wcmlhdGUgYml0IG1hc2sgZm9yIG9iamVjdCBmb3IgdGhlIGxpdmUgdGFibGUgZm9yLgotICAgKi8KLSAgQElubGluZQotICBwcml2YXRlIHN0YXRpYyBXb3JkIGdldE1hc2soQWRkcmVzcyBhZGRyZXNzLCBib29sZWFuIHNldCkgewotICAgIGludCBzaGlmdCA9IGFkZHJlc3MudG9Xb3JkKCkucnNobChPQkpFQ1RfTElWRV9TSElGVCkuYW5kKFdPUkRfU0hJRlRfTUFTSykudG9JbnQoKTsKLSAgICBXb3JkIHJ0biA9IFdvcmQub25lKCkubHNoKHNoaWZ0KTsKLSAgICByZXR1cm4gKHNldCkgPyBydG4gOiBydG4ubm90KCk7Ci0gIH0KLQotICAvKioKLSAgICogR2l2ZW4gYW4gYWRkcmVzcywgcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBsaXZlIHdvcmQgZm9yCi0gICAqIHRoYXQgYWRkcmVzcy4KLSAgICoKLSAgICogQHBhcmFtIGFkZHJlc3MgVGhlIGFkZHJlc3Mgd2hvc2UgbGl2ZSB3b3JkIGFkZHJlc3MgaXMgdG8gYmUgcmV0dXJuZWQKLSAgICogQHJldHVybiBUaGUgYWRkcmVzcyBvZiB0aGUgbGl2ZSB3b3JkIGZvciB0aGlzIG9iamVjdAotICAgKi8KLSAgQElubGluZQotICBwcml2YXRlIHN0YXRpYyBBZGRyZXNzIGdldExpdmVXb3JkQWRkcmVzcyhBZGRyZXNzIGFkZHJlc3MpIHsKLSAgICBBZGRyZXNzIHJ0biA9IEVtYmVkZGVkTWV0YURhdGEuZ2V0TWV0YURhdGFCYXNlKGFkZHJlc3MpOwotICAgIHJldHVybiBydG4ucGx1cyhNRVRBX0RBVEFfT0ZGU0VUKS5wbHVzKEVtYmVkZGVkTWV0YURhdGEuZ2V0TWV0YURhdGFPZmZzZXQoYWRkcmVzcywgTE9HX0xJVkVfQ09WRVJBR0UsIExPR19CWVRFU19JTl9XT1JEKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L1NwYWNlLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BvbGljeS9TcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTJkOTE2Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L1NwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NDQgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBvbGljeTsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uUGxhbjsKLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYW5zaXRpdmVDbG9zdXJlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuaGVhcC5NYXA7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5oZWFwLk1tYXBwZXI7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5oZWFwLlBhZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmhlYXAuU3BhY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuaGVhcC5WTVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5vcHRpb25zLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Mb2c7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Db25zdGFudHM7Ci0KLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGRlZmluZXMgYW5kIG1hbmFnZXMgc3BhY2VzLiAgRWFjaCBwb2xpY3kgaXMgYW4gaW5zdGFuY2UKLSAqIG9mIGEgc3BhY2UuICBBIHNwYWNlIGlzIGEgcmVnaW9uIG9mIHZpcnR1YWwgbWVtb3J5IChjb250aWd1b3VzIG9yCi0gKiBkaXNjb250aWdvdXMpIHdoaWNoIGlzIHN1YmplY3QgdG8gdGhlIHNhbWUgbWVtb3J5IG1hbmFnZW1lbnQKLSAqIHJlZ2ltZS4gIE11bHRpcGxlIHNwYWNlcyAoaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3Mgb3IgaXRzCi0gKiBkZXNjZW5kYW50cykgbWF5IGhhdmUgdGhlIHNhbWUgcG9saWN5IChlZyB0aGVyZSBjb3VsZCBiZSBudW1lcm91cwotICogaW5zdGFuY2VzIG9mIENvcHlTcGFjZSwgZWFjaCB3aXRoIGRpZmZlcmVudCByb2xlcykuIFNwYWNlcyBhcmUKLSAqIGRlZmluZWQgaW4gdGVybXMgb2YgYSB1bmlxdWUgcmVnaW9uIG9mIHZpcnR1YWwgbWVtb3J5LCBzbyBubyB0d28KLSAqIHNwYWNlIGluc3RhbmNlcyBldmVyIHNoYXJlIGFueSB2aXJ0dWFsIG1lbW9yeS48cD4KLSAqCi0gKiBJbiBhZGRpdGlvbiB0byB0cmFja2luZyB2aXJ0dWFsIG1lbW9yeSB1c2UgYW5kIHRoZSBtYXBwaW5nIHRvCi0gKiBwb2xpY3ksIHNwYWNlcyBhbHNvIG1hbmFnZSBtZW1vcnkgY29uc3VtcHRpb24gKDxpPnVzZWQ8L2k+IHZpcnR1YWwKLSAqIG1lbW9yeSkuPHA+Ci0gKgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3BhY2UgaW1wbGVtZW50cyBDb25zdGFudHMgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENsYXNzIHZhcmlhYmxlcwotICAgKi8KLQotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0KLSAgLy8gdGhlIGZvbGxvd2luZyBpcyBzb21ld2hhdCBhcmJpdHJhcnkgZm9yIHRoZSA2NCBiaXQgc3lzdGVtIGF0IHRoaXMgc3RhZ2UKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0FERFJFU1NfU1BBQ0UgPSAoQllURVNfSU5fQUREUkVTUyA9PSA0KSA/IDMyIDogNDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPR19CWVRFU19JTl9DSFVOSyA9IDIyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCWVRFU19JTl9DSFVOSyA9IDEgPDwgTE9HX0JZVEVTX0lOX0NIVU5LOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQUdFU19JTl9DSFVOSyA9IDEgPDwgKExPR19CWVRFU19JTl9DSFVOSyAtIExPR19CWVRFU19JTl9QQUdFKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPR19NQVhfQ0hVTktTID0gTE9HX0FERFJFU1NfU1BBQ0UgLSBMT0dfQllURVNfSU5fQ0hVTks7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9DSFVOS1MgPSAxIDw8IExPR19NQVhfQ0hVTktTOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfU1BBQ0VTID0gMjA7IC8vIHF1aXRlIGFyYml0cmFyeQotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQWRkcmVzcyBIRUFQX1NUQVJUID0gY2h1bmtBbGlnbihWTS5IRUFQX1NUQVJULCB0cnVlKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBBZGRyZXNzIEFWQUlMQUJMRV9TVEFSVCA9IGNodW5rQWxpZ24oVk0uQVZBSUxBQkxFX1NUQVJULCBmYWxzZSk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQWRkcmVzcyBBVkFJTEFCTEVfRU5EID0gY2h1bmtBbGlnbihWTS5BVkFJTEFCTEVfRU5ELCB0cnVlKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBFeHRlbnQgQVZBSUxBQkxFX0JZVEVTID0gQVZBSUxBQkxFX0VORC50b1dvcmQoKS5taW51cyhBVkFJTEFCTEVfU1RBUlQudG9Xb3JkKCkpLnRvRXh0ZW50KCk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFWQUlMQUJMRV9QQUdFUyA9IEFWQUlMQUJMRV9CWVRFUy50b1dvcmQoKS5yc2hsKExPR19CWVRFU19JTl9QQUdFKS50b0ludCgpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEFkZHJlc3MgSEVBUF9FTkQgPSBjaHVua0FsaWduKFZNLkhFQVBfRU5ELCBmYWxzZSk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBGT1JDRV9TTE9XX01BUF9MT09LVVAgPSBmYWxzZTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFHRVMgPSAwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUIgPSAxOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFHRVNfTUIgPSAyOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUJfUEFHRVMgPSAzOwotCi0gIHByaXZhdGUgc3RhdGljIGludCBzcGFjZUNvdW50ID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgU3BhY2VbXSBzcGFjZXMgPSBuZXcgU3BhY2VbTUFYX1NQQUNFU107Ci0gIHByaXZhdGUgc3RhdGljIEFkZHJlc3MgaGVhcEN1cnNvciA9IEhFQVBfU1RBUlQ7Ci0gIHByaXZhdGUgc3RhdGljIEFkZHJlc3MgaGVhcExpbWl0ID0gSEVBUF9FTkQ7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5zdGFuY2UgdmFyaWFibGVzCi0gICAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotICBwcml2YXRlIGZpbmFsIGludCBuYW1lTGVuZ3RoOwotICBwcm90ZWN0ZWQgZmluYWwgaW50IGRlc2NyaXB0b3I7Ci0gIHByaXZhdGUgZmluYWwgaW50IGluZGV4OwotICBwcml2YXRlIGZpbmFsIFZNUmVxdWVzdCB2bVJlcXVlc3Q7Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaW1tb3J0YWw7Ci0gIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIG1vdmFibGU7Ci0gIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIGNvbnRpZ3VvdXM7Ci0KLSAgcHJvdGVjdGVkIFBhZ2VSZXNvdXJjZSBwcjsKLSAgcHJvdGVjdGVkIGZpbmFsIEFkZHJlc3Mgc3RhcnQ7Ci0gIHByb3RlY3RlZCBmaW5hbCBFeHRlbnQgZXh0ZW50OwotICBwcm90ZWN0ZWQgQWRkcmVzcyBoZWFkRGlzY29udGlndW91c1JlZ2lvbjsKLQotICBwcml2YXRlIGJvb2xlYW4gYWxsb2NhdGlvbkZhaWxlZDsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbml0aWFsaXphdGlvbgotICAgKi8KLQotICB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoUEFHRVNfSU5fQ0hVTksgPiAxKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGlzIHRoZSBiYXNlIGNvbnN0cnVjdG9yIGZvciA8aT5hbGw8L2k+IHNwYWNlcy48cD4KLSAgICoKLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhpcyBzcGFjZSAodXNlZCB3aGVuIHByaW50aW5nIGVycm9yIG1lc3NhZ2VzIGV0YykKLSAgICogQHBhcmFtIG1vdmFibGUgQXJlIG9iamVjdHMgaW4gdGhpcyBzcGFjZSBtb3ZhYmxlPwotICAgKiBAcGFyYW0gaW1tb3J0YWwgQXJlIG9iamVjdHMgaW4gdGhpcyBzcGFjZSBpbW1vcnRhbCAodW5jb2xsZWN0ZWQpPwotICAgKiBAcGFyYW0gdm1SZXF1ZXN0IEFuIG9iamVjdCBkZXNjcmliaW5nIHRoZSB2aXJ0dWFsIG1lbW9yeSByZXF1ZXN0ZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgU3BhY2UoU3RyaW5nIG5hbWUsIGJvb2xlYW4gbW92YWJsZSwgYm9vbGVhbiBpbW1vcnRhbCwgVk1SZXF1ZXN0IHZtUmVxdWVzdCkgewotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgdGhpcy5uYW1lTGVuZ3RoID0gbmFtZS5sZW5ndGgoKTsgIC8vIG5lY2Vzc2FyeSB0byBhdm9pZCBjYWxsaW5nIGxlbmd0aCgpIGluIHVuaW50ZXJydXB0aWJsZSBjb2RlCi0gICAgdGhpcy5tb3ZhYmxlID0gbW92YWJsZTsKLSAgICB0aGlzLmltbW9ydGFsID0gaW1tb3J0YWw7Ci0gICAgdGhpcy52bVJlcXVlc3QgPSB2bVJlcXVlc3Q7Ci0gICAgdGhpcy5pbmRleCA9IHNwYWNlQ291bnQrKzsKLSAgICBzcGFjZXNbaW5kZXhdID0gdGhpczsKLQotICAgIGlmICh2bVJlcXVlc3QudHlwZSA9PSBWTVJlcXVlc3QuUkVRVUVTVF9ESVNDT05USUdVT1VTKSB7Ci0gICAgICB0aGlzLmNvbnRpZ3VvdXMgPSBmYWxzZTsKLSAgICAgIHRoaXMuZGVzY3JpcHRvciA9IFNwYWNlRGVzY3JpcHRvci5jcmVhdGVEZXNjcmlwdG9yKCk7Ci0gICAgICB0aGlzLnN0YXJ0ID0gQWRkcmVzcy56ZXJvKCk7Ci0gICAgICB0aGlzLmV4dGVudCA9IEV4dGVudC56ZXJvKCk7Ci0gICAgICB0aGlzLmhlYWREaXNjb250aWd1b3VzUmVnaW9uID0gQWRkcmVzcy56ZXJvKCk7Ci0gICAgICBWTS5tZW1vcnkuc2V0SGVhcFJhbmdlKGluZGV4LCBIRUFQX1NUQVJULCBIRUFQX0VORCk7IC8vIHRoaXMgc2hvdWxkIHJlYWxseSBiZSByZWZpbmVkISAgT25jZSB3ZSBoYXZlIGEgY29kZSBzcGFjZSwgd2UgY2FuIGJlIGEgbG90IG1vcmUgc3BlY2lmaWMgYWJvdXQgd2hhdCBpcyBhIHZhbGlkIGNvZGUgaGVhcCBhcmVhCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQWRkcmVzcyBzdGFydDsKLSAgICBFeHRlbnQgZXh0ZW50OwotCi0gICAgaWYgKHZtUmVxdWVzdC50eXBlID09IFZNUmVxdWVzdC5SRVFVRVNUX0ZSQUNUSU9OKSB7Ci0gICAgICBleHRlbnQgPSBnZXRGcmFjQXZhaWxhYmxlKHZtUmVxdWVzdC5mcmFjKTsKLSAgICB9IGVsc2UgewotICAgICAgZXh0ZW50ID0gdm1SZXF1ZXN0LmV4dGVudDsKLSAgICB9Ci0KLSAgICBpZiAoZXh0ZW50Lk5FKGNodW5rQWxpZ24oZXh0ZW50LCBmYWxzZSkpKSB7Ci0gICAgICBWTS5hc3NlcnRpb25zLmZhaWwobmFtZSArICIgcmVxdWVzdGVkIG5vbi1hbGlnbmVkIGV4dGVudDogIiArIGV4dGVudC50b0xvbmcoKSArICIgYnl0ZXMiKTsKLSAgICB9Ci0KLSAgICBpZiAodm1SZXF1ZXN0LnR5cGUgPT0gVk1SZXF1ZXN0LlJFUVVFU1RfRklYRUQpIHsKLSAgICAgIHN0YXJ0ID0gdm1SZXF1ZXN0LnN0YXJ0OwotICAgICAgaWYgKHN0YXJ0Lk5FKGNodW5rQWxpZ24oc3RhcnQsIGZhbHNlKSkpIHsKLSAgICAgICAgVk0uYXNzZXJ0aW9ucy5mYWlsKG5hbWUgKyAiIHN0YXJ0aW5nIG9uIG5vbi1hbGlnbmVkIGJvdW5kYXJ5OiAiICsgc3RhcnQudG9Mb25nKCkgKyAiIGJ5dGVzIik7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh2bVJlcXVlc3QudG9wKSB7Ci0gICAgICBoZWFwTGltaXQgPSBoZWFwTGltaXQubWludXMoZXh0ZW50KTsKLSAgICAgIHN0YXJ0ID0gaGVhcExpbWl0OwotICAgIH0gZWxzZSB7Ci0gICAgICBzdGFydCA9IGhlYXBDdXJzb3I7Ci0gICAgICBoZWFwQ3Vyc29yID0gaGVhcEN1cnNvci5wbHVzKGV4dGVudCk7Ci0gICAgfQotCi0gICAgaWYgKGhlYXBDdXJzb3IuR1QoaGVhcExpbWl0KSkgewotICAgICAgTG9nLndyaXRlKCJPdXQgb2YgdmlydHVhbCBhZGRyZXNzIHNwYWNlIGFsbG9jYXRpbmcgXCIiKTsKLSAgICAgIExvZy53cml0ZShuYW1lKTsgTG9nLndyaXRlKCJcIiBhdCAiKTsKLSAgICAgIExvZy53cml0ZShoZWFwQ3Vyc29yLm1pbnVzKGV4dGVudCkpOyBMb2cud3JpdGUoIiAoIik7Ci0gICAgICBMb2cud3JpdGUoaGVhcEN1cnNvcik7IExvZy53cml0ZSgiID4gIik7Ci0gICAgICBMb2cud3JpdGUoaGVhcExpbWl0KTsgTG9nLndyaXRlbG4oIikiKTsKLSAgICAgIFZNLmFzc2VydGlvbnMuZmFpbCgiZXhpdGluZyIpOwotICAgIH0KLQotICAgIHRoaXMuY29udGlndW91cyA9IHRydWU7Ci0gICAgdGhpcy5zdGFydCA9IHN0YXJ0OwotICAgIHRoaXMuZXh0ZW50ID0gZXh0ZW50OwotICAgIHRoaXMuZGVzY3JpcHRvciA9IFNwYWNlRGVzY3JpcHRvci5jcmVhdGVEZXNjcmlwdG9yKHN0YXJ0LCBzdGFydC5wbHVzKGV4dGVudCkpOwotCi0gICAgVk0ubWVtb3J5LnNldEhlYXBSYW5nZShpbmRleCwgc3RhcnQsIHN0YXJ0LnBsdXMoZXh0ZW50KSk7Ci0gICAgTWFwLmluc2VydChzdGFydCwgZXh0ZW50LCBkZXNjcmlwdG9yLCB0aGlzKTsKLQotICAgIGlmIChERUJVRykgewotICAgICAgTG9nLndyaXRlKG5hbWUpOyBMb2cud3JpdGUoIiAiKTsKLSAgICAgIExvZy53cml0ZShzdGFydCk7IExvZy53cml0ZSgiICIpOwotICAgICAgTG9nLndyaXRlKHN0YXJ0LnBsdXMoZXh0ZW50KSk7IExvZy53cml0ZSgiICIpOwotICAgICAgTG9nLndyaXRlbG4oZXh0ZW50LnRvV29yZCgpKTsKLSAgICB9Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBBY2Nlc3NvciBtZXRob2RzCi0gICAqLwotCi0gIC8qKiBTdGFydCBvZiBkaXNjb250aWcgZ2V0dGVyIEByZXR1cm4gVGhlIHN0YXJ0IG9mIHRoZSBkaXNjb250aWd1b3VzIHNwYWNlICovCi0gIHB1YmxpYyBzdGF0aWMgQWRkcmVzcyBnZXREaXNjb250aWdTdGFydCgpIHsgcmV0dXJuIGhlYXBDdXJzb3I7IH0KLQotICAvKiogRW5kIG9mIGRpc2NvbnRpZyBnZXR0ZXIgQHJldHVybiBUaGUgZW5kIG9mIHRoZSBkaXNjb250aWd1b3VzIHNwYWNlICovCi0gIHB1YmxpYyBzdGF0aWMgQWRkcmVzcyBnZXREaXNjb250aWdFbmQoKSB7IHJldHVybiBoZWFwTGltaXQubWludXMoMSk7IH0KLQotICAvKiogTmFtZSBnZXR0ZXIgQHJldHVybiBUaGUgbmFtZSBvZiB0aGlzIHNwYWNlICovCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmFtZSgpIHsgcmV0dXJuIG5hbWU7IH0KLQotICAvKiogU3RhcnQgZ2V0dGVyIEByZXR1cm4gVGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhpcyBzcGFjZSAqLwotICBwdWJsaWMgZmluYWwgQWRkcmVzcyBnZXRTdGFydCgpIHsgcmV0dXJuIHN0YXJ0OyB9Ci0KLSAgLyoqIEV4dGVudCBnZXR0ZXIgQHJldHVybiBUaGUgc2l6ZSAoZXh0ZW50KSBvZiB0aGlzIHNwYWNlICovCi0gIHB1YmxpYyBmaW5hbCBFeHRlbnQgZ2V0RXh0ZW50KCkgeyByZXR1cm4gZXh0ZW50OyB9Ci0KLSAgLyoqIERlc2NyaXB0b3IgbWV0aG9kIEByZXR1cm4gVGhlIGludGVnZXIgZGVzY3JpcHRvciBmb3IgdGhpcyBzcGFjZSAqLwotICBwdWJsaWMgZmluYWwgaW50IGdldERlc2NyaXB0b3IoKSB7IHJldHVybiBkZXNjcmlwdG9yOyB9Ci0KLSAgLyoqIEluZGV4IGdldHRlciBAcmV0dXJuIFRoZSBpbmRleCAob3JkaW5hbCBudW1iZXIpIG9mIHRoaXMgc3BhY2UgKi8KLSAgcHVibGljIGZpbmFsIGludCBnZXRJbmRleCgpIHsgcmV0dXJuIGluZGV4OyB9Ci0KLSAgLyoqIEltbW9ydGFsIGdldHRlciBAcmV0dXJuIFRydWUgaWYgdGhpcyBzcGFjZSBpcyBuZXZlciBjb2xsZWN0ZWQgKi8KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbW1vcnRhbCgpIHsgcmV0dXJuIGltbW9ydGFsOyB9Ci0KLSAgLyoqIE1vdmFibGUgZ2V0dGVyIEByZXR1cm4gVHJ1ZSBpZiBvYmplY3RzIGluIHRoaXMgc3BhY2UgbWF5IG1vdmUgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNNb3ZhYmxlKCkgeyByZXR1cm4gbW92YWJsZTsgfQotCi0gIC8qKiBBbGxvY2F0aW9uZmFpbGVkIGdldHRlciBAcmV0dXJuIHRydWUgaWYgYW4gYWxsb2NhdGlvbiBoYXMgZmFpbGVkIHNpbmNlIEdDICovCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGFsbG9jYXRpb25GYWlsZWQoKSB7IHJldHVybiBhbGxvY2F0aW9uRmFpbGVkOyB9Ci0KLSAgLyoqIENsZWFyIEFsbG9jYXRpb25mYWlsZWQgZmxhZyAqLwotICBwdWJsaWMgZmluYWwgdm9pZCBjbGVhckFsbG9jYXRpb25GYWlsZWQoKSB7IGFsbG9jYXRpb25GYWlsZWQgPSBmYWxzZTsgfQotCi0gIC8qKiBSZXNlcnZlZFBhZ2VzIGdldHRlciBAcmV0dXJuIFRoZSBudW1iZXIgb2YgcmVzZXJ2ZWQgcGFnZXMgKi8KLSAgcHVibGljIGZpbmFsIGludCByZXNlcnZlZFBhZ2VzKCkgeyByZXR1cm4gcHIucmVzZXJ2ZWRQYWdlcygpOyB9Ci0KLSAgLyoqIENvbW1pdHRlZFBhZ2VzIGdldHRlciBAcmV0dXJuIFRoZSBudW1iZXIgb2YgY29tbWl0dGVkIHBhZ2VzICovCi0gIHB1YmxpYyBmaW5hbCBpbnQgY29tbWl0dGVkUGFnZXMoKSB7IHJldHVybiBwci5jb21taXR0ZWRQYWdlcygpOyB9Ci0KLSAgLyoqIFJlcXVpcmVkUGFnZXMgZ2V0dGVyIEByZXR1cm4gVGhlIG51bWJlciBvZiByZXF1aXJlZCBwYWdlcyAqLwotICBwdWJsaWMgZmluYWwgaW50IHJlcXVpcmVkUGFnZXMoKSB7IHJldHVybiBwci5yZXF1aXJlZFBhZ2VzKCk7IH0KLQotICAvKiogQXZhaWxhYmxlUGFnZXMgZ2V0dGVyIEByZXR1cm4gVGhlIG51bWJlciBvZiBwYWdlcyBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24gKi8KLSAgcHVibGljIGZpbmFsIGludCBhdmFpbGFibGVQaHlzaWNhbFBhZ2VzKCkgeyByZXR1cm4gcHIuZ2V0QXZhaWxhYmxlUGh5c2ljYWxQYWdlcygpOyB9Ci0KLSAgLyoqIEN1bXVsYXRpdmUgY29tbWl0dGVkIHBhZ2VzIGdldHRlciBAcmV0dXJuIEN1bXVsYXRpdmUgY29tbWl0dGVkIHBhZ2VzLiAqLwotICBwdWJsaWMgc3RhdGljIGxvbmcgY3VtdWxhdGl2ZUNvbW1pdHRlZFBhZ2VzKCkgewotICAgIHJldHVybiBQYWdlUmVzb3VyY2UuY3VtdWxhdGl2ZUNvbW1pdHRlZFBhZ2VzKCk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBPYmplY3QgYW5kIGFkZHJlc3MgdGVzdHMgLyBhY2Nlc3NvcnMKLSAgICovCi0KLSAgLyoqCi0gICAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgaW4gYW4gaW1tb3J0YWwgKHVuY29sbGVjdGVkKSBzcGFjZS4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IGluIHF1ZXN0aW9uCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGluIGFuIGltbW9ydGFsICh1bmNvbGxlY3RlZCkgc3BhY2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbW1vcnRhbChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgU3BhY2Ugc3BhY2UgPSBnZXRTcGFjZUZvck9iamVjdChvYmplY3QpOwotICAgIGlmIChzcGFjZSA9PSBudWxsKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHNwYWNlLmlzSW1tb3J0YWwoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGluIHNwYWNlIHRoYXQgbW92ZXMgb2JqZWN0cy4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IGluIHF1ZXN0aW9uCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGluIHNwYWNlIHRoYXQgbW92ZXMgb2JqZWN0cy4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTW92YWJsZShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgU3BhY2Ugc3BhY2UgPSBnZXRTcGFjZUZvck9iamVjdChvYmplY3QpOwotICAgIGlmIChzcGFjZSA9PSBudWxsKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHNwYWNlLmlzTW92YWJsZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgaW4gYSBzcGFjZSBtYW5hZ2VkIGJ5IE1NVGsuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCBpbiBxdWVzdGlvbgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGdpdmVuIG9iamVjdCBpcyBpbiBhIHNwYWNlIG1hbmFnZWQgYnkgTU1Uay4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWFwcGVkT2JqZWN0KE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICByZXR1cm4gIW9iamVjdC5pc051bGwoKSAmJiAoZ2V0U3BhY2VGb3JPYmplY3Qob2JqZWN0KSAhPSBudWxsKSAmJiBNbWFwcGVyLm9iamVjdElzTWFwcGVkKG9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGFkZHJlc3MgaXMgaW4gYSBzcGFjZSBtYW5hZ2VkIGJ5IE1NVGsuCi0gICAqCi0gICAqIEBwYXJhbSBhZGRyZXNzIFRoZSBhZGRyZXNzIGluIHF1ZXN0aW9uCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZ2l2ZW4gYWRkcmVzcyBpcyBpbiBhIHNwYWNlIG1hbmFnZWQgYnkgTU1Uay4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWFwcGVkQWRkcmVzcyhBZGRyZXNzIGFkZHJlc3MpIHsKLSAgICByZXR1cm4gTWFwLmdldFNwYWNlRm9yQWRkcmVzcyhhZGRyZXNzKSAhPSBudWxsICYmIE1tYXBwZXIuYWRkcmVzc0lzTWFwcGVkKGFkZHJlc3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgdGhlIHNwYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAgICogZ2l2ZW4gZGVzY3JpcHRvci4KLSAgICoKLSAgICogQHBhcmFtIGRlc2NyaXB0b3IgVGhlIGRlc2NyaXB0b3IgZm9yIGEgc3BhY2UKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IGluIHF1ZXN0aW9uCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGluIHRoZSBzcGFjZSBhc3NvY2lhdGVkIHdpdGgKLSAgICogdGhlIGRlc2NyaXB0b3IuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0luU3BhY2UoaW50IGRlc2NyaXB0b3IsIE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCghb2JqZWN0LmlzTnVsbCgpKTsKLSAgICByZXR1cm4gaXNJblNwYWNlKGRlc2NyaXB0b3IsIFZNLm9iamVjdE1vZGVsLnJlZlRvQWRkcmVzcyhvYmplY3QpKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYWRkcmVzcyBpcyB0aGUgc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgKiBnaXZlbiBkZXNjcmlwdG9yLgotICAgKgotICAgKiBAcGFyYW0gZGVzY3JpcHRvciBUaGUgZGVzY3JpcHRvciBmb3IgYSBzcGFjZQotICAgKiBAcGFyYW0gYWRkcmVzcyBUaGUgYWRkcmVzcyBpbiBxdWVzdGlvbi4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBnaXZlbiBhZGRyZXNzIGlzIGluIHRoZSBzcGFjZSBhc3NvY2lhdGVkIHdpdGgKLSAgICogdGhlIGRlc2NyaXB0b3IuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0luU3BhY2UoaW50IGRlc2NyaXB0b3IsIEFkZHJlc3MgYWRkcmVzcykgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KCFhZGRyZXNzLmlzWmVybygpKTsKLSAgICBpZiAoRk9SQ0VfU0xPV19NQVBfTE9PS1VQIHx8ICFTcGFjZURlc2NyaXB0b3IuaXNDb250aWd1b3VzKGRlc2NyaXB0b3IpKSB7Ci0gICAgICByZXR1cm4gTWFwLmdldERlc2NyaXB0b3JGb3JBZGRyZXNzKGFkZHJlc3MpID09IGRlc2NyaXB0b3I7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFkZHJlc3Mgc3RhcnQgPSBTcGFjZURlc2NyaXB0b3IuZ2V0U3RhcnQoZGVzY3JpcHRvcik7Ci0gICAgICBpZiAoIVZNLlZFUklGWV9BU1NFUlRJT05TICYmCi0gICAgICAgICAgU3BhY2VEZXNjcmlwdG9yLmlzQ29udGlndW91c0hpKGRlc2NyaXB0b3IpKQotICAgICAgICByZXR1cm4gYWRkcmVzcy5HRShzdGFydCk7Ci0gICAgICBlbHNlIHsKLSAgICAgICAgRXh0ZW50IHNpemUgPSBXb3JkLmZyb21JbnRTaWduRXh0ZW5kKFNwYWNlRGVzY3JpcHRvci5nZXRDaHVua3MoZGVzY3JpcHRvcikpLmxzaChMT0dfQllURVNfSU5fQ0hVTkspLnRvRXh0ZW50KCk7Ci0gICAgICAgIEFkZHJlc3MgZW5kID0gc3RhcnQucGx1cyhzaXplKTsKLSAgICAgICAgcmV0dXJuIGFkZHJlc3MuR0Uoc3RhcnQpICYmIGFkZHJlc3MuTFQoZW5kKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBzcGFjZSBmb3IgYSBnaXZlbiBvYmplY3QKLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IGluIHF1ZXN0aW9uCi0gICAqIEByZXR1cm4gVGhlIHNwYWNlIGNvbnRhaW5pbmcgdGhlIG9iamVjdAotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIFNwYWNlIGdldFNwYWNlRm9yT2JqZWN0KE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCghb2JqZWN0LmlzTnVsbCgpKTsKLSAgICByZXR1cm4gTWFwLmdldFNwYWNlRm9yQWRkcmVzcyhWTS5vYmplY3RNb2RlbC5yZWZUb0FkZHJlc3Mob2JqZWN0KSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBzcGFjZSBmb3IgYSBnaXZlbiBhZGRyZXNzLCBub3QgbmVjZXNzYXJpbHkgdGhlCi0gICAqIHN0YXJ0IGFkZHJlc3Mgb2YgYW4gb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gYWRkciBUaGUgYWRkcmVzcyBpbiBxdWVzdGlvbgotICAgKiBAcmV0dXJuIFRoZSBzcGFjZSBjb250YWluaW5nIHRoZSBhZGRyZXNzCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFNwYWNlIGdldFNwYWNlRm9yQWRkcmVzcyhBZGRyZXNzIGFkZHIpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCghYWRkci5pc1plcm8oKSk7Ci0gICAgcmV0dXJuIE1hcC5nZXRTcGFjZUZvckFkZHJlc3MoYWRkcik7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBQYWdlIG1hbmFnZW1lbnQKLSAgICovCi0KLSAgLyoqCi0gICAqIEFjcXVpcmUgYSBudW1iZXIgb2YgcGFnZXMgZnJvbSB0aGUgcGFnZSByZXNvdXJjZSwgcmV0dXJuaW5nCi0gICAqIGVpdGhlciB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgcGFnZSwgb3IgemVybyBvbiBmYWlsdXJlLjxwPgotICAgKgotICAgKiBUaGlzIG1heSB0cmlnZ2VyIGEgR0MgaWYgbmVjZXNzYXJ5LjxwPgotICAgKgotICAgKiBGaXJzdCB0aGUgcGFnZSBidWRnZXQgaXMgY2hlY2tlZCB0byBzZWUgd2hldGhlciBwb2xsaW5nIHRoZSBHQyBpcwotICAgKiBuZWNlc3NhcnkuICBJZiBzbywgdGhlIEdDIGlzIHBvbGxlZC4gIElmIGEgR0MgaXMgcmVxdWlyZWQgdGhlbiB0aGUKLSAgICogcmVxdWVzdCBmYWlscyBhbmQgemVybyBpcyByZXR1cm5lZC48cD4KLSAgICoKLSAgICogSWYgdGhlIGNoZWNrIG9mIHRoZSBwYWdlIGJ1ZGdldCBkb2VzIG5vdCBsZWFkIHRvIEdDIGJlaW5nCi0gICAqIHRyaWdnZXJlZCwgdGhlbiBhIHJlcXVlc3QgaXMgbWFkZSBmb3Igc3BlY2lmaWMgcGFnZXMgaW4gdmlydHVhbAotICAgKiBtZW1vcnkuICBJZiB0aGUgcGFnZSBtYW5hZ2VyIGNhbm5vdCBzYXRpc2lmeSB0aGlzIHJlcXVlc3QsIHRoZW4KLSAgICogdGhlIHJlcXVlc3QgZmFpbHMsIGEgR0MgaXMgZm9yY2VkLCBhbmQgemVybyBpcyByZXR1cm5lZC4KLSAgICogT3RoZXJ3aXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBwYWdlIGlzIHJldHVybmVkLjxwPgotICAgKgotICAgKiBAcGFyYW0gcGFnZXMgVGhlIG51bWJlciBvZiBwYWdlcyByZXF1ZXN0ZWQKLSAgICogQHJldHVybiBUaGUgc3RhcnQgb2YgdGhlIGZpcnN0IHBhZ2UgaWYgc3VjY2Vzc2Z1bCwgemVybyBvbgotICAgKiBmYWlsdXJlLgotICAgKi8KLSAgcHVibGljIGZpbmFsIEFkZHJlc3MgYWNxdWlyZShpbnQgcGFnZXMpIHsKLSAgICBib29sZWFuIGFsbG93UG9sbCA9ICFQbGFuLmdjSW5Qcm9ncmVzcygpICYmIFBsYW4uaXNJbml0aWFsaXplZCgpICYmICFWTS5jb2xsZWN0aW9uLmlzRW1lcmdlbmN5QWxsb2NhdGlvbigpOwotCi0gICAgLyogRmlyc3QgY2hlY2sgcGFnZSBidWRnZXQgYW5kIHBvbGwgaWYgbmVjZXNzYXJ5ICovCi0gICAgaWYgKCFwci5yZXNlcnZlUGFnZXMocGFnZXMpKSB7Ci0gICAgICAvKiBOZWVkIHRvIHBvbGwsIGVpdGhlciBmaXhpbmcgYnVkZ2V0IG9yIHJlcXVpcmluZyBHQyAqLwotICAgICAgaWYgKGFsbG93UG9sbCAmJiBWTS5hY3RpdmVQbGFuLmdsb2JhbCgpLnBvbGwoZmFsc2UsIHRoaXMpKSB7Ci0gICAgICAgIHByLmNsZWFyUmVxdWVzdChwYWdlcyk7Ci0gICAgICAgIHJldHVybiBBZGRyZXNzLnplcm8oKTsgLy8gR0MgcmVxdWlyZWQsIHJldHVybiBmYWlsdXJlCi0gICAgICB9Ci0gICAgfQotCi0gICAgLyogUGFnZSBidWRnZXQgaXMgb2ssIHRyeSB0byBhY3F1aXJlIHZpcnR1YWwgbWVtb3J5ICovCi0gICAgQWRkcmVzcyBydG4gPSBwci5nZXROZXdQYWdlcyhwYWdlcyk7Ci0gICAgaWYgKHJ0bi5pc1plcm8oKSkgewotICAgICAgLyogRmFpbGVkLCBzbyBmb3JjZSBhIEdDICovCi0gICAgICBpZiAoVk0uY29sbGVjdGlvbi5pc0VtZXJnZW5jeUFsbG9jYXRpb24oKSkgewotICAgICAgICBwci5jbGVhclJlcXVlc3QocGFnZXMpOwotICAgICAgICBWTS5hc3NlcnRpb25zLmZhaWwoIkZhaWxlZCBlbWVyZ2VuY3kgYWxsb2NhdGlvbiIpOwotICAgICAgfQotICAgICAgaWYgKCFhbGxvd1BvbGwpIFZNLmFzc2VydGlvbnMuZmFpbCgiUGh5c2ljYWwgYWxsb2NhdGlvbiBmYWlsZWQgZHVyaW5nIHNwZWNpYWwgKGNvbGxlY3Rpb24vZW1lcmdlbmN5KSBhbGxvY2F0aW9uISIpOwotICAgICAgYWxsb2NhdGlvbkZhaWxlZCA9IHRydWU7Ci0gICAgICBWTS5jb2xsZWN0aW9uLnJlcG9ydFBoeXNpY2FsQWxsb2NhdGlvbkZhaWxlZCgpOwotICAgICAgVk0uYWN0aXZlUGxhbi5nbG9iYWwoKS5wb2xsKHRydWUsIHRoaXMpOwotICAgICAgcHIuY2xlYXJSZXF1ZXN0KHBhZ2VzKTsKLSAgICAgIHJldHVybiBBZGRyZXNzLnplcm8oKTsKLSAgICB9Ci0KLSAgICBpZiAoYWxsb3dQb2xsKSBWTS5jb2xsZWN0aW9uLnJlcG9ydEFsbG9jYXRpb25TdWNjZXNzKCk7Ci0gICAgcmV0dXJuIHJ0bjsKLSAgfQotCi0gIC8qKgotICAgKiBFeHRlbmQgdGhlIHZpcnR1YWwgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgZGlzY29udGlndW91cwotICAgKiBzcGFjZS4gIFRoaXMgc2ltcGx5IGludm9sdmVzIHJlcXVlc3RpbmcgYSBzdWl0YWJsZSBudW1iZXIgb2YgY2h1bmtzCi0gICAqIGZyb20gdGhlIHBvb2wgb2YgY2h1bmtzIGF2YWlsYWJsZSB0byBkaXNjb250aWd1b3VzIHNwYWNlcy4KLSAgICoKLSAgICogQHBhcmFtIGNodW5rcyBUaGUgbnVtYmVyIG9mIGNodW5rcyBieSB3aGljaCB0aGUgc3BhY2UgbmVlZHMgdG8gYmUgZXh0ZW5kZWQKLSAgICogQHJldHVybiBUaGUgYWRkcmVzcyBvZiB0aGUgbmV3IGRpc2NvbnRpZ3VvdXMgc3BhY2UuCi0gICAqLwotICBwdWJsaWMgQWRkcmVzcyBncm93RGlzY29udGlndW91c1NwYWNlKGludCBjaHVua3MpIHsKLSAgICByZXR1cm4gaGVhZERpc2NvbnRpZ3VvdXNSZWdpb24gPSBNYXAuYWxsb2NhdGVDb250aWd1b3VzQ2h1bmtzKGRlc2NyaXB0b3IsIHRoaXMsIGNodW5rcywgaGVhZERpc2NvbnRpZ3VvdXNSZWdpb24pOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNodW5rcyByZXF1aXJlZCB0byBzYXRpc2Z5IGEgcmVxdWVzdCBmb3IgYSBjZXJ0YWluIG51bWJlciBvZiBwYWdlcwotICAgKgotICAgKiBAcGFyYW0gcGFnZXMgVGhlIG51bWJlciBvZiBwYWdlcyBkZXNpcmVkCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBjaHVua3MgbmVlZGVkIHRvIHNhdGlzZnkgdGhlIHJlcXVlc3QKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IHJlcXVpcmVkQ2h1bmtzKGludCBwYWdlcykgewotICAgIEV4dGVudCBleHRlbnQgPSBjaHVua0FsaWduKEV4dGVudC5mcm9tSW50WmVyb0V4dGVuZChwYWdlczw8TE9HX0JZVEVTX0lOX1BBR0UpLCBmYWxzZSk7Ci0gICAgcmV0dXJuIGV4dGVudC50b1dvcmQoKS5yc2hsKExPR19CWVRFU19JTl9DSFVOSykudG9JbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGhvb2sgaXMgY2FsbGVkIGJ5IHBhZ2UgcmVzb3VyY2VzIGVhY2ggdGltZSBhIHNwYWNlIGdyb3dzLiAgVGhlIHNwYWNlIG1heQotICAgKiB0YXAgaW50byB0aGUgaG9vayB0byBtb25pdG9yIGhlYXAgZ3Jvd3RoLiAgVGhlIGNhbGwgaXMgbWFkZSBmcm9tIHdpdGhpbiB0aGUKLSAgICogcGFnZSByZXNvdXJjZXMnIGNyaXRpY2FsIHJlZ2lvbiwgaW1tZWRpYXRlbHkgYmVmb3JlIHlpZWxkaW5nIHRoZSBsb2NrLgotICAgKgotICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSBuZXdseSBhbGxvY2F0ZWQgc3BhY2UKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBzaXplIG9mIHRoZSBuZXdseSBhbGxvY2F0ZWQgc3BhY2UKLSAgICogQHBhcmFtIG5ld0NodW5rIFRydWUgaWYgdGhlIG5ldyBzcGFjZSBlbmNyb2FjaGVkIHVwb24gb3Igc3RhcnRlZCBhIG5ldyBjaHVuayBvciBjaHVua3MuCi0gICAqLwotICBwdWJsaWMgdm9pZCBncm93U3BhY2UoQWRkcmVzcyBzdGFydCwgRXh0ZW50IGJ5dGVzLCBib29sZWFuIG5ld0NodW5rKSB7fQotCi0gIC8qKgotICAgKiBSZWxlYXNlIG9uZSBvciBtb3JlIGNvbnRpZ3VvdXMgY2h1bmtzIGFzc29jaWF0ZWQgd2l0aCBhIGRpc2NvbnRpZ3VvdXMKLSAgICogc3BhY2UuCi0gICAqCi0gICAqIEBwYXJhbSBjaHVuayBUSGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGNvbnRpZ3VvdXMgY2h1bmsgb3IgY2h1bmtzCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBjaHVua3MgZnJlZWQKLSAgICovCi0gIHB1YmxpYyBpbnQgcmVsZWFzZURpc2NvbnRpZ3VvdXNDaHVua3MoQWRkcmVzcyBjaHVuaykgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGNodW5rLkVRKGNodW5rQWxpZ24oY2h1bmssIHRydWUpKSk7Ci0gICAgaWYgKGNodW5rLkVRKGhlYWREaXNjb250aWd1b3VzUmVnaW9uKSkgewotICAgICAgaGVhZERpc2NvbnRpZ3VvdXNSZWdpb24gPSBNYXAuZ2V0TmV4dENvbnRpZ3VvdXNSZWdpb24oY2h1bmspOwotICAgIH0KLSAgICByZXR1cm4gTWFwLmZyZWVDb250aWd1b3VzQ2h1bmtzKGNodW5rKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWxlYXNlIGEgdW5pdCBvZiBhbGxvY2F0aW9uIChhIHBhZ2Ugb3IgcGFnZXMpCi0gICAqCi0gICAqIEBwYXJhbSBzdGFydCBUaGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIHJlZ2lvbiB0byBiZSByZWxlYXNlZAotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVsZWFzZShBZGRyZXNzIHN0YXJ0KTsKLQotICAvKioKLSAgICogQ2xlYXIgdGhlIGFsbG9jYXRpb24gZmFpbGVkIGZsYWcgZm9yIGFsbCBzcGFjZXMuCi0gICAqCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJBbGxBbGxvY2F0aW9uRmFpbGVkKCkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BhY2VDb3VudDsgaSsrKSB7Ci0gICAgICBzcGFjZXNbaV0uY2xlYXJBbGxvY2F0aW9uRmFpbGVkKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIHJlc2VydmVkIGJ5IGFsbCBvZiB0aGUgc3BhY2VzCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBwYWdlcyByZXNlcnZlZCBieSBhbGwgb2YgdGhlIHNwYWNlcwotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldFBhZ2VzUmVzZXJ2ZWQoKSB7Ci0gICAgaW50IHBhZ2VzID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwYWNlQ291bnQ7IGkrKykgewotICAgICAgcGFnZXMgKz0gc3BhY2VzW2ldLnJlc2VydmVkUGFnZXMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBhZ2VzOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogRGVidWdnaW5nIC8gcHJpbnRpbmcKLSAgICovCi0KLSAgLyoqCi0gICAqIFByaW50IG91dCB0aGUgbWVtb3J5IHVzZWQgYnkgYWxsIHNwYWNlcywgaW4gbWVnYWJ5dGVzCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRVc2FnZU1CKCkgeyBwcmludFVzYWdlKE1CKTsgfQotCi0gIC8qKgotICAgKiBQcmludCBvdXQgdGhlIG1lbW9yeSB1c2VkIGJ5IGFsbCBzcGFjZXMsIGluIG1lZ2FieXRlcwotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50VXNhZ2VQYWdlcygpIHsgcHJpbnRVc2FnZShQQUdFUyk7IH0KLQotICAvKioKLSAgICogUHJpbnQgb3V0IGEgbWFwIG9mIHZpcnR1YWwgbWVtb3J5IHVzZWFnZSBieSBhbGwgc3BhY2VzCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRWTU1hcCgpIHsKLSAgICBMb2cud3JpdGVsbigiS2V5OiAoSSltbW9ydGFsIChOKW9ubW92aW5nIChEKWlzY29udGlndW91cyAoRSl4dGVudCAoRilyYWN0aW9uIik7Ci0gICAgTG9nLndyaXRlKCIgICAgIEhFQVBfU1RBUlQgIik7IExvZy53cml0ZWxuKEhFQVBfU1RBUlQpOwotICAgIExvZy53cml0ZSgiQVZBSUxBQkxFX1NUQVJUICIpOyBMb2cud3JpdGVsbihBVkFJTEFCTEVfU1RBUlQpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BhY2VDb3VudDsgaSsrKSB7Ci0gICAgICBTcGFjZSBzcGFjZSA9IHNwYWNlc1tpXTsKLQotICAgICAgZm9yIChpbnQgcyA9IDA7IHMgPCAxMSAtIHNwYWNlLm5hbWVMZW5ndGg7IHMrKykKLSAgICAgICAgTG9nLndyaXRlKCIgIik7Ci0gICAgICBMb2cud3JpdGUoc3BhY2UubmFtZSk7IExvZy53cml0ZSgiICIpOwotICAgICAgTG9nLndyaXRlKHNwYWNlLmltbW9ydGFsID8gIkkiIDogIiAiKTsKLSAgICAgIExvZy53cml0ZShzcGFjZS5tb3ZhYmxlID8gIiAiIDogIk4iKTsKLQotICAgICAgaWYgKHNwYWNlLmNvbnRpZ3VvdXMpIHsKLSAgICAgICAgTG9nLndyaXRlKCIgICIpOwotICAgICAgICBMb2cud3JpdGUoc3BhY2Uuc3RhcnQpOyBMb2cud3JpdGUoIi0+Iik7Ci0gICAgICAgIExvZy53cml0ZShzcGFjZS5zdGFydC5wbHVzKHNwYWNlLmV4dGVudC5taW51cygxKSkpOwotICAgICAgICBpZiAoc3BhY2Uudm1SZXF1ZXN0LnR5cGUgPT0gVk1SZXF1ZXN0LlJFUVVFU1RfRVhURU5UKSB7Ci0gICAgICAgICAgTG9nLndyaXRlKCIgRSAiKTsgTG9nLndyaXRlKHNwYWNlLnZtUmVxdWVzdC5leHRlbnQpOwotICAgICAgICB9IGVsc2UgaWYgKHNwYWNlLnZtUmVxdWVzdC50eXBlID09IFZNUmVxdWVzdC5SRVFVRVNUX0ZSQUNUSU9OKSB7Ci0gICAgICAgICAgTG9nLndyaXRlKCIgRiAiKTsgTG9nLndyaXRlKHNwYWNlLnZtUmVxdWVzdC5mcmFjKTsKLSAgICAgICAgfQotICAgICAgICBMb2cud3JpdGVsbigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgTG9nLndyaXRlKCJEIFsiKTsKLSAgICAgICAgZm9yKEFkZHJlc3MgYSA9IHNwYWNlLmhlYWREaXNjb250aWd1b3VzUmVnaW9uOyAhYS5pc1plcm8oKTsgYSA9IE1hcC5nZXROZXh0Q29udGlndW91c1JlZ2lvbihhKSkgewotICAgICAgICAgIExvZy53cml0ZShhKTsgTG9nLndyaXRlKCItPiIpOwotICAgICAgICAgIExvZy53cml0ZShhLnBsdXMoTWFwLmdldENvbnRpZ3VvdXNSZWdpb25TaXplKGEpLm1pbnVzKDEpKSk7Ci0gICAgICAgICAgaWYgKE1hcC5nZXROZXh0Q29udGlndW91c1JlZ2lvbihhKSAhPSBBZGRyZXNzLnplcm8oKSkKLSAgICAgICAgICAgIExvZy53cml0ZSgiLCAiKTsKLSAgICAgICAgfQotICAgICAgICBMb2cud3JpdGVsbigiXSIpOwotICAgICAgfQotICAgIH0KLSAgICBMb2cud3JpdGUoIiAgQVZBSUxBQkxFX0VORCAiKTsgTG9nLndyaXRlbG4oQVZBSUxBQkxFX0VORCk7Ci0gICAgTG9nLndyaXRlKCIgICAgICAgSEVBUF9FTkQgIik7IExvZy53cml0ZWxuKEhFQVBfRU5EKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbnRlcmZhY2UgdG8gdXNlIHRvIGltcGxlbWVudCB0aGUgVmlzaXRvciBQYXR0ZXJuIGZvciBTcGFjZXMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBTcGFjZVZpc2l0b3IgewotICAgIHZvaWQgdmlzaXQoU3BhY2Ugcyk7Ci0gIH0KLQotICAvKioKLSAgICogSW1wbGVtZW50IHRoZSBWaXNpdG9yIFBhdHRlcm4gZm9yIFNwYWNlcy4KLSAgICogQHBhcmFtIHYgVGhlIHZpc2l0b3IgdG8gcGVyZm9ybSBvbiBlYWNoIFNwYWNlIGluc3RhbmNlCi0gICAqLwotICBASW50ZXJydXB0aWJsZQotICBwdWJsaWMgc3RhdGljIHZvaWQgdmlzaXRTcGFjZXMoU3BhY2VWaXNpdG9yIHYpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwYWNlQ291bnQ7IGkrKykgewotICAgICAgdi52aXNpdChzcGFjZXNbaV0pOwotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIEVuc3VyZSB0aGF0IGFsbCBNTVRrIHNwYWNlcyAoYWxsIHNwYWNlcyBhc2lkZSBmcm9tIHRoZSBWTSBzcGFjZSkKLSAgICogYXJlIG1hcHBlZC4gRGVtYW5kIHplcm8gbWFwIGFsbCBvZiB0aGVtIGlmIHRoZXkgYXJlIG5vdCBhbHJlYWR5Ci0gICAqIG1hcHBlZC4KLSAgICovCi0gIEBJbnRlcnJ1cHRpYmxlCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBlYWdlcmx5TW1hcE1NVGtTcGFjZXMoKSB7Ci0gICAgZWFnZXJseU1tYXBNTVRrQ29udGlndW91c1NwYWNlcygpOwotICAgIGVhZ2VybHlNbWFwTU1Ua0Rpc2NvbnRpZ3VvdXNTcGFjZXMoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEVuc3VyZSB0aGF0IGFsbCBjb250aWd1b3VzIE1NVGsgc3BhY2VzIGFyZSBtYXBwZWQuIERlbWFuZCB6ZXJvIG1hcAotICAgKiBhbGwgb2YgdGhlbSBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeSBtYXBwZWQuCi0gICAqLwotICBASW50ZXJydXB0aWJsZQotICBwdWJsaWMgc3RhdGljIHZvaWQgZWFnZXJseU1tYXBNTVRrQ29udGlndW91c1NwYWNlcygpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwYWNlQ291bnQ7IGkrKykgewotICAgICAgU3BhY2Ugc3BhY2UgPSBzcGFjZXNbaV07Ci0gICAgICBpZiAoc3BhY2UgIT0gVk0ubWVtb3J5LmdldFZNU3BhY2UoKSkgewotICAgICAgICBpZiAoT3B0aW9ucy52ZXJib3NlLmdldFZhbHVlKCkgPiAyKSB7Ci0gICAgICAgICAgTG9nLndyaXRlKCJNYXBwaW5nICIpOwotICAgICAgICAgIExvZy53cml0ZShzcGFjZS5uYW1lKTsKLSAgICAgICAgICBMb2cud3JpdGUoIiAiKTsKLSAgICAgICAgICBMb2cud3JpdGUoc3BhY2Uuc3RhcnQpOwotICAgICAgICAgIExvZy53cml0ZSgiLT4iKTsKLSAgICAgICAgICBMb2cud3JpdGVsbihzcGFjZS5zdGFydC5wbHVzKHNwYWNlLmV4dGVudC5taW51cygxKSkpOwotICAgICAgICB9Ci0gICAgICAgIE1tYXBwZXIuZW5zdXJlTWFwcGVkKHNwYWNlLnN0YXJ0LCBzcGFjZS5leHRlbnQudG9JbnQoKT4+TE9HX0JZVEVTX0lOX1BBR0UpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBFbnN1cmUgdGhhdCBhbGwgZGlzY29udGlndW91cyBNTVRrIHNwYWNlcyBhcmUgbWFwcGVkLiBEZW1hbmQgemVybyBtYXAKLSAgICogYWxsIG9mIHRoZW0gaWYgdGhleSBhcmUgbm90IGFscmVhZHkgbWFwcGVkLgotICAgKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHVibGljIHN0YXRpYyB2b2lkIGVhZ2VybHlNbWFwTU1Ua0Rpc2NvbnRpZ3VvdXNTcGFjZXMoKSB7Ci0gICAgQWRkcmVzcyByZWdpb25TdGFydCA9IFNwYWNlLmdldERpc2NvbnRpZ1N0YXJ0KCk7Ci0gICAgQWRkcmVzcyByZWdpb25FbmQgPSBTcGFjZS5nZXREaXNjb250aWdFbmQoKTsKLSAgICBpbnQgcGFnZXMgPSByZWdpb25FbmQuZGlmZihyZWdpb25TdGFydCkudG9JbnQoKT4+TE9HX0JZVEVTX0lOX1BBR0U7Ci0gICAgTG9nLndyaXRlKCJNYXBwaW5nIGRpc2NvbnRpZ3VvdXMgc3BhY2VzICIpOwotICAgIExvZy53cml0ZShyZWdpb25TdGFydCk7Ci0gICAgTG9nLndyaXRlKCItPiIpOwotICAgIExvZy53cml0ZWxuKHJlZ2lvbkVuZC5taW51cygxKSk7Ci0gICAgTW1hcHBlci5lbnN1cmVNYXBwZWQoZ2V0RGlzY29udGlnU3RhcnQoKSwgcGFnZXMpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByaW50IG91dCB0aGUgbWVtb3J5IHVzZWQgYnkgYWxsIHNwYWNlcyBpbiBlaXRoZXIgbWVnYWJ5dGVzIG9yCi0gICAqIHBhZ2VzLgotICAgKgotICAgKiBAcGFyYW0gbW9kZSBBbiBlbnVtZXJhdGlvbiB0eXBlIHRoYXQgc3BlY2lmaWVzIHRoZSBmb3JtYXQgZm9yIHRoZQotICAgKiBwcmluaW5nIChQQUdFUywgTUIsIFBBR0VTX01CLCBvciBNQl9QQUdFUykuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50VXNhZ2UoaW50IG1vZGUpIHsKLSAgICBMb2cud3JpdGUoInVzZWQgPSAiKTsKLSAgICBwcmludFBhZ2VzKGdldFBhZ2VzUmVzZXJ2ZWQoKSwgbW9kZSk7Ci0gICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGFjZUNvdW50OyBpKyspIHsKLSAgICAgIFNwYWNlIHNwYWNlID0gc3BhY2VzW2ldOwotICAgICAgTG9nLndyaXRlKGZpcnN0ID8gIiA9ICIgOiAiICsgIik7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgTG9nLndyaXRlKHNwYWNlLm5hbWUpOyBMb2cud3JpdGUoIiAiKTsKLSAgICAgIHByaW50UGFnZXMoc3BhY2UucmVzZXJ2ZWRQYWdlcygpLCBtb2RlKTsKLSAgICB9Ci0gICAgTG9nLndyaXRlbG4oKTsKLSAgfQotCi0gIC8qKgotICAgKiBQcmludCBvdXQgdGhlIG51bWJlciBvZiBwYWdlcyBhbmQgb3IgbWVnYWJ5dGVzLCBkZXBlbmRpbmcgb24gdGhlIG1vZGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWdlcyBUaGUgbnVtYmVyIG9mIHBhZ2VzCi0gICAqIEBwYXJhbSBtb2RlIEFuIGVudW1lcmF0aW9uIHR5cGUgdGhhdCBzcGVjaWZpZXMgdGhlIGZvcm1hdCBmb3IgdGhlCi0gICAqIHByaW5pbmcgKFBBR0VTLCBNQiwgUEFHRVNfTUIsIG9yIE1CX1BBR0VTKS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRQYWdlcyhpbnQgcGFnZXMsIGludCBtb2RlKSB7Ci0gICAgZG91YmxlIG1iID0gKGRvdWJsZSkgKHBhZ2VzIDw8IExPR19CWVRFU19JTl9QQUdFKSAvIChkb3VibGUpICgxIDw8IDIwKTsKLSAgICBzd2l0Y2ggKG1vZGUpIHsKLSAgICBjYXNlIFBBR0VTOiBMb2cud3JpdGUocGFnZXMpOyBMb2cud3JpdGUoIiBwZ3MiKTsgYnJlYWs7Ci0gICAgY2FzZSBNQjogICAgTG9nLndyaXRlKG1iKTsgTG9nLndyaXRlKCIgTWIiKTsgYnJlYWs7Ci0gICAgY2FzZSBQQUdFU19NQjogTG9nLndyaXRlKHBhZ2VzKTsgTG9nLndyaXRlKCIgcGdzICgiKTsgTG9nLndyaXRlKG1iKTsgTG9nLndyaXRlKCIgTWIpIik7IGJyZWFrOwotICAgIGNhc2UgTUJfUEFHRVM6IExvZy53cml0ZShtYik7IExvZy53cml0ZSgiIE1iICgiKTsgTG9nLndyaXRlKHBhZ2VzKTsgTG9nLndyaXRlKCIgcGdzKSIpOyBicmVhazsKLSAgICAgIGRlZmF1bHQ6IFZNLmFzc2VydGlvbnMuZmFpbCgid3JpdGVQYWdlcyBwYXNzZWQgaWxsZWdhbCBwcmludGluZyBtb2RlIik7Ci0gICAgfQotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogTWlzY2VsbGFuZW91cwotICAgKi8KLQotICAvKioKLSAgICogVHJhY2UgYW4gb2JqZWN0IGFzIHBhcnQgb2YgYSBjb2xsZWN0aW9uIGFuZCByZXR1cm4gdGhlIG9iamVjdCwKLSAgICogd2hpY2ggbWF5IGhhdmUgYmVlbiBmb3J3YXJkZWQgKGlmIGEgY29weWluZyBjb2xsZWN0b3IpLgotICAgKgotICAgKiBAcGFyYW0gdHJhY2UgVGhlIHRyYWNlIGJlaW5nIGNvbmR1Y3RlZC4KLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIHRyYWNlCi0gICAqIEByZXR1cm4gVGhlIG9iamVjdCwgZm9yd2FyZGVkLCBpZiBhcHByb3ByaWF0ZQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IE9iamVjdFJlZmVyZW5jZSB0cmFjZU9iamVjdChUcmFuc2l0aXZlQ2xvc3VyZSB0cmFjZSwgT2JqZWN0UmVmZXJlbmNlIG9iamVjdCk7Ci0KLQotICAvKioKLSAgICogSGFzIHRoZSBvYmplY3QgaW4gdGhpcyBzcGFjZSBiZWVuIHJlYWNoZWQgZHVyaW5nIHRoZSBjdXJyZW50IGNvbGxlY3Rpb24uCi0gICAqIFRoaXMgaXMgdXNlZCBmb3IgR0MgVHJhY2luZy4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHJlZmVyZW5jZS4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBvYmplY3QgaXMgcmVhY2hhYmxlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNSZWFjaGFibGUoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIHJldHVybiBpc0xpdmUob2JqZWN0KTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIElzIHRoZSBvYmplY3QgaW4gdGhpcyBzcGFjZSBhbGl2ZT8KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHJlZmVyZW5jZS4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBvYmplY3QgaXMgbGl2ZS4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzTGl2ZShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KTsKLQotICAvKioKLSAgICogQWxpZ24gYW4gYWRkcmVzcyB0byBhIHNwYWNlIGNodW5rCi0gICAqCi0gICAqIEBwYXJhbSBhZGRyIFRoZSBhZGRyZXNzIHRvIGJlIGFsaWduZWQKLSAgICogQHBhcmFtIGRvd24gSWYgdHJ1ZSB0aGUgYWRkcmVzcyB3aWxsIGJlIHJvdW5kZWQgZG93biwgb3RoZXJ3aXNlCi0gICAqIGl0IHdpbGwgcm91bmRlZCB1cC4KLSAgICogQHJldHVybiBUaGUgY2h1bmstYWxpZ25lZCBhZGRyZXNzCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEFkZHJlc3MgY2h1bmtBbGlnbihBZGRyZXNzIGFkZHIsIGJvb2xlYW4gZG93bikgewotICAgIGlmICghZG93bikgYWRkciA9IGFkZHIucGx1cyhCWVRFU19JTl9DSFVOSyAtIDEpOwotICAgIHJldHVybiBhZGRyLnRvV29yZCgpLnJzaGwoTE9HX0JZVEVTX0lOX0NIVU5LKS5sc2goTE9HX0JZVEVTX0lOX0NIVU5LKS50b0FkZHJlc3MoKTsKLSAgfQotCi0gIC8qKgotICAgKiBBbGlnbiBhbiBleHRlbnQgdG8gYSBzcGFjZSBjaHVuawotICAgKgotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIGV4dGVudCB0byBiZSBhbGlnbmVkCi0gICAqIEBwYXJhbSBkb3duIElmIHRydWUgdGhlIGV4dGVudCB3aWxsIGJlIHJvdW5kZWQgZG93biwgb3RoZXJ3aXNlCi0gICAqIGl0IHdpbGwgcm91bmRlZCB1cC4KLSAgICogQHJldHVybiBUaGUgY2h1bmstYWxpZ25lZCBleHRlbnQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgRXh0ZW50IGNodW5rQWxpZ24oRXh0ZW50IGJ5dGVzLCBib29sZWFuIGRvd24pIHsKLSAgICBpZiAoIWRvd24pIGJ5dGVzID0gYnl0ZXMucGx1cyhCWVRFU19JTl9DSFVOSyAtIDEpOwotICAgIHJldHVybiBieXRlcy50b1dvcmQoKS5yc2hsKExPR19CWVRFU19JTl9DSFVOSykubHNoKExPR19CWVRFU19JTl9DSFVOSykudG9FeHRlbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb252ZXJ0IGEgZnJhY3Rpb24gaW50byBhIG51bWJlciBvZiBieXRlcyBhY2NvcmRpbmcgdG8gdGhlCi0gICAqIGZyYWN0aW9uIG9mIGF2YWlsYWJsZSBieXRlcy4KLSAgICoKLSAgICogQHBhcmFtIGZyYWMgVGhlIGZyYWN0aW9uIG9mIGF2YWlsYWJsZSB2aXJ0dWFsIG1lbW9yeSBkZXNpcmVkCi0gICAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mIGJ5dGVzLCBjaHVuay1hbGlnbmVkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBFeHRlbnQgZ2V0RnJhY0F2YWlsYWJsZShmbG9hdCBmcmFjKSB7Ci0gICAgbG9uZyBieXRlcyA9IChsb25nKSAoZnJhYyAqIEFWQUlMQUJMRV9CWVRFUy50b0xvbmcoKSk7Ci0gICAgV29yZCBtYiA9IFdvcmQuZnJvbUludFNpZ25FeHRlbmQoKGludCkgKGJ5dGVzID4+IExPR19CWVRFU19JTl9NQllURSkpOwotICAgIEV4dGVudCBydG4gPSBtYi5sc2goTE9HX0JZVEVTX0lOX01CWVRFKS50b0V4dGVudCgpOwotICAgIHJldHVybiBjaHVua0FsaWduKHJ0biwgZmFsc2UpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BvbGljeS9pbW1peC9CbG9jay5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvaW1taXgvQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU3MTI1Ny4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BvbGljeS9pbW1peC9CbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wb2xpY3kuaW1taXg7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLm1tdGsucG9saWN5LmltbWl4LkltbWl4Q29uc3RhbnRzLio7Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkNvbnN0YW50czsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS5VbmludGVycnVwdGlibGU7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC5BZGRyZXNzOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuRXh0ZW50OwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuT2Zmc2V0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgZGVmaW5lcyBvcGVyYXRpb25zIG92ZXIgYmxvY2stZ3JhbnVsYXJpdHkgbWV0YS1kYXRhCi0gKgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgY2xhc3MgQmxvY2sgaW1wbGVtZW50cyBDb25zdGFudHMgewotCi0gIHN0YXRpYyBBZGRyZXNzIGFsaWduKGZpbmFsIEFkZHJlc3MgcHRyKSB7Ci0gICAgcmV0dXJuIHB0ci50b1dvcmQoKS5hbmQoQkxPQ0tfTUFTSy5ub3QoKSkudG9BZGRyZXNzKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBbGlnbmVkKGZpbmFsIEFkZHJlc3MgYWRkcmVzcykgewotICAgIHJldHVybiBhZGRyZXNzLkVRKGFsaWduKGFkZHJlc3MpKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCBnZXRDaHVua0luZGV4KGZpbmFsIEFkZHJlc3MgYmxvY2spIHsKLSAgICByZXR1cm4gYmxvY2sudG9Xb3JkKCkuYW5kKENIVU5LX01BU0spLnJzaGwoTE9HX0JZVEVTX0lOX0JMT0NLKS50b0ludCgpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBCbG9jayBtYXJraW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVbnVzZWQoZmluYWwgQWRkcmVzcyBhZGRyZXNzKSB7Ci0gICAgcmV0dXJuIGdldEJsb2NrTWFya1N0YXRlKGFkZHJlc3MpID09IFVOQUxMT0NBVEVEX0JMT0NLX1NUQVRFOwotICB9Ci0KLSAgc3RhdGljIGJvb2xlYW4gaXNVbnVzZWRTdGF0ZShBZGRyZXNzIGN1cnNvcikgewotICAgIHJldHVybiBjdXJzb3IubG9hZFNob3J0KCkgPT0gVU5BTExPQ0FURURfQkxPQ0tfU1RBVEU7Ci0gIH0KLQotICBzdGF0aWMgc2hvcnQgZ2V0TWFya1N0YXRlKEFkZHJlc3MgY3Vyc29yKSB7Ci0gICAgcmV0dXJuIGN1cnNvci5sb2FkU2hvcnQoKTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIHNldFN0YXRlKEFkZHJlc3MgY3Vyc29yLCBzaG9ydCB2YWx1ZSkgewotICAgIGN1cnNvci5zdG9yZSh2YWx1ZSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHNob3J0IGdldEJsb2NrTWFya1N0YXRlKEFkZHJlc3MgYWRkcmVzcykgewotICAgIHJldHVybiBnZXRCbG9ja01hcmtTdGF0ZUFkZHJlc3MoYWRkcmVzcykubG9hZFNob3J0KCk7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBzZXRCbG9ja0FzSW5Vc2UoQWRkcmVzcyBhZGRyZXNzKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoaXNVbnVzZWQoYWRkcmVzcykpOwotICAgIHNldEJsb2NrU3RhdGUoYWRkcmVzcywgVU5NQVJLRURfQkxPQ0tfU1RBVEUpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldEJsb2NrQXNSZXVzZWQoQWRkcmVzcyBhZGRyZXNzKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoIWlzVW51c2VkKGFkZHJlc3MpKTsKLSAgICBzZXRCbG9ja1N0YXRlKGFkZHJlc3MsIFJFVVNFRF9CTE9DS19TVEFURSk7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBzZXRCbG9ja0FzVW5hbGxvY2F0ZWQoQWRkcmVzcyBhZGRyZXNzKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoIWlzVW51c2VkKGFkZHJlc3MpKTsKLSAgICBnZXRCbG9ja01hcmtTdGF0ZUFkZHJlc3MoYWRkcmVzcykuc3RvcmUoVU5BTExPQ0FURURfQkxPQ0tfU1RBVEUpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRCbG9ja1N0YXRlKEFkZHJlc3MgYWRkcmVzcywgc2hvcnQgdmFsdWUpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCh2YWx1ZSAhPSBVTkFMTE9DQVRFRF9CTE9DS19TVEFURSk7Ci0gICAgZ2V0QmxvY2tNYXJrU3RhdGVBZGRyZXNzKGFkZHJlc3MpLnN0b3JlKHZhbHVlKTsKLSAgfQotCi0gIHN0YXRpYyBBZGRyZXNzIGdldEJsb2NrTWFya1N0YXRlQWRkcmVzcyhBZGRyZXNzIGFkZHJlc3MpIHsKLSAgICBBZGRyZXNzIGNodW5rID0gQ2h1bmsuYWxpZ24oYWRkcmVzcyk7Ci0gICAgaW50IGluZGV4ID0gZ2V0Q2h1bmtJbmRleChhZGRyZXNzKTsKLSAgICBBZGRyZXNzIHJ0biA9IGNodW5rLnBsdXMoQ2h1bmsuQkxPQ0tfU1RBVEVfVEFCTEVfT0ZGU0VUKS5wbHVzKGluZGV4PDxMT0dfQllURVNfSU5fQkxPQ0tfU1RBVEVfRU5UUlkpOwotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgewotICAgICAgQWRkcmVzcyBibG9jayA9IGNodW5rLnBsdXMoaW5kZXg8PExPR19CWVRFU19JTl9CTE9DSyk7Ci0gICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQoaXNBbGlnbmVkKGJsb2NrKSk7Ci0gICAgICBib29sZWFuIHZhbGlkID0gcnRuLkdFKGNodW5rLnBsdXMoQ2h1bmsuQkxPQ0tfU1RBVEVfVEFCTEVfT0ZGU0VUKSkgJiYgcnRuLkxUKGNodW5rLnBsdXMoQ2h1bmsuQkxPQ0tfU1RBVEVfVEFCTEVfT0ZGU0VUK0JMT0NLX1NUQVRFX1RBQkxFX0JZVEVTKSk7Ci0gICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQodmFsaWQpOwotICAgIH0KLSAgICByZXR1cm4gcnRuOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBTd2VlcGluZwotICAgKi8KLSAgc3RhdGljIHNob3J0IHN3ZWVwT25lQmxvY2soQWRkcmVzcyBibG9jaywgaW50W10gbWFya0hpc3RvZ3JhbSwgZmluYWwgYnl0ZSBtYXJrU3RhdGUsIGZpbmFsIGJvb2xlYW4gcmVzZXRNYXJrU3RhdGUpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChpc0FsaWduZWQoYmxvY2spKTsKLQotICAgIGZpbmFsIGJvb2xlYW4gdW51c2VkID0gaXNVbnVzZWQoYmxvY2spOwotICAgIGlmICh1bnVzZWQgJiYgIVNBTklUWV9DSEVDS19MSU5FX01BUktTKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBBZGRyZXNzIG1hcmtUYWJsZSA9IExpbmUuZ2V0QmxvY2tNYXJrVGFibGUoYmxvY2spOwotCi0gICAgc2hvcnQgbWFya0NvdW50ID0gMDsKLSAgICBzaG9ydCBjb25zZXJ2YXRpdmVTcGlsbENvdW50ID0gMDsKLSAgICBieXRlIG1hcmssIGxhc3RNYXJrID0gMDsKLSAgICBmb3IgKGludCBvZmZzZXQgPSAwOyBvZmZzZXQgPCAoTElORVNfSU5fQkxPQ0s8PExpbmUuTE9HX0JZVEVTX0lOX0xJTkVfU1RBVFVTKTsgb2Zmc2V0ICs9IExpbmUuQllURVNfSU5fTElORV9TVEFUVVMpIHsKLSAgICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIHsKLSAgICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KG1hcmtUYWJsZS5wbHVzKG9mZnNldCkuR0UoQ2h1bmsuYWxpZ24oYmxvY2spLnBsdXMoQ2h1bmsuTElORV9NQVJLX1RBQkxFX09GRlNFVCkpKTsKLSAgICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KG1hcmtUYWJsZS5wbHVzKG9mZnNldCkuTFQoQ2h1bmsuYWxpZ24oYmxvY2spLnBsdXMoQ2h1bmsuTElORV9NQVJLX1RBQkxFX09GRlNFVCtMaW5lLkxJTkVfTUFSS19UQUJMRV9CWVRFUykpKTsKLSAgICAgIH0KLSAgICAgIG1hcmsgPSBtYXJrVGFibGUubG9hZEJ5dGUoT2Zmc2V0LmZyb21JbnRaZXJvRXh0ZW5kKG9mZnNldCkpOwotICAgICAgaWYgKHJlc2V0TWFya1N0YXRlKQotICAgICAgICBtYXJrVGFibGUuc3RvcmUoKGJ5dGUpIChtYXJrID09IG1hcmtTdGF0ZSA/IFJFU0VUX0xJTkVfTUFSS19TVEFURSA6IDApLCBPZmZzZXQuZnJvbUludFplcm9FeHRlbmQob2Zmc2V0KSk7Ci0KLSAgICAgIGlmIChtYXJrID09IG1hcmtTdGF0ZSkKLSAgICAgICAgbWFya0NvdW50Kys7Ci0gICAgICBlbHNlIGlmIChsYXN0TWFyayA9PSBtYXJrU3RhdGUpCi0gICAgICAgIGNvbnNlcnZhdGl2ZVNwaWxsQ291bnQrKzsKLSAgICAgIGVsc2UgaWYgKFNBTklUWV9DSEVDS19MSU5FX01BUktTICYmIGxhc3RNYXJrICE9IG1hcmtTdGF0ZSkgewotICAgICAgICBWTS5tZW1vcnkuemVybyhibG9jay5wbHVzKG9mZnNldDw8KExPR19CWVRFU19JTl9MSU5FLUxpbmUuTE9HX0JZVEVTX0lOX0xJTkVfU1RBVFVTKSksRXh0ZW50LmZyb21JbnRaZXJvRXh0ZW5kKEJZVEVTX0lOX0xJTkUpKTsKLSAgICAgIH0KLQotICAgICAgbGFzdE1hcmsgPSBtYXJrOwotICAgIH0KLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIHsKLSAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChtYXJrQ291bnQgPD0gTElORVNfSU5fQkxPQ0spOwotICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KG1hcmtDb3VudCArIGNvbnNlcnZhdGl2ZVNwaWxsQ291bnQgPD0gTElORVNfSU5fQkxPQ0spOwotICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KG1hcmtDb3VudCA9PSAwIHx8ICFpc1VudXNlZChibG9jaykpOwotICAgIH0KLQotICAgIGdldERlZnJhZ1N0YXRlQWRkcmVzcyhibG9jaykuc3RvcmUoY29uc2VydmF0aXZlU3BpbGxDb3VudCk7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQobWFya0NvdW50ID49IGNvbnNlcnZhdGl2ZVNwaWxsQ291bnQpOwotICAgIG1hcmtIaXN0b2dyYW1bY29uc2VydmF0aXZlU3BpbGxDb3VudF0gKz0gbWFya0NvdW50OwotCi0gICAgbWFya0NvdW50ID0gKHNob3J0KSAobWFya0NvdW50ICsgY29uc2VydmF0aXZlU3BpbGxDb3VudCk7Ci0KLSAgICByZXR1cm4gbWFya0NvdW50OwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogQmxvY2sgZGVmcmFnIHN0YXRlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWZyYWdTb3VyY2UoQWRkcmVzcyBhZGRyZXNzKSB7Ci0gICAgcmV0dXJuIGdldERlZnJhZ1N0YXRlQWRkcmVzcyhhZGRyZXNzKS5sb2FkU2hvcnQoKSA9PSBCTE9DS19JU19ERUZSQUdfU09VUkNFOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgY2xlYXJDb25zZXJ2YXRpdmVTcGlsbENvdW50KEFkZHJlc3MgYWRkcmVzcykgewotICAgIGdldERlZnJhZ1N0YXRlQWRkcmVzcyhhZGRyZXNzKS5zdG9yZSgoc2hvcnQpIDApOwotICB9Ci0KLSAgc3RhdGljIHNob3J0IGdldENvbnNlcnZhdGl2ZVNwaWxsQ291bnQoQWRkcmVzcyBhZGRyZXNzKSB7Ci0gICAgcmV0dXJuIGdldERlZnJhZ1N0YXRlQWRkcmVzcyhhZGRyZXNzKS5sb2FkU2hvcnQoKTsKLSAgfQotCi0gIHN0YXRpYyBBZGRyZXNzIGdldERlZnJhZ1N0YXRlQWRkcmVzcyhBZGRyZXNzIGFkZHJlc3MpIHsKLSAgICBBZGRyZXNzIGNodW5rID0gQ2h1bmsuYWxpZ24oYWRkcmVzcyk7Ci0gICAgaW50IGluZGV4ID0gZ2V0Q2h1bmtJbmRleChhZGRyZXNzKTsKLSAgICBBZGRyZXNzIHJ0biA9IGNodW5rLnBsdXMoQ2h1bmsuQkxPQ0tfREVGUkFHX1NUQVRFX1RBQkxFX09GRlNFVCkucGx1cyhpbmRleDw8TE9HX0JZVEVTX0lOX0JMT0NLX0RFRlJBR19TVEFURV9FTlRSWSk7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSB7Ci0gICAgICBBZGRyZXNzIGJsb2NrID0gY2h1bmsucGx1cyhpbmRleDw8TE9HX0JZVEVTX0lOX0JMT0NLKTsKLSAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChpc0FsaWduZWQoYmxvY2spKTsKLSAgICAgIGJvb2xlYW4gdmFsaWQgPSBydG4uR0UoY2h1bmsucGx1cyhDaHVuay5CTE9DS19ERUZSQUdfU1RBVEVfVEFCTEVfT0ZGU0VUKSkgJiYgcnRuLkxUKGNodW5rLnBsdXMoQ2h1bmsuQkxPQ0tfREVGUkFHX1NUQVRFX1RBQkxFX09GRlNFVCtCTE9DS19ERUZSQUdfU1RBVEVfVEFCTEVfQllURVMpKTsKLSAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydCh2YWxpZCk7Ci0gICAgfQotICAgIHJldHVybiBydG47Ci0gIH0KLQotICBzdGF0aWMgdm9pZCByZXNldExpbmVNYXJrc0FuZERlZnJhZ1N0YXRlVGFibGUoc2hvcnQgdGhyZXNob2xkLCBBZGRyZXNzIG1hcmtTdGF0ZUJhc2UsIEFkZHJlc3MgZGVmcmFnU3RhdGVCYXNlLAotICAgICAgQWRkcmVzcyBsaW5lTWFya0Jhc2UsIGludCBibG9jaykgewotICAgIE9mZnNldCBjc09mZnNldCA9IE9mZnNldC5mcm9tSW50WmVyb0V4dGVuZChibG9jazw8TE9HX0JZVEVTX0lOX0JMT0NLX0RFRlJBR19TVEFURV9FTlRSWSk7Ci0gICAgc2hvcnQgc3RhdGUgPSBkZWZyYWdTdGF0ZUJhc2UubG9hZFNob3J0KGNzT2Zmc2V0KTsKLSAgICBzaG9ydCBkZWZyYWdTdGF0ZSA9IEJMT0NLX0lTX05PVF9ERUZSQUdfU09VUkNFOwotICAgIGlmIChzdGF0ZSA+PSB0aHJlc2hvbGQpIGRlZnJhZ1N0YXRlID0gQkxPQ0tfSVNfREVGUkFHX1NPVVJDRTsKLSAgICBkZWZyYWdTdGF0ZUJhc2Uuc3RvcmUoZGVmcmFnU3RhdGUsIGNzT2Zmc2V0KTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIHNob3J0IFVOQUxMT0NBVEVEX0JMT0NLX1NUQVRFID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgc2hvcnQgVU5NQVJLRURfQkxPQ0tfU1RBVEUgPSAoc2hvcnQpIChNQVhfQkxPQ0tfTUFSS19TVEFURSArIDEpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBzaG9ydCBSRVVTRURfQkxPQ0tfU1RBVEUgPSAoc2hvcnQpIChNQVhfQkxPQ0tfTUFSS19TVEFURSArIDIpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIHNob3J0IEJMT0NLX0lTX05PVF9ERUZSQUdfU09VUkNFID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgc2hvcnQgQkxPQ0tfSVNfREVGUkFHX1NPVVJDRSA9IDE7Ci0KLSAgLyogYmxvY2sgc3RhdGVzICovCi0gIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0JZVEVTX0lOX0JMT0NLX1NUQVRFX0VOVFJZID0gTE9HX0JZVEVTX0lOX1NIT1JUOyAvLyB1c2UgYSBzaG9ydCBmb3Igbm93Ci0gIHN0YXRpYyBmaW5hbCBpbnQgQllURVNfSU5fQkxPQ0tfU1RBVEVfRU5UUlkgPSAxPDxMT0dfQllURVNfSU5fQkxPQ0tfU1RBVEVfRU5UUlk7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgQkxPQ0tfU1RBVEVfVEFCTEVfQllURVMgPSBCTE9DS1NfSU5fQ0hVTks8PExPR19CWVRFU19JTl9CTE9DS19TVEFURV9FTlRSWTsKLQotICAvKiBwZXItYmxvY2sgZGVmcmFnIHN0YXRlICovCi0gIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0JZVEVTX0lOX0JMT0NLX0RFRlJBR19TVEFURV9FTlRSWSA9IExPR19CWVRFU19JTl9TSE9SVDsKLSAgc3RhdGljIGZpbmFsIGludCBCWVRFU19JTl9CTE9DS19ERUZSQUdfU1RBVEVfRU5UUlkgPSAxPDxMT0dfQllURVNfSU5fQkxPQ0tfREVGUkFHX1NUQVRFX0VOVFJZOwotCi0gIHN0YXRpYyBmaW5hbCBpbnQgQkxPQ0tfREVGUkFHX1NUQVRFX1RBQkxFX0JZVEVTID0gQkxPQ0tTX0lOX0NIVU5LPDxMT0dfQllURVNfSU5fQkxPQ0tfREVGUkFHX1NUQVRFX0VOVFJZOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvaW1taXgvQ2h1bmsuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L2ltbWl4L0NodW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZjg1YzQuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvaW1taXgvQ2h1bmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucG9saWN5LmltbWl4OwotCi1pbXBvcnQgc3RhdGljIG9yZy5tbXRrLnBvbGljeS5TcGFjZS5CWVRFU19JTl9DSFVOSzsKLWltcG9ydCBzdGF0aWMgb3JnLm1tdGsucG9saWN5LmltbWl4LkltbWl4Q29uc3RhbnRzLio7Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkNvbnN0YW50czsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkNvbnZlcnNpb25zOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuaGVhcC5NbWFwcGVyOwotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLlVuaW50ZXJydXB0aWJsZTsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLkFkZHJlc3M7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC5FeHRlbnQ7Ci0KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBjbGFzcyBDaHVuayBpbXBsZW1lbnRzIENvbnN0YW50cyB7Ci0KLSAgcHVibGljIHN0YXRpYyBBZGRyZXNzIGFsaWduKEFkZHJlc3MgcHRyKSB7Ci0gICAgcmV0dXJuIHB0ci50b1dvcmQoKS5hbmQoQ0hVTktfTUFTSy5ub3QoKSkudG9BZGRyZXNzKCk7Ci0gIH0KLQotICBzdGF0aWMgYm9vbGVhbiBpc0FsaWduZWQoQWRkcmVzcyBwdHIpIHsKLSAgICByZXR1cm4gcHRyLkVRKGFsaWduKHB0cikpOwotICB9Ci0KLSAgc3RhdGljIGludCBnZXRCeXRlT2Zmc2V0KEFkZHJlc3MgcHRyKSB7Ci0gICAgcmV0dXJuIHB0ci50b1dvcmQoKS5hbmQoQ0hVTktfTUFTSykudG9JbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBwYWdlcyBvZiBtZXRhZGF0YSByZXF1aXJlZCBwZXIgY2h1bmsuCi0gICAqLwotICBzdGF0aWMgaW50IGdldFJlcXVpcmVkTWV0YURhdGFQYWdlcygpIHsKLSAgICBFeHRlbnQgYnl0ZXMgPSBFeHRlbnQuZnJvbUludFplcm9FeHRlbmQoUk9VTkRFRF9NRVRBREFUQV9CWVRFU19QRVJfQ0hVTkspOwotICAgIHJldHVybiBDb252ZXJzaW9ucy5ieXRlc1RvUGFnZXNVcChieXRlcyk7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBzd2VlcChBZGRyZXNzIGNodW5rLCBBZGRyZXNzIGVuZCwgSW1taXhTcGFjZSBzcGFjZSwgaW50W10gbWFya0hpc3RvZ3JhbSwgZmluYWwgYnl0ZSBtYXJrVmFsdWUsIGZpbmFsIGJvb2xlYW4gcmVzZXRNYXJrcykgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGlzQWxpZ25lZChjaHVuaykpOwotICAgIEFkZHJlc3Mgc3RhcnQgPSBnZXRGaXJzdFVzYWJsZUJsb2NrKGNodW5rKTsKLSAgICBBZGRyZXNzIGN1cnNvciA9IEJsb2NrLmdldEJsb2NrTWFya1N0YXRlQWRkcmVzcyhzdGFydCk7Ci0gICAgZm9yIChpbnQgaW5kZXggPSBGSVJTVF9VU0FCTEVfQkxPQ0tfSU5ERVg7IGluZGV4IDwgQkxPQ0tTX0lOX0NIVU5LOyBpbmRleCsrKSB7Ci0gICAgICBBZGRyZXNzIGJsb2NrID0gY2h1bmsucGx1cyhpbmRleDw8TE9HX0JZVEVTX0lOX0JMT0NLKTsKLSAgICAgIGlmIChibG9jay5HVChlbmQpKSBicmVhazsKLSAgICAgIGZpbmFsIGJvb2xlYW4gZGVmcmFnU291cmNlID0gc3BhY2UuaW5JbW1peERlZnJhZ0NvbGxlY3Rpb24oKSAmJiBCbG9jay5pc0RlZnJhZ1NvdXJjZShibG9jayk7Ci0gICAgICBzaG9ydCBtYXJrZWQgPSBCbG9jay5zd2VlcE9uZUJsb2NrKGJsb2NrLCBtYXJrSGlzdG9ncmFtLCBtYXJrVmFsdWUsIHJlc2V0TWFya3MpOwotICAgICAgaWYgKG1hcmtlZCA9PSAwKSB7Ci0gICAgICAgIGlmICghQmxvY2suaXNVbnVzZWRTdGF0ZShjdXJzb3IpKSB7Ci0gICAgICAgICAgc3BhY2UucmVsZWFzZShibG9jayk7Ci0gICAgICAgICAgaWYgKGRlZnJhZ1NvdXJjZSkgRGVmcmFnLmRlZnJhZ0J5dGVzRnJlZWQuaW5jKEJZVEVTX0lOX0JMT0NLKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChCbG9jay5pc1VudXNlZChibG9jaykpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQobWFya2VkID4gMCAmJiBtYXJrZWQgPD0gTElORVNfSU5fQkxPQ0spOwotICAgICAgICBCbG9jay5zZXRTdGF0ZShjdXJzb3IsIG1hcmtlZCk7Ci0gICAgICAgIGlmIChkZWZyYWdTb3VyY2UpIERlZnJhZy5kZWZyYWdCeXRlc05vdEZyZWVkLmluYyhCWVRFU19JTl9CTE9DSyk7Ci0gICAgICB9Ci0gICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChCbG9jay5pc1VudXNlZChibG9jaykgfHwgKEJsb2NrLmdldEJsb2NrTWFya1N0YXRlKGJsb2NrKSA9PSBtYXJrZWQgJiYgbWFya2VkID4gMCAmJiBtYXJrZWQgPD0gTUFYX0JMT0NLX01BUktfU1RBVEUpKTsKLSAgICAgIGN1cnNvciA9IGN1cnNvci5wbHVzKEJsb2NrLkJZVEVTX0lOX0JMT0NLX1NUQVRFX0VOVFJZKTsKLSAgICB9Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBjbGVhck1ldGFEYXRhKEFkZHJlc3MgY2h1bmspIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIHsKLSAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChpc0FsaWduZWQoY2h1bmspKTsKLSAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChDb252ZXJzaW9ucy5pc1BhZ2VBbGlnbmVkKGNodW5rKSk7Ci0gICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQoQ29udmVyc2lvbnMuaXNQYWdlQWxpZ25lZChST1VOREVEX01FVEFEQVRBX0JZVEVTX1BFUl9DSFVOSykpOwotICAgIH0KLSAgICBNbWFwcGVyLmVuc3VyZU1hcHBlZChjaHVuaywgUk9VTkRFRF9NRVRBREFUQV9QQUdFU19QRVJfQ0hVTkspOwotICAgIFZNLm1lbW9yeS56ZXJvKGNodW5rLCBFeHRlbnQuZnJvbUludFplcm9FeHRlbmQoUk9VTkRFRF9NRVRBREFUQV9CWVRFU19QRVJfQ0hVTkspKTsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIGNoZWNrTWV0YURhdGFDbGVhcmVkKGNodW5rLCBjaHVuayk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrTWV0YURhdGFDbGVhcmVkKEFkZHJlc3MgY2h1bmssIEFkZHJlc3MgdmFsdWUpIHsKLSAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQoaXNBbGlnbmVkKGNodW5rKSk7Ci0gICAgQWRkcmVzcyBibG9jayA9IENodW5rLmdldEhpZ2hXYXRlcihjaHVuayk7Ci0gICAgaWYgKHZhbHVlLkVRKGNodW5rKSkgewotICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGJsb2NrLmlzWmVybygpKTsKLSAgICAgIGJsb2NrID0gY2h1bmsucGx1cyhDaHVuay5ST1VOREVEX01FVEFEQVRBX0JZVEVTX1BFUl9DSFVOSyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJsb2NrID0gYmxvY2sucGx1cyhCWVRFU19JTl9CTE9DSyk7IC8vIHN0YXJ0IGF0IGZpcnN0IGJsb2NrIGFmdGVyIGhpZ2h3YXRlcgotICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KEJsb2NrLmFsaWduKGJsb2NrKS5FUShibG9jaykpOwotICAgIH0KLSAgICB3aGlsZSAoYmxvY2suTFQoY2h1bmsucGx1cyhCWVRFU19JTl9DSFVOSykpKSB7Ci0gICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQoQ2h1bmsuYWxpZ24oYmxvY2spLkVRKGNodW5rKSk7Ci0gICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQoQmxvY2suaXNVbnVzZWQoYmxvY2spKTsKLSAgICAgIGJsb2NrID0gYmxvY2sucGx1cyhCWVRFU19JTl9CTE9DSyk7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIHZvaWQgdXBkYXRlSGlnaFdhdGVyKEFkZHJlc3MgdmFsdWUpIHsKLSAgICBBZGRyZXNzIGNodW5rID0gYWxpZ24odmFsdWUpOwotICAgIGlmIChnZXRIaWdoV2F0ZXIoY2h1bmspLkxUKHZhbHVlKSkgewotICAgICAgc2V0SGlnaFdhdGVyKGNodW5rLCB2YWx1ZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRIaWdoV2F0ZXIoQWRkcmVzcyBjaHVuaywgQWRkcmVzcyB2YWx1ZSkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGlzQWxpZ25lZChjaHVuaykpOwotICAgIGNodW5rLnBsdXMoSElHSFdBVEVSX09GRlNFVCkuc3RvcmUodmFsdWUpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBBZGRyZXNzIGdldEhpZ2hXYXRlcihBZGRyZXNzIGNodW5rKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoaXNBbGlnbmVkKGNodW5rKSk7Ci0gICAgcmV0dXJuIGNodW5rLnBsdXMoSElHSFdBVEVSX09GRlNFVCkubG9hZEFkZHJlc3MoKTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIHNldE1hcChBZGRyZXNzIGNodW5rLCBpbnQgdmFsdWUpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChpc0FsaWduZWQoY2h1bmspKTsKLSAgICBjaHVuay5wbHVzKE1BUF9PRkZTRVQpLnN0b3JlKHZhbHVlKTsKLSAgfQotCi0gIHN0YXRpYyBpbnQgZ2V0TWFwKEFkZHJlc3MgY2h1bmspIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChpc0FsaWduZWQoY2h1bmspKTsKLSAgICBpbnQgcnRuID0gY2h1bmsucGx1cyhNQVBfT0ZGU0VUKS5sb2FkSW50KCk7Ci0gICAgcmV0dXJuIChydG4gPCAwKSA/IC1ydG4gOiBydG47Ci0gIH0KLQotICBzdGF0aWMgdm9pZCByZXNldExpbmVNYXJrc0FuZERlZnJhZ1N0YXRlVGFibGUoQWRkcmVzcyBjaHVuaywgc2hvcnQgdGhyZXNob2xkKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoaXNBbGlnbmVkKGNodW5rKSk7Ci0gICAgQWRkcmVzcyBtYXJrU3RhdGVCYXNlID0gQmxvY2suZ2V0QmxvY2tNYXJrU3RhdGVBZGRyZXNzKGNodW5rKTsKLSAgICBBZGRyZXNzIGRlZnJhZ1N0YXRlQmFzZSA9IEJsb2NrLmdldERlZnJhZ1N0YXRlQWRkcmVzcyhjaHVuayk7Ci0gICAgQWRkcmVzcyBsaW5lTWFya0Jhc2UgPSBMaW5lLmdldENodW5rTWFya1RhYmxlKGNodW5rKTsKLSAgICBmb3IgKGludCBiID0gRklSU1RfVVNBQkxFX0JMT0NLX0lOREVYOyBiIDwgQkxPQ0tTX0lOX0NIVU5LOyBiKyspIHsKLSAgICAgIEJsb2NrLnJlc2V0TGluZU1hcmtzQW5kRGVmcmFnU3RhdGVUYWJsZSh0aHJlc2hvbGQsIG1hcmtTdGF0ZUJhc2UsIGRlZnJhZ1N0YXRlQmFzZSwgbGluZU1hcmtCYXNlLCBiKTsKLSAgICB9Ci0gIH0KLQotICBzdGF0aWMgQWRkcmVzcyBnZXRGaXJzdFVzYWJsZUJsb2NrKEFkZHJlc3MgY2h1bmspIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChpc0FsaWduZWQoY2h1bmspKTsKLSAgICBBZGRyZXNzIHJ0biA9IGNodW5rLnBsdXMoUk9VTkRFRF9NRVRBREFUQV9CWVRFU19QRVJfQ0hVTkspOwotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KHJ0bi5FUShCbG9jay5hbGlnbihydG4pKSk7Ci0gICAgcmV0dXJuIHJ0bjsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0dfQllURVNfSU5fSElHSFdBVEVSX0VOVFJZID0gTE9HX0JZVEVTX0lOX0FERFJFU1M7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBISUdIV0FURVJfQllURVMgPSAxPDxMT0dfQllURVNfSU5fSElHSFdBVEVSX0VOVFJZOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0JZVEVTX0lOX01BUF9FTlRSWSA9IExPR19CWVRFU19JTl9JTlQ7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVBfQllURVMgPSAxPDxMT0dfQllURVNfSU5fTUFQX0VOVFJZOwotCi0gIC8qIGJ5dGUgb2Zmc2V0cyBmb3IgZWFjaCB0eXBlIG9mIG1ldGFkYXRhICovCi0gIHN0YXRpYyBmaW5hbCBpbnQgTElORV9NQVJLX1RBQkxFX09GRlNFVCA9IDA7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgQkxPQ0tfU1RBVEVfVEFCTEVfT0ZGU0VUID0gTElORV9NQVJLX1RBQkxFX09GRlNFVCArIExpbmUuTElORV9NQVJLX1RBQkxFX0JZVEVTOwotICBzdGF0aWMgZmluYWwgaW50IEJMT0NLX0RFRlJBR19TVEFURV9UQUJMRV9PRkZTRVQgPSBCTE9DS19TVEFURV9UQUJMRV9PRkZTRVQgKyBCbG9jay5CTE9DS19TVEFURV9UQUJMRV9CWVRFUzsKLSAgc3RhdGljIGZpbmFsIGludCBISUdIV0FURVJfT0ZGU0VUID0gQkxPQ0tfREVGUkFHX1NUQVRFX1RBQkxFX09GRlNFVCArIEJsb2NrLkJMT0NLX0RFRlJBR19TVEFURV9UQUJMRV9CWVRFUzsKLSAgc3RhdGljIGZpbmFsIGludCBNQVBfT0ZGU0VUID0gSElHSFdBVEVSX09GRlNFVCArIEhJR0hXQVRFUl9CWVRFUzsKLSAgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9CWVRFU19QRVJfQ0hVTksgPSBNQVBfT0ZGU0VUICsgTUFQX0JZVEVTOwotCi0gIC8qIEZJWE1FIHdlIHJvdW5kIHRoZSBtZXRhZGF0YSB1cCB0byBibG9jayBzaXplcyBqdXN0IHRvIGVuc3VyZSB0aGUgdW5kZXJseWluZyBhbGxvY2F0b3IgZ2l2ZXMgdXMgYWxpZ25lZCByZXF1ZXN0cyAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkxPQ0tfTUFTSyA9ICgxPDxMT0dfQllURVNfSU5fQkxPQ0spIC0gMTsKLSAgc3RhdGljIGZpbmFsIGludCBST1VOREVEX01FVEFEQVRBX0JZVEVTX1BFUl9DSFVOSyA9IChNRVRBREFUQV9CWVRFU19QRVJfQ0hVTksgKyBCTE9DS19NQVNLKSAmIH5CTE9DS19NQVNLOwotICBzdGF0aWMgZmluYWwgaW50IFJPVU5ERURfTUVUQURBVEFfUEFHRVNfUEVSX0NIVU5LID0gUk9VTkRFRF9NRVRBREFUQV9CWVRFU19QRVJfQ0hVTks+PkxPR19CWVRFU19JTl9QQUdFOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSVJTVF9VU0FCTEVfQkxPQ0tfSU5ERVggPSBST1VOREVEX01FVEFEQVRBX0JZVEVTX1BFUl9DSFVOSz4+TE9HX0JZVEVTX0lOX0JMT0NLOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvaW1taXgvQ2h1bmtMaXN0LmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BvbGljeS9pbW1peC9DaHVua0xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTczYmU4Mi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BvbGljeS9pbW1peC9DaHVua0xpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucG9saWN5LmltbWl4OwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5QbGFuOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkNvbnN0YW50czsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuVW5pbnRlcnJ1cHRpYmxlOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuQWRkcmVzczsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLkFkZHJlc3NBcnJheTsKLQotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGZpbmFsIGNsYXNzIENodW5rTGlzdCBpbXBsZW1lbnRzIENvbnN0YW50cyB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0dfUEFHRVNfSU5fQ0hVTktfTUFQX0JMT0NLID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOVFJJRVNfSU5fQ0hVTktfTUFQX0JMT0NLID0gKEJZVEVTX0lOX1BBR0U8PExPR19QQUdFU19JTl9DSFVOS19NQVBfQkxPQ0spPj5MT0dfQllURVNfSU5fQUREUkVTUzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENIVU5LX01BUF9CTE9DS1MgPSAxPDw0OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0VOVFJJRVNfSU5fQ0hVTktfTUFQID0gRU5UUklFU19JTl9DSFVOS19NQVBfQkxPQ0sgKiBDSFVOS19NQVBfQkxPQ0tTOwotICBwcml2YXRlIEFkZHJlc3NBcnJheSBjaHVua01hcCA9ICBBZGRyZXNzQXJyYXkuY3JlYXRlKENIVU5LX01BUF9CTE9DS1MpOwotICBwcml2YXRlIGludCBjaHVua01hcExpbWl0ID0gLTE7Ci0gIHByaXZhdGUgaW50IGNodW5rTWFwQ3Vyc29yID0gLTE7Ci0KLSAgdm9pZCByZXNldCgpIHsKLSAgICBjaHVua01hcExpbWl0ID0gY2h1bmtNYXBDdXJzb3I7Ci0gIH0KLQotICBwdWJsaWMgQWRkcmVzcyBnZXRIZWFkQ2h1bmsoKSB7Ci0gICAgaWYgKGNodW5rTWFwTGltaXQgPCAwKQotICAgICAgcmV0dXJuIEFkZHJlc3MuemVybygpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBnZXRNYXBBZGRyZXNzKDApLmxvYWRBZGRyZXNzKCk7Ci0gIH0KLQotICBwdWJsaWMgQWRkcmVzcyBnZXRUYWlsQ2h1bmsoKSB7Ci0gICAgaWYgKGNodW5rTWFwTGltaXQgPCAwKQotICAgICAgcmV0dXJuIEFkZHJlc3MuemVybygpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBnZXRNYXBBZGRyZXNzKGNodW5rTWFwTGltaXQpLmxvYWRBZGRyZXNzKCk7Ci0gIH0KLQotICB2b2lkIGFkZE5ld0NodW5rVG9NYXAoQWRkcmVzcyBjaHVuaykgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KENodW5rLmlzQWxpZ25lZChjaHVuaykpOwotICAgIGlmIChjaHVua01hcEN1cnNvciA9PSBNQVhfRU5UUklFU19JTl9DSFVOS19NQVAgLSAxKQotICAgICAgY29uc29saWRhdGVNYXAoKTsKLSAgICBjaHVua01hcEN1cnNvcisrOwotICAgIGludCBpbmRleCA9IGdldENodW5rSW5kZXgoY2h1bmtNYXBDdXJzb3IpOwotICAgIGludCBtYXAgPSBnZXRDaHVua01hcChjaHVua01hcEN1cnNvcik7Ci0gICAgaWYgKG1hcCA+PSBDSFVOS19NQVBfQkxPQ0tTKSB7Ci0gICAgICBTcGFjZS5wcmludFVzYWdlTUIoKTsKLSAgICAgIFZNLmFzc2VydGlvbnMuZmFpbCgiT3ZlcmZsb3cgb2YgY2h1bmsgbWFwISIpOwotICAgIH0KLSAgICBpZiAoY2h1bmtNYXAuZ2V0KG1hcCkuaXNaZXJvKCkpIHsKLSAgICAgIEFkZHJlc3MgdG1wID0gUGxhbi5tZXRhRGF0YVNwYWNlLmFjcXVpcmUoMTw8TE9HX1BBR0VTX0lOX0NIVU5LX01BUF9CTE9DSyk7Ci0gICAgICBpZiAodG1wLmlzWmVybygpKSB7Ci0gICAgICAgIFNwYWNlLnByaW50VXNhZ2VNQigpOwotICAgICAgICBWTS5hc3NlcnRpb25zLmZhaWwoIkZhaWxlZCB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgY2h1bmsgbWFwLiAgSXMgbWV0YWRhdGEgdmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkPyIpOwotICAgICAgfQotICAgICAgY2h1bmtNYXAuc2V0KG1hcCwgdG1wKTsKLSAgICB9Ci0gICAgQWRkcmVzcyBlbnRyeSA9IGNodW5rTWFwLmdldChtYXApLnBsdXMoaW5kZXg8PExPR19CWVRFU19JTl9BRERSRVNTKTsKLSAgICBlbnRyeS5zdG9yZShjaHVuayk7Ci0gICAgQ2h1bmsuc2V0TWFwKGNodW5rLCBjaHVua01hcEN1cnNvcik7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBjaGVja01hcCgpOwotICB9Ci0KLSAgdm9pZCByZW1vdmVDaHVua0Zyb21NYXAoQWRkcmVzcyBjaHVuaykgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KENodW5rLmlzQWxpZ25lZChjaHVuaykpOwotICAgIGludCBlbnRyeSA9IENodW5rLmdldE1hcChjaHVuayk7Ci0gICAgZ2V0TWFwQWRkcmVzcyhlbnRyeSkuc3RvcmUoQWRkcmVzcy56ZXJvKCkpOyAgLy8gemVybyBpdCBpdAotICAgIENodW5rLnNldE1hcChjaHVuaywgLWVudHJ5KTsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIGNoZWNrTWFwKCk7Ci0gIH0KLQotICBwcml2YXRlIGludCBnZXRDaHVua0luZGV4KGludCBlbnRyeSkgeyByZXR1cm4gZW50cnkgJiAoRU5UUklFU19JTl9DSFVOS19NQVBfQkxPQ0sgLSAxKTt9Ci0gIHByaXZhdGUgaW50IGdldENodW5rTWFwKGludCBlbnRyeSkge3JldHVybiBlbnRyeSAmIH4oRU5UUklFU19JTl9DSFVOS19NQVBfQkxPQ0sgLSAxKTt9Ci0KLSAgcHJpdmF0ZSBBZGRyZXNzIGdldE1hcEFkZHJlc3MoaW50IGVudHJ5KSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZW50cnkgPj0gMCk7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZW50cnkgPD0gY2h1bmtNYXBDdXJzb3IpOwotICAgIGludCBpbmRleCA9IGdldENodW5rSW5kZXgoZW50cnkpOwotICAgIGludCBtYXAgPSBnZXRDaHVua01hcChlbnRyeSk7Ci0gICAgcmV0dXJuIGNodW5rTWFwLmdldChtYXApLnBsdXMoaW5kZXg8PExPR19CWVRFU19JTl9BRERSRVNTKTsKLSAgfQotCi0gIC8qKgotICAgKiBBIGNodW5rIGl0ZXJhdG9yLiAgUmV0dXJuIHRoZSBuZXh0IGNodW5rIGluIHNlcXVlbmNlLCBvciBudWxsIGlmIHRoZQotICAgKiBuZXh0IGNodW5rIGlzIHRoZSBzYW1lIGNodW5rIChpZSB0aGVyZSBpcyBvbmx5IG9uZSBjaHVuayBpbiB0aGUgaXRlcmF0b3IpLgotICAgKgotICAgKiBAcGFyYW0gY2h1bmsgVGhlIGNodW5rCi0gICAqIEByZXR1cm4gVGhlIG5leHQgY2h1bmsgaW4gdGhlIHNlcXVlbmNlLCBvciBudWxsIGlmIG5leHQgaXMgY2h1bmsuCi0gICAqLwotICBwdWJsaWMgQWRkcmVzcyBuZXh0Q2h1bmsoQWRkcmVzcyBjaHVuaykgewotICAgIHJldHVybiBuZXh0Q2h1bmsoY2h1bmssIGNodW5rKTsKLSAgfQotCi0gIC8qKgotICAgKiBBIGNodW5rIGl0ZXJhdG9yLiAgUmV0dXJuIHRoZSBuZXh0IGNodW5rIGluIHNlcXVlbmNlLCBvciBudWxsIGlmIHRoZQotICAgKiBuZXh0IGNodW5rIGlzIGxpbWl0LgotICAgKgotICAgKiBAcGFyYW0gY2h1bmsgVGhlIGNodW5rCi0gICAqIEBwYXJhbSBsaW1pdCBUaGUgc3RhcnRpbmcgcG9pbnQgKGlmIG5leHQgaXMgZXF1YWwgdG8gdGhpcywgd2UncmUgZG9uZSkKLSAgICogQHJldHVybiBUaGUgbmV4dCBjaHVuayBpbiB0aGUgc2VxdWVuY2UsIG9yIG51bGwgaWYgbmV4dCBpcyBsaW1pdC4KLSAgICovCi0gIHByaXZhdGUgQWRkcmVzcyBuZXh0Q2h1bmsoZmluYWwgQWRkcmVzcyBjaHVuaywgZmluYWwgQWRkcmVzcyBsaW1pdCkgewotICAgIHJldHVybiBuZXh0Q2h1bmsoY2h1bmssIENodW5rLmdldE1hcChsaW1pdCksIDEpOwotICB9Ci0KLSAgLyoqCi0gICAqIEEgY2h1bmsgaXRlcmF0b3IuICBSZXR1cm4gdGhlIG5leHQgY2h1bmsgaW4gc2VxdWVuY2UsIHN0cmlkZWQKLSAgICogYnkgc3RyaWRlIHN0ZXBzLCBvciBudWxsIGlmIHRoZSBuZXh0IGNodW5rIGlzIHN0YXJ0LgotICAgKgotICAgKiBAcGFyYW0gY2h1bmsgVGhlIGNodW5rCi0gICAqIEBwYXJhbSBzdGFydCBUaGUgcG9pbnQgd2hlcmUgdGhpcyBpdGVyYXRvciBzdGFydGVkLCB3aGljaCBkZWZpbmVzIGl0cyBlbmQtcG9pbnQKLSAgICogQHBhcmFtIHN0cmlkZSBUaGUgc3RyaWRlIGJ5IHdoaWNoIHRoZSBpdGVyYXRvciBzaG91bGQgYmUgc3RlcHBlZAotICAgKiBAcmV0dXJuIFRoZSBuZXh0IGNodW5rIGluIHRoZSBzZXF1ZW5jZSwgb3IgbnVsbCBpZiBuZXh0IGlzIHN0YXJ0LgotICAgKi8KLSAgcHVibGljIEFkZHJlc3MgbmV4dENodW5rKGZpbmFsIEFkZHJlc3MgY2h1bmssIGZpbmFsIGludCBzdGFydCwgZmluYWwgaW50IHN0cmlkZSkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgY2hlY2tNYXAoKTsKLSAgICByZXR1cm4gbmV4dENodW5rKENodW5rLmdldE1hcChjaHVuayksIHN0YXJ0LCBzdHJpZGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEEgY2h1bmsgaXRlcmF0b3IuICBSZXR1cm4gdGhlIG5leHQgY2h1bmsgaW4gc2VxdWVuY2UsIHN0cmlkZWQKLSAgICogYnkgc3RyaWRlIHN0ZXBzLCBvciBudWxsIGlmIHRoZSBuZXh0IGNodW5rIGlzIHN0YXJ0LgotICAgKgotICAgKiBAcGFyYW0gZW50cnkgVGhlIGVudHJ5IHdlJ3JlIGN1cnJlbnRseSB1cCB0bwotICAgKiBAcGFyYW0gc3RhcnQgVGhlIHBvaW50IHdoZXJlIHRoaXMgaXRlcmF0b3Igc3RhcnRlZCwgd2hpY2ggZGVmaW5lcyBpdHMgZW5kLXBvaW50Ci0gICAqIEBwYXJhbSBzdHJpZGUgVGhlIHN0cmlkZSBieSB3aGljaCB0aGUgaXRlcmF0b3Igc2hvdWxkIGJlIHN0ZXBwZWQKLSAgICogQHJldHVybiBUaGUgbmV4dCBjaHVuayBpbiB0aGUgc2VxdWVuY2UsIG9yIG51bGwgaWYgbmV4dCBpcyBzdGFydC4KLSAgICovCi0gIHByaXZhdGUgQWRkcmVzcyBuZXh0Q2h1bmsoaW50IGVudHJ5LCBmaW5hbCBpbnQgc3RhcnQsIGZpbmFsIGludCBzdHJpZGUpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIGNoZWNrTWFwKCk7Ci0gICAgQWRkcmVzcyBjaHVuazsKLSAgICBkbyB7Ci0gICAgICBlbnRyeSArPSBzdHJpZGU7Ci0gICAgICBpZiAoZW50cnkgPiBjaHVua01hcExpbWl0KSB7IGVudHJ5ID0gZW50cnkgJSBzdHJpZGU7IH0KLSAgICAgIGNodW5rID0gZ2V0TWFwQWRkcmVzcyhlbnRyeSkubG9hZEFkZHJlc3MoKTsKLSAgICB9IHdoaWxlIChjaHVuay5pc1plcm8oKSAmJiBlbnRyeSAhPSBzdGFydCk7Ci0gICAgcmV0dXJuIGVudHJ5ID09IHN0YXJ0ID8gQWRkcmVzcy56ZXJvKCkgOiBjaHVuazsKLSAgfQotCi0gIHB1YmxpYyBBZGRyZXNzIGZpcnN0Q2h1bmsoaW50IG9yZGluYWwsIGludCBzdHJpZGUpIHsKLSAgICBpZiAob3JkaW5hbCA+IGNodW5rTWFwQ3Vyc29yKSByZXR1cm4gQWRkcmVzcy56ZXJvKCk7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBjaGVja01hcCgpOwotICAgIEFkZHJlc3MgY2h1bmsgPSBnZXRNYXBBZGRyZXNzKG9yZGluYWwpLmxvYWRBZGRyZXNzKCk7Ci0gICAgcmV0dXJuIGNodW5rLmlzWmVybygpID8gbmV4dENodW5rKG9yZGluYWwsIG9yZGluYWwsIHN0cmlkZSkgOiBjaHVuazsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjaGVja01hcCgpIHsKLSAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQoY2h1bmtNYXBMaW1pdCA8PSBjaHVua01hcEN1cnNvcik7Ci0gICAgZm9yIChpbnQgZW50cnkgPSAwOyBlbnRyeSA8PSBjaHVua01hcEN1cnNvcjsgZW50cnkrKykgewotICAgICAgQWRkcmVzcyBjaHVuayA9IGdldE1hcEFkZHJlc3MoZW50cnkpLmxvYWRBZGRyZXNzKCk7Ci0gICAgICBpZiAoIWNodW5rLmlzWmVybygpKQotICAgICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQoQ2h1bmsuZ2V0TWFwKGNodW5rKSA9PSBlbnRyeSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgY29uc29saWRhdGVNYXAoKSB7Ci0gICAgaW50IG9sZEN1cnNvciA9IDA7Ci0gICAgaW50IG5ld0N1cnNvciA9IC0xOwotICAgIHdoaWxlIChvbGRDdXJzb3IgPD0gY2h1bmtNYXBDdXJzb3IpIHsKLSAgICAgIEFkZHJlc3MgY2h1bmsgPSBnZXRNYXBBZGRyZXNzKG9sZEN1cnNvcikubG9hZEFkZHJlc3MoKTsKLSAgICAgIGlmICghY2h1bmsuaXNaZXJvKCkpIHsKLSAgICAgICAgZ2V0TWFwQWRkcmVzcygrK25ld0N1cnNvcikuc3RvcmUoY2h1bmspOwotICAgICAgICBDaHVuay5zZXRNYXAoY2h1bmssIG5ld0N1cnNvcik7Ci0gICAgICB9Ci0gICAgICBvbGRDdXJzb3IrKzsKLSAgICB9Ci0gICAgY2h1bmtNYXBDdXJzb3IgPSBuZXdDdXJzb3I7Ci0gICAgY2h1bmtNYXBMaW1pdCA9IG5ld0N1cnNvcjsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIGNoZWNrTWFwKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L2ltbWl4L0NvbGxlY3RvckxvY2FsLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3BvbGljeS9pbW1peC9Db2xsZWN0b3JMb2NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjY1YWNjLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L2ltbWl4L0NvbGxlY3RvckxvY2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBvbGljeS5pbW1peDsKLQotaW1wb3J0IHN0YXRpYyBvcmcubW10ay5wb2xpY3kuaW1taXguSW1taXhDb25zdGFudHMuKjsKLQotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC5BZGRyZXNzOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB1bnN5bmNocm9uaXplZCAobG9jYWwpIGVsZW1lbnRzIG9mIGFuCi0gKiBpbW1peCBjb2xsZWN0b3IuICBNYXJraW5nIGlzIGRvbmUgdXNpbmcgYm90aCBhIGJpdCBpbgotICogZWFjaCBoZWFkZXIncyBvYmplY3Qgd29yZCwgYW5kIGEgbWFyayBieXRlLiAgU3dlZXBpbmcgaXMKLSAqIHBlcmZvcm1lZCBsYXppbHkuPHA+Ci0gKgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29sbGVjdG9yTG9jYWwgaW1wbGVtZW50cyBDb25zdGFudHMgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENsYXNzIHZhcmlhYmxlcwotICAgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluc3RhbmNlIHZhcmlhYmxlcwotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBJbW1peFNwYWNlIGltbWl4U3BhY2U7Ci0gIHByaXZhdGUgZmluYWwgQ2h1bmtMaXN0IGNodW5rTWFwOwotICBwcml2YXRlIGZpbmFsIERlZnJhZyBkZWZyYWc7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbml0aWFsaXphdGlvbgotICAgKi8KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIHNwYWNlIFRoZSBtYXJrLXN3ZWVwIHNwYWNlIHRvIHdoaWNoIHRoaXMgYWxsb2NhdG9yCi0gICAqIGluc3RhbmNlcyBpcyBib3VuZC4KLSAgICovCi0gIHB1YmxpYyBDb2xsZWN0b3JMb2NhbChJbW1peFNwYWNlIHNwYWNlKSB7Ci0gICAgaW1taXhTcGFjZSA9IHNwYWNlOwotICAgIGNodW5rTWFwID0gaW1taXhTcGFjZS5nZXRDaHVua01hcCgpOwotICAgIGRlZnJhZyA9IGltbWl4U3BhY2UuZ2V0RGVmcmFnKCk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDb2xsZWN0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBQcmVwYXJlIGZvciBhIGNvbGxlY3Rpb24uIElmIHBhcmFub2lkLCBwZXJmb3JtIGEgc2FuaXR5IGNoZWNrLgotICAgKi8KLSAgcHVibGljIHZvaWQgcHJlcGFyZShib29sZWFuIG1ham9yR0MpIHsKLSAgICBpbnQgb3JkaW5hbCA9IFZNLmNvbGxlY3Rpb24uYWN0aXZlR0NUaHJlYWRPcmRpbmFsKCk7Ci0gICAgaWYgKG1ham9yR0MpIHsKLSAgICAgIGlmIChpbW1peFNwYWNlLmluSW1taXhEZWZyYWdDb2xsZWN0aW9uKCkpIHsKLSAgICAgICAgc2hvcnQgdGhyZXNob2xkID0gRGVmcmFnLmRlZnJhZ1NwaWxsVGhyZXNob2xkOwotICAgICAgICByZXNldExpbmVNYXJrc0FuZERlZnJhZ1N0YXRlVGFibGUob3JkaW5hbCwgdGhyZXNob2xkKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVzZXRMaW5lTWFya3NBbmREZWZyYWdTdGF0ZVRhYmxlKGludCBvcmRpbmFsLCBmaW5hbCBzaG9ydCB0aHJlc2hvbGQpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChpbW1peFNwYWNlLmluSW1taXhEZWZyYWdDb2xsZWN0aW9uKCkpOwotICAgIGludCBzdHJpZGUgPSBWTS5jb2xsZWN0aW9uLmFjdGl2ZUdDVGhyZWFkcygpOwotICAgIEFkZHJlc3MgY2h1bmsgPSBjaHVua01hcC5maXJzdENodW5rKG9yZGluYWwsIHN0cmlkZSk7Ci0gICAgd2hpbGUgKCFjaHVuay5pc1plcm8oKSkgewotICAgICAgQ2h1bmsucmVzZXRMaW5lTWFya3NBbmREZWZyYWdTdGF0ZVRhYmxlKGNodW5rLCB0aHJlc2hvbGQpOwotICAgICAgY2h1bmsgPSBjaHVua01hcC5uZXh0Q2h1bmsoY2h1bmssIG9yZGluYWwsIHN0cmlkZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEZpbmlzaCB1cCBhZnRlciBhIGNvbGxlY3Rpb24uCi0gICAqCi0gICAqIFdlIGhlbHAgc3dlZXBpbmcgYWxsIHRoZSBibG9ja3MgaW4gcGFyYWxsZWwuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWxlYXNlKGJvb2xlYW4gbWFqb3JHQykgewotICAgIHN3ZWVwQWxsQmxvY2tzKG1ham9yR0MpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHN3ZWVwQWxsQmxvY2tzKGJvb2xlYW4gbWFqb3JHQykgewotICAgIGludCBzdHJpZGUgPSBWTS5jb2xsZWN0aW9uLmFjdGl2ZUdDVGhyZWFkcygpOwotICAgIGludCBvcmRpbmFsID0gVk0uY29sbGVjdGlvbi5hY3RpdmVHQ1RocmVhZE9yZGluYWwoKTsKLSAgICBpbnRbXSBtYXJrU3BpbGxIaXN0byA9IGRlZnJhZy5nZXRBbmRaZXJvU3BpbGxNYXJrSGlzdG9ncmFtKG9yZGluYWwpOwotICAgIEFkZHJlc3MgY2h1bmsgPSBjaHVua01hcC5maXJzdENodW5rKG9yZGluYWwsIHN0cmlkZSk7Ci0gICAgZmluYWwgYnl0ZSBtYXJrVmFsdWUgPSBpbW1peFNwYWNlLmxpbmVNYXJrU3RhdGU7Ci0gICAgZmluYWwgYm9vbGVhbiByZXNldE1hcmtzID0gbWFqb3JHQyAmJiBtYXJrVmFsdWUgPT0gTUFYX0xJTkVfTUFSS19TVEFURTsKLSAgICB3aGlsZSAoIWNodW5rLmlzWmVybygpKSB7Ci0gICAgICBDaHVuay5zd2VlcChjaHVuaywgQ2h1bmsuZ2V0SGlnaFdhdGVyKGNodW5rKSwgaW1taXhTcGFjZSwgbWFya1NwaWxsSGlzdG8sIG1hcmtWYWx1ZSwgcmVzZXRNYXJrcyk7Ci0gICAgICBjaHVuayA9IGNodW5rTWFwLm5leHRDaHVuayhjaHVuaywgb3JkaW5hbCwgc3RyaWRlKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L2ltbWl4L0RlZnJhZy5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvaW1taXgvRGVmcmFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZmViOTYuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvaW1taXgvRGVmcmFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi0KLXBhY2thZ2Ugb3JnLm1tdGsucG9saWN5LmltbWl4OwotCi1pbXBvcnQgc3RhdGljIG9yZy5tbXRrLnBvbGljeS5pbW1peC5JbW1peENvbnN0YW50cy4qOwotCi0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkNvbnN0YW50czsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkxvZzsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmhlYXAuRnJlZUxpc3RQYWdlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5vcHRpb25zLkRlZnJhZ0ZyZWVIZWFkcm9vbTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnMuRGVmcmFnRnJlZUhlYWRyb29tRnJhY3Rpb247Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5vcHRpb25zLkRlZnJhZ0hlYWRyb29tOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkub3B0aW9ucy5EZWZyYWdIZWFkcm9vbUZyYWN0aW9uOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkub3B0aW9ucy5EZWZyYWdMaW5lUmV1c2VSYXRpbzsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnMuRGVmcmFnU2ltcGxlU3BpbGxUaHJlc2hvbGQ7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5vcHRpb25zLkRlZnJhZ1N0cmVzczsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnMuT3B0aW9uczsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LnN0YXRpc3RpY3MuRXZlbnRDb3VudGVyOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuc3RhdGlzdGljcy5TaXplQ291bnRlcjsKLWltcG9ydCBvcmcubW10ay52bS5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS5VbmludGVycnVwdGlibGU7Ci0KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBjbGFzcyBEZWZyYWcgIGltcGxlbWVudHMgQ29uc3RhbnRzIHsKLQotCi0gIHByaXZhdGUgaW50IGRlZnJhZ0hlYWRyb29tUGFnZXMgPSAwOwotICBwcml2YXRlIGludCBkZWZyYWdGcmVlSGVhZHJvb21QYWdlcyA9IDA7Ci0gIHByaXZhdGUgYm9vbGVhbiBpbkRlZnJhZ0NvbGxlY3Rpb24gPSBmYWxzZTsKLSAgcHJpdmF0ZSBpbnQgZGVidWdCeXRlc0RlZnJhZ2VkID0gMDsKLSAgcHJpdmF0ZSBpbnQgYXZhaWxhYmxlQ2xlYW5QYWdlc0ZvckRlZnJhZzsKLSAgcHJpdmF0ZSBib29sZWFuIGRlZnJhZ1NwYWNlRXhoYXVzdGVkID0gdHJ1ZTsKLSAgcHJpdmF0ZSBpbnRbXVtdIHNwaWxsTWFya0hpc3RvZ3JhbXMgPSBuZXcgaW50W01BWF9DT0xMRUNUT1JTXVtTUElMTF9ISVNUT0dSQU1fQlVDS0VUU107Ci0gIHByaXZhdGUgaW50W10gc3BpbGxBdmFpbEhpc3RvZ3JhbSA9IG5ldyBpbnRbU1BJTExfSElTVE9HUkFNX0JVQ0tFVFNdOwotICBwdWJsaWMgc3RhdGljIFNpemVDb3VudGVyIGRlZnJhZ0NsZWFuQnl0ZXNVc2VkID0gbmV3IFNpemVDb3VudGVyKCJjbGVhblVzZWQiKTsKLSAgLyogdmVyYm9zZSBzdGF0cyAodXNlZCBvbmx5IG9uIHN0YXRzIHJ1bnMgc2luY2UgdGhleSBpbmR1Y2Ugb3ZlcmhlYWQgd2hlbiBnYXRocmVkKSAqLwotICBwdWJsaWMgc3RhdGljIFNpemVDb3VudGVyIGRlZnJhZ0J5dGVzTm90RnJlZWQgPSBuZXcgU2l6ZUNvdW50ZXIoImJ5dGVzTm90RnJlZWQiKTsKLSAgcHVibGljIHN0YXRpYyBTaXplQ291bnRlciBkZWZyYWdCeXRlc0ZyZWVkID0gbmV3IFNpemVDb3VudGVyKCJieXRlc0ZyZWVkIik7Ci0gIHB1YmxpYyBzdGF0aWMgU2l6ZUNvdW50ZXIgZGVmcmFnQ2xlYW5CeXRlc0F2YWlsYWJsZSA9IG5ldyBTaXplQ291bnRlcigiY2xlYW5BdmFpbCIpOwotCi0gIHByaXZhdGUgZmluYWwgRnJlZUxpc3RQYWdlUmVzb3VyY2UgcHI7Ci0gIHByaXZhdGUgYm9vbGVhbiBkZWJ1Z0NvbGxlY3Rpb25UeXBlRGV0ZXJtaW5lZCA9IGZhbHNlOwotICBzdGF0aWMgc2hvcnQgZGVmcmFnU3BpbGxUaHJlc2hvbGQgPSAwOwotICBzdGF0aWMgc2hvcnQgZGVmcmFnUmV1c2FibGVNYXJrU3RhdGVUaHJlc2hvbGQgPSAwOwotICBwdWJsaWMgc3RhdGljIEV2ZW50Q291bnRlciBkZWZyYWdzID0gbmV3IEV2ZW50Q291bnRlcigiZGVmcmFncyIpOwotCi0gIHN0YXRpYyB7Ci0gICAgT3B0aW9ucy5kZWZyYWdMaW5lUmV1c2VSYXRpbyA9IG5ldyBEZWZyYWdMaW5lUmV1c2VSYXRpbygpOwotICAgIE9wdGlvbnMuZGVmcmFnSGVhZHJvb20gPSBuZXcgRGVmcmFnSGVhZHJvb20oKTsKLSAgICBPcHRpb25zLmRlZnJhZ0hlYWRyb29tRnJhY3Rpb24gPSBuZXcgRGVmcmFnSGVhZHJvb21GcmFjdGlvbigpOwotICAgIE9wdGlvbnMuZGVmcmFnRnJlZUhlYWRyb29tID0gbmV3IERlZnJhZ0ZyZWVIZWFkcm9vbSgpOwotICAgIE9wdGlvbnMuZGVmcmFnRnJlZUhlYWRyb29tRnJhY3Rpb24gPSBuZXcgRGVmcmFnRnJlZUhlYWRyb29tRnJhY3Rpb24oKTsKLSAgICBPcHRpb25zLmRlZnJhZ1NpbXBsZVNwaWxsVGhyZXNob2xkID0gbmV3IERlZnJhZ1NpbXBsZVNwaWxsVGhyZXNob2xkKCk7Ci0gICAgT3B0aW9ucy5kZWZyYWdTdHJlc3MgPSBuZXcgRGVmcmFnU3RyZXNzKCk7Ci0gICAgZGVmcmFnUmV1c2FibGVNYXJrU3RhdGVUaHJlc2hvbGQgPSAoc2hvcnQpIChPcHRpb25zLmRlZnJhZ0xpbmVSZXVzZVJhdGlvLmdldFZhbHVlKCkgKiBNQVhfQkxPQ0tfTUFSS19TVEFURSk7Ci0gIH0KLQotICBEZWZyYWcoRnJlZUxpc3RQYWdlUmVzb3VyY2UgcHIpIHsKLSAgICB0aGlzLnByID0gcHI7Ci0gIH0KLQotICBib29sZWFuIGluRGVmcmFnKCkgeyByZXR1cm4gaW5EZWZyYWdDb2xsZWN0aW9uOyB9Ci0KLSAgdm9pZCBwcmVwYXJlKENodW5rTGlzdCBjaHVua01hcCwgSW1taXhTcGFjZSBzcGFjZSkgewotICAgIGlmIChkZWZyYWdIZWFkcm9vbVBhZ2VzID4gMCkKLSAgICAgIHByLnVuY29uZGl0aW9uYWxseVJlbGVhc2VQYWdlcyhkZWZyYWdIZWFkcm9vbVBhZ2VzKTsKLQotICAgIGF2YWlsYWJsZUNsZWFuUGFnZXNGb3JEZWZyYWcgPSBWTS5hY3RpdmVQbGFuLmdsb2JhbCgpLmdldFRvdGFsUGFnZXMoKSAtIFZNLmFjdGl2ZVBsYW4uZ2xvYmFsKCkuZ2V0UGFnZXNSZXNlcnZlZCgpOwotICAgIGlmIChhdmFpbGFibGVDbGVhblBhZ2VzRm9yRGVmcmFnIDwgMCkgYXZhaWxhYmxlQ2xlYW5QYWdlc0ZvckRlZnJhZyA9IDA7Ci0gICAgZGVmcmFnU3BhY2VFeGhhdXN0ZWQgPSBmYWxzZTsKLSAgICBhdmFpbGFibGVDbGVhblBhZ2VzRm9yRGVmcmFnICs9IGRlZnJhZ0ZyZWVIZWFkcm9vbVBhZ2VzOwotICAgIGlmIChpbkRlZnJhZ0NvbGxlY3Rpb24pIHsKLSAgICAgIGlmIChPcHRpb25zLnZlcmJvc2UuZ2V0VmFsdWUoKSA+IDApIHsKLSAgICAgICAgTG9nLndyaXRlKCJbRGVmcmFnXSIpOwotICAgICAgfQotICAgICAgY2h1bmtNYXAuY29uc29saWRhdGVNYXAoKTsKLSAgICAgIGVzdGFibGlzaERlZnJhZ1NwaWxsVGhyZXNob2xkKGNodW5rTWFwLCBzcGFjZSk7Ci0gICAgICBkZWZyYWdzLmluYygpOwotICAgICAgZGVmcmFnQ2xlYW5CeXRlc0F2YWlsYWJsZS5pbmMoYXZhaWxhYmxlQ2xlYW5QYWdlc0ZvckRlZnJhZzw8TE9HX0JZVEVTX0lOX1BBR0UpOwotICAgIH0KLSAgICBhdmFpbGFibGVDbGVhblBhZ2VzRm9yRGVmcmFnICs9IFZNLmFjdGl2ZVBsYW4uZ2xvYmFsKCkuZ2V0Q29sbGVjdGlvblJlc2VydmUoKTsKLSAgfQotCi0gIHZvaWQgZ2xvYmFsUmVsZWFzZSgpIHsKLSAgICBpZiAoT3B0aW9ucy5kZWZyYWdIZWFkcm9vbS5nZXRQYWdlcygpID4gMCkKLSAgICAgIGRlZnJhZ0hlYWRyb29tUGFnZXMgPSBPcHRpb25zLmRlZnJhZ0hlYWRyb29tLmdldFBhZ2VzKCk7Ci0gICAgZWxzZSBpZiAoT3B0aW9ucy5kZWZyYWdIZWFkcm9vbUZyYWN0aW9uLmdldFZhbHVlKCkgPiAwKQotICAgICAgZGVmcmFnSGVhZHJvb21QYWdlcyA9IChpbnQpIChwci5yZXNlcnZlZFBhZ2VzKCkgKiBPcHRpb25zLmRlZnJhZ0hlYWRyb29tRnJhY3Rpb24uZ2V0VmFsdWUoKSk7Ci0gICAgZWxzZQotICAgICAgZGVmcmFnSGVhZHJvb21QYWdlcyA9IDA7Ci0gICAgaWYgKE9wdGlvbnMuZGVmcmFnRnJlZUhlYWRyb29tLmdldFBhZ2VzKCkgPiAwKQotICAgICAgZGVmcmFnRnJlZUhlYWRyb29tUGFnZXMgPSBPcHRpb25zLmRlZnJhZ0ZyZWVIZWFkcm9vbS5nZXRQYWdlcygpOwotICAgIGVsc2UgaWYgKE9wdGlvbnMuZGVmcmFnRnJlZUhlYWRyb29tRnJhY3Rpb24uZ2V0VmFsdWUoKSA+IDApCi0gICAgICBkZWZyYWdGcmVlSGVhZHJvb21QYWdlcyA9IChpbnQpIChwci5yZXNlcnZlZFBhZ2VzKCkgKiBPcHRpb25zLmRlZnJhZ0ZyZWVIZWFkcm9vbUZyYWN0aW9uLmdldFZhbHVlKCkpOwotICAgIGVsc2UKLSAgICAgIGRlZnJhZ0ZyZWVIZWFkcm9vbVBhZ2VzID0gMDsKLQotICAgIGlmIChkZWZyYWdIZWFkcm9vbVBhZ2VzID4gMCkKLSAgICAgIHByLnVuY29uZGl0aW9uYWxseVJlc2VydmVQYWdlcyhkZWZyYWdIZWFkcm9vbVBhZ2VzKTsKLQotICAgIGlmIChpbkRlZnJhZ0NvbGxlY3Rpb24gJiYgT3B0aW9ucy52ZXJib3NlLmdldFZhbHVlKCkgPiAyKSB7Ci0gICAgICBMb2cud3JpdGUoIihEZWZyYWcgc3VtbWFyeTogY3U6ICIpOyBkZWZyYWdDbGVhbkJ5dGVzVXNlZC5wcmludEN1cnJlbnRWb2x1bWUoKTsKLSAgICAgIExvZy53cml0ZSgiIG5mOiAiKTsgZGVmcmFnQnl0ZXNOb3RGcmVlZC5wcmludEN1cnJlbnRWb2x1bWUoKTsKLSAgICAgIExvZy53cml0ZSgiIGZyOiAiKTsgZGVmcmFnQnl0ZXNGcmVlZC5wcmludEN1cnJlbnRWb2x1bWUoKTsKLSAgICAgIExvZy53cml0ZSgiIGF2OiAiKTsgZGVmcmFnQ2xlYW5CeXRlc0F2YWlsYWJsZS5wcmludEN1cnJlbnRWb2x1bWUoKTsKLSAgICAgIExvZy53cml0ZSgiKSIpOwotICAgIH0KLQotICAgIGluRGVmcmFnQ29sbGVjdGlvbiA9IGZhbHNlOwotICAgIGRlYnVnQ29sbGVjdGlvblR5cGVEZXRlcm1pbmVkID0gZmFsc2U7Ci0gIH0KLQotICB2b2lkIGRlY2lkZVdoZXRoZXJUb0RlZnJhZyhib29sZWFuIGVtZXJnZW5jeUNvbGxlY3Rpb24sIGJvb2xlYW4gY29sbGVjdFdob2xlSGVhcCwgaW50IGNvbGxlY3Rpb25BdHRlbXB0LCBpbnQgY29sbGVjdGlvblRyaWdnZXIsIGJvb2xlYW4gZXhoYXVzdGVkUmV1c2FibGVTcGFjZSkgewotICAgIGJvb2xlYW4gdXNlclRyaWdnZXJlZCA9IGNvbGxlY3Rpb25UcmlnZ2VyID09IENvbGxlY3Rpb24uRVhURVJOQUxfR0NfVFJJR0dFUiAmJiBPcHRpb25zLmZ1bGxIZWFwU3lzdGVtR0MuZ2V0VmFsdWUoKTsKLSAgICBpbkRlZnJhZ0NvbGxlY3Rpb24gPSAgKGNvbGxlY3Rpb25BdHRlbXB0ID4gMSkgfHwKLSAgICAgICAgZW1lcmdlbmN5Q29sbGVjdGlvbiB8fAotICAgICAgICBjb2xsZWN0V2hvbGVIZWFwICYmIChPcHRpb25zLmRlZnJhZ1N0cmVzcy5nZXRWYWx1ZSgpIHx8IHVzZXJUcmlnZ2VyZWQpOwotICAgIGlmIChpbkRlZnJhZ0NvbGxlY3Rpb24pIHsKLSAgICAgIGRlYnVnQnl0ZXNEZWZyYWdlZCA9IDA7Ci0gICAgfQotICAgIGRlYnVnQ29sbGVjdGlvblR5cGVEZXRlcm1pbmVkID0gdHJ1ZTsKLSAgfQotCi0gIGJvb2xlYW4gZGV0ZXJtaW5lZChib29sZWFuIGluRGVmcmFnKSB7IHJldHVybiBkZWJ1Z0NvbGxlY3Rpb25UeXBlRGV0ZXJtaW5lZCAmJiAhKGluRGVmcmFnIF4gaW5EZWZyYWdDb2xsZWN0aW9uKTsgfQotCi0gIHZvaWQgZ2V0QmxvY2soKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoIWluRGVmcmFnQ29sbGVjdGlvbiB8fCAhZGVmcmFnU3BhY2VFeGhhdXN0ZWQpOwotICAgIGlmIChhdmFpbGFibGVDbGVhblBhZ2VzRm9yRGVmcmFnIDw9IDApCi0gICAgICBkZWZyYWdTcGFjZUV4aGF1c3RlZCA9IHRydWU7Ci0gICAgYXZhaWxhYmxlQ2xlYW5QYWdlc0ZvckRlZnJhZyAtPSBQQUdFU19JTl9CTE9DSzsKLSAgICBkZWJ1Z0J5dGVzRGVmcmFnZWQgKz0gQllURVNfSU5fQkxPQ0s7Ci0gICAgRGVmcmFnLmRlZnJhZ0NsZWFuQnl0ZXNVc2VkLmluYyhCWVRFU19JTl9CTE9DSyk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZXN0YWJsaXNoRGVmcmFnU3BpbGxUaHJlc2hvbGQoQ2h1bmtMaXN0IGNodW5rTWFwLCBJbW1peFNwYWNlIHNwYWNlKSB7Ci0gICAgaW50IGNsZWFuTGluZXMgPSBzcGFjZS5nZXRBdmFpbGFibGVMaW5lcyhzcGlsbEF2YWlsSGlzdG9ncmFtKTsKLSAgICBpbnQgYXZhaWxhYmxlTGluZXMgPSBjbGVhbkxpbmVzICsgYXZhaWxhYmxlQ2xlYW5QYWdlc0ZvckRlZnJhZzw8KExPR19CWVRFU19JTl9QQUdFIC0gTE9HX0JZVEVTX0lOX0xJTkUpOwotCi0gICAgaW50IHJlcXVpcmVkTGluZXMgPSAwOwotICAgIHNob3J0IHRocmVzaG9sZCA9IChzaG9ydCkgTUFYX0NPTlNWX1NQSUxMX0NPVU5UOwotICAgIGludCBsaW1pdCA9IChpbnQpIChhdmFpbGFibGVMaW5lcyAvIE9wdGlvbnMuZGVmcmFnTGluZVJldXNlUmF0aW8uZ2V0VmFsdWUoKSk7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TICYmIE9wdGlvbnMudmVyYm9zZS5nZXRWYWx1ZSgpID4gMikgewotICAgICAgTG9nLndyaXRlKCJbdGhyZXNob2xkOiAiKTsgTG9nLndyaXRlKCJjbDogIik7IExvZy53cml0ZShjbGVhbkxpbmVzKTsKLSAgICAgIExvZy53cml0ZSgiIGFsOiAiKTsgTG9nLndyaXRlKGF2YWlsYWJsZUxpbmVzKTsKLSAgICAgIExvZy53cml0ZSgiIGxtOiAiKTsgTG9nLndyaXRlKGxpbWl0KTsKLSAgICB9Ci0gICAgaW50IGNvbGxlY3RvcnMgPSBWTS5hY3RpdmVQbGFuLmNvbGxlY3RvckNvdW50KCk7Ci0gICAgZm9yIChzaG9ydCBpbmRleCA9IE1BWF9DT05TVl9TUElMTF9DT1VOVDsgaW5kZXggPj0gVE1QX01JTl9TUElMTF9USFJFU0hPTEQgJiYgbGltaXQgPiByZXF1aXJlZExpbmVzOyBpbmRleC0tKSB7Ci0gICAgICB0aHJlc2hvbGQgPSAoc2hvcnQpIGluZGV4OwotICAgICAgaW50IHRoaXNCdWNrZXRNYXJrID0gMDsKLSAgICAgIGludCB0aGlzQnVja2V0QXZhaWwgPSAwOwotICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBjb2xsZWN0b3JzOyBjKyspIHRoaXNCdWNrZXRNYXJrICs9IHNwaWxsTWFya0hpc3RvZ3JhbXNbY11bdGhyZXNob2xkXTsKLQotICAgICAgdGhpc0J1Y2tldEF2YWlsID0gc3BpbGxBdmFpbEhpc3RvZ3JhbVt0aHJlc2hvbGRdOwotICAgICAgbGltaXQgLT0gdGhpc0J1Y2tldEF2YWlsOwotICAgICAgcmVxdWlyZWRMaW5lcyArPSB0aGlzQnVja2V0TWFyazsKLSAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUyAmJiBPcHRpb25zLnZlcmJvc2UuZ2V0VmFsdWUoKSA+IDIpIHsKLSAgICAgICAgTG9nLndyaXRlKCIgKCIpOyBMb2cud3JpdGUoaW5kZXgpOyBMb2cud3JpdGUoIiAiKTsgTG9nLndyaXRlKGxpbWl0KTsgTG9nLndyaXRlKCIsIik7IExvZy53cml0ZShyZXF1aXJlZExpbmVzKTsgTG9nLndyaXRlKCIpIik7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUyAmJiBPcHRpb25zLnZlcmJvc2UuZ2V0VmFsdWUoKSA+IDIpIHsKLSAgICAgIExvZy53cml0ZSgiIHRocmVzaG9sZDogIik7IExvZy53cml0ZSh0aHJlc2hvbGQpOyBMb2cud3JpdGUoIl0iKTsKLSAgICB9Ci0gICAgZGVmcmFnU3BpbGxUaHJlc2hvbGQgPSB0aHJlc2hvbGQ7Ci0gIH0KLQotCi0gIGJvb2xlYW4gc3BhY2VFeGhhdXN0ZWQoKSB7IHJldHVybiBkZWZyYWdTcGFjZUV4aGF1c3RlZDsgfQotCi0gIGludFtdIGdldEFuZFplcm9TcGlsbE1hcmtIaXN0b2dyYW0oaW50IG9yZGluYWwpIHsKLSAgICBpbnRbXSBydG4gPSBzcGlsbE1hcmtIaXN0b2dyYW1zW29yZGluYWxdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU1BJTExfSElTVE9HUkFNX0JVQ0tFVFM7IGkrKykKLSAgICAgIHJ0bltpXSA9IDA7Ci0gICAgcmV0dXJuIHJ0bjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvaW1taXgvSW1taXhDb25zdGFudHMuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L2ltbWl4L0ltbWl4Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYmMwNzcuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvaW1taXgvSW1taXhDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay5wb2xpY3kuaW1taXg7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLm1tdGsucG9saWN5LlNwYWNlLkJZVEVTX0lOX0NIVU5LOwotaW1wb3J0IHN0YXRpYyBvcmcubW10ay5wb2xpY3kuU3BhY2UuTE9HX0JZVEVTX0lOX0NIVU5LOwotaW1wb3J0IHN0YXRpYyBvcmcubW10ay51dGlsaXR5LkNvbnN0YW50cy5MT0dfQllURVNfSU5fUEFHRTsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uUGxhbjsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLldvcmQ7Ci0KLXB1YmxpYyBjbGFzcyBJbW1peENvbnN0YW50cyB7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBCVUlMRF9GT1JfU1RJQ0tZSU1NSVggPSBQbGFuLk5FRURTX0xPR19CSVRfSU5fSEVBREVSOwotCi0gIC8qIHN0YXJ0IHRlbXBvcmFyeSBleHBlcmltZW50YWwgY29uc3RhbnRzIC0tLSBzaG91bGQgbm90IGJlIGFsbG93ZWQgdG8gbHVyayBsb25nZXIgdGhhbiBuZWNlc3NhcnkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE1QX01JTl9TUElMTF9USFJFU0hPTEQgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gVE1QX1BSRUZFUl9DT1BZX09OX05VUlNFUllfR0MgPSB0cnVlOwotICAvKiBlbmQgdGVtcG9yYXJ5IGV4cGVyaW1lbnRhbCBjb25zdGFudHMgKi8KLQotICBzdGF0aWMgZmluYWwgYnl0ZSBNQVhfTElORV9NQVJLX1NUQVRFID0gMTI3OwotICBzdGF0aWMgZmluYWwgYnl0ZSBSRVNFVF9MSU5FX01BUktfU1RBVEUgPSAxOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBNQVJLX0xJTkVfQVRfU0NBTl9USU1FID0gdHJ1ZTsgLy8gZWxzZSBkbyBpdCBhdCBtYXJrIHRpbWUKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gU0FOSVRZX0NIRUNLX0xJTkVfTUFSS1MgPSBmYWxzZSAmJiBWTS5WRVJJRllfQVNTRVJUSU9OUzsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IERFRkFVTFRfTElORV9SRVVTRV9SQVRJTyA9IChmbG9hdCkgMC45OTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBERUZBVUxUX0RFRlJBR19MSU5FX1JFVVNFX1JBVElPID0gKGZsb2F0KSAwLjk5OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IERFRkFVTFRfU0lNUExFX1NQSUxMX1RIUkVTSE9MRCA9IChmbG9hdCkgMC4yNTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9ERUZSQUdfSEVBRFJPT00gPSAwOyAvLyBudW1iZXIgb2YgcGFnZXMuCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9ERUZSQUdfSEVBRFJPT01fRlJBQ1RJT04gPSAoZmxvYXQpIDAuMDIwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0RFRlJBR19GUkVFX0hFQURST09NID0gMDsgLy8gbnVtYmVyIG9mIHBhZ2VzLiAgVGhpcyBzaG91bGQgb25seSBkZXZpYXRlIGZyb20gemVybyBmb3IgYW5hbHl0aWNhbCBwdXJwb3Nlcy4gIE90aGVyd2lzZSB0aGUgZGVmcmFnbWVudGVyIGlzIGNoZWF0aW5nIQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IERFRkFVTFRfREVGUkFHX0ZSRUVfSEVBRFJPT01fRlJBQ1RJT04gPSAoZmxvYXQpIDAuMDsKLSAgLyogc2l6ZXMgZXRjICovCi0gIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0JZVEVTX0lOX0JMT0NLID0gKExPR19CWVRFU19JTl9QQUdFID4gMTUgPyBMT0dfQllURVNfSU5fUEFHRSA6IDE1KTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQllURVNfSU5fQkxPQ0sgPSAxPDxMT0dfQllURVNfSU5fQkxPQ0s7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgTE9HX1BBR0VTX0lOX0JMT0NLID0gTE9HX0JZVEVTX0lOX0JMT0NLIC0gTE9HX0JZVEVTX0lOX1BBR0U7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgUEFHRVNfSU5fQkxPQ0sgPSAxPDxMT0dfUEFHRVNfSU5fQkxPQ0s7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0JMT0NLU19JTl9DSFVOSyA9IExPR19CWVRFU19JTl9DSFVOSy1MT0dfQllURVNfSU5fQkxPQ0s7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgQkxPQ0tTX0lOX0NIVU5LID0gMTw8TE9HX0JMT0NLU19JTl9DSFVOSzsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0dfQllURVNfSU5fTElORSA9IDg7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0xJTkVTX0lOX0JMT0NLID0gTE9HX0JZVEVTX0lOX0JMT0NLIC0gTE9HX0JZVEVTX0lOX0xJTkU7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgTElORVNfSU5fQkxPQ0sgPSAoc2hvcnQpICgxPDxMT0dfTElORVNfSU5fQkxPQ0spOwotICBzdGF0aWMgZmluYWwgaW50IExPR19MSU5FU19JTl9DSFVOSyA9IExPR19CWVRFU19JTl9DSFVOSyAtIExPR19CWVRFU19JTl9MSU5FOwotICBzdGF0aWMgZmluYWwgaW50IExJTkVTX0lOX0NIVU5LID0gMTw8TE9HX0xJTkVTX0lOX0NIVU5LOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJZVEVTX0lOX0xJTkUgPSAxPDxMT0dfQllURVNfSU5fTElORTsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfSU1NSVhfT0JKRUNUX0JZVEVTID0gQllURVNfSU5fQkxPQ0s+PjE7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPR19CTE9DS1NfSU5fUkVDWUNMRV9BTExPQ19DSFVOSyA9IDQ7IC8vIDMgKyAxNSAtPiAxOSAoNTEyS0IpCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0dfQllURVNfSU5fUkVDWUNMRV9BTExPQ19DSFVOSyA9IExPR19CTE9DS1NfSU5fUkVDWUNMRV9BTExPQ19DSFVOSyArIExPR19CWVRFU19JTl9CTE9DSzsKLSAgc3RhdGljIGZpbmFsIGludCBCWVRFU19JTl9SRUNZQ0xFX0FMTE9DX0NIVU5LID0gMTw8TE9HX0JZVEVTX0lOX1JFQ1lDTEVfQUxMT0NfQ0hVTks7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBNQVhfQkxPQ0tfTUFSS19TVEFURSA9IExJTkVTX0lOX0JMT0NLOwotICAgICAgICAgc3RhdGljIGZpbmFsIHNob3J0IE1BWF9DT05TVl9TUElMTF9DT1VOVCA9IChzaG9ydCkgKExJTkVTX0lOX0JMT0NLLzIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IFNQSUxMX0hJU1RPR1JBTV9CVUNLRVRTID0gKHNob3J0KSAoTUFYX0NPTlNWX1NQSUxMX0NPVU5UICsgMSk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgTUFSS19ISVNUT0dSQU1fQlVDS0VUUyA9IChzaG9ydCkgKExJTkVTX0lOX0JMT0NLICsgMSk7Ci0gICAgICAgICBzdGF0aWMgZmluYWwgc2hvcnQgTUFYX0NPTExFQ1RPUlMgPSAxNjsgLy8gbm90aGluZyBzcGVjaWFsIGhlcmUtLS13ZSBjYW4gaW5jcmVhc2UgdGhpcyBhdCB0aGUgY29zdCBvZiBhIGZldyBodW5kcmVkIGJpdGVzIGF0IGJ1aWxkIHRpbWUuCi0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBXb3JkIFJFQ1lDTEVfQUxMT0NfQ0hVTktfTUFTSyA9IFdvcmQuZnJvbUludFplcm9FeHRlbmQoQllURVNfSU5fUkVDWUNMRV9BTExPQ19DSFVOSyAtIDEpOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFdvcmQgQ0hVTktfTUFTSyA9IFdvcmQuZnJvbUludFplcm9FeHRlbmQoQllURVNfSU5fQ0hVTksgLSAxKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBXb3JkIEJMT0NLX01BU0sgPSBXb3JkLmZyb21JbnRaZXJvRXh0ZW5kKEJZVEVTX0lOX0JMT0NLIC0gMSk7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgV29yZCBMSU5FX01BU0sgPSBXb3JkLmZyb21JbnRaZXJvRXh0ZW5kKEJZVEVTX0lOX0xJTkUgLSAxKTsKLQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvaW1taXgvSW1taXhTcGFjZS5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvaW1taXgvSW1taXhTcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzYzMDY0Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L2ltbWl4L0ltbWl4U3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2MCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucG9saWN5LmltbWl4OwotCi1pbXBvcnQgc3RhdGljIG9yZy5tbXRrLnBvbGljeS5pbW1peC5JbW1peENvbnN0YW50cy4qOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5QbGFuOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhbnNpdGl2ZUNsb3N1cmU7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LlNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuaGVhcC4qOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkub3B0aW9ucy5MaW5lUmV1c2VSYXRpbzsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnMuT3B0aW9uczsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkNvbnN0YW50czsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkZvcndhcmRpbmdXb3JkOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuSGVhZGVyQnl0ZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkxvZzsKLQotaW1wb3J0IG9yZy5tbXRrLnZtLkxvY2s7Ci1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogRWFjaCBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGNvcnJlc3BvbmRzIHRvIG9uZSBpbW1peCAqc3BhY2UqLgotICogRWFjaCBvZiB0aGUgaW5zdGFuY2UgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIG1heSBiZSBjYWxsZWQgYnkgYW55Ci0gKiB0aHJlYWQgKGkuZS4gc3luY2hyb25pemF0aW9uIG11c3QgYmUgZXhwbGljaXQgaW4gYW55IGluc3RhbmNlIG9yCi0gKiBjbGFzcyBtZXRob2QpLiAgVGhpcyBjb250cmFzdHMgd2l0aCB0aGUgU3F1aXNoTG9jYWwsIHdoZXJlCi0gKiBpbnN0YW5jZXMgY29ycmVzcG9uZCB0byAqcGxhbiogaW5zdGFuY2VzIGFuZCB0aGVyZWZvcmUgdG8ga2VybmVsCi0gKiB0aHJlYWRzLiAgVGh1cyB1bmxpa2UgdGhpcyBjbGFzcywgc3luY2hyb25pemF0aW9uIGlzIG5vdCBuZWNlc3NhcnkKLSAqIGluIHRoZSBpbnN0YW5jZSBtZXRob2RzIG9mIFNxdWlzaExvY2FsLgotICoKLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGZpbmFsIGNsYXNzIEltbWl4U3BhY2UgZXh0ZW5kcyBTcGFjZSBpbXBsZW1lbnRzIENvbnN0YW50cyB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQ2xhc3MgdmFyaWFibGVzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBzaG9ydCByZXVzYWJsZU1hcmtTdGF0ZVRocmVzaG9sZCA9IDA7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5zdGFuY2UgdmFyaWFibGVzCi0gICAqLwotICBwcml2YXRlIGJ5dGUgbWFya1N0YXRlID0gT2JqZWN0SGVhZGVyLk1BUktfQkFTRV9WQUxVRTsKLSAgICAgICAgICBieXRlIGxpbmVNYXJrU3RhdGUgPSBSRVNFVF9MSU5FX01BUktfU1RBVEU7Ci0gIHByaXZhdGUgYnl0ZSBsaW5lVW5hdmFpbFN0YXRlID0gUkVTRVRfTElORV9NQVJLX1NUQVRFOwotICBwcml2YXRlIGJvb2xlYW4gaW5Db2xsZWN0aW9uOwotICBwcml2YXRlIGludCBsaW5lc0NvbnN1bWVkID0gMDsKLQotICBwcml2YXRlIExvY2sgbXV0YXRvckxvY2sgPSBWTS5uZXdMb2NrKGdldE5hbWUoKSsibXV0YXRvciIpOwotICBwcml2YXRlIExvY2sgZ2NMb2NrID0gVk0ubmV3TG9jayhnZXROYW1lKCkrImdjIik7Ci0KLSAgcHJpdmF0ZSBBZGRyZXNzIGFsbG9jQmxvY2tDdXJzb3IgPSBBZGRyZXNzLnplcm8oKTsKLSAgcHJpdmF0ZSBBZGRyZXNzIGFsbG9jQmxvY2tTZW50aW5lbCA9IEFkZHJlc3MuemVybygpOwotICBwcml2YXRlIGJvb2xlYW4gZXhoYXVzdGVkUmV1c2FibGVTcGFjZSA9IHRydWU7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBDaHVua0xpc3QgY2h1bmtNYXAgPSBuZXcgQ2h1bmtMaXN0KCk7Ci0gIHByaXZhdGUgZmluYWwgRGVmcmFnIGRlZnJhZzsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbml0aWFsaXphdGlvbgotICAgKi8KLQotICBzdGF0aWMgewotICAgIE9wdGlvbnMubGluZVJldXNlUmF0aW8gPSBuZXcgTGluZVJldXNlUmF0aW8oKTsKLSAgICByZXVzYWJsZU1hcmtTdGF0ZVRocmVzaG9sZCA9IChzaG9ydCkgKE9wdGlvbnMubGluZVJldXNlUmF0aW8uZ2V0VmFsdWUoKSAqIE1BWF9CTE9DS19NQVJLX1NUQVRFKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgY2FsbGVyIHNwZWNpZmllcyB0aGUgcmVnaW9uIG9mIHZpcnR1YWwgbWVtb3J5IHRvIGJlIHVzZWQgZm9yCi0gICAqIHRoaXMgc3BhY2UuICBJZiB0aGlzIHJlZ2lvbiBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyBzcGFjZSwKLSAgICogdGhlbiB0aGUgY29uc3RydWN0b3Igd2lsbCBmYWlsLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGlzIHNwYWNlICh1c2VkIHdoZW4gcHJpbnRpbmcgZXJyb3IgbWVzc2FnZXMgZXRjKQotICAgKiBAcGFyYW0gcGFnZUJ1ZGdldCBUaGUgbnVtYmVyIG9mIHBhZ2VzIHRoaXMgc3BhY2UgbWF5IGNvbnN1bWUgYmVmb3JlIGNvbnN1bHRpbmcgdGhlIHBsYW4KLSAgICogQHBhcmFtIHZtUmVxdWVzdCBUaGUgdmlydHVhbCBtZW1vcnkgcmVxdWVzdAotICAgKi8KLSAgcHVibGljIEltbWl4U3BhY2UoU3RyaW5nIG5hbWUsIGludCBwYWdlQnVkZ2V0LCBWTVJlcXVlc3Qgdm1SZXF1ZXN0KSB7Ci0gICAgc3VwZXIobmFtZSwgZmFsc2UsIGZhbHNlLCB2bVJlcXVlc3QpOwotICAgIGlmICh2bVJlcXVlc3QuaXNEaXNjb250aWd1b3VzKCkpCi0gICAgICBwciA9IG5ldyBGcmVlTGlzdFBhZ2VSZXNvdXJjZShwYWdlQnVkZ2V0LCB0aGlzLCBDaHVuay5nZXRSZXF1aXJlZE1ldGFEYXRhUGFnZXMoKSk7Ci0gICAgZWxzZQotICAgICAgcHIgPSBuZXcgRnJlZUxpc3RQYWdlUmVzb3VyY2UocGFnZUJ1ZGdldCwgdGhpcywgc3RhcnQsIGV4dGVudCwgQ2h1bmsuZ2V0UmVxdWlyZWRNZXRhRGF0YVBhZ2VzKCkpOwotICAgIGRlZnJhZyA9IG5ldyBEZWZyYWcoKEZyZWVMaXN0UGFnZVJlc291cmNlKSBwcik7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBHbG9iYWwgcHJlcGFyZSBhbmQgcmVsZWFzZQotICAgKi8KLQotICAvKioKLSAgICogUHJlcGFyZSBmb3IgYSBuZXcgY29sbGVjdGlvbiBpbmNyZW1lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBwcmVwYXJlKGJvb2xlYW4gbWFqb3JHQykgewotICAgIGlmIChtYWpvckdDKSB7Ci0gICAgICBtYXJrU3RhdGUgPSBPYmplY3RIZWFkZXIuZGVsdGFNYXJrU3RhdGUobWFya1N0YXRlLCB0cnVlKTsKLSAgICAgICAgbGluZU1hcmtTdGF0ZSsrOwotICAgICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChsaW5lTWFya1N0YXRlIDw9IE1BWF9MSU5FX01BUktfU1RBVEUpOwotICAgIH0KLSAgICBjaHVua01hcC5yZXNldCgpOwotICAgIGRlZnJhZy5wcmVwYXJlKGNodW5rTWFwLCB0aGlzKTsKLSAgICBpbkNvbGxlY3Rpb24gPSB0cnVlOwotCi0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoVk0uYWN0aXZlUGxhbi5jb2xsZWN0b3JDb3VudCgpIDw9IE1BWF9DT0xMRUNUT1JTKTsKLSAgfQotCi0gIC8qKgotICAgKiBBIG5ldyBjb2xsZWN0aW9uIGluY3JlbWVudCBoYXMgY29tcGxldGVkLiAgUmVsZWFzZSBnbG9iYWwgcmVzb3VyY2VzLgotICAgKiBAcGFyYW0gbWFqb3JHQyBUT0RPCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiByZWxlYXNlKGJvb2xlYW4gbWFqb3JHQykgewotICAgIGJvb2xlYW4gZGlkRGVmcmFnID0gZGVmcmFnLmluRGVmcmFnKCk7Ci0gICAgaWYgKG1ham9yR0MpIHsKLSAgICAgIGlmIChsaW5lTWFya1N0YXRlID09IE1BWF9MSU5FX01BUktfU1RBVEUpCi0gICAgICAgIGxpbmVNYXJrU3RhdGUgPSBSRVNFVF9MSU5FX01BUktfU1RBVEU7Ci0gICAgIGxpbmVVbmF2YWlsU3RhdGUgPSBsaW5lTWFya1N0YXRlOwotICAgIH0KLSAgICBjaHVua01hcC5yZXNldCgpOwotICAgIGRlZnJhZy5nbG9iYWxSZWxlYXNlKCk7Ci0gICAgaW5Db2xsZWN0aW9uID0gZmFsc2U7Ci0KLSAgICAvKiBzZXQgdXAgcmV1c2FibGUgc3BhY2UgKi8KLSAgICBpZiAoYWxsb2NCbG9ja0N1cnNvci5pc1plcm8oKSkgYWxsb2NCbG9ja0N1cnNvciA9IGNodW5rTWFwLmdldEhlYWRDaHVuaygpOwotICAgIGFsbG9jQmxvY2tTZW50aW5lbCA9IGFsbG9jQmxvY2tDdXJzb3I7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoaXNSZWN5Y2xlQWxsb2NDaHVua0FsaWduZWQoYWxsb2NCbG9ja1NlbnRpbmVsKSk7Ci0gICAgZXhoYXVzdGVkUmV1c2FibGVTcGFjZSA9IGFsbG9jQmxvY2tDdXJzb3IuaXNaZXJvKCk7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TICYmIE9wdGlvbnMudmVyYm9zZS5nZXRWYWx1ZSgpID49IDkpIHsKLSAgICAgIExvZy53cml0ZSgiZ3JbYWxsb2NCbG9ja0N1cnNvcjogIik7IExvZy53cml0ZShhbGxvY0Jsb2NrQ3Vyc29yKTsgTG9nLndyaXRlKCIgYWxsb2NCbG9ja1NlbnRpbmVsOiAiKTsgTG9nLndyaXRlKGFsbG9jQmxvY2tTZW50aW5lbCk7IExvZy53cml0ZWxuKCJdIik7Ci0gICAgfQotCi0gICAgLyogcmVhbGx5IGp1c3Qgd2FudCB0aGlzIHRvIGhhcHBlbiBvbmNlIGFmdGVyIG9wdGlvbnMgYXJlIGJvb3RlZCwgYnV0IG5vIGhhcm0gaW4gcmUtZG9pbmcgaXQgKi8KLSAgICByZXVzYWJsZU1hcmtTdGF0ZVRocmVzaG9sZCA9IChzaG9ydCkgKE9wdGlvbnMubGluZVJldXNlUmF0aW8uZ2V0VmFsdWUoKSAqIE1BWF9CTE9DS19NQVJLX1NUQVRFKTsKLSAgICBEZWZyYWcuZGVmcmFnUmV1c2FibGVNYXJrU3RhdGVUaHJlc2hvbGQgPSAoc2hvcnQpIChPcHRpb25zLmRlZnJhZ0xpbmVSZXVzZVJhdGlvLmdldFZhbHVlKCkgKiBNQVhfQkxPQ0tfTUFSS19TVEFURSk7Ci0KLSAgICBsaW5lc0NvbnN1bWVkID0gMDsKLSAgICByZXR1cm4gZGlkRGVmcmFnOwotICB9Ci0KLSAgLyoqCi0gICAqIERldGVybWluZSB0aGUgY29sbGVjdGlvbiBraW5kLgotICAgKgotICAgKiBAcGFyYW0gZW1lcmdlbmN5Q29sbGVjdGlvbiBJcyB0aGlzIGNvbGxlY3Rpb24gYW4gZW1lcmdlbmN5IChsYXN0IGRpZCBub3QgeWllbGQgZW5vdWdoKT8KLSAgICogQHBhcmFtIGNvbGxlY3RXaG9sZUhlYXAgSXMgdGhpcyBhIHdob2xlIGhlYXAgY29sbGVjdGlvbj8KLSAgICogQHBhcmFtIGNvbGxlY3Rpb25BdHRlbXB0IFdoaWNoIGF0dGVtcHQgaXMgdGhpcyB0byBjb2xsZWN0PwotICAgKiBAcGFyYW0gY29sbGVjdGlvblRyaWdnZXIgV2hhdCBpcyB0cmlnZ2VyaW5nIHRoZSBjb2xsZWN0aW9uPwotICAgKi8KLSAgcHVibGljIHZvaWQgZGVjaWRlV2hldGhlclRvRGVmcmFnKGJvb2xlYW4gZW1lcmdlbmN5Q29sbGVjdGlvbiwgYm9vbGVhbiBjb2xsZWN0V2hvbGVIZWFwLCBpbnQgY29sbGVjdGlvbkF0dGVtcHQsIGludCBjb2xsZWN0aW9uVHJpZ2dlcikgewotICAgIGRlZnJhZy5kZWNpZGVXaGV0aGVyVG9EZWZyYWcoZW1lcmdlbmN5Q29sbGVjdGlvbiwgY29sbGVjdFdob2xlSGVhcCwgY29sbGVjdGlvbkF0dGVtcHQsIGNvbGxlY3Rpb25UcmlnZ2VyLCBleGhhdXN0ZWRSZXVzYWJsZVNwYWNlKTsKLSAgfQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIENvbGxlY3Rpb24gc3RhdGUgYWNjZXNzIG1ldGhvZHMKLSAgKi8KLQotICAvKioKLSAgICogUmV0dXJuIHRydWUgaWYgdGhpcyBzcGFjZSBpcyBjdXJyZW50bHkgYmVpbmcgY29sbGVjdGVkLgotICAgKgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBzcGFjZSBpcyBjdXJyZW50bHkgYmVpbmcgY29sbGVjdGVkLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgYm9vbGVhbiBpbkltbWl4Q29sbGVjdGlvbigpIHsKLSAgICByZXR1cm4gaW5Db2xsZWN0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0cnVlIGlmIHRoaXMgc3BhY2UgaXMgY3VycmVudGx5IGJlaW5nIGRlZnJhZ2VkLgotICAgKgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBzcGFjZSBpcyBjdXJyZW50bHkgYmVpbmcgZGVmcmFnZWQuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBib29sZWFuIGluSW1taXhEZWZyYWdDb2xsZWN0aW9uKCkgewotICAgIHJldHVybiBpbkNvbGxlY3Rpb24gJiYgZGVmcmFnLmluRGVmcmFnKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcGFnZXMgYWxsb2NhdGVkIHNpbmNlIHRoZSBsYXN0IGNvbGxlY3Rpb24KLSAgICoKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHBhZ2VzIGFsbG9jYXRlZCBzaW5jZSB0aGUgbGFzdCBjb2xsZWN0aW9uCi0gICAqLwotICBwdWJsaWMgaW50IGdldFBhZ2VzQWxsb2NhdGVkKCkgewotICAgIHJldHVybiBsaW5lc0NvbnN1bWVkPj4oTE9HX0JZVEVTX0lOX1BBR0UtTE9HX0JZVEVTX0lOX0xJTkUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgcmV1c2FibGUgbWFyayBzdGF0ZSB0aHJlc2hvbGQsIHdoaWNoIGRldGVybWluZXMgaG93Ci0gICAqIGVhZ2VybHkgbGluZXMgc2hvdWxkIGJlIHJlY3ljbGVkIChieSBkZWZhdWx0IHRoZXNlIHZhbHVlcyBhcmUKLSAgICogc2V0IHNvIHRoYXQgYWxsIGxpbmVzIGFyZSByZWN5Y2xlZCkuCi0gICAqCi0gICAqIEBwYXJhbSBmb3JEZWZyYWcgVGhlIHF1ZXJ5IGlzIHRoZSBjb250ZXh0IG9mIGEgZGVmcmFnbWVudGluZyBjb2xsZWN0aW9uCi0gICAqIEByZXR1cm4gVGhlIHJldXNhYmxlIG1hcmsgc3RhdGUgdGhyZXNob2xkCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBzdGF0aWMgc2hvcnQgZ2V0UmV1c3VhYmxlTWFya1N0YXRlVGhyZXNob2xkKGJvb2xlYW4gZm9yRGVmcmFnKSB7Ci0gICAgcmV0dXJuIGZvckRlZnJhZyA/IERlZnJhZy5kZWZyYWdSZXVzYWJsZU1hcmtTdGF0ZVRocmVzaG9sZCA6IHJldXNhYmxlTWFya1N0YXRlVGhyZXNob2xkOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQWxsb2NhdGlvbgotICAgKi8KLQotICAvKioKLSAgICogUmV0dXJuIGEgcG9pbnRlciB0byBhIHNldCBvZiBuZXcgdXNhYmxlIGJsb2Nrcywgb3IgbnVsbCBpZiBub25lIGFyZSBhdmFpbGFibGUuCi0gICAqIFVzZSBkaWZmZXJlbnQgYmxvY2sgc2VsZWN0aW9uIGhldXJpc3RpY3MgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGFsbG9jYXRpb24KLSAgICogcmVxdWVzdCBpcyAiaG90IiBvciAiY29sZCIuCi0gICAqCi0gICAqIEBwYXJhbSBob3QgVHJ1ZSBpZiB0aGUgcmVxdWVzdGluZyBjb250ZXh0IGlzIGZvciBob3QgYWxsb2NhdGlvbnMgKHVzZWQgZm9yCi0gICAqIGFsbG9jYXRpb25zIGZyb20gaGlnaCBhbGxvY2F0aW9uIHZvbHVtZSBzaXRlcykuCi0gICAqIEByZXR1cm4gVGhlIHBvaW50ZXIgaW50byB0aGUgYWxsb2MgdGFibGUgY29udGFpbmluZyB1c2FibGUgYmxvY2tzLgotICAgKi8KLSAgcHVibGljIEFkZHJlc3MgZ2V0U3BhY2UoYm9vbGVhbiBob3QsIGJvb2xlYW4gY29weSwgaW50IGxpbmVVc2VDb3VudCkgewotICAgIEFkZHJlc3MgcnRuOwotICAgIGlmIChjb3B5KQotICAgICAgZGVmcmFnLmdldEJsb2NrKCk7Ci0KLSAgICBsaW5lc0NvbnN1bWVkICs9IGxpbmVVc2VDb3VudDsKLQotICAgIHJ0biA9IGFjcXVpcmUoUEFHRVNfSU5fQkxPQ0spOwotCi0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSB7Ci0gICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQoQmxvY2suaXNBbGlnbmVkKHJ0bikpOwotICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KCEoY29weSAmJiBCbG9jay5pc0RlZnJhZ1NvdXJjZShydG4pKSk7Ci0gICAgfQotCi0gICAgaWYgKCFydG4uaXNaZXJvKCkpIHsKLSAgICAgIEJsb2NrLnNldEJsb2NrQXNJblVzZShydG4pOwotICAgICAgQ2h1bmsudXBkYXRlSGlnaFdhdGVyKHJ0bik7Ci0gICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMgJiYgT3B0aW9ucy52ZXJib3NlLmdldFZhbHVlKCkgPj0gOSkgewotICAgICAgICBMb2cud3JpdGUoImdzWyIpOyBMb2cud3JpdGUocnRuKTsgTG9nLndyaXRlKCIgLT4gIik7IExvZy53cml0ZShydG4ucGx1cyhCWVRFU19JTl9CTE9DSy0xKSk7IExvZy53cml0ZSgiIGNvcHk6ICIpOyBMb2cud3JpdGUoY29weSk7IExvZy53cml0ZWxuKCJdIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJ0bjsKLSAgfQotCi0gLyoqCi0gICogVGhpcyBob29rIGlzIGNhbGxlZCBieSBwYWdlIHJlc291cmNlcyBlYWNoIHRpbWUgYSBzcGFjZSBncm93cy4gIFRoZSBzcGFjZSBtYXkKLSAgKiB0YXAgaW50byB0aGUgaG9vayB0byBtb25pdG9yIGhlYXAgZ3Jvd3RoLiAgVGhlIGNhbGwgaXMgbWFkZSBmcm9tIHdpdGhpbiB0aGUKLSAgKiBwYWdlIHJlc291cmNlcycgY3JpdGljYWwgcmVnaW9uLCBpbW1lZGlhdGVseSBiZWZvcmUgeWllbGRpbmcgdGhlIGxvY2suCi0gICoKLSAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSBuZXdseSBhbGxvY2F0ZWQgc3BhY2UKLSAgKiBAcGFyYW0gYnl0ZXMgVGhlIHNpemUgb2YgdGhlIG5ld2x5IGFsbG9jYXRlZCBzcGFjZQotICAqIEBwYXJhbSBuZXdDaHVuayBUcnVlIGlmIHRoZSBuZXcgc3BhY2UgZW5jcm9hY2hlZCB1cG9uIG9yIHN0YXJ0ZWQgYSBuZXcgY2h1bmsgb3IgY2h1bmtzLgotICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgZ3Jvd1NwYWNlKEFkZHJlc3Mgc3RhcnQsIEV4dGVudCBieXRlcywgYm9vbGVhbiBuZXdDaHVuaykgewotICAgIHN1cGVyLmdyb3dTcGFjZShzdGFydCwgYnl0ZXMsIG5ld0NodW5rKTsKLSAgICAgaWYgKG5ld0NodW5rKSB7Ci0gICAgICBBZGRyZXNzIGNodW5rID0gY2h1bmtBbGlnbihzdGFydC5wbHVzKGJ5dGVzKSwgdHJ1ZSk7Ci0gICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChjaHVua0FsaWduKHN0YXJ0LnBsdXMoYnl0ZXMpLCB0cnVlKS5FUShjaHVuaykpOwotICAgICAgQ2h1bmsuY2xlYXJNZXRhRGF0YShjaHVuayk7Ci0gICAgICBjaHVua01hcC5hZGROZXdDaHVua1RvTWFwKGNodW5rKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgQWRkcmVzcyBhY3F1aXJlUmV1c2FibGVCbG9ja3MoKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSB7Ci0gICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQoaXNSZWN5Y2xlQWxsb2NDaHVua0FsaWduZWQoYWxsb2NCbG9ja0N1cnNvcikpOwotICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGlzUmVjeWNsZUFsbG9jQ2h1bmtBbGlnbmVkKGFsbG9jQmxvY2tTZW50aW5lbCkpOwotICAgIH0KLSAgICBBZGRyZXNzIHJ0bjsKLQotICAgIGxvY2soKTsKLSAgICBpZiAoZXhoYXVzdGVkUmV1c2FibGVTcGFjZSkKLSAgICAgIHJ0biA9IEFkZHJlc3MuemVybygpOwotICAgIGVsc2UgewotICAgICAgcnRuID0gYWxsb2NCbG9ja0N1cnNvcjsKLSAgICAgIEFkZHJlc3MgbGFzdEFsbG9jQ2h1bmsgPSBjaHVua0FsaWduKGFsbG9jQmxvY2tDdXJzb3IsIHRydWUpOwotICAgICAgYWxsb2NCbG9ja0N1cnNvciA9IGFsbG9jQmxvY2tDdXJzb3IucGx1cyhCWVRFU19JTl9SRUNZQ0xFX0FMTE9DX0NIVU5LKTsKLSAgICAgIGlmIChhbGxvY0Jsb2NrQ3Vyc29yLkdUKENodW5rLmdldEhpZ2hXYXRlcihsYXN0QWxsb2NDaHVuaykpKQotICAgICAgICBhbGxvY0Jsb2NrQ3Vyc29yID0gY2h1bmtNYXAubmV4dENodW5rKGxhc3RBbGxvY0NodW5rKTsKLSAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUyAmJiBPcHRpb25zLnZlcmJvc2UuZ2V0VmFsdWUoKSA+PSA5KSB7Ci0gICAgICAgIExvZy53cml0ZSgiYXJiWyBydG46ICIpOyBMb2cud3JpdGUocnRuKTsgTG9nLndyaXRlKCIgYWxsb2NCbG9ja0N1cnNvcjogIik7IExvZy53cml0ZShhbGxvY0Jsb2NrQ3Vyc29yKTsgTG9nLndyaXRlKCIgYWxsb2NCbG9ja1NlbnRpbmVsOiAiKTsgTG9nLndyaXRlKGFsbG9jQmxvY2tTZW50aW5lbCk7IExvZy53cml0ZWxuKCJdIik7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChhbGxvY0Jsb2NrQ3Vyc29yLmlzWmVybygpIHx8IGFsbG9jQmxvY2tDdXJzb3IuRVEoYWxsb2NCbG9ja1NlbnRpbmVsKSkgewotICAgICAgICBleGhhdXN0ZWRSZXVzYWJsZVNwYWNlID0gdHJ1ZTsKLSAgICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TICYmIE9wdGlvbnMudmVyYm9zZS5nZXRWYWx1ZSgpID49IDkpIHsKLSAgICAgICAgICBMb2cud3JpdGVsbigiW1JldXNhYmxlIHNwYWNlIGV4aGF1c3RlZF0iKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICB1bmxvY2soKTsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChpc1JlY3ljbGVBbGxvY0NodW5rQWxpZ25lZChydG4pKTsKLSAgICByZXR1cm4gcnRuOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlbGVhc2UgYSBibG9jay4gIEEgYmxvY2sgaXMgZnJlZSwgc28gY2FsbCB0aGUgdW5kZXJseWluZyBwYWdlIGFsbG9jYXRvcgotICAgKiB0byByZWxlYXNlIHRoZSBhc3NvY2lhdGVkIHN0b3JhZ2UuCi0gICAqCi0gICAqIEBwYXJhbSBibG9jayBUaGUgYWRkcmVzcyBvZiB0aGUgYmxvY2sgdG8gYmUgcmVsZWFzZWQKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHZvaWQgcmVsZWFzZShBZGRyZXNzIGJsb2NrKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoQmxvY2suaXNBbGlnbmVkKGJsb2NrKSk7Ci0gICAgQmxvY2suc2V0QmxvY2tBc1VuYWxsb2NhdGVkKGJsb2NrKTsKLSAgICAoKEZyZWVMaXN0UGFnZVJlc291cmNlKSBwcikucmVsZWFzZVBhZ2VzKGJsb2NrKTsKLSAgfQotCi0gLyoqCi0gICogUmVsZWFzZSBvbmUgb3IgbW9yZSBjb250aWd1b3VzIGNodW5rcyBhc3NvY2lhdGVkIHdpdGggYSBkaXNjb250aWd1b3VzCi0gICogc3BhY2UuIFRoaXMgaG9vayBpcyBjYWxsZWQgYnkgdGhlIHBhZ2UgbGV2ZWwgYWxsb2NhdG9ycyB3aGVuZXZlciBhCi0gICogY29tcGxldGUgZGlzY29udGlndW91cyBjaHVuayBpcyByZWxlYXNlZC4KLSAgKgotICAqIEBwYXJhbSBjaHVuayBUSGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGNvbnRpZ3VvdXMgY2h1bmsgb3IgY2h1bmtzCi0gICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGNodW5rcyBmcmVlZAotICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCByZWxlYXNlRGlzY29udGlndW91c0NodW5rcyhBZGRyZXNzIGNodW5rKSB7Ci0gICAgY2h1bmtNYXAucmVtb3ZlQ2h1bmtGcm9tTWFwKGNodW5rKTsKLSAgICByZXR1cm4gc3VwZXIucmVsZWFzZURpc2NvbnRpZ3VvdXNDaHVua3MoY2h1bmspOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEhlYWRlciBtYW5pcHVsYXRpb24KLSAgKi8KLQotIC8qKgotICAqIFBlcmZvcm0gYW55IHJlcXVpcmVkIHBvc3QgYWxsb2NhdGlvbiBpbml0aWFsaXphdGlvbgotICAqCi0gICogQHBhcmFtIG9iamVjdCB0aGUgb2JqZWN0IHJlZiB0byB0aGUgc3RvcmFnZSB0byBiZSBpbml0aWFsaXplZAotICAqLwotICBASW5saW5lCi0gIHB1YmxpYyB2b2lkIHBvc3RBbGxvYyhPYmplY3RSZWZlcmVuY2Ugb2JqZWN0LCBpbnQgYnl0ZXMpIHsKLSAgICBpZiAoYnl0ZXMgPiBCWVRFU19JTl9MSU5FKQotICAgICAgT2JqZWN0SGVhZGVyLm1hcmtBc1N0cmFkZGxpbmcob2JqZWN0KTsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChPYmplY3RIZWFkZXIuaXNOZXdPYmplY3Qob2JqZWN0KSk7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoIUZvcndhcmRpbmdXb3JkLmlzRm9yd2FyZGVkT3JCZWluZ0ZvcndhcmRlZChvYmplY3QpKTsKLSAgfQotCi0gLyoqCi0gICogUGVyZm9ybSBhbnkgcmVxdWlyZWQgcG9zdCBjb3B5IChpLmUuIGluLUdDIGFsbG9jYXRpb24pIGluaXRpYWxpemF0aW9uLgotICAqIFRoaXMgaXMgcmVsZXZhbnQgKGZvciBleGFtcGxlKSB3aGVuIFNxdWlzaCBpcyB1c2VkIGFzIHRoZSBtYXR1cmUgc3BhY2UgaW4KLSAgKiBhIGNvcHlpbmcgR0MuCi0gICoKLSAgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgcmVmIHRvIHRoZSBzdG9yYWdlIHRvIGJlIGluaXRpYWxpemVkCi0gKiBAcGFyYW0gbWFqb3JHQyBJcyB0aGlzIGNvcHkgaGFwcGVuaW5nIGR1cmluZyBhIG1ham9yIGdjPwotICAqLwotICBASW5saW5lCi0gIHB1YmxpYyB2b2lkIHBvc3RDb3B5KE9iamVjdFJlZmVyZW5jZSBvYmplY3QsIGludCBieXRlcywgYm9vbGVhbiBtYWpvckdDKSB7Ci0gICAgT2JqZWN0SGVhZGVyLndyaXRlTWFya1N0YXRlKG9iamVjdCwgbWFya1N0YXRlLCBieXRlcyA+IEJZVEVTX0lOX0xJTkUpOwotICAgIGlmICghTUFSS19MSU5FX0FUX1NDQU5fVElNRSAmJiBtYWpvckdDKSBtYXJrTGluZXMob2JqZWN0KTsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCghRm9yd2FyZGluZ1dvcmQuaXNGb3J3YXJkZWRPckJlaW5nRm9yd2FyZGVkKG9iamVjdCkpOwotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUyAmJiBIZWFkZXJCeXRlLk5FRURTX1VOTE9HR0VEX0JJVCkgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KEhlYWRlckJ5dGUuaXNVbmxvZ2dlZChvYmplY3QpKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIE9iamVjdCB0cmFjaW5nCi0gICAqLwotCi0gIC8qKgotICAgKiBUcmFjZSBhIHJlZmVyZW5jZSB0byBhbiBvYmplY3QuICBJZiB0aGUgb2JqZWN0IGhlYWRlciBpcyBub3QgYWxyZWFkeQotICAgKiBtYXJrZWQsIG1hcmsgdGhlIG9iamVjdCBhbmQgZW5xdWV1ZSBpdCBmb3Igc3Vic2VxdWVudCBwcm9jZXNzaW5nLgotICAgKgotICAgKiBAcGFyYW0gdHJhY2UgVGhlIHRyYWNlIHBlcmZvcm1pbmcgdGhlIHRyYW5zaXRpdmUgY2xvc3VyZQotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgdHJhY2VkLgotICAgKiBAcGFyYW0gYWxsb2NhdG9yIFRoZSBhbGxvY2F0b3IgdG8gd2hpY2ggYW55IGNvcHlpbmcgc2hvdWxkIGJlIGRpcmVjdGVkCi0gICAqIEByZXR1cm4gVGhlIG9iamVjdCwgd2hpY2ggbWF5IGhhdmUgYmVlbiBtb3ZlZC4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIE9iamVjdFJlZmVyZW5jZSB0cmFjZU9iamVjdChUcmFuc2l0aXZlQ2xvc3VyZSB0cmFjZSwgT2JqZWN0UmVmZXJlbmNlIG9iamVjdCwgaW50IGFsbG9jYXRvcikgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGRlZnJhZy5kZXRlcm1pbmVkKHRydWUpKTsKLQotICAgIE9iamVjdFJlZmVyZW5jZSBydG4gPSBvYmplY3Q7Ci0gICAgaWYgKGlzRGVmcmFnU291cmNlKG9iamVjdCkpCi0gICAgICBydG4gPSB0cmFjZU9iamVjdFdpdGhPcHBvcnR1bmlzdGljQ29weSh0cmFjZSwgb2JqZWN0LCBhbGxvY2F0b3IsIGZhbHNlKTsKLSAgICBlbHNlCi0gICAgICB0cmFjZU9iamVjdFdpdGhvdXRNb3ZpbmcodHJhY2UsIG9iamVjdCk7Ci0KLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIHsKLSAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydCghcnRuLmlzTnVsbCgpKTsKLSAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChkZWZyYWcuc3BhY2VFeGhhdXN0ZWQoKSB8fCAhaXNEZWZyYWdTb3VyY2UocnRuKSB8fCAoT2JqZWN0SGVhZGVyLmlzUGlubmVkT2JqZWN0KHJ0bikpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJ0bjsKLSAgfQotCi0gIC8qKgotICAgKiBUcmFjZSBhIHJlZmVyZW5jZSB0byBhbiBvYmplY3QgaW4gdGhlIGNvbnRleHQgb2YgYSBub24tbW92aW5nIGNvbGxlY3Rpb24uICBUaGlzCi0gICAqIGNhbGwgaXMgb3B0aW1pemVkIGZvciB0aGUgc2ltcGxlciBub24tbW92aW5nIGNhc2UuCi0gICAqCi0gICAqIEBwYXJhbSB0cmFjZSBUaGUgdHJhY2UgcGVyZm9ybWluZyB0aGUgdHJhbnNpdGl2ZSBjbG9zdXJlCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBiZSB0cmFjZWQuCi0gICAqIEByZXR1cm4gVGhlIG9iamVjdCAodGhlcmUgaXMgbm8gb2JqZWN0IGZvcndhcmRpbmcgaW4gdGhpcwotICAgKiB0cmFjZSBtZXRob2QsIHNvIHdlIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgb2JqZWN0OiB0aGlzIGNvdWxkIGJlIGEKLSAgICogdm9pZCBtZXRob2QgYnV0IGZvciBjb21wbGlhbmNlIHRvIGEgbW9yZSBnZW5lcmFsIGludGVyZmFjZSkuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBPYmplY3RSZWZlcmVuY2UgZmFzdFRyYWNlT2JqZWN0KFRyYW5zaXRpdmVDbG9zdXJlIHRyYWNlLCBPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZGVmcmFnLmRldGVybWluZWQoZmFsc2UpKTsKLSAgICB0cmFjZU9iamVjdFdpdGhvdXRNb3ZpbmcodHJhY2UsIG9iamVjdCk7Ci0gICAgcmV0dXJuIG9iamVjdDsKLSAgfQotCi0gIC8qKgotICAgKiBUcmFjZSBhIHJlZmVyZW5jZSB0byBhbiBvYmplY3QgZHVyaW5nIGEgbnVyc2VyeSBjb2xsZWN0aW9uIGZvcgotICAgKiBhIHN0aWNreSBtYXJrIGJpdHMgaW1wbGVtZW50YXRpb24gb2YgaW1taXguICBJZiB0aGUgb2JqZWN0IGhlYWRlcgotICAgKiBpcyBub3QgYWxyZWFkeSBtYXJrZWQsIG1hcmsgdGhlIG9iamVjdCBhbmQgZW5xdWV1ZSBpdCBmb3Igc3Vic2VxdWVudAotICAgKiBwcm9jZXNzaW5nLgotICAgKgotICAgKiBAcGFyYW0gdHJhY2UgVGhlIHRyYWNlIHBlcmZvcm1pbmcgdGhlIHRyYW5zaXRpdmUgY2xvc3VyZQotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgdHJhY2VkLgotICAgKiBAcGFyYW0gYWxsb2NhdG9yIFRoZSBhbGxvY2F0b3IgdG8gd2hpY2ggYW55IGNvcHlpbmcgc2hvdWxkIGJlIGRpcmVjdGVkCi0gICAqIEByZXR1cm4gRWl0aGVyIHRoZSBvYmplY3Qgb3IgYSBmb3J3YXJkZWQgb2JqZWN0LCBkZXBlbmRpbmcgb24KLSAgICogdGhlIHBvbGljeSBpbiBwbGFjZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIE9iamVjdFJlZmVyZW5jZSBudXJzZXJ5VHJhY2VPYmplY3QoVHJhbnNpdGl2ZUNsb3N1cmUgdHJhY2UsIE9iamVjdFJlZmVyZW5jZSBvYmplY3QsIGludCBhbGxvY2F0b3IpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCghZGVmcmFnLmluRGVmcmFnKCkpOwotICAgIGlmIChUTVBfUFJFRkVSX0NPUFlfT05fTlVSU0VSWV9HQykKLSAgICAgIHJldHVybiB0cmFjZU9iamVjdFdpdGhPcHBvcnR1bmlzdGljQ29weSh0cmFjZSwgb2JqZWN0LCBhbGxvY2F0b3IsIHRydWUpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBmYXN0VHJhY2VPYmplY3QodHJhY2UsIG9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogVHJhY2UgYSByZWZlcmVuY2UgdG8gYW4gb2JqZWN0LiAgVGhpcyBpbnRlcmZhY2UgaXMgbm90IHN1cHBvcnRlZCBieSBpbW1peCwgc2luY2UKLSAgICogd2UgcmVxdWlyZSB0aGUgYWxsb2NhdG9yIHRvIGJlIGlkZW50aWZpZWQgZXhjZXB0IGZvciB0aGUgc3BlY2lhbCBjYXNlIG9mIHRoZSBmYXN0Ci0gICAqIHRyYWNlLgotICAgKgotICAgKiBAcGFyYW0gdHJhY2UgVGhlIHRyYWNlIHBlcmZvcm1pbmcgdGhlIHRyYW5zaXRpdmUgY2xvc3VyZQotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgdHJhY2VkLgotICAgKiBAcmV0dXJuIG51bGwgYW5kIGZhaWwuCi0gICAqLwotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlIHRyYWNlT2JqZWN0KFRyYW5zaXRpdmVDbG9zdXJlIHRyYWNlLCBPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgVk0uYXNzZXJ0aW9ucy5mYWlsKCJ1bnN1cHBvcnRlZCBpbnRlcmZhY2UiKTsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBUcmFjZSBhIHJlZmVyZW5jZSB0byBhbiBvYmplY3QgaW4gdGhlIGNvbnRleHQgb2YgYSBub24tbW92aW5nIGNvbGxlY3Rpb24uICBUaGlzCi0gICAqIGNhbGwgaXMgb3B0aW1pemVkIGZvciB0aGUgc2ltcGxlciBub24tbW92aW5nIGNhc2UuCi0gICAqCi0gICAqIEBwYXJhbSB0cmFjZSBUaGUgdHJhY2UgcGVyZm9ybWluZyB0aGUgdHJhbnNpdGl2ZSBjbG9zdXJlCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBiZSB0cmFjZWQuCi0gICAqLwotICBASW5saW5lCi0gIHByaXZhdGUgdm9pZCB0cmFjZU9iamVjdFdpdGhvdXRNb3ZpbmcoVHJhbnNpdGl2ZUNsb3N1cmUgdHJhY2UsIE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBieXRlIG1hcmtWYWx1ZSA9IG1hcmtTdGF0ZTsKLSAgICBieXRlIG9sZE1hcmtTdGF0ZSA9IE9iamVjdEhlYWRlci50ZXN0QW5kTWFyayhvYmplY3QsIG1hcmtWYWx1ZSk7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KCFkZWZyYWcuaW5EZWZyYWcoKSB8fCBkZWZyYWcuc3BhY2VFeGhhdXN0ZWQoKSB8fCAhaXNEZWZyYWdTb3VyY2Uob2JqZWN0KSk7Ci0gICAgaWYgKG9sZE1hcmtTdGF0ZSAhPSBtYXJrVmFsdWUpIHsKLSAgICAgIGlmICghTUFSS19MSU5FX0FUX1NDQU5fVElNRSkKLSAgICAgICAgbWFya0xpbmVzKG9iamVjdCk7Ci0gICAgICB0cmFjZS5wcm9jZXNzTm9kZShvYmplY3QpOwotICAgIH0KLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCghRm9yd2FyZGluZ1dvcmQuaXNGb3J3YXJkZWRPckJlaW5nRm9yd2FyZGVkKG9iamVjdCkpOwotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUyAgJiYgSGVhZGVyQnl0ZS5ORUVEU19VTkxPR0dFRF9CSVQpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChIZWFkZXJCeXRlLmlzVW5sb2dnZWQob2JqZWN0KSk7Ci0gIH0KLQotICAvKioKLSAgICogVHJhY2UgYSByZWZlcmVuY2UgdG8gYW4gb2JqZWN0LCBmb3J3YXJkaW5nIHRoZSBvYmplY3QgaWYgYXBwcm9wcmlhdGUKLSAgICogSWYgdGhlIG9iamVjdCBpcyBub3QgYWxyZWFkeSBtYXJrZWQsIG1hcmsgdGhlIG9iamVjdCBhbmQgZW5xdWV1ZSBpdAotICAgKiBmb3Igc3Vic2VxdWVudCBwcm9jZXNzaW5nLgotICAgKgotICAgKiBAcGFyYW0gdHJhY2UgVGhlIHRyYWNlIHBlcmZvcm1pbmcgdGhlIHRyYW5zaXRpdmUgY2xvc3VyZQotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgdHJhY2VkLgotICAgKiBAcGFyYW0gYWxsb2NhdG9yIFRoZSBhbGxvY2F0b3IgdG8gd2hpY2ggYW55IGNvcHlpbmcgc2hvdWxkIGJlIGRpcmVjdGVkCi0gICAqIEByZXR1cm4gRWl0aGVyIHRoZSBvYmplY3Qgb3IgYSBmb3J3YXJkZWQgb2JqZWN0LCBpZiBpdCB3YXMgZm9yd2FyZGVkLgotICAgKi8KLSAgQElubGluZQotICBwcml2YXRlIE9iamVjdFJlZmVyZW5jZSB0cmFjZU9iamVjdFdpdGhPcHBvcnR1bmlzdGljQ29weShUcmFuc2l0aXZlQ2xvc3VyZSB0cmFjZSwgT2JqZWN0UmVmZXJlbmNlIG9iamVjdCwgaW50IGFsbG9jYXRvciwgYm9vbGVhbiBudXJzZXJ5Q29sbGVjdGlvbikgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KG51cnNlcnlDb2xsZWN0aW9uIHx8IChkZWZyYWcuZGV0ZXJtaW5lZCh0cnVlKSAmJiBpc0RlZnJhZ1NvdXJjZShvYmplY3QpKSk7Ci0KLSAgICAvKiBub3cgcmFjZSB0byBiZSB0aGUgKHBvdGVudGlhbCkgZm9yd2FyZGVyICovCi0gICAgV29yZCBwcmlvclN0YXR1c1dvcmQgPSBGb3J3YXJkaW5nV29yZC5hdHRlbXB0VG9Gb3J3YXJkKG9iamVjdCk7Ci0gICAgaWYgKEZvcndhcmRpbmdXb3JkLnN0YXRlSXNGb3J3YXJkZWRPckJlaW5nRm9yd2FyZGVkKHByaW9yU3RhdHVzV29yZCkpIHsKLSAgICAgIC8qIFdlIGxvc3QgdGhlIHJhY2U7IHRoZSBvYmplY3QgaXMgZWl0aGVyIGZvcndhcmRlZCBvciBiZWluZyBmb3J3YXJkZWQgYnkgYW5vdGhlciB0aHJlYWQuICovCi0gICAgICAvKiBOb3RlIHRoYXQgdGhlIGNvbmN1cnJlbnQgYXR0ZW1wdCB0byBmb3J3YXJkIHRoZSBvYmplY3QgbWF5IGZhaWwsIHNvIHRoZSBvYmplY3QgbWF5IHJlbWFpbiBpbi1wbGFjZSAqLwotICAgICAgT2JqZWN0UmVmZXJlbmNlIHJ0biA9IEZvcndhcmRpbmdXb3JkLnNwaW5BbmRHZXRGb3J3YXJkZWRPYmplY3Qob2JqZWN0LCBwcmlvclN0YXR1c1dvcmQpOwotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TICYmIHJ0biA9PSBvYmplY3QpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCgobnVyc2VyeUNvbGxlY3Rpb24gJiYgT2JqZWN0SGVhZGVyLnRlc3RNYXJrU3RhdGUob2JqZWN0LCBtYXJrU3RhdGUpKSB8fCBkZWZyYWcuc3BhY2VFeGhhdXN0ZWQoKSB8fCBPYmplY3RIZWFkZXIuaXNQaW5uZWRPYmplY3Qob2JqZWN0KSk7Ci0gICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMgJiYgcnRuICE9IG9iamVjdCkgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KG51cnNlcnlDb2xsZWN0aW9uIHx8ICFpc0RlZnJhZ1NvdXJjZShydG4pKTsKLSAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUyAmJiBIZWFkZXJCeXRlLk5FRURTX1VOTE9HR0VEX0JJVCkgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KEhlYWRlckJ5dGUuaXNVbmxvZ2dlZChydG4pKTsKLSAgICAgIHJldHVybiBydG47Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJ5dGUgcHJpb3JTdGF0ZSA9IChieXRlKSAocHJpb3JTdGF0dXNXb3JkLnRvSW50KCkgJiAweEZGKTsKLSAgICAgIC8qIHRoZSBvYmplY3QgaXMgdW5mb3J3YXJkZWQsIGVpdGhlciBiZWNhdXNlIHRoaXMgaXMgdGhlIGZpcnN0IHRocmVhZCB0byByZWFjaCBpdCwgb3IgYmVjYXVzZSB0aGUgb2JqZWN0IGNhbid0IGJlIGZvcndhcmRlZCAqLwotICAgICAgaWYgKE9iamVjdEhlYWRlci50ZXN0TWFya1N0YXRlKHByaW9yU3RhdGUsIG1hcmtTdGF0ZSkpIHsKLSAgICAgICAgLyogdGhlIG9iamVjdCBoYXMgbm90IGJlZW4gZm9yd2FyZGVkLCBidXQgaGFzIHRoZSBjb3JyZWN0IG1hcmsgc3RhdGU7IHVubG9jayBhbmQgcmV0dXJuIHVubW92ZWQgb2JqZWN0ICovCi0gICAgICAgIC8qIE5vdGUgdGhhdCBpbiBhIHN0aWNreSBtYXJrIGJpdHMgY29sbGVjdG9yLCB0aGUgbWFyayBzdGF0ZSBkb2VzIG5vdCBjaGFuZ2UgYXQgZWFjaCBHQywgc28gY29ycmVjdCBtYXJrIHN0YXRlIGRvZXMgbm90IGltcGx5IGFub3RoZXIgdGhyZWFkIGdvdCB0aGVyZSBmaXJzdCAqLwotICAgICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChudXJzZXJ5Q29sbGVjdGlvbiB8fCBkZWZyYWcuc3BhY2VFeGhhdXN0ZWQoKSB8fCBPYmplY3RIZWFkZXIuaXNQaW5uZWRPYmplY3Qob2JqZWN0KSk7Ci0gICAgICAgIE9iamVjdEhlYWRlci5yZXR1cm5Ub1ByaW9yU3RhdGVBbmRFbnN1cmVVbmxvZ2dlZChvYmplY3QsIHByaW9yU3RhdGUpOyAvLyByZXR1cm4gdG8gdW5jb250ZXN0ZWQgc3RhdGUKLSAgICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TICYmIFBsYW4uTkVFRFNfTE9HX0JJVF9JTl9IRUFERVIpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChIZWFkZXJCeXRlLmlzVW5sb2dnZWQob2JqZWN0KSk7Ci0gICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvKiB3ZSBhcmUgdGhlIGZpcnN0IHRvIHJlYWNoIHRoZSBvYmplY3Q7IGVpdGhlciBtYXJrIGluIHBsYWNlIG9yIGZvcndhcmQgaXQgKi8KLSAgICAgICAgT2JqZWN0UmVmZXJlbmNlIG5ld09iamVjdDsKLSAgICAgICAgaWYgKE9iamVjdEhlYWRlci5pc1Bpbm5lZE9iamVjdChvYmplY3QpIHx8IGRlZnJhZy5zcGFjZUV4aGF1c3RlZCgpKSB7Ci0gICAgICAgICAgLyogbWFyayBpbiBwbGFjZSAqLwotICAgICAgICAgIE9iamVjdEhlYWRlci5zZXRNYXJrU3RhdGVVbmxvZ0FuZFVubG9jayhvYmplY3QsIHByaW9yU3RhdGUsIG1hcmtTdGF0ZSk7Ci0gICAgICAgICAgbmV3T2JqZWN0ID0gb2JqZWN0OwotICAgICAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUyAmJiBQbGFuLk5FRURTX0xPR19CSVRfSU5fSEVBREVSKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoSGVhZGVyQnl0ZS5pc1VubG9nZ2VkKG5ld09iamVjdCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8qIGZvcndhcmQgKi8KLSAgICAgICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCghT2JqZWN0SGVhZGVyLmlzUGlubmVkT2JqZWN0KG9iamVjdCkpOwotICAgICAgICAgIG5ld09iamVjdCA9IEZvcndhcmRpbmdXb3JkLmZvcndhcmRPYmplY3Qob2JqZWN0LCBhbGxvY2F0b3IpOwotICAgICAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUyAmJiBQbGFuLk5FRURTX0xPR19CSVRfSU5fSEVBREVSKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoSGVhZGVyQnl0ZS5pc1VubG9nZ2VkKG5ld09iamVjdCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUyAmJiBPcHRpb25zLnZlcmJvc2UuZ2V0VmFsdWUoKSA+PSA5KSB7Ci0gICAgICAgICAgTG9nLndyaXRlKCJDWyIpOyBMb2cud3JpdGUob2JqZWN0KTsgTG9nLndyaXRlKCIvIik7Ci0gICAgICAgICAgTG9nLndyaXRlKGdldE5hbWUoKSk7IExvZy53cml0ZSgiXSAtPiAiKTsKLSAgICAgICAgICBMb2cud3JpdGUobmV3T2JqZWN0KTsgTG9nLndyaXRlKCIvIik7Ci0gICAgICAgICAgTG9nLndyaXRlKFNwYWNlLmdldFNwYWNlRm9yT2JqZWN0KG5ld09iamVjdCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICBMb2cud3JpdGVsbigiXSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghTUFSS19MSU5FX0FUX1NDQU5fVElNRSkKLSAgICAgICAgICBtYXJrTGluZXMobmV3T2JqZWN0KTsKLSAgICAgICAgdHJhY2UucHJvY2Vzc05vZGUobmV3T2JqZWN0KTsKLSAgICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSB7Ci0gICAgICAgICAgaWYgKCEoKGdldFNwYWNlRm9yT2JqZWN0KG5ld09iamVjdCkgIT0gdGhpcykgfHwKLSAgICAgICAgICAgICAgICAobmV3T2JqZWN0ID09IG9iamVjdCkgfHwKLSAgICAgICAgICAgICAgICAobnVyc2VyeUNvbGxlY3Rpb24gJiYgd2lsbE5vdE1vdmVUaGlzTnVyc2VyeUdDKG5ld09iamVjdCkpIHx8Ci0gICAgICAgICAgICAgICAgKGRlZnJhZy5pbkRlZnJhZygpICYmIHdpbGxOb3RNb3ZlVGhpc0dDKG5ld09iamVjdCkpCi0gICAgICAgICAgICAgICApKSB7Ci0gICAgICAgICAgICBMb2cud3JpdGUoIiAgIG9iamVjdDogIik7IExvZy53cml0ZWxuKG9iamVjdCk7Ci0gICAgICAgICAgICBMb2cud3JpdGUoIm5ld09iamVjdDogIik7IExvZy53cml0ZWxuKG5ld09iamVjdCk7Ci0gICAgICAgICAgICBMb2cud3JpdGUoIiAgICBzcGFjZTogIik7IExvZy53cml0ZWxuKGdldE5hbWUoKSk7Ci0gICAgICAgICAgICBMb2cud3JpdGUoIiBudXJzZXJ5PzogIik7IExvZy53cml0ZWxuKG51cnNlcnlDb2xsZWN0aW9uKTsKLSAgICAgICAgICAgIExvZy53cml0ZSgiICBtYXR1cmU/OiAiKTsgTG9nLndyaXRlbG4oT2JqZWN0SGVhZGVyLmlzTWF0dXJlT2JqZWN0KG9iamVjdCkpOwotICAgICAgICAgICAgTG9nLndyaXRlKCIgIHdubW5nYz86ICIpOyBMb2cud3JpdGVsbih3aWxsTm90TW92ZVRoaXNOdXJzZXJ5R0MobmV3T2JqZWN0KSk7Ci0gICAgICAgICAgICBMb2cud3JpdGUoIiAgcGlubmVkPzogIik7IExvZy53cml0ZWxuKE9iamVjdEhlYWRlci5pc1Bpbm5lZE9iamVjdChvYmplY3QpKTsKLSAgICAgICAgICAgIFNwYWNlIG90aGVyU3BhY2UgPSBnZXRTcGFjZUZvck9iamVjdChuZXdPYmplY3QpOwotICAgICAgICAgICAgTG9nLndyaXRlKCIgc3BhY2Uobyk6ICIpOyBMb2cud3JpdGVsbihvdGhlclNwYWNlID09IG51bGwgPyAiPE5VTEw+IiA6IG90aGVyU3BhY2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChmYWxzZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXdPYmplY3Q7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIE1hcmsgdGhlIGxpbmUvcyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBvYmplY3QuICBUaGlzIGlzIGRpc3RpbmN0IGZyb20gdGhlCi0gICAqIGFib3ZlIHRyYWNpbmcgY29kZSBiZWNhdXNlIGxpbmUgbWFya3MgYXJlIHN0b3JlZCBzZXBhcmF0ZWx5IGZyb20gdGhlCi0gICAqIG9iamVjdCBoZWFkZXJzICh0aHVzIGJvdGggbXVzdCBiZSBzZXQpLCBhbmQgYWxzbyBiZWNhdXNlIHdlIGZvdW5kIGVtcGlyaWNhbGx5Ci0gICAqIHRoYXQgaXQgd2FzIG1vcmUgZWZmaWNpZW50IHRvIHBlcmZvcm0gdGhlIGxpbmUgbWFyayBvZiB0aGUgb2JqZWN0IGR1cmluZwotICAgKiB0aGUgc2NhbiBwaGFzZSAod2hpY2ggb2NjdXJzIGFmdGVyIHRoZSB0cmFjZSBwaGFzZSksIHByZXN1bWFibHkgYmVjYXVzZQotICAgKiB0aGUgbGF0ZW5jeSBvZiB0aGUgYXNzb2NpYXRlZCBtZW1vcnkgb3BlcmF0aW9ucyB3YXMgYmV0dGVyIGhpZGRlbiBpbiB0aGUKLSAgICogY29udGV4dCBvZiB0aGF0IGNvZGUKLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHdoaWNoIGlzIGxpdmUgYW5kIGZvciB3aGljaCB0aGUgYXNzb2NpYXRlZCBsaW5lcwotICAgKiBtdXN0IGJlIG1hcmtlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIG1hcmtMaW5lcyhPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgQWRkcmVzcyBhZGRyZXNzID0gVk0ub2JqZWN0TW9kZWwub2JqZWN0U3RhcnRSZWYob2JqZWN0KTsKLSAgICBMaW5lLm1hcmsoYWRkcmVzcywgbGluZU1hcmtTdGF0ZSk7Ci0gICAgaWYgKE9iamVjdEhlYWRlci5pc1N0cmFkZGxpbmdPYmplY3Qob2JqZWN0KSkKLSAgICAgIExpbmUubWFya011bHRpTGluZShhZGRyZXNzLCBvYmplY3QsIGxpbmVNYXJrU3RhdGUpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXROZXh0VW5hdmFpbGFibGVMaW5lKEFkZHJlc3MgYmFzZUxpbmVBdmFpbEFkZHJlc3MsIGludCBsaW5lKSB7Ci0gICAgcmV0dXJuIExpbmUuZ2V0TmV4dFVuYXZhaWxhYmxlKGJhc2VMaW5lQXZhaWxBZGRyZXNzLCBsaW5lLCBsaW5lVW5hdmFpbFN0YXRlKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TmV4dEF2YWlsYWJsZUxpbmUoQWRkcmVzcyBiYXNlTGluZUF2YWlsQWRkcmVzcywgaW50IGxpbmUpIHsKLSAgICByZXR1cm4gTGluZS5nZXROZXh0QXZhaWxhYmxlKGJhc2VMaW5lQXZhaWxBZGRyZXNzLCBsaW5lLCBsaW5lVW5hdmFpbFN0YXRlKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBFc3RhYmxpc2ggYXZhaWxhYmxlIGxpbmVzCi0gICovCi0KLSAgLyoqCi0gICAqIEVzdGFibGlzaCB0aGUgbnVtYmVyIG9mIHJlY3ljbGFibGUgbGluZXMgbGluZXMgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uCi0gICAqIGR1cmluZyBkZWZyYWdtZW50YXRpb24sIHBvcHVsYXRpbmcgdGhlIHNwaWxsQXZhaWxIaXN0b2dyYW0sIHdoaWNoIGJ1Y2tldHMKLSAgICogYXZhaWxhYmxlIGxpbmVzIGFjY29yZGluZyB0byB0aGUgbnVtYmVyIG9mIGhvbGVzIG9uIHRoZSBibG9jayBvbiB3aGljaAotICAgKiB0aGUgYXZhaWxhYmxlIGxpbmVzIHJlc2lkZS4KLSAgICoKLSAgICogQHBhcmFtIHNwaWxsQXZhaWxIaXN0b2dyYW0gQSBoaXN0b2dyYW0gb2YgYXZhaWxhYmlsaXR5IHRvIGJlIHBvcHVsYXRlZAotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHJlY3ljbGFibGUgbGluZXMKLSAgICovCi0gIGludCBnZXRBdmFpbGFibGVMaW5lcyhpbnRbXSBzcGlsbEF2YWlsSGlzdG9ncmFtKSB7Ci0gICAgaW50IGF2YWlsYWJsZUxpbmVzOwotICAgIGlmIChhbGxvY0Jsb2NrQ3Vyc29yLmlzWmVybygpIHx8IGV4aGF1c3RlZFJldXNhYmxlU3BhY2UpIHsKLSAgICAgIGF2YWlsYWJsZUxpbmVzID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKGFsbG9jQmxvY2tDdXJzb3IuRVEoYWxsb2NCbG9ja1NlbnRpbmVsKSkgewotICAgICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCghZXhoYXVzdGVkUmV1c2FibGVTcGFjZSk7Ci0gICAgICAgIGFsbG9jQmxvY2tDdXJzb3IgPSBjaHVua01hcC5nZXRIZWFkQ2h1bmsoKTsKLSAgICAgICAgYWxsb2NCbG9ja1NlbnRpbmVsID0gYWxsb2NCbG9ja0N1cnNvcjsKLSAgICAgIH0KLSAgICAgIGF2YWlsYWJsZUxpbmVzID0gZ2V0VXNhYmxlTGluZXNJblJlZ2lvbihhbGxvY0Jsb2NrQ3Vyc29yLCBhbGxvY0Jsb2NrU2VudGluZWwsIHNwaWxsQXZhaWxIaXN0b2dyYW0pOwotICAgIH0KLSAgICByZXR1cm4gYXZhaWxhYmxlTGluZXM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbGluZXMgdXNhYmxlIGZvciBhbGxvY2F0aW9uIGR1cmluZyBkZWZyYWdtZW50YXRpb24gaW4gdGhlCi0gICAqIGFkZHJlc3MgcmFuZ2Ugc3BlY2lmaWVkIGJ5IHN0YXJ0IGFuZCBlbmQuICBQb3B1bGF0ZSBhIGhpc3RvZ3JhbSB0byBpbmRpY2F0ZSB3aGVyZQotICAgKiB0aGUgdXNhYmxlIGxpbmVzIHJlc2lkZSBhcyBhIGZ1bmN0aW9uIG9mIGJsb2NrIGhvbGUgY291bnQuCi0gICAqCi0gICAqIEBwYXJhbSBzdGFydCAgVGhlIHN0YXJ0IG9mIHRoZSByZWdpb24gdG8gYmUgY2hlY2tlZCBmb3IgYXZhaWxhYmlsaXR5Ci0gICAqIEBwYXJhbSBlbmQgVGhlIGVuZCBvZiB0aGUgcmVnaW9uIHRvIGJlIGNoZWNrZWQgZm9yIGF2YWlsYWJpbGl0eQotICAgKiBAcGFyYW0gc3BpbGxBdmFpbEhpc3RvZ3JhbSBUaGUgaGlzdG9ncmFtIHdoaWNoIHdpbGwgYmUgcG9wdWxhdGVkCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiB1c2FibGUgbGluZXMKLSAgICovCi0gIHByaXZhdGUgaW50IGdldFVzYWJsZUxpbmVzSW5SZWdpb24oQWRkcmVzcyBzdGFydCwgQWRkcmVzcyBlbmQsIGludFtdIHNwaWxsQXZhaWxIaXN0b2dyYW0pIHsKLSAgICBpbnQgdXNhYmxlTGluZXMgPSAwOwotICAgIEFkZHJlc3MgYmxvY2tDdXJzb3IgPSBDaHVuay5pc0FsaWduZWQoc3RhcnQpID8gc3RhcnQucGx1cyhDaHVuay5GSVJTVF9VU0FCTEVfQkxPQ0tfSU5ERVg8PExPR19CWVRFU19JTl9CTE9DSykgOiBzdGFydDsKLSAgICBBZGRyZXNzIGJsb2NrU3RhdGVDdXJzb3IgPSBCbG9jay5nZXRCbG9ja01hcmtTdGF0ZUFkZHJlc3MoYmxvY2tDdXJzb3IpOwotICAgIEFkZHJlc3MgY2h1bmtDdXJzb3IgPSBDaHVuay5hbGlnbihibG9ja0N1cnNvcik7Ci0gICAgaWYgKENodW5rLmdldEJ5dGVPZmZzZXQoZW5kKSA8IENodW5rLkZJUlNUX1VTQUJMRV9CTE9DS19JTkRFWDw8TE9HX0JZVEVTX0lOX0JMT0NLKQotICAgICAgZW5kID0gQ2h1bmsuYWxpZ24oZW5kKS5wbHVzKENodW5rLkZJUlNUX1VTQUJMRV9CTE9DS19JTkRFWDw8TE9HX0JZVEVTX0lOX0JMT0NLKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IE1BWF9DT05TVl9TUElMTF9DT1VOVDsgaSsrKSBzcGlsbEF2YWlsSGlzdG9ncmFtW2ldID0gMDsKLQotICAgIEFkZHJlc3MgaGlnaHdhdGVyID0gQ2h1bmsuZ2V0SGlnaFdhdGVyKGNodW5rQ3Vyc29yKTsKLSAgICBkbyB7Ci0gICAgICBzaG9ydCBtYXJrU3RhdGUgPSBibG9ja1N0YXRlQ3Vyc29yLmxvYWRTaG9ydCgpOwotICAgICAgaWYgKG1hcmtTdGF0ZSAhPSAwICYmIG1hcmtTdGF0ZSA8PSByZXVzYWJsZU1hcmtTdGF0ZVRocmVzaG9sZCkgewotICAgICAgICBpbnQgdXNhYmxlID0gTElORVNfSU5fQkxPQ0sgLSBtYXJrU3RhdGU7Ci0gICAgICAgIHNob3J0IGJ1Y2tldCA9IChzaG9ydCkgQmxvY2suZ2V0Q29uc2VydmF0aXZlU3BpbGxDb3VudChibG9ja0N1cnNvcik7Ci0gICAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGJ1Y2tldCA+PSAwICYmIGJ1Y2tldCA8PSBNQVhfQ09OU1ZfU1BJTExfQ09VTlQpOwotICAgICAgICBzcGlsbEF2YWlsSGlzdG9ncmFtW2J1Y2tldF0gKz0gdXNhYmxlOwotICAgICAgICB1c2FibGVMaW5lcyArPSB1c2FibGU7Ci0gICAgICB9Ci0gICAgICBibG9ja0N1cnNvciA9IGJsb2NrQ3Vyc29yLnBsdXMoQllURVNfSU5fQkxPQ0spOwotICAgICAgaWYgKGJsb2NrQ3Vyc29yLkdUKGhpZ2h3YXRlcikpIHsKLSAgICAgICAgY2h1bmtDdXJzb3IgPSBjaHVua01hcC5uZXh0Q2h1bmsoY2h1bmtDdXJzb3IpOwotICAgICAgICBpZiAoY2h1bmtDdXJzb3IuaXNaZXJvKCkpIGJyZWFrOwotICAgICAgICBibG9ja0N1cnNvciA9IGNodW5rQ3Vyc29yLnBsdXMoQ2h1bmsuRklSU1RfVVNBQkxFX0JMT0NLX0lOREVYPDxMT0dfQllURVNfSU5fQkxPQ0spOwotICAgICAgICBibG9ja1N0YXRlQ3Vyc29yID0gQmxvY2suZ2V0QmxvY2tNYXJrU3RhdGVBZGRyZXNzKGJsb2NrQ3Vyc29yKTsKLSAgICAgICAgaGlnaHdhdGVyID0gQ2h1bmsuZ2V0SGlnaFdhdGVyKGNodW5rQ3Vyc29yKTsKLSAgICAgIH0gZWxzZQotICAgICAgICBibG9ja1N0YXRlQ3Vyc29yID0gYmxvY2tTdGF0ZUN1cnNvci5wbHVzKEJsb2NrLkJZVEVTX0lOX0JMT0NLX1NUQVRFX0VOVFJZKTsKLSAgICB9IHdoaWxlIChibG9ja0N1cnNvci5ORShlbmQpKTsKLQotICAgIHJldHVybiB1c2FibGVMaW5lczsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIE9iamVjdCBzdGF0ZQotICAgKi8KLQotICAvKioKLSAgICogR2VuZXJpYyB0ZXN0IG9mIHRoZSBsaXZlbmVzcyBvZiBhbiBvYmplY3QKLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IGluIHF1ZXN0aW9uCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIG9iamVjdCBpcyBrbm93biB0byBiZSBsaXZlIChpLmUuIGl0IGlzIG1hcmtlZCkKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGJvb2xlYW4gaXNMaXZlKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAoZGVmcmFnLmluRGVmcmFnKCkgJiYgaXNEZWZyYWdTb3VyY2Uob2JqZWN0KSkKLSAgICAgIHJldHVybiBGb3J3YXJkaW5nV29yZC5pc0ZvcndhcmRlZE9yQmVpbmdGb3J3YXJkZWQob2JqZWN0KSB8fCBPYmplY3RIZWFkZXIudGVzdE1hcmtTdGF0ZShvYmplY3QsIG1hcmtTdGF0ZSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIE9iamVjdEhlYWRlci50ZXN0TWFya1N0YXRlKG9iamVjdCwgbWFya1N0YXRlKTsKLSAgfQotCi0gIC8qKgotICAgKiBUZXN0IHRoZSBsaXZlbmVzcyBvZiBhbiBvYmplY3QgZHVyaW5nIGNvcHlpbmcgc3RpY2t5IG1hcmsgYml0cyBjb2xsZWN0aW9uCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCBpbiBxdWVzdGlvbgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBvYmplY3QgaXMga25vd24gdG8gYmUgbGl2ZSAoaS5lLiBpdCBpcyBtYXJrZWQpCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBib29sZWFuIGNvcHlOdXJzZXJ5SXNMaXZlKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICByZXR1cm4gRm9yd2FyZGluZ1dvcmQuaXNGb3J3YXJkZWRPckJlaW5nRm9yd2FyZGVkKG9iamVjdCkgfHwgT2JqZWN0SGVhZGVyLnRlc3RNYXJrU3RhdGUob2JqZWN0LCBtYXJrU3RhdGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3QgdGhlIGxpdmVuZXNzIG9mIGFuIG9iamVjdCBkdXJpbmcgZGVmcmFnbWVudGF0aW9uCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCBpbiBxdWVzdGlvbgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBvYmplY3QgaXMga25vd24gdG8gYmUgbGl2ZSAoaS5lLiBpdCBpcyBtYXJrZWQpCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBib29sZWFuIGZhc3RJc0xpdmUoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KCFkZWZyYWcuaW5EZWZyYWcoKSk7Ci0gICAgcmV0dXJuIE9iamVjdEhlYWRlci50ZXN0TWFya1N0YXRlKG9iamVjdCwgbWFya1N0YXRlKTsKLSAgfQotCi0gIEBJbmxpbmUKLSAgcHVibGljIGJvb2xlYW4gd2lsbE5vdE1vdmVUaGlzR0MoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGdldFNwYWNlRm9yT2JqZWN0KG9iamVjdCkgPT0gdGhpcyAmJiBkZWZyYWcuaW5EZWZyYWcoKSk7Ci0gICAgcmV0dXJuIE9iamVjdEhlYWRlci5pc1Bpbm5lZE9iamVjdChvYmplY3QpIHx8IHdpbGxOb3RNb3ZlVGhpc0dDKFZNLm9iamVjdE1vZGVsLnJlZlRvQWRkcmVzcyhvYmplY3QpKTsKLSAgfQotCi0gIEBJbmxpbmUKLSAgcHVibGljIGJvb2xlYW4gd2lsbE5vdE1vdmVUaGlzTnVyc2VyeUdDKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChnZXRTcGFjZUZvck9iamVjdChvYmplY3QpID09IHRoaXMpOwotICAgIHJldHVybiBPYmplY3RIZWFkZXIuaXNNYXR1cmVPYmplY3Qob2JqZWN0KTsKLSAgfQotCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSBib29sZWFuIGlzRGVmcmFnU291cmNlKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChnZXRTcGFjZUZvck9iamVjdChvYmplY3QpID09IHRoaXMpOwotICAgIHJldHVybiBpc0RlZnJhZ1NvdXJjZShWTS5vYmplY3RNb2RlbC5yZWZUb0FkZHJlc3Mob2JqZWN0KSk7Ci0gIH0KLQotICBASW5saW5lCi0gIHB1YmxpYyBib29sZWFuIHdpbGxOb3RNb3ZlVGhpc0dDKEFkZHJlc3MgYWRkcmVzcykgewotICAgIHJldHVybiAhZGVmcmFnLmluRGVmcmFnKCkgfHwgZGVmcmFnLnNwYWNlRXhoYXVzdGVkKCkgfHwgIWlzRGVmcmFnU291cmNlKGFkZHJlc3MpOwotICB9Ci0KLSAgQElubGluZQotICBwdWJsaWMgYm9vbGVhbiBpc0RlZnJhZ1NvdXJjZShBZGRyZXNzIGFkZHJlc3MpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChnZXRTcGFjZUZvck9iamVjdChhZGRyZXNzLnRvT2JqZWN0UmVmZXJlbmNlKCkpID09IHRoaXMpOwotICAgIHJldHVybiBCbG9jay5pc0RlZnJhZ1NvdXJjZShhZGRyZXNzKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogTG9ja3MKLSAgICovCi0KLSAgLyoqCi0gICAqIEFjcXVpcmUgdGhlIGFwcHJvcHJpYXRlIGxvY2sgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGNvbnRleHQgaXMKLSAgICogR0Mgb3IgbXV0YXRvci4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBsb2NrKCkgewotICAgIGlmIChpbkNvbGxlY3Rpb24pCi0gICAgICBnY0xvY2suYWNxdWlyZSgpOwotICAgIGVsc2UKLSAgICAgIG11dGF0b3JMb2NrLmFjcXVpcmUoKTsKLSAgfQotCi0gICAvKioKLSAgICAqIFJlbGVhc2UgdGhlIGFwcHJvcHJpYXRlIGxvY2sgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGNvbnRleHQgaXMKLSAgICAqIEdDIG9yIG11dGF0b3IuCi0gICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHVubG9jaygpIHsKLSAgICBpZiAoaW5Db2xsZWN0aW9uKQotICAgICAgZ2NMb2NrLnJlbGVhc2UoKTsKLSAgICBlbHNlCi0gICAgICAgbXV0YXRvckxvY2sucmVsZWFzZSgpOwotICB9Ci0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBNaXNjCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlY3ljbGVBbGxvY0NodW5rQWxpZ25lZChBZGRyZXNzIHB0cikgewotICAgIHJldHVybiBwdHIudG9Xb3JkKCkuYW5kKFJFQ1lDTEVfQUxMT0NfQ0hVTktfTUFTSykuRVEoV29yZC56ZXJvKCkpOwotICB9Ci0KLSAgQ2h1bmtMaXN0IGdldENodW5rTWFwKCkgeyByZXR1cm4gY2h1bmtNYXA7IH0KLSAgRGVmcmFnIGdldERlZnJhZygpIHsgcmV0dXJuIGRlZnJhZzsgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvaW1taXgvTGluZS5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvaW1taXgvTGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODRiYzYwLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L2ltbWl4L0xpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucG9saWN5LmltbWl4OwotCi1pbXBvcnQgc3RhdGljIG9yZy5tbXRrLnBvbGljeS5pbW1peC5JbW1peENvbnN0YW50cy4qOwotCi1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuSW5saW5lOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS5VbmludGVycnVwdGlibGU7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC5BZGRyZXNzOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuT2JqZWN0UmVmZXJlbmNlOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuT2Zmc2V0OwotCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgY2xhc3MgTGluZSBpbXBsZW1lbnRzIENvbnN0YW50cyB7Ci0KLSAgcHVibGljIHN0YXRpYyBBZGRyZXNzIGFsaWduKEFkZHJlc3MgcHRyKSB7Ci0gICAgcmV0dXJuIHB0ci50b1dvcmQoKS5hbmQoTElORV9NQVNLLm5vdCgpKS50b0FkZHJlc3MoKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FsaWduZWQoQWRkcmVzcyBhZGRyZXNzKSB7Ci0gICAgcmV0dXJuIGFkZHJlc3MuRVEoYWxpZ24oYWRkcmVzcykpOwotICB9Ci0KLSAgc3RhdGljIGludCBnZXRDaHVua0luZGV4KEFkZHJlc3MgbGluZSkgewotICAgIHJldHVybiBsaW5lLnRvV29yZCgpLmFuZChDSFVOS19NQVNLKS5yc2hsKExPR19CWVRFU19JTl9MSU5FKS50b0ludCgpOwotICB9Ci0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICogTGluZSBtYXJraW5nCi0gICovCi0gIHN0YXRpYyB2b2lkIG1hcmsoQWRkcmVzcyBhZGRyZXNzLCBmaW5hbCBieXRlIG1hcmtWYWx1ZSkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KCFCbG9jay5pc1VudXNlZChCbG9jay5hbGlnbihhZGRyZXNzKSkpOwotICAgIGdldE1hcmtBZGRyZXNzKGFkZHJlc3MpLnN0b3JlKG1hcmtWYWx1ZSk7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBtYXJrTXVsdGlMaW5lKEFkZHJlc3Mgc3RhcnQsIE9iamVjdFJlZmVyZW5jZSBvYmplY3QsIGZpbmFsIGJ5dGUgbWFya1ZhbHVlKSB7Ci0gICAgLyogZW5kTGluZSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgbGFzdCAoaGlnaGVzdCkgbGluZSB0b3VjaGVkIGJ5IHRoaXMgb2JqZWN0ICovCi0gICAgQWRkcmVzcyBlbmRMaW5lID0gTGluZS5hbGlnbihWTS5vYmplY3RNb2RlbC5nZXRPYmplY3RFbmRBZGRyZXNzKG9iamVjdCkubWludXMoMSkpOwotICAgIEFkZHJlc3MgbGluZSA9IExpbmUuYWxpZ24oc3RhcnQucGx1cyhCWVRFU19JTl9MSU5FKSk7Ci0gICAgd2hpbGUgKGxpbmUuTFQoZW5kTGluZSkpIHsKLSAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykKLSAgICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KEJsb2NrLmFsaWduKHN0YXJ0KS5FUShCbG9jay5hbGlnbihsaW5lKSkpOwotICAgICAgbWFyayhsaW5lLCBtYXJrVmFsdWUpOwotICAgICAgbGluZSA9IGxpbmUucGx1cyhCWVRFU19JTl9MSU5FKTsKLSAgICB9Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIFNjYW5uaW5nIHRocm91Z2ggYXZhaWwgbGluZXMKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQWRkcmVzcyBnZXRDaHVua01hcmtUYWJsZShBZGRyZXNzIGNodW5rKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoQ2h1bmsuaXNBbGlnbmVkKGNodW5rKSk7Ci0gICAgcmV0dXJuIGdldE1hcmtBZGRyZXNzKGNodW5rKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgQWRkcmVzcyBnZXRCbG9ja01hcmtUYWJsZShBZGRyZXNzIGJsb2NrKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoQmxvY2suaXNBbGlnbmVkKGJsb2NrKSk7Ci0gICAgcmV0dXJuIGdldE1hcmtBZGRyZXNzKGJsb2NrKTsKLSAgfQotCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TmV4dFVuYXZhaWxhYmxlKEFkZHJlc3MgYmFzZUxpbmVBdmFpbEFkZHJlc3MsIGludCBsaW5lLCBmaW5hbCBieXRlIHVuYXZhaWxhYmxlU3RhdGUpIHsKLSAgICB3aGlsZSAobGluZSA8IExJTkVTX0lOX0JMT0NLICYmCi0gICAgICAgIGJhc2VMaW5lQXZhaWxBZGRyZXNzLmxvYWRCeXRlKE9mZnNldC5mcm9tSW50WmVyb0V4dGVuZChsaW5lPDxMaW5lLkxPR19CWVRFU19JTl9MSU5FX1NUQVRVUykpIDwgdW5hdmFpbGFibGVTdGF0ZSkKLSAgICAgIGxpbmUrKzsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChsaW5lID49IDAgJiYgbGluZSA8PSBMSU5FU19JTl9CTE9DSyk7Ci0gICAgcmV0dXJuIGxpbmU7Ci0gIH0KLQotICBASW5saW5lCi0gIHB1YmxpYyBzdGF0aWMgaW50IGdldE5leHRBdmFpbGFibGUoQWRkcmVzcyBiYXNlTGluZUF2YWlsQWRkcmVzcywgaW50IGxpbmUsIGZpbmFsIGJ5dGUgdW5hdmFpbGFibGVTdGF0ZSkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGxpbmUgPj0gMCAmJiBsaW5lIDwgTElORVNfSU5fQkxPQ0spOwotICAgIGJ5dGUgbGFzdCA9IGJhc2VMaW5lQXZhaWxBZGRyZXNzLmxvYWRCeXRlKE9mZnNldC5mcm9tSW50WmVyb0V4dGVuZChsaW5lPDxMaW5lLkxPR19CWVRFU19JTl9MSU5FX1NUQVRVUykpOwotICAgIGJ5dGUgdGhpc2xpbmU7Ci0gICAgbGluZSsrOwotICAgIHdoaWxlIChsaW5lIDwgTElORVNfSU5fQkxPQ0spIHsKLSAgICAgIHRoaXNsaW5lID0gYmFzZUxpbmVBdmFpbEFkZHJlc3MubG9hZEJ5dGUoT2Zmc2V0LmZyb21JbnRaZXJvRXh0ZW5kKGxpbmU8PExpbmUuTE9HX0JZVEVTX0lOX0xJTkVfU1RBVFVTKSk7Ci0gICAgICBpZiAodGhpc2xpbmUgPCB1bmF2YWlsYWJsZVN0YXRlICYmIGxhc3QgPCB1bmF2YWlsYWJsZVN0YXRlKQotICAgICAgICBicmVhazsKLSAgICAgIGxhc3QgPSB0aGlzbGluZTsKLSAgICAgIGxpbmUrKzsKLSAgICB9Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQobGluZSA+PSAwICYmIGxpbmUgPD0gTElORVNfSU5fQkxPQ0spOwotICAgIHJldHVybiBsaW5lOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgQWRkcmVzcyBnZXRNZXRhQWRkcmVzcyhBZGRyZXNzIGFkZHJlc3MsIGZpbmFsIGludCB0YWJsZU9mZnNldCkgewotICAgIEFkZHJlc3MgY2h1bmsgPSBDaHVuay5hbGlnbihhZGRyZXNzKTsKLSAgICBpbnQgaW5kZXggPSBnZXRDaHVua0luZGV4KGFkZHJlc3MpOwotICAgIEFkZHJlc3MgcnRuID0gY2h1bmsucGx1cyh0YWJsZU9mZnNldCArIChpbmRleDw8TE9HX0JZVEVTX0lOX0xJTkVfU1RBVFVTKSk7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSB7Ci0gICAgICBBZGRyZXNzIGxpbmUgPSBjaHVuay5wbHVzKGluZGV4PDxMT0dfQllURVNfSU5fTElORSk7Ci0gICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQoaXNBbGlnbmVkKGxpbmUpKTsKLSAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChhbGlnbihhZGRyZXNzKS5FUShsaW5lKSk7Ci0gICAgICBib29sZWFuIHZhbGlkID0gcnRuLkdFKGNodW5rLnBsdXModGFibGVPZmZzZXQpKSAmJiBydG4uTFQoY2h1bmsucGx1cyh0YWJsZU9mZnNldCArIExJTkVfTUFSS19UQUJMRV9CWVRFUykpOwotICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KHZhbGlkKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJ0bjsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIEFkZHJlc3MgZ2V0TWFya0FkZHJlc3MoQWRkcmVzcyBhZGRyZXNzKSB7Ci0gICAgcmV0dXJuIGdldE1ldGFBZGRyZXNzKGFkZHJlc3MsIENodW5rLkxJTkVfTUFSS19UQUJMRV9PRkZTRVQpOwotICB9Ci0KLSAgLyogcGVyLWxpbmUgbWFyayBieXRlcyAqLwotICBzdGF0aWMgZmluYWwgaW50IExPR19CWVRFU19JTl9MSU5FX1NUQVRVUyA9IDA7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgQllURVNfSU5fTElORV9TVEFUVVMgPSAxPDxMT0dfQllURVNfSU5fTElORV9TVEFUVVM7Ci0KLSAgc3RhdGljIGZpbmFsIGludCBMSU5FX01BUktfVEFCTEVfQllURVMgPSBMSU5FU19JTl9DSFVOSzw8TE9HX0JZVEVTX0lOX0xJTkVfU1RBVFVTOwotICBzdGF0aWMgZmluYWwgaW50IExPR19MSU5FX01BUktfQllURVNfUEVSX0JMT0NLID0gTE9HX0xJTkVTX0lOX0JMT0NLK0xPR19CWVRFU19JTl9MSU5FX1NUQVRVUzsKLSAgc3RhdGljIGZpbmFsIGludCBMSU5FX01BUktfQllURVNfUEVSX0JMT0NLID0gKDE8PExPR19MSU5FX01BUktfQllURVNfUEVSX0JMT0NLKTsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L2ltbWl4L011dGF0b3JMb2NhbC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvaW1taXgvTXV0YXRvckxvY2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYjVhOWMuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvaW1taXgvTXV0YXRvckxvY2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsucG9saWN5LmltbWl4OwotCi1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5hbGxvYy5JbW1peEFsbG9jYXRvcjsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkNvbnN0YW50czsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBmaW5hbCBjbGFzcyBNdXRhdG9yTG9jYWwgZXh0ZW5kcyBJbW1peEFsbG9jYXRvcgotICBpbXBsZW1lbnRzIENvbnN0YW50cyB7Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKgotICAgKiBAcGFyYW0gc3BhY2UgVGhlIG1hcmstc3dlZXAgc3BhY2UgdG8gd2hpY2ggdGhpcyBhbGxvY2F0b3IKLSAgICogaW5zdGFuY2VzIGlzIGJvdW5kLgotICAgKiBAcGFyYW0gaG90IFRPRE8KLSAgICovCi0gIHB1YmxpYyBNdXRhdG9yTG9jYWwoSW1taXhTcGFjZSBzcGFjZSwgYm9vbGVhbiBob3QpIHsKLSAgICBzdXBlcihzcGFjZSwgaG90LCBmYWxzZSk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDb2xsZWN0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBQcmVwYXJlIGZvciBhIGNvbGxlY3Rpb24uIElmIHBhcmFub2lkLCBwZXJmb3JtIGEgc2FuaXR5IGNoZWNrLgotICAgKi8KLSAgcHVibGljIHZvaWQgcHJlcGFyZSgpIHsKLSAgICByZXNldCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZpbmlzaCB1cCBhZnRlciBhIGNvbGxlY3Rpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotICAgIHJlc2V0KCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvcG9saWN5L2ltbWl4L09iamVjdEhlYWRlci5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvaW1taXgvT2JqZWN0SGVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MDY5NGEuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay9wb2xpY3kvaW1taXgvT2JqZWN0SGVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnBvbGljeS5pbW1peDsKLQotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuRm9yd2FyZGluZ1dvcmQ7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5IZWFkZXJCeXRlOwotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS5JbmxpbmU7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLlVuaW50ZXJydXB0aWJsZTsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLk9iamVjdFJlZmVyZW5jZTsKLQotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIE9iamVjdEhlYWRlciB7Ci0gIC8qKiBudW1iZXIgb2YgaGVhZGVyIGJpdHMgd2UgbWF5IHVzZSAqLwotICBzdGF0aWMgZmluYWwgaW50IEFWQUlMQUJMRV9MT0NBTF9CSVRTID0gOCAtIEhlYWRlckJ5dGUuVVNFRF9HTE9CQUxfQklUUzsKLQotICAvKiBoZWFkZXIgcmVxdWlyZW1lbnRzICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMX0dDX0JJVFNfUkVRVUlSRUQgPSBBVkFJTEFCTEVfTE9DQUxfQklUUzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xPQkFMX0dDX0JJVFNfUkVRVUlSRUQgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHQ19IRUFERVJfV09SRFNfUkVRVUlSRUQgPSAwOwotCi0gIC8qIGxvY2FsIHN0YXR1cyBiaXRzICovCi0gIHN0YXRpYyBmaW5hbCBieXRlIE5FV19PQkpFQ1RfTUFSSyA9IDA7IC8vIHVzaW5nIHplcm8gbWVhbnMgbm8gbmVlZCBmb3IgZXhwbGljaXQgaW5pdGlhbGl6YXRpb24gb24gYWxsb2NhdGlvbgotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBJTk5FRF9CSVRfTlVNQkVSID0gRm9yd2FyZGluZ1dvcmQuRk9SV0FSRElOR19CSVRTOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgUElOTkVEX0JJVCA9IDE8PFBJTk5FRF9CSVRfTlVNQkVSOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVFJBRERMRV9CSVRfTlVNQkVSID0gUElOTkVEX0JJVF9OVU1CRVIgKyAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU1RSQURETEVfQklUID0gMTw8U1RSQURETEVfQklUX05VTUJFUjsKLQotICAvKiBtYXJrIGJpdHMgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50ICBNQVJLX0JBU0UgPSBTVFJBRERMRV9CSVRfTlVNQkVSKzE7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgIE1BWF9NQVJLQ09VTlRfQklUUyA9IEFWQUlMQUJMRV9MT0NBTF9CSVRTLU1BUktfQkFTRTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBNQVJLX0lOQ1JFTUVOVCA9IDE8PE1BUktfQkFTRTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE1BUktfTUFTSyA9IChieXRlKSAoKCgxPDxNQVhfTUFSS0NPVU5UX0JJVFMpLTEpPDxNQVJLX0JBU0UpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIE1BUktfQU5EX0ZPUldBUkRJTkdfTUFTSyA9IChieXRlKSAoTUFSS19NQVNLIHwgRm9yd2FyZGluZ1dvcmQuRk9SV0FSRElOR19NQVNLKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE1BUktfQkFTRV9WQUxVRSA9IE1BUktfSU5DUkVNRU5UOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogTWFya2luZwotICAgKi8KLQotICAvKioKLSAgICogTm9uLWF0b21pY2FsbHkgdGVzdCBhbmQgc2V0IHRoZSBtYXJrIGJpdCBvZiBhbiBvYmplY3QuICBSZXR1cm4gdHJ1ZQotICAgKiBpZiBzdWNjZXNzZnVsLCBmYWxzZSBpZiB0aGUgbWFyayBiaXQgd2FzIGFscmVhZHkgc2V0LgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3Qgd2hvc2UgbWFyayBiaXQgaXMgdG8gYmUgd3JpdHRlbgotICAgKiBAcGFyYW0gbWFya1N0YXRlIFRoZSB2YWx1ZSB0byB3aGljaCB0aGUgbWFyayBiaXRzIHdpbGwgYmUgc2V0Ci0gICAqLwotICBzdGF0aWMgYnl0ZSB0ZXN0QW5kTWFyayhPYmplY3RSZWZlcmVuY2Ugb2JqZWN0LCBieXRlIG1hcmtTdGF0ZSkgewotICAgIGJ5dGUgb2xkVmFsdWUsIG5ld1ZhbHVlLCBvbGRNYXJrU3RhdGU7Ci0KLSAgICBvbGRWYWx1ZSA9IFZNLm9iamVjdE1vZGVsLnJlYWRBdmFpbGFibGVCeXRlKG9iamVjdCk7Ci0gICAgb2xkTWFya1N0YXRlID0gKGJ5dGUpIChvbGRWYWx1ZSAmIE1BUktfTUFTSyk7Ci0gICAgaWYgKG9sZE1hcmtTdGF0ZSAhPSBtYXJrU3RhdGUpIHsKLSAgICAgIG5ld1ZhbHVlID0gKGJ5dGUpICgob2xkVmFsdWUgJiB+TUFSS19NQVNLKSB8IG1hcmtTdGF0ZSk7Ci0gICAgICBpZiAoSGVhZGVyQnl0ZS5ORUVEU19VTkxPR0dFRF9CSVQpCi0gICAgICAgIG5ld1ZhbHVlIHw9IEhlYWRlckJ5dGUuVU5MT0dHRURfQklUOwotICAgICAgVk0ub2JqZWN0TW9kZWwud3JpdGVBdmFpbGFibGVCeXRlKG9iamVjdCwgbmV3VmFsdWUpOwotICAgIH0KLSAgICByZXR1cm4gb2xkTWFya1N0YXRlOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgc2V0TWFya1N0YXRlVW5sb2dBbmRVbmxvY2soT2JqZWN0UmVmZXJlbmNlIG9iamVjdCwgYnl0ZSBvcmlnaW5hbEhlYWRlckJ5dGUsIGJ5dGUgbWFya1N0YXRlKSB7Ci0gICAgYnl0ZSBvbGRWYWx1ZSA9IG9yaWdpbmFsSGVhZGVyQnl0ZTsKLSAgICBieXRlIG5ld1ZhbHVlID0gKGJ5dGUpICgob2xkVmFsdWUgJiB+TUFSS19BTkRfRk9SV0FSRElOR19NQVNLKSB8IG1hcmtTdGF0ZSk7Ci0gICAgaWYgKEhlYWRlckJ5dGUuTkVFRFNfVU5MT0dHRURfQklUKQotICAgICAgbmV3VmFsdWUgfD0gSGVhZGVyQnl0ZS5VTkxPR0dFRF9CSVQ7Ci0gICAgVk0ub2JqZWN0TW9kZWwud3JpdGVBdmFpbGFibGVCeXRlKG9iamVjdCwgbmV3VmFsdWUpOwotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykKLSAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydCgob2xkVmFsdWUgJiBNQVJLX01BU0spICE9IG1hcmtTdGF0ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRydWUgaWYgdGhlIG1hcmsgY291bnQgZm9yIGFuIG9iamVjdCBoYXMgdGhlIGdpdmVuIHZhbHVlLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3Qgd2hvc2UgbWFyayBiaXQgaXMgdG8gYmUgdGVzdGVkCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgYWdhaW5zdCB3aGljaCB0aGUgbWFyayBiaXQgd2lsbCBiZSB0ZXN0ZWQKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBtYXJrIGJpdCBmb3IgdGhlIG9iamVjdCBoYXMgdGhlIGdpdmVuIHZhbHVlLgotICAgKi8KLSAgc3RhdGljIGJvb2xlYW4gdGVzdE1hcmtTdGF0ZShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0LCBieXRlIHZhbHVlKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoKHZhbHVlICYgTUFSS19NQVNLKSA9PSB2YWx1ZSk7Ci0gICAgcmV0dXJuIChWTS5vYmplY3RNb2RlbC5yZWFkQXZhaWxhYmxlQnl0ZShvYmplY3QpICYgTUFSS19NQVNLKSA9PSB2YWx1ZTsKLSAgIH0KLQotICBzdGF0aWMgYm9vbGVhbiB0ZXN0TWFya1N0YXRlKGJ5dGUgZm9yd2FyZGluZ1dvcmQsIGJ5dGUgdmFsdWUpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCgodmFsdWUgJiBNQVJLX01BU0spID09IHZhbHVlKTsKLSAgICByZXR1cm4gKGZvcndhcmRpbmdXb3JkICYgTUFSS19NQVNLKSA9PSB2YWx1ZTsKLSAgfQotCi0gIHN0YXRpYyBib29sZWFuIGlzTmV3T2JqZWN0KE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICByZXR1cm4gKFZNLm9iamVjdE1vZGVsLnJlYWRBdmFpbGFibGVCeXRlKG9iamVjdCkgJiBNQVJLX0FORF9GT1JXQVJESU5HX01BU0spID09IE5FV19PQkpFQ1RfTUFSSzsKLSAgfQotCi0gIHN0YXRpYyBib29sZWFuIGlzTWF0dXJlT2JqZWN0KE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBieXRlIHN0YXR1cyA9IChieXRlKSAoVk0ub2JqZWN0TW9kZWwucmVhZEF2YWlsYWJsZUJ5dGUob2JqZWN0KSAmIE1BUktfQU5EX0ZPUldBUkRJTkdfTUFTSyk7Ci0gICAgYm9vbGVhbiB1bmZvcndhcmRlZCA9IChzdGF0dXMgJiBGb3J3YXJkaW5nV29yZC5GT1JXQVJESU5HX01BU0spID09IDA7Ci0gICAgYm9vbGVhbiBuZXdPYmogPSAoc3RhdHVzID09IE5FV19PQkpFQ1RfTUFSSyk7Ci0gICAgcmV0dXJuIHVuZm9yd2FyZGVkICYmICFuZXdPYmo7Ci0gIH0KLQotICBASW5saW5lCi0gIHN0YXRpYyB2b2lkIG1hcmtBc1N0cmFkZGxpbmcoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGJ5dGUgb2xkID0gVk0ub2JqZWN0TW9kZWwucmVhZEF2YWlsYWJsZUJ5dGUob2JqZWN0KTsKLSAgICBWTS5vYmplY3RNb2RlbC53cml0ZUF2YWlsYWJsZUJ5dGUob2JqZWN0LCAoYnl0ZSkgKG9sZCB8IFNUUkFERExFX0JJVCkpOwotICB9Ci0KLSAgQElubGluZQotICBzdGF0aWMgYm9vbGVhbiBpc1N0cmFkZGxpbmdPYmplY3QoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIHJldHVybiAoVk0ub2JqZWN0TW9kZWwucmVhZEF2YWlsYWJsZUJ5dGUob2JqZWN0KSAmIFNUUkFERExFX0JJVCkgPT0gU1RSQURETEVfQklUOwotICB9Ci0KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIHZvaWQgcGluT2JqZWN0KE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBieXRlIG9sZCA9IFZNLm9iamVjdE1vZGVsLnJlYWRBdmFpbGFibGVCeXRlKG9iamVjdCk7Ci0gICAgVk0ub2JqZWN0TW9kZWwud3JpdGVBdmFpbGFibGVCeXRlKG9iamVjdCwgKGJ5dGUpIChvbGQgfCBQSU5ORURfQklUKSk7Ci0gIH0KLQotICBASW5saW5lCi0gIHN0YXRpYyBib29sZWFuIGlzUGlubmVkT2JqZWN0KE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICByZXR1cm4gKFZNLm9iamVjdE1vZGVsLnJlYWRBdmFpbGFibGVCeXRlKG9iamVjdCkgJiBQSU5ORURfQklUKSA9PSBQSU5ORURfQklUOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlIHRoZSBhbGxvY1N0YXRlIGludG8gdGhlIG1hcmsgc3RhdGUgZmllbGRzIG9mIGFuIG9iamVjdCBub24tYXRvbWljYWxseS4KLSAgICogVGhpcyBpcyBhcHByb3ByaWF0ZSBmb3IgY29sbGVjdGlvbiB0aW1lIGluaXRpYWxpemF0aW9uLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3Qgd2hvc2UgbWFyayBzdGF0ZSBpcyB0byBiZSB3cml0dGVuCi0gICAqIEBwYXJhbSBtYXJrU3RhdGUgVE9ETzogd2hhdCBhbSBJPwotICAgKiBAcGFyYW0gc3RyYWRkbGUgVE9ETzogd2hhdCBhbSBJPwotICAgKi8KLSAgc3RhdGljIHZvaWQgd3JpdGVNYXJrU3RhdGUoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCwgYnl0ZSBtYXJrU3RhdGUsIGJvb2xlYW4gc3RyYWRkbGUpIHsKLSAgICBieXRlIG9sZFZhbHVlID0gVk0ub2JqZWN0TW9kZWwucmVhZEF2YWlsYWJsZUJ5dGUob2JqZWN0KTsKLSAgICBieXRlIG1hcmtWYWx1ZSA9IG1hcmtTdGF0ZTsKLSAgICBieXRlIG5ld1ZhbHVlID0gKGJ5dGUpIChvbGRWYWx1ZSAmIH5NQVJLX0FORF9GT1JXQVJESU5HX01BU0spOwotICAgIGlmIChIZWFkZXJCeXRlLk5FRURTX1VOTE9HR0VEX0JJVCkKLSAgICAgIG5ld1ZhbHVlIHw9IEhlYWRlckJ5dGUuVU5MT0dHRURfQklUOwotICAgIG5ld1ZhbHVlIHw9IG1hcmtWYWx1ZTsKLSAgICBpZiAoc3RyYWRkbGUpCi0gICAgICBuZXdWYWx1ZSB8PSBTVFJBRERMRV9CSVQ7Ci0gICAgVk0ub2JqZWN0TW9kZWwud3JpdGVBdmFpbGFibGVCeXRlKG9iamVjdCwgbmV3VmFsdWUpOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgcmV0dXJuVG9QcmlvclN0YXRlQW5kRW5zdXJlVW5sb2dnZWQoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCwgYnl0ZSBzdGF0dXMpIHsKLSAgICBpZiAoSGVhZGVyQnl0ZS5ORUVEU19VTkxPR0dFRF9CSVQpIHN0YXR1cyB8PSBIZWFkZXJCeXRlLlVOTE9HR0VEX0JJVDsKLSAgICBWTS5vYmplY3RNb2RlbC53cml0ZUF2YWlsYWJsZUJ5dGUob2JqZWN0LCBzdGF0dXMpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbWFyayBzdGF0ZSBpbmNyZW1lbnRlZCBvciBkZWNyZW1lbnRlZCBieSBvbmUuCi0gICAqCi0gICAqIEBwYXJhbSBpbmNyZW1lbnQgSWYgdHJ1ZSwgdGhlbiByZXR1cm4gdGhlIGluY3JlbWVudGVkIHZhbHVlIGVsc2UgcmV0dXJuIHRoZSBkZWNyZW1lbnRlZCB2YWx1ZQotICAgKiBAcmV0dXJuIHRoZSBtYXJrIHN0YXRlIGluY3JlbWVudGVkIG9yIGRlY3JlbWVudGVkIGJ5IG9uZS4KLSAgICovCi0gIHN0YXRpYyBieXRlIGRlbHRhTWFya1N0YXRlKGJ5dGUgc3RhdGUsIGJvb2xlYW4gaW5jcmVtZW50KSB7Ci0gICAgYnl0ZSBydG4gPSBzdGF0ZTsKLSAgICBkbyB7Ci0gICAgICBydG4gPSAoYnl0ZSkgKGluY3JlbWVudCA/IHJ0biArIE1BUktfSU5DUkVNRU5UIDogcnRuIC0gTUFSS19JTkNSRU1FTlQpOwotICAgICAgcnRuICY9IE1BUktfTUFTSzsKLSAgICAgIH0gd2hpbGUgKHJ0biA8IE1BUktfQkFTRV9WQUxVRSk7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQocnRuICE9IHN0YXRlKTsKLSAgICByZXR1cm4gcnRuOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvQmFzZUdlbmVyaWNGcmVlTGlzdC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L0Jhc2VHZW5lcmljRnJlZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNjYzkzZS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvQmFzZUdlbmVyaWNGcmVlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY2ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5OwotCi1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBUaGlzIGlzIGEgdmVyeSBzaW1wbGUsIGdlbmVyaWMgbWFsbG9jLWZyZWUgYWxsb2NhdG9yLiAgSXQgd29ya3MKLSAqIGFic3RyYWN0bHksIGluICJ1bml0cyIsIHdoaWNoIHRoZSB1c2VyIG1heSBhc3NvY2lhdGUgd2l0aCBzb21lCi0gKiBvdGhlciBhbGxvY2F0YWJsZSByZXNvdXJjZSAoZS5nLiBoZWFwIGJsb2NrcykuICBUaGUgdXNlciBpc3N1ZXMKLSAqIHJlcXVlc3RzIGZvciBOIHVuaXRzIGFuZCB0aGUgYWxsb2NhdG9yIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZQotICogZmlyc3Qgb2YgYSBjb250aWd1b3VzIHNldCBvZiBOIHVuaXRzIG9yIGZhaWxzLCByZXR1cm5pbmcgLTEuICBUaGUKLSAqIHVzZXIgZnJlZXMgdGhlIGJsb2NrIG9mIE4gdW5pdHMgYnkgY2FsbGluZyA8Y29kZT5mcmVlKCk8L2NvZGU+IHdpdGgKLSAqIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgdW5pdCBhcyB0aGUgYXJndW1lbnQuPHA+Ci0gKgotICogUHJvcGVydGllcy9Db25zdHJhaW50czo8dWw+Ci0gKiAgIDxsaT4gVGhlIGFsbG9jYXRvciBjb25zdW1lcyBvbmUgd29yZCBwZXIgYWxsb2NhdGFibGUgdW5pdCAocGx1cwotICogICBhIGZpeGVkIG92ZXJoZWFkIG9mIGFib3V0IDEyOCB3b3JkcykuPC9saT4KLSAqICAgPGxpPiBUaGUgYWxsb2NhdG9yIGNhbiBvbmx5IGRlYWwgd2l0aCBNQVhfVU5JVFMgdW5pdHMgKHNlZSBiZWxvdyBmb3IKLSAqICAgdGhlIHZhbHVlKS48L2xpPgotICogPC91bD4KLSAqCi0gKiBUaGUgYmFzaWMgZGF0YSBzdHJ1Y3R1cmUgdXNlZCBieSB0aGUgYWxnb3JpdGhtIGlzIGEgbGFyZ2UgdGFibGUsCi0gKiB3aXRoIG9uZSB3b3JkIHBlciBhbGxvY2F0YWJsZSB1bml0LiAgRWFjaCB3b3JkIGlzIHVzZWQgaW4gYQotICogbnVtYmVyIG9mIGRpZmZlcmVudCB3YXlzLCBzb21lIGNvbWJpbmF0aW9uIG9mICJ1bmRlZmluZWQiICgzMiksCi0gKiAiZnJlZS91c2VkIiAoMSksICJtdWx0aS9zaW5nbGUiICgxKSwgInByZXYiICgxNSksICJuZXh0IiAoMTUpICYKLSAqICJzaXplIiAoMTUpIHdoZXJlIGZpZWxkIHNpemVzIGluIGJpdHMgYXJlIGluIHBhcmVudGhlc2lzLgotICogPHByZT4KLSAqICAgICAgICAgICAgICAgICAgICAgICArLSstKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKwotICogICAgICAgICAgICAgICAgICAgICAgIHxmfG18ICAgIHByZXYgICB8IG5leHQvc2l6ZSB8Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgKy0rLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsKLSAqCi0gKiAgIC0gc2luZ2xlIGZyZWUgdW5pdDogImZyZWUiLCAic2luZ2xlIiwgInByZXYiLCAibmV4dCIKLSAqICAgLSBzaW5nbGUgdXNlZCB1bml0OiAidXNlZCIsICJzaW5nbGUiCi0gKiAgICAtIGNvbnRpZ3VvdXMgZnJlZSB1bml0cwotICogICAgIC4gZmlyc3QgdW5pdDogImZyZWUiLCAibXVsdGkiLCAicHJldiIsICJuZXh0IgotICogICAgIC4gc2Vjb25kIHVuaXQ6ICJmcmVlIiwgIm11bHRpIiwgInNpemUiCi0gKiAgICAgLiBsYXN0IHVuaXQ6ICJmcmVlIiwgIm11bHRpIiwgInNpemUiCi0gKiAgICAtIGNvbnRpZ3VvdXMgdXNlZCB1bml0cwotICogICAgIC4gZmlyc3QgdW5pdDogInVzZWQiLCAibXVsdGkiLCAicHJldiIsICJuZXh0IgotICogICAgIC4gc2Vjb25kIHVuaXQ6ICJ1c2VkIiwgIm11bHRpIiwgInNpemUiCi0gKiAgICAgLiBsYXN0IHVuaXQ6ICJ1c2VkIiwgIm11bHRpIiwgInNpemUiCi0gKiAgICAtIGFueSBvdGhlciB1bml0OiB1bmRlZmluZWQKLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgKy0rLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsKLSAqICAgdG9wIHNlbnRpbmVsICAgICAgICB8MHwwfCAgICB0YWlsICAgfCAgIGhlYWQgICAgfCAgWy0xXQotICogICAgICAgICAgICAgICAgICAgICAgICstKy0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4uCi0gKiAgICAgICAgICAgIC8tLS0tLS0tLSAgKy0rLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsKLSAqICAgICAgICAgICAgfCAgICAgICAgICB8MXwxfCAgIHByZXYgICAgfCAgIG5leHQgICAgfCAgW2pdCi0gKiAgICAgICAgICAgIHwgICAgICAgICAgKy0rLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsKLSAqICAgICAgICAgICAgfCAgICAgICAgICB8MXwxfCAgICAgICAgICAgfCAgIHNpemUgICAgfCAgW2orMV0KLSAqICAgICAgICAgZnJlZSBtdWx0aSAgICArLSstKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKwotICogICAgICAgICB1bml0IGJsb2NrICAgIHwgICAgICAgICAgICAgIC4uLiAgICAgICAgICB8ICAuLi4KLSAqICAgICAgICAgICAgfCAgICAgICAgICArLSstKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKwotICogICAgICAgICAgICB8ICAgICAgICAgIHwxfDF8ICAgICAgICAgICB8ICAgc2l6ZSAgICB8Ci0gKiAgICAgICAgICAgPi0tLS0tLS0tICArLSstKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKwotICogICBzaW5nbGUgZnJlZSB1bml0ICAgIHwxfDB8ICAgcHJldiAgICB8ICAgbmV4dCAgICB8Ci0gKiAgICAgICAgICAgPi0tLS0tLS0tICArLSstKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKwotICogICBzaW5nbGUgdXNlZCB1bml0ICAgIHwwfDB8ICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAgICAgICAgICAgPi0tLS0tLS0tICArLSstKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICogICAgICAgICAgICB8ICAgICAgICAgIHwwfDF8ICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAgICAgICAgICAgIHwgICAgICAgICAgKy0rLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsKLSAqICAgICAgICAgICAgfCAgICAgICAgICB8MHwxfCAgICAgICAgICAgfCAgIHNpemUgICAgfAotICogICAgICAgICB1c2VkIG11bHRpICAgICstKy0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCi0gKiAgICAgICAgIHVuaXQgYmxvY2sgICAgfCAgICAgICAgICAgICAgLi4uICAgICAgICAgIHwKLSAqICAgICAgICAgICAgfCAgICAgICAgICArLSstKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKwotICogICAgICAgICAgICB8ICAgICAgICAgIHwwfDF8ICAgICAgICAgICB8ICAgc2l6ZSAgICB8Ci0gKiAgICAgICAgICAgIFwtLS0tLS0tLSAgKy0rLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLi4KLSAqICAgICAgICAgICAgICAgICAgICAgICArLSstKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICogICBib3R0b20gc2VudGluZWwgICAgIHwwfDB8ICAgICAgICAgICAgICAgICAgICAgICB8ICBbTl0KLSAqICAgICAgICAgICAgICAgICAgICAgICArLSstKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICogPC9wcmU+Ci0gKiBUaGUgc2VudGluZWxzIHNlcnZlIGFzIGd1YXJkcyBhZ2FpbnN0IG91dCBvZiByYW5nZSBjb2FsZXNjaW5nCi0gKiBiZWNhdXNlIHRoZXkgYm90aCBhcHBlYXIgYXMgInVzZWQiIGJsb2NrcyBhbmQgc28gd2lsbCBuZXZlcgotICogY29hbGVzY2UuICBUaGUgdG9wIHNlbnRpbmVsIGFsc28gc2VydmVzIGFzIHRoZSBoZWFkIGFuZCB0YWlsIG9mCi0gKiB0aGUgZG91Ymx5IGxpbmtlZCBsaXN0IG9mIGZyZWUgYmxvY2tzLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlIGFic3RyYWN0IGNsYXNzIEJhc2VHZW5lcmljRnJlZUxpc3QgaW1wbGVtZW50cyBDb25zdGFudHMgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIFB1YmxpYyBpbnN0YW5jZSBtZXRob2RzCi0gICAqLwotCi0gIC8qKgotICAgKiBBbGxvY2F0ZSA8Y29kZT5zaXplPC9jb2RlPiB1bml0cy4gUmV0dXJuIHRoZSB1bml0IElECi0gICAqCi0gICAqIEBwYXJhbSBzaXplICBUaGUgbnVtYmVyIG9mIHVuaXRzIHRvIGJlIGFsbG9jYXRlZAotICAgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2YgdGhlIDxjb2RlPnNpemU8L2NvZGU+Ci0gICAqIGNvbnRpZ3VvdXMgdW5pdHMsIG9yIC0xIGlmIHRoZSByZXF1ZXN0IGNhbid0IGJlIHNhdGlzZmllZAotICAgKi8KLSAgcHVibGljIGZpbmFsIGludCBhbGxvYyhpbnQgc2l6ZSkgewotICAgIC8vIE5vdGU6IC0xIGlzIGJvdGggdGhlIGRlZmF1bHQgcmV0dXJuIHZhbHVlICphbmQqIHRoZSBzdGFydCBzZW50aW5lbCBpbmRleAotICAgIGludCB1bml0ID0gaGVhZDsgLy8gSEVBRCA9IC0xCi0gICAgaW50IHMgPSAwOwotICAgIHdoaWxlICgoKHVuaXQgPSBnZXROZXh0KHVuaXQpKSAhPSBoZWFkKSAmJiAoKHMgPSBnZXRTaXplKHVuaXQpKSA8IHNpemUpKTsKLQotICAgIHJldHVybiAodW5pdCA9PSBoZWFkKSA/IEZBSUxVUkUgOiBhbGxvYyhzaXplLCB1bml0LCBzKTsKLSAgfQotCi0gIC8qKgotICAgKiBXb3VsZCBhbiBhbGxvY2F0aW9uIG9mIDxjb2RlPnNpemU8L2NvZGU+IHVuaXRzIHN1Y2NlZWQ/Ci0gICAqCi0gICAqIEBwYXJhbSBzaXplIFRoZSBudW1iZXIgb2YgdW5pdHMgdG8gdGVzdCBmb3IKLSAgICogQHJldHVybiBUcnVlIGlmIHN1Y2ggYSByZXF1ZXN0IGNvdWxkIGJlIHNhdGlzZmllZC4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGNvdWxkQWxsb2MoaW50IHNpemUpIHsKLSAgICAvLyBOb3RlOiAtMSBpcyBib3RoIHRoZSBkZWZhdWx0IHJldHVybiB2YWx1ZSAqYW5kKiB0aGUgc3RhcnQgc2VudGluZWwgaW5kZXgKLSAgICBpbnQgdW5pdCA9IGhlYWQ7IC8vIEhFQUQgPSAtMQotICAgIHdoaWxlICgoKHVuaXQgPSBnZXROZXh0KHVuaXQpKSAhPSBoZWFkKSAmJiAoZ2V0U2l6ZSh1bml0KSA8IHNpemUpKTsKLQotICAgIHJldHVybiAodW5pdCAhPSBoZWFkKTsKLSAgfQotCi0gIC8qKgotICAgKiBBbGxvY2F0ZSA8Y29kZT5zaXplPC9jb2RlPiB1bml0cy4gUmV0dXJuIHRoZSB1bml0IElECi0gICAqCi0gICAqIEBwYXJhbSBzaXplICBUaGUgbnVtYmVyIG9mIHVuaXRzIHRvIGJlIGFsbG9jYXRlZAotICAgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2YgdGhlIDxjb2RlPnNpemU8L2NvZGU+Ci0gICAqIGNvbnRpZ3VvdXMgdW5pdHMsIG9yIC0xIGlmIHRoZSByZXF1ZXN0IGNhbid0IGJlIHNhdGlzZmllZAotICAgKi8KLSAgcHVibGljIGZpbmFsIGludCBhbGxvYyhpbnQgc2l6ZSwgaW50IHVuaXQpIHsKLSAgICBpbnQgcyA9IDA7Ci0KLSAgICBpZiAoZ2V0RnJlZSh1bml0KSAmJiAocyA9IGdldFNpemUodW5pdCkpID49IHNpemUpCi0gICAgICByZXR1cm4gYWxsb2Moc2l6ZSwgdW5pdCwgcyk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIEZBSUxVUkU7Ci0gIH0KLQotICAvKioKLSAgICogQWxsb2NhdGUgPGNvZGU+c2l6ZTwvY29kZT4gdW5pdHMuIFJldHVybiB0aGUgdW5pdCBJRAotICAgKgotICAgKiBAcGFyYW0gc2l6ZSAgVGhlIG51bWJlciBvZiB1bml0cyB0byBiZSBhbGxvY2F0ZWQKLSAgICogQHJldHVybiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IG9mIHRoZSA8Y29kZT5zaXplPC9jb2RlPgotICAgKiBjb250aWd1b3VzIHVuaXRzLCBvciAtMSBpZiB0aGUgcmVxdWVzdCBjYW4ndCBiZSBzYXRpc2ZpZWQKLSAgICovCi0gIHByaXZhdGUgaW50IGFsbG9jKGludCBzaXplLCBpbnQgdW5pdCwgaW50IHVuaXRTaXplKSB7Ci0gICAgaWYgKHVuaXRTaXplID49IHNpemUpIHsKLSAgICAgIGlmICh1bml0U2l6ZSA+IHNpemUpCi0gICAgICAgIHNwbGl0KHVuaXQsIHNpemUpOwotICAgICAgcmVtb3ZlRnJvbUZyZWUodW5pdCk7Ci0gICAgICBzZXRGcmVlKHVuaXQsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBpZiAoREVCVUcpIGRiZ1ByaW50RnJlZSgpOwotCi0gICAgcmV0dXJuIHVuaXQ7Ci0gIH0KLQotICAvKioKLSAgICogRnJlZSBhIHByZXZpb3VzbHkgYWxsb2NhdGVkIGNvbnRpZ3VvdXMgbHVtcCBvZiB1bml0cy4KLSAgICoKLSAgICogQHBhcmFtIHVuaXQgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCB1bml0LgotICAgKiBAcmV0dXJuIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgdW5pdCB3aGljaCB3YXMgZnJlZWQuCi0gICAqLwotICBwdWJsaWMgZmluYWwgaW50IGZyZWUoaW50IHVuaXQpIHsKLSAgICByZXR1cm4gZnJlZSh1bml0LCBmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogRnJlZSBhIHByZXZpb3VzbHkgYWxsb2NhdGVkIGNvbnRpZ3VvdXMgbHVtcCBvZiB1bml0cy4KLSAgICoKLSAgICogQHBhcmFtIHVuaXQgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCB1bml0LgotICAgKiBAcGFyYW0gcmV0dXJuQ29hbGVzY2VkU2l6ZSBpZiB0cnVlLCByZXR1cm4gdGhlIGNvYWxlc2NlZCBzaXplCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiB1bml0cyBmcmVlZC4gaWYgcmV0dXJuQ29hbGVzY2VkU2l6ZSBpcwotICAgKiAgZmFsc2UsIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgdW5pdCB3aGljaCB3YXMgZnJlZWQuICBPdGhlcndpc2UKLSAgICogICByZXR1cm4gdGhlIHNpemUgb2YgdGhlIHVuaXQgbm93IGF2YWlsYWJsZSAodGhlIGNvYWxlc2NlZCBzaXplKQotICAgKi8KLSAgcHVibGljIGZpbmFsIGludCBmcmVlKGludCB1bml0LCBib29sZWFuIHJldHVybkNvYWxlc2NlZFNpemUpIHsKLSAgICBpbnQgZnJlZWQgPSBnZXRTaXplKHVuaXQpOwotICAgIGludCBsZWZ0ID0gZ2V0TGVmdCh1bml0KTsKLSAgICBpbnQgc3RhcnQgPSBpc0NvYWxlc2NhYmxlKHVuaXQpICYmIGdldEZyZWUobGVmdCkgPyBsZWZ0IDogdW5pdDsKLSAgICBpbnQgcmlnaHQgPSBnZXRSaWdodCh1bml0KTsKLSAgICBpbnQgZW5kID0gaXNDb2FsZXNjYWJsZShyaWdodCkgJiYgZ2V0RnJlZShyaWdodCkgPyByaWdodCA6IHVuaXQ7Ci0gICAgaWYgKHN0YXJ0ICE9IGVuZCkKLSAgICAgIGNvYWxlc2NlKHN0YXJ0LCBlbmQpOwotCi0gICAgaWYgKHJldHVybkNvYWxlc2NlZFNpemUpCi0gICAgICBmcmVlZCA9IGdldFNpemUoc3RhcnQpOwotICAgIGFkZFRvRnJlZShzdGFydCk7Ci0KLSAgICBpZiAoREVCVUcpIGRiZ1ByaW50RnJlZSgpOwotICAgIHJldHVybiBmcmVlZDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIHNwZWNpZmllZCBsdW1wIG9mIHVuaXRzCi0gICAqCi0gICAqIEBwYXJhbSB1bml0IFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgdW5pdCBpbiB0aGUgbHVtcC4KLSAgICogQHJldHVybiBUaGUgc2l6ZSBvZiB0aGUgbHVtcCwgaW4gdW5pdHMuCi0gICAqLwotICBwdWJsaWMgZmluYWwgaW50IHNpemUoaW50IHVuaXQpIHsKLSAgICByZXR1cm4gZ2V0U2l6ZSh1bml0KTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIFByaXZhdGUgZmllbGRzIGFuZCBtZXRob2RzCi0gICAqLwotCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3IGhlYXAuICBGYWJyaWNhdGUgYSBmcmVlIGxpc3QgZW50cnkgY29udGFpbmluZwotICAgKiBldmVyeXRoaW5nCi0gICAqCi0gICAqIEBwYXJhbSB1bml0cyBUaGUgbnVtYmVyIG9mIHVuaXRzIGluIHRoZSBoZWFwCi0gICAqLwotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0aWFsaXplSGVhcChpbnQgdW5pdHMpIHsKLSAgICBpbml0aWFsaXplSGVhcCh1bml0cywgdW5pdHMpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemUgYSBuZXcgaGVhcC4gIEZhYnJpY2F0ZSBhIGZyZWUgbGlzdCBlbnRyeSBjb250YWluaW5nCi0gICAqIGV2ZXJ5dGhpbmcKLSAgICoKLSAgICogQHBhcmFtIHVuaXRzIFRoZSBudW1iZXIgb2YgdW5pdHMgaW4gdGhlIGhlYXAKLSAgICovCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXRpYWxpemVIZWFwKGludCB1bml0cywgaW50IGdyYWluKSB7Ci0gICAgLy8gSW5pdGlhbGl6ZSB0aGUgc2VudGluZWxzCi0gICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gaGVhZHM7IGkrKykKLSAgICAgIHNldFNlbnRpbmVsKC1pKTsKLSAgICBzZXRTZW50aW5lbCh1bml0cyk7Ci0KLSAgICAvLyBjcmVhdGUgdGhlIGZyZWUgbGlzdCBpdGVtCi0gICAgaW50IG9mZnNldCA9IHVuaXRzICUgZ3JhaW47Ci0gICAgaW50IGN1cnNvciA9IHVuaXRzIC0gb2Zmc2V0OwotICAgIGlmIChvZmZzZXQgPiAwKSB7Ci0gICAgICBzZXRTaXplKGN1cnNvciwgb2Zmc2V0KTsKLSAgICAgIGFkZFRvRnJlZShjdXJzb3IpOwotICAgIH0KLSAgICBjdXJzb3IgLT0gZ3JhaW47Ci0gICAgd2hpbGUgKGN1cnNvciA+PSAwKSB7Ci0gICAgICBzZXRTaXplKGN1cnNvciwgZ3JhaW4pOwotICAgICAgYWRkVG9GcmVlKGN1cnNvcik7Ci0gICAgICBjdXJzb3IgLT0gZ3JhaW47Ci0gICAgfQotICAgIGlmIChERUJVRykgZGJnUHJpbnRGcmVlKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmVkdWNlIGEgbHVtcCBvZiB1bml0cyB0byBzaXplLCBmcmVlaW5nIGFueSBleGNlc3MuCi0gICAqCi0gICAqIEBwYXJhbSB1bml0IFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgdW5pdAotICAgKiBAcGFyYW0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmlyc3QgcGFydAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHNwbGl0KGludCB1bml0LCBpbnQgc2l6ZSkgewotICAgIGludCBiYXNlc2l6ZSA9IGdldFNpemUodW5pdCk7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoYmFzZXNpemUgPiBzaXplKTsKLSAgICBzZXRTaXplKHVuaXQsIHNpemUpOwotICAgIHNldFNpemUodW5pdCArIHNpemUsIGJhc2VzaXplIC0gc2l6ZSk7Ci0gICAgYWRkVG9GcmVlKHVuaXQgKyBzaXplKTsKLSAgICBpZiAoREVCVUcpIGRiZ1ByaW50RnJlZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvYWxlc2NlIHR3byBvciB0aHJlZSBjb250aWd1b3VzIGx1bXBzIG9mIHVuaXRzLCByZW1vdmluZyBzdGFydAotICAgKiBhbmQgZW5kIGx1bXBzIGZyb20gdGhlIGZyZWUgbGlzdCBhcyBuZWNlc3NhcnkuCi0gICAqIEBwYXJhbSBzdGFydCBUaGUgaW5kZXggb2YgdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCBsdW1wCi0gICAqIEBwYXJhbSBlbmQgVGhlIGluZGV4IG9mIHRoZSBzdGFydCBvZiB0aGUgbGFzdCBsdW1wCi0gICAqLwotICBwcml2YXRlIHZvaWQgY29hbGVzY2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgaWYgKGdldEZyZWUoZW5kKSkKLSAgICAgIHJlbW92ZUZyb21GcmVlKGVuZCk7Ci0gICAgaWYgKGdldEZyZWUoc3RhcnQpKQotICAgICAgcmVtb3ZlRnJvbUZyZWUoc3RhcnQpOwotCi0gICAgc2V0U2l6ZShzdGFydCwgZW5kIC0gc3RhcnQgKyBnZXRTaXplKGVuZCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIGx1bXAgb2YgdW5pdHMgdG8gdGhlIGZyZWUgbGlzdAotICAgKgotICAgKiBAcGFyYW0gdW5pdCBUaGUgZmlyc3QgdW5pdCBpbiB0aGUgbHVtcCBvZiB1bml0cyB0byBiZSBhZGRlZAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGFkZFRvRnJlZShpbnQgdW5pdCkgewotICAgIHNldEZyZWUodW5pdCwgdHJ1ZSk7Ci0gICAgaW50IG5leHQgPSBnZXROZXh0KGhlYWQpOwotICAgIHNldE5leHQodW5pdCwgbmV4dCk7Ci0gICAgc2V0TmV4dChoZWFkLCB1bml0KTsKLSAgICBzZXRQcmV2KHVuaXQsIGhlYWQpOwotICAgIHNldFByZXYobmV4dCwgdW5pdCk7Ci0gIH0KLQotICAvKioKLSAgICogUmVtb3ZlIGEgbHVtcCBvZiB1bml0cyBmcm9tIHRoZSBmcmVlIGxpc3QKLSAgICoKLSAgICogQHBhcmFtIHVuaXQgVGhlIGZpcnN0IHVuaXQgaW4gdGhlIGx1bXAgb2YgdW5pdHMgdG8gYmUgcmVtb3ZlZAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHJlbW92ZUZyb21GcmVlKGludCB1bml0KSB7Ci0gICAgaW50IG5leHQgPSBnZXROZXh0KHVuaXQpOwotICAgIGludCBwcmV2ID0gZ2V0UHJldih1bml0KTsKLSAgICBzZXROZXh0KHByZXYsIG5leHQpOwotICAgIHNldFByZXYobmV4dCwgcHJldik7Ci0gICAgaWYgKERFQlVHKSBkYmdQcmludEZyZWUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGx1bXAgdG8gdGhlICJyaWdodCIgb2YgdGhlIGN1cnJlbnQgbHVtcCAoaS5lLiAiYmVsb3ciIGl0KQotICAgKgotICAgKiBAcGFyYW0gdW5pdCBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IHVuaXQgaW4gdGhlIGx1bXAgaW4gcXVlc3Rpb24KLSAgICogQHJldHVybiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IHVuaXQgaW4gdGhlIGx1bXAgdG8gdGhlCi0gICAqICJyaWdodCIvImJlbG93IiB0aGUgbHVtcCBpbiBxdWVzdGlvbi4KLSAgICovCi0gIHByaXZhdGUgaW50IGdldFJpZ2h0KGludCB1bml0KSB7Ci0gICAgcmV0dXJuIHVuaXQgKyBnZXRTaXplKHVuaXQpOwotICB9Ci0KLQotICAvKioKLSAgICogUHJpbnQgdGhlIGZyZWUgbGlzdCAoZm9yIGRlYnVnZ2luZyBwdXJwb3NlcykKLSAgICovCi0gIHZvaWQgZGJnUHJpbnRGcmVlKCkgewotICAgIGlmIChERUJVRykgewotICAgICAgTG9nLndyaXRlKCJGTFsiKTsKLSAgICAgIGludCBpID0gaGVhZDsKLSAgICAgIHdoaWxlICgoaSA9IGdldE5leHQoaSkpICE9IGhlYWQpIHsKLSAgICAgICAgYm9vbGVhbiBmID0gZ2V0RnJlZShpKTsKLSAgICAgICAgaW50IHMgPSBnZXRTaXplKGkpOwotICAgICAgICBpZiAoIWYpCi0gICAgICAgICAgTG9nLndyaXRlKCItPiIpOwotICAgICAgICBMb2cud3JpdGUoaSk7Ci0gICAgICAgIGlmICghZikKLSAgICAgICAgICBMb2cud3JpdGUoIjwtIik7Ci0gICAgICAgIExvZy53cml0ZSgiKCIpOwotICAgICAgICBMb2cud3JpdGUocyk7Ci0gICAgICAgIExvZy53cml0ZSgiKSIpOwotICAgICAgICBMb2cud3JpdGUoIiAiKTsKLSAgICAgICAgTG9nLmZsdXNoKCk7Ci0gICAgICB9Ci0gICAgICBMb2cud3JpdGVsbigiXUZMIik7Ci0gICAgfQotICB9Ci0KLSAgYWJzdHJhY3Qgdm9pZCBzZXRTZW50aW5lbChpbnQgdW5pdCk7Ci0gIGFic3RyYWN0IGludCBnZXRTaXplKGludCB1bml0KTsKLSAgYWJzdHJhY3Qgdm9pZCBzZXRTaXplKGludCB1bml0LCBpbnQgc2l6ZSk7Ci0gIGFic3RyYWN0IGJvb2xlYW4gZ2V0RnJlZShpbnQgdW5pdCk7Ci0gIGFic3RyYWN0IHZvaWQgc2V0RnJlZShpbnQgdW5pdCwgYm9vbGVhbiBpc0ZyZWUpOwotICBhYnN0cmFjdCBpbnQgZ2V0TmV4dChpbnQgdW5pdCk7Ci0gIGFic3RyYWN0IHZvaWQgc2V0TmV4dChpbnQgdW5pdCwgaW50IG5leHQpOwotICBhYnN0cmFjdCBpbnQgZ2V0UHJldihpbnQgdW5pdCk7Ci0gIGFic3RyYWN0IHZvaWQgc2V0UHJldihpbnQgdW5pdCwgaW50IHByZXYpOwotICBhYnN0cmFjdCBpbnQgZ2V0TGVmdChpbnQgdW5pdCk7Ci0gIGFic3RyYWN0IGJvb2xlYW4gaXNDb2FsZXNjYWJsZShpbnQgdW5pdCk7Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBSUxVUkUgPSAtMTsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0hFQURTID0gMTI4OyAvLyBzb21ld2hhdCBhcmJpdHJhcnkKLQotICBwcm90ZWN0ZWQgaW50IGhlYWRzID0gMTsKLSAgcHJvdGVjdGVkIGludCBoZWFkID0gLWhlYWRzOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L0NhbGxTaXRlLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvQ2FsbFNpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU1MDE2Yy4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvQ2FsbFNpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5OwotCi0vKgotICovCi1wdWJsaWMgY2xhc3MgQ2FsbFNpdGUgewotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L0NvbnN0YW50cy5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTdmYjExLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eTsKLQotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuYWxsb2MuRW1iZWRkZWRNZXRhRGF0YTsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotLyoqCi0gKiBNTVRrIGZvbGxvd3MgdGhlIHBhdHRlcm4gc2V0IGJ5IEppa2VzIFJWTSBmb3IgZGVmaW5pbmcgc2l6ZXMgb2YKLSAqIHByaW1pdGl2ZSB0eXBlcyB0aHVzOgotICoKLSAqIDxwcmU+Ci0gKiBzdGF0aWMgZmluYWwgaW50IExPR19CWVRFU19JTl9JTlQgPSAyOwotICogc3RhdGljIGZpbmFsIGludCBCWVRFU19JTl9JTlQgPSAxPDxMT0dfQllURVNfSU5fSU5UOwotICogc3RhdGljIGZpbmFsIGludCBMT0dfQklUU19JTl9JTlQgPSBMT0dfQklUU19JTl9CWVRFICsgTE9HX0JZVEVTX0lOX0lOVDsKLSAqIHN0YXRpYyBmaW5hbCBpbnQgQklUU19JTl9JTlQgPSAxPDxMT0dfQklUU19JTl9JTlQ7Ci0gKiA8L3ByZT4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb25zdGFudHMgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIE1NVGsgY29uc3RhbnRzCi0gICAqLwotICBpbnQgSU5TVEFOQ0VfRklFTEQgPSAwOwotICBpbnQgQVJSQVlfRUxFTUVOVCA9IDE7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBHZW5lcmljIHNpemVzCi0gICAqLwotICBieXRlIExPR19CWVRFU19JTl9CWVRFID0gMDsKLSAgaW50IEJZVEVTX0lOX0JZVEUgPSAxOwotICBieXRlIExPR19CSVRTX0lOX0JZVEUgPSAzOwotICBpbnQgQklUU19JTl9CWVRFID0gMSA8PCBMT0dfQklUU19JTl9CWVRFOwotCi0gIGJ5dGUgTE9HX0JZVEVTX0lOX01CWVRFID0gMjA7Ci0gIGludCBCWVRFU19JTl9NQllURSA9IDEgPDwgTE9HX0JZVEVTX0lOX01CWVRFOwotCi0gIGJ5dGUgTE9HX0JZVEVTX0lOX0tCWVRFID0gMTA7Ci0gIGludCBCWVRFU19JTl9LQllURSA9IDEgPDwgTE9HX0JZVEVTX0lOX0tCWVRFOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENhcmQgc2Nhbm5pbmcKLSAgICovCi0gIGJvb2xlYW4gU1VQUE9SVF9DQVJEX1NDQU5OSU5HID0gZmFsc2U7Ci0gIGludCBMT0dfQ0FSRF9NRVRBX1NJWkUgPSAyOy8vIGVhY2ggY2FyZCBjb25zdW1lcyBmb3VyIGJ5dGVzIG9mIG1ldGFkYXRhCi0gIGludCBMT0dfQ0FSRF9VTklUUyA9IDEwOyAgLy8gbnVtYmVyIG9mIHVuaXRzIHRyYWNrZWQgcGVyIGNhcmQKLSAgaW50IExPR19DQVJEX0dSQUlOID0gMDsgICAvLyB0cmFjayBhdCBieXRlIGdyYWluLCBzYXZlIHNoaWZ0aW5nCi0gIGludCBMT0dfQ0FSRF9CWVRFUyA9IExPR19DQVJEX1VOSVRTICsgTE9HX0NBUkRfR1JBSU47Ci0gIGludCBMT0dfQ0FSRF9NRVRBX0JZVEVTID0gRW1iZWRkZWRNZXRhRGF0YS5MT0dfQllURVNfSU5fUkVHSU9OIC0gTE9HX0NBUkRfQllURVMgKyBMT0dfQ0FSRF9NRVRBX1NJWkU7Ci0gIGludCBMT0dfQ0FSRF9NRVRBX1BBR0VTID0gTE9HX0NBUkRfTUVUQV9CWVRFUyAtIFZNLkxPR19CWVRFU19JTl9QQUdFOwotICBpbnQgQ0FSRF9NRVRBX1BBR0VTX1BFUl9SRUdJT04gPSBTVVBQT1JUX0NBUkRfU0NBTk5JTkcgPyAoMTw8TE9HX0NBUkRfTUVUQV9QQUdFUykgOiAwOwotICBpbnQgQ0FSRF9NQVNLID0gKDE8PExPR19DQVJEX0JZVEVTKSAtIDE7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBKYXZhLXNwZWNpZmljIHNpemVzIGN1cnJlbnRseSByZXF1aXJlZCBieSBNTVRrCi0gICAqCi0gICAqIFRPRE8gTU1UayBzaG91bGQgcmVhbGx5IGJlY29tZSBpbmRlcGVuZGVudCBvZiB0aGVzZSBKYXZhIHR5cGVzCi0gICAqLwotICBieXRlIExPR19CWVRFU19JTl9DSEFSPSAxOwotICBpbnQgQllURVNfSU5fQ0hBUiA9IDEgPDwgTE9HX0JZVEVTX0lOX0NIQVI7Ci0gIGJ5dGUgTE9HX0JJVFNfSU5fQ0hBUiA9IExPR19CSVRTX0lOX0JZVEUgKyBMT0dfQllURVNfSU5fQ0hBUjsKLSAgaW50IEJJVFNfSU5fQ0hBUiA9IDEgPDwgTE9HX0JJVFNfSU5fQ0hBUjsKLQotICBieXRlIExPR19CWVRFU19JTl9TSE9SVCA9IDE7Ci0gIGludCBCWVRFU19JTl9TSE9SVCA9IDEgPDwgTE9HX0JZVEVTX0lOX1NIT1JUOwotICBieXRlIExPR19CSVRTX0lOX1NIT1JUID0gTE9HX0JJVFNfSU5fQllURSArIExPR19CWVRFU19JTl9TSE9SVDsKLSAgaW50IEJJVFNfSU5fU0hPUlQgPSAxIDw8IExPR19CSVRTX0lOX1NIT1JUOwotCi0gIGJ5dGUgTE9HX0JZVEVTX0lOX0lOVCA9IDI7Ci0gIGludCBCWVRFU19JTl9JTlQgPSAxIDw8IExPR19CWVRFU19JTl9JTlQ7Ci0gIGJ5dGUgTE9HX0JJVFNfSU5fSU5UID0gTE9HX0JJVFNfSU5fQllURSArIExPR19CWVRFU19JTl9JTlQ7Ci0gIGludCBCSVRTX0lOX0lOVCA9IDEgPDwgTE9HX0JJVFNfSU5fSU5UOwotCi0gIGludCBNQVhfSU5UID0gMHg3ZmZmZmZmZjsKLSAgaW50IE1JTl9JTlQgPSAweDgwMDAwMDAwOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIFZNLVNwZWNpZmljIHNpemVzCi0gICAqLwotICBieXRlIExPR19CWVRFU19JTl9BRERSRVNTID0gVk0uTE9HX0JZVEVTX0lOX0FERFJFU1M7Ci0gIGludCBCWVRFU19JTl9BRERSRVNTID0gMSA8PCBMT0dfQllURVNfSU5fQUREUkVTUzsKLSAgaW50IExPR19CSVRTX0lOX0FERFJFU1MgPSBMT0dfQklUU19JTl9CWVRFICsgTE9HX0JZVEVTX0lOX0FERFJFU1M7Ci0gIGludCBCSVRTX0lOX0FERFJFU1MgPSAxIDw8IExPR19CSVRTX0lOX0FERFJFU1M7Ci0KLSAgLy8gTm90ZSB0aGF0IGluIE1NVGsgd2UgY3VycmVudGx5IGRlZmluZSBXT1JEICYgQUREUkVTUyB0byBiZSB0aGUgc2FtZSBzaXplCi0gIGJ5dGUgTE9HX0JZVEVTX0lOX1dPUkQgPSBMT0dfQllURVNfSU5fQUREUkVTUzsKLSAgaW50IEJZVEVTX0lOX1dPUkQgPSAxIDw8IExPR19CWVRFU19JTl9XT1JEOwotICBpbnQgTE9HX0JJVFNfSU5fV09SRCA9IExPR19CSVRTX0lOX0JZVEUgKyBMT0dfQllURVNfSU5fV09SRDsKLSAgaW50IEJJVFNfSU5fV09SRCA9IDEgPDwgTE9HX0JJVFNfSU5fV09SRDsKLQotICBieXRlIExPR19CWVRFU19JTl9QQUdFID0gVk0uTE9HX0JZVEVTX0lOX1BBR0U7Ci0gIGludCBCWVRFU19JTl9QQUdFID0gMSA8PCBMT0dfQllURVNfSU5fUEFHRTsKLSAgaW50IExPR19CSVRTX0lOX1BBR0UgPSBMT0dfQklUU19JTl9CWVRFICsgTE9HX0JZVEVTX0lOX1BBR0U7Ci0gIGludCBCSVRTX0lOX1BBR0UgPSAxIDw8IExPR19CSVRTX0lOX1BBR0U7Ci0KLSAgLyogQXNzdW1lIGJ5dGUtYWRkcmVzc2FiaWxpdHkgKi8KLSAgYnl0ZSBMT0dfQllURVNfSU5fQUREUkVTU19TUEFDRSA9IChieXRlKSBCSVRTX0lOX0FERFJFU1M7Ci0KLSAgLyoqCi0gICAqIFRoaXMgdmFsdWUgc3BlY2lmaWVzIHRoZSA8aT5taW5pbXVtPC9pPiBhbGxvY2F0aW9uIGFsaWdubWVudAotICAgKiByZXF1aXJlbWVudCBvZiB0aGUgVk0uICBXaGVuIG1ha2luZyBhbGxvY2F0aW9uIHJlcXVlc3RzLCBib3RoCi0gICAqIDxjb2RlPmFsaWduPC9jb2RlPiBhbmQgPGNvZGU+b2Zmc2V0PC9jb2RlPiBtdXN0IGJlIG11bHRpcGxlcyBvZgotICAgKiA8Y29kZT5NSU5fQUxJR05NRU5UPC9jb2RlPi4KLSAgICoKLSAgICogVGhpcyB2YWx1ZSBpcyByZXF1aXJlZCB0byBiZSBhIHBvd2VyIG9mIDIuCi0gICAqLwotICBieXRlIExPR19NSU5fQUxJR05NRU5UID0gVk0uTE9HX01JTl9BTElHTk1FTlQ7Ci0gIGludCBNSU5fQUxJR05NRU5UID0gMSA8PCBMT0dfTUlOX0FMSUdOTUVOVDsKLQotICAvKioKLSAgICogVGhlIG1heGltdW0gYWxpZ25tZW50IHJlcXVlc3QgdGhlIHZtIHdpbGwgbWFrZS4gVGhpcyBtdXN0IGJlIGEKLSAgICogcG93ZXIgb2YgdHdvIG11bHRpcGxlIG9mIHRoZSBtaW5pbXVtIGFsaWdubWVudC4KLSAgICovCi0gIGludCBNQVhfQUxJR05NRU5UID0gTUlOX0FMSUdOTUVOVDw8Vk0uTUFYX0FMSUdOTUVOVF9TSElGVDsKLQotICAvKioKLSAgICogVGhlIFZNIHdpbGwgYWRkIGF0IG1vc3QgdGhpcyB2YWx1ZSBtaW51cyBCWVRFU19JTl9JTlQgYnl0ZXMgb2YKLSAgICogcGFkZGluZyB0byB0aGUgZnJvbnQgb2YgYW4gb2JqZWN0IHRoYXQgaXQgcGxhY2VzIGluIGEgcmVnaW9uIG9mCi0gICAqIG1lbW9yeS4gVGhpcyB2YWx1ZSBtdXN0IGJlIGEgcG93ZXIgb2YgMi4KLSAgICovCi0gIGludCBNQVhfQllURVNfUEFERElORyA9IFZNLk1BWF9CWVRFU19QQURESU5HOwotCi0gIC8qKgotICAgKiBUaGUgVk0gd2lsbCBhZGQgYXQgbW9zdCB0aGlzIHZhbHVlIG1pbnVzIEJZVEVTX0lOX0lOVCBieXRlcyBvZgotICAgKiBwYWRkaW5nIHRvIHRoZSBmcm9udCBvZiBhbiBvYmplY3QgdGhhdCBpdCBwbGFjZXMgaW4gYSByZWdpb24gb2YKLSAgICogbWVtb3J5LiBUaGlzIHZhbHVlIG11c3QgYmUgYSBwb3dlciBvZiAyLgotICAgKi8KLSAgaW50IEFMSUdOTUVOVF9WQUxVRSA9IFZNLkFMSUdOTUVOVF9WQUxVRTsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9Db252ZXJzaW9ucy5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L0NvbnZlcnNpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZTkzY2MuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L0NvbnZlcnNpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHk7Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmhlYXAuKjsKLQotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKgotIGltcG9ydCBvcmcuamlrZXNydm0uT2Zmc2V0OwotICogQ29udmVyc2lvbnMgYmV0d2VlbiBkaWZmZXJlbnQgdW5pdHMuCi0gKi8KLUBVbmludGVycnVwdGlibGUgcHVibGljIGNsYXNzIENvbnZlcnNpb25zIGltcGxlbWVudHMgQ29uc3RhbnRzIHsKLQotICAvLyBwdWJsaWMgc3RhdGljIEFkZHJlc3Mgcm91bmREb3duVk0oQWRkcmVzcyBhZGRyKSB7Ci0gIC8vICAgcmV0dXJuIHJvdW5kRG93bihhZGRyLnRvV29yZCgpLCBWTVJlc291cmNlLkxPR19CWVRFU19JTl9SRUdJT04pLnRvQWRkcmVzcygpOwotICAvLyB9Ci0KLSAgLy8gcHVibGljIHN0YXRpYyBFeHRlbnQgcm91bmREb3duVk0oRXh0ZW50IGJ5dGVzKSB7Ci0gIC8vICAgcmV0dXJuIHJvdW5kRG93bihieXRlcy50b1dvcmQoKSwgVk1SZXNvdXJjZS5MT0dfQllURVNfSU5fUkVHSU9OKS50b0V4dGVudCgpOwotICAvLyB9Ci0KLSAgcHVibGljIHN0YXRpYyBBZGRyZXNzIHJvdW5kRG93bk1CKEFkZHJlc3MgYWRkcikgewotICAgIHJldHVybiByb3VuZERvd24oYWRkci50b1dvcmQoKSwgTE9HX0JZVEVTX0lOX01CWVRFKS50b0FkZHJlc3MoKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgRXh0ZW50IHJvdW5kRG93bk1CKEV4dGVudCBieXRlcykgewotICAgIHJldHVybiByb3VuZERvd24oYnl0ZXMudG9Xb3JkKCksIExPR19CWVRFU19JTl9NQllURSkudG9FeHRlbnQoKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFdvcmQgcm91bmREb3duKFdvcmQgdmFsdWUsIGludCBsb2dCYXNlKSB7Ci0gICAgV29yZCBtYXNrID0gV29yZC5vbmUoKS5sc2gobG9nQmFzZSkubWludXMoV29yZC5vbmUoKSkubm90KCk7Ci0gICAgcmV0dXJuIHZhbHVlLmFuZChtYXNrKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgaW50IHJvdW5kRG93bihpbnQgdmFsdWUsIGludCBhbGlnbm1lbnQpIHsKLSAgICByZXR1cm4gdmFsdWUgJiB+KGFsaWdubWVudCAtIDEpOwotICB9Ci0KLSAgLy8gUm91bmQgdXAgKGlmIG5lY2Vzc2FyeSkKLSAgLy8KLSAgcHVibGljIHN0YXRpYyBpbnQgTUJUb1BhZ2VzKGludCBtZWdzKSB7Ci0gICAgaWYgKExPR19CWVRFU19JTl9QQUdFIDw9IExPR19CWVRFU19JTl9NQllURSkKLSAgICAgIHJldHVybiAobWVncyA8PCAoTE9HX0JZVEVTX0lOX01CWVRFIC0gTE9HX0JZVEVTX0lOX1BBR0UpKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gKG1lZ3MgKyAoKEJZVEVTX0lOX1BBR0UgPj4+IExPR19CWVRFU19JTl9NQllURSkgLSAxKSkgPj4+IChMT0dfQllURVNfSU5fUEFHRSAtIExPR19CWVRFU19JTl9NQllURSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGludCBieXRlc1RvTW1hcENodW5rc1VwKEV4dGVudCBieXRlcykgewotICAgIHJldHVybiBieXRlcy5wbHVzKE1tYXBwZXIuTU1BUF9DSFVOS19CWVRFUyAtIDEpLnRvV29yZCgpLnJzaGwoTW1hcHBlci5MT0dfTU1BUF9DSFVOS19CWVRFUykudG9JbnQoKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgaW50IHBhZ2VzVG9NbWFwQ2h1bmtzVXAoaW50IHBhZ2VzKSB7Ci0gICAgcmV0dXJuIGJ5dGVzVG9NbWFwQ2h1bmtzVXAocGFnZXNUb0J5dGVzKHBhZ2VzKSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGludCBhZGRyZXNzVG9NbWFwQ2h1bmtzRG93bihBZGRyZXNzIGFkZHIpIHsKLSAgICBXb3JkIGNodW5rID0gYWRkci50b1dvcmQoKS5yc2hsKE1tYXBwZXIuTE9HX01NQVBfQ0hVTktfQllURVMpOwotICAgIHJldHVybiBjaHVuay50b0ludCgpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBpbnQgYWRkcmVzc1RvUGFnZXNEb3duKEFkZHJlc3MgYWRkcikgewotICAgIFdvcmQgY2h1bmsgPSBhZGRyLnRvV29yZCgpLnJzaGwoTE9HX0JZVEVTX0lOX1BBR0UpOwotICAgIHJldHVybiBjaHVuay50b0ludCgpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBpbnQgYWRkcmVzc1RvUGFnZXMoQWRkcmVzcyBhZGRyKSB7Ci0gICAgaW50IHBhZ2UgPSBhZGRyZXNzVG9QYWdlc0Rvd24oYWRkcik7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQocGFnZXNUb0FkZHJlc3MocGFnZSkuRVEoYWRkcikpOwotICAgIHJldHVybiBwYWdlOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBBZGRyZXNzIHBhZ2VzVG9BZGRyZXNzKGludCBwYWdlcykgewotICAgIHJldHVybiBXb3JkLmZyb21JbnRaZXJvRXh0ZW5kKHBhZ2VzKS5sc2goTE9HX0JZVEVTX0lOX1BBR0UpLnRvQWRkcmVzcygpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBpbnQgYWRkcmVzc1RvTW1hcENodW5rc1VwKEFkZHJlc3MgYWRkcikgewotICAgIFdvcmQgY2h1bmsgPSBhZGRyLnBsdXMoTW1hcHBlci5NTUFQX0NIVU5LX0JZVEVTIC0gMSkudG9Xb3JkKCkucnNobChNbWFwcGVyLkxPR19NTUFQX0NIVU5LX0JZVEVTKTsKLSAgICByZXR1cm4gY2h1bmsudG9JbnQoKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgRXh0ZW50IHBhZ2VzVG9CeXRlcyhpbnQgcGFnZXMpIHsKLSAgICByZXR1cm4gV29yZC5mcm9tSW50WmVyb0V4dGVuZChwYWdlcykubHNoKExPR19CWVRFU19JTl9QQUdFKS50b0V4dGVudCgpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBpbnQgcGFnZXNUb01CeXRlcyhpbnQgcGFnZXMpIHsKLSAgICByZXR1cm4gcGFnZXMgPj4gKExPR19CWVRFU19JTl9NQllURSAtIExPR19CWVRFU19JTl9QQUdFKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgaW50IHBhZ2VzVG9LQnl0ZXMoaW50IHBhZ2VzKSB7Ci0gICAgcmV0dXJuIHBhZ2VzIDw8IChMT0dfQllURVNfSU5fUEFHRSAtIExPR19CWVRFU19JTl9LQllURSk7Ci0gIH0KLQotICAvKioKLSAgICBAZGVwcmVjYXRlZCA6IHVzZSBpbnQgYnl0ZXNUb1BhZ2VzVXAoRXh0ZW50IGJ5dGVzKSBpZiBwb3NzaWJsZQotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHN0YXRpYyBpbnQgYnl0ZXNUb1BhZ2VzVXAoaW50IGJ5dGVzKSB7Ci0gICAgcmV0dXJuIGJ5dGVzVG9QYWdlc1VwKEV4dGVudC5mcm9tSW50WmVyb0V4dGVuZChieXRlcykpOwotICB9Ci0KLSAgLyoqCi0gICAgQGRlcHJlY2F0ZWQgOiB1c2UgaW50IGJ5dGVzVG9QYWdlc1VwKEV4dGVudCBieXRlcykgaWYgcG9zc2libGUKLSAgICovCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBzdGF0aWMgaW50IGJ5dGVzVG9QYWdlcyhpbnQgYnl0ZXMpIHsKLSAgICByZXR1cm4gYnl0ZXNUb1BhZ2VzKEV4dGVudC5mcm9tSW50WmVyb0V4dGVuZChieXRlcykpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBpbnQgYnl0ZXNUb1BhZ2VzVXAoRXh0ZW50IGJ5dGVzKSB7Ci0gICAgcmV0dXJuIGJ5dGVzLnBsdXMoQllURVNfSU5fUEFHRS0xKS50b1dvcmQoKS5yc2hsKExPR19CWVRFU19JTl9QQUdFKS50b0ludCgpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBpbnQgYnl0ZXNUb1BhZ2VzKEV4dGVudCBieXRlcykgewotICAgIGludCBwYWdlcyA9IGJ5dGVzVG9QYWdlc1VwKGJ5dGVzKTsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChwYWdlc1RvQWRkcmVzcyhwYWdlcykudG9Xb3JkKCkudG9FeHRlbnQoKS5FUShieXRlcykpOwotICAgIHJldHVybiBwYWdlczsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgaW50IGJ5dGVzVG9QYWdlcyhPZmZzZXQgYnl0ZXMpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIHsKLSAgICAgIGxvbmcgdmFsID0gYnl0ZXMudG9Mb25nKCk7Ci0gICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQodmFsID49IE1JTl9JTlQgJiYgdmFsIDw9IE1BWF9JTlQpOwotICAgIH0KLSAgICBpZiAoYnl0ZXMuc0dFKE9mZnNldC56ZXJvKCkpKQotICAgICAgcmV0dXJuIGJ5dGVzVG9QYWdlc1VwKEV4dGVudC5mcm9tSW50U2lnbkV4dGVuZChieXRlcy50b0ludCgpKSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIC1ieXRlc1RvUGFnZXNVcChFeHRlbnQuZnJvbUludFNpZ25FeHRlbmQoLWJ5dGVzLnRvSW50KCkpKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgQWRkcmVzcyBtbWFwQ2h1bmtzVG9BZGRyZXNzKGludCBjaHVuaykgewotICAgIHJldHVybiBXb3JkLmZyb21JbnRaZXJvRXh0ZW5kKGNodW5rKS5sc2goTW1hcHBlci5MT0dfTU1BUF9DSFVOS19CWVRFUykudG9BZGRyZXNzKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIEFkZHJlc3MgcGFnZUFsaWduKEFkZHJlc3MgYWRkcmVzcykgewotICAgIHJldHVybiBhZGRyZXNzLnRvV29yZCgpLnJzaGwoTE9HX0JZVEVTX0lOX1BBR0UpLmxzaChMT0dfQllURVNfSU5fUEFHRSkudG9BZGRyZXNzKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGludCBwYWdlQWxpZ24oaW50IHZhbHVlKSB7Ci0gICAgcmV0dXJuICh2YWx1ZT4+TE9HX0JZVEVTX0lOX1BBR0UpPDxMT0dfQllURVNfSU5fUEFHRTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BhZ2VBbGlnbmVkKEFkZHJlc3MgYWRkcmVzcykgewotICAgIHJldHVybiBwYWdlQWxpZ24oYWRkcmVzcykuRVEoYWRkcmVzcyk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQYWdlQWxpZ25lZChpbnQgdmFsdWUpIHsKLSAgICByZXR1cm4gcGFnZUFsaWduKHZhbHVlKSA9PSB2YWx1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L0N5Y2xlRGV0ZWN0b3IuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9DeWNsZURldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNDY4MzguLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L0N5Y2xlRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5OwotCi1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5vcHRpb25zLio7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qCi0gKi8KLUBVbmludGVycnVwdGlibGUgYWJzdHJhY3QgY2xhc3MgQ3ljbGVEZXRlY3RvciB7Ci0KLSAgc3RhdGljIHsKLSAgICBPcHRpb25zLmN5Y2xlRmlsdGVyVGhyZXNob2xkID0gbmV3IEN5Y2xlRmlsdGVyVGhyZXNob2xkKCk7Ci0gICAgT3B0aW9ucy5jeWNsZU1ldGFEYXRhTGltaXQgPSBuZXcgQ3ljbGVNZXRhRGF0YUxpbWl0KCk7Ci0gICAgT3B0aW9ucy5jeWNsZVRyaWdnZXJUaHJlc2hvbGQgPSBuZXcgQ3ljbGVUcmlnZ2VyVGhyZXNob2xkKCk7Ci0gIH0KLQotICBhYnN0cmFjdCBib29sZWFuIGNvbGxlY3RDeWNsZXMoYm9vbGVhbiBwcmltYXJ5LCBib29sZWFuIHRpbWUpOwotICBhYnN0cmFjdCB2b2lkIHBvc3NpYmxlQ3ljbGVSb290KE9iamVjdFJlZmVyZW5jZSBvYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L0RvdWJseUxpbmtlZExpc3QuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9Eb3VibHlMaW5rZWRMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YjA1ZmEuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L0RvdWJseUxpbmtlZExpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eTsKLQotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZ2NzcHkuZHJpdmVycy5BYnN0cmFjdERyaXZlcjsKLQotaW1wb3J0IG9yZy5tbXRrLnZtLkxvY2s7Ci1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogRklYTUUgVGhpcyBjbGFzcyBtdXN0IGJlIHJlLXdyaXR0ZW4gYXMgaXQgbWFrZXMgdGhlIGFzc3VtcHRpb24gdGhhdAotICogdGhlIGltcGxlbWVudGF0aW9uIGxhbmd1YWdlIChKYXZhKSBhbmQgdGhlIGxhbmd1YWdlIGJlaW5nCi0gKiBpbXBsZW1lbnRlZCBhcmUgdGhlIHNhbWUuICBUaGlzIGlzIHRydWUgaW4gdGhlIGNhc2Ugb2YgSmlrZXMgUlZNLAotICogYnV0IGl0IGlzIG5vdCB0cnVlIGZvciBhbnkgVk0gaW1wbGVtZW50aW5nIGEgbGFuZ3VhZ2Ugb3RoZXIgdGhhbgotICogSmF2YS4KLSAqCi0gKgotICogRWFjaCBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGEgZG91Ymx5LWxpbmtlZCBsaXN0LCBpbiB3aGljaAotICogZWFjaCBpdGVtIG9yIG5vZGUgaXMgYSBwaWVjZSBvZiBtZW1vcnkuICBUaGUgZmlyc3QgdHdvIHdvcmRzIG9mIGVhY2ggbm9kZQotICogY29udGFpbnMgdGhlIGZvcndhcmQgYW5kIGJhY2t3YXJkIGxpbmtzLiAgVGhlIHRoaXJkIHdvcmQgY29udGFpbnMKLSAqIHRoZSB0cmVhZG1pbGwuICBUaGUgcmVtYWluaW5nIHBvcnRpb24gaXMgdGhlIHBheWxvYWQuCi0gKgotICogVGhlIHRyZWFkbWlsbCBvYmplY3QgaXRzZWxmIG11c3Qgbm90IGJlIG1vdmVkLgotICoKLSAqIEFjY2VzcyB0byB0aGUgaW5zdGFuY2VzIG1heSBiZSBzeW5jaHJvbml6ZWQgZGVwZW5kaW5nIG9uIHRoZQotICogY29uc3RydWN0b3IgYXJndW1lbnQuCi0gKi8KLUBVbmludGVycnVwdGlibGUgcHVibGljIGZpbmFsIGNsYXNzIERvdWJseUxpbmtlZExpc3QgaW1wbGVtZW50cyBDb25zdGFudHMgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENsYXNzIHZhcmlhYmxlcwotICAgKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbnN0YW5jZSB2YXJpYWJsZXMKLSAgICovCi0gIHByaXZhdGUgQWRkcmVzcyBoZWFkOwotICBwcml2YXRlIGZpbmFsIExvY2sgbG9jazsKLSAgcHJpdmF0ZSBmaW5hbCBpbnQgbG9nR3JhbnVsYXJpdHk7ICAvLyBFYWNoIG5vZGUgb24gdGhlIHRyZWFkbWlsbCBpcyBndWFyYW50ZWVkIHRvIGJlIGEgbXVsdGlwbGUgb2YgZ3JhbnVsYXJpdHkuCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5zdGFuY2UgTWV0aG9kcwotICAgKi8KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICovCi0gIHB1YmxpYyBEb3VibHlMaW5rZWRMaXN0KGludCBsb2dHcmFudWxhcml0eSwgYm9vbGVhbiBzaGFyZWQpIHsKLSAgICBoZWFkID0gQWRkcmVzcy56ZXJvKCk7Ci0gICAgbG9jayA9IHNoYXJlZCA/IFZNLm5ld0xvY2soIkRvdWJseUxpbmtlZExpc3QiKSA6IG51bGw7Ci0gICAgdGhpcy5sb2dHcmFudWxhcml0eSA9IGxvZ0dyYW51bGFyaXR5OwotCi0gICAgLy8gZW5zdXJlIHRoYXQgZ3JhbnVsYXJpdHkgaXMgYmlnIGVub3VnaCBmb3IgbWlkUGF5bG9hZFRvTm9kZSB0byB3b3JrCi0gICAgV29yZCB0bXAgPSBXb3JkLm9uZSgpLmxzaChsb2dHcmFudWxhcml0eSk7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQodG1wLmFuZChub2RlTWFzaykuRVEodG1wKSk7Ci0gIH0KLQotICAvLyBPZmZzZXRzIGFyZSByZWxhdGl2ZSB0byB0aGUgbm9kZSAobm90IHRoZSBwYXlsb2FkKQotICAvLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPZmZzZXQgUFJFVl9PRkZTRVQgPSBPZmZzZXQuZnJvbUludFNpZ25FeHRlbmQoMCAqIEJZVEVTX0lOX0FERFJFU1MpOwotICBwcml2YXRlIHN0YXRpYyBPZmZzZXQgTkVYVF9PRkZTRVQgPSBPZmZzZXQuZnJvbUludFNpZ25FeHRlbmQoMSAqIEJZVEVTX0lOX0FERFJFU1MpOwotICBwcml2YXRlIHN0YXRpYyBPZmZzZXQgSEVBREVSX1NJWkUgPSBPZmZzZXQuZnJvbUludFNpZ25FeHRlbmQoMiAqIEJZVEVTX0lOX0FERFJFU1MpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFdvcmQgbm9kZU1hc2s7Ci0gIHN0YXRpYyB7Ci0gICAgV29yZCBtYXNrID0gV29yZC5vbmUoKTsKLSAgICB3aGlsZSAobWFzay5MRShIRUFERVJfU0laRS5wbHVzKE1BWF9CWVRFU19QQURESU5HKS50b1dvcmQoKSkpIG1hc2sgPSBtYXNrLmxzaCgxKTsKLSAgICBub2RlTWFzayA9IG1hc2subWludXMoV29yZC5vbmUoKSkubm90KCk7Ci0gIH0KLQotICBASW5saW5lCi0gIHB1YmxpYyBzdGF0aWMgaW50IGhlYWRlclNpemUoKSB7Ci0gICAgcmV0dXJuIEhFQURFUl9TSVpFLnRvSW50KCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc05vZGUoQWRkcmVzcyBub2RlKSB7Ci0gICAgcmV0dXJuIG5vZGUudG9Xb3JkKCkucnNobChsb2dHcmFudWxhcml0eSkubHNoKGxvZ0dyYW51bGFyaXR5KS5FUShub2RlLnRvV29yZCgpKTsKLSAgfQotCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyBBZGRyZXNzIG5vZGVUb1BheWxvYWQoQWRkcmVzcyBub2RlKSB7Ci0gICAgcmV0dXJuIG5vZGUucGx1cyhIRUFERVJfU0laRSk7Ci0gIH0KLQotICBASW5saW5lCi0gIHB1YmxpYyBzdGF0aWMgQWRkcmVzcyBtaWRQYXlsb2FkVG9Ob2RlKEFkZHJlc3MgcGF5bG9hZCkgewotICAgIC8vIFRoaXMgbWV0aG9kIHdvcmRzIGFzIGxvbmcgYXMgeW91IGFyZSBsZXNzIHRoYW4gTUFYX0JZVEVTX1BBRERJTkcgaW50byB0aGUgcGF5bG9hZC4KLSAgICByZXR1cm4gcGF5bG9hZC50b1dvcmQoKS5hbmQobm9kZU1hc2spLnRvQWRkcmVzcygpOwotICB9Ci0KLSAgQElubGluZQotICBwdWJsaWMgdm9pZCBhZGQoQWRkcmVzcyBub2RlKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoaXNOb2RlKG5vZGUpKTsKLSAgICBpZiAobG9jayAhPSBudWxsKSBsb2NrLmFjcXVpcmUoKTsKLSAgICBub2RlLnN0b3JlKEFkZHJlc3MuemVybygpLCBQUkVWX09GRlNFVCk7Ci0gICAgbm9kZS5zdG9yZShoZWFkLCBORVhUX09GRlNFVCk7Ci0gICAgaWYgKCFoZWFkLmlzWmVybygpKQotICAgICAgaGVhZC5zdG9yZShub2RlLCBQUkVWX09GRlNFVCk7Ci0gICAgaGVhZCA9IG5vZGU7Ci0gICAgaWYgKGxvY2sgIT0gbnVsbCkgbG9jay5yZWxlYXNlKCk7Ci0gIH0KLQotICBASW5saW5lCi0gIHB1YmxpYyB2b2lkIHJlbW92ZShBZGRyZXNzIG5vZGUpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChpc05vZGUobm9kZSkpOwotICAgIGlmIChsb2NrICE9IG51bGwpIGxvY2suYWNxdWlyZSgpOwotICAgIEFkZHJlc3MgcHJldiA9IG5vZGUubG9hZEFkZHJlc3MoUFJFVl9PRkZTRVQpOwotICAgIEFkZHJlc3MgbmV4dCA9IG5vZGUubG9hZEFkZHJlc3MoTkVYVF9PRkZTRVQpOwotICAgIC8vIFNwbGljZSB0aGUgbm9kZSBvdXQgb2YgdGhlIGxpc3QKLSAgICBpZiAoIW5leHQuaXNaZXJvKCkpCi0gICAgICBuZXh0LnN0b3JlKHByZXYsIFBSRVZfT0ZGU0VUKTsKLSAgICBpZiAocHJldi5pc1plcm8oKSkKLSAgICAgIGhlYWQgPSBuZXh0OwotICAgIGVsc2UKLSAgICAgIHByZXYuc3RvcmUobmV4dCwgTkVYVF9PRkZTRVQpOwotICAgIC8vIE51bGwgb3V0IG5vZGUncyByZWZlcmVuY2UgdG8gdGhlIGxpc3QKLSAgICBub2RlLnN0b3JlKEFkZHJlc3MuemVybygpLCBQUkVWX09GRlNFVCk7Ci0gICAgbm9kZS5zdG9yZShBZGRyZXNzLnplcm8oKSwgTkVYVF9PRkZTRVQpOwotICAgIGlmIChsb2NrICE9IG51bGwpIGxvY2sucmVsZWFzZSgpOwotICB9Ci0KLSAgQElubGluZQotICBwdWJsaWMgQWRkcmVzcyBnZXRIZWFkKCkgewotICAgIHJldHVybiBoZWFkOwotICB9Ci0KLSAgQElubGluZQotICBwdWJsaWMgQWRkcmVzcyBnZXROZXh0KEFkZHJlc3Mgbm9kZSkgewotICAgIHJldHVybiBub2RlLmxvYWRBZGRyZXNzKE5FWFRfT0ZGU0VUKTsKLSAgfQotCi0gIEBJbmxpbmUKLSAgcHVibGljIEFkZHJlc3MgcG9wKCkgewotICAgIEFkZHJlc3MgZmlyc3QgPSBoZWFkOwotICAgIGlmICghZmlyc3QuaXNaZXJvKCkpCi0gICAgICByZW1vdmUoZmlyc3QpOwotICAgIHJldHVybiBmaXJzdDsKLSAgfQotCi0gIEBJbmxpbmUKLSAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICByZXR1cm4gaGVhZC5pc1plcm8oKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdHJ1ZSBpZiBhIGNlbGwgaXMgb24gYSBnaXZlbiB0cmVhZG1pbGwKLSAgICoKLSAgICogQHBhcmFtIG5vZGUgVGhlIGNlbGwgYmVpbmcgc2VhcmNoZWQgZm9yCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY2VsbCBpcyBmb3VuZCBvbiB0aGUgdHJlYWRtaWxsCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc01lbWJlcihBZGRyZXNzIG5vZGUpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChpc05vZGUobm9kZSkpOwotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgaWYgKGxvY2sgIT0gbnVsbCkgbG9jay5hY3F1aXJlKCk7Ci0gICAgQWRkcmVzcyBjdXIgPSBoZWFkOwotICAgIHdoaWxlICghY3VyLmlzWmVybygpKSB7Ci0gICAgICBpZiAoY3VyLkVRKG5vZGUpKSB7Ci0gICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY3VyID0gY3VyLmxvYWRBZGRyZXNzKE5FWFRfT0ZGU0VUKTsKLSAgICB9Ci0gICAgaWYgKGxvY2sgIT0gbnVsbCkgbG9jay5yZWxlYXNlKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNob3coKSB7Ci0gICAgaWYgKGxvY2sgIT0gbnVsbCkgbG9jay5hY3F1aXJlKCk7Ci0gICAgQWRkcmVzcyBjdXIgPSBoZWFkOwotICAgIExvZy53cml0ZShjdXIpOwotICAgIHdoaWxlICghY3VyLmlzWmVybygpKSB7Ci0gICAgICBjdXIgPSBjdXIubG9hZEFkZHJlc3MoTkVYVF9PRkZTRVQpOwotICAgICAgTG9nLndyaXRlKCIgLT4gIik7IExvZy53cml0ZShjdXIpOwotICAgIH0KLSAgICBMb2cud3JpdGVsbigpOwotICAgIGlmIChsb2NrICE9IG51bGwpIGxvY2sucmVsZWFzZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogR2F0aGVyIGRhdGEgZm9yIEdDU3B5Ci0gICAqIEBwYXJhbSBkcml2ZXIgdGhlIEdDU3B5IHNwYWNlIGRyaXZlcgotICAgKi8KLSAgdm9pZCBnY3NweUdhdGhlckRhdGEoQWJzdHJhY3REcml2ZXIgZHJpdmVyKSB7Ci0gICAgLy8gR0NTcHkgZG9lc24ndCBuZWVkIGEgbG9jayAoaW4gaXRzIHN0b3AgdGhlIHdvcmxkIGNvbmZpZykKLSAgICBBZGRyZXNzIGN1ciA9IGhlYWQ7Ci0gICAgd2hpbGUgKCFjdXIuaXNaZXJvKCkpIHsKLSAgICAgIGRyaXZlci5zY2FuKGN1cik7Ci0gICAgICBjdXIgPSBjdXIubG9hZEFkZHJlc3MoTkVYVF9PRkZTRVQpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L0ZvcndhcmRpbmdXb3JkLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvRm9yd2FyZGluZ1dvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc3MWIyYi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvRm9yd2FyZGluZ1dvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eTsKLQotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS5JbmxpbmU7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLlVuaW50ZXJydXB0aWJsZTsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLk9iamVjdFJlZmVyZW5jZTsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLldvcmQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBnZW5lcmljIHN1cHBvcnQgZm9yIG9iamVjdCBmb3J3YXJkaW5nLCB3aGljaCBpcyBzcGVjaWZpYwotICogdG8gYSBmZXcgcG9saWNpZXMgdGhhdCBzdXBwb3J0IGNvcHlpbmcuICBUaGUgYnJvYWQgaWRlYSBpcyB0d28tZm9sZDogMSkgdGhlCi0gKiB0d28gbG93LW9yZGVyIGJpdHMgb2YgdGhlIEdDIGJ5dGUgKHdoaWNoIGFyZSBhbHNvIHRoZSB0d28gbG93LW9yZGVyIGJpdHMgb2YKLSAqIHRoZSBoZWFkZXIgd29yZCkgYXJlIHVzZWQgdG8gaW5kaWNhdGUgd2hldGhlciBhbiBvYmplY3QgaGFzIGJlZW4gZm9yd2FyZGVkCi0gKiBvciBpcyBiZWluZyBmb3J3YXJkZWQsIGFuZCAyKSBpZiBhbiBvYmplY3QgaGFzIGJlZW4gZm9yd2FyZGVkIHRoZW4gdGhlIGVudGlyZQotICogaGVhZGVyIHdvcmQgb2YgdGhlIGRlYWQgb2JqZWN0IGlzIHVzZWQgdG8gc3RvcmUgYSBwb2ludGVyIHRvIHRoZSBmb3J3YXJkZWQKLSAqIHBvaW50ZXIuICAgVGhpcyBpcyBhIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIG9mIGZvcndhcmRpbmcuPHA+Ci0gKgotICogVGhlIHR3byBsb3dlc3Qgb3JkZXIgYml0cyBhcmUgdXNlZCBmb3Igb2JqZWN0IGZvcndhcmRpbmcgYmVjYXVzZSBmb3J3YXJkaW5nCi0gKiBnZW5lcmFsbHkgbXVzdCBzdGVhbCB0aGUgdW51c2VkIHR3byBsb3cgb3JkZXIgYml0cyBvZiB0aGUgZm9yd2FyZGluZyBwb2ludGVyLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgY2xhc3MgRm9yd2FyZGluZ1dvcmQgewotICAvKgotICAgKiAgVGhlIGZvcndhcmRpbmcgcHJvY2VzcyB1c2VzIHRocmVlIHN0YXRlcyB0byBkZWFsIHdpdGggYSBHQyByYWNlOgotICAgKiAgMS4gICAgICAhRk9SV0FSREVEOiBVbmZvcndhcmRlZAotICAgKiAgMi4gQkVJTkdfRk9SV0FSREVEOiBCZWluZyBmb3J3YXJkZWQgKGZvcndhcmRpbmcgaXMgdW5kZXJ3YXkpCi0gICAqICAzLiAgICAgICBGT1JXQVJERUQ6IEZvcndhcmRlZAotICAgKi8KLSAgLyoqIElmIHRoaXMgYml0IGlzIHNldCwgdGhlbiBmb3J3YXJkaW5nIG9mIHRoaXMgb2JqZWN0IGlzIGluY29tcGxldGUgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBCRUlOR19GT1JXQVJERUQgPSAyOyAvLyAuLi4xMAotICAvKiogSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGVuIGZvcndhcmRpbmcgb2YgdGhpcyBvYmplY3QgaGFzIGNvbW1lbmNlZCAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEZPUldBUkRFRCA9ICAgICAgIDM7IC8vIC4uLjExCi0gIC8qKiBUaGlzIG1hc2sgaXMgdXNlZCB0byByZXZlYWwgd2hpY2ggc3RhdGUgdGhpcyBvYmplY3QgaXMgaW4gd2l0aCByZXNwZWN0IHRvIGZvcndhcmRpbmcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEZPUldBUkRJTkdfTUFTSyA9ICAzOyAvLyAuLi4xMQotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUldBUkRJTkdfQklUUyA9IDI7Ci0KLQotICAvKioKLSAgICogRWl0aGVyIHJldHVybiB0aGUgZm9yd2FyZGluZyBwb2ludGVyIGlmIHRoZSBvYmplY3QgaXMgYWxyZWFkeQotICAgKiBmb3J3YXJkZWQgKG9yIGJlaW5nIGZvcndhcmRlZCkgb3Igd3JpdGUgdGhlIGJpdCBwYXR0ZXJuIHRoYXQKLSAgICogaW5kaWNhdGVzIHRoYXQgdGhlIG9iamVjdCBpcyBiZWluZyBmb3J3YXJkZWQKLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIGZvcndhcmRlZAotICAgKiBAcmV0dXJuIFRoZSBmb3J3YXJkaW5nIHBvaW50ZXIgZm9yIHRoZSBvYmplY3QgaWYgaXQgaGFzIGFscmVhZHkKLSAgICogYmVlbiBmb3J3YXJkZWQuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBzdGF0aWMgV29yZCBhdHRlbXB0VG9Gb3J3YXJkKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBXb3JkIG9sZFZhbHVlOwotICAgIGRvIHsKLSAgICAgIG9sZFZhbHVlID0gVk0ub2JqZWN0TW9kZWwucHJlcGFyZUF2YWlsYWJsZUJpdHMob2JqZWN0KTsKLSAgICAgIGlmICgoYnl0ZSkgKG9sZFZhbHVlLnRvSW50KCkgJiBGT1JXQVJESU5HX01BU0spID09IEZPUldBUkRFRCkKLSAgICAgICAgcmV0dXJuIG9sZFZhbHVlOwotICAgIH0gd2hpbGUgKCFWTS5vYmplY3RNb2RlbC5hdHRlbXB0QXZhaWxhYmxlQml0cyhvYmplY3QsIG9sZFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRWYWx1ZS5vcihXb3JkLmZyb21JbnRaZXJvRXh0ZW5kKEJFSU5HX0ZPUldBUkRFRCkpKSk7Ci0gICAgcmV0dXJuIG9sZFZhbHVlOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBPYmplY3RSZWZlcmVuY2Ugc3BpbkFuZEdldEZvcndhcmRlZE9iamVjdChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0LCBXb3JkIHN0YXR1c1dvcmQpIHsKLSAgICAvKiBXZSBtdXN0IHdhaXQgKHNwaW4pIGlmIHRoZSBvYmplY3QgaXMgbm90IHlldCBmdWxseSBmb3J3YXJkZWQgKi8KLSAgICB3aGlsZSAoKHN0YXR1c1dvcmQudG9JbnQoKSAmIEZPUldBUkRJTkdfTUFTSykgPT0gQkVJTkdfRk9SV0FSREVEKQotICAgICAgc3RhdHVzV29yZCA9IFZNLm9iamVjdE1vZGVsLnJlYWRBdmFpbGFibGVCaXRzV29yZChvYmplY3QpOwotCi0gICAgLyogTm93IGV4dHJhY3QgdGhlIG9iamVjdCByZWZlcmVuY2UgZnJvbSB0aGUgZm9yd2FyZGluZyB3b3JkIGFuZCByZXR1cm4gaXQgKi8KLSAgICBpZiAoKHN0YXR1c1dvcmQudG9JbnQoKSAmIEZPUldBUkRJTkdfTUFTSykgPT0gRk9SV0FSREVEKQotICAgICAgcmV0dXJuIHN0YXR1c1dvcmQuYW5kKFdvcmQuZnJvbUludFplcm9FeHRlbmQoRk9SV0FSRElOR19NQVNLKS5ub3QoKSkudG9BZGRyZXNzKCkudG9PYmplY3RSZWZlcmVuY2UoKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gb2JqZWN0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBPYmplY3RSZWZlcmVuY2UgZm9yd2FyZE9iamVjdChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0LCBpbnQgYWxsb2NhdG9yKSB7Ci0gICAgT2JqZWN0UmVmZXJlbmNlIG5ld09iamVjdCA9IFZNLm9iamVjdE1vZGVsLmNvcHkob2JqZWN0LCBhbGxvY2F0b3IpOwotICAgIFZNLm9iamVjdE1vZGVsLndyaXRlQXZhaWxhYmxlQml0c1dvcmQob2JqZWN0LCBuZXdPYmplY3QudG9BZGRyZXNzKCkudG9Xb3JkKCkub3IoV29yZC5mcm9tSW50WmVyb0V4dGVuZChGT1JXQVJERUQpKSk7Ci0gICAgcmV0dXJuIG5ld09iamVjdDsKLSAgfQotCi0gIC8qKgotICAgKiBOb24tYXRvbWljIHdyaXRlIG9mIGZvcndhcmRpbmcgcG9pbnRlciB3b3JkIChhc3N1bXB0aW9uLCB0aHJlYWQKLSAgICogZG9pbmcgdGhlIHNldCBoYXMgZG9uZSBhdHRlbXB0IHRvIGZvcndhcmQgYW5kIG93bnMgdGhlIHJpZ2h0IHRvCi0gICAqIGNvcHkgdGhlIG9iamVjdCkKLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHdob3NlIGZvcndhcmRpbmcgcG9pbnRlciBpcyB0byBiZSBzZXQKLSAgICogQHBhcmFtIHB0ciBUaGUgZm9yd2FyZGluZyBwb2ludGVyIHRvIGJlIHN0b3JlZCBpbiB0aGUgb2JqZWN0J3MKLSAgICogZm9yd2FyZGluZyB3b3JkCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGb3J3YXJkaW5nUG9pbnRlcihPYmplY3RSZWZlcmVuY2Ugb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFJlZmVyZW5jZSBwdHIpIHsKLSAgICBWTS5vYmplY3RNb2RlbC53cml0ZUF2YWlsYWJsZUJpdHNXb3JkKG9iamVjdCwgcHRyLnRvQWRkcmVzcygpLnRvV29yZCgpLm9yKFdvcmQuZnJvbUludFplcm9FeHRlbmQoRk9SV0FSREVEKSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEhhcyBhbiBvYmplY3QgYmVlbiBmb3J3YXJkZWQ/Ci0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBiZSBjaGVja2VkCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIGZvcndhcmRlZAotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGb3J3YXJkZWQoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIHJldHVybiAoVk0ub2JqZWN0TW9kZWwucmVhZEF2YWlsYWJsZUJ5dGUob2JqZWN0KSAmIEZPUldBUkRJTkdfTUFTSykgPT0gRk9SV0FSREVEOwotICB9Ci0KLSAgLyoqCi0gICAqIEhhcyBhbiBvYmplY3QgYmVlbiBmb3J3YXJkZWQgb3IgaXMgaXQgYmVpbmcgZm9yd2FyZGVkPwotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgY2hlY2tlZAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBmb3J3YXJkZWQKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRm9yd2FyZGVkT3JCZWluZ0ZvcndhcmRlZChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgcmV0dXJuIChWTS5vYmplY3RNb2RlbC5yZWFkQXZhaWxhYmxlQnl0ZShvYmplY3QpICYgRk9SV0FSRElOR19NQVNLKSAhPSAwOwotICB9Ci0KLSAgLyoqCi0gICAqIEhhcyBhbiBvYmplY3QgYmVlbiBmb3J3YXJkZWQgb3IgYmVpbmcgZm9yd2FyZGVkPwotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgY2hlY2tlZAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBmb3J3YXJkZWQKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHN0YXRlSXNGb3J3YXJkZWRPckJlaW5nRm9yd2FyZGVkKFdvcmQgaGVhZGVyKSB7Ci0gICAgcmV0dXJuIChoZWFkZXIudG9JbnQoKSAmIEZPUldBUkRJTkdfTUFTSykgIT0gMDsKLSAgfQotCi0gIC8qKgotICAgKiBIYXMgYW4gb2JqZWN0IGJlZW4gZm9yd2FyZGVkIG9yIGJlaW5nIGZvcndhcmRlZD8KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIGNoZWNrZWQKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gZm9yd2FyZGVkCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdGF0ZUlzQmVpbmdGb3J3YXJkZWQoV29yZCBoZWFkZXIpIHsKLSAgICByZXR1cm4gKGhlYWRlci50b0ludCgpICYgRk9SV0FSRElOR19NQVNLKSA9PSBCRUlOR19GT1JXQVJERUQ7Ci0gIH0KLQotICAvKioKLSAgICogQ2xlYXIgdGhlIEdDIGZvcndhcmRpbmcgcG9ydGlvbiBvZiB0aGUgaGVhZGVyIGZvciBhbiBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCByZWYgdG8gdGhlIHN0b3JhZ2UgdG8gYmUgaW5pdGlhbGl6ZWQKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyRm9yd2FyZGluZ0JpdHMoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIFZNLm9iamVjdE1vZGVsLndyaXRlQXZhaWxhYmxlQnl0ZShvYmplY3QsIChieXRlKSAoVk0ub2JqZWN0TW9kZWwucmVhZEF2YWlsYWJsZUJ5dGUob2JqZWN0KSAmIH5GT1JXQVJESU5HX01BU0spKTsKLSAgfQotCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyBPYmplY3RSZWZlcmVuY2UgZXh0cmFjdEZvcndhcmRpbmdQb2ludGVyKFdvcmQgZm9yd2FyZGluZ1dvcmQpIHsKLSAgICByZXR1cm4gZm9yd2FyZGluZ1dvcmQuYW5kKFdvcmQuZnJvbUludFplcm9FeHRlbmQoRk9SV0FSRElOR19NQVNLKS5ub3QoKSkudG9BZGRyZXNzKCkudG9PYmplY3RSZWZlcmVuY2UoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L0dlbmVyaWNGcmVlTGlzdC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L0dlbmVyaWNGcmVlTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWEwNjQ1Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9HZW5lcmljRnJlZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eTsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uUGxhbjsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFRoaXMgaXMgYSB2ZXJ5IHNpbXBsZSwgZ2VuZXJpYyBtYWxsb2MtZnJlZSBhbGxvY2F0b3IuICBJdCB3b3JrcwotICogYWJzdHJhY3RseSwgaW4gInVuaXRzIiwgd2hpY2ggdGhlIHVzZXIgbWF5IGFzc29jaWF0ZSB3aXRoIHNvbWUKLSAqIG90aGVyIGFsbG9jYXRhYmxlIHJlc291cmNlIChlLmcuIGhlYXAgYmxvY2tzKS4gIFRoZSB1c2VyIGlzc3VlcwotICogcmVxdWVzdHMgZm9yIE4gdW5pdHMgYW5kIHRoZSBhbGxvY2F0b3IgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlCi0gKiBmaXJzdCBvZiBhIGNvbnRpZ3VvdXMgc2V0IG9mIE4gdW5pdHMgb3IgZmFpbHMsIHJldHVybmluZyAtMS4gIFRoZQotICogdXNlciBmcmVlcyB0aGUgYmxvY2sgb2YgTiB1bml0cyBieSBjYWxsaW5nIDxjb2RlPmZyZWUoKTwvY29kZT4gd2l0aAotICogdGhlIGluZGV4IG9mIHRoZSBmaXJzdCB1bml0IGFzIHRoZSBhcmd1bWVudC48cD4KLSAqCi0gKiBQcm9wZXJ0aWVzL0NvbnN0cmFpbnRzOjx1bD4KLSAqICAgPGxpPiBUaGUgYWxsb2NhdG9yIGNvbnN1bWVzIG9uZSB3b3JkIHBlciBhbGxvY2F0YWJsZSB1bml0IChwbHVzCi0gKiAgIGEgZml4ZWQgb3ZlcmhlYWQgb2YgYWJvdXQgMTI4IHdvcmRzKS48L2xpPgotICogICA8bGk+IFRoZSBhbGxvY2F0b3IgY2FuIG9ubHkgZGVhbCB3aXRoIE1BWF9VTklUUyB1bml0cyAoc2VlIGJlbG93IGZvcgotICogICB0aGUgdmFsdWUpLjwvbGk+Ci0gKiA8L3VsPgotICoKLSAqIFRoZSBiYXNpYyBkYXRhIHN0cnVjdHVyZSB1c2VkIGJ5IHRoZSBhbGdvcml0aG0gaXMgYSBsYXJnZSB0YWJsZSwKLSAqIHdpdGggb25lIHdvcmQgcGVyIGFsbG9jYXRhYmxlIHVuaXQuICBFYWNoIHdvcmQgaXMgdXNlZCBpbiBhCi0gKiBudW1iZXIgb2YgZGlmZmVyZW50IHdheXMsIHNvbWUgY29tYmluYXRpb24gb2YgInVuZGVmaW5lZCIgKDMyKSwKLSAqICJmcmVlL3VzZWQiICgxKSwgIm11bHRpL3NpbmdsZSIgKDEpLCAicHJldiIgKDE1KSwgIm5leHQiICgxNSkgJgotICogInNpemUiICgxNSkgd2hlcmUgZmllbGQgc2l6ZXMgaW4gYml0cyBhcmUgaW4gcGFyZW50aGVzaXMuCi0gKiA8cHJlPgotICogICAgICAgICAgICAgICAgICAgICAgICstKy0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCi0gKiAgICAgICAgICAgICAgICAgICAgICAgfGZ8bXwgICAgcHJldiAgIHwgbmV4dC9zaXplIHwKLSAqICAgICAgICAgICAgICAgICAgICAgICArLSstKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKwotICoKLSAqICAgLSBzaW5nbGUgZnJlZSB1bml0OiAiZnJlZSIsICJzaW5nbGUiLCAicHJldiIsICJuZXh0IgotICogICAtIHNpbmdsZSB1c2VkIHVuaXQ6ICJ1c2VkIiwgInNpbmdsZSIKLSAqICAgIC0gY29udGlndW91cyBmcmVlIHVuaXRzCi0gKiAgICAgLiBmaXJzdCB1bml0OiAiZnJlZSIsICJtdWx0aSIsICJwcmV2IiwgIm5leHQiCi0gKiAgICAgLiBzZWNvbmQgdW5pdDogImZyZWUiLCAibXVsdGkiLCAic2l6ZSIKLSAqICAgICAuIGxhc3QgdW5pdDogImZyZWUiLCAibXVsdGkiLCAic2l6ZSIKLSAqICAgIC0gY29udGlndW91cyB1c2VkIHVuaXRzCi0gKiAgICAgLiBmaXJzdCB1bml0OiAidXNlZCIsICJtdWx0aSIsICJwcmV2IiwgIm5leHQiCi0gKiAgICAgLiBzZWNvbmQgdW5pdDogInVzZWQiLCAibXVsdGkiLCAic2l6ZSIKLSAqICAgICAuIGxhc3QgdW5pdDogInVzZWQiLCAibXVsdGkiLCAic2l6ZSIKLSAqICAgIC0gYW55IG90aGVyIHVuaXQ6IHVuZGVmaW5lZAotICoKLSAqICAgICAgICAgICAgICAgICAgICAgICArLSstKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKwotICogICB0b3Agc2VudGluZWwgICAgICAgIHwwfDB8ICAgIHRhaWwgICB8ICAgaGVhZCAgICB8ICBbLTFdCi0gKiAgICAgICAgICAgICAgICAgICAgICAgKy0rLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLi4KLSAqICAgICAgICAgICAgLy0tLS0tLS0tICArLSstKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKwotICogICAgICAgICAgICB8ICAgICAgICAgIHwxfDF8ICAgcHJldiAgICB8ICAgbmV4dCAgICB8ICBbal0KLSAqICAgICAgICAgICAgfCAgICAgICAgICArLSstKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKwotICogICAgICAgICAgICB8ICAgICAgICAgIHwxfDF8ICAgICAgICAgICB8ICAgc2l6ZSAgICB8ICBbaisxXQotICogICAgICAgICBmcmVlIG11bHRpICAgICstKy0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCi0gKiAgICAgICAgIHVuaXQgYmxvY2sgICAgfCAgICAgICAgICAgICAgLi4uICAgICAgICAgIHwgIC4uLgotICogICAgICAgICAgICB8ICAgICAgICAgICstKy0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCi0gKiAgICAgICAgICAgIHwgICAgICAgICAgfDF8MXwgICAgICAgICAgIHwgICBzaXplICAgIHwKLSAqICAgICAgICAgICA+LS0tLS0tLS0gICstKy0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCi0gKiAgIHNpbmdsZSBmcmVlIHVuaXQgICAgfDF8MHwgICBwcmV2ICAgIHwgICBuZXh0ICAgIHwKLSAqICAgICAgICAgICA+LS0tLS0tLS0gICstKy0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCi0gKiAgIHNpbmdsZSB1c2VkIHVuaXQgICAgfDB8MHwgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICAgICAgICAgICA+LS0tLS0tLS0gICstKy0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gKiAgICAgICAgICAgIHwgICAgICAgICAgfDB8MXwgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICAgICAgICAgICAgfCAgICAgICAgICArLSstKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKwotICogICAgICAgICAgICB8ICAgICAgICAgIHwwfDF8ICAgICAgICAgICB8ICAgc2l6ZSAgICB8Ci0gKiAgICAgICAgIHVzZWQgbXVsdGkgICAgKy0rLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsKLSAqICAgICAgICAgdW5pdCBibG9jayAgICB8ICAgICAgICAgICAgICAuLi4gICAgICAgICAgfAotICogICAgICAgICAgICB8ICAgICAgICAgICstKy0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCi0gKiAgICAgICAgICAgIHwgICAgICAgICAgfDB8MXwgICAgICAgICAgIHwgICBzaXplICAgIHwKLSAqICAgICAgICAgICAgXC0tLS0tLS0tICArLSstKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uLgotICogICAgICAgICAgICAgICAgICAgICAgICstKy0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gKiAgIGJvdHRvbSBzZW50aW5lbCAgICAgfDB8MHwgICAgICAgICAgICAgICAgICAgICAgIHwgIFtOXQotICogICAgICAgICAgICAgICAgICAgICAgICstKy0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gKiA8L3ByZT4KLSAqIFRoZSBzZW50aW5lbHMgc2VydmUgYXMgZ3VhcmRzIGFnYWluc3Qgb3V0IG9mIHJhbmdlIGNvYWxlc2NpbmcKLSAqIGJlY2F1c2UgdGhleSBib3RoIGFwcGVhciBhcyAidXNlZCIgYmxvY2tzIGFuZCBzbyB3aWxsIG5ldmVyCi0gKiBjb2FsZXNjZS4gIFRoZSB0b3Agc2VudGluZWwgYWxzbyBzZXJ2ZXMgYXMgdGhlIGhlYWQgYW5kIHRhaWwgb2YKLSAqIHRoZSBkb3VibHkgbGlua2VkIGxpc3Qgb2YgZnJlZSBibG9ja3MuCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBmaW5hbCBjbGFzcyBHZW5lcmljRnJlZUxpc3QgZXh0ZW5kcyBCYXNlR2VuZXJpY0ZyZWVMaXN0IGltcGxlbWVudHMgQ29uc3RhbnRzIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBQdWJsaWMgaW5zdGFuY2UgbWV0aG9kcwotICAgKi8KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIHVuaXRzIFRoZSBudW1iZXIgb2YgYWxsb2NhdGFibGUgdW5pdHMgZm9yIHRoaXMgZnJlZSBsaXN0Ci0gICAqLwotICBwdWJsaWMgR2VuZXJpY0ZyZWVMaXN0KGludCB1bml0cykgewotICAgIHRoaXModW5pdHMsIHVuaXRzKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKgotICAgKiBAcGFyYW0gdW5pdHMgVGhlIG51bWJlciBvZiBhbGxvY2F0YWJsZSB1bml0cyBmb3IgdGhpcyBmcmVlIGxpc3QKLSAgICogQHBhcmFtIGdyYWluIFVuaXRzIGFyZSBhbGxvY2F0ZWQgc3VjaCB0aGF0IHRoZXkgd2lsbCBuZXZlciBjcm9zcyB0aGlzIGdyYW51bGFyaXR5IGJvdW5kYXJ5Ci0gICAqLwotICBwdWJsaWMgR2VuZXJpY0ZyZWVMaXN0KGludCB1bml0cywgaW50IGdyYWluKSB7Ci0gICAgdGhpcyh1bml0cywgZ3JhaW4sIDEpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSB1bml0cyBUaGUgbnVtYmVyIG9mIGFsbG9jYXRhYmxlIHVuaXRzIGZvciB0aGlzIGZyZWUgbGlzdAotICAgKiBAcGFyYW0gZ3JhaW4gVW5pdHMgYXJlIGFsbG9jYXRlZCBzdWNoIHRoYXQgdGhleSB3aWxsIG5ldmVyIGNyb3NzIHRoaXMgZ3JhbnVsYXJpdHkgYm91bmRhcnkKLSAgICogQHBhcmFtIGhlYWRzIFRoZSBudW1iZXIgb2YgZnJlZSBsaXN0cyB3aGljaCB3aWxsIHNoYXJlIHRoaXMgaW5zdGFuY2UKLSAgICovCi0gIHB1YmxpYyBHZW5lcmljRnJlZUxpc3QoaW50IHVuaXRzLCBpbnQgZ3JhaW4sIGludCBoZWFkcykgewotICAgIHRoaXMucGFyZW50ID0gbnVsbDsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCh1bml0cyA8PSBNQVhfVU5JVFMgJiYgaGVhZHMgPD0gTUFYX0hFQURTKTsKLSAgICB0aGlzLmhlYWRzID0gaGVhZHM7Ci0gICAgaGVhZCA9IC0xOwotCi0gICAgLy8gYWxsb2NhdGUgdGhlIGRhdGEgc3RydWN0dXJlLCBpbmNsdWRpbmcgc3BhY2UgZm9yIHRvcCAmIGJvdHRvbSBzZW50aW5lbHMKLSAgICB0YWJsZSA9IG5ldyBpbnRbKHVuaXRzICsgMSArIGhlYWRzKSA8PCAxXTsKLSAgICBpbml0aWFsaXplSGVhcCh1bml0cywgZ3JhaW4pOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlc2l6ZSB0aGUgZnJlZSBsaXN0IGZvciBhIHBhcmVudCBmcmVlIGxpc3QuCi0gICAqIFRoaXMgbXVzdCBub3QgYmUgY2FsbGVkIGR5bmFtaWNhbGx5IChpZSBub3QgYWZ0ZXIgYm9vdHN0cmFwKS4KLSAgICoKLSAgICogQHBhcmFtIHVuaXRzIFRoZSBudW1iZXIgb2YgYWxsb2NhdGFibGUgdW5pdHMgZm9yIHRoaXMgZnJlZSBsaXN0Ci0gICAqIEBwYXJhbSBncmFpbiBVbml0cyBhcmUgYWxsb2NhdGVkIHN1Y2ggdGhhdCB0aGV5IHdpbGwgbmV2ZXIgY3Jvc3MgdGhpcyBncmFudWxhcml0eSBib3VuZGFyeQotICAgKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHVibGljIHZvaWQgcmVzaXplRnJlZUxpc3QoaW50IHVuaXRzLCBpbnQgZ3JhaW4pIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChwYXJlbnQgPT0gbnVsbCAmJiAhUGxhbi5pc0luaXRpYWxpemVkKCkpOwotICAgIHRhYmxlID0gbmV3IGludFsodW5pdHMgKyAxICsgaGVhZHMpIDw8IDFdOwotICAgIGluaXRpYWxpemVIZWFwKHVuaXRzLCBncmFpbik7Ci0gIH0KLQotICAvKioKLSAgICogUmVzaXplIHRoZSBmcmVlIGxpc3QgZm9yIGEgY2hpbGQgZnJlZSBsaXN0LgotICAgKiBUaGlzIG11c3Qgbm90IGJlIGNhbGxlZCBkeW5hbWljYWxseSAoaWUgbm90IGFmdGVyIGJvb3RzdHJhcCkuCi0gICAqLwotICBASW50ZXJydXB0aWJsZQotICBwdWJsaWMgdm9pZCByZXNpemVGcmVlTGlzdCgpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChwYXJlbnQgIT0gbnVsbCAmJiAhUGxhbi5pc0luaXRpYWxpemVkKCkpOwotICAgIHRhYmxlID0gcGFyZW50LmdldFRhYmxlKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50LCBvd25pbmcgdGhlIGRhdGEgc3RydWN0dXJlcyB0aGlzIGluc3RhbmNlIHdpbGwgc2hhcmUKLSAgICogQHBhcmFtIG9yZGluYWwgVGhlIG9yZGluYWwgbnVtYmVyIG9mIHRoaXMgY2hpbGQKLSAgICovCi0gIHB1YmxpYyBHZW5lcmljRnJlZUxpc3QoR2VuZXJpY0ZyZWVMaXN0IHBhcmVudCwgaW50IG9yZGluYWwpIHsKLSAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICB0aGlzLnRhYmxlID0gcGFyZW50LmdldFRhYmxlKCk7Ci0gICAgdGhpcy5oZWFkcyA9IHBhcmVudC5nZXRIZWFkcygpOwotICAgIHRoaXMuaGVhZCA9IC0oMSArIG9yZGluYWwpOwotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KC10aGlzLmhlYWQgPD0gdGhpcy5oZWFkcyk7Ci0gIH0KLQotICAvKiogR2V0dGVyICovCi0gIGludFtdIGdldFRhYmxlKCkgeyByZXR1cm4gdGFibGU7IH0KLSAgaW50IGdldEhlYWRzKCkgeyByZXR1cm4gaGVhZHM7IH0KLQotICAvKioKLSAgICogSW5pdGlhbGl6ZSBhIHVuaXQgYXMgYSBzZW50aW5lbAotICAgKgotICAgKiBAcGFyYW0gdW5pdCBUaGUgdW5pdCB0byBiZSBpbml0aWFsaXplZAotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0U2VudGluZWwoaW50IHVuaXQpIHsKLSAgICBzZXRMb0VudHJ5KHVuaXQsIE5FWFRfTUFTSyAmIHVuaXQpOwotICAgIHNldEhpRW50cnkodW5pdCwgUFJFVl9NQVNLICYgdW5pdCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBzaXplIG9mIGEgbHVtcCBvZiB1bml0cwotICAgKgotICAgKiBAcGFyYW0gdW5pdCBUaGUgZmlyc3QgdW5pdCBpbiB0aGUgbHVtcCBvZiB1bml0cwotICAgKiBAcmV0dXJuIFRoZSBzaXplIG9mIHRoZSBsdW1wIG9mIHVuaXRzCi0gICAqLwotICBwcm90ZWN0ZWQgaW50IGdldFNpemUoaW50IHVuaXQpIHsKLSAgICBpZiAoKGdldEhpRW50cnkodW5pdCkgJiBNVUxUSV9NQVNLKSA9PSBNVUxUSV9NQVNLKQotICAgICAgcmV0dXJuIChnZXRIaUVudHJ5KHVuaXQgKyAxKSAmIFNJWkVfTUFTSyk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIDE7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBzaXplIG9mIGx1bXAgb2YgdW5pdHMKLSAgICoKLSAgICogQHBhcmFtIHVuaXQgVGhlIGZpcnN0IHVuaXQgaW4gdGhlIGx1bXAgb2YgdW5pdHMKLSAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgb2YgdGhlIGx1bXAgb2YgdW5pdHMKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNldFNpemUoaW50IHVuaXQsIGludCBzaXplKSB7Ci0gICAgaWYgKHNpemUgPiAxKSB7Ci0gICAgICBzZXRIaUVudHJ5KHVuaXQsIGdldEhpRW50cnkodW5pdCkgfCBNVUxUSV9NQVNLKTsKLSAgICAgIHNldEhpRW50cnkodW5pdCArIDEsIE1VTFRJX01BU0sgfCBzaXplKTsKLSAgICAgIHNldEhpRW50cnkodW5pdCArIHNpemUgLSAxLCBNVUxUSV9NQVNLIHwgc2l6ZSk7Ci0gICAgfSBlbHNlCi0gICAgICBzZXRIaUVudHJ5KHVuaXQsIGdldEhpRW50cnkodW5pdCkgJiB+TVVMVElfTUFTSyk7Ci0gIH0KLQotICAvKioKLSAgICogRXN0YWJsaXNoIHdoZXRoZXIgYSBsdW1wIG9mIHVuaXRzIGlzIGZyZWUKLSAgICoKLSAgICogQHBhcmFtIHVuaXQgVGhlIGZpcnN0IG9yIGxhc3QgdW5pdCBpbiB0aGUgbHVtcAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGx1bXAgaXMgZnJlZQotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gZ2V0RnJlZShpbnQgdW5pdCkgewotICAgIHJldHVybiAoKGdldExvRW50cnkodW5pdCkgJiBGUkVFX01BU0spID09IEZSRUVfTUFTSyk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSAiZnJlZSIgZmxhZyBmb3IgYSBsdW1wIG9mIHVuaXRzIChib3RoIHRoZSBmaXJzdCBhbmQgbGFzdAotICAgKiB1bml0cyBpbiB0aGUgbHVtcCBhcmUgc2V0LgotICAgKgotICAgKiBAcGFyYW0gdW5pdCBUaGUgZmlyc3QgdW5pdCBpbiB0aGUgbHVtcAotICAgKiBAcGFyYW0gaXNGcmVlIFRydWUgaWYgdGhlIGx1bXAgaXMgdG8gYmUgbWFya2VkIGFzIGZyZWUKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNldEZyZWUoaW50IHVuaXQsIGJvb2xlYW4gaXNGcmVlKSB7Ci0gICAgaW50IHNpemU7Ci0gICAgaWYgKGlzRnJlZSkgewotICAgICAgc2V0TG9FbnRyeSh1bml0LCBnZXRMb0VudHJ5KHVuaXQpIHwgRlJFRV9NQVNLKTsKLSAgICAgIGlmICgoc2l6ZSA9IGdldFNpemUodW5pdCkpID4gMSkKLSAgICAgICAgc2V0TG9FbnRyeSh1bml0ICsgc2l6ZSAtIDEsIGdldExvRW50cnkodW5pdCArIHNpemUgLSAxKSB8IEZSRUVfTUFTSyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNldExvRW50cnkodW5pdCwgZ2V0TG9FbnRyeSh1bml0KSAmIH5GUkVFX01BU0spOwotICAgICAgaWYgKChzaXplID0gZ2V0U2l6ZSh1bml0KSkgPiAxKQotICAgICAgICBzZXRMb0VudHJ5KHVuaXQgKyBzaXplIC0gMSwgZ2V0TG9FbnRyeSh1bml0ICsgc2l6ZSAtIDEpICYgfkZSRUVfTUFTSyk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbmV4dCBsdW1wIGluIHRoZSBkb3VibHkgbGlua2VkIGZyZWUgbGlzdAotICAgKgotICAgKiBAcGFyYW0gdW5pdCBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IHVuaXQgaW4gdGhlIGN1cnJlbnQgbHVtcAotICAgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgdW5pdCBvZiB0aGUgbmV4dCBsdW1wIG9mIHVuaXRzIGluIHRoZSBsaXN0Ci0gICAqLwotICBwcm90ZWN0ZWQgaW50IGdldE5leHQoaW50IHVuaXQpIHsKLSAgICBpbnQgbmV4dCA9IGdldEhpRW50cnkodW5pdCkgJiBORVhUX01BU0s7Ci0gICAgcmV0dXJuIChuZXh0IDw9IE1BWF9VTklUUykgPyBuZXh0IDogaGVhZDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIG5leHQgbHVtcCBpbiB0aGUgZG91Ymx5IGxpbmtlZCBmcmVlIGxpc3QKLSAgICoKLSAgICogQHBhcmFtIHVuaXQgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCB1bml0IGluIHRoZSBsdW1wIHRvIGJlIHNldAotICAgKiBAcGFyYW0gbmV4dCBUaGUgdmFsdWUgdG8gYmUgc2V0LgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0TmV4dChpbnQgdW5pdCwgaW50IG5leHQpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCgobmV4dCA+PSAtaGVhZHMpICYmIChuZXh0IDw9IE1BWF9VTklUUykpOwotICAgIGludCBvbGRWYWx1ZSA9IGdldEhpRW50cnkodW5pdCk7Ci0gICAgaW50IG5ld1ZhbHVlID0gKG9sZFZhbHVlICYgfk5FWFRfTUFTSykgfCAobmV4dCAmIE5FWFRfTUFTSyk7Ci0gICAgc2V0SGlFbnRyeSh1bml0LCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBwcmV2aW91cyBsdW1wIGluIHRoZSBkb3VibHkgbGlua2VkIGZyZWUgbGlzdAotICAgKgotICAgKiBAcGFyYW0gdW5pdCBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IHVuaXQgaW4gdGhlIGN1cnJlbnQgbHVtcAotICAgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgdW5pdCBvZiB0aGUgcHJldmlvdXMgbHVtcCBvZiB1bml0cwotICAgKiBpbiB0aGUgbGlzdAotICAgKi8KLSAgcHJvdGVjdGVkIGludCBnZXRQcmV2KGludCB1bml0KSB7Ci0gICAgaW50IHByZXYgPSBnZXRMb0VudHJ5KHVuaXQpICYgUFJFVl9NQVNLOwotICAgIHJldHVybiAocHJldiA8PSBNQVhfVU5JVFMpID8gcHJldiA6IGhlYWQ7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBwcmV2aW91cyBsdW1wIGluIHRoZSBkb3VibHkgbGlua2VkIGZyZWUgbGlzdAotICAgKgotICAgKiBAcGFyYW0gdW5pdCBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IHVuaXQgaW4gdGhlIGx1bXAgdG8gYmUgc2V0Ci0gICAqIEBwYXJhbSBwcmV2IFRoZSB2YWx1ZSB0byBiZSBzZXQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzZXRQcmV2KGludCB1bml0LCBpbnQgcHJldikgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KChwcmV2ID49IC1oZWFkcykgJiYgKHByZXYgPD0gTUFYX1VOSVRTKSk7Ci0gICAgaW50IG9sZFZhbHVlID0gZ2V0TG9FbnRyeSh1bml0KTsKLSAgICBpbnQgbmV3VmFsdWUgPSAob2xkVmFsdWUgJiB+UFJFVl9NQVNLKSB8IChwcmV2ICYgUFJFVl9NQVNLKTsKLSAgICBzZXRMb0VudHJ5KHVuaXQsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIHVuY29hbGVzY2FibGUgYml0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHVuaXQuCi0gICAqIFRoaXMgZW5zdXJlcyB0aGlzIHVuaXQgY2Fubm90IGJlIGNvYWxlc2NlZCB3aXRoIHVuaXRzIGJlbG93Ci0gICAqIGl0LgotICAgKgotICAgKiBAcGFyYW0gdW5pdCBUaGUgdW5pdCB3aG9zZSB1bmNvYWxlc2NhYmxlIGJpdCBpcyB0byBiZSBzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVuY29hbGVzY2FibGUoaW50IHVuaXQpIHsKLSAgICBzZXRMb0VudHJ5KHVuaXQsIGdldExvRW50cnkodW5pdCkgfCBDT0FMRVNDX01BU0spOwotICB9Ci0KLSAgLyoqCi0gICAqIENsZWFyIHRoZSB1bmNvYWxlc2NhYmxlIGJpdCBhc3NvY2lhdGVkIHdpdGggdGhpcyB1bml0LgotICAgKiBUaGlzIGFsbG93cyB0aGlzIHVuaXQgdG8gYmUgY29hbGVzY2VkIHdpdGggdW5pdHMgYmVsb3cKLSAgICogaXQuCi0gICAqCi0gICAqIEBwYXJhbSB1bml0IFRoZSB1bml0IHdob3NlIHVuY29hbGVzY2FibGUgYml0IGlzIHRvIGJlIGNsZWFyZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNsZWFyVW5jb2FsZXNjYWJsZShpbnQgdW5pdCkgewotICAgIHNldExvRW50cnkodW5pdCwgZ2V0TG9FbnRyeSh1bml0KSAmIH5DT0FMRVNDX01BU0spOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0cnVlIGlmIHRoaXMgdW5pdCBtYXkgYmUgY29hbGVzY2VkIHdpdGggdGhlIHVuaXQgYmVsb3cgaXQuCi0gICAqCi0gICAqIEBwYXJhbSB1bml0IFRoZSB1bml0IGluIHF1ZXN0aW9uCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHVuaXQgbWF5IGJlIGNvYWxlc2NlZCB3aXRoIHRoZSB1bml0IGJlbG93IGl0LgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGlzQ29hbGVzY2FibGUoaW50IHVuaXQpIHsKLSAgICByZXR1cm4gKGdldExvRW50cnkodW5pdCkgJiBDT0FMRVNDX01BU0spID09IDA7Ci0gIH0KLQotIC8qKgotICAgKiBHZXQgdGhlIGx1bXAgdG8gdGhlICJsZWZ0IiBvZiB0aGUgY3VycmVudCBsdW1wIChpLmUuICJhYm92ZSIgaXQpCi0gICAqCi0gICAqIEBwYXJhbSB1bml0IFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgdW5pdCBpbiB0aGUgbHVtcCBpbiBxdWVzdGlvbgotICAgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgdW5pdCBpbiB0aGUgbHVtcCB0byB0aGUKLSAgICogImxlZnQiLyJhYm92ZSIgdGhlIGx1bXAgaW4gcXVlc3Rpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgaW50IGdldExlZnQoaW50IHVuaXQpIHsKLSAgICBpZiAoKGdldEhpRW50cnkodW5pdCAtIDEpICYgTVVMVElfTUFTSykgPT0gTVVMVElfTUFTSykKLSAgICAgIHJldHVybiB1bml0IC0gKGdldEhpRW50cnkodW5pdCAtIDEpICYgU0laRV9NQVNLKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gdW5pdCAtIDE7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGNvbnRlbnRzIG9mIGFuIGVudHJ5Ci0gICAqCi0gICAqIEBwYXJhbSB1bml0IFRoZSBpbmRleCBvZiB0aGUgdW5pdAotICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiB0aGUgdW5pdAotICAgKi8KLSAgcHJpdmF0ZSBpbnQgZ2V0TG9FbnRyeShpbnQgdW5pdCkgewotICAgIHJldHVybiB0YWJsZVsodW5pdCArIGhlYWRzKSA8PCAxXTsKLSAgfQotICBwcml2YXRlIGludCBnZXRIaUVudHJ5KGludCB1bml0KSB7Ci0gICAgcmV0dXJuIHRhYmxlWygodW5pdCArIGhlYWRzKSA8PCAxKSArIDFdOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgY29udGVudHMgb2YgYW4gZW50cnkKLSAgICoKLSAgICogQHBhcmFtIHVuaXQgVGhlIGluZGV4IG9mIHRoZSB1bml0Ci0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgY29udGVudHMgb2YgdGhlIHVuaXQKLSAgICovCi0gIHByaXZhdGUgdm9pZCBzZXRMb0VudHJ5KGludCB1bml0LCBpbnQgdmFsdWUpIHsKLSAgICB0YWJsZVsodW5pdCArIGhlYWRzKSA8PCAxXSA9IHZhbHVlOwotICB9Ci0gIHByaXZhdGUgdm9pZCBzZXRIaUVudHJ5KGludCB1bml0LCBpbnQgdmFsdWUpIHsKLSAgICB0YWJsZVsoKHVuaXQgKyBoZWFkcykgPDwgMSkgKyAxXSA9IHZhbHVlOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPVEFMX0JJVFMgPSAzMjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVOSVRfQklUUyA9IChUT1RBTF9CSVRTIC0gMik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9VTklUUyA9IChpbnQpICgoKCgobG9uZykgMSkgPDwgVU5JVF9CSVRTKSAtIDEpIC0gTUFYX0hFQURTIC0gMSk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBORVhUX01BU0sgPSAoaW50KSAoKCgobG9uZykgMSkgPDwgVU5JVF9CSVRTKSAtIDEpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJFVl9NQVNLID0gKGludCkgKCgoKGxvbmcpIDEpIDw8IFVOSVRfQklUUykgLSAxKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZSRUVfTUFTSyA9IDEgPDwgKFRPVEFMX0JJVFMgLSAxKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1VTFRJX01BU0sgPSAxIDw8IChUT1RBTF9CSVRTIC0gMSk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0FMRVNDX01BU0sgPSAxIDw8IChUT1RBTF9CSVRTIC0gMik7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpFX01BU0sgPSAoaW50KSAoKCgobG9uZykgMSkgPDwgVU5JVF9CSVRTKSAtIDEpOwotCi0gIHByaXZhdGUgaW50W10gdGFibGU7Ci0gIHByaXZhdGUgZmluYWwgR2VuZXJpY0ZyZWVMaXN0IHBhcmVudDsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9IZWFkZXJCeXRlLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvSGVhZGVyQnl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmE4NjIwLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9IZWFkZXJCeXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eTsKLQotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS5VbmludGVycnVwdGlibGU7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC5BZGRyZXNzOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuT2JqZWN0UmVmZXJlbmNlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgZ2VuZXJpYyBzdXBwb3J0IGZvciBvcGVyYXRpb25zIG92ZXIgdGhlIEdDIGJ5dGUKLSAqIHdpdGhpbiBlYWNoIG9iamVjdCdzIGhlYWRlciB3b3JkLiBTcGVjaWZpY2FsbHkgdGhpcyBjbGFzcyBtYW5hZ2VzCi0gKiBnbG9iYWwgc3RhdHVzIGJpdHMgd2hpY2ggY3V0IGFjcm9zcyBwb2xpY2llcyAoZm9yIGV4YW1wbGUgdGhlIGxvZ2dpbmcgYml0KS48cD4KLSAqCi0gKiBUaGUgZ2VuZXJhbCBwYXR0ZXJuIGZvciB1c2Ugb2YgdGhlIEdDIGJ5dGUgaXMgdGhhdCB0aGUgaGlnaCBvcmRlciBiaXRzCi0gKiBzdWNjZXNzaXZlbHkgcmVzZXJ2ZWQgZm9yIGdsb2JhbCB1c2UsIGFzIG5lY2Vzc2FyeS4gIEFueSBHQyBwb2xpY3kgbWF5IHVzZQotICogdGhvc2UgYml0cyB0aGF0IGFyZSBub3QgcmVzZXJ2ZWQgZm9yIGdsb2JhbCB1c2UuPHA+Ci0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBjbGFzcyBIZWFkZXJCeXRlIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPVEFMX0JJVFMgPSA4OwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBORUVEU19VTkxPR0dFRF9CSVQgPSBWTS5hY3RpdmVQbGFuLmNvbnN0cmFpbnRzKCkubmVlZHNMb2dCaXRJbkhlYWRlcigpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5MT0dHRURfQklUX05VTUJFUiA9IFRPVEFMX0JJVFMgLSAoTkVFRFNfVU5MT0dHRURfQklUID8gMSA6IDApOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgVU5MT0dHRURfQklUID0gKGJ5dGUpICgxPDxVTkxPR0dFRF9CSVRfTlVNQkVSKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVNFRF9HTE9CQUxfQklUUyA9IFRPVEFMX0JJVFMgLSBVTkxPR0dFRF9CSVRfTlVNQkVSOwotCi0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYW55IHJlcXVpcmVkIGluaXRpYWxpemF0aW9uIG9mIHRoZSBHQyBwb3J0aW9uIG9mIHRoZSBoZWFkZXIuCi0gICAqIENhbGxlZCBmb3Igb2JqZWN0cyBjcmVhdGVkIGF0IGJvb3QgdGltZS4KLSAgICoKLSAgICogQHBhcmFtIHJlZiB0aGUgb2JqZWN0IHJlZiB0byB0aGUgc3RvcmFnZSB0byBiZSBpbml0aWFsaXplZAotICAgKiBAcGFyYW0gdHlwZVJlZiB0aGUgdHlwZSByZWZlcmVuY2UgZm9yIHRoZSBpbnN0YW5jZSBiZWluZyBjcmVhdGVkCi0gICAqIEBwYXJhbSBzaXplIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIGJ5IHRoZSBHQyBzeXN0ZW0gZm9yCi0gICAqIHRoaXMgb2JqZWN0LgotICAgKiBAcGFyYW0gc3RhdHVzIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBzdGF0dXMgd29yZAotICAgKiBAcmV0dXJuIFRoZSBuZXcgdmFsdWUgb2YgdGhlIHN0YXR1cyB3b3JkCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJ5dGUgc2V0QnVpbGRUaW1lR0NCeXRlKEFkZHJlc3Mgb2JqZWN0LCBPYmplY3RSZWZlcmVuY2UgdHlwZVJlZiwgaW50IHNpemUpIHsKLSAgICBieXRlIHN0YXR1cyA9IDA7Ci0KLSAgICBpZiAoTkVFRFNfVU5MT0dHRURfQklUKQotICAgICAgc3RhdHVzIHw9IFVOTE9HR0VEX0JJVDsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFya0FzVW5sb2dnZWQoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGJ5dGUgdmFsdWUgPSBWTS5vYmplY3RNb2RlbC5yZWFkQXZhaWxhYmxlQnl0ZShvYmplY3QpOwotICAgIFZNLm9iamVjdE1vZGVsLndyaXRlQXZhaWxhYmxlQnl0ZShvYmplY3QsIChieXRlKSAodmFsdWUgfCBVTkxPR0dFRF9CSVQpKTsKLSAgfQotCi0gIC8qKgotICAgKiBNYXJrIGFuIG9iamVjdCBhcyBsb2dnZWQuICBTaW5jZSBkdXBsaWNhdGUgbG9nZ2luZyBkb2VzCi0gICAqIG5vdCByYWlzZSBhbnkgY29ycmVjdG5lc3MgaXNzdWVzLCB3ZSBkbyA8aT5ub3Q8L2k+IHdvcnJ5Ci0gICAqIGFib3V0IHN5bmNocm9uaXphdGlvbiBhbmQgYWxsb3cgdGhyZWFkcyB0byByYWNlIHRvIGxvZyB0aGUKLSAgICogb2JqZWN0LCBwb3RlbnRpYWxseSBpbmNsdWRpbmcgaXQgdHdpY2UgKHVubGlrZSByZWZlcmVuY2UKLSAgICogY291bnRpbmcgd2hlcmUgZHVwbGljYXRlcyB3b3VsZCBsZWFkIHRvIGluY29ycmVjdCByZWZlcmVuY2UKLSAgICogY291bnRzKS4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIG1hcmtlZCBhcyBsb2dnZWQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYXJrQXNMb2dnZWQoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGJ5dGUgdmFsdWUgPSBWTS5vYmplY3RNb2RlbC5yZWFkQXZhaWxhYmxlQnl0ZShvYmplY3QpOwotICAgIFZNLm9iamVjdE1vZGVsLndyaXRlQXZhaWxhYmxlQnl0ZShvYmplY3QsIChieXRlKSAodmFsdWUgJiB+VU5MT0dHRURfQklUKSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgbmVlZHMgdG8gYmUgbG9nZ2VkLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgaW4gcXVlc3Rpb24KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBvYmplY3QgaW4gcXVlc3Rpb24gbmVlZHMgdG8gYmUgbG9nZ2VkIChyZW1lbWJlcmVkKS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1VubG9nZ2VkKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBieXRlIHZhbHVlID0gVk0ub2JqZWN0TW9kZWwucmVhZEF2YWlsYWJsZUJ5dGUob2JqZWN0KTsKLSAgICByZXR1cm4gKHZhbHVlICYgVU5MT0dHRURfQklUKSA9PSBVTkxPR0dFRF9CSVQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9Mb2cuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9Mb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZGYwYi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvTG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NDIgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHk7Ci0KLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBFcnJvciBhbmQgdHJhY2UgbG9nZ2luZy4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIExvZyBpbXBsZW1lbnRzIENvbnN0YW50cyB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQ2xhc3MgdmFyaWFibGVzCi0gICAqLwotCi0gIC8qKgotICAgKiBjaGFyYWN0ZXJzIGluIHRoZSB3cml0ZSBidWZmZXIgZm9yIHRoZSBjYWxsZXIncyBtZXNzYWdlLiAgVGhpcwotICAgKiBkb2VzIG5vdCBpbmNsdWRlIGNoYXJhY3RlcnMgcmVzZXJ2ZWQgZm9yIHRoZSBvdmVyZmxvdyBtZXNzYWdlLgotICAgKgotICAgKiBUaGlzIG5lZWRzIHRvIGJlIGxhcmdlIGJlY2F1c2UgSmlrZXMgUlZNJ3MgaW1wbGVtZW50YXRpb24gb2YgTG9jay5qYXZhCi0gICAqIGxvZ3MgYSBsb3Qgb2YgaW5mb3JtYXRpb24gd2hlbiB0aGVyZSBpcyBwb3RlbnRpYWwgR0MgZGVhZGxvY2suCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9CVUZGRVJfU0laRSA9IDMwMDA7Ci0KLSAgLyoqIG1lc3NhZ2UgYWRkZWQgd2hlbiB0aGUgd3JpdGUgYnVmZmVyIGhhcyBvdmVyZmxvd24gKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9WRVJGTE9XX01FU1NBR0UgPSAiLi4uIFdBUk5JTkc6IFRleHQgdHJ1bmNhdGVkLlxuIjsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIE9WRVJGTE9XX01FU1NBR0VfRklSU1RfQ0hBUiA9IE9WRVJGTE9XX01FU1NBR0UuY2hhckF0KDApOwotCi0gIC8qKiBjaGFyYWN0ZXJzIGluIHRoZSBvdmVyZmxvdyBtZXNzYWdlLCBpbmNsdWRpbmcgdGhlIChvcHRpb25hbCkgZmluYWwKLSAgICogbmV3bGluZSAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9WRVJGTE9XX1NJWkUgPSBPVkVSRkxPV19NRVNTQUdFLmxlbmd0aCgpOwotCi0gIC8qKgotICAgKiBjaGFyYWN0ZXJzIGluIGJ1ZmZlciBmb3IgYnVpbGRpbmcgc3RyaW5nIHJlcHJlc2VudGF0aW9ucyBvZgotICAgKiBsb25ncy4gIEEgbG9uZyBpcyBhIHNpZ25lZCA2NC1iaXQgaW50ZWdlciBpbiB0aGUgcmFuZ2UgLTJeNjMgdG8KLSAgICogMl42MysxLiAgVGhlIG51bWJlciBvZiBkaWdpdHMgaW4gdGhlIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YKLSAgICogMl42MyBpcyBjZWlsaW5nKGxvZzEwKDJeNjMpKSA9PSBjZWlsaW5nKDYzICogbG9nMTAoMikpID09IDE5LiAgQW4KLSAgICogZXh0cmEgY2hhcmFjdGVyIG1heSBiZSByZXF1aXJlZCBmb3IgYSBtaW51cyBzaWduICgtKS4gIFNvIHRoZQotICAgKiBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGlzIDIwLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFTVBfQlVGRkVSX1NJWkUgPSAyMDsKLQotICAvKiogc3RyaW5nIHRoYXQgcHJlZml4ZXMgbnVtYmVycyBsb2dnZWQgaW4gaGV4YWRlY2ltYWwgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFWF9QUkVGSVggPSAiMHgiOwotCi0gIC8qKgotICAgKiBsb2cyIG9mIG51bWJlciBvZiBiaXRzIHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIGhleGlkZW1pbWFsIGRpZ2l0Ci0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0JJVFNfSU5fSEVYX0RJR0lUID0gMjsKLQotICAvKioKLSAgICogbG9nMiBvZiBudW1iZXIgb2YgZGlnaXRzIGluIHRoZSB1bnNpZ25lZCBoZXhhZGVjaW1hbAotICAgKiByZXByZXNlbnRhdGlvbiBvZiBhIGJ5dGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0dfSEVYX0RJR0lUU19JTl9CWVRFID0gTE9HX0JJVFNfSU5fQllURSAtIExPR19CSVRTX0lOX0hFWF9ESUdJVDsKLQotICAvKioKLSAgICogbWFwIG9mIGhleGFkZWNpbWFsIGRpZ2l0IHZhbHVlcyB0byB0aGVpciBjaGFyYWN0ZXIgcmVwcmVzZW50YXRpb25zCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFtdIGhleERpZ2l0Q2hhcmFjdGVyID0KLSAgeyAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicgfTsKLQotICAvKiogbmV3IGxpbmUgY2hhcmFjdGVyLiBFbWl0dGVkIGJ5IHdyaXRlbG4gbWV0aG9kcy4gKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBORVdfTElORV9DSEFSID0gJ1xuJzsKLQotICAvKiogbG9nIGluc3RhbmNlIHVzZWQgYXQgYnVpbGQgdGltZS4gKi8KLSAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IG5ldyBMb2coKTsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbnN0YW5jZSB2YXJpYWJsZXMKLSAgICovCi0KLSAgLyoqIGJ1ZmZlciB0byBzdG9yZSB3cml0dGVuIG1lc3NhZ2UgdW50aWwgZmx1c2hpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIFtdIGJ1ZmZlciA9IG5ldyBjaGFyW01FU1NBR0VfQlVGRkVSX1NJWkUgKyBPVkVSRkxPV19TSVpFXTsKLQotICAvKiogbG9jYXRpb24gb2YgbmV4dCBjaGFyYWN0ZXIgdG8gYmUgd3JpdHRlbiAqLwotICBwcml2YXRlIGludCBidWZmZXJJbmRleCA9IDA7Ci0KLSAgLyoqIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBidWZmZXIgaGFzIG92ZXJmbG93biAqLwotICBwcml2YXRlIGJvb2xlYW4gb3ZlcmZsb3cgPSBmYWxzZTsKLQotICAvKiogVGhlIGxhc3QgY2hhcmFjdGVyIHRoYXQgd2FzIHdyaXR0ZW4gYnkgI2FkZFRvQnVmZmVyKGNoYXIpLiAgVGhpcyBpcwotICAgICAgdXNlZCB0byBjaGVjayB3aGV0aGVyIHdlIHdhbnQgdG8gbmV3bGluZS10ZXJtaW5hdGUgdGhlIHRleHQuICovCi0gIHByaXZhdGUgY2hhciBvdmVyZmxvd0xhc3RDaGFyID0gJ1wwJzsKLQotICAvKiogPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSB0aHJlYWQgaWQgd2lsbCBiZSBwcmVwZW5kZWQgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHRocmVhZElkRmxhZyA9IGZhbHNlOwotCi0gIC8qKiBidWZmZXIgZm9yIGJ1aWxkaW5nIHN0cmluZyByZXByZXNlbnRhdGlvbnMgb2YgbG9uZ3MgKi8KLSAgcHJpdmF0ZSBjaGFyW10gdGVtcEJ1ZmZlciA9IG5ldyBjaGFyW1RFTVBfQlVGRkVSX1NJWkVdOwotCi0gIC8qKiBjb25zdHJ1Y3RvciAqLwotICBwdWJsaWMgTG9nKCkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgT1ZFUkZMT1dfU0laRTsgaSsrKSB7Ci0gICAgICBidWZmZXJbTUVTU0FHRV9CVUZGRVJfU0laRSArIGldID0gT1ZFUkZMT1dfTUVTU0FHRS5jaGFyQXQoaSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIHdyaXRlcyBhIGJvb2xlYW4uIEVpdGhlciAidHJ1ZSIgb3IgImZhbHNlIiBpcyBsb2dnZWQuCi0gICAqCi0gICAqIEBwYXJhbSBiIGJvb2xlYW4gdmFsdWUgdG8gYmUgbG9nZ2VkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlKGJvb2xlYW4gYikgewotICAgIHdyaXRlKGIgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgfQotCi0gIC8qKgotICAgKiB3cml0ZXMgYSBjaGFyYWN0ZXIKLSAgICoKLSAgICogQHBhcmFtIGMgY2hhcmFjdGVyIHRvIGJlIGxvZ2dlZAotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlKGNoYXIgYykgewotICAgIGFkZChjKTsKLSAgfQotCi0gIC8qKgotICAgKiB3cml0ZXMgYSBsb25nLCBpbiBkZWNpbWFsLiAgVGhlIHZhbHVlIGlzIG5vdCBwYWRkZWQgYW5kIG5vCi0gICAqIHRob3VzYW5kcyBzZXBlcmF0b3IgaXMgbG9nZ2VkLiAgSWYgdGhlIHZhbHVlIGlzIG5lZ2F0aXZlIGEKLSAgICogbGVhZGluZyBtaW51cyBzaWduICgtKSBpcyBsb2dnZWQuCi0gICAqCi0gICAqCi0gICAqIEBwYXJhbSBsIGxvbmcgdmFsdWUgdG8gYmUgbG9nZ2VkCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGUobG9uZyBsKSB7Ci0gICAgYm9vbGVhbiBuZWdhdGl2ZSA9IGwgPCAwOwotICAgIGludCBuZXh0RGlnaXQ7Ci0gICAgY2hhciBuZXh0Q2hhcjsKLSAgICBpbnQgaW5kZXggPSBURU1QX0JVRkZFUl9TSVpFIC0gMTsKLSAgICBjaGFyW10gaW50QnVmZmVyID0gZ2V0SW50QnVmZmVyKCk7Ci0KLSAgICBuZXh0RGlnaXQgPSAoaW50KSAobCAlIDEwKTsKLSAgICBuZXh0Q2hhciA9IGhleERpZ2l0Q2hhcmFjdGVyW25lZ2F0aXZlID8gLSBuZXh0RGlnaXQgOiBuZXh0RGlnaXRdOwotICAgIGludEJ1ZmZlcltpbmRleC0tXSA9IG5leHRDaGFyOwotICAgIGwgPSBsIC8gMTA7Ci0KLSAgICB3aGlsZSAobCAhPSAwKSB7Ci0gICAgICBuZXh0RGlnaXQgPSAoaW50KSAobCAlIDEwKTsKLSAgICAgIG5leHRDaGFyID0gaGV4RGlnaXRDaGFyYWN0ZXJbbmVnYXRpdmUgPyAtIG5leHREaWdpdCA6IG5leHREaWdpdF07Ci0gICAgICBpbnRCdWZmZXJbaW5kZXgtLV0gPSBuZXh0Q2hhcjsKLSAgICAgIGwgPSBsIC8gMTA7Ci0gICAgfQotCi0gICAgaWYgKG5lZ2F0aXZlKSB7Ci0gICAgICBpbnRCdWZmZXJbaW5kZXgtLV0gPSAnLSc7Ci0gICAgfQotCi0gICAgZm9yIChpbmRleCsrOyBpbmRleCA8IFRFTVBfQlVGRkVSX1NJWkU7IGluZGV4KyspIHsKLSAgICAgIGFkZChpbnRCdWZmZXJbaW5kZXhdKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogd3JpdGVzIGEgPGNvZGU+ZG91YmxlPC9jb2RlPi4gIFR3byBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQKLSAgICogYXJlIGFsd2F5cyBsb2dnZWQuICBUaGUgdmFsdWUgaXMgbm90IHBhZGRlZCBhbmQgbm8gdGhvdXNhbmRzCi0gICAqIHNlcGVyYXRvciBpcyB1c2VkLiAgSWYgdGhlIHZhbHVlIGlzIG5lZ2F0aXZlIGEgbGVhZGluZwotICAgKiBoeXBoZW4tbWludXMgKC0pIGlzIGxvZ2dlZC4gIFRoZSBkZWNpbWFsIHBvaW50IGlzIGEgZnVsbCBzdG9wCi0gICAqICguKS4KLSAgICoKLSAgICogQHBhcmFtIGQgdGhlIGRvdWJsZSB0byBiZSBsb2dnZWQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZShkb3VibGUgZCkgeyB3cml0ZShkLCAyKTsgfQotCi0gIC8qKgotICAgKiB3cml0ZXMgYSA8Y29kZT5kb3VibGU8L2NvZGU+LiAgVGhlIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlCi0gICAqIGRlY2ltYWwgcG9pbnQgaXMgZGV0ZXJtaW5lZCBieSA8Y29kZT5wb3N0RGVjaW1hbERpZ2l0czwvY29kZT4uCi0gICAqIFRoZSB2YWx1ZSBpcyBub3QgcGFkZGVkIGFuZCBub3QgdGhvdXNhbmRzIHNlcGVyYXRvciBpcyB1c2VkLiBJZgotICAgKiB0aGUgdmFsdWUgaXMgbmVnYXRpdmUgYSBsZWFkaW5nIGh5cGhlbi1taW51cyAoLSkgaXMgbG9nZ2VkLiAgVGhlCi0gICAqIGRlY2ltYWwgcG9pbnQgaXMgYSBmdWxsIHN0b3AgKC4pIGFuZCBpcyBsb2dnZWQgZXZlbiBpZgotICAgKiA8cG9zdERlY2ltY2FsRGlnaXRzPC9jb2RlPiBpcyB6ZXJvLiBJZiA8Y29kZT5kPC9jb2RlPiBpcyBncmVhdGVyCi0gICAqIHRoYW4gdGhlIGxhcmdlc3QgcmVwcmVzZW50YWJsZSB2YWx1ZSBvZiB0eXBlIDxjb2RlPmludDwvY29kZT4sIGl0Ci0gICAqIGlzIGxvZ2dlZCBhcyAiVG9vQmlnIi4gIFNpbWlsYXJseSwgaWYgaXQgaXMgbGVzcyB0aGFuCi0gICAqIHRoZSBuZWdhdGl2ZSBvZiB0aGUgbGFyZ2VzdCByZXByZXNlbnRhYmxlIHZhbHVlLCBpdCBpcyBsb2dnZWQgYXMKLSAgICogIlRvb1NtYWxsIi4gIElmIDxjb2RlPmQ8L2NvZGU+IGlzIE5hTiBpcyBpcyBsb2dnZWQgYXMgIk5hTiIuCi0gICAqCi0gICAqIEBwYXJhbSBkIHRoZSBkb3VibGUgdG8gYmUgbG9nZ2VkCi0gICAqIEBwYXJhbSBwb3N0RGVjaW1hbERpZ2l0cyB0aGUgbnVtYmVyIG9mIGRpZ2l0cyB0byBiZSBsb2dnZWQgYWZ0ZXIKLSAgICogdGhlIGRlY2ltYWwgcG9pbnQuICBJZiBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVybyBubyBkaWdpdHMgYXJlCi0gICAqIGxvZ2dlZCwgYnV0IHRoZSBkZWNpbWFsIHBvaW50IGlzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlKGRvdWJsZSBkLCBpbnQgcG9zdERlY2ltYWxEaWdpdHMpIHsKLSAgICBpZiAoZCAhPSBkKSB7Ci0gICAgICB3cml0ZSgiTmFOIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChkID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKLSAgICAgIHdyaXRlKCJUb29CaWciKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGQgPCAtSW50ZWdlci5NQVhfVkFMVUUpIHsKLSAgICAgIHdyaXRlKCJUb29TbWFsbCIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGJvb2xlYW4gbmVnYXRpdmUgPSAoZCA8IDAuMCk7Ci0gICAgZCA9IG5lZ2F0aXZlID8gKC1kKSA6IGQ7ICAgICAgIC8vIFRha2UgYWJzb2x1dGUgdmFsdWUKLSAgICBpbnQgb25lcyA9IChpbnQpIGQ7Ci0gICAgaW50IG11bHRpcGxpZXIgPSAxOwotICAgIHdoaWxlIChwb3N0RGVjaW1hbERpZ2l0cy0tID4gMCkKLSAgICAgIG11bHRpcGxpZXIgKj0gMTA7Ci0gICAgaW50IHJlbWFpbmRlciA9IChpbnQpIChtdWx0aXBsaWVyICogKGQgLSBvbmVzKSk7Ci0gICAgaWYgKHJlbWFpbmRlciA8IDApIHJlbWFpbmRlciA9IDA7Ci0gICAgaWYgKG5lZ2F0aXZlKSB3cml0ZSgnLScpOwotICAgIHdyaXRlKG9uZXMpOwotICAgIHdyaXRlKCcuJyk7Ci0gICAgd2hpbGUgKG11bHRpcGxpZXIgPiAxKSB7Ci0gICAgICBtdWx0aXBsaWVyIC89IDEwOwotICAgICAgd3JpdGUocmVtYWluZGVyIC8gbXVsdGlwbGllcik7Ci0gICAgICByZW1haW5kZXIgJT0gbXVsdGlwbGllcjsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogd3JpdGVzIGFuIGFycmF5IG9mIGNoYXJhY3RlcnMKLSAgICoKLSAgICogQHBhcmFtIGMgdGhlIGFycmF5IG9mIGNoYXJhY3RlcnMgdG8gYmUgbG9nZ2VkCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGUoY2hhcltdIGMpIHsKLSAgICB3cml0ZShjLCBjLmxlbmd0aCk7Ci0gIH0KLQotICAvKioKLSAgICogd3JpdGVzIHRoZSBzdGFydCBvZiBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzCi0gICAqCi0gICAqIEBwYXJhbSBjIHRoZSBhcnJheSBvZiBjaGFyYWN0ZXJzCi0gICAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIGxvZ2dlZCwgc3RhcnRpbmcgd2l0aAotICAgKiB0aGUgZmlyc3QgY2hhcmFjdGVyCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGUoY2hhcltdIGMsIGludCBsZW4pIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChsZW4gPD0gYy5sZW5ndGgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgIGFkZChjW2ldKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogd3JpdGVzIGFuIGFycmF5IG9mIGJ5dGVzLiAgVGhlIGJ5dGVzIGFyZSBpbnRlcnByZXR0ZWQKLSAgICogYXMgY2hhcmFjdGVycy4KLSAgICoKLSAgICogQHBhcmFtIGIgdGhlIGFycmF5IG9mIGJ5dGVzIHRvIGJlIGxvZ2dlZAotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBhZGQoKGNoYXIpYltpXSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIHdyaXRlcyBhIHN0cmluZwotICAgKgotICAgKiBAcGFyYW0gcyB0aGUgc3RyaW5nIHRvIGJlIGxvZ2dlZAotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlKFN0cmluZyBzKSB7Ci0gICAgYWRkKHMpOwotICB9Ci0KLSAgLyoqCi0gICAqIHdyaXRlcyBhIHdvcmQsIGluIGhleGFkZWNpbWFsLiAgSXQgaXMgemVyby1wYWRkZWQgdG8gdGhlIHNpemUgb2YKLSAgICogYW4gYWRkcmVzcy4KLSAgICoKLSAgICogQHBhcmFtIHcgdGhlIHdvcmQgdG8gYmUgbG9nZ2VkCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGUoV29yZCB3KSB7Ci0gICAgd3JpdGVIZXgodywgQllURVNfSU5fQUREUkVTUyk7Ci0gIH0KLQotICAvKioKLSAgICogd3JpdGVzIGEgd29yZCwgaW4gZGVjaW1hbC4KLSAgICoKLSAgICogQHBhcmFtIHcgdGhlIHdvcmQgdG8gYmUgbG9nZ2VkCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVEZWMoV29yZCB3KSB7Ci0gICAgaWYgKEJZVEVTX0lOX0FERFJFU1MgPT0gNCkgewotICAgICAgd3JpdGUody50b0ludCgpKTsKLSAgICB9IGVsc2UgewotICAgICAgd3JpdGUody50b0xvbmcoKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIHdyaXRlcyBhbiBhZGRyZXNzLCBpbiBoZXhhZGVtaWNhbC4gSXQgaXMgemVyby1wYWRkZWQuCi0gICAqCi0gICAqIEBwYXJhbSBhIHRoZSBhZGRyZXNzIHRvIGJlIGxvZ2dlZAotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlKEFkZHJlc3MgYSkgewotICAgIHdyaXRlSGV4KGEudG9Xb3JkKCksIEJZVEVTX0lOX0FERFJFU1MpOwotICB9Ci0KLSAgLyoqCi0gICAqIHdyaXRlcyBhIHN0cmluZyBmb2xsb3dlZCBieSBhbiBhZGRyZXNzLCBpbiBoZXhhZGVtaWNhbC4KLSAgICogQHNlZSAjd3JpdGUoU3RyaW5nKQotICAgKiBAc2VlICN3cml0ZShBZGRyZXNzKQotICAgKgotICAgKiBAcGFyYW0gcyB0aGUgc3RyaW5nIHRvIGJlIGxvZ2dlZAotICAgKiBAcGFyYW0gYSB0aGUgYWRkcmVzcyB0byBiZSBsb2dnZWQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZShTdHJpbmcgcywgQWRkcmVzcyBhKSB7Ci0gICAgd3JpdGUocyk7Ci0gICAgd3JpdGUoYSk7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGUgYSBzdHJpbmcgZm9sbG93ZWQgYnkgYSBsb25nCi0gICAqIEBzZWUgI3dyaXRlKFN0cmluZykKLSAgICogQHNlZSAjd3JpdGUobG9uZykKLSAgICoKLSAgICogQHBhcmFtIHMgdGhlIHN0cmluZyB0byBiZSBsb2dnZWQKLSAgICogQHBhcmFtIGwgdGhlIGxvbmcgdG8gYmUgbG9nZ2VkCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGUoU3RyaW5nIHMsIGxvbmcgbCkgewotICAgIHdyaXRlKHMpOwotICAgIHdyaXRlKGwpOwotICB9Ci0KLSAgLyoqCi0gICAqIHdyaXRlcyBhbiBvYmplY3QgcmVmZXJlbmNlLCBpbiBoZXhhZGVtaWNhbC4gSXQgaXMgemVyby1wYWRkZWQuCi0gICAqCi0gICAqIEBwYXJhbSBvIHRoZSBvYmplY3QgcmVmZXJlbmNlIHRvIGJlIGxvZ2dlZAotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlKE9iamVjdFJlZmVyZW5jZSBvKSB7Ci0gICAgd3JpdGVIZXgoby50b0FkZHJlc3MoKS50b1dvcmQoKSwgQllURVNfSU5fQUREUkVTUyk7Ci0gIH0KLQotICAvKioKLSAgICogd3JpdGVzIGFuIG9mZnNldCwgaW4gaGV4YWRlbWljYWwuIEl0IGlzIHplcm8tcGFkZGVkLgotICAgKgotICAgKiBAcGFyYW0gbyB0aGUgb2Zmc2V0IHRvIGJlIGxvZ2dlZAotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlKE9mZnNldCBvKSB7Ci0gICAgd3JpdGVIZXgoby50b1dvcmQoKSwgQllURVNfSU5fQUREUkVTUyk7Ci0gIH0KLQotICAvKioKLSAgICogd3JpdGVzIGFuIGV4dGVudCwgaW4gaGV4YWRlbWljYWwuIEl0IGlzIHplcm8tcGFkZGVkLgotICAgKgotICAgKiBAcGFyYW0gZSB0aGUgZXh0ZW50IHRvIGJlIGxvZ2dlZAotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlKEV4dGVudCBlKSB7Ci0gICAgd3JpdGVIZXgoZS50b1dvcmQoKSwgQllURVNfSU5fQUREUkVTUyk7Ci0gIH0KLQotICAvKioKLSAgICogd3JpdGUgYSBuZXctbGluZSBhbmQgZmx1c2hlcyB0aGUgYnVmZmVyCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVsbigpIHsKLSAgICB3cml0ZWxuV2l0aEZsdXNoKHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIHdyaXRlcyBhIGJvb2xlYW4gYW5kIGEgbmV3LWxpbmUsIHRoZW4gZmx1c2hlcyB0aGUgYnVmZmVyLgotICAgKiBAc2VlICN3cml0ZShib29sZWFuKQotICAgKgotICAgKiBAcGFyYW0gYiBib29sZWFuIHZhbHVlIHRvIGJlIGxvZ2dlZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZWxuKGJvb2xlYW4gYikgeyB3cml0ZWxuKGIsIHRydWUpOyB9Ci0KLSAgLyoqCi0gICAqIHdyaXRlcyBhIGNoYXJhY3RlciBhbmQgYSBuZXctbGluZSwgdGhlbiBmbHVzaGVzIHRoZSBidWZmZXIuCi0gICAqIEBzZWUgI3dyaXRlKGNoYXIpCi0gICAqCi0gICAqIEBwYXJhbSBjIGNoYXJhY3RlciB0byBiZSBsb2dnZWQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZWxuKGNoYXIgYykgICAgeyB3cml0ZWxuKGMsIHRydWUpOyB9Ci0KLSAgLyoqCi0gICAqIHdyaXRlcyBhIGxvbmcsIGluIGRlY2ltYWwsIGFuZCBhIG5ldy1saW5lLCB0aGVuIGZsdXNoZXMgdGhlIGJ1ZmZlci4KLSAgICogQHNlZSAjd3JpdGUobG9uZykKLSAgICoKLSAgICogQHBhcmFtIGwgbG9uZyB2YWx1ZSB0byBiZSBsb2dnZWQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZWxuKGxvbmcgbCkgICAgeyB3cml0ZWxuKGwsIHRydWUpOyB9Ci0KLSAgLyoqCi0gICAqIHdyaXRlcyBhIDxjb2RlPmRvdWJsZTwvY29kZT4gYW5kIGEgbmV3LWxpbmUsIHRoZW4gZmx1c2hlcyB0aGUgYnVmZmVyLgotICAgKiBAc2VlICN3cml0ZShkb3VibGUpCi0gICAqCi0gICAqIEBwYXJhbSBkIHRoZSBkb3VibGUgdG8gYmUgbG9nZ2VkCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVsbihkb3VibGUgZCkgIHsgd3JpdGVsbihkLCB0cnVlKTsgfQotCi0gIC8qKgotICAgKiB3cml0ZXMgYSA8Y29kZT5kb3VibGU8L2NvZGU+IGFuZCBhIG5ldy1saW5lLCB0aGVuIGZsdXNoZXMgdGhlIGJ1ZmZlci4KLSAgICogQHNlZSAjd3JpdGUoZG91YmxlLCBpbnQpCi0gICAqCi0gICAqIEBwYXJhbSBkIHRoZSBkb3VibGUgdG8gYmUgbG9nZ2VkCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVsbihkb3VibGUgZCwgaW50IHBvc3REZWNpbWFsRGlnaXRzKSB7Ci0gICAgd3JpdGVsbihkLCBwb3N0RGVjaW1hbERpZ2l0cywgdHJ1ZSk7IH0KLQotICAvKioKLSAgICogd3JpdGVzIGFuIGFycmF5IG9mIGNoYXJhY3RlcnMgYW5kIGEgbmV3LWxpbmUsIHRoZW4gZmx1c2hlcyB0aGUgYnVmZmVyLgotICAgKiBAc2VlICN3cml0ZShjaGFyIFtdKQotICAgKgotICAgKiBAcGFyYW0gY2EgdGhlIGFycmF5IG9mIGNoYXJhY3RlcnMgdG8gYmUgbG9nZ2VkCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVsbihjaGFyIFtdIGNhKSB7IHdyaXRlbG4oY2EsIHRydWUpOyB9Ci0KLSAgLyoqCi0gICAqIHdyaXRlcyB0aGUgc3RhcnQgb2YgYW4gYXJyYXkgb2YgY2hhcmFjdGVycyBhbmQgYSBuZXctbGluZSwgdGhlbgotICAgKiBmbHVzaGVzIHRoZSBidWZmZXIuCi0gICAqIEBzZWUgI3dyaXRlKGNoYXJbXSwgaW50KQotICAgKgotICAgKiBAcGFyYW0gY2EgdGhlIGFycmF5IG9mIGNoYXJhY3RlcnMKLSAgICogQHBhcmFtIGxlbiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgbG9nZ2VkLCBzdGFydGluZyB3aXRoCi0gICAqIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZWxuKGNoYXIgW10gY2EsIGludCBsZW4pIHsgd3JpdGVsbihjYSwgbGVuLCB0cnVlKTsgfQotCi0gIC8qKgotICAgKiB3cml0ZXMgYW4gYXJyYXkgb2YgYnl0ZXMgYW5kIGEgbmV3LWxpbmUsIHRoZW4KLSAgICogZmx1c2hlcyB0aGUgYnVmZmVyLgotICAgKiBAc2VlICN3cml0ZShieXRlW10pCi0gICAqCi0gICAqIEBwYXJhbSBiIHRoZSBhcnJheSBvZiBieXRlcyB0byBiZSBsb2dnZWQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZWxuKGJ5dGUgW10gYikgeyB3cml0ZWxuKGIsIHRydWUpOyB9Ci0KLSAgLyoqCi0gICAqIHdyaXRlcyBhIHN0cmluZyBhbmQgYSBuZXctbGluZSwgdGhlbiBmbHVzaGVzIHRoZSBidWZmZXIuCi0gICAqCi0gICAqIEBwYXJhbSBzIHRoZSBzdHJpbmcgdG8gYmUgbG9nZ2VkCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVsbihTdHJpbmcgcykgIHsgd3JpdGVsbihzLCB0cnVlKTsgfQotCi0gIC8qKgotICAgKiB3cml0ZXMgYSB3b3JkLCBpbiBoZXhhZGVjaW1hbCwgYW5kIGEgbmV3LWxpbmUsIHRoZW4gZmx1c2hlcyB0aGUgYnVmZmVyLgotICAgKiBAc2VlICN3cml0ZShXb3JkKQotICAgKgotICAgKiBAcGFyYW0gdyB0aGUgd29yZCB0byBiZSBsb2dnZWQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZWxuKFdvcmQgdykgeyB3cml0ZWxuKHcsIHRydWUpOyB9Ci0KLSAgLyoqCi0gICAqIHdyaXRlcyBhbiBhZGRyZXNzLCBpbiBoZXhhZGVtaWNhbCwgYW5kIGEgbmV3LWxpbmUsIHRoZW4gZmx1c2hlcwotICAgKiB0aGUgYnVmZmVyLgotICAgKiBAc2VlICN3cml0ZShBZGRyZXNzKQotICAgKgotICAgKiBAcGFyYW0gYSB0aGUgYWRkcmVzcyB0byBiZSBsb2dnZWQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZWxuKEFkZHJlc3MgYSkgeyB3cml0ZWxuKGEsIHRydWUpOyB9Ci0KLSAgLyoqCi0gICAqIHdyaXRlcyBhbiBvYmplY3QgcmVmZXJlbmNlLCBpbiBoZXhhZGVtaWNhbCwgYW5kIGEgbmV3LWxpbmUsIHRoZW4KLSAgICogZmx1c2hlcyB0aGUgYnVmZmVyLgotICAgKiBAc2VlICN3cml0ZShPYmplY3RSZWZlcmVuY2UpCi0gICAqCi0gICAqIEBwYXJhbSBvIHRoZSBvYmplY3QgcmVmZXJlbmNlIHRvIGJlIGxvZ2dlZAotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlbG4oT2JqZWN0UmVmZXJlbmNlIG8pIHsgd3JpdGVsbihvLCB0cnVlKTsgfQotCi0gIC8qKgotICAgKiB3cml0ZXMgYW4gb2Zmc2V0LCBpbiBoZXhhZGVtaWNhbCwgYW5kIGEgbmV3LWxpbmUsIHRoZW4gZmx1c2hlcyB0aGUgYnVmZmVyLgotICAgKiBAc2VlICN3cml0ZShPZmZzZXQpCi0gICAqCi0gICAqIEBwYXJhbSBvIHRoZSBvZmZzZXQgdG8gYmUgbG9nZ2VkCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVsbihPZmZzZXQgbykgeyB3cml0ZWxuKG8sIHRydWUpOyB9Ci0KLSAgLyoqCi0gICAqIHdyaXRlcyBhbiBleHRlbnQsIGluIGhleGFkZW1pY2FsLCBhbmQgYSBuZXctbGluZSwgdGhlbiBmbHVzaGVzIHRoZSBidWZmZXIuCi0gICAqIEBzZWUgI3dyaXRlKEV4dGVudCkKLSAgICoKLSAgICogQHBhcmFtIGUgdGhlIGV4dGVudCB0byBiZSBsb2dnZWQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZWxuKEV4dGVudCBlKSB7IHdyaXRlbG4oZSwgdHJ1ZSk7IH0KLQotICAvKioKLSAgICogd3JpdGVzIGEgbmV3LWxpbmUgd2l0aG91dCBmbHVzaGluZyB0aGUgYnVmZmVyCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVsbk5vRmx1c2goKSB7Ci0gICAgd3JpdGVsbldpdGhGbHVzaChmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogd3JpdGVzIGEgYm9vbGVhbiBhbmQgYSBuZXctbGluZSwgdGhlbiBvcHRpb25hbGx5IGZsdXNoZXMgdGhlIGJ1ZmZlci4KLSAgICogQHNlZSAjd3JpdGUoYm9vbGVhbikKLSAgICoKLSAgICogQHBhcmFtIGIgYm9vbGVhbiB2YWx1ZSB0byBiZSBsb2dnZWQuCi0gICAqIEBwYXJhbSBmbHVzaCBpZiA8Y29kZT50cnVlPC9jb2RlPiB0aGVuIGZsdXNoZXMgdGhlIGJ1ZmZlcgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlbG4oYm9vbGVhbiBiLCBib29sZWFuIGZsdXNoKSB7Ci0gICAgd3JpdGUoYik7Ci0gICAgd3JpdGVsbldpdGhGbHVzaChmbHVzaCk7Ci0gIH0KLQotICAvKioKLSAgICogd3JpdGVzIGEgY2hhcmFjdGVyIGFuZCBhIG5ldy1saW5lLCB0aGVuIG9wdGlvbmFsbHkgZmx1c2hlcyB0aGUKLSAgICogYnVmZmVyLgotICAgKiBAc2VlICN3cml0ZShjaGFyKQotICAgKgotICAgKiBAcGFyYW0gYyBjaGFyYWN0ZXIgdG8gYmUgbG9nZ2VkCi0gICAqIEBwYXJhbSBmbHVzaCBpZiA8Y29kZT50cnVlPC9jb2RlPiB0aGVuIGZsdXNoZXMgdGhlIGJ1ZmZlcgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlbG4oY2hhciBjLCBib29sZWFuIGZsdXNoKSB7Ci0gICAgd3JpdGUoYyk7Ci0gICAgd3JpdGVsbldpdGhGbHVzaChmbHVzaCk7Ci0gIH0KLQotICAvKioKLSAgICogd3JpdGVzIGEgbG9uZywgaW4gZGVjaW1hbCwgYW5kIGEgbmV3LWxpbmUsIHRoZW4gb3B0aW9uYWxseSBmbHVzaGVzCi0gICAqIHRoZSBidWZmZXIuCi0gICAqIEBzZWUgI3dyaXRlKGxvbmcpCi0gICAqCi0gICAqIEBwYXJhbSBsIGxvbmcgdmFsdWUgdG8gYmUgbG9nZ2VkCi0gICAqIEBwYXJhbSBmbHVzaCBpZiA8Y29kZT50cnVlPC9jb2RlPiB0aGVuIGZsdXNoZXMgdGhlIGJ1ZmZlcgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlbG4obG9uZyBsLCBib29sZWFuIGZsdXNoKSB7Ci0gICAgd3JpdGUobCk7Ci0gICAgd3JpdGVsbldpdGhGbHVzaChmbHVzaCk7Ci0gIH0KLQotICAvKioKLSAgICogd3JpdGVzIGEgPGNvZGU+ZG91YmxlPC9jb2RlPiBhbmQgYSBuZXctbGluZSwgdGhlbiBvcHRpb25hbGx5IGZsdXNoZXMKLSAgICogdGhlIGJ1ZmZlci4KLSAgICogQHNlZSAjd3JpdGUoZG91YmxlKQotICAgKgotICAgKiBAcGFyYW0gZCB0aGUgZG91YmxlIHRvIGJlIGxvZ2dlZAotICAgKiBAcGFyYW0gZmx1c2ggaWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiBmbHVzaCB0aGUgYnVmZmVyCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVsbihkb3VibGUgZCwgYm9vbGVhbiBmbHVzaCkgewotICAgIHdyaXRlKGQpOwotICAgIHdyaXRlbG5XaXRoRmx1c2goZmx1c2gpOwotICB9Ci0KLSAgLyoqCi0gICAqIHdyaXRlcyBhIDxjb2RlPmRvdWJsZTwvY29kZT4gYW5kIGEgbmV3LWxpbmUsIHRoZW4gb3B0aW9uYWxseSBmbHVzaGVzCi0gICAqIHRoZSBidWZmZXIuCi0gICAqIEBzZWUgI3dyaXRlKGRvdWJsZSwgaW50KQotICAgKgotICAgKiBAcGFyYW0gZCB0aGUgZG91YmxlIHRvIGJlIGxvZ2dlZAotICAgKiBAcGFyYW0gZmx1c2ggaWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiBmbHVzaGVzIHRoZSBidWZmZXIKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZWxuKGRvdWJsZSBkLCBpbnQgcG9zdERlY2ltYWxEaWdpdHMsIGJvb2xlYW4gZmx1c2gpIHsKLSAgICB3cml0ZShkLCBwb3N0RGVjaW1hbERpZ2l0cyk7Ci0gICAgd3JpdGVsbldpdGhGbHVzaChmbHVzaCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiB3cml0ZXMgYW4gYXJyYXkgb2YgY2hhcmFjdGVycyBhbmQgYSBuZXctbGluZSwgdGhlbiBvcHRpb25hbGx5Ci0gICAqIGZsdXNoZXMgdGhlIGJ1ZmZlci4KLSAgICogQHNlZSAjd3JpdGUoY2hhciBbXSkKLSAgICoKLSAgICogQHBhcmFtIGNhIHRoZSBhcnJheSBvZiBjaGFyYWN0ZXJzIHRvIGJlIGxvZ2dlZAotICAgKiBAcGFyYW0gZmx1c2ggaWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiBmbHVzaGVzIHRoZSBidWZmZXIKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZWxuKGNoYXJbXSBjYSwgYm9vbGVhbiBmbHVzaCkgewotICAgIHdyaXRlKGNhKTsKLSAgICB3cml0ZWxuV2l0aEZsdXNoKGZsdXNoKTsKLSAgfQotCi0gIC8qKgotICAgKiB3cml0ZXMgdGhlIHN0YXJ0IG9mIGFuIGFycmF5IG9mIGNoYXJhY3RlcnMgYW5kIGEgbmV3LWxpbmUsIHRoZW4KLSAgICogb3B0aW9uYWxseSBmbHVzaGVzIHRoZSBidWZmZXIuCi0gICAqIEBzZWUgI3dyaXRlKGNoYXJbXSwgaW50KQotICAgKgotICAgKiBAcGFyYW0gY2EgdGhlIGFycmF5IG9mIGNoYXJhY3RlcnMKLSAgICogQHBhcmFtIGxlbiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgbG9nZ2VkLCBzdGFydGluZyB3aXRoCi0gICAqIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAgICogQHBhcmFtIGZsdXNoIGlmIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gZmx1c2hlcyB0aGUgYnVmZmVyCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVsbihjaGFyW10gY2EsIGludCBsZW4sIGJvb2xlYW4gZmx1c2gpIHsKLSAgICB3cml0ZShjYSwgbGVuKTsKLSAgICB3cml0ZWxuV2l0aEZsdXNoKGZsdXNoKTsKLSAgfQotCi0gIC8qKgotICAgKiB3cml0ZXMgYW4gYXJyYXkgb2YgYnl0ZXMgYW5kIGEgbmV3LWxpbmUsIHRoZW4gb3B0aW9uYWxseSBmbHVzaGVzIHRoZQotICAgKiBidWZmZXIuCi0gICAqIEBzZWUgI3dyaXRlKGJ5dGVbXSkKLSAgICoKLSAgICogQHBhcmFtIGIgdGhlIGFycmF5IG9mIGJ5dGVzIHRvIGJlIGxvZ2dlZAotICAgKiBAcGFyYW0gZmx1c2ggaWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiBmbHVzaGVzIHRoZSBidWZmZXIKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZWxuKGJ5dGVbXSBiLCBib29sZWFuIGZsdXNoKSB7Ci0gICAgd3JpdGUoYik7Ci0gICAgd3JpdGVsbldpdGhGbHVzaChmbHVzaCk7Ci0gIH0KLQotICAvKioKLSAgICogd3JpdGVzIGEgc3RyaW5nIGFuZCBhIG5ldy1saW5lLCB0aGVuIG9wdGlvbmFsbHkgZmx1c2hlcyB0aGUgYnVmZmVyLgotICAgKgotICAgKiBAcGFyYW0gcyB0aGUgc3RyaW5nIHRvIGJlIGxvZ2dlZAotICAgKiBAcGFyYW0gZmx1c2ggaWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiBmbHVzaGVzIHRoZSBidWZmZXIKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZWxuKFN0cmluZyBzLCBib29sZWFuIGZsdXNoKSB7Ci0gICAgd3JpdGUocyk7Ci0gICAgd3JpdGVsbldpdGhGbHVzaChmbHVzaCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVsbihTdHJpbmcgcywgbG9uZyBsKSB7Ci0gICAgd3JpdGUocyk7Ci0gICAgd3JpdGVsbihsKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIHdyaXRlcyBhIHdvcmQsIGluIGhleGFkZWNpbWFsLCBhbmQgYSBuZXctbGluZSwgdGhlbiBvcHRpb25hbGx5Ci0gICAqIGZsdXNoZXMgdGhlIGJ1ZmZlci4KLSAgICogQHNlZSAjd3JpdGUoV29yZCkKLSAgICoKLSAgICogQHBhcmFtIHcgdGhlIHdvcmQgdG8gYmUgbG9nZ2VkCi0gICAqIEBwYXJhbSBmbHVzaCBpZiA8Y29kZT50cnVlPC9jb2RlPiB0aGVuIGZsdXNoZXMgdGhlIGJ1ZmZlcgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlbG4oV29yZCB3LCBib29sZWFuIGZsdXNoKSB7Ci0gICAgd3JpdGUodyk7Ci0gICAgd3JpdGVsbldpdGhGbHVzaChmbHVzaCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiB3cml0ZXMgYW4gYWRkcmVzcywgaW4gaGV4YWRlbWljYWwsIGFuZCBhIG5ldy1saW5lLCB0aGVuIG9wdGlvbmFsbHkKLSAgICogZmx1c2hlcyB0aGUgYnVmZmVyLgotICAgKiBAc2VlICN3cml0ZShBZGRyZXNzKQotICAgKgotICAgKiBAcGFyYW0gYSB0aGUgYWRkcmVzcyB0byBiZSBsb2dnZWQKLSAgICogQHBhcmFtIGZsdXNoIGlmIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gZmx1c2hlcyB0aGUgYnVmZmVyCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVsbihBZGRyZXNzIGEsIGJvb2xlYW4gZmx1c2gpIHsKLSAgICB3cml0ZShhKTsKLSAgICB3cml0ZWxuV2l0aEZsdXNoKGZsdXNoKTsKLSAgfQotCi0gIC8qKgotICAgKiB3cml0ZXMgYW4gb2JqZWN0IHJlZmVyZW5jZSwgaW4gaGV4YWRlbWljYWwsIGFuZCBhIG5ldy1saW5lLCB0aGVuCi0gICAqIG9wdGlvbmFsbHkgZmx1c2hlcyB0aGUgYnVmZmVyLgotICAgKiBAc2VlICN3cml0ZShPYmplY3RSZWZlcmVuY2UpCi0gICAqCi0gICAqIEBwYXJhbSBvIHRoZSBvYmplY3QgcmVmZXJlbmNlIHRvIGJlIGxvZ2dlZAotICAgKiBAcGFyYW0gZmx1c2ggaWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiBmbHVzaGVzIHRoZSBidWZmZXIKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZWxuKE9iamVjdFJlZmVyZW5jZSBvLCBib29sZWFuIGZsdXNoKSB7Ci0gICAgd3JpdGUobyk7Ci0gICAgd3JpdGVsbldpdGhGbHVzaChmbHVzaCk7Ci0gIH0KLQotICAvKioKLSAgICogd3JpdGVzIGFuIG9mZnNldCwgaW4gaGV4YWRlbWljYWwsIGFuZCBhIG5ldy1saW5lLCB0aGVuIG9wdGlvbmFsbHkKLSAgICogZmx1c2hlcyB0aGUgYnVmZmVyLgotICAgKiBAc2VlICN3cml0ZShPZmZzZXQpCi0gICAqCi0gICAqIEBwYXJhbSBvIHRoZSBvZmZzZXQgdG8gYmUgbG9nZ2VkCi0gICAqIEBwYXJhbSBmbHVzaCBpZiA8Y29kZT50cnVlPC9jb2RlPiB0aGVuIGZsdXNoZXMgdGhlIGJ1ZmZlcgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlbG4oT2Zmc2V0IG8sIGJvb2xlYW4gZmx1c2gpIHsKLSAgICB3cml0ZShvKTsKLSAgICB3cml0ZWxuV2l0aEZsdXNoKGZsdXNoKTsKLSAgfQotCi0gIC8qKgotICAgKiB3cml0ZXMgYW4gZXh0ZW50LCBpbiBoZXhhZGVtaWNhbCwgYW5kIGEgbmV3LWxpbmUsIHRoZW4gb3B0aW9uYWxseQotICAgKiBmbHVzaGVzIHRoZSBidWZmZXIuCi0gICAqIEBzZWUgI3dyaXRlKEV4dGVudCkKLSAgICoKLSAgICogQHBhcmFtIGUgdGhlIGV4dGVudCB0byBiZSBsb2dnZWQKLSAgICogQHBhcmFtIGZsdXNoIGlmIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gZmx1c2hlcyB0aGUgYnVmZmVyCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVsbihFeHRlbnQgZSwgYm9vbGVhbiBmbHVzaCkgewotICAgIHdyaXRlKGUpOwotICAgIHdyaXRlbG5XaXRoRmx1c2goZmx1c2gpOwotICB9Ci0KLSAgLyoqCi0gICAqIHdyaXRlcyBhIHN0cmluZyBmb2xsb3dlZCBieSBhIEFkZHJlc3MKLSAgICogQHNlZSAjd3JpdGUoU3RyaW5nKQotICAgKiBAc2VlICN3cml0ZShBZGRyZXNzKQotICAgKgotICAgKiBAcGFyYW0gcyB0aGUgc3RyaW5nIHRvIGJlIGxvZ2dlZAotICAgKiBAcGFyYW0gYSB0aGUgQWRkcmVzcyB0byBiZSBsb2dnZWQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZWxuKFN0cmluZyBzLCBBZGRyZXNzIGEpIHsKLSAgICB3cml0ZShzKTsKLSAgICB3cml0ZWxuKGEpOwotICB9Ci0KLSAgLyoqCi0gICAqIExvZyBhIHRocmVhZCBpZGVudGlmaWVyIGF0IHRoZSBzdGFydCBvZiB0aGUgbmV4dCBtZXNzYWdlIGZsdXNoZWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgcHJlcGVuZFRocmVhZElkKCkgewotICAgIGdldExvZygpLnNldFRocmVhZElkRmxhZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIGZsdXNoZXMgdGhlIGJ1ZmZlci4gIFRoZSBidWZmZXJlZCBlZmZlY3RlZCBvZiB3cml0ZXMgc2luY2UgdGhlIGxhc3QKLSAgICogZmx1c2ggd2lsbCBiZSBsb2dnZWQgaW4gb25lIGJsb2NrIHdpdGhvdXQgb3V0cHV0IGZyb20gb3RoZXIKLSAgICogdGhyZWFkJ3MgbG9nZ2luZyBpbnRlcmxlYXZpbmcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgZmx1c2goKSB7Ci0gICAgZ2V0TG9nKCkuZmx1c2hCdWZmZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiB3cml0ZXMgYSBuZXctbGluZSBhbmQgb3B0aW9uYWxseSBmbHVzaGVzIHRoZSBidWZmZXIKLSAgICoKLSAgICogQHBhcmFtIGZsdXNoIGlmIDxjb2RlPnRydWU8L2NvZGU+IHRoZSBidWZmZXIgaXMgZmx1c2hlZAotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZWxuV2l0aEZsdXNoKGJvb2xlYW4gZmx1c2gpIHsKLSAgICBhZGQoTkVXX0xJTkVfQ0hBUik7Ci0gICAgaWYgKGZsdXNoKSB7Ci0gICAgICBmbHVzaCgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiB3cml0ZXMgYSA8Y29kZT5sb25nPC9jb2RlPiBpbiBoZXhhZGVjaW1hbAotICAgKgotICAgKiBAcGFyYW0gdyB0aGUgV29yZCB0byBiZSBsb2dnZWQKLSAgICogQHBhcmFtIGJ5dGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgbG9uZyB0byBiZSBsb2dnZWQuICBJZgotICAgKiBsZXNzIHRoYW4gOCB0aGVuIHRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlcyBhcmUgbG9nZ2VkIGFuZCBzb21lCi0gICAqIG9mIHRoZSBtb3N0IHNpZ25pZmljYW50IGJ5dGVzIGFyZSBpZ25vcmVkLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZUhleChXb3JkIHcsIGludCBieXRlcykgewotICAgIGludCBoZXhEaWdpdHMgPSBieXRlcyAqICgxIDw8IExPR19IRVhfRElHSVRTX0lOX0JZVEUpOwotICAgIGludCBuZXh0RGlnaXQ7Ci0KLSAgICB3cml0ZShIRVhfUFJFRklYKTsKLQotICAgIGZvciAoaW50IGRpZ2l0TnVtYmVyID0gaGV4RGlnaXRzIC0gMTsgZGlnaXROdW1iZXIgPj0gMDsgZGlnaXROdW1iZXItLSkgewotICAgICAgbmV4dERpZ2l0ID0gdy5yc2hsKGRpZ2l0TnVtYmVyIDw8IExPR19CSVRTX0lOX0hFWF9ESUdJVCkudG9JbnQoKSAmIDB4ZjsKLSAgICAgIGNoYXIgbmV4dENoYXIgPSBoZXhEaWdpdENoYXJhY3RlcltuZXh0RGlnaXRdOwotICAgICAgYWRkKG5leHRDaGFyKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogYWRkcyBhIGNoYXJhY3RlciB0byB0aGUgYnVmZmVyCi0gICAqCi0gICAqIEBwYXJhbSBjIHRoZSBjaGFyYWN0ZXIgdG8gYWRkCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZChjaGFyIGMpIHsKLSAgICBnZXRMb2coKS5hZGRUb0J1ZmZlcihjKTsKLSAgfQotCi0gIC8qKgotICAgKiBhZGRzIGEgc3RyaW5nIHRvIHRoZSBidWZmZXIKLSAgICoKLSAgICogQHBhcmFtIHMgdGhlIHN0cmluZyB0byBhZGQKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkKFN0cmluZyBzKSB7Ci0gICAgZ2V0TG9nKCkuYWRkVG9CdWZmZXIocyk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBMb2cgZ2V0TG9nKCkgewotICAgIGlmIChWTS5hc3NlcnRpb25zLnJ1bm5pbmdWTSgpKSB7Ci0gICAgICByZXR1cm4gVk0uYWN0aXZlUGxhbi5sb2coKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGxvZzsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogYWRkcyBhIGNoYXJhY3RlciB0byB0aGUgYnVmZmVyCi0gICAqCi0gICAqIEBwYXJhbSBjIHRoZSBjaGFyYWN0ZXIgdG8gYWRkCi0gICAqLwotICBwcml2YXRlIHZvaWQgYWRkVG9CdWZmZXIoY2hhciBjKSB7Ci0gICAgaWYgKGJ1ZmZlckluZGV4IDwgTUVTU0FHRV9CVUZGRVJfU0laRSkgewotICAgICAgYnVmZmVyW2J1ZmZlckluZGV4KytdID0gYzsKLSAgICB9IGVsc2UgewotICAgICAgb3ZlcmZsb3cgPSB0cnVlOwotICAgICAgb3ZlcmZsb3dMYXN0Q2hhciA9IGM7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIGFkZHMgYSBzdHJpbmcgdG8gdGhlIGJ1ZmZlcgotICAgKgotICAgKiBAcGFyYW0gcyB0aGUgc3RyaW5nIHRvIGFkZAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGFkZFRvQnVmZmVyKFN0cmluZyBzKSB7Ci0gICAgaWYgKGJ1ZmZlckluZGV4IDwgTUVTU0FHRV9CVUZGRVJfU0laRSkgewotICAgICAgYnVmZmVySW5kZXggKz0gVk0uc3RyaW5ncy5jb3B5U3RyaW5nVG9DaGFycyhzLCBidWZmZXIsIGJ1ZmZlckluZGV4LCBNRVNTQUdFX0JVRkZFUl9TSVpFICsgMSk7Ci0gICAgICBpZiAoYnVmZmVySW5kZXggPT0gTUVTU0FHRV9CVUZGRVJfU0laRSArIDEpIHsKLSAgICAgICAgb3ZlcmZsb3cgPSB0cnVlOwotICAgICAgICAvLyBXZSBkb24ndCBib3RoZXIgc2V0dGluZyBPVkVSRkxPV19MQVNUX0NIQVIsIHNpbmNlIHdlIGRvbid0IGhhdmUgYW4KLSAgICAgICAgLy8gTU1UayBtZXRob2QgdGhhdCBsZXRzIHVzIHBlZWsgaW50byBhIHN0cmluZy4gQW55d2F5LCBpdCdzIGp1c3QgYQotICAgICAgICAvLyBjb252ZW5pZW5jZSB0byBnZXQgdGhlIG5ld2xpbmUgcmlnaHQuCi0gICAgICAgIGJ1ZmZlcltNRVNTQUdFX0JVRkZFUl9TSVpFXSA9IE9WRVJGTE9XX01FU1NBR0VfRklSU1RfQ0hBUjsKLSAgICAgICAgYnVmZmVySW5kZXgtLTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgb3ZlcmZsb3cgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBmbHVzaGVzIHRoZSBidWZmZXIKLSAgICovCi0gIHByaXZhdGUgdm9pZCBmbHVzaEJ1ZmZlcigpIHsKLSAgICBpbnQgbmV3bGluZUFkanVzdCA9IG92ZXJmbG93TGFzdENoYXIgPT0gTkVXX0xJTkVfQ0hBUiA/IDAgOiAtMTsKLSAgICBpbnQgdG90YWxNZXNzYWdlU2l6ZSA9IG92ZXJmbG93ID8gKE1FU1NBR0VfQlVGRkVSX1NJWkUgKyBPVkVSRkxPV19TSVpFICsgbmV3bGluZUFkanVzdCkgOiBidWZmZXJJbmRleDsKLSAgICBpZiAodGhyZWFkSWRGbGFnKSB7Ci0gICAgICBWTS5zdHJpbmdzLndyaXRlVGhyZWFkSWQoYnVmZmVyLCB0b3RhbE1lc3NhZ2VTaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgVk0uc3RyaW5ncy53cml0ZShidWZmZXIsIHRvdGFsTWVzc2FnZVNpemUpOwotICAgIH0KLSAgICB0aHJlYWRJZEZsYWcgPSBmYWxzZTsKLSAgICBvdmVyZmxvdyA9IGZhbHNlOwotICAgIG92ZXJmbG93TGFzdENoYXIgPSAnXDAnOwotICAgIGJ1ZmZlckluZGV4ID0gMDsKLSAgfQotCi0gIC8qKgotICAgKiBzZXRzIHRoZSBmbGFnIHNvIHRoYXQgYSB0aHJlYWQgaWRlbnRpZmllciB3aWxsIGJlIGluY2x1ZGVkIGJlZm9yZQotICAgKiB0aGUgbG9nZ2VkIG1lc3NhZ2UKLSAgICovCi0gIHByaXZhdGUgdm9pZCBzZXRUaHJlYWRJZEZsYWcoKSB7Ci0gICAgdGhyZWFkSWRGbGFnID0gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBnZXRzIHRoZSBidWZmZXIgZm9yIGJ1aWxkaW5nIHN0cmluZyByZXByZXNlbnRhdGlvbnMgb2YgaW50ZWdlcnMuCi0gICAqIFRoZXJlIGlzIG9uZSBvZiB0aGVzZSBidWZmZXJzIGZvciBlYWNoIExvZyBpbnN0YW5jZS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXJbXSBnZXRJbnRCdWZmZXIoKSB7Ci0gICAgcmV0dXJuIGdldExvZygpLmdldFRlbXBCdWZmZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiBnZXRzIHRoZSBidWZmZXIgZm9yIGJ1aWxkaW5nIHN0cmluZyByZXByZXNlbnRhdGlvbnMgb2YgaW50ZWdlcnMuCi0gICAqLwotICBwcml2YXRlIGNoYXJbXSBnZXRUZW1wQnVmZmVyKCkgewotICAgIHJldHVybiB0ZW1wQnVmZmVyOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvTWVtb3J5LmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvTWVtb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiODYzZWYuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L01lbW9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5OwotCi1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGJhc2ljIG1lbW9yeSBjb3B5aW5nLCBzZXR0aW5nIGFuZCBjbGVhcmluZwotICogb3BlcmF0aW9ucy4KLSAqCi0gKiBOT1RFOiBNb3N0IG9mIHRoZSBvcGVyYXRpb25zIGluIHRoaXMgY2xhc3MgYXJlIHBlcmZvcm1lZCBhdCB0ZWgKLSAqIGdyYW51bGFyaXR5IG9mIGEgSmF2YSBpbnRlZ2VyIChpZSA0LWJ5dGUgdW5pdHMpCi0gKgotICogRklYTUU6IFdoeSBjYW4ndCB0aGVzZSBvcGVyYXRpb25zIGJlIHBlcmZvcm1lZCBhdCB3b3JkLWdyYW51bGFyaXR5PwotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgY2xhc3MgTWVtb3J5IGltcGxlbWVudHMgQ29uc3RhbnRzIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDbGFzcyB2YXJpYWJsZXMKLSAgICovCi0KLSAgLyoqIHplcm8gb3BlcmF0aW9ucyBncmVhdGVyIHRoYW4gdGhpcyBzaXplIGFyZSBkb25lIHVzaW5nIHRoZQotICAgKiB1bmRlcmx5aW5nIE9TIGltcGxlbWVudGF0aW9uIG9mIHplcm8oKSAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU01BTExfUkVHSU9OX1RIUkVTSE9MRCA9IDE8PDg7IC8vIGVtcGlyaWNhbGx5IGNob3NlbgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQmFzaWMgbWVtb3J5IHNldHRpbmcgYW5kIHplcm9pbmcgb3BlcmF0aW9ucwotICAgKi8KLQotICAvKioKLSAgICogWmVybyBhIHJlZ2lvbiBvZiBtZW1vcnkKLSAgICoKLSAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmVnaW9uIHRvIGJlIHplcm9lZCAobXVzdCBiZSA0LWJ5dGUgYWxpZ25lZCkKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgemVyb2VkIChtdXN0IGJlIDQtYnl0ZSBhbGlnbmVkKQotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIHZvaWQgemVybyhBZGRyZXNzIHN0YXJ0LCBFeHRlbnQgYnl0ZXMpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIHsKLSAgICAgIGFzc2VydEFsaWduZWQoc3RhcnQpOwotICAgICAgYXNzZXJ0QWxpZ25lZChieXRlcyk7Ci0gICAgfQotICAgIGlmIChieXRlcy5HVChFeHRlbnQuZnJvbUludFplcm9FeHRlbmQoU01BTExfUkVHSU9OX1RIUkVTSE9MRCkpKQotICAgICAgVk0ubWVtb3J5Lnplcm8oc3RhcnQsIGJ5dGVzKTsKLSAgICBlbHNlCi0gICAgICB6ZXJvU21hbGwoc3RhcnQsIGJ5dGVzKTsKLSAgfQotCi0gIC8qKgotICAgKiBaZXJvIGEgc21hbGwgcmVnaW9uIG9mIG1lbW9yeQotICAgKgotICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByZWdpb24gdG8gYmUgemVyb2VkIChtdXN0IGJlIDQtYnl0ZSBhbGlnbmVkKQotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyB0byBiZSB6ZXJvZWQgKG11c3QgYmUgNC1ieXRlIGFsaWduZWQpCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvU21hbGwoQWRkcmVzcyBzdGFydCwgRXh0ZW50IGJ5dGVzKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSB7Ci0gICAgICBhc3NlcnRBbGlnbmVkKHN0YXJ0KTsKLSAgICAgIGFzc2VydEFsaWduZWQoYnl0ZXMpOwotICAgIH0KLSAgICBBZGRyZXNzIGVuZCA9IHN0YXJ0LnBsdXMoYnl0ZXMpOwotICAgIGZvciAoQWRkcmVzcyBhZGRyID0gc3RhcnQ7IGFkZHIuTFQoZW5kKTsgYWRkciA9IGFkZHIucGx1cyhCWVRFU19JTl9JTlQpKQotICAgICAgYWRkci5zdG9yZSgwKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgYSByZWdpb24gb2YgbWVtb3J5Ci0gICAqCi0gICAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJlZ2lvbiB0byBiZSB6ZXJvZWQgKG11c3QgYmUgNC1ieXRlIGFsaWduZWQpCi0gICAqIEBwYXJhbSBieXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHplcm9lZCAobXVzdCBiZSA0LWJ5dGUgYWxpZ25lZCkKLSAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB3aGljaCB0aGUgaW50ZWdlcnMgaW4gdGhlIHJlZ2lvbiBzaG91bGQgYmUgc2V0Ci0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXQoQWRkcmVzcyBzdGFydCwgaW50IGJ5dGVzLCBpbnQgdmFsdWUpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIHsKLSAgICAgIGFzc2VydEFsaWduZWQoc3RhcnQpOwotICAgICAgYXNzZXJ0QWxpZ25lZChieXRlcyk7Ci0gICAgfQotICAgIEFkZHJlc3MgZW5kID0gc3RhcnQucGx1cyhieXRlcyk7Ci0gICAgZm9yIChBZGRyZXNzIGFkZHIgPSBzdGFydDsgYWRkci5MVChlbmQpOyBhZGRyID0gYWRkci5wbHVzKEJZVEVTX0lOX0lOVCkpCi0gICAgICBhZGRyLnN0b3JlKHZhbHVlKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSGVscGVyIG1ldGhvZHMKLSAgICovCi0KLSAgLyoqCi0gICAqIENoZWNrIHRoYXQgYSBtZW1vcnkgcmFuZ2UgaXMgemVyb2VkCi0gICAqCi0gICAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgcmFuZ2UgdG8gYmUgY2hlY2tlZAotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIHNpemUgb2YgdGhlIHJlZ2lvbiB0byBiZSBjaGVja2VkLCBpbiBieXRlcwotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJlZ2lvbiBpcyB6ZXJvZWQKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIElzWmVyb2VkKEFkZHJlc3Mgc3RhcnQsIGludCBieXRlcykgewotICAgIHJldHVybiBpc1NldChzdGFydCwgYnl0ZXMsIGZhbHNlLCAwKTsKLSAgfQotCi0gIC8qKgotICAgKiBBc3NlcnQgdGhhdCBhIG1lbW9yeSByYW5nZSBpcyB6ZXJvZWQuICBBbiBhc3NlcnRpb24gZmFpbHVyZSB3aWxsCi0gICAqIG9jY3VyIGlmIHRoZSByZWdpb24gaXMgbm90IHplcm9lZC4KLSAgICoKLSAgICogdGhpcyBpcyBpbiB0aGUgaW5saW5lIGFsbG9jYXRpb24gc2VxdWVuY2Ugd2hlbgotICAgKiBWTS5WRVJJRllfQVNTRVJUSU9OUyBpcyB0cnVlLCBpdCBpcyBjYXJlZnVsbHkgd3JpdHRlbiB0bwotICAgKiByZWR1Y2UgdGhlIGltcGFjdCBvbiBjb2RlIHNwYWNlLgotICAgKgotICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIHJhbmdlIHRvIGJlIGNoZWNrZWQKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBzaXplIG9mIHRoZSByZWdpb24gdG8gYmUgY2hlY2tlZCwgaW4gYnl0ZXMKLSAgICovCi0gIEBOb0lubGluZQotICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0SXNaZXJvZWQoQWRkcmVzcyBzdGFydCwgaW50IGJ5dGVzKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoaXNTZXQoc3RhcnQsIGJ5dGVzLCB0cnVlLCAwKSk7Ci0gIH0KLQotICAvKioKLSAgICogVmVyYm9zZWx5IGNoZWNrIGFuZCByZXR1cm4gdHJ1ZSBpZiBhIG1lbW9yeSByYW5nZSBpcyBzZXQgdG8gc29tZQotICAgKiBpbnRlZ2VyIHZhbHVlCi0gICAqCi0gICAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgcmFuZ2UgdG8gYmUgY2hlY2tlZAotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIHNpemUgb2YgdGhlIHJlZ2lvbiB0byBiZSBjaGVja2VkLCBpbiBieXRlcwotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHdoaWNoIHRoaXMgcmVnaW9uIHNob3VsZCBiZSBzZXQKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSByZWdpb24gaGFzIGJlZW4gY29ycmVjdGx5IHNldAotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTZXQoQWRkcmVzcyBzdGFydCwgaW50IGJ5dGVzLCBpbnQgdmFsdWUpIHsKLSAgICByZXR1cm4gaXNTZXQoc3RhcnQsIGJ5dGVzLCB0cnVlLCB2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQXNzZXJ0IGFwcHJvcHJpYXRlIGFsaWdubWVudCwgdHJpZ2dlcmluZyBhbiBhc3NlcnRpb24gZmFpbHVyZSBpZgotICAgKiB0aGUgdmFsdWUgZG9lcyBub3Qgc2F0aXNpZnkgdGhlIGFsaWdubWVudCByZXF1aXJlbWVudCBvZiB0aGUKLSAgICogbWVtb3J5IG9wZXJhdGlvbnMuCi0gICAqCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgdGVzdGVkCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEFsaWduZWQoaW50IHZhbHVlKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoKHZhbHVlICYgKEJZVEVTX0lOX0lOVCAtIDEpKSA9PSAwKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0QWxpZ25lZChXb3JkIHZhbHVlKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQodmFsdWUuYW5kKFdvcmQuZnJvbUludFNpZ25FeHRlbmQoQllURVNfSU5fSU5ULTEpKS5pc1plcm8oKSk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEFsaWduZWQoRXh0ZW50IHZhbHVlKSB7Ci0gICAgYXNzZXJ0QWxpZ25lZCh2YWx1ZS50b1dvcmQoKSk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEFsaWduZWQoQWRkcmVzcyB2YWx1ZSkgewotICAgIGFzc2VydEFsaWduZWQodmFsdWUudG9Xb3JkKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3Qgd2hldGhlciBhIG1lbW9yeSByYW5nZSBpcyBzZXQgdG8gYSBnaXZlbiBpbnRlZ2VyIHZhbHVlCi0gICAqCi0gICAqIEBwYXJhbSBzdGFydCBUaGUgYWRkcmVzcyB0byBzdGFydCBjaGVja2luZyBhdAotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIHNpemUgb2YgdGhlIHJlZ2lvbiB0byBjaGVjaywgaW4gYnl0ZXMKLSAgICogQHBhcmFtIHZlcmJvc2UgSWYgdHJ1ZSwgcHJvZHVjZSB2ZXJib3NlIG91dHB1dAotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBtZW1vcnkgc2hvdWxkIGJlIHNldAotICAgKi8KLSAgQE5vSW5saW5lCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTZXQoQWRkcmVzcyBzdGFydCwgaW50IGJ5dGVzLCBib29sZWFuIHZlcmJvc2UsCi0gICAgICBpbnQgdmFsdWUpCi0gICAgLyogSW5saW5pbmcgdGhpcyBsb29wIGludG8gdGhlIHVuaW50ZXJydXB0aWJsZSBjb2RlIGNhbgotICAgICAqICBjYXVzZS9lbmNvdXJhZ2UgdGhlIEdDUCBpbnRvIG1vdmluZyBhIGdldF9vYmpfdGliIGludG8gdGhlCi0gICAgICogaW50ZXJydXB0aWJsZSByZWdpb24gd2hlcmUgdGhlIHRpYiBpcyBiZWluZyBpbnN0YWxsZWQgdmlhIGFuCi0gICAgICogaW50X3N0b3JlCi0gICAqLyB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBhc3NlcnRBbGlnbmVkKGJ5dGVzKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzOyBpICs9IEJZVEVTX0lOX0lOVCkKLSAgICAgIGlmIChzdGFydC5sb2FkSW50KE9mZnNldC5mcm9tSW50U2lnbkV4dGVuZChpKSkgIT0gdmFsdWUpIHsKLSAgICAgICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgICAgICBMb2cucHJlcGVuZFRocmVhZElkKCk7Ci0gICAgICAgICAgTG9nLndyaXRlKCJWTSByYW5nZSBkb2VzIG5vdCBjb250YWluIG9ubHkgdmFsdWUgIik7Ci0gICAgICAgICAgTG9nLndyaXRlbG4odmFsdWUpOwotICAgICAgICAgIExvZy53cml0ZSgiTm9uLXplcm8gcmFuZ2U6ICIpOyBMb2cud3JpdGUoc3RhcnQpOwotICAgICAgICAgIExvZy53cml0ZSgiIC4uICIpOyBMb2cud3JpdGVsbihzdGFydC5wbHVzKGJ5dGVzKSk7Ci0gICAgICAgICAgTG9nLndyaXRlKCJGaXJzdCBiYWQgdmFsdWUgYXQgIik7IExvZy53cml0ZWxuKHN0YXJ0LnBsdXMoaSkpOwotICAgICAgICAgIGR1bXBNZW1vcnkoc3RhcnQsIDAsIGJ5dGVzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogRHVtcCB0aGUgY29udGVudHMgb2YgbWVtb3J5IGFyb3VuZCBhIGdpdmVuIGFkZHJlc3MKLSAgICoKLSAgICogQHBhcmFtIGFkZHIgVGhlIGFkZHJlc3MgYXJvdW5kIHdoaWNoIHRoZSBtZW1vcnkgc2hvdWxkIGJlIGR1bXBlZAotICAgKiBAcGFyYW0gYmVmb3JlQnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyBiZWZvcmUgdGhlIGFkZHJlc3MgdG8gYmUKLSAgICogaW5jbHVkZWQgaW4gdGhlIGR1bXAKLSAgICogQHBhcmFtIGFmdGVyQnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyBhZnRlciB0aGUgYWRkcmVzcyB0byBiZQotICAgKiBpbmNsdWRlZCBpbiB0aGUgZHVtcAotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGR1bXBNZW1vcnkoQWRkcmVzcyBhZGRyLCBpbnQgYmVmb3JlQnl0ZXMsIGludCBhZnRlckJ5dGVzKSB7Ci0gICAgVk0ubWVtb3J5LmR1bXBNZW1vcnkoYWRkciwgYmVmb3JlQnl0ZXMsIGFmdGVyQnl0ZXMpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvU2ltcGxlSGFzaHRhYmxlLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvU2ltcGxlSGFzaHRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkM2RmYzMuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L1NpbXBsZUhhc2h0YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5OwotCi1pbXBvcnQgb3JnLm1tdGsucG9saWN5LlJhd1BhZ2VTcGFjZTsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBzaW1wbGUgaGFzaHRhYmxlLiBJdCBpcyBpbnRlbmRlZCBmb3IgdXNlCi0gKiBpbiBzYW5pdHkgY2hlY2tpbmcgb3IgZGVidWdnaW5nLCBub3QgaGlnaC1wZXJmb3JtYW5jZSBhbGdvcml0aG1zLjxwPgotICoKLSAqIFRoaXMgY2xhc3MgaXMgbm90IHRocmVhZCBzYWZlLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTaW1wbGVIYXNodGFibGUgaW1wbGVtZW50cyBDb25zdGFudHMgewotICAvKiogVGhlIG51bWJlciBvZiBsb3cgb3JkZXIgYml0cyB0byBpZ25vcmUgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhBU0hfU0hJRlQgPSAzOwotCi0gIC8qKiBPZmZzZXQgdG8gdGhlIGtleSAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPZmZzZXQgS0VZX09GRlNFVCA9IE9mZnNldC56ZXJvKCk7Ci0KLSAgLyoqIE9mZnNldCB0byB0aGUgZGF0YSAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPZmZzZXQgREFUQV9PRkZTRVQgPSBPZmZzZXQuZnJvbUludFNpZ25FeHRlbmQoQllURVNfSU5fV09SRCk7Ci0KLSAgLyoqIFRoZSBzaXplIG9mIGVhY2ggZW50cnkgaW4gdGhlIHRhYmxlICovCi0gIHByaXZhdGUgZmluYWwgRXh0ZW50IGVudHJ5U2l6ZTsKLQotICAvKiogVGhlIG1hc2sgdG8gdXNlIHRvIGdldCB0aGUgaGFzaCBjb2RlICovCi0gIHByaXZhdGUgZmluYWwgV29yZCBtYXNrOwotCi0gIC8qKiBUaGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgZGF0YSB0YWJsZSAqLwotICBwcml2YXRlIEFkZHJlc3MgYmFzZTsKLQotICAvKiogVGhlIGZ1bGwgc2l6ZSBvZiB0aGUgdGFibGUgKi8KLSAgcHJpdmF0ZSBmaW5hbCBFeHRlbnQgc2l6ZTsKLQotICAvKiogVGhlIHNwYWNlIHRvIHVzZSBmb3IgYWxsb2NhdGluZyB0aGUgZGF0YSBzdHJ1Y3R1cmUgKi8KLSAgcHJpdmF0ZSBmaW5hbCBSYXdQYWdlU3BhY2Ugc3BhY2U7Ci0KLSAgLyoqIElzIHRoaXMgdGFibGUgdmFsaWQgKGNyZWF0ZWQpICovCi0gIHByaXZhdGUgYm9vbGVhbiB2YWxpZDsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IGRhdGEgdGFibGUgb2YgYSBzcGVjaWZpZWQgc2l6ZS4KLSAgICoKLSAgICogQHBhcmFtIHJwcyBUaGUgc3BhY2UgdG8gYWNxdWlyZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgZnJvbS4KLSAgICogQHBhcmFtIGxvZ1NpemUgVGhlIGxvZyBvZiB0aGUgbnVtYmVyIG9mIHRhYmxlIGVudHJpZXMuCi0gICAqIEBwYXJhbSBlcyBUaGUgc2l6ZSBvZiBlYWNoIGVudHJ5LgotICAgKi8KLSAgcHJvdGVjdGVkIFNpbXBsZUhhc2h0YWJsZShSYXdQYWdlU3BhY2UgcnBzLCBpbnQgbG9nU2l6ZSwgRXh0ZW50IGVzKSB7Ci0gICAgbWFzayA9IFdvcmQuZnJvbUludFplcm9FeHRlbmQoKDEgPDwgbG9nU2l6ZSkgLSAxKTsKLSAgICBlbnRyeVNpemUgPSBlcy5wbHVzKEJZVEVTX0lOX1dPUkQpOwotICAgIHNpemUgPSBFeHRlbnQuZnJvbUludFplcm9FeHRlbmQoKDEgPDwgbG9nU2l6ZSkgKiBlbnRyeVNpemUudG9JbnQoKSk7Ci0gICAgYmFzZSA9IEFkZHJlc3MuemVybygpOwotICAgIHNwYWNlID0gcnBzOwotICAgIHZhbGlkID0gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgKHplcm9lZCkgdGFibGUuCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCBhY3F1aXJlVGFibGUoKSB7Ci0gICAgYmFzZSA9IHNwYWNlLmFjcXVpcmUoQ29udmVyc2lvbnMuYnl0ZXNUb1BhZ2VzKHNpemUpKTsKLSAgICBWTS5tZW1vcnkuemVybyhiYXNlLCBzaXplKTsKLSAgICB2YWxpZCA9IHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogRHJvcCB0aGUgdGFibGUgKGFmdGVyIGNvbGxlY3Rpb24pLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgcmVsZWFzZVRhYmxlKCkgewotICAgIHNwYWNlLnJlbGVhc2UoYmFzZSk7Ci0gICAgdmFsaWQgPSBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyB0YWJsZSBoYXMgYmFja2luZyBkYXRhIGFuZCBpcyByZWFkeSBmb3IgdXNlLgotICAgKi8KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNWYWxpZCgpIHsKLSAgICByZXR1cm4gdmFsaWQ7Ci0gIH0KLQotICAvKioKLSAgICogUmV0cmlldmUgYSBwb2ludGVyIHRvIHRoZSBlbnRyeSBmb3IgdGhlIGdpdmVuIG9iamVjdCwgb3IgemVybyBpZiBvbmUKLSAgICogZG9lcyBub3QgZXhpc3QsIHVubGVzcyBjcmVhdGUgaXMgcGFzc2VkLjxwPgotICAgKgotICAgKiBJZiBjcmVhdGUgaXMgdHJ1ZSwgdGhlIHJldHVybiBpcyBndWFyYW50ZWVkIHRvIGJlIG5vbi1udWxsLgotICAgKgotICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgdXNlZCB0byBsb29rdXAuCi0gICAqIEBwYXJhbSBjcmVhdGUgQ3JlYXRlIGEgbmV3IGVudHJ5IGlmIG5vdCBmb3VuZC4KLSAgICogQHJldHVybiBBIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBvciBudWxsLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgQWRkcmVzcyBnZXRFbnRyeShXb3JkIGtleSwgYm9vbGVhbiBjcmVhdGUpIHsKLSAgICBpbnQgc3RhcnRJbmRleCA9IGNvbXB1dGVIYXNoKGtleSk7Ci0gICAgaW50IGluZGV4ID0gc3RhcnRJbmRleDsKLSAgICBXb3JkIGN1ckFkZHJlc3M7Ci0gICAgQWRkcmVzcyBlbnRyeTsKLSAgICBkbyB7Ci0gICAgICBlbnRyeSA9IGdldEVudHJ5KGluZGV4KTsKLSAgICAgIGN1ckFkZHJlc3MgPSBlbnRyeS5sb2FkV29yZChLRVlfT0ZGU0VUKTsKLSAgICAgIGluZGV4ID0gKGluZGV4ICsgMSkgJiBtYXNrLnRvSW50KCk7Ci0gICAgfSB3aGlsZShjdXJBZGRyZXNzLk5FKGtleSkgJiYKLSAgICAgICAgICAgICFjdXJBZGRyZXNzLmlzWmVybygpICYmCi0gICAgICAgICAgICBpbmRleCAhPSBzdGFydEluZGV4KTsKLQotICAgIGlmIChpbmRleCA9PSBzdGFydEluZGV4KSB7Ci0gICAgICBWTS5hc3NlcnRpb25zLmZhaWwoIk5vIHJvb20gbGVmdCBpbiB0YWJsZSEiKTsKLSAgICB9Ci0KLSAgICBpZiAoY3VyQWRkcmVzcy5pc1plcm8oKSkgewotICAgICAgaWYgKCFjcmVhdGUpIHJldHVybiBBZGRyZXNzLnplcm8oKTsKLSAgICAgIGVudHJ5LnN0b3JlKGtleSwgS0VZX09GRlNFVCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVudHJ5OwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIGhhc2h0YWJsZSBpbmRleCBmb3IgYSBnaXZlbiBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgVGhlIGtleS4KLSAgICogQHJldHVybiBUaGUgaW5kZXguCi0gICAqLwotICBASW5saW5lCi0gIHByaXZhdGUgaW50IGNvbXB1dGVIYXNoKFdvcmQga2V5KSB7Ci0gICAgcmV0dXJuIGtleS5yc2hsKEhBU0hfU0hJRlQpLmFuZChtYXNrKS50b0ludCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgYWRkcmVzcyBvZiBhIHNwZWNpZmllZCBlbnRyeSBpbiB0aGUgdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGVudHJ5LgotICAgKiBAcmV0dXJuIEFuIGFkZHJlc3MgdG8gdGhlIGVudHJ5LgotICAgKi8KLSAgQElubGluZQotICBwcml2YXRlIEFkZHJlc3MgZ2V0RW50cnkoaW50IGluZGV4KSB7Ci0gICAgcmV0dXJuIGJhc2UucGx1cyhFeHRlbnQuZnJvbUludFplcm9FeHRlbmQoaW5kZXggKiBlbnRyeVNpemUudG9JbnQoKSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIERvZXMgdGhlIHBhc3NlZCBvYmplY3QgaGF2ZSBhbiBlbnRyeSBpbiB0aGUgdGFibGU/Ci0gICAqCi0gICAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byBmaW5kIGFuIGVudHJ5IGZvcgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlcmUgaXMgYW4gZW50cnkgZm9yIHRoYXQgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gY29udGFpbnMoV29yZCBrZXkpIHsKLSAgICByZXR1cm4gIWdldEVudHJ5KGtleSwgZmFsc2UpLmlzWmVybygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gVGhlIGZpcnN0IG5vbi16ZXJvIGVsZW1lbnQgaW4gdGhlIHRhYmxlLCBvciBudWxsIGlmCi0gICAqIHRoZSB0YWJsZSBpcyBlbXB0eS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBBZGRyZXNzIGdldEZpcnN0KCkgewotICAgIHJldHVybiBnZXROZXh0KGJhc2UubWludXMoZW50cnlTaXplKSk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG5leHQgZWxlbWVudCBpbiB0aGUgdGFibGUgYWZ0ZXIgdGhlIHBhc3NlZCBlbnRyeSwgb3IKLSAgICogbnVsbCBpZiBpdCBpcyB0aGUgbGFzdCBlbnRyeS4KLSAgICoKLSAgICogQHBhcmFtIGN1cnIgVGhlIG9iamVjdCB0byBsb29rIGZvciB0aGUgbmV4dCBlbnRyeSBmcm9tLgotICAgKiBAcmV0dXJuIFRoZSBuZXh0IGVudHJ5IG9yIG51bGwuCi0gICAqLwotICBwdWJsaWMgZmluYWwgQWRkcmVzcyBnZXROZXh0KEFkZHJlc3MgY3VycikgewotICAgIEFkZHJlc3MgZW50cnkgPSBjdXJyLnBsdXMoZW50cnlTaXplKTsKLSAgICB3aGlsZSAoZW50cnkuTFQoYmFzZS5wbHVzKHNpemUpKSkgewotICAgICAgaWYgKCFlbnRyeS5sb2FkV29yZCgpLmlzWmVybygpKSByZXR1cm4gZW50cnk7Ci0gICAgICBlbnRyeSA9IGVudHJ5LnBsdXMoZW50cnlTaXplKTsKLSAgICB9Ci0gICAgcmV0dXJuIEFkZHJlc3MuemVybygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdpdmVuIGFuIGFkZHJlc3Mgb2YgYW4gZW50cnksIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHBheWxvYWQuCi0gICAqCi0gICAqIEBwYXJhbSBlbnRyeSBUaGUgZW50cnkKLSAgICogQHJldHVybiBUaGUgb2JqZWN0IHJlZmVyZW5jZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQWRkcmVzcyBnZXRQYXlsb2FkQWRkcmVzcyhBZGRyZXNzIGVudHJ5KSB7Ci0gICAgcmV0dXJuIGVudHJ5LnBsdXMoREFUQV9PRkZTRVQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdpdmVuIGEga2V5LCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBwYXlsb2FkLgotICAgKgotICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkKLSAgICogQHJldHVybiBUaGUgb2JqZWN0IHJlZmVyZW5jZS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBBZGRyZXNzIGdldFBheWxvYWRBZGRyZXNzKFdvcmQga2V5KSB7Ci0gICAgQWRkcmVzcyBlbnRyeSA9IGdldEVudHJ5KGtleSwgZmFsc2UpOwotICAgIGlmIChlbnRyeS5pc1plcm8oKSkgcmV0dXJuIEFkZHJlc3MuemVybygpOwotCi0gICAgcmV0dXJuIGVudHJ5LnBsdXMoREFUQV9PRkZTRVQpOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBrZXkgZm9yIGEgZ2l2ZW4gZW50cnkuCi0gICAqCi0gICAqIEBwYXJhbSBlbnRyeSBUaGUgZW50cnkuCi0gICAqIEByZXR1cm4gVGhlIGtleS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgV29yZCBnZXRLZXkoQWRkcmVzcyBlbnRyeSkgewotICAgIHJldHVybiBlbnRyeS5sb2FkV29yZChLRVlfT0ZGU0VUKTsKLSAgfQotCi0gIC8qKgotICAgKiBVcGRhdGUgdGhlIGtleSBmb3IgYSBnaXZlbiBlbnRyeS4gVGhpcyBvcGVyYXRpb24gaXMgbm90Ci0gICAqIHNhZmUgd2l0aG91dCByZWhhc2hpbmcKLSAgICoKLSAgICogQHBhcmFtIGVudHJ5IFRoZSBlbnRyeSB0byB1cGRhdGUuCi0gICAqIEBwYXJhbSBrZXkgVGhlIG5ldyBrZXkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgcmVwbGFjZUtleShBZGRyZXNzIGVudHJ5LCBXb3JkIGtleSkgewotICAgIGVudHJ5LnN0b3JlKGtleSwgS0VZX09GRlNFVCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L1N5bmNocm9uaXplLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvU3luY2hyb25pemUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYxM2Y3Ni4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvU3luY2hyb25pemUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5OwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qCi0gKi8KLUBVbmludGVycnVwdGlibGUgcHVibGljIGNsYXNzIFN5bmNocm9uaXplewotCi0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9UcmFjZUdlbmVyYXRvci5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L1RyYWNlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiY2M0MjQuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L1RyYWNlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTAgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHk7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlBsYW47Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5zZW1pc3BhY2UuZ2N0cmFjZS5HQ1RyYWNlOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhY2VMb2NhbDsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5kZXF1ZS4qOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkub3B0aW9ucy5PcHRpb25zOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkub3B0aW9ucy5UcmFjZVJhdGU7Ci0KLWltcG9ydCBvcmcubW10ay52bS5WTTsKLWltcG9ydCBvcmcubW10ay52bS5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotCi0vKioKLSAqIENsYXNzIHRoYXQgc3VwcG9ydHMgc2Nhbm5pbmcgT2JqZWN0cyBhbmQgQXJyYXlzIGZvciByZWZlcmVuY2VzCi0gKiBkdXJpbmcgdHJhY2luZywgaGFuZGxpbmcgdGhvc2UgcmVmZXJlbmNlcywgYW5kIGNvbXB1dGluZyBkZWF0aCB0aW1lcwotICovCi1AVW5pbnRlcnJ1cHRpYmxlIHB1YmxpYyBmaW5hbCBjbGFzcyBUcmFjZUdlbmVyYXRvcgotICBpbXBsZW1lbnRzIENvbnN0YW50cywgVHJhY2luZ0NvbnN0YW50cyB7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQ2xhc3MgdmFyaWFibGVzCi0gICAqLwotCi0gIC8qIFR5cGUgb2YgbGlmZXRpbWUgYW5hbHlzaXMgdG8gYmUgdXNlZCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gTUVSTElOX0FOQUxZU0lTID0gdHJ1ZTsKLQotICAvKiBpbmNsdWRlIHRoZSBub3Rpb24gb2YgYnVpbGQtdGltZSBhbGxvY2F0aW9uIHRvIG91ciBsaXN0IG9mIGFsbG9jYXRvcnMgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFMTE9DX0JPT1QgPSBHQ1RyYWNlLkFMTE9DQVRPUlM7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBTExPQ0FUT1JTID0gQUxMT0NfQk9PVCArIDE7Ci0KLSAgLyogRmllbGRzIGZvciB0cmFjaW5nICovCi0gIHByaXZhdGUgc3RhdGljIFNvcnRUT0RTaGFyZWREZXF1ZSB0cmFjZVBvb2w7IC8vIEJ1ZmZlcnMgdG8gaG9sZCByYXcgdHJhY2UKLSAgcHJpdmF0ZSBzdGF0aWMgVHJhY2VCdWZmZXIgdHJhY2U7Ci0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdHJhY2VCdXN5OyAvLyBJZiB3ZSBhcmUgYnVpbGRpbmcgdGhlIHRyYWNlCi0gIHByaXZhdGUgc3RhdGljIFdvcmQgbGFzdEdDOyAvLyBMYXN0IHRpbWUgR0Mgd2FzIHBlcmZvcm1lZAotICBwcml2YXRlIHN0YXRpYyBPYmplY3RSZWZlcmVuY2VBcnJheSBvYmplY3RMaW5rczsgLy8gTGlzdHMgb2YgYWN0aXZlIG9ianMKLQotICAvKiBGaWVsZHMgbmVlZGVkIGZvciBNZXJsaW4gbGlmZXRpbWUgYW5hbHlzaXMgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgU29ydFRPRFNoYXJlZERlcXVlIHdvcmtMaXN0UG9vbDsgLy8gSG9sZHMgb2JqcyB0byBwcm9jZXNzCi0gIHByaXZhdGUgc3RhdGljIFNvcnRUT0RPYmplY3RSZWZlcmVuY2VTdGFjayB3b3JrbGlzdDsgLy8gT2JqcyB0byBwcm9jZXNzCi0gIHByaXZhdGUgc3RhdGljIFdvcmQgYWdlUHJvcGFnYXRlOyAvLyBEZWF0aCB0aW1lIHByb3BhZ2F0aW5nCi0KLSAgc3RhdGljIHsKLSAgICB0cmFjZUJ1c3kgPSBmYWxzZTsKLSAgICBsYXN0R0MgPSBXb3JkLmZyb21JbnRaZXJvRXh0ZW5kKDQpOwotICAgIE9wdGlvbnMudHJhY2VSYXRlID0gbmV3IFRyYWNlUmF0ZSgpOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogUHVibGljIGFuYWx5c2lzIG1ldGhvZHMKLSAgICovCi0KLSAgLyoqCi0gICAqIFRoaXMgaXMgY2FsbGVkIGF0ICJidWlsZC10aW1lIiBhbmQgcGFzc2VzIHRoZSBuZWNlc3NhcnkgYnVpbGQgaW1hZ2UKLSAgICogb2JqZWN0cyB0byB0aGUgdHJhY2UgcHJvY2Vzc29yLgotICAgKgotICAgKiBAcGFyYW0gd29ya2xpc3RfIFRoZSBkZXF1ZXVlIHRoYXQgc2VydmVzIGFzIHRoZSB3b3JrbGlzdCBmb3IKLSAgICogZGVhdGggdGltZSBwcm9wYWdhdGlvbgotICAgKiBAcGFyYW0gdHJhY2VfIFRoZSBkZXF1ZXVlIHVzZWQgdG8gc3RvcmUgYW5kIHRoZW4gb3V0cHV0IHRoZSB0cmFjZQotICAgKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHVibGljIHN0YXRpYyB2b2lkIGluaXQoU29ydFRPRFNoYXJlZERlcXVlIHdvcmtsaXN0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydFRPRFNoYXJlZERlcXVlIHRyYWNlXykgewotICAgIC8qIE9iamVjdHMgYXJlIG9ubHkgbmVlZGVkIGZvciBtZXJsaW4gdHJhY2luZyAqLwotICAgIGlmIChNRVJMSU5fQU5BTFlTSVMpIHsKLSAgICAgIHdvcmtMaXN0UG9vbCA9IHdvcmtsaXN0XzsKLSAgICAgIHdvcmtsaXN0ID0gbmV3IFNvcnRUT0RPYmplY3RSZWZlcmVuY2VTdGFjayh3b3JrTGlzdFBvb2wpOwotICAgIH0KLQotICAgIC8qIFRyYWNlIG9iamVjdHMgKi8KLSAgICB0cmFjZVBvb2wgPSB0cmFjZV87Ci0gICAgdHJhY2UgPSBuZXcgVHJhY2VCdWZmZXIodHJhY2VQb29sKTsKLSAgICBvYmplY3RMaW5rcyA9IE9iamVjdFJlZmVyZW5jZUFycmF5LmNyZWF0ZShTcGFjZS5NQVhfU1BBQ0VTKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBiZWZvcmUgSmlrZXMgdGVybWluYXRlcy4gIEl0IHdpbGwgcGVyZm9ybQotICAgKiBhbnkgZGVhdGggdGltZSBwcm9jZXNzaW5nIHRoYXQgdGhlIGFuYWx5c2lzIHJlcXVpcmVzIGFuZCB0aGVuIG91dHB1dAotICAgKiBhbnkgcmVtYWluaW5nIGluZm9ybWF0aW9uIGluIHRoZSB0cmFjZSBidWZmZXIuCi0gICAqCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgaW50ZWdlciB2YWx1ZSBmb3IgdGhlIHJlYXNvbiBKaWtlcyBpcyB0ZXJtaW5hdGluZwotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIG5vdGlmeUV4aXQoaW50IHZhbHVlKSB7Ci0gICAgaWYgKE1FUkxJTl9BTkFMWVNJUykKLSAgICAgIGZpbmREZWF0aHMoKTsKLSAgICB0cmFjZS5wcm9jZXNzKCk7Ci0gIH0KLQotICAvKioKLSAgICogQWRkIGEgbmV3bHkgYWxsb2NhdGVkIG9iamVjdCBpbnRvIHRoZSBsaW5rZWQgbGlzdCBvZiBvYmplY3RzIGluIGEgcmVnaW9uLgotICAgKiBUaGlzIGlzIHR5cGljYWxseSBjYWxsZWQgYWZ0ZXIgZWFjaCBvYmplY3QgYWxsb2NhdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIHJlZiBUaGUgYWRkcmVzcyBvZiB0aGUgb2JqZWN0IHRvIGJlIGFkZGVkIHRvIHRoZSBsaW5rZWQgbGlzdAotICAgKiBAcGFyYW0gbGlua1NwYWNlIFRoZSByZWdpb24gdG8gd2hpY2ggdGhlIG9iamVjdCBzaG91bGQgYmUgYWRkZWQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRUcmFjZU9iamVjdChPYmplY3RSZWZlcmVuY2UgcmVmLCBpbnQgbGlua1NwYWNlKSB7Ci0gICAgVk0udHJhY2VJbnRlcmZhY2Uuc2V0TGluayhyZWYsIG9iamVjdExpbmtzLmdldChsaW5rU3BhY2UpKTsKLSAgICBvYmplY3RMaW5rcy5zZXQobGlua1NwYWNlLCByZWYpOwotICB9Ci0KLSAgLyoqCi0gICAqIERvIHRoZSB3b3JrIG5lY2Vzc2FyeSBmb2xsb3dpbmcgZWFjaCBnYXJiYWdlIGNvbGxlY3Rpb24uIFRoaXMgSEFTIHRvIGJlCi0gICAqIGNhbGxlZCBhZnRlciBFQUNIIGNvbGxlY3Rpb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgcG9zdENvbGxlY3Rpb24oKSB7Ci0gICAgLyogRmluZCBhbmQgb3V0cHV0IHRoZSBvYmplY3QgZGVhdGhzICovCi0gICAgdHJhY2VCdXN5ID0gdHJ1ZTsKLSAgICBmaW5kRGVhdGhzKCk7Ci0gICAgdHJhY2VCdXN5ID0gZmFsc2U7Ci0gICAgdHJhY2UucHJvY2VzcygpOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogVHJhY2UgZ2VuZXJhdGlvbiBjb2RlCi0gICAqLwotCi0gIC8qKgotICAgKiBBZGQgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBib290SW1hZ2UgdG8gdGhlIHRyYWNlLiAgVGhpcyBzaG91bGQgYmUKLSAgICogY2FsbGVkIGJlZm9yZSBhbnkgYWxsb2NhdGlvbnMgYW5kIHBvaW50ZXIgdXBkYXRlcyBoYXZlIG9jY3VyZWQuCi0gICAqCi0gICAqIEBwYXJhbSBib290U3RhcnQgVGhlIGFkZHJlc3MgYXQgd2hpY2ggdGhlIGJvb3RpbWFnZSBzdGFydHMKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBib290KEFkZHJlc3MgYm9vdFN0YXJ0KSB7Ci0gICAgV29yZCBuZXh0T0lEID0gVk0udHJhY2VJbnRlcmZhY2UuZ2V0T0lEKCk7Ci0gICAgT2JqZWN0UmVmZXJlbmNlIHRyYXYgPSBWTS50cmFjZUludGVyZmFjZS5nZXRCb290SW1hZ2VMaW5rKCkucGx1cyhib290U3RhcnQudG9Xb3JkKCkudG9PZmZzZXQoKSkudG9PYmplY3RSZWZlcmVuY2UoKTsKLSAgICBvYmplY3RMaW5rcy5zZXQoQUxMT0NfQk9PVCwgdHJhdik7Ci0gICAgLyogTG9vcCB0aHJvdWdoIGFsbCB0aGUgb2JqZWN0cyB3aXRoaW4gYm9vdCBpbWFnZSAqLwotICAgIHdoaWxlICghdHJhdi5pc051bGwoKSkgewotICAgICAgT2JqZWN0UmVmZXJlbmNlIG5leHQgPSBWTS50cmFjZUludGVyZmFjZS5nZXRMaW5rKHRyYXYpOwotICAgICAgV29yZCB0aGlzT0lEID0gVk0udHJhY2VJbnRlcmZhY2UuZ2V0T0lEKHRyYXYpOwotICAgICAgLyogQWRkIHRoZSBib290IGltYWdlIG9iamVjdCB0byB0aGUgdHJhY2UuICovCi0gICAgICB0cmFjZS5wdXNoKFRSQUNFX0JPT1RfQUxMT0MpOwotICAgICAgdHJhY2UucHVzaCh0aGlzT0lEKTsKLSAgICAgIHRyYWNlLnB1c2gobmV4dE9JRC5taW51cyh0aGlzT0lEKS5sc2goTE9HX0JZVEVTX0lOX0FERFJFU1MpKTsKLSAgICAgIG5leHRPSUQgPSB0aGlzT0lEOwotICAgICAgLyogTW92ZSB0byB0aGUgbmV4dCBvYmplY3QgJiBhZGp1c3QgZm9yIHN0YXJ0aW5nIGFkZHJlc3Mgb2YKLSAgICAgICAgIHRoZSBib290SW1hZ2UgKi8KLSAgICAgIGlmICghbmV4dC5pc051bGwoKSkgewotICAgICAgICBuZXh0ID0gbmV4dC50b0FkZHJlc3MoKS5wbHVzKGJvb3RTdGFydC50b1dvcmQoKS50b09mZnNldCgpKS50b09iamVjdFJlZmVyZW5jZSgpOwotICAgICAgICBWTS50cmFjZUludGVyZmFjZS5zZXRMaW5rKHRyYXYsIG5leHQpOwotICAgICAgfQotICAgICAgdHJhdiA9IG5leHQ7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIERvIGFueSB0cmFjaW5nIHdvcmsgcmVxdWlyZWQgYXQgZWFjaCBhIHBvaW50ZXIgc3RvcmUgb3BlcmF0aW9uLiAgVGhpcwotICAgKiB3aWxsIGFkZCB0aGUgcG9pbnRlciBzdG9yZSB0byB0aGUgdHJhY2UgYnVmZmVyIGFuZCwgd2hlbiBNZXJsaW4gbGlmZXRpbWUKLSAgICogYW5hbHlzaXMgaXMgYmVpbmcgdXNlZCwgcGVyZm9ybXMgdGhlIG5lY2Vzc2FyeSB0aW1lc3RhbXBpbmcuCi0gICAqCi0gICAqIEBwYXJhbSBpc1NjYWxhciBJZiB0aGlzIGlzIGEgcG9pbnRlciBzdG9yZSB0byBhIHNjYWxhciBvYmplY3QKLSAgICogQHBhcmFtIHNyYyBUaGUgYWRkcmVzcyBvZiB0aGUgc291cmNlIG9iamVjdAotICAgKiBAcGFyYW0gc2xvdCBUaGUgYWRkcmVzcyB3aXRoaW4gPGNvZGU+c3JjPC9jb2RlPiBpbnRvIHdoaWNoCi0gICAqIDxjb2RlPnRndDwvY29kZT4gd2lsbCBiZSBzdG9yZWQKLSAgICogQHBhcmFtIHRndCBUaGUgdGFyZ2V0IG9mIHRoZSBwb2ludGVyIHN0b3JlCi0gICAqLwotICBATm9JbmxpbmUKLSAgcHVibGljIHN0YXRpYyB2b2lkIHByb2Nlc3NQb2ludGVyVXBkYXRlKGJvb2xlYW4gaXNTY2FsYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RSZWZlcmVuY2Ugc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBzbG90LCBPYmplY3RSZWZlcmVuY2UgdGd0KSB7Ci0gICAgLy8gVGhlIHRyYWNlIGNhbiBiZSBidXN5IG9ubHkgaWYgdGhpcyBpcyBhIHBvaW50ZXIgdXBkYXRlIGFzIGEgcmVzdWx0IG9mCi0gICAgLy8gdGhlIGdhcmJhZ2UgY29sbGVjdGlvbiBuZWVkZWQgYnkgdHJhY2luZy4gRm9yIHRoZSBtb21lbnQsIHdlIHdpbGwKLSAgICAvLyBub3QgcmVwb3J0IHRoZXNlIHVwZGF0ZXMuCi0gICAgaWYgKCF0cmFjZUJ1c3kpIHsKLSAgICAgIC8qIFByb2Nlc3MgdGhlIG9sZCB0YXJnZXQgcG90ZW50aWFsbHkgYmVjb21pbmcgdW5yZWFjaGFibGUgd2hlbiBuZWVkZWQuICovCi0gICAgICBpZiAoTUVSTElOX0FOQUxZU0lTKSB7Ci0gICAgICAgIE9iamVjdFJlZmVyZW5jZSBvbGRUZ3QgPSBzbG90LmxvYWRPYmplY3RSZWZlcmVuY2UoKTsKLSAgICAgICAgaWYgKCFvbGRUZ3QuaXNOdWxsKCkpCi0gICAgICAgICAgVk0udHJhY2VJbnRlcmZhY2UudXBkYXRlRGVhdGhUaW1lKG9sZFRndCk7Ci0gICAgICB9Ci0KLSAgICAgIHRyYWNlQnVzeSA9IHRydWU7Ci0gICAgICAvKiBBZGQgdGhlIHBvaW50ZXIgc3RvcmUgdG8gdGhlIHRyYWNlICovCi0gICAgICBPZmZzZXQgdHJhY2VPZmZzZXQgPSBWTS50cmFjZUludGVyZmFjZS5hZGp1c3RTbG90T2Zmc2V0KGlzU2NhbGFyLCBzcmMsIHNsb3QpOwotICAgICAgaWYgKGlzU2NhbGFyKQotICAgICAgICB0cmFjZS5wdXNoKFRSQUNFX0ZJRUxEX1NFVCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHRyYWNlLnB1c2goVFJBQ0VfQVJSQVlfU0VUKTsKLSAgICAgIHRyYWNlLnB1c2goVk0udHJhY2VJbnRlcmZhY2UuZ2V0T0lEKHNyYykpOwotICAgICAgdHJhY2UucHVzaCh0cmFjZU9mZnNldC50b1dvcmQoKSk7Ci0gICAgICBpZiAodGd0LmlzTnVsbCgpKQotICAgICAgICB0cmFjZS5wdXNoKFdvcmQuemVybygpKTsKLSAgICAgIGVsc2UKLSAgICAgICAgdHJhY2UucHVzaChWTS50cmFjZUludGVyZmFjZS5nZXRPSUQodGd0KSk7Ci0gICAgICB0cmFjZUJ1c3kgPSBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogRG8gYW55IHRyYWNpbmcgd29yayByZXF1aXJlZCBhdCBlYWNoIG9iamVjdCBhbGxvY2F0aW9uLiBUaGlzIHdpbGwgYWRkIHRoZQotICAgKiBvYmplY3QgYWxsb2NhdGlvbiB0byB0aGUgdHJhY2UgYnVmZmVyLCB0cmlnZ2VycyB0aGUgbmVjZXNzYXJ5IGNvbGxlY3Rpb24KLSAgICogd29yayBhdCBleGFjdCBhbGxvY2F0aW9ucywgYW5kIG91dHB1dCB0aGUgZGF0YSBpbiB0aGUgdHJhY2UgYnVmZmVyLgotICAgKgotICAgKiBAcGFyYW0gcmVmIFRoZSBhZGRyZXNzIG9mIHRoZSBvYmplY3QganVzdCBhbGxvY2F0ZWQuCi0gICAqIEBwYXJhbSB0eXBlUmVmIHRoZSB0eXBlIHJlZmVyZW5jZSBmb3IgdGhlIGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBzaXplIG9mIHRoZSBvYmplY3QgYmVpbmcgYWxsb2NhdGVkCi0gICAqLwotICBATG9naWNhbGx5VW5pbnRlcnJ1cHRpYmxlCi0gIEBOb0lubGluZQotICBwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VBbGxvYyhib29sZWFuIGlzSW1tb3J0YWwsIE9iamVjdFJlZmVyZW5jZSByZWYsCi0gICAgICBPYmplY3RSZWZlcmVuY2UgdHlwZVJlZiwgaW50IGJ5dGVzKSB7Ci0gICAgYm9vbGVhbiBnY0FsbG93ZWQgPSBWTS50cmFjZUludGVyZmFjZS5nY0VuYWJsZWQoKSAmJiBQbGFuLmlzSW5pdGlhbGl6ZWQoKSAmJiAhUGxhbi5nY0luUHJvZ3Jlc3MoKTsKLSAgICAvKiBUZXN0IGlmIGl0IGlzIHRpbWUvcG9zc2libGUgZm9yIGFuIGV4YWN0IGFsbG9jYXRpb24uICovCi0gICAgV29yZCBvaWQgPSBWTS50cmFjZUludGVyZmFjZS5nZXRPSUQocmVmKTsKLSAgICBXb3JkIGFsbG9jVHlwZTsKLSAgICBpZiAoZ2NBbGxvd2VkICYmIChvaWQuR0UobGFzdEdDLnBsdXMoV29yZC5mcm9tSW50WmVyb0V4dGVuZChPcHRpb25zLnRyYWNlUmF0ZS5nZXRWYWx1ZSgpKSkpKSkKLSAgICAgIGFsbG9jVHlwZSA9IFRSQUNFX0VYQUNUX0FMTE9DOwotICAgIGVsc2UgewotICAgICAgYWxsb2NUeXBlID0gVFJBQ0VfQUxMT0M7Ci0gICAgfQotICAgIC8qIEFkZCB0aGUgYWxsb2NhdGlvbiBpbnRvIHRoZSB0cmFjZS4gKi8KLSAgICB0cmFjZUJ1c3kgPSB0cnVlOwotICAgIC8qIFdoZW4gbGVnYWxseSBwZXJtaXNzaWJsZSwgYWRkIHRoZSByZWNvcmQgdG8gdGhlIHRyYWNlIGJ1ZmZlciAqLwotICAgIGlmIChNRVJMSU5fQU5BTFlTSVMpIHsKLSAgICAgICBBZGRyZXNzIGZwID0gKFRyYWNlQnVmZmVyLk9NSVRfQUxMT0NTKSA/IEFkZHJlc3MuemVybygpIDogVk0udHJhY2VJbnRlcmZhY2Uuc2tpcE93bkZyYW1lc0FuZER1bXAodHlwZVJlZik7Ci0KLSAgICAgICBpZiAoaXNJbW1vcnRhbCAmJiBhbGxvY1R5cGUuRVEoVFJBQ0VfRVhBQ1RfQUxMT0MpKQotICAgICAgICAgdHJhY2UucHVzaChUUkFDRV9FWEFDVF9JTU1PUlRBTF9BTExPQyk7Ci0gICAgICAgZWxzZSBpZiAoaXNJbW1vcnRhbCkKLSAgICAgICAgIHRyYWNlLnB1c2goVFJBQ0VfSU1NT1JUQUxfQUxMT0MpOwotICAgICAgIGVsc2UKLSAgICAgICAgIHRyYWNlLnB1c2goYWxsb2NUeXBlKTsKLSAgICAgICB0cmFjZS5wdXNoKFZNLnRyYWNlSW50ZXJmYWNlLmdldE9JRChyZWYpKTsKLSAgICAgICB0cmFjZS5wdXNoKFdvcmQuZnJvbUludFplcm9FeHRlbmQoYnl0ZXMgLSBWTS50cmFjZUludGVyZmFjZS5nZXRIZWFkZXJTaXplKCkpKTsKLSAgICAgICB0cmFjZS5wdXNoKGZwLnRvV29yZCgpKTsKLSAgICAgICB0cmFjZS5wdXNoKFdvcmQuemVybygpKTsgLyogTWFnaWMuZ2V0VGhyZWFkSWQoKSAqLwotICAgICAgIHRyYWNlLnB1c2goVFJBQ0VfVElCX1NFVCk7Ci0gICAgICAgdHJhY2UucHVzaChWTS50cmFjZUludGVyZmFjZS5nZXRPSUQocmVmKSk7Ci0gICAgICAgdHJhY2UucHVzaChWTS50cmFjZUludGVyZmFjZS5nZXRPSUQodHlwZVJlZikpOwotICAgIH0KLSAgICAvKiBQZXJmb3JtIHRoZSBuZWNlc3Nhcnkgd29yayBmb3IgZGVhdGggdGltZXMuICovCi0gICAgaWYgKGFsbG9jVHlwZS5FUShUUkFDRV9FWEFDVF9BTExPQykpIHsKLSAgICAgIGlmIChNRVJMSU5fQU5BTFlTSVMpIHsKLSAgICAgICAgbGFzdEdDID0gVk0udHJhY2VJbnRlcmZhY2UuZ2V0T0lEKHJlZik7Ci0gICAgICAgIFZNLnRyYWNlSW50ZXJmYWNlLnVwZGF0ZVRpbWUobGFzdEdDKTsKLSAgICAgICAgVk0uY29sbGVjdGlvbi50cmlnZ2VyQ29sbGVjdGlvbihDb2xsZWN0aW9uLklOVEVSTkFMX0dDX1RSSUdHRVIpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgVk0uY29sbGVjdGlvbi50cmlnZ2VyQ29sbGVjdGlvbihDb2xsZWN0aW9uLlJFU09VUkNFX0dDX1RSSUdHRVIpOwotICAgICAgICBsYXN0R0MgPSBWTS50cmFjZUludGVyZmFjZS5nZXRPSUQocmVmKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLyogQWRkIHRoZSBhbGxvY2F0aW9uIHJlY29yZCB0byB0aGUgYnVmZmVyIGlmIHdlIGhhdmUgbm90IHlldCBkb25lIHNvLiAqLwotICAgIGlmICghTUVSTElOX0FOQUxZU0lTKSB7Ci0gICAgICAgQWRkcmVzcyBmcCA9IChUcmFjZUJ1ZmZlci5PTUlUX0FMTE9DUykgPyBBZGRyZXNzLnplcm8oKSA6IFZNLnRyYWNlSW50ZXJmYWNlLnNraXBPd25GcmFtZXNBbmREdW1wKHR5cGVSZWYpOwotICAgICAgIGlmIChpc0ltbW9ydGFsICYmIGFsbG9jVHlwZS5FUShUUkFDRV9FWEFDVF9BTExPQykpCi0gICAgICAgICB0cmFjZS5wdXNoKFRSQUNFX0VYQUNUX0lNTU9SVEFMX0FMTE9DKTsKLSAgICAgICBlbHNlIGlmIChpc0ltbW9ydGFsKQotICAgICAgICAgdHJhY2UucHVzaChUUkFDRV9JTU1PUlRBTF9BTExPQyk7Ci0gICAgICAgZWxzZQotICAgICAgICAgdHJhY2UucHVzaChhbGxvY1R5cGUpOwotICAgICAgIHRyYWNlLnB1c2goVk0udHJhY2VJbnRlcmZhY2UuZ2V0T0lEKHJlZikpOwotICAgICAgIHRyYWNlLnB1c2goV29yZC5mcm9tSW50WmVyb0V4dGVuZChieXRlcyAtIFZNLnRyYWNlSW50ZXJmYWNlLmdldEhlYWRlclNpemUoKSkpOwotICAgICAgIHRyYWNlLnB1c2goZnAudG9Xb3JkKCkpOwotICAgICAgIHRyYWNlLnB1c2goV29yZC56ZXJvKCkpOyAvKiBNYWdpYy5nZXRUaHJlYWRJZCgpICovCi0gICAgICAgdHJhY2UucHVzaChUUkFDRV9USUJfU0VUKTsKLSAgICAgICB0cmFjZS5wdXNoKFZNLnRyYWNlSW50ZXJmYWNlLmdldE9JRChyZWYpKTsKLSAgICAgICB0cmFjZS5wdXNoKFZNLnRyYWNlSW50ZXJmYWNlLmdldE9JRCh0eXBlUmVmKSk7Ci0gICAgfQotICAgIHRyYWNlLnByb2Nlc3MoKTsKLSAgICB0cmFjZUJ1c3kgPSBmYWxzZTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBNZXJsaW4gbGlmZXRpbWUgYW5hbHlzaXMgbWV0aG9kcwotICAgKi8KLQotICAvKioKLSAgICogVGhpcyBjb21wdXRlcyBhbmQgYWRkcyB0byB0aGUgdHJhY2UgYnVmZmVyIHRoZSB1bnJlYWNoYWJsZSB0aW1lIGZvcgotICAgKiBhbGwgb2YgdGhlIG9iamVjdHMgdGhhdCBhcmUgX3Byb3ZhYmx5XyB1bnJlYWNoYWJsZS4gIFRoaXMgbWV0aG9kCi0gICAqIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgZ2FyYmFnZSBjb2xsZWN0aW9uIChidXQgYmVmb3JlIHRoZSBzcGFjZSBoYXMKLSAgICogYmVlbiByZWNsYWltZWQpIGFuZCBhdCBwcm9ncmFtIHRlcm1pbmF0aW9uLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaW5kRGVhdGhzKCkgewotICAgIC8qIE9ubHkgdGhlIG1lcmxpbiBhbmFseXNpcyBuZWVkcyB0byBjb21wdXRlIGRlYXRoIHRpbWVzICovCi0gICAgaWYgKE1FUkxJTl9BTkFMWVNJUykgewotICAgICAgLyogU3RhcnQgd2l0aCBhbiBlbXB0eSBzdGFjay4gKi8KLSAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KHdvcmtsaXN0LmlzRW1wdHkoKSk7Ci0gICAgICAvKiBTY2FuIHRoZSBsaW5rZWQgbGlzdCBvZiBvYmplY3RzIHdpdGhpbiBlYWNoIHJlZ2lvbiAqLwotICAgICAgZm9yIChpbnQgYWxsb2NhdG9yID0gMDsgYWxsb2NhdG9yIDwgQUxMT0NBVE9SUzsgYWxsb2NhdG9yKyspIHsKLSAgICAgICAgT2JqZWN0UmVmZXJlbmNlIHRoaXNSZWYgPSBvYmplY3RMaW5rcy5nZXQoYWxsb2NhdG9yKTsKLSAgICAgICAgLyogU3RhcnQgYXQgdGhlIHRvcCBvZiBlYWNoIGxpbmtlZCBsaXN0ICovCi0gICAgICAgIHdoaWxlICghdGhpc1JlZi5pc051bGwoKSkgewotICAgICAgICAgIC8qIEFkZCB0aGUgdW5yZWFjaGFibGUgb2JqZWN0cyBvbnRvIHRoZSB3b3JrbGlzdC4gKi8KLSAgICAgICAgICBpZiAoIWdldFRyYWNlTG9jYWwoKS5pc1JlYWNoYWJsZSh0aGlzUmVmKSkKLSAgICAgICAgICAgIHdvcmtsaXN0LnB1c2godGhpc1JlZik7Ci0gICAgICAgICAgdGhpc1JlZiA9IFZNLnRyYWNlSW50ZXJmYWNlLmdldExpbmsodGhpc1JlZik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8qIFNvcnQgdGhlIG9iamVjdHMgb24gdGhlIHdvcmtsaXN0IGJ5IHRoZWlyIHRpbWVzdGFtcCAqLwotICAgICAgaWYgKCF3b3JrbGlzdC5pc0VtcHR5KCkpCi0gICAgICAgIHdvcmtsaXN0LnNvcnQoKTsKLSAgICAgIC8qIE5vdyBjb21wdXRlIHRoZSBkZWF0aCB0aW1lcy4gKi8KLSAgICAgIGNvbXB1dGVUcmFuc2l0aXZlQ2xvc3VyZSgpOwotICAgIH0KLSAgICAvKiBPdXRwdXQgdGhlIGRlYXRoIHRpbWVzIGZvciBlYWNoIG9iamVjdCAqLwotICAgIGZvciAoaW50IGFsbG9jYXRvciA9IDA7IGFsbG9jYXRvciA8IEFMTE9DQVRPUlM7IGFsbG9jYXRvcisrKSB7Ci0gICAgICBPYmplY3RSZWZlcmVuY2UgdGhpc1JlZiA9IG9iamVjdExpbmtzLmdldChhbGxvY2F0b3IpOwotICAgICAgT2JqZWN0UmVmZXJlbmNlIHByZXZSZWYgPSBPYmplY3RSZWZlcmVuY2UubnVsbFJlZmVyZW5jZSgpOyAvLyB0aGUgbGFzdCBsaXZlIG9iamVjdCBzZWVuCi0gICAgICB3aGlsZSAoIXRoaXNSZWYuaXNOdWxsKCkpIHsKLSAgICAgICAgT2JqZWN0UmVmZXJlbmNlIG5leHRSZWYgPSBWTS50cmFjZUludGVyZmFjZS5nZXRMaW5rKHRoaXNSZWYpOwotICAgICAgICAvKiBNYWludGFpbiByZWFjaGFibGUgb2JqZWN0cyBvbiB0aGUgbGlua2VkIGxpc3Qgb2YgYWxsb2NhdGVkIG9iamVjdHMgKi8KLSAgICAgICAgaWYgKGdldFRyYWNlTG9jYWwoKS5pc1JlYWNoYWJsZSh0aGlzUmVmKSkgewotICAgICAgICAgIHRoaXNSZWYgPSBnZXRUcmFjZUxvY2FsKCkuZ2V0Rm9yd2FyZGVkUmVmZXJlbmNlKHRoaXNSZWYpOwotICAgICAgICAgIFZNLnRyYWNlSW50ZXJmYWNlLnNldExpbmsodGhpc1JlZiwgcHJldlJlZik7Ci0gICAgICAgICAgcHJldlJlZiA9IHRoaXNSZWY7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLyogRm9yIGJydXRlIGZvcmNlIGxpZmV0aW1lIGFuYWx5c2lzLCBvYmplY3RzIGJlY29tZQotICAgICAgICAgICAgIHVucmVhY2hhYmxlICJub3ciICovCi0gICAgICAgICAgV29yZCBkZWFkVGltZTsKLSAgICAgICAgICBpZiAoTUVSTElOX0FOQUxZU0lTKQotICAgICAgICAgICAgZGVhZFRpbWUgPSBWTS50cmFjZUludGVyZmFjZS5nZXREZWF0aFRpbWUodGhpc1JlZik7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgZGVhZFRpbWUgPSBsYXN0R0M7Ci0gICAgICAgICAgLyogQWRkIHRoZSBkZWF0aCByZWNvcmQgdG8gdGhlIHRyYWNlIGZvciB1bnJlYWNoYWJsZSBvYmplY3RzLiAqLwotICAgICAgICAgIHRyYWNlLnB1c2goVFJBQ0VfREVBVEgpOwotICAgICAgICAgIHRyYWNlLnB1c2goVk0udHJhY2VJbnRlcmZhY2UuZ2V0T0lEKHRoaXNSZWYpKTsKLSAgICAgICAgICB0cmFjZS5wdXNoKGRlYWRUaW1lKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzUmVmID0gbmV4dFJlZjsKLSAgICAgIH0KLSAgICAgIC8qIFB1cmdlIHRoZSBsaXN0IG9mIHVucmVhY2hhYmxlIG9iamVjdHMuLi4gKi8KLSAgICAgIG9iamVjdExpbmtzLnNldChhbGxvY2F0b3IsIHByZXZSZWYpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgZm9yIGVhY2ggcm9vdC1yZWZlcmVuY2VkIG9iamVjdCBhdCBldmVyeSBNZXJsaW4KLSAgICogcm9vdCBlbnVtZXJhdGlvbi4gIFRoZSBtZXRob2Qgd2lsbCB1cGRhdGUgdGhlIGRlYXRoIHRpbWUgb2YgdGhlIHBhcmFtZXRlcgotICAgKiB0byB0aGUgY3VycmVudCB0cmFjZSB0aW1lLgotICAgKgotICAgKiBAcGFyYW0gb2JqIFRoZSByb290LXJlZmVyZW5jZWQgb2JqZWN0Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgcm9vdEVudW1lcmF0ZShPYmplY3RSZWZlcmVuY2Ugb2JqKSB7Ci0gICAgVk0udHJhY2VJbnRlcmZhY2UudXBkYXRlRGVhdGhUaW1lKG9iaik7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBwcm9wYWdhdGVzIHRoZSBkZWF0aCB0aW1lIGJlaW5nIGNvbXB1dGVkIHRvIHRoZSBvYmplY3QgcGFzc2VkIGFzIGFuCi0gICAqIGFkZHJlc3MuIElmIHdlIGZpbmQgdGhlIHVucmVhY2hhYmxlIHRpbWUgZm9yIHRoZSBwYXJhbWV0ZXIsIGl0IHdpbGwgYmUKLSAgICogcHVzaGVkIG9uIHRvIHRoZSBwcm9jZXNzaW5nIHN0YWNrLgotICAgKgotICAgKiBAcGFyYW0gcmVmIFRoZSBhZGRyZXNzIG9mIHRoZSBvYmplY3QgdG8gZXhhbWluZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHByb3BhZ2F0ZURlYXRoVGltZShPYmplY3RSZWZlcmVuY2UgcmVmKSB7Ci0gICAgLyogSWYgdGhpcyBkZWF0aCB0aW1lIGlzIG1vcmUgYWNjdXJhdGUsIHNldCBpdC4gKi8KLSAgICBpZiAoVk0udHJhY2VJbnRlcmZhY2UuZ2V0RGVhdGhUaW1lKHJlZikuTFQoYWdlUHJvcGFnYXRlKSkgewotICAgICAgLyogSWYgd2Ugc2hvdWxkIGFkZCB0aGUgb2JqZWN0IGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuICovCi0gICAgICBpZiAoIWdldFRyYWNlTG9jYWwoKS5pc1JlYWNoYWJsZShyZWYpKSB7Ci0gICAgICAgIFZNLnRyYWNlSW50ZXJmYWNlLnNldERlYXRoVGltZShyZWYsIGFnZVByb3BhZ2F0ZSk7Ci0gICAgICAgIHdvcmtsaXN0LnB1c2gocmVmKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFZNLnRyYWNlSW50ZXJmYWNlLnNldERlYXRoVGltZShnZXRUcmFjZUxvY2FsKCkuZ2V0Rm9yd2FyZGVkUmVmZXJlbmNlKHJlZiksIGFnZVByb3BhZ2F0ZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgZmluZHMgYWxsIG9iamVjdCBkZWF0aCB0aW1lcyBieSBjb21wdXRpbmcgdGhlIChsaW1pdGVkKQotICAgKiB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgdGhlIGRlYWQgb2JqZWN0cy4gIERlYXRoIHRpbWVzIGFyZSBjb21wdXRlZAotICAgKiBhcyB0aGUgbGF0ZXN0IHJlYWNoaW5nIGRlYXRoIHRpbWUgdG8gYW4gb2JqZWN0LgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb21wdXRlVHJhbnNpdGl2ZUNsb3N1cmUoKSB7Ci0gICAgIGlmICghd29ya2xpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgLyogVGhlIGxhdGVzdCB0aW1lIGFuIG9iamVjdCBjYW4gZGllLiAqLwotICAgICAgIGFnZVByb3BhZ2F0ZSA9IFdvcmQubWF4KCk7Ci0gICAgICAgLyogUHJvY2VzcyB0aHJvdWdoIHRoZSBlbnRpcmUgYnVmZmVyLiAqLwotICAgICAgIE9iamVjdFJlZmVyZW5jZSByZWYgPSB3b3JrbGlzdC5wb3AoKTsKLSAgICAgICB3aGlsZSAoIXJlZi5pc051bGwoKSkgewotICAgICAgICAgV29yZCBjdXJyZW50QWdlID0gVk0udHJhY2VJbnRlcmZhY2UuZ2V0RGVhdGhUaW1lKHJlZik7Ci0gICAgICAgICAvKiBUaGlzIGlzIGEgY2hlYXAgYW5kIHNpbXBsZSB0ZXN0IHRvIHByb2Nlc3Mgb2JqZWN0cyBvbmx5IG9uY2UuICovCi0gICAgICAgICBpZiAoY3VycmVudEFnZS5MRShhZ2VQcm9wYWdhdGUpKSB7Ci0gICAgICAgICAgIC8qIFNldCB0aGUgIm5ldyIgZGVhZCBhZ2UuICovCi0gICAgICAgICAgIGFnZVByb3BhZ2F0ZSA9IGN1cnJlbnRBZ2U7Ci0gICAgICAgICAgIC8qIFNjYW4gdGhlIG9iamVjdCwgcHVzaGluZyB0aGUgc3Vydml2b3JzICovCi0gICAgICAgICAgIFZNLnNjYW5uaW5nLnNjYW5PYmplY3QoZ2V0VHJhY2VMb2NhbCgpLCByZWYpOwotICAgICAgICAgfQotICAgICAgICAgLyogR2V0IHRoZSBuZXh0IG9iamVjdCB0byBwcm9jZXNzICovCi0gICAgICAgICByZWYgPSB3b3JrbGlzdC5wb3AoKTsKLSAgICAgICB9Ci0gICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFRyYWNlTG9jYWwgZ2V0VHJhY2VMb2NhbCgpIHsKLSAgICByZXR1cm4gVk0uYWN0aXZlUGxhbi5jb2xsZWN0b3IoKS5nZXRDdXJyZW50VHJhY2UoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvVHJhY2luZ0NvbnN0YW50cy5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L1RyYWNpbmdDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAxNjllNy4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvVHJhY2luZ0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHk7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogVGhlIGNvbnN0YW50cyBuZWVkZWQgd2hlbiBzdG9yaW5nIGV2ZW50cyBhbmQgdGhlbiBnZW5lcmF0aW5nIHRoZSB0cmFjZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBUcmFjaW5nQ29uc3RhbnRzIHsKLSAgV29yZCBUUkFDRV9FWEFDVF9BTExPQyA9IFdvcmQuemVybygpOwotICBXb3JkIFRSQUNFX0JPT1RfQUxMT0MgPSBXb3JkLm9uZSgpLmxzaCgwKTsKLSAgV29yZCBUUkFDRV9BTExPQyA9IFdvcmQub25lKCkubHNoKDEpOwotICBXb3JkIFRSQUNFX0RFQVRIID0gV29yZC5vbmUoKS5sc2goMik7Ci0gIFdvcmQgVFJBQ0VfRklFTERfU0VUID0gV29yZC5vbmUoKS5sc2goMyk7Ci0gIFdvcmQgVFJBQ0VfQVJSQVlfU0VUID0gV29yZC5vbmUoKS5sc2goNCk7Ci0gIFdvcmQgVFJBQ0VfVElCX1NFVCA9IFdvcmQub25lKCkubHNoKDUpOwotICBXb3JkIFRSQUNFX1NUQVRJQ19TRVQgPSBXb3JkLm9uZSgpLmxzaCg2KTsKLSAgV29yZCBUUkFDRV9CT09UU1RBUlQgPSBXb3JkLm9uZSgpLmxzaCg3KTsKLSAgV29yZCBUUkFDRV9CT09URU5EID0gV29yZC5vbmUoKS5sc2goOCk7Ci0gIFdvcmQgVFJBQ0VfR0NTVEFSVCA9IFdvcmQub25lKCkubHNoKDkpOwotICBXb3JkIFRSQUNFX0dDRU5EID0gV29yZC5vbmUoKS5sc2goMTApOwotICBXb3JkIFRSQUNFX0dDUk9PVCA9IFdvcmQub25lKCkubHNoKDExKTsKLSAgV29yZCBUUkFDRV9HQ0JBUiA9IFdvcmQub25lKCkubHNoKDEyKTsKLSAgV29yZCBUUkFDRV9USFJFQURfU1dJVENIID0gV29yZC5vbmUoKS5sc2goMTMpOwotICBXb3JkIFRSQUNFX1NUQUNLREVMVEEgPSBXb3JkLm9uZSgpLmxzaCgxNCk7Ci0gIFdvcmQgVFJBQ0VfUk9PVFBUUiA9IFdvcmQub25lKCkubHNoKDE1KTsKLSAgV29yZCBUUkFDRV9FWEFDVF9JTU1PUlRBTF9BTExPQyA9IFdvcmQub25lKCkubHNoKDE2KTsKLSAgV29yZCBUUkFDRV9JTU1PUlRBTF9BTExPQyA9IFdvcmQub25lKCkubHNoKDE3KTsKLX0KLQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L1RyZWFkbWlsbC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L1RyZWFkbWlsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDA4MWUxLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9UcmVhZG1pbGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eTsKLQotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZ2NzcHkuZHJpdmVycy5UcmVhZG1pbGxEcml2ZXI7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogRklYTUUgVGhlIERvdWJseUxpbmtlZExpc3QgY2xhc3MsIHVwb24gd2hpY2ggdGhpcyBkZXBlbmRzLCBtdXN0IGJlCi0gKiByZS13cml0dGVuIGFzIGl0IG1ha2VzIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uCi0gKiBsYW5ndWFnZSAoSmF2YSkgYW5kIHRoZSBsYW5ndWFnZSBiZWluZyBpbXBsZW1lbnRlZCBhcmUgdGhlIHNhbWUuCi0gKiBUaGlzIGlzIHRydWUgaW4gdGhlIGNhc2Ugb2YgSmlrZXMgUlZNLCBidXQgaXQgaXMgbm90IHRydWUgZm9yIGFueQotICogVk0gaW1wbGVtZW50aW5nIGEgbGFuZ3VhZ2Ugb3RoZXIgdGhhbiBKYXZhLgotICoKLSAqIEVhY2ggaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGRvdWJseS1saW5rZWQgbGlzdCwgaW4gd2hpY2gKLSAqIGVhY2ggaXRlbSBvciBub2RlIGlzIGEgcGllY2Ugb2YgbWVtb3J5LiAgVGhlIGZpcnN0IHR3byB3b3JkcyBvZiBlYWNoIG5vZGUKLSAqIGNvbnRhaW5zIHRoZSBmb3J3YXJkIGFuZCBiYWNrd2FyZCBsaW5rcy4gIFRoZSB0aGlyZCB3b3JkIGNvbnRhaW5zCi0gKiB0aGUgdHJlYWRtaWxsLiAgVGhlIHJlbWFpbmluZyBwb3J0aW9uIGlzIHRoZSBwYXlsb2FkLgotICoKLSAqIFRoZSB0cmVhZG1pbGwgb2JqZWN0IGl0c2VsZiBtdXN0IG5vdCBiZSBtb3ZlZC4KLSAqCi0gKiBBY2Nlc3MgdG8gdGhlIGluc3RhbmNlcyBtYXkgYmUgc3luY2hyb25pemVkIGRlcGVuZGluZyBvbiB0aGUgY29uc3RydWN0b3IgYXJndW1lbnQuCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBmaW5hbCBjbGFzcyBUcmVhZG1pbGwgaW1wbGVtZW50cyBDb25zdGFudHMgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluc3RhbmNlIHZhcmlhYmxlcwotICAgKi8KLSAgcHJpdmF0ZSBEb3VibHlMaW5rZWRMaXN0IGZyb21TcGFjZTsKLSAgcHJpdmF0ZSBEb3VibHlMaW5rZWRMaXN0IHRvU3BhY2U7Ci0gIHByaXZhdGUgRG91Ymx5TGlua2VkTGlzdCBjb2xsZWN0TnVyc2VyeTsKLSAgcHJpdmF0ZSBEb3VibHlMaW5rZWRMaXN0IGFsbG9jTnVyc2VyeTsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbml0aWFsaXphdGlvbgotICAgKi8KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICovCi0gIHB1YmxpYyBUcmVhZG1pbGwoaW50IGdyYW51bGFyaXR5LCBib29sZWFuIHNoYXJlZCkgewotICAgIGZyb21TcGFjZSA9IG5ldyBEb3VibHlMaW5rZWRMaXN0KGdyYW51bGFyaXR5LCBzaGFyZWQpOwotICAgIHRvU3BhY2UgPSBuZXcgRG91Ymx5TGlua2VkTGlzdChncmFudWxhcml0eSwgc2hhcmVkKTsKLSAgICBhbGxvY051cnNlcnkgPSBuZXcgRG91Ymx5TGlua2VkTGlzdChncmFudWxhcml0eSwgc2hhcmVkKTsKLSAgICBjb2xsZWN0TnVyc2VyeSA9IG5ldyBEb3VibHlMaW5rZWRMaXN0KGdyYW51bGFyaXR5LCBzaGFyZWQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIG5vZGUgdG8gdGhlIHRyZWFkbWlsbC4gVGhpcyBpcyB1c3VhbGx5IHBlcmZvcm1lZCBvbiBhbGxvY2F0aW9uLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgdm9pZCBhZGRUb1RyZWFkbWlsbChBZGRyZXNzIG5vZGUsIGJvb2xlYW4gbnVyc2VyeSkgewotICAgIGlmIChudXJzZXJ5KQotICAgICAgYWxsb2NOdXJzZXJ5LmFkZChub2RlKTsKLSAgICBlbHNlCi0gICAgICB0b1NwYWNlLmFkZChub2RlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZW1vdmUgYSBub2RlIGZyb20gdGhlIG51cnNlcnkgbGlzdC4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIEFkZHJlc3MgcG9wTnVyc2VyeSgpIHsKLSAgICByZXR1cm4gY29sbGVjdE51cnNlcnkucG9wKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmVtb3ZlIGEgbm9kZSBmcm9tIHRoZSBtYXR1cmUgbGlzdC4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIEFkZHJlc3MgcG9wKCkgewotICAgIHJldHVybiBmcm9tU3BhY2UucG9wKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29weSBhIG5vZGUgKGR1cmluZyBnYyB0cmFjaW5nKS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHZvaWQgY29weShBZGRyZXNzIG5vZGUsIGJvb2xlYW4gaXNJbk51cnNlcnkpIHsKLSAgICBpZiAoaXNJbk51cnNlcnkpIHsKLSAgICAgIGNvbGxlY3ROdXJzZXJ5LnJlbW92ZShub2RlKTsKLSAgICB9IGVsc2UgewotICAgICAgZnJvbVNwYWNlLnJlbW92ZShub2RlKTsKLSAgICB9Ci0gICAgdG9TcGFjZS5hZGQobm9kZSk7Ci0gIH0KLQotICAvKioKLSAgICogSXMgdGhlIHRvLXNwYWNlIGVtcHR5PwotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgYm9vbGVhbiB0b1NwYWNlRW1wdHkoKSB7Ci0gICAgcmV0dXJuIHRvU3BhY2UuaXNFbXB0eSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIElzIHRoZSBmcm9tLXNwYWNlIGVtcHR5PwotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgYm9vbGVhbiBmcm9tU3BhY2VFbXB0eSgpIHsKLSAgICByZXR1cm4gZnJvbVNwYWNlLmlzRW1wdHkoKTsKLSAgfQotCi0gIC8qKgotICAgKiBJcyB0aGUgbnVyc2VyeSBlbXB0eT8KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGJvb2xlYW4gbnVyc2VyeUVtcHR5KCkgewotICAgIHJldHVybiBjb2xsZWN0TnVyc2VyeS5pc0VtcHR5KCk7Ci0gIH0KLQotICAvKioKLSAgICogRmxpcCB0aGUgcm9sZXMgb2YgdGhlIHNwYWNlcyBpbiBwcmVwYXJhdGlvbiBmb3IgYSBjb2xsZWN0aW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgZmxpcChib29sZWFuIGZ1bGxIZWFwKSB7Ci0gICAgRG91Ymx5TGlua2VkTGlzdCB0bXAgPSBhbGxvY051cnNlcnk7Ci0gICAgYWxsb2NOdXJzZXJ5ID0gY29sbGVjdE51cnNlcnk7Ci0gICAgY29sbGVjdE51cnNlcnkgPSB0bXA7Ci0gICAgaWYgKGZ1bGxIZWFwKSB7Ci0gICAgICB0bXAgPSBmcm9tU3BhY2U7Ci0gICAgICBmcm9tU3BhY2UgPSB0b1NwYWNlOwotICAgICAgdG9TcGFjZSA9IHRtcDsKLSAgICB9Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBNaXNjIGhlYWRlciBtYW5pcHVsYXRpb24KLSAgICovCi0KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIGludCBoZWFkZXJTaXplKCkgewotICAgIHJldHVybiBEb3VibHlMaW5rZWRMaXN0LmhlYWRlclNpemUoKTsKLSAgfQotCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyBBZGRyZXNzIG5vZGVUb1BheWxvYWQoQWRkcmVzcyBwYXlsb2FkKSB7Ci0gICAgcmV0dXJuIERvdWJseUxpbmtlZExpc3Qubm9kZVRvUGF5bG9hZChwYXlsb2FkKTsKLSAgfQotCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyBBZGRyZXNzIG1pZFBheWxvYWRUb05vZGUoQWRkcmVzcyBwYXlsb2FkKSB7Ci0gICAgcmV0dXJuIERvdWJseUxpbmtlZExpc3QubWlkUGF5bG9hZFRvTm9kZShwYXlsb2FkKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEdDU3B5Ci0gICAqLwotCi0gIC8qKgotICAgKiBHYXRoZXIgZGF0YSBmb3IgR0NTcHkgZnJvbSB0aGUgbnVyc2VyeQotICAgKiBAcGFyYW0gZXZlbnQgdGhlIGdjIGV2ZW50Ci0gICAqIEBwYXJhbSB0bURyaXZlciB0aGUgR0NTcHkgc3BhY2UgZHJpdmVyCi0gICAqLwotICBwdWJsaWMgdm9pZCBnY3NweUdhdGhlckRhdGEoaW50IGV2ZW50LCBUcmVhZG1pbGxEcml2ZXIgdG1Ecml2ZXIpIHsKLSAgICB0aGlzLmFsbG9jTnVyc2VyeS5nY3NweUdhdGhlckRhdGEodG1Ecml2ZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdhdGhlciBkYXRhIGZvciBHQ1NweQotICAgKiBAcGFyYW0gZXZlbnQgdGhlIGdjIGV2ZW50Ci0gICAqIEBwYXJhbSB0bURyaXZlciB0aGUgR0NTcHkgc3BhY2UgZHJpdmVyCi0gICAqIEBwYXJhbSB0b3NwYWNlIGdhdGhlciBmcm9tIHRvc3BhY2U/Ci0gICAqLwotICBwdWJsaWMgdm9pZCBnY3NweUdhdGhlckRhdGEoaW50IGV2ZW50LCBUcmVhZG1pbGxEcml2ZXIgdG1Ecml2ZXIsIGJvb2xlYW4gdG9zcGFjZSkgewotICAgIGlmICh0b3NwYWNlKQotICAgICAgdG9TcGFjZS5nY3NweUdhdGhlckRhdGEodG1Ecml2ZXIpOwotICAgIGVsc2UKLSAgICAgIGZyb21TcGFjZS5nY3NweUdhdGhlckRhdGEodG1Ecml2ZXIpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvYWxsb2MvQWxsb2NhdG9yLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvYWxsb2MvQWxsb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNGVkODYuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2FsbG9jL0FsbG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5LmFsbG9jOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5QbGFuOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lio7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5zdGF0aXN0aWNzLio7Ci0KLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IGJhc2UgY2xhc3MgcHJvdmlkZXMgdGhlIGJhc2lzIGZvciBwcm9jZXNzb3ItbG9jYWwKLSAqIGFsbG9jYXRpb24uICBUaGUga2V5IGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgaXMgdGhlIHJldHJ5IG1lY2hhbmlzbQotICogdGhhdCBpcyBuZWNlc3NhcnkgdG8gY29ycmVjdGx5IGhhbmRsZSB0aGUgZmFjdCB0aGF0IGEgInNsb3ctcGF0aCIKLSAqIGFsbG9jYXRpb24gY2FuIGNhdXNlIGEgR0Mgd2hpY2ggdmlvbGF0ZSB0aGUgdW5pbnRlcnJ1cHRhYmlsaXR5IGFzc3VtcHRpb24uCi0gKiBUaGlzIHJlc3VsdHMgaW4gdGhlIHRocmVhZCBiZWluZyBtb3ZlZCB0byBhIGRpZmZlcmVudCBwcm9jZXNzb3Igc28gdGhhdAotICogdGhlIGFsbG9jYXRvciBvYmplY3QgaXQgaXMgdXNpbmcgaXMgbm90IGFjdHVhbGx5IHRoZSBvbmUgZm9yIHRoZSBwcm9jZXNzb3IKLSAqIGl0IGlzIHJ1bm5pbmcgb24uCi0gKgotICogVGhpcyBjbGFzcyBhbHNvIGluY2x1ZGVzIGZ1bmN0aW9uYWxpdHkgdG8gYXNzaXN0IGFsbG9jYXRvcnMgd2l0aAotICogZW5zdXJpbmcgdGhhdCByZXF1ZXN0cyBhcmUgYWxpZ25lZCBhY2NvcmRpbmcgdG8gcmVxdWVzdHMuCi0gKgotICogRmFpbGluZyB0byBoYW5kbGUgdGhpcyBwcm9wZXJseSB3aWxsIGxlYWQgdG8gdmVyeSBoYXJkIHRvIHRyYWNlIGJ1Z3MKLSAqIHdoZXJlIHRoZSBhbGxvY2F0aW9uIHRoYXQgY2F1c2VkIGEgR0Mgb3IgYWxsb2NhdGlvbnMgaW1tZWRpYXRlbHkgZm9sbG93aW5nCi0gKiBHQyBhcmUgcnVuIGluY29ycmVjdGx5LgotICovCi1AVW5pbnRlcnJ1cHRpYmxlIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBbGxvY2F0b3IgaW1wbGVtZW50cyBDb25zdGFudHMgewotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHNwYWNlIHRoaXMgYWxsb2NhdG9yIGlzIGN1cnJlbnRseSBib3VuZCB0by4KLSAgICoKLSAgICogQHJldHVybiBUaGUgU3BhY2UuCi0gICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3BhY2UgZ2V0U3BhY2UoKTsKLQotICAvKioKLSAgICogQWxpZ25zIHVwIGFuIGFsbG9jYXRpb24gcmVxdWVzdC4gVGhlIGFsbG9jYXRpb24gcmVxdWVzdCBhY2NlcHRzIGEKLSAgICogcmVnaW9uLCB0aGF0IG11c3QgYmUgYXQgbGVhc3QgcGFydGljbGUgYWxpZ25lZCwgYW4gYWxpZ25tZW50Ci0gICAqIHJlcXVlc3QgKHNvbWUgcG93ZXIgb2YgdHdvIG51bWJlciBvZiBwYXJ0aWNsZXMpIGFuZCBhbiBvZmZzZXQgKGEKLSAgICogbnVtYmVyIG9mIHBhcnRpY2xlcykuIFRoZXJlIGlzIGFsc28gYSBrbm93bkFsaWdubWVudCBwYXJhbWV0ZXIgdG8KLSAgICogYWxsb3cgYSBtb3JlIG9wdGltaXNlZCBjaGVjayB3aGVuIHRoZSBwYXJ0aWN1bGFyIGFsbG9jYXRvciBpbiB1c2UKLSAgICogYWx3YXlzIGFsaWducyBhdCBhIGNvYXJzZXIgZ3JhaW4gdGhhbiBpbmRpdmlkdWFsIHBhcnRpY2xlcywgc3VjaAotICAgKiBhcyBzb21lIGZyZWUgbGlzdHMuCi0gICAqCi0gICAqIEBwYXJhbSByZWdpb24gVGhlIHJlZ2lvbiB0byBhbGlnbiB1cC4KLSAgICogQHBhcmFtIGFsaWdubWVudCBUaGUgcmVxdWVzdGVkIGFsaWdubWVudAotICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgZnJvbSB0aGUgYWxpZ25tZW50Ci0gICAqIEBwYXJhbSBrbm93bkFsaWdubWVudCBUaGUgc3RhdGljYWxseSBrbm93biBtaW5pbXVtIGFsaWdubWVudC4KLSAgICogQHJldHVybiBUaGUgYWxpZ25lZCB1cCBhZGRyZXNzLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIEFkZHJlc3MgYWxpZ25BbGxvY2F0aW9uKEFkZHJlc3MgcmVnaW9uLCBpbnQgYWxpZ25tZW50LCBpbnQgb2Zmc2V0LCBpbnQga25vd25BbGlnbm1lbnQsIGJvb2xlYW4gZmlsbEFsaWdubWVudEdhcCkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgewotICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGtub3duQWxpZ25tZW50ID49IE1JTl9BTElHTk1FTlQpOwotICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KE1JTl9BTElHTk1FTlQgPj0gQllURVNfSU5fSU5UKTsKLSAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydCghKGZpbGxBbGlnbm1lbnRHYXAgJiYgcmVnaW9uLmlzWmVybygpKSk7Ci0gICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQoYWxpZ25tZW50IDw9IE1BWF9BTElHTk1FTlQpOwotICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KG9mZnNldCA+PSAwKTsKLSAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChyZWdpb24udG9Xb3JkKCkuYW5kKFdvcmQuZnJvbUludFNpZ25FeHRlbmQoTUlOX0FMSUdOTUVOVC0xKSkuaXNaZXJvKCkpOwotICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KChhbGlnbm1lbnQgJiAoTUlOX0FMSUdOTUVOVCAtIDEpKSA9PSAwKTsKLSAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydCgob2Zmc2V0ICYgKE1JTl9BTElHTk1FTlQgLSAxKSkgPT0gMCk7Ci0gICAgfQotCi0gICAgLy8gTm8gYWxpZ25tZW50IGV2ZXIgcmVxdWlyZWQuCi0gICAgaWYgKGFsaWdubWVudCA8PSBrbm93bkFsaWdubWVudCB8fCBNQVhfQUxJR05NRU5UIDw9IE1JTl9BTElHTk1FTlQpCi0gICAgICByZXR1cm4gcmVnaW9uOwotCi0gICAgLy8gTWF5IHJlcXVpcmUgYW4gYWxpZ25tZW50Ci0gICAgV29yZCBtYXNrID0gV29yZC5mcm9tSW50U2lnbkV4dGVuZChhbGlnbm1lbnQgLSAxKTsKLSAgICBXb3JkIG5lZ09mZiA9IFdvcmQuZnJvbUludFNpZ25FeHRlbmQoLW9mZnNldCk7Ci0gICAgT2Zmc2V0IGRlbHRhID0gbmVnT2ZmLm1pbnVzKHJlZ2lvbi50b1dvcmQoKSkuYW5kKG1hc2spLnRvT2Zmc2V0KCk7Ci0KLSAgICBpZiAoZmlsbEFsaWdubWVudEdhcCAmJiBBTElHTk1FTlRfVkFMVUUgIT0gMCkgewotICAgICAgaWYgKChNQVhfQUxJR05NRU5UIC0gTUlOX0FMSUdOTUVOVCkgPT0gQllURVNfSU5fV09SRCkgewotICAgICAgICAvLyBBdCBtb3N0IGEgc2luZ2xlIGhvbGUKLSAgICAgICAgaWYgKGRlbHRhLnRvSW50KCkgPT0gKEJZVEVTX0lOX1dPUkQpKSB7Ci0gICAgICAgICAgcmVnaW9uLnN0b3JlKFdvcmQuZnJvbUludFNpZ25FeHRlbmQoQUxJR05NRU5UX1ZBTFVFKSk7Ci0gICAgICAgICAgcmVnaW9uID0gcmVnaW9uLnBsdXMoZGVsdGEpOwotICAgICAgICByZXR1cm4gcmVnaW9uOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICB3aGlsZSAoZGVsdGEudG9JbnQoKSA+PSAoQllURVNfSU5fV09SRCkpIHsKLSAgICAgICAgICByZWdpb24uc3RvcmUoV29yZC5mcm9tSW50U2lnbkV4dGVuZChBTElHTk1FTlRfVkFMVUUpKTsKLSAgICAgICAgICByZWdpb24gPSByZWdpb24ucGx1cyhCWVRFU19JTl9XT1JEKTsKLSAgICAgICAgICBkZWx0YSA9IGRlbHRhLm1pbnVzKEJZVEVTX0lOX1dPUkQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlZ2lvbi5wbHVzKGRlbHRhKTsKLSAgfQotCi0gIC8qKgotICAgKiBGaWxsIHRoZSBzcGVjaWZpZWQgcmVnaW9uIHdpdGggdGhlIGFsaWdubWVudCB2YWx1ZS4KLSAgICoKLSAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmVnaW9uLgotICAgKiBAcGFyYW0gZW5kIEEgcG9pbnRlciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJlZ2lvbi4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyB2b2lkIGZpbGxBbGlnbm1lbnRHYXAoQWRkcmVzcyBzdGFydCwgQWRkcmVzcyBlbmQpIHsKLSAgICBpZiAoKE1BWF9BTElHTk1FTlQgLSBNSU5fQUxJR05NRU5UKSA9PSBCWVRFU19JTl9JTlQpIHsKLSAgICAgIC8vIEF0IG1vc3QgYSBzaW5nbGUgaG9sZQotICAgICAgaWYgKCFlbmQuZGlmZihzdGFydCkuaXNaZXJvKCkpIHsKLSAgICAgICAgc3RhcnQuc3RvcmUoQUxJR05NRU5UX1ZBTFVFKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgd2hpbGUgKHN0YXJ0LkxUKGVuZCkpIHsKLSAgICAgICAgc3RhcnQuc3RvcmUoQUxJR05NRU5UX1ZBTFVFKTsKLSAgICAgICAgc3RhcnQgPSBzdGFydC5wbHVzKEJZVEVTX0lOX0lOVCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFsaWducyB1cCBhbiBhbGxvY2F0aW9uIHJlcXVlc3QuIFRoZSBhbGxvY2F0aW9uIHJlcXVlc3QgYWNjZXB0cyBhCi0gICAqIHJlZ2lvbiwgdGhhdCBtdXN0IGJlIGF0IGxlYXN0IHBhcnRpY2xlIGFsaWduZWQsIGFuIGFsaWdubWVudAotICAgKiByZXF1ZXN0IChzb21lIHBvd2VyIG9mIHR3byBudW1iZXIgb2YgcGFydGljbGVzKSBhbmQgYW4gb2Zmc2V0IChhCi0gICAqIG51bWJlciBvZiBwYXJ0aWNsZXMpLgotICAgKgotICAgKiBAcGFyYW0gcmVnaW9uIFRoZSByZWdpb24gdG8gYWxpZ24gdXAuCi0gICAqIEBwYXJhbSBhbGlnbm1lbnQgVGhlIHJlcXVlc3RlZCBhbGlnbm1lbnQKLSAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGZyb20gdGhlIGFsaWdubWVudAotICAgKiBAcmV0dXJuIFRoZSBhbGlnbmVkIHVwIGFkZHJlc3MuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBzdGF0aWMgQWRkcmVzcyBhbGlnbkFsbG9jYXRpb24oQWRkcmVzcyByZWdpb24sIGludCBhbGlnbm1lbnQsIGludCBvZmZzZXQpIHsKLSAgICByZXR1cm4gYWxpZ25BbGxvY2F0aW9uKHJlZ2lvbiwgYWxpZ25tZW50LCBvZmZzZXQsIE1JTl9BTElHTk1FTlQsIHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFsaWducyB1cCBhbiBhbGxvY2F0aW9uIHJlcXVlc3QuIFRoZSBhbGxvY2F0aW9uIHJlcXVlc3QgYWNjZXB0cyBhCi0gICAqIHJlZ2lvbiwgdGhhdCBtdXN0IGJlIGF0IGxlYXN0IHBhcnRpY2xlIGFsaWduZWQsIGFuIGFsaWdubWVudAotICAgKiByZXF1ZXN0IChzb21lIHBvd2VyIG9mIHR3byBudW1iZXIgb2YgcGFydGljbGVzKSBhbmQgYW4gb2Zmc2V0IChhCi0gICAqIG51bWJlciBvZiBwYXJ0aWNsZXMpLgotICAgKgotICAgKiBAcGFyYW0gcmVnaW9uIFRoZSByZWdpb24gdG8gYWxpZ24gdXAuCi0gICAqIEBwYXJhbSBhbGlnbm1lbnQgVGhlIHJlcXVlc3RlZCBhbGlnbm1lbnQKLSAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGZyb20gdGhlIGFsaWdubWVudAotICAgKiBAcmV0dXJuIFRoZSBhbGlnbmVkIHVwIGFkZHJlc3MuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBzdGF0aWMgQWRkcmVzcyBhbGlnbkFsbG9jYXRpb25Ob0ZpbGwoQWRkcmVzcyByZWdpb24sIGludCBhbGlnbm1lbnQsIGludCBvZmZzZXQpIHsKLSAgICByZXR1cm4gYWxpZ25BbGxvY2F0aW9uKHJlZ2lvbiwgYWxpZ25tZW50LCBvZmZzZXQsIE1JTl9BTElHTk1FTlQsIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBjYWxjdWxhdGVzIHRoZSBtaW5pbXVtIHNpemUgdGhhdCB3aWxsIGd1YXJhbnRlZSB0aGUgYWxsb2NhdGlvbgotICAgKiBvZiBhIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgYXQgdGhlIHNwZWNpZmllZCBhbGlnbm1lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBzaXplIFRoZSBudW1iZXIgb2YgYnl0ZXMgKG5vdCBhbGlnbmVkKS4KLSAgICogQHBhcmFtIGFsaWdubWVudCBUaGUgcmVxdWVzdGVkIGFsaWdubWVudCAoc29tZSBmYWN0b3Igb2YgMikuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBzdGF0aWMgaW50IGdldE1heGltdW1BbGlnbmVkU2l6ZShpbnQgc2l6ZSwgaW50IGFsaWdubWVudCkgewotICAgIHJldHVybiBnZXRNYXhpbXVtQWxpZ25lZFNpemUoc2l6ZSwgYWxpZ25tZW50LCBNSU5fQUxJR05NRU5UKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBjYWxjdWxhdGVzIHRoZSBtaW5pbXVtIHNpemUgdGhhdCB3aWxsIGd1YXJhbnRlZSB0aGUgYWxsb2NhdGlvbgotICAgKiBvZiBhIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgYXQgdGhlIHNwZWNpZmllZCBhbGlnbm1lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBzaXplIFRoZSBudW1iZXIgb2YgYnl0ZXMgKG5vdCBhbGlnbmVkKS4KLSAgICogQHBhcmFtIGFsaWdubWVudCBUaGUgcmVxdWVzdGVkIGFsaWdubWVudCAoc29tZSBmYWN0b3Igb2YgMikuCi0gICAqIEBwYXJhbSBrbm93bkFsaWdubWVudCBUaGUga25vd24gbWluaW11bSBhbGlnbm1lbnQuIFNwZWNpZmljYWxseSBmb3IgdXNlIGluCi0gICAqIGFsbG9jYXRvcnMgdGhhdCBlbmZvcmNlIGdyZWF0ZXIgdGhhbiBwYXJ0aWNsZSBhbGlnbm1lbnQuIEl0IGlzIGEgPGI+cHJlY29uZGl0aW9uPC9iPgotICAgKiB0aGF0IHNpemUgaXMgYWxpZ25lZCB0byBrbm93bkFsaWdubWVudCwgYW5kIHRoYXQga25vd25BbGlnbm1lbnQgPj0gTUlOX0FMR0lOTUVOVC4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TWF4aW11bUFsaWduZWRTaXplKGludCBzaXplLCBpbnQgYWxpZ25tZW50LCBpbnQga25vd25BbGlnbm1lbnQpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChzaXplID09IENvbnZlcnNpb25zLnJvdW5kRG93bihzaXplLCBrbm93bkFsaWdubWVudCkpOwotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGtub3duQWxpZ25tZW50ID49IE1JTl9BTElHTk1FTlQpOwotCi0gICAgaWYgKE1BWF9BTElHTk1FTlQgPD0gTUlOX0FMSUdOTUVOVCB8fCBhbGlnbm1lbnQgPD0ga25vd25BbGlnbm1lbnQpIHsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gc2l6ZSArIGFsaWdubWVudCAtIGtub3duQWxpZ25tZW50OwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTaW5nbGUgc2xvdyBwYXRoIGFsbG9jYXRpb24gYXR0ZW1wdC4gVGhpcyBpcyBjYWxsZWQgYnkgYWxsb2NTbG93LgotICAgKgotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIHNpemUgb2YgdGhlIGFsbG9jYXRpb24gcmVxdWVzdAotICAgKiBAcGFyYW0gYWxpZ25tZW50IFRoZSByZXF1aXJlZCBhbGlnbm1lbnQKLSAgICogQHBhcmFtIG9mZnNldCBUaGUgYWxpZ25tZW50IG9mZnNldAotICAgKiBAcmV0dXJuIFRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSByZWdpb24sIG9yIHplcm8gaWYgYWxsb2NhdGlvbiBmYWlscwotICAgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IEFkZHJlc3MgYWxsb2NTbG93T25jZShpbnQgYnl0ZXMsIGludCBhbGlnbm1lbnQsIGludCBvZmZzZXQpOwotCi0gIC8qKgotICAgKiA8Yj5PdXQtb2YtbGluZTwvYj4gc2xvdyBwYXRoIGFsbG9jYXRpb24uIFRoaXMgbWV0aG9kIGZvcmNlcyBzbG93IHBhdGgKLSAgICogYWxsb2NhdGlvbiB0byBiZSBvdXQgb2YgbGluZSAodHlwaWNhbGx5IGRlc2lyYWJsZSwgYnV0IG5vdCB3aGVuIHRoZQotICAgKiBjYWxsaW5nIGNvbnRleHQgaXMgYWxyZWFkeSBleHBsaWNpdGx5IG91dC1vZi1saW5lKS4KLSAgICoKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBzaXplIG9mIHRoZSBhbGxvY2F0aW9uIHJlcXVlc3QKLSAgICogQHBhcmFtIGFsaWdubWVudCBUaGUgcmVxdWlyZWQgYWxpZ25tZW50Ci0gICAqIEBwYXJhbSBvZmZzZXQgVGhlIGFsaWdubWVudCBvZmZzZXQKLSAgICogQHJldHVybiBUaGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgcmVnaW9uLCBvciB6ZXJvIGlmIGFsbG9jYXRpb24gZmFpbHMKLSAgICovCi0gIEBOb0lubGluZQotICBwdWJsaWMgZmluYWwgQWRkcmVzcyBhbGxvY1Nsb3coaW50IGJ5dGVzLCBpbnQgYWxpZ25tZW50LCBpbnQgb2Zmc2V0KSB7Ci0gICAgcmV0dXJuIGFsbG9jU2xvd0lubGluZShieXRlcywgYWxpZ25tZW50LCBvZmZzZXQpOwotICB9Ci0KLSAgLyoqCi0gICAqIDxiPklubGluZTwvYj4gc2xvdyBwYXRoIGFsbG9jYXRpb24uIFRoaXMgbWV0aG9kIGF0dGVtcHRzIGFsbG9jU2xvd09uY2UKLSAgICogc2V2ZXJhbCB0aW1lcywgYW5kIGFsbG93cyBjb2xsZWN0aW9uIHRvIG9jY3VyLCBhbmQgZW5zdXJlcyB0aGF0IGV4ZWN1dGlvbgotICAgKiBzYWZlbHkgcmVzdW1lcyBieSB0YWtpbmcgY2FyZSBvZiBwb3RlbnRpYWwgdGhyZWFkL211dGF0b3IgY29udGV4dCBhZmZpbml0eQotICAgKiBjaGFuZ2VzLiBBbGwgYWxsb2NhdG9ycyBzaG91bGQgdXNlIHRoaXMgYXMgdGhlIHRyYW1wb2xpbmUgZm9yIHNsb3cKLSAgICogcGF0aCBhbGxvY2F0aW9uLgotICAgKgotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIHNpemUgb2YgdGhlIGFsbG9jYXRpb24gcmVxdWVzdAotICAgKiBAcGFyYW0gYWxpZ25tZW50IFRoZSByZXF1aXJlZCBhbGlnbm1lbnQKLSAgICogQHBhcmFtIG9mZnNldCBUaGUgYWxpZ25tZW50IG9mZnNldAotICAgKiBAcmV0dXJuIFRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSByZWdpb24sIG9yIHplcm8gaWYgYWxsb2NhdGlvbiBmYWlscwotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgQWRkcmVzcyBhbGxvY1Nsb3dJbmxpbmUoaW50IGJ5dGVzLCBpbnQgYWxpZ25tZW50LCBpbnQgb2Zmc2V0KSB7Ci0gICAgaW50IGdjQ291bnRTdGFydCA9IFN0YXRzLmdjQ291bnQoKTsKLSAgICBBbGxvY2F0b3IgY3VycmVudCA9IHRoaXM7Ci0gICAgU3BhY2Ugc3BhY2UgPSBjdXJyZW50LmdldFNwYWNlKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQbGFuLk1BWF9DT0xMRUNUSU9OX0FUVEVNUFRTOyBpKyspIHsKLSAgICAgIEFkZHJlc3MgcmVzdWx0ID0gY3VycmVudC5hbGxvY1Nsb3dPbmNlKGJ5dGVzLCBhbGlnbm1lbnQsIG9mZnNldCk7Ci0gICAgICBpZiAoIXJlc3VsdC5pc1plcm8oKSkgewotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotICAgICAgaWYgKCFQbGFuLmdjSW5Qcm9ncmVzcygpKSB7Ci0gICAgICAgIC8qIFRoaXMgaXMgaW4gY2FzZSBhIEdDIG9jY3VycywgYW5kIG91ciBtdXRhdG9yIGNvbnRleHQgaXMgc3RhbGUuCi0gICAgICAgICAqIEluIHNvbWUgVk1zIHRoZSBzY2hlZHVsZXIgY2FuIGNoYW5nZSB0aGUgYWZmaW5pdHkgYmV0d2VlbiB0aGUKLSAgICAgICAgICogY3VycmVudCB0aHJlYWQgYW5kIHRoZSBtdXRhdG9yIGNvbnRleHQuIFRoaXMgaXMgcG9zc2libGUgZm9yCi0gICAgICAgICAqIFZNcyB0aGF0IGR5bmFtaWNhbGx5IG11bHRpcGxleCBKYXZhIHRocmVhZHMgb250byBtdWx0aXBsZSBtdXRhdG9yCi0gICAgICAgICAqIGNvbnRleHRzLCAqLwotICAgICAgICBjdXJyZW50ID0gVk0uYWN0aXZlUGxhbi5tdXRhdG9yKCkuZ2V0QWxsb2NhdG9yRnJvbVNwYWNlKHNwYWNlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgTG9nLndyaXRlKCJHQyBFcnJvcjogQWxsb2NhdG9yLmFsbG9jU2xvdyBmYWlsZWQgb24gcmVxdWVzdCBvZiAiKTsKLSAgICBMb2cud3JpdGUoYnl0ZXMpOwotICAgIExvZy53cml0ZSgiIG9uIHNwYWNlICIpOwotICAgIExvZy53cml0ZWxuKHNwYWNlLmdldE5hbWUoKSk7Ci0gICAgTG9nLndyaXRlKCJnY0NvdW50U3RhcnQgPSAiKTsKLSAgICBMb2cud3JpdGVsbihnY0NvdW50U3RhcnQpOwotICAgIExvZy53cml0ZSgiZ2NDb3VudCAobm93KSA9ICIpOwotICAgIExvZy53cml0ZWxuKFN0YXRzLmdjQ291bnQoKSk7Ci0gICAgU3BhY2UucHJpbnRVc2FnZU1CKCk7Ci0gICAgVk0uYXNzZXJ0aW9ucy5mYWlsKCJBbGxvY2F0aW9uIEZhaWxlZCEiKTsKLSAgICAvKiBOT1RSRUFDSEVEICovCi0gICAgcmV0dXJuIEFkZHJlc3MuemVybygpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvYWxsb2MvQmxvY2tBbGxvY2F0b3IuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9hbGxvYy9CbG9ja0FsbG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2RjZGQxLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9hbGxvYy9CbG9ja0FsbG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM1ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5LmFsbG9jOwotCi1pbXBvcnQgb3JnLm1tdGsucG9saWN5LlNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuKjsKLQotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyAiYmxvY2siIGRhdGEgc3RydWN0dXJlcyBvZiB2YXJpb3VzIHNpemVzLjxwPgotICoKLSAqIEJsb2NrcyBhcmUgYSBub24tc2hhcmVkICh0aHJlYWQtbG9jYWwpIGNvYXJzZS1ncmFpbmVkIHVuaXQgb2YKLSAqIHN0b3JhZ2UuIEJsb2NrcyBhcmUgYXZhaWxhYmxlIGluIHBvd2VyLW9mLXR3byBzaXplcy4KLSAqCi0gKiBWaXJ0dWFsIG1lbW9yeSBzcGFjZSBpcyB0YWtlbiBmcm9tIGEgVk0gcmVzb3VyY2UsIGFuZCBwYWdlcwotICogY29uc3VtZWQgYnkgYmxvY2tzIGFyZSBhY2NvdW50ZWQgZm9yIGJ5IGEgbWVtb3J5IHJlc291cmNlLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgZmluYWwgY2xhc3MgQmxvY2tBbGxvY2F0b3IgaW1wbGVtZW50cyBDb25zdGFudHMgewotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDbGFzcyB2YXJpYWJsZXMKLSAgICovCi0KLSAgLy8gYmxvY2sgZnJlZWxpc3QKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9HX01JTl9CTE9DSyA9IDEyOyAvLyA0SyBieXRlcwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0dfTUFYX0JMT0NLID0gMTU7IC8vIDMySyBieXRlcwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTUFYX0JMT0NLX1NJWkVfQ0xBU1MgPSBMT0dfTUFYX0JMT0NLIC0gTE9HX01JTl9CTE9DSzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkxPQ0tfU0laRV9DTEFTU0VTID0gTUFYX0JMT0NLX1NJWkVfQ0xBU1MgKyAxOwotCi0gIC8vIG1ldGFkYXRhCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIE9mZnNldCBORVhUX09GRlNFVCA9IE9mZnNldC56ZXJvKCk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIE9mZnNldCBCTURfT0ZGU0VUID0gTkVYVF9PRkZTRVQucGx1cyhCWVRFU19JTl9BRERSRVNTKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2Zmc2V0IENTQ19PRkZTRVQgPSBCTURfT0ZGU0VULnBsdXMoMSk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIE9mZnNldCBJVV9PRkZTRVQgPSBDU0NfT0ZGU0VULnBsdXMoMSk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIE9mZnNldCBGTF9NRVRBX09GRlNFVCA9IElVX09GRlNFVC5wbHVzKEJZVEVTX0lOX1NIT1JUKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBCTE9DS19TQ19NQVNLID0gMHhmOyAgICAgICAgICAgICAvLyBsb3dlciA0IGJpdHMKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJMT0NLX1BBR0VfT0ZGU0VUX1NISUZUID0gNDsgICAgICAvLyBoaWdoZXIgNCBiaXRzCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQkxPQ0tfUEFHRV9PRkZTRVQgPSAoMTw8NCktMTsgLy8gNCBiaXRzCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0dfQllURVNfSU5fQkxPQ0tfTUVUQSA9IExPR19CWVRFU19JTl9BRERSRVNTICsgMjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPR19CWVRFX0NPVkVSQUdFID0gTE9HX01JTl9CTE9DSyAtIExPR19CWVRFU19JTl9CTE9DS19NRVRBOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEFfREFUQV9CWVRFU19QRVJfUkVHSU9OID0gMSA8PCAoRW1iZWRkZWRNZXRhRGF0YS5MT0dfQllURVNfSU5fUkVHSU9OIC0gTE9HX0JZVEVfQ09WRVJBR0UpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEV4dGVudCBNRVRBX0RBVEFfRVhURU5UID0gRXh0ZW50LmZyb21JbnRTaWduRXh0ZW5kKE1FVEFfREFUQV9CWVRFU19QRVJfUkVHSU9OKTsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBBbGxvY2F0aW9uICYgZnJlZWluZwotICAgKi8KLQotICAvKioKLSAgICogQWxsb2NhdGUgYSBibG9jaywgcmV0dXJuaW5nIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCB1c2FibGUgYnl0ZQotICAgKiBpbiB0aGUgYmxvY2suCi0gICAqCi0gICAqIEBwYXJhbSBibG9ja1NpemVDbGFzcyBUaGUgc2l6ZSBjbGFzcyBmb3IgdGhlIGJsb2NrIHRvIGJlIGFsbG9jYXRlZC4KLSAgICogQHJldHVybiBUaGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgdXNhYmxlIGJ5dGUgaW4gdGhlIGJsb2NrLCBvcgotICAgKiB6ZXJvIG9uIGZhaWx1cmUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEFkZHJlc3MgYWxsb2MoU3BhY2Ugc3BhY2UsIGludCBibG9ja1NpemVDbGFzcykgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KChibG9ja1NpemVDbGFzcyA+PSAwKSAmJiAoYmxvY2tTaXplQ2xhc3MgPD0gTUFYX0JMT0NLX1NJWkVfQ0xBU1MpKTsKLSAgICBpbnQgcGFnZXMgPSBwYWdlc0ZvclNpemVDbGFzcyhibG9ja1NpemVDbGFzcyk7Ci0gICAgQWRkcmVzcyByZXN1bHQgPSBzcGFjZS5hY3F1aXJlKHBhZ2VzKTsKLSAgICBpZiAoIXJlc3VsdC5pc1plcm8oKSkgewotICAgICAgc2V0QmxrU2l6ZU1ldGFEYXRhKHJlc3VsdCwgKGJ5dGUpIGJsb2NrU2l6ZUNsYXNzKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBGcmVlIGEgYmxvY2suICBJZiB0aGUgYmxvY2sgaXMgYSBzdWItcGFnZSBibG9jayBhbmQgdGhlIHBhZ2UgaXMKLSAgICogbm90IGNvbXBsZXRlbHkgZnJlZSwgdGhlbiB0aGUgYmxvY2sgaXMgYWRkZWQgdG8gdGhlIGZyZWUgbGlzdC4KLSAgICogT3RoZXJ3aXNlIHRoZSBibG9jayBpcyByZXR1cm5lZCB0byB0aGUgdmlydHVhbCBtZW1vcnkgcmVzb3VyY2UuCi0gICAqCi0gICAqIEBwYXJhbSBibG9jayBUaGUgYWRkcmVzcyBvZiB0aGUgYmxvY2sgdG8gYmUgZnJlZWQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBmcmVlKFNwYWNlIHNwYWNlLCBBZGRyZXNzIGJsb2NrKSB7Ci0gICAgc3BhY2UucmVsZWFzZShibG9jayk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBzaXplIGluIGJ5dGVzIG9mIGEgYmxvY2sgb2YgYSBnaXZlbiBzaXplIGNsYXNzCi0gICAqCi0gICAqIEBwYXJhbSBibG9ja1NpemVDbGFzcyBUaGUgc2l6ZSBjbGFzcyBpbiBxdWVzdGlvbgotICAgKiBAcmV0dXJuIFRoZSBzaXplIGluIGJ5dGVzIG9mIGEgYmxvY2sgb2YgdGhpcyBzaXplIGNsYXNzCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBzdGF0aWMgaW50IGJsb2NrU2l6ZShpbnQgYmxvY2tTaXplQ2xhc3MpIHsKLSAgICByZXR1cm4gMSA8PCAoTE9HX01JTl9CTE9DSyArIGJsb2NrU2l6ZUNsYXNzKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBwYWdlcyByZXF1aXJlZCB3aGVuIGFsbG9jYXRpbmcgc3BhY2UgZm9yCi0gICAqICAgICAgICAgdGhpcyBzaXplIGNsYXNzLgotICAgKgotICAgKiBAcGFyYW0gYmxvY2tTaXplQ2xhc3MgVGhlIHNpemUgY2xhc3MgaW4gcXVlc3Rpb24KLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHJlcXVpcmVkIHdoZW4gYWxsb2NhdGluZyBhIGJsb2NrIChvcgotICAgKiBibG9ja3MpIG9mIHRoaXMgc2l6ZSBjbGFzcy4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHBhZ2VzRm9yU2l6ZUNsYXNzKGludCBibG9ja1NpemVDbGFzcykgewotICAgIHJldHVybiAxIDw8IChMT0dfTUlOX0JMT0NLICsgYmxvY2tTaXplQ2xhc3MgLSBMT0dfQllURVNfSU5fUEFHRSk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBCbG9jayBtZXRhLWRhdGEgbWFuaXB1bGF0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBTZXQgdGhlIDxpPmJsb2NrIHNpemUgY2xhc3M8L2k+IG1ldGEgZGF0YSBmaWVsZCBmb3IgYSBnaXZlbgotICAgKiBhZGRyZXNzIChhbGwgYmxvY2tzIG9uIGEgZ2l2ZW4gcGFnZSBhcmUgaG9tb2dlbmVvdXMgd2l0aCByZXNwZWN0Ci0gICAqIHRvIGJsb2NrIHNpemUgY2xhc3MpLgotICAgKgotICAgKiBAcGFyYW0gYmxvY2sgVGhlIGFkZHJlc3Mgb2YgaW50ZXJlc3QKLSAgICogQHBhcmFtIHNjIFRoZSB2YWx1ZSB0byB3aGljaCB0aGlzIGZpZWxkIGlzIHRvIGJlIHNldAotICAgKi8KLSAgQElubGluZQotICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldEJsa1NpemVNZXRhRGF0YShBZGRyZXNzIGJsb2NrLCBieXRlIHNjKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSB7Ci0gICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQoYmxvY2suRVEoQ29udmVyc2lvbnMucGFnZUFsaWduKGJsb2NrKSkpOwotICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KHBhZ2VzRm9yU2l6ZUNsYXNzKHNjKSAtIDEgIDw9IE1BWF9CTE9DS19QQUdFX09GRlNFVCk7Ci0gICAgfQotICAgIEFkZHJlc3MgYWRkcmVzcyA9IGJsb2NrOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXNGb3JTaXplQ2xhc3Moc2MpOyBpKyspIHsKLSAgICAgIGJ5dGUgdmFsdWUgPSAoYnl0ZSkgKChpIDw8IEJMT0NLX1BBR0VfT0ZGU0VUX1NISUZUKSB8IHNjKTsKLSAgICAgIGdldE1ldGFBZGRyZXNzKGFkZHJlc3MpLnN0b3JlKHZhbHVlLCBCTURfT0ZGU0VUKTsKLSAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgewotICAgICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZ2V0QmxrU3RhcnQoYWRkcmVzcykuRVEoYmxvY2spKTsKLSAgICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGdldEJsa1NpemVDbGFzcyhhZGRyZXNzKSA9PSBzYyk7Ci0gICAgICB9Ci0gICAgICBhZGRyZXNzID0gYWRkcmVzcy5wbHVzKDE8PFZNLkxPR19CWVRFU19JTl9QQUdFKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSA8aT5ibG9jayBzaXplIGNsYXNzPC9pPiBtZXRhIGRhdGEgZmllbGQgZm9yIGEgZ2l2ZW4gcGFnZQotICAgKiAoYWxsIGJsb2NrcyBvbiBhIGdpdmVuIHBhZ2UgYXJlIGhvbW9nZW5lb3VzIHdpdGggcmVzcGVjdCB0byBibG9jawotICAgKiBzaXplIGNsYXNzKS4KLSAgICoKLSAgICogQHBhcmFtIGFkZHJlc3MgVGhlIGFkZHJlc3Mgb2YgaW50ZXJlc3QKLSAgICogQHJldHVybiBUaGUgc2l6ZSBjbGFzcyBmaWVsZCBmb3IgdGhlIGJsb2NrIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGFkZHJlc3MKLSAgICovCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSBzdGF0aWMgYnl0ZSBnZXRCbGtTaXplQ2xhc3MoQWRkcmVzcyBhZGRyZXNzKSB7Ci0gICAgYWRkcmVzcyA9IENvbnZlcnNpb25zLnBhZ2VBbGlnbihhZGRyZXNzKTsKLSAgICBieXRlIHJ0biA9IChieXRlKSAoZ2V0TWV0YUFkZHJlc3MoYWRkcmVzcykubG9hZEJ5dGUoQk1EX09GRlNFVCkgJiBCTE9DS19TQ19NQVNLKTsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChydG4gPj0gMCAmJiBydG4gPD0gTUFYX0JMT0NLX1NJWkVfQ0xBU1MpOwotICAgIHJldHVybiBydG47Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSA8aT5hZGRyZXNzIG9mIHRoZSBzdGFydCBvZiBhIGJsb2NrIHNpemUgY2xhc3M8L2k+IGEgZ2l2ZW4gcGFnZQotICAgKiB3aXRoaW4gdGhlIGJsb2NrLgotICAgKgotICAgKiBAcGFyYW0gYWRkcmVzcyBUaGUgYWRkcmVzcyBvZiBpbnRlcmVzdAotICAgKiBAcmV0dXJuIFRoZSBhZGRyZXNzIG9mIHRoZSBibG9jayBjb250YWluaW5nIHRoZSBhZGRyZXNzCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBzdGF0aWMgQWRkcmVzcyBnZXRCbGtTdGFydChBZGRyZXNzIGFkZHJlc3MpIHsKLSAgICBhZGRyZXNzID0gQ29udmVyc2lvbnMucGFnZUFsaWduKGFkZHJlc3MpOwotICAgIGJ5dGUgb2Zmc2V0ID0gKGJ5dGUpIChnZXRNZXRhQWRkcmVzcyhhZGRyZXNzKS5sb2FkQnl0ZShCTURfT0ZGU0VUKSA+Pj4gQkxPQ0tfUEFHRV9PRkZTRVRfU0hJRlQpOwotICAgIHJldHVybiBhZGRyZXNzLm1pbnVzKG9mZnNldDw8TE9HX0JZVEVTX0lOX1BBR0UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgPGk+Y2xpZW50IHNpemUgY2xhc3M8L2k+IG1ldGEgZGF0YSBmaWVsZCBmb3IgYSBnaXZlbgotICAgKiBhZGRyZXNzIChhbGwgYmxvY2tzIG9uIGEgZ2l2ZW4gcGFnZSBhcmUgaG9tb2dlbmVvdXMgd2l0aCByZXNwZWN0Ci0gICAqIHRvIGJsb2NrIHNpemUgY2xhc3MpLgotICAgKgotICAgKiBAcGFyYW0gYmxvY2sgVGhlIGFkZHJlc3Mgb2YgaW50ZXJlc3QKLSAgICogQHBhcmFtIHNjIFRoZSB2YWx1ZSB0byB3aGljaCB0aGlzIGZpZWxkIGlzIHRvIGJlIHNldAotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0QWxsQ2xpZW50U2l6ZUNsYXNzKEFkZHJlc3MgYmxvY2ssIGludCBibG9ja3NjLCBieXRlIHNjKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoYmxvY2suRVEoQ29udmVyc2lvbnMucGFnZUFsaWduKGJsb2NrKSkpOwotICAgIEFkZHJlc3MgYWRkcmVzcyA9IGJsb2NrOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXNGb3JTaXplQ2xhc3MoYmxvY2tzYyk7IGkrKykgewotICAgICAgZ2V0TWV0YUFkZHJlc3MoYWRkcmVzcykuc3RvcmUoc2MsIENTQ19PRkZTRVQpOwotICAgICAgYWRkcmVzcyA9IGFkZHJlc3MucGx1cygxPDxWTS5MT0dfQllURVNfSU5fUEFHRSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgPGk+Y2xpZW50IHNpemUgY2xhc3M8L2k+IG1ldGEgZGF0YSBmaWVsZCBmb3IgYSBnaXZlbiBwYWdlCi0gICAqIChhbGwgYmxvY2tzIG9uIGEgZ2l2ZW4gcGFnZSBhcmUgaG9tb2dlbmVvdXMgd2l0aCByZXNwZWN0IHRvIGJsb2NrCi0gICAqIHNpemUgY2xhc3MpLgotICAgKgotICAgKiBAcGFyYW0gYWRkcmVzcyBUaGUgYWRkcmVzcyBvZiBpbnRlcmVzdAotICAgKiBAcmV0dXJuIFRoZSBzaXplIGNsYXNzIGZpZWxkIGZvciB0aGUgYmxvY2sgY29udGFpbmluZyB0aGUgZ2l2ZW4gYWRkcmVzcwotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIGJ5dGUgZ2V0Q2xpZW50U2l6ZUNsYXNzKEFkZHJlc3MgYWRkcmVzcykgewotICAgIGFkZHJlc3MgPSBDb252ZXJzaW9ucy5wYWdlQWxpZ24oYWRkcmVzcyk7Ci0gICAgYnl0ZSBydG4gPSBnZXRNZXRhQWRkcmVzcyhhZGRyZXNzKS5sb2FkQnl0ZShDU0NfT0ZGU0VUKTsKLSAgICByZXR1cm4gcnRuOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgZnJlZSBsaXN0IG1ldGEgZGF0YSBmaWVsZCBmb3IgYSBnaXZlbiBhZGRyZXNzICh0aGlzIGlzCi0gICAqIHBlci1ibG9jayBtZXRhIGRhdGEgdGhhdCBpcyBzdG9yZWQgYWxvbmcgd2l0aCB0aGUgYmxvY2sgbWV0YWRhdGEKLSAgICogYnV0IG5vdCB1c2VkIGJ5IHRoZSBibG9jayBhbGxvY2F0b3IpLgotICAgKgotICAgKiBAcGFyYW0gYWRkcmVzcyBUaGUgYWRkcmVzcyBvZiBpbnRlcmVzdAotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHdoaWNoIHRoaXMgZmllbGQgaXMgdG8gYmUgc2V0Ci0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGcmVlTGlzdE1ldGEoQWRkcmVzcyBhZGRyZXNzLCBBZGRyZXNzIHZhbHVlKSB7Ci0gICAgZ2V0TWV0YUFkZHJlc3MoYWRkcmVzcykucGx1cyhGTF9NRVRBX09GRlNFVCkuc3RvcmUodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgZnJlZSBsaXN0IG1ldGEgZGF0YSBmaWVsZCBmb3IgYSBnaXZlbiBhZGRyZXNzICh0aGlzIGlzCi0gICAqIHBlci1ibG9jayBtZXRhIGRhdGEgdGhhdCBpcyBzdG9yZWQgYWxvbmcgd2l0aCB0aGUgYmxvY2sgbWV0YWRhdGEKLSAgICogYnV0IG5vdCB1c2VkIGJ5IHRoZSBibG9jayBhbGxvY2F0b3IpLgotICAgKgotICAgKiBAcGFyYW0gYWRkcmVzcyBUaGUgYWRkcmVzcyBvZiBpbnRlcmVzdAotICAgKiBAcmV0dXJuIFRoZSBmcmVlIGxpc3QgbWV0YSBkYXRhIGZpZWxkIGZvciB0aGUgYmxvY2sgY29udGFpbmluZwotICAgKiB0aGUgZ2l2ZW4gYWRkcmVzcwotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIEFkZHJlc3MgZ2V0RnJlZUxpc3RNZXRhKEFkZHJlc3MgYWRkcmVzcykgewotICAgIHJldHVybiBnZXRNZXRhQWRkcmVzcyhhZGRyZXNzKS5wbHVzKEZMX01FVEFfT0ZGU0VUKS5sb2FkQWRkcmVzcygpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgPGk+cHJldjwvaT4gbWV0YSBkYXRhIGZpZWxkIGZvciBhIGdpdmVuIGFkZHJlc3MKLSAgICoKLSAgICogQHBhcmFtIGFkZHJlc3MgVGhlIGFkZHJlc3Mgb2YgaW50ZXJlc3QKLSAgICogQHBhcmFtIHByZXYgVGhlIHZhbHVlIHRvIHdoaWNoIHRoaXMgZmllbGQgaXMgdG8gYmUgc2V0Ci0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXROZXh0KEFkZHJlc3MgYWRkcmVzcywgQWRkcmVzcyBwcmV2KSB7Ci0gICAgZ2V0TWV0YUFkZHJlc3MoYWRkcmVzcywgTkVYVF9PRkZTRVQpLnN0b3JlKHByZXYpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgPGk+cHJldjwvaT4gbWV0YSBkYXRhIGZpZWxkIGZvciBhIGdpdmVuIGFkZHJlc3MKLSAgICoKLSAgICogQHBhcmFtIGFkZHJlc3MgVGhlIGFkZHJlc3Mgb2YgaW50ZXJlc3QKLSAgICogQHJldHVybiBUaGUgcHJldiBmaWVsZCBmb3IgdGhlIGJsb2NrIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGFkZHJlc3MKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyBBZGRyZXNzIGdldE5leHQoQWRkcmVzcyBhZGRyZXNzKSB7Ci0gICAgcmV0dXJuIGdldE1ldGFBZGRyZXNzKGFkZHJlc3MsIE5FWFRfT0ZGU0VUKS5sb2FkQWRkcmVzcygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgYWRkcmVzcyBvZiBzb21lIG1ldGFkYXRhIGdpdmVuIHRoZSBhZGRyZXNzIGZvciB3aGljaCB0aGUKLSAgICogbWV0YWRhdGEgaXMgcmVxdWlyZWQgYW5kIHRoZSBvZmZzZXQgaW50byB0aGUgbWV0YWRhdGEgdGhhdCBpcyBvZgotICAgKiBpbnRlcmVzdC4KLSAgICoKLSAgICogQHBhcmFtIGFkZHJlc3MgVGhlIGFkZHJlc3MgZm9yIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyByZXF1aXJlZAotICAgKiBAcmV0dXJuIFRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpZWQgbWV0YSBkYXRhCi0gICAqLwotICBASW5saW5lCi0gIHByaXZhdGUgc3RhdGljIEFkZHJlc3MgZ2V0TWV0YUFkZHJlc3MoQWRkcmVzcyBhZGRyZXNzKSB7Ci0gICAgcmV0dXJuIGdldE1ldGFBZGRyZXNzKGFkZHJlc3MsIE9mZnNldC56ZXJvKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgYWRkcmVzcyBvZiBzb21lIG1ldGFkYXRhIGdpdmVuIHRoZSBhZGRyZXNzIGZvciB3aGljaCB0aGUKLSAgICogbWV0YWRhdGEgaXMgcmVxdWlyZWQgYW5kIHRoZSBvZmZzZXQgaW50byB0aGUgbWV0YWRhdGEgdGhhdCBpcyBvZgotICAgKiBpbnRlcmVzdC4KLSAgICoKLSAgICogQHBhcmFtIGFkZHJlc3MgVGhlIGFkZHJlc3MgZm9yIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyByZXF1aXJlZAotICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgKGluIGJ5dGVzKSBpbnRvIHRoZSBtZXRhZGF0YSBibG9jayAoZWcKLSAgICogZm9yIHRoZSBwcmV2IHBvaW50ZXIsIG9yIG5leHQgcG9pbnRlcikKLSAgICogQHJldHVybiBUaGUgYWRkcmVzcyBvZiB0aGUgc3BlY2lmaWVkIG1ldGEgZGF0YQotICAgKi8KLSAgQElubGluZQotICBwcml2YXRlIHN0YXRpYyBBZGRyZXNzIGdldE1ldGFBZGRyZXNzKEFkZHJlc3MgYWRkcmVzcywgT2Zmc2V0IG9mZnNldCkgewotICAgIHJldHVybiBFbWJlZGRlZE1ldGFEYXRhLmdldE1ldGFEYXRhQmFzZShhZGRyZXNzKS5wbHVzKAotICAgICAgICAgICBFbWJlZGRlZE1ldGFEYXRhLmdldE1ldGFEYXRhT2Zmc2V0KGFkZHJlc3MsIExPR19CWVRFX0NPVkVSQUdFLCBMT0dfQllURVNfSU5fQkxPQ0tfTUVUQSkpLnBsdXMob2Zmc2V0KTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEJsb2NrIG1hcmtpbmcKLSAgICovCi0KLSAgLyoqCi0gICAqIE1hcmsgdGhlIG1ldGFkYXRhIGZvciB0aGlzIGJsb2NrLgotICAgKgotICAgKiBAcGFyYW0gcmVmCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYXJrQmxvY2tNZXRhKE9iamVjdFJlZmVyZW5jZSByZWYpIHsKLSAgICBnZXRNZXRhQWRkcmVzcyhWTS5vYmplY3RNb2RlbC5yZWZUb0FkZHJlc3MocmVmKSkucGx1cyhGTF9NRVRBX09GRlNFVCkuc3RvcmUoV29yZC5vbmUoKSk7Ci0gIH0KLQotICAvKioKLSAgICogTWFyayB0aGUgbWV0YWRhdGEgZm9yIHRoaXMgYmxvY2suCi0gICAqCi0gICAqIEBwYXJhbSBibG9jayBUaGUgYmxvY2sgYWRkcmVzcwotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFya0Jsb2NrTWV0YShBZGRyZXNzIGJsb2NrKSB7Ci0gICAgZ2V0TWV0YUFkZHJlc3MoYmxvY2spLnBsdXMoRkxfTUVUQV9PRkZTRVQpLnN0b3JlKFdvcmQub25lKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0cnVlIGlmIHRoZSBtZXRhZGF0YSBmb3IgdGhpcyBibG9jayB3YXMgc2V0LgotICAgKgotICAgKiBAcGFyYW0gYmxvY2sgVGhlIGJsb2NrIGFkZHJlc3MKLSAgICogQHJldHVybiB2YWx1ZSBvZiB0aGUgbWV0YSBkYXRhLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tCbG9ja01ldGEoQWRkcmVzcyBibG9jaykgewotICAgIHJldHVybiBnZXRNZXRhQWRkcmVzcyhibG9jaykucGx1cyhGTF9NRVRBX09GRlNFVCkubG9hZFdvcmQoKS5FUShXb3JkLm9uZSgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBDbGVhciB0aGUgbWV0YWRhdGEgZm9yIHRoaXMgYmxvY2sKLSAgICoKLSAgICogQHBhcmFtIGJsb2NrIFRoZSBibG9jayBhZGRyZXNzCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhckJsb2NrTWV0YShBZGRyZXNzIGJsb2NrKSB7Ci0gICAgZ2V0TWV0YUFkZHJlc3MoYmxvY2spLnBsdXMoRkxfTUVUQV9PRkZTRVQpLnN0b3JlKFdvcmQuemVybygpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2FsbG9jL0J1bXBQb2ludGVyLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvYWxsb2MvQnVtcFBvaW50ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJjMTIxMC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvYWxsb2MvQnVtcFBvaW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxOCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5hbGxvYzsKLQotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkNvbnN0YW50czsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkNvbnZlcnNpb25zOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuTG9nOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZ2NzcHkuZHJpdmVycy5MaW5lYXJTcGFjZURyaXZlcjsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuSW5saW5lOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS5Ob0lubGluZTsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuVW5pbnRlcnJ1cHRpYmxlOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuQWRkcmVzczsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLkV4dGVudDsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLk9iamVjdFJlZmVyZW5jZTsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLk9mZnNldDsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLldvcmQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgYnVtcCBwb2ludGVyIGFsbG9jYXRvciB0aGF0IGFsbG93cyBsaW5lYXJseQotICogc2Nhbm5pbmcgdGhyb3VnaCB0aGUgYWxsb2NhdGVkIG9iamVjdHMuIEluIG9yZGVyIHRvIGFjaGlldmUgdGhpcyBpbiB0aGUKLSAqIGZhY2Ugb2YgcGFyYWxsZWxpc20gaXQgbWFpbnRhaW5zIGEgaGVhZGVyIGF0IGEgcmVnaW9uICgxIG9yIG1vcmUgYmxvY2tzKQotICogZ3JhbnVsYXJpdHkuCi0gKgotICogSW50cmEtYmxvY2sgYWxsb2NhdGlvbiBpcyBmYXN0LCByZXF1aXJpbmcgb25seSBhIGxvYWQsIGFkZGl0aW9uIGNvbXBhcmlzb24KLSAqIGFuZCBzdG9yZS4gIElmIGEgYmxvY2sgYm91bmRhcnkgaXMgZW5jb3VudGVyZWQgdGhlIGFsbG9jYXRvciB3aWxsCi0gKiByZXF1ZXN0IG1vcmUgbWVtb3J5ICh2aXJ0dWFsIGFuZCBhY3R1YWwpLgotICoKLSAqIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHRoZSBzY2FubmVkIG9iamVjdHMgbWFpbnRhaW4gYWZmaW5pdHkKLSAqIHdpdGggdGhlIHRocmVhZCB0aGF0IGFsbG9jYXRlZCB0aGUgb2JqZWN0cyBpbiB0aGUgcmVnaW9uLiBJbiB0aGUgZnV0dXJlCi0gKiBpdCBpcyBhbnRpY2lwYXRlZCB0aGF0IHN1YmNsYXNzZXMgc2hvdWxkIGJlIGFsbG93ZWQgdG8gY2hvb3NlIHRvIGltcHJvdmUKLSAqIGxvYWQgYmFsYW5jaW5nIGR1cmluZyB0aGUgcGFyYWxsZWwgc2Nhbi4KLSAqCi0gKiBFYWNoIHJlZ2lvbiBpcyBsYWlkIG91dCBhcyBmb2xsb3dzOgotICoKLSAqICArLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tCi0gKiAgfCBSZWdpb24gIEVuZCB8IE5leHQgUmVnaW9uIHwgIERhdGEgIEVuZCAgfCBEYXRhIC0tPgotICogKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLQotICoKLSAqIFRoZSBtaW5pbXVtIHJlZ2lvbiBzaXplIGlzIDMyNzY4IGJ5dGVzLCBzbyB0aGUgMyBvciA0IHdvcmQgb3ZlcmhlYWQgaXMKLSAqIGxlc3MgdGhhbiAwLjA1JSBvZiBhbGwgc3BhY2UuCi0gKgotICogQW4gaW50ZW5kZWQgZW5oYW5jZW1lbnQgaXMgdG8gZmFjaWxpdGF0ZSBhIHJlYWxsb2NhdGlvbiBvcGVyYXRpb24KLSAqIHdoZXJlIGEgc2Vjb25kIGN1cnNvciBpcyBtYWludGFpbmVkIG92ZXIgZWFybGllciByZWdpb25zIChhbmQgYXQgdGhlCi0gKiBsaW1pdCBhIGxvd2VyIGxvY2F0aW9uIGluIHRoZSBzYW1lIHJlZ2lvbikuIFRoaXMgd291bGQgYmUgYWNjb21waWFuaWVkCi0gKiB3aXRoIGFuIGFsdGVybmF0aXZlIHNsb3cgcGF0aCB0aGF0IHdvdWxkIGFsbG93IHJldXNlIG9mIGVtcHR5IHJlZ2lvbnMuCi0gKgotICogVGhpcyBjbGFzcyByZWxpZXMgb24gdGhlIHN1cHBvcnRpbmcgdmlydHVhbCBtYWNoaW5lIGltcGxlbWVudGluZyB0aGUKLSAqIGdldE5leHRPYmplY3QgYW5kIHJlbGF0ZWQgb3BlcmF0aW9ucy4KLSAqLwotQFVuaW50ZXJydXB0aWJsZSBwdWJsaWMgY2xhc3MgQnVtcFBvaW50ZXIgZXh0ZW5kcyBBbGxvY2F0b3IKLSAgaW1wbGVtZW50cyBDb25zdGFudHMgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENsYXNzIHZhcmlhYmxlcwotICAgKi8KLQotICAvLyBCbG9jayBzaXplIGRlZmluZXMgc2xvdyBwYXRoIHBlcmlvZGljaXR5LgotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0RFRkFVTFRfU1RFUF9TSVpFID0gMzA7IC8vIDFHOiBsZXQgdGhlIGV4dGVybmFsIHNsb3cgcGF0aCBkb21pbmF0ZQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RFUF9TSVpFID0gMTw8KFNVUFBPUlRfQ0FSRF9TQ0FOTklORyA/IExPR19DQVJEX0JZVEVTIDogTE9HX0RFRkFVTFRfU1RFUF9TSVpFKTsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0JMT0NLX1NJWkUgPSBMT0dfQllURVNfSU5fUEFHRSArIDM7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgV29yZCBCTE9DS19NQVNLID0gV29yZC5vbmUoKS5sc2goTE9HX0JMT0NLX1NJWkUpLm1pbnVzKFdvcmQub25lKCkpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkxPQ0tfU0laRSA9ICgxPDxMT0dfQkxPQ0tfU0laRSk7Ci0KLQotICAvLyBPZmZzZXRzIGludG8gaGVhZGVyCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2Zmc2V0IFJFR0lPTl9MSU1JVF9PRkZTRVQgPSBPZmZzZXQuemVybygpOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9mZnNldCBORVhUX1JFR0lPTl9PRkZTRVQgPSBSRUdJT05fTElNSVRfT0ZGU0VULnBsdXMoQllURVNfSU5fQUREUkVTUyk7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2Zmc2V0IERBVEFfRU5EX09GRlNFVCA9IE5FWFRfUkVHSU9OX09GRlNFVC5wbHVzKEJZVEVTX0lOX0FERFJFU1MpOwotCi0gIC8vIERhdGEgbXVzdCBzdGFydCBwYXJ0aWNsZS1hbGlnbmVkLgotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9mZnNldCBEQVRBX1NUQVJUX09GRlNFVCA9IGFsaWduQWxsb2NhdGlvbk5vRmlsbCgKLSAgICAgIEFkZHJlc3MuemVybygpLnBsdXMoREFUQV9FTkRfT0ZGU0VULnBsdXMoQllURVNfSU5fQUREUkVTUykpLAotICAgICAgTUlOX0FMSUdOTUVOVCwgMCkudG9Xb3JkKCkudG9PZmZzZXQoKTsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPZmZzZXQgTUFYX0RBVEFfU1RBUlRfT0ZGU0VUID0gYWxpZ25BbGxvY2F0aW9uTm9GaWxsKAotICAgICAgQWRkcmVzcy56ZXJvKCkucGx1cyhEQVRBX0VORF9PRkZTRVQucGx1cyhCWVRFU19JTl9BRERSRVNTKSksCi0gICAgICBNQVhfQUxJR05NRU5ULCAwKS50b1dvcmQoKS50b09mZnNldCgpOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTklNVU1fREFUQV9TSVpFID0gKDEgPDwgTE9HX0JMT0NLX1NJWkUpIC0gTUFYX0RBVEFfU1RBUlRfT0ZGU0VULnRvSW50KCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBWRVJCT1NFID0gZmFsc2U7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5zdGFuY2UgdmFyaWFibGVzCi0gICAqLwotICBwcm90ZWN0ZWQgQWRkcmVzcyBjdXJzb3I7IC8vIGluc2VydGlvbiBwb2ludAotICBwcml2YXRlIEFkZHJlc3MgaW50ZXJuYWxMaW1pdDsgLy8gY3VycmVudCBpbnRlcm5hbCBzbG93LXBhdGggc2VudGluYWwgZm9yIGJ1bXAgcG9pbnRlcgotICBwcml2YXRlIEFkZHJlc3MgbGltaXQ7IC8vIGN1cnJlbnQgZXh0ZXJuYWwgc2xvdy1wYXRoIHNlbnRpbmFsIGZvciBidW1wIHBvaW50ZXIKLSAgcHJvdGVjdGVkIFNwYWNlIHNwYWNlOyAvLyBzcGFjZSB0aGlzIGJ1bXAgcG9pbnRlciBpcyBhc3NvY2lhdGVkIHdpdGgKLSAgcHJvdGVjdGVkIEFkZHJlc3MgaW5pdGlhbFJlZ2lvbjsgLy8gZmlyc3QgY29udGlndW91cyByZWdpb24KLSAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gYWxsb3dTY2FubmluZzsgLy8gbGluZWFyIHNjYW5uaW5nIGlzIHBlcm1pdHRlZCBpZiB0cnVlCi0gIHByb3RlY3RlZCBBZGRyZXNzIHJlZ2lvbjsgLy8gY3VycmVudCBjb250aWd1b3VzIHJlZ2lvbgotCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gc3BhY2UgVGhlIHNwYWNlIHRvIGJ1bXAgcG9pbnQgaW50by4KLSAgICogQHBhcmFtIGFsbG93U2Nhbm5pbmcgQWxsb3cgbGluZWFyIHNjYW5uaW5nIG9mIHRoaXMgcmVnaW9uIG9mIG1lbW9yeS4KLSAgICovCi0gIHByb3RlY3RlZCBCdW1wUG9pbnRlcihTcGFjZSBzcGFjZSwgYm9vbGVhbiBhbGxvd1NjYW5uaW5nKSB7Ci0gICAgdGhpcy5zcGFjZSA9IHNwYWNlOwotICAgIHRoaXMuYWxsb3dTY2FubmluZyA9IGFsbG93U2Nhbm5pbmc7Ci0gICAgcmVzZXQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXNldCB0aGUgYWxsb2NhdG9yLiBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCByZXNldCB0aGUgc3BhY2UuCi0gICAqIFRoaXMgaXMgbXVzdCBiZSBkb25lIGJ5IHRoZSBjYWxsZXIuCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCByZXNldCgpIHsKLSAgICBjdXJzb3IgPSBBZGRyZXNzLnplcm8oKTsKLSAgICBsaW1pdCA9IEFkZHJlc3MuemVybygpOwotICAgIGludGVybmFsTGltaXQgPSBBZGRyZXNzLnplcm8oKTsKLSAgICBpbml0aWFsUmVnaW9uID0gQWRkcmVzcy56ZXJvKCk7Ci0gICAgcmVnaW9uID0gQWRkcmVzcy56ZXJvKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmUtYXNzb2NpYXRlIHRoaXMgYnVtcCBwb2ludGVyIHdpdGggYSBkaWZmZXJlbnQgc3BhY2UuIEFsc28KLSAgICogcmVzZXQgdGhlIGJ1bXAgcG9pbnRlciBzbyB0aGF0IGl0IHdpbGwgdXNlIHRoZSBuZXcgc3BhY2UKLSAgICogb24gdGhlIG5leHQgY2FsbCB0byA8Y29kZT5hbGxvYzwvY29kZT4uCi0gICAqCi0gICAqIEBwYXJhbSBzcGFjZSBUaGUgc3BhY2UgdG8gYXNzb2NpYXRlIHRoZSBidW1wIHBvaW50ZXIgd2l0aC4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHJlYmluZChTcGFjZSBzcGFjZSkgewotICAgIHJlc2V0KCk7Ci0gICAgdGhpcy5zcGFjZSA9IHNwYWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEFsbG9jYXRlIHNwYWNlIGZvciBhIG5ldyBvYmplY3QuICBUaGlzIGlzIGZyZXF1ZW50bHkgZXhlY3V0ZWQgY29kZSBhbmQKLSAgICogdGhlIGNvZGluZyBpcyBkZWxpYmVyYWV0bHkgc2Vuc2l0aXZlIHRvIHRoZSBvcHRpbWl6aW5nIGNvbXBpbGVyLgotICAgKiBBZnRlciBjaGFuZ2luZyB0aGlzLCBhbHdheXMgY2hlY2sgdGhlIElSL01DIHRoYXQgaXMgZ2VuZXJhdGVkLgotICAgKgotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQKLSAgICogQHBhcmFtIGFsaWduIFRoZSByZXF1ZXN0ZWQgYWxpZ25tZW50Ci0gICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBmcm9tIHRoZSBhbGlnbm1lbnQKLSAgICogQHJldHVybiBUaGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgYWxsb2NhdGVkIHJlZ2lvbgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgQWRkcmVzcyBhbGxvYyhpbnQgYnl0ZXMsIGludCBhbGlnbiwgaW50IG9mZnNldCkgewotICAgIEFkZHJlc3Mgc3RhcnQgPSBhbGlnbkFsbG9jYXRpb25Ob0ZpbGwoY3Vyc29yLCBhbGlnbiwgb2Zmc2V0KTsKLSAgICBBZGRyZXNzIGVuZCA9IHN0YXJ0LnBsdXMoYnl0ZXMpOwotICAgIGlmIChlbmQuR1QoaW50ZXJuYWxMaW1pdCkpCi0gICAgICByZXR1cm4gYWxsb2NTbG93KHN0YXJ0LCBlbmQsIGFsaWduLCBvZmZzZXQpOwotICAgIGZpbGxBbGlnbm1lbnRHYXAoY3Vyc29yLCBzdGFydCk7Ci0gICAgY3Vyc29yID0gZW5kOwotICAgIHJldHVybiBzdGFydDsKLSAgfQotCi0gLyoqCi0gICogSW50ZXJuYWwgYWxsb2NhdGlvbiBzbG93IHBhdGguICBUaGlzIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgYnVtcAotICAqIHBvaW50ZXIgcmVhY2hlcyB0aGUgaW50ZXJuYWwgbGltaXQuICBUaGUgY29kZSBpcyBmb3JjZWQgb3V0IG9mCi0gICogbGluZS4gIElmIHJlcXVpcmVkIHdlIHBlcmZvcm0gYW4gZXh0ZXJuYWwgc2xvdyBwYXRoIHRha2UsIHdoaWNoCi0gICogd2UgaW5saW5lIGludG8gdGhpcyBtZXRob2Qgc2luY2UgdGhpcyBpcyBhbHJlYWR5IG91dCBvZiBsaW5lLgotICAqCi0gICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydCBhZGRyZXNzIGZvciB0aGUgcGVuZGluZyBhbGxvY2F0aW9uCi0gKiBAcGFyYW0gZW5kIFRoZSBlbmQgYWRkcmVzcyBmb3IgdGhlIHBlbmRpbmcgYWxsb2NhdGlvbgotICogQHBhcmFtIGFsaWduIFRoZSByZXF1ZXN0ZWQgYWxpZ25tZW50Ci0gKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgZnJvbSB0aGUgYWxpZ25tZW50Ci0gICogQHJldHVybiBUaGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgYWxsb2NhdGVkIHJlZ2lvbgotICAqLwotICBATm9JbmxpbmUKLSAgcHJpdmF0ZSBBZGRyZXNzIGFsbG9jU2xvdyhBZGRyZXNzIHN0YXJ0LCBBZGRyZXNzIGVuZCwgaW50IGFsaWduLAotICAgICAgaW50IG9mZnNldCkgewotICAgIEFkZHJlc3MgcnRuID0gbnVsbDsKLSAgICBBZGRyZXNzIGNhcmQgPSBudWxsOwotICAgIGlmIChTVVBQT1JUX0NBUkRfU0NBTk5JTkcpCi0gICAgICBjYXJkID0gZ2V0Q2FyZChzdGFydC5wbHVzKENBUkRfTUFTSykpOyAvLyByb3VuZCB1cAotICAgIGlmIChlbmQuR1QobGltaXQpKSB7IC8qIGV4dGVybmFsIHNsb3cgcGF0aCAqLwotICAgICAgcnRuID0gYWxsb2NTbG93SW5saW5lKGVuZC5kaWZmKHN0YXJ0KS50b0ludCgpLCBhbGlnbiwgb2Zmc2V0KTsKLSAgICAgIGlmIChTVVBQT1JUX0NBUkRfU0NBTk5JTkcgJiYgY2FyZC5ORShnZXRDYXJkKHJ0bi5wbHVzKENBUkRfTUFTSykpKSkKLSAgICAgICAgY2FyZCA9IGdldENhcmQocnRuKTsgLy8gcm91bmQgZG93bgotICAgIH0gZWxzZSB7ICAgICAgICAgICAgIC8qIGludGVybmFsIHNsb3cgcGF0aCAqLwotICAgICAgd2hpbGUgKGludGVybmFsTGltaXQuTEUoZW5kKSkKLSAgICAgICAgaW50ZXJuYWxMaW1pdCA9IGludGVybmFsTGltaXQucGx1cyhTVEVQX1NJWkUpOwotICAgICAgaWYgKGludGVybmFsTGltaXQuR1QobGltaXQpKQotICAgICAgICBpbnRlcm5hbExpbWl0ID0gbGltaXQ7Ci0gICAgICBmaWxsQWxpZ25tZW50R2FwKGN1cnNvciwgc3RhcnQpOwotICAgICAgY3Vyc29yID0gZW5kOwotICAgICAgcnRuID0gc3RhcnQ7Ci0gICAgfQotICAgIGlmIChTVVBQT1JUX0NBUkRfU0NBTk5JTkcgJiYgIXJ0bi5pc1plcm8oKSkKLSAgICAgIGNyZWF0ZUNhcmRBbmNob3IoY2FyZCwgcnRuLCBlbmQuZGlmZihzdGFydCkudG9JbnQoKSk7Ci0gICAgcmV0dXJuIHJ0bjsKLSAgfQotCi0gIC8qKgotICAgKiBHaXZlbiBhbiBhbGxvY2F0aW9uIHdoaWNoIHN0YXJ0cyBhIG5ldyBjYXJkLCBjcmVhdGUgYSByZWNvcmQgb2YKLSAgICogd2hlcmUgdGhlIHN0YXJ0IG9mIHRoZSBvYmplY3QgaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZQotICAgKiBjYXJkLgotICAgKgotICAgKiBAcGFyYW0gY2FyZCBBbiBhZGRyZXNzIHRoYXQgbGllcyB3aXRoaW4gdGhlIGNhcmQgdG8gYmUgbWFya2VkCi0gICAqIEBwYXJhbSBzdGFydCBUaGUgYWRkcmVzcyBvZiBhbiBvYmplY3Qgd2hpY2ggY3JlYXRlcyBhIG5ldyBjYXJkLgotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIHNpemUgb2YgdGhlIHBlbmRpbmcgYWxsb2NhdGlvbiBpbiBieXRlcyAodXNlZCBmb3IgZGVidWdnaW5nKQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNhcmRBbmNob3IoQWRkcmVzcyBjYXJkLCBBZGRyZXNzIHN0YXJ0LCBpbnQgYnl0ZXMpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIHsKLSAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChhbGxvd1NjYW5uaW5nKTsKLSAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChjYXJkLkVRKGdldENhcmQoY2FyZCkpKTsKLSAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChzdGFydC5kaWZmKGNhcmQpLnNMRShNQVhfREFUQV9TVEFSVF9PRkZTRVQpKTsKLSAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChzdGFydC5kaWZmKGNhcmQpLnRvSW50KCkgPj0gLUNBUkRfTUFTSyk7Ci0gICAgfQotICAgIHdoaWxlIChieXRlcyA+IDApIHsKLSAgICAgIGludCBvZmZzZXQgPSBzdGFydC5kaWZmKGNhcmQpLnRvSW50KCk7Ci0gICAgICBnZXRDYXJkTWV0YURhdGEoY2FyZCkuc3RvcmUob2Zmc2V0KTsKLSAgICAgIGNhcmQgPSBjYXJkLnBsdXMoMSA8PCBMT0dfQ0FSRF9CWVRFUyk7Ci0gICAgICBieXRlcyAtPSAoMSA8PCBMT0dfQ0FSRF9CWVRFUyk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgc3RhcnQgb2YgdGhlIGNhcmQgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIGFkZHJlc3MuCi0gICAqCi0gICAqIEBwYXJhbSBhZGRyZXNzIFRoZSBhZGRyZXNzIGZvciB3aGljaCB0aGUgY2FyZCBzdGFydCBpcyByZXF1aXJlZAotICAgKiBAcmV0dXJuIFRoZSBzdGFydCBvZiB0aGUgY2FyZCBjb250YWluaW5nIHRoZSBhZGRyZXNzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBBZGRyZXNzIGdldENhcmQoQWRkcmVzcyBhZGRyZXNzKSB7Ci0gICAgcmV0dXJuIGFkZHJlc3MudG9Xb3JkKCkuYW5kKFdvcmQuZnJvbUludFNpZ25FeHRlbmQoQ0FSRF9NQVNLKS5ub3QoKSkudG9BZGRyZXNzKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBtZXRhZGF0YSBmb3IgYSBjYXJkLCBnaXZlbiB0aGUgYWRkcmVzcyBvZiB0aGUgY2FyZC4KLSAgICogQHBhcmFtIGNhcmQgVGhlIGFkZHJlc3Mgb2Ygc29tZSBjYXJkCi0gICAqIEByZXR1cm4gVGhlIGFkZHJlc3Mgb2YgdGhlIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGNhcmQKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIEFkZHJlc3MgZ2V0Q2FyZE1ldGFEYXRhKEFkZHJlc3MgY2FyZCkgewotICAgIEFkZHJlc3MgbWV0YWRhdGEgPSBFbWJlZGRlZE1ldGFEYXRhLmdldE1ldGFEYXRhQmFzZShjYXJkKTsKLSAgICByZXR1cm4gbWV0YWRhdGEucGx1cyhFbWJlZGRlZE1ldGFEYXRhLmdldE1ldGFEYXRhT2Zmc2V0KGNhcmQsIExPR19DQVJEX0JZVEVTLUxPR19DQVJEX01FVEFfU0laRSwgTE9HX0NBUkRfTUVUQV9TSVpFKSk7Ci0gIH0KLQotICAvKioKLSAgICogRXh0ZXJuYWwgYWxsb2NhdGlvbiBzbG93IHBhdGggKGNhbGxlZCBieSBzdXBlcmNsYXNzIHdoZW4gc2xvdyBwYXRoIGlzCi0gICAqIGFjdHVhbGx5IHRha2VuLiAgVGhpcyBpcyBuZWNlc3NhcnkgKHJhdGhlciB0aGFuIGEgZGlyZWN0IGNhbGwKLSAgICogZnJvbSB0aGUgZmFzdCBwYXRoKSBiZWNhdXNlIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBhIHRocmVhZCBzd2l0Y2gKLSAgICogYW5kIGNvcnJlc3BvbmRpbmcgcmUtYXNzb2NpYXRpb24gb2YgYnVtcCBwb2ludGVycyB0byBrZXJuZWwKLSAgICogdGhyZWFkcy4KLSAgICoKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkCi0gICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBmcm9tIHRoZSBhbGlnbm1lbnQKLSAgICogQHBhcmFtIGFsaWduIFRoZSByZXF1ZXN0ZWQgYWxpZ25tZW50Ci0gICAqIEByZXR1cm4gVGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGFsbG9jYXRlZCByZWdpb24gb3IKLSAgICogemVybyBvbiBmYWlsdXJlCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIGZpbmFsIEFkZHJlc3MgYWxsb2NTbG93T25jZShpbnQgYnl0ZXMsIGludCBhbGlnbiwgaW50IG9mZnNldCkgewotICAgIC8qIENoZWNrIHdlIGhhdmUgYmVlbiBib3VuZCB0byBhIHNwYWNlICovCi0gICAgaWYgKHNwYWNlID09IG51bGwpIHsKLSAgICAgIFZNLmFzc2VydGlvbnMuZmFpbCgiQWxsb2NhdGlvbiBvbiB1bmJvdW5kIGJ1bXAgcG9pbnRlci4iKTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBibG9jayB0byB1c2UgKi8KLSAgICBpZiAoYWxsb3dTY2FubmluZyAmJiAhcmVnaW9uLmlzWmVybygpKSB7Ci0gICAgICBBZGRyZXNzIG5leHRSZWdpb24gPSBnZXROZXh0UmVnaW9uKHJlZ2lvbik7Ci0gICAgICBpZiAoIW5leHRSZWdpb24uaXNaZXJvKCkpIHsKLSAgICAgICAgcmV0dXJuIGNvbnN1bWVOZXh0UmVnaW9uKG5leHRSZWdpb24sIGJ5dGVzLCBhbGlnbiwgb2Zmc2V0KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBBY3F1aXJlIHNwYWNlLCBibG9jayBhbGlnbmVkLCB0aGF0IGNhbiBhY2NvbW1vZGF0ZSB0aGUgcmVxdWVzdCAqLwotICAgIEV4dGVudCBibG9ja1NpemUgPSBXb3JkLmZyb21JbnRaZXJvRXh0ZW5kKGJ5dGVzKS5wbHVzKEJMT0NLX01BU0spCi0gICAgICAgICAgICAgICAgICAgICAgIC5hbmQoQkxPQ0tfTUFTSy5ub3QoKSkudG9FeHRlbnQoKTsKLSAgICBBZGRyZXNzIHN0YXJ0ID0gc3BhY2UuYWNxdWlyZShDb252ZXJzaW9ucy5ieXRlc1RvUGFnZXMoYmxvY2tTaXplKSk7Ci0KLSAgICBpZiAoc3RhcnQuaXNaZXJvKCkpIHJldHVybiBzdGFydDsgLy8gZmFpbGVkIGFsbG9jYXRpb24KLQotICAgIGlmICghYWxsb3dTY2FubmluZykgeyAvLyBzaW1wbGUgYWxsb2NhdG9yCi0gICAgICBpZiAoc3RhcnQuTkUobGltaXQpKSBjdXJzb3IgPSBzdGFydDsgIC8vIGRpc2NvbnRpZ3VvdXMKLSAgICAgIHVwZGF0ZUxpbWl0KHN0YXJ0LnBsdXMoYmxvY2tTaXplKSwgc3RhcnQsIGJ5dGVzKTsKLSAgICB9IGVsc2UgICAgICAgICAgICAgICAgLy8gc2Nhbm5hYmxlIGFsbG9jYXRvcgotICAgICAgdXBkYXRlTWV0YURhdGEoc3RhcnQsIGJsb2NrU2l6ZSwgYnl0ZXMpOwotICAgIHJldHVybiBhbGxvYyhieXRlcywgYWxpZ24sIG9mZnNldCk7Ci0gIH0KLQotICAvKioKLSAgICogVXBkYXRlIHRoZSBsaW1pdCBwb2ludGVyLiAgQXMgYSBzaWRlIGVmZmVjdCB1cGRhdGUgdGhlIGludGVybmFsIGxpbWl0Ci0gICAqIHBvaW50ZXIgYXBwcm9wcmlhdGVseS4KLSAgICoKLSAgICogQHBhcmFtIG5ld0xpbWl0IFRoZSBuZXcgdmFsdWUgZm9yIHRoZSBsaW1pdCBwb2ludGVyCi0gICAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJlZ2lvbiB0byBiZSBhbGxvY2F0ZWQgaW50bwotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIHNpemUgb2YgdGhlIHBlbmRpbmcgYWxsb2NhdGlvbiAoaWYgYW55KS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgdXBkYXRlTGltaXQoQWRkcmVzcyBuZXdMaW1pdCwgQWRkcmVzcyBzdGFydCwgaW50IGJ5dGVzKSB7Ci0gICAgbGltaXQgPSBuZXdMaW1pdDsKLSAgICBpbnRlcm5hbExpbWl0ID0gc3RhcnQucGx1cyhTVEVQX1NJWkUpOwotICAgIGlmIChpbnRlcm5hbExpbWl0LkdUKGxpbWl0KSkKLSAgICAgIGludGVybmFsTGltaXQgPSBsaW1pdDsKLSAgICBlbHNlIHsKLSAgICAgIHdoaWxlIChpbnRlcm5hbExpbWl0LkxUKGN1cnNvci5wbHVzKGJ5dGVzKSkpCi0gICAgICAgIGludGVybmFsTGltaXQgPSBpbnRlcm5hbExpbWl0LnBsdXMoU1RFUF9TSVpFKTsKLSAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykKLSAgICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGludGVybmFsTGltaXQuTEUobGltaXQpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQSBidW1wIHBvaW50ZXIgY2h1bmsvcmVnaW9uIGhhcyBiZWVuIGNvbnN1bWVkIGJ1dCB0aGUgY29udGlndW91cyByZWdpb24KLSAgICogaXMgYXZhaWxhYmxlLCBzbyBjb25zdW1lIGl0IGFuZCB0aGVuIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQKLSAgICogb2YgYSBtZW1vcnkgcmVnaW9uIHNhdGlzZnlpbmcgdGhlIG91dHN0YW5kaW5nIGFsbG9jYXRpb24gcmVxdWVzdC4gIFRoaXMKLSAgICogaXMgcmVsZXZhbnQgd2hlbiByZS11c2luZyBtZW1vcnksIGFzIGluIGEgbWFyay1jb21wYWN0IGNvbGxlY3Rvci4KLSAgICoKLSAgICogQHBhcmFtIG5leHRSZWdpb24gVGhlIHJlZ2lvbiB0byBiZSBjb25zdW1lZAotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQKLSAgICogQHBhcmFtIGFsaWduIFRoZSByZXF1ZXN0ZWQgYWxpZ25tZW50Ci0gICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBmcm9tIHRoZSBhbGlnbm1lbnQKLSAgICogQHJldHVybiBUaGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgYWxsb2NhdGVkIHJlZ2lvbiBvcgotICAgKiB6ZXJvIG9uIGZhaWx1cmUKLSAgICovCi0gIHByaXZhdGUgQWRkcmVzcyBjb25zdW1lTmV4dFJlZ2lvbihBZGRyZXNzIG5leHRSZWdpb24sIGludCBieXRlcywgaW50IGFsaWduLAotICAgICAgICBpbnQgb2Zmc2V0KSB7Ci0gICAgc2V0TmV4dFJlZ2lvbihyZWdpb24sY3Vyc29yKTsKLSAgICByZWdpb24gPSBuZXh0UmVnaW9uOwotICAgIGN1cnNvciA9IGdldERhdGFTdGFydChuZXh0UmVnaW9uKTsKLSAgICB1cGRhdGVMaW1pdChnZXRSZWdpb25MaW1pdChuZXh0UmVnaW9uKSwgbmV4dFJlZ2lvbiwgYnl0ZXMpOwotICAgIHNldERhdGFFbmQobmV4dFJlZ2lvbixBZGRyZXNzLnplcm8oKSk7Ci0gICAgVk0ubWVtb3J5Lnplcm8oY3Vyc29yLCBsaW1pdC5kaWZmKGN1cnNvcikudG9Xb3JkKCkudG9FeHRlbnQoKSk7Ci0gICAgcmV1c2VQYWdlcyhDb252ZXJzaW9ucy5ieXRlc1RvUGFnZXMobGltaXQuZGlmZihyZWdpb24pKSk7Ci0KLSAgICByZXR1cm4gYWxsb2MoYnl0ZXMsIGFsaWduLCBvZmZzZXQpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiAgIEFjY2Vzc29yIG1ldGhvZHMgZm9yIHRoZSByZWdpb24gbWV0YWRhdGEgZmllbGRzLgotICAgKgotICAgKi8KLQotICAvKioKLSAgICogVGhlIGZpcnN0IG9mZnNldCBpbiBhIHJlZ2lvbiBhZnRlciB0aGUgaGVhZGVyCi0gICAqIEBwYXJhbSByZWdpb24gVGhlIHJlZ2lvbgotICAgKiBAcmV0dXJuIFRoZSBsb3dlc3QgYWRkcmVzcyBhdCB3aGljaCBkYXRhIGNhbiBiZSBzdG9yZWQKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyBBZGRyZXNzIGdldERhdGFTdGFydChBZGRyZXNzIHJlZ2lvbikgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KCFyZWdpb24uaXNaZXJvKCkpOwotICAgIHJldHVybiByZWdpb24ucGx1cyhEQVRBX1NUQVJUX09GRlNFVCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG5leHQgcmVnaW9uIGluIHRoZSBsaW5rZWQtbGlzdCBvZiByZWdpb25zCi0gICAqIEBwYXJhbSByZWdpb24gVGhlIHJlZ2lvbgotICAgKiBAcmV0dXJuIFRoZSBuZXh0IHJlZ2lvbiBpbiB0aGUgbGlzdAotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIEFkZHJlc3MgZ2V0TmV4dFJlZ2lvbihBZGRyZXNzIHJlZ2lvbikgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KCFyZWdpb24uaXNaZXJvKCkpOwotICAgIEFkZHJlc3MgcmVzdWx0ID0gcmVnaW9uLnBsdXMoTkVYVF9SRUdJT05fT0ZGU0VUKS5sb2FkQWRkcmVzcygpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBuZXh0IHJlZ2lvbiBpbiB0aGUgbGlua2VkLWxpc3Qgb2YgcmVnaW9ucwotICAgKiBAcGFyYW0gcmVnaW9uIFRoZSByZWdpb24KLSAgICogQHBhcmFtIHRoZSBuZXh0IHJlZ2lvbiBpbiB0aGUgbGlzdAotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0TmV4dFJlZ2lvbihBZGRyZXNzIHJlZ2lvbiwgQWRkcmVzcyBuZXh0UmVnaW9uKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoIXJlZ2lvbi5pc1plcm8oKSk7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoIW5leHRSZWdpb24uRVEoQWRkcmVzcy5mcm9tSW50WmVyb0V4dGVuZCgweGRlYWRiZWVmKSkpOwotICAgIHJlZ2lvbi5zdG9yZShuZXh0UmVnaW9uLE5FWFRfUkVHSU9OX09GRlNFVCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2xlYXIgdGhlIG5leHQgcmVnaW9uIHBvaW50ZXIgaW4gdGhlIGxpbmtlZC1saXN0IG9mIHJlZ2lvbnMKLSAgICogQHBhcmFtIHJlZ2lvbiBUaGUgcmVnaW9uCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhck5leHRSZWdpb24oQWRkcmVzcyByZWdpb24pIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCghcmVnaW9uLmlzWmVybygpKTsKLSAgICByZWdpb24uc3RvcmUoQWRkcmVzcy56ZXJvKCksTkVYVF9SRUdJT05fT0ZGU0VUKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gcmVnaW9uIFRoZSBidW1wLXBvaW50ZXIgcmVnaW9uCi0gICAqIEByZXR1cm4gVGhlIERBVEFfRU5EIGFkZHJlc3MgZnJvbSB0aGUgcmVnaW9uIGhlYWRlcgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIEFkZHJlc3MgZ2V0RGF0YUVuZChBZGRyZXNzIHJlZ2lvbikgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KCFyZWdpb24uaXNaZXJvKCkpOwotICAgIHJldHVybiByZWdpb24ucGx1cyhEQVRBX0VORF9PRkZTRVQpLmxvYWRBZGRyZXNzKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHJlZ2lvbiBUaGUgYnVtcC1wb2ludGVyIHJlZ2lvbgotICAgKiBAcGFyYW0gZW5kQWRkcmVzcyBUaGUgbmV3IERBVEFfRU5EIGFkZHJlc3MgZnJvbSB0aGUgcmVnaW9uIGhlYWRlcgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldERhdGFFbmQoQWRkcmVzcyByZWdpb24sIEFkZHJlc3MgZW5kQWRkcmVzcykgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KCFyZWdpb24uaXNaZXJvKCkpOwotICAgIHJlZ2lvbi5zdG9yZShlbmRBZGRyZXNzLCBEQVRBX0VORF9PRkZTRVQpOwotICAgIGlmIChWRVJCT1NFKSB7Ci0gICAgICBMb2cud3JpdGUoInNldERhdGFFbmQoIik7Ci0gICAgICBMb2cud3JpdGUocmVnaW9uKTsKLSAgICAgIExvZy53cml0ZSgiLCIpOwotICAgICAgTG9nLndyaXRlKGVuZEFkZHJlc3MpOwotICAgICAgTG9nLndyaXRlbG4oIikiKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBlbmQgYWRkcmVzcyBvZiB0aGUgZ2l2ZW4gcmVnaW9uLgotICAgKiBAcGFyYW0gcmVnaW9uIFRoZSByZWdpb24uCi0gICAqIEByZXR1cm4gdGhlIGFsbG9jYXRpb24gbGltaXQgb2YgdGhlIHJlZ2lvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQWRkcmVzcyBnZXRSZWdpb25MaW1pdChBZGRyZXNzIHJlZ2lvbikgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KCFyZWdpb24uaXNaZXJvKCkpOwotICAgIHJldHVybiByZWdpb24ucGx1cyhSRUdJT05fTElNSVRfT0ZGU0VUKS5sb2FkQWRkcmVzcygpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgZW5kIGFkZHJlc3Mgb2YgdGhlIGdpdmVuIHJlZ2lvbi4KLSAgICogQHBhcmFtIHJlZ2lvbiBUaGUgcmVnaW9uLgotICAgKiBAcmV0dXJuIHRoZSBhbGxvY2F0aW9uIGxpbWl0IG9mIHRoZSByZWdpb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UmVnaW9uTGltaXQoQWRkcmVzcyByZWdpb24sIEFkZHJlc3MgbGltaXQpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCghcmVnaW9uLmlzWmVybygpKTsKLSAgICByZWdpb24ucGx1cyhSRUdJT05fTElNSVRfT0ZGU0VUKS5zdG9yZShsaW1pdCk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHJlZ2lvbiBUaGUgcmVnaW9uLgotICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgYWRkcmVzcyBpcyByZWdpb24tYWxpZ25lZAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVnaW9uQWxpZ25lZChBZGRyZXNzIHJlZ2lvbikgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KCFyZWdpb24uaXNaZXJvKCkpOwotICAgIHJldHVybiByZWdpb24udG9Xb3JkKCkuYW5kKEJMT0NLX01BU0spLmlzWmVybygpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNhbml0eSBjaGVjayBhIHJlZ2lvbiBoZWFkZXIKLSAgICogQHBhcmFtIHJlZ2lvbiBSZWdpb24gdG8gY2hlY2sKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja1JlZ2lvbk1ldGFkYXRhKEFkZHJlc3MgcmVnaW9uKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSB7Ci0gICAgICBBZGRyZXNzIG5leHRSZWdpb24gPSBnZXROZXh0UmVnaW9uKHJlZ2lvbik7Ci0gICAgICBBZGRyZXNzIGRhdGFTdGFydCA9IGdldERhdGFTdGFydChyZWdpb24pOwotICAgICAgQWRkcmVzcyBkYXRhRW5kID0gZ2V0RGF0YUVuZChyZWdpb24pOwotICAgICAgQWRkcmVzcyByZWdpb25MaW1pdCA9IGdldFJlZ2lvbkxpbWl0KHJlZ2lvbik7Ci0KLSAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChuZXh0UmVnaW9uLmlzWmVybygpIHx8IGlzUmVnaW9uQWxpZ25lZChuZXh0UmVnaW9uKSk7Ci0gICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZGF0YUVuZC5HRShkYXRhU3RhcnQpKTsKLSAgICAgIGlmIChkYXRhRW5kLkdUKHJlZ2lvbkxpbWl0KSkgewotICAgICAgICBMb2cud3JpdGUoImRhdGFFbmQ9Iik7IExvZy53cml0ZShkYXRhRW5kKTsKLSAgICAgICAgTG9nLndyaXRlKCIsIHJlZ2lvbkxpbWl0PSIpOyBMb2cud3JpdGVsbihyZWdpb25MaW1pdCk7Ci0gICAgICB9Ci0gICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZGF0YUVuZC5MRShyZWdpb25MaW1pdCkpOwotICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KHJlZ2lvbkxpbWl0LkVRKHJlZ2lvbi5wbHVzKEJMT0NLX1NJWkUpKSk7Ci0gICAgfQotCi0gIH0KLSAgLyoqCi0gICAqIFVwZGF0ZSB0aGUgbWV0YWRhdGEgdG8gcmVmbGVjdCB0aGUgYWRkaXRpb24gb2YgYSBuZXcgcmVnaW9uLgotICAgKgotICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSBuZXcgcmVnaW9uCi0gICAqIEBwYXJhbSBzaXplIFRoZSBzaXplIG9mIHRoZSBuZXcgcmVnaW9uIChyb3VuZGVkIHVwIHRvIGJsb2NrLWFsaWdubWVudCkKLSAgICovCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU1ldGFEYXRhKEFkZHJlc3Mgc3RhcnQsIEV4dGVudCBzaXplLCBpbnQgYnl0ZXMpIHsKLSAgICBpZiAoaW5pdGlhbFJlZ2lvbi5pc1plcm8oKSkgewotICAgICAgLyogdGhpcyBpcyB0aGUgZmlyc3QgYWxsb2NhdGlvbiAqLwotICAgICAgaW5pdGlhbFJlZ2lvbiA9IHN0YXJ0OwotICAgICAgcmVnaW9uID0gc3RhcnQ7Ci0gICAgICBjdXJzb3IgPSByZWdpb24ucGx1cyhEQVRBX1NUQVJUX09GRlNFVCk7Ci0gICAgfSBlbHNlIGlmIChsaW1pdC5ORShzdGFydCkgfHwKLSAgICAgICAgICAgICAgIHJlZ2lvbi5kaWZmKHN0YXJ0LnBsdXMoc2l6ZSkpLnRvV29yZCgpLnRvRXh0ZW50KCkuR1QobWF4aW11bVJlZ2lvblNpemUoKSkpIHsKLSAgICAgIC8qIG5vbiBjb250aWd1b3VzIG9yIG92ZXItc2l6ZSwgaW5pdGlhbGl6ZSBuZXcgcmVnaW9uICovCi0gICAgICBzZXROZXh0UmVnaW9uKHJlZ2lvbixzdGFydCk7Ci0gICAgICBzZXREYXRhRW5kKHJlZ2lvbixjdXJzb3IpOwotICAgICAgcmVnaW9uID0gc3RhcnQ7Ci0gICAgICBjdXJzb3IgPSBzdGFydC5wbHVzKERBVEFfU1RBUlRfT0ZGU0VUKTsKLSAgICB9Ci0gICAgdXBkYXRlTGltaXQoc3RhcnQucGx1cyhzaXplKSwgc3RhcnQsIGJ5dGVzKTsKLSAgICBzZXRSZWdpb25MaW1pdChyZWdpb24sbGltaXQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdhdGhlciBkYXRhIGZvciBHQ3NweS4gPHA+Ci0gICAqIFRoaXMgbWV0aG9kIGNhbGxzIHRoZSBkcml2ZXJzIGxpbmVhciBzY2FubmVyIHRvIHNjYW4gdGhyb3VnaAotICAgKiB0aGUgb2JqZWN0cyBhbGxvY2F0ZWQgYnkgdGhpcyBidW1wIHBvaW50ZXIuCi0gICAqCi0gICAqIEBwYXJhbSBkcml2ZXIgVGhlIEdDc3B5IGRyaXZlciBmb3IgdGhpcyBzcGFjZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGdjc3B5R2F0aGVyRGF0YShMaW5lYXJTcGFjZURyaXZlciBkcml2ZXIpIHsKLSAgICAvL2RyaXZlci5zZXRSYW5nZShzcGFjZS5nZXRTdGFydCgpLCBjdXJzb3IpOwotICAgIGRyaXZlci5zZXRSYW5nZShzcGFjZS5nZXRTdGFydCgpLCBsaW1pdCk7Ci0gICAgdGhpcy5saW5lYXJTY2FuKGRyaXZlci5nZXRTY2FubmVyKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdhdGhlciBkYXRhIGZvciBHQ3NweS4gPHA+Ci0gICAqIFRoaXMgbWV0aG9kIGNhbGxzIHRoZSBkcml2ZXJzIGxpbmVhciBzY2FubmVyIHRvIHNjYW4gdGhyb3VnaAotICAgKiB0aGUgb2JqZWN0cyBhbGxvY2F0ZWQgYnkgdGhpcyBidW1wIHBvaW50ZXIuCi0gICAqCi0gICAqIEBwYXJhbSBkcml2ZXIgVGhlIEdDc3B5IGRyaXZlciBmb3IgdGhpcyBzcGFjZS4KLSAgICogQHBhcmFtIHNjYW5TcGFjZSBUaGUgc3BhY2UgdG8gc2NhbgotICAgKi8KLSAgcHVibGljIHZvaWQgZ2NzcHlHYXRoZXJEYXRhKExpbmVhclNwYWNlRHJpdmVyIGRyaXZlciwgU3BhY2Ugc2NhblNwYWNlKSB7Ci0gICAgLy9UT0RPIGNhbiBzY2FuU3BhY2UgZXZlciBiZSBkaWZmZXJlbnQgdG8gdGhpcy5zcGFjZT8KLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChzY2FuU3BhY2UgPT0gc3BhY2UsICJzY2FuU3BhY2UgIT0gc3BhY2UiKTsKLQotICAgIC8vZHJpdmVyLnNldFJhbmdlKHNjYW5TcGFjZS5nZXRTdGFydCgpLCBjdXJzb3IpOwotICAgIEFkZHJlc3Mgc3RhcnQgPSBzY2FuU3BhY2UuZ2V0U3RhcnQoKTsKLSAgICBkcml2ZXIuc2V0UmFuZ2Uoc3RhcnQsIGxpbWl0KTsKLQotICAgIGlmIChmYWxzZSkgewotICAgICAgTG9nLndyaXRlKCJcbkJ1bXBQb2ludGVyLmdjc3B5R2F0aGVyRGF0YSBzZXQgUmFuZ2UgIik7IExvZy53cml0ZShzY2FuU3BhY2UuZ2V0U3RhcnQoKSk7Ci0gICAgICBMb2cud3JpdGUoIiB0byAiKTsgTG9nLndyaXRlbG4obGltaXQpOwotICAgICAgTG9nLndyaXRlKCJCdW1wUG9pbnRlcmdjc3B5R2F0aGVyRGF0YSBzY2FuIGZyb20gIik7IExvZy53cml0ZWxuKGluaXRpYWxSZWdpb24pOwotICAgIH0KLQotICAgIGxpbmVhclNjYW4oZHJpdmVyLmdldFNjYW5uZXIoKSk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBQZXJmb3JtIGEgbGluZWFyIHNjYW4gdGhyb3VnaCB0aGUgb2JqZWN0cyBhbGxvY2F0ZWQgYnkgdGhpcyBidW1wIHBvaW50ZXIuCi0gICAqCi0gICAqIEBwYXJhbSBzY2FubmVyIFRoZSBzY2FuIG9iamVjdCB0byBkZWxlZ2F0ZSBzY2FubmluZyB0by4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGZpbmFsIHZvaWQgbGluZWFyU2NhbihMaW5lYXJTY2FuIHNjYW5uZXIpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChhbGxvd1NjYW5uaW5nKTsKLSAgICAvKiBIYXMgdGhpcyBhbGxvY2F0b3IgZXZlciBhbGxvY2F0ZWQgYW55dGhpbmc/ICovCi0gICAgaWYgKGluaXRpYWxSZWdpb24uaXNaZXJvKCkpIHJldHVybjsKLQotICAgIC8qIExvb3AgdGhyb3VnaCBhY3RpdmUgcmVnaW9ucyBvciB1bnRpbCB0aGUgbGFzdCByZWdpb24gKi8KLSAgICBBZGRyZXNzIHN0YXJ0ID0gaW5pdGlhbFJlZ2lvbjsKLSAgICB3aGlsZSAoIXN0YXJ0LmlzWmVybygpKSB7Ci0gICAgICBzY2FuUmVnaW9uKHNjYW5uZXIsIHN0YXJ0KTsgLy8gU2NhbiB0aGlzIHJlZ2lvbgotICAgICAgc3RhcnQgPSBnZXROZXh0UmVnaW9uKHN0YXJ0KTsgLy8gTW92ZSBvbiB0byBuZXh0Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYSBsaW5lYXIgc2NhbiB0aHJvdWdoIGEgc2luZ2xlIGNvbnRpZ3VvdXMgcmVnaW9uCi0gICAqCi0gICAqIEBwYXJhbSBzY2FubmVyIFRoZSBzY2FuIG9iamVjdCB0byBkZWxlZ2F0ZSB0by4KLSAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydCBvZiB0aGlzIHJlZ2lvbgotICAgKi8KLSAgQElubGluZQotICBwcml2YXRlIHZvaWQgc2NhblJlZ2lvbihMaW5lYXJTY2FuIHNjYW5uZXIsIEFkZHJlc3Mgc3RhcnQpIHsKLSAgICAvKiBHZXQgdGhlIGVuZCBvZiB0aGlzIHJlZ2lvbiAqLwotICAgIEFkZHJlc3MgZGF0YUVuZCA9IHN0YXJ0LnBsdXMoREFUQV9FTkRfT0ZGU0VUKS5sb2FkQWRkcmVzcygpOwotCi0gICAgLyogZGF0YUVuZCA9IHplcm8gcmVwcmVzZW50cyB0aGUgY3VycmVudCByZWdpb24uICovCi0gICAgQWRkcmVzcyBjdXJyZW50TGltaXQgPSAoZGF0YUVuZC5pc1plcm8oKSA/IGN1cnNvciA6IGRhdGFFbmQpOwotICAgIGlmIChjdXJyZW50TGltaXQuRVEoc3RhcnQucGx1cyhEQVRBX0VORF9PRkZTRVQpLnBsdXMoQllURVNfSU5fQUREUkVTUykpKSB7Ci0gICAgICAvKiBFbXB0eSByZWdpb24sIHNvIHdlIGNhbiBub3QgY2FsbCBnZXRPYmplY3RGcm9tU3RhcnRBZGRyZXNzKCkgKi8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBPYmplY3RSZWZlcmVuY2UgY3VycmVudCA9IFZNLm9iamVjdE1vZGVsLmdldE9iamVjdEZyb21TdGFydEFkZHJlc3Moc3RhcnQucGx1cyhEQVRBX1NUQVJUX09GRlNFVCkpOwotCi0gICAgLyogTG9vcCB0aHJvdWdoIGVhY2ggb2JqZWN0IHVwIHRvIHRoZSBsaW1pdCAqLwotICAgIGRvIHsKLSAgICAgIC8qIFJlYWQgZW5kIGFkZHJlc3MgZmlyc3QsIGFzIHNjYW4gbWF5IGJlIGRlc3RydWN0aXZlICovCi0gICAgICBBZGRyZXNzIGN1cnJlbnRPYmplY3RFbmQgPSBWTS5vYmplY3RNb2RlbC5nZXRPYmplY3RFbmRBZGRyZXNzKGN1cnJlbnQpOwotICAgICAgc2Nhbm5lci5zY2FuKGN1cnJlbnQpOwotICAgICAgaWYgKGN1cnJlbnRPYmplY3RFbmQuR0UoY3VycmVudExpbWl0KSkgewotICAgICAgICAvKiBXZSBoYXZlIHNjYW5uZWQgdGhlIGxhc3Qgb2JqZWN0ICovCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgLyogRmluZCB0aGUgbmV4dCBvYmplY3QgZnJvbSB0aGUgc3RhcnQgYWRkcmVzcyAoZGVhbGluZyB3aXRoIGFsaWdubWVudCBnYXBzLCBldGMuKSAqLwotICAgICAgT2JqZWN0UmVmZXJlbmNlIG5leHQgPSBWTS5vYmplY3RNb2RlbC5nZXRPYmplY3RGcm9tU3RhcnRBZGRyZXNzKGN1cnJlbnRPYmplY3RFbmQpOwotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSB7Ci0gICAgICAgIC8qIE11c3QgYmUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nICovCi0gICAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChuZXh0LnRvQWRkcmVzcygpLkdUKGN1cnJlbnQudG9BZGRyZXNzKCkpKTsKLSAgICAgIH0KLSAgICAgIGN1cnJlbnQgPSBuZXh0OwotICAgIH0gd2hpbGUgKHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNvbWUgcGFnZXMgYXJlIGFib3V0IHRvIGJlIHJlLXVzZWQgdG8gc2F0aXNmeSBhIHNsb3cgcGF0aCByZXF1ZXN0LgotICAgKiBAcGFyYW0gcGFnZXMgVGhlIG51bWJlciBvZiBwYWdlcy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHJldXNlUGFnZXMoaW50IHBhZ2VzKSB7Ci0gICAgVk0uYXNzZXJ0aW9ucy5mYWlsKCJTdWJjbGFzc2VzIHRoYXQgcmV1c2UgcmVnaW9ucyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kLiIpOwotICB9Ci0KLSAgLyoqCi0gICAqIE1heGltdW0gc2l6ZSBvZiBhIHNpbmdsZSByZWdpb24uIEltcG9ydGFudCBmb3IgY2hpbGRyZW4gdGhhdCBpbXBsZW1lbnQKLSAgICogbG9hZCBiYWxhbmNpbmcgb3IgaW5jcmVtZW50cyBiYXNlZCBvbiByZWdpb24gc2l6ZS4KLSAgICogQHJldHVybiB0aGUgbWF4aW11bSByZWdpb24gc2l6ZQotICAgKi8KLSAgcHJvdGVjdGVkIEV4dGVudCBtYXhpbXVtUmVnaW9uU2l6ZSgpIHsgcmV0dXJuIEV4dGVudC5tYXgoKTsgfQotCi0gIC8qKiBAcmV0dXJuIHRoZSBjdXJyZW50IGN1cnNvciB2YWx1ZSAqLwotICBwdWJsaWMgZmluYWwgQWRkcmVzcyBnZXRDdXJzb3IoKSB7IHJldHVybiBjdXJzb3I7IH0KLSAgLyoqIEByZXR1cm4gdGhlIHNwYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJ1bXAgcG9pbnRlciAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGZpbmFsIFNwYWNlIGdldFNwYWNlKCkgeyByZXR1cm4gc3BhY2U7IH0KLQotICAvKioKLSAgICogUHJpbnQgb3V0IHRoZSBzdGF0dXMgb2YgdGhlIGFsbG9jYXRvciAoZm9yIGRlYnVnZ2luZykKLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNob3coKSB7Ci0gICAgTG9nLndyaXRlKCJjdXJzb3IgPSAiKTsgTG9nLndyaXRlKGN1cnNvcik7Ci0gICAgaWYgKGFsbG93U2Nhbm5pbmcpIHsKLSAgICAgIExvZy53cml0ZSgiIHJlZ2lvbiA9ICIpOyBMb2cud3JpdGUocmVnaW9uKTsKLSAgICB9Ci0gICAgTG9nLndyaXRlKCIgbGltaXQgPSAiKTsgTG9nLndyaXRlbG4obGltaXQpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvYWxsb2MvRHVtcExpbmVhclNjYW4uamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9hbGxvYy9EdW1wTGluZWFyU2Nhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzQ2NzEyLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9hbGxvYy9EdW1wTGluZWFyU2Nhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkuYWxsb2M7Ci0KLWltcG9ydCBvcmcubW10ay52bS5WTTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkxvZzsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBTaW1wbGUgbGluZWFyIHNjYW4gdG8gZHVtcCBvYmplY3QgaW5mb3JtYXRpb24uCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBmaW5hbCBjbGFzcyBEdW1wTGluZWFyU2NhbiBleHRlbmRzIExpbmVhclNjYW4gewotICAvKioKLSAgICogU2NhbiBhbiBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBzY2FuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyB2b2lkIHNjYW4oT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIExvZy53cml0ZSgiWyIpOwotICAgIExvZy53cml0ZShvYmplY3QudG9BZGRyZXNzKCkpOwotICAgIExvZy53cml0ZSgiXSwgU0laRSA9ICIpOwotICAgIExvZy53cml0ZWxuKFZNLm9iamVjdE1vZGVsLmdldEN1cnJlbnRTaXplKG9iamVjdCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvYWxsb2MvRW1iZWRkZWRNZXRhRGF0YS5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2FsbG9jL0VtYmVkZGVkTWV0YURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg1NzRmMi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvYWxsb2MvRW1iZWRkZWRNZXRhRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkuYWxsb2M7Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkNvbnN0YW50czsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBUaGlzIHBsYW4gaW1wbGVtZW50cyBjb25zdGFudHMgYW5kIGFjY2VzcyBtZXRob2RzIGZvciBtZXRhIGRhdGEKLSAqIHRoYXQgaXMgZW1iZWRlZCBpbiBhbGxvY2F0aW9uIHNwYWNlcyAocmF0aGVyIHRoYW4ga2VwdCBvbiB0aGUKLSAqIHNpZGUpLiAgVGhlIGJhc2ljIGlkZWEgaXMgdGhhdCBtZXRhIGRhdGEgYmUgZW1iZWRlZCBhdCBhIHZlcnkKLSAqIGNvYXJzZSBwb3dlciBvZiB0d28gZ3JhbnVsYXJpdHkgZm9yIGZhc3QgYWNjZXNzLCBtaW5pbWFsIHdhc3RhZ2UKLSAqIGFuZCBieSBtYWtpbmcgdGhlIHJlZ2lvbnMgY29hcnNlLCB0aGUgY29udGlndW91cyBtZXRhLWRhdGEgd2lsbCBiZQotICogcmVsYXRpdmVseSBsYXJnZSBhbmQgdGh1cyB0aGUgcHJvYmFiaWxpdHkgb2YgTDEgY29uZmxpY3QgbWlzc2VzCi0gKiB3aWxsIGJlIHJlZHVjZWQgKGFzIGNvbXBhcmVkIHdpdGggZW1iZWRkaW5nIG1ldGEtZGF0YSBhdCB0aGUgc3RhcnQKLSAqIG9mIGVhY2ggcGFnZSB3aGljaCB3aWxsIGNhdXNlIHRob3NlIGZldyBjYWNoZSBsaW5lcyBjb3JyZXNwb25kaW5nCi0gKiB0byB0aGUgc3RhcnQgb2YgZWFjaCBwYWdlIHRvIGJlIGhlYXZpbHkgY29uZmxpY3RlZCkuCi0gKi8KLUBVbmludGVycnVwdGlibGUgcHVibGljIGZpbmFsIGNsYXNzIEVtYmVkZGVkTWV0YURhdGEgaW1wbGVtZW50cyBDb25zdGFudHMgewotCi0gIC8qIFRoZSAobG9nIG9mIHRoZSkgc2l6ZSBvZiBlYWNoIHJlZ2lvbiBvZiBtZXRhIGRhdGEgbWFuYWdlbWVudCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0dfQllURVNfSU5fUkVHSU9OID0gMjI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJZVEVTX0lOX1JFR0lPTiA9IDEgPDwgTE9HX0JZVEVTX0lOX1JFR0lPTjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgV29yZCBSRUdJT05fTUFTSyA9IFdvcmQuZnJvbUludFNpZ25FeHRlbmQoQllURVNfSU5fUkVHSU9OIC0gMSk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPR19QQUdFU19JTl9SRUdJT04gPSBMT0dfQllURVNfSU5fUkVHSU9OIC0gTE9HX0JZVEVTX0lOX1BBR0U7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBR0VTX0lOX1JFR0lPTiA9IDEgPDwgTE9HX1BBR0VTX0lOX1JFR0lPTjsKLQotICAvKioKLSAgICogR2l2ZW4gYW4gYWRkcmVzcywgcmV0dXJuIHRoZSBiZWdpbmluZyBvZiB0aGUgbWV0YSBkYXRhIGZvciB0aGUKLSAgICogcmVnaW9uIGNvbnRhaW5pbmcgdGhlIGFkZHJlc3MuICBUaGlzIGlzIGEgZmFzdCBvcGVyYXRpb24gYmVjYXVzZQotICAgKiBpdCBvbmx5IGludm9sdmVzIG1hc2tpbmcgb3V0IGxvdyBvcmRlciBiaXRzLgotICAgKgotICAgKiBAcGFyYW0gYWRkcmVzcyBUaGUgYWRkcmVzcyB3aG9zZSBtZXRhIGRhdGEgaXMgc291Z2h0LgotICAgKiBAcmV0dXJuIFRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgbWV0YSBkYXRhIGZvciB0aGUgbWV0YQotICAgKiByZWdpb24gaW4gd2hpY2ggdGhlIGFkZHJlc3MgaXMgbG9jYXRlZC4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyBBZGRyZXNzIGdldE1ldGFEYXRhQmFzZShBZGRyZXNzIGFkZHJlc3MpIHsKLSAgICByZXR1cm4gYWRkcmVzcy50b1dvcmQoKS5hbmQoUkVHSU9OX01BU0subm90KCkpLnRvQWRkcmVzcygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdpdmVuIGFuIGFkZHJlc3MsIHRoZSBkZW5zaXR5IChjb3ZlcmFnZSkgb2YgYSBtZXRhIGRhdGEgdHlwZSwgYW5kCi0gICAqIHRoZSBncmFudWxhcml0eSAoYWxpZ25tZW50KSBvZiB0aGUgbWV0YSBkYXRhLCByZXR1cm4gdGhlIG9mZnNldAotICAgKiBpbnRvIHRoZSBtZXRhIGRhdGEgdGhlIGFkZHJlc3MuCi0gICAqCi0gICAqIEBwYXJhbSBhZGRyZXNzIFRoZSBhZGRyZXNzIHdob3NlIG1ldGEgZGF0YSBvZmZzZXQgaXMgc291Z2h0LgotICAgKiBAcGFyYW0gbG9nQ292ZXJhZ2UgVGhlIGxvZyBiYXNlIHR3byBvZiB0aGUgY292ZXJhZ2Ugb2YgdGhlIG1ldGEKLSAgICogZGF0YSBpbiBxdWVzdGlvbi4gRm9yIGV4YW1wbGUsIGEgdmFsdWUgb2YgNCB3b3VsZCBpbmRpY2F0ZSBhCi0gICAqIGNvdmVyYWdlIG9mIDE2OyBvbmUgbWV0YWRhdGEgYnl0ZSBmb3IgZXZlcnkgMTYgYnl0ZXMgb2YgZGF0YS4KLSAgICogQHBhcmFtIGxvZ0FsaWduIFRoZSBsb2cgYmFzZSB0d28gb2YgdGhlIGFsaWdtZW50IG9yIGdyYW51bGFyaXR5Ci0gICAqIG9mIHRoZSBtZXRhLWRhdGEgKGl0IG1heSBiZSBhcnJhbmdlZCBpbiBieXRlcywgd29yZHMsIGRvdWJsZQotICAgKiB3b3JkcyBldGMpLgotICAgKiBAcmV0dXJuIFRoZSBvZmZzZXQgaW50byB0aGUgbWV0YS1kYXRhIGZvciB0aGlzIHJlZ2lvbiwgZ2l2ZW4gdGhlCi0gICAqIHNwZWNpZmllZCBhZGRyZXNzIGFuZCBjb3ZlcmFnZSBhbmQgYWxpZ21lbnQgcmVxdWlyZW1lbnRzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBFeHRlbnQgZ2V0TWV0YURhdGFPZmZzZXQoQWRkcmVzcyBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nQ292ZXJhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2dBbGlnbikgewotICAgIHJldHVybiBhZGRyZXNzLnRvV29yZCgpLmFuZChSRUdJT05fTUFTSykucnNobChsb2dDb3ZlcmFnZStsb2dBbGlnbikubHNoKGxvZ0FsaWduKS50b0V4dGVudCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvYWxsb2MvSW1taXhBbGxvY2F0b3IuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9hbGxvYy9JbW1peEFsbG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2EwOTgxLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9hbGxvYy9JbW1peEFsbG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkuYWxsb2M7Ci0KLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LmltbWl4LkJsb2NrOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5pbW1peC5DaHVuazsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuaW1taXguTGluZTsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuaW1taXguSW1taXhTcGFjZTsKLWltcG9ydCBzdGF0aWMgb3JnLm1tdGsucG9saWN5LmltbWl4LkltbWl4Q29uc3RhbnRzLio7Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkNvbnN0YW50czsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkxvZzsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnMuT3B0aW9uczsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgY2xhc3MgSW1taXhBbGxvY2F0b3IgZXh0ZW5kcyBBbGxvY2F0b3IgaW1wbGVtZW50cyBDb25zdGFudHMgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluc3RhbmNlIHZhcmlhYmxlcwotICAgKi8KLSAgcHJvdGVjdGVkIGZpbmFsIEltbWl4U3BhY2Ugc3BhY2U7ICAgIC8qIHNwYWNlIHRoaXMgYWxsb2NhdG9yIGlzIGFzc29jaWF0ZWQgd2l0aCAqLwotICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaG90OwotICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gY29weTsKLQotICBwcml2YXRlIEFkZHJlc3MgY3Vyc29yOyAgICAgICAgICAgICAgIC8qIGJ1bXAgcG9pbnRlciAqLwotICBwcml2YXRlIEFkZHJlc3MgbGltaXQ7ICAgICAgICAgICAgICAgIC8qIGxpbWl0IGZvciBidW1wIHBvaW50ZXIgKi8KLSAgcHJpdmF0ZSBBZGRyZXNzIGxhcmdlQ3Vyc29yOyAgICAgICAgICAvKiBidW1wIHBvaW50ZXIgZm9yIGxhcmdlIG9iamVjdHMgKi8KLSAgcHJpdmF0ZSBBZGRyZXNzIGxhcmdlTGltaXQ7ICAgICAgICAgICAvKiBsaW1pdCBmb3IgYnVtcCBwb2ludGVyIGZvciBsYXJnZSBvYmplY3RzICovCi0gIHByaXZhdGUgYm9vbGVhbiByZXF1ZXN0Rm9yTGFyZ2U7ICAgICAgLyogaXMgdGhlIGN1cnJlbnQgcmVxdWVzdCBmb3IgbGFyZ2Ugb3Igc21hbGw/ICovCi0gIHByaXZhdGUgYm9vbGVhbiBzdHJhZGRsZTsgICAgICAgICAgICAgLyogZGlkIHRoZSBsYXN0IGFsbG9jYXRpb24gc3RyYWRkbGUgYSBsaW5lPyAqLwotICBwcml2YXRlIGludCBsaW5lVXNlQ291bnQ7ICAgICAgICAgICAgIC8qIGFwcHJveGltYXRpb24gdG8gYnl0ZXMgYWxsb2NhdGVkIChtZWFzdXJlZCBhdCA5OSUgYWNjdXJhdGUpICAwNy8xMC8zMCAqLwotICBwcml2YXRlIEFkZHJlc3MgbWFya1RhYmxlOwotICBwcml2YXRlIEFkZHJlc3MgcmVjeWNsYWJsZUJsb2NrOwotICBwcml2YXRlIGludCBsaW5lOwotICBwcml2YXRlIGJvb2xlYW4gcmVjeWNsYWJsZUV4aGF1c3RlZDsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSBzcGFjZSBUaGUgc3BhY2UgdG8gYnVtcCBwb2ludCBpbnRvLgotICAgKiBAcGFyYW0gaG90IFRPRE8KLSAgICogQHBhcmFtIGNvcHkgVE9ETwotICAgKi8KLSAgcHVibGljIEltbWl4QWxsb2NhdG9yKEltbWl4U3BhY2Ugc3BhY2UsIGJvb2xlYW4gaG90LCBib29sZWFuIGNvcHkpIHsKLSAgICB0aGlzLnNwYWNlID0gc3BhY2U7Ci0gICAgdGhpcy5ob3QgPSBob3Q7Ci0gICAgdGhpcy5jb3B5ID0gY29weTsKLSAgICByZXNldCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlc2V0IHRoZSBhbGxvY2F0b3IuIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IHJlc2V0IHRoZSBzcGFjZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgIGN1cnNvciA9IEFkZHJlc3MuemVybygpOwotICAgIGxpbWl0ID0gQWRkcmVzcy56ZXJvKCk7Ci0gICAgbGFyZ2VDdXJzb3IgPSBBZGRyZXNzLnplcm8oKTsKLSAgICBsYXJnZUxpbWl0ID0gQWRkcmVzcy56ZXJvKCk7Ci0gICAgbWFya1RhYmxlID0gQWRkcmVzcy56ZXJvKCk7Ci0gICAgcmVjeWNsYWJsZUJsb2NrID0gQWRkcmVzcy56ZXJvKCk7Ci0gICAgcmVxdWVzdEZvckxhcmdlID0gZmFsc2U7Ci0gICAgcmVjeWNsYWJsZUV4aGF1c3RlZCA9IGZhbHNlOwotICAgIGxpbmUgPSBMSU5FU19JTl9CTE9DSzsKLSAgICBsaW5lVXNlQ291bnQgPSAwOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIFB1YmxpYyBpbnRlcmZhY2UKLSAgICovCi0KLSAgLyoqCi0gICAqIEFsbG9jYXRlIHNwYWNlIGZvciBhIG5ldyBvYmplY3QuICBUaGlzIGlzIGZyZXF1ZW50bHkgZXhlY3V0ZWQgY29kZSBhbmQKLSAgICogdGhlIGNvZGluZyBpcyBkZWxpYmVyYWV0bHkgc2Vuc2l0aXZlIHRvIHRoZSBvcHRpbWl6aW5nIGNvbXBpbGVyLgotICAgKiBBZnRlciBjaGFuZ2luZyB0aGlzLCBhbHdheXMgY2hlY2sgdGhlIElSL01DIHRoYXQgaXMgZ2VuZXJhdGVkLgotICAgKgotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQKLSAgICogQHBhcmFtIGFsaWduIFRoZSByZXF1ZXN0ZWQgYWxpZ25tZW50Ci0gICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBmcm9tIHRoZSBhbGlnbm1lbnQKLSAgICogQHJldHVybiBUaGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgYWxsb2NhdGVkIHJlZ2lvbgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgQWRkcmVzcyBhbGxvYyhpbnQgYnl0ZXMsIGludCBhbGlnbiwgaW50IG9mZnNldCkgewotICAgIC8qIGVzdGFibGlzaCBob3cgbXVjaCB3ZSBuZWVkICovCi0gICAgQWRkcmVzcyBzdGFydCA9IGFsaWduQWxsb2NhdGlvbk5vRmlsbChjdXJzb3IsIGFsaWduLCBvZmZzZXQpOwotICAgIEFkZHJlc3MgZW5kID0gc3RhcnQucGx1cyhieXRlcyk7Ci0KLSAgICAvKiBjaGVjayB3aGV0aGVyIHdlJ3ZlIGV4Y2VlZGVkIHRoZSBsaW1pdCAqLwotICAgIGlmIChlbmQuR1QobGltaXQpKSB7Ci0gICAgICBpZiAoYnl0ZXMgPiBCWVRFU19JTl9MSU5FKQotICAgICAgICByZXR1cm4gb3ZlcmZsb3dBbGxvYyhieXRlcywgYWxpZ24sIG9mZnNldCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBhbGxvY1Nsb3dIb3QoYnl0ZXMsIGFsaWduLCBvZmZzZXQpOwotICAgIH0KLQotICAgIC8qIHN1ZmZpY2llbnQgbWVtb3J5IGlzIGF2YWlsYWJsZSwgc28gd2UgY2FuIGZpbmlzaCBwZXJmb3JtaW5nIHRoZSBhbGxvY2F0aW9uICovCi0gICAgZmlsbEFsaWdubWVudEdhcChjdXJzb3IsIHN0YXJ0KTsKLSAgICBjdXJzb3IgPSBlbmQ7Ci0KLSAgICByZXR1cm4gc3RhcnQ7Ci0gIH0KLQotICAvKioKLSAgICogQWxsb2NhdGUgc3BhY2UgZm9yIGEgbmV3IG9iamVjdC4gIFRoaXMgaXMgZnJlcXVlbnRseSBleGVjdXRlZCBjb2RlIGFuZAotICAgKiB0aGUgY29kaW5nIGlzIGRlbGliZXJhZXRseSBzZW5zaXRpdmUgdG8gdGhlIG9wdGltaXppbmcgY29tcGlsZXIuCi0gICAqIEFmdGVyIGNoYW5naW5nIHRoaXMsIGFsd2F5cyBjaGVjayB0aGUgSVIvTUMgdGhhdCBpcyBnZW5lcmF0ZWQuCi0gICAqCi0gICAqIEBwYXJhbSBieXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZAotICAgKiBAcGFyYW0gYWxpZ24gVGhlIHJlcXVlc3RlZCBhbGlnbm1lbnQKLSAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGZyb20gdGhlIGFsaWdubWVudAotICAgKiBAcmV0dXJuIFRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBhbGxvY2F0ZWQgcmVnaW9uCi0gICAqLwotICBwdWJsaWMgZmluYWwgQWRkcmVzcyBvdmVyZmxvd0FsbG9jKGludCBieXRlcywgaW50IGFsaWduLCBpbnQgb2Zmc2V0KSB7Ci0gICAgLyogZXN0YWJsaXNoIGhvdyBtdWNoIHdlIG5lZWQgKi8KLSAgICBBZGRyZXNzIHN0YXJ0ID0gYWxpZ25BbGxvY2F0aW9uTm9GaWxsKGxhcmdlQ3Vyc29yLCBhbGlnbiwgb2Zmc2V0KTsKLSAgICBBZGRyZXNzIGVuZCA9IHN0YXJ0LnBsdXMoYnl0ZXMpOwotCi0gICAgLyogY2hlY2sgd2hldGhlciB3ZSd2ZSBleGNlZWRlZCB0aGUgbGltaXQgKi8KLSAgICBpZiAoZW5kLkdUKGxhcmdlTGltaXQpKSB7Ci0gICAgICByZXF1ZXN0Rm9yTGFyZ2UgPSB0cnVlOwotICAgICAgQWRkcmVzcyBydG4gPSAgYWxsb2NTbG93SW5saW5lKGJ5dGVzLCBhbGlnbiwgb2Zmc2V0KTsKLSAgICAgIHJlcXVlc3RGb3JMYXJnZSA9IGZhbHNlOwotICAgICAgcmV0dXJuIHJ0bjsKLSAgICB9Ci0KLSAgICAvKiBzdWZmaWNpZW50IG1lbW9yeSBpcyBhdmFpbGFibGUsIHNvIHdlIGNhbiBmaW5pc2ggcGVyZm9ybWluZyB0aGUgYWxsb2NhdGlvbiAqLwotICAgIGZpbGxBbGlnbm1lbnRHYXAobGFyZ2VDdXJzb3IsIHN0YXJ0KTsKLSAgICBsYXJnZUN1cnNvciA9IGVuZDsKLQotICAgIHJldHVybiBzdGFydDsKLSAgfQotCi0gIEBJbmxpbmUKLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gZ2V0TGFzdEFsbG9jTGluZVN0cmFkZGxlKCkgewotICAgIHJldHVybiBzdHJhZGRsZTsKLSAgfQotCi0gIC8qKgotICAgKiBFeHRlcm5hbCBhbGxvY2F0aW9uIHNsb3cgcGF0aCAoY2FsbGVkIGJ5IHN1cGVyY2xhc3Mgd2hlbiBzbG93IHBhdGggaXMKLSAgICogYWN0dWFsbHkgdGFrZW4uICBUaGlzIGlzIG5lY2Vzc2FyeSAocmF0aGVyIHRoYW4gYSBkaXJlY3QgY2FsbAotICAgKiBmcm9tIHRoZSBmYXN0IHBhdGgpIGJlY2F1c2Ugb2YgdGhlIHBvc3NpYmlsaXR5IG9mIGEgdGhyZWFkIHN3aXRjaAotICAgKiBhbmQgY29ycmVzcG9uZGluZyByZS1hc3NvY2lhdGlvbiBvZiBidW1wIHBvaW50ZXJzIHRvIGtlcm5lbAotICAgKiB0aHJlYWRzLgotICAgKgotICAgKiBAcGFyYW0gYnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQKLSAgICogQHBhcmFtIGFsaWduIFRoZSByZXF1ZXN0ZWQgYWxpZ25tZW50Ci0gICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBmcm9tIHRoZSBhbGlnbm1lbnQKLSAgICogQHJldHVybiBUaGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgYWxsb2NhdGVkIHJlZ2lvbiBvcgotICAgKiB6ZXJvIG9uIGZhaWx1cmUKLSAgICovCi0gIHByb3RlY3RlZCBmaW5hbCBBZGRyZXNzIGFsbG9jU2xvd09uY2UoaW50IGJ5dGVzLCBpbnQgYWxpZ24sIGludCBvZmZzZXQpIHsKLSAgICBib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICB3aGlsZSAoIXN1Y2Nlc3MpIHsKLSAgICAgIEFkZHJlc3MgcHRyID0gc3BhY2UuZ2V0U3BhY2UoaG90LCBjb3B5LCBsaW5lVXNlQ291bnQpOwotCi0gICAgICBpZiAocHRyLmlzWmVybygpKSB7Ci0gICAgICAgIGxpbmVVc2VDb3VudCA9IDA7Ci0gICAgICAgIHJldHVybiBwdHI7IC8vIGZhaWxlZCBhbGxvY2F0aW9uIC0tLSB3ZSB3aWxsIG5lZWQgdG8gR0MKLSAgICAgIH0KLQotICAgICAgLyogd2UgaGF2ZSBiZWVuIGdpdmVuIGEgY2xlYW4gYmxvY2sgKi8KLSAgICAgIHN1Y2Nlc3MgPSB0cnVlOwotICAgICAgbGluZVVzZUNvdW50ID0gTElORVNfSU5fQkxPQ0s7Ci0gICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpCi0gICAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChCbG9jay5pc0FsaWduZWQocHRyKSk7Ci0gICAgICB6ZXJvQmxvY2socHRyKTsKLSAgICAgIGlmIChyZXF1ZXN0Rm9yTGFyZ2UpIHsKLSAgICAgICAgbGFyZ2VDdXJzb3IgPSBwdHI7Ci0gICAgICAgIGxhcmdlTGltaXQgPSBwdHIucGx1cyhCWVRFU19JTl9CTE9DSyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjdXJzb3IgPSBwdHI7Ci0gICAgICAgIGxpbWl0ID0gcHRyLnBsdXMoQllURVNfSU5fQkxPQ0spOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYWxsb2MoYnl0ZXMsIGFsaWduLCBvZmZzZXQpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQnVtcCBhbGxvY2F0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBJbnRlcm5hbCBhbGxvY2F0aW9uIHNsb3cgcGF0aC4gIFRoaXMgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBidW1wCi0gICAqIHBvaW50ZXIgcmVhY2hlcyB0aGUgaW50ZXJuYWwgbGltaXQuICBUaGUgY29kZSBpcyBmb3JjZWQgb3V0IG9mCi0gICAqIGxpbmUuICBJZiByZXF1aXJlZCB3ZSBwZXJmb3JtIGFuIGV4dGVybmFsIHNsb3cgcGF0aCB0YWtlLCB3aGljaAotICAgKiB3ZSBpbmxpbmUgaW50byB0aGlzIG1ldGhvZCBzaW5jZSB0aGlzIGlzIGFscmVhZHkgb3V0IG9mIGxpbmUuCi0gICAqCi0gICAqIEBwYXJhbSBieXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZAotICAgKiBAcGFyYW0gYWxpZ24gVGhlIHJlcXVlc3RlZCBhbGlnbm1lbnQKLSAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGZyb20gdGhlIGFsaWdubWVudAotICAgKiBAcmV0dXJuIFRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBhbGxvY2F0ZWQgcmVnaW9uCi0gICAqLwotICBATm9JbmxpbmUKLSAgcHJpdmF0ZSBBZGRyZXNzIGFsbG9jU2xvd0hvdChpbnQgYnl0ZXMsIGludCBhbGlnbiwgaW50IG9mZnNldCkgewotICAgIGlmIChhY3F1aXJlUmVjeWNsYWJsZUxpbmVzKGJ5dGVzLCBhbGlnbiwgb2Zmc2V0KSkKLSAgICAgIHJldHVybiBhbGxvYyhieXRlcywgYWxpZ24sIG9mZnNldCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGFsbG9jU2xvd0lubGluZShieXRlcywgYWxpZ24sIG9mZnNldCk7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gYWNxdWlyZVJlY3ljbGFibGVMaW5lcyhpbnQgYnl0ZXMsIGludCBhbGlnbiwgaW50IG9mZnNldCkgewotICAgIHdoaWxlIChsaW5lIDwgTElORVNfSU5fQkxPQ0sgfHwgYWNxdWlyZVJlY3ljbGFibGVCbG9jaygpKSB7Ci0gICAgICBsaW5lID0gc3BhY2UuZ2V0TmV4dEF2YWlsYWJsZUxpbmUobWFya1RhYmxlLCBsaW5lKTsKLSAgICAgIGlmIChsaW5lIDwgTElORVNfSU5fQkxPQ0spIHsKLSAgICAgICAgaW50IGVuZExpbmUgPSBzcGFjZS5nZXROZXh0VW5hdmFpbGFibGVMaW5lKG1hcmtUYWJsZSwgbGluZSk7Ci0gICAgICAgIGN1cnNvciA9IHJlY3ljbGFibGVCbG9jay5wbHVzKEV4dGVudC5mcm9tSW50U2lnbkV4dGVuZChsaW5lPDxMT0dfQllURVNfSU5fTElORSkpOwotICAgICAgICBsaW1pdCA9IHJlY3ljbGFibGVCbG9jay5wbHVzKEV4dGVudC5mcm9tSW50U2lnbkV4dGVuZChlbmRMaW5lPDxMT0dfQllURVNfSU5fTElORSkpOwotICAgICAgICBpZiAoU0FOSVRZX0NIRUNLX0xJTkVfTUFSS1MpIHsKLSAgICAgICAgICBBZGRyZXNzIHRtcCA9IGN1cnNvcjsKLSAgICAgICAgICB3aGlsZSAodG1wLkxUKGxpbWl0KSkgewotICAgICAgICAgICAgaWYgKHRtcC5sb2FkQnl0ZSgpICE9IChieXRlKSAwKSB7Ci0gICAgICAgICAgICAgIExvZy53cml0ZSgiY3Vyc29yOiAiKTsgTG9nLndyaXRlbG4oY3Vyc29yKTsKLSAgICAgICAgICAgICAgTG9nLndyaXRlKCIgbGltaXQ6ICIpOyBMb2cud3JpdGVsbihsaW1pdCk7Ci0gICAgICAgICAgICAgIExvZy53cml0ZSgiY3VycmVudDogIik7IExvZy53cml0ZSh0bXApOwotICAgICAgICAgICAgICBMb2cud3JpdGUoIiAgdmFsdWU6ICIpOyBMb2cud3JpdGUodG1wLmxvYWRCeXRlKCkpOwotICAgICAgICAgICAgICBMb2cud3JpdGUoIiAgIGxpbmU6ICIpOyBMb2cud3JpdGUobGluZSk7Ci0gICAgICAgICAgICAgIExvZy53cml0ZSgiZW5kbGluZTogIik7IExvZy53cml0ZShlbmRMaW5lKTsKLSAgICAgICAgICAgICAgTG9nLndyaXRlKCIgIGNodW5rOiAiKTsgTG9nLndyaXRlKENodW5rLmFsaWduKGN1cnNvcikpOwotICAgICAgICAgICAgICBMb2cud3JpdGUoIiAgICAgaHc6ICIpOyBMb2cud3JpdGUoQ2h1bmsuZ2V0SGlnaFdhdGVyKENodW5rLmFsaWduKGN1cnNvcikpKTsKLSAgICAgICAgICAgICAgTG9nLndyaXRlbG4oIiB2YWx1ZXM6ICIpOwotICAgICAgICAgICAgICBBZGRyZXNzIHRtcDIgPSBjdXJzb3I7Ci0gICAgICAgICAgICAgIHdoaWxlKHRtcDIuTFQobGltaXQpKSB7IExvZy53cml0ZSh0bXAyLmxvYWRCeXRlKCkpOyBMb2cud3JpdGUoIiAiKTt9Ci0gICAgICAgICAgICAgIExvZy53cml0ZWxuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQodG1wLmxvYWRCeXRlKCkgPT0gKGJ5dGUpIDApOwotICAgICAgICAgICAgdG1wID0gdG1wLnBsdXMoMSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUyAmJiBieXRlcyA8PSBCWVRFU19JTl9MSU5FKSB7Ci0gICAgICAgICAgQWRkcmVzcyBzdGFydCA9IGFsaWduQWxsb2NhdGlvbk5vRmlsbChjdXJzb3IsIGFsaWduLCBvZmZzZXQpOwotICAgICAgICAgIEFkZHJlc3MgZW5kID0gc3RhcnQucGx1cyhieXRlcyk7Ci0gICAgICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGVuZC5MRShsaW1pdCkpOwotICAgICAgICB9Ci0gICAgICAgIFZNLm1lbW9yeS56ZXJvKGN1cnNvciwgbGltaXQuZGlmZihjdXJzb3IpLnRvV29yZCgpLnRvRXh0ZW50KCkpOwotICAgICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMgJiYgT3B0aW9ucy52ZXJib3NlLmdldFZhbHVlKCkgPj0gOSkgewotICAgICAgICAgIExvZy53cml0ZSgiWlsiKTsgTG9nLndyaXRlKGN1cnNvcik7IExvZy53cml0ZSgiLT4iKTsgTG9nLndyaXRlKGxpbWl0KTsgTG9nLndyaXRlbG4oIl0iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxpbmUgPSBlbmRMaW5lOwotICAgICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMgJiYgY29weSkgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KCFCbG9jay5pc0RlZnJhZ1NvdXJjZShjdXJzb3IpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBhY3F1aXJlUmVjeWNsYWJsZUJsb2NrKCkgewotICAgIGJvb2xlYW4gcnRuOwotICAgIHJ0biA9IGFjcXVpcmVSZWN5Y2xhYmxlQmxvY2tBZGRyZXNzT3JkZXIoKTsKLSAgICBpZiAocnRuKSB7Ci0gICAgICBtYXJrVGFibGUgPSBMaW5lLmdldEJsb2NrTWFya1RhYmxlKHJlY3ljbGFibGVCbG9jayk7Ci0gICAgICBsaW5lID0gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHJ0bjsKLSAgfQotCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSBib29sZWFuIGFjcXVpcmVSZWN5Y2xhYmxlQmxvY2tBZGRyZXNzT3JkZXIoKSB7Ci0gICAgaWYgKHJlY3ljbGFibGVFeGhhdXN0ZWQpIHsKLSAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUyAmJiBPcHRpb25zLnZlcmJvc2UuZ2V0VmFsdWUoKSA+PSA5KSB7Ci0gICAgICAgIExvZy53cml0ZWxuKCJbbm8gcmVjeWNsYWJsZSBhdmFpbGFibGVdIik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGludCBtYXJrU3RhdGUgPSAwOwotICAgIGJvb2xlYW4gdXNhYmxlID0gZmFsc2U7Ci0gICAgd2hpbGUgKCF1c2FibGUpIHsKLSAgICAgIEFkZHJlc3MgbmV4dCA9IHJlY3ljbGFibGVCbG9jay5wbHVzKEJZVEVTX0lOX0JMT0NLKTsKLSAgICAgIGlmIChyZWN5Y2xhYmxlQmxvY2suaXNaZXJvKCkgfHwgSW1taXhTcGFjZS5pc1JlY3ljbGVBbGxvY0NodW5rQWxpZ25lZChuZXh0KSkgewotICAgICAgICByZWN5Y2xhYmxlQmxvY2sgPSBzcGFjZS5hY3F1aXJlUmV1c2FibGVCbG9ja3MoKTsKLSAgICAgICAgaWYgKHJlY3ljbGFibGVCbG9jay5pc1plcm8oKSkgewotICAgICAgICAgIHJlY3ljbGFibGVFeGhhdXN0ZWQgPSB0cnVlOwotICAgICAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUyAmJiBPcHRpb25zLnZlcmJvc2UuZ2V0VmFsdWUoKSA+PSA5KSB7Ci0gICAgICAgICAgICBMb2cud3JpdGVsbigiW3JlY3ljbGFibGUgZXhoYXVzdGVkXSIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBsaW5lID0gTElORVNfSU5fQkxPQ0s7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZWN5Y2xhYmxlQmxvY2sgPSBuZXh0OwotICAgICAgfQotICAgICAgbWFya1N0YXRlID0gQmxvY2suZ2V0QmxvY2tNYXJrU3RhdGUocmVjeWNsYWJsZUJsb2NrKTsKLSAgICAgIHVzYWJsZSA9IChtYXJrU3RhdGUgPiAwICYmIG1hcmtTdGF0ZSA8PSBJbW1peFNwYWNlLmdldFJldXN1YWJsZU1hcmtTdGF0ZVRocmVzaG9sZChjb3B5KSk7Ci0gICAgICBpZiAoY29weSAmJiBCbG9jay5pc0RlZnJhZ1NvdXJjZShyZWN5Y2xhYmxlQmxvY2spKQotICAgICAgICB1c2FibGUgPSBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoIUJsb2NrLmlzVW51c2VkKHJlY3ljbGFibGVCbG9jaykpOwotICAgIEJsb2NrLnNldEJsb2NrQXNSZXVzZWQocmVjeWNsYWJsZUJsb2NrKTsKLQotICAgIGxpbmVVc2VDb3VudCArPSAoTElORVNfSU5fQkxPQ0stbWFya1N0YXRlKTsKLSAgICByZXR1cm4gdHJ1ZTsgLy8gZm91bmQgc29tZXRoaW5nIGdvb2QKLSAgfQotCi0gIHByaXZhdGUgdm9pZCB6ZXJvQmxvY2soQWRkcmVzcyBibG9jaykgewotICAgIC8vIEZJWE1FOiBlZmZpY2llbmN5IGNoZWNrIGhlcmUhCi0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoYmxvY2sudG9Xb3JkKCkuYW5kKFdvcmQuZnJvbUludFNpZ25FeHRlbmQoQllURVNfSU5fQkxPQ0stMSkpLmlzWmVybygpKTsKLSAgICBWTS5tZW1vcnkuemVybyhibG9jaywgRXh0ZW50LmZyb21JbnRaZXJvRXh0ZW5kKEJZVEVTX0lOX0JMT0NLKSk7Ci0gICB9Ci0KLSAgLyoqIEByZXR1cm4gdGhlIHNwYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNxdWlzaCBhbGxvY2F0b3IgKi8KLSAgcHVibGljIGZpbmFsIFNwYWNlIGdldFNwYWNlKCkgeyByZXR1cm4gc3BhY2U7IH0KLQotICAvKioKLSAgICogUHJpbnQgb3V0IHRoZSBzdGF0dXMgb2YgdGhlIGFsbG9jYXRvciAoZm9yIGRlYnVnZ2luZykKLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNob3coKSB7Ci0gICAgTG9nLndyaXRlKCJjdXJzb3IgPSAiKTsgTG9nLndyaXRlKGN1cnNvcik7Ci0gICAgTG9nLndyaXRlKCIgbGltaXQgPSAiKTsgTG9nLndyaXRlbG4obGltaXQpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvYWxsb2MvTGFyZ2VPYmplY3RBbGxvY2F0b3IuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9hbGxvYy9MYXJnZU9iamVjdEFsbG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTM5OWU5Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9hbGxvYy9MYXJnZU9iamVjdEFsbG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5LmFsbG9jOwotCi1pbXBvcnQgb3JnLm1tdGsucG9saWN5LkJhc2VMYXJnZU9iamVjdFNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgaW1wbGVtZW50cyBjb3JlIGZ1bmN0aW9uYWxpdHkgZm9yIGEgZ2VuZXJpYwotICogbGFyZ2Ugb2JqZWN0IGFsbG9jYXRvci4gVGhlIHNoYXJlZCBWTVJlc291cmNlIHVzZWQgYnkgZWFjaCBpbnN0YW5jZQotICogaXMgdGhlIHBvaW50IG9mIGdsb2JhbCBzeW5jaHJvbml6YXRpb24sIGFuZCBzeW5jaHJvbml6YXRpb24gb25seQotICogb2NjdXJzIGF0IHRoZSBncmFudWxhcml0eSBvZiBhcXVpcmluZyAoYW5kIHJlbGVhc2luZykgY2h1bmtzIG9mCi0gKiBtZW1vcnkgZnJvbSB0aGUgVk1SZXNvdXJjZS4gIFN1YmNsYXNzZXMgbWF5IHJlcXVpcmUgZmluZXIgZ3JhaW5lZAotICogc3luY2hyb25pemF0aW9uIGR1cmluZyBhIG1hcmtpbmcgcGhhc2UsIGZvciBleGFtcGxlLjxwPgotICoKLSAqIFRoaXMgaXMgYSBmaXJzdCBjdXQgaW1wbGVtZW50YXRpb24sIHdpdGggcGxlbnR5IG9mIHJvb20gZm9yCi0gKiBpbXByb3ZlbWVudC4uLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGFyZ2VPYmplY3RBbGxvY2F0b3IgZXh0ZW5kcyBBbGxvY2F0b3IgaW1wbGVtZW50cyBDb25zdGFudHMgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluc3RhbmNlIHZhcmlhYmxlcwotICAgKi8KLSAgcHJvdGVjdGVkIGZpbmFsIEJhc2VMYXJnZU9iamVjdFNwYWNlIHNwYWNlOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluaXRpYWxpemF0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKgotICAgKiBAcGFyYW0gc3BhY2UgVGhlIHNwYWNlIHdpdGggd2hpY2ggdGhpcyBsYXJnZSBvYmplY3QgYWxsb2NhdG9yCi0gICAqIHdpbGwgYmUgYXNzb2NpYXRlZC4KLSAgICovCi0gIHB1YmxpYyBMYXJnZU9iamVjdEFsbG9jYXRvcihCYXNlTGFyZ2VPYmplY3RTcGFjZSBzcGFjZSkgewotICAgIHRoaXMuc3BhY2UgPSBzcGFjZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHNwYWNlIHRoaXMgYWxsb2NhdG9yIGlzIGN1cnJlbnRseSBib3VuZCB0by4KLSAgICoKLSAgICogQHJldHVybiBUaGUgU3BhY2UuCi0gICAqLwotICBwcm90ZWN0ZWQgZmluYWwgQmFzZUxhcmdlT2JqZWN0U3BhY2UgZ2V0U3BhY2UoKSB7Ci0gICAgcmV0dXJuIHRoaXMuc3BhY2U7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBBbGxvY2F0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBBbGxvY2F0ZSBzcGFjZSBmb3IgYW4gb2JqZWN0Ci0gICAqCi0gICAqIEBwYXJhbSBieXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZAotICAgKiBAcGFyYW0gYWxpZ24gVGhlIHJlcXVlc3RlZCBhbGlnbm1lbnQuCi0gICAqIEBwYXJhbSBvZmZzZXQgVGhlIGFsaWdubWVudCBvZmZzZXQuCi0gICAqIEByZXR1cm4gVGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGFsbG9jYXRlZCBjZWxsIFdpbGwKLSAgICogbm90IHJldHVybiB6ZXJvLgotICAgKi8KLSAgQE5vSW5saW5lCi0gIHB1YmxpYyBmaW5hbCBBZGRyZXNzIGFsbG9jKGludCBieXRlcywgaW50IGFsaWduLCBpbnQgb2Zmc2V0KSB7Ci0gICAgQWRkcmVzcyBjZWxsID0gYWxsb2NTbG93KGJ5dGVzLCBhbGlnbiwgb2Zmc2V0KTsKLSAgICByZXR1cm4gYWxpZ25BbGxvY2F0aW9uKGNlbGwsIGFsaWduLCBvZmZzZXQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFsbG9jYXRlIGEgbGFyZ2Ugb2JqZWN0LiAgTGFyZ2Ugb2JqZWN0cyBhcmUgZGlyZWN0bHkgYWxsb2N0ZWQgYW5kCi0gICAqIGZyZWVkIGluIHBhZ2UtZ3JhaW5lZCB1bml0cyB2aWEgdGhlIHZtIHJlc291cmNlLiAgVGhpcyByb3V0aW5lCi0gICAqIHJldHVybmVkIHplcm9lZCBtZW1vcnkuCi0gICAqCi0gICAqIEBwYXJhbSBieXRlcyBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGlzIHNwYWNlIGluIGJ5dGVzLgotICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBhbGlnbm1lbnQgb2Zmc2V0LgotICAgKiBAcGFyYW0gYWxpZ24gVGhlIHJlcXVlc3RlZCBhbGlnbm1lbnQuCi0gICAqIEByZXR1cm4gVGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBuZXdseSBhbGxvY2F0ZWQgcmVnaW9uIGF0Ci0gICAqIGxlYXN0IDxjb2RlPmJ5dGVzPC9jb2RlPiBieXRlcyBpbiBzaXplLgotICAgKi8KLSAgcHJvdGVjdGVkIGZpbmFsIEFkZHJlc3MgYWxsb2NTbG93T25jZShpbnQgYnl0ZXMsIGludCBhbGlnbiwgaW50IG9mZnNldCkgewotICAgIGludCBoZWFkZXIgPSBzcGFjZS5nZXRIZWFkZXJTaXplKCk7Ci0gICAgaW50IG1heGJ5dGVzID0gZ2V0TWF4aW11bUFsaWduZWRTaXplKGJ5dGVzICsgaGVhZGVyLCBhbGlnbik7Ci0gICAgaW50IHBhZ2VzID0gKG1heGJ5dGVzICsgQllURVNfSU5fUEFHRSAtIDEpID4+IExPR19CWVRFU19JTl9QQUdFOwotICAgIEFkZHJlc3Mgc3AgPSBzcGFjZS5hY3F1aXJlKHBhZ2VzKTsKLSAgICBpZiAoc3AuaXNaZXJvKCkpIHJldHVybiBzcDsKLSAgICBBZGRyZXNzIGNlbGwgPSBzcC5wbHVzKGhlYWRlcik7Ci0gICAgcmV0dXJuIGNlbGw7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBNaXNjZWxsYW5lb3VzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzaG93KCkgewotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9hbGxvYy9MaW5lYXJTY2FuLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvYWxsb2MvTGluZWFyU2Nhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDZiNWYxLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9hbGxvYy9MaW5lYXJTY2FuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5hbGxvYzsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBDYWxsYmFja3MgZnJvbSBCdW1wUG9pbnRlciBkdXJpbmcgYSBsaW5lYXIgc2NhbiBhcmUgZGlzcGF0Y2hlZCB0aHJvdWdoCi0gKiBhIHN1YmNsYXNzIG9mIHRoaXMgb2JqZWN0LgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGluZWFyU2NhbiB7Ci0gIC8qKgotICAgKiBTY2FuIGFuIG9iamVjdC4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIHNjYW4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNjYW4oT2JqZWN0UmVmZXJlbmNlIG9iamVjdCk7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvYWxsb2MvU2VncmVnYXRlZEZyZWVMaXN0LmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvYWxsb2MvU2VncmVnYXRlZEZyZWVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZTNkMjAuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2FsbG9jL1NlZ3JlZ2F0ZWRGcmVlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5LmFsbG9jOwotCi1pbXBvcnQgb3JnLm1tdGsucG9saWN5LlNlZ3JlZ2F0ZWRGcmVlTGlzdFNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuKjsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIGltcGxlbWVudHMgdGhlIGZhc3QgcGFzdCBmb3IgYSBzZWdyZWdhdGVkIGZyZWUgbGlzdC4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlZ3JlZ2F0ZWRGcmVlTGlzdDxTIGV4dGVuZHMgU2VncmVnYXRlZEZyZWVMaXN0U3BhY2U+IGV4dGVuZHMgQWxsb2NhdG9yIGltcGxlbWVudHMgQ29uc3RhbnRzIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbnN0YW5jZSB2YXJpYWJsZXMKLSAgICovCi0KLSAgLyoqIFRoZSBzcGFjZSAqLwotICBwcm90ZWN0ZWQgZmluYWwgUyBzcGFjZTsKLQotICAvKiogVGhlIGN1cnJlbnQgZnJlZSBsaXN0cyBmb3IgdGhlIHNpemUgY2xhc3NlcyAqLwotICBwcm90ZWN0ZWQgZmluYWwgQWRkcmVzc0FycmF5IGZyZWVMaXN0OwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluaXRpYWxpemF0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKgotICAgKiBAcGFyYW0gc3BhY2UgVGhlIHNwYWNlIHdpdGggd2hpY2ggdGhpcyBhbGxvY2F0b3Igd2lsbCBiZSBhc3NvY2lhdGVkCi0gICAqLwotICBwdWJsaWMgU2VncmVnYXRlZEZyZWVMaXN0KFMgc3BhY2UpIHsKLSAgICB0aGlzLnNwYWNlID0gc3BhY2U7Ci0gICAgdGhpcy5mcmVlTGlzdCA9IEFkZHJlc3NBcnJheS5jcmVhdGUoc2l6ZUNsYXNzQ291bnQoKSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBzcGFjZSB0aGlzIGFsbG9jYXRvciBpcyBjdXJyZW50bHkgYm91bmQgdG8uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIFNwYWNlLgotICAgKi8KLSAgcHJvdGVjdGVkIGZpbmFsIFMgZ2V0U3BhY2UoKSB7Ci0gICAgcmV0dXJuIHRoaXMuc3BhY2U7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBBbGxvY2F0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBBbGxvY2F0ZSA8Y29kZT5ieXRlczwvY29kZT4gY29udGlndW91cyBieXRlcyBvZiB6ZXJvZWQgbWVtb3J5LjxwPgotICAgKgotICAgKiBUaGlzIGNvZGUgaW1wbGVtZW50cyB0aGUgZmFzdCBwYXRoLCBhbmQgb24gZmFpbHVyZSBkZWxlZ2F0ZXMgdG8gdGhlIHNsb3cgcGF0aC4KLSAgICoKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBzaXplIG9mIHRoZSBvYmplY3QgdG8gb2NjdXB5IHRoaXMgc3BhY2UsIGluIGJ5dGVzLgotICAgKiBAcGFyYW0gYWxpZ24gVGhlIHJlcXVlc3RlZCBhbGlnbm1lbnQuCi0gICAqIEBwYXJhbSBvZmZzZXQgVGhlIGFsaWdubWVudCBvZmZzZXQuCi0gICAqIEByZXR1cm4gVGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHdvcmQgb3IgemVybyBvbiBmYWlsdXJlCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBmaW5hbCBBZGRyZXNzIGFsbG9jKGludCBieXRlcywgaW50IGFsaWduLCBpbnQgb2Zmc2V0KSB7Ci0gICAgaW50IGFsaWduZWRCeXRlcyA9IGdldE1heGltdW1BbGlnbmVkU2l6ZShieXRlcywgYWxpZ24pOwotICAgIGludCBzaXplQ2xhc3MgPSBnZXRTaXplQ2xhc3MoYWxpZ25lZEJ5dGVzKTsKLSAgICBBZGRyZXNzIGNlbGwgPSBmcmVlTGlzdC5nZXQoc2l6ZUNsYXNzKTsKLSAgICBpZiAoIWNlbGwuaXNaZXJvKCkpIHsKLSAgICAgIGZyZWVMaXN0LnNldChzaXplQ2xhc3MsIGNlbGwubG9hZEFkZHJlc3MoKSk7Ci0gICAgICAvKiBDbGVhciB0aGUgZnJlZSBsaXN0IGxpbmsgKi8KLSAgICAgIGNlbGwuc3RvcmUoQWRkcmVzcy56ZXJvKCkpOwotICAgICAgaWYgKGFsaWduZWRCeXRlcyAhPSBieXRlcykgewotICAgICAgICAvKiBFbnN1cmUgYWxpZ25lZCBhcyByZXF1ZXN0ZWQuICovCi0gICAgICAgIGNlbGwgPSBhbGlnbkFsbG9jYXRpb24oY2VsbCwgYWxpZ24sIG9mZnNldCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gY2VsbDsKLSAgICB9Ci0gICAgcmV0dXJuIGFsbG9jU2xvdyhieXRlcywgYWxpZ24sIG9mZnNldCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBzaXplIGNsYXNzZXMuCi0gICAqCi0gICAqIE5PVEU6IEZvciBvcHRpbWFsIHBlcmZvcm1hbmNlIHRoaXMgY2FsbCBtdXN0IGJlIGltcGxlbWVudGVkIGluIGEgd2F5Ci0gICAqIGl0IGNhbiBiZSBpbmxpbmVkIGFuZCBvcHRpbWl6ZWQgd2l0aGluIHRoZSBhbGxvY2F0aW9uIHNlcXVlbmNlLgotICAgKi8KLSAgQElubGluZQotICBwcml2YXRlIGludCBzaXplQ2xhc3NDb3VudCgpIHsKLSAgICByZXR1cm4gU2VncmVnYXRlZEZyZWVMaXN0U3BhY2Uuc2l6ZUNsYXNzQ291bnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHNpemUgY2xhc3MgZm9yIGEgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLgotICAgKgotICAgKiBOT1RFOiBGb3Igb3B0aW1hbCBwZXJmb3JtYW5jZSB0aGlzIGNhbGwgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBhIHdheQotICAgKiBpdCBjYW4gYmUgaW5saW5lZCBhbmQgb3B0aW1pemVkIHdpdGhpbiB0aGUgYWxsb2NhdGlvbiBzZXF1ZW5jZS4KLSAgICoKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gYWNjb21tb2RhdGUgdGhlIG9iamVjdAotICAgKiBAcmV0dXJuIFRoZSBzaXplIGNsYXNzIGNhcGFibGUgb2YgYWNjb21tb2RhdGluZyB0aGUgYWxsb2NhdGlvbiByZXF1ZXN0LgotICAgKi8KLSAgQElubGluZQotICBwcml2YXRlIGludCBnZXRTaXplQ2xhc3MoaW50IGJ5dGVzKSB7Ci0gICAgcmV0dXJuIHNwYWNlLmdldFNpemVDbGFzcyhieXRlcyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9hbGxvYy9TZWdyZWdhdGVkRnJlZUxpc3RMb2NhbC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2FsbG9jL1NlZ3JlZ2F0ZWRGcmVlTGlzdExvY2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZmQ5NjQuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2FsbG9jL1NlZ3JlZ2F0ZWRGcmVlTGlzdExvY2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkuYWxsb2M7Ci0KLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU2VncmVnYXRlZEZyZWVMaXN0U3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS4qOwotCi1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpbXBsZW1lbnRzIGEgc2ltcGxlIHNlZ3JlZ2F0ZWQgZnJlZSBsaXN0LjxwPgotICoKLSAqIFNlZTogV2lsc29uLCBKb2huc3RvbmUsIE5lZWx5IGFuZCBCb2xlcyAiRHluYW1pYyBTdG9yYWdlCi0gKiBBbGxvY2F0aW9uOiBBIFN1cnZleSBhbmQgQ3JpdGljYWwgUmV2aWV3IiwgSVdNTSAxOTk1LCBmb3IgYW4KLSAqIG92ZXJ2aWV3IG9mIGZyZWUgbGlzdCBhbGxvY2F0aW9uIGFuZCB0aGUgdmFyaW91cyBpbXBsZW1lbnRhdGlvbgotICogc3RyYXRlZ2llcywgaW5jbHVkaW5nIHNlZ3JlZ2F0ZWQgZnJlZSBsaXN0cy48cD4KLSAqCi0gKiBXZSBtYWludGFpbiBhIG51bWJlciBvZiBzaXplIGNsYXNzZXMsIGVhY2ggc2l6ZSBjbGFzcyBoYXZpbmcgYSBmcmVlCi0gKiBsaXN0IG9mIGF2YWlsYWJsZSBvYmplY3RzIG9mIHRoYXQgc2l6ZSAodGhlIGxpc3QgbWF5IGJlIGVtcHR5KS4gIFdlCi0gKiBjYWxsIHRoZSBzdG9yYWdlIGVsZW1lbnRzICJjZWxscyIuICBDZWxscyByZXNpZGUgd2l0aGluIGNodW5rcyBvZgotICogbWVtb3J5IGNhbGxlZCAiYmxvY2tzIi4gIEFsbCBjZWxscyBpbiBhIGdpdmVuIGJsb2NrIGFyZSBvZiB0aGUgc2FtZQotICogc2l6ZSAoaS5lLiBibG9ja3MgYXJlIGhvbW9nZW5lb3VzIHdpdGggcmVzcGVjdCB0byBzaXplIGNsYXNzKS4KLSAqIEVhY2ggYmxvY2sgbWFpbnRhaW5zIGl0cyBvd24gZnJlZSBsaXN0IChmcmVlIGNlbGxzIHdpdGhpbiB0aGF0Ci0gKiBibG9jaykuICBGb3IgZWFjaCBzaXplIGNsYXNzIGEgbGlzdCBvZiBibG9ja3MgaXMgbWFpbnRhaW5lZCwgb25lIG9mCi0gKiB3aGljaCB3aWxsIHNlcnZlIHRoZSByb2xlIG9mIHRoZSBjdXJyZW50IGZyZWUgbGlzdC4gIFdoZW4gdGhlIGZyZWUKLSAqIGxpc3Qgb24gdGhlIGN1cnJlbnQgYmxvY2sgaXMgZXhoYXVzdGVkLCB0aGUgbmV4dCBibG9jayBmb3IgdGhhdAotICogc2l6ZSBjbGFzcyBiZWNvbWVzIHRoZSBjdXJyZW50IGJsb2NrIGFuZCBpdHMgZnJlZSBsaXN0IGlzIHVzZWQuICBJZgotICogdGhlcmUgYXJlIG5vIG1vcmUgYmxvY2tzIHRoZSBhIG5ldyBibG9jayBpcyBhbGxvY2F0ZWQuPHA+Ci0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZWdyZWdhdGVkRnJlZUxpc3RMb2NhbDxTIGV4dGVuZHMgU2VncmVnYXRlZEZyZWVMaXN0U3BhY2U+IGV4dGVuZHMgU2VncmVnYXRlZEZyZWVMaXN0PFM+Ci0gIGltcGxlbWVudHMgQ29uc3RhbnRzIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDbGFzcyB2YXJpYWJsZXMKLSAgICovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5zdGFuY2UgdmFyaWFibGVzCi0gICAqLwotICBwcm90ZWN0ZWQgZmluYWwgQWRkcmVzc0FycmF5IGN1cnJlbnRCbG9jazsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbml0aWFsaXphdGlvbgotICAgKi8KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIHNwYWNlIFRoZSBzcGFjZSB3aXRoIHdoaWNoIHRoaXMgYWxsb2NhdG9yIHdpbGwgYmUgYXNzb2NpYXRlZAotICAgKi8KLSAgcHVibGljIFNlZ3JlZ2F0ZWRGcmVlTGlzdExvY2FsKFMgc3BhY2UpIHsKLSAgICBzdXBlcihzcGFjZSk7Ci0gICAgdGhpcy5jdXJyZW50QmxvY2sgPSBBZGRyZXNzQXJyYXkuY3JlYXRlKHNwYWNlLnNpemVDbGFzc0NvdW50KCkpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQWxsb2NhdGlvbgotICAgKi8KLQotICAvKioKLSAgICogQWxsb2NhdGUgPGNvZGU+Ynl0ZXM8L2NvZGU+IGNvbnRpZ3VvdXMgYnl0ZXMgb2Ygbm9uLXplcm9lZAotICAgKiBtZW1vcnkuICBGaXJzdCBjaGVjayBpZiB0aGUgZmFzdCBwYXRoIHdvcmtzLiAgVGhpcyBpcyBuZWVkZWQKLSAgICogc2luY2UgdGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBpbiB0aGUgY29udGV4dCB3aGVuIHRoZSBmYXN0Ci0gICAqIHZlcnNpb24gd2FzIE5PVCBqdXN0IGNhbGxlZC4gIElmIHRoaXMgZmFpbHMsIGl0IHdpbGwgdHJ5IGZpbmRpbmcKLSAgICogYW5vdGhlciBibG9jayB3aXRoIGEgbm9uLWVtcHR5IGZyZWUgbGlzdCwgb3IgYWxsb2NhdGluZyBhIG5ldwotICAgKiBibG9jay48cD4KLSAgICoKLSAgICogVGhpcyBjb2RlIHNob3VsZCBiZSByZWxhdGl2ZWx5IGluZnJlcXVlbnRseSBleGVjdXRlZCwgc28gaXQgaXMKLSAgICogZm9yY2VkIG91dCBvZiBsaW5lIHRvIHJlZHVjZSBwcmVzc3VyZSBvbiB0aGUgY29tcGlsYXRpb24gb2YgdGhlCi0gICAqIGNvcmUgYWxsb2Mgcm91dGluZS48cD4KLSAgICoKLSAgICogUHJlY29uZGl0aW9uOiBOb25lCi0gICAqCi0gICAqIFBvc3Rjb25kaXRpb25zOiBBIG5ldyBjZWxsIGhhcyBiZWVuIGFsbG9jYXRlZCAobm90IHplcm9lZCksIGFuZAotICAgKiB0aGUgYmxvY2sgY29udGFpbmluZyB0aGUgY2VsbCBoYXMgYmVlbiBwbGFjZWQgb24gdGhlIGFwcHJvcHJpYXRlCi0gICAqIGZyZWUgbGlzdCBkYXRhIHN0cnVjdHVyZXMuICBUaGUgZnJlZSBsaXN0IGl0c2VsZiBpcyBub3QgdXBkYXRlZAotICAgKiAodGhlIGNhbGxlciBtdXN0IGRvIHNvKS48cD4KLSAgICoKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBzaXplIG9mIHRoZSBvYmplY3QgdG8gb2NjdXB5IHRoaXMgc3BhY2UsIGluIGJ5dGVzLgotICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBhbGlnbm1lbnQgb2Zmc2V0LgotICAgKiBAcGFyYW0gYWxpZ24gVGhlIHJlcXVlc3RlZCBhbGlnbm1lbnQuCi0gICAqIEByZXR1cm4gVGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHdvcmQgb3IgemVybyBvbiBmYWlsdXJlLgotICAgKi8KLSAgQE5vSW5saW5lCi0gIHB1YmxpYyBmaW5hbCBBZGRyZXNzIGFsbG9jU2xvd09uY2UoaW50IGJ5dGVzLCBpbnQgYWxpZ24sIGludCBvZmZzZXQpIHsKLSAgICAvLyBEaWQgYSBjb2xsZWN0aW9uIG9jY3VyIGFuZCBwcm92aWRlIGEgZnJlZSBjZWxsPwotICAgIGJ5dGVzID0gZ2V0TWF4aW11bUFsaWduZWRTaXplKGJ5dGVzLCBhbGlnbik7Ci0gICAgaW50IHNpemVDbGFzcyA9IHNwYWNlLmdldFNpemVDbGFzcyhieXRlcyk7Ci0gICAgQWRkcmVzcyBjZWxsID0gZnJlZUxpc3QuZ2V0KHNpemVDbGFzcyk7Ci0KLSAgICBpZiAoY2VsbC5pc1plcm8oKSkgewotICAgICAgQWRkcmVzcyBibG9jayA9IGN1cnJlbnRCbG9jay5nZXQoc2l6ZUNsYXNzKTsKLSAgICAgIGlmICghYmxvY2suaXNaZXJvKCkpIHsKLSAgICAgICAgLy8gUmV0dXJuIHRoZSBibG9jayBpZiB3ZSBjdXJyZW50bHkgb3duIG9uZQotICAgICAgICBzcGFjZS5yZXR1cm5Db25zdW1lZEJsb2NrKGJsb2NrLCBzaXplQ2xhc3MpOwotICAgICAgICBjdXJyZW50QmxvY2suc2V0KHNpemVDbGFzcywgQWRkcmVzcy56ZXJvKCkpOwotICAgICAgfQotCi0gICAgICAvLyBHZXQgYSBuZXcgYmxvY2sgZm9yIGFsbG9jYXRpb24sIGlmIHJldHVybmVkLCBpdCBpcyBndWFyYW50ZWVkIHRvIGhhdmUgYSBmcmVlIGNlbGwKLSAgICAgIGJsb2NrID0gc3BhY2UuZ2V0QWxsb2NhdGlvbkJsb2NrKHNpemVDbGFzcywgZnJlZUxpc3QpOwotCi0gICAgICBpZiAoIWJsb2NrLmlzWmVybygpKSB7Ci0gICAgICAgIC8vIFdlIGhhdmUgYSBuZXcgY3VycmVudCBibG9jayBhbmQgZnJlZSBsaXN0LgotICAgICAgICBjdXJyZW50QmxvY2suc2V0KHNpemVDbGFzcywgYmxvY2spOwotICAgICAgICBjZWxsID0gZnJlZUxpc3QuZ2V0KHNpemVDbGFzcyk7Ci0gICAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KCFjZWxsLmlzWmVybygpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEFsbG9jYXRpb24gRmFpbHVyZQotICAgICAgICByZXR1cm4gQWRkcmVzcy56ZXJvKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZnJlZUxpc3Quc2V0KHNpemVDbGFzcywgY2VsbC5sb2FkQWRkcmVzcygpKTsKLSAgICAvKiBDbGVhciB0aGUgZnJlZSBsaXN0IGxpbmsgKi8KLSAgICBjZWxsLnN0b3JlKEFkZHJlc3MuemVybygpKTsKLSAgICByZXR1cm4gYWxpZ25BbGxvY2F0aW9uKGNlbGwsIGFsaWduLCBvZmZzZXQpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogUHJlc2VydmluZyAoc2F2aW5nICYgcmVzdG9yaW5nKSBmcmVlIGxpc3RzCi0gICAqLwotCi0gIC8qKgotICAgKiBaZXJvIGFsbCBvZiB0aGUgY3VycmVudCBmcmVlIGxpc3QgcG9pbnRlcnMsIGFuZCByZWZyZXNoIHRoZQotICAgKiA8Y29kZT5jdXJyZW50QmxvY2s8L2NvZGU+IHZhbHVlcywgc28gaW5zdGVhZCBvZiB0aGUgZnJlZSBsaXN0Ci0gICAqIHBvaW50aW5nIHRvIGZyZWUgY2VsbHMsIGl0IHBvaW50cyB0byB0aGUgYmxvY2sgY29udGFpbmluZyB0aGUKLSAgICogZnJlZSBjZWxscy4gIFRoZW4gdGhlIGZyZWUgbGlzdHMgZm9yIGVhY2ggY2VsbCBjYW4gYmUKLSAgICogcmVlc3RhYmxpc2hlZCBkdXJpbmcgR0MuICBJZiB0aGUgZnJlZSBsaXN0cyBhcmUgYmVpbmcgcHJlc2VydmVkCi0gICAqIG9uIGEgcGVyLWJsb2NrIGJhc2lzIChlYWdlciBtYXJrLXN3ZWVwIGFuZCByZWZlcmVuY2UgY291bnRpbmcpLAotICAgKiB0aGVuIGZyZWUgbGlzdHMgYXJlIHJlbWVtYmVyZWQgZm9yIGVhY2ggYmxvY2suCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCBmbHVzaCgpIHsKLSAgICBmb3IgKGludCBzaXplQ2xhc3MgPSAwOyBzaXplQ2xhc3MgPCBzcGFjZS5zaXplQ2xhc3NDb3VudCgpOyBzaXplQ2xhc3MrKykgewotICAgICAgQWRkcmVzcyBibG9jayA9IGN1cnJlbnRCbG9jay5nZXQoc2l6ZUNsYXNzKTsKLSAgICAgIGlmICghYmxvY2suaXNaZXJvKCkpIHsKLSAgICAgICAgQWRkcmVzcyBjZWxsID0gZnJlZUxpc3QuZ2V0KHNpemVDbGFzcyk7Ci0gICAgICAgIHNwYWNlLnJldHVybkJsb2NrKGJsb2NrLCBzaXplQ2xhc3MsIGNlbGwpOwotICAgICAgICBjdXJyZW50QmxvY2suc2V0KHNpemVDbGFzcywgQWRkcmVzcy56ZXJvKCkpOwotICAgICAgICBmcmVlTGlzdC5zZXQoc2l6ZUNsYXNzLCBBZGRyZXNzLnplcm8oKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZGVxdWUvQWRkcmVzc0RlcXVlLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZGVxdWUvQWRkcmVzc0RlcXVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZDg1ZGIuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2RlcXVlL0FkZHJlc3NEZXF1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5LmRlcXVlOwotCi1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Db25zdGFudHM7Ci0KLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBUaGlzIHN1cHBvcnRzIDxpPnVuc3luY2hyb25pemVkPC9pPiBlbnF1ZXVpbmcgYW5kIGRlcXVldWluZyBvZiBhZGRyZXNzZXMKLSAqLwotQFVuaW50ZXJydXB0aWJsZSBwdWJsaWMgY2xhc3MgQWRkcmVzc0RlcXVlIGV4dGVuZHMgTG9jYWxEZXF1ZQotICBpbXBsZW1lbnRzIENvbnN0YW50cyB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogUHVibGljIGluc3RhbmNlIG1ldGhvZHMKLSAgICovCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgbmFtZTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIHF1ZXVlIFRoZSBzaGFyZWQgcXVldWUgdG8gd2hpY2ggdGhpcyBxdWV1ZSB3aWxsIGFwcGVuZAotICAgKiBpdHMgYnVmZmVycyAod2hlbiBmdWxsIG9yIGZsdXNoZWQpIGFuZCBmcm9tIHdoaWNoIGl0IHdpbGwgYXF1aXJlIG5ldwotICAgKiBidWZmZXJzIHdoZW4gaXQgaGFzIGV4aGF1c3RlZCBpdHMgb3duLgotICAgKi8KLSAgcHVibGljIEFkZHJlc3NEZXF1ZShTdHJpbmcgbiwgU2hhcmVkRGVxdWUgcXVldWUpIHsKLSAgICBzdXBlcihxdWV1ZSk7Ci0gICAgbmFtZSA9IG47Ci0gIH0KLQotICAvKioKLSAgICogSW5zZXJ0IGFuIGFkZHJlc3MgaW50byB0aGUgYWRkcmVzcyBxdWV1ZS4KLSAgICoKLSAgICogQHBhcmFtIGFkZHIgdGhlIGFkZHJlc3MgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgYWRkcmVzcyBxdWV1ZQotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgdm9pZCBpbnNlcnQoQWRkcmVzcyBhZGRyKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoIWFkZHIuaXNaZXJvKCkpOwotICAgIGNoZWNrVGFpbEluc2VydCgxKTsKLSAgICB1bmNoZWNrZWRUYWlsSW5zZXJ0KGFkZHIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluc2VydCBhbiBhZGRyZXNzIGludG8gdGhlIGFkZHJlc3MgcXVldWUsIGZvcmNlIHRoaXMgb3V0IG9mIGxpbmUKLSAgICogKCJPT0wiKSwgaW4gc29tZSBjaXJjdW1zdG5hY2VzIGl0IGlzIHRvbyBleHBlbnNpdmUgdG8gaGF2ZSB0aGUKLSAgICogaW5zZXJ0IGlubGluZWQsIHNvIHRoaXMgY2FsbCBpcyBtYWRlLgotICAgKgotICAgKiBAcGFyYW0gYWRkciB0aGUgYWRkcmVzcyB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBhZGRyZXNzIHF1ZXVlCi0gICAqLwotICBATm9JbmxpbmUKLSAgcHVibGljIGZpbmFsIHZvaWQgaW5zZXJ0T09MKEFkZHJlc3MgYWRkcikgewotICAgIGluc2VydChhZGRyKTsKLSAgfQotCi0gIC8qKgotICAgKiBQdXNoIGFuIGFkZHJlc3Mgb250byB0aGUgYWRkcmVzcyBxdWV1ZS4KLSAgICoKLSAgICogQHBhcmFtIGFkZHIgdGhlIGFkZHJlc3MgdG8gYmUgcHVzaGVkIG9udG8gdGhlIGFkZHJlc3MgcXVldWUKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGZpbmFsIHZvaWQgcHVzaChBZGRyZXNzIGFkZHIpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCghYWRkci5pc1plcm8oKSk7Ci0gICAgY2hlY2tIZWFkSW5zZXJ0KDEpOwotICAgIHVuY2hlY2tlZEhlYWRJbnNlcnQoYWRkcik7Ci0gIH0KLQotICAvKioKLSAgICogUHVzaCBhbiBhZGRyZXNzIG9udG8gdGhlIGFkZHJlc3MgcXVldWUsIGZvcmNlIHRoaXMgb3V0IG9mIGxpbmUKLSAgICogKCJPT0wiKSwgaW4gc29tZSBjaXJjdW1zdG5hY2VzIGl0IGlzIHRvbyBleHBlbnNpdmUgdG8gaGF2ZSB0aGUKLSAgICogcHVzaCBpbmxpbmVkLCBzbyB0aGlzIGNhbGwgaXMgbWFkZS4KLSAgICoKLSAgICogQHBhcmFtIGFkZHIgdGhlIGFkZHJlc3MgdG8gYmUgcHVzaGVkIG9udG8gdGhlIGFkZHJlc3MgcXVldWUKLSAgICovCi0gIEBOb0lubGluZQotICBwdWJsaWMgZmluYWwgdm9pZCBwdXNoT09MKEFkZHJlc3MgYWRkcikgewotICAgIHB1c2goYWRkcik7Ci0gIH0KLQotICAvKioKLSAgICogUG9wIGFuIGFkZHJlc3MgZnJvbSB0aGUgYWRkcmVzcyBxdWV1ZSwgcmV0dXJuIHplcm8gaWYgdGhlIHF1ZXVlCi0gICAqIGlzIGVtcHR5LgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBuZXh0IGFkZHJlc3MgaW4gdGhlIGFkZHJlc3MgcXVldWUsIG9yIHplcm8gaWYgdGhlCi0gICAqIHF1ZXVlIGlzIGVtcHR5Ci0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBmaW5hbCBBZGRyZXNzIHBvcCgpIHsKLSAgICBpZiAoY2hlY2tEZXF1ZXVlKDEpKSB7Ci0gICAgICByZXR1cm4gdW5jaGVja2VkRGVxdWV1ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gQWRkcmVzcy56ZXJvKCk7Ci0gICAgfQotICB9Ci0KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgIHJldHVybiAhY2hlY2tEZXF1ZXVlKDEpOwotICB9Ci0KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc05vbkVtcHR5KCkgewotICAgIHJldHVybiBjaGVja0RlcXVldWUoMSk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2RlcXVlL0FkZHJlc3NQYWlyRGVxdWUuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9kZXF1ZS9BZGRyZXNzUGFpckRlcXVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMzUwMGUuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2RlcXVlL0FkZHJlc3NQYWlyRGVxdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5LmRlcXVlOwotCi1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Db25zdGFudHM7Ci0KLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBUaGlzIHN1cHBvcnRzIDxpPnVuc3luY2hyb25pemVkPC9pPiBlbnF1ZXVpbmcgYW5kIGRlcXVldWluZyBvZgotICogYWRkcmVzcyBwYWlycwotICovCi1AVW5pbnRlcnJ1cHRpYmxlIHB1YmxpYyBjbGFzcyBBZGRyZXNzUGFpckRlcXVlIGV4dGVuZHMgTG9jYWxEZXF1ZSBpbXBsZW1lbnRzIENvbnN0YW50cyB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogUHVibGljIGluc3RhbmNlIG1ldGhvZHMKLSAgICovCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSBxdWV1ZSBUaGUgc2hhcmVkIHF1ZXVlIHRvIHdoaWNoIHRoaXMgcXVldWUgd2lsbCBhcHBlbmQKLSAgICogaXRzIGJ1ZmZlcnMgKHdoZW4gZnVsbCBvciBmbHVzaGVkKSBhbmQgZnJvbSB3aGljaCBpdCB3aWxsIGFxdWlyZSBuZXcKLSAgICogYnVmZmVycyB3aGVuIGl0IGhhcyBleGhhdXN0ZWQgaXRzIG93bi4KLSAgICovCi0gIHB1YmxpYyBBZGRyZXNzUGFpckRlcXVlKFNoYXJlZERlcXVlIHF1ZXVlKSB7Ci0gICAgc3VwZXIocXVldWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluc2VydCBhbiBhZGRyZXNzIHBhaXIgaW50byB0aGUgYWRkcmVzcyBxdWV1ZS4KLSAgICoKLSAgICogQHBhcmFtIGFkZHIxIHRoZSBmaXJzdCBhZGRyZXNzIHRvIGJlIGluc2VydGVkIGludG8gdGhlIGFkZHJlc3MgcXVldWUKLSAgICogQHBhcmFtIGFkZHIyIHRoZSBzZWNvbmQgYWRkcmVzcyB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBhZGRyZXNzIHF1ZXVlCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCBpbnNlcnQoQWRkcmVzcyBhZGRyMSwgQWRkcmVzcyBhZGRyMikgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KCFhZGRyMS5pc1plcm8oKSk7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoIWFkZHIyLmlzWmVybygpKTsKLSAgICBjaGVja1RhaWxJbnNlcnQoMik7Ci0gICAgdW5jaGVja2VkVGFpbEluc2VydChhZGRyMSk7Ci0gICAgdW5jaGVja2VkVGFpbEluc2VydChhZGRyMik7Ci0gIH0KLQotICAvKioKLSAgICogUHVzaCBhbiBhZGRyZXNzIHBhaXIgb250byB0aGUgYWRkcmVzcyBxdWV1ZS4KLSAgICoKLSAgICogQHBhcmFtIGFkZHIxIHRoZSBmaXJzdCB2YWx1ZSB0byBiZSBwdXNoZWQgb250byB0aGUgYWRkcmVzcyBxdWV1ZQotICAgKiBAcGFyYW0gYWRkcjIgdGhlIHNlY29uZCB2YWx1ZSB0byBiZSBwdXNoZWQgb250byB0aGUgYWRkcmVzcyBxdWV1ZQotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgcHVzaChBZGRyZXNzIGFkZHIxLCBBZGRyZXNzIGFkZHIyKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoIWFkZHIxLmlzWmVybygpKTsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCghYWRkcjIuaXNaZXJvKCkpOwotICAgIGNoZWNrSGVhZEluc2VydCgyKTsKLSAgICB1bmNoZWNrZWRIZWFkSW5zZXJ0KGFkZHIyKTsKLSAgICB1bmNoZWNrZWRIZWFkSW5zZXJ0KGFkZHIxKTsKLSAgfQotCi0gIC8qKgotICAgKiBQb3AgdGhlIGZpcnN0IGFkZHJlc3MgaW4gYSBwYWlyIGZyb20gdGhlIGFkZHJlc3MgcXVldWUsIHJldHVybgotICAgKiB6ZXJvIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbmV4dCBhZGRyZXNzIGluIHRoZSBhZGRyZXNzIHF1ZXVlLCBvciB6ZXJvIGlmIHRoZQotICAgKiBxdWV1ZSBpcyBlbXB0eQotICAgKi8KLSAgcHVibGljIGZpbmFsIEFkZHJlc3MgcG9wMSgpIHsKLSAgICBpZiAoY2hlY2tEZXF1ZXVlKDIpKQotICAgICAgcmV0dXJuIHVuY2hlY2tlZERlcXVldWUoKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gQWRkcmVzcy56ZXJvKCk7Ci0gIH0KLQotICAvKioKLSAgICogUG9wIHRoZSBzZWNvbmQgYWRkcmVzcyBpbiBhIHBhaXIgZnJvbSB0aGUgYWRkcmVzcyBxdWV1ZS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbmV4dCBhZGRyZXNzIGluIHRoZSBhZGRyZXNzIHF1ZXVlCi0gICAqLwotICBwdWJsaWMgZmluYWwgQWRkcmVzcyBwb3AyKCkgewotICAgIHJldHVybiB1bmNoZWNrZWREZXF1ZXVlKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgIHJldHVybiAhY2hlY2tEZXF1ZXVlKDIpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZGVxdWUvQWRkcmVzc1RyaXBsZURlcXVlLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZGVxdWUvQWRkcmVzc1RyaXBsZURlcXVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2Y2I4OTkuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2RlcXVlL0FkZHJlc3NUcmlwbGVEZXF1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5LmRlcXVlOwotCi1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Db25zdGFudHM7Ci0KLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuVW5pbnRlcnJ1cHRpYmxlOwotCi0KLS8qKgotICogVGhpcyBzdXBwb3J0cyA8aT51bnN5bmNocm9uaXplZDwvaT4gZW5xdWV1aW5nIGFuZCBkZXF1ZXVpbmcgb2YKLSAqIGFkZHJlc3MgdHJpcGxlcwotICovCi1AVW5pbnRlcnJ1cHRpYmxlIHB1YmxpYyBjbGFzcyBBZGRyZXNzVHJpcGxlRGVxdWUgZXh0ZW5kcyBMb2NhbERlcXVlIGltcGxlbWVudHMgQ29uc3RhbnRzIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBQdWJsaWMgaW5zdGFuY2UgbWV0aG9kcwotICAgKi8KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIHF1ZXVlIFRoZSBzaGFyZWQgcXVldWUgdG8gd2hpY2ggdGhpcyBxdWV1ZSB3aWxsIGFwcGVuZCBpdHMKLSAgICogYnVmZmVycyAod2hlbiBmdWxsIG9yIGZsdXNoZWQpIGFuZCBmcm9tIHdoaWNoIGl0IHdpbGwgYXF1aXJlIG5ldwotICAgKiBidWZmZXJzIHdoZW4gaXQgaGFzIGV4aGF1c3RlZCBpdHMgb3duLgotICAgKi8KLSAgQWRkcmVzc1RyaXBsZURlcXVlKFNoYXJlZERlcXVlIHF1ZXVlKSB7Ci0gICAgc3VwZXIocXVldWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluc2VydCBhbiBhZGRyZXNzIHRyaXBsZSBpbnRvIHRoZSBhZGRyZXNzIHF1ZXVlLgotICAgKgotICAgKiBAcGFyYW0gYWRkcjEgdGhlIGZpcnN0IGFkZHJlc3MgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgYWRkcmVzcyBxdWV1ZQotICAgKiBAcGFyYW0gYWRkcjIgdGhlIHNlY29uZCBhZGRyZXNzIHRvIGJlIGluc2VydGVkIGludG8gdGhlIGFkZHJlc3MgcXVldWUKLSAgICogQHBhcmFtIGFkZHIzIHRoZSB0aGlyZCBhZGRyZXNzIHRvIGJlIGluc2VydGVkIGludG8gdGhlIGFkZHJlc3MgcXVldWUKLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGluc2VydChBZGRyZXNzIGFkZHIxLCBBZGRyZXNzIGFkZHIyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBhZGRyMykgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KCFhZGRyMS5pc1plcm8oKSk7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoIWFkZHIyLmlzWmVybygpKTsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCghYWRkcjMuaXNaZXJvKCkpOwotICAgIGNoZWNrVGFpbEluc2VydCgzKTsKLSAgICB1bmNoZWNrZWRUYWlsSW5zZXJ0KGFkZHIxKTsKLSAgICB1bmNoZWNrZWRUYWlsSW5zZXJ0KGFkZHIyKTsKLSAgICB1bmNoZWNrZWRUYWlsSW5zZXJ0KGFkZHIzKTsKLSAgfQotICAvKioKLSAgICogUHVzaCBhbiBhZGRyZXNzIHBhaXIgb250byB0aGUgYWRkcmVzcyBxdWV1ZS4KLSAgICoKLSAgICogQHBhcmFtIGFkZHIxIHRoZSBmaXJzdCB2YWx1ZSB0byBiZSBwdXNoZWQgb250byB0aGUgYWRkcmVzcyBxdWV1ZQotICAgKiBAcGFyYW0gYWRkcjIgdGhlIHNlY29uZCB2YWx1ZSB0byBiZSBwdXNoZWQgb250byB0aGUgYWRkcmVzcyBxdWV1ZQotICAgKiBAcGFyYW0gYWRkcjMgdGhlIHRoaXJkIGFkZHJlc3MgdG8gYmUgcHVzaGVkIG9udG8gdGhlIGFkZHJlc3MgcXVldWUKLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHB1c2goQWRkcmVzcyBhZGRyMSwgQWRkcmVzcyBhZGRyMiwgQWRkcmVzcyBhZGRyMykgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KCFhZGRyMS5pc1plcm8oKSk7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoIWFkZHIyLmlzWmVybygpKTsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCghYWRkcjMuaXNaZXJvKCkpOwotICAgIGNoZWNrSGVhZEluc2VydCgzKTsKLSAgICB1bmNoZWNrZWRIZWFkSW5zZXJ0KGFkZHIzKTsKLSAgICB1bmNoZWNrZWRIZWFkSW5zZXJ0KGFkZHIyKTsKLSAgICB1bmNoZWNrZWRIZWFkSW5zZXJ0KGFkZHIxKTsKLSAgfQotCi0gIC8qKgotICAgKiBQb3AgdGhlIGZpcnN0IGFkZHJlc3MgaW4gYSB0cmlwbGUgZnJvbSB0aGUgYWRkcmVzcyBxdWV1ZSwgcmV0dXJuCi0gICAqIHplcm8gaWYgdGhlIHF1ZXVlIGlzIGVtcHR5LgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBuZXh0IGFkZHJlc3MgaW4gdGhlIGFkZHJlc3MgcXVldWUsIG9yIHplcm8gaWYgdGhlCi0gICAqIHF1ZXVlIGlzIGVtcHR5Ci0gICAqLwotICBwdWJsaWMgZmluYWwgQWRkcmVzcyBwb3AxKCkgewotICAgIGlmIChjaGVja0RlcXVldWUoMykpCi0gICAgICByZXR1cm4gdW5jaGVja2VkRGVxdWV1ZSgpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBBZGRyZXNzLnplcm8oKTsKLSAgfQotCi0gIC8qKgotICAgKiBQb3AgdGhlIHNlY29uZCBhZGRyZXNzIGluIGEgdHJpcGxlIGZyb20gdGhlIGFkZHJlc3MgcXVldWUuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG5leHQgYWRkcmVzcyBpbiB0aGUgYWRkcmVzcyBxdWV1ZQotICAgKi8KLSAgcHVibGljIGZpbmFsIEFkZHJlc3MgcG9wMigpIHsKLSAgICByZXR1cm4gdW5jaGVja2VkRGVxdWV1ZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogUG9wIHRoZSB0aGlyZCBhZGRyZXNzIGluIGEgdHJpcGxlIGZyb20gdGhlIGFkZHJlc3MgcXVldWUuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG5leHQgYWRkcmVzcyBpbiB0aGUgYWRkcmVzcyBxdWV1ZQotICAgKi8KLSAgcHVibGljIGZpbmFsIEFkZHJlc3MgcG9wMygpIHsKLSAgICByZXR1cm4gdW5jaGVja2VkRGVxdWV1ZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZGVxdWUvRGVxdWUuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9kZXF1ZS9EZXF1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDE3YzMwLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9kZXF1ZS9EZXF1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkuZGVxdWU7Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkNvbnN0YW50czsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBDbGFzcyB0aGF0IGRlZmluZXMgYSBkb3VibHktbGlua2VkIGRvdWJsZS1lbmRlZCBxdWV1ZSAoZGVxdWUpLiBUaGUKLSAqIGRvdWJsZS1saW5raW5nIGluY3JlYXNlcyB0aGUgc3BhY2UgZGVtYW5kcyBzbGlnaHRseSwgYnV0IG1ha2VzIGl0IGZhcgotICogbW9yZSBlZmZpY2llbnQgdG8gZGVxdWV1ZSBidWZmZXJzIGFuZCwgZm9yIGV4YW1wbGUsIGVuYWJsZXMgc29ydGluZyBvZgotICogaXRzIGNvbnRlbnRzLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlIGNsYXNzIERlcXVlIGltcGxlbWVudHMgQ29uc3RhbnRzIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBQcm90ZWN0ZWQgaW5zdGFuY2UgbWV0aG9kcwotICAgKgotICAgKiBwcm90ZWN0ZWQgaW50IGVucXVldWVkOwotICAgKi8KLQotICBASW5saW5lCi0gIHByb3RlY3RlZCBmaW5hbCBPZmZzZXQgYnVmZmVyT2Zmc2V0KEFkZHJlc3MgYnVmKSB7Ci0gICAgcmV0dXJuIGJ1Zi50b1dvcmQoKS5hbmQoQlVGRkVSX01BU0spLnRvT2Zmc2V0KCk7Ci0gIH0KLSAgQElubGluZQotICBwcm90ZWN0ZWQgZmluYWwgQWRkcmVzcyBidWZmZXJTdGFydChBZGRyZXNzIGJ1ZikgewotICAgIHJldHVybiBidWYudG9Xb3JkKCkuYW5kKEJVRkZFUl9NQVNLLm5vdCgpKS50b0FkZHJlc3MoKTsKLSAgfQotICBASW5saW5lCi0gIHByb3RlY3RlZCBmaW5hbCBBZGRyZXNzIGJ1ZmZlckVuZChBZGRyZXNzIGJ1ZikgewotICAgIHJldHVybiBidWZmZXJTdGFydChidWYpLnBsdXMoVVNBQkxFX0JVRkZFUl9CWVRFUyk7Ci0gIH0KLSAgQElubGluZQotICBwcm90ZWN0ZWQgZmluYWwgQWRkcmVzcyBidWZmZXJGaXJzdChBZGRyZXNzIGJ1ZikgewotICAgIHJldHVybiBidWZmZXJTdGFydChidWYpOwotICB9Ci0gIEBJbmxpbmUKLSAgcHJvdGVjdGVkIGZpbmFsIEFkZHJlc3MgYnVmZmVyTGFzdChBZGRyZXNzIGJ1ZiwgaW50IGFyaXR5KSB7Ci0gICAgcmV0dXJuIGJ1ZmZlclN0YXJ0KGJ1ZikucGx1cyhidWZmZXJMYXN0T2Zmc2V0KGFyaXR5KSk7Ci0gIH0KLSAgQElubGluZQotICBwcm90ZWN0ZWQgZmluYWwgQWRkcmVzcyBidWZmZXJMYXN0KEFkZHJlc3MgYnVmKSB7Ci0gICAgcmV0dXJuIGJ1ZmZlckxhc3QoYnVmLCAxKTsKLSAgfQotICBASW5saW5lCi0gIHByb3RlY3RlZCBmaW5hbCBPZmZzZXQgYnVmZmVyTGFzdE9mZnNldChpbnQgYXJpdHkpIHsKLSAgICByZXR1cm4gT2Zmc2V0LmZyb21JbnRaZXJvRXh0ZW5kKFVTQUJMRV9CVUZGRVJfQllURVMgLSBCWVRFU19JTl9BRERSRVNTIC0KLSAgICAgICAgKFVTQUJMRV9CVUZGRVJfQllURVMgJSAoYXJpdHkgPDwgTE9HX0JZVEVTX0lOX0FERFJFU1MpKSk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBQcml2YXRlIGFuZCBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZpZWxkcyAoYWthIGNvbnN0YW50cykKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IExPR19QQUdFU19QRVJfQlVGRkVSID0gMDsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUEFHRVNfUEVSX0JVRkZFUiA9IDEgPDwgTE9HX1BBR0VTX1BFUl9CVUZGRVI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0dfQlVGRkVSX1NJWkUgPSAoTE9HX0JZVEVTX0lOX1BBR0UgKyBMT0dfUEFHRVNfUEVSX0JVRkZFUik7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gMSA8PCBMT0dfQlVGRkVSX1NJWkU7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgV29yZCBCVUZGRVJfTUFTSyA9IFdvcmQub25lKCkubHNoKExPR19CVUZGRVJfU0laRSkubWludXMoV29yZC5vbmUoKSk7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE5FWFRfRklFTERfT0ZGU0VUID0gQllURVNfSU5fQUREUkVTUzsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUVUQV9EQVRBX1NJWkUgPSAyICogQllURVNfSU5fQUREUkVTUzsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVVNBQkxFX0JVRkZFUl9CWVRFUyA9IEJVRkZFUl9TSVpFIC0gTUVUQV9EQVRBX1NJWkU7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgQWRkcmVzcyBUQUlMX0lOSVRJQUxfVkFMVUUgPSBBZGRyZXNzLnplcm8oKTsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBBZGRyZXNzIEhFQURfSU5JVElBTF9WQUxVRSA9IEFkZHJlc3MuemVybygpOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2RlcXVlL0xvY2FsRGVxdWUuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9kZXF1ZS9Mb2NhbERlcXVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYTE0NzcuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2RlcXVlL0xvY2FsRGVxdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5kZXF1ZTsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uUGxhbjsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkNvbnN0YW50czsKLQotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIE5vdGUgdGhpcyBtYXkgcGVyZm9ybSBwb29ybHkgd2hlbiBiZWluZyB1c2VkIGFzIGEgRklGTyBzdHJ1Y3R1cmUgd2l0aAotICogaW5zZXJ0SGVhZCBhbmQgcG9wIG9wZXJhdGlvbnMgb3BlcmF0aW5nIG9uIHRoZSBzYW1lIGJ1ZmZlci4gIFRoaXMKLSAqIG9ubHkgdXNlcyB0aGUgZmllbGRzIGluaGVyaXRlZCBmcm9tIDxjb2RlPkxvY2FsUXVldWU8L2NvZGU+LCBidXQgYWRkcwotICogdGhlIGFiaWxpdHkgZm9yIGVudHJpZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGhlYWQgb2YgdGhlIGRlcXVlIGFuZCBwb3BwZWQKLSAqIGZyb20gdGhlIHJlYXIuCi0gKi8KLUBVbmludGVycnVwdGlibGUgcHVibGljIGNsYXNzIExvY2FsRGVxdWUgZXh0ZW5kcyBMb2NhbFF1ZXVlCi0gIGltcGxlbWVudHMgQ29uc3RhbnRzIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBQdWJsaWMgaW5zdGFuY2UgbWV0aG9kcwotICAgKi8KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIHF1ZXVlIFRoZSBzaGFyZWQgZGVxdWUgdG8gd2hpY2ggdGhpcyBsb2NhbCBkZXF1ZSB3aWxsIGFwcGVuZAotICAgKiBpdHMgYnVmZmVycyAod2hlbiBmdWxsIG9yIGZsdXNoZWQpLgotICAgKi8KLSAgTG9jYWxEZXF1ZShTaGFyZWREZXF1ZSBxdWV1ZSkgewotICAgIHN1cGVyKHF1ZXVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBGbHVzaCB0aGUgYnVmZmVyIHRvIHRoZSBzaGFyZWQgZGVxdWUgKHRoaXMgd2lsbCBtYWtlIGFueSBlbnRyaWVzCi0gICAqIGluIHRoZSBidWZmZXIgdmlzaWJsZSB0byBhbnkgb3RoZXIgY29uc3VtZXIgYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgKiBzaGFyZWQgZGVxdWUpLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGZsdXNoTG9jYWwoKSB7Ci0gICAgc3VwZXIuZmx1c2hMb2NhbCgpOwotICAgIGlmIChoZWFkLk5FKERlcXVlLkhFQURfSU5JVElBTF9WQUxVRSkpIHsKLSAgICAgIGNsb3NlQW5kSW5zZXJ0SGVhZChxdWV1ZS5nZXRBcml0eSgpKTsKLSAgICAgIGhlYWQgPSBEZXF1ZS5IRUFEX0lOSVRJQUxfVkFMVUU7Ci0gICAgfQotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogUHJvdGVjdGVkIGluc3RhbmNlIG1ldGhvZHMKLSAgICovCi0KLSAgLyoqCi0gICAqIENoZWNrIHdoZXRoZXIgdGhlcmUgaXMgc3BhY2UgaW4gdGhlIGJ1ZmZlciBmb3IgYSBwZW5kaW5nIGluc2VydC4KLSAgICogSWYgdGhlcmUgaXMgbm90IHN1ZmZpY2llbnQgc3BhY2UsIGFsbG9jYXRlIGEgbmV3IGJ1ZmZlcgotICAgKiAoZGlzcGF0Y2hpbmcgdGhlIGZ1bGwgYnVmZmVyIHRvIHRoZSBzaGFyZWQgZGVxdWUgaWYgbm90IG51bGwpLgotICAgKgotICAgKiBAcGFyYW0gYXJpdHkgVGhlIGFyaXR5IG9mIHRoZSB2YWx1ZXMgc3RvcmVkIGluIHRoaXMgZGVxdWU6IHRoZQotICAgKiBidWZmZXIgbXVzdCBjb250YWluIGVub3VnaCBzcGFjZSBmb3IgdGhpcyBtYW55IHdvcmRzLgotICAgKi8KLSAgQElubGluZQotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBjaGVja0hlYWRJbnNlcnQoaW50IGFyaXR5KSB7Ci0gICAgaWYgKGJ1ZmZlck9mZnNldChoZWFkKS5FUShidWZmZXJTZW50aW5lbChhcml0eSkpIHx8Ci0gICAgICAgIGhlYWQuRVEoSEVBRF9JTklUSUFMX1ZBTFVFKSkKLSAgICAgIGhlYWRPdmVyZmxvdyhhcml0eSk7Ci0gICAgZWxzZSBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChidWZmZXJPZmZzZXQoaGVhZCkuc0xFKGJ1ZmZlckxhc3RPZmZzZXQoYXJpdHkpKSk7Ci0gIH0KLQotICAvKioKLSAgICogSW5zZXJ0IGEgdmFsdWUgYXQgdGhlIGZyb250IG9mIHRoZSBkZXF1ZSAoYW5kIGJ1ZmZlcikuICBUaGlzIGlzCi0gICAqIDxpPnVuY2hlY2tlZDwvaT4uICBUaGUgY2FsbGVyIG11c3QgZmlyc3QgY2FsbAotICAgKiA8Y29kZT5jaGVja0hlYWRJbnNlcnQoKTwvY29kZT4gdG8gZW5zdXJlIHRoZSBidWZmZXIgY2FuIGFjY29tbW9kYXRlCi0gICAqIHRoZSBpbnNlcnRpb24uCi0gICAqCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYmUgaW5zZXJ0ZWQuCi0gICAqLwotICBASW5saW5lCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIHVuY2hlY2tlZEhlYWRJbnNlcnQoQWRkcmVzcyB2YWx1ZSkgewotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoYnVmZmVyT2Zmc2V0KGhlYWQpLnNMVChidWZmZXJTZW50aW5lbChxdWV1ZS5nZXRBcml0eSgpKSkpOwotICAgIGhlYWQuc3RvcmUodmFsdWUpOwotICAgIGhlYWQgPSBoZWFkLnBsdXMoQllURVNfSU5fQUREUkVTUyk7Ci0gICAgLy8gaWYgKEludGVyZmFjZS5WZXJpZnlBc3NlcnRpb25zKSBlbnF1ZXVlZCsrOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogUHJpdmF0ZSBpbnN0YW5jZSBtZXRob2RzIGFuZCBmaWVsZHMKLSAgICovCi0KLSAgLyoqCi0gICAqIEJ1ZmZlciBzcGFjZSBoYXMgYmVlbiBleGhhdXN0ZWQsIGFsbG9jYXRlIGEgbmV3IGJ1ZmZlciBhbmQgZW5xdWV1ZQotICAgKiB0aGUgZXhpc3RpbmcgYnVmZmVyIChpZiBhbnkpLgotICAgKgotICAgKiBAcGFyYW0gYXJpdHkgVGhlIGFyaXR5IG9mIHRoaXMgYnVmZmVyICh1c2VkIGZvciBzYW5pdHkgdGVzdCBvbmx5KS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBoZWFkT3ZlcmZsb3coaW50IGFyaXR5KSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoYXJpdHkgPT0gcXVldWUuZ2V0QXJpdHkoKSk7Ci0gICAgaWYgKGhlYWQuTkUoRGVxdWUuSEVBRF9JTklUSUFMX1ZBTFVFKSkKLSAgICAgIGNsb3NlQW5kSW5zZXJ0SGVhZChhcml0eSk7Ci0KLSAgICBoZWFkID0gcXVldWUuYWxsb2MoKTsKLSAgICBQbGFuLmNoZWNrRm9yQXN5bmNDb2xsZWN0aW9uKCk7IC8vIHBvc3NpYmxlIHNpZGUtZWZmZWN0IG9mIGFsbG9jKCkKLSAgfQotCi0gIC8qKgotICAgKiBDbG9zZSB0aGUgaGVhZCBidWZmZXIgYW5kIGVucXVldWUgaXQgYXQgdGhlIGZyb250IG9mIHRoZQotICAgKiBzaGFyZWQgYnVmZmVyIGRlcXVlLgotICAgKgotICAgKiAgQHBhcmFtIGFyaXR5IFRoZSBhcml0eSBvZiB0aGlzIGJ1ZmZlci4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSB2b2lkIGNsb3NlQW5kSW5zZXJ0SGVhZChpbnQgYXJpdHkpIHsKLSAgICBxdWV1ZS5lbnF1ZXVlKGhlYWQsIGFyaXR5LCBmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIHRhaWwgaXMgZW1wdHkgKG9yIG51bGwpLCBhbmQgdGhlIHNoYXJlZCBkZXF1ZSBoYXMgbm8gYnVmZmVycwotICAgKiBhdmFpbGFibGUuICBJZiB0aGUgaGVhZCBoYXMgc3VmZmljaWVudCBlbnRyaWVzLCBjb25zdW1lIHRoZSBoZWFkLgotICAgKiBPdGhlcndpc2UgdHJ5IHdhaXQgb24gdGhlIHNoYXJlZCBkZXF1ZSB1bnRpbCBlaXRoZXIgYWxsIG90aGVyCi0gICAqIGNsaWVudHMgb2YgdGhlIHJlYWNoIGV4aGF1c3Rpb24gb3IgYSBidWZmZXIgYmVjb21lcwotICAgKiBhdmFpbGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBhcml0eSBUaGUgYXJpdHkgb2YgdGhpcyBidWZmZXIKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBjb25zdW1lciBoYXMgZWF0ZW4gYWxsIG9mIHRoZSBlbnRyaWVzCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgcHJpdmF0ZSBib29sZWFuIHRhaWxTdGFydmVkKGludCBhcml0eSkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGFyaXR5ID09IHF1ZXVlLmdldEFyaXR5KCkpOwotICAgIC8vIGVudHJpZXMgaW4gdGFpbCwgc28gY29uc3VtZSB0YWlsCi0gICAgaWYgKCFidWZmZXJPZmZzZXQoaGVhZCkuaXNaZXJvKCkpIHsKLSAgICAgIHRhaWxCdWZmZXJFbmQgPSBoZWFkOwotICAgICAgdGFpbCA9IGJ1ZmZlclN0YXJ0KHRhaWxCdWZmZXJFbmQpOwotICAgICAgaGVhZCA9IERlcXVlLkhFQURfSU5JVElBTF9WQUxVRTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBXYWl0IGZvciBhbm90aGVyIGVudHJ5IHRvIG1hdGVyaWFsaXplLi4uCi0gICAgdGFpbEJ1ZmZlckVuZCA9IHF1ZXVlLmRlcXVldWVBbmRXYWl0KGFyaXR5LCB0cnVlKTsKLSAgICB0YWlsID0gYnVmZmVyU3RhcnQodGFpbCk7Ci0KLSAgICAvLyByZXR1cm4gdHJ1ZSBpZiBhKSB0aGVyZSBpcyBub3QgYSB0YWlsIGJ1ZmZlciBvciBiKSBpdCBpcyBlbXB0eQotICAgIHJldHVybiAodGFpbC5FUShEZXF1ZS5UQUlMX0lOSVRJQUxfVkFMVUUpIHx8IHRhaWwuRVEodGFpbEJ1ZmZlckVuZCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZGVxdWUvTG9jYWxRdWV1ZS5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2RlcXVlL0xvY2FsUXVldWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRjNDgyNS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZGVxdWUvTG9jYWxRdWV1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5LmRlcXVlOwotCi1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Db25zdGFudHM7Ci0KLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBsb2NhbCAoPGk+dW5zeW5jaHJvbml6ZWQ8L2k+KSBxdWV1ZS4KLSAqIEEgcXVldWUgaXMgc3RyaWN0bHkgRklGTy48cD4KLSAqCi0gKiBFYWNoIGluc3RhbmNlIHN0b3JlcyB3b3JkLXNpemVkIHZhbHVlcyBpbnRvIGEgbG9jYWwgYnVmZmVyLiAgV2hlbgotICogdGhlIGJ1ZmZlciBpcyBmdWxsLCBvciBpZiB0aGUgPGNvZGU+Zmx1c2hMb2NhbCgpPC9jb2RlPiBtZXRob2QgaXMKLSAqIGNhbGxlZCwgdGhlIGJ1ZmZlciBlbnF1ZXVlZCBhdCB0aGUgdGFpbCBvZiBhCi0gKiA8Y29kZT5TaGFyZWREZXF1ZTwvY29kZT4uCi0gKgotICogVGhlIGltcGxlbWVudGF0aW9uIGlzIGludGVuZGVkIHRvIGJlIGFzIGVmZmljaWVudCBhcyBwb3NzaWJsZSwgaW4KLSAqIHRpbWUgYW5kIHNwYWNlLCBhbmQgaXMgdGhlIGJhc2lzIGZvciB0aGUgPGNvZGU+VHJhY2VCdWZmZXI8L2NvZGU+IHVzZWQgYnkKLSAqIGhlYXAgdHJhY2UgZ2VuZXJhdGlvbi4gRWFjaCBpbnN0YW5jZSBhZGRzIGEgc2luZ2xlIGZpZWxkIHRvIHRob3NlIGluaGVyaXRlZAotICogZnJvbSB0aGUgU1NCOiBhIGJ1bXAgcG9pbnRlci4KLSAqCi0gKiBQcmVjb25kaXRpb25zOiBCdWZmZXJzIGFyZSBhbHdheXMgYWxpZ25lZCBvbiBidWZmZXItc2l6ZSBhZGRyZXNzCi0gKiBib3VuZGFyaWVzLjxwPgotICoKLSAqIEludmFyaWFudHM6IEJ1ZmZlcnMgYXJlIGZpbGxlZCBzdWNoIHRoYXQgdHVwbGVzIChvZiB0aGUgc3BlY2lmaWVkCi0gKiBhcml0eSkgYXJlIHBhY2tlZCB0byB0aGUgbG93IGVuZCBvZiB0aGUgYnVmZmVyLiAgVGh1cyBidWZmZXIKLSAqIHVuZGVyZmxvd3Mgd2lsbCBhbHdheXMgYXJpc2Ugd2hlbiB0aGVuIGN1cnNvciBpcyBidWZmZXItc2l6ZSBhbGlnbmVkLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlIGNsYXNzIExvY2FsUXVldWUgZXh0ZW5kcyBMb2NhbFNTQiBpbXBsZW1lbnRzIENvbnN0YW50cyB7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSBxdWV1ZSBUaGUgc2hhcmVkIHF1ZXVlIHRvIHdoaWNoIHRoaXMgbG9jYWwgc3NiIHdpbGwgYXBwZW5kCi0gICAqIGl0cyBidWZmZXJzICh3aGVuIGZ1bGwgb3IgZmx1c2hlZCkuCi0gICAqLwotICBMb2NhbFF1ZXVlKFNoYXJlZERlcXVlIHF1ZXVlKSB7Ci0gICAgc3VwZXIocXVldWUpOwotICB9Ci0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBQcm90ZWN0ZWQgaW5zdGFuY2UgbWV0aG9kcyBhbmQgZmllbGRzCi0gICAqLwotICBARW50cnlwb2ludAotICBwcm90ZWN0ZWQgQWRkcmVzcyBoZWFkOyAvLyB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlcgotCi0gIC8qKgotICAgKiBSZXNldCB0aGUgbG9jYWwgYnVmZmVyICh0aHJvd2luZyBhd2F5IGFueSBsb2NhbCBlbnRyaWVzKS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc2V0TG9jYWwoKSB7Ci0gICAgc3VwZXIucmVzZXRMb2NhbCgpOwotICAgIGhlYWQgPSBEZXF1ZS5IRUFEX0lOSVRJQUxfVkFMVUU7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2sgd2hldGhlciB0aGVyZSBhcmUgdmFsdWVzIGluIHRoZSBidWZmZXIgZm9yIGEgcGVuZGluZyBkZXF1ZXVlLgotICAgKiBJZiB0aGVyZSBpcyBub3QgZGF0YSwgZ3JhYiB0aGUgZmlyc3QgYnVmZmVyIG9uIHRoZSBzaGFyZWQgcXVldWUKLSAgICogKGFmdGVyIGZyZWVpbmcgdGhlIGJ1ZmZlcikuCi0gICAqCi0gICAqIEBwYXJhbSBhcml0eSBUaGUgYXJpdHkgb2YgdGhlIHZhbHVlcyBzdG9yZWQgaW4gdGhpcyBxdWV1ZTogdGhlCi0gICAqIGJ1ZmZlciBtdXN0IGNvbnRhaW4gZW5vdWdoIHNwYWNlIGZvciB0aGlzIG1hbnkgd29yZHMuCi0gICAqLwotICBASW5saW5lCi0gIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIGNoZWNrRGVxdWV1ZShpbnQgYXJpdHkpIHsKLSAgICBpZiAoYnVmZmVyT2Zmc2V0KGhlYWQpLmlzWmVybygpKSB7Ci0gICAgICByZXR1cm4gZGVxdWV1ZVVuZGVyZmxvdyhhcml0eSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGJ1ZmZlck9mZnNldChoZWFkKS5zR0UoV29yZC5mcm9tSW50WmVyb0V4dGVuZChhcml0eSkubHNoKExPR19CWVRFU19JTl9BRERSRVNTKS50b09mZnNldCgpKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogRGVxdWV1ZSBhIHZhbHVlIGZyb20gdGhlIGJ1ZmZlci4gIFRoaXMgaXMgPGk+dW5jaGVja2VkPC9pPi4gIFRoZQotICAgKiBjYWxsZXIgbXVzdCBmaXJzdCBjYWxsIDxjb2RlPmNoZWNrRGVxdWV1ZSgpPC9jb2RlPiB0byBlbnN1cmUgdGhlCi0gICAqIGJ1ZmZlciBoYXMgYW5kIGVudHJ5IHRvIGJlIHJlbW92ZWQuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGZpcnN0IGVudHJ5IG9uIHRoZSBxdWV1ZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHJvdGVjdGVkIGZpbmFsIEFkZHJlc3MgdW5jaGVja2VkRGVxdWV1ZSgpewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGJ1ZmZlck9mZnNldChoZWFkKS5zR0UoT2Zmc2V0LmZyb21JbnRaZXJvRXh0ZW5kKEJZVEVTX0lOX0FERFJFU1MpKSk7Ci0gICAgaGVhZCA9IGhlYWQubWludXMoQllURVNfSU5fQUREUkVTUyk7Ci0gICAgcmV0dXJuIGhlYWQubG9hZEFkZHJlc3MoKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgaGVhZCBpcyBlbXB0eSAob3IgbnVsbCksIGFuZCB0aGUgc2hhcmVkIHF1ZXVlIGhhcyBubyBidWZmZXJzCi0gICAqIGF2YWlsYWJsZS4gIElmIHRoZSB0YWlsIGhhcyBzdWZmaWNpZW50IGVudHJpZXMsIGNvbnN1bWUgdGhlIHRhaWwuCi0gICAqIE90aGVyd2lzZSB0cnkgd2FpdCBvbiB0aGUgZ2xvYmFsIHF1ZXVlIHVudGlsIGVpdGhlciBhbGwgb3RoZXIKLSAgICogY2xpZW50cyBvZiB0aGUgcXVldWUgcmVhY2ggZXhoYXVzdGlvbiBvciBhIGJ1ZmZlciBiZWNvbWVzCi0gICAqIGF2YWlsYWJsZS4KLSAgICoKLSAgICogQHBhcmFtIGFyaXR5IFRoZSBhcml0eSBvZiB0aGlzIGJ1ZmZlcgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNvbnN1bWVyIGhhcyBlYXRlbiBhbGwgdGhlIGVudHJpZXMKLSAgICovCi0gIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIGhlYWRTdGFydmVkKGludCBhcml0eSkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGFyaXR5ID09IHF1ZXVlLmdldEFyaXR5KCkpOwotCi0gICAgLy8gSWYgdGhlIHRhaWwgaGFzIGVudHJpZXMuLi4KLSAgICBpZiAodGFpbC5ORSh0YWlsQnVmZmVyRW5kKSkgewotICAgICAgaGVhZCA9IG5vcm1hbGl6ZVRhaWwoYXJpdHkpLnBsdXMoQllURVNfSU5fQUREUkVTUyk7Ci0gICAgICB0YWlsID0gRGVxdWUuVEFJTF9JTklUSUFMX1ZBTFVFOwotICAgICAgdGFpbEJ1ZmZlckVuZCA9IERlcXVlLlRBSUxfSU5JVElBTF9WQUxVRTsKLSAgICAgIC8vIFJldHVybiB0aGF0IHdlIGFjcXVpcmVkIG1vcmUgZW50cmllcwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAvLyBXYWl0IGZvciBhbm90aGVyIGVudHJ5IHRvIG1hdGVyaWFsaXplLi4uCi0gICAgaGVhZCA9IHF1ZXVlLmRlcXVldWVBbmRXYWl0KGFyaXR5KTsKLSAgICAvLyByZXR1cm4gdHJ1ZSBpZiBhKSB0aGVyZSBpcyBhIGhlYWQgYnVmZmVyLCBhbmQgYikgaXQgaXMgbm9uLWVtcHR5Ci0gICAgcmV0dXJuIChoZWFkLkVRKERlcXVlLkhFQURfSU5JVElBTF9WQUxVRSkgfHwgYnVmZmVyT2Zmc2V0KGhlYWQpLmlzWmVybygpKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIFByaXZhdGUgaW5zdGFuY2UgbWV0aG9kcwotICAgKi8KLQotICAvKioKLSAgICogVGhlcmUgYXJlIG5vdCBzdWZmaWNpZW50IGVudHJpZXMgaW4gdGhlIGhlYWQgYnVmZmVyIGZvciBhIHBlbmRpbmcKLSAgICogZGVxdWV1ZS4gIEFjcXVpcmUgYSBuZXcgaGVhZCBidWZmZXIuICBJZiB0aGUgc2hhcmVkIHF1ZXVlIGhhcyBubwotICAgKiBidWZmZXJzIGF2YWlsYWJsZSwgY29uc3VtZSB0aGUgdGFpbCBpZiBuZWNlc3NhcnkuICBSZXR1cm4gZmFsc2UKLSAgICogaWYgZW50cmllcyBjYW5ub3QgYmUgYWNxdWlyZWQuCi0gICAqCi0gICAqIEBwYXJhbSBhcml0eSBUaGUgYXJpdHkgb2YgdGhpcyBidWZmZXIgKHVzZWQgZm9yIHNhbml0eSB0ZXN0IG9ubHkpLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlcmUgdGhlIGhlYWQgYnVmZmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseQotICAgKiByZXBsZW5pc2hlZC4KLSAgICovCi0gIEBOb0lubGluZQotICBwcml2YXRlIGJvb2xlYW4gZGVxdWV1ZVVuZGVyZmxvdyhpbnQgYXJpdHkpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChhcml0eSA9PSBxdWV1ZS5nZXRBcml0eSgpKTsKLSAgICBkbyB7Ci0gICAgICBpZiAoaGVhZC5ORShEZXF1ZS5IRUFEX0lOSVRJQUxfVkFMVUUpKQotICAgICAgICBxdWV1ZS5mcmVlKGhlYWQpOwotICAgICAgaGVhZCA9IHF1ZXVlLmRlcXVldWUoYXJpdHkpOwotICAgIH0gd2hpbGUgKGhlYWQuTkUoRGVxdWUuSEVBRF9JTklUSUFMX1ZBTFVFKSAmJiBidWZmZXJPZmZzZXQoaGVhZCkuaXNaZXJvKCkpOwotCi0gICAgaWYgKGhlYWQuRVEoRGVxdWUuSEVBRF9JTklUSUFMX1ZBTFVFKSkKLSAgICAgIHJldHVybiAhaGVhZFN0YXJ2ZWQoYXJpdHkpOwotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9kZXF1ZS9Mb2NhbFNTQi5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2RlcXVlL0xvY2FsU1NCLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYTA0ZjEuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2RlcXVlL0xvY2FsU1NCLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkuZGVxdWU7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlBsYW47Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Db25zdGFudHM7Ci0KLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBsb2NhbCAoPGk+dW5zeW5jaHJvbml6ZWQ8L2k+KSBzZXF1ZW50aWFsCi0gKiBzdG9yZSBidWZmZXIuICBBbiBTU0IgaXMgc3RyaWN0bHkgRklGTyAoYWx0aG91Z2ggdGhpcyBjbGFzcyBkb2VzCi0gKiBub3QgaW1wbGVtZW50IGRlcXVldWluZykuPHA+Ci0gKgotICogRWFjaCBpbnN0YW5jZSBzdG9yZXMgd29yZC1zaXplZCB2YWx1ZXMgaW50byBhIGxvY2FsIGJ1ZmZlci4gIFdoZW4KLSAqIHRoZSBidWZmZXIgaXMgZnVsbCwgb3IgaWYgdGhlIDxjb2RlPmZsdXNoTG9jYWwoKTwvY29kZT4gbWV0aG9kIGlzCi0gKiBjYWxsZWQsIHRoZSBidWZmZXIgZW5xdWV1ZWQgYXQgdGhlIHRhaWwgb2YgYQotICogPGNvZGU+U2hhcmVkRGVxdWU8L2NvZGU+LiAgVGhpcyBjbGFzcyBwcm92aWRlcyBubyBtZWNoYW5pc20gZm9yCi0gKiBkZXF1ZWluZy48cD4KLSAqCi0gKiBUaGUgaW1wbGVtZW50YXRpb24gaXMgaW50ZW5kZWQgdG8gYmUgYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlLCBpbgotICogdGltZSBhbmQgc3BhY2UsIGFzIGl0IGlzIHVzZWQgaW4gY3JpdGljYWwgY29kZSBzdWNoIGFzIHRoZSBHQyB3b3JrCi0gKiBxdWV1ZSBhbmQgdGhlIHdyaXRlIGJ1ZmZlciB1c2VkIGJ5IG1hbnkgInJlbWVtYmVyaW5nIgotICogY29sbGVjdG9ycy4gRWFjaCBpbnN0YW5jZSBoYXMganVzdCB0d28gZmllbGRzOiBhIGJ1bXAgcG9pbnRlciBhbmQgYQotICogcG9pbnRlciB0byB0aGUgPGNvZGU+U2hhcmVkRGVxdWU8L2NvZGU+PHA+Ci0gKgotICogUHJlY29uZGl0aW9uczogQnVmZmVycyBhcmUgYWx3YXlzIGFsaWduZWQgb24gYnVmZmVyLXNpemUgYWRkcmVzcwotICogYm91bmRhcmllcy48cD4KLSAqCi0gKiBJbnZhcmlhbnRzOiBCdWZmZXJzIGFyZSBmaWxsZWQgc3VjaCB0aGF0IHR1cGxlcyAob2YgdGhlIHNwZWNpZmllZAotICogYXJpdHkpIGFyZSBwYWNrZWQgdG8gdGhlIGxvdyBlbmQgb2YgdGhlIGJ1ZmZlci4gIFRodXMgYnVmZmVyCi0gKiBvdmVyZmxvd3Mgb24gaW5zZXJ0cyBhbmQgcG9wcyAodW5kZXJmbG93IGFjdHVhbGx5KSB3aWxsIGFsd2F5cyBhcmlzZQotICogd2hlbiB0aGVuIGN1cnNvciBpcyBidWZmZXItc2l6ZSBhbGlnbmVkLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlIGNsYXNzIExvY2FsU1NCIGV4dGVuZHMgRGVxdWUgaW1wbGVtZW50cyBDb25zdGFudHMgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIFB1YmxpYyBpbnN0YW5jZSBtZXRob2RzCi0gICAqLwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKgotICAgKiBAcGFyYW0gcXVldWUgVGhlIHNoYXJlZCBxdWV1ZSB0byB3aGljaCB0aGlzIGxvY2FsIHNzYiB3aWxsIGFwcGVuZAotICAgKiBpdHMgYnVmZmVycyAod2hlbiBmdWxsIG9yIGZsdXNoZWQpLgotICAgKi8KLSAgTG9jYWxTU0IoU2hhcmVkRGVxdWUgcXVldWUpIHsKLSAgICB0aGlzLnF1ZXVlID0gcXVldWU7Ci0gICAgcmVzZXRMb2NhbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZsdXNoIHRoZSBidWZmZXIgYW5kIGFkZCBpdCB0byB0aGUgc2hhcmVkIHF1ZXVlICh0aGlzIHdpbGwKLSAgICogbWFrZSBhbnkgZW50cmllcyBpbiB0aGUgYnVmZmVyIHZpc2libGUgdG8gYW55IGNvbnN1bWVyIGFzc29jaWF0ZWQKLSAgICogd2l0aCB0aGUgc2hhcmVkIHF1ZXVlKS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGZsdXNoTG9jYWwoKSB7Ci0gICAgaWYgKHRhaWwuTkUoRGVxdWUuVEFJTF9JTklUSUFMX1ZBTFVFKSkgewotICAgICAgY2xvc2VBbmRFbnF1ZXVlVGFpbChxdWV1ZS5nZXRBcml0eSgpKTsKLSAgICAgIHRhaWwgPSBEZXF1ZS5UQUlMX0lOSVRJQUxfVkFMVUU7Ci0gICAgICB0YWlsQnVmZmVyRW5kID0gRGVxdWUuVEFJTF9JTklUSUFMX1ZBTFVFOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgIHJlc2V0TG9jYWwoKTsKLSAgfQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogUHJvdGVjdGVkIGluc3RhbmNlIG1ldGhvZHMgYW5kIGZpZWxkcwotICAgKi8KLSAgQEVudHJ5cG9pbnQKLSAgcHJvdGVjdGVkIEFkZHJlc3MgdGFpbDsgLy8gdGhlIGxvY2F0aW9uIGluIHRoZSBidWZmZXIKLSAgcHJvdGVjdGVkIEFkZHJlc3MgdGFpbEJ1ZmZlckVuZDsgLy8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyCi0gIHByb3RlY3RlZCBmaW5hbCBTaGFyZWREZXF1ZSBxdWV1ZTsgLy8gdGhlIHNoYXJlZCBxdWV1ZQotCi0gIC8qKgotICAgKiBSZXNldCB0aGUgbG9jYWwgYnVmZmVyICh0aHJvd2luZyBhd2F5IGFueSBsb2NhbCBlbnRyaWVzKS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc2V0TG9jYWwoKSB7Ci0gICAgdGFpbCA9IERlcXVlLlRBSUxfSU5JVElBTF9WQUxVRTsKLSAgICB0YWlsQnVmZmVyRW5kID0gRGVxdWUuVEFJTF9JTklUSUFMX1ZBTFVFOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIHdoZXRoZXIgdGhlcmUgaXMgc3BhY2UgaW4gdGhlIGJ1ZmZlciBmb3IgYSBwZW5kaW5nIGluc2VydC4KLSAgICogSWYgdGhlcmUgaXMgbm90IHN1ZmZpY2llbnQgc3BhY2UsIGFsbG9jYXRlIGEgbmV3IGJ1ZmZlcgotICAgKiAoZGlzcGF0Y2hpbmcgdGhlIGZ1bGwgYnVmZmVyIHRvIHRoZSBzaGFyZWQgcXVldWUgaWYgbm90IG51bGwpLgotICAgKgotICAgKiBAcGFyYW0gYXJpdHkgVGhlIGFyaXR5IG9mIHRoZSB2YWx1ZXMgc3RvcmVkIGluIHRoaXMgU1NCOiB0aGUKLSAgICogYnVmZmVyIG11c3QgY29udGFpbiBlbm91Z2ggc3BhY2UgZm9yIHRoaXMgbWFueSB3b3Jkcy4KLSAgICovCi0gIEBJbmxpbmUodmFsdWU9SW5saW5lLldoZW4uQXNzZXJ0aW9uc0Rpc2FibGVkKQotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBjaGVja1RhaWxJbnNlcnQoaW50IGFyaXR5KSB7Ci0gICAgaWYgKGJ1ZmZlck9mZnNldCh0YWlsKS5pc1plcm8oKSkKLSAgICAgIHRhaWxPdmVyZmxvdyhhcml0eSk7Ci0gICAgZWxzZSBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChidWZmZXJPZmZzZXQodGFpbCkuc0dFKFdvcmQuZnJvbUludFplcm9FeHRlbmQoYXJpdHkpLmxzaChMT0dfQllURVNfSU5fQUREUkVTUykudG9PZmZzZXQoKSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluc2VydCBhIHZhbHVlIGludG8gdGhlIGJ1ZmZlci4gIFRoaXMgaXMgPGk+dW5jaGVja2VkPC9pPi4gIFRoZQotICAgKiBjYWxsZXIgbXVzdCBmaXJzdCBjYWxsIDxjb2RlPmNoZWNrSW5zZXJ0KCk8L2NvZGU+IHRvIGVuc3VyZSB0aGUKLSAgICogYnVmZmVyIGNhbiBhY2NvbW1vZGF0ZSB0aGUgaW5zZXJ0aW9uLgotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGJlIGluc2VydGVkLgotICAgKi8KLSAgQElubGluZSh2YWx1ZT1JbmxpbmUuV2hlbi5Bc3NlcnRpb25zRGlzYWJsZWQpCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIHVuY2hlY2tlZFRhaWxJbnNlcnQoQWRkcmVzcyB2YWx1ZSkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGJ1ZmZlck9mZnNldCh0YWlsKS5zR0UoT2Zmc2V0LmZyb21JbnRaZXJvRXh0ZW5kKEJZVEVTX0lOX0FERFJFU1MpKSk7Ci0gICAgdGFpbCA9IHRhaWwubWludXMoQllURVNfSU5fQUREUkVTUyk7Ci0gICAgdGFpbC5zdG9yZSh2YWx1ZSk7Ci0gICAgLy8gaWYgKEludGVyZmFjZS5WZXJpZnlBc3NlcnRpb25zKSBlbnF1ZXVlZCsrOwotICB9Ci0KLSAgLyoqCi0gICAqIEluIHRoZSBjYXNlIHdoZXJlIGEgYnVmZmVyIG11c3QgYmUgZmx1c2hlZCBiZWZvcmUgYmVpbmcKLSAgICogZmlsbGVkIChlaXRoZXIgdG8gdGhlIHF1ZXVlIG9yIHRvIHRoZSBoZWFkKSwgdGhlIGVudHJpZXMgbXVzdCBiZQotICAgKiBzbGlkIHRvIHRoZSBiYXNlIG9mIHRoZSBidWZmZXIgaW4gb3JkZXIgdG8gcHJlc2VydmUgdGhlIGludmFyaWFudAotICAgKiB0aGF0IGFsbCBub24tdGFpbCBidWZmZXJzIHdpbGwgaGF2ZSBlbnRyaWVzIHN0YXJ0aW5nIGF0IHRoZSBiYXNlCi0gICAqICh3aGljaCBhbGxvd3MgYSBzaW1wbGUgdGVzdCBhZ2FpbnN0IHRoZSBiYXNlIHRvIGJlIHVzZWQgd2hlbgotICAgKiBwb3BwaW5nIGVudHJpZXMpLiAgVGhpcyBpcyA8aT5leHBlbnNpdmU8L2k+LCBzbyBzaG91bGQgYmUKLSAgICogYXZvaWRlZC4KLSAgICoKLSAgICogQHBhcmFtIGFyaXR5IFRoZSBhcml0eSBvZiB0aGUgYnVmZmVyIGluIHF1ZXN0aW9uCi0gICAqIEByZXR1cm4gVGhlIGxhc3Qgc2xvdCBpbiB0aGUgbm9ybWFsaXplZCBidWZmZXIgdGhhdCBjb250YWlucyBhbiBlbnRyeQotICAgKi8KLSAgcHJvdGVjdGVkIGZpbmFsIEFkZHJlc3Mgbm9ybWFsaXplVGFpbChpbnQgYXJpdHkpIHsKLSAgICBBZGRyZXNzIHNyYyA9IHRhaWw7Ci0gICAgQWRkcmVzcyB0Z3QgPSBidWZmZXJGaXJzdCh0YWlsKTsKLSAgICBBZGRyZXNzIGxhc3QgPSB0Z3QucGx1cyhidWZmZXJMYXN0T2Zmc2V0KGFyaXR5KS5taW51cyhidWZmZXJPZmZzZXQodGFpbCkpKTsKLSAgICB3aGlsZSAodGd0LkxFKGxhc3QpKSB7Ci0gICAgICB0Z3Quc3RvcmUoc3JjLmxvYWRBZGRyZXNzKCkpOwotICAgICAgc3JjID0gc3JjLnBsdXMoQllURVNfSU5fQUREUkVTUyk7Ci0gICAgICB0Z3QgPSB0Z3QucGx1cyhCWVRFU19JTl9BRERSRVNTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxhc3Q7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBzZW50aW5lbCBvZmZzZXQgZm9yIGEgYnVmZmVyIG9mIGEgZ2l2ZW4gYXJpdHkuICBUaGlzIGlzIHVzZWQKLSAgICogYm90aCB0byBjb21wdXRlIHRoZSBhZGRyZXNzIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KLSAgICoKLSAgICogQHBhcmFtIGFyaXR5IFRoZSBhcml0eSBvZiB0aGlzIGJ1ZmZlcgotICAgKiBAcmV0dXJuIFRoZSBzZW50aW5lbCBvZmZzZXQgdmFsdWUgZm9yIGEgYnVmZmVyIG9mIHRoZSBnaXZlbiBhcml0eS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHJvdGVjdGVkIGZpbmFsIE9mZnNldCBidWZmZXJTZW50aW5lbChpbnQgYXJpdHkpIHsKLSAgICByZXR1cm4gYnVmZmVyTGFzdE9mZnNldChhcml0eSkucGx1cyhCWVRFU19JTl9BRERSRVNTKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIFByaXZhdGUgaW5zdGFuY2UgbWV0aG9kcwotICAgKi8KLQotICAvKioKLSAgICogQnVmZmVyIHNwYWNlIGhhcyBiZWVuIGV4aGF1c3RlZCwgYWxsb2NhdGUgYSBuZXcgYnVmZmVyIGFuZCBlbnF1ZXVlCi0gICAqIHRoZSBleGlzdGluZyBidWZmZXIgKGlmIGFueSkuCi0gICAqCi0gICAqIEBwYXJhbSBhcml0eSBUaGUgYXJpdHkgb2YgdGhpcyBidWZmZXIgKHVzZWQgZm9yIHNhbml0eSB0ZXN0IG9ubHkpLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHRhaWxPdmVyZmxvdyhpbnQgYXJpdHkpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChhcml0eSA9PSBxdWV1ZS5nZXRBcml0eSgpKTsKLSAgICBpZiAodGFpbC5ORShEZXF1ZS5UQUlMX0lOSVRJQUxfVkFMVUUpKSB7Ci0gICAgICBjbG9zZUFuZEVucXVldWVUYWlsKGFyaXR5KTsKLSAgICB9Ci0gICAgdGFpbCA9IHF1ZXVlLmFsbG9jKCkucGx1cyhidWZmZXJTZW50aW5lbChhcml0eSkpOwotICAgIHRhaWxCdWZmZXJFbmQgPSB0YWlsOwotICAgIFBsYW4uY2hlY2tGb3JBc3luY0NvbGxlY3Rpb24oKTsgLy8gcG9zc2libGUgc2lkZS1lZmZlY3Qgb2YgYWxsb2MoKQotICB9Ci0KLSAgLyoqCi0gICAqIENsb3NlIHRoZSB0YWlsIGJ1ZmZlciAobm9ybWFsaXppbmcgaWYgbmVjZXNzYXJ5KSwgYW5kIGVucXVldWUgaXQKLSAgICogYXQgdGhlIHRhaWwgb2YgdGhlIHNoYXJlZCBidWZmZXIgcXVldWUuCi0gICAqCi0gICAqICBAcGFyYW0gYXJpdHkgVGhlIGFyaXR5IG9mIHRoaXMgYnVmZmVyLgotICAgKi8KLSAgQE5vSW5saW5lCi0gIHByaXZhdGUgdm9pZCBjbG9zZUFuZEVucXVldWVUYWlsKGludCBhcml0eSkgewotICAgIEFkZHJlc3MgbGFzdDsKLSAgICBpZiAoIWJ1ZmZlck9mZnNldCh0YWlsKS5pc1plcm8oKSkgewotICAgICAgLy8gcHJlbWF0dXJlbHkgY2xvc2VkCi0gICAgICBsYXN0ID0gbm9ybWFsaXplVGFpbChhcml0eSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIGEgZnVsbCB0YWlsIGJ1ZmZlcgotICAgICAgbGFzdCA9IHRhaWxCdWZmZXJFbmQubWludXMoQllURVNfSU5fQUREUkVTUyk7Ci0gICAgfQotICAgIHF1ZXVlLmVucXVldWUobGFzdC5wbHVzKEJZVEVTX0lOX0FERFJFU1MpLCBhcml0eSwgdHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRydWUgaWYgdGhpcyBTU0IgaXMgbG9jYWxseSBlbXB0eQotICAgKgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBTU0IgaXMgbG9jYWxseSBlbXB0eQotICAgKi8KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNGbHVzaGVkKCkgewotICAgIHJldHVybiB0YWlsLkVRKERlcXVlLlRBSUxfSU5JVElBTF9WQUxVRSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9kZXF1ZS9PYmplY3RSZWZlcmVuY2VCdWZmZXIuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9kZXF1ZS9PYmplY3RSZWZlcmVuY2VCdWZmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMyNTRkZi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZGVxdWUvT2JqZWN0UmVmZXJlbmNlQnVmZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkuZGVxdWU7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYW5zaXRpdmVDbG9zdXJlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBjb21iaW5hdGlvbiBvZiBhIERlcXVlIGFuZCBhIFRyYWNlU3RlcCwgZGVzaWduZWQgdG8gaW5jbHVkZQotICogaW50ZWxsaWdlbnQgcHJvY2Vzc2luZyBvZiBjaGlsZCByZWZlcmVuY2VzIGFzIG9iamVjdHMgYXJlIHNjYW5uZWQuCi0gKgotICogQHNlZSBvcmcubW10ay5wbGFuLlRyYW5zaXRpdmVDbG9zdXJlCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBPYmplY3RSZWZlcmVuY2VCdWZmZXIgZXh0ZW5kcyBUcmFuc2l0aXZlQ2xvc3VyZSBpbXBsZW1lbnRzIENvbnN0YW50cyB7Ci0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluc3RhbmNlIHZhcmlhYmxlcwotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBPYmplY3RSZWZlcmVuY2VEZXF1ZSB2YWx1ZXM7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5pdGlhbGl6YXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB1bmRlcmx5aW5nIGRlcXVlLgotICAgKiBAcGFyYW0gcXVldWUgVGhlIHNoYXJlZCBkZXF1ZSB0aGF0IGlzIHVzZWQuCi0gICAqLwotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlQnVmZmVyKFN0cmluZyBuYW1lLCBTaGFyZWREZXF1ZSBxdWV1ZSkgewotICAgIHZhbHVlcyA9IG5ldyBPYmplY3RSZWZlcmVuY2VEZXF1ZShuYW1lLCBxdWV1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogVHJhY2UgYW4gZWRnZSBkdXJpbmcgR0MuCi0gICAqCi0gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvZiB0aGUgcmVmZXJlbmNlLgotICAgKiBAcGFyYW0gc2xvdCBUaGUgbG9jYXRpb24gY29udGFpbmluZyB0aGUgb2JqZWN0IHJlZmVyZW5jZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGZpbmFsIHZvaWQgcHJvY2Vzc0VkZ2UoT2JqZWN0UmVmZXJlbmNlIHNvdXJjZSwgQWRkcmVzcyBzbG90KSB7Ci0gICAgT2JqZWN0UmVmZXJlbmNlIG9iamVjdCA9IFZNLmFjdGl2ZVBsYW4uZ2xvYmFsKCkubG9hZE9iamVjdFJlZmVyZW5jZShzbG90KTsKLSAgICBwcm9jZXNzKG9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBpcyB0aGUgbWV0aG9kIHRoYXQgZW5zdXJlcwotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcHJvY2Vzcy4KLSAgICovCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHByb2Nlc3MoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCk7Ci0KLSAgLyoqCi0gICAqIFByb2Nlc3MgZWFjaCBvZiB0aGUgY2hpbGQgb2JqZWN0cyBmb3IgdGhlIHBhc3NlZCBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBwcm9jZXNzIHRoZSBjaGlsZHJlbiBvZi4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGZpbmFsIHZvaWQgcHJvY2Vzc0NoaWxkcmVuKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBWTS5zY2FubmluZy5zY2FuT2JqZWN0KHRoaXMsIG9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogUHVzaGVzIGFuIG9iamVjdCBvbnRvIHRoZSBxdWV1ZSwgZm9yY2luZyBhbiBpbmxpbmVkIHNlcXVlbmNlLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcHVzaC4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGZpbmFsIHZvaWQgcHVzaChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgdmFsdWVzLnB1c2gob2JqZWN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBQdXNoZXMgYW4gb2JqZWN0IG9udG8gdGhlIHF1ZXVlLCBmb3JjaW5nIGFuIG91dCBvZiBsaW5lIHNlcXVlbmNlLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcHVzaC4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGZpbmFsIHZvaWQgcHVzaE9PTChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgdmFsdWVzLnB1c2hPT0wob2JqZWN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXRyaXZlcyBhbiBvYmplY3QuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG9iamVjdCByZXRyaWV2ZWQuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBmaW5hbCBPYmplY3RSZWZlcmVuY2UgcG9wKCkgewotICAgIHJldHVybiB2YWx1ZXMucG9wKCk7Ci0gIH0KLQotICBASW5saW5lCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgcmV0dXJuIHZhbHVlcy5pc0VtcHR5KCk7Ci0gIH0KLQotICAvKioKLSAgICogRmx1c2hlcyBhbGwgbG9jYWwgc3RhdGUgYmFjayB0byB0aGUgc2hhcmVkIHF1ZXVlLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgZmx1c2hMb2NhbCgpIHsKLSAgICB2YWx1ZXMuZmx1c2hMb2NhbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0cnVlIGlmIHRoaXMgYnVmZmVyIGlzIGxvY2FsbHkgZW1wdHkKLSAgICovCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzRmx1c2hlZCgpIHsKLSAgICByZXR1cm4gdmFsdWVzLmlzRmx1c2hlZCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZGVxdWUvT2JqZWN0UmVmZXJlbmNlRGVxdWUuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9kZXF1ZS9PYmplY3RSZWZlcmVuY2VEZXF1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWQ2Y2YwLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9kZXF1ZS9PYmplY3RSZWZlcmVuY2VEZXF1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5LmRlcXVlOwotCi1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Db25zdGFudHM7Ci0KLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBUaGlzIHN1cHBvcnRzIDxpPnVuc3luY2hyb25pemVkPC9pPiBlbnF1ZXVpbmcgYW5kIGRlcXVldWluZyBvZgotICogb2JqZWN0IHJlZmVyZW5jZXMKLSAqLwotQFVuaW50ZXJydXB0aWJsZSBwdWJsaWMgY2xhc3MgT2JqZWN0UmVmZXJlbmNlRGVxdWUgZXh0ZW5kcyBMb2NhbERlcXVlCi0gIGltcGxlbWVudHMgQ29uc3RhbnRzIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBQdWJsaWMgaW5zdGFuY2UgbWV0aG9kcwotICAgKi8KLSAgcHVibGljIGZpbmFsIFN0cmluZyBuYW1lOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKgotICAgKiBAcGFyYW0gcXVldWUgVGhlIHNoYXJlZCBxdWV1ZSB0byB3aGljaCB0aGlzIHF1ZXVlIHdpbGwgYXBwZW5kCi0gICAqIGl0cyBidWZmZXJzICh3aGVuIGZ1bGwgb3IgZmx1c2hlZCkgYW5kIGZyb20gd2hpY2ggaXQgd2lsbCBhcXVpcmUgbmV3Ci0gICAqIGJ1ZmZlcnMgd2hlbiBpdCBoYXMgZXhoYXVzdGVkIGl0cyBvd24uCi0gICAqLwotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlRGVxdWUoU3RyaW5nIG4sIFNoYXJlZERlcXVlIHF1ZXVlKSB7Ci0gICAgc3VwZXIocXVldWUpOwotICAgIG5hbWUgPSBuOwotICB9Ci0KLSAgLyoqCi0gICAqIEluc2VydCBhbiBvYmplY3QgaW50byB0aGUgb2JqZWN0IHF1ZXVlLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgb2JqZWN0IHF1ZXVlCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGluc2VydChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoIW9iamVjdC5pc051bGwoKSk7Ci0gICAgY2hlY2tUYWlsSW5zZXJ0KDEpOwotICAgIHVuY2hlY2tlZFRhaWxJbnNlcnQob2JqZWN0LnRvQWRkcmVzcygpKTsKLSAgfQotCi0gIC8qKgotICAgKiBQdXNoIGFuIG9iamVjdCBvbnRvIHRoZSBvYmplY3QgcXVldWUuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0byBiZSBwdXNoZWQgb250byB0aGUgb2JqZWN0IHF1ZXVlCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHB1c2goT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KCFvYmplY3QuaXNOdWxsKCkpOwotICAgIGNoZWNrSGVhZEluc2VydCgxKTsKLSAgICB1bmNoZWNrZWRIZWFkSW5zZXJ0KG9iamVjdC50b0FkZHJlc3MoKSk7Ci0gIH0KLQotICAvKioKLSAgICogUHVzaCBhbiBvYmplY3Qgb250byB0aGUgb2JqZWN0IHF1ZXVlLCBmb3JjZSB0aGlzIG91dCBvZiBsaW5lCi0gICAqICgiT09MIiksIGluIHNvbWUgY2lyY3Vtc3RuYWNlcyBpdCBpcyB0b28gZXhwZW5zaXZlIHRvIGhhdmUgdGhlCi0gICAqIHB1c2ggaW5saW5lZCwgc28gdGhpcyBjYWxsIGlzIG1hZGUuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0byBiZSBwdXNoZWQgb250byB0aGUgb2JqZWN0IHF1ZXVlCi0gICAqLwotICBATm9JbmxpbmUKLSAgcHVibGljIGZpbmFsIHZvaWQgcHVzaE9PTChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0gICAgcHVzaChvYmplY3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIFBvcCBhbiBvYmplY3QgZnJvbSB0aGUgb2JqZWN0IHF1ZXVlLCByZXR1cm4gemVybyBpZiB0aGUgcXVldWUKLSAgICogaXMgZW1wdHkuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG5leHQgb2JqZWN0IGluIHRoZSBvYmplY3QgcXVldWUsIG9yIHplcm8gaWYgdGhlCi0gICAqIHF1ZXVlIGlzIGVtcHR5Ci0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBmaW5hbCBPYmplY3RSZWZlcmVuY2UgcG9wKCkgewotICAgIGlmIChjaGVja0RlcXVldWUoMSkpIHsKLSAgICAgIHJldHVybiB1bmNoZWNrZWREZXF1ZXVlKCkudG9PYmplY3RSZWZlcmVuY2UoKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIE9iamVjdFJlZmVyZW5jZS5udWxsUmVmZXJlbmNlKCk7Ci0gICAgfQotICB9Ci0KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgIHJldHVybiAhY2hlY2tEZXF1ZXVlKDEpOwotICB9Ci0KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc05vbkVtcHR5KCkgewotICAgIHJldHVybiBjaGVja0RlcXVldWUoMSk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2RlcXVlL1NoYXJlZERlcXVlLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZGVxdWUvU2hhcmVkRGVxdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ1MzU3MC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZGVxdWUvU2hhcmVkRGVxdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5kZXF1ZTsKLQotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5SYXdQYWdlU3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LlNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuTG9nOwotaW1wb3J0IG9yZy5tbXRrLnZtLkxvY2s7Ci1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLkVudHJ5cG9pbnQ7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLklubGluZTsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuVW5pbnRlcnJ1cHRpYmxlOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuQWRkcmVzczsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLk9mZnNldDsKLQotLyoqCi0gKiBUaGlzIHN1cHBvcnRzIDxpPnVuc3luY2hyb25pemVkPC9pPiBlbnF1ZXVpbmcgYW5kIGRlcXVldWluZyBvZiBidWZmZXJzCi0gKiBmb3Igc2hhcmVkIHVzZS4gIFRoZSBkYXRhIGNhbiBiZSBhZGRlZCB0byBhbmQgcmVtb3ZlZCBmcm9tIGVpdGhlciBlbmQKLSAqIG9mIHRoZSBkZXF1ZS4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIFNoYXJlZERlcXVlIGV4dGVuZHMgRGVxdWUgaW1wbGVtZW50cyBDb25zdGFudHMgewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERJU0FCTEVfV0FJVElORyA9IHRydWU7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIE9mZnNldCBORVhUX09GRlNFVCA9IE9mZnNldC56ZXJvKCk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIE9mZnNldCBQUkVWX09GRlNFVCA9IE9mZnNldC5mcm9tSW50U2lnbkV4dGVuZChCWVRFU19JTl9BRERSRVNTKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFRSQUNFID0gZmFsc2U7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVFJBQ0VfREVUQUlMID0gZmFsc2U7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVFJBQ0VfQkxPQ0tFUlMgPSBmYWxzZTsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBQdWJsaWMgaW5zdGFuY2UgbWV0aG9kcwotICAgKi8KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICovCi0gIHB1YmxpYyBTaGFyZWREZXF1ZShTdHJpbmcgbmFtZSwgUmF3UGFnZVNwYWNlIHJwcywgaW50IGFyaXR5KSB7Ci0gICAgdGhpcy5ycHMgPSBycHM7Ci0gICAgdGhpcy5hcml0eSA9IGFyaXR5OwotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgbG9jayA9IFZNLm5ld0xvY2soIlNoYXJlZERlcXVlIik7Ci0gICAgY2xlYXJDb21wbGV0aW9uRmxhZygpOwotICAgIGhlYWQgPSBIRUFEX0lOSVRJQUxfVkFMVUU7Ci0gICAgdGFpbCA9IFRBSUxfSU5JVElBTF9WQUxVRTsKLSAgfQotCi0gIC8qKiBHZXQgdGhlIGFyaXR5ICh3b3JkcyBwZXIgZW50cnkpIG9mIHRoaXMgcXVldWUgKi8KLSAgQElubGluZQotICBmaW5hbCBpbnQgZ2V0QXJpdHkoKSB7IHJldHVybiBhcml0eTsgfQotCi0gIC8qKgotICAgKiBFbnF1ZXVlIGEgYmxvY2sgb24gdGhlIGhlYWQgb3IgdGFpbCBvZiB0aGUgc2hhcmVkIHF1ZXVlCi0gICAqCi0gICAqIEBwYXJhbSBidWYKLSAgICogQHBhcmFtIGFyaXR5Ci0gICAqIEBwYXJhbSB0b1RhaWwKLSAgICovCi0gIGZpbmFsIHZvaWQgZW5xdWV1ZShBZGRyZXNzIGJ1ZiwgaW50IGFyaXR5LCBib29sZWFuIHRvVGFpbCkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGFyaXR5ID09IHRoaXMuYXJpdHkpOwotICAgIGxvY2soKTsKLSAgICBpZiAodG9UYWlsKSB7Ci0gICAgICAvLyBBZGQgdG8gdGhlIHRhaWwgb2YgdGhlIHF1ZXVlCi0gICAgICBzZXROZXh0KGJ1ZiwgQWRkcmVzcy56ZXJvKCkpOwotICAgICAgaWYgKHRhaWwuRVEoVEFJTF9JTklUSUFMX1ZBTFVFKSkKLSAgICAgICAgaGVhZCA9IGJ1ZjsKLSAgICAgIGVsc2UKLSAgICAgICAgc2V0TmV4dCh0YWlsLCBidWYpOwotICAgICAgc2V0UHJldihidWYsIHRhaWwpOwotICAgICAgdGFpbCA9IGJ1ZjsKLSAgICB9IGVsc2UgewotICAgICAgLy8gQWRkIHRvIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZQotICAgICAgc2V0UHJldihidWYsIEFkZHJlc3MuemVybygpKTsKLSAgICAgIGlmIChoZWFkLkVRKEhFQURfSU5JVElBTF9WQUxVRSkpCi0gICAgICAgIHRhaWwgPSBidWY7Ci0gICAgICBlbHNlCi0gICAgICAgIHNldFByZXYoaGVhZCwgYnVmKTsKLSAgICAgIHNldE5leHQoYnVmLCBoZWFkKTsKLSAgICAgIGhlYWQgPSBidWY7Ci0gICAgfQotICAgIGJ1ZnNlbnF1ZXVlZCsrOwotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGNoZWNrRGVxdWVMZW5ndGgoYnVmc2VucXVldWVkKSk7Ci0gICAgdW5sb2NrKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBjbGVhckRlcXVlKGludCBhcml0eSkgewotICAgIEFkZHJlc3MgYnVmID0gZGVxdWV1ZShhcml0eSk7Ci0gICAgd2hpbGUgKCFidWYuaXNaZXJvKCkpIHsKLSAgICAgIGZyZWUoYnVmZmVyU3RhcnQoYnVmKSk7Ci0gICAgICBidWYgPSBkZXF1ZXVlKGFyaXR5KTsKLSAgICB9Ci0gICAgc2V0Q29tcGxldGlvbkZsYWcoKTsKLSAgfQotCi0gIEBJbmxpbmUKLSAgZmluYWwgQWRkcmVzcyBkZXF1ZXVlKGludCBhcml0eSkgewotICAgIHJldHVybiBkZXF1ZXVlKGFyaXR5LCBmYWxzZSk7Ci0gIH0KLQotICBmaW5hbCBBZGRyZXNzIGRlcXVldWUoaW50IGFyaXR5LCBib29sZWFuIGZyb21UYWlsKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoYXJpdHkgPT0gdGhpcy5hcml0eSk7Ci0gICAgcmV0dXJuIGRlcXVldWUoZmFsc2UsIGZyb21UYWlsKTsKLSAgfQotCi0gIEBJbmxpbmUKLSAgZmluYWwgQWRkcmVzcyBkZXF1ZXVlQW5kV2FpdChpbnQgYXJpdHkpIHsKLSAgICByZXR1cm4gZGVxdWV1ZUFuZFdhaXQoYXJpdHksIGZhbHNlKTsKLSAgfQotCi0gIGZpbmFsIEFkZHJlc3MgZGVxdWV1ZUFuZFdhaXQoaW50IGFyaXR5LCBib29sZWFuIGZyb21UYWlsKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoYXJpdHkgPT0gdGhpcy5hcml0eSk7Ci0gICAgQWRkcmVzcyBidWYgPSBkZXF1ZXVlKGZhbHNlLCBmcm9tVGFpbCk7Ci0gICAgaWYgKGJ1Zi5pc1plcm8oKSAmJiAoIWNvbXBsZXRlKCkpKSB7Ci0gICAgICBidWYgPSBkZXF1ZXVlKHRydWUsIGZyb21UYWlsKTsgIC8vIFdhaXQgaW5zaWRlIGRlcXVldWUKLSAgICB9Ci0gICAgcmV0dXJuIGJ1ZjsKLSAgfQotCi0gIC8qKgotICAgKiBQcmVwYXJlIGZvciBwYXJhbGxlbCBwcm9jZXNzaW5nLiBBbGwgYWN0aXZlIEdDIHRocmVhZHMgd2lsbAotICAgKiBwYXJ0aWNpcGF0ZSwgYW5kIHBvcCBvcGVyYXRpb25zIHdpbGwgYmxvY2sgdW50aWwgYWxsIHdvcmsKLSAgICogaXMgY29tcGxldGUuCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCBwcmVwYXJlKCkgewotICAgIGlmIChESVNBQkxFX1dBSVRJTkcpIHsKLSAgICAgIHByZXBhcmVOb25CbG9ja2luZygpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBUaGlzIHNob3VsZCBiZSB0aGUgbm9ybWFsIG1vZGUgb2Ygb3BlcmF0aW9uIG9uY2UgcGVyZm9ybWFuY2UgaXMgZml4ZWQgKi8KLSAgICAgIHByZXBhcmUoVk0uY29sbGVjdGlvbi5hY3RpdmVHQ1RocmVhZHMoKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFByZXBhcmUgZm9yIHByb2Nlc3Npbmcgd2hlcmUgcG9wIG9wZXJhdGlvbnMgb24gdGhlIGRlcXVlcwotICAgKiB3aWxsIG5ldmVyIGJsb2NrLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgcHJlcGFyZU5vbkJsb2NraW5nKCkgewotICAgIHByZXBhcmUoMSk7Ci0gIH0KLQotICAvKioKLSAgICogUHJlcGFyZSBmb3IgcGFyYWxsZWwgcHJvY2Vzc2luZyB3aGVyZSBhIHNwZWNpZmljIG51bWJlcgotICAgKiBvZiB0aHJlYWRzIHRha2UgcGFydC4KLSAgICoKLSAgICogQHBhcmFtIGNvbnN1bWVycyAjIHRocmVhZHMgdGFraW5nIHBhcnQuCi0gICAqLwotICBwcml2YXRlIHZvaWQgcHJlcGFyZShpbnQgY29uc3VtZXJzKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQobnVtQ29uc3VtZXJzV2FpdGluZyA9PSAwKTsKLSAgICBzZXROdW1Db25zdW1lcnMoY29uc3VtZXJzKTsKLSAgICBjbGVhckNvbXBsZXRpb25GbGFnKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCByZXNldCgpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChudW1Db25zdW1lcnNXYWl0aW5nID09IDApOwotICAgIGNsZWFyQ29tcGxldGlvbkZsYWcoKTsKLSAgICBzZXROdW1Db25zdW1lcnNXYWl0aW5nKDApOwotICAgIGFzc2VydEV4aGF1c3RlZCgpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgYXNzZXJ0RXhoYXVzdGVkKCkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGhlYWQuaXNaZXJvKCkgJiYgdGFpbC5pc1plcm8oKSk7Ci0gIH0KLQotICBASW5saW5lCi0gIGZpbmFsIEFkZHJlc3MgYWxsb2MoKSB7Ci0gICAgQWRkcmVzcyBydG4gPSBycHMuYWNxdWlyZShQQUdFU19QRVJfQlVGRkVSKTsKLSAgICBpZiAocnRuLmlzWmVybygpKSB7Ci0gICAgICBTcGFjZS5wcmludFVzYWdlTUIoKTsKLSAgICAgIFZNLmFzc2VydGlvbnMuZmFpbCgiRmFpbGVkIHRvIGFsbG9jYXRlIHNwYWNlIGZvciBxdWV1ZS4gIElzIG1ldGFkYXRhIHZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZD8iKTsKLSAgICB9Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQocnRuLkVRKGJ1ZmZlclN0YXJ0KHJ0bikpKTsKLSAgICByZXR1cm4gcnRuOwotICB9Ci0KLSAgQElubGluZQotICBmaW5hbCB2b2lkIGZyZWUoQWRkcmVzcyBidWYpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChidWYuRVEoYnVmZmVyU3RhcnQoYnVmKSkgJiYgIWJ1Zi5pc1plcm8oKSk7Ci0gICAgcnBzLnJlbGVhc2UoYnVmKTsKLSAgfQotCi0gIEBJbmxpbmUKLSAgcHVibGljIGZpbmFsIGludCBlbnF1ZXVlZFBhZ2VzKCkgewotICAgIHJldHVybiAoaW50KSAoYnVmc2VucXVldWVkICogUEFHRVNfUEVSX0JVRkZFUik7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBQcml2YXRlIGluc3RhbmNlIG1ldGhvZHMgYW5kIGZpZWxkcwotICAgKi8KLQotICAvKiogVGhlIG5hbWUgb2YgdGhpcyBzaGFyZWQgZGVxdWUgLSBmb3IgZGlhZ25vc3RpY3MgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotICAvKiogUmF3IHBhZ2Ugc3BhY2UgZnJvbSB3aGljaCB0byBhbGxvY2F0ZSAqLwotICBwcml2YXRlIFJhd1BhZ2VTcGFjZSBycHM7Ci0KLSAgLyoqIE51bWJlciBvZiB3b3JkcyBwZXIgZW50cnkgKi8KLSAgcHJpdmF0ZSBmaW5hbCBpbnQgYXJpdHk7Ci0KLSAgLyoqIENvbXBsZXRpb24gZmxhZyAtIHNldCB3aGVuIGFsbCBjb25zdW1lcnMgaGF2ZSBhcnJpdmVkIGF0IHRoZSBiYXJyaWVyICovCi0gIEBFbnRyeXBvaW50Ci0gIHByaXZhdGUgdm9sYXRpbGUgaW50IGNvbXBsZXRpb25GbGFnOwotCi0gIC8qKiAjIGFjdGl2ZSB0aHJlYWRzIC0gcHJvY2Vzc2luZyBpcyBjb21wbGV0ZSB3aGVuICMgd2FpdGluZyA9PSB0aGlzICovCi0gIEBFbnRyeXBvaW50Ci0gIHByaXZhdGUgdm9sYXRpbGUgaW50IG51bUNvbnN1bWVyczsKLQotICAvKiogIyB0aHJlYWRzIHdhaXRpbmcgKi8KLSAgQEVudHJ5cG9pbnQKLSAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgbnVtQ29uc3VtZXJzV2FpdGluZzsKLQotICAvKiogSGVhZCBvZiB0aGUgc2hhcmVkIGRlcXVlICovCi0gIEBFbnRyeXBvaW50Ci0gIHByb3RlY3RlZCB2b2xhdGlsZSBBZGRyZXNzIGhlYWQ7Ci0KLSAgLyoqIFRhaWwgb2YgdGhlIHNoYXJlZCBkZXF1ZSAqLwotICBARW50cnlwb2ludAotICBwcm90ZWN0ZWQgdm9sYXRpbGUgQWRkcmVzcyB0YWlsOwotICBARW50cnlwb2ludAotICBwcml2YXRlIHZvbGF0aWxlIGludCBidWZzZW5xdWV1ZWQ7Ci0gIHByaXZhdGUgTG9jayBsb2NrOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgV0FSTl9QRVJJT0QgPSAobG9uZykoMioxRTkpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVRfUEVSSU9EID0gMTAgKiBXQVJOX1BFUklPRDsKLQotICAvKioKLSAgICogRGVxdWV1ZSBhIGJsb2NrIGZyb20gdGhlIHNoYXJlZCBwb29sLiAgSWYgJ3dhaXRpbmcnIGlzIHRydWUsIGFuZCB0aGUKLSAgICogcXVldWUgaXMgZW1wdHksIHdhaXQgZm9yIGVpdGhlciBhIG5ldyBibG9jayB0byBzaG93IHVwIG9yIGFsbCB0aGUKLSAgICogb3RoZXIgY29uc3VtZXJzIHRvIGpvaW4gdXMuCi0gICAqCi0gICAqIEBwYXJhbSB3YWl0aW5nCi0gICAqIEBwYXJhbSBmcm9tVGFpbAotICAgKiBAcmV0dXJuIHRoZSBBZGRyZXNzIG9mIHRoZSBibG9jawotICAgKi8KLSAgcHJpdmF0ZSBBZGRyZXNzIGRlcXVldWUoYm9vbGVhbiB3YWl0aW5nLCBib29sZWFuIGZyb21UYWlsKSB7Ci0gICAgbG9jaygpOwotICAgIEFkZHJlc3MgcnRuID0gKChmcm9tVGFpbCkgPyB0YWlsIDogaGVhZCk7Ci0gICAgaWYgKHJ0bi5pc1plcm8oKSkgewotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQodGFpbC5pc1plcm8oKSAmJiBoZWFkLmlzWmVybygpKTsKLSAgICAgIC8vIG5vIGJ1ZmZlcnMgYXZhaWxhYmxlCi0gICAgICBpZiAod2FpdGluZykgewotICAgICAgICBpbnQgb3JkaW5hbCA9IFRSQUNFID8gMCA6IFZNLmFjdGl2ZVBsYW4uY29sbGVjdG9yKCkuZ2V0SWQoKTsKLSAgICAgICAgc2V0TnVtQ29uc3VtZXJzV2FpdGluZyhudW1Db25zdW1lcnNXYWl0aW5nICsgMSk7Ci0gICAgICAgIHdoaWxlIChydG4uaXNaZXJvKCkpIHsKLSAgICAgICAgICBpZiAobnVtQ29uc3VtZXJzV2FpdGluZyA9PSBudW1Db25zdW1lcnMpCi0gICAgICAgICAgICBzZXRDb21wbGV0aW9uRmxhZygpOwotICAgICAgICAgIGlmIChUUkFDRSkgewotICAgICAgICAgICAgTG9nLndyaXRlKCItLSAoIik7IExvZy53cml0ZShvcmRpbmFsKTsKLSAgICAgICAgICAgIExvZy53cml0ZSgiKSBqb2luaW5nIHdhaXQgcXVldWUgb2YgU2hhcmVkRGVxdWUoIik7Ci0gICAgICAgICAgICBMb2cud3JpdGUobmFtZSk7IExvZy53cml0ZSgiKSAiKTsKLSAgICAgICAgICAgIExvZy53cml0ZShudW1Db25zdW1lcnNXYWl0aW5nKTsgTG9nLndyaXRlKCIvIik7Ci0gICAgICAgICAgICBMb2cud3JpdGUobnVtQ29uc3VtZXJzKTsKLSAgICAgICAgICAgIExvZy53cml0ZSgiIGNvbnN1bWVycyB3YWl0aW5nIik7Ci0gICAgICAgICAgICBpZiAoY29tcGxldGUoKSkgTG9nLndyaXRlKCIgV0FJVCBDT01QTEVURSIpOwotICAgICAgICAgICAgTG9nLndyaXRlbG4oKTsKLSAgICAgICAgICAgIGlmIChUUkFDRV9CTE9DS0VSUykKLSAgICAgICAgICAgICAgVk0uYXNzZXJ0aW9ucy5kdW1wU3RhY2soKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgICAgLy8gU3BpbiBhbmQgd2FpdAotICAgICAgICAgIHNwaW5XYWl0KGZyb21UYWlsKTsKLQotICAgICAgICAgIGlmIChjb21wbGV0ZSgpKSB7Ci0gICAgICAgICAgICBpZiAoVFJBQ0UpIHsKLSAgICAgICAgICAgICAgTG9nLndyaXRlKCItLSAoIik7IExvZy53cml0ZShvcmRpbmFsKTsgTG9nLndyaXRlbG4oIikgRVhJVElORyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbG9jaygpOwotICAgICAgICAgICAgc2V0TnVtQ29uc3VtZXJzV2FpdGluZyhudW1Db25zdW1lcnNXYWl0aW5nIC0gMSk7Ci0gICAgICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgICAgIHJldHVybiBBZGRyZXNzLnplcm8oKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbG9jaygpOwotICAgICAgICAgIC8vIFJlLWdldCB0aGUgbGlzdCBoZWFkL3RhaWwgd2hpbGUgaG9sZGluZyB0aGUgbG9jawotICAgICAgICAgIHJ0biA9ICgoZnJvbVRhaWwpID8gdGFpbCA6IGhlYWQpOwotICAgICAgICB9Ci0gICAgICAgIHNldE51bUNvbnN1bWVyc1dhaXRpbmcobnVtQ29uc3VtZXJzV2FpdGluZyAtIDEpOwotICAgICAgICBpZiAoVFJBQ0UpIHsKLSAgICAgICAgICBMb2cud3JpdGUoIi0tICgiKTsgTG9nLndyaXRlKG9yZGluYWwpOyBMb2cud3JpdGUoIikgcmVzdW1pbmcgd29yayAiKTsKLSAgICAgICAgICBMb2cud3JpdGUoIiBuPSIpOyBMb2cud3JpdGVsbihudW1Db25zdW1lcnNXYWl0aW5nKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIHJldHVybiBBZGRyZXNzLnplcm8oKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGZyb21UYWlsKSB7Ci0gICAgICAvLyBkZXF1ZXVlIHRoZSB0YWlsIGJ1ZmZlcgotICAgICAgc2V0VGFpbChnZXRQcmV2KHRhaWwpKTsKLSAgICAgIGlmIChoZWFkLkVRKHJ0bikpIHsKLSAgICAgICAgc2V0SGVhZChBZGRyZXNzLnplcm8oKSk7Ci0gICAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KHRhaWwuaXNaZXJvKCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc2V0TmV4dCh0YWlsLCBBZGRyZXNzLnplcm8oKSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIGRlcXVldWUgdGhlIGhlYWQgYnVmZmVyCi0gICAgICBzZXRIZWFkKGdldE5leHQoaGVhZCkpOwotICAgICAgaWYgKHRhaWwuRVEocnRuKSkgewotICAgICAgICBzZXRUYWlsKEFkZHJlc3MuemVybygpKTsKLSAgICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoaGVhZC5pc1plcm8oKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzZXRQcmV2KGhlYWQsIEFkZHJlc3MuemVybygpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYnVmc2VucXVldWVkLS07Ci0gICAgdW5sb2NrKCk7Ci0gICAgcmV0dXJuIHJ0bjsKLSAgfQotCi0gIC8qKgotICAgKiBTcGlud2FpdCBmb3IgR0Mgd29yayB0byBhcnJpdmUKLSAgICoKLSAgICogQHBhcmFtIGZyb21UYWlsIENoZWNrIHRoZSBoZWFkIG9yIHRoZSB0YWlsID8KLSAgICovCi0gIHByaXZhdGUgdm9pZCBzcGluV2FpdChib29sZWFuIGZyb21UYWlsKSB7Ci0gICAgbG9uZyBzdGFydE5hbm8gPSAwOwotICAgIGxvbmcgbGFzdEVsYXBzZWROYW5vID0gMDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgbG9uZyBzdGFydEN5Y2xlcyA9IFZNLnN0YXRpc3RpY3MuY3ljbGVzKCk7Ci0gICAgICBsb25nIGVuZEN5Y2xlcyA9IHN0YXJ0Q3ljbGVzICsgKChsb25nKSAxZTkpOyAvLyBhIGZldyBodW5kcmVkIG1pbGxpc2Vjb25kcyBtb3JlIG9yIGxlc3MuCi0gICAgICBsb25nIG5vd0N5Y2xlczsKLSAgICAgIGRvIHsKLSAgICAgICAgVk0ubWVtb3J5LmlzeW5jKCk7Ci0gICAgICAgIEFkZHJlc3MgcnRuID0gKChmcm9tVGFpbCkgPyB0YWlsIDogaGVhZCk7Ci0gICAgICAgIGlmICghcnRuLmlzWmVybygpIHx8IGNvbXBsZXRlKCkpIHJldHVybjsKLSAgICAgICAgbm93Q3ljbGVzID0gVk0uc3RhdGlzdGljcy5jeWNsZXMoKTsKLSAgICAgIH0gd2hpbGUgKHN0YXJ0Q3ljbGVzIDwgbm93Q3ljbGVzICYmIG5vd0N5Y2xlcyA8IGVuZEN5Y2xlcyk7IC8qIGNoZWNrIGFnYWluc3QgYm90aCBlbmRzIHRvIGd1YXJkIGFnYWluc3QgQ1BVIG1pZ3JhdGlvbiAqLwotCi0gICAgICAvKgotICAgICAgICogQWNjb3JkaW5nIHRvIHRoZSBjeWNsZSBjb3VudGVyLCB3ZSd2ZSBiZWVuIHNwaW5uaW5nIGZvciBhIHdoaWxlLgotICAgICAgICogVGltZSB0byBjaGVjayBuYW5vVGltZSBhbmQgc2VlIGlmIHdlIHNob3VsZCBwcmludCBhIHdhcm5pbmcgYW5kL29yIGZhaWwuCi0gICAgICAgKiBXZSBsb2NrIHRoZSBkZXF1ZSB3aGlsZSBkb2luZyB0aGlzIHRvIGF2b2lkIGludGVybGVhdmVkIG1lc3NhZ2VzIGZyb20gbXVsdGlwbGUgdGhyZWFkcy4KLSAgICAgICAqLwotICAgICAgbG9jaygpOwotICAgICAgaWYgKHN0YXJ0TmFubyA9PSAwKSB7Ci0gICAgICAgIHN0YXJ0TmFubyA9IFZNLnN0YXRpc3RpY3MubmFub1RpbWUoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGxvbmcgbm93TmFubyA9IFZNLnN0YXRpc3RpY3MubmFub1RpbWUoKTsKLSAgICAgICAgbG9uZyBlbGFwc2VkTmFubyA9IG5vd05hbm8gLSBzdGFydE5hbm87Ci0gICAgICAgIGlmIChlbGFwc2VkTmFubyAtIGxhc3RFbGFwc2VkTmFubyA+IFdBUk5fUEVSSU9EKSB7Ci0gICAgICAgICAgTG9nLndyaXRlKCJHQyBXYXJuaW5nOiBTaGFyZWREZXF1ZSgiKTsgTG9nLndyaXRlKG5hbWUpOwotICAgICAgICAgIExvZy53cml0ZSgiKSB3YWl0IGhhcyByZWFjaGVkICIpOyBMb2cud3JpdGUoVk0uc3RhdGlzdGljcy5uYW5vc1RvU2VjcyhlbGFwc2VkTmFubykpOwotICAgICAgICAgIExvZy53cml0ZSgiLCAiKTsgTG9nLndyaXRlKG51bUNvbnN1bWVyc1dhaXRpbmcpOyBMb2cud3JpdGUoIi8iKTsKLSAgICAgICAgICBMb2cud3JpdGUobnVtQ29uc3VtZXJzKTsgTG9nLndyaXRlbG4oIiB0aHJlYWRzIHdhaXRpbmciKTsKLSAgICAgICAgICBsYXN0RWxhcHNlZE5hbm8gPSBlbGFwc2VkTmFubzsKLSAgICAgICAgfQotICAgICAgICBpZiAoZWxhcHNlZE5hbm8gPiBUSU1FT1VUX1BFUklPRCkgewotICAgICAgICAgIHVubG9jaygpOyAgIC8vIFRvIGFsbG93IG90aGVyIEdDIHRocmVhZHMgdG8gZGllIGluIHR1cm4KLSAgICAgICAgICBWTS5hc3NlcnRpb25zLmZhaWwoIkdDIEVycm9yOiBTaGFyZWREZXF1ZSBUaW1lb3V0Iik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHVubG9jaygpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlICJuZXh0IiBwb2ludGVyIGluIGEgYnVmZmVyIGZvcm1pbmcgdGhlIGxpbmtlZCBidWZmZXIgY2hhaW4uCi0gICAqCi0gICAqIEBwYXJhbSBidWYgVGhlIGJ1ZmZlciB3aG9zZSBuZXh0IGZpZWxkIGlzIHRvIGJlIHNldC4KLSAgICogQHBhcmFtIG5leHQgVGhlIHJlZmVyZW5jZSB0byB3aGljaCBuZXh0IHNob3VsZCBwb2ludC4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0TmV4dChBZGRyZXNzIGJ1ZiwgQWRkcmVzcyBuZXh0KSB7Ci0gICAgYnVmLnN0b3JlKG5leHQsIE5FWFRfT0ZGU0VUKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlICJuZXh0IiBwb2ludGVyIGluIGEgYnVmZmVyIGZvcm1pbmcgdGhlIGxpbmtlZCBidWZmZXIgY2hhaW4uCi0gICAqCi0gICAqIEBwYXJhbSBidWYgVGhlIGJ1ZmZlciB3aG9zZSBuZXh0IGZpZWxkIGlzIHRvIGJlIHJldHVybmVkLgotICAgKiBAcmV0dXJuIFRoZSBuZXh0IGZpZWxkIGZvciB0aGlzIGJ1ZmZlci4KLSAgICovCi0gIHByb3RlY3RlZCBmaW5hbCBBZGRyZXNzIGdldE5leHQoQWRkcmVzcyBidWYpIHsKLSAgICByZXR1cm4gYnVmLmxvYWRBZGRyZXNzKE5FWFRfT0ZGU0VUKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlICJwcmV2IiBwb2ludGVyIGluIGEgYnVmZmVyIGZvcm1pbmcgdGhlIGxpbmtlZCBidWZmZXIgY2hhaW4uCi0gICAqCi0gICAqIEBwYXJhbSBidWYgVGhlIGJ1ZmZlciB3aG9zZSBuZXh0IGZpZWxkIGlzIHRvIGJlIHNldC4KLSAgICogQHBhcmFtIHByZXYgVGhlIHJlZmVyZW5jZSB0byB3aGljaCBwcmV2IHNob3VsZCBwb2ludC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBzZXRQcmV2KEFkZHJlc3MgYnVmLCBBZGRyZXNzIHByZXYpIHsKLSAgICBidWYuc3RvcmUocHJldiwgUFJFVl9PRkZTRVQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgIm5leHQiIHBvaW50ZXIgaW4gYSBidWZmZXIgZm9ybWluZyB0aGUgbGlua2VkIGJ1ZmZlciBjaGFpbi4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZiBUaGUgYnVmZmVyIHdob3NlIG5leHQgZmllbGQgaXMgdG8gYmUgcmV0dXJuZWQuCi0gICAqIEByZXR1cm4gVGhlIG5leHQgZmllbGQgZm9yIHRoaXMgYnVmZmVyLgotICAgKi8KLSAgcHJvdGVjdGVkIGZpbmFsIEFkZHJlc3MgZ2V0UHJldihBZGRyZXNzIGJ1ZikgewotICAgIHJldHVybiBidWYubG9hZEFkZHJlc3MoUFJFVl9PRkZTRVQpOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIHRoZSBudW1iZXIgb2YgYnVmZmVycyBpbiB0aGUgd29yayBxdWV1ZSAoZm9yIGRlYnVnZ2luZwotICAgKiBwdXJwb3NlcykuCi0gICAqCi0gICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciBvZiBidWZmZXJzIGJlbGlldmVkIHRvIGJlIGluIHRoZSBxdWV1ZS4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBsZW5ndGggb2YgdGhlIHF1ZXVlIG1hdGNoZXMgbGVuZ3RoLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGNoZWNrRGVxdWVMZW5ndGgoaW50IGxlbmd0aCkgewotICAgIEFkZHJlc3MgdG9wID0gaGVhZDsKLSAgICBpbnQgbCA9IDA7Ci0gICAgd2hpbGUgKCF0b3AuaXNaZXJvKCkgJiYgbCA8PSBsZW5ndGgpIHsKLSAgICAgIHRvcCA9IGdldE5leHQodG9wKTsKLSAgICAgIGwrKzsKLSAgICB9Ci0gICAgcmV0dXJuIGwgPT0gbGVuZ3RoOwotICB9Ci0KLSAgLyoqCi0gICAqIExvY2sgdGhpcyBzaGFyZWQgcXVldWUuICBXZSB1c2Ugb25lIHNpbXBsZSBsb3ctbGV2ZWwgbG9jayB0bwotICAgKiBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gdGhlIHNoYXJlZCBxdWV1ZSBvZiBidWZmZXJzLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGxvY2soKSB7Ci0gICAgbG9jay5hY3F1aXJlKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmVsZWFzZSB0aGUgbG9jay4gIFdlIHVzZSBvbmUgc2ltcGxlIGxvdy1sZXZlbCBsb2NrIHRvIHN5bmNocm9uaXplCi0gICAqIGFjY2VzcyB0byB0aGUgc2hhcmVkIHF1ZXVlIG9mIGJ1ZmZlcnMuCi0gICAqLwotICBwcml2YXRlIHZvaWQgdW5sb2NrKCkgewotICAgIGxvY2sucmVsZWFzZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIElzIHRoZSBjdXJyZW50IHJvdW5kIG9mIHByb2Nlc3NpbmcgY29tcGxldGUgPwotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGNvbXBsZXRlKCkgewotICAgIHJldHVybiBjb21wbGV0aW9uRmxhZyA9PSAxOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgY29tcGxldGlvbiBmbGFnLgotICAgKi8KLSAgQElubGluZQotICBwcml2YXRlIHZvaWQgc2V0Q29tcGxldGlvbkZsYWcoKSB7Ci0gICAgaWYgKFRSQUNFX0RFVEFJTCkgewotICAgICAgTG9nLndyaXRlbG4oIiMgc2V0Q29tcGxldGlvbkZsYWc6ICIpOwotICAgIH0KLSAgICBjb21wbGV0aW9uRmxhZyA9IDE7Ci0gIH0KLQotICAvKioKLSAgICogQ2xlYXIgdGhlIGNvbXBsZXRpb24gZmxhZy4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSB2b2lkIGNsZWFyQ29tcGxldGlvbkZsYWcoKSB7Ci0gICAgaWYgKFRSQUNFX0RFVEFJTCkgewotICAgICAgTG9nLndyaXRlbG4oIiMgY2xlYXJDb21wbGV0aW9uRmxhZzogIik7Ci0gICAgfQotICAgIGNvbXBsZXRpb25GbGFnID0gMDsKLSAgfQotCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSB2b2lkIHNldE51bUNvbnN1bWVycyhpbnQgbmV3TnVtQ29uc3VtZXJzKSB7Ci0gICAgaWYgKFRSQUNFX0RFVEFJTCkgewotICAgICAgTG9nLndyaXRlKCIjIE51bSBjb25zdW1lcnMgIik7IExvZy53cml0ZWxuKG5ld051bUNvbnN1bWVycyk7Ci0gICAgfQotICAgIG51bUNvbnN1bWVycyA9IG5ld051bUNvbnN1bWVyczsKLSAgfQotCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSB2b2lkIHNldE51bUNvbnN1bWVyc1dhaXRpbmcoaW50IG5ld05DVykgewotICAgIGlmIChUUkFDRV9ERVRBSUwpIHsKLSAgICAgIExvZy53cml0ZSgiIyBOdW0gY29uc3VtZXJzIHdhaXRpbmcgIik7IExvZy53cml0ZWxuKG5ld05DVyk7Ci0gICAgfQotICAgIG51bUNvbnN1bWVyc1dhaXRpbmcgPSBuZXdOQ1c7Ci0gIH0KLQotICBASW5saW5lCi0gIHByaXZhdGUgdm9pZCBzZXRIZWFkKEFkZHJlc3MgbmV3SGVhZCkgewotICAgIGhlYWQgPSBuZXdIZWFkOwotICAgIFZNLm1lbW9yeS5zeW5jKCk7Ci0gIH0KLQotICBASW5saW5lCi0gIHByaXZhdGUgdm9pZCBzZXRUYWlsKEFkZHJlc3MgbmV3VGFpbCkgewotICAgIHRhaWwgPSBuZXdUYWlsOwotICAgIFZNLm1lbW9yeS5zeW5jKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9kZXF1ZS9Tb3J0U2hhcmVkRGVxdWUuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9kZXF1ZS9Tb3J0U2hhcmVkRGVxdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVmMWI2Yy4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZGVxdWUvU29ydFNoYXJlZERlcXVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzIgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkuZGVxdWU7Ci0KLWltcG9ydCBvcmcubW10ay5wb2xpY3kuUmF3UGFnZVNwYWNlOwotCi1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogVGhpcyBzdXBwb3J0cyA8aT51bnN5bmNocm9uaXplZDwvaT4gZW5xdWV1aW5nIGFuZCBkZXF1ZXVpbmcgb2YgYnVmZmVycwotICogZm9yIHNoYXJlZCB1c2UuICBUaGUgZGF0YSBjYW4gYmUgYWRkZWQgdG8gYW5kIHJlbW92ZWQgZnJvbSBlaXRoZXIgZW5kCi0gKiBvZiB0aGUgZGVxdWUuIFRoaXMgY2xhc3MgaXMgYmFzZWQgdXBvbiB0aGUgU2hhcmVkUXVldWUgY2xhc3MuICBUaGUgc29ydGluZwotICogcm91dGluZXMgd2VyZSBtb2RpZmllZCBmcm9tIGNvZGUgd3JpdHRlbiBieSBOYXJlbmRyYW4gU2FjaGluZHJhbiBhbmQKLSAqIE1hdHRoZXcgSGVydHogZm9yIEdDVGsuCi0gKi8KLUBVbmludGVycnVwdGlibGUgcHVibGljIGFic3RyYWN0IGNsYXNzIFNvcnRTaGFyZWREZXF1ZSBleHRlbmRzIFNoYXJlZERlcXVlIHsKLQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCWVRFU19QVVNIRUQgPSBCWVRFU19JTl9BRERSRVNTICogNTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9TVEFDS19TSVpFID0gQllURVNfUFVTSEVEICogNjQ7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIE9mZnNldCBJTlNFUlRJT05fU09SVF9MSU1JVCA9IE9mZnNldC5mcm9tSW50U2lnbkV4dGVuZCg4MCk7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENsYXNzIHZhcmlhYmxlcwotICAgKi8KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIHJwcyBUaGUgc3BhY2UgZnJvbSB3aGljaCB0aGUgaW5zdGFuY2Ugc2hvdWxkIG9idGFpbiBidWZmZXJzLgotICAgKi8KLSAgcHVibGljIFNvcnRTaGFyZWREZXF1ZShTdHJpbmcgbmFtZSwgUmF3UGFnZVNwYWNlIHJwcywgaW50IGFyaXR5KSB7Ci0gICAgc3VwZXIobmFtZSwgcnBzLCBhcml0eSk7Ci0gICAgc3RhY2tCYXNlID0gQWRkcmVzc0FycmF5LmNyZWF0ZShNQVhfU1RBQ0tfU0laRSk7Ci0gICAgc3RhY2tMb2MgPSAwOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIFNvcnRpbmcgbWV0aG9kcywgdXRpbGl0aWVzLCBhbmQgaW5zdGFuY2UgdmFyaWFibGVzCi0gICAqLwotCi0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgc29ydGluZyBrZXkgZm9yIHRoZSBvYmplY3QgcGFzc2VkIGFzIGEgcGFyYW1ldGVyLgotICAgKgotICAgKiBAcGFyYW0gb2JqIFRoZSBhZGRyZXNzIG9mIHRoZSBvYmplY3Qgd2hvc2Uga2V5IGlzIHdhbnRlZAotICAgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgc29ydGluZyBrZXkgZm9yIHRoaXMgb2JqZWN0Ci0gICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgV29yZCBnZXRLZXkoQWRkcmVzcyBvYmopOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFdvcmQgbWFzazE2ID0gV29yZC5mcm9tSW50WmVyb0V4dGVuZCgweGZmZmYwMDAwKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgV29yZCBtYXNrOCA9IFdvcmQuZnJvbUludFplcm9FeHRlbmQoMHgwMDAwZmYwMCk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFdvcmQgbWFzazQgPSBXb3JkLmZyb21JbnRaZXJvRXh0ZW5kKDB4MDAwMDAwZjApOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBXb3JkIG1hc2syID0gV29yZC5mcm9tSW50WmVyb0V4dGVuZCgweDAwMDAwMDBjKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgV29yZCBtYXNrMSA9IFdvcmQuZnJvbUludFplcm9FeHRlbmQoMHgwMDAwMDAwMik7Ci0KLSAgLyoqCi0gICAqIEZpbmQgdGhlIGhpZ2hlc3QgYml0IHRoYXQgaXMgc2V0IGluIGEgbG9uZ3dvcmQgYW5kIHJldHVybiBhIG1hc2sKLSAgICogd2l0aCBvbmx5IHRoYXQgYml0IHNldC4KLSAgICoKLSAgICogQHBhcmFtIGFkZHIgVmFsdWUgZm9yIHdoaWNoIHRoZSBtYXNrIG5lZWRzIHRvIGJlIGZvdW5kCi0gICAqIEByZXR1cm4gVGhlIGhpZ2hlc3QgYml0IHNldCBpbiB0aGUgcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBXb3JkIGdldEJpdE1hc2soV29yZCBhZGRyKSB7Ci0gICAgaW50IHNoaWZ0ID0gMDsKLSAgICBpZiAoIWFkZHIuYW5kKG1hc2sxNikuaXNaZXJvKCkpIHsKLSAgICAgIGFkZHIgPSBhZGRyLnJzaGwoMTYpOwotICAgICAgc2hpZnQgKz0gMTY7Ci0gICAgfQotICAgIGlmICghYWRkci5hbmQobWFzazgpLmlzWmVybygpKSB7Ci0gICAgICBhZGRyID0gYWRkci5yc2hsKDgpOwotICAgICAgc2hpZnQgKz0gODsKLSAgICB9Ci0gICAgaWYgKCFhZGRyLmFuZChtYXNrNCkuaXNaZXJvKCkpIHsKLSAgICAgIGFkZHIgPSBhZGRyLnJzaGwoNCk7Ci0gICAgICBzaGlmdCArPSA0OwotICAgIH0KLSAgICBpZiAoIWFkZHIuYW5kKG1hc2syKS5pc1plcm8oKSkgewotICAgICAgYWRkciA9IGFkZHIucnNobCgyKTsKLSAgICAgIHNoaWZ0ICs9IDI7Ci0gICAgfQotICAgIGlmICghYWRkci5hbmQobWFzazEpLmlzWmVybygpKSB7Ci0gICAgICBzaGlmdCArPSAxOwotICAgIH0KLSAgICByZXR1cm4gKFdvcmQub25lKCkubHNoKHNoaWZ0KSk7Ci0gIH0KLQotICAvKioKLSAgICogUGVyZm9ybSBpbnNlcnRpb24gc29ydCB3aXRoaW4gYW4gaW50cmEtYmxvY2sgYWRkcmVzcyByYW5nZS4KLSAgICoKLSAgICogIEBwYXJhbSBiZWdpbiBTdGFydCBhZGRyZXNzIG9mIHRoZSByYW5nZSB0byBiZSBzb3J0ZWQKLSAgICogIEBwYXJhbSBlbmQgRW5kIGFkZHJlc3Mgb2YgdGhlIHJhbmdlIHRvIGJlIHNvcnRlZAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluc2VydGlvblNvcnQoQWRkcmVzcyBiZWdpbiwgQWRkcmVzcyBlbmQpIHsKLSAgICBBZGRyZXNzIHJQdHIgPSBiZWdpbi5taW51cyhCWVRFU19JTl9BRERSRVNTKTsKLSAgICBBZGRyZXNzIGxQdHI7Ci0KLSAgICB3aGlsZSAoclB0ci5HRShlbmQpKSB7Ci0gICAgICBBZGRyZXNzIHJTbG90ID0gclB0ci5sb2FkQWRkcmVzcygpOwotICAgICAgV29yZCByS2V5ID0gZ2V0S2V5KHJTbG90KTsKLSAgICAgIGxQdHIgPSByUHRyLnBsdXMoQllURVNfSU5fQUREUkVTUyk7Ci0gICAgICB3aGlsZSAobFB0ci5MRShiZWdpbikpIHsKLSAgICAgICAgQWRkcmVzcyBsU2xvdCA9IGxQdHIubG9hZEFkZHJlc3MoKTsKLSAgICAgICAgV29yZCBsS2V5ID0gZ2V0S2V5KGxTbG90KTsKLSAgICAgICAgaWYgKGxLZXkuR1QocktleSkpIHsKLSAgICAgICAgICBsUHRyLm1pbnVzKEJZVEVTX0lOX0FERFJFU1MpLnN0b3JlKGxTbG90KTsKLSAgICAgICAgICBsUHRyID0gbFB0ci5wbHVzKEJZVEVTX0lOX0FERFJFU1MpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBsUHRyLm1pbnVzKEJZVEVTX0lOX0FERFJFU1MpLnN0b3JlKHJTbG90KTsKLSAgICAgIHJQdHIgPSByUHRyLm1pbnVzKEJZVEVTX0lOX0FERFJFU1MpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTb3J0IG9iamVjdHMgdXNpbmcgcmFkaXggZXhjaGFuZ2Ugc29ydC4gQW4gZXhwbGljaXQgc3RhY2sgaXMKLSAgICogIG1haW50YWluZWQgdG8gYXZvaWQgdXNpbmcgcmVjdXJzaW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgc29ydCgpIHsKLSAgICBBZGRyZXNzIHN0YXJ0UHRyLCBzdGFydExpbmssIGVuZFB0ciwgZW5kTGluazsKLSAgICBXb3JkIGJpdE1hc2s7Ci0gICAgaWYgKCFoZWFkLkVRKEhFQURfSU5JVElBTF9WQUxVRSkpIHsKLSAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KHRhaWwuTkUoVEFJTF9JTklUSUFMX1ZBTFVFKSk7Ci0gICAgICAvKiBPYnRhaW4gdGhlIGJpdG1hc2sgZm9yIHRoZSBmaXJzdCBpdGVyYXRpb24gYW5kIHNhdmUgdGhlIHN0YXJ0ICYKLSAgICAgICAgIGVuZCBwb2ludGVycyBhbmQgdGhlIGJpdG1hc2sgb24gdGhlIHN0YWNrICovCi0gICAgICBpbml0U3RhY2soKTsKLSAgICAgIHN0YXJ0UHRyID0gcG9wU3RhY2soKTsKLSAgICAgIHdoaWxlICghc3RhcnRQdHIuaXNaZXJvKCkpIHsKLSAgICAgICAgc3RhcnRMaW5rID0gcG9wU3RhY2soKTsKLSAgICAgICAgZW5kUHRyID0gcG9wU3RhY2soKTsKLSAgICAgICAgZW5kTGluayA9IHBvcFN0YWNrKCk7Ci0gICAgICAgIGJpdE1hc2sgPSAocG9wU3RhY2soKSkudG9Xb3JkKCk7Ci0gICAgICAgIGlmIChzdGFydExpbmsuTkUoZW5kTGluaykpIHsKLSAgICAgICAgICBwYXJ0aXRpb24oc3RhcnRQdHIsIHN0YXJ0TGluaywgZW5kUHRyLCBlbmRMaW5rLCBiaXRNYXNrKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdGFydFB0ci5HVChlbmRQdHIpKSB7Ci0gICAgICAgICAgLyogVXNlIGluc2VydGlvblNvcnQgZm9yIGEgbGltaXRlZCBudW1iZXIgb2Ygb2JqZWN0cyB3aXRoaW4KLSAgICAgICAgICAgICBhIHNpbmdsZSBibG9jayAqLwotICAgICAgICAgIGlmIChzdGFydFB0ci5kaWZmKGVuZFB0cikuc0xUKElOU0VSVElPTl9TT1JUX0xJTUlUKSkgewotICAgICAgICAgICAgaW5zZXJ0aW9uU29ydChzdGFydFB0ciwgZW5kUHRyKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGFydGl0aW9uKHN0YXJ0UHRyLCBzdGFydExpbmssIGVuZFB0ciwgZW5kTGluaywgYml0TWFzayk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIEdldCB0aGUgbmV4dCBzZXQgb2YgZGF0YSB0byBzb3J0Ci0gICAgICAgIHN0YXJ0UHRyID0gcG9wU3RhY2soKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2hlY2tJZlNvcnRlZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnRpdGlvbiB0aGUgc2xvdHMgaW4gYW4gYWRkcmVzcyByYW5nZSBiYXNlZCBvbiB0aGUgdmFsdWUgaW4KLSAgICogYSBwYXJ0aWN1bGFyIGJpdC4gUGxhY2UgdGhlIHN0YXJ0ICYgZW5kIGFkZHJlc3NlcyBvZiB0aGUgdHdvCi0gICAqIHBhcnRpdGlvbnMgJiBhIGJpdG1hc2sgcGVyIHBhcnRpdGlvbiAod2hpY2ggaW5kaWNhdGVzIHRoZSBoaWdoZXN0Ci0gICAqIGJpdCBwb3NpdGlvbiBhdCB3aGljaCB0aGUgbWF4ICYgbWluIG9mIGEgcGFydGl0aW9uIGRpZmZlcikgb24gdGhlCi0gICAqIHN0YWNrLiBUaGlzIHdvcmtzIGp1c3QgbGlrZSB0aGUgcGFydGl0aW9uIGluIHF1aWNrIHNvcnQsIGV4Y2VwdAotICAgKiB0aGF0IGEgYml0IHZhbHVlIGlzIGJlaW5nIGNvbXBhcmVkIGhlcmUKLSAgICoKLSAgICogQHBhcmFtIHN0YXJ0QWRkciBUaGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgcmFuZ2UgdG8gYmUgc29ydGVkCi0gICAqIEBwYXJhbSBzdGFydExpbmtBZGRyIFRoZSBhZGRyZXNzIHdoZXJlIHRoZSBzdGFydCBibG9jayBoYXMgaXRzIG5leHQgZmllbGQKLSAgICogQHBhcmFtIGVuZEFkZHIgVGhlIGVuZCBhZGRyZXNzIG9mIHRoZSByYW5nZSB0byBiZSBzb3J0ZWQKLSAgICogQHBhcmFtIGVuZExpbmtBZGRyIFRoZSBhZGRyZXNzIHdoZXJlIHRoZSBlbmQgYmxvY2sgaGFzIGl0cyBuZXh0IGZpZWxkCi0gICAqIEBwYXJhbSBiaXRNYXNrIFRoZSBtYXNrIGluIHdoaWNoIHRoZSBiaXQgdG8gYmUgY29tbXBhcmVkIGlzIHNldAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHBhcnRpdGlvbihBZGRyZXNzIHN0YXJ0QWRkciwgQWRkcmVzcyBzdGFydExpbmtBZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgZW5kQWRkciwgQWRkcmVzcyBlbmRMaW5rQWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkIGJpdE1hc2spIHsKLSAgICBBZGRyZXNzIHRyYXZQdHIgPSBlbmRBZGRyOwotICAgIEFkZHJlc3MgdHJhdkxpbmsgPSBlbmRMaW5rQWRkcjsKLSAgICBBZGRyZXNzIHN0b3BQdHIgPSBzdGFydEFkZHI7Ci0gICAgQWRkcmVzcyBzdG9wTGluayA9IHN0YXJ0TGlua0FkZHI7Ci0gICAgQWRkcmVzcyB0cmF2U2xvdCwgc3RvcFNsb3Q7Ci0gICAgV29yZCB0cmF2S2V5LCBzdG9wS2V5OwotICAgIFdvcmQgbG1heCA9IFdvcmQuemVybygpLCBybWF4ID0gV29yZC56ZXJvKCk7Ci0gICAgV29yZCBsbWluID0gV29yZC5tYXgoKSwgcm1pbiA9IFdvcmQubWF4KCk7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgLyogQ29tcHV0ZSB0aGUgYWRkcmVzcyByYW5nZSB3aXRoaW4gdGhlIGN1cnJlbnQgYmxvY2sgdG8gY29tcHV0ZS4gKi8KLSAgICAgIEFkZHJlc3MgZW5kT2ZCbG9jayA9IHRyYXZMaW5rOwotCi0gICAgICAvKiBNb3ZlIHRoZSBsZWZ0IHBvaW50ZXIgdW50aWwgdGhlIHJpZ2h0IHBvaW50ZXIgaXMgcmVhY2hlZAotICAgICAgICAgb3IgYW4gYWRkcmVzcyB3aXRoIGEgMCB2YWx1ZSBpbiB0aGUgYml0IHBvc2l0aW9uIGlzIGZvdW5kLiAqLwotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgdHJhdlNsb3QgPSB0cmF2UHRyLmxvYWRBZGRyZXNzKCk7Ci0gICAgICAgIHRyYXZLZXkgPSBnZXRLZXkodHJhdlNsb3QpOwotCi0gICAgICAgIC8qIElmIHdlIHJlYWNoIHRoZSBlbmQuICovCi0gICAgICAgIGlmICh0cmF2UHRyLkVRKHN0b3BQdHIpKQotICAgICAgICAgIGJyZWFrOwotICAgICAgICAvKiBJZiB3ZSBmb3VuZCBhIDAgaW4gYml0IHBvc2l0aW9uLCBicmVhay4gKi8KLSAgICAgICAgaWYgKHRyYXZLZXkuYW5kKGJpdE1hc2spLmlzWmVybygpKQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAodHJhdktleS5HVChybWF4KSkKLSAgICAgICAgICBybWF4ID0gdHJhdktleTsKLSAgICAgICAgaWYgKHRyYXZLZXkuTFQocm1pbikpCi0gICAgICAgICAgcm1pbiA9IHRyYXZLZXk7Ci0gICAgICAgIC8qIE1vdmUgdG8gdGhlIG5leHQgZW50cnkuICovCi0gICAgICAgIHRyYXZQdHIgPSB0cmF2UHRyLnBsdXMoQllURVNfSU5fQUREUkVTUyk7Ci0gICAgICAgIC8qIElmIGF0IGVuZCBvZiByZW1zZXQgYmxvY2ssIG1vdmUgdG8gbmV4dCBibG9jayAqLwotICAgICAgICBpZiAodHJhdlB0ci5FUShlbmRPZkJsb2NrKSkgewotICAgICAgICAgIHRyYXZMaW5rID0gZ2V0UHJldih0cmF2UHRyKTsKLSAgICAgICAgICBlbmRPZkJsb2NrID0gdHJhdkxpbms7Ci0gICAgICAgICAgdHJhdlB0ciA9IGJ1ZmZlclN0YXJ0KGVuZE9mQmxvY2spOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIFN0b3JlIHRoZSBlbmQgb2YgdGhlIGJsb2NrLiAqLwotICAgICAgZW5kT2ZCbG9jayA9IGJ1ZmZlclN0YXJ0KHN0b3BQdHIpOwotICAgICAgLyogTW92ZSB0aGUgcmlnaHQgcG9pbnRlciB1bnRpbCB0aGUgbGVmdCBwb2ludGVyIGlzIHJlYWNoZWQKLSAgICAgICAgIG9yIGFuIGFkZHJlc3Mgd2l0aCBhIDEgdmFsdWUgaW4gdGhlIGJpdCBwb3NpdGlvbiBpcyBmb3VuZC4gKi8KLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN0b3BTbG90ID0gc3RvcFB0ci5sb2FkQWRkcmVzcygpOwotICAgICAgICBzdG9wS2V5ID0gZ2V0S2V5KHN0b3BTbG90KTsKLSAgICAgICAgLyogRm91bmQgYSAxIGluIGJpdCBwb3NpdGlvbiwgYnJlYWsuICovCi0gICAgICAgIGlmICghc3RvcEtleS5hbmQoYml0TWFzaykuaXNaZXJvKCkpCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmIChzdG9wS2V5LkdUKGxtYXgpKQotICAgICAgICAgIGxtYXggPSBzdG9wS2V5OwotICAgICAgICBpZiAoc3RvcEtleS5MVChsbWluKSkKLSAgICAgICAgICBsbWluID0gc3RvcEtleTsKLSAgICAgICAgaWYgKHN0b3BQdHIuRVEodHJhdlB0cikpCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qIE1vdmUgdG8gdGhlIG5leHQgZW50cnksIHdoaWNoIG1heSBiZSBpbiB0aGUgbmV4dCBibG9jay4gKi8KLSAgICAgICAgaWYgKHN0b3BQdHIuRVEoZW5kT2ZCbG9jaykpIHsKLSAgICAgICAgICBzdG9wTGluayA9IGdldE5leHQoc3RvcExpbmspOwotICAgICAgICAgIHN0b3BQdHIgPSBzdG9wTGluazsKLSAgICAgICAgICBlbmRPZkJsb2NrID0gYnVmZmVyU3RhcnQoc3RvcFB0cik7Ci0gICAgICAgIH0KLSAgICAgICAgc3RvcFB0ciA9IHN0b3BQdHIubWludXMoQllURVNfSU5fQUREUkVTUyk7Ci0gICAgICB9Ci0gICAgICBpZiAoc3RvcFB0ci5FUSh0cmF2UHRyKSkKLSAgICAgICAgYnJlYWs7Ci0gICAgICAvKiBpbnRlcmNoYW5nZSB0aGUgdmFsdWVzIHBvaW50ZWQgdG8gYnkgdGhlIGxlZnQgYW5kIHJpZ2h0IHBvaW50ZXJzICovCi0gICAgICB0cmF2UHRyLnN0b3JlKHN0b3BTbG90KTsKLSAgICAgIHN0b3BQdHIuc3RvcmUodHJhdlNsb3QpOwotICAgIH0KLQotICAgIC8qIElmIG1heCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gdGhlIG1pbiB2YWx1ZSBpbiB0aGUgcmlnaHQgcGFydGl0aW9uLAotICAgICAgIChub3QgYWxsIHNsb3RzIGFyZSBpZGVudGljYWwpIHB1c2ggdGhlIHJpZ2h0IHBhcnRpdGlvbiBvbiB0byB0aGUgc3RhY2sgKi8KLSAgICBpZiAocm1heC5HVChybWluKSkgewotICAgICAgaWYgKHRyYXZQdHIuRVEoYnVmZmVyU3RhcnQodHJhdlB0cikpKSB7Ci0gICAgICAgIHN0b3BMaW5rID0gZ2V0TmV4dCh0cmF2TGluayk7Ci0gICAgICAgIHN0b3BQdHIgPSBzdG9wTGluazsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0b3BMaW5rID0gdHJhdkxpbms7Ci0gICAgICAgIHN0b3BQdHIgPSB0cmF2UHRyOwotICAgICAgfQotICAgICAgcHVzaE9uU3RhY2soZ2V0Qml0TWFzayhybWF4LnhvcihybWluKSkudG9BZGRyZXNzKCkpOwotICAgICAgcHVzaE9uU3RhY2soZW5kTGlua0FkZHIpOwotICAgICAgcHVzaE9uU3RhY2soZW5kQWRkcik7Ci0gICAgICBwdXNoT25TdGFjayhzdG9wTGluayk7Ci0gICAgICBwdXNoT25TdGFjayhzdG9wUHRyLm1pbnVzKEJZVEVTX0lOX0FERFJFU1MpKTsKLSAgICB9Ci0gICAgLyogaWYgbWF4IHZhbHVlIGlzIG5vdCBlcXVhbCB0byB0aGUgbWluIHZhbHVlIGluIHRoZSBsZWZ0IHBhcnRpdGlvbiwKLSAgICAgICAobm90IGFsbCBzbG90cyBhcmUgaWRlbnRpY2FsKSBwdXNoIHRoZSBsZWZ0IHBhcnRpdGlvbiBvbiB0byB0aGUgc3RhY2sgKi8KLSAgICBpZiAobG1heC5HVChsbWluKSkgewotICAgICAgcHVzaE9uU3RhY2soZ2V0Qml0TWFzayhsbWF4LnhvcihsbWluKSkudG9BZGRyZXNzKCkpOwotICAgICAgcHVzaE9uU3RhY2sodHJhdkxpbmspOwotICAgICAgcHVzaE9uU3RhY2sodHJhdlB0cik7Ci0gICAgICBwdXNoT25TdGFjayhzdGFydExpbmtBZGRyKTsKLSAgICAgIHB1c2hPblN0YWNrKHN0YXJ0QWRkcik7Ci0gICAgfQotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogU29ydGluZyBTdGFjayBtYW5hZ2VtZW50IHJvdXRpbmVzCi0gICAqLwotICBwcml2YXRlIGludCBzdGFja0xvYzsKLSAgcHJpdmF0ZSBBZGRyZXNzQXJyYXkgc3RhY2tCYXNlOwotCi0gIC8qCi0gICAqIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHN0YWNrIGFuZCBpbnRpYWxpemUgaXQgd2l0aCB0aGUgZmlyc3QgcmFuZ2UKLSAgICogdG8gcGFydGl0aW9uCi0gICAqLwotICBwcml2YXRlIHZvaWQgaW5pdFN0YWNrKCkgewotICAgIHN0YWNrTG9jID0gMDsKLQotICAgIEFkZHJlc3MgZW5kT2ZCbG9jayA9IHRhaWw7Ci0gICAgQWRkcmVzcyBzdGFydFB0ciA9IGJ1ZmZlclN0YXJ0KGVuZE9mQmxvY2spOwotICAgIFdvcmQgbWluID0gV29yZC5tYXgoKTsKLSAgICBXb3JkIG1heCA9IFdvcmQuemVybygpOwotICAgIC8vIEZpbmQgdGhlIG1heC4gYW5kIG1pbiBhZGRyZXNzZXMgaW4gdGhlIG9iamVjdCBidWZmZXIKLSAgICB3aGlsZSAoZW5kT2ZCbG9jay5ORShIRUFEX0lOSVRJQUxfVkFMVUUpKSB7Ci0gICAgICBzdGFydFB0ciA9IGJ1ZmZlclN0YXJ0KGVuZE9mQmxvY2spOwotICAgICAgd2hpbGUgKHN0YXJ0UHRyLkxUKGVuZE9mQmxvY2spKSB7Ci0gICAgICAgIEFkZHJlc3Mgc3RhcnRTbG90ID0gc3RhcnRQdHIubG9hZEFkZHJlc3MoKTsKLSAgICAgICAgV29yZCBzdGFydEtleSA9IGdldEtleShzdGFydFNsb3QpOwotICAgICAgICBpZiAoc3RhcnRLZXkuR1QobWF4KSkKLSAgICAgICAgICBtYXggPSBzdGFydEtleTsKLSAgICAgICAgaWYgKHN0YXJ0S2V5LkxUKG1pbikpCi0gICAgICAgICAgbWluID0gc3RhcnRLZXk7Ci0gICAgICAgIHN0YXJ0UHRyID0gc3RhcnRQdHIucGx1cyhCWVRFU19JTl9BRERSRVNTKTsKLSAgICAgIH0KLSAgICAgIGVuZE9mQmxvY2sgPSBnZXRQcmV2KHN0YXJ0UHRyKTsKLSAgICB9Ci0KLSAgICAvLyBJZiBtYXggYW5kIG1pbiBhcmUgZGlmZmVyZW50IChub3QgYWxsIGVsZW1lbnRzIGFyZSBlcXVhbCksIHB1c2ggdGhlCi0gICAgLy8gc3RhcnQsIGVuZCBhbmQgYml0bWFzayB2YWx1ZXMgb24gdGhlIHN0YWNrCi0gICAgaWYgKG1heC5HVChtaW4pKSB7Ci0gICAgICBwdXNoT25TdGFjayhnZXRCaXRNYXNrKG1heC54b3IobWluKSkudG9BZGRyZXNzKCkpOwotICAgICAgcHVzaE9uU3RhY2sodGFpbCk7Ci0gICAgICBwdXNoT25TdGFjayhidWZmZXJTdGFydCh0YWlsKSk7Ci0gICAgICBwdXNoT25TdGFjayhzdGFydFB0cik7Ci0gICAgICBwdXNoT25TdGFjayhzdGFydFB0ci5taW51cyhCWVRFU19JTl9BRERSRVNTKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFB1c2ggYW4gYWRkcmVzcyBvbiB0byB0aGUgc3RhY2sKLSAgICoKLSAgKiBAcGFyYW0gdmFsIFRoZSBhZGRyZXNzIHRvIGJlIHB1c2hlZAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHB1c2hPblN0YWNrKEFkZHJlc3MgdmFsKSB7Ci0gICAgc3RhY2tCYXNlLnNldChzdGFja0xvYywgdmFsKTsKLSAgICBzdGFja0xvYysrOwotICB9Ci0KLSAgLyoqCi0gICAqIFBvcCBhbiBhZGRyZXNzIGZyb20gdGhlIHN0YWNrCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGFkZHJlc3MgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2ssIG9yIDAgaWYgc3RhY2sgaXMgZW1wdHkKLSAgICovCi0gIHByaXZhdGUgQWRkcmVzcyBwb3BTdGFjaygpIHsKLSAgICBpZiAoc3RhY2tMb2MgPT0gMCkKLSAgICAgIHJldHVybiBBZGRyZXNzLnplcm8oKTsKLSAgICBzdGFja0xvYy0tOwotICAgIHJldHVybiBzdGFja0Jhc2UuZ2V0KHN0YWNrTG9jKTsKLSAgfQotCi0gIC8qKgotICAgKiBEZWJ1ZyByb3V0aW5lLCB1c2VkIHRvIGNoZWNrIGlmIHRoZSBvYmplY3QgYnVmZmVyIGlzIHNvcnRlZCBjb3JyZWN0bHkgaW4KLSAgICogZGVjcmVhc2luZyBmaW5hbCByZWZlcmVuY2UgZGVsZXRpb24gdGltZQotICovCi0gIHByaXZhdGUgdm9pZCBjaGVja0lmU29ydGVkKCkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgewotICAgICAgQWRkcmVzcyBidWYsIGVuZDsKLSAgICAgIFdvcmQgcHJldktleSA9IFdvcmQubWF4KCk7Ci0gICAgICBlbmQgPSB0YWlsOwotICAgICAgYnVmID0gYnVmZmVyU3RhcnQoZW5kKTsKLSAgICAgIHdoaWxlIChidWYuTkUoSEVBRF9JTklUSUFMX1ZBTFVFKSkgewotICAgICAgICAvLyBpdGVyYXRlIHRocm91Z2ggdGhlIGJsb2NrCi0gICAgICAgIHdoaWxlIChidWYuTFQoZW5kKSkgewotICAgICAgICAgIEFkZHJlc3Mgc2xvdCA9IGJ1Zi5sb2FkQWRkcmVzcygpOwotICAgICAgICAgIFdvcmQga2V5ID0gZ2V0S2V5KHNsb3QpOwotICAgICAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGtleS5MRShwcmV2S2V5KSk7Ci0gICAgICAgICAgcHJldktleSA9IGtleTsKLSAgICAgICAgICBidWYgPSBidWYucGx1cyhCWVRFU19JTl9BRERSRVNTKTsKLSAgICAgICAgfQotICAgICAgICBlbmQgPSBnZXRQcmV2KGVuZCk7Ci0gICAgICAgIGJ1ZiA9IGJ1ZmZlclN0YXJ0KGVuZCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZGVxdWUvU29ydFRPREFkZHJlc3NTdGFjay5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2RlcXVlL1NvcnRUT0RBZGRyZXNzU3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ5ZDVmYS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZGVxdWUvU29ydFRPREFkZHJlc3NTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkuZGVxdWU7Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkNvbnN0YW50czsKLQotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFRoaXMgc3VwcG9ydHMgPGk+dW5zeW5jaHJvbml6ZWQ8L2k+IHB1c2hpbmcgYW5kIHBvcHBpbmcgb2YgYWRkcmVzc2VzLgotICogSW4gYWRkaXRpb24sIHRoaXMgY2FuIHNvcnQgdGhlIGVudHJpZXMgY3VycmVudGx5IG9uIHRoZSBzaGFyZWQgc3RhY2suCi0gKi8KLUBVbmludGVycnVwdGlibGUgcHVibGljIGNsYXNzIFNvcnRUT0RBZGRyZXNzU3RhY2sgZXh0ZW5kcyBMb2NhbERlcXVlCi0gIGltcGxlbWVudHMgQ29uc3RhbnRzIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBQdWJsaWMgaW5zdGFuY2UgbWV0aG9kcwotICAgKi8KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIHF1ZXVlIFRoZSBzaGFyZWQgc3RhY2sgdG8gd2hpY2ggdGhpcyBzdGFjayB3aWxsIGFwcGVuZAotICAgKiBpdHMgYnVmZmVycyAod2hlbiBmdWxsIG9yIGZsdXNoZWQpIGFuZCBmcm9tIHdoaWNoIGl0IHdpbGwgYXF1aXJlIG5ldwotICAgKiBidWZmZXJzIHdoZW4gaXQgaGFzIGV4aGF1c3RlZCBpdHMgb3duLgotICAgKi8KLSAgcHVibGljIFNvcnRUT0RBZGRyZXNzU3RhY2soU29ydFRPRFNoYXJlZERlcXVlIHF1ZXVlKSB7Ci0gICAgc3VwZXIocXVldWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNvcnQgdGhlIGFkZHJlc3Mgb24gdGhlIHNoYXJlZCBzdGFjay4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNvcnQoKSB7Ci0gICAgZmx1c2hMb2NhbCgpOwotICAgICgoU29ydFRPRFNoYXJlZERlcXVlKSBxdWV1ZSkuc29ydCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFB1c2ggYW4gYWRkcmVzcyBvbnRvIHRoZSBhZGRyZXNzIHN0YWNrLgotICAgKgotICAgKiBAcGFyYW0gYWRkciB0aGUgYWRkcmVzcyB0byBiZSBwdXNoZWQgb250byB0aGUgYWRkcmVzcyBxdWV1ZQotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgdm9pZCBwdXNoKEFkZHJlc3MgYWRkcikgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KCFhZGRyLmlzWmVybygpKTsKLSAgICBjaGVja0hlYWRJbnNlcnQoMSk7Ci0gICAgdW5jaGVja2VkSGVhZEluc2VydChhZGRyKTsKLSAgfQotCi0gIC8qKgotICAgKiBQb3AgYW4gYWRkcmVzcyBmcm9tIHRoZSBhZGRyZXNzIHN0YWNrLCByZXR1cm4gemVybyBpZiB0aGUgc3RhY2sKLSAgICogaXMgZW1wdHkuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG5leHQgYWRkcmVzcyBpbiB0aGUgYWRkcmVzcyBzdGFjaywgb3IgemVybyBpZiB0aGUKLSAgICogc3RhY2sgaXMgZW1wdHkKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGZpbmFsIEFkZHJlc3MgcG9wKCkgewotICAgIGlmIChjaGVja0RlcXVldWUoMSkpIHsKLSAgICAgIHJldHVybiB1bmNoZWNrZWREZXF1ZXVlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBBZGRyZXNzLnplcm8oKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2sgaWYgdGhlIChsb2NhbCBhbmQgc2hhcmVkKSBzdGFja3MgYXJlIGVtcHR5LgotICAgKgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlcmUgYXJlIG5vIG1vcmUgZW50cmllcyBvbiB0aGUgbG9jYWwgJiBzaGFyZWQgc3RhY2ssCi0gICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgIHJldHVybiAhY2hlY2tEZXF1ZXVlKDEpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZGVxdWUvU29ydFRPRE9iamVjdFJlZmVyZW5jZVN0YWNrLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZGVxdWUvU29ydFRPRE9iamVjdFJlZmVyZW5jZVN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyN2IxMzEuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2RlcXVlL1NvcnRUT0RPYmplY3RSZWZlcmVuY2VTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkuZGVxdWU7Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkNvbnN0YW50czsKLQotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFRoaXMgc3VwcG9ydHMgPGk+dW5zeW5jaHJvbml6ZWQ8L2k+IHB1c2hpbmcgYW5kIHBvcHBpbmcgb2Ygb2JqZWN0Ci0gKiByZWZlcmVuY2VzLiAgSW4gYWRkaXRpb24sIHRoaXMgY2FuIHNvcnQgdGhlIGVudHJpZXMgY3VycmVudGx5IG9uCi0gKiB0aGUgc2hhcmVkIHN0YWNrLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlIHB1YmxpYyBjbGFzcyBTb3J0VE9ET2JqZWN0UmVmZXJlbmNlU3RhY2sgZXh0ZW5kcyBMb2NhbERlcXVlCi0gIGltcGxlbWVudHMgQ29uc3RhbnRzIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBQdWJsaWMgaW5zdGFuY2UgbWV0aG9kcwotICAgKi8KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIHF1ZXVlIFRoZSBzaGFyZWQgc3RhY2sgdG8gd2hpY2ggdGhpcyBzdGFjayB3aWxsIGFwcGVuZAotICAgKiBpdHMgYnVmZmVycyAod2hlbiBmdWxsIG9yIGZsdXNoZWQpIGFuZCBmcm9tIHdoaWNoIGl0IHdpbGwgYXF1aXJlIG5ldwotICAgKiBidWZmZXJzIHdoZW4gaXQgaGFzIGV4aGF1c3RlZCBpdHMgb3duLgotICAgKi8KLSAgcHVibGljIFNvcnRUT0RPYmplY3RSZWZlcmVuY2VTdGFjayhTb3J0VE9EU2hhcmVkRGVxdWUgcXVldWUpIHsKLSAgICBzdXBlcihxdWV1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogU29ydCB0aGUgYWRkcmVzcyBvbiB0aGUgc2hhcmVkIHN0YWNrLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgc29ydCgpIHsKLSAgICBmbHVzaExvY2FsKCk7Ci0gICAgKChTb3J0VE9EU2hhcmVkRGVxdWUpIHF1ZXVlKS5zb3J0KCk7Ci0gIH0KLQotICAvKioKLSAgICogUHVzaCBhbiBhZGRyZXNzIG9udG8gdGhlIGFkZHJlc3Mgc3RhY2suCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0byBiZSBwdXNoZWQgb250byB0aGUgb2JqZWN0IHF1ZXVlCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHB1c2goT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIEFkZHJlc3MgYWRkciA9IG9iamVjdC50b0FkZHJlc3MoKTsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCghYWRkci5pc1plcm8oKSk7Ci0gICAgY2hlY2tIZWFkSW5zZXJ0KDEpOwotICAgIHVuY2hlY2tlZEhlYWRJbnNlcnQoYWRkcik7Ci0gIH0KLQotICAvKioKLSAgICogUG9wIGFuIGFkZHJlc3MgZnJvbSB0aGUgYWRkcmVzcyBzdGFjaywgcmV0dXJuIHplcm8gaWYgdGhlIHN0YWNrCi0gICAqIGlzIGVtcHR5LgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBuZXh0IGFkZHJlc3MgaW4gdGhlIGFkZHJlc3Mgc3RhY2ssIG9yIHplcm8gaWYgdGhlCi0gICAqIHN0YWNrIGlzIGVtcHR5Ci0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBmaW5hbCBPYmplY3RSZWZlcmVuY2UgcG9wKCkgewotICAgIGlmIChjaGVja0RlcXVldWUoMSkpIHsKLSAgICAgIHJldHVybiB1bmNoZWNrZWREZXF1ZXVlKCkudG9PYmplY3RSZWZlcmVuY2UoKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIE9iamVjdFJlZmVyZW5jZS5udWxsUmVmZXJlbmNlKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIGlmIHRoZSAobG9jYWwgYW5kIHNoYXJlZCkgc3RhY2tzIGFyZSBlbXB0eS4KLSAgICoKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZXJlIGFyZSBubyBtb3JlIGVudHJpZXMgb24gdGhlIGxvY2FsICYgc2hhcmVkIHN0YWNrLAotICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICByZXR1cm4gIWNoZWNrRGVxdWV1ZSgxKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2RlcXVlL1NvcnRUT0RTaGFyZWREZXF1ZS5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2RlcXVlL1NvcnRUT0RTaGFyZWREZXF1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTc2Nzk2Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9kZXF1ZS9Tb3J0VE9EU2hhcmVkRGVxdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5LmRlcXVlOwotCi1pbXBvcnQgb3JnLm1tdGsucG9saWN5LlJhd1BhZ2VTcGFjZTsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHNwZWNpYWxpemVzIFNvcnRTaGFyZWRRdWV1ZSB0byBzb3J0IG9iamVjdHMgYWNjb3JkaW5nIHRvCi0gKiB0aGVpciB0aW1lIG9mIGRlYXRoIChUT0QpLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgZmluYWwgY2xhc3MgU29ydFRPRFNoYXJlZERlcXVlIGV4dGVuZHMgU29ydFNoYXJlZERlcXVlIHsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIHJwcyBUaGUgc3BhY2UgZnJvbSB3aGljaCB0aGUgaW5zdGFuY2Ugc2hvdWxkIG9idGFpbiBidWZmZXJzLgotICAgKiBAcGFyYW0gYXJpdHkgVGhlIGFyaXR5IG9mIHRoZSBkYXRhIHRvIGJlIGVucXVldWVkCi0gICAqLwotICBwdWJsaWMgU29ydFRPRFNoYXJlZERlcXVlKFN0cmluZyBuYW1lLCBSYXdQYWdlU3BhY2UgcnBzLCBpbnQgYXJpdHkpIHsKLSAgICBzdXBlcihuYW1lLCBycHMsIGFyaXR5KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHNvcnRpbmcga2V5IGZvciB0aGUgb2JqZWN0IHBhc3NlZCBhcyBhIHBhcmFtZXRlci4KLSAgICoKLSAgICogQHBhcmFtIG9iaiBUaGUgYWRkcmVzcyBvZiB0aGUgb2JqZWN0IHdob3NlIGtleSBpcyB3YW50ZWQKLSAgICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIHNvcnRpbmcga2V5IGZvciB0aGlzIG9iamVjdAotICAgKi8KLSAgcHJvdGVjdGVkIFdvcmQgZ2V0S2V5KEFkZHJlc3Mgb2JqKSB7Ci0gICAgcmV0dXJuIFZNLnRyYWNlSW50ZXJmYWNlLmdldERlYXRoVGltZShvYmoudG9PYmplY3RSZWZlcmVuY2UoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9kZXF1ZS9UcmFjZUJ1ZmZlci5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2RlcXVlL1RyYWNlQnVmZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNzNiYjIuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2RlcXVlL1RyYWNlQnVmZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkuZGVxdWU7Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkxvZzsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LlRyYWNpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Db25zdGFudHM7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogVGhpcyBzdXBwb3J0cyA8aT51bnN5bmNocm9uaXplZDwvaT4gZW5xdWV1aW5nIGFuZCBkZXF1ZXVpbmcgb2YgdHJhY2luZyBkYXRhCi0gKiBhbmQgYnVsayBwcm9jZXNzaW5nIG9mIHRoZSBidWZmZXIuCi0gKi8KLUBVbmludGVycnVwdGlibGUgcHVibGljIGNsYXNzIFRyYWNlQnVmZmVyIGV4dGVuZHMgTG9jYWxRdWV1ZQotICBpbXBsZW1lbnRzIENvbnN0YW50cywgVHJhY2luZ0NvbnN0YW50cyB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENsYXNzIGJhc2VkIGNvbnN0YW50cwotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgV29yZCBUUkFDRV9ORVdfUkVDT1JEID0gV29yZC5mcm9tSW50U2lnbkV4dGVuZCgzKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgV29yZCBUUkFDRV9BTExPQ19TSVpFID0gV29yZC5mcm9tSW50U2lnbkV4dGVuZCg1KTsKLS8vICBwcml2YXRlIHN0YXRpYyBmaW5hbCBXb3JkIFRSQUNFX0FMTE9DX05BTUUgPSBXb3JkLmZyb21JbnRTaWduRXh0ZW5kKDYpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBXb3JkIFRSQUNFX0FMTE9DX0ZQID0gV29yZC5mcm9tSW50U2lnbkV4dGVuZCg3KTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgV29yZCBUUkFDRV9BTExPQ19USFJFQUQgPSBXb3JkLmZyb21JbnRTaWduRXh0ZW5kKDkpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBXb3JkIFRSQUNFX1RJQl9WQUxVRSA9IFdvcmQuZnJvbUludFNpZ25FeHRlbmQoMTApOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBXb3JkIFRSQUNFX0RFQVRIX1RJTUUgPSBXb3JkLmZyb21JbnRTaWduRXh0ZW5kKDExKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgV29yZCBUUkFDRV9GSUVMRF9UQVJHRVQgPSBXb3JkLmZyb21JbnRTaWduRXh0ZW5kKDEyKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgV29yZCBUUkFDRV9BUlJBWV9UQVJHRVQgPSBXb3JkLmZyb21JbnRTaWduRXh0ZW5kKDEzKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgV29yZCBUUkFDRV9GSUVMRF9TTE9UID0gV29yZC5mcm9tSW50U2lnbkV4dGVuZCgxNCk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFdvcmQgVFJBQ0VfQVJSQVlfRUxFTUVOVCA9IFdvcmQuZnJvbUludFNpZ25FeHRlbmQoMTUpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBXb3JkIFRSQUNFX1NUQVRJQ19UQVJHRVQgPSBXb3JkLmZyb21JbnRTaWduRXh0ZW5kKDE3KTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgV29yZCBUUkFDRV9CT09UX0FMTE9DX1NJWkUgPSBXb3JkLmZyb21JbnRTaWduRXh0ZW5kKDE4KTsKLQotICAvKgotICAgKiBEZWJ1Z2dpbmcgYW5kIHRyYWNlIHJlZHVjaW5nIGNvbnN0YW50cwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIE9NSVRfQUxMT0NTPWZhbHNlOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gT01JVF9VUERBVEVTPWZhbHNlOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gT01JVF9CT09UQUxMT0NTPWZhbHNlOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gT01JVF9VTlJFQUNIQUJMRVM9ZmFsc2U7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBPTUlUX09USEVSUz1mYWxzZTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIE9NSVRfT1VUUFVUPU9NSVRfQUxMT0NTICYmIE9NSVRfVVBEQVRFUyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01JVF9PVEhFUlM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogUHVibGljIG1ldGhvZHMKLSAgICovCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSBwb29sIFRoZSBzaGFyZWQgcXVldWUgdG8gd2hpY2ggdGhpcyBxdWV1ZSB3aWxsIGFwcGVuZCBpdHMKLSAgICogYnVmZmVycyAod2hlbiBmdWxsIG9yIGZsdXNoZWQpIGFuZCBmcm9tIHdoaWNoIGl0IHdpbGwgYXF1aXJlIG5ldwotICAgKiBidWZmZXJzIHdoZW4gaXQgaGFzIGV4aGF1c3RlZCBpdHMgb3duLgotICAgKi8KLSAgcHVibGljIFRyYWNlQnVmZmVyKFNoYXJlZERlcXVlIHBvb2wpIHsKLSAgICBzdXBlcihwb29sKTsKLSAgfQotCi0gIC8qKgotICAgKiBQdXNoIHdvcmQgb250byB0aGUgdHJhY2luZyBxdWV1ZS4KLSAgICoKLSAgICogQHBhcmFtIGkgVGhlIGRhdGEgdG8gYmUgcHVzaGVkIG9udG8gdGhlIHRyYWNpbmcgcXVldWUKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGZpbmFsIHZvaWQgcHVzaChXb3JkIGkpIHsKLSAgICBjaGVja1RhaWxJbnNlcnQoMSk7Ci0gICAgdW5jaGVja2VkVGFpbEluc2VydChpLnRvQWRkcmVzcygpKTsKLSAgfQotCi0gIC8qKgotICAgKiBQcm9jZXNzIHRoZSBkYXRhIGluIHRoZSB0cmFjaW5nIGJ1ZmZlciwgb3V0cHV0IGluZm9ybWF0aW9uIGFzIG5lZWRlZC4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgV29yZCB0cmFjZVN0YXRlID0gVFJBQ0VfTkVXX1JFQ09SRDsKLSAgICBpbnQgZW50cmllc05vdEZsdXNoZWQgPSAwOwotICAgIGJvb2xlYW4gbG9nZ2VkUmVjb3JkID0gZmFsc2U7Ci0gICAgLyogRmlyc3Qgd2UgbXVzdCBmbHVzaCBhbnkgcmVtYWluaW5nIGRhdGEgKi8KLSAgICBpZiAoIU9NSVRfT1VUUFVUKSBMb2cud3JpdGVsbigpOwotCi0gICAgLyogUHJvY2VzcyB0aHJvdWdoIHRoZSBlbnRpcmUgYnVmZmVyLiAqLwotICAgIHdoaWxlIChjaGVja0RlcXVldWUoMSkpIHsKLSAgICAgIC8qIEZvciBzcGVlZCBhbmQgZWZmaWNpZW5jeSwgd2Ugd2lsbCBhY3R1YWxseSBwcm9jZXNzIHRoZSBkYXRhIGJ1ZmZlciBieQotICAgICAgICAgYnVmZmVyIGFuZCBub3QgYnkgZGVxdWV1ZS1pbmcgZWFjaCBlbnRyeS4gKi8KLSAgICAgIHdoaWxlICghYnVmZmVyT2Zmc2V0KGhlYWQpLmlzWmVybygpKSB7Ci0gICAgICAgIGhlYWQgPSBoZWFkLm1pbnVzKEJZVEVTX0lOX0FERFJFU1MpOwotICAgICAgICBXb3JkIHZhbCA9IGhlYWQubG9hZFdvcmQoKTsKLSAgICAgICAgaWYgKHRyYWNlU3RhdGUuRVEoVFJBQ0VfTkVXX1JFQ09SRCkpIHsKLSAgICAgICAgICBsb2dnZWRSZWNvcmQgPSBmYWxzZTsKLSAgICAgICAgICBpZiAodmFsLkVRKFRSQUNFX0dDU1RBUlQpKSB7Ci0gICAgICAgICAgICBpZiAoIU9NSVRfT1RIRVJTKSB7Ci0gICAgICAgICAgICAgIExvZy53cml0ZSgnRycpOwotICAgICAgICAgICAgICBMb2cud3JpdGUoJ0MnKTsKLSAgICAgICAgICAgICAgTG9nLndyaXRlbG4oJ0InLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgaWYgKHZhbC5FUShUUkFDRV9HQ0VORCkpIHsKLSAgICAgICAgICAgIGlmICghT01JVF9PVEhFUlMpIHsKLSAgICAgICAgICAgICAgTG9nLndyaXRlKCdHJyk7Ci0gICAgICAgICAgICAgIExvZy53cml0ZSgnQycpOwotICAgICAgICAgICAgICBMb2cud3JpdGVsbignRScsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cmFjZVN0YXRlID0gdmFsOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAodHJhY2VTdGF0ZS5FUShUUkFDRV9FWEFDVF9BTExPQykgfHwKLSAgICAgICAgICAgICAgdHJhY2VTdGF0ZS5FUShUUkFDRV9BTExPQykpIHsKLSAgICAgICAgICAgIGlmICghT01JVF9BTExPQ1MpIHsKLSAgICAgICAgICAgICAgTG9nLndyaXRlKCh0cmFjZVN0YXRlLkVRKFRSQUNFX0VYQUNUX0FMTE9DKSkgPyAnQScgOiAnYScpOwotICAgICAgICAgICAgICBMb2cud3JpdGUoJyAnKTsKLSAgICAgICAgICAgICAgTG9nLndyaXRlKHZhbCk7Ci0gICAgICAgICAgICAgIGxvZ2dlZFJlY29yZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cmFjZVN0YXRlID0gVFJBQ0VfQUxMT0NfU0laRTsKLSAgICAgICAgICB9IGVsc2UgaWYgKHRyYWNlU3RhdGUuRVEoVFJBQ0VfRVhBQ1RfSU1NT1JUQUxfQUxMT0MpIHx8Ci0gICAgICAgICAgICAgICAgICAgICB0cmFjZVN0YXRlLkVRKFRSQUNFX0lNTU9SVEFMX0FMTE9DKSkgewotICAgICAgICAgICAgaWYgKCFPTUlUX0FMTE9DUykgewotICAgICAgICAgICAgICBMb2cud3JpdGUoKHRyYWNlU3RhdGUuRVEoVFJBQ0VfRVhBQ1RfSU1NT1JUQUxfQUxMT0MpKSA/ICdJJyA6ICdpJyk7Ci0gICAgICAgICAgICAgIExvZy53cml0ZSgnICcpOwotICAgICAgICAgICAgICBMb2cud3JpdGUodmFsKTsKLSAgICAgICAgICAgICAgbG9nZ2VkUmVjb3JkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyYWNlU3RhdGUgPSBUUkFDRV9BTExPQ19TSVpFOwotICAgICAgICAgIH0gZWxzZSBpZiAodHJhY2VTdGF0ZS5FUShUUkFDRV9CT09UX0FMTE9DKSkgewotICAgICAgICAgICAgaWYgKCFPTUlUX0JPT1RBTExPQ1MpIHsKLSAgICAgICAgICAgICAgTG9nLndyaXRlKCdCJyk7Ci0gICAgICAgICAgICAgIExvZy53cml0ZSgnICcpOwotICAgICAgICAgICAgICBMb2cud3JpdGUodmFsKTsKLSAgICAgICAgICAgICAgbG9nZ2VkUmVjb3JkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyYWNlU3RhdGUgPSBUUkFDRV9CT09UX0FMTE9DX1NJWkU7Ci0gICAgICAgICAgfSBlbHNlIGlmICh0cmFjZVN0YXRlLkVRKFRSQUNFX0RFQVRIKSkgewotICAgICAgICAgICAgaWYgKCFPTUlUX1VOUkVBQ0hBQkxFUykgewotICAgICAgICAgICAgICBMb2cud3JpdGUoJ0QnKTsKLSAgICAgICAgICAgICAgTG9nLndyaXRlKCcgJyk7Ci0gICAgICAgICAgICAgIExvZy53cml0ZSh2YWwpOwotICAgICAgICAgICAgICBsb2dnZWRSZWNvcmQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJhY2VTdGF0ZSA9IFRSQUNFX0RFQVRIX1RJTUU7Ci0gICAgICAgICAgfSBlbHNlIGlmICh0cmFjZVN0YXRlLkVRKFRSQUNFX0JPT1RfQUxMT0NfU0laRSkpIHsKLSAgICAgICAgICAgIGlmICghT01JVF9CT09UQUxMT0NTKQotICAgICAgICAgICAgICBMb2cud3JpdGUodmFsKTsKLSAgICAgICAgICAgIHRyYWNlU3RhdGUgPSBUUkFDRV9ORVdfUkVDT1JEOwotICAgICAgICAgIH0gZWxzZSBpZiAodHJhY2VTdGF0ZS5FUShUUkFDRV9BTExPQ19TSVpFKSkgewotICAgICAgICAgICAgaWYgKCFPTUlUX0FMTE9DUykKLSAgICAgICAgICAgICAgTG9nLndyaXRlKHZhbCk7Ci0gICAgICAgICAgICB0cmFjZVN0YXRlID0gVFJBQ0VfQUxMT0NfRlA7Ci0gICAgICAgICAgfSBlbHNlIGlmICh0cmFjZVN0YXRlLkVRKFRSQUNFX0FMTE9DX0ZQKSkgewotICAgICAgICAgICAgaWYgKCFPTUlUX0FMTE9DUykKLSAgICAgICAgICAgICAgTG9nLndyaXRlKHZhbCk7Ci0gICAgICAgICAgICB0cmFjZVN0YXRlID0gVFJBQ0VfQUxMT0NfVEhSRUFEOwotICAgICAgICAgIH0gZWxzZSBpZiAodHJhY2VTdGF0ZS5FUShUUkFDRV9BTExPQ19USFJFQUQpKSB7Ci0gICAgICAgICAgICBpZiAoIU9NSVRfQUxMT0NTKQotICAgICAgICAgICAgICBMb2cud3JpdGUodmFsKTsKLSAgICAgICAgICAgIHRyYWNlU3RhdGUgPSBUUkFDRV9ORVdfUkVDT1JEOwotICAgICAgICAgIH0gZWxzZSBpZiAodHJhY2VTdGF0ZS5FUShUUkFDRV9USUJfU0VUKSkgewotICAgICAgICAgICAgaWYgKCFPTUlUX1VQREFURVMpIHsKLSAgICAgICAgICAgICAgTG9nLndyaXRlKCdUJyk7Ci0gICAgICAgICAgICAgIExvZy53cml0ZSgnICcpOwotICAgICAgICAgICAgICBMb2cud3JpdGUodmFsKTsKLSAgICAgICAgICAgICAgbG9nZ2VkUmVjb3JkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyYWNlU3RhdGUgPSBUUkFDRV9USUJfVkFMVUU7Ci0gICAgICAgICAgfSBlbHNlIGlmICh0cmFjZVN0YXRlLkVRKFRSQUNFX1NUQVRJQ19TRVQpKSB7Ci0gICAgICAgICAgICBpZiAoIU9NSVRfVVBEQVRFUykgewotICAgICAgICAgICAgICBMb2cud3JpdGUoJ1MnKTsKLSAgICAgICAgICAgICAgTG9nLndyaXRlKCcgJyk7Ci0gICAgICAgICAgICAgIExvZy53cml0ZSh2YWwpOwotICAgICAgICAgICAgICBsb2dnZWRSZWNvcmQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJhY2VTdGF0ZSA9IFRSQUNFX1NUQVRJQ19UQVJHRVQ7Ci0gICAgICAgICAgfSBlbHNlIGlmICh0cmFjZVN0YXRlLkVRKFRSQUNFX1RJQl9WQUxVRSkgfHwKLSAgICAgICAgICAgICAgICAgICAgIHRyYWNlU3RhdGUuRVEoVFJBQ0VfU1RBVElDX1RBUkdFVCkpIHsKLSAgICAgICAgICAgIGlmICghT01JVF9VUERBVEVTKQotICAgICAgICAgICAgICBMb2cud3JpdGUodmFsKTsKLSAgICAgICAgICAgIHRyYWNlU3RhdGUgPSBUUkFDRV9ORVdfUkVDT1JEOwotICAgICAgICAgIH0gZWxzZSBpZiAodHJhY2VTdGF0ZS5FUShUUkFDRV9ERUFUSF9USU1FKSkgewotICAgICAgICAgICAgaWYgKCFPTUlUX1VOUkVBQ0hBQkxFUykKLSAgICAgICAgICAgICAgTG9nLndyaXRlKHZhbCk7Ci0gICAgICAgICAgICB0cmFjZVN0YXRlID0gVFJBQ0VfTkVXX1JFQ09SRDsKLSAgICAgICAgICB9IGVsc2UgaWYgKHRyYWNlU3RhdGUuRVEoVFJBQ0VfRklFTERfU0VUKSB8fAotICAgICAgICAgICAgICAgICAgICAgdHJhY2VTdGF0ZS5FUShUUkFDRV9BUlJBWV9TRVQpKSB7Ci0gICAgICAgICAgICBpZiAoIU9NSVRfVVBEQVRFUykgewotICAgICAgICAgICAgICBMb2cud3JpdGUoJ1UnKTsKLSAgICAgICAgICAgICAgTG9nLndyaXRlKCcgJyk7Ci0gICAgICAgICAgICAgIExvZy53cml0ZSh2YWwpOwotICAgICAgICAgICAgICBsb2dnZWRSZWNvcmQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJhY2VTdGF0ZSA9IFRSQUNFX0ZJRUxEX1NMT1Q7Ci0gICAgICAgICAgfSBlbHNlIGlmICh0cmFjZVN0YXRlLkVRKFRSQUNFX0ZJRUxEX1RBUkdFVCkgfHwKLSAgICAgICAgICAgICAgICAgICAgIHRyYWNlU3RhdGUuRVEoVFJBQ0VfQVJSQVlfVEFSR0VUKSkgewotICAgICAgICAgICAgaWYgKCFPTUlUX1VQREFURVMpCi0gICAgICAgICAgICAgIExvZy53cml0ZSh2YWwpOwotICAgICAgICAgICAgdHJhY2VTdGF0ZSA9IFRSQUNFX05FV19SRUNPUkQ7Ci0gICAgICAgICAgfSBlbHNlIGlmICh0cmFjZVN0YXRlLkVRKFRSQUNFX0ZJRUxEX1NMT1QpIHx8Ci0gICAgICAgICAgICAgICAgICAgICB0cmFjZVN0YXRlLkVRKFRSQUNFX0FSUkFZX0VMRU1FTlQpKSB7Ci0gICAgICAgICAgICBpZiAoIU9NSVRfVVBEQVRFUykKLSAgICAgICAgICAgICAgTG9nLndyaXRlKHZhbCk7Ci0gICAgICAgICAgICB0cmFjZVN0YXRlID0gVFJBQ0VfRklFTERfVEFSR0VUOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBWTS5hc3NlcnRpb25zLmZhaWwoIkNhbm5vdCB1bmRlcnN0YW5kIGRpcmVjdGl2ZSFcbiIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAodHJhY2VTdGF0ZS5FUShUUkFDRV9ORVdfUkVDT1JEKSAmJiBsb2dnZWRSZWNvcmQpIHsKLSAgICAgICAgICAgIGVudHJpZXNOb3RGbHVzaGVkKys7Ci0gICAgICAgICAgICBMb2cud3JpdGVsbigpOwotICAgICAgICAgIH0gZWxzZSBpZiAobG9nZ2VkUmVjb3JkKSB7Ci0gICAgICAgICAgICAgIExvZy53cml0ZSgnICcpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZW50cmllc05vdEZsdXNoZWQgPT0gMTApIHsKLSAgICAgICAgICBpZiAoIU9NSVRfT1VUUFVUKQotICAgICAgICAgICAgTG9nLmZsdXNoKCk7Ci0gICAgICAgICAgZW50cmllc05vdEZsdXNoZWQgPSAwOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJlc2V0TG9jYWwoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2RlcXVlL1dyaXRlQnVmZmVyLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZGVxdWUvV3JpdGVCdWZmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ5MTZkYi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZGVxdWUvV3JpdGVCdWZmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5LmRlcXVlOwotCi1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Db25zdGFudHM7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBzdXBwb3J0cyA8aT51bnN5bmNocm9uaXplZDwvaT4gaW5zZXJ0aW9uIG9mIHdyaXRlIGJ1ZmZlciB2YWx1ZXMuCi0gKi8KLUBVbmludGVycnVwdGlibGUgcHVibGljIGNsYXNzIFdyaXRlQnVmZmVyIGV4dGVuZHMgTG9jYWxTU0IKLSAgaW1wbGVtZW50cyBDb25zdGFudHMgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIFB1YmxpYyBpbnN0YW5jZSBtZXRob2RzCi0gICAqLwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKgotICAgKiBAcGFyYW0gcXVldWUgVGhlIHNoYXJlZCBxdWV1ZSB0byB3aGljaCB0aGlzIGxvY2FsIHNzYiB3aWxsIGFwcGVuZAotICAgKiBpdHMgYnVmZmVycyAod2hlbiBmdWxsIG9yIGZsdXNoZWQpLgotICAgKi8KLSAgcHVibGljIFdyaXRlQnVmZmVyKFNoYXJlZERlcXVlIHF1ZXVlKSB7Ci0gICAgc3VwZXIocXVldWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluc2VydCBhIHZhbHVlIHRvIGJlIHJlbWVtYmVyZWQgaW50byB0aGUgd3JpdGUgYnVmZmVyLgotICAgKgotICAgKiBAcGFyYW0gYWRkciB0aGUgdmFsdWUgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgd3JpdGUgYnVmZmVyCi0gICAqLwotICBATm9JbmxpbmUKLSAgcHVibGljIGZpbmFsIHZvaWQgaW5zZXJ0KEFkZHJlc3MgYWRkcikgewotICAgIGNoZWNrVGFpbEluc2VydCgxKTsKLSAgICB1bmNoZWNrZWRUYWlsSW5zZXJ0KGFkZHIpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZ2NzcHkvQ29sb3IuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9nY3NweS9Db2xvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjBkZGZhLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9nY3NweS9Db2xvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5Lmdjc3B5OwotCi1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBDb2xvci5qYXZhCi0gKgotICogQ3V0LWRvd24gaW1wbGVtZW50YXRpb24gb2YgamF2YS5hd3QuQ29sb3Igc3VmZmljaWVudCB0byBwcm92aWRlCi0gKiB0aGUgc2VydmVyIHNpZGUgKFN0cmVhbSkgd2l0aCBjb2xvdXJzCi0gKi8KLUBVbmludGVycnVwdGlibGUgcHVibGljIGNsYXNzIENvbG9yIHsKLQotICAvKioKLSAgICogU29tZSBnY3NweSBzdGFuZGFyZCBjb2xvdXJzICh0YWtlbiBmcm9tIGdjc3B5X2NvbG9yX2RiLmMpLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBCbGFjayAgICAgPSBuZXcgQ29sb3IoMCwgMCwgMCk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgQmx1ZSAgICAgID0gbmV3IENvbG9yKDAsIDAsIDI1NSk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgQ3lhbiAgICAgID0gbmV3IENvbG9yKDAsIDI1NSwgMjU1KTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBEYXJrR3JheSAgPSBuZXcgQ29sb3IoNjQsIDY0LCA2NCk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgR3JheSAgICAgID0gbmV3IENvbG9yKDEyOCwgMTI4LCAxMjgpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIEdyZWVuICAgICA9IG5ldyBDb2xvcigwLCAyNTUsIDApOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIExpZ2h0R3JheSA9IG5ldyBDb2xvcigxOTIsIDE5MiwgMTkyKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBNYWdlbnRhICAgPSBuZXcgQ29sb3IoMjU1LCAwLCAyNTUpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIE1pZEdyYXkgICA9IG5ldyBDb2xvcigxNjAsIDE2MCwgMTYwKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBOYXZ5Qmx1ZSAgPSBuZXcgQ29sb3IoMCwgMCwgMTUwKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBPZmZXaGl0ZSAgPSBuZXcgQ29sb3IoMjMwLCAyMzAsIDIzMCk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgT3JhbmdlICAgID0gbmV3IENvbG9yKDI1NSwgMjAwLCAwKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBQaW5rICAgICAgPSBuZXcgQ29sb3IoMjU1LCAxNzUsIDE3NSk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgUmVkICAgICAgID0gbmV3IENvbG9yKDI1NSwgMCwgMCk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgV2hpdGUgICAgID0gbmV3IENvbG9yKDI1NSwgMjU1LCAyNTUpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIFllbGxvdyAgICA9IG5ldyBDb2xvcigyNTUsIDI1NSwgMCk7Ci0KLSAgcHJpdmF0ZSBzaG9ydCByOyAvLyByZWQgY29tcG9uZW50Ci0gIHByaXZhdGUgc2hvcnQgZzsgLy8gZ3JlZW4gY29tcG9uZW50Ci0gIHByaXZhdGUgc2hvcnQgYjsgLy8gYmx1ZSBjb21wb25lbnQKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIGEgc2ltcGxlIFJHQiBjb2xvdXIgbW9kZWwuCi0gICAqCi0gICAqIEBwYXJhbSByIHJlZCBjb21wb25lbnQKLSAgICogQHBhcmFtIGcgZ3JlZW4gY29tcG9uZW50Ci0gICAqIEBwYXJhbSBiIGJsdWUgY29tcG9uZW50Ci0gICAqLwotICBwdWJsaWMgQ29sb3Ioc2hvcnQgciwgc2hvcnQgZywgc2hvcnQgYikgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykKLSAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydCgoMCA8PSByKSAmJiAociA8PSAyNTUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoMCA8PSBnKSAmJiAoZyA8PSAyNTUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoMCA8PSBiKSAmJiAoYiA8PSAyNTUpKTsKLSAgICB0aGlzLnIgPSByOwotICAgIHRoaXMuZyA9IGc7Ci0gICAgdGhpcy5iID0gYjsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgYSBzaW1wbGUgUkdCIGNvbG91ciBtb2RlbC4KLSAgICoKLSAgICogQHBhcmFtIHIgcmVkIGNvbXBvbmVudAotICAgKiBAcGFyYW0gZyBncmVlbiBjb21wb25lbnQKLSAgICogQHBhcmFtIGIgYmx1ZSBjb21wb25lbnQKLSAgICovCi0gIHByaXZhdGUgQ29sb3IoaW50IHIsIGludCBnLCBpbnQgYikgewotICAgIHRoaXMoKHNob3J0KSByLCAoc2hvcnQpIGcsIChzaG9ydCkgYik7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZWQgY29tcG9uZW50Ci0gICAqCi0gICAqIEByZXR1cm4gdGhlIHJlZCBjb21wb25lbnQKLSAgICovCi0gIHB1YmxpYyBzaG9ydCBnZXRSZWQoKSB7IHJldHVybiByOyB9Ci0KLSAgLyoqCi0gICAqIEdyZWVuIGNvbXBvbmVudAotICAgKgotICAgKiBAcmV0dXJuIHRoZSBncmVlbiBjb21wb25lbnQKLSAgICovCi0gIHB1YmxpYyBzaG9ydCBnZXRHcmVlbigpIHsgcmV0dXJuIGc7IH0KLQotICAvKioKLSAgICogQmx1ZSBjb21wb25lbnQKLSAgICoKLSAgICogQHJldHVybiB0aGUgYmx1ZSBjb21wb25lbnQKLSAgICovCi0gIHB1YmxpYyBzaG9ydCBnZXRCbHVlKCkgeyByZXR1cm4gYjsgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2djc3B5L0dDc3B5LmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZ2NzcHkvR0NzcHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZmYTNmYi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZ2NzcHkvR0NzcHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5Lmdjc3B5OwotCi1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Mb2c7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5vcHRpb25zLio7Ci1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci1pbXBvcnQgb3JnLm1tdGsudm0uZ2NzcHkuU2VydmVySW50ZXJwcmV0ZXI7Ci1pbXBvcnQgb3JnLm1tdGsudm0uZ2NzcHkuVXRpbDsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBjb2xsZWN0b3ItaW5kZXBlbmRlbnQgR0NzcHkgZnVuY3Rpb25hbGl0eSB0byBzdGFydAotICogdGhlIEdDc3B5IHNlcnZlci4gIEl0IGhhbmRsZXMgY29tbWFuZC1saW5lIHBhcmFtZXRlcnMgZm9yIHBvcnQgbnVtYmVyLAotICogd2hldGhlciB0aGUgVk0gc2hvdWxkIHdhaXQgZm9yIGEgR0NzcHkgY2xpZW50IHRvIGNvbm5lY3QsIGFuZCB0aWxlIHNpemUuCi0gKiBNb3N0IGltcG9ydGFudGx5LCBpdCBjYWxscyB0aGUgUGxhbidzIHN0YXJ0R0NzcHlTZXJ2ZXIgbWV0aG9kIHdoaWNoCi0gKiBjcmVhdGVzIGEgbmV3IFNlcnZlckludGVycHJldGVyLCBhbmQgYWRkcyBldmVudHMgYW5kIHNwYWNlIGRyaXZlcnMuCi0gKi8KLUBVbmludGVycnVwdGlibGUgcHVibGljIGNsYXNzIEdDc3B5IHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDbGFzcyB2YXJpYWJsZXMKLSAgICovCi0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBVdGlsIHV0aWwgPSBWTS5uZXdHQ3NweVV0aWwoKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTZXJ2ZXJJbnRlcnByZXRlciBzZXJ2ZXIgPSBWTS5uZXdHQ3NweVNlcnZlckludGVycHJldGVyKCk7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5pdGlhbGl6YXRpb24KLSAgICovCi0KLSAgQEludGVycnVwdGlibGUKLSAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZU9wdGlvbnMoKSB7Ci0gICAgT3B0aW9ucy5nY3NweVBvcnQgPSBuZXcgR0NzcHlQb3J0KCk7Ci0gICAgT3B0aW9ucy5nY3NweVdhaXQgPSBuZXcgR0NzcHlXYWl0KCk7Ci0gICAgT3B0aW9ucy5nY3NweVRpbGVTaXplID0gbmV3IEdDc3B5VGlsZVNpemUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgYm9vdCBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBydW50aW1lIGltbWVkaWF0ZWx5IGFmdGVyCi0gICAqIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgYXJlIGF2YWlsYWJsZS4gIE5vdGUgdGhhdCBhbGxvY2F0aW9uIG11c3QKLSAgICogYmUgc3VwcG9ydGVkIHByaW9yIHRvIHRoaXMgcG9pbnQgYmVjYXVzZSB0aGUgcnVudGltZQotICAgKiBpbmZyYXN0cnVjdHVyZSBtYXkgcmVxdWlyZSBhbGxvY2F0aW9uIGluIG9yZGVyIHRvIHBhcnNlIHRoZQotICAgKiBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHBvc3RCb290KCkgeyB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbnVtYmVyIG9mIHRoZSBwb3J0IHRoYXQgR0NzcHkgY29tbXVuaWNhdGVzIG9uCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIEdDc3B5IHBvcnQgbnVtYmVyCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBnZXRHQ3NweVBvcnQoKSB7Ci0gICAgcmV0dXJuIE9wdGlvbnMuZ2NzcHlQb3J0LmdldFZhbHVlKCk7Ci0gIH0KLQotICAvKioKLSAgICogU2hvdWxkIHRoZSBWTSB3YWl0IGZvciBHQ3NweSB0byBjb25uZWN0PwotICAgKgotICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIFZNIHNob3VsZCB3YWl0IGZvciB0aGUgdmlzdWFsaXNlciB0byBjb25uZWN0Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0R0NzcHlXYWl0KCkgewotICAgIHJldHVybiBPcHRpb25zLmdjc3B5V2FpdC5nZXRWYWx1ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXJ0IHRoZSBHQ3NweSBzZXJ2ZXIuCi0gICAqIFdBUk5JTkc6IGFsbG9jYXRlcyBtZW1vcnkgaW5kaXJlY3RseQotICAgKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0R0NzcHlTZXJ2ZXIoKSB7Ci0gICAgaW50IHBvcnQgPSBnZXRHQ3NweVBvcnQoKTsKLSAgICBMb2cud3JpdGUoIkdDc3B5LnN0YXJ0R0NzcHlTZXJ2ZXIsIHBvcnQ9Iik7IExvZy53cml0ZShwb3J0KTsKLSAgICBMb2cud3JpdGUoIiwgd2FpdD0iKTsKLSAgICBMb2cud3JpdGVsbihnZXRHQ3NweVdhaXQoKSk7Ci0gICAgaWYgKHBvcnQgPiAwKSB7Ci0gICAgICBWTS5hY3RpdmVQbGFuLmdsb2JhbCgpLnN0YXJ0R0NzcHlTZXJ2ZXIocG9ydCwgZ2V0R0NzcHlXYWl0KCkpOwotICAgICAgLy9Mb2cud3JpdGVsbigiZ2NzcHkgdGhyZWFkIGJvb3RlZCIpOwotICAgIH0KLSAgfQotfQotCmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZ2NzcHkvTGluZWFyU2Nhbi5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2djc3B5L0xpbmVhclNjYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNjZDVhZC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZ2NzcHkvTGluZWFyU2Nhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkuZ2NzcHk7Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lmdjc3B5LmRyaXZlcnMuQWJzdHJhY3REcml2ZXI7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBvbmx5IG5lY2Vzc2FyeSBiZWNhdXNlIHdlIGNhbm5vdCBpbXBsZW1lbnQKLSAqIG9yZy5tbXRrLnV0aWxpdHkuYWxsb2MuTGluZWFyU2NhbiBhcyBhbiBpbnRlcmZhY2Ugc2luY2UgdGhlIGludm9rZWludGVyZmFjZQotICogYnl0ZWNvZGUgaXMgZm9yYmlkZGVuIGluIHVuaW50ZXJydXB0aWJsZSBjb2RlLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlIHB1YmxpYyBjbGFzcyBMaW5lYXJTY2FuIGV4dGVuZHMgb3JnLm1tdGsudXRpbGl0eS5hbGxvYy5MaW5lYXJTY2FuIHsKLQotICBwcml2YXRlIGZpbmFsIEFic3RyYWN0RHJpdmVyIGRyaXZlcjsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IHNjYW5uZXIuCi0gICAqIEBwYXJhbSBkIFRoZSBHQ3NweSBkcml2ZXIgdGhhdCBwcm92aWRlcyB0aGUgY2FsbGJhY2suCi0gICAqLwotICBwdWJsaWMgTGluZWFyU2NhbihBYnN0cmFjdERyaXZlciBkKSB7IGRyaXZlciA9IGQ7IH0KLQotICAvKioKLSAgICogU2NhbiBhbiBvYmplY3QuIFRoZSBvYmplY3QgcmVmZXJlbmNlIGlzIHBhc3NlZCB0byB0aGUgc2NhbiBtZXRob2Qgb2YgdGhlCi0gICAqIEdDc3B5IGRyaXZlciByZWdpc3RlcmVkIHdpdGggdGhpcyBzY2FubmVyLgotICAgKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gc2Nhbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNjYW4oT2JqZWN0UmVmZXJlbmNlIG9iaikgeyBkcml2ZXIuc2NhbihvYmopOyAgfQotfQotCmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZ2NzcHkvU3RyZWFtQ29uc3RhbnRzLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZ2NzcHkvU3RyZWFtQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYTk5ZWUuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2djc3B5L1N0cmVhbUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkuZ2NzcHk7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgY29uc3RhbnRzIHVzZWQgYnkgdGhlIEdDc3B5IGZyYW13ZW9yay4KLSAqIFRoZXNlIG11c3QgY29ycmVzcG9uZCB3aXRoIHZhbHVlcyBpbiBnY3NweV9zdHJlYW0uaAotICogUHJlc2VudGF0aW9uCi0gKiA8dGFibGU+Ci0gICAgICA8dHI+PHRkPlBSRVNFTlRBVElPTl9QTEFJTjwvdGQ+ICAgICAgPHRkPnByZXNlbnRlZCBhcyBpczwvdGQ+Ci0gICAgICA8dHI+PHRkPlBSRVNFTlRBVElPTl9QTFVTPC90ZD4gICAgICAgPHRkPmFzIG1heCsgaWYgdmFsdWUgZXhjZWVkcyBtYXggZWxzZSBhcyBpczwvdGQ+Ci0gICAgICA8dHI+PHRkPlBSRVNFTlRBVElPTl9NQVhfVkFSPC90ZD4gICAgPHRkPmRpdHRvIGJ1dCB0YWtlcyBtYXggdmFsdWUgZnJvbSBhIHNwZWNpZmllZCBzdHJlYW08L3RkPgotICAgICAgPHRyPjx0ZD5QUkVTRU5UQVRJT05fUEVSQ0VOVDwvdGQ+ICAgIDx0ZD5hcyB2YWx1ZSAocGVyY2VudCk8L3RkPgotICAgICAgPHRyPjx0ZD5QUkVTRU5UQVRJT05fUEVSQ0VOVF9WQVI8L3RkPjx0ZD5kaXR0byBidXQgdGFrZXMgbWF4IHZhbHVlIGZyb20gYSBzcGVjaWZpZWQgc3RyZWFtPC90ZD4KLSAgICAgIDx0cj48dGQ+UFJFU0VOVEFUSU9OX0VOVU0gPC90ZD4gICAgICA8dGQ+Y2hvb3NlcyBmcm9tIGFuIGVudW1lcmF0aW9uPC90ZD4KLSAgIDwvdGFibGU+Ci0gICBQYWludCBzdHlsZQotICAgPHRhYmxlPgotICAgICAgPHRyPjx0ZD5QQUlOVF9TVFlMRV9QTEFJTjwvdGQ+ICAgICAgIDx0ZD5QYWludHMgYXMgaXM8L3RkPgotICAgICAgPHRyPjx0ZD5QQUlOVF9TVFlMRV9aRVJPPC90ZD4gICAgICAgIDx0ZD5kaXR0byBidXQgdHJlYXRzIHplcm8gdmFsdWVzIHNwZWNpYWxseTwvdGQ+Ci0gICA8L3RhYmxlPgotICAgRGF0YSB0eXBlcwotICAgPHRhYmxlPgotICAgICAgPHRyPjx0ZD5CWVRFX1RZUEU8L3RkPiAgPHRkPnN0cmVhbSBvZiBieXRlczwvdGQ+Ci0gICAgICA8dHI+PHRkPlNIT1JUX1RZUEU8L3RkPiA8dGQ+c3RyZWFtIG9mIHNob3J0czwvdGQ+Ci0gICAgICA8dHI+PHRkPklOVF9UWVBFPC90ZD4gICA8dGQ+c3RyZWFtIG9mIGludHM8L3RkPgotICAgPC90YWJsZT4KLSAqIFN0cmVhbUNvbnN0YW50cwotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgU3RyZWFtQ29uc3RhbnRzIHsKLQotICBpbnQgTkFNRV9MRU4gPSA0MDsKLSAgaW50IFBSRVNFTlRBVElPTl9QTEFJTiAgICAgICA9IDA7Ci0gIGludCBQUkVTRU5UQVRJT05fUExVUyAgICAgICAgPSAxOwotICBpbnQgUFJFU0VOVEFUSU9OX01BWF9WQVIgICAgID0gMjsKLSAgaW50IFBSRVNFTlRBVElPTl9QRVJDRU5UICAgICA9IDM7Ci0gIGludCBQUkVTRU5UQVRJT05fUEVSQ0VOVF9WQVIgPSA0OwotICBpbnQgUFJFU0VOVEFUSU9OX0VOVU0gICAgICAgID0gNTsKLQotICBpbnQgUEFJTlRfU1RZTEVfUExBSU4gPSAwOwotICBpbnQgUEFJTlRfU1RZTEVfWkVSTyAgPSAxOwotCi0gIGludCBCWVRFX1RZUEUgID0gMDsKLSAgaW50IFNIT1JUX1RZUEUgPSAxOwotICBpbnQgSU5UX1RZUEUgICA9IDI7Ci0KLSAgaW50IEVOVU1fTUFYX0xFTiA9IDIwOwotICBpbnQgRU5VTV9NQVhfTlVNID0gNTsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9nY3NweS9TdWJzcGFjZS5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2djc3B5L1N1YnNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNzY0OTguLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2djc3B5L1N1YnNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkuZ2NzcHk7Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkxvZzsKLWltcG9ydCBvcmcubW10ay52bS5nY3NweS5VdGlsOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGFuIGFic3RyYWN0aW9uIG9mIGEgY29udGlndW91cyByZWdpb24gb2YgYSBTcGFjZS4gIEZvcgotICogZXhhbXBsZSwgYSBzZW1pc3BhY2UgY29sbGVjdG9yIG1pZ2h0IGNob29zZSB0byBtb2RlbCB0aGUgaGVhcCBhcyBhCi0gKiBzaW5nbGUgU3BhY2UsIGJ1dCB3aXRoaW4gdGhhdCBTcGFjZSBpdCBjb3VsZCBtb2RlbCBlYWNoIHNlbWlzcGFjZSBieQotICogYSBTdWJzcGFjZS48cD4KLSAqIFN1YnNwYWNlIHByb3ZpZGVzIGEgbnVtYmVyIG9mIHVzZWZ1bCBmYWNpbGl0aWVzIHRvIG1hbnkgZHJpdmVycywgYW5kCi0gKiBpcyB1c2VmdWwgZXZlbiBpZiB0aGUgU3BhY2UgY29tcHJpc2VzIGp1c3QgYSBzaW5nbGUgY29udGlndW91cyByZWdpb24uPHA+Ci0gKgotICogQSBzdWJzcGFjZSBrZWVwcyB0cmFjayBvZiB0aGUgc3RhcnQgYW5kIGVuZCBhZGRyZXNzIG9mIHRoZSByZWdpb24sCi0gKiB0aGUgaW5kZXggb2YgaXRzIGZpcnN0IGJsb2NrLCB0aGUgc2l6ZSBvZiB0aGUgYmxvY2tzIGluIHRoaXMgc3BhY2UsCi0gKiBhbmQgdGhlIG51bWJlciBvZiBibG9ja3MgaW4gdGhpcyBzdWJzcGFjZS4KLSAqLwotQFVuaW50ZXJydXB0aWJsZSBwdWJsaWMgY2xhc3MgU3Vic3BhY2UgewotCi0gIHByaXZhdGUgQWRkcmVzcyBzdGFydF87ICAgICAgIC8vIFRoZSBTdWJzcGFjZSBzcGFucyB0aGUgYWRkcmVzcyByYW5nZSBbc3RhcnRfLCBlbmRfKQotICBwcml2YXRlIEFkZHJlc3MgZW5kXzsKLSAgcHJpdmF0ZSBpbnQgZmlyc3RJbmRleF87ICAgICAgLy8gVGhlIGluZGV4IG9mIHRoZSBibG9jayBpbiB3aGljaCBzdGFydF8gbGllcwotICBwcml2YXRlIGludCBibG9ja1NpemVfOyAgICAgICAvLyBUaGUgYmxvY2sgc2l6ZQotICBwcml2YXRlIGludCBibG9ja051bV87ICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGJsb2NrcyBpbiB0aGlzIHNwYWNlCi0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgc3Vic3BhY2UKLSAgICoKLSAgICogQHBhcmFtIHN0YXJ0IFRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgc3Vic3BhY2UKLSAgICogQHBhcmFtIGVuZCBUaGUgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZSBzdWJzcGFjZQotICAgKiBAcGFyYW0gZmlyc3RJbmRleCBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBzdWJzcGFjZQotICAgKiBAcGFyYW0gYmxvY2tTaXplIFRoZSBzaXplIG9mIGJsb2NrcyBpbiB0aGlzIHNwYWNlCi0gICAqIEBwYXJhbSBibG9ja051bSBUaGUgbnVtYmVyIG9mIGJsb2NrcyBpbiB0aGlzIHN1YnNwYWNlCi0gICAqLwotICBwdWJsaWMgU3Vic3BhY2UoQWRkcmVzcyBzdGFydCwKLSAgICAgICAgICAgICAgICAgIEFkZHJlc3MgZW5kLAotICAgICAgICAgICAgICAgICAgaW50IGZpcnN0SW5kZXgsCi0gICAgICAgICAgICAgICAgICBpbnQgYmxvY2tTaXplLAotICAgICAgICAgICAgICAgICAgaW50IGJsb2NrTnVtKSB7Ci0gICAgcmVzZXQoc3RhcnQsIGVuZCwgZmlyc3RJbmRleCwgYmxvY2tTaXplLCBibG9ja051bSk7Ci0gIH0KLQotCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tTWV0aG9kcyB0byByZXNldCBhIHN1YnNwYWNlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8qKgotICAgKiBSZXNldCBhIHN1YnNwYWNlLgotICAgKgotICAgKiBAcGFyYW0gc3RhcnQgVGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBzdWJzcGFjZQotICAgKiBAcGFyYW0gZW5kIFRoZSBhZGRyZXNzIG9mIHRoZSBlbmQgb2YgdGhlIHN1YnNwYWNlCi0gICAqIEBwYXJhbSBmaXJzdEluZGV4IFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIHN1YnNwYWNlCi0gICAqIEBwYXJhbSBibG9ja1NpemUgVGhlIHNpemUgb2YgYmxvY2tzIGluIHRoaXMgc3Vic3BhY2UKLSAgICogQHBhcmFtIGJsb2NrTnVtIFRoZSBudW1iZXIgb2YgYmxvY2tzIGluIHRoaXMgc3Vic3BhY2UKLSAgICovCi0gIHByaXZhdGUgdm9pZCByZXNldChBZGRyZXNzIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBlbmQsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgZmlyc3RJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja1NpemUsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tOdW0pIHsKLSAgICAvL1RPRE8gc2FuaXR5IGNoZWNrIG9uIGFkZHJlc3NlcyBhbmQgYmxvY2sgc2l6ZSBhbmQgbnVtYmVyCi0gICAgcmVzZXQoc3RhcnQsIGVuZCwgZmlyc3RJbmRleCwgYmxvY2tOdW0pOwotICAgIGJsb2NrU2l6ZV8gPSBibG9ja1NpemU7Ci0KLSAgICBpZiAoREVCVUcpIGR1bXAoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXNldCBhIG5ldyBzdWJzcGFjZQotICAgKgotICAgKiBAcGFyYW0gc3RhcnQgVGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBzdWJzcGFjZQotICAgKiBAcGFyYW0gZW5kIFRoZSBhZGRyZXNzIG9mIHRoZSBlbmQgb2YgdGhlIHN1YnNwYWNlCi0gICAqIEBwYXJhbSBmaXJzdEluZGV4IFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIHN1YnNwYWNlCi0gICAqIEBwYXJhbSBibG9ja051bSBUaGUgbnVtYmVyIG9mIGJsb2NrcyBpbiB0aGlzIHN1YnNwYWNlCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXNldChBZGRyZXNzIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgaW50IGZpcnN0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgIGludCBibG9ja051bSkgewotICAgIHN0YXJ0XyA9IHN0YXJ0OwotICAgIGVuZF8gPSBlbmQ7Ci0gICAgZmlyc3RJbmRleF8gPSBmaXJzdEluZGV4OwotICAgIGJsb2NrTnVtXyA9IGJsb2NrTnVtOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlc2V0IGEgbmV3IHN1YnNwYWNlLgotICAgKgotICAgKiBAcGFyYW0gc3RhcnQgVGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBzdWJzcGFjZQotICAgKiBAcGFyYW0gZW5kIFRoZSBhZGRyZXNzIG9mIHRoZSBlbmQgb2YgdGhlIHN1YnNwYWNlCi0gICAqIEBwYXJhbSBibG9ja051bSBUaGUgbnVtYmVyIG9mIGJsb2NrcyBpbiB0aGlzIHN1YnNwYWNlCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXNldChBZGRyZXNzIHN0YXJ0LCBBZGRyZXNzIGVuZCwgaW50IGJsb2NrTnVtKSB7Ci0gICAgc3RhcnRfID0gc3RhcnQ7Ci0gICAgZW5kXyA9IGVuZDsKLSAgICBibG9ja051bV8gPSBibG9ja051bTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXNldCBhIG5ldyBzdWJzcGFjZS4KLSAgICoKLSAgICogQHBhcmFtIGZpcnN0SW5kZXggVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgc3Vic3BhY2UKLSAgICogQHBhcmFtIGJsb2NrTnVtIFRoZSBudW1iZXIgb2YgYmxvY2tzIGluIHRoaXMgc3Vic3BhY2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc2V0KGludCBmaXJzdEluZGV4LCBpbnQgYmxvY2tOdW0pIHsKLSAgICBmaXJzdEluZGV4XyA9IGZpcnN0SW5kZXg7Ci0gICAgYmxvY2tOdW1fID0gYmxvY2tOdW07Ci0gIH0KLQotCi0gIC8vLS0tLS0tLS0tLS0tLS0tLUZhY2lsaXRpZXMgdG8gcXVlcnkgYSBzdWJzcGFjZS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLyoqCi0gICAqIElzIGFuIGluZGV4IGluIHRoZSByYW5nZSBvZiB0aGlzIHN1YnNwYWNlPwotICAgKgotICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBibG9jawotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBibG9jayBsaWVzIGluIHRoaXMgc3Vic3BhY2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGluZGV4SW5SYW5nZShpbnQgaW5kZXgpIHsKLSAgICByZXR1cm4gaW5kZXggPj0gZmlyc3RJbmRleF8gJiYKLSAgICAgICAgICAgaW5kZXggPCBmaXJzdEluZGV4XyArIGJsb2NrTnVtXzsKLSAgfQotCi0gIC8qKgotICAgKiBJcyBhZGRyZXNzIGluIHRoZSByYW5nZSBvZiB0aGlzIHN1YnNwYWNlPwotICAgKgotICAgKiBAcGFyYW0gYWRkciBBbiBhZGRyZXNzCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGFkZHJlc3MgaXMgaW4gYSBibG9jayBpbiB0aGlzIHN1YnNwYWNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBhZGRyZXNzSW5SYW5nZShBZGRyZXNzIGFkZHIpIHsKLSAgICByZXR1cm4gYWRkci5HRShzdGFydF8pICYmIGFkZHIuTFQoZW5kXyk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGJsb2NrIGluZGV4IGZyb20gYW4gYWRkcmVzcwotICAgKgotICAgKiBAcGFyYW0gYWRkciBUaGUgYWRkcmVzcwotICAgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgYmxvY2sgaG9sZGluZyB0aGlzIGFkZHJlc3MKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0SW5kZXgoQWRkcmVzcyBhZGRyKSB7Ci0gICAgaWYgKERFQlVHKSB7Ci0gICAgICBMb2cud3JpdGUoInN0YXJ0XyAiLCBzdGFydF8pOwotICAgICAgTG9nLndyaXRlKCIgZW5kXyAiLCBlbmRfKTsKLSAgICAgIExvZy53cml0ZSgiIGJsb2NrU2l6ZV8gIiwgYmxvY2tTaXplXyk7Ci0gICAgICBMb2cud3JpdGUoIiBmaXJzdEluZGV4XyAiLCBmaXJzdEluZGV4Xyk7Ci0gICAgICBMb2cud3JpdGUoIiArICIsIGFkZHIuZGlmZihzdGFydF8pLnRvSW50KCkgLyBibG9ja1NpemVfKTsKLSAgICAgIExvZy53cml0ZWxuKCIgYWRkciAiLCBhZGRyKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZpcnN0SW5kZXhfICsgYWRkci5kaWZmKHN0YXJ0XykudG9JbnQoKSAvIGJsb2NrU2l6ZV87Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBhZGRyZXNzIG9mIHN0YXJ0IG9mIGJsb2NrIGZyb20gaXRzIGluZGV4Ci0gICAqCi0gICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGJsb2NrCi0gICAqIEByZXR1cm4gVGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBibG9jawotICAgKi8KLSAgcHVibGljIEFkZHJlc3MgZ2V0QWRkcmVzcyhpbnQgaW5kZXgpIHsKLSAgICByZXR1cm4gc3RhcnRfLnBsdXMoaW5kZXggLSBmaXJzdEluZGV4XyAqIGJsb2NrU2l6ZV8pOwotICB9Ci0KLSAgLy8tLS0tLS0tLS0tLS0tLUFjY2Vzc29ycy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvKioKLSAgICogR2V0IHRoZSBzdGFydCBvZiB0aGUgc3Vic3BhY2UKLSAgICogQHJldHVybiBUaGUgc3RhcnQgb2YgdGhpcyBzdWJzcGFjZQotICAgKi8KLSAgcHVibGljIEFkZHJlc3MgZ2V0U3RhcnQoKSB7IHJldHVybiBzdGFydF87IH0KLQotICAvKioKLSAgICogR2V0IHRoZSBlbmQgb2YgdGhpcyBzdWJzcGFjZQotICAgKiBAcmV0dXJuIFRoZSBhZGRyZXNzIG9mIHRoZSBlbmQgb2YgdGhpcyBzdWJzcGFjZQotICAgKi8KLSAgcHVibGljIEFkZHJlc3MgZ2V0RW5kKCkgeyByZXR1cm4gZW5kXzsgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGZpcnN0IGluZGV4IG9mIHN1YnNwYWNlCi0gICAqIEByZXR1cm4gdGhlIGZpcnN0SW5kZXggb2YgdGhpcyBzdWJzcGFjZQotICAgKi8KLSAgcHVibGljIGludCBnZXRGaXJzdEluZGV4KCkgeyByZXR1cm4gZmlyc3RJbmRleF87IH0KLQotICAvKioKLSAgICogR2V0IHRoZSBibG9ja3NpemUgZm9yIHRoaXMgc3Vic3BhY2UKLSAgICogQHJldHVybiBUaGUgc2l6ZSBvZiBhIHRpbGUKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0QmxvY2tTaXplKCkgeyByZXR1cm4gYmxvY2tTaXplXzsgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG51bWJlciBvZiB0aWxlcyBpbiB0aGlzIHN1YnNwYWNlCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiB0aWxlcyBpbiB0aGlzIHN1YnNwYWNlCi0gICAqLwotICBwdWJsaWMgaW50IGdldEJsb2NrTnVtKCkgeyByZXR1cm4gYmxvY2tOdW1fOyB9Ci0KLSAgLyoqCi0gICAqIENhbGN1bGF0ZSB0aGUgc3BhY2UgcmVtYWluaW5nIGluIGEgYmxvY2sgYWZ0ZXIgdGhpcyBhZGRyZXNzCi0gICAqCi0gICAqIEBwYXJhbSBhZGRyIHRoZSBBZGRyZXNzCi0gICAqIEByZXR1cm4gdGhlIHJlbWFpbmRlcgotICAgKi8KLSAgcHVibGljIGludCBzcGFjZVJlbWFpbmluZyhBZGRyZXNzIGFkZHIpIHsKLSAgICBpbnQgbmV4dEluZGV4ID0gZ2V0SW5kZXgoYWRkcikgKyAxOwotICAgIEFkZHJlc3MgbmV4dFRpbGUgPSBzdGFydF8ucGx1cyhibG9ja1NpemVfICogKG5leHRJbmRleCAtIGZpcnN0SW5kZXhfKSk7Ci0gICAgcmV0dXJuIG5leHRUaWxlLmRpZmYoYWRkcikudG9JbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBEdW1wIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN1YnNwYWNlCi0gICAqLwotICBwcml2YXRlIHZvaWQgZHVtcCgpIHsKLSAgICBMb2cud3JpdGUoIkdDc3B5IFN1YnNwYWNlOiAiKTsKLSAgICBVdGlsLmR1bXBSYW5nZShzdGFydF8sIGVuZF8pOwotICAgIExvZy53cml0ZWxuKCJcbiAgLS0gZmlyc3RJbmRleD0iLCBmaXJzdEluZGV4Xyk7Ci0gICAgTG9nLndyaXRlbG4oIiAgLS0gYmxvY2tOdW09IiwgYmxvY2tOdW1fKTsKLSAgfQotfQotCi0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9nY3NweS9kcml2ZXJzL0Fic3RyYWN0RHJpdmVyLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZ2NzcHkvZHJpdmVycy9BYnN0cmFjdERyaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmNhNDY0Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9nY3NweS9kcml2ZXJzL0Fic3RyYWN0RHJpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDIgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkuZ2NzcHkuZHJpdmVyczsKLQotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkxvZzsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lmdjc3B5LkdDc3B5OwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZ2NzcHkuU3Vic3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsudm0uZ2NzcHkuU2VydmVyU3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsudm0uZ2NzcHkuU2VydmVySW50ZXJwcmV0ZXI7Ci1pbXBvcnQgb3JnLm1tdGsudm0uZ2NzcHkuU3RyZWFtOwotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIEFic3RyYWN0IEdDc3B5IGRyaXZlciBmb3IgTU1UayBjb2xsZWN0b3JzLgotICoKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBmb3IgdGhlIE1NVGsgYSBiYXNlIGRyaXZlciBmb3IgYSBHQ3NweSBzcGFjZS4KLSAqIEFsbCBkcml2ZXJzIGZvciBHQ3NweSBzcGFjZXMgc2hvdWxkIGluaGVyaXQgZnJvbSB0aGlzIGNsYXNzLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REcml2ZXIgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENsYXNzIHZhcmlhYmxlcwotICAgKi8KLQotICAvLyBDb250cm9scyB1c2VkIGZvciB0aWxlIHByZXNlbnRhdGlvbgotICAvKiogVGhlIHRpbGUgaXMgdXNlZCAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgQ09OVFJPTF9VU0VEICAgICAgICAgICAgPSAgMTsKLSAgLyoqIFRoZSB0aWxlIGlzIGEgYmFja2dyb3VuZCB0aWxlICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBDT05UUk9MX0JBQ0tHUk9VTkQgICAgICA9ICAyOwotICAvKiogVGhlIHRpbGUgaXMgdW51c2VkICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBDT05UUk9MX1VOVVNFRCAgICAgICAgICA9ICA0OwotICAvKiogVGhlIHRpbGUgaXMgYSBzZXBhcmF0b3IgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIENPTlRST0xfU0VQQVJBVE9SICAgICAgID0gIDg7Ci0gIC8qKiBUaGUgdGlsZSBpcyBhIGxpbmsgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIENPTlRST0xfTElOSyAgICAgICAgICAgID0gMTY7Ci0KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NUUkVBTVMgPSA2NDsgICAgLy8gTWF4IG51bWJlciBvZiBzdHJlYW1zCi0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotICBwcm90ZWN0ZWQgU3RyaW5nIG15Q2xhc3M7ICAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCBpbiBkZWJ1Z2dpbmcgbWVzc2FnZXMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluc3RhbmNlIHZhcmlhYmxlcwotICAgKi8KLQotICAvKiogVGhlIG93bmluZyBHQ3NweSBzZXJ2ZXIgKi8KLSAgcHJvdGVjdGVkIGZpbmFsIFNlcnZlckludGVycHJldGVyIHNlcnZlcjsKLSAgLyoqIFRoZSBuYW1lIG9mIHRoZSBHQ3NweSBzcGFjZSBkcml2ZXIgKi8KLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBuYW1lOwotICAvKiogVGhlIEdDc3B5IHNwYWNlIGFic3RyYWN0aW9uICovCi0gIHByb3RlY3RlZCBmaW5hbCBTZXJ2ZXJTcGFjZSBzZXJ2ZXJTcGFjZTsKLSAgLyoqIFRoZSBNTVRLIHNwYWNlICovCi0gIHByb3RlY3RlZCBmaW5hbCBTcGFjZSBtbXRrU3BhY2U7Ci0gIC8qKiBUaGUgR0NzcHkgc3BhY2UncyBibG9jayBzaXplICovCi0gIHByb3RlY3RlZCBpbnQgYmxvY2tTaXplOwotICAvKiogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbGVzIGluIHRoaXMgR0NzcHkgc3BhY2UgKi8KLSAgcHJvdGVjdGVkIGludCBtYXhUaWxlTnVtOwotICAvKiogVGhpcyBzcGFjZSdzIHN0cmVhbXMgICovCi0gIHByb3RlY3RlZCBTdHJlYW1bXSBzdHJlYW1zOwotICAvKiogIGNvbnRyb2wgdmFsdWVzIGZvciB0aWxlcyBpbiB0aGlzIHNwYWNlICovCi0gIHByb3RlY3RlZCBieXRlW10gY29udHJvbDsKLSAgLyoqIEhhcyB0aGlzIHNwYWNlIGNoYW5nZWQ/ICovCi0gIHByb3RlY3RlZCBib29sZWFuIGNoYW5nZWQgPSB0cnVlOwotCi0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBkcml2ZXIgZm9yIHRoaXMgY29sbGVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gc2VydmVyIFRoZSBTZXJ2ZXJJbnRlcnByZXRlciB0aGF0IG93bnMgdGhpcyBHQ3NweSBzcGFjZS4KLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhpcyBkcml2ZXIuCi0gICAqIEBwYXJhbSBtbXRrU3BhY2UgVGhlIE1NVGsgc3BhY2UgcmVwcmVzZW50ZWQgYnkgdGhpcyBkcml2ZXIuCi0gICAqIEBwYXJhbSBibG9ja1NpemUgVGhlIHRpbGUgc2l6ZS4KLSAgICogQHBhcmFtIG1haW5TcGFjZSBJcyB0aGlzIHRoZSBtYWluIHNwYWNlPwotICAgKi8KLSAgcHVibGljIEFic3RyYWN0RHJpdmVyKFNlcnZlckludGVycHJldGVyIHNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgU3BhY2UgbW10a1NwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbWFpblNwYWNlKSB7Ci0gICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB0aGlzLm1tdGtTcGFjZSA9IG1tdGtTcGFjZTsKLSAgICB0aGlzLmJsb2NrU2l6ZSA9IGJsb2NrU2l6ZTsKLSAgICBteUNsYXNzID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgbWF4VGlsZU51bSA9IGNvdW50VGlsZU51bShtbXRrU3BhY2UuZ2V0RXh0ZW50KCksIGJsb2NrU2l6ZSk7Ci0gICAgY29udHJvbCA9IChieXRlW10pR0NzcHkudXRpbC5jcmVhdGVEYXRhQXJyYXkobmV3IGJ5dGVbMF0sIG1heFRpbGVOdW0pOwotICAgIC8vIHRvIGF2b2lkIGFsbG9jYXRpb24gZHVyaW5nIEdDIHdlIHByZWFsbG9jYXRlIHRoZSBzdHJlYW1zIGFycmF5Ci0gICAgc3RyZWFtcyA9IG5ldyBTdHJlYW1bTUFYX1NUUkVBTVNdOwotICAgIHNlcnZlclNwYWNlID0gY3JlYXRlU2VydmVyU3BhY2Uoc2VydmVyLCBuYW1lLCBtYXhUaWxlTnVtLCBtYWluU3BhY2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIHN1YnNwYWNlIGZvciB0aGlzIHNwYWNlLgotICAgKiBTdWJzcGFjZSBwcm92aWRlIHVzZWZ1bCBmYWNpbGl0aWVzIGZvciBjb250aWd1b3VzIHNwYWNlcywgZXZlbiBpZgotICAgKiBhIHNwYWNlIGNvbnRhaW5zIG9ubHkgb25lLgotICAgKiBAcGFyYW0gbW10a1NwYWNlIFRoZSBNTVRrIHNwYWNlCi0gICAqLwotICBASW50ZXJydXB0aWJsZQotICBwcm90ZWN0ZWQgU3Vic3BhY2UgY3JlYXRlU3Vic3BhY2UoU3BhY2UgbW10a1NwYWNlKSB7Ci0gICAgQWRkcmVzcyBzdGFydCA9IG1tdGtTcGFjZS5nZXRTdGFydCgpOwotICAgIHJldHVybiBuZXcgU3Vic3BhY2Uoc3RhcnQsIHN0YXJ0LCAwLCBibG9ja1NpemUsIDApOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBHQ3NweSBTZXJ2ZXJTcGFjZSBhbmQgYWRkIGl0IHRvIHRoZSBTZXJ2ZXJJbnRlcnByZXRlci4KLSAgICogQHBhcmFtIHNlcnZlciB0aGUgR0NzcHkgU2VydmVySW50ZXJwcmV0ZXIuCi0gICAqIEBwYXJhbSBzcGFjZU5hbWUgVGhlIG5hbWUgb2YgdGhpcyBkcml2ZXIuCi0gICAqIEBwYXJhbSBtYXhUaWxlTnVtIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aWxlcyBpbiB0aGlzIHNwYWNlLgotICAgKiBAcGFyYW0gbWFpblNwYWNlIElzIHRoaXMgdGhlIG1haW4gc3BhY2U/Ci0gICAqLwotICBASW50ZXJydXB0aWJsZQotICBwcm90ZWN0ZWQgU2VydmVyU3BhY2UgY3JlYXRlU2VydmVyU3BhY2UoU2VydmVySW50ZXJwcmV0ZXIgc2VydmVyLAotICAgICAgICAgICAgICAgICAgU3RyaW5nIHNwYWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgIGludCBtYXhUaWxlTnVtLAotICAgICAgICAgICAgICAgICAgYm9vbGVhbiBtYWluU3BhY2UpIHsKLSAgICAvLyBTZXQgdGhlIGJsb2NrIGxhYmVsCi0gICAgU3RyaW5nIHRtcCA9ICJCbG9jayBTaXplOiAiICsgKChibG9ja1NpemUgPCAxMDI0KSA/Ci0gICAgICAgICAgICAgICAgICAgICBibG9ja1NpemUgKyAiIGJ5dGVzXG4iOgotICAgICAgICAgICAgICAgICAgICAgKGJsb2NrU2l6ZSAvIDEwMjQpICsgIiBLYnl0ZXNcbiIpOwotCi0gICAgLy8gQ3JlYXRlIGEgc2luZ2xlIEdDc3B5IFNwYWNlCi0gICAgcmV0dXJuIFZNLm5ld0dDc3B5U2VydmVyU3BhY2Uoc2VydmVyLCAgICAgICAgICAgLy8gdGhlIHNlcnZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlTmFtZSwgICAgICAgIC8vIHNwYWNlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREcml2ZXJOYW1lKCksICAvLyBkcml2ZXIgKHNwYWNlKSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJsb2NrICIsICAgICAgICAgLy8gc3BhY2UgdGl0bGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAsICAgICAgICAgICAgICAvLyBibG9jayBpbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VGlsZU51bSwgICAgICAgLy8gbnVtYmVyIG9mIHRpbGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVOVVNFRCIsICAgICAgICAgLy8gdGhlIGxhYmVsIGZvciB1bnVzZWQgYmxvY2tzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpblNwYWNlKTsgICAgICAgLy8gbWFpbiBzcGFjZQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbmFtZSBvZiB0aGlzIGRyaXZlciB0eXBlLgotICAgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoaXMgZHJpdmVyLgotICAgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREcml2ZXJOYW1lKCk7Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGlsZXMgaW4gdGhpcyBzcGFjZS4KLSAgICogQHJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGlsZXMgaW4gdGhlIHNwYWNlLgotICAgKi8KLSAgcHVibGljIGludCBnZXRNYXhUaWxlTnVtKCkgewotICAgIHJldHVybiBtYXhUaWxlTnVtOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBHQ3NweSBzcGFjZSBtYW5hZ2VkIGJ5IHRoaXMgZHJpdmVyLgotICAgKiBAcmV0dXJuIHRoZSBHQ3NweSBzZXJ2ZXIgc3BhY2UuCi0gICAqLwotICBwdWJsaWMgU2VydmVyU3BhY2UgZ2V0U2VydmVyU3BhY2UoKSB7IHJldHVybiBzZXJ2ZXJTcGFjZTsgfQotCi0gIC8qKgotICAgKiBBZGQgYSBzdHJlYW0gdG8gdGhlIGRyaXZlci4gVGhpcyBhbHNvIHNldHMgdGhlIHN0cmVhbSdzIGlkCi0gICAqICh1bmlxdWUgZm9yIHRoaXMgc3BhY2UpLgotICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBzdHJlYW0KLSAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIG1vcmUgdGhhbiBNQVhfU1RSRUFNUyBhcmUgYWRkZWQKLSAgICovCi0gIEBJbnRlcnJ1cHRpYmxlCi0gIHB1YmxpYyB2b2lkIGFkZFN0cmVhbShTdHJlYW0gc3RyZWFtKSB7Ci0gICAgaW50IGlkID0gMDsKLSAgICB3aGlsZSAoaWQgPCBNQVhfU1RSRUFNUykgewotICAgICAgaWYgKHN0cmVhbXNbaWRdID09IG51bGwpIHsKLSAgICAgICAgc3RyZWFtc1tpZF0gPSBzdHJlYW07Ci0gICAgICAgIGlmIChERUJVRykgeyBMb2cud3JpdGUoIkFkZGluZyBzdHJlYW0gd2l0aCBpZD0iKTsgTG9nLndyaXRlbG4oaWQpOyB9Ci0gICAgICAgIEFkZHJlc3Mgc3RyZWFtXyA9IHNlcnZlclNwYWNlLmFkZFN0cmVhbShpZCk7Ci0gICAgICAgIHN0cmVhbS5zZXRTdHJlYW0oaWQsIHN0cmVhbV8pOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZCsrOwotICAgIH0KLSAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiVG9vIG1hbnkgc3RyZWFtcyBhZGRlZCB0byBkcml2ZXIgIituYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb3VudCBudW1iZXIgb2YgdGlsZXMgaW4gYW4gYWRkcmVzcyByYW5nZS4KLSAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuCi0gICAqIEBwYXJhbSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuCi0gICAqIEBwYXJhbSB0aWxlU2l6ZSBUaGUgc2l6ZSBvZiBlYWNoIHRpbGUuCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiB0aWxlcyBpbiB0aGlzIHJhbmdlLgotICAgKi8KLSAgcHJvdGVjdGVkIGludCBjb3VudFRpbGVOdW0oQWRkcmVzcyBzdGFydCwgQWRkcmVzcyBlbmQsIGludCB0aWxlU2l6ZSkgewotICAgIGlmIChlbmQuTEUoc3RhcnQpKSByZXR1cm4gMDsKLSAgICBpbnQgZGlmZiA9IGVuZC5kaWZmKHN0YXJ0KS50b0ludCgpOwotICAgIHJldHVybiBjb3VudFRpbGVOdW0oZGlmZiwgdGlsZVNpemUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvdW50IG51bWJlciBvZiB0aWxlcyBpbiBhbiBhZGRyZXNzIHJhbmdlLgotICAgKiBAcGFyYW0gZXh0ZW50IFRoZSBleHRlbnQgb2YgdGhlIHJhbmdlLgotICAgKiBAcGFyYW0gdGlsZVNpemUgVGhlIHNpemUgb2YgZWFjaCB0aWxlLgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgdGlsZXMgaW4gdGhpcyByYW5nZS4KLSAgICovCi0gIHByb3RlY3RlZCBpbnQgY291bnRUaWxlTnVtKEV4dGVudCBleHRlbnQsIGludCB0aWxlU2l6ZSkgewotICAgIGludCBkaWZmID0gZXh0ZW50LnRvSW50KCk7Ci0gICAgcmV0dXJuIGNvdW50VGlsZU51bShkaWZmLCB0aWxlU2l6ZSk7Ci0gIH0KLQotICBwcml2YXRlIGludCBjb3VudFRpbGVOdW0oaW50IGRpZmYsIGludCB0aWxlU2l6ZSkgewotICAgIGludCB0aWxlcyA9IGRpZmYgLyB0aWxlU2l6ZTsKLSAgICBpZiAoKGRpZmYgJSB0aWxlU2l6ZSkgIT0gMCkKLSAgICAgICsrdGlsZXM7Ci0gICAgcmV0dXJuIHRpbGVzOwotICB9Ci0KLSAgLyoqCi0gICAqIEluZGljYXRlIHRoZSBsaW1pdHMgb2YgYSBzcGFjZS4KLSAgICoKLSAgICogQHBhcmFtIHN0YXJ0IHRoZSBBZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgc3BhY2UuCi0gICAqIEBwYXJhbSBlbmQgdGhlIEFkZHJlc3Mgb2YgdGhlIGVuZCBvZiB0aGUgc3BhY2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSYW5nZShBZGRyZXNzIHN0YXJ0LCBBZGRyZXNzIGVuZCkge30KLQotICAvKioKLSAgICogSW5kaWNhdGUgdGhlIGxpbWl0cyBvZiBhIHNwYWNlLgotICAgKgotICAgKiBAcGFyYW0gc3RhcnQgdGhlIEFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBzcGFjZS4KLSAgICogQHBhcmFtIGV4dGVudCB0aGUgZXh0ZW50IG9mIHRoZSBzcGFjZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJhbmdlKEFkZHJlc3Mgc3RhcnQsIEV4dGVudCBleHRlbnQpIHsKLSAgICBzZXRSYW5nZShzdGFydCwgc3RhcnQucGx1cyhleHRlbnQpKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXR1cCB0aGUgdGlsZSBuYW1lcyBpbiBhIHN1YnNwYWNlLiBUaWxlIG5hbWVzIGFyZSB0eXBpY2FsbHkKLSAgICogYWRkcmVzcyByYW5nZXMgYnV0IG1heSBiZSBhbnl0aGluZyAoZS5nLiBhIHNpemUgY2xhc3MgaWYgdGhlCi0gICAqIHNwYWNlIGlzIGEgc2VncmVnYXRlZCBmcmVlLWxpc3QgbWFuYWdlciwgb3IgYSBjbGFzcyBuYW1lIGlmIHRoZQotICAgKiBzcGFjZSByZXByZXNlbnRzIHRoZSBjbGFzcyBpbnN0YW5jZXMgbG9hZGVkKS4KLSAgICoKLSAgICogQHBhcmFtIHN1YnNwYWNlIHRoZSBTdWJzcGFjZQotICAgKiBAcGFyYW0gbnVtVGlsZXMgdGhlIG51bWJlciBvZiB0aWxlcyB0byBuYW1lCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzZXRUaWxlbmFtZXMoU3Vic3BhY2Ugc3Vic3BhY2UsIGludCBudW1UaWxlcykgewotICAgIEFkZHJlc3Mgc3RhcnQgPSBzdWJzcGFjZS5nZXRTdGFydCgpOwotICAgIGludCBmaXJzdCA9IHN1YnNwYWNlLmdldEZpcnN0SW5kZXgoKTsKLSAgICBpbnQgYnMgPSBzdWJzcGFjZS5nZXRCbG9ja1NpemUoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVGlsZXM7ICsraSkgewotICAgICAgaWYgKHN1YnNwYWNlLmluZGV4SW5SYW5nZShpKSkKLSAgICAgICAgc2VydmVyU3BhY2Uuc2V0VGlsZW5hbWUoaSwgc3RhcnQucGx1cygoaSAtIGZpcnN0KSAqIGJzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQucGx1cygoaSArIDEgLSBmaXJzdCkgKiBicykpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgInR5cGljYWwiIG1heGltdW0gbnVtYmVyIG9mIG9iamVjdHMgaW4gZWFjaCB0aWxlLgotICAgKiBAcGFyYW0gYmxvY2tTaXplIFRoZSBzaXplIG9mIGEgdGlsZQotICAgKiBAcmV0dXJuIFRoZSBtYXhpbXVtIG51bWJlciBvZiBvYmplY3RzIGluIGEgdGlsZQotICAgKi8KLSAgcHVibGljIGludCBtYXhPYmplY3RzUGVyQmxvY2soaW50IGJsb2NrU2l6ZSkgewotICAgIC8vIE1heWJlIGEgbWlzdXNlIG9mIFNlcnZlckludGVycHJldGVyIGJ1dCBpdCdzIGEgY29udmVuaWVudAotICAgIC8vIFZNLWRlcGVuZGVudCBjbGFzcwotICAgIHJldHVybiBibG9ja1NpemUgLyBHQ3NweS5zZXJ2ZXIuY29tcHV0ZUhlYWRlclNpemUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBJcyB0aGUgc2VydmVyIGNvbm5lY3RlZCB0byBhIEdDc3B5IGNsaWVudD8KLSAgICogQHBhcmFtIGV2ZW50IFRoZSBjdXJyZW50IGV2ZW50Ci0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZChpbnQgZXZlbnQpIHsKLSAgICByZXR1cm4gc2VydmVyLmlzQ29ubmVjdGVkKGV2ZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXNldCB0aGUgc3RhdGlzdGljcyBmb3IgYSBzcGFjZS4KLSAgICogSW4gdGhpcyBiYXNlIGRyaXZlciwgd2Ugc2ltcGx5IG5vdGUgdGhhdCB0aGUgZGF0YSBoYXMgY2hhbmdlZC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHJlc2V0RGF0YSgpIHsgY2hhbmdlZCA9IHRydWU7IH0KLQotICAvKioKLSAgICogU2NhbiBhbiBvYmplY3QgZm91bmQgYXQgYSBsb2NhdGlvbi4KLSAgICogQ29sbGVjdG9ycyB0eXBpY2FsbHkgY2FsbCB0aGlzIG1ldGhvZCB0byB1cGRhdGUgR0NzcHkgc3RhdGlzdGljcy4KLSAgICogVGhlIGRyaXZlciBtYXkgb3IgbWF5IG5vdCBhY2N1bXVsYXRlIHZhbHVlcyBmb3VuZCwgZGVwZW5kaW5nIG9uCi0gICAqIHRoZSB2YWx1ZSBvZiB0b3RhbC4KLSAgICogQHBhcmFtIG9iaiB0aGUgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgZm91bmQKLSAgICogQHBhcmFtIHRvdGFsIFdoZXRoZXIgdG8gdG90YWwgdGhlIHN0YXRpc3RpY3MKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNjYW4oT2JqZWN0UmVmZXJlbmNlIG9iaiwgYm9vbGVhbiB0b3RhbCkge30KLQotICAvKioKLSAgICogU2NhbiBhbiBvYmplY3QgZm91bmQgYXQgYSBsb2NhdGlvbi4KLSAgICogQ29sbGVjdG9ycyB0eXBpY2FsbHkgY2FsbCB0aGlzIG1ldGhvZCB0byB1cGRhdGUgR0NzcHkgc3RhdGlzdGljcwotICAgKiBUaGUgZHJpdmVyIHdpbGwgYWNjdW11bGF0ZSB2YWx1ZXMgZm91bmQuCi0gICAqIEBwYXJhbSBvYmogdGhlIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IGZvdW5kCi0gICAqLwotICBwdWJsaWMgdm9pZCBzY2FuKE9iamVjdFJlZmVyZW5jZSBvYmopIHsgc2NhbihvYmosIHRydWUpOyB9Ci0KLSAgLyoqCi0gICAqIFNjYW4gYW4gb2JqZWN0IGZvdW5kIGF0IGEgbG9jYXRpb24uCi0gICAqIENvbGxlY3RvcnMgdHlwaWNhbGx5IGNhbGwgdGhpcyBtZXRob2QgdG8gdXBkYXRlIEdDc3B5IHN0YXRpc3RpY3MuCi0gICAqIFRoZSBkcml2ZXIgbWF5IG9yIG1heSBub3QgYWNjdW11bGF0ZSB2YWx1ZXMgZm91bmQsIGRlcGVuZGluZyBvbgotICAgKiB0aGUgdmFsdWUgb2YgdG90YWwuCi0gICAqIEBwYXJhbSBvYmogdGhlIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IGZvdW5kCi0gICAqIEBwYXJhbSB0b3RhbCBXaGV0aGVyIHRvIHRvdGFsIHRoZSBzdGF0aXN0aWNzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzY2FuKEFkZHJlc3Mgb2JqLCBib29sZWFuIHRvdGFsKSB7fQotCi0gIC8qKgotICAgKiBTY2FuIGFuIG9iamVjdCBmb3VuZCBhdCBhIGxvY2F0aW9uLgotICAgKiBDb2xsZWN0b3JzIHR5cGljYWxseSBjYWxsIHRoaXMgbWV0aG9kIHRvIHVwZGF0ZSBHQ3NweSBzdGF0aXN0aWNzCi0gICAqIFRoZSBkcml2ZXIgd2lsbCBhY2N1bXVsYXRlIHZhbHVlcyBmb3VuZC4KLSAgICogQHBhcmFtIG9iaiB0aGUgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgZm91bmQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNjYW4oQWRkcmVzcyBvYmopIHt9Ci0KLSAgLyoqCi0gICAqIEhhbmRsZSBhIGRpcmVjdCByZWZlcmVuY2UgZnJvbSB0aGUgaW1tb3J0YWwgc3BhY2UuPHA+Ci0gICAqIFRoaXMgaXMgYW4gZW1wdHkgaW1wbGVtZW50YXRpb24uIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kCi0gICAqIHRvIGluY3JlbWVudCB0aGVpciA8Y29kZT5yZWZGcm9tSW1tb3J0YWw8L2NvZGU+IFN0cmVhbS4KLSAgICoKLSAgICogQHBhcmFtIGFkZHIgVGhlIEFkZHJlc3MKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBBZGRyZXNzIGlzIGluIHRoaXMgc3Vic3BhY2UuIEFsd2F5cyBmYWxzZSBoZXJlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFuZGxlUmVmZXJlbmNlRnJvbUltbW9ydGFsU3BhY2UoQWRkcmVzcyBhZGRyKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBzcGFjZSBpbmZvLgotICAgKiBUaGlzIHNpbXBseSByZXBvcnRzIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IHNwYWNlLgotICAgKiBEcml2ZXJzIHRoYXQgd2FudCB0byBzZW5kIHNvbWV0aGluZyBtb3JlIGNvbXBsZXggdGhhbgotICAgKiAgIkN1cnJlbnQgU2l6ZTogc2l6ZVxuIgotICAgKiBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotICAgKgotICAgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgc3BhY2UKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNldFNwYWNlSW5mbyhPZmZzZXQgc2l6ZSkgewotICAgIC8vICAgIC0gc3ByaW50Zih0bXAsICJDdXJyZW50IFNpemU6ICVzXG4iLCBnY3NweV9mb3JtYXRTaXplKHNpemUpKTsKLSAgICBBZGRyZXNzIHRtcCA9IEdDc3B5LnV0aWwuZm9ybWF0U2l6ZSgiQ3VycmVudCBTaXplOiAlc1xuIiwgMTI4LCBzaXplLnRvSW50KCkpOwotICAgIHNlcnZlclNwYWNlLnNwYWNlSW5mbyh0bXApOwotICAgIEdDc3B5LnV0aWwuZnJlZSh0bXApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDb250cm9sIHZhbHVlcwotICAgKi8KLQotICAvKioKLSAgICogSXMgYSB0aWxlIHVzZWQ/Ci0gICAqIEBwYXJhbSB2YWwgdGhlIGNvbnRyb2wgdmFsdWUuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGlsZSBpcyB1c2VkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gY29udHJvbElzVXNlZChieXRlIHZhbCkgewotICAgIHJldHVybiAodmFsICYgQ09OVFJPTF9VU0VEKSAhPSAwOwotICB9Ci0KLSAgLyoqCi0gICAqIElzIGEgdGlsZSBhIGJhY2tncm91bmQgcHNldWRvLXRpbGU/Ci0gICAqIEBwYXJhbSB2YWwgdGhlIGNvbnRyb2wgdmFsdWUuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGlsZSBpcyBhIGJhY2tncm91bmQgdGlsZQotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGNvbnRyb2xJc0JhY2tncm91bmQoYnl0ZSB2YWwpIHsKLSAgICByZXR1cm4gKHZhbCAmIENPTlRST0xfQkFDS0dST1VORCkgIT0gMDsKLSAgfQotCi0gIC8qKgotICAgKiBJcyBhIHRpbGUgdW51c2VkPwotICAgKiBAcGFyYW0gdmFsIHRoZSBjb250cm9sIHZhbHVlLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRpbGUgaXMgdW51c2VkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gY29udHJvbElzVW51c2VkKGJ5dGUgdmFsKSB7Ci0gICAgcmV0dXJuICh2YWwgJiBDT05UUk9MX1VOVVNFRCkgIT0gMDsKLSAgfQotCi0gIC8qKgotICAgKiBJcyB0aGlzIGEgc2VwYXJhdG9yPwotICAgKiBAcGFyYW0gdmFsIHRoZSBjb250cm9sIHZhbHVlLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHNlcGFyYXRvcgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGNvbnRyb2xJc1NlcGFyYXRvcihieXRlIHZhbCkgewotICAgIHJldHVybiAodmFsICYgQ09OVFJPTF9TRVBBUkFUT1IpICE9IDA7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdGlhbGlzZSB0aGUgdmFsdWUgb2YgYSBjb250cm9sLgotICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSB0aWxlLgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgY29udHJvbAotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2woaW50IGluZGV4LCBieXRlIHZhbHVlKSB7Ci0gICAgY29udHJvbFtpbmRleF0gPSB2YWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYSBjb250cm9sIHRvIHRoZSB0aWxlCi0gICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHRpbGUuCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgY29udHJvbCB0byBhZGQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZGRDb250cm9sKGludCBpbmRleCwgYnl0ZSB2YWx1ZSkgewotICAgIGNvbnRyb2xbaW5kZXhdIHw9IHZhbHVlOwotICB9Ci0KLSAgLyoqIFNldCB0aGUgY29udHJvbAotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldAotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0Q29udHJvbChpbnQgaW5kZXgsIGJ5dGUgdmFsdWUpIHsKLSAgICBjb250cm9sW2luZGV4XSAmPSB2YWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGNvbnRyb2xzIGZvciBhIHRpbGUuCi0gICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHRpbGUuCi0gICAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBjb250cm9scwotICAgKi8KLSAgcHVibGljIGJ5dGUgZ2V0Q29udHJvbChpbnQgaW5kZXgpIHsKLSAgICByZXR1cm4gY29udHJvbFtpbmRleF07Ci0gIH0KLQotICAvKioKLSAgICogSW5pdGlhbGlzZSBjb250cm9sIHZhbHVlcyBpbiBhbGwgdGlsZXMKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGluaXRDb250cm9scygpIHsKLSAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgY29udHJvbC5sZW5ndGg7ICsraW5kZXgpIHsKLSAgICAgIGluaXRDb250cm9sKGluZGV4LCBDT05UUk9MX1VTRUQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIGNvbnRyb2wgdmFsdWUgaW4gZWFjaCB0aWxlIGluIGEgcmVnaW9uLgotICAgKiBAcGFyYW0gdGFnIFRoZSBjb250cm9sIHRhZy4KLSAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydCBpbmRleCBvZiB0aGUgcmVnaW9uLgotICAgKiBAcGFyYW0gbGVuIFRoZSBudW1iZXIgb2YgdGlsZXMgaW4gdGhlIHJlZ2lvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNvbnRyb2xWYWx1ZXMoYnl0ZSB0YWcsIGludCBzdGFydCwgaW50IGxlbikgewotICAgIGlmIChERUJVRykgewotICAgICAgTG9nLndyaXRlKCJBYnN0cmFjdERyaXZlci5jb250cm9sVmFsdWVzIGZvciBzcGFjZSAiKTsKLSAgICAgIExvZy53cml0ZShuYW1lKTsKLSAgICAgIExvZy53cml0ZSgiLCBjb250cm9sIGxlbmd0aD0iLCBjb250cm9sLmxlbmd0aCk7Ci0gICAgICBMb2cud3JpdGUoIiB3cml0aW5nIGNvbnRyb2xzIGZyb20gIiwgc3RhcnQpOwotICAgICAgTG9nLndyaXRlbG4oIiB0byAiLCBzdGFydCArIGxlbik7Ci0gICAgfQotICAgIGNoYW5nZWQgPSB0cnVlOwotICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IChzdGFydCtsZW4pOyArK2kpIHsKLSAgICAgIC8vIENhbm5vdCBiZSBib3RoIFVTRUQgYW5kIFVOVVNFRCBvciBCQUNLR1JPVU5ECi0gICAgICBpZiAoY29udHJvbElzQmFja2dyb3VuZCh0YWcpIHx8IGNvbnRyb2xJc1VudXNlZCh0YWcpKQotICAgICAgICBzZXRDb250cm9sKGksIChieXRlKX5DT05UUk9MX1VTRUQpOwotICAgICAgZWxzZSBpZiAoY29udHJvbElzVXNlZCh0YWcpKQotICAgICAgICBzZXRDb250cm9sKGksIChieXRlKX5DT05UUk9MX1VOVVNFRCk7Ci0gICAgICBhZGRDb250cm9sKGksIHRhZyk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRyYW5zbWl0IHRoZSBzdHJlYW1zIGZvciB0aGlzIHNwYWNlLiBBIGRyaXZlciB3aWxsIHR5cGljYWxseQotICAgKiA8b2w+Ci0gICAqIDxsaT4gRGV0ZXJtaW5lIHdoZXRoZXIgYSBHQ3NweSBjbGllbnQgaXMgY29ubmVjdGVkIGFuZCBpbnRlcmVzdGVkIGluCi0gICAqICAgICAgdGhpcyBldmVudCwgZS5nLgotICAgKiAgICAgIDxwcmU+c2VydmVyLmlzQ29ubmVjdGVkKGV2ZW50KTwvcHJlPgotICAgKiA8bGk+IFNldHVwIHRoZSBzdW1tYXJpZXMgZm9yIGVhY2ggc3RyZWFtLCBlLmcuCi0gICAqICAgICAgPHByZT5zdHJlYW0uc2V0U3VtbWFyeSh2YWx1ZXMuLi4pOzwvcHJlPgotICAgKiA8bGk+IFNldHVwIHRoZSBjb250cm9sIGluZm9ybWF0aW9uIGZvciBlYWNoIHRpbGUuIGUuZy4KLSAgICogICAgICA8cHJlPmNvbnRyb2xWYWx1ZXMoQ09OVFJPTF9VU0VELCBzdGFydCwgbnVtQmxvY2tzKTs8L3ByZT4KLSAgICogICAgICA8cHJlPmNvbnRyb2xWYWx1ZXMoQ09OVFJPTF9VTlVTRUQsIGVuZCwgcmVtYWluaW5nQmxvY2tzKTs8L3ByZT4KLSAgICogPGxpPiBTZXQgdXAgdGhlIHNwYWNlIGluZm9ybWF0aW9uLCBlLmcuCi0gICAqICAgICAgPHByZT5zZXRTcGFjZShpbmZvKTs8L3ByZT4KLSAgICogPGxpPiBTZW5kIHRoZSBkYXRhIGZvciBhbGwgc3RyZWFtcywgZS5nLgotICAgKiAgICAgIDxwcmU+c2VuZChldmVudCwgbnVtVGlsZXMpOzwvcHJlPgotICAgKiAgICAgIE5vdGUgdGhhdCBBYnN0cmFjdERyaXZlci5zZW5kIHRha2VzIGNhcmUgb2Ygc2VuZGluZyB0aGUgaW5mb3JtYXRpb24KLSAgICogICAgICBmb3IgYWxsIHN0cmVhbXMgKGluY2x1ZGluZyBjb250cm9sIGRhdGEpLgotICAgKgotICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50Ci0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB0cmFuc21pdChpbnQgZXZlbnQpOwotCi0gIC8qKgotICAgKiBTZW5kIGFsbCB0aGUgc3RyZWFtcyBmb3IgdGhpcyBzcGFjZSBpZiBpdCBoYXMgY2hhbmdlZC4KLSAgICogQXNzdW1lIHRoYXQgdGhlIGRhdGEgaGFzIGJlZW4gZ2F0aGVyZWQgYW5kIHRoYXQgc3VtbWFyeSBpbmZvCi0gICAqIGFuZCBjb250cm9sIHZhbHVlcyBoYXZlIGJlZW4gc2V0IGJlZm9yZSB0aGlzIGlzIGNhbGxlZC4KLSAgICoKLSAgICogQHBhcmFtIGV2ZW50IHRoZSBldmVudAotICAgKiBAcGFyYW0gbnVtVGlsZXMgdGhlIG51bWJlciBvZiBibG9ja3MgaW4gdGhpcyBzcGFjZQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2VuZChpbnQgZXZlbnQsIGludCBudW1UaWxlcykgewotICAgIGlmIChjaGFuZ2VkKSB7Ci0gICAgICBzZXJ2ZXJTcGFjZS5zdGFydENvbW11bmljYXRpb24oKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1NUUkVBTVM7IGkrKykKLSAgICAgICAgaWYgKHN0cmVhbXNbaV0gIT0gbnVsbCkKLSAgICAgICAgICBzdHJlYW1zW2ldLnNlbmQoZXZlbnQsIG51bVRpbGVzKTsKLSAgICAgIHNlcnZlclNwYWNlLnNlbmRDb250cm9scyh0aGlzLCBudW1UaWxlcyk7Ci0gICAgICBzZXJ2ZXJTcGFjZS5lbmRDb21tdW5pY2F0aW9uKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZ2NzcHkvZHJpdmVycy9HZW5JbW1vcnRhbFNwYWNlRHJpdmVyLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZ2NzcHkvZHJpdmVycy9HZW5JbW1vcnRhbFNwYWNlRHJpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNDc2MWYuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2djc3B5L2RyaXZlcnMvR2VuSW1tb3J0YWxTcGFjZURyaXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5Lmdjc3B5LmRyaXZlcnM7Ci0KLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lmdjc3B5LkNvbG9yOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZ2NzcHkuU3RyZWFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotaW1wb3J0IG9yZy5tbXRrLnZtLmdjc3B5LlNob3J0U3RyZWFtOwotCi1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Mb2c7Ci1pbXBvcnQgb3JnLm1tdGsudm0uZ2NzcHkuU2VydmVySW50ZXJwcmV0ZXI7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogR0NzcHkgZHJpdmVyIGZvciB0aGUgTU1UayBnZW5lcmF0aW9uYWwgaW1tb3J0YWwgc3BhY2UuCi0gKiBBZGRpdGlvbmFsIFN0cmVhbSBmb3IgcmVtc2V0IHJlZmVyZW5jZXMuCi0gKiBUaGlzIGNsYXNzIGV4dGVuZHMgSW1tb3J0YWxTcGFjZURyaXZlciwgYSBzaW1wbGUgZHJpdmVyIGZvcgotICogdGhlIGNvbnRpZ3VvdXMgTU1UayBJbW1vcnRhbFNwYWNlLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlIHB1YmxpYyBjbGFzcyBHZW5JbW1vcnRhbFNwYWNlRHJpdmVyIGV4dGVuZHMgSW1tb3J0YWxTcGFjZURyaXZlciB7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0gIC8vIFRoZSBTdHJlYW0gZm9yIG5ld2x5IHByb21vdGVkIG9iamVjdHMKLSAgcHJvdGVjdGVkIFNob3J0U3RyZWFtIHJlbXNldFN0cmVhbTsKLSAgLy8gU3RhdGlzdGljcyBmb3IgcmVtc2V0IHJlZmVyZW5jZXMKLSAgcHJvdGVjdGVkIGludCB0b3RhbFJlbXNldCA9IDA7Ci0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IGRyaXZlciBmb3IgYSBnZW5lcmF0aW9uYWwgaW1tb3J0YWwgc3BhY2UuCi0gICAqCi0gICAqIEBwYXJhbSBzZXJ2ZXIgVGhlIEdDc3B5IFNlcnZlckludGVycHJldGVyCi0gICAqIEBwYXJhbSBzcGFjZU5hbWUgVGhlIG5hbWUgb2YgdGhpcyBHQ3NweSBzcGFjZQotICAgKiBAcGFyYW0gbW10a1NwYWNlIFRoZSBNTVRrIHNwYWNlCi0gICAqIEBwYXJhbSBibG9ja1NpemUgVGhlIHRpbGUgc2l6ZQotICAgKiBAcGFyYW0gbWFpblNwYWNlIElzIHRoaXMgdGhlIG1haW4gc3BhY2U/Ci0gICAqLwotICBwdWJsaWMgR2VuSW1tb3J0YWxTcGFjZURyaXZlcigKLSAgICAgICAgICAgICAgICAgICAgIFNlcnZlckludGVycHJldGVyIHNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzcGFjZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICBTcGFjZSBtbXRrU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tTaXplLAotICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBtYWluU3BhY2UpIHsKLQotICAgIHN1cGVyKHNlcnZlciwgc3BhY2VOYW1lLCBtbXRrU3BhY2UsIGJsb2NrU2l6ZSwgbWFpblNwYWNlKTsKLQotICAgIC8vIGNyZWF0ZSBhZGRpdGlvbmFsIHN0cmVhbQotICAgIHJlbXNldFN0cmVhbSA9IGNyZWF0ZVJlbXNldFN0cmVhbSgpOwotCi0gICAgaWYgKERFQlVHKSB7Ci0gICAgICBMb2cud3JpdGUoIkdlbkltbW9ydGFsU3BhY2VEcml2ZXIgZm9yICIpOyBMb2cud3JpdGUoc3BhY2VOYW1lKTsKLSAgICAgIExvZy53cml0ZSgiLCBibG9ja3NpemU9Iik7IExvZy53cml0ZShibG9ja1NpemUpOwotICAgICAgTG9nLndyaXRlKCIsIHN0YXJ0PSIpOyBMb2cud3JpdGUobW10a1NwYWNlLmdldFN0YXJ0KCkpOwotICAgICAgTG9nLndyaXRlKCIsIGV4dGVudD0iKTsgTG9nLndyaXRlKG1tdGtTcGFjZS5nZXRFeHRlbnQoKSk7Ci0gICAgICBMb2cud3JpdGUoIiwgbWF4VGlsZU51bT0iKTsgTG9nLndyaXRlbG4obWF4VGlsZU51bSk7Ci0gICAgfQotCi0gICAgcmVzZXREYXRhKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBuYW1lIG9mIHRoaXMgZHJpdmVyIHR5cGUuCi0gICAqIEByZXR1cm4gVGhlIG5hbWUsICJNTVRrIEdlbkltbW9ydGFsU3BhY2VEcml2ZXIiIGZvciB0aGlzIGRyaXZlci4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpIHsKLSAgICByZXR1cm4gIk1NVGsgR2VuSW1tb3J0YWxTcGFjZURyaXZlciI7Ci0gIH0KLQotICAvKioKLSAgICogSGVlbHBlciBtZXRob2RzIHRvIGNyZWF0ZSB0aGUgYWRkaXRpb25hbCBzdHJlYW1zCi0gKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHJpdmF0ZSBTaG9ydFN0cmVhbSBjcmVhdGVSZW1zZXRTdHJlYW0oKSB7Ci0gICAgcmV0dXJuIFZNLm5ld0dDc3B5U2hvcnRTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgIlJlbWVtYmVyZWQgc2V0IHN0cmVhbSIsCi0gICAgICAgICAgICAgICAgICAgICAoc2hvcnQpMCwKLSAgICAgICAgICAgICAgICAgICAgIC8vIFNheSwgdHlwaWNhbCBzaXplID0gNCAqIHR5cGljYWwgc2NhbGFyIHNpemU/Ci0gICAgICAgICAgICAgICAgICAgICAoc2hvcnQpKG1heE9iamVjdHNQZXJCbG9jayhibG9ja1NpemUpLzgpLAotICAgICAgICAgICAgICAgICAgICAgKHNob3J0KTAsCi0gICAgICAgICAgICAgICAgICAgICAoc2hvcnQpMCwKLSAgICAgICAgICAgICAgICAgICAgICJSZW1zZXQgcmVmZXJlbmNlczogIiwKLSAgICAgICAgICAgICAgICAgICAgICIgcmVmZXJlbmNlcyIsCi0gICAgICAgICAgICAgICAgICAgICBTdHJlYW1Db25zdGFudHMuUFJFU0VOVEFUSU9OX1BMVVMsCi0gICAgICAgICAgICAgICAgICAgICBTdHJlYW1Db25zdGFudHMuUEFJTlRfU1RZTEVfWkVSTywKLSAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICBDb2xvci5DeWFuLAotICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0dXAgc3VtbWFyaWVzIHBhcnQgb2YgdGhlIDxjb2RlPnRyYW5zbWl0PC9jb2RlPiBtZXRob2QuPHA+Ci0gICAqIE92ZXJyaWRlcyBtZXRob2QgaW4gc3VwZXJjbGFzcyB0byBoYW5kbGUgYWRkaXRpb25hbCBTdHJlYW0uCi0gKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0dXBTdW1tYXJpZXMoKSB7Ci0gICAgc3VwZXIuc2V0dXBTdW1tYXJpZXMoKTsKLSAgICByZW1zZXRTdHJlYW0uc2V0U3VtbWFyeSh0b3RhbFJlbXNldCk7Ci0gIH0KLQotICAvKioKLSAgICogSGFuZGxlIGEgcmVtc2V0IGFkZHJlc3MKLSAgICoKLSAgICogQHBhcmFtIGFkZHIgUmVtc2V0IEFkZHJlc3MKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBBZGRyZXNzIGlzIGluIHRoaXMgc3Vic3BhY2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVSZW1zZXRBZGRyZXNzKEFkZHJlc3MgYWRkcikgewotICAgIGlmKHN1YnNwYWNlLmFkZHJlc3NJblJhbmdlKGFkZHIpKSB7Ci0gICAgICAvLyBpbmNyZW1lbnQgdGlsZQotICAgICAgaW50IGluZGV4ID0gc3Vic3BhY2UuZ2V0SW5kZXgoYWRkcik7Ci0gICAgICByZW1zZXRTdHJlYW0uaW5jcmVtZW50KGluZGV4LCAoc2hvcnQpMSk7Ci0gICAgICAvLyBpbmNyZW1lbnQgc3VtbWFyeQotICAgICAgdG90YWxSZW1zZXQrKzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlc2V0IHRoZSByZW1zZXQgU3RyZWFtCi0gICAqIFRoZSByZW1zZXQgU3RyZWFtIGhhcyB0byBiZSByZXNldCBzZXBlcmF0ZWx5IGJlY2F1c2Ugd2UgZG8gbm90Ci0gICAqIGdhdGhlciBkYXRhIGluIHRoZSB1c3VhbCB3YXkgdXNpbmcgc2NhbigpLgotICovCi0gIHB1YmxpYyB2b2lkIHJlc2V0UmVtc2V0U3RyZWFtKCkgewotICAgIHJlbXNldFN0cmVhbS5yZXNldERhdGEoKTsKLSAgICB0b3RhbFJlbXNldCA9IDA7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2djc3B5L2RyaXZlcnMvR2VuTE9TRHJpdmVyLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZ2NzcHkvZHJpdmVycy9HZW5MT1NEcml2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMyZDg3NC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZ2NzcHkvZHJpdmVycy9HZW5MT1NEcml2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5nY3NweS5kcml2ZXJzOwotCi1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5nY3NweS5Db2xvcjsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lmdjc3B5LlN0cmVhbUNvbnN0YW50czsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLWltcG9ydCBvcmcubW10ay52bS5nY3NweS5TaG9ydFN0cmVhbTsKLWltcG9ydCBvcmcubW10ay52bS5nY3NweS5TZXJ2ZXJJbnRlcnByZXRlcjsKLQotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5MYXJnZU9iamVjdFNwYWNlOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBleHRlbmRzIGEgc2ltcGxlIGRyaXZlciBmb3IgdGhlIE1NVGsgTGFyZ2VPYmplY3RTcGFjZQotICogZm9yIEdlbmVyYXRpb25hbCBDb2xsZWN0b3JzLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlIHB1YmxpYyBjbGFzcyBHZW5MT1NEcml2ZXIgZXh0ZW5kcyBUcmVhZG1pbGxEcml2ZXIgewotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotICAvLyBUaGUgYWRkaXRpb25hbCByZW1zZXQgc3RyZWFtCi0gIHByb3RlY3RlZCBTaG9ydFN0cmVhbSByZW1zZXRTdHJlYW07Ci0gIC8vIEFkZGl0aW9uYWwgb3ZlcmFsbCBzdGF0aXN0aWMKLSAgcHJvdGVjdGVkIGludCB0b3RhbFJlbXNldCA9IDA7ICAgLy8gdG90YWwgb2YgcmVtc2V0IEFkZHJlc3NlcwotCi0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBkcml2ZXIgZm9yIHRoaXMgY29sbGVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSBzZXJ2ZXIgVGhlIG5hbWUgb2YgdGhlIEdDc3B5IHNlcnZlciB0aGF0IG93bnMgdGhpcyBzcGFjZQotICAgKiBAcGFyYW0gc3BhY2VOYW1lIFRoZSBuYW1lIG9mIHRoaXMgZHJpdmVyCi0gICAqIEBwYXJhbSBsb3NwYWNlIHRoZSBsYXJnZSBvYmplY3Qgc3BhY2UgZm9yIHRoaXMgYWxsb2NhdG9yCi0gICAqIEBwYXJhbSBibG9ja1NpemUgVGhlIHRpbGUgc2l6ZQotICAgKiBAcGFyYW0gdGhyZXNob2xkIHRoZSBzaXplIHRocmVzaG9sZCBvZiB0aGUgTE9TCi0gICAqIEBwYXJhbSBtYWluU3BhY2UgSXMgdGhpcyB0aGUgbWFpbiBzcGFjZT8KLSAgICovCi0gIHB1YmxpYyBHZW5MT1NEcml2ZXIoU2VydmVySW50ZXJwcmV0ZXIgc2VydmVyLAotICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzcGFjZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgTGFyZ2VPYmplY3RTcGFjZSBsb3NwYWNlLAotICAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG1haW5TcGFjZSkgewotICAgIC8vVE9ETyBibG9ja3NpemUgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgdHJlYWRtaWxsIGdyYW51bGFyaXR5Ci0gICAgc3VwZXIoc2VydmVyLCBzcGFjZU5hbWUsIGxvc3BhY2UsIGJsb2NrU2l6ZSwgdGhyZXNob2xkLCBtYWluU3BhY2UpOwotICAgIC8vIGNyZWF0ZSByZW1zZXQgc3RyZWFtCi0gICAgcmVtc2V0U3RyZWFtICAgID0gY3JlYXRlUmVtc2V0U3RyZWFtKCk7Ci0gICAgLy8gSW5pdGlhbGlzZSB0aGUgc3RhdGlzdGljcwotICAgIHJlc2V0RGF0YSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbmFtZSBvZiB0aGlzIGRyaXZlciB0eXBlLgotICAgKiBAcmV0dXJuIFRoZSBuYW1lLCAiTU1UayBHZW5MT1NEcml2ZXIiIGZvciB0aGlzIGRyaXZlci4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpIHsKLSAgICByZXR1cm4gIk1NVGsgR2VuTE9TRHJpdmVyIjsKLSAgfQotCi0gIC8vIHByaXZhdGUgY3JlYXRvciBtZXRob2RzIGZvciB0aGUgc3RyZWFtcwotICBASW50ZXJydXB0aWJsZQotICBwcml2YXRlIFNob3J0U3RyZWFtIGNyZWF0ZVJlbXNldFN0cmVhbSgpIHsKLSAgICByZXR1cm4gVk0ubmV3R0NzcHlTaG9ydFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAiUmVtZW1iZXJlZCBzZXQgc3RyZWFtIiwKLSAgICAgICAgICAgICAgICAgICAgIChzaG9ydCkwLAotICAgICAgICAgICAgICAgICAgICAgLy8gU2F5LCB0eXBpY2FsIHNpemUgPSA0ICogdHlwaWNhbCBzY2FsYXIgc2l6ZT8KLSAgICAgICAgICAgICAgICAgICAgIChzaG9ydCkobWF4T2JqZWN0c1BlckJsb2NrKGJsb2NrU2l6ZSkvOCksCi0gICAgICAgICAgICAgICAgICAgICAoc2hvcnQpMCwKLSAgICAgICAgICAgICAgICAgICAgIChzaG9ydCkwLAotICAgICAgICAgICAgICAgICAgICAgIlJlbXNldCByZWZlcmVuY2VzOiAiLAotICAgICAgICAgICAgICAgICAgICAgIiByZWZlcmVuY2VzIiwKLSAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUNvbnN0YW50cy5QUkVTRU5UQVRJT05fUExVUywKLSAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUNvbnN0YW50cy5QQUlOVF9TVFlMRV9aRVJPLAotICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgIENvbG9yLkN5YW4sCi0gICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXR1cCBzdW1tYXJpZXMgcGFydCBvZiB0aGUgPGNvZGU+dHJhbnNtaXQ8L2NvZGU+IG1ldGhvZC48cD4KLSAgICogT3ZlcnJpZGVzIDxjb2RlPnRyYW5zbWl0U2V0dXBTdW1tYXJpZXMgPC9jb2RlPiBvZiBzdXBlcmNsYXNzIHRvCi0gICAqIGhhbmRsZSBhZGRpdGlvbmFsIHN0cmVhbXMuCi0gKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0dXBTdW1tYXJpZXMoKSB7Ci0gICAgc3VwZXIuc2V0dXBTdW1tYXJpZXMoKTsKLSAgICByZW1zZXRTdHJlYW0uc2V0U3VtbWFyeSh0b3RhbFJlbXNldCk7Ci0gIH0KLQotICAvKioKLSAgICogSGFuZGxlIGEgcmVtc2V0IGFkZHJlc3MuCi0gICAqCi0gICAqIEBwYXJhbSBhZGRyIFJlbXNldCBBZGRyZXNzCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gQWRkcmVzcyBpcyBpbiB0aGlzIHN1YnNwYWNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFuZGxlUmVtc2V0QWRkcmVzcyhBZGRyZXNzIGFkZHIpIHsKLSAgICBpZihzdWJzcGFjZS5hZGRyZXNzSW5SYW5nZShhZGRyKSkgewotICAgICAgLy8gaW5jcmVtZW50IHRpbGUKLSAgICAgIGludCBpbmRleCA9IHN1YnNwYWNlLmdldEluZGV4KGFkZHIpOwotICAgICAgcmVtc2V0U3RyZWFtLmluY3JlbWVudChpbmRleCwgKHNob3J0KTEpOwotICAgICAgLy8gaW5jcmVtZW50IHN1bW1hcnkKLSAgICAgIHRoaXMudG90YWxSZW1zZXQrKzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlc2V0IHRoZSByZW1zZXQgU3RyZWFtLiA8cD4KLSAgICogVGhlIHJlbXNldCBTdHJlYW0gaGFzIHRvIGJlIHJlc2V0IHNlcGVyYXRlbHkgYmVjYXVzZSB3ZSBkbyBub3QKLSAgICogZ2F0aGVyIGRhdGEgaW4gdGhlIHVzdWFsIHdheSB1c2luZyA8Y29kZT5zY2FuKCk8L2NvZGU+LgotICovCi0gIHB1YmxpYyB2b2lkIHJlc2V0UmVtc2V0U3RyZWFtKCkgewotICAgIHJlbXNldFN0cmVhbS5yZXNldERhdGEoKTsKLSAgICB0b3RhbFJlbXNldCA9IDA7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2djc3B5L2RyaXZlcnMvSW1tb3J0YWxTcGFjZURyaXZlci5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2djc3B5L2RyaXZlcnMvSW1tb3J0YWxTcGFjZURyaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGRmNGY2Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9nY3NweS9kcml2ZXJzL0ltbW9ydGFsU3BhY2VEcml2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5nY3NweS5kcml2ZXJzOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5UcmFuc2l0aXZlQ2xvc3VyZTsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Mb2c7Ci1pbXBvcnQgb3JnLm1tdGsudm0uZ2NzcHkuU2VydmVySW50ZXJwcmV0ZXI7Ci1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogR0NzcHkgZHJpdmVyIGZvciB0aGUgY29udGlndW91cyBNTVRrIEltbW9ydGFsU3BhY2UuCi0gKiBBZGRzIGZlYXR1cmVzIGZvciB0aGUgSW1tb3J0YWwgc3BhY2UuCi0gKiA8cD4KLSAqCi0gKiBUaGlzIGNsYXNzIGV4dGVuZHMgTGluZWFyU3BhY2VEcml2ZXIsIGEgc2ltcGxlIGRyaXZlciBmb3IgY29udGlndW91cyBNTVRrIHNwYWNlcwotICogc3VjaCBhcyBDb3B5U3BhY2UgYW5kIEltbW9ydGFsU3BhY2UuCi0gKi8KLUBVbmludGVycnVwdGlibGUgcHVibGljIGNsYXNzIEltbW9ydGFsU3BhY2VEcml2ZXIgZXh0ZW5kcyBMaW5lYXJTcGFjZURyaXZlciB7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0gIC8vIEluc3RhbmNlIHZhcmlhYmxlcwotICBwcml2YXRlIEFic3RyYWN0RHJpdmVyW10gcmVnaXN0ZXJlZERyaXZlcnM7Ci0gIHByaXZhdGUgSW1tb3J0YWxTcGFjZURyaXZlci5DbG9zdXJlIGNsb3N1cmU7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBkcml2ZXIgZm9yIGFuIGltbW9ydGFsIENvbnRpZ3VvdXMgTU1UayBzcGFjZS4KLSAgICoKLSAgICogQHBhcmFtIHNlcnZlciBUaGUgR0NzcHkgU2VydmVySW50ZXJwcmV0ZXIKLSAgICogQHBhcmFtIHNwYWNlTmFtZSBUaGUgbmFtZSBvZiB0aGlzIEdDc3B5IHNwYWNlCi0gICAqIEBwYXJhbSBtbXRrU3BhY2UgVGhlIE1NVGsgc3BhY2UKLSAgICogQHBhcmFtIGJsb2NrU2l6ZSBUaGUgdGlsZSBzaXplCi0gICAqIEBwYXJhbSBtYWluU3BhY2UgSXMgdGhpcyB0aGUgbWFpbiBzcGFjZT8KLSAgICovCi0gIHB1YmxpYyBJbW1vcnRhbFNwYWNlRHJpdmVyKAotICAgICAgICAgICAgICAgICAgICAgU2VydmVySW50ZXJwcmV0ZXIgc2VydmVyLAotICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNwYWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIFNwYWNlIG1tdGtTcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja1NpemUsCi0gICAgICAgICAgICAgICAgICAgICBib29sZWFuIG1haW5TcGFjZSkgewotCi0gICAgc3VwZXIoc2VydmVyLCBzcGFjZU5hbWUsIG1tdGtTcGFjZSwgYmxvY2tTaXplLCBtYWluU3BhY2UpOwotCi0gICAgaWYgKERFQlVHKSB7Ci0gICAgICBMb2cud3JpdGUoIkltbW9ydGFsU3BhY2VEcml2ZXIgZm9yICIpOyBMb2cud3JpdGUoc3BhY2VOYW1lKTsKLSAgICAgIExvZy53cml0ZSgiLCBibG9ja3NpemU9Iik7IExvZy53cml0ZShibG9ja1NpemUpOwotICAgICAgTG9nLndyaXRlKCIsIHN0YXJ0PSIpOyBMb2cud3JpdGUobW10a1NwYWNlLmdldFN0YXJ0KCkpOwotICAgICAgTG9nLndyaXRlKCIsIGV4dGVudD0iKTsgTG9nLndyaXRlKG1tdGtTcGFjZS5nZXRFeHRlbnQoKSk7Ci0gICAgICBMb2cud3JpdGUoIiwgbWF4VGlsZU51bT0iKTsgTG9nLndyaXRlbG4obWF4VGlsZU51bSk7Ci0gICAgfQotCi0gICAgLy8gaW5pdGlhbGx5IG5vIHJlZ2lzdGVyZWQgZHJpdmVycyBmb3IgcmVmZXJlbmNlIG5vdGlmaWNhdGlvbgotICAgIHJlZ2lzdGVyZWREcml2ZXJzID0gbmV3IEFic3RyYWN0RHJpdmVyWzBdOwotCi0gICAgY2xvc3VyZSA9IG5ldyBJbW1vcnRhbFNwYWNlRHJpdmVyLkNsb3N1cmUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhpcyBkcml2ZXIgdHlwZS4KLSAgICogQHJldHVybiBUaGUgbmFtZSwgIk1NVGsgSW1tb3J0YWxTcGFjZURyaXZlciIgZm9yIHRoaXMgZHJpdmVyLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJOYW1lKCkgewotICAgIHJldHVybiAiTU1UayBJbW1vcnRhbFNwYWNlRHJpdmVyIjsKLSAgfQotCi0gIC8qKgotICAgKiBVcGRhdGUgdGhlIHRpbGUgc3RhdGlzdGljcy4gPGJyPgotICAgKiBUaGlzIG1ldGhvZCBvdmVycmlkZXMgPGNvZGU+IHNjYW4gPC9jb2RlPiBpaW4gaXRzIHN1cGVyY2xhc3MgdG8KLSAgICogYWRkIGltbW9ydGFsIHNwYWNlIGZlYXR1cmVzLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBjdXJyZW50IG9iamVjdAotICAgKiBAcGFyYW0gdG90YWwgV2hldGhlciB0byBhY2N1bXVsYXRlIHRoZSB2YWx1ZXMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNjYW4oT2JqZWN0UmVmZXJlbmNlIG9iamVjdCwgYm9vbGVhbiB0b3RhbCkgewotICAgIEFkZHJlc3MgYWRkciA9IG9iamVjdC50b0FkZHJlc3MoKTsKLQotICAgIGlmIChzdWJzcGFjZS5hZGRyZXNzSW5SYW5nZShhZGRyKSkgewotICAgICAgVk0uc2Nhbm5pbmcuc2Nhbk9iamVjdChjbG9zdXJlLCBvYmplY3QpOwotICAgICAgc3VwZXIuc2NhbihvYmplY3QsIHRvdGFsKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVnaXN0ZXIgYSBzZXQgb2YgQWJzdHJhY3REcml2ZXIgaW5zdGFuY2VzIHRvIGJlIG5vdGlmaWVkIGFib3V0IGRpcmVjdCByZWZlcmVuY2VzLgotICAgKgotICAgKiBAcGFyYW0gZHJpdmVycyBUaGUgYXJyYXkgb2YgZHJpdmVyIG9iamVjdHMuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRyaXZlcnNGb3JSZWZlcmVuY2VOb3RpZmljYXRpb24oQWJzdHJhY3REcml2ZXJbXSBkcml2ZXJzKSB7Ci0gICAgdGhpcy5yZWdpc3RlcmVkRHJpdmVycyA9IGRyaXZlcnM7Ci0gIH0KLQotICAvKioKLSAgICogVXNlZCB0byB2aXNpdCB0aGUgZWRnZXMgaW4gdGhlIGltbW9ydGFsIG9iamVjdC4KLSAgICovCi0gIEBVbmludGVycnVwdGlibGUKLSAgcHJpdmF0ZSBjbGFzcyBDbG9zdXJlIGV4dGVuZHMgVHJhbnNpdGl2ZUNsb3N1cmUgewotICAgIC8qKgotICAgICAqIFByb2Nlc3MgYW4gZWRnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzRWRnZShPYmplY3RSZWZlcmVuY2Ugc291cmNlLCBBZGRyZXNzIHNsb3QpIHsKLSAgICAgIC8vIEFkZHJlc3MgaW4gUmFuZ2UsIGxvY2F0ZSByZWZlcmVuY2VzCi0gICAgICBBZGRyZXNzIHRhcmdldCA9IHNsb3QubG9hZEFkZHJlc3MoKTsKLSAgICAgIC8vIG5vdGlmeSByZWdpc3RlcmVkIGRyaXZlcnMKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcmVnaXN0ZXJlZERyaXZlcnMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgcmVnaXN0ZXJlZERyaXZlcnNbal0uaGFuZGxlUmVmZXJlbmNlRnJvbUltbW9ydGFsU3BhY2UodGFyZ2V0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9nY3NweS9kcml2ZXJzL0xpbmVhclNwYWNlRHJpdmVyLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZ2NzcHkvZHJpdmVycy9MaW5lYXJTcGFjZURyaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzIxZGJkLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9nY3NweS9kcml2ZXJzL0xpbmVhclNwYWNlRHJpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDggKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkuZ2NzcHkuZHJpdmVyczsKLQotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lmdjc3B5LkNvbG9yOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZ2NzcHkuTGluZWFyU2NhbjsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lmdjc3B5LlN0cmVhbUNvbnN0YW50czsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lmdjc3B5LlN1YnNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnZtLmdjc3B5LkludFN0cmVhbTsKLWltcG9ydCBvcmcubW10ay52bS5nY3NweS5TaG9ydFN0cmVhbTsKLQotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuTG9nOwotaW1wb3J0IG9yZy5tbXRrLnZtLmdjc3B5LlNlcnZlckludGVycHJldGVyOwotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIEdDc3B5IGRyaXZlciBmb3IgdGhlIE1NVGsgQ29udGlnb3VzU3BhY2UuCi0gKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgc2ltcGxlIGRyaXZlciBmb3IgY29udGlndW91cyBNTVRrIHNwYWNlcwotICogc3VjaCBhcyBDb3B5U3BhY2UgYW5kIEltbW9ydGFsU3BhY2UuCi0gKi8KLUBVbmludGVycnVwdGlibGUgcHVibGljIGNsYXNzIExpbmVhclNwYWNlRHJpdmVyIGV4dGVuZHMgQWJzdHJhY3REcml2ZXIgewotCi0gIC8vIFRoZSBHQ3NweSBzdHJlYW1zCi0gIHByb3RlY3RlZCBJbnRTdHJlYW0gICBzY2FsYXJVc2VkU3BhY2VTdHJlYW07Ci0gIHByb3RlY3RlZCBJbnRTdHJlYW0gICBhcnJheVVzZWRTcGFjZVN0cmVhbTsKLSAgcHJvdGVjdGVkIFNob3J0U3RyZWFtIHNjYWxhck9iamVjdHNTdHJlYW07Ci0gIHByb3RlY3RlZCBTaG9ydFN0cmVhbSBhcnJheU9iamVjdHNTdHJlYW07Ci0gIHByb3RlY3RlZCBTaG9ydFN0cmVhbSBhcnJheVByaW1pdGl2ZVN0cmVhbTsKLSAgcHJvdGVjdGVkIFNob3J0U3RyZWFtIHJvb3RzU3RyZWFtOwotICBwcm90ZWN0ZWQgU2hvcnRTdHJlYW0gcmVmRnJvbUltbW9ydGFsU3RyZWFtOwotCi0gIHByb3RlY3RlZCBTdWJzcGFjZSBzdWJzcGFjZTsgICAgICAgICAgICAgICAvLyBBIHN1YnNwYWNlIGZvciBhbGwgb2YgdGhpcyBzcGFjZQotICBwcm90ZWN0ZWQgaW50IGFsbFRpbGVOdW07ICAgICAgICAgICAgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIHRpbGVzCi0KLSAgLy8gT3ZlcmFsbCBzdGF0aXN0aWNzCi0gIHByb3RlY3RlZCBpbnQgdG90YWxTY2FsYXJPYmplY3RzICAgPSAwOyAgICAvLyB0b3RhbCBudW1iZXIgb2Ygb2JqZWN0cyBhbGxvY2F0ZWQKLSAgcHJvdGVjdGVkIGludCB0b3RhbEFycmF5T2JqZWN0cyAgICA9IDA7Ci0gIHByb3RlY3RlZCBpbnQgdG90YWxQcmltaXRpdmVzICAgICAgPSAwOwotICBwcm90ZWN0ZWQgaW50IHRvdGFsU2NhbGFyVXNlZFNwYWNlID0gMDsgICAgLy8gdG90YWwgc3BhY2UgdXNlZAotICBwcm90ZWN0ZWQgaW50IHRvdGFsQXJyYXlVc2VkU3BhY2UgID0gMDsKLSAgcHJvdGVjdGVkIGludCB0b3RhbFJvb3RzICAgICAgICAgICA9IDA7Ci0gIHByb3RlY3RlZCBpbnQgdG90YWxSZWZGcm9tSW1tb3J0YWwgPSAwOwotCi0gIHByaXZhdGUgZmluYWwgTGluZWFyU2NhbiBzY2FubmVyOyAgICAgICAgICAvLyBBIHNjYW5uZXIgdG8gdHJhY2Ugb2JqZWN0cwotCi0gIC8vIERlYnVnZ2luZwotICBwcm90ZWN0ZWQgQWRkcmVzcyBsYXN0QWRkcmVzcyA9IEFkZHJlc3MuemVybygpOwotICBwcm90ZWN0ZWQgaW50IGxhc3RTaXplID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBkcml2ZXIgZm9yIGEgY29udGlndW91cyBNTVRrIHNwYWNlLgotICAgKgotICAgKiBAcGFyYW0gc2VydmVyIFRoZSBHQ3NweSBTZXJ2ZXJJbnRlcnByZXRlcgotICAgKiBAcGFyYW0gc3BhY2VOYW1lIFRoZSBuYW1lIG9mIHRoaXMgR0NzcHkgc3BhY2UKLSAgICogQHBhcmFtIG1tdGtTcGFjZSBUaGUgTU1UayBzcGFjZQotICAgKiBAcGFyYW0gYmxvY2tTaXplIFRoZSB0aWxlIHNpemUKLSAgICogQHBhcmFtIG1haW5TcGFjZSBJcyB0aGlzIHRoZSBtYWluIHNwYWNlPwotICAgKi8KLSAgcHVibGljIExpbmVhclNwYWNlRHJpdmVyKFNlcnZlckludGVycHJldGVyIHNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzcGFjZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTcGFjZSBtbXRrU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBtYWluU3BhY2UpIHsKLQotICAgIHN1cGVyKHNlcnZlciwgc3BhY2VOYW1lLCBtbXRrU3BhY2UsIGJsb2NrU2l6ZSwgbWFpblNwYWNlKTsKLQotICAgIGlmIChERUJVRykgewotICAgICAgTG9nLndyaXRlKCJMaW5lYXJTcGFjZURyaXZlciBmb3IgIik7IExvZy53cml0ZShzcGFjZU5hbWUpOwotICAgICAgTG9nLndyaXRlKCIsIGJsb2Nrc2l6ZT0iKTsgTG9nLndyaXRlKGJsb2NrU2l6ZSk7Ci0gICAgICBMb2cud3JpdGUoIiwgc3RhcnQ9Iik7IExvZy53cml0ZShtbXRrU3BhY2UuZ2V0U3RhcnQoKSk7Ci0gICAgICBMb2cud3JpdGUoIiwgZXh0ZW50PSIpOyBMb2cud3JpdGUobW10a1NwYWNlLmdldEV4dGVudCgpKTsKLSAgICAgIExvZy53cml0ZSgiLCBtYXhUaWxlTnVtPSIpOyBMb2cud3JpdGVsbihtYXhUaWxlTnVtKTsKLSAgICB9Ci0KLSAgICAvLyBJbml0aWFsaXNlIGEgc3Vic3BhY2UgYW5kIDQgU3RyZWFtcwotICAgIHN1YnNwYWNlID0gY3JlYXRlU3Vic3BhY2UobW10a1NwYWNlKTsKLSAgICBhbGxUaWxlTnVtID0gMDsKLSAgICBzY2FsYXJVc2VkU3BhY2VTdHJlYW0gPSBjcmVhdGVTY2FsYXJVc2VkU3BhY2VTdHJlYW0oKTsKLSAgICBhcnJheVVzZWRTcGFjZVN0cmVhbSAgPSBjcmVhdGVBcnJheVVzZWRTcGFjZVN0cmVhbSgpOwotICAgIHNjYWxhck9iamVjdHNTdHJlYW0gICA9IGNyZWF0ZVNjYWxhck9iamVjdHNTdHJlYW0oKTsKLSAgICBhcnJheVByaW1pdGl2ZVN0cmVhbSAgPSBjcmVhdGVBcnJheVByaW1pdGl2ZVN0cmVhbSgpOwotICAgIGFycmF5T2JqZWN0c1N0cmVhbSAgICA9IGNyZWF0ZUFycmF5T2JqZWN0c1N0cmVhbSgpOwotICAgIHJvb3RzU3RyZWFtICAgICAgICAgICA9IGNyZWF0ZVJvb3RzU3RyZWFtKCk7Ci0gICAgcmVmRnJvbUltbW9ydGFsU3RyZWFtID0gY3JlYXRlUmVmRnJvbUltbW9ydGFsU3RyZWFtKCk7Ci0gICAgc2VydmVyU3BhY2UucmVzaXplKDApOyAvLyB0aGUgY29sbGVjdG9yIG11c3QgY2FsbCByZXNpemUoKSBiZWZvcmUgZ2F0aGVyaW5nIGRhdGEKLQotICAgIC8vIEluaXRpYWxpc2UgdGhlIHN0YXRpc3RpY3MKLSAgICByZXNldERhdGEoKTsKLSAgICBzY2FubmVyID0gbmV3IExpbmVhclNjYW4odGhpcyk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBuYW1lIG9mIHRoaXMgZHJpdmVyIHR5cGUuCi0gICAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhpcyBkcml2ZXIuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlck5hbWUoKSB7IHJldHVybiAiTU1UayBMaW5lYXJTcGFjZURyaXZlciI7IH0KLQotICAvKioKLSAgICogUHJpdmF0ZSBjcmVhdG9yIG1ldGhvZHMgdG8gY3JlYXRlIHRoZSBTdHJlYW1zLgotICAgKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHJpdmF0ZSBJbnRTdHJlYW0gY3JlYXRlU2NhbGFyVXNlZFNwYWNlU3RyZWFtKCkgewotICAgIHJldHVybiBWTS5uZXdHQ3NweUludFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAiU2NhbGFyIFVzZWQgU3BhY2Ugc3RyZWFtIiwgICAgICAgICAgICAvLyBzdHJlYW0gbmFtZQotICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWluLiBkYXRhIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICBibG9ja1NpemUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXguIGRhdGEgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHplcm8gdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgIlNjYWxhcnMgYW5kIHByaW1pdGl2ZSBhcnJheXM6ICIsICAgICAgIC8vIHZhbHVlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgc3VmZml4Ci0gICAgICAgICAgICAgICAgICAgICBTdHJlYW1Db25zdGFudHMuUFJFU0VOVEFUSU9OX1BFUkNFTlQsICAvLyBwcmVzZW50YXRpb24gc3R5bGUKLSAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUNvbnN0YW50cy5QQUlOVF9TVFlMRV9aRVJPLCAgICAgIC8vIHBhaW50IHN0eWxlCi0gICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRleCBvZiBtYXggc3RyZWFtIChvbmx5IG5lZWRlZCBpZiB0aGUgcHJlc2VudGF0aW9uIGlzICpfVkFSKQotICAgICAgICAgICAgICAgICAgICAgQ29sb3IuUmVkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGlsZSBjb2xvdXIKLSAgICAgICAgICAgICAgICAgICAgIHRydWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1bW1hcnkgZW5hYmxlZAotICB9Ci0KLSAgQEludGVycnVwdGlibGUKLSAgcHJpdmF0ZSBJbnRTdHJlYW0gY3JlYXRlQXJyYXlVc2VkU3BhY2VTdHJlYW0oKSB7Ci0gICAgcmV0dXJuIFZNLm5ld0dDc3B5SW50U3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICJBcnJheSBVc2VkIFNwYWNlIHN0cmVhbSIsCi0gICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgYmxvY2tTaXplLAotICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICJSZWZlcmVuY2UgYXJyYXlzOiAiLAotICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIiwKLSAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUNvbnN0YW50cy5QUkVTRU5UQVRJT05fUEVSQ0VOVCwKLSAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUNvbnN0YW50cy5QQUlOVF9TVFlMRV9aRVJPLAotICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgIENvbG9yLkJsdWUsCi0gICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgfQotCi0gIEBJbnRlcnJ1cHRpYmxlCi0gIHByaXZhdGUgU2hvcnRTdHJlYW0gY3JlYXRlU2NhbGFyT2JqZWN0c1N0cmVhbSgpIHsKLSAgICByZXR1cm4gVk0ubmV3R0NzcHlTaG9ydFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAiU2NhbGFyIE9iamVjdHMgc3RyZWFtIiwKLSAgICAgICAgICAgICAgICAgICAgIChzaG9ydCkwLAotICAgICAgICAgICAgICAgICAgICAgLy8gU2F5LCBtYXggdmFsdWUgPSA1MCUgb2YgbWF4IHBvc3NpYmxlCi0gICAgICAgICAgICAgICAgICAgICAoc2hvcnQpKG1heE9iamVjdHNQZXJCbG9jayhibG9ja1NpemUpLzIpLAotICAgICAgICAgICAgICAgICAgICAgKHNob3J0KTAsCi0gICAgICAgICAgICAgICAgICAgICAoc2hvcnQpMCwKLSAgICAgICAgICAgICAgICAgICAgICJTY2FsYXJzOiAiLAotICAgICAgICAgICAgICAgICAgICAgIiBvYmplY3RzIiwKLSAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUNvbnN0YW50cy5QUkVTRU5UQVRJT05fUExVUywKLSAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUNvbnN0YW50cy5QQUlOVF9TVFlMRV9aRVJPLAotICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgIENvbG9yLkdyZWVuLAotICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gIH0KLQotICBASW50ZXJydXB0aWJsZQotICBwcml2YXRlIFNob3J0U3RyZWFtIGNyZWF0ZUFycmF5UHJpbWl0aXZlU3RyZWFtKCkgewotICAgIHJldHVybiBWTS5uZXdHQ3NweVNob3J0U3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICJBcnJheSBQcmltaXRpdmUgc3RyZWFtIiwKLSAgICAgICAgICAgICAgICAgICAgIChzaG9ydCkwLAotICAgICAgICAgICAgICAgICAgICAgLy8gU2F5LCB0eXBpY2FsIHByaW1pdGl2ZSBhcnJheSBzaXplID0gNCAqIHR5cGljYWwgc2NhbGFyIHNpemU/Ci0gICAgICAgICAgICAgICAgICAgICAoc2hvcnQpKG1heE9iamVjdHNQZXJCbG9jayhibG9ja1NpemUpLzgpLAotICAgICAgICAgICAgICAgICAgICAgKHNob3J0KTAsCi0gICAgICAgICAgICAgICAgICAgICAoc2hvcnQpMCwKLSAgICAgICAgICAgICAgICAgICAgICJQcmltaXRpdmUgYXJyYXlzOiAiLAotICAgICAgICAgICAgICAgICAgICAgIiBvYmplY3RzIiwKLSAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUNvbnN0YW50cy5QUkVTRU5UQVRJT05fUExVUywKLSAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUNvbnN0YW50cy5QQUlOVF9TVFlMRV9aRVJPLAotICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgIENvbG9yLlllbGxvdywKLSAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICB9Ci0KLSAgQEludGVycnVwdGlibGUKLSAgcHJpdmF0ZSBTaG9ydFN0cmVhbSBjcmVhdGVBcnJheU9iamVjdHNTdHJlYW0oKSB7Ci0gICAgcmV0dXJuIFZNLm5ld0dDc3B5U2hvcnRTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgIkFycmF5IE9iamVjdHMgc3RyZWFtIiwKLSAgICAgICAgICAgICAgICAgICAgIChzaG9ydCkwLAotICAgICAgICAgICAgICAgICAgICAgLy8gU2F5LCB0eXBpY2FsIHJlZiBhcnJheSBzaXplID0gNCAqIHR5cGljYWwgc2NhbGFyIHNpemU/Ci0gICAgICAgICAgICAgICAgICAgICAoc2hvcnQpKG1heE9iamVjdHNQZXJCbG9jayhibG9ja1NpemUpLzgpLAotICAgICAgICAgICAgICAgICAgICAgKHNob3J0KTAsCi0gICAgICAgICAgICAgICAgICAgICAoc2hvcnQpMCwKLSAgICAgICAgICAgICAgICAgICAgICJSZWZlcmVuY2UgYXJyYXlzOiAiLAotICAgICAgICAgICAgICAgICAgICAgIiBvYmplY3RzIiwKLSAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUNvbnN0YW50cy5QUkVTRU5UQVRJT05fUExVUywKLSAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUNvbnN0YW50cy5QQUlOVF9TVFlMRV9aRVJPLAotICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgIENvbG9yLkN5YW4sCi0gICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgfQotCi0gIEBJbnRlcnJ1cHRpYmxlCi0gIHByaXZhdGUgU2hvcnRTdHJlYW0gY3JlYXRlUm9vdHNTdHJlYW0oKSB7Ci0gICAgcmV0dXJuIFZNLm5ld0dDc3B5U2hvcnRTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgIlJvb3RzIHN0cmVhbSIsCi0gICAgICAgICAgICAgICAgICAgICAoc2hvcnQpMCwKLSAgICAgICAgICAgICAgICAgICAgIC8vIFNheSwgdHlwaWNhbCBzaXplID0gNCAqIHR5cGljYWwgc2NhbGFyIHNpemU/Ci0gICAgICAgICAgICAgICAgICAgICAoc2hvcnQpKG1heE9iamVjdHNQZXJCbG9jayhibG9ja1NpemUpLzgpLAotICAgICAgICAgICAgICAgICAgICAgKHNob3J0KTAsCi0gICAgICAgICAgICAgICAgICAgICAoc2hvcnQpMCwKLSAgICAgICAgICAgICAgICAgICAgICJSb290czogIiwKLSAgICAgICAgICAgICAgICAgICAgICIgb2JqZWN0cyIsCi0gICAgICAgICAgICAgICAgICAgICBTdHJlYW1Db25zdGFudHMuUFJFU0VOVEFUSU9OX1BMVVMsCi0gICAgICAgICAgICAgICAgICAgICBTdHJlYW1Db25zdGFudHMuUEFJTlRfU1RZTEVfWkVSTywKLSAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICBDb2xvci5CbHVlLAotICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gIH0KLQotICBASW50ZXJydXB0aWJsZQotICBwcml2YXRlIFNob3J0U3RyZWFtIGNyZWF0ZVJlZkZyb21JbW1vcnRhbFN0cmVhbSgpIHsKLSAgICByZXR1cm4gVk0ubmV3R0NzcHlTaG9ydFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAiUmVmZXJlbmNlcyBmcm9tIGltbW9ydGFsIHN0cmVhbSIsCi0gICAgICAgICAgICAgICAgICAgICAoc2hvcnQpMCwKLSAgICAgICAgICAgICAgICAgICAgIC8vIFNheSwgdHlwaWNhbCBzaXplID0gNCAqIHR5cGljYWwgc2NhbGFyIHNpemU/Ci0gICAgICAgICAgICAgICAgICAgICAoc2hvcnQpKG1heE9iamVjdHNQZXJCbG9jayhibG9ja1NpemUpLzgpLAotICAgICAgICAgICAgICAgICAgICAgKHNob3J0KTAsCi0gICAgICAgICAgICAgICAgICAgICAoc2hvcnQpMCwKLSAgICAgICAgICAgICAgICAgICAgICJSZWZlcmVuY2VzIGZyb20gaW1tb3J0YWwgc3BhY2U6ICIsCi0gICAgICAgICAgICAgICAgICAgICAiIHJlZmVyZW5jZXMiLAotICAgICAgICAgICAgICAgICAgICAgU3RyZWFtQ29uc3RhbnRzLlBSRVNFTlRBVElPTl9QTFVTLAotICAgICAgICAgICAgICAgICAgICAgU3RyZWFtQ29uc3RhbnRzLlBBSU5UX1NUWUxFX1pFUk8sCi0gICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgQ29sb3IuQmx1ZSwKLSAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlc2V0IHRoZSBzdGF0aXN0aWNzIGZvciBhbGwgdGhlIHN0cmVhbXMsIGluY2x1ZGluZyB0b3RhbHMgdXNlZCBmb3Igc3VtbWFyaWVzCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXNldERhdGEoKSB7Ci0gICAgc3VwZXIucmVzZXREYXRhKCk7Ci0KLSAgICAvLyBSZXNldCBhbGwgdGhlIHN0cmVhbXMKLSAgICBzY2FsYXJVc2VkU3BhY2VTdHJlYW0ucmVzZXREYXRhKCk7Ci0gICAgYXJyYXlVc2VkU3BhY2VTdHJlYW0ucmVzZXREYXRhKCk7Ci0gICAgc2NhbGFyT2JqZWN0c1N0cmVhbS5yZXNldERhdGEoKTsKLSAgICBhcnJheU9iamVjdHNTdHJlYW0ucmVzZXREYXRhKCk7Ci0gICAgYXJyYXlQcmltaXRpdmVTdHJlYW0ucmVzZXREYXRhKCk7Ci0gICAgcmVmRnJvbUltbW9ydGFsU3RyZWFtLnJlc2V0RGF0YSgpOwotCi0gICAgLy8gUmVzZXQgdGhlIHN1bW1hcnkgY291bnRzCi0gICAgdG90YWxTY2FsYXJPYmplY3RzICAgPSAwOwotICAgIHRvdGFsQXJyYXlPYmplY3RzICAgID0gMDsKLSAgICB0b3RhbFByaW1pdGl2ZXMgICAgICA9IDA7Ci0gICAgdG90YWxTY2FsYXJVc2VkU3BhY2UgPSAwOwotICAgIHRvdGFsQXJyYXlVc2VkU3BhY2UgID0gMDsKLSAgICB0b3RhbFJlZkZyb21JbW1vcnRhbCA9IDA7Ci0gIH0KLQotICAvKioKLSAgICogQnVtcFBvaW50ZXIubGluZWFyU2NhbiBuZWVkcyBhIExpbmVhclNjYW4gb2JqZWN0LCB3aGljaCB3ZSBwcm92aWRlIGhlcmUuCi0gICAqIEByZXR1cm4gdGhlIHNjYW5uZXIgZm9yIHRoaXMgZHJpdmVyCi0gICAqLwotICAgcHVibGljIExpbmVhclNjYW4gZ2V0U2Nhbm5lcigpIHsgcmV0dXJuIHNjYW5uZXI7IH0KLQotICAvKioKLSAgICogU2V0IHRoZSBjdXJyZW50IGFkZHJlc3MgcmFuZ2Ugb2YgYSBjb250aWd1b3VzIHNwYWNlCi0gICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2YgdGhlIGNvbnRpZ3VvdXMgc3BhY2UKLSAgICogQHBhcmFtIGVuZCB0aGUgZW5kIG9mIHRoZSBjb250aWd1b3VzIHNwYWNlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSYW5nZShBZGRyZXNzIHN0YXJ0LCBBZGRyZXNzIGVuZCkgewotICAgIGludCBjdXJyZW50ID0gc3Vic3BhY2UuZ2V0QmxvY2tOdW0oKTsKLSAgICBpbnQgcmVxdWlyZWQgPSBjb3VudFRpbGVOdW0oc3RhcnQsIGVuZCwgc3Vic3BhY2UuZ2V0QmxvY2tTaXplKCkpOwotCi0gICAgLy8gUmVzZXQgdGhlIHN1YnNwYWNlCi0gICAgaWYocmVxdWlyZWQgIT0gY3VycmVudCkKLSAgICAgIHN1YnNwYWNlLnJlc2V0KHN0YXJ0LCBlbmQsIDAsIHJlcXVpcmVkKTsKLQotICAgIGlmIChERUJVRykgewotICAgICAgTG9nLndyaXRlKCJcbkNvbnRpZ3VvdXNTcGFjZURyaXZlci5zZXRSYW5nZSBmb3IgY29udGlndW91cyBzcGFjZTogIik7Ci0gICAgICBMb2cud3JpdGUoc3Vic3BhY2UuZ2V0Rmlyc3RJbmRleCgpKTsgTG9nLndyaXRlKCItIiwgc3Vic3BhY2UuZ2V0QmxvY2tOdW0oKSk7Ci0gICAgICBMb2cud3JpdGUoIiAoIiwgc3RhcnQpOyBMb2cud3JpdGUoIi0iLCBlbmQpOyBMb2cud3JpdGUoIikiKTsKLSAgICB9Ci0KLSAgICAvLyBSZXNldCB0aGUgZHJpdmVyCi0gICAgLy8gTm90ZSByZWxlYXNlKCkgb25seSByZXNldHMgYSBDb3B5U3BhY2UncyAgY3Vyc29yIChhbmQgb3B0aW9uYWxseSB6ZXJvZXMKLSAgICAvLyBvciBtcHJvdGVjdHMgdGhlIHBhZ2VzKTsgaXQgZG9lc24ndCBtYWtlIHRoZSBwYWdlcyBhdmFpbGFibGUgdG8gb3RoZXIKLSAgICAvLyBzcGFjZXMuIElmIHBhZ2VzIHdlcmUgdG8gYmUgcmVsZWFzZWQsIGNoYW5nZSB0aGUgdGVzdCBoZXJlIHRvCi0gICAgLy8gICAgIGlmIChhbGxUaWxlTnVtICE9IHJlcXVpcmVkKSB7Ci0gICAgaWYgKGFsbFRpbGVOdW0gPCByZXF1aXJlZCkgewotICAgICAgaWYgKERFQlVHKSB7IExvZy53cml0ZSgiLCByZXNpemUgZnJvbSAiLCBhbGxUaWxlTnVtKTsgTG9nLndyaXRlKCIgdG8gIiwgcmVxdWlyZWQpOyB9Ci0gICAgICBhbGxUaWxlTnVtID0gcmVxdWlyZWQ7Ci0gICAgICBzZXJ2ZXJTcGFjZS5yZXNpemUoYWxsVGlsZU51bSk7Ci0gICAgICBzZXRUaWxlbmFtZXMoc3Vic3BhY2UsIGFsbFRpbGVOdW0pOwotICAgIH0KLSAgICBpZiAoREVCVUcpIExvZy53cml0ZWxuKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBVcGRhdGUgdGhlIHRpbGUgc3RhdGlzdGljcwotICAgKiBAcGFyYW0gb2JqIFRoZSBjdXJyZW50IG9iamVjdAotICAgKi8KLSAgcHVibGljIHZvaWQgIHNjYW4oT2JqZWN0UmVmZXJlbmNlIG9iaikgewotICAgIHNjYW4ob2JqLCB0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBVcGRhdGUgdGhlIHRpbGUgc3RhdGlzdGljcwotICAgKiBAcGFyYW0gb2JqIFRoZSBjdXJyZW50IG9iamVjdAotICAgKiBAcGFyYW0gdG90YWwgV2hldGhlciB0byBhY2N1bXVsYXRlIHRoZSB2YWx1ZXMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNjYW4oT2JqZWN0UmVmZXJlbmNlIG9iaiwgYm9vbGVhbiB0b3RhbCkgewotICAgIGJvb2xlYW4gaXNBcnJheSA9IFZNLm9iamVjdE1vZGVsLmlzQXJyYXkob2JqKTsKLSAgICBpbnQgbGVuZ3RoID0gVk0ub2JqZWN0TW9kZWwuZ2V0Q3VycmVudFNpemUob2JqKTsKLSAgICBBZGRyZXNzIGFkZHIgPSBvYmoudG9BZGRyZXNzKCk7Ci0KLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIHsKLSAgICAgIGlmKGFkZHIuTFQobGFzdEFkZHJlc3MucGx1cyhsYXN0U2l6ZSkpKSB7Ci0gICAgICAgIExvZy53cml0ZSgiXG5Db250aWd1b3VzU3BhY2VEcml2ZXIgZmluZHMgYWRkcmVzc2VzIGdvaW5nIGJhY2t3YXJkczogIik7Ci0gICAgICAgIExvZy53cml0ZSgibGFzdD0iKTsgTG9nLndyaXRlKGxhc3RBZGRyZXNzKTsKLSAgICAgICAgTG9nLndyaXRlKCIgbGFzdCBzaXplPSIpOyBMb2cud3JpdGUobGFzdFNpemUpOwotICAgICAgICBMb2cud3JpdGVsbigiIGN1cnJlbnQ9IiwgYWRkcik7Ci0gICAgICB9Ci0gICAgICBsYXN0QWRkcmVzcyA9IGFkZHI7Ci0gICAgICBsYXN0U2l6ZSA9IGxlbmd0aDsKLSAgICB9Ci0KLSAgICAvLyBVcGRhdGUgdGhlIHN0YXRzCi0gICAgaWYgKHN1YnNwYWNlLmFkZHJlc3NJblJhbmdlKGFkZHIpKSB7Ci0gICAgICBpbnQgaW5kZXggPSBzdWJzcGFjZS5nZXRJbmRleChhZGRyKTsKLSAgICAgIGludCByZW1haW5kZXIgPSBzdWJzcGFjZS5zcGFjZVJlbWFpbmluZyhhZGRyKTsKLSAgICAgIGlmIChpc0FycmF5KSB7Ci0gICAgICAgIGFycmF5T2JqZWN0c1N0cmVhbS5pbmNyZW1lbnQoaW5kZXgsIChzaG9ydCkxKTsKLSAgICAgICAgYXJyYXlVc2VkU3BhY2VTdHJlYW0uZGlzdHJpYnV0ZShpbmRleCwgcmVtYWluZGVyLCBibG9ja1NpemUsIGxlbmd0aCk7Ci0gICAgICAgIGlmICh0b3RhbCkgewotICAgICAgICAgIHRvdGFsQXJyYXlPYmplY3RzKys7Ci0gICAgICAgICAgdG90YWxBcnJheVVzZWRTcGFjZSArPSBsZW5ndGg7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmKCF0aGlzLnNjYW5DaGVja1ByaW1pdGl2ZUFycmF5KG9iaiwgaW5kZXgsIHRvdGFsLCBsZW5ndGgpKSB7Ci0gICAgICAgICAgLy8gcmVhbCBvYmplY3QKLSAgICAgICAgICBzY2FsYXJPYmplY3RzU3RyZWFtLmluY3JlbWVudChpbmRleCwgKHNob3J0KTEpOwotICAgICAgICAgIGlmICh0b3RhbCkgewotICAgICAgICAgICAgdG90YWxTY2FsYXJPYmplY3RzKys7Ci0gICAgICAgICAgICB0b3RhbFNjYWxhclVzZWRTcGFjZSArPSBsZW5ndGg7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNjYWxhclVzZWRTcGFjZVN0cmVhbS5kaXN0cmlidXRlKGluZGV4LCByZW1haW5kZXIsIGJsb2NrU2l6ZSwgbGVuZ3RoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2sgaWYgdGhpcyBPYmplY3QgaXMgYW4gYXJyYXkgb2YgcHJpbWl0aXZlcy48YnI+Ci0gICAqIFBhcnQgb2YgdGhlIHB1YmxpYyBzY2FuKCkgbWV0aG9kLgotICAgKgotICAgKiBAcGFyYW0gb2JqIFRoZSBPYmplY3QgdG8gY2hlY2sKLSAgICogQHBhcmFtIGluZGV4IEluZGV4IG9mIHRoZSB0aWxlCi0gICAqIEBwYXJhbSB0b3RhbCBJbmNyZW1lbnQgc3VtbWFyeQotICAgKiBAcGFyYW0gbGVuZ3RoIEN1cnJlbnQgc2l6ZSBvZiB0aGUgT2JqZWN0LCB3aWxsIGJlIGFkZGVkIHRvIGFycmF5IHNwYWNlIHN1bW1hcnkuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIE9iamVjdCBpcyBhbiBhcnJheSBvZiBwcmltaXRpdmVzLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gc2NhbkNoZWNrUHJpbWl0aXZlQXJyYXkoT2JqZWN0UmVmZXJlbmNlIG9iaiwgaW50IGluZGV4LCBib29sZWFuIHRvdGFsLCBpbnQgbGVuZ3RoKSB7Ci0gICAgaWYoVk0ub2JqZWN0TW9kZWwuaXNQcmltaXRpdmVBcnJheShvYmopKSB7Ci0gICAgICBhcnJheVByaW1pdGl2ZVN0cmVhbS5pbmNyZW1lbnQoaW5kZXgsIChzaG9ydCkxKTsKLSAgICAgIGlmICh0b3RhbCkgewotICAgICAgICB0b3RhbFByaW1pdGl2ZXMrKzsKLSAgICAgICAgdG90YWxTY2FsYXJVc2VkU3BhY2UgKz0gbGVuZ3RoOwotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVHJhbnNtaXQgdGhlIGRhdGEgaWYgdGhpcyBldmVudCBpcyBvZiBpbnRlcmVzdCB0byB0aGUgY2xpZW50LjxwPgotICAgKiBJbXBsZW1lbnRlZCB1c2luZyB0aGUgYWxnb3JpdGhtIHBhdHRlcm4sIHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHBhcnRzIG9mIGl0LgotICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50LCBkZWZpbmVkIGluIHRoZSBQbGFuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmFuc21pdChpbnQgZXZlbnQpIHsKLSAgICBpZiAoIXNlcnZlci5pc0Nvbm5lY3RlZChldmVudCkpCi0gICAgICByZXR1cm47Ci0KLSAgICBpZiAoREVCVUcpIHsKLSAgICAgIExvZy53cml0ZSgiQ09OTkVDVEVEXG4iKTsKLSAgICAgIExvZy53cml0ZShteUNsYXNzKTsKLSAgICAgIExvZy53cml0ZSgiLnNlbmQ6IG51bVRpbGVzPSIsIGFsbFRpbGVOdW0pOwotICAgICAgLy9Mb2cud3JpdGUoIkxpbmVhclNwYWNlRHJpdmVyLnRyYW5zbWl0OiBudW1UaWxlcz0iLCBhbGxUaWxlTnVtKTsKLSAgICAgIExvZy53cml0ZWxuKCIsIGNvbnRyb2wubGVuZ3RoPSIsIGNvbnRyb2wubGVuZ3RoKTsKLSAgICAgIExvZy5mbHVzaCgpOwotICAgIH0KLQotICAgIC8vIFNldHVwIHRoZSBzdW1tYXJpZXMKLSAgICBzZXR1cFN1bW1hcmllcygpOwotCi0gICAgLy8gU2V0dXAgdGhlIGNvbnRyb2wgaW5mbwotICAgIHNldHVwQ29udHJvbEluZm8oKTsKLQotICAgIC8vIFNldHVwIHRoZSBzcGFjZSBpbmZvCi0gICAgT2Zmc2V0IHNpemUgPSBzdWJzcGFjZS5nZXRFbmQoKS5kaWZmKHN1YnNwYWNlLmdldFN0YXJ0KCkpOwotICAgIHNldFNwYWNlSW5mbyhzaXplKTsKLQotICAgIC8vIFNlbmQgdGhlIGFsbCBzdHJlYW1zCi0gICAgc2VuZChldmVudCwgYWxsVGlsZU51bSk7Ci0KLSAgICAvLyBEZWJ1Z2dpbmcKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIHsKLSAgICAgIGxhc3RBZGRyZXNzID0gQWRkcmVzcy56ZXJvKCk7Ci0gICAgICBsYXN0U2l6ZSA9IDA7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNldHVwIHN1bW1hcmllcyBwYXJ0IG9mIHRoZSA8Y29kZT50cmFuc21pdDwvY29kZT4gbWV0aG9kLjxwPgotICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBzZXR1cCBzdW1tYXJpZXMgb2YgYWRkaXRpb25hbCBzdHJlYW1zIGluIHN1YmNsYXNzZXMuCi0gKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0dXBTdW1tYXJpZXMoKSB7Ci0gICAgc2NhbGFyVXNlZFNwYWNlU3RyZWFtLnNldFN1bW1hcnkodG90YWxTY2FsYXJVc2VkU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3BhY2UuZ2V0RW5kKCkuZGlmZihzdWJzcGFjZS5nZXRTdGFydCgpKS50b0ludCgpKTsKLSAgICBhcnJheVVzZWRTcGFjZVN0cmVhbS5zZXRTdW1tYXJ5KHRvdGFsQXJyYXlVc2VkU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzcGFjZS5nZXRFbmQoKS5kaWZmKHN1YnNwYWNlLmdldFN0YXJ0KCkpLnRvSW50KCkpOwotICAgIHNjYWxhck9iamVjdHNTdHJlYW0uc2V0U3VtbWFyeSh0b3RhbFNjYWxhck9iamVjdHMpOwotICAgIGFycmF5T2JqZWN0c1N0cmVhbS5zZXRTdW1tYXJ5KHRvdGFsQXJyYXlPYmplY3RzKTsKLSAgICBhcnJheVByaW1pdGl2ZVN0cmVhbS5zZXRTdW1tYXJ5KHRvdGFsUHJpbWl0aXZlcyk7Ci0gICAgcm9vdHNTdHJlYW0uc2V0U3VtbWFyeSh0b3RhbFJvb3RzKTsKLSAgICByZWZGcm9tSW1tb3J0YWxTdHJlYW0uc2V0U3VtbWFyeSh0b3RhbFJlZkZyb21JbW1vcnRhbCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0dXAgY29udHJvbCBpbmZvIHBhcnQgb2YgdGhlIDxjb2RlPnRyYW5zbWl0PC9jb2RlPiBtZXRob2QuPHA+Ci0gICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNoYW5nZSB0aGUgY29udHJvbHMgZm9yIHlvdXIgb3duIGRyaXZlciBzdWJjbGFzcy4KLSAqLwotICBwcm90ZWN0ZWQgdm9pZCBzZXR1cENvbnRyb2xJbmZvKCkgewotICAgIGludCBudW1CbG9ja3MgPSBzdWJzcGFjZS5nZXRCbG9ja051bSgpOwotICAgIGNvbnRyb2xWYWx1ZXMoQ09OVFJPTF9VU0VELCBzdWJzcGFjZS5nZXRGaXJzdEluZGV4KCksIG51bUJsb2Nrcyk7Ci0gICAgaWYgKERFQlVHKSB7Ci0gICAgICBMb2cud3JpdGUoIkxpbmVhclNwYWNlRHJpdmVyLnRyYW5zbWl0U2V0dXBDb250cm9sSW5mbzogYWxsVGlsZU51bT0iLCBhbGxUaWxlTnVtKTsKLSAgICAgIExvZy53cml0ZWxuKCIsIG51bUJsb2Nrcz0iLCBudW1CbG9ja3MpOwotICAgIH0KLSAgICBpZiAobnVtQmxvY2tzIDwgYWxsVGlsZU51bSkKLSAgICAgIGNvbnRyb2xWYWx1ZXMoQ09OVFJPTF9VTlVTRUQsCi0gICAgICAgICAgICAgICAgICAgIHN1YnNwYWNlLmdldEZpcnN0SW5kZXgoKSArIG51bUJsb2NrcywKLSAgICAgICAgICAgICAgICAgICAgYWxsVGlsZU51bSAtIG51bUJsb2Nrcyk7Ci0gIH0KLQotICAvKioKLSAgICogSGFuZGxlIGEgcm9vdCBhZGRyZXNzCi0gICAqCi0gICAqIEBwYXJhbSBhZGRyIFJvb3QgQWRkcmVzcwotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIEFkZHJlc3MgaXMgaW4gdGhpcyBzdWJzcGFjZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhbmRsZVJvb3QoQWRkcmVzcyBhZGRyKSB7Ci0gICAgaWYoc3Vic3BhY2UuYWRkcmVzc0luUmFuZ2UoYWRkcikpIHsKLSAgICAgIC8vIGluY3JlbWVudCB0aWxlCi0gICAgICBpbnQgaW5kZXggPSBzdWJzcGFjZS5nZXRJbmRleChhZGRyKTsKLSAgICAgIHJvb3RzU3RyZWFtLmluY3JlbWVudChpbmRleCwgKHNob3J0KTEpOwotICAgICAgLy8gaW5jcmVtZW50IHN1bW1hcnkKLSAgICAgIHRoaXMudG90YWxSb290cysrOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVzZXQgdGhlIHJvb3RzIFN0cmVhbQotICAgKiBUaGUgcm9vdHMgU3RyZWFtIGhhcyB0byBiZSByZXNldCBzZXBlcmF0ZWx5IGJlY2F1c2Ugd2UgZG8gbm90Ci0gICAqIGdhdGhlciBkYXRhIGluIHRoZSB1c3VhbCB3YXkgdXNpbmcgPGNvZGU+c2NhbigpPC9jb2RlPi4KLSAqLwotICBwdWJsaWMgdm9pZCByZXNldFJvb3RzU3RyZWFtKCkgewotICAgIHJvb3RzU3RyZWFtLnJlc2V0RGF0YSgpOwotICAgIHRvdGFsUm9vdHMgPSAwOwotICB9Ci0KLSAgLyoqCi0gICAqIEhhbmRsZSBhIGRpcmVjdCByZWZlcmVuY2UgZnJvbSB0aGUgaW1tb3J0YWwgc3BhY2UuCi0gICAqCi0gICAqIEBwYXJhbSBhZGRyIFRoZSBBZGRyZXNzCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gQWRkcmVzcyBpcyBpbiB0aGlzIHN1YnNwYWNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFuZGxlUmVmZXJlbmNlRnJvbUltbW9ydGFsU3BhY2UoQWRkcmVzcyBhZGRyKSB7Ci0gICAgaWYoc3Vic3BhY2UuYWRkcmVzc0luUmFuZ2UoYWRkcikpIHsKLSAgICAgIC8vIGluY3JlbWVudCB0aWxlCi0gICAgICBpbnQgaW5kZXggPSBzdWJzcGFjZS5nZXRJbmRleChhZGRyKTsKLSAgICAgIHJlZkZyb21JbW1vcnRhbFN0cmVhbS5pbmNyZW1lbnQoaW5kZXgsIChzaG9ydCkxKTsKLSAgICAgIC8vIGluY3JlbWVudCBzdW1tYXJ5Ci0gICAgICB0aGlzLnRvdGFsUmVmRnJvbUltbW9ydGFsKys7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvZ2NzcHkvZHJpdmVycy9UcmVhZG1pbGxEcml2ZXIuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9nY3NweS9kcml2ZXJzL1RyZWFkbWlsbERyaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2ZlODFhLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9nY3NweS9kcml2ZXJzL1RyZWFkbWlsbERyaXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5Lmdjc3B5LmRyaXZlcnM7Ci0KLWltcG9ydCBvcmcubW10ay5wb2xpY3kuTGFyZ2VPYmplY3RTcGFjZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lmdjc3B5LkNvbG9yOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZ2NzcHkuU3RyZWFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZ2NzcHkuU3Vic3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsudm0uZ2NzcHkuSW50U3RyZWFtOwotaW1wb3J0IG9yZy5tbXRrLnZtLmdjc3B5LlNob3J0U3RyZWFtOwotaW1wb3J0IG9yZy5tbXRrLnZtLmdjc3B5LlNlcnZlckludGVycHJldGVyOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuQ29udmVyc2lvbnM7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Mb2c7Ci1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBzaW1wbGUgZHJpdmVyIGZvciB0aGUgTU1UayBMYXJnZU9iamVjdFNwYWNlLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlIHB1YmxpYyBjbGFzcyBUcmVhZG1pbGxEcml2ZXIgZXh0ZW5kcyBBYnN0cmFjdERyaXZlciB7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0gIC8vIFRoZSBzdHJlYW1zCi0gIHByb3RlY3RlZCBJbnRTdHJlYW0gICB1c2VkU3BhY2VTdHJlYW07Ci0gIHByb3RlY3RlZCBTaG9ydFN0cmVhbSBvYmplY3RzU3RyZWFtOwotICBwcm90ZWN0ZWQgU2hvcnRTdHJlYW0gcm9vdHNTdHJlYW07Ci0gIHByb3RlY3RlZCBTaG9ydFN0cmVhbSByZWZGcm9tSW1tb3J0YWxTdHJlYW07Ci0KLSAgcHJvdGVjdGVkIFN1YnNwYWNlIHN1YnNwYWNlOyAgICAgICAgICAgIC8vIEEgc2luZ2xlIHN1YnNwYWNlIGZvciB0aGlzIHNwYWNlCi0gIHByb3RlY3RlZCBpbnQgYWxsVGlsZU51bTsgICAgICAgICAgICAgICAvLyB0b3RhbCBudW1iZXIgb2YgdGlsZXMKLQotICAvLyBPdmVyYWxsIHN0YXRpc3RpY3MKLSAgcHJvdGVjdGVkIGludCB0b3RhbE9iamVjdHMgICAgICAgICA9IDA7IC8vIHRvdGFsIG51bWJlciBvZiBvYmplY3RzIGFsbG9jYXRlZAotICBwcm90ZWN0ZWQgaW50IHRvdGFsVXNlZFNwYWNlICAgICAgID0gMDsgLy8gdG90YWwgc3BhY2UgdXNlZAotICBwcm90ZWN0ZWQgaW50IHRvdGFsUm9vdHMgICAgICAgICAgID0gMDsgLy8gdG90YWwgb2Ygcm9vdHMKLSAgcHJvdGVjdGVkIGludCB0b3RhbFJlZkZyb21JbW1vcnRhbCA9IDA7IC8vIHRvdGFsIGRpcmVjdCByZWZlcmVuY2VzIGZyb20gdGhlIGltbW9ydGFsIHNwYWNlCi0gIHByb3RlY3RlZCBBZGRyZXNzIG1heEFkZHI7ICAgICAgICAgICAgICAvLyB0aGUgbGFyZ2VzdCBhZGRyZXNzIHNlZW4KLSAgcHJvdGVjdGVkIGludCB0aHJlc2hvbGQ7Ci0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IGRyaXZlciBmb3IgdGhpcyBjb2xsZWN0b3IKLSAgICoKLSAgICogQHBhcmFtIHNlcnZlciBUaGUgbmFtZSBvZiB0aGUgR0NzcHkgc2VydmVyIHRoYXQgb3ducyB0aGlzIHNwYWNlCi0gICAqIEBwYXJhbSBzcGFjZU5hbWUgVGhlIG5hbWUgb2YgdGhpcyBkcml2ZXIKLSAgICogQHBhcmFtIGxvc3BhY2UgdGhlIGxhcmdlIG9iamVjdCBzcGFjZSBmb3IgdGhpcyBhbGxvY2F0b3IKLSAgICogQHBhcmFtIGJsb2NrU2l6ZSBUaGUgdGlsZSBzaXplCi0gICAqIEBwYXJhbSB0aHJlc2hvbGQgdGhlIHNpemUgdGhyZXNob2xkIG9mIHRoZSBMT1MKLSAgICogQHBhcmFtIG1haW5TcGFjZSBJcyB0aGlzIHRoZSBtYWluIHNwYWNlPwotICAgKi8KLSAgcHVibGljIFRyZWFkbWlsbERyaXZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJJbnRlcnByZXRlciBzZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNwYWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBMYXJnZU9iamVjdFNwYWNlIGxvc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNob2xkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbWFpblNwYWNlKSB7Ci0gICAgLy9UT0RPIGJsb2Nrc2l6ZSBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiB0cmVhZG1pbGwgZ3JhbnVsYXJpdHkKLSAgICBzdXBlcihzZXJ2ZXIsIHNwYWNlTmFtZSwgbG9zcGFjZSwgYmxvY2tTaXplLCBtYWluU3BhY2UpOwotCi0gICAgaWYgKERFQlVHKSB7Ci0gICAgICBMb2cud3JpdGUoIlRyZWFkbWlsbERyaXZlciBmb3IgIik7IExvZy53cml0ZShzcGFjZU5hbWUpOwotICAgICAgTG9nLndyaXRlKCIsIGJsb2Nrc2l6ZT0iKTsgTG9nLndyaXRlKGJsb2NrU2l6ZSk7Ci0gICAgICBMb2cud3JpdGUoIiwgc3RhcnQ9Iik7IExvZy53cml0ZShsb3NwYWNlLmdldFN0YXJ0KCkpOwotICAgICAgTG9nLndyaXRlKCIsIGV4dGVudD0iKTsgTG9nLndyaXRlKGxvc3BhY2UuZ2V0RXh0ZW50KCkpOwotICAgICAgTG9nLndyaXRlKCIsIG1heFRpbGVOdW09Iik7IExvZy53cml0ZWxuKG1heFRpbGVOdW0pOwotICAgIH0KLQotICAgIHRoaXMudGhyZXNob2xkID0gdGhyZXNob2xkOwotCi0gICAgLy8gSW5pdGlhbGlzZSBhIHN1YnNwYWNlIGFuZCAyIFN0cmVhbXMKLSAgICBzdWJzcGFjZSA9IGNyZWF0ZVN1YnNwYWNlKGxvc3BhY2UpOwotICAgIGFsbFRpbGVOdW0gPSAwOwotICAgIG1heEFkZHIgPSBsb3NwYWNlLmdldFN0YXJ0KCk7Ci0gICAgdXNlZFNwYWNlU3RyZWFtICAgICAgID0gY3JlYXRlVXNlZFNwYWNlU3RyZWFtKCk7Ci0gICAgb2JqZWN0c1N0cmVhbSAgICAgICAgID0gY3JlYXRlT2JqZWN0c1N0cmVhbSgpOwotICAgIHJvb3RzU3RyZWFtICAgICAgICAgICA9IGNyZWF0ZVJvb3RzU3RyZWFtKCk7Ci0gICAgcmVmRnJvbUltbW9ydGFsU3RyZWFtID0gY3JlYXRlUmVmRnJvbUltbW9ydGFsU3RyZWFtKCk7Ci0gICAgc2VydmVyU3BhY2UucmVzaXplKDApOyAvLyB0aGUgY29sbGVjdG9yIG11c3QgY2FsbCByZXNpemUoKSBiZWZvcmUgZ2F0aGVyaW5nIGRhdGEKLQotICAgIC8vIEluaXRpYWxpc2UgdGhlIHN0YXRpc3RpY3MKLSAgICByZXNldERhdGEoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhpcyBkcml2ZXIgdHlwZS4KLSAgICogQHJldHVybiBUaGUgbmFtZSwgIk1NVGsgVHJlYWRtaWxsRHJpdmVyIiBmb3IgdGhpcyBkcml2ZXIuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlck5hbWUoKSB7Ci0gICAgcmV0dXJuICJNTVRrIFRyZWFkbWlsbERyaXZlciI7Ci0gIH0KLQotICAvLyBwcml2YXRlIGNyZWF0b3IgbWV0aG9kcyBmb3IgdGhlIHN0cmVhbXMKLSAgQEludGVycnVwdGlibGUKLSAgcHJpdmF0ZSBJbnRTdHJlYW0gY3JlYXRlVXNlZFNwYWNlU3RyZWFtKCkgewotICAgIHJldHVybiBWTS5uZXdHQ3NweUludFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAiVXNlZCBTcGFjZSBzdHJlYW0iLCAgICAgICAgICAgICAgICAgICAgLy8gc3RyZWFtIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtaW4uIGRhdGEgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2l6ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXguIGRhdGEgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB6ZXJvIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAiU3BhY2UgdXNlZDogIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIHN1ZmZpeAotICAgICAgICAgICAgICAgICAgICAgU3RyZWFtQ29uc3RhbnRzLlBSRVNFTlRBVElPTl9QRVJDRU5ULCAgIC8vIHByZXNlbnRhdGlvbiBzdHlsZQotICAgICAgICAgICAgICAgICAgICAgU3RyZWFtQ29uc3RhbnRzLlBBSU5UX1NUWUxFX1pFUk8sICAgICAgIC8vIHBhaW50IHN0eWxlCi0gICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kZXggb2YgdGhlIG1heCBzdHJlYW0gKG9ubHkgbmVlZGVkIGlmIHByZXNlbnRhdGlvbiBpcyAqX1ZBUikKLSAgICAgICAgICAgICAgICAgICAgIENvbG9yLlJlZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aWxlIGNvbG91cgotICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1bW1hcnkgZW5hYmxlZAotICB9Ci0KLSAgQEludGVycnVwdGlibGUKLSAgcHJpdmF0ZSBTaG9ydFN0cmVhbSBjcmVhdGVPYmplY3RzU3RyZWFtKCkgewotICAgIHJldHVybiBWTS5uZXdHQ3NweVNob3J0U3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICJPYmplY3RzIHN0cmVhbSIsCi0gICAgICAgICAgICAgICAgICAgICAoc2hvcnQpMCwKLSAgICAgICAgICAgICAgICAgICAgIChzaG9ydCkoYmxvY2tTaXplL3RocmVzaG9sZCksCi0gICAgICAgICAgICAgICAgICAgICAoc2hvcnQpMCwKLSAgICAgICAgICAgICAgICAgICAgIChzaG9ydCkwLAotICAgICAgICAgICAgICAgICAgICAgIk5vLiBvZiBvYmplY3RzID0gIiwKLSAgICAgICAgICAgICAgICAgICAgICIgb2JqZWN0cyIsCi0gICAgICAgICAgICAgICAgICAgICBTdHJlYW1Db25zdGFudHMuUFJFU0VOVEFUSU9OX1BMVVMsCi0gICAgICAgICAgICAgICAgICAgICBTdHJlYW1Db25zdGFudHMuUEFJTlRfU1RZTEVfWkVSTywKLSAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICBDb2xvci5HcmVlbiwKLSAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICB9Ci0KLSAgQEludGVycnVwdGlibGUKLSAgcHJpdmF0ZSBTaG9ydFN0cmVhbSBjcmVhdGVSb290c1N0cmVhbSgpIHsKLSAgICByZXR1cm4gVk0ubmV3R0NzcHlTaG9ydFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAiUm9vdHMgc3RyZWFtIiwKLSAgICAgICAgICAgICAgICAgICAgIChzaG9ydCkwLAotICAgICAgICAgICAgICAgICAgICAgLy8gU2F5LCB0eXBpY2FsIHNpemUgPSA0ICogdHlwaWNhbCBzY2FsYXIgc2l6ZT8KLSAgICAgICAgICAgICAgICAgICAgIChzaG9ydCkobWF4T2JqZWN0c1BlckJsb2NrKGJsb2NrU2l6ZSkvOCksCi0gICAgICAgICAgICAgICAgICAgICAoc2hvcnQpMCwKLSAgICAgICAgICAgICAgICAgICAgIChzaG9ydCkwLAotICAgICAgICAgICAgICAgICAgICAgIlJvb3RzOiAiLAotICAgICAgICAgICAgICAgICAgICAgIiBvYmplY3RzIiwKLSAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUNvbnN0YW50cy5QUkVTRU5UQVRJT05fUExVUywKLSAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUNvbnN0YW50cy5QQUlOVF9TVFlMRV9aRVJPLAotICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgIENvbG9yLkJsdWUsCi0gICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgfQotCi0gIEBJbnRlcnJ1cHRpYmxlCi0gIHByaXZhdGUgU2hvcnRTdHJlYW0gY3JlYXRlUmVmRnJvbUltbW9ydGFsU3RyZWFtKCkgewotICAgIHJldHVybiBWTS5uZXdHQ3NweVNob3J0U3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICJSZWZlcmVuY2VzIGZyb20gSW1tb3J0YWwgc3RyZWFtIiwKLSAgICAgICAgICAgICAgICAgICAgIChzaG9ydCkwLAotICAgICAgICAgICAgICAgICAgICAgLy8gU2F5LCB0eXBpY2FsIHNpemUgPSA0ICogdHlwaWNhbCBzY2FsYXIgc2l6ZT8KLSAgICAgICAgICAgICAgICAgICAgIChzaG9ydCkobWF4T2JqZWN0c1BlckJsb2NrKGJsb2NrU2l6ZSkvOCksCi0gICAgICAgICAgICAgICAgICAgICAoc2hvcnQpMCwKLSAgICAgICAgICAgICAgICAgICAgIChzaG9ydCkwLAotICAgICAgICAgICAgICAgICAgICAgIlJlZmVyZW5jZXMgZnJvbSBpbW1vcnRhbCBzcGFjZTogIiwKLSAgICAgICAgICAgICAgICAgICAgICIgcmVmZXJlbmNlcyIsCi0gICAgICAgICAgICAgICAgICAgICBTdHJlYW1Db25zdGFudHMuUFJFU0VOVEFUSU9OX1BMVVMsCi0gICAgICAgICAgICAgICAgICAgICBTdHJlYW1Db25zdGFudHMuUEFJTlRfU1RZTEVfWkVSTywKLSAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICBDb2xvci5CbHVlLAotICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmVzZXQgdGhlIHRpbGUgc3RhdHMgZm9yIGFsbCBzdHJlYW1zLCBpbmNsdWRpbmcgdmFsdWVzIHVzZWQgZm9yIHN1bW1hcmllcwotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzZXREYXRhKCkgewotICAgIHN1cGVyLnJlc2V0RGF0YSgpOwotCi0gICAgLy8gUmVzZXQgYWxsIHRoZSBzdHJlYW1zCi0gICAgdXNlZFNwYWNlU3RyZWFtLnJlc2V0RGF0YSgpOwotICAgIG9iamVjdHNTdHJlYW0ucmVzZXREYXRhKCk7Ci0gICAgcmVmRnJvbUltbW9ydGFsU3RyZWFtLnJlc2V0RGF0YSgpOwotCi0gICAgLy8gUmVzZXQgdGhlIHN1bW1hcnkgY291bnRzCi0gICAgdG90YWxVc2VkU3BhY2UgPSAwOwotICAgIHRvdGFsT2JqZWN0cyA9IDA7Ci0gICAgdG90YWxSZWZGcm9tSW1tb3J0YWwgPSAwOwotICB9Ci0KLSAgLyoqCi0gICAqIFVwZGF0ZSB0aGUgdGlsZSBzdGF0aXN0aWNzCi0gICAqIEluIHRoaXMgY2FzZSwgd2UgYXJlIGFjY291bnRpbmcgZm9yIHN1cGVyLXBhZ2Ugb2JqZWN0cywgcmF0aGVyIHRoYW4KLSAgICogc2ltcGx5IGZvciB0aGUgb2JqZWN0cyB0aGV5IGNvbnRhaW4uCi0gICAqCi0gICAqIEBwYXJhbSBhZGRyIFRoZSBhZGRyZXNzIG9mIHRoZSBzdXBlcnBhZ2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNjYW4oQWRkcmVzcyBhZGRyKSB7Ci0KLSAgICBpbnQgaW5kZXggPSBzdWJzcGFjZS5nZXRJbmRleChhZGRyKTsKLSAgICBpbnQgbGVuZ3RoID0gKChMYXJnZU9iamVjdFNwYWNlKW1tdGtTcGFjZSkuZ2V0U2l6ZShhZGRyKS50b0ludCgpOwotCi0gICAgaWYgKERFQlVHKSB7Ci0gICAgICBMb2cud3JpdGUoIlRyZWFkbWlsbERyaXZlcjogc3VwZXI9IiwgYWRkcik7Ci0gICAgICBMb2cud3JpdGUoIiwgaW5kZXg9IiwgaW5kZXgpOwotICAgICAgTG9nLndyaXRlKCIsIHBhZ2VzPSIsIGxlbmd0aCk7Ci0gICAgICBMb2cud3JpdGUoIiwgYnl0ZXM9IiwgQ29udmVyc2lvbnMucGFnZXNUb0J5dGVzKGxlbmd0aCkudG9JbnQoKSk7Ci0gICAgICBMb2cud3JpdGVsbigiLCBtYXg9IiwgdXNlZFNwYWNlU3RyZWFtLmdldE1heFZhbHVlKCkpOwotICAgIH0KLQotICAgIHRvdGFsT2JqZWN0cysrOwotICAgIHRvdGFsVXNlZFNwYWNlICs9IGxlbmd0aDsKLSAgICBvYmplY3RzU3RyZWFtLmluY3JlbWVudChpbmRleCwgKHNob3J0KTEpOwotICAgIGludCByZW1haW5kZXIgPSBzdWJzcGFjZS5zcGFjZVJlbWFpbmluZyhhZGRyKTsKLSAgICB1c2VkU3BhY2VTdHJlYW0uZGlzdHJpYnV0ZShpbmRleCwgcmVtYWluZGVyLCBibG9ja1NpemUsIGxlbmd0aCk7Ci0KLSAgICBBZGRyZXNzIHRtcCA9IGFkZHIucGx1cyhsZW5ndGgpOwotICAgIGlmICh0bXAuR1QobWF4QWRkcikpIG1heEFkZHIgPSB0bXA7Ci0gIH0KLQotICAvKioKLSAgICogVHJhbnNtaXQgdGhlIGRhdGEgaWYgdGhpcyBldmVudCBpcyBvZiBpbnRlcmVzdCB0byB0aGUgY2xpZW50Ci0gICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQsIGVpdGhlciBCRUZPUkVfQ09MTEVDVElPTiwgU0VNSVNQQUNFX0NPUElFRAotICAgKiBvciBBRlRFUl9DT0xMRUNUSU9OCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmFuc21pdChpbnQgZXZlbnQpIHsKLSAgICBpZiAoIWlzQ29ubmVjdGVkKGV2ZW50KSkKLSAgICAgIHJldHVybjsKLQotICAgIC8vIEF0IHRoaXMgcG9pbnQsIHdlJ3ZlIGZpbGxlZCB0aGUgdGlsZXMgd2l0aCBkYXRhLAotICAgIC8vIGhvd2V2ZXIsIHdlIGRvbid0IGtub3cgdGhlIHNpemUgb2YgdGhlIHNwYWNlCi0gICAgLy8gQ2FsY3VsYXRlIHRoZSBoaWdoZXN0IGluZGV4ZWQgdGlsZSB1c2VkIHNvIGZhciwgYW5kIHVwZGF0ZSB0aGUgc3Vic3BhY2UKLSAgICBBZGRyZXNzIHN0YXJ0ID0gc3Vic3BhY2UuZ2V0U3RhcnQoKTsKLSAgICBpbnQgcmVxdWlyZWQgPSBjb3VudFRpbGVOdW0oc3RhcnQsIG1heEFkZHIsIGJsb2NrU2l6ZSk7Ci0gICAgaW50IGN1cnJlbnQgPSBzdWJzcGFjZS5nZXRCbG9ja051bSgpOwotICAgIGlmIChyZXF1aXJlZCA+IGN1cnJlbnQgfHwgbWF4QWRkciAhPSBzdWJzcGFjZS5nZXRFbmQoKSkgewotICAgICAgc3Vic3BhY2UucmVzZXQoc3RhcnQsIG1heEFkZHIsIDAsIHJlcXVpcmVkKTsKLSAgICAgIGFsbFRpbGVOdW0gPSByZXF1aXJlZDsKLSAgICAgIHNlcnZlclNwYWNlLnJlc2l6ZShhbGxUaWxlTnVtKTsKLSAgICAgIHNldFRpbGVuYW1lcyhzdWJzcGFjZSwgYWxsVGlsZU51bSk7Ci0gICAgfQotCi0gICAgLy8gU2V0IHRoZSBzdW1tYXJpZXMKLSAgICBzZXR1cFN1bW1hcmllcygpOwotCi0gICAgLy8gc2V0IHRoZSBjb250cm9sIGluZm86IGFsbCBvZiBzcGFjZSBpcyBVU0VECi0gICAgY29udHJvbFZhbHVlcyhDT05UUk9MX1VTRUQsCi0gICAgICAgICAgICAgICAgICBzdWJzcGFjZS5nZXRGaXJzdEluZGV4KCksIHN1YnNwYWNlLmdldEJsb2NrTnVtKCkpOwotCi0gICAgLy8gc2VuZCB0aGUgc3BhY2UgaW5mbwotICAgIE9mZnNldCBzaXplID0gc3Vic3BhY2UuZ2V0RW5kKCkuZGlmZihzdWJzcGFjZS5nZXRTdGFydCgpKTsKLSAgICBzZXRTcGFjZUluZm8oc2l6ZSk7Ci0KLSAgICAvLyBTZW5kIHRoZSBzdHJlYW1zCi0gICAgc2VuZChldmVudCwgYWxsVGlsZU51bSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0dXAgc3VtbWFyaWVzIHBhcnQgb2YgdGhlIDxjb2RlPnRyYW5zbWl0PC9jb2RlPiBtZXRob2QuPHA+Ci0gICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHNldHVwIHN1bW1hcmllcyBvZiBhZGRpdGlvbmFsIHN0cmVhbXMgaW4gc3ViY2xhc3Nlcy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNldHVwU3VtbWFyaWVzKCkgewotICAgIHVzZWRTcGFjZVN0cmVhbS5zZXRTdW1tYXJ5KHRvdGFsVXNlZFNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNwYWNlLmdldEVuZCgpLmRpZmYoc3Vic3BhY2UuZ2V0U3RhcnQoKSkudG9JbnQoKSk7Ci0gICAgb2JqZWN0c1N0cmVhbS5zZXRTdW1tYXJ5KHRvdGFsT2JqZWN0cyk7Ci0gICAgcm9vdHNTdHJlYW0uc2V0U3VtbWFyeSh0b3RhbFJvb3RzKTsKLSAgICByZWZGcm9tSW1tb3J0YWxTdHJlYW0uc2V0U3VtbWFyeSh0b3RhbFJlZkZyb21JbW1vcnRhbCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBIYW5kbGUgYSByb290IGFkZHJlc3MKLSAgICoKLSAgICogQHBhcmFtIGFkZHIgUm9vdCBBZGRyZXNzCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gQWRkcmVzcyBpcyBpbiB0aGlzIHN1YnNwYWNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFuZGxlUm9vdChBZGRyZXNzIGFkZHIpIHsKLSAgICBpZihzdWJzcGFjZS5hZGRyZXNzSW5SYW5nZShhZGRyKSkgewotICAgICAgLy8gaW5jcmVtZW50IHRpbGUKLSAgICAgIGludCBpbmRleCA9IHN1YnNwYWNlLmdldEluZGV4KGFkZHIpOwotICAgICAgcm9vdHNTdHJlYW0uaW5jcmVtZW50KGluZGV4LCAoc2hvcnQpMSk7Ci0gICAgICAvLyBpbmNyZW1lbnQgc3VtbWFyeQotICAgICAgdGhpcy50b3RhbFJvb3RzKys7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXNldCB0aGUgcm9vdHMgU3RyZWFtLiA8YnI+Ci0gICAqIFRoZSByb290cyBTdHJlYW0gaGFzIHRvIGJlIHJlc2V0IHNlcGVyYXRlbHkgYmVjYXVzZSB3ZSBkbyBub3QKLSAgICogZ2F0aGVyIGRhdGEgaW4gdGhlIHVzdWFsIHdheSB1c2luZyA8Y29kZT5zY2FuKCk8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzZXRSb290c1N0cmVhbSgpIHsKLSAgICByb290c1N0cmVhbS5yZXNldERhdGEoKTsKLSAgICB0b3RhbFJvb3RzID0gMDsKLSAgfQotCi0gIC8qKgotICAgKiBIYW5kbGUgYSBkaXJlY3QgcmVmZXJlbmNlIGZyb20gdGhlIGltbW9ydGFsIHNwYWNlLgotICAgKgotICAgKiBAcGFyYW0gYWRkciBUaGUgQWRkcmVzcwotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIEFkZHJlc3MgaXMgaW4gdGhpcyBzdWJzcGFjZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhbmRsZVJlZmVyZW5jZUZyb21JbW1vcnRhbFNwYWNlKEFkZHJlc3MgYWRkcikgewotICAgIGlmKHN1YnNwYWNlLmFkZHJlc3NJblJhbmdlKGFkZHIpKSB7Ci0gICAgICAvLyBpbmNyZW1lbnQgdGlsZQotICAgICAgaW50IGluZGV4ID0gc3Vic3BhY2UuZ2V0SW5kZXgoYWRkcik7Ci0gICAgICByZWZGcm9tSW1tb3J0YWxTdHJlYW0uaW5jcmVtZW50KGluZGV4LCAoc2hvcnQpMSk7Ci0gICAgICAvLyBpbmNyZW1lbnQgc3VtbWFyeQotICAgICAgdGhpcy50b3RhbFJlZkZyb21JbW1vcnRhbCsrOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9oZWFwL0ZyZWVMaXN0UGFnZVJlc291cmNlLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvaGVhcC9GcmVlTGlzdFBhZ2VSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmVkMTRjLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9oZWFwL0ZyZWVMaXN0UGFnZVJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODIgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkuaGVhcDsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uUGxhbjsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5tbXRrLnBvbGljeS5TcGFjZS5QQUdFU19JTl9DSFVOSzsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmFsbG9jLkVtYmVkZGVkTWV0YURhdGE7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Db252ZXJzaW9uczsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkdlbmVyaWNGcmVlTGlzdDsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkNvbnN0YW50czsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIG1hbmFnZXMgdGhlIGFsbG9jYXRpb24gb2YgcGFnZXMgZm9yIGEgc3BhY2UuICBXaGVuIGEKLSAqIHBhZ2UgaXMgcmVxdWVzdGVkIGJ5IHRoZSBzcGFjZSBib3RoIGEgcGFnZSBidWRnZXQgYW5kIHRoZSB1c2Ugb2YKLSAqIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSBhcmUgY2hlY2tlZC4gIElmIHRoZSByZXF1ZXN0IGZvciBzcGFjZSBjYW4ndAotICogYmUgc2F0aXNmaWVkIChmb3IgZWl0aGVyIHJlYXNvbikgYSBHQyBtYXkgYmUgdHJpZ2dlcmVkLjxwPgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgZmluYWwgY2xhc3MgRnJlZUxpc3RQYWdlUmVzb3VyY2UgZXh0ZW5kcyBQYWdlUmVzb3VyY2UgaW1wbGVtZW50cyBDb25zdGFudHMgewotCi0gIHByaXZhdGUgZmluYWwgR2VuZXJpY0ZyZWVMaXN0IGZyZWVMaXN0OwotICBwcml2YXRlIGludCBoaWdoV2F0ZXJNYXJrID0gMDsKLSAgcHJpdmF0ZSBmaW5hbCBpbnQgbWV0YURhdGFQYWdlc1BlclJlZ2lvbjsKLSAgcHJpdmF0ZSBpbnQgcGFnZXNDdXJyZW50bHlPbkZyZWVMaXN0ID0gMDsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICoKLSAgICogQ29udGlndW91cyBmcmVlIGxpc3QgcmVzb3VyY2UuIFRoZSBhZGRyZXNzIHJhbmdlIGlzIHByZS1kZWZpbmVkIGF0Ci0gICAqIGluaXRpYWxpemF0aW9uIHRpbWUgYW5kIGlzIGltbXV0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhZ2VCdWRnZXQgVGhlIGJ1ZGdldCBvZiBwYWdlcyBhdmFpbGFibGUgdG8gdGhpcyBtZW1vcnkKLSAgICogbWFuYWdlciBiZWZvcmUgaXQgbXVzdCBwb2xsIHRoZSBjb2xsZWN0b3IuCi0gICAqIEBwYXJhbSBzcGFjZSBUaGUgc3BhY2UgdG8gd2hpY2ggdGhpcyByZXNvdXJjZSBpcyBhdHRhY2hlZAotICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSBhZGRyZXNzIHJhbmdlIGFsbG9jYXRlZCB0byB0aGlzIHJlc291cmNlCi0gICAqIEBwYXJhbSBieXRlcyBUaGUgc2l6ZSBvZiB0aGUgYWRkcmVzcyByYWdlIGFsbG9jYXRlZCB0byB0aGlzIHJlc291cmNlCi0gICAqLwotICBwdWJsaWMgRnJlZUxpc3RQYWdlUmVzb3VyY2UoaW50IHBhZ2VCdWRnZXQsIFNwYWNlIHNwYWNlLCBBZGRyZXNzIHN0YXJ0LAotICAgICAgRXh0ZW50IGJ5dGVzKSB7Ci0gICAgc3VwZXIocGFnZUJ1ZGdldCwgc3BhY2UsIHN0YXJ0KTsKLSAgICBpbnQgcGFnZXMgPSBDb252ZXJzaW9ucy5ieXRlc1RvUGFnZXMoYnl0ZXMpOwotICAgIGZyZWVMaXN0ID0gbmV3IEdlbmVyaWNGcmVlTGlzdChwYWdlcyk7Ci0gICAgcGFnZXNDdXJyZW50bHlPbkZyZWVMaXN0ID0gcGFnZXM7Ci0gICAgdGhpcy5tZXRhRGF0YVBhZ2VzUGVyUmVnaW9uID0gMDsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKgotICAgKiBDb250aWd1b3VzIGZyZWUgbGlzdCByZXNvdXJjZS4gVGhlIGFkZHJlc3MgcmFuZ2UgaXMgcHJlLWRlZmluZWQgYXQKLSAgICogaW5pdGlhbGl6YXRpb24gdGltZSBhbmQgaXMgaW1tdXRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFnZUJ1ZGdldCBUaGUgYnVkZ2V0IG9mIHBhZ2VzIGF2YWlsYWJsZSB0byB0aGlzIG1lbW9yeQotICAgKiBtYW5hZ2VyIGJlZm9yZSBpdCBtdXN0IHBvbGwgdGhlIGNvbGxlY3Rvci4KLSAgICogQHBhcmFtIHNwYWNlIFRoZSBzcGFjZSB0byB3aGljaCB0aGlzIHJlc291cmNlIGlzIGF0dGFjaGVkCi0gICAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIGFkZHJlc3MgcmFuZ2UgYWxsb2NhdGVkIHRvIHRoaXMgcmVzb3VyY2UKLSAgICogQHBhcmFtIGJ5dGVzIFRoZSBzaXplIG9mIHRoZSBhZGRyZXNzIHJhZ2UgYWxsb2NhdGVkIHRvIHRoaXMgcmVzb3VyY2UKLSAgICogQHBhcmFtIG1ldGFEYXRhUGFnZXNQZXJSZWdpb24gVGhlIG51bWJlciBvZiBwYWdlcyBvZiBtZXRhIGRhdGEKLSAgICogdGhhdCBhcmUgZW1iZWRkZWQgaW4gZWFjaCByZWdpb24uCi0gICAqLwotICBwdWJsaWMgRnJlZUxpc3RQYWdlUmVzb3VyY2UoaW50IHBhZ2VCdWRnZXQsIFNwYWNlIHNwYWNlLCBBZGRyZXNzIHN0YXJ0LAotICAgICAgRXh0ZW50IGJ5dGVzLCBpbnQgbWV0YURhdGFQYWdlc1BlclJlZ2lvbikgewotICAgIHN1cGVyKHBhZ2VCdWRnZXQsIHNwYWNlLCBzdGFydCk7Ci0gICAgdGhpcy5tZXRhRGF0YVBhZ2VzUGVyUmVnaW9uID0gbWV0YURhdGFQYWdlc1BlclJlZ2lvbjsKLSAgICBpbnQgcGFnZXMgPSBDb252ZXJzaW9ucy5ieXRlc1RvUGFnZXMoYnl0ZXMpOwotICAgIGZyZWVMaXN0ID0gbmV3IEdlbmVyaWNGcmVlTGlzdChwYWdlcywgRW1iZWRkZWRNZXRhRGF0YS5QQUdFU19JTl9SRUdJT04pOwotICAgIHBhZ2VzQ3VycmVudGx5T25GcmVlTGlzdCA9IHBhZ2VzOwotICAgIHJlc2VydmVNZXRhRGF0YShzcGFjZS5nZXRFeHRlbnQoKSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICoKLSAgICogRGlzY29udGlndW91cyBtb25vdG9uZSByZXNvdXJjZS4gVGhlIGFkZHJlc3MgcmFuZ2UgaXMgPGk+bm90PC9pPgotICAgKiBwcmUtZGVmaW5lZCBhdCBpbml0aWFsaXphdGlvbiB0aW1lIGFuZCBpcyBkeW5hbWljYWxseSBkZWZpbmVkIHRvCi0gICAqIGJlIHNvbWUgc2V0IG9mIHBhZ2VzLCBhY2NvcmRpbmcgdG8gZGVtYW5kIGFuZCBhdmFpbGFiaWxpdHkuCi0gICAqCi0gICAqIEBwYXJhbSBwYWdlQnVkZ2V0IFRoZSBidWRnZXQgb2YgcGFnZXMgYXZhaWxhYmxlIHRvIHRoaXMgbWVtb3J5Ci0gICAqIG1hbmFnZXIgYmVmb3JlIGl0IG11c3QgcG9sbCB0aGUgY29sbGVjdG9yLgotICAgKiBAcGFyYW0gc3BhY2UgVGhlIHNwYWNlIHRvIHdoaWNoIHRoaXMgcmVzb3VyY2UgaXMgYXR0YWNoZWQKLSAgICovCi0gIHB1YmxpYyBGcmVlTGlzdFBhZ2VSZXNvdXJjZShpbnQgcGFnZUJ1ZGdldCwgU3BhY2Ugc3BhY2UsIGludCBtZXRhRGF0YVBhZ2VzUGVyUmVnaW9uKSB7Ci0gICAgc3VwZXIocGFnZUJ1ZGdldCwgc3BhY2UpOwotICAgIHRoaXMubWV0YURhdGFQYWdlc1BlclJlZ2lvbiA9IG1ldGFEYXRhUGFnZXNQZXJSZWdpb247Ci0gICAgdGhpcy5zdGFydCA9IFNwYWNlLkFWQUlMQUJMRV9TVEFSVDsKLSAgICBmcmVlTGlzdCA9IG5ldyBHZW5lcmljRnJlZUxpc3QoTWFwLmdsb2JhbFBhZ2VNYXAsIE1hcC5nZXREaXNjb250aWdGcmVlTGlzdFBST3JkaW5hbCh0aGlzKSk7Ci0gICAgcGFnZXNDdXJyZW50bHlPbkZyZWVMaXN0ID0gMDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBhdmFpbGFibGUgcGh5c2ljYWwgcGFnZXMgZm9yIHRoaXMgcmVzb3VyY2UuCi0gICAqIFRoaXMgaW5jbHVkZXMgYWxsIHBhZ2VzIGN1cnJlbnRseSBmcmVlIG9uIHRoZSByZXNvdXJjZSdzIGZyZWUgbGlzdC4KLSAgICogSWYgdGhlIHJlc291cmNlIGlzIHVzaW5nIGRpc2NvbnRpZ3VvdXMgc3BhY2UgaXQgYWxzbyBpbmNsdWRlcwotICAgKiBjdXJyZW50bHkgdW5hc3NpZ25lZCBkaXNjb250aWd1b3VzIHNwYWNlLjxwPgotICAgKgotICAgKiBOb3RlOiBUaGlzIGp1c3QgY29uc2lkZXJzIHBoeXNpY2FsIHBhZ2VzIChpZSB2aXJ0dWFsIG1lbW9yeSBwYWdlcwotICAgKiBhbGxvY2F0ZWQgZm9yIHVzZSBieSB0aGlzIHJlc291cmNlKS4gVGhpcyBjYWxjdWxhdGlvbiBpcyBvcnRob2dvbmFsCi0gICAqIHRvIGFuZCBkb2VzIG5vdCBjb25zaWRlciBhbnkgcmVzdHJpY3Rpb25zIG9uIHRoZSBudW1iZXIgb2YgcGFnZXMKLSAgICogdGhpcyByZXNvdXJjZSBtYXkgYWN0dWFsbHkgdXNlIGF0IGFueSB0aW1lIChpZSB0aGUgbnVtYmVyIG9mCi0gICAqIGNvbW1pdHRlZCBhbmQgcmVzZXJ2ZWQgcGFnZXMpLjxwPgotICAgKgotICAgKiBOb3RlOiBUaGUgY2FsY3VsYXRpb24gaXMgbWFkZSBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGFsbCBzcGFjZSB0aGF0Ci0gICAqIGNvdWxkIGJlIGFzc2lnbmVkIHRvIHRoaXMgcmVzb3VyY2Ugd291bGQgYmUgYXNzaWduZWQgdG8gdGhpcyByZXNvdXJjZQotICAgKiAoaWUgdGhlIHVudXNlZCBkaXNjb250aWd1b3VzIHNwYWNlIGNvdWxkIGp1c3QgYXMgbGlrZWx5IGJlIGFzc2lnbmVkCi0gICAqIHRvIGFub3RoZXIgY29tcGV0aW5nIHJlc291cmNlKS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBwaHlzaWNhbCBwYWdlcyBmb3IgdGhpcyByZXNvdXJjZS4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IGdldEF2YWlsYWJsZVBoeXNpY2FsUGFnZXMoKSB7Ci0gICAgaW50IHJ0biA9IHBhZ2VzQ3VycmVudGx5T25GcmVlTGlzdDsKLSAgICBpZiAoIWNvbnRpZ3VvdXMpIHsKLSAgICAgIGludCBjaHVua3MgPSBNYXAuZ2V0QXZhaWxhYmxlRGlzY29udGlndW91c0NodW5rcygpLU1hcC5nZXRDaHVua0NvbnN1bWVyQ291bnQoKTsKLSAgICAgIGlmIChjaHVua3MgPCAwKSBjaHVua3MgPSAwOwotICAgICAgcnRuICs9IGNodW5rcyooU3BhY2UuUEFHRVNfSU5fQ0hVTkstbWV0YURhdGFQYWdlc1BlclJlZ2lvbik7Ci0gICAgfQotICAgIHJldHVybiBydG47Ci0gIH0KLQotICAvKioKLSAgICogQWxsb2NhdGUgPGNvZGU+cGFnZXM8L2NvZGU+IHBhZ2VzIGZyb20gdGhpcyByZXNvdXJjZS48cD4KLSAgICoKLSAgICogSWYgdGhlIHJlcXVlc3QgY2FuIGJlIHNhdGlzZmllZCwgdGhlbiBlbnN1cmUgdGhlIHBhZ2VzIGFyZQotICAgKiBtbXBhcHBlZCBhbmQgemVyb2VkIGJlZm9yZSByZXR1cm5pbmcgdGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mCi0gICAqIHRoZSByZWdpb24uICBJZiB0aGUgcmVxdWVzdCBjYW5ub3QgYmUgc2F0aXNmaWVkLCByZXR1cm4gemVyby4KLSAgICoKLSAgICogQHBhcmFtIHBhZ2VzIFRoZSBudW1iZXIgb2YgcGFnZXMgdG8gYmUgYWxsb2NhdGVkLgotICAgKiBAcmV0dXJuIFRoZSBzdGFydCBvZiB0aGUgZmlyc3QgcGFnZSBpZiBzdWNjZXNzZnVsLCB6ZXJvIG9uCi0gICAqIGZhaWx1cmUuCi0gICAqLwotICBASW5saW5lCi0gIHByb3RlY3RlZCBBZGRyZXNzIGFsbG9jUGFnZXMoaW50IHBhZ2VzKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQobWV0YURhdGFQYWdlc1BlclJlZ2lvbiA9PSAwIHx8IHBhZ2VzIDw9IFBBR0VTX0lOX0NIVU5LIC0gbWV0YURhdGFQYWdlc1BlclJlZ2lvbik7Ci0gICAgbG9jaygpOwotICAgIGJvb2xlYW4gbmV3Q2h1bmsgPSBmYWxzZTsKLSAgICBpbnQgcGFnZU9mZnNldCA9IGZyZWVMaXN0LmFsbG9jKHBhZ2VzKTsKLSAgICBpZiAocGFnZU9mZnNldCA9PSBHZW5lcmljRnJlZUxpc3QuRkFJTFVSRSAmJiAhY29udGlndW91cykgewotICAgICAgcGFnZU9mZnNldCA9IGFsbG9jYXRlQ29udGlndW91c0NodW5rcyhwYWdlcyk7Ci0gICAgICBuZXdDaHVuayA9IHRydWU7Ci0gICAgfQotICAgIGlmIChwYWdlT2Zmc2V0ID09IC0xKSB7Ci0gICAgICB1bmxvY2soKTsKLSAgICAgIHJldHVybiBBZGRyZXNzLnplcm8oKTsKLSAgICB9IGVsc2UgewotICAgICAgcGFnZXNDdXJyZW50bHlPbkZyZWVMaXN0IC09IHBhZ2VzOwotICAgICAgaWYgKHBhZ2VPZmZzZXQgPiBoaWdoV2F0ZXJNYXJrKSB7Ci0gICAgICAgIGlmIChoaWdoV2F0ZXJNYXJrID09IDAgfHwgKHBhZ2VPZmZzZXQgXiBoaWdoV2F0ZXJNYXJrKSA+IEVtYmVkZGVkTWV0YURhdGEuUEFHRVNfSU5fUkVHSU9OKSB7Ci0gICAgICAgICAgaW50IHJlZ2lvbnMgPSAxICsgKChwYWdlT2Zmc2V0IC0gaGlnaFdhdGVyTWFyaykgPj4gRW1iZWRkZWRNZXRhRGF0YS5MT0dfUEFHRVNfSU5fUkVHSU9OKTsKLSAgICAgICAgICBpbnQgbWV0YXBhZ2VzID0gcmVnaW9ucyAqIG1ldGFEYXRhUGFnZXNQZXJSZWdpb247Ci0gICAgICAgICAgcmVzZXJ2ZWQgKz0gbWV0YXBhZ2VzOwotICAgICAgICAgIGNvbW1pdHRlZCArPSBtZXRhcGFnZXM7Ci0gICAgICAgICAgbmV3Q2h1bmsgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGhpZ2hXYXRlck1hcmsgPSBwYWdlT2Zmc2V0OwotICAgICAgfQotICAgICAgQWRkcmVzcyBydG4gPSBzdGFydC5wbHVzKENvbnZlcnNpb25zLnBhZ2VzVG9CeXRlcyhwYWdlT2Zmc2V0KSk7Ci0gICAgICBFeHRlbnQgYnl0ZXMgPSBDb252ZXJzaW9ucy5wYWdlc1RvQnl0ZXMocGFnZXMpOwotICAgICAgY29tbWl0UGFnZXMocGFnZXMsIHBhZ2VzKTsKLSAgICAgIHNwYWNlLmdyb3dTcGFjZShydG4sIGJ5dGVzLCBuZXdDaHVuayk7Ci0gICAgICB1bmxvY2soKTsKLSAgICAgIE1tYXBwZXIuZW5zdXJlTWFwcGVkKHJ0biwgcGFnZXMpOwotICAgICAgVk0ubWVtb3J5Lnplcm8ocnRuLCBieXRlcyk7Ci0gICAgICBWTS5ldmVudHMudHJhY2VQYWdlQWNxdWlyZWQoc3BhY2UsIHJ0biwgcGFnZXMpOwotICAgICAgcmV0dXJuIHJ0bjsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVsZWFzZSBhIGdyb3VwIG9mIHBhZ2VzLCBhc3NvY2lhdGVkIHdpdGggdGhpcyBwYWdlIHJlc291cmNlLAotICAgKiB0aGF0IHdlcmUgYWxsb2NhdGVkIHRvZ2V0aGVyLCBvcHRpb25hbGx5IHplcm9pbmcgb24gcmVsZWFzZSBhbmQKLSAgICogb3B0aW9uYWxseSBtZW1vcnkgcHJvdGVjdGluZyBvbiByZWxlYXNlLgotICAgKgotICAgKiBAcGFyYW0gZmlyc3QgVGhlIGZpcnN0IHBhZ2UgaW4gdGhlIGdyb3VwIG9mIHBhZ2VzIHRoYXQgd2VyZQotICAgKiBhbGxvY2F0ZWQgdG9nZXRoZXIuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyB2b2lkIHJlbGVhc2VQYWdlcyhBZGRyZXNzIGZpcnN0KSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKQotICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KENvbnZlcnNpb25zLmlzUGFnZUFsaWduZWQoZmlyc3QpKTsKLQotICAgIGludCBwYWdlT2Zmc2V0ID0gQ29udmVyc2lvbnMuYnl0ZXNUb1BhZ2VzKGZpcnN0LmRpZmYoc3RhcnQpKTsKLQotICAgIGludCBwYWdlcyA9IGZyZWVMaXN0LnNpemUocGFnZU9mZnNldCk7Ci0gICAgaWYgKFpFUk9fT05fUkVMRUFTRSkKLSAgICAgIFZNLm1lbW9yeS56ZXJvKGZpcnN0LCBDb252ZXJzaW9ucy5wYWdlc1RvQnl0ZXMocGFnZXMpKTsKLSAgICAvKiBDYW4ndCB1c2UgcHJvdGVjdCBoZXJlIGJlY2F1c2Ugb2YgdGhlIGNodW5rIHNpemVzIGludm9sdmVkIQotICAgIGlmIChwcm90ZWN0T25SZWxlYXNlLmdldFZhbHVlKCkpCi0gICAgICBMYXp5TW1hcHBlci5wcm90ZWN0KGZpcnN0LCBwYWdlcyk7Ci0gICAgICovCi0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQocGFnZXMgPD0gY29tbWl0dGVkKTsKLQotICAgIGxvY2soKTsKLSAgICByZXNlcnZlZCAtPSBwYWdlczsKLSAgICBjb21taXR0ZWQgLT0gcGFnZXM7Ci0gICAgaW50IGZyZWVkID0gZnJlZUxpc3QuZnJlZShwYWdlT2Zmc2V0LCB0cnVlKTsKLSAgICBwYWdlc0N1cnJlbnRseU9uRnJlZUxpc3QgKz0gcGFnZXM7Ci0KLSAgICBpZiAoIWNvbnRpZ3VvdXMpIC8vIG9ubHkgZGlzY29udGlndW91cyBzcGFjZXMgdXNlIGNodW5rcwotICAgICAgcmVsZWFzZUZyZWVDaHVua3MoZmlyc3QsIGZyZWVkKTsKLQotICAgIHVubG9jaygpOwotCi0gICAgVk0uZXZlbnRzLnRyYWNlUGFnZVJlbGVhc2VkKHNwYWNlLCBmaXJzdCwgcGFnZXMpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSByZWxlYXNlIG9mIGEgcGFnZSBtYXkgaGF2ZSBmcmVlZCB1cCBhbiBlbnRpcmUgY2h1bmsgb3IKLSAgICogc2V0IG9mIGNodW5rcy4gIFdlIG5lZWQgdG8gY2hlY2sgd2hldGhlciBhbnkgY2h1bmtzIGNhbiBiZQotICAgKiBmcmVlZCwgYW5kIGlmIHNvLCBmcmVlIHRoZW0uCi0gICAqCi0gICAqIEBwYXJhbSBmcmVlZFBhZ2UgVGhlIGFkZHJlc3Mgb2YgdGhlIHBhZ2UgdGhhdCB3YXMganVzdCBmcmVlZC4KLSAgICogQHBhcmFtIHBhZ2VzRnJlZWQgVGhlIG51bWJlciBvZiBwYWdlcyBtYWRlIGF2YWlsYWJsZSB3aGVuIHRoZSBwYWdlIHdhcyBmcmVlZC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCByZWxlYXNlRnJlZUNodW5rcyhBZGRyZXNzIGZyZWVkUGFnZSwgaW50IHBhZ2VzRnJlZWQpIHsKLSAgICBpbnQgcGFnZU9mZnNldCA9IENvbnZlcnNpb25zLmJ5dGVzVG9QYWdlcyhmcmVlZFBhZ2UuZGlmZihzdGFydCkpOwotCi0gICAgaWYgKG1ldGFEYXRhUGFnZXNQZXJSZWdpb24gPiAwKSB7ICAgICAgIC8vIGNhbiBvbmx5IGJlIGEgc2luZ2xlIGNodW5rCi0gICAgICBpZiAocGFnZXNGcmVlZCA9PSAoUEFHRVNfSU5fQ0hVTksgLSBtZXRhRGF0YVBhZ2VzUGVyUmVnaW9uKSkgewotICAgICAgICBmcmVlQ29udGlndW91c0NodW5rKFNwYWNlLmNodW5rQWxpZ24oZnJlZWRQYWdlLCB0cnVlKSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heSBiZSBtdWx0aXBsZSBjaHVua3MKLSAgICAgIGlmIChwYWdlc0ZyZWVkICUgUEFHRVNfSU5fQ0hVTksgPT0gMCkgeyAgICAvLyBuZWNlc3NhcnksIGJ1dCBub3Qgc3VmZmljaWVudCBjb25kaXRpb24KLSAgICAgICAgLyogZ3JvdyBhIHJlZ2lvbiBvZiBjaHVua3MsIHN0YXJ0aW5nIHdpdGggdGhlIGNodW5rIGNvbnRhaW5pbmcgdGhlIGZyZWVkIHBhZ2UgKi8KLSAgICAgICAgaW50IHJlZ2lvblN0YXJ0ID0gcGFnZU9mZnNldCAmIH4oUEFHRVNfSU5fQ0hVTksgLSAxKTsKLSAgICAgICAgaW50IG5leHRSZWdpb25TdGFydCA9IHJlZ2lvblN0YXJ0ICsgUEFHRVNfSU5fQ0hVTks7Ci0gICAgICAgIC8qIG5vdyB0cnkgdG8gZ3JvdyAoZW5kIHBvaW50IHBhZ2VzIGFyZSBtYXJrZWQgYXMgbm9uLWNvYWxlc2NpbmcpICovCi0gICAgICAgIHdoaWxlIChyZWdpb25TdGFydCA+PSAwICYmIGZyZWVMaXN0LmlzQ29hbGVzY2FibGUocmVnaW9uU3RhcnQpKQotICAgICAgICAgIHJlZ2lvblN0YXJ0IC09IFBBR0VTX0lOX0NIVU5LOwotICAgICAgICB3aGlsZSAobmV4dFJlZ2lvblN0YXJ0IDwgR2VuZXJpY0ZyZWVMaXN0Lk1BWF9VTklUUyAmJiBmcmVlTGlzdC5pc0NvYWxlc2NhYmxlKG5leHRSZWdpb25TdGFydCkpCi0gICAgICAgICAgbmV4dFJlZ2lvblN0YXJ0ICs9IFBBR0VTX0lOX0NIVU5LOwotICAgICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQocmVnaW9uU3RhcnQgPj0gMCAmJiBuZXh0UmVnaW9uU3RhcnQgPCBHZW5lcmljRnJlZUxpc3QuTUFYX1VOSVRTKTsKLSAgICAgICAgaWYgKHBhZ2VzRnJlZWQgPT0gbmV4dFJlZ2lvblN0YXJ0IC0gcmVnaW9uU3RhcnQpIHsKLSAgICAgICAgICBmcmVlQ29udGlndW91c0NodW5rKHN0YXJ0LnBsdXMoQ29udmVyc2lvbnMucGFnZXNUb0J5dGVzKHJlZ2lvblN0YXJ0KSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFsbG9jYXRlIHN1ZmZpY2llbnQgY29udGlndW91cyBjaHVua3Mgd2l0aGluIGEgZGlzY29udGlndW91cyByZWdpb24gdG8KLSAgICogc2F0aXNmeSB0aGUgcGVuZGluZyByZXF1ZXN0LiAgTm90ZSB0aGF0IHRoaXMgaXMgcHVyZWx5IGFib3V0IGFkZHJlc3Mgc3BhY2UKLSAgICogYWxsb2NhdGlvbiB3aXRoaW4gYSBkaXNjb250aWd1b3VzIHJlZ2lvbi4gIFRoaXMgbWV0aG9kIGRvZXMgbm90IHJlc2VydmUKLSAgICogaW5kaXZpZHVhbCBwYWdlcywgaXQgbWVyZWx5IGFzc2lnbnMgYSBzdWl0YWJseSBsYXJnZSByZWdpb24gb2YgdmlydHVhbAotICAgKiBtZW1vcnkgZnJvbSB3aXRoaW4gdGhlIGRpc2NvbnRpZ3VvdXMgcmVnaW9uIGZvciB1c2UgYnkgYSBwYXJ0aWN1bGFyIHNwYWNlLgotICAgKgotICAgKiBAcGFyYW0gcGFnZXMgVGhlIG51bWJlciBvZiBwYWdlcyBjdXJyZW50bHkgYmVpbmcgcmVxdWVzdGVkCi0gICAqIEByZXR1cm4gQSBjaHVuayBudW1iZXIgb3IgR2VuZXJpY0ZyZWVsaXN0LkZBSUxVUkUKLSAgICovCi0gIHByaXZhdGUgaW50IGFsbG9jYXRlQ29udGlndW91c0NodW5rcyhpbnQgcGFnZXMpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChtZXRhRGF0YVBhZ2VzUGVyUmVnaW9uID09IDAgfHwgcGFnZXMgPD0gUEFHRVNfSU5fQ0hVTksgLSBtZXRhRGF0YVBhZ2VzUGVyUmVnaW9uKTsKLSAgICBpbnQgcnRuID0gR2VuZXJpY0ZyZWVMaXN0LkZBSUxVUkU7Ci0gICAgaW50IHJlcXVpcmVkQ2h1bmtzID0gU3BhY2UucmVxdWlyZWRDaHVua3MocGFnZXMpOwotICAgIEFkZHJlc3MgcmVnaW9uID0gc3BhY2UuZ3Jvd0Rpc2NvbnRpZ3VvdXNTcGFjZShyZXF1aXJlZENodW5rcyk7Ci0gICAgaWYgKCFyZWdpb24uaXNaZXJvKCkpIHsKLSAgICAgIGludCByZWdpb25TdGFydCA9IENvbnZlcnNpb25zLmJ5dGVzVG9QYWdlcyhyZWdpb24uZGlmZihzdGFydCkpOwotICAgICAgaW50IHJlZ2lvbkVuZCA9IHJlZ2lvblN0YXJ0ICsgKHJlcXVpcmVkQ2h1bmtzKlNwYWNlLlBBR0VTX0lOX0NIVU5LKSAtIDE7Ci0gICAgICBmcmVlTGlzdC5zZXRVbmNvYWxlc2NhYmxlKHJlZ2lvblN0YXJ0KTsKLSAgICAgIGZyZWVMaXN0LnNldFVuY29hbGVzY2FibGUocmVnaW9uRW5kICsgMSk7Ci0gICAgICBmb3IgKGludCBwID0gcmVnaW9uU3RhcnQ7IHAgPCByZWdpb25FbmQ7IHAgKz0gU3BhY2UuUEFHRVNfSU5fQ0hVTkspIHsKLSAgICAgICAgaW50IGxpYmVyYXRlZDsKLSAgICAgICAgaWYgKHAgIT0gcmVnaW9uU3RhcnQpCi0gICAgICAgICAgZnJlZUxpc3QuY2xlYXJVbmNvYWxlc2NhYmxlKHApOwotICAgICAgICBsaWJlcmF0ZWQgPSBmcmVlTGlzdC5mcmVlKHAsIHRydWUpOyAvLyBhZGQgY2h1bmsgdG8gb3VyIGZyZWUgbGlzdAotICAgICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChsaWJlcmF0ZWQgPT0gU3BhY2UuUEFHRVNfSU5fQ0hVTksgKyAocCAtIHJlZ2lvblN0YXJ0KSk7Ci0gICAgICAgIGlmIChtZXRhRGF0YVBhZ2VzUGVyUmVnaW9uID4gMSkKLSAgICAgICAgICBmcmVlTGlzdC5hbGxvYyhtZXRhRGF0YVBhZ2VzUGVyUmVnaW9uLCBwKTsgLy8gY2FydmUgb3V0IHNwYWNlIGZvciBtZXRhZGF0YQotICAgICAgICBwYWdlc0N1cnJlbnRseU9uRnJlZUxpc3QgKz0gU3BhY2UuUEFHRVNfSU5fQ0hVTksgLSBtZXRhRGF0YVBhZ2VzUGVyUmVnaW9uOwotICAgICAgfQotICAgICAgcnRuID0gZnJlZUxpc3QuYWxsb2MocGFnZXMpOyAvLyByZS1kbyB0aGUgcmVxdWVzdCB3aGljaCB0cmlnZ2VyZWQgdGhpcyBjYWxsCi0gICAgfQotICAgIHJldHVybiBydG47Ci0gIH0KLQotICAvKioKLSAgICogUmVsZWFzZSBhIHNpbmdsZSBjaHVuayBmcm9tIGEgZGlzY29udGlndW91cyByZWdpb24uICBBbGwgdGhpcyBkb2VzIGlzCi0gICAqIHJlbGVhc2UgYSBjaHVuayBmcm9tIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMKLSAgICogZGlzY29udGlndW91cyBzcGFjZS4KLSAgICoKLSAgICogQHBhcmFtIGNodW5rIFRoZSBjaHVuayB0byBiZSBmcmVlZAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGZyZWVDb250aWd1b3VzQ2h1bmsoQWRkcmVzcyBjaHVuaykgewotICAgIGludCBudW1DaHVua3MgPSBNYXAuZ2V0Q29udGlndW91c1JlZ2lvbkNodW5rcyhjaHVuayk7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQobnVtQ2h1bmtzID09IDEgfHwgbWV0YURhdGFQYWdlc1BlclJlZ2lvbiA9PSAwKTsKLQotICAgIC8qIG5haWwgZG93biBhbGwgcGFnZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjaHVuaywgc28gaXQgaXMgbm8gbG9uZ2VyIG9uIG91ciBmcmVlIGxpc3QgKi8KLSAgICBpbnQgY2h1bmtTdGFydCA9IENvbnZlcnNpb25zLmJ5dGVzVG9QYWdlcyhjaHVuay5kaWZmKHN0YXJ0KSk7Ci0gICAgaW50IGNodW5rRW5kID0gY2h1bmtTdGFydCArIChudW1DaHVua3MqU3BhY2UuUEFHRVNfSU5fQ0hVTkspOwotICAgIHdoaWxlIChjaHVua1N0YXJ0IDwgY2h1bmtFbmQpIHsKLSAgICAgIGZyZWVMaXN0LnNldFVuY29hbGVzY2FibGUoY2h1bmtTdGFydCk7Ci0gICAgICBpZiAobWV0YURhdGFQYWdlc1BlclJlZ2lvbiA+IDApCi0gICAgICAgIGZyZWVMaXN0LmZyZWUoY2h1bmtTdGFydCk7ICAvLyBmaXJzdCBmcmVlIGFueSBtZXRhZGF0YSBwYWdlcwotICAgICAgaW50IHRtcCA9IGZyZWVMaXN0LmFsbG9jKFNwYWNlLlBBR0VTX0lOX0NIVU5LLCBjaHVua1N0YXJ0KTsgLy8gdGhlbiBhbGxvYyB0aGUgZW50aXJlIGNodW5rCi0gICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCh0bXAgPT0gY2h1bmtTdGFydCk7Ci0gICAgICBjaHVua1N0YXJ0ICs9IFNwYWNlLlBBR0VTX0lOX0NIVU5LOwotICAgICAgcGFnZXNDdXJyZW50bHlPbkZyZWVMaXN0IC09IChTcGFjZS5QQUdFU19JTl9DSFVOSyAtIG1ldGFEYXRhUGFnZXNQZXJSZWdpb24pOwotICAgIH0KLSAgICAvKiBub3cgcmV0dXJuIHRoZSBhZGRyZXNzIHNwYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2h1bmsgZm9yIGdsb2JhbCByZXVzZSAqLwotICAgIHNwYWNlLnJlbGVhc2VEaXNjb250aWd1b3VzQ2h1bmtzKGNodW5rKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXNlcnZlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSBmb3IgbWV0YS1kYXRhLgotICAgKgotICAgKiBAcGFyYW0gZXh0ZW50IFRoZSBzaXplIG9mIHRoaXMgc3BhY2UKLSAgICovCi0gIHByaXZhdGUgdm9pZCByZXNlcnZlTWV0YURhdGEoRXh0ZW50IGV4dGVudCkgewotICAgIGhpZ2hXYXRlck1hcmsgPSAwOwotICAgIGlmIChtZXRhRGF0YVBhZ2VzUGVyUmVnaW9uID4gMCkgewotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoc3RhcnQudG9Xb3JkKCkucnNobChFbWJlZGRlZE1ldGFEYXRhLkxPR19CWVRFU19JTl9SRUdJT04pLmxzaChFbWJlZGRlZE1ldGFEYXRhLkxPR19CWVRFU19JTl9SRUdJT04pLnRvQWRkcmVzcygpLkVRKHN0YXJ0KSk7Ci0gICAgICBFeHRlbnQgc2l6ZSA9IGV4dGVudC50b1dvcmQoKS5yc2hsKEVtYmVkZGVkTWV0YURhdGEuTE9HX0JZVEVTX0lOX1JFR0lPTikubHNoKEVtYmVkZGVkTWV0YURhdGEuTE9HX0JZVEVTX0lOX1JFR0lPTikudG9FeHRlbnQoKTsKLSAgICAgIEFkZHJlc3MgY3Vyc29yID0gc3RhcnQucGx1cyhzaXplKTsKLSAgICAgIHdoaWxlIChjdXJzb3IuR1Qoc3RhcnQpKSB7Ci0gICAgICAgIGN1cnNvciA9IGN1cnNvci5taW51cyhFbWJlZGRlZE1ldGFEYXRhLkJZVEVTX0lOX1JFR0lPTik7Ci0gICAgICAgIGludCB1bml0ID0gY3Vyc29yLmRpZmYoc3RhcnQpLnRvV29yZCgpLnJzaGwoTE9HX0JZVEVTX0lOX1BBR0UpLnRvSW50KCk7Ci0gICAgICAgIGludCB0bXAgPSBmcmVlTGlzdC5hbGxvYyhtZXRhRGF0YVBhZ2VzUGVyUmVnaW9uLCB1bml0KTsKLSAgICAgICAgcGFnZXNDdXJyZW50bHlPbkZyZWVMaXN0IC09IG1ldGFEYXRhUGFnZXNQZXJSZWdpb247Ci0gICAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KHRtcCA9PSB1bml0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQWRqdXN0IGEgcGFnZSByZXF1ZXN0IHRvIGluY2x1ZGUgbWV0YWRhdGEgcmVxdWlyZW1lbnRzLCBpZiBhbnkuICBJbiB0aGUKLSAgICogY2FzZSBvZiBhIGZyZWUtbGlzdCBhbGxvY2F0b3IsIG1ldGEtZGF0YSBpcyBwcmUtYWxsb2NhdGVkLCBzbyBzaW1wbHkKLSAgICogcmV0dXJuIHRoZSB1bi1hZGp1c3RlZCByZXF1ZXN0IHNpemUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWdlcyBUaGUgc2l6ZSBvZiB0aGUgcGVuZGluZyBhbGxvY2F0aW9uIGluIHBhZ2VzCi0gICAqIEByZXR1cm4gVGhlICh1bmFkanVzdGVkKSByZXF1ZXN0IHNpemUsIHNpbmNlIG1ldGFkYXRhIGlzIHByZS1hbGxvY2F0ZWQKLSAgICovCi0gIHB1YmxpYyBpbnQgYWRqdXN0Rm9yTWV0YURhdGEoaW50IHBhZ2VzKSB7IHJldHVybiBwYWdlczsgfQotCi0gIHB1YmxpYyBBZGRyZXNzIGdldEhpZ2hXYXRlcigpIHsKLSAgICByZXR1cm4gc3RhcnQucGx1cyhFeHRlbnQuZnJvbUludFNpZ25FeHRlbmQoaGlnaFdhdGVyTWFyazw8TE9HX0JZVEVTX0lOX1BBR0UpKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIHN1cGVyIHBhZ2UKLSAgICoKLSAgICogQHBhcmFtIGZpcnN0IHRoZSBBZGRyZXNzIG9mIHRoZSBmaXJzdCB3b3JkIGluIHRoZSBzdXBlcnBhZ2UKLSAgICogQHJldHVybiB0aGUgc2l6ZSBpbiBieXRlcwotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgRXh0ZW50IGdldFNpemUoQWRkcmVzcyBmaXJzdCkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykKLSAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChDb252ZXJzaW9ucy5pc1BhZ2VBbGlnbmVkKGZpcnN0KSk7Ci0KLSAgICBpbnQgcGFnZU9mZnNldCA9IENvbnZlcnNpb25zLmJ5dGVzVG9QYWdlcyhmaXJzdC5kaWZmKHN0YXJ0KSk7Ci0gICAgaW50IHBhZ2VzID0gZnJlZUxpc3Quc2l6ZShwYWdlT2Zmc2V0KTsKLSAgICByZXR1cm4gQ29udmVyc2lvbnMucGFnZXNUb0J5dGVzKHBhZ2VzKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXNpemUgdGhlIGZyZWUgbGlzdCBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXNvdXJjZSBhbmQgbmFpbCBkb3duCi0gICAqIGl0cyBzdGFydCBhZGRyZXNzLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gcmUtc2V0IHRoZSBmcmVlIGxpc3QKLSAgICogb25jZSB0aGUgZ2xvYmFsIGZyZWUgbGlzdCAod2hpY2ggaXQgc2hhcmVzKSBpcyBmaW5hbGl6ZWQgYW5kIHRoZQotICAgKiBiYXNlIGFkZHJlc3MgaXMgZmluYWxpemVkLiAgVGhlcmUncyBhIGNpcmN1bGFyIGRlcGVuZGVuY3ksIHNvIHdlCi0gICAqIG5lZWQgYW4gZXhwbGljaXQgY2FsbC1iYWNrIHRvIHJlc2V0IHRoZSBmcmVlIGxpc3Qgc2l6ZSBhbmQgc3RhcnQKLSAgICoKLSAgICogQHBhcmFtIHN0YXJ0QWRkcmVzcyBUaGUgZmluYWwgc3RhcnQgYWRkcmVzcyBmb3IgdGhlIGRpc2NvbnRpZ3VvdXMgc3BhY2UuCi0gICAqLwotICBASW50ZXJydXB0aWJsZQotICBwdWJsaWMgdm9pZCByZXNpemVGcmVlTGlzdChBZGRyZXNzIHN0YXJ0QWRkcmVzcykgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KCFjb250aWd1b3VzICYmICFQbGFuLmlzSW5pdGlhbGl6ZWQoKSk7Ci0gICAgc3RhcnQgPSBzdGFydEFkZHJlc3M7Ci0gICAgZnJlZUxpc3QucmVzaXplRnJlZUxpc3QoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2hlYXAvSGVhcEdyb3d0aE1hbmFnZXIuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9oZWFwL0hlYXBHcm93dGhNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMTVhMTEuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2hlYXAvSGVhcEdyb3d0aE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5oZWFwOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5QbGFuOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuKjsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnMuT3B0aW9uczsKLQotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIGdyb3dpbmcgYW5kIHNocmlua2luZyB0aGUKLSAqIGhlYXAgc2l6ZSBieSBvYnNlcnZpbmcgaGVhcCB1dGlsaXphdGlvbiBhbmQgR0MgbG9hZC4KLSAqLwotQFVuaW50ZXJydXB0aWJsZSBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSGVhcEdyb3d0aE1hbmFnZXIgaW1wbGVtZW50cyBDb25zdGFudHMgewotCi0gIC8qKgotICAgKiBUaGUgaW5pdGlhbCBoZWFwIHNpemUgKC1YbXMpIGluIGJ5dGVzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBFeHRlbnQgaW5pdGlhbEhlYXBTaXplOwotCi0gIC8qKgotICAgKiBUaGUgbWF4aW11bSBoZWFwIHNpemUgKC1YbXMpIGluIGJ5dGVzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBFeHRlbnQgbWF4SGVhcFNpemU7Ci0KLSAgLyoqCi0gICAqIFRoZSBjdXJyZW50IGhlYXAgc2l6ZSBpbiBieXRlcwotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgRXh0ZW50IGN1cnJlbnRIZWFwU2l6ZTsKLQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZVtdW10gZ2VuZXJhdGlvbmFsRnVuY3Rpb24gPSAgICB7ezAuMDAsIDAuMDAsIDAuMTAsIDAuMzAsIDAuNjAsIDAuODAsIDEuMDB9LAotICAgICAgeyAwLjAwLCAwLjkwLCAwLjkwLCAwLjk1LCAxLjAwLCAxLjAwLCAxLjAwIH0sCi0gICAgICB7IDAuMDEsIDAuOTAsIDAuOTAsIDAuOTUsIDEuMDAsIDEuMDAsIDEuMDAgfSwKLSAgICAgIHsgMC4wMiwgMC45NSwgMC45NSwgMS4wMCwgMS4wMCwgMS4wMCwgMS4wMCB9LAotICAgICAgeyAwLjA3LCAxLjAwLCAxLjAwLCAxLjEwLCAxLjE1LCAxLjIwLCAxLjIwIH0sCi0gICAgICB7IDAuMTUsIDEuMDAsIDEuMDAsIDEuMjAsIDEuMjUsIDEuMzUsIDEuMzAgfSwKLSAgICAgIHsgMC40MCwgMS4wMCwgMS4wMCwgMS4yNSwgMS4zMCwgMS41MCwgMS41MCB9LAotICAgICAgeyAxLjAwLCAxLjAwLCAxLjAwLCAxLjI1LCAxLjMwLCAxLjUwLCAxLjUwIH0gfTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGVbXVtdIG5vbmdlbmVyYXRpb25hbEZ1bmN0aW9uID0ge3swLjAwLCAwLjAwLCAwLjEwLCAwLjMwLCAwLjYwLCAwLjgwLCAxLjAwfSwKLSAgICAgIHsgMC4wMCwgMC45MCwgMC45MCwgMC45NSwgMS4wMCwgMS4wMCwgMS4wMCB9LAotICAgICAgeyAwLjAyLCAwLjkwLCAwLjkwLCAwLjk1LCAxLjAwLCAxLjAwLCAxLjAwIH0sCi0gICAgICB7IDAuMDUsIDAuOTUsIDAuOTUsIDEuMDAsIDEuMDAsIDEuMDAsIDEuMDAgfSwKLSAgICAgIHsgMC4xNSwgMS4wMCwgMS4wMCwgMS4xMCwgMS4xNSwgMS4yMCwgMS4yMCB9LAotICAgICAgeyAwLjMwLCAxLjAwLCAxLjAwLCAxLjIwLCAxLjI1LCAxLjM1LCAxLjMwIH0sCi0gICAgICB7IDAuNTAsIDEuMDAsIDEuMDAsIDEuMjUsIDEuMzAsIDEuNTAsIDEuNTAgfSwKLSAgICAgIHsgMS4wMCwgMS4wMCwgMS4wMCwgMS4yNSwgMS4zMCwgMS41MCwgMS41MCB9IH07Ci0KLSAgLyoqCi0gICAqIEFuIGVuY29kaW5nIG9mIHRoZSBmdW5jdGlvbiB1c2VkIHRvIG1hbmFnZSBoZWFwIHNpemUuCi0gICAqIFRoZSB4YXhpcyByZXByZXNlbnRzIHRoZSBsaXZlIHJhdGlvIGF0IHRoZSBlbmQgb2YgYSBtYWpvciBjb2xsZWN0aW9uLgotICAgKiBUaGUgeWF4aXMgcmVwcmVzZW50cyB0aGUgR0MgbG9hZCAoR0MgdGltZS90b3RhbCB0aW1lKS4KLSAgICogVGhlIGludGVyaW9yIG9mIHRoZSBtYXRyaXggcmVwcmVzZW50cyBhIHJhdGlvIHRvIHNocmluayBvciBncm93Ci0gICAqIHRoZSBoZWFwIGZvciBhIGdpdmVuIHBhaXIgb2YgbGl2ZSByYXRpbyBhbmQgR0MgbG9hZC4KLSAgICogVGhlIGNvbnN0cmFpbnRzIG9uIHRoZSBtYXRyaXggYXJlOgotICAgKiA8dWw+Ci0gICAqIDxsaT4gZnVuY3Rpb25bMF1bMF0gaXMgaWdub3JlZC4KLSAgICogPGxpPiBBbGwgbnVtYmVycyBpbiB0aGUgZmlyc3Qgcm93IG11c3QgbW9ub3RvbmljYWxseSBpbmNyZWFzZSBhbmQKLSAgICogICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBmcm9tIDAgdG8gMSBpbmNsdXNpdmUuPC9saT4KLSAgICogPGxpPiBBbGwgbnVtYmVycyBpbiB0aGUgZmlyc3QgY29sdW1uIG11c3QgbW9ub3RvbmljYWxseSBpbmNyZWFzZQotICAgKiAgICAgIGFuZCBtdXN0IGJlIGluIHRoZSByYW5nZSBmcm9tIDAgdG8gMSBpbmNsdXNpdmUuPC9saT4KLSAgICogPGxpPiBUaGVyZSBtdXN0IGJlIDAgYW5kIDEgdmFsdWVzIHNwZWNpZmllZCBpbiBib3RoIGRpbWVuc2lvbnMuCi0gICAqIDxsaT4gRm9yIGFsbCBpbnRlcmlvciBwb2ludHMgaW4gdGhlIG1hdHJpeCwgdGhlIHZhbHVlIG11c3QgYmUKLSAgICogICAgICBncmVhdGVyIHRoYW4gdGhlIGxpdmVSYXRpbyBmb3IgdGhhdCBjb2x1bW4uPC9saT4KLSAgICogPC91bD4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZVtdW10gZnVuY3Rpb24gPQotICAgIFZNLmFjdGl2ZVBsYW4uY29uc3RyYWludHMoKS5nZW5lcmF0aW9uYWwoKSA/IGdlbmVyYXRpb25hbEZ1bmN0aW9uIDogbm9uZ2VuZXJhdGlvbmFsRnVuY3Rpb247Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBlbmRMYXN0TWFqb3JHQzsKLSAgcHJpdmF0ZSBzdGF0aWMgZG91YmxlIGFjY3VtdWxhdGVkR0NUaW1lOwotCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGhlYXAgc2l6ZSBwYXJhbWV0ZXJzIGFuZCB0aGUgbWVjaGFuaXNtcwotICAgKiB1c2VkIHRvIGFkYXB0aXZlbHkgY2hhbmdlIGhlYXAgc2l6ZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBib290KEV4dGVudCBpbml0aWFsLCBFeHRlbnQgbWF4KSB7Ci0gICAgaW5pdGlhbEhlYXBTaXplID0gaW5pdGlhbDsKLSAgICBtYXhIZWFwU2l6ZSA9IG1heDsKLSAgICBpZiAoaW5pdGlhbEhlYXBTaXplLkdUKG1heEhlYXBTaXplKSkKLSAgICAgIG1heEhlYXBTaXplID0gaW5pdGlhbEhlYXBTaXplOwotICAgIGN1cnJlbnRIZWFwU2l6ZSA9IGluaXRpYWxIZWFwU2l6ZTsKLSAgICBWTS5ldmVudHMuaGVhcFNpemVDaGFuZ2VkKGN1cnJlbnRIZWFwU2l6ZSk7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBzYW5pdHlDaGVjaygpOwotICAgIGVuZExhc3RNYWpvckdDID0gVk0uc3RhdGlzdGljcy5uYW5vVGltZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgaGVhcCBzaXplIGluIGJ5dGVzCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEV4dGVudCBnZXRDdXJyZW50SGVhcFNpemUoKSB7Ci0gICAgcmV0dXJuIGN1cnJlbnRIZWFwU2l6ZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG1heCBoZWFwIHNpemUgaW4gYnl0ZXMgKGFzIHNldCBieSAtWG14KS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbWF4IGhlYXAgc2l6ZSBpbiBieXRlcyAoYXMgc2V0IGJ5IC1YbXgpLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBFeHRlbnQgZ2V0TWF4SGVhcFNpemUoKSB7Ci0gICAgcmV0dXJuIG1heEhlYXBTaXplOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgaW5pdGlhbCBoZWFwIHNpemUgaW4gYnl0ZXMgKGFzIHNldCBieSAtWG1zKS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgaW5pdGlhbCBoZWFwIHNpemUgaW4gYnl0ZXMgKGFzIHNldCBieSAtWG1zKS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgRXh0ZW50IGdldEluaXRpYWxIZWFwU2l6ZSgpIHsKLSAgICByZXR1cm4gaW5pdGlhbEhlYXBTaXplOwotICB9Ci0KLSAgLyoqCi0gICAqIEZvcmNpYmx5IGdyb3cgdGhlIGhlYXAgYnkgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcy4KLSAgICogVXNlZCB0byBwcm92aWRlIGhlYWRyb29tIHdoZW4gaGFuZGxpbmcgYW4gT3V0T2ZNZW1vcnkKLSAgICogc2l0dWF0aW9uLgotICAgKiBAcGFyYW0gc2l6ZSBudW1iZXIgb2YgYnl0ZXMgdG8gZ3JvdyB0aGUgaGVhcAotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIG92ZXJyaWRlR3Jvd0hlYXBTaXplKEV4dGVudCBzaXplKSB7Ci0gICAgY3VycmVudEhlYXBTaXplID0gY3VycmVudEhlYXBTaXplLnBsdXMoc2l6ZSk7Ci0gICAgVk0uZXZlbnRzLmhlYXBTaXplQ2hhbmdlZChjdXJyZW50SGVhcFNpemUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlY29yZCB0aGUgdGltZSB0YWtlbiBieSB0aGUgY3VycmVudCBHQzsKLSAgICogdXNlZCB0byBjb21wdXRlIGdjIGxvYWQsIG9uZSBvZiB0aGUgaW5wdXRzCi0gICAqIGludG8gdGhlIGhlYXAgc2l6ZSBtYW5hZ2VtZW50IGZ1bmN0aW9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgcmVjb3JkR0NUaW1lKGRvdWJsZSB0aW1lKSB7Ci0gICAgYWNjdW11bGF0ZWRHQ1RpbWUgKz0gdGltZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXNldCB0aW1lcnMgdXNlZCB0byBjb21wdXRlIGdjIGxvYWQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldCgpIHsKLSAgICBlbmRMYXN0TWFqb3JHQyA9IFZNLnN0YXRpc3RpY3MubmFub1RpbWUoKTsKLSAgICBhY2N1bXVsYXRlZEdDVGltZSA9IDA7Ci0gIH0KLQotICAvKioKLSAgICogRGVjaWRlIGhvdyB0byBncm93L3NocmluayB0aGUgaGVhcCB0byByZXNwb25kCi0gICAqIHRvIGFwcGxpY2F0aW9uJ3MgbWVtb3J5IHVzYWdlLgotICAgKiBAcmV0dXJuIHRydWUgaWYgaGVhcCBzaXplIHdhcyBjaGFuZ2VkLCBmYWxzZSBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb25zaWRlckhlYXBTaXplKCkgewotICAgIEV4dGVudCBvbGRTaXplID0gY3VycmVudEhlYXBTaXplOwotICAgIEV4dGVudCByZXNlcnZlZCA9IFBsYW4ucmVzZXJ2ZWRNZW1vcnkoKTsKLSAgICBkb3VibGUgbGl2ZVJhdGlvID0gcmVzZXJ2ZWQudG9Mb25nKCkgLyAoKGRvdWJsZSkgY3VycmVudEhlYXBTaXplLnRvTG9uZygpKTsKLSAgICBkb3VibGUgcmF0aW8gPSBjb21wdXRlSGVhcENoYW5nZVJhdGlvKGxpdmVSYXRpbyk7Ci0gICAgRXh0ZW50IG5ld1NpemUgPSBXb3JkLmZyb21JbnRTaWduRXh0ZW5kKChpbnQpKHJhdGlvICogKGRvdWJsZSkgKG9sZFNpemUudG9Mb25nKCk+PkxPR19CWVRFU19JTl9NQllURSkpKS5sc2goTE9HX0JZVEVTX0lOX01CWVRFKS50b0V4dGVudCgpOyAvLyBkbyBhcml0aCBpbiBNQiB0byBhdm9pZCBvdmVyZmxvdwotICAgIGlmIChuZXdTaXplLkxUKHJlc2VydmVkKSkgbmV3U2l6ZSA9IHJlc2VydmVkOwotICAgIG5ld1NpemUgPSBuZXdTaXplLnBsdXMoQllURVNfSU5fTUJZVEUgLSAxKS50b1dvcmQoKS5yc2hsKExPR19CWVRFU19JTl9NQllURSkubHNoKExPR19CWVRFU19JTl9NQllURSkudG9FeHRlbnQoKTsgLy8gcm91bmQgdG8gbmV4dCBtZWdhYnl0ZQotICAgIGlmIChuZXdTaXplLkdUKG1heEhlYXBTaXplKSkgbmV3U2l6ZSA9IG1heEhlYXBTaXplOwotICAgIGlmIChuZXdTaXplLk5FKG9sZFNpemUpICYmIG5ld1NpemUuR1QoRXh0ZW50Lnplcm8oKSkpIHsKLSAgICAgIC8vIEhlYXAgc2l6ZSBpcyBnb2luZyB0byBjaGFuZ2UKLSAgICAgIGN1cnJlbnRIZWFwU2l6ZSA9IG5ld1NpemU7Ci0gICAgICBpZiAoT3B0aW9ucy52ZXJib3NlLmdldFZhbHVlKCkgPj0gMikgewotICAgICAgICBMb2cud3JpdGUoIkdDIE1lc3NhZ2U6IEhlYXAgY2hhbmdlZCBmcm9tICIpOyBMb2cud3JpdGVEZWMob2xkU2l6ZS50b1dvcmQoKS5yc2hsKExPR19CWVRFU19JTl9LQllURSkpOwotICAgICAgICBMb2cud3JpdGUoIktCIHRvICIpOyBMb2cud3JpdGVEZWMobmV3U2l6ZS50b1dvcmQoKS5yc2hsKExPR19CWVRFU19JTl9LQllURSkpOwotICAgICAgICBMb2cud3JpdGVsbigiS0IiKTsKLSAgICAgIH0KLSAgICAgIFZNLmV2ZW50cy5oZWFwU2l6ZUNoYW5nZWQoY3VycmVudEhlYXBTaXplKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZG91YmxlIGNvbXB1dGVIZWFwQ2hhbmdlUmF0aW8oZG91YmxlIGxpdmVSYXRpbykgewotICAgIC8vICgxKSBjb21wdXRlIEdDIGxvYWQuCi0gICAgbG9uZyB0b3RhbE5hbm9zID0gVk0uc3RhdGlzdGljcy5uYW5vVGltZSgpIC0gZW5kTGFzdE1ham9yR0M7Ci0gICAgZG91YmxlIHRvdGFsVGltZSA9IFZNLnN0YXRpc3RpY3MubmFub3NUb01pbGxpcyh0b3RhbE5hbm9zKTsKLSAgICBkb3VibGUgZ2NMb2FkID0gYWNjdW11bGF0ZWRHQ1RpbWUgLyB0b3RhbFRpbWU7Ci0KLSAgICBpZiAobGl2ZVJhdGlvID4gMSkgewotICAgICAgLy8gUGVyaGFwcyBpbmRpY2F0ZXMgYmFkIGJvb2trZWVwaW5nIGluIE1NVGs/Ci0gICAgICBMb2cud3JpdGUoIkdDV2FybmluZzogTGl2ZSByYXRpbyBncmVhdGVyIHRoYW4gMTogIik7Ci0gICAgICBMb2cud3JpdGVsbihsaXZlUmF0aW8pOwotICAgICAgbGl2ZVJhdGlvID0gMTsKLSAgICB9Ci0gICAgaWYgKGdjTG9hZCA+IDEpIHsKLSAgICAgIGlmIChnY0xvYWQgPiAxLjAwMDEpIHsKLSAgICAgICAgTG9nLndyaXRlKCJHQyBFcnJvcjogR0MgbG9hZCB3YXMgZ3JlYXRlciB0aGFuIDEhISAiKTsKLSAgICAgICAgTG9nLndyaXRlbG4oZ2NMb2FkKTsKLSAgICAgICAgTG9nLndyaXRlKCJHQyBFcnJvcjpcdHRvdGFsIHRpbWUgKG1zKSAiKTsgTG9nLndyaXRlbG4odG90YWxUaW1lKTsKLSAgICAgICAgTG9nLndyaXRlKCJHQyBFcnJvcjpcdGdjIHRpbWUgKG1zKSAiKTsgTG9nLndyaXRlbG4oYWNjdW11bGF0ZWRHQ1RpbWUpOwotICAgICAgfQotICAgICAgZ2NMb2FkID0gMTsKLSAgICB9Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQobGl2ZVJhdGlvID49IDApOwotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUyAmJiBnY0xvYWQgPCAtMC4wKSB7Ci0gICAgICBMb2cud3JpdGUoImdjTG9hZCBjb21wdXRlZCB0byBiZSAiKTsgTG9nLndyaXRlbG4oZ2NMb2FkKTsKLSAgICAgIExvZy53cml0ZSgiXHRhY2N1bXVsYXRlR0NUaW1lIHdhcyAobXMpICIpOyBMb2cud3JpdGVsbihhY2N1bXVsYXRlZEdDVGltZSk7Ci0gICAgICBMb2cud3JpdGUoIlx0dG90YWxUaW1lIHdhcyAobXMpICIpOyBMb2cud3JpdGVsbih0b3RhbFRpbWUpOwotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZmFsc2UpOwotICAgIH0KLQotICAgIGlmIChPcHRpb25zLnZlcmJvc2UuZ2V0VmFsdWUoKSA+IDIpIHsKLSAgICAgIExvZy53cml0ZSgiTGl2ZSByYXRpbyAiKTsgTG9nLndyaXRlbG4obGl2ZVJhdGlvKTsKLSAgICAgIExvZy53cml0ZSgiR0NMb2FkICAgICAiKTsgTG9nLndyaXRlbG4oZ2NMb2FkKTsKLSAgICB9Ci0KLSAgICAvLyAoMikgRmluZCB0aGUgNCBwb2ludHMgc3Vycm91bmRpbmcgZ2NMb2FkIGFuZCBsaXZlUmF0aW8KLSAgICBpbnQgbGl2ZVJhdGlvVW5kZXIgPSAxOwotICAgIGludCBsaXZlUmF0aW9BYm92ZSA9IGZ1bmN0aW9uWzBdLmxlbmd0aCAtIDE7Ci0gICAgaW50IGdjTG9hZFVuZGVyID0gMTsKLSAgICBpbnQgZ2NMb2FkQWJvdmUgPSBmdW5jdGlvbi5sZW5ndGggLSAxOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBpZiAoZnVuY3Rpb25bMF1bbGl2ZVJhdGlvVW5kZXIrMV0gPj0gbGl2ZVJhdGlvKSBicmVhazsKLSAgICAgIGxpdmVSYXRpb1VuZGVyKys7Ci0gICAgfQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBpZiAoZnVuY3Rpb25bMF1bbGl2ZVJhdGlvQWJvdmUtMV0gPD0gbGl2ZVJhdGlvKSBicmVhazsKLSAgICAgIGxpdmVSYXRpb0Fib3ZlLS07Ci0gICAgfQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBpZiAoZnVuY3Rpb25bZ2NMb2FkVW5kZXIrMV1bMF0gPj0gZ2NMb2FkKSBicmVhazsKLSAgICAgIGdjTG9hZFVuZGVyKys7Ci0gICAgfQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBpZiAoZnVuY3Rpb25bZ2NMb2FkQWJvdmUtMV1bMF0gPD0gZ2NMb2FkKSBicmVhazsKLSAgICAgIGdjTG9hZEFib3ZlLS07Ci0gICAgfQotCi0gICAgLy8gKDMpIENvbXB1dGUgdGhlIGhlYXAgY2hhbmdlIHJhdGlvCi0gICAgZG91YmxlIGZhY3RvciA9IGZ1bmN0aW9uW2djTG9hZFVuZGVyXVtsaXZlUmF0aW9VbmRlcl07Ci0gICAgZG91YmxlIGxpdmVSYXRpb0ZyYWN0aW9uID0KLSAgICAgIChsaXZlUmF0aW8gLSBmdW5jdGlvblswXVtsaXZlUmF0aW9VbmRlcl0pIC8KLSAgICAgIChmdW5jdGlvblswXVtsaXZlUmF0aW9BYm92ZV0gLSBmdW5jdGlvblswXVtsaXZlUmF0aW9VbmRlcl0pOwotICAgIGRvdWJsZSBsaXZlUmF0aW9EZWx0YSA9Ci0gICAgICBmdW5jdGlvbltnY0xvYWRVbmRlcl1bbGl2ZVJhdGlvQWJvdmVdIC0gZnVuY3Rpb25bZ2NMb2FkVW5kZXJdW2xpdmVSYXRpb1VuZGVyXTsKLSAgICBmYWN0b3IgKz0gKGxpdmVSYXRpb0ZyYWN0aW9uICogbGl2ZVJhdGlvRGVsdGEpOwotICAgIGRvdWJsZSBnY0xvYWRGcmFjdGlvbiA9Ci0gICAgICAoZ2NMb2FkIC0gZnVuY3Rpb25bZ2NMb2FkVW5kZXJdWzBdKSAvCi0gICAgICAoZnVuY3Rpb25bZ2NMb2FkQWJvdmVdWzBdIC0gZnVuY3Rpb25bZ2NMb2FkVW5kZXJdWzBdKTsKLSAgICBkb3VibGUgZ2NMb2FkRGVsdGEgPQotICAgICAgZnVuY3Rpb25bZ2NMb2FkQWJvdmVdW2xpdmVSYXRpb1VuZGVyXSAtIGZ1bmN0aW9uW2djTG9hZFVuZGVyXVtsaXZlUmF0aW9VbmRlcl07Ci0gICAgZmFjdG9yICs9IChnY0xvYWRGcmFjdGlvbiAqIGdjTG9hZERlbHRhKTsKLQotICAgIGlmIChPcHRpb25zLnZlcmJvc2UuZ2V0VmFsdWUoKSA+IDIpIHsKLSAgICAgIExvZy53cml0ZSgiSGVhcCBhZGp1c3RtZW50IGZhY3RvciBpcyAiKTsKLSAgICAgIExvZy53cml0ZWxuKGZhY3Rvcik7Ci0gICAgfQotICAgIHJldHVybiBmYWN0b3I7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2sgdGhhdCBmdW5jdGlvbiBzYXRpc2ZpZXMgdGhlIGludmFyaWFudHMKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgc2FuaXR5Q2hlY2soKSB7Ci0gICAgLy8gQ2hlY2sgbGl2ZSByYXRpbwotICAgIGRvdWJsZVtdIGxpdmVSYXRpbyA9IGZ1bmN0aW9uWzBdOwotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGxpdmVSYXRpb1sxXSA9PSAwKTsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChsaXZlUmF0aW9bbGl2ZVJhdGlvLmxlbmd0aC0xXSA9PSAxKTsKLSAgICBmb3IgKGludCBpID0gMjsgaSA8IGxpdmVSYXRpby5sZW5ndGg7IGkrKykgewotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQobGl2ZVJhdGlvW2ktMV0gPCBsaXZlUmF0aW9baV0pOwotICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCBmdW5jdGlvbi5sZW5ndGg7IGorKykgewotICAgICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChmdW5jdGlvbltqXVtpXSA+PSAxIHx8IGZ1bmN0aW9uW2pdW2ldID4gbGl2ZVJhdGlvW2ldKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDaGVjayBHQyBsb2FkCi0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZnVuY3Rpb25bMV1bMF0gPT0gMCk7Ci0gICAgaW50IGxlbiA9IGZ1bmN0aW9uLmxlbmd0aDsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChmdW5jdGlvbltsZW4tMV1bMF0gPT0gMSk7Ci0gICAgZm9yIChpbnQgaSA9IDI7IGkgPCBsZW47IGkrKykgewotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoZnVuY3Rpb25baS0xXVswXSA8IGZ1bmN0aW9uW2ldWzBdKTsKLSAgICB9Ci0KLSAgICAvLyBDaGVjayB0aGF0IHdlIGhhdmUgYSByZWN0YW5ndWxhciBtYXRyaXgKLSAgICBmb3IgKGludCBpID0gMTsgaSA8IGZ1bmN0aW9uLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChmdW5jdGlvbltpLTFdLmxlbmd0aCA9PSBmdW5jdGlvbltpXS5sZW5ndGgpOwotICAgIH0KLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9oZWFwL01hcC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2hlYXAvTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMTlmMzIuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2hlYXAvTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkuaGVhcDsKLQotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkdlbmVyaWNGcmVlTGlzdDsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkxvZzsKLWltcG9ydCBvcmcubW10ay52bS5Mb2NrOwotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS5JbmxpbmU7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLkludGVycnVwdGlibGU7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLlVuaW50ZXJydXB0aWJsZTsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLkFkZHJlc3M7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC5FeHRlbnQ7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC5Xb3JkOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyB0aGUgbWFwcGluZyBvZiBzcGFjZXMgdG8gdmlydHVhbCBtZW1vcnkgcmFuZ2VzLjxwPgotICoKLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIE1hcCB7Ci0KLSAgLyogc2V0IHRoZSBtYXAgYmFzZSBhZGRyZXNzIHNvIHRoYXQgd2UgaGF2ZSBhbiB1bnVzZWQgKG51bGwpIGNodW5rIGF0IHRoZSBib3R0b21lIG9mIHRoZSBzcGFjZSBmb3IgNjQgYml0ICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEFkZHJlc3MgTUFQX0JBU0VfQUREUkVTUyA9IFNwYWNlLkJJVFNfSU5fQUREUkVTUyA9PSAzMiA/IEFkZHJlc3MuemVybygpIDogU3BhY2UuSEVBUF9TVEFSVC5taW51cyhTcGFjZS5CWVRFU19JTl9DSFVOSyk7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQ2xhc3MgdmFyaWFibGVzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBkZXNjcmlwdG9yTWFwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBwcmV2TGluazsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gbmV4dExpbms7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFNwYWNlW10gc3BhY2VNYXA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEdlbmVyaWNGcmVlTGlzdCByZWdpb25NYXA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgR2VuZXJpY0ZyZWVMaXN0IGdsb2JhbFBhZ2VNYXA7Ci0gIHByaXZhdGUgc3RhdGljIGludCBzaGFyZWREaXNjb250aWdGTENvdW50ID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRnJlZUxpc3RQYWdlUmVzb3VyY2VbXSBzaGFyZWRGTE1hcDsKLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHRvdGFsQXZhaWxhYmxlRGlzY29udGlndW91c0NodW5rcyA9IDA7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jayBsb2NrID0gVk0ubmV3TG9jaygiTWFwIGxvY2siKTsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbml0aWFsaXphdGlvbgotICAgKi8KLQotICAvKioKLSAgICogQ2xhc3MgaW5pdGlhbGl6ZXIuIENyZWF0ZSBvdXIgdHdvIG1hcHMKLSAgICovCi0gIHN0YXRpYyB7Ci0gICAgZGVzY3JpcHRvck1hcCA9IG5ldyBpbnRbU3BhY2UuTUFYX0NIVU5LU107Ci0gICAgcHJldkxpbmsgPSBuZXcgaW50W1NwYWNlLk1BWF9DSFVOS1NdOwotICAgIG5leHRMaW5rID0gbmV3IGludFtTcGFjZS5NQVhfQ0hVTktTXTsKLSAgICBzcGFjZU1hcCA9IG5ldyBTcGFjZVtTcGFjZS5NQVhfQ0hVTktTXTsKLSAgICByZWdpb25NYXAgPSBuZXcgR2VuZXJpY0ZyZWVMaXN0KFNwYWNlLk1BWF9DSFVOS1MpOwotICAgIGdsb2JhbFBhZ2VNYXAgPSBuZXcgR2VuZXJpY0ZyZWVMaXN0KDEsIDEsIFNwYWNlLk1BWF9TUEFDRVMpOwotICAgIHNoYXJlZEZMTWFwID0gbmV3IEZyZWVMaXN0UGFnZVJlc291cmNlW1NwYWNlLk1BWF9TUEFDRVNdOwotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykKLSAgICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KFNwYWNlLkJJVFNfSU5fQUREUkVTUyA9PSBTcGFjZS5MT0dfQUREUkVTU19TUEFDRSB8fAotICAgICAgICAgICAgU3BhY2UuSEVBUF9FTkQuZGlmZihNQVBfQkFTRV9BRERSRVNTKS50b1dvcmQoKS5yc2hsKFNwYWNlLkxPR19BRERSRVNTX1NQQUNFKS5pc1plcm8oKSk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBNYXAgYWNjZXNzZXMgYW5kIGluc2VydGlvbgotICAgKi8KLQotICAvKioKLSAgICogSW5zZXJ0IGEgc3BhY2UgYW5kIGl0cyBkZXNjcmlwdG9yIGludG8gdGhlIG1hcCwgYXNzb2NpYXRpbmcgaXQKLSAgICogd2l0aCBhIHBhcnRpY3VsYXIgYWRkcmVzcyByYW5nZS4KLSAgICoKLSAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSByZWdpb24gdG8gYmUgYXNzb2NpYXRlZAotICAgKiB3aXRoIHRoaXMgc3BhY2UuCi0gICAqIEBwYXJhbSBleHRlbnQgVGhlIHNpemUgb2YgdGhlIHJlZ2lvbiwgaW4gYnl0ZXMKLSAgICogQHBhcmFtIGRlc2NyaXB0b3IgVGhlIGRlc2NyaXB0b3IgZm9yIHRoaXMgc3BhY2UKLSAgICogQHBhcmFtIHNwYWNlIFRoZSBzcGFjZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByZWdpb24KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnQoQWRkcmVzcyBzdGFydCwgRXh0ZW50IGV4dGVudCwgaW50IGRlc2NyaXB0b3IsCi0gICAgICBTcGFjZSBzcGFjZSkgewotICAgIEV4dGVudCBlID0gRXh0ZW50Lnplcm8oKTsKLSAgICB3aGlsZSAoZS5MVChleHRlbnQpKSB7Ci0gICAgICBpbnQgaW5kZXggPSBnZXRDaHVua0luZGV4KHN0YXJ0LnBsdXMoZSkpOwotICAgICAgaWYgKGRlc2NyaXB0b3JNYXBbaW5kZXhdICE9IDApIHsKLSAgICAgICAgTG9nLndyaXRlKCJDb25mbGljdGluZyB2aXJ0dWFsIGFkZHJlc3MgcmVxdWVzdCBmb3Igc3BhY2UgXCIiKTsKLSAgICAgICAgTG9nLndyaXRlKHNwYWNlLmdldE5hbWUoKSk7IExvZy53cml0ZSgiXCIgYXQgIik7Ci0gICAgICAgIExvZy53cml0ZWxuKHN0YXJ0LnBsdXMoZSkpOwotICAgICAgICBTcGFjZS5wcmludFZNTWFwKCk7Ci0gICAgICAgIFZNLmFzc2VydGlvbnMuZmFpbCgiZXhpdGluZyIpOwotICAgICAgfQotICAgICAgZGVzY3JpcHRvck1hcFtpbmRleF0gPSBkZXNjcmlwdG9yOwotICAgICAgVk0uYmFycmllcnMub2JqZWN0QXJyYXlTdG9yZU5vR0NCYXJyaWVyKHNwYWNlTWFwLCBpbmRleCwgc3BhY2UpOwotICAgICAgZSA9IGUucGx1cyhTcGFjZS5CWVRFU19JTl9DSFVOSyk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFsbG9jYXRlIHNvbWUgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgY2h1bmtzIHdpdGhpbiBhIGRpc2NvbnRpZ3VvdXMgcmVnaW9uCi0gICAqCi0gICAqIEBwYXJhbSBkZXNjcmlwdG9yIFRoZSBkZXNjcmlwdG9yIGZvciB0aGUgc3BhY2UgdG8gd2hpY2ggdGhlc2UgY2h1bmtzIHdpbGwgYmUgYXNzaWduZWQKLSAgICogQHBhcmFtIHNwYWNlIFRoZSBzcGFjZSB0byB3aGljaCB0aGVzZSBjaHVua3Mgd2lsbCBiZSBhc3NpZ25lZAotICAgKiBAcGFyYW0gY2h1bmtzIFRoZSBudW1iZXIgb2YgY2h1bmtzIHJlcXVpcmVkCi0gICAqIEBwYXJhbSBoZWFkIFRoZSBwcmV2aW91cyBjb250Z2l1b3VzIHNldCBvZiBjaHVua3MgZm9yIHRoaXMgc3BhY2UgKHRvIGNyZWF0ZSBhIGxpbmtlZCBsaXN0IG9mIGNvbnRpZ3VvdXMgcmVnaW9ucyBmb3IgZWFjaCBzcGFjZSkKLSAgICogQHJldHVybiBUaGUgYWRkcmVzcyBvZiB0aGUgYXNzaWduZWQgbWVtb3J5LiAgVGhpcyBhbHdheXMgc3VjY2VlZHMuICBJZiB0aGUgcmVxdWVzdCBmYWlscyB3ZSBmYWlsIHJpZ2h0IGhlcmUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEFkZHJlc3MgYWxsb2NhdGVDb250aWd1b3VzQ2h1bmtzKGludCBkZXNjcmlwdG9yLCBTcGFjZSBzcGFjZSwgaW50IGNodW5rcywgQWRkcmVzcyBoZWFkKSB7Ci0gICAgbG9jay5hY3F1aXJlKCk7Ci0gICAgaW50IGNodW5rID0gcmVnaW9uTWFwLmFsbG9jKGNodW5rcyk7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoY2h1bmsgIT0gMCk7Ci0gICAgaWYgKGNodW5rID09IC0xKSB7Ci0gICAgICBMb2cud3JpdGUoIlVuYWJsZSB0byBhbGxvY2F0ZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgZm9yIHNwYWNlIFwiIik7Ci0gICAgICBMb2cud3JpdGUoc3BhY2UuZ2V0TmFtZSgpKTsgTG9nLndyaXRlKCJcIiBmb3IgIik7Ci0gICAgICBMb2cud3JpdGUoY2h1bmtzKTsgTG9nLndyaXRlKCIgY2h1bmtzICgiKTsKLSAgICAgIExvZy53cml0ZShjaHVua3M8PFNwYWNlLkxPR19CWVRFU19JTl9DSFVOSyk7IExvZy53cml0ZWxuKCIgYnl0ZXMpIik7Ci0gICAgICBTcGFjZS5wcmludFZNTWFwKCk7Ci0gICAgICBWTS5hc3NlcnRpb25zLmZhaWwoImV4aXRpbmciKTsKLSAgICB9Ci0gICAgdG90YWxBdmFpbGFibGVEaXNjb250aWd1b3VzQ2h1bmtzIC09IGNodW5rczsKLSAgICBBZGRyZXNzIHJ0biA9IGFkZHJlc3NGb3JDaHVua0luZGV4KGNodW5rKTsKLSAgICBpbnNlcnQocnRuLCBFeHRlbnQuZnJvbUludFplcm9FeHRlbmQoY2h1bmtzPDxTcGFjZS5MT0dfQllURVNfSU5fQ0hVTkspLCBkZXNjcmlwdG9yLCBzcGFjZSk7Ci0gICAgaWYgKGhlYWQuaXNaZXJvKCkpIHsKLSAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KG5leHRMaW5rW2NodW5rXSA9PSAwKTsKLSAgICB9IGVsc2UgewotICAgICAgbmV4dExpbmtbY2h1bmtdID0gZ2V0Q2h1bmtJbmRleChoZWFkKTsKLSAgICAgIHByZXZMaW5rW2dldENodW5rSW5kZXgoaGVhZCldID0gY2h1bms7Ci0gICAgfQotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KHByZXZMaW5rW2NodW5rXSA9PSAwKTsKLSAgICBsb2NrLnJlbGVhc2UoKTsKLSAgICByZXR1cm4gcnRuOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgbmV4dCBjb250aWd1b3VzIHJlZ2lvbiBhc3NvY2lhdGVkIHdpdGggc29tZSBkaXNjb250aWd1b3VzIHNwYWNlIGJ5IGZvbGxvd2luZyB0aGUgbGlua2VkIGxpc3QgZm9yIHRoYXQgc3BhY2UuCi0gICAqCi0gICAqIEBwYXJhbSBzdGFydCBUaGUgY3VycmVudCByZWdpb24gKHJldHVybiB0aGUgbmV4dCByZWdpb24gaW4gdGhlIGxpc3QpCi0gICAqIEByZXR1cm4gUmV0dXJuIHRoZSBuZXh0IGNvbnRpZ3VvdXMgcmVnaW9uIGFmdGVyIHN0YXJ0IGluIHRoZSBsaW5rZWQgbGlzdCBvZiByZWdpb25zCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEFkZHJlc3MgZ2V0TmV4dENvbnRpZ3VvdXNSZWdpb24oQWRkcmVzcyBzdGFydCkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KHN0YXJ0LkVRKFNwYWNlLmNodW5rQWxpZ24oc3RhcnQsIHRydWUpKSk7Ci0gICAgaW50IGNodW5rID0gZ2V0Q2h1bmtJbmRleChzdGFydCk7Ci0gICAgcmV0dXJuIChjaHVuayA9PSAwKSA/IEFkZHJlc3MuemVybygpIDogKG5leHRMaW5rW2NodW5rXSA9PSAwKSA/IEFkZHJlc3MuemVybygpIDogYWRkcmVzc0ZvckNodW5rSW5kZXgobmV4dExpbmtbY2h1bmtdKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHNpemUgb2YgYSBjb250aWd1b3VzIHJlZ2lvbiBpbiBjaHVua3MuCi0gICAqCi0gICAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgcmVnaW9uIHdob3NlIHNpemUgaXMgYmVpbmcgcmVxdWVzdGVkCi0gICAqIEByZXR1cm4gVGhlIHNpemUgb2YgdGhlIHJlZ2lvbiBpbiBxdWVzdGlvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Q29udGlndW91c1JlZ2lvbkNodW5rcyhBZGRyZXNzIHN0YXJ0KSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoc3RhcnQuRVEoU3BhY2UuY2h1bmtBbGlnbihzdGFydCwgdHJ1ZSkpKTsKLSAgICBpbnQgY2h1bmsgPSBnZXRDaHVua0luZGV4KHN0YXJ0KTsKLSAgICByZXR1cm4gcmVnaW9uTWFwLnNpemUoY2h1bmspOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgc2l6ZSBvZiBhIGNvbnRpZ3VvdXMgcmVnaW9uIGluIGJ5dGVzLgotICAgKgotICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbiB3aG9zZSBzaXplIGlzIGJlaW5nIHJlcXVlc3RlZAotICAgKiBAcmV0dXJuIFRoZSBzaXplIG9mIHRoZSByZWdpb24gaW4gcXVlc3Rpb24KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgRXh0ZW50IGdldENvbnRpZ3VvdXNSZWdpb25TaXplKEFkZHJlc3Mgc3RhcnQpIHsKLSAgICByZXR1cm4gV29yZC5mcm9tSW50U2lnbkV4dGVuZChnZXRDb250aWd1b3VzUmVnaW9uQ2h1bmtzKHN0YXJ0KSkubHNoKFNwYWNlLkxPR19CWVRFU19JTl9DSFVOSykudG9FeHRlbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBGcmVlIGFsbCBjaHVua3MgaW4gYSBsaW5rZWQgbGlzdCBvZiBjb250aWd1b3VzIGNodW5rcy4gIFRoaXMgbWVhbnMgc3RhcnRpbmcKLSAgICogd2l0aCBvbmUgYW5kIHRoZW4gd2Fsa2luZyB0aGUgY2hhaW5zIG9mIGNvbnRpZ3VvdXMgcmVnaW9ucywgZnJlZWluZyBlYWNoLgotICAgKgotICAgKiBAcGFyYW0gYW55Q2h1bmsgQW55IGNodW5rIGluIHRoZSBsaW5rZWQgbGlzdCBvZiBjaHVua3MgdG8gYmUgZnJlZWQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBmcmVlQWxsQ2h1bmtzKEFkZHJlc3MgYW55Q2h1bmspIHsKLSAgICBsb2NrLmFjcXVpcmUoKTsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChhbnlDaHVuay5FUShTcGFjZS5jaHVua0FsaWduKGFueUNodW5rLCB0cnVlKSkpOwotICAgIGlmICghYW55Q2h1bmsuaXNaZXJvKCkpIHsKLSAgICAgIGludCBjaHVuayA9IGdldENodW5rSW5kZXgoYW55Q2h1bmspOwotICAgICAgd2hpbGUgKG5leHRMaW5rW2NodW5rXSAhPSAwKSB7Ci0gICAgICAgIGZyZWVDb250aWd1b3VzQ2h1bmtzKG5leHRMaW5rW2NodW5rXSk7Ci0gICAgICB9Ci0gICAgICB3aGlsZSAocHJldkxpbmtbY2h1bmtdICE9IDApIHsKLSAgICAgICAgZnJlZUNvbnRpZ3VvdXNDaHVua3MocHJldkxpbmtbY2h1bmtdKTsKLSAgICAgIH0KLSAgICAgIGZyZWVDb250aWd1b3VzQ2h1bmtzKGNodW5rKTsKLSAgICB9Ci0gICAgbG9jay5yZWxlYXNlKCk7Ci0gIH0KLQotICAvKioKLSAgICogRnJlZSBzb21lIHNldCBvZiBjb250aWd1b3VzIGNodW5rcywgZ2l2ZW4gdGhlIGNodW5rIGFkZHJlc3MKLSAgICoKLSAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBmaXJzdCBjaHVuayBpbiB0aGUgc2VyaWVzCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBjaHVua3Mgd2hpY2ggd2VyZSBjb250aWd1b3VzbHkgYWxsb2NhdGVkCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBmcmVlQ29udGlndW91c0NodW5rcyhBZGRyZXNzIHN0YXJ0KSB7Ci0gICAgbG9jay5hY3F1aXJlKCk7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoc3RhcnQuRVEoU3BhY2UuY2h1bmtBbGlnbihzdGFydCwgdHJ1ZSkpKTsKLSAgICBpbnQgcnRuID0gZnJlZUNvbnRpZ3VvdXNDaHVua3MoZ2V0Q2h1bmtJbmRleChzdGFydCkpOwotICAgIGxvY2sucmVsZWFzZSgpOwotICAgIHJldHVybiBydG47Ci0gIH0KLQotICAvKioKLSAgICogRnJlZSBzb21lIHNldCBvZiBjb250aWd1b3VzIGNodW5rcywgZ2l2ZW4gdGhlIGNodW5rIGluZGV4Ci0gICAqCi0gICAqIEBwYXJhbSBjaHVuayBUaGUgY2h1bmsgaW5kZXggb2YgdGhlIHJlZ2lvbiB0byBiZSBmcmVlZAotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgY2h1bmtzIGZyZWVkCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBpbnQgZnJlZUNvbnRpZ3VvdXNDaHVua3MoaW50IGNodW5rKSB7Ci0gICAgaW50IGNodW5rcyA9IHJlZ2lvbk1hcC5mcmVlKGNodW5rKTsKLSAgICB0b3RhbEF2YWlsYWJsZURpc2NvbnRpZ3VvdXNDaHVua3MgKz0gY2h1bmtzOwotICAgIGludCBuZXh0ID0gbmV4dExpbmtbY2h1bmtdOwotICAgIGludCBwcmV2ID0gcHJldkxpbmtbY2h1bmtdOwotICAgIGlmIChuZXh0ICE9IDApIHByZXZMaW5rW25leHRdID0gcHJldjsKLSAgICBpZiAocHJldiAhPSAwKSBuZXh0TGlua1twcmV2XSA9IG5leHQ7Ci0gICAgbmV4dExpbmtbY2h1bmtdID0gcHJldkxpbmtbY2h1bmtdID0gMDsKLSAgICBmb3IgKGludCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBjaHVua3M7IG9mZnNldCsrKSB7Ci0gICAgICBkZXNjcmlwdG9yTWFwW2NodW5rICsgb2Zmc2V0XSA9IDA7Ci0gICAgICBWTS5iYXJyaWVycy5vYmplY3RBcnJheVN0b3JlTm9HQ0JhcnJpZXIoc3BhY2VNYXAsIGNodW5rICsgb2Zmc2V0LCBudWxsKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNodW5rczsKLSAgfQotCi0gIC8qKgotICAgKiBGaW5hbGl6ZSB0aGUgc3BhY2UgbWFwLCBlc3RhYmxpc2hpbmcgd2hpY2ggdmlydHVhbCBtZW1vcnkKLSAgICogaXMgbmFpbGVkIGRvd24sIGFuZCB0aGVuIHBsYWNpbmcgdGhlIHJlc3QgaW50byBhIG1hcCB0bwotICAgKiBiZSB1c2VkIGJ5IGRpc2NvbnRpZ3VvdXMgc3BhY2VzLgotICAgKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHVibGljIHN0YXRpYyB2b2lkIGZpbmFsaXplU3RhdGljU3BhY2VNYXAoKSB7Ci0gICAgLyogZXN0YWJsaXNoIGJvdW5kcyBvZiBkaXNjb250aWd1b3VzIHNwYWNlICovCi0gICAgQWRkcmVzcyBzdGFydEFkZHJlc3MgPSBTcGFjZS5nZXREaXNjb250aWdTdGFydCgpOwotICAgIGludCBmaXJzdENodW5rID0gZ2V0Q2h1bmtJbmRleChzdGFydEFkZHJlc3MpOwotICAgIGludCBsYXN0Q2h1bmsgPSBnZXRDaHVua0luZGV4KFNwYWNlLmdldERpc2NvbnRpZ0VuZCgpKTsKLSAgICBpbnQgdW5hdmFpbFN0YXJ0Q2h1bmsgPSBsYXN0Q2h1bmsgKyAxOwotICAgIGludCB0cmFpbGluZ0NodW5rcyA9IFNwYWNlLk1BWF9DSFVOS1MgLSB1bmF2YWlsU3RhcnRDaHVuazsKLSAgICBpbnQgcGFnZXMgPSAoMSArIGxhc3RDaHVuayAtIGZpcnN0Q2h1bmspICogU3BhY2UuUEFHRVNfSU5fQ0hVTks7Ci0gICAgZ2xvYmFsUGFnZU1hcC5yZXNpemVGcmVlTGlzdChwYWdlcywgcGFnZXMpOwotICAgIGZvciAoaW50IHByID0gMDsgcHIgPCBzaGFyZWREaXNjb250aWdGTENvdW50OyBwcisrKQotICAgICAgc2hhcmVkRkxNYXBbcHJdLnJlc2l6ZUZyZWVMaXN0KHN0YXJ0QWRkcmVzcyk7Ci0KLSAgICAvKiBzZXQgdXAgdGhlIHJlZ2lvbiBtYXAgZnJlZSBsaXN0ICovCi0gICAgaW50IGFsbG9jZWRDaHVuayA9IHJlZ2lvbk1hcC5hbGxvYyhmaXJzdENodW5rKTsgICAgICAgLy8gYmxvY2sgb3V0IGVudGlyZSBib3R0b20gb2YgYWRkcmVzcyByYW5nZQotICAgIGZvciAoaW50IGNodW5rSW5kZXggPSBmaXJzdENodW5rOyBjaHVua0luZGV4IDw9IGxhc3RDaHVuazsgY2h1bmtJbmRleCsrKQotICAgICAgYWxsb2NlZENodW5rID0gcmVnaW9uTWFwLmFsbG9jKDEpOyAgICAgICAgICAgICAvLyBUZW50YXRpdmVseSBhbGxvY2F0ZSBhbGwgdXNhYmxlIGNodW5rcwotICAgIGFsbG9jZWRDaHVuayA9IHJlZ2lvbk1hcC5hbGxvYyh0cmFpbGluZ0NodW5rcyk7ICAvLyBibG9jayBvdXQgZW50aXJlIHRvcCBvZiBhZGRyZXNzIHJhbmdlCi0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoYWxsb2NlZENodW5rID09IHVuYXZhaWxTdGFydENodW5rKTsKLQotICAgIC8qIHNldCB1cCB0aGUgZ2xvYmFsIHBhZ2UgbWFwIGFuZCBwbGFjZSBjaHVua3Mgb24gZnJlZSBsaXN0ICovCi0gICAgaW50IGZpcnN0UGFnZSA9IDA7Ci0gICAgZm9yIChpbnQgY2h1bmtJbmRleCA9IGZpcnN0Q2h1bms7IGNodW5rSW5kZXggPD0gbGFzdENodW5rOyBjaHVua0luZGV4KyspIHsKLSAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KHNwYWNlTWFwW2NodW5rSW5kZXhdID09IG51bGwpOwotICAgICAgdG90YWxBdmFpbGFibGVEaXNjb250aWd1b3VzQ2h1bmtzKys7Ci0gICAgICByZWdpb25NYXAuZnJlZShjaHVua0luZGV4KTsgIC8vIHB1dCB0aGlzIGNodW5rIG9uIHRoZSBmcmVlIGxpc3QKLSAgICAgIGdsb2JhbFBhZ2VNYXAuc2V0VW5jb2FsZXNjYWJsZShmaXJzdFBhZ2UpOwotICAgICAgaW50IGFsbG9jZWRQYWdlcyA9IGdsb2JhbFBhZ2VNYXAuYWxsb2MoU3BhY2UuUEFHRVNfSU5fQ0hVTkspOyAvLyBwb3B1bGF0ZSB0aGUgZ2xvYmFsIHBhZ2UgbWFwCi0gICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChhbGxvY2VkUGFnZXMgPT0gZmlyc3RQYWdlKTsKLSAgICAgIGZpcnN0UGFnZSArPSBTcGFjZS5QQUdFU19JTl9DSFVOSzsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBvcmRpbmFsIG51bWJlciBmb3Igc29tZSBmcmVlIGxpc3Qgc3BhY2Ugd2lzaGluZyB0byBzaGFyZSBhIGRpc2NvbnRpZ3VvdXMgcmVnaW9uLgotICAgKiBAcmV0dXJuIFRoZSBvcmRpbmFsIG51bWJlciBmb3IgYSBmcmVlIGxpc3Qgc3BhY2Ugd2lzaGluZyB0byBzaGFyZSBhIGRpc2NvbnRpZ3VvdXMgcmVnaW9uCi0gICAqLwotICBASW50ZXJydXB0aWJsZQotICBwdWJsaWMgc3RhdGljIGludCBnZXREaXNjb250aWdGcmVlTGlzdFBST3JkaW5hbChGcmVlTGlzdFBhZ2VSZXNvdXJjZSBwcikgewotICAgIHNoYXJlZEZMTWFwW3NoYXJlZERpc2NvbnRpZ0ZMQ291bnRdID0gcHI7Ci0gICAgc2hhcmVkRGlzY29udGlnRkxDb3VudCsrOwotICAgIHJldHVybiBzaGFyZWREaXNjb250aWdGTENvdW50OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGNodW5rcyBhdmFpbGFibGUgKHVuYXNzaWduZWQpIHdpdGhpbiB0aGUKLSAgICogcmFuZ2Ugb2YgdmlydHVhbCBtZW1vcnkgYXBwb3J0aW9uZWQgdG8gZGlzY29udGlndW91cyBzcGFjZXMuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBhdmFpbGFibGUgY2h1bmtzIGZvciB1c2UgYnkgZGlzY29udGlndW91cyBzcGFjZXMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBnZXRBdmFpbGFibGVEaXNjb250aWd1b3VzQ2h1bmtzKCkgewotICAgIHJldHVybiB0b3RhbEF2YWlsYWJsZURpc2NvbnRpZ3VvdXNDaHVua3M7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgY2xpZW50cyBjb250ZW5kaW5nIGZvciBjaHVua3MuICAgVGhpcwotICAgKiBpcyB1c2VmdWwgd2hlbiBlc3RhYmxpc2hpbmcgY29uc2VydmF0aXZlIGJvdW5kcyBvbiB0aGUgbnVtYmVyCi0gICAqIG9mIHJlbWFpbmluZyBjaHVua3MuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIHRvdGFsIG51bWJlciBvZiBjbGllbnRzIHdobyBtYXkgY29udGVuZCBmb3IgY2h1bmtzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Q2h1bmtDb25zdW1lckNvdW50KCkgewotICAgIHJldHVybiBzaGFyZWREaXNjb250aWdGTENvdW50OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgc3BhY2UgaW4gd2hpY2ggdGhpcyBhZGRyZXNzIHJlc2lkZXMuCi0gICAqCi0gICAqIEBwYXJhbSBhZGRyZXNzIFRoZSBhZGRyZXNzIGluIHF1ZXN0aW9uCi0gICAqIEByZXR1cm4gVGhlIHNwYWNlIGluIHdoaWNoIHRoZSBhZGRyZXNzIHJlc2lkZXMKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyBTcGFjZSBnZXRTcGFjZUZvckFkZHJlc3MoQWRkcmVzcyBhZGRyZXNzKSB7Ci0gICAgaW50IGluZGV4ID0gZ2V0Q2h1bmtJbmRleChhZGRyZXNzKTsKLSAgICByZXR1cm4gc3BhY2VNYXBbaW5kZXhdOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgc3BhY2UgZGVzY3JpcHRvciBmb3IgdGhlIHNwYWNlIGluIHdoaWNoIHRoaXMgb2JqZWN0Ci0gICAqIHJlc2lkZXMuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCBpbiBxdWVzdGlvbgotICAgKiBAcmV0dXJuIFRoZSBzcGFjZSBkZXNjcmlwdG9yIGZvciB0aGUgc3BhY2UgaW4gd2hpY2ggdGhlIG9iamVjdAotICAgKiByZXNpZGVzCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBzdGF0aWMgaW50IGdldERlc2NyaXB0b3JGb3JBZGRyZXNzKEFkZHJlc3Mgb2JqZWN0KSB7Ci0gICAgaW50IGluZGV4ID0gZ2V0Q2h1bmtJbmRleChvYmplY3QpOwotICAgIHJldHVybiBkZXNjcmlwdG9yTWFwW2luZGV4XTsKLSAgfQotCi0gIC8qKgotICAgKiBIYXNoIGFuIGFkZHJlc3MgdG8gYSBjaHVuayAodGhpcyBpcyBzaW1wbHkgZG9uZSB2aWEgYml0IHNoaWZ0aW5nKQotICAgKgotICAgKiBAcGFyYW0gYWRkcmVzcyBUaGUgYWRkcmVzcyB0byBiZSBoYXNoZWQKLSAgICogQHJldHVybiBUaGUgY2h1bmsgbnVtYmVyIHRoYXQgdGhpcyBhZGRyZXNzIGhhc2hlcyBpbnRvCi0gICAqLwotICBASW5saW5lCi0gIHByaXZhdGUgc3RhdGljIGludCBnZXRDaHVua0luZGV4KEFkZHJlc3MgYWRkcmVzcykgewotICAgIGlmIChTcGFjZS5CWVRFU19JTl9BRERSRVNTID09IDgpIHsKLSAgICAgIGlmIChhZGRyZXNzLkxUKFNwYWNlLkhFQVBfU1RBUlQpIHx8IGFkZHJlc3MuR0UoU3BhY2UuSEVBUF9FTkQpKQotICAgICAgICByZXR1cm4gMDsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIGFkZHJlc3MuZGlmZihNQVBfQkFTRV9BRERSRVNTKS50b1dvcmQoKS5yc2hsKFNwYWNlLkxPR19CWVRFU19JTl9DSFVOSykudG9JbnQoKTsKLSAgICB9IGVsc2UKLSAgICAgIHJldHVybiBhZGRyZXNzLnRvV29yZCgpLnJzaGwoU3BhY2UuTE9HX0JZVEVTX0lOX0NIVU5LKS50b0ludCgpOwotICB9Ci0gIEBJbmxpbmUKLSAgcHJpdmF0ZSBzdGF0aWMgQWRkcmVzcyBhZGRyZXNzRm9yQ2h1bmtJbmRleChpbnQgY2h1bmspIHsKLSAgICBpZiAoU3BhY2UuQllURVNfSU5fQUREUkVTUyA9PSA4KSB7Ci0gICAgICBpZiAoY2h1bmsgPT0gMCkKLSAgICAgICAgcmV0dXJuIEFkZHJlc3MuemVybygpOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gTUFQX0JBU0VfQUREUkVTUy5wbHVzKFdvcmQuZnJvbUludFplcm9FeHRlbmQoY2h1bmspLmxzaChTcGFjZS5MT0dfQllURVNfSU5fQ0hVTkspLnRvRXh0ZW50KCkpOwotICAgIH0gZWxzZQotICAgICAgcmV0dXJuIFdvcmQuZnJvbUludFplcm9FeHRlbmQoY2h1bmspLmxzaChTcGFjZS5MT0dfQllURVNfSU5fQ0hVTkspLnRvQWRkcmVzcygpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvaGVhcC9NbWFwcGVyLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvaGVhcC9NbWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzODMwZTYuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2hlYXAvTW1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5LmhlYXA7Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lio7Ci0KLWltcG9ydCBvcmcubW10ay52bS5Mb2NrOwotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBtbWFwcGluZyBhbmQgcHJvdGVjdGlvbiBvZiB2aXJ0dWFsIG1lbW9yeS4KLSAqLwotQFVuaW50ZXJydXB0aWJsZSBwdWJsaWMgZmluYWwgY2xhc3MgTW1hcHBlciBpbXBsZW1lbnRzIENvbnN0YW50cyB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogQ29uc3RhbnRzCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgVU5NQVBQRUQgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTUFQUEVEID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFBST1RFQ1RFRCA9IDI7IC8vIG1hcHBlZCBidXQgbm90IGFjY2Vzc2libGUKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9HX01NQVBfQ0hVTktfQllURVMgPSAyMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU1BUF9DSFVOS19CWVRFUyA9IDEgPDwgTE9HX01NQVBfQ0hVTktfQllURVM7ICAgLy8gdGhlIGdyYW51bGFyaXR5IFZNUmVzb3VyY2Ugb3BlcmF0ZXMgYXQKLSAgLy9UT0RPOiA2NC1iaXQ6IHRoaXMgaXMgbm90IE9LOiB2YWx1ZSBkb2VzIG5vdCBmaXQgaW4gaW50LCBidXQgc2hvdWxkLCB3ZSBkbyBub3Qgd2FudCB0byBjcmVhdGUgc3VjaCBiaWcgYXJyYXkKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1NQVBfQ0hVTktfTUFTSyA9IE1NQVBfQ0hVTktfQllURVMgLSAxOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU1BUF9OVU1fQ0hVTktTID0gMSA8PCAoQ29uc3RhbnRzLkxPR19CWVRFU19JTl9BRERSRVNTX1NQQUNFIC0gTE9HX01NQVBfQ0hVTktfQllURVMpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIENsYXNzIHZhcmlhYmxlcwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBMb2NrIGxvY2sgPSBWTS5uZXdMb2NrKCJNbWFwcGVyIik7Ci0gIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBtYXBwZWQ7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBJbml0aWFsaXphdGlvbgotICAgKi8KLQotICAvKioKLSAgICogQ2xhc3MgaW5pdGlhbGl6ZXIuICBUaGlzIGlzIGV4ZWN1dGVkIDxpPnByaW9yPC9pPiB0byBib290c3RyYXAKLSAgICogKGkuZS4gYXQgImJ1aWxkIiB0aW1lKS4KLSAgICovCi0gIHN0YXRpYyB7Ci0gICAgbWFwcGVkID0gbmV3IGJ5dGVbTU1BUF9OVU1fQ0hVTktTXTsKLSAgICBmb3IgKGludCBjID0gMDsgYyA8IE1NQVBfTlVNX0NIVU5LUzsgYysrKSB7Ci0gICAgICBtYXBwZWRbY10gPSBVTk1BUFBFRDsKLSAgICB9Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBHZW5lcmljIG1tYXAgYW5kIHByb3RlY3Rpb24gZnVuY3Rpb25hbGl0eQotICAgKi8KLQotICAvKioKLSAgICogR2l2ZW4gYW4gYWRkcmVzcyBhcnJheSBkZXNjcmliaW5nIHRoZSByZWdpb25zIG9mIHZpcnR1YWwgbWVtb3J5IHRvIGJlIHVzZWQKLSAgICogYnkgTU1UaywgZGVtYW5kIHplcm8gbWFwIGFsbCBvZiB0aGVtIGlmIHRoZXkgYXJlIG5vdCBhbHJlYWR5IG1hcHBlZC4KLSAgICoKLSAgICogQHBhcmFtIHNwYWNlTWFwIEFuIGFkZHJlc3MgYXJyYXkgY29udGFpbmluZyBhIHBhaXJzIG9mIHN0YXJ0IGFuZCBlbmQKLSAgICogYWRkcmVzc2VzIGZvciBlYWNoIG9mIHRoZSByZWdpb25zIHRvIGJlIG1hcHBlM2QKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBlYWdlcmx5TW1hcEFsbFNwYWNlcyhBZGRyZXNzQXJyYXkgc3BhY2VNYXApIHsKLQotICAgIC8qZm9yIChpbnQgaSA9IDA7IGkgPCBzcGFjZU1hcC5sZW5ndGgoKSAvIDI7IGkrKykgewotICAgICAgQWRkcmVzcyByZWdpb25TdGFydCA9IHNwYWNlTWFwLmdldChpICogMik7Ci0gICAgICBBZGRyZXNzIHJlZ2lvbkVuZCA9IHNwYWNlTWFwLmdldChpICogMiArIDEpOwotICAgICAgTG9nLndyaXRlKHJlZ2lvblN0YXJ0KTsgTG9nLndyaXRlKCIgIik7IExvZy53cml0ZWxuKHJlZ2lvbkVuZCk7Ci0gICAgICBpZiAocmVnaW9uRW5kLkVRKEFkZHJlc3MuemVybygpKSB8fCByZWdpb25TdGFydC5FUShBZGRyZXNzLmZyb21JbnRTaWduRXh0ZW5kKC0xKSkgfHxyZWdpb25FbmQuRVEoQWRkcmVzcy5mcm9tSW50U2lnbkV4dGVuZCgtMSkpKQotICAgICAgICAgIGJyZWFrOwotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSB7Ci0gICAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChyZWdpb25TdGFydC5FUShjaHVua0FsaWduRG93bihyZWdpb25TdGFydCkpKTsKLSAgICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KHJlZ2lvbkVuZC5FUShjaHVua0FsaWduRG93bihyZWdpb25FbmQpKSk7Ci0gICAgICB9Ci0gICAgICBpbnQgcGFnZXMgPSBDb252ZXJzaW9ucy5ieXRlc1RvUGFnZXMocmVnaW9uRW5kLmRpZmYocmVnaW9uU3RhcnQpKTsKLSAgICAgIGVuc3VyZU1hcHBlZChyZWdpb25TdGFydCwgcGFnZXMpOwotICAgIH0qLwotICB9Ci0KLSAgLyoqCi0gICAqICBNYXJrIGEgcmFuZ2Ugb2YgcGFnZXMgYXMgaGF2aW5nIChhbHJlYWR5KSBiZWVuIG1hcHBlZC4gIFRoaXMgaXMgdXNlZnVsCi0gICAqICB3aGVyZSB0aGUgVk0gaGFzIHBlcmZvcm1lZCB0aGUgbWFwcGluZyBvZiB0aGUgcGFnZXMgaXRzZWxmLgotICAgKgotICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByYW5nZSB0byBiZSBtYXJrZWQgYXMgbWFwcGVkCi0gICAqIEBwYXJhbSBieXRlcyBUaGUgc2l6ZSBvZiB0aGUgcmFuZ2UsIGluIGJ5dGVzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1hcmtBc01hcHBlZChBZGRyZXNzIHN0YXJ0LCBpbnQgYnl0ZXMpIHsKLSAgICBpbnQgc3RhcnRDaHVuayA9IENvbnZlcnNpb25zLmFkZHJlc3NUb01tYXBDaHVua3NEb3duKHN0YXJ0KTsKLSAgICBpbnQgZW5kQ2h1bmsgPSBDb252ZXJzaW9ucy5hZGRyZXNzVG9NbWFwQ2h1bmtzVXAoc3RhcnQucGx1cyhieXRlcykpOwotICAgIGZvciAoaW50IGkgPSBzdGFydENodW5rOyBpIDw9IGVuZENodW5rOyBpKyspCi0gICAgICBtYXBwZWRbaV0gPSBNQVBQRUQ7Ci0gIH0KLQotICAvKioKLSAgICogRW5zdXJlIHRoYXQgYSByYW5nZSBvZiBwYWdlcyBpcyBtbWFwcGVkIChvciBlcXVpdmFsZW50KS4gIElmIHRoZQotICAgKiBwYWdlcyBhcmUgbm90IHlldCBtYXBwZWQsIGRlbWFuZC16ZXJvIG1hcCB0aGVtLiBOb3RlIHRoYXQgbWFwcGluZwotICAgKiBvY2N1cnMgYXQgY2h1bmsgZ3JhbnVsYXJpdHksIG5vdCBwYWdlIGdyYW51bGFyaXR5LjxwPgotICAgKgotICAgKiBOT1RFOiBUaGVyZSBpcyBhIG1vbm90b25pY2l0eSBhc3N1bXB0aW9uIHNvIHRoYXQgb25seSB1cGRhdGVzIHJlcXVpcmUgbG9jawotICAgKiBhY3F1aXNpdGlvbi4KLSAgICogVE9ETzogRml4IHRoZSBhYm92ZSB0byBzdXBwb3J0IHVubWFwcGluZy4KLSAgICoKLSAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UgdG8gYmUgbWFwcGVkLgotICAgKiBAcGFyYW0gcGFnZXMgVGhlIHNpemUgb2YgdGhlIHJhbmdlIHRvIGJlIG1hcHBlZCwgaW4gcGFnZXMKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBlbnN1cmVNYXBwZWQoQWRkcmVzcyBzdGFydCwgaW50IHBhZ2VzKSB7Ci0gICAgaW50IHN0YXJ0Q2h1bmsgPSBDb252ZXJzaW9ucy5hZGRyZXNzVG9NbWFwQ2h1bmtzRG93bihzdGFydCk7Ci0gICAgaW50IGVuZENodW5rID0gQ29udmVyc2lvbnMuYWRkcmVzc1RvTW1hcENodW5rc1VwKHN0YXJ0LnBsdXMoQ29udmVyc2lvbnMucGFnZXNUb0J5dGVzKHBhZ2VzKSkpOwotICAgIGZvciAoaW50IGNodW5rID0gc3RhcnRDaHVuazsgY2h1bmsgPCBlbmRDaHVuazsgY2h1bmsrKykgewotICAgICAgaWYgKG1hcHBlZFtjaHVua10gPT0gTUFQUEVEKSBjb250aW51ZTsKLSAgICAgIEFkZHJlc3MgbW1hcFN0YXJ0ID0gQ29udmVyc2lvbnMubW1hcENodW5rc1RvQWRkcmVzcyhjaHVuayk7Ci0gICAgICBsb2NrLmFjcXVpcmUoKTsKLS8vICAgICAgTG9nLndyaXRlbG4obW1hcFN0YXJ0KTsKLSAgICAgIC8vIG1pZ2h0IGhhdmUgYmVjb21lIE1BUFBFRCBoZXJlCi0gICAgICBpZiAobWFwcGVkW2NodW5rXSA9PSBVTk1BUFBFRCkgewotICAgICAgICBpbnQgZXJybm8gPSBWTS5tZW1vcnkuZHptbWFwKG1tYXBTdGFydCwgTU1BUF9DSFVOS19CWVRFUyk7Ci0gICAgICAgIGlmIChlcnJubyAhPSAwKSB7Ci0gICAgICAgICAgbG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgTG9nLndyaXRlKCJlbnN1cmVNYXBwZWQgZmFpbGVkIHdpdGggZXJybm8gIik7IExvZy53cml0ZShlcnJubyk7Ci0gICAgICAgICAgTG9nLndyaXRlKCIgb24gYWRkcmVzcyAiKTsgTG9nLndyaXRlbG4obW1hcFN0YXJ0KTsKLSAgICAgICAgICBWTS5hc3NlcnRpb25zLmZhaWwoIkNhbid0IGdldCBtb3JlIHNwYWNlIHdpdGggbW1hcCgpIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgICAgICAgIExvZy53cml0ZSgibW1hcCBzdWNjZWVkZWQgYXQgY2h1bmsgIik7IExvZy53cml0ZShjaHVuayk7ICBMb2cud3JpdGUoIiAgIik7IExvZy53cml0ZShtbWFwU3RhcnQpOwotICAgICAgICAgICAgTG9nLndyaXRlKCIgd2l0aCBsZW4gPSAiKTsgTG9nLndyaXRlbG4oTU1BUF9DSFVOS19CWVRFUyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobWFwcGVkW2NodW5rXSA9PSBQUk9URUNURUQpIHsKLSAgICAgICAgaWYgKCFWTS5tZW1vcnkubXVucHJvdGVjdChtbWFwU3RhcnQsIE1NQVBfQ0hVTktfQllURVMpKSB7Ci0gICAgICAgICAgbG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgVk0uYXNzZXJ0aW9ucy5mYWlsKCJNbWFwcGVyLmVuc3VyZU1hcHBlZCAodW5wcm90ZWN0KSBmYWlsZWQiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAodmVyYm9zZSkgewotICAgICAgICAgICAgTG9nLndyaXRlKCJtdW5wcm90ZWN0IHN1Y2NlZWRlZCBhdCBjaHVuayAiKTsgTG9nLndyaXRlKGNodW5rKTsgIExvZy53cml0ZSgiICAiKTsgTG9nLndyaXRlKG1tYXBTdGFydCk7Ci0gICAgICAgICAgICBMb2cud3JpdGUoIiB3aXRoIGxlbiA9ICIpOyBMb2cud3JpdGVsbihNTUFQX0NIVU5LX0JZVEVTKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIG1hcHBlZFtjaHVua10gPSBNQVBQRUQ7Ci0gICAgICBsb2NrLnJlbGVhc2UoKTsKLSAgICB9Ci0KLSAgfQotCi0gIC8qKgotICAgKiBNZW1vcnkgcHJvdGVjdCBhIHJhbmdlIG9mIHBhZ2VzICh1c2luZyBtcHJvdGVjdCBvciBlcXVpdmFsZW50KS4gIE5vdGUKLSAgICogdGhhdCBwcm90ZWN0aW9uIG9jY3VycyBhdCBjaHVuayBncmFudWxhcml0eSwgbm90IHBhZ2UgZ3JhbnVsYXJpdHkuCi0gICAqCi0gICAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlIHRvIGJlIHByb3RlY3RlZC4KLSAgICogQHBhcmFtIHBhZ2VzIFRoZSBzaXplIG9mIHRoZSByYW5nZSB0byBiZSBwcm90ZWN0ZWQsIGluIHBhZ2VzCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgcHJvdGVjdChBZGRyZXNzIHN0YXJ0LCBpbnQgcGFnZXMpIHsKLSAgICBpbnQgc3RhcnRDaHVuayA9IENvbnZlcnNpb25zLmFkZHJlc3NUb01tYXBDaHVua3NEb3duKHN0YXJ0KTsKLSAgICBpbnQgY2h1bmtzID0gQ29udmVyc2lvbnMucGFnZXNUb01tYXBDaHVua3NVcChwYWdlcyk7Ci0gICAgaW50IGVuZENodW5rID0gc3RhcnRDaHVuayArIGNodW5rczsKLSAgICBsb2NrLmFjcXVpcmUoKTsKLSAgICBmb3IgKGludCBjaHVuayA9IHN0YXJ0Q2h1bms7IGNodW5rIDwgZW5kQ2h1bms7IGNodW5rKyspIHsKLSAgICAgIGlmIChtYXBwZWRbY2h1bmtdID09IE1BUFBFRCkgewotICAgICAgICBBZGRyZXNzIG1tYXBTdGFydCA9IENvbnZlcnNpb25zLm1tYXBDaHVua3NUb0FkZHJlc3MoY2h1bmspOwotICAgICAgICBpZiAoIVZNLm1lbW9yeS5tcHJvdGVjdChtbWFwU3RhcnQsIE1NQVBfQ0hVTktfQllURVMpKSB7Ci0gICAgICAgICAgbG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgVk0uYXNzZXJ0aW9ucy5mYWlsKCJNbWFwcGVyLm1wcm90ZWN0IGZhaWxlZCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmICh2ZXJib3NlKSB7Ci0gICAgICAgICAgICBMb2cud3JpdGUoIm1wcm90ZWN0IHN1Y2NlZWRlZCBhdCBjaHVuayAiKTsgTG9nLndyaXRlKGNodW5rKTsgIExvZy53cml0ZSgiICAiKTsgTG9nLndyaXRlKG1tYXBTdGFydCk7Ci0gICAgICAgICAgICBMb2cud3JpdGUoIiB3aXRoIGxlbiA9ICIpOyBMb2cud3JpdGVsbihNTUFQX0NIVU5LX0JZVEVTKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbWFwcGVkW2NodW5rXSA9IFBST1RFQ1RFRDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KG1hcHBlZFtjaHVua10gPT0gUFJPVEVDVEVEKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgbG9jay5yZWxlYXNlKCk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBVdGlsaXR5IGZ1bmN0aW9ucwotICAgKi8KLQotICAvKioKLSAgICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGFkZHJlc3MgaGFzIGJlZW4gbW1hcHBlZAotICAgKgotICAgKiBAcGFyYW0gYWRkciBUaGUgYWRkcmVzcyBpbiBxdWVzdGlvbi4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBhZGRyZXNzIGhhcyBiZWVuIG1tYXBwZWQKLSAgICovCi0gIEBVbmludGVycnVwdGlibGUKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGFkZHJlc3NJc01hcHBlZChBZGRyZXNzIGFkZHIpIHsKLSAgICBpbnQgY2h1bmsgPSBDb252ZXJzaW9ucy5hZGRyZXNzVG9NbWFwQ2h1bmtzRG93bihhZGRyKTsKLSAgICByZXR1cm4gbWFwcGVkW2NodW5rXSA9PSBNQVBQRUQ7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIG9iamVjdCBoYXMgYmVlbiBtbWFwcGVkCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCBpbiBxdWVzdGlvbi4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBvYmplY3QgaGFzIGJlZW4gbW1hcHBlZAotICAgKi8KLSAgQFVuaW50ZXJydXB0aWJsZQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gb2JqZWN0SXNNYXBwZWQoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIHJldHVybiBhZGRyZXNzSXNNYXBwZWQoVk0ub2JqZWN0TW9kZWwucmVmVG9BZGRyZXNzKG9iamVjdCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIGdpdmVuIGFkZHJlc3Mgcm91bmRlZCB1cCB0byBhbiBtbWFwIGNodW5rIHNpemUKLSAgICoKLSAgICogQHBhcmFtIGFkZHIgVGhlIGFkZHJlc3MgdG8gYmUgYWxpZ25lZAotICAgKiBAcmV0dXJuIFRoZSBnaXZlbiBhZGRyZXNzIHJvdW5kZWQgdXAgdG8gYW4gbW1hcCBjaHVuayBzaXplCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgIC8vIGJ1dCBtaWdodCBiZSB1c2VmdWwgc29tZWRheQotICBwcml2YXRlIHN0YXRpYyBBZGRyZXNzIGNodW5rQWxpZ25VcChBZGRyZXNzIGFkZHIpIHsKLSAgICByZXR1cm4gY2h1bmtBbGlnbkRvd24oYWRkci5wbHVzKE1NQVBfQ0hVTktfTUFTSykpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIGdpdmVuIGFkZHJlc3Mgcm91bmRlZCBkb3duIHRvIGFuIG1tYXAgY2h1bmsgc2l6ZQotICAgKgotICAgKiBAcGFyYW0gYWRkciBUaGUgYWRkcmVzcyB0byBiZSBhbGlnbmVkCi0gICAqIEByZXR1cm4gVGhlIGdpdmVuIGFkZHJlc3Mgcm91bmRlZCBkb3duIHRvIGFuIG1tYXAgY2h1bmsgc2l6ZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgQWRkcmVzcyBjaHVua0FsaWduRG93bihBZGRyZXNzIGFkZHIpIHsKLSAgICByZXR1cm4gYWRkci50b1dvcmQoKS5hbmQoV29yZC5mcm9tSW50U2lnbkV4dGVuZChNTUFQX0NIVU5LX01BU0spLm5vdCgpKS50b0FkZHJlc3MoKTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvaGVhcC9Nb25vdG9uZVBhZ2VSZXNvdXJjZS5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2hlYXAvTW9ub3RvbmVQYWdlUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZkMDZhMC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvaGVhcC9Nb25vdG9uZVBhZ2VSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5LmhlYXA7Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmFsbG9jLkVtYmVkZGVkTWV0YURhdGE7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5vcHRpb25zLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLm1tdGsucG9saWN5LlNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuQ29udmVyc2lvbnM7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Db25zdGFudHM7Ci0KLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIG1hbmFnZXMgdGhlIGFsbG9jYXRpb24gb2YgcGFnZXMgZm9yIGEgc3BhY2UuICBXaGVuIGEKLSAqIHBhZ2UgaXMgcmVxdWVzdGVkIGJ5IHRoZSBzcGFjZSBib3RoIGEgcGFnZSBidWRnZXQgYW5kIHRoZSB1c2Ugb2YKLSAqIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSBhcmUgY2hlY2tlZC4gIElmIHRoZSByZXF1ZXN0IGZvciBzcGFjZSBjYW4ndAotICogYmUgc2F0aXNmaWVkIChmb3IgZWl0aGVyIHJlYXNvbikgYSBHQyBtYXkgYmUgdHJpZ2dlcmVkLjxwPgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgZmluYWwgY2xhc3MgTW9ub3RvbmVQYWdlUmVzb3VyY2UgZXh0ZW5kcyBQYWdlUmVzb3VyY2UKLSAgaW1wbGVtZW50cyBDb25zdGFudHMgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluc3RhbmNlIHZhcmlhYmxlcwotICAgKi8KLSAgcHJpdmF0ZSBBZGRyZXNzIGN1cnNvcjsKLSAgcHJpdmF0ZSBBZGRyZXNzIHNlbnRpbmVsOwotICBwcml2YXRlIGZpbmFsIGludCBtZXRhRGF0YVBhZ2VzUGVyUmVnaW9uOwotICBwcml2YXRlIEFkZHJlc3MgY3VycmVudENodW5rID0gQWRkcmVzcy56ZXJvKCk7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqCi0gICAqIENvbnRpZ3VvdXMgbW9ub3RvbmUgcmVzb3VyY2UuIFRoZSBhZGRyZXNzIHJhbmdlIGlzIHByZS1kZWZpbmVkIGF0Ci0gICAqIGluaXRpYWxpemF0aW9uIHRpbWUgYW5kIGlzIGltbXV0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhZ2VCdWRnZXQgVGhlIGJ1ZGdldCBvZiBwYWdlcyBhdmFpbGFibGUgdG8gdGhpcyBtZW1vcnkKLSAgICogbWFuYWdlciBiZWZvcmUgaXQgbXVzdCBwb2xsIHRoZSBjb2xsZWN0b3IuCi0gICAqIEBwYXJhbSBzcGFjZSBUaGUgc3BhY2UgdG8gd2hpY2ggdGhpcyByZXNvdXJjZSBpcyBhdHRhY2hlZAotICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSBhZGRyZXNzIHJhbmdlIGFsbG9jYXRlZCB0byB0aGlzIHJlc291cmNlCi0gICAqIEBwYXJhbSBieXRlcyBUaGUgc2l6ZSBvZiB0aGUgYWRkcmVzcyByYWdlIGFsbG9jYXRlZCB0byB0aGlzIHJlc291cmNlCi0gICAqIEBwYXJhbSBtZXRhRGF0YVBhZ2VzUGVyUmVnaW9uIFRoZSBudW1iZXIgb2YgcGFnZXMgb2YgbWV0YSBkYXRhCi0gICAqIHRoYXQgYXJlIGVtYmVkZGVkIGluIGVhY2ggcmVnaW9uLgotICAgKi8KLSAgcHVibGljIE1vbm90b25lUGFnZVJlc291cmNlKGludCBwYWdlQnVkZ2V0LCBTcGFjZSBzcGFjZSwgQWRkcmVzcyBzdGFydCwKLSAgICAgIEV4dGVudCBieXRlcywgaW50IG1ldGFEYXRhUGFnZXNQZXJSZWdpb24pIHsKLSAgICBzdXBlcihwYWdlQnVkZ2V0LCBzcGFjZSwgc3RhcnQpOwotICAgIHRoaXMuY3Vyc29yID0gc3RhcnQ7Ci0gICAgdGhpcy5zZW50aW5lbCA9IHN0YXJ0LnBsdXMoYnl0ZXMpOwotICAgIHRoaXMubWV0YURhdGFQYWdlc1BlclJlZ2lvbiA9IG1ldGFEYXRhUGFnZXNQZXJSZWdpb247Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICoKLSAgICogRGlzY29udGlndW91cyBtb25vdG9uZSByZXNvdXJjZS4gVGhlIGFkZHJlc3MgcmFuZ2UgaXMgPGk+bm90PC9pPgotICAgKiBwcmUtZGVmaW5lZCBhdCBpbml0aWFsaXphdGlvbiB0aW1lIGFuZCBpcyBkeW5hbWljYWxseSBkZWZpbmVkIHRvCi0gICAqIGJlIHNvbWUgc2V0IG9mIHBhZ2VzLCBhY2NvcmRpbmcgdG8gZGVtYW5kIGFuZCBhdmFpbGFiaWxpdHkuCi0gICAqCi0gICAqIENVUlJFTlRMWSBVTklNUExFTUVOVEVECi0gICAqCi0gICAqIEBwYXJhbSBwYWdlQnVkZ2V0IFRoZSBidWRnZXQgb2YgcGFnZXMgYXZhaWxhYmxlIHRvIHRoaXMgbWVtb3J5Ci0gICAqIG1hbmFnZXIgYmVmb3JlIGl0IG11c3QgcG9sbCB0aGUgY29sbGVjdG9yLgotICAgKiBAcGFyYW0gc3BhY2UgVGhlIHNwYWNlIHRvIHdoaWNoIHRoaXMgcmVzb3VyY2UgaXMgYXR0YWNoZWQKLSAgICogQHBhcmFtIG1ldGFEYXRhUGFnZXNQZXJSZWdpb24gVGhlIG51bWJlciBvZiBwYWdlcyBvZiBtZXRhIGRhdGEKLSAgICogdGhhdCBhcmUgZW1iZWRkZWQgaW4gZWFjaCByZWdpb24uCi0gICAqLwotICBwdWJsaWMgTW9ub3RvbmVQYWdlUmVzb3VyY2UoaW50IHBhZ2VCdWRnZXQsIFNwYWNlIHNwYWNlLCBpbnQgbWV0YURhdGFQYWdlc1BlclJlZ2lvbikgewotICAgIHN1cGVyKHBhZ2VCdWRnZXQsIHNwYWNlKTsKLSAgICAvKiB1bmltcGxlbWVudGVkICovCi0gICAgdGhpcy5zdGFydCA9IEFkZHJlc3MuemVybygpOwotICAgIHRoaXMuY3Vyc29yID0gQWRkcmVzcy56ZXJvKCk7Ci0gICAgdGhpcy5zZW50aW5lbCA9IEFkZHJlc3MuemVybygpOwotICAgIHRoaXMubWV0YURhdGFQYWdlc1BlclJlZ2lvbiA9IG1ldGFEYXRhUGFnZXNQZXJSZWdpb247Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHBoeXNpY2FsIHBhZ2VzIGZvciB0aGlzIHJlc291cmNlLgotICAgKiBUaGlzIGluY2x1ZGVzIGFsbCBwYWdlcyBjdXJyZW50bHkgdW51c2VkIGJ5IHRoaXMgcmVzb3VyY2UncyBwYWdlCi0gICAqIGN1cnNvci4gSWYgdGhlIHJlc291cmNlIGlzIHVzaW5nIGRpc2NvbnRpZ3VvdXMgc3BhY2UgaXQgYWxzbyBpbmNsdWRlcwotICAgKiBjdXJyZW50bHkgdW5hc3NpZ25lZCBkaXNjb250aWd1b3VzIHNwYWNlLjxwPgotICAgKgotICAgKiBOb3RlOiBUaGlzIGp1c3QgY29uc2lkZXJzIHBoeXNpY2FsIHBhZ2VzIChpZSB2aXJ0dWFsIG1lbW9yeSBwYWdlcwotICAgKiBhbGxvY2F0ZWQgZm9yIHVzZSBieSB0aGlzIHJlc291cmNlKS4gVGhpcyBjYWxjdWxhdGlvbiBpcyBvcnRob2dvbmFsCi0gICAqIHRvIGFuZCBkb2VzIG5vdCBjb25zaWRlciBhbnkgcmVzdHJpY3Rpb25zIG9uIHRoZSBudW1iZXIgb2YgcGFnZXMKLSAgICogdGhpcyByZXNvdXJjZSBtYXkgYWN0dWFsbHkgdXNlIGF0IGFueSB0aW1lIChpZSB0aGUgbnVtYmVyIG9mCi0gICAqIGNvbW1pdHRlZCBhbmQgcmVzZXJ2ZWQgcGFnZXMpLjxwPgotICAgKgotICAgKiBOb3RlOiBUaGUgY2FsY3VsYXRpb24gaXMgbWFkZSBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGFsbCBzcGFjZSB0aGF0Ci0gICAqIGNvdWxkIGJlIGFzc2lnbmVkIHRvIHRoaXMgcmVzb3VyY2Ugd291bGQgYmUgYXNzaWduZWQgdG8gdGhpcyByZXNvdXJjZQotICAgKiAoaWUgdGhlIHVudXNlZCBkaXNjb250aWd1b3VzIHNwYWNlIGNvdWxkIGp1c3QgYXMgbGlrZWx5IGJlIGFzc2lnbmVkCi0gICAqIHRvIGFub3RoZXIgY29tcGV0aW5nIHJlc291cmNlKS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBwaHlzaWNhbCBwYWdlcyBmb3IgdGhpcyByZXNvdXJjZS4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IGdldEF2YWlsYWJsZVBoeXNpY2FsUGFnZXMoKSB7Ci0gICAgaW50IHJ0biA9IENvbnZlcnNpb25zLmJ5dGVzVG9QYWdlcyhzZW50aW5lbC5kaWZmKGN1cnNvcikpOwotICAgIGlmICghY29udGlndW91cykKLSAgICAgIHJ0biArPSBNYXAuZ2V0QXZhaWxhYmxlRGlzY29udGlndW91c0NodW5rcygpKlNwYWNlLlBBR0VTX0lOX0NIVU5LOwotICAgIHJldHVybiBydG47Ci0gIH0KLQotICAvKioKLSAgICogQWxsb2NhdGUgPGNvZGU+cGFnZXM8L2NvZGU+IHBhZ2VzIGZyb20gdGhpcyByZXNvdXJjZS4gIFNpbXBseQotICAgKiBidW1wIHRoZSBjdXJzb3IsIGFuZCBmYWlsIGlmIHdlIGhpdCB0aGUgc2VudGluZWwuPHA+Ci0gICAqCi0gICAqIElmIHRoZSByZXF1ZXN0IGNhbiBiZSBzYXRpc2ZpZWQsIHRoZW4gZW5zdXJlIHRoZSBwYWdlcyBhcmUKLSAgICogbW1wYXBwZWQgYW5kIHplcm9lZCBiZWZvcmUgcmV0dXJuaW5nIHRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZgotICAgKiB0aGUgcmVnaW9uLiAgSWYgdGhlIHJlcXVlc3QgY2Fubm90IGJlIHNhdGlzZmllZCwgcmV0dXJuIHplcm8uCi0gICAqCi0gICAqIEBwYXJhbSByZXF1ZXN0UGFnZXMgVGhlIG51bWJlciBvZiBwYWdlcyB0byBiZSBhbGxvY2F0ZWQuCi0gICAqIEByZXR1cm4gVGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCBwYWdlIGlmIHN1Y2Nlc3NmdWwsIHplcm8gb24KLSAgICogZmFpbHVyZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHJvdGVjdGVkIEFkZHJlc3MgYWxsb2NQYWdlcyhpbnQgcmVxdWVzdFBhZ2VzKSB7Ci0gICAgaW50IHBhZ2VzID0gcmVxdWVzdFBhZ2VzOwotICAgIGJvb2xlYW4gbmV3Q2h1bmsgPSBmYWxzZTsKLSAgICBsb2NrKCk7Ci0gICAgQWRkcmVzcyBydG4gPSBjdXJzb3I7Ci0gICAgaWYgKFNwYWNlLmNodW5rQWxpZ24ocnRuLCB0cnVlKS5ORShjdXJyZW50Q2h1bmspKSB7Ci0gICAgICBuZXdDaHVuayA9IHRydWU7Ci0gICAgICBjdXJyZW50Q2h1bmsgPSBTcGFjZS5jaHVua0FsaWduKHJ0biwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgaWYgKG1ldGFEYXRhUGFnZXNQZXJSZWdpb24gIT0gMCkgewotICAgICAgLyogYWRqdXN0IGFsbG9jYXRpb24gZm9yIG1ldGFkYXRhICovCi0gICAgICBBZGRyZXNzIHJlZ2lvblN0YXJ0ID0gZ2V0UmVnaW9uU3RhcnQoY3Vyc29yLnBsdXMoQ29udmVyc2lvbnMucGFnZXNUb0J5dGVzKHBhZ2VzKSkpOwotICAgICAgT2Zmc2V0IHJlZ2lvbkRlbHRhID0gcmVnaW9uU3RhcnQuZGlmZihjdXJzb3IpOwotICAgICAgaWYgKHJlZ2lvbkRlbHRhLnNHRShPZmZzZXQuemVybygpKSkgewotICAgICAgICAvKiBzdGFydCBuZXcgcmVnaW9uLCBzbyBhZGp1c3QgcGFnZXMgYW5kIHJldHVybiBhZGRyZXNzIGFjY29yZGluZ2x5ICovCi0gICAgICAgIHBhZ2VzICs9IENvbnZlcnNpb25zLmJ5dGVzVG9QYWdlcyhyZWdpb25EZWx0YSkgKyBtZXRhRGF0YVBhZ2VzUGVyUmVnaW9uOwotICAgICAgICBydG4gPSByZWdpb25TdGFydC5wbHVzKENvbnZlcnNpb25zLnBhZ2VzVG9CeXRlcyhtZXRhRGF0YVBhZ2VzUGVyUmVnaW9uKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIEV4dGVudCBieXRlcyA9IENvbnZlcnNpb25zLnBhZ2VzVG9CeXRlcyhwYWdlcyk7Ci0gICAgQWRkcmVzcyB0bXAgPSBjdXJzb3IucGx1cyhieXRlcyk7Ci0KLSAgICBpZiAoIWNvbnRpZ3VvdXMgJiYgdG1wLkdUKHNlbnRpbmVsKSkgewotICAgICAgLyogd2UncmUgb3V0IG9mIHZpcnR1YWwgbWVtb3J5IHdpdGhpbiBvdXIgZGlzY29udGlndW91cyByZWdpb24sIHNvIGFzayBmb3IgbW9yZSAqLwotICAgICAgaW50IHJlcXVpcmVkQ2h1bmtzID0gU3BhY2UucmVxdWlyZWRDaHVua3MocGFnZXMpOwotICAgICAgc3RhcnQgPSBzcGFjZS5ncm93RGlzY29udGlndW91c1NwYWNlKHJlcXVpcmVkQ2h1bmtzKTsKLSAgICAgIGN1cnNvciA9IHN0YXJ0OwotICAgICAgc2VudGluZWwgPSBjdXJzb3IucGx1cyhzdGFydC5pc1plcm8oKSA/IDAgOiByZXF1aXJlZENodW5rczw8U3BhY2UuTE9HX0JZVEVTX0lOX0NIVU5LKTsKLSAgICAgIHJ0biA9IGN1cnNvcjsKLSAgICAgIHRtcCA9IGN1cnNvci5wbHVzKGJ5dGVzKTsKLSAgICAgIG5ld0NodW5rID0gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKQotICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KHJ0bi5HRShjdXJzb3IpICYmIHJ0bi5MVChjdXJzb3IucGx1cyhieXRlcykpKTsKLSAgICBpZiAodG1wLkdUKHNlbnRpbmVsKSkgewotICAgICAgdW5sb2NrKCk7Ci0gICAgICByZXR1cm4gQWRkcmVzcy56ZXJvKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFkZHJlc3Mgb2xkID0gY3Vyc29yOwotICAgICAgY3Vyc29yID0gdG1wOwotICAgICAgY29tbWl0UGFnZXMocmVxdWVzdFBhZ2VzLCBwYWdlcyk7Ci0gICAgICBzcGFjZS5ncm93U3BhY2Uob2xkLCBieXRlcywgbmV3Q2h1bmspOwotICAgICAgdW5sb2NrKCk7Ci0gICAgICBNbWFwcGVyLmVuc3VyZU1hcHBlZChvbGQsIHBhZ2VzKTsKLSAgICAgIFZNLm1lbW9yeS56ZXJvKG9sZCwgYnl0ZXMpOwotICAgICAgVk0uZXZlbnRzLnRyYWNlUGFnZUFjcXVpcmVkKHNwYWNlLCBydG4sIHBhZ2VzKTsKLSAgICAgIHJldHVybiBydG47Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFkanVzdCBhIHBhZ2UgcmVxdWVzdCB0byBpbmNsdWRlIG1ldGFkYXRhIHJlcXVpcmVtZW50cywgaWYgYW55LjxwPgotICAgKgotICAgKiBJbiB0aGlzIGNhc2Ugd2Ugc2ltcGx5IHJlcG9ydCB0aGUgZXhwZWN0ZWQgcGFnZSBjb3N0LiBXZSBjYW4ndCB1c2UKLSAgICogd29yc3QgY2FzZSBoZXJlIGJlY2F1c2Ugd2Ugd291bGQgZXhoYXVzdCBvdXIgYnVkZ2V0IGV2ZXJ5IHRpbWUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWdlcyBUaGUgc2l6ZSBvZiB0aGUgcGVuZGluZyBhbGxvY2F0aW9uIGluIHBhZ2VzCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiByZXF1aXJlZCBwYWdlcywgaW5jbHVzaXZlIG9mIGFueSBtZXRhZGF0YQotICAgKi8KLSAgcHVibGljIGludCBhZGp1c3RGb3JNZXRhRGF0YShpbnQgcGFnZXMpIHsKLSAgICByZXR1cm4gKG1ldGFEYXRhUGFnZXNQZXJSZWdpb24gKiBwYWdlcykgLyBFbWJlZGRlZE1ldGFEYXRhLlBBR0VTX0lOX1JFR0lPTjsKLSAgIH0KLQotICAvKioKLSAgICogQWRqdXN0IGEgcGFnZSByZXF1ZXN0IHRvIGluY2x1ZGUgbWV0YWRhdGEgcmVxdWlyZW1lbnRzLCBpZiBhbnkuPHA+Ci0gICAqCi0gICAqIE5vdGUgdGhhdCB0aGVyZSBjb3VsZCBiZSBhIHJhY2UgaGVyZSwgd2l0aCBtdWx0aXBsZSB0aHJlYWRzIGVhY2gKLSAgICogYWRqdXN0aW5nIHRoZWlyIHJlcXVlc3Qgb24gYWNjb3VudCBvZiB0aGUgc2FtZSBzaW5nbGUgbWV0YWRhdGEKLSAgICogcmVnaW9uLiAgVGhpcyBzaG91bGQgbm90IGJlIGhhcm1mdWwsIGFzIHRoZSBmYWlsaW5nIHJlcXVlc3RzIHdpbGwKLSAgICoganVzdCByZXRyeSwgYW5kIGlmIG11bHRpcGxlIHJlcXVlc3RzIHN1Y2NlZWQsIG9ubHkgb25lIG9mIHRoZW0KLSAgICogd2lsbCBhY3R1YWxseSBoYXZlIHRoZSBtZXRhZGF0YSBhY2NvdW50ZWQgYWdhaW5zdCBpdCwgdGhlIG90aGVycwotICAgKiB3aWxsIHNpbXBseSBoYXZlIG1vcmUgc3BhY2UgdGhhbiB0aGV5IG9yaWdpbmFsbHkgcmVxdWVzdGVkLgotICAgKgotICAgKiBAcGFyYW0gcGFnZXMgVGhlIHNpemUgb2YgdGhlIHBlbmRpbmcgYWxsb2NhdGlvbiBpbiBwYWdlcwotICAgKiBAcGFyYW0gYmVnaW4gVGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbiBhc3NpZ25lZCB0byB0aGlzIHBlbmRpbmcKLSAgICogcmVxdWVzdAotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgcmVxdWlyZWQgcGFnZXMsIGluY2x1c2l2ZSBvZiBhbnkgbWV0YWRhdGEKLSAgICovCi0gIHB1YmxpYyBpbnQgYWRqdXN0Rm9yTWV0YURhdGEoaW50IHBhZ2VzLCBBZGRyZXNzIGJlZ2luKSB7Ci0gICAgaWYgKGdldFJlZ2lvblN0YXJ0KGJlZ2luKS5wbHVzKG1ldGFEYXRhUGFnZXNQZXJSZWdpb248PExPR19CWVRFU19JTl9QQUdFKS5FUShiZWdpbikpCi0gICAgICBwYWdlcyArPSBtZXRhRGF0YVBhZ2VzUGVyUmVnaW9uOwotICAgIHJldHVybiBwYWdlczsKLSAgIH0KLQotICBwcml2YXRlIHN0YXRpYyBBZGRyZXNzIGdldFJlZ2lvblN0YXJ0KEFkZHJlc3MgYWRkcikgewotICAgIHJldHVybiBhZGRyLnRvV29yZCgpLmFuZChXb3JkLmZyb21JbnRTaWduRXh0ZW5kKEVtYmVkZGVkTWV0YURhdGEuQllURVNfSU5fUkVHSU9OIC0gMSkubm90KCkpLnRvQWRkcmVzcygpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlc2V0IHRoaXMgcGFnZSByZXNvdXJjZSwgZnJlZWluZyBhbGwgcGFnZXMgYW5kIHJlc2V0dGluZwotICAgKiByZXNlcnZlZCBhbmQgY29tbWl0dGVkIHBhZ2VzIGFwcHJvcHJpYXRlbHkuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgIGxvY2soKTsKLSAgICByZXNlcnZlZCA9IDA7Ci0gICAgY29tbWl0dGVkID0gMDsKLSAgICByZWxlYXNlUGFnZXMoKTsKLSAgICB1bmxvY2soKTsKLSAgfQotCi0gIC8qKgotICAgKiBOb3RpZnkgdGhhdCBzZXZlcmFsIHBhZ2VzIGFyZSBubyBsb25nZXIgaW4gdXNlLgotICAgKgotICAgKiBAcGFyYW0gcGFnZXMgVGhlIG51bWJlciBvZiBwYWdlcwotICAgKi8KLSAgcHVibGljIHZvaWQgdW51c2VQYWdlcyhpbnQgcGFnZXMpIHsKLSAgICBsb2NrKCk7Ci0gICAgcmVzZXJ2ZWQgLT0gcGFnZXM7Ci0gICAgY29tbWl0dGVkIC09IHBhZ2VzOwotICAgIHVubG9jaygpOwotICB9Ci0KLSAgLyoqCi0gICAqIE5vdGlmeSB0aGF0IHByZXZpb3VzbHkgdW51c2VkIHBhZ2VzIGFyZSBpbiB1c2UgYWdhaW4uCi0gICAqCi0gICAqIEBwYXJhbSBwYWdlcyBUaGUgbnVtYmVyIG9mIHBhZ2VzCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXVzZVBhZ2VzKGludCBwYWdlcykgewotICAgIGxvY2soKTsKLSAgICByZXNlcnZlZCArPSBwYWdlczsKLSAgICBjb21taXR0ZWQgKz0gcGFnZXM7Ci0gICAgdW5sb2NrKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmVsZWFzZSBhbGwgcGFnZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFnZSByZXNvdXJjZSwgb3B0aW9uYWxseQotICAgKiB6ZXJvaW5nIG9uIHJlbGVhc2UgYW5kIG9wdGlvbmFsbHkgbWVtb3J5IHByb3RlY3Rpbmcgb24gcmVsZWFzZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHJpdmF0ZSB2b2lkIHJlbGVhc2VQYWdlcygpIHsKLSAgICBBZGRyZXNzIGZpcnN0ID0gc3RhcnQ7Ci0gICAgZG8gewotICAgICAgRXh0ZW50IGJ5dGVzID0gY3Vyc29yLmRpZmYoc3RhcnQpLnRvV29yZCgpLnRvRXh0ZW50KCk7Ci0gICAgICByZWxlYXNlUGFnZXMoc3RhcnQsIGJ5dGVzKTsKLSAgICAgIGN1cnNvciA9IHN0YXJ0OwotICAgIH0gd2hpbGUgKCFjb250aWd1b3VzICYmIG1vdmVUb05leHRDaHVuaygpKTsKLSAgICBpZiAoIWNvbnRpZ3VvdXMpIHsKLSAgICAgIHNlbnRpbmVsID0gQWRkcmVzcy56ZXJvKCk7Ci0gICAgICBNYXAuZnJlZUFsbENodW5rcyhmaXJzdCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFkanVzdCB0aGUgc3RhcnQgYW5kIGN1cnNvciBmaWVsZHMgdG8gcG9pbnQgdG8gdGhlIG5leHQgY2h1bmsKLSAgICogaW4gdGhlIGxpbmtlZCBsaXN0IG9mIGNodW5rcyB0aWVkIGRvd24gYnkgdGhpcyBwYWdlIHJlc291cmNlLgotICAgKgotICAgKiBAcmV0dXJuIFRydWUgaWYgd2UgbW92ZWQgdG8gdGhlIG5leHQgY2h1bms7IGZhbHNlIGlmIHdlIGhpdCB0aGUKLSAgICogZW5kIG9mIHRoZSBsaW5rZWQgbGlzdC4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBtb3ZlVG9OZXh0Q2h1bmsoKSB7Ci0gICAgc3RhcnQgPSBNYXAuZ2V0TmV4dENvbnRpZ3VvdXNSZWdpb24oc3RhcnQpOwotICAgIGlmIChzdGFydC5pc1plcm8oKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBlbHNlIHsKLSAgICAgIGN1cnNvciA9IHN0YXJ0LnBsdXMoTWFwLmdldENvbnRpZ3VvdXNSZWdpb25TaXplKHN0YXJ0KSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVsZWFzZSBhIHJhbmdlIG9mIHBhZ2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhZ2UgcmVzb3VyY2UsIG9wdGlvbmFsbHkKLSAgICogemVyb2luZyBvbiByZWxlYXNlIGFuZCBvcHRpb25hbGx5IG1lbW9yeSBwcm90ZWN0aW5nIG9uIHJlbGVhc2UuCi0gICAqLwotICBASW5saW5lCi0gIHByaXZhdGUgdm9pZCByZWxlYXNlUGFnZXMoQWRkcmVzcyBmaXJzdCwgRXh0ZW50IGJ5dGVzKSB7Ci0gICAgaW50IHBhZ2VzID0gQ29udmVyc2lvbnMuYnl0ZXNUb1BhZ2VzKGJ5dGVzKTsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpCi0gICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQoYnl0ZXMuRVEoQ29udmVyc2lvbnMucGFnZXNUb0J5dGVzKHBhZ2VzKSkpOwotICAgIGlmIChaRVJPX09OX1JFTEVBU0UpCi0gICAgICBWTS5tZW1vcnkuemVybyhmaXJzdCwgYnl0ZXMpOwotICAgIGlmIChPcHRpb25zLnByb3RlY3RPblJlbGVhc2UuZ2V0VmFsdWUoKSkKLSAgICAgIE1tYXBwZXIucHJvdGVjdChmaXJzdCwgcGFnZXMpOwotICAgIFZNLmV2ZW50cy50cmFjZVBhZ2VSZWxlYXNlZChzcGFjZSwgZmlyc3QsIHBhZ2VzKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2hlYXAvUGFnZVJlc291cmNlLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvaGVhcC9QYWdlUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0YTQ3Yi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvaGVhcC9QYWdlUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5oZWFwOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5QbGFuOwotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkNvbnN0YW50czsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnMuUHJvdGVjdE9uUmVsZWFzZTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnMuT3B0aW9uczsKLQotaW1wb3J0IG9yZy5tbXRrLnZtLkxvY2s7Ci1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBtYW5hZ2VzIHRoZSBhbGxvY2F0aW9uIG9mIHBhZ2VzIGZvciBhIHNwYWNlLiAgV2hlbiBhCi0gKiBwYWdlIGlzIHJlcXVlc3RlZCBieSB0aGUgc3BhY2UgYm90aCBhIHBhZ2UgYnVkZ2V0IGFuZCB0aGUgdXNlIG9mCi0gKiB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgYXJlIGNoZWNrZWQuICBJZiB0aGUgcmVxdWVzdCBmb3Igc3BhY2UgY2FuJ3QKLSAqIGJlIHNhdGlzZmllZCAoZm9yIGVpdGhlciByZWFzb24pIGEgR0MgbWF5IGJlIHRyaWdnZXJlZC48cD4KLSAqCi0gKiBUaGlzIGNsYXNzIGlzIGFic3RyYWN0LCBhbmQgaXMgc3ViY2xhc3NlZCB3aXRoIG1vbm90b25lIGFuZAotICogZnJlZWxpc3QgdmFyaWFudHMsIHdoaWNoIHJlZmxlY3QgbW9ub3RvbmljIGFuZCBhZCBob2Mgc3BhY2UgdXNhZ2UKLSAqIHJlc3BlY3RpdmVseS4gIE1vbm90b25pYyB1c2UgaXMgZWFzaWVyIHRvIG1hbmFnZSwgYnV0IGlzIG9idmlvdXNseQotICogbW9yZSByZXN0cmljdGl2ZSAodXNlZnVsIGZvciBjb3B5aW5nIGNvbGxlY3RvcnMgd2hpY2ggYWxsb2NhdGUKLSAqIG1vbm90b25pY2FsbHkgYmVmb3JlIGZyZWVpbmcgdGhlIGVudGlyZSBzcGFjZSBhbmQgc3RhcnRpbmcgb3ZlcikuCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQYWdlUmVzb3VyY2UgaW1wbGVtZW50cyBDb25zdGFudHMgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENsYXNzIHZhcmlhYmxlcwotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFpFUk9fT05fUkVMRUFTRSA9IGZhbHNlOyAvLyBkZWJ1Z2dpbmcKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NrIGNsYXNzTG9jazsKLSAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBjdW11bGF0aXZlQ29tbWl0dGVkID0gMDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluc3RhbmNlIHZhcmlhYmxlcwotICAgKi8KLQotICAvLyBwYWdlIGJ1ZGdldGluZwotICBwcm90ZWN0ZWQgaW50IHJlc2VydmVkOwotICBwcm90ZWN0ZWQgaW50IGNvbW1pdHRlZDsKLSAgcHJvdGVjdGVkIGludCByZXF1aXJlZDsKLSAgcHJpdmF0ZSBmaW5hbCBpbnQgcGFnZUJ1ZGdldDsKLQotICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBjb250aWd1b3VzOwotICBwcm90ZWN0ZWQgZmluYWwgU3BhY2Ugc3BhY2U7Ci0gIHByb3RlY3RlZCBBZGRyZXNzIHN0YXJ0OyAvLyBvbmx5IGZvciBjb250aWd1b3VzCi0KLSAgLy8gbG9ja2luZwotICBwcml2YXRlIGZpbmFsIExvY2sgZ2NMb2NrOyAvLyB1c2VkIGR1cmluZyBHQwotICBwcml2YXRlIGZpbmFsIExvY2sgbXV0YXRvckxvY2s7IC8vIHVzZWQgYnkgbXV0YXRvcnMKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbml0aWFsaXphdGlvbgotICAgKi8KLSAgc3RhdGljIHsKLSAgICBjbGFzc0xvY2sgPSBWTS5uZXdMb2NrKCJQYWdlUmVzb3VyY2UiKTsKLSAgICBPcHRpb25zLnByb3RlY3RPblJlbGVhc2UgPSBuZXcgUHJvdGVjdE9uUmVsZWFzZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSBwYWdlQnVkZ2V0IFRoZSBidWRnZXQgb2YgcGFnZXMgYXZhaWxhYmxlIHRvIHRoaXMgbWVtb3J5Ci0gICAqIG1hbmFnZXIgYmVmb3JlIGl0IG11c3QgcG9sbCB0aGUgY29sbGVjdG9yLgotICAgKiBAcGFyYW0gc3BhY2UgVGhlIHNwYWNlIHRvIHdoaWNoIHRoaXMgcmVzb3VyY2UgaXMgYXR0YWNoZWQKLSAgICovCi0gIHByaXZhdGUgUGFnZVJlc291cmNlKGludCBwYWdlQnVkZ2V0LCBTcGFjZSBzcGFjZSwgYm9vbGVhbiBjb250aWd1b3VzKSB7Ci0gICAgdGhpcy5wYWdlQnVkZ2V0ID0gcGFnZUJ1ZGdldDsKLSAgICB0aGlzLmNvbnRpZ3VvdXMgPSBjb250aWd1b3VzOwotICAgIHRoaXMuc3BhY2UgPSBzcGFjZTsKLSAgICBnY0xvY2sgPSBWTS5uZXdMb2NrKHNwYWNlLmdldE5hbWUoKSArICIuZ2NMb2NrIik7Ci0gICAgbXV0YXRvckxvY2sgPSBWTS5uZXdMb2NrKHNwYWNlLmdldE5hbWUoKSArICIubXV0YXRvckxvY2siKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgZGlzY29udGlndW91cyBzcGFjZXMKLSAgICoKLSAgICogQHBhcmFtIHBhZ2VCdWRnZXQgVGhlIGJ1ZGdldCBvZiBwYWdlcyBhdmFpbGFibGUgdG8gdGhpcyBtZW1vcnkKLSAgICogbWFuYWdlciBiZWZvcmUgaXQgbXVzdCBwb2xsIHRoZSBjb2xsZWN0b3IuCi0gICAqIEBwYXJhbSBzcGFjZSBUaGUgc3BhY2UgdG8gd2hpY2ggdGhpcyByZXNvdXJjZSBpcyBhdHRhY2hlZAotICAgKi8KLSAgUGFnZVJlc291cmNlKGludCBwYWdlQnVkZ2V0LCBTcGFjZSBzcGFjZSkgewotICAgIHRoaXMocGFnZUJ1ZGdldCwgc3BhY2UsIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgY29udGlndW91cyBzcGFjZXMKLSAgICoKLSAgICogQHBhcmFtIHBhZ2VCdWRnZXQgVGhlIGJ1ZGdldCBvZiBwYWdlcyBhdmFpbGFibGUgdG8gdGhpcyBtZW1vcnkKLSAgICogbWFuYWdlciBiZWZvcmUgaXQgbXVzdCBwb2xsIHRoZSBjb2xsZWN0b3IuCi0gICAqIEBwYXJhbSBzcGFjZSBUaGUgc3BhY2UgdG8gd2hpY2ggdGhpcyByZXNvdXJjZSBpcyBhdHRhY2hlZAotICAgKi8KLSAgUGFnZVJlc291cmNlKGludCBwYWdlQnVkZ2V0LCBTcGFjZSBzcGFjZSwgQWRkcmVzcyBzdGFydCkgewotICAgIHRoaXMocGFnZUJ1ZGdldCwgc3BhY2UsIHRydWUpOwotICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBhdmFpbGFibGUgcGh5c2ljYWwgcGFnZXMgZm9yIHRoaXMgcmVzb3VyY2UuCi0gICAqCi0gICAqIE5vdGU6IFRoaXMganVzdCBjb25zaWRlcnMgcGh5c2ljYWwgcGFnZXMgKGllIHZpcnR1YWwgbWVtb3J5IHBhZ2VzCi0gICAqIGFsbG9jYXRlZCBmb3IgdXNlIGJ5IHRoaXMgcmVzb3VyY2UpLiBUaGlzIGNhbGN1bGF0aW9uIGlzIG9ydGhvZ29uYWwKLSAgICogdG8gYW5kIGRvZXMgbm90IGNvbnNpZGVyIGFueSByZXN0cmljdGlvbnMgb24gdGhlIG51bWJlciBvZiBwYWdlcwotICAgKiB0aGlzIHJlc291cmNlIG1heSBhY3R1YWxseSB1c2UgYXQgYW55IHRpbWUgKGllIHRoZSBudW1iZXIgb2YKLSAgICogY29tbWl0dGVkIGFuZCByZXNlcnZlZCBwYWdlcykuPHA+Ci0gICAqCi0gICAqIE5vdGU6IFRoZSBjYWxjdWxhdGlvbiBpcyBtYWRlIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgYWxsIHNwYWNlIHRoYXQKLSAgICogY291bGQgYmUgYXNzaWduZWQgdG8gdGhpcyByZXNvdXJjZSB3b3VsZCBiZSBhc3NpZ25lZCB0byB0aGlzIHJlc291cmNlCi0gICAqIChpZSB0aGUgdW51c2VkIGRpc2NvbnRpZ3VvdXMgc3BhY2UgY291bGQganVzdCBhcyBsaWtlbHkgYmUgYXNzaWduZWQKLSAgICogdG8gYW5vdGhlciBjb21wZXRpbmcgcmVzb3VyY2UpLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHBoeXNpY2FsIHBhZ2VzIGZvciB0aGlzIHJlc291cmNlLgotICAgKi8KLSAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0QXZhaWxhYmxlUGh5c2ljYWxQYWdlcygpOwotCi0gIC8qKgotICAgKiBSZXNlcnZlIHBhZ2VzLjxwPgotICAgKgotICAgKiBUaGUgcm9sZSBvZiByZXNlcnZpbmcgcGFnZXMgaXMgdGhhdCBpdCBhbGxvd3MgdGhlIHJlcXVlc3QgdG8gYmUKLSAgICogbm90ZWQgYXMgcGVuZGluZyAodGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBjb21taXR0ZWQgYW5kIHJlc2VydmVkCi0gICAqIGluZGljYXRlcyBwZW5kaW5nIHJlcXVlc3RzKS4gIElmIHRoZSByZXF1ZXN0IHdvdWxkIGV4Y2VlZCB0aGUKLSAgICogcGFnZSBidWRnZXQgdGhlbiB0aGUgY2FsbGVyIG11c3QgcG9sbCBpbiBjYXNlIGEgR0MgaXMgbmVjZXNzYXJ5LgotICAgKgotICAgKiBAcGFyYW0gcGFnZXMgVGhlIG51bWJlciBvZiBwYWdlcyByZXF1ZXN0ZWQKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBwYWdlIGJ1ZGdldCBjb3VsZCBzYXRpc2Z5IHRoZSByZXF1ZXN0LgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiByZXNlcnZlUGFnZXMoaW50IHBhZ2VzKSB7Ci0gICAgbG9jaygpOwotICAgIHJlcXVpcmVkICs9IGFkanVzdEZvck1ldGFEYXRhKHBhZ2VzKTsKLSAgICByZXNlcnZlZCA9IGNvbW1pdHRlZCArIHJlcXVpcmVkOwotICAgIGJvb2xlYW4gc2F0aXNmaWVkID0gcmVzZXJ2ZWQgPD0gcGFnZUJ1ZGdldDsKLSAgICB1bmxvY2soKTsKLSAgICByZXR1cm4gc2F0aXNmaWVkOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlbW92ZSBhIHJlcXVlc3QgdG8gdGhlIHNwYWNlLgotICAgKgotICAgKiBAcGFyYW0gcGFnZXMgVGhlIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgcmVxdWVzdC4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIGZpbmFsIHZvaWQgY2xlYXJSZXF1ZXN0KGludCBwYWdlcykgewotICAgIGxvY2soKTsKLSAgICByZXF1aXJlZCAtPSBhZGp1c3RGb3JNZXRhRGF0YShwYWdlcyk7Ci0gICAgdW5sb2NrKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmVzZXJ2ZSBwYWdlcyB1bmNvbmRpdGlvbmFsbHkuPHA+Ci0gICAqCi0gICAqIEFuIGV4YW1wbGUgb2Ygd2hlcmUgdGhpcyBpcyB1c2VmdWwgaXMgaW4gY2FzZXMgd2hlcmUgaXQgaXMKLSAgICogZGVzaXJhYmxlIHRvIHB1dCBzb21lIHNwYWNlIGFzaWRlIGFzIGhlYWQtcm9vbS4gIEJ5Ci0gICAqIHVuY29uZGl0aW9uYWxseSByZXNlcnZpbmcgdGhlIHBhZ2VzLCB0aGUgcGFnZXMgYXJlIGNvdW50ZWQKLSAgICogYWdhaW5zdCB0aGUgY29sbGVjdG9ycyBidWRnZXQuICBXaGVuIHRoZSBzcGFjZSBpcyBhY3R1YWxseQotICAgKiBuZWVkZWQsIHRoZSBwYWdlcyBjYW4gYmUgdW5jb25kaXRpb25hbGx5IHJlbGVhc2VkLCBmcmVlaW5nCi0gICAqIHRoZSBwYWdlcyBmb3Igb3RoZXIgcHVycG9zZXMuCi0gICAqCi0gICAqIEBwYXJhbSBwYWdlcyBUaGUgbnVtYmVyIG9mIHBhZ2VzIHRvIGJlIHVuY29uZGl0aW9uYWxseQotICAgKiByZXNlcnZlZC4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHVuY29uZGl0aW9uYWxseVJlc2VydmVQYWdlcyhpbnQgcGFnZXMpIHsKLSAgICBsb2NrKCk7Ci0gICAgY29tbWl0dGVkICs9IHBhZ2VzOwotICAgIHJlc2VydmVkICs9IHBhZ2VzOwotICAgIHVubG9jaygpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlbGVhc2UgcGFnZXMgdW5jb25kaXRpb25hbGx5LjxwPgotICAgKgotICAgKiBUaGlzIGNhbGwgYWxsb3dzIHBhZ2VzIHRvIGJlIHVuY29uZGl0aW9uYWxseSByZW1vdmVkIGZyb20KLSAgICogdGhlIGNvbGxlY3RvcnMgcGFnZSBidWRnZXQuCi0gICAqCi0gICAqIEBzZWUgI3VuY29uZGl0aW9uYWxseVJlc2VydmVQYWdlcwotICAgKiBAcGFyYW0gcGFnZXMgVGhlIG51bWJlciBvZiBwYWdlcyB0byBiZSB1bmNvbmRpdGlvbmFsbHkKLSAgICogcmVsZWFzZWQuCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB1bmNvbmRpdGlvbmFsbHlSZWxlYXNlUGFnZXMoaW50IHBhZ2VzKSB7Ci0gICAgbG9jaygpOwotICAgIGNvbW1pdHRlZCAtPSBwYWdlczsKLSAgICByZXNlcnZlZCAtPSBwYWdlczsKLSAgICB1bmxvY2soKTsKLSAgfQotCi0gIGFic3RyYWN0IEFkZHJlc3MgYWxsb2NQYWdlcyhpbnQgcGFnZXMpOwotCi0gIC8qKgotICAgKiBBZGp1c3QgYSBwYWdlIHJlcXVlc3QgdG8gaW5jbHVkZSBtZXRhZGF0YSByZXF1aXJlbWVudHMgZm9yIGEgcmVxdWVzdAotICAgKiBvZiB0aGUgZ2l2ZW4gc2l6ZS4gVGhpcyBtdXN0IGJlIGEgcHVyZSBmdW5jdGlvbiwgdGhhdCBpcyBpdCBkb2VzIG5vdAotICAgKiBkZXBlbmQgb24gdGhlIHN0YXRlIG9mIHRoZSBQYWdlUmVzb3VyY2UuCi0gICAqCi0gICAqIEBwYXJhbSBwYWdlcyBUaGUgc2l6ZSBvZiB0aGUgcGVuZGluZyBhbGxvY2F0aW9uIGluIHBhZ2VzCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiByZXF1aXJlZCBwYWdlcywgaW5jbHVzaXZlIG9mIGFueSBtZXRhZGF0YQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGludCBhZGp1c3RGb3JNZXRhRGF0YShpbnQgcGFnZXMpOwotCi0gIC8qKgotICAgKiBBbGxvY2F0ZSBwYWdlcyBpbiB2aXJ0dWFsIG1lbW9yeSwgcmV0dXJuaW5nIHplcm8gb24gZmFpbHVyZS48cD4KLSAgICoKLSAgICogSWYgdGhlIHJlcXVlc3QgY2Fubm90IGJlIHNhdGlzZmllZCwgemVybyBpcyByZXR1cm5lZCBhbmQgaXQKLSAgICogZmFsbHMgdG8gdGhlIGNhbGxlciB0byB0cmlnZ2VyIHRoZSBHQy4KLSAgICoKLSAgICogQ2FsbCA8Y29kZT5hbGxvY1BhZ2VzPC9jb2RlPiAoc3ViY2xhc3MpIHRvIGZpbmQgdGhlIHBhZ2VzIGluCi0gICAqIHZpcnR1YWwgbWVtb3J5LiAgSWYgc3VjY2Vzc2Z1bCB0aGVuIGNvbW1pdCB0aGUgcGVuZGluZyBwYWdlCi0gICAqIHJlcXVlc3QgYW5kIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgcGFnZS4KLSAgICoKLSAgICogQHBhcmFtIHBhZ2VzIFRoZSBudW1iZXIgb2YgcGFnZXMgcmVxdWVzdGVkCi0gICAqIEByZXR1cm4gVGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG9mIDxjb2RlPnBhZ2VzPC9jb2RlPiBwYWdlcywgb3IKLSAgICogemVybyBvbiBmYWlsdXJlLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgZmluYWwgQWRkcmVzcyBnZXROZXdQYWdlcyhpbnQgcGFnZXMpIHsKLSAgICByZXR1cm4gYWxsb2NQYWdlcyhwYWdlcyk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tbWl0IHBhZ2VzIHRvIHRoZSBwYWdlIGJ1ZGdldC4gIFRoaXMgaXMgY2FsbGVkIGFmdGVyCi0gICAqIHN1Y2Nlc3NmdWxseSBkZXRlcm1pbmluZyB0aGF0IHRoZSByZXF1ZXN0IGNhbiBiZSBzYXRpc2ZpZWQgYnkKLSAgICogYm90aCB0aGUgcGFnZSBidWRnZXQgYW5kIHZpcnR1YWwgbWVtb3J5LiAgVGhpcyBzaW1wbHkgYWNjb3VudHMKLSAgICogZm9yIHRoZSBkZXNjcmVwZW5jeSBiZXR3ZWVuIDxjb2RlPmNvbW1pdHRlZDwvY29kZT4gYW5kCi0gICAqIDxjb2RlPnJlc2VydmVkPC9jb2RlPiB3aGlsZSB0aGUgcmVxdWVzdCB3YXMgcGVuZGluZy4KLSAgICoKLSAgICogVGhpcyAqTVVTVCogYmUgY2FsbGVkIGJ5IGVhY2ggUGFnZVJlc291cmNlIGR1cmluZyB0aGUKLSAgICogYWxsb2NQYWdlcywgYW5kIHRoZSBjYWxsZXIgbXVzdCBob2xkIHRoZSBsb2NrLgotICAgKgotICAgKiBAcGFyYW0gcmVxdWVzdGVkUGFnZXMgVGhlIG51bWJlciBvZiBwYWdlcyBmcm9tIHRoaXMgcmVxdWVzdAotICAgKiBAcGFyYW0gdG90YWxQYWdlcyBUaGUgbnVtYmVyIG9mIHBhZ2VzCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjb21taXRQYWdlcyhpbnQgcmVxdWVzdGVkUGFnZXMsIGludCB0b3RhbFBhZ2VzKSB7Ci0gICAgaW50IHByZWRpY3RlZFBhZ2VzID0gYWRqdXN0Rm9yTWV0YURhdGEocmVxdWVzdGVkUGFnZXMpOwotICAgIGludCBkZWx0YSA9IHRvdGFsUGFnZXMgLSBwcmVkaWN0ZWRQYWdlczsKLSAgICByZXF1aXJlZCAtPSBwcmVkaWN0ZWRQYWdlczsKLSAgICByZXNlcnZlZCArPSBkZWx0YTsKLSAgICBjb21taXR0ZWQgKz0gdG90YWxQYWdlczsKLSAgICBpZiAoIVBsYW4uZ2NJblByb2dyZXNzKCkpCi0gICAgICBhZGRUb0NvbW1pdHRlZCh0b3RhbFBhZ2VzKTsgLy8gb25seSBjb3VudCBtdXRhdG9yIHBhZ2VzCi0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcmVzZXJ2ZWQgcGFnZXMKLSAgICoKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHJlc2VydmVkIHBhZ2VzLgotICAgKi8KLSAgcHVibGljIGZpbmFsIGludCByZXNlcnZlZFBhZ2VzKCkgeyByZXR1cm4gcmVzZXJ2ZWQ7IH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY29tbWl0dGVkIHBhZ2VzCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBjb21taXR0ZWQgcGFnZXMuCi0gICAqLwotICBwdWJsaWMgZmluYWwgaW50IGNvbW1pdHRlZFBhZ2VzKCkgeyByZXR1cm4gY29tbWl0dGVkOyB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHJlcXVpcmVkIHBhZ2VzCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiByZXF1aXJlZCBwYWdlcy4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBpbnQgcmVxdWlyZWRQYWdlcygpIHsgcmV0dXJuIHJlcXVpcmVkOyB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgY3VtdWxhdGl2ZSBudW1iZXIgb2YgY29tbWl0dGVkIHBhZ2VzCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGN1bXVsYXRpdmUgbnVtYmVyIG9mIGNvbW1pdHRlZCBwYWdlcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgbG9uZyBjdW11bGF0aXZlQ29tbWl0dGVkUGFnZXMoKSB7IHJldHVybiBjdW11bGF0aXZlQ29tbWl0dGVkOyB9Ci0KLSAgLyoqCi0gICAqIEFkZCB0byB0aGUgdG90YWwgY3VtdWxhdGl2ZSBjb21taXR0ZWQgcGFnZSBjb3VudC4KLSAgICoKLSAgICogQHBhcmFtIHBhZ2VzIFRoZSBudW1iZXIgb2YgcGFnZXMgdG8gYmUgYWRkZWQuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFRvQ29tbWl0dGVkKGludCBwYWdlcykgewotICAgIGNsYXNzTG9jay5hY3F1aXJlKCk7Ci0gICAgY3VtdWxhdGl2ZUNvbW1pdHRlZCArPSBwYWdlczsKLSAgICBjbGFzc0xvY2sucmVsZWFzZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFjcXVpcmUgdGhlIGFwcHJvcHJpYXRlIGxvY2sgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGNvbnRleHQgaXMKLSAgICogR0Mgb3IgbXV0YXRvci4KLSAgICovCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIGxvY2soKSB7Ci0gICAgaWYgKFBsYW4uZ2NJblByb2dyZXNzKCkpCi0gICAgICBnY0xvY2suYWNxdWlyZSgpOwotICAgIGVsc2UKLSAgICAgIG11dGF0b3JMb2NrLmFjcXVpcmUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWxlYXNlIHRoZSBhcHByb3ByaWF0ZSBsb2NrIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBjb250ZXh0IGlzCi0gICAqIEdDIG9yIG11dGF0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCB1bmxvY2soKSB7Ci0gICAgaWYgKFBsYW4uZ2NJblByb2dyZXNzKCkpCi0gICAgICBnY0xvY2sucmVsZWFzZSgpOwotICAgIGVsc2UKLSAgICAgIG11dGF0b3JMb2NrLnJlbGVhc2UoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2hlYXAvU3BhY2VEZXNjcmlwdG9yLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvaGVhcC9TcGFjZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMxYjdkNi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvaGVhcC9TcGFjZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5oZWFwOwotCi1pbXBvcnQgb3JnLm1tdGsucG9saWN5LlNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBtYW5hZ2VzIHRoZSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgb2Ygc3BhY2UgZGVzY3JpcHRvcnMuPHA+Ci0gKgotICogU3BhY2UgZGVzY3JpcHRvcnMgYXJlIGludGVnZXJzIHRoYXQgZW5jb2RlIGEgc3BhY2UncyBtYXBwaW5nIGludG8KLSAqIHZpcnR1YWwgbWVtb3J5LiAgRm9yIGRpc2NvbnRpZ3VvdXMgc3BhY2VzLCB0aGV5IGluZGljYXRlCi0gKiBkaXNjb250aWd1aXR5IGFuZCBtYXBwaW5nIG11c3QgYmUgZG9uZSBieSBjb25zdWx0aW5nIHRoZSBzcGFjZSBtYXAuCi0gKiBGb3IgY29udGlndW91cyBzcGFjZXMsIHRoZSBzcGFjZSdzIGFkZHJlc3MgcmFuZ2UgaXMgZW5jb2RlZCBpbnRvCi0gKiB0aGUgaW50ZWdlciAodXNpbmcgYSBmaXhlZCBwb2ludCBub3RhdGlvbikuPHA+Ci0gKgotICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyB0byBhbGxvdyA8Y29kZT5zdGF0aWMgZmluYWwgaW50PC9jb2RlPgotICogc3BhY2UgZGVzY3JpcHRvcnMgdG8gZXhpc3QgZm9yIGVhY2ggc3BhY2UsIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQKLSAqIGluIHRlc3RzIHRvIGRldGVybWluZSB3aGV0aGVyIGFuIG9iamVjdCBpcyBpbiBhIHNwYWNlLiAgQSBnb29kCi0gKiBjb21waWxlciBjYW4gcGVyZm9ybSB0aGlzIGRlY29kaW5nIGF0IGNvbXBpbGUgdGltZSBhbmQgcHJvZHVjZQotICogb3B0aW1hbCBjb2RlIGZvciB0aGUgdGVzdC4KLSAqLwotQFVuaW50ZXJydXB0aWJsZSBwdWJsaWMgY2xhc3MgU3BhY2VEZXNjcmlwdG9yIGltcGxlbWVudHMgQ29uc3RhbnRzIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDbGFzcyB2YXJpYWJsZXMKLSAgICovCi0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfQklUUyA9IDI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUWVBFX1NIQVJFRCA9IDA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUWVBFX0NPTlRJR1VPVVMgPSAxOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9DT05USUdVT1VTX0hJID0gMzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfTUFTSyA9ICgxIDw8IFRZUEVfQklUUykgLSAxOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9TSElGVCA9IFRZUEVfQklUUzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWkVfQklUUyA9IDEwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9NQVNLID0gKCgxIDw8IFNJWkVfQklUUykgLSAxKSA8PCBTSVpFX1NISUZUOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVhQT05FTlRfU0hJRlQgPSBTSVpFX1NISUZUICsgU0laRV9CSVRTOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVhQT05FTlRfQklUUyA9IDU7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWFBPTkVOVF9NQVNLID0gKCgxIDw8IEVYUE9ORU5UX0JJVFMpIC0gMSkgPDwgRVhQT05FTlRfU0hJRlQ7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQU5USVNTQV9TSElGVCA9IEVYUE9ORU5UX1NISUZUICsgRVhQT05FTlRfQklUUzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BTlRJU1NBX0JJVFMgPSAxNDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJBU0VfRVhQT05FTlQgPSBCSVRTX0lOX0lOVCAtIE1BTlRJU1NBX0JJVFM7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IGRpc2NvbnRpZ3VvdXNTcGFjZUluZGV4ID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0NPTlRJR19JTkRFWF9JTkNSRU1FTlQgPSAxPDxUWVBFX0JJVFM7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogRGVzY3JpcHRvciBjcmVhdGlvbgotICAgKi8KLQotICAvKioKLSAgICogQ3JlYXRlIGEgZGVzY3JpcHRvciBmb3IgYSA8aT5jb250aWd1b3VzPC9pPiBzcGFjZQotICAgKgotICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIHNwYWNlCi0gICAqIEBwYXJhbSBlbmQgVGhlIGVuZCBhZGRyZXNzIG9mIHRoZSBzcGFjZQotICAgKiBAcmV0dXJuIEFuIGludGVnZXIgZGVzY3JpcHRvciBlbmNvZGluZyB0aGUgcmVnaW9uIG9mIHZpcnR1YWwKLSAgICogbWVtb3J5IG9jY3VwaWVkIGJ5IHRoZSBzcGFjZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY3JlYXRlRGVzY3JpcHRvcihBZGRyZXNzIHN0YXJ0LCBBZGRyZXNzIGVuZCkgewotICAgIGludCBjaHVua3MgPSBlbmQuZGlmZihzdGFydCkudG9Xb3JkKCkucnNobChTcGFjZS5MT0dfQllURVNfSU5fQ0hVTkspLnRvSW50KCk7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKQotICAgICAgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KCFzdGFydC5pc1plcm8oKSAmJiBjaHVua3MgPiAwICYmIGNodW5rcyA8ICgxIDw8IFNJWkVfQklUUykpOwotICAgIGJvb2xlYW4gdG9wID0gZW5kLkVRKFNwYWNlLkhFQVBfRU5EKTsKLSAgICBXb3JkIHRtcCA9IHN0YXJ0LnRvV29yZCgpOwotICAgIHRtcCA9IHRtcC5yc2hsKEJBU0VfRVhQT05FTlQpOwotICAgIGludCBleHBvbmVudCA9IDA7Ci0gICAgd2hpbGUgKCF0bXAuaXNaZXJvKCkgJiYgdG1wLmFuZChXb3JkLm9uZSgpKS5pc1plcm8oKSkgewotICAgICAgdG1wID0gdG1wLnJzaGwoMSk7Ci0gICAgICBleHBvbmVudCsrOwotICAgIH0KLSAgICBpbnQgbWFudGlzc2EgPSB0bXAudG9JbnQoKTsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpCi0gICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQodG1wLmxzaChCQVNFX0VYUE9ORU5UICsgZXhwb25lbnQpLkVRKHN0YXJ0LnRvV29yZCgpKSk7Ci0gICAgcmV0dXJuIChtYW50aXNzYTw8TUFOVElTU0FfU0hJRlQpIHwKLSAgICAgICAgICAgKGV4cG9uZW50PDxFWFBPTkVOVF9TSElGVCkgfAotICAgICAgICAgICAoY2h1bmtzIDw8IFNJWkVfU0hJRlQpIHwKLSAgICAgICAgICAgKCh0b3ApID8gVFlQRV9DT05USUdVT1VTX0hJIDogVFlQRV9DT05USUdVT1VTKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBkZXNjcmlwdG9yIGZvciBhIDxpPmRpcy1jb250aWd1b3VzPC9pPiAoc2hhcmVkKSBzcGFjZQotICAgKgotICAgKiBAcmV0dXJuIEFuIGludGVnZXIgZGVzY3JpcHRvciByZWZsZWN0aW5nIHRoZSBmYWN0IHRoYXQgdGhpcyBzcGFjZQotICAgKiBpcyBzaGFyZWQgKGFuZCB0aHVzIGRpc2NvbnRpZ3VvdXMgYW5kIHNvIG11c3QgYmUgZXN0YWJsaXNoZWQgdmlhCi0gICAqIG1hcHMpLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY3JlYXRlRGVzY3JpcHRvcigpIHsKLSAgICBkaXNjb250aWd1b3VzU3BhY2VJbmRleCArPSBESVNDT05USUdfSU5ERVhfSU5DUkVNRU5UOwotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KChkaXNjb250aWd1b3VzU3BhY2VJbmRleCAmIFRZUEVfQ09OVElHVU9VUykgIT0gVFlQRV9DT05USUdVT1VTKTsKLSAgICByZXR1cm4gZGlzY29udGlndW91c1NwYWNlSW5kZXg7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBEZXNjcmlwdG9yIGludGVycm9nYXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIFJldHVybiB0cnVlIGlmIHRoaXMgZGVzY3JpcHRvciBkZXNjcmliZXMgYSBjb250aWd1b3VzIHNwYWNlCi0gICAqCi0gICAqIEBwYXJhbSBkZXNjcmlwdG9yCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIGRlc2NyaXB0b3IgZGVzY3JpYmVzIGEgY29udGlndW91cyBzcGFjZQotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250aWd1b3VzKGludCBkZXNjcmlwdG9yKSB7Ci0gICAgcmV0dXJuICgoZGVzY3JpcHRvciAmIFRZUEVfQ09OVElHVU9VUykgPT0gVFlQRV9DT05USUdVT1VTKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGRlc2NyaXB0b3IgZGVzY3JpYmVzIGEgY29udGlndW91cyBzcGFjZSB0aGF0Ci0gICAqIGlzIGF0IHRoZSB0b3Agb2YgdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZQotICAgKgotICAgKiBAcGFyYW0gZGVzY3JpcHRvcgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBkZXNjcmlwdG9yIGRlc2NyaWJlcyBhIGNvbnRpZ3VvdXMgc3BhY2UgdGhhdAotICAgKiBpcyBhdCB0aGUgdG9wIG9mIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udGlndW91c0hpKGludCBkZXNjcmlwdG9yKSB7Ci0gICAgcmV0dXJuICgoZGVzY3JpcHRvciAmIFRZUEVfTUFTSykgPT0gVFlQRV9DT05USUdVT1VTX0hJKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIHRoaXMgcmVnaW9uIG9mIG1lbW9yeSBlbmNvZGVkIGluIHRoaXMgZGVzY3JpcHRvcgotICAgKgotICAgKiBAcGFyYW0gZGVzY3JpcHRvcgotICAgKiBAcmV0dXJuIFRoZSBzdGFydCBvZiB0aGlzIHJlZ2lvbiBvZiBtZW1vcnkgZW5jb2RlZCBpbiB0aGlzIGRlc2NyaXB0b3IKLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIHN0YXRpYyBBZGRyZXNzIGdldFN0YXJ0KGludCBkZXNjcmlwdG9yKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoaXNDb250aWd1b3VzKGRlc2NyaXB0b3IpKTsKLSAgICBXb3JkIG1hbnRpc3NhID0gV29yZC5mcm9tSW50U2lnbkV4dGVuZChkZXNjcmlwdG9yID4+PiBNQU5USVNTQV9TSElGVCk7Ci0gICAgaW50IGV4cG9uZW50ID0gKGRlc2NyaXB0b3IgJiBFWFBPTkVOVF9NQVNLKSA+Pj4gRVhQT05FTlRfU0hJRlQ7Ci0gICAgcmV0dXJuIG1hbnRpc3NhLmxzaChCQVNFX0VYUE9ORU5UICsgZXhwb25lbnQpLnRvQWRkcmVzcygpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgcmVnaW9uIG9mIG1lbW9yeSBlbmNvZGVkIGluIHRoaXMKLSAgICogZGVzY3JpcHRvciwgaW4gY2h1bmtzCi0gICAqCi0gICAqIEBwYXJhbSBkZXNjcmlwdG9yCi0gICAqIEByZXR1cm4gVGhlIHNpemUgb2YgdGhlIHJlZ2lvbiBvZiBtZW1vcnkgZW5jb2RlZCBpbiB0aGlzCi0gICAqIGRlc2NyaXB0b3IsIGluIGNodW5rcwotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIGludCBnZXRDaHVua3MoaW50IGRlc2NyaXB0b3IpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChpc0NvbnRpZ3VvdXMoZGVzY3JpcHRvcikpOwotICAgIHJldHVybiAoZGVzY3JpcHRvciAmIFNJWkVfTUFTSykgPj4+IFNJWkVfU0hJRlQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9oZWFwL1ZNUmVxdWVzdC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2hlYXAvVk1SZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNzk5ZGIuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L2hlYXAvVk1SZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkuaGVhcDsKLQotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyB0aGUgZW5jb2RpbmcgYW5kIGRlY29kaW5nIG9mIHZpcnR1YWwgbWVtb3J5IHJlcXVlc3RzLgotICoKLSAqIEJ5IGVuY2Fwc3VsYXRpbmcgdGhpcyBhc3BlY3Qgb2YgdGhlIGNvbnN0cnVjdGlvbiBvZiBhIHNwYWNlLCB3ZSBncmVhdGx5Ci0gKiByZWR1Y2UgdGhlIG51bWJlciBvZiBjb25zdHJ1Y3RvcnMgcmVxdWlyZWQuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWTVJlcXVlc3QgaW1wbGVtZW50cyBDb25zdGFudHMgewotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUVVFU1RfRElTQ09OVElHVU9VUyA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUVVFU1RfRklYRUQgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUX0VYVEVOVCA9IDM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUVVFU1RfRlJBQ1RJT04gPSA0OwotCi0gIHB1YmxpYyBmaW5hbCBpbnQgdHlwZTsKLSAgcHVibGljIGZpbmFsIEFkZHJlc3Mgc3RhcnQ7Ci0gIHB1YmxpYyBmaW5hbCBFeHRlbnQgZXh0ZW50OwotICBwdWJsaWMgZmluYWwgZmxvYXQgZnJhYzsKLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gdG9wOwotCi0gIHByaXZhdGUgVk1SZXF1ZXN0KGludCB0eXBlLCBBZGRyZXNzIHN0YXJ0LCBFeHRlbnQgYnl0ZXMsIGZsb2F0IGZyYWMsIGJvb2xlYW4gdG9wKSB7Ci0gICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7Ci0gICAgdGhpcy5leHRlbnQgPSBieXRlczsKLSAgICB0aGlzLmZyYWMgPSBmcmFjOwotICAgIHRoaXMudG9wID0gdG9wOwotICB9Ci0KLSAgLyoqCi0gICAqIElzIHRoaXMgYSBkaXNjb250aWd1b3VzIHNwYWNlIHJlcXVlc3Q/Ci0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgZGlzY29udGlndW91cyBzcGFjZSByZXF1ZXN0LCBmYWxzZSBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRGlzY29udGlndW91cygpIHsKLSAgICByZXR1cm4gdHlwZSA9PSBSRVFVRVNUX0RJU0NPTlRJR1VPVVM7Ci0gIH0KLQotICAvKioKLSAgICogQSByZXF1ZXN0IGZvciBhIGRpc2NvbnRpZ3VvdXMgcmVnaW9uIG9mIG1lbW9yeQotICAgKgotICAgKiBAcmV0dXJuIFRoZSByZXF1ZXN0IG9iamVjdAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBWTVJlcXVlc3QgY3JlYXRlKCkgewotICAgIHJldHVybiBuZXcgVk1SZXF1ZXN0KFJFUVVFU1RfRElTQ09OVElHVU9VUywgQWRkcmVzcy56ZXJvKCksIEV4dGVudC56ZXJvKCksIDBmLCBmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogQSByZXF1ZXN0IGZvciBhbiBleHBsaWNpdCByZWdpb24gb2YgbWVtb3J5Ci0gICAqCi0gICAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJlZ2lvbgotICAgKiBAcGFyYW0gZXh0ZW50IFRoZSBzaXplIG9mIHRoZSByZWdpb24KLSAgICogQHJldHVybiBUaGUgcmVxdWVzdCBvYmplY3QKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVk1SZXF1ZXN0IGNyZWF0ZShBZGRyZXNzIHN0YXJ0LCBFeHRlbnQgZXh0ZW50KSB7Ci0gICAgcmV0dXJuIG5ldyBWTVJlcXVlc3QoUkVRVUVTVF9GSVhFRCwgc3RhcnQsIGV4dGVudCwgMGYsIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBBIHJlcXVlc3QgZm9yIGEgbnVtYmVyIG9mIG1lZ2FieXRlcyBvZiBtZW1vcnkKLSAgICoKLSAgICogQHBhcmFtIG1iIFRoZSBudW1iZXIgb2YgbWVnYWJ5dGVzCi0gICAqIEByZXR1cm4gVGhlIHJlcXVlc3Qgb2JqZWN0Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIFZNUmVxdWVzdCBjcmVhdGUoaW50IG1iKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZShtYiwgZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIEEgcmVxdWVzdCBmb3IgYSBmcmFjdGlvbiBvZiBhdmFpbGFibGUgbWVtb3J5Ci0gICAqCi0gICAqIEBwYXJhbSBmcmFjIFRoZSBmcmFjdGlvbgotICAgKiBAcmV0dXJuIFRoZSByZXF1ZXN0IG9iamVjdAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBWTVJlcXVlc3QgY3JlYXRlKGZsb2F0IGZyYWMpIHsKLSAgICByZXR1cm4gY3JlYXRlKGZyYWMsIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBBIHJlcXVlc3QgZm9yIGEgbnVtYmVyIG9mIG1lZ2FieXRlcyBvZiBtZW1vcnksIG9wdGlvbmFsbHkgcmVxdWVzdGluZyB0aGUgaGlnaGVzdCBhdmFpbGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBtYiBUaGUgbnVtYmVyIG9mIG1lZ2FieXRlcwotICAgKiBAcGFyYW0gdG9wIFRydWUgdG8gcmVxdWVzdCBoaWdoIG1lbW9yeQotICAgKiBAcmV0dXJuIFRoZSByZXF1ZXN0IG9iamVjdAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBWTVJlcXVlc3QgY3JlYXRlKGludCBtYiwgYm9vbGVhbiB0b3ApIHsKLSAgICByZXR1cm4gbmV3IFZNUmVxdWVzdChSRVFVRVNUX0VYVEVOVCwgQWRkcmVzcy56ZXJvKCksIFdvcmQuZnJvbUludFNpZ25FeHRlbmQobWIpLmxzaChMT0dfQllURVNfSU5fTUJZVEUpLnRvRXh0ZW50KCksIDBmLCB0b3ApOwotICB9Ci0KLSAgLyoqCi0gICAqIEEgcmVxdWVzdCBmb3IgYSBmcmFjdGlvbiBvZiBhdmFpbGFibGUgbWVtb3J5LCBvcHRpb25hbGx5IHJlcXVlc3RpbmcgdGhlIGhpZ2hlc3QgYXZhaWxhYmxlLgotICAgKgotICAgKiBAcGFyYW0gZnJhYyBUaGUgZnJhY3Rpb24KLSAgICogQHBhcmFtIHRvcCBUcnVlIHRvIHJlcXVlc3QgaGlnaCBtZW1vcnkKLSAgICogQHJldHVybiBUaGUgcmVxdWVzdCBvYmplY3QKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVk1SZXF1ZXN0IGNyZWF0ZShmbG9hdCBmcmFjLCBib29sZWFuIHRvcCkgewotICAgIHJldHVybiBuZXcgVk1SZXF1ZXN0KFJFUVVFU1RfRlJBQ1RJT04sIEFkZHJlc3MuemVybygpLCBFeHRlbnQuemVybygpLCBmcmFjLCB0b3ApOwotICB9Ci0KLSAgLyoqCi0gICAqIEEgcmVxdWVzdCBmb3IgYSBudW1iZXIgb2YgYnl0ZXMgb2YgbWVtb3J5LCBvcHRpb25hbGx5IHJlcXVlc3RpbmcgdGhlIGhpZ2hlc3QgYXZhaWxhYmxlLgotICAgKgotICAgKiBAcGFyYW0gZXh0ZW50IFRoZSBudW1iZXIgb2YgYnl0ZXMKLSAgICogQHBhcmFtIHRvcCBUcnVlIHRvIHJlcXVlc3QgaGlnaCBtZW1vcnkKLSAgICogQHJldHVybiBUaGUgcmVxdWVzdCBvYmplY3QKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVk1SZXF1ZXN0IGNyZWF0ZShFeHRlbnQgZXh0ZW50LCBib29sZWFuIHRvcCkgewotICAgIHJldHVybiBuZXcgVk1SZXF1ZXN0KFJFUVVFU1RfRVhURU5ULCBBZGRyZXNzLnplcm8oKSwgZXh0ZW50LCAwZiwgdG9wKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvQm91bmRlZE51cnNlcnkuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL0JvdW5kZWROdXJzZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MDIwMmYuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvQm91bmRlZE51cnNlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnM7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlBsYW47Ci0KLS8qKgotICogUHJvdmlkZSBhbiB1cHBlciBib3VuZCBvbiBudXJzZXJ5IHNpemUuIFRoaXMgb3B0aW9uIGlzIG5vdCBpbnRlbmRlZCB0bwotICogYmUgY3JlYXRlZCBkaXJlY3RseSwgYnV0IHZpYSBOdXJzZXJ5U2l6ZS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJvdW5kZWROdXJzZXJ5IGV4dGVuZHMgb3JnLnZtdXRpbC5vcHRpb25zLlBhZ2VzT3B0aW9uIHsKLSAgLyoqCi0gICAqIENyZWF0ZSB0aGUgb3B0aW9uLgotICAgKi8KLSAgcHVibGljIEJvdW5kZWROdXJzZXJ5KCkgewotICAgIHN1cGVyKE9wdGlvbnMuc2V0LCAiQm91bmRlZCBOdXJzZXJ5IiwKLSAgICAgICAgIkJvdW5kIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG51cnNlcnkgdG8gdGhpcyB2YWx1ZSIsCi0gICAgICAgIFBsYW4uREVGQVVMVF9NQVhfTlVSU0VSWSk7Ci0gIH0KLQotICAvKioKLSAgICogTnVyc2VyeSBjYW4gbm90IGJlIGVtcHR5LgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoKSB7Ci0gICAgZmFpbElmKHZhbHVlIDw9IDAsICJDYW4gbm90IGhhdmUgYW4gZW1wdHkgbnVyc2VyeSIpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9Db25jdXJyZW50VHJpZ2dlci5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvQ29uY3VycmVudFRyaWdnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZkZmUzMC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9Db25jdXJyZW50VHJpZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkub3B0aW9uczsKLQotLyoqCi0gKiBDb25jdXJyZW50IHRyaWdnZXIgcGVyY2VudGFnZQotICovCi1wdWJsaWMgY2xhc3MgQ29uY3VycmVudFRyaWdnZXIgZXh0ZW5kcyBvcmcudm11dGlsLm9wdGlvbnMuSW50T3B0aW9uIHsKLSAgLyoqCi0gICAqIENyZWF0ZSB0aGUgb3B0aW9uLgotICAgKi8KLSAgcHVibGljIENvbmN1cnJlbnRUcmlnZ2VyKCkgewotICAgIHN1cGVyKE9wdGlvbnMuc2V0LCAiQ29uY3VycmVudCBUcmlnZ2VyIiwKLSAgICAgICAgICAiQ29uY3VycmVudCB0cmlnZ2VyIHBlcmNlbnRhZ2UiLAotICAgICAgICAgIDUwKTsKLSAgfQotCi0gIC8qKgotICAgKiBPbmx5IGFjY2VwdCB2YWx1ZXMgYmV0d2VlbiAxIGFuZCAxMDAgKGluY2x1c2l2ZSkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkgewotICAgIGZhaWxJZih0aGlzLnZhbHVlIDw9IDAsICJUcmlnZ2VyIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMDAiKTsKLSAgICBmYWlsSWYodGhpcy52YWx1ZSA+IDEwMCwgIlRyaWdnZXIgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEwMCIpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9DeWNsZUZpbHRlclRocmVzaG9sZC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvQ3ljbGVGaWx0ZXJUaHJlc2hvbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMxNzM2My4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9DeWNsZUZpbHRlclRocmVzaG9sZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkub3B0aW9uczsKLQotLyoqCi0gKiBUcmlnZ2VyIGN5Y2xlIGJ1ZmZlciBmaWx0ZXJpbmcgaWYgdGhlIHNwYWNlIGF2YWlsYWJsZSBmYWxscyBiZWxvdyB0aGlzIHRocmVzaG9sZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEN5Y2xlRmlsdGVyVGhyZXNob2xkIGV4dGVuZHMgb3JnLnZtdXRpbC5vcHRpb25zLlBhZ2VzT3B0aW9uIHsKLSAgLyoqCi0gICAqIENyZWF0ZSB0aGUgb3B0aW9uLgotICAgKi8KLSAgcHVibGljIEN5Y2xlRmlsdGVyVGhyZXNob2xkKCkgewotICAgIHN1cGVyKE9wdGlvbnMuc2V0LCAiQ3ljbGUgRmlsdGVyIFRocmVzaG9sZCIsCi0gICAgICAgICJUcmlnZ2VyIGN5Y2xlIGJ1ZmZlciBmaWx0ZXJpbmcgaWYgdGhlIHNwYWNlIGF2YWlsYWJsZSBmYWxscyBiZWxvdyB0aGlzIHRocmVzaG9sZCIsCi0gICAgICAgIDUxMik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL0N5Y2xlTWV0YURhdGFMaW1pdC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvQ3ljbGVNZXRhRGF0YUxpbWl0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZGVkZTUuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvQ3ljbGVNZXRhRGF0YUxpbWl0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5vcHRpb25zOwotCi0vKioKLSAqIFRyaWdnZXIgY3ljbGUgZGV0ZWN0aW9uIGlmIHRoZSBtZXRhIGRhdGEgdm9sdW1lIGdyb3dzIHRvIHRoaXMgbGltaXQuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDeWNsZU1ldGFEYXRhTGltaXQgZXh0ZW5kcyBvcmcudm11dGlsLm9wdGlvbnMuUGFnZXNPcHRpb24gewotICAvKioKLSAgICogQ3JlYXRlIHRoZSBvcHRpb24uCi0gICAqLwotICBwdWJsaWMgQ3ljbGVNZXRhRGF0YUxpbWl0KCkgewotICAgIHN1cGVyKE9wdGlvbnMuc2V0LCAiQ3ljbGUgTWV0YSBEYXRhIExpbWl0IiwKLSAgICAgICAgIlRyaWdnZXIgY3ljbGUgZGV0ZWN0aW9uIGlmIHRoZSBtZXRhIGRhdGEgdm9sdW1lIGdyb3dzIHRvIHRoaXMgbGltaXQiLAotICAgICAgICA0MDk2KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvQ3ljbGVUcmlnZ2VyVGhyZXNob2xkLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9DeWNsZVRyaWdnZXJUaHJlc2hvbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEyNjZiMC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9DeWNsZVRyaWdnZXJUaHJlc2hvbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnM7Ci0KLS8qKgotICogVHJpZ2dlciBjeWNsZSBkZXRlY3Rpb24gaWYgdGhlIHNwYWNlIGF2YWlsYWJsZSBmYWxscyBiZWxvdyB0aGlzIHRocmVzaG9sZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEN5Y2xlVHJpZ2dlclRocmVzaG9sZCBleHRlbmRzIG9yZy52bXV0aWwub3B0aW9ucy5QYWdlc09wdGlvbiB7Ci0gIC8qKgotICAgKiBDcmVhdGUgdGhlIG9wdGlvbi4KLSAgICovCi0gIHB1YmxpYyBDeWNsZVRyaWdnZXJUaHJlc2hvbGQoKSB7Ci0gICAgc3VwZXIoT3B0aW9ucy5zZXQsICJDeWNsZSBUcmlnZ2VyIFRocmVzaG9sZCIsCi0gICAgICAgICJUcmlnZ2VyIGN5Y2xlIGRldGVjdGlvbiBpZiB0aGUgc3BhY2UgYXZhaWxhYmxlIGZhbGxzIGJlbG93IHRoaXMgdGhyZXNob2xkIiwKLSAgICAgICAgNTEyKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvRGVidWdBZGRyZXNzLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9EZWJ1Z0FkZHJlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAwNGIwZS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9EZWJ1Z0FkZHJlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnM7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLkFkZHJlc3M7Ci0KLS8qKgotICogQWxsb3cgYW4gYWRkcmVzcyB0byBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSBmb3IgdXNlIGluIGRlYnVnZ2luZy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERlYnVnQWRkcmVzcyBleHRlbmRzIG9yZy52bXV0aWwub3B0aW9ucy5BZGRyZXNzT3B0aW9uIHsKLSAgLyoqCi0gICAqIENyZWF0ZSB0aGUgb3B0aW9uCi0gICAqLwotICBwdWJsaWMgRGVidWdBZGRyZXNzKCkgewotICAgIHN1cGVyKE9wdGlvbnMuc2V0LCAiRGVidWcgQWRkcmVzcyIsCi0gICAgICAgICAgIlNwZWNpZnkgYW4gYWRkcmVzcyBhdCBydW50aW1lIGZvciB1c2UgaW4gZGVidWdnaW5nIiwKLSAgICAgICAgQWRkcmVzcy56ZXJvKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9EZWZyYWdGcmVlSGVhZHJvb20uamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL0RlZnJhZ0ZyZWVIZWFkcm9vbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDUyMjhlLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL0RlZnJhZ0ZyZWVIZWFkcm9vbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkub3B0aW9uczsKLQotaW1wb3J0IHN0YXRpYyBvcmcubW10ay5wb2xpY3kuaW1taXguSW1taXhDb25zdGFudHMuREVGQVVMVF9ERUZSQUdfRlJFRV9IRUFEUk9PTTsKLQotcHVibGljIGNsYXNzIERlZnJhZ0ZyZWVIZWFkcm9vbSBleHRlbmRzIG9yZy52bXV0aWwub3B0aW9ucy5QYWdlc09wdGlvbiB7Ci0gIC8qKgotICAgKiBDcmVhdGUgdGhlIG9wdGlvbi4KLSAgICovCi0gIHB1YmxpYyBEZWZyYWdGcmVlSGVhZHJvb20oKSB7Ci0gICAgc3VwZXIoT3B0aW9ucy5zZXQsICJEZWZyYWcgRnJlZSBIZWFkcm9vbSIsCi0gICAgICAgICAgIkFsbG93IHRoZSBkZWZyYWdtZW50ZXIgdGhpcyBhbW91bnQgb2YgZnJlZSBoZWFkcm9vbSBkdXJpbmcgZGVmcmFnLiBGb3IgYW5hbHlzaXMgcHVycG9zZXMgb25seSEiLAotICAgICAgICAgIERFRkFVTFRfREVGUkFHX0ZSRUVfSEVBRFJPT00pOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9EZWZyYWdGcmVlSGVhZHJvb21GcmFjdGlvbi5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvRGVmcmFnRnJlZUhlYWRyb29tRnJhY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M5NTE0OS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9EZWZyYWdGcmVlSGVhZHJvb21GcmFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkub3B0aW9uczsKLQotaW1wb3J0IHN0YXRpYyBvcmcubW10ay5wb2xpY3kuaW1taXguSW1taXhDb25zdGFudHMuREVGQVVMVF9ERUZSQUdfRlJFRV9IRUFEUk9PTV9GUkFDVElPTjsKLQotcHVibGljIGNsYXNzIERlZnJhZ0ZyZWVIZWFkcm9vbUZyYWN0aW9uIGV4dGVuZHMgb3JnLnZtdXRpbC5vcHRpb25zLkZsb2F0T3B0aW9uIHsKLSAgLyoqCi0gICAqIENyZWF0ZSB0aGUgb3B0aW9uLgotICAgKi8KLSAgcHVibGljIERlZnJhZ0ZyZWVIZWFkcm9vbUZyYWN0aW9uKCkgewotICAgIHN1cGVyKE9wdGlvbnMuc2V0LCAiRGVmcmFnIEZyZWUgSGVhZHJvb20gRnJhY3Rpb24iLAotICAgICAgICAgICJBbGxvdyB0aGUgZGVmcmFnbWVudGVyIHRoaXMgZnJhY3Rpb24gb2YgdGhlIGhlYXAgc2l6ZSBhcyBmcmVlIGhlYWRyb29tIGR1cmluZyBkZWZyYWcuIEZvciBhbmFseXNpcyBwdXJwb3NlcyBvbmx5ISIsCi0gICAgICAgICAgREVGQVVMVF9ERUZSQUdfRlJFRV9IRUFEUk9PTV9GUkFDVElPTik7Ci0gIH0KLQotICAvKioKLSAgICogRW5zdXJlIHRoZSB2YWx1ZSBpcyB2YWxpZC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkgewotICAgIGZhaWxJZigodGhpcy52YWx1ZSA8IDAgfHwgdGhpcy52YWx1ZSA+IDEuMCksICJSYXRpbyBtdXN0IGJlIGEgZmxvYXQgYmV0d2VlbiAwIGFuZCAxIik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL0RlZnJhZ0hlYWRyb29tLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9EZWZyYWdIZWFkcm9vbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmQzYTUxLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL0RlZnJhZ0hlYWRyb29tLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5vcHRpb25zOwotCi1pbXBvcnQgc3RhdGljIG9yZy5tbXRrLnBvbGljeS5pbW1peC5JbW1peENvbnN0YW50cy5ERUZBVUxUX0RFRlJBR19IRUFEUk9PTTsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZyYWdIZWFkcm9vbSBleHRlbmRzIG9yZy52bXV0aWwub3B0aW9ucy5QYWdlc09wdGlvbiB7Ci0gIC8qKgotICAgKiBDcmVhdGUgdGhlIG9wdGlvbi4KLSAgICovCi0gIHB1YmxpYyBEZWZyYWdIZWFkcm9vbSgpIHsKLSAgICBzdXBlcihPcHRpb25zLnNldCwgIkRlZnJhZyBIZWFkcm9vbSIsCi0gICAgICAgICAgIkFsbG93IHRoZSBkZWZyYWdtZW50ZXIgdGhpcyBhbW91bnQgb2YgaGVhZHJvb20gZHVyaW5nIGRlZnJhZy4iLAotICAgICAgICAgIERFRkFVTFRfREVGUkFHX0hFQURST09NKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvRGVmcmFnSGVhZHJvb21GcmFjdGlvbi5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvRGVmcmFnSGVhZHJvb21GcmFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzU5MTVjLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL0RlZnJhZ0hlYWRyb29tRnJhY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLm1tdGsucG9saWN5LmltbWl4LkltbWl4Q29uc3RhbnRzLkRFRkFVTFRfREVGUkFHX0hFQURST09NX0ZSQUNUSU9OOwotCi1wdWJsaWMgY2xhc3MgRGVmcmFnSGVhZHJvb21GcmFjdGlvbiBleHRlbmRzIG9yZy52bXV0aWwub3B0aW9ucy5GbG9hdE9wdGlvbiB7Ci0gIC8qKgotICAgKiBDcmVhdGUgdGhlIG9wdGlvbi4KLSAgICovCi0gIHB1YmxpYyBEZWZyYWdIZWFkcm9vbUZyYWN0aW9uKCkgewotICAgIHN1cGVyKE9wdGlvbnMuc2V0LCAiRGVmcmFnIEhlYWRyb29tIEZyYWN0aW9uIiwKLSAgICAgICAgICAiQWxsb3cgdGhlIGRlZnJhZyB0aGlzIGZyYWN0aW9uIG9mIHRoZSBoZWFwIGFzIGhlYWRyb29tIGR1cmluZyBkZWZyYWcuIiwKLSAgICAgICAgICBERUZBVUxUX0RFRlJBR19IRUFEUk9PTV9GUkFDVElPTik7Ci0gIH0KLQotICAvKioKLSAgICogRW5zdXJlIHRoZSB2YWx1ZSBpcyB2YWxpZC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkgewotICAgIGZhaWxJZigodGhpcy52YWx1ZSA8IDAgfHwgdGhpcy52YWx1ZSA+IDEuMCksICJSYXRpbyBtdXN0IGJlIGEgZmxvYXQgYmV0d2VlbiAwIGFuZCAxIik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL0RlZnJhZ0xpbmVSZXVzZVJhdGlvLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9EZWZyYWdMaW5lUmV1c2VSYXRpby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzNjMTcxLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL0RlZnJhZ0xpbmVSZXVzZVJhdGlvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5vcHRpb25zOwotCi1pbXBvcnQgc3RhdGljIG9yZy5tbXRrLnBvbGljeS5pbW1peC5JbW1peENvbnN0YW50cy5ERUZBVUxUX0RFRlJBR19MSU5FX1JFVVNFX1JBVElPOwotCi1wdWJsaWMgY2xhc3MgRGVmcmFnTGluZVJldXNlUmF0aW8gZXh0ZW5kcyBvcmcudm11dGlsLm9wdGlvbnMuRmxvYXRPcHRpb24gewotICAvKioKLSAgICogQ3JlYXRlIHRoZSBvcHRpb24uCi0gICAqLwotICBwdWJsaWMgRGVmcmFnTGluZVJldXNlUmF0aW8oKSB7Ci0gICAgc3VwZXIoT3B0aW9ucy5zZXQsICJEZWZyYWcgTGluZSBSZXVzZSBSYXRpbyIsCi0gICAgICAgICAgIkJsb2NrcyB3aXRoIHRoaXMgZnJhY3Rpb24gbWFya2VkIG1heSBiZSByZXVzZWQgZm9yIGRlZnJhZyBhbGxvY2F0aW9uIiwKLSAgICAgICAgICBERUZBVUxUX0RFRlJBR19MSU5FX1JFVVNFX1JBVElPKTsKLSAgfQotCi0gIC8qKgotICAgKiBFbnN1cmUgdGhlIHZhbHVlIGlzIHZhbGlkLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoKSB7Ci0gICAgZmFpbElmKCh0aGlzLnZhbHVlIDw9IDAgfHwgdGhpcy52YWx1ZSA+IDEuMCksICJSYXRpbyBtdXN0IGJlIGEgZmxvYXQgYmV0d2VlbiAwIGFuZCAxIik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL0RlZnJhZ1NpbXBsZVNwaWxsVGhyZXNob2xkLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9EZWZyYWdTaW1wbGVTcGlsbFRocmVzaG9sZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDMyMjEwLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL0RlZnJhZ1NpbXBsZVNwaWxsVGhyZXNob2xkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5vcHRpb25zOwotCi1pbXBvcnQgc3RhdGljIG9yZy5tbXRrLnBvbGljeS5pbW1peC5JbW1peENvbnN0YW50cy5ERUZBVUxUX1NJTVBMRV9TUElMTF9USFJFU0hPTEQ7Ci0KLXB1YmxpYyBjbGFzcyBEZWZyYWdTaW1wbGVTcGlsbFRocmVzaG9sZCBleHRlbmRzIG9yZy52bXV0aWwub3B0aW9ucy5GbG9hdE9wdGlvbiB7Ci0gIC8qKgotICAgKiBDcmVhdGUgdGhlIG9wdGlvbi4KLSAgICovCi0gIHB1YmxpYyBEZWZyYWdTaW1wbGVTcGlsbFRocmVzaG9sZCgpIHsKLSAgICBzdXBlcihPcHRpb25zLnNldCwgIkRlZnJhZyBTaW1wbGUgU3BpbGwgVGhyZXNob2xkIiwKLSAgICAgICAgICAiQmxvY2tzIHdpdGggdGhpcyBmcmFjdGlvbiBzcGlsbGVkIHdpbGwgYmUgZGVmcmFnIHNvdXJjZXMiLAotICAgICAgICAgIERFRkFVTFRfU0lNUExFX1NQSUxMX1RIUkVTSE9MRCk7Ci0gIH0KLQotICAvKioKLSAgICogRW5zdXJlIHRoZSB2YWx1ZSBpcyB2YWxpZC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkgewotICAgIGZhaWxJZigodGhpcy52YWx1ZSA8PSAwIHx8IHRoaXMudmFsdWUgPiAxLjApLCAiUmF0aW8gbXVzdCBiZSBhIGZsb2F0IGJldHdlZW4gMCBhbmQgMSIpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9EZWZyYWdTdHJlc3MuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL0RlZnJhZ1N0cmVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzY5YWRhLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL0RlZnJhZ1N0cmVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkub3B0aW9uczsKLQotLyoqCi0gKiBTaG91bGQgd2UgZm9yY2UgZGVnZnJhZyBldmVyeSB0aW1lIHRoZSBpbW1peCBzcGFjZSBpcyBjb2xsZWN0ZWQ/Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZWZyYWdTdHJlc3MgZXh0ZW5kcyBvcmcudm11dGlsLm9wdGlvbnMuQm9vbGVhbk9wdGlvbiB7Ci0gIC8qKgotICAgKiBDcmVhdGUgdGhlIG9wdGlvbi4KLSAgICovCi0gIHB1YmxpYyBEZWZyYWdTdHJlc3MoKSB7Ci0gICAgc3VwZXIoT3B0aW9ucy5zZXQsICJEZWZyYWcgU3RyZXNzIiwKLSAgICAgICAgIlNob3VsZCB3ZSBmb3JjZSBkZWdmcmFnIGV2ZXJ5IHRpbWUgdGhlIGltbWl4IHNwYWNlIGlzIGNvbGxlY3RlZD8iLAotICAgICAgICBmYWxzZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL0R1bW15RW51bS5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvRHVtbXlFbnVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYjljYzcuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvRHVtbXlFbnVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5vcHRpb25zOwotCi0vKioKLSAqIEEgc2FtcGxlIGVudW1lcmF0aW9uIGZvciB0ZXN0aW5nLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRHVtbXlFbnVtIGV4dGVuZHMgb3JnLnZtdXRpbC5vcHRpb25zLkVudW1PcHRpb24gewotCi0gIC8vIGVudW1lcmF0aW9uIHZhbHVlcy4KLSAgcHVibGljIGZpbmFsIGludCBGT08gPSAwOwotICBwdWJsaWMgZmluYWwgaW50IEJBUiA9IDE7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSB0aGUgb3B0aW9uLgotICAgKi8KLSAgcHVibGljIER1bW15RW51bSgpIHsKLSAgICBzdXBlcihPcHRpb25zLnNldCwgIkR1bW15IEVudW0iLAotICAgICAgICAgICJUaGlzIGlzIGEgc2FtcGxlIGVudW1lcmF0aW9uIHRvIHRlc3QgdGhlIG9wdGlvbnMgc3lzdGVtIiwKLSAgICAgICAgICBuZXcgU3RyaW5nW10geyJmb28iLCAiYmFyIn0sCi0gICAgICAgICAgImZvbyIpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9FYWdlckNvbXBsZXRlU3dlZXAuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL0VhZ2VyQ29tcGxldGVTd2VlcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzBiMDg0Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL0VhZ2VyQ29tcGxldGVTd2VlcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkub3B0aW9uczsKLQotLyoqCi0gKiBTaG91bGQgd2UgZWFnZXJseSBmaW5pc2ggc3dlZXBpbmcgYXQgdGhlIHN0YXJ0IG9mIGEgY29sbGVjdGlvbgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRWFnZXJDb21wbGV0ZVN3ZWVwIGV4dGVuZHMgb3JnLnZtdXRpbC5vcHRpb25zLkJvb2xlYW5PcHRpb24gewotICAvKioKLSAgICogQ3JlYXRlIHRoZSBvcHRpb24uCi0gICAqLwotICBwdWJsaWMgRWFnZXJDb21wbGV0ZVN3ZWVwKCkgewotICAgIHN1cGVyKE9wdGlvbnMuc2V0LCAiRWFnZXIgQ29tcGxldGUgU3dlZXAiLAotICAgICAgICAgICJTaG91bGQgd2UgZWFnZXJseSBmaW5pc2ggc3dlZXBpbmcgYXQgdGhlIHN0YXJ0IG9mIGEgY29sbGVjdGlvbiIsCi0gICAgICAgICAgZmFsc2UpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9FYWdlck1tYXBTcGFjZXMuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL0VhZ2VyTW1hcFNwYWNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzY4OTU2Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL0VhZ2VyTW1hcFNwYWNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkub3B0aW9uczsKLQotLyoqCi0gKiBTaG91bGQgc3BhY2VzIGJlIGVhZ2VybHkgZGVtYW5kIHplcm8gbW1hcHBlZD8KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVhZ2VyTW1hcFNwYWNlcyBleHRlbmRzIG9yZy52bXV0aWwub3B0aW9ucy5Cb29sZWFuT3B0aW9uIHsKLSAgLyoqCi0gICAqIENyZWF0ZSB0aGUgb3B0aW9uLgotICAgKi8KLSAgcHVibGljIEVhZ2VyTW1hcFNwYWNlcygpIHsKLSAgICBzdXBlcihPcHRpb25zLnNldCwgIkVhZ2VyIE1tYXAgU3BhY2VzIiwKLSAgICAgICAgICAiSWYgdHJ1ZSwgYWxsIHNwYWNlcyBhcmUgZWFnZXJseSBkZW1hbmQgemVybyBtbWFwcGVkIGF0IGJvb3QgdGltZSIsCi0gICAgICAgICAgZmFsc2UpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9FY2hvT3B0aW9ucy5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvRWNob09wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ0MDdjOS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9FY2hvT3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkub3B0aW9uczsKLQotLyoqCi0gKiBFY2hvIHdoZW4gb3B0aW9ucyBhcmUgc2V0PwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRWNob09wdGlvbnMgZXh0ZW5kcyBvcmcudm11dGlsLm9wdGlvbnMuQm9vbGVhbk9wdGlvbiB7Ci0gIC8qKgotICAgKiBDcmVhdGUgdGhlIG9wdGlvbi4KLSAgICovCi0gIHB1YmxpYyBFY2hvT3B0aW9ucygpIHsKLSAgICBzdXBlcihPcHRpb25zLnNldCwgIkVjaG8gT3B0aW9ucyIsCi0gICAgICAgICAgIkVjaG8gd2hlbiBvcHRpb25zIGFyZSBzZXQ/IiwKLSAgICAgICAgICBmYWxzZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL0ZpeGVkTnVyc2VyeS5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvRml4ZWROdXJzZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlOGE5YmYuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvRml4ZWROdXJzZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5vcHRpb25zOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5QbGFuOwotCi0vKioKLSAqIFByb3ZpZGUgYW4gbG93ZXIgYW5kIHVwcGVyIGJvdW5kIG9uIG51cnNlcnkgc2l6ZS4KLSAqCi0gKiBUaGlzIG9wdGlvbiBpcyBub3QgaW50ZW5kZWQgdG8gYmUgY3JlYXRlZCBkaXJlY3RseSwgYnV0IHZpYSBOdXJzZXJ5U2l6ZS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEZpeGVkTnVyc2VyeSBleHRlbmRzIG9yZy52bXV0aWwub3B0aW9ucy5QYWdlc09wdGlvbiB7Ci0gIC8vIHZhbHVlcwotICBCb3VuZGVkTnVyc2VyeSBib3VuZGVkTnVyc2VyeTsKLQotICAvKioKLSAgICogQ3JlYXRlIHRoZSBvcHRpb24KLSAgICovCi0gIHB1YmxpYyBGaXhlZE51cnNlcnkoQm91bmRlZE51cnNlcnkgYm91bmRlZE51cnNlcnkpIHsKLSAgICBzdXBlcihPcHRpb25zLnNldCwgIkZpeGVkIE51cnNlcnkiLAotICAgICAgICAiRml4IHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHNpemUgb2YgdGhlIG51cnNlcnkgdG8gdGhpcyB2YWx1ZSIsCi0gICAgICAgIFBsYW4uREVGQVVMVF9NSU5fTlVSU0VSWSk7Ci0gICAgdGhpcy5ib3VuZGVkTnVyc2VyeSA9IGJvdW5kZWROdXJzZXJ5OwotICB9Ci0KLSAgLyoqCi0gICAqIE51cnNlcnkgY2FuIG5vdCBiZSBlbXB0eS4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkgewotICAgIGZhaWxJZih2YWx1ZSA8PSAwLCAiQ2FuIG5vdCBoYXZlIGFuIGVtcHR5IG51cnNlcnkiKTsKLSAgICAvLyBVcGRhdGUgdXBwZXIgYm91bmQuCi0gICAgYm91bmRlZE51cnNlcnkuc2V0Qnl0ZXModGhpcy5nZXRCeXRlcygpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvRnJhZ21lbnRhdGlvblN0YXRzLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9GcmFnbWVudGF0aW9uU3RhdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRjYTA4NS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9GcmFnbWVudGF0aW9uU3RhdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnM7Ci0KLS8qKgotICogT3B0aW9uIHRvIHByaW50IGZyYWdtZW50YXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBmcmVlIGxpc3QuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBGcmFnbWVudGF0aW9uU3RhdHMgZXh0ZW5kcyBvcmcudm11dGlsLm9wdGlvbnMuQm9vbGVhbk9wdGlvbiB7Ci0gIC8qKgotICAgKiBDcmVhdGUgdGhlIG9wdGlvbi4KLSAgICovCi0gIHB1YmxpYyBGcmFnbWVudGF0aW9uU3RhdHMoKSB7Ci0gICAgc3VwZXIoT3B0aW9ucy5zZXQsICJGcmFnbWVudGF0aW9uIFN0YXRzIiwKLSAgICAgICAgIlNob3VsZCB3ZSBwcmludCBmcmFnbWVudGF0aW9uIHN0YXRpc3RpY3MgZm9yIHRoZSBmcmVlIGxpc3QgYWxsb2NhdG9yPyIsCi0gICAgICAgIGZhbHNlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvRnVsbEhlYXBTeXN0ZW1HQy5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvRnVsbEhlYXBTeXN0ZW1HQy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzM4NTY3Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL0Z1bGxIZWFwU3lzdGVtR0MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnM7Ci0KLS8qKgotICogU2hvdWxkIGEgbWFqb3IgR0MgYmUgcGVyZm9ybWVkIHdoZW4gYSBzeXN0ZW0gR0MgaXMgdHJpZ2dlcmVkPwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRnVsbEhlYXBTeXN0ZW1HQyBleHRlbmRzIG9yZy52bXV0aWwub3B0aW9ucy5Cb29sZWFuT3B0aW9uIHsKLSAgLyoqCi0gICAqIENyZWF0ZSB0aGUgb3B0aW9uLgotICAgKi8KLSAgcHVibGljIEZ1bGxIZWFwU3lzdGVtR0MoKSB7Ci0gICAgc3VwZXIoT3B0aW9ucy5zZXQsICJGdWxsIEhlYXAgU3lzdGVtIEdDIiwKLSAgICAgICAgICAiU2hvdWxkIGEgbWFqb3IgR0MgYmUgcGVyZm9ybWVkIHdoZW4gYSBzeXN0ZW0gR0MgaXMgdHJpZ2dlcmVkPyIsCi0gICAgICAgICAgZmFsc2UpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9HQ1RpbWVDYXAuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL0dDVGltZUNhcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzFjNWFmLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL0dDVGltZUNhcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkub3B0aW9uczsKLQotLyoqCi0gKiBUcnkgdG8gbGltaXQgcmVmZXJlbmNlIGNvdW50aW5nIGNvbGxlY3Rpb25zIHRvIHRoaXMgdGltZSBjYXAuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBHQ1RpbWVDYXAgZXh0ZW5kcyBvcmcudm11dGlsLm9wdGlvbnMuTWljcm9zZWNvbmRzT3B0aW9uIHsKLSAgLyoqCi0gICAqIENyZWF0ZSB0aGUgb3B0aW9uLgotICAgKi8KLSAgcHVibGljIEdDVGltZUNhcCgpIHsKLSAgICBzdXBlcihPcHRpb25zLnNldCwgIkdDIFRpbWUgQ2FwIiwKLSAgICAgICAgICAiVHJ5IHRvIGxpbWl0IHJlZmVyZW5jZSBjb3VudGluZyBjb2xsZWN0aW9ucyB0byB0aGlzIHRpbWUgY2FwIiwKLSAgICAgICAgICAxMDAwMDAwKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvR0NzcHlQb3J0LmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9HQ3NweVBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEyYzMzOC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9HQ3NweVBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnM7Ci0KLS8qKgotICogUG9ydCBudW1iZXIgZm9yIEdDU3B5IHNlcnZlciB0byBjb25uZWN0IHdpdGggdmlzdWFsaXNlci4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEdDc3B5UG9ydCBleHRlbmRzIG9yZy52bXV0aWwub3B0aW9ucy5JbnRPcHRpb24gewotICAvKioKLSAgICogQ3JlYXRlIHRoZSBvcHRpb24uCi0gICAqLwotICBwdWJsaWMgR0NzcHlQb3J0KCkgewotICAgIHN1cGVyKE9wdGlvbnMuc2V0LCAiR0NTcHkgUG9ydCIsCi0gICAgICAgICAgIlBvcnQgbnVtYmVyIGZvciBHQ1NweSBzZXJ2ZXIgdG8gY29ubmVjdCB3aXRoIHZpc3VhbGlzZXIiLAotICAgICAgICAgIDApOwotICB9Ci0KLSAgLyoqCi0gICAqIEVuc3VyZSB0aGUgcG9ydCBpcyB2YWxpZC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkgewotICAgIGZhaWxJZih0aGlzLnZhbHVlIDw9IDAsICJVbnJlYXNvbmFibGUgR0NTcHkgcG9ydCB2YWx1ZSIpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9HQ3NweVRpbGVTaXplLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9HQ3NweVRpbGVTaXplLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZDM4M2UuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvR0NzcHlUaWxlU2l6ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkub3B0aW9uczsKLQotLyoqCi0gKiBHQ3NweSBUaWxlIFNpemUuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBHQ3NweVRpbGVTaXplIGV4dGVuZHMgb3JnLnZtdXRpbC5vcHRpb25zLkludE9wdGlvbiB7Ci0gIC8qKgotICAgKiBDcmVhdGUgdGhlIG9wdGlvbi4KLSAgICovCi0gIHB1YmxpYyBHQ3NweVRpbGVTaXplKCkgewotICAgIHN1cGVyKE9wdGlvbnMuc2V0LCAiR0NzcHkgVGlsZSBTaXplIiwKLSAgICAgICAgICAiR0NzcHkgVGlsZSBTaXplIiwKLSAgICAgICAgICAxMzEwNzIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEVuc3VyZSB0aGUgdGlsZSBzaXplIGlzIHBvc2l0aXZlCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZSgpIHsKLSAgICBmYWlsSWYodGhpcy52YWx1ZSA8PSAwLCAiVW5yZWFzb25hYmxlIGdjc3B5IHRpbGVzaXplIik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL0dDc3B5V2FpdC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvR0NzcHlXYWl0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MTA4Y2IuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvR0NzcHlXYWl0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5vcHRpb25zOwotCi0vKioKLSAqIFNob3VsZCB0aGUgVk0gd2FpdCBmb3IgdGhlIHZpc3VhbGlzZXIgdG8gY29ubmVjdD8KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEdDc3B5V2FpdCBleHRlbmRzIG9yZy52bXV0aWwub3B0aW9ucy5Cb29sZWFuT3B0aW9uIHsKLSAgLyoqCi0gICAqIENyZWF0ZSB0aGUgb3B0aW9uCi0gICAqLwotICBwdWJsaWMgR0NzcHlXYWl0KCkgewotICAgIHN1cGVyKE9wdGlvbnMuc2V0LCAiR0NTcHkgV2FpdCIsCi0gICAgICAgICAgIlNob3VsZCB0aGUgVk0gd2FpdCBmb3IgdGhlIHZpc3VhbGlzZXIgdG8gY29ubmVjdD8iLAotICAgICAgICBmYWxzZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL0dlbkN5Y2xlRGV0ZWN0aW9uLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9HZW5DeWNsZURldGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mjc5MjYxLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL0dlbkN5Y2xlRGV0ZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5vcHRpb25zOwotCi0vKioKLSAqIFNob3VsZCB3ZSB1c2UgYSBnZW5lcmF0aW9uYWwgYXBwcm9hY2ggdG8gY3ljbGUgZGV0ZWN0aW9uPwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgR2VuQ3ljbGVEZXRlY3Rpb24gZXh0ZW5kcyBvcmcudm11dGlsLm9wdGlvbnMuQm9vbGVhbk9wdGlvbiB7Ci0gIC8qKgotICAgKiBDcmVhdGUgdGhlIG9wdGlvbi4KLSAgICovCi0gIHB1YmxpYyBHZW5DeWNsZURldGVjdGlvbigpIHsKLSAgICBzdXBlcihPcHRpb25zLnNldCwgIkdlbiBDeWNsZSBEZXRlY3Rpb24iLAotICAgICAgICAgICJTaG91bGQgd2UgdXNlIGEgZ2VuZXJhdGlvbmFsIGFwcHJvYWNoIHRvIGN5Y2xlIGRldGVjdGlvbj8iLAotICAgICAgICAgIGZhbHNlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvSGFybmVzc0FsbC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvSGFybmVzc0FsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjg4YTZmLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL0hhcm5lc3NBbGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnM7Ci0KLS8qKgotICogU2hvdWxkIHdlIHdyYXAgdGhlIGVudGlyZSBleGVjdXRpb24gd2l0aCBhIGhhcm5lc3NCZWdpbi9oYXJuZXNzRW5kPwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSGFybmVzc0FsbCBleHRlbmRzIG9yZy52bXV0aWwub3B0aW9ucy5Cb29sZWFuT3B0aW9uIHsKLSAgLyoqCi0gICAqIENyZWF0ZSB0aGUgb3B0aW9uLgotICAgKi8KLSAgcHVibGljIEhhcm5lc3NBbGwoKSB7Ci0gICAgc3VwZXIoT3B0aW9ucy5zZXQsICJIYXJuZXNzIEFsbCIsCi0gICAgICAgICJTaG91bGQgd2Ugd3JhcCB0aGUgZW50aXJlIGV4ZWN1dGlvbiBpbnNpZGUgY2FsbHMgdG8gaGFybmVzc0JlZ2luIGFuZCBoYXJuZXNzRW5kPyIsCi0gICAgICAgIGZhbHNlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvSWdub3JlU3lzdGVtR0MuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL0lnbm9yZVN5c3RlbUdDLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMmQ3Y2EuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvSWdub3JlU3lzdGVtR0MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnM7Ci0KLS8qKgotICogU2hvdWxkIHdlIGlnbm9yZSBjYWxscyB0byBqYXZhLmxhbmcuU3lzdGVtLmdjPwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSWdub3JlU3lzdGVtR0MgZXh0ZW5kcyBvcmcudm11dGlsLm9wdGlvbnMuQm9vbGVhbk9wdGlvbiB7Ci0gIC8qKgotICAgKiBDcmVhdGUgdGhlIG9wdGlvbi4KLSAgICovCi0gIHB1YmxpYyBJZ25vcmVTeXN0ZW1HQygpIHsKLSAgICBzdXBlcihPcHRpb25zLnNldCwgIklnbm9yZSBTeXN0ZW0gR0MiLAotICAgICAgICAgICJTaG91bGQgd2UgaWdub3JlIGNhbGxzIHRvIGphdmEubGFuZy5TeXN0ZW0uZ2M/IiwKLSAgICAgICAgZmFsc2UpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9MaW5lUmV1c2VSYXRpby5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvTGluZVJldXNlUmF0aW8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E2NzZiOS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9MaW5lUmV1c2VSYXRpby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkub3B0aW9uczsKLQotaW1wb3J0IHN0YXRpYyBvcmcubW10ay5wb2xpY3kuaW1taXguSW1taXhDb25zdGFudHMuREVGQVVMVF9MSU5FX1JFVVNFX1JBVElPOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIExpbmVSZXVzZVJhdGlvIGV4dGVuZHMgb3JnLnZtdXRpbC5vcHRpb25zLkZsb2F0T3B0aW9uIHsKLSAgLyoqCi0gICAqIENyZWF0ZSB0aGUgb3B0aW9uLgotICAgKi8KLSAgcHVibGljIExpbmVSZXVzZVJhdGlvKCkgewotICAgIHN1cGVyKE9wdGlvbnMuc2V0LCAiTGluZSBSZXVzZSBSYXRpbyIsCi0gICAgICAgICAgIkJsb2NrcyB3aXRoIHRoaXMgZnJhY3Rpb24gbWFya2VkIG1heSBiZSByZXVzZWQgZm9yIGFsbG9jYXRpb24iLAotICAgICAgICAgIERFRkFVTFRfTElORV9SRVVTRV9SQVRJTyk7Ci0gIH0KLQotICAvKioKLSAgICogRW5zdXJlIHRoZSB2YWx1ZSBpcyB2YWxpZC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkgewotICAgIGZhaWxJZigodGhpcy52YWx1ZSA8PSAwIHx8IHRoaXMudmFsdWUgPiAxLjApLCAiUmF0aW8gbXVzdCBiZSBhIGZsb2F0IGJldHdlZW4gMCBhbmQgMSIpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9NYXJrU3dlZXBNYXJrQml0cy5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvTWFya1N3ZWVwTWFya0JpdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMyMTJjZC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9NYXJrU3dlZXBNYXJrQml0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkub3B0aW9uczsKLQotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5NYXJrU3dlZXBTcGFjZTsKLQotLyoqCi0gKiBOdW1iZXIgb2YgYml0cyB0byB1c2UgZm9yIHRoZSBoZWFkZXIgY3ljbGUgb2YgbWFyayBzd2VlcCBzcGFjZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNYXJrU3dlZXBNYXJrQml0cyBleHRlbmRzIG9yZy52bXV0aWwub3B0aW9ucy5JbnRPcHRpb24gewotICAvKioKLSAgICogQ3JlYXRlIHRoZSBvcHRpb24uCi0gICAqLwotICBwdWJsaWMgTWFya1N3ZWVwTWFya0JpdHMoKSB7Ci0gICAgc3VwZXIoT3B0aW9ucy5zZXQsICJNYXJrIFN3ZWVwIE1hcmsgQml0cyIsCi0gICAgICAgICAgIk51bWJlciBvZiBiaXRzIHRvIHVzZSBmb3IgdGhlIGhlYWRlciBjeWNsZSBvZiBtYXJrIHN3ZWVwIHNwYWNlcyIsCi0gICAgICAgICAgTWFya1N3ZWVwU3BhY2UuREVGQVVMVF9NQVJLQ09VTlRfQklUUyk7Ci0gIH0KLQotICAvKioKLSAgICogRW5zdXJlIHRoZSB2YWx1ZSBpcyB2YWxpZC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkgewotICAgIGZhaWxJZih0aGlzLnZhbHVlIDw9IDAsICJNdXN0IHByb3ZpZGUgYXQgbGVhc3Qgb25lIGJpdCIpOwotICAgIGZhaWxJZih0aGlzLnZhbHVlID4gTWFya1N3ZWVwU3BhY2UuTUFYX01BUktDT1VOVF9CSVRTICwgIk9ubHkgIitNYXJrU3dlZXBTcGFjZS5NQVhfTUFSS0NPVU5UX0JJVFMrIiBiaXRzIGFyZSByZXNlcnZlZCBpbiBNYXJrU3dlZXBTcGFjZSIpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9NZXRhRGF0YUxpbWl0LmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9NZXRhRGF0YUxpbWl0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZjY0NzcuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvTWV0YURhdGFMaW1pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkub3B0aW9uczsKLQotLyoqCi0gKiBQcm92aWRlIGEgYm91bmQgb24gaG93IG11Y2ggbWV0YWRhdGEgaXMgYWxsb3dlZCBiZWZvcmUgYSBHQyBpcyB0cmlnZ2VyZWQuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZXRhRGF0YUxpbWl0IGV4dGVuZHMgb3JnLnZtdXRpbC5vcHRpb25zLlBhZ2VzT3B0aW9uIHsKLSAgLyoqCi0gICAqIENyZWF0ZSB0aGUgb3B0aW9uLgotICAgKi8KLSAgcHVibGljIE1ldGFEYXRhTGltaXQoKSB7Ci0gICAgc3VwZXIoT3B0aW9ucy5zZXQsICJNZXRhIERhdGEgTGltaXQiLAotICAgICAgICAgICJUcmlnZ2VyIGEgR0MgaWYgdGhlIG1ldGEgZGF0YSB2b2x1bWUgZ3Jvd3MgdG8gdGhpcyBsaW1pdCIsCi0gICAgICAgICAgNDA5Nik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL05vRmluYWxpemVyLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9Ob0ZpbmFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDhlMjhiLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL05vRmluYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5vcHRpb25zOwotCi0vKioKLSAqIFNob3VsZCBmaW5hbGl6YXRpb24gYmUgZGlzYWJsZWQ/Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOb0ZpbmFsaXplciBleHRlbmRzIG9yZy52bXV0aWwub3B0aW9ucy5Cb29sZWFuT3B0aW9uIHsKLSAgLyoqCi0gICAqIENyZWF0ZSB0aGUgb3B0aW9uLgotICAgKi8KLSAgcHVibGljIE5vRmluYWxpemVyKCkgewotICAgIHN1cGVyKE9wdGlvbnMuc2V0LCAiTm8gRmluYWxpemVyIiwKLSAgICAgICAgICAiU2hvdWxkIGZpbmFsaXphdGlvbiBiZSBkaXNhYmxlZD8iLAotICAgICAgICAgIGZhbHNlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvTm9SZWZlcmVuY2VUeXBlcy5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvTm9SZWZlcmVuY2VUeXBlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzUxYzZjLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL05vUmVmZXJlbmNlVHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnM7Ci0KLS8qKgotICogU2hvdWxkIHJlZmVyZW5jZSB0eXBlIHByb2Nlc3NpbmcgYmUgZGlzYWJsZWQ/Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOb1JlZmVyZW5jZVR5cGVzIGV4dGVuZHMgb3JnLnZtdXRpbC5vcHRpb25zLkJvb2xlYW5PcHRpb24gewotICAvKioKLSAgICogQ3JlYXRlIHRoZSBvcHRpb24uCi0gICAqLwotICBwdWJsaWMgTm9SZWZlcmVuY2VUeXBlcygpIHsKLSAgICBzdXBlcihPcHRpb25zLnNldCwgIk5vIFJlZmVyZW5jZSBUeXBlcyIsCi0gICAgICAgICAgIlNob3VsZCByZWZlcmVuY2UgdHlwZSBwcm9jZXNzaW5nIGJlIGRpc2FibGVkPyIsCi0gICAgICAgICAgZmFsc2UpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9OdXJzZXJ5U2l6ZS5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvTnVyc2VyeVNpemUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFlNmU3Yi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9OdXJzZXJ5U2l6ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkub3B0aW9uczsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIEEgY29tcG9zaXRlIG9wdGlvbiB0aGF0IHByb3ZpZGVzIGEgbWluL21heCBpbnRlcmZhY2UgdG8gTU1UaywKLSAqIGFuZCBhIGZpeGVkL2JvdW5kZWQgb3B0aW9uIGludGVyZmFjZSB0byB0aGUgVk0vdXNlci4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51cnNlcnlTaXplIHsKLSAgLy8gdmFsdWVzCi0gIHByaXZhdGUgRml4ZWROdXJzZXJ5IGZpeGVkTnVyc2VyeTsKLSAgcHJpdmF0ZSBCb3VuZGVkTnVyc2VyeSBib3VuZGVkTnVyc2VyeTsKLQotICAvKioKLSAgICogQ3JlYXRlIHRoZSBvcHRpb25zLgotICAgKi8KLSAgcHVibGljIE51cnNlcnlTaXplKCkgewotICAgIGJvdW5kZWROdXJzZXJ5ID0gbmV3IEJvdW5kZWROdXJzZXJ5KCk7Ci0gICAgZml4ZWROdXJzZXJ5ID0gbmV3IEZpeGVkTnVyc2VyeShib3VuZGVkTnVyc2VyeSk7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCB0aGUgdXBwZXIgYm91bmQgb2YgdGhlIG51cnNlcnkgc2l6ZS4KLSAgICoKLSAgICogQHJldHVybiBtYXhpbXVtIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgbnVyc2VyeS4KLSAgICovCi0gIEBVbmludGVycnVwdGlibGUKLSAgcHVibGljIGludCBnZXRNYXhOdXJzZXJ5KCkgewotICAgIHJldHVybiBib3VuZGVkTnVyc2VyeS5nZXRQYWdlcygpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBudXJzZXJ5IHNpemUuCi0gICAqCi0gICAqIEByZXR1cm4gbWluaW11bSBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIG51cnNlcnkuCi0gICAqLwotICBAVW5pbnRlcnJ1cHRpYmxlCi0gIHB1YmxpYyBpbnQgZ2V0TWluTnVyc2VyeSgpIHsKLSAgICByZXR1cm4gZml4ZWROdXJzZXJ5LmdldFBhZ2VzKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL09wdGlvbnMuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL09wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVhNjVlYy4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9PcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5vcHRpb25zOwotCi1pbXBvcnQgb3JnLnZtdXRpbC5vcHRpb25zLk9wdGlvblNldDsKLQotLyoqCi0gKiBSZXBvc2l0b3J5IGZvciBhbGwgb3B0aW9uIGluc3RhbmNlcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE9wdGlvbnMgewotICBwdWJsaWMgc3RhdGljIE9wdGlvblNldCBzZXQ7Ci0KLSAgLyogT3RoZXIgb3B0aW9ucyAqLwotICBwdWJsaWMgc3RhdGljIEJvdW5kZWROdXJzZXJ5IGJvdW5kZWROdXJzZXJ5OwotICBwdWJsaWMgc3RhdGljIENvbmN1cnJlbnRUcmlnZ2VyIGNvbmN1cnJlbnRUcmlnZ2VyOwotICBwdWJsaWMgc3RhdGljIEN5Y2xlRmlsdGVyVGhyZXNob2xkIGN5Y2xlRmlsdGVyVGhyZXNob2xkOwotICBwdWJsaWMgc3RhdGljIEN5Y2xlTWV0YURhdGFMaW1pdCBjeWNsZU1ldGFEYXRhTGltaXQ7Ci0gIHB1YmxpYyBzdGF0aWMgQ3ljbGVUcmlnZ2VyVGhyZXNob2xkIGN5Y2xlVHJpZ2dlclRocmVzaG9sZDsKLSAgcHVibGljIHN0YXRpYyBEZWJ1Z0FkZHJlc3MgZGVidWdBZGRyZXNzOwotICBwdWJsaWMgc3RhdGljIER1bW15RW51bSBkdW1teUVudW07Ci0gIHB1YmxpYyBzdGF0aWMgRGVmcmFnSGVhZHJvb20gZGVmcmFnSGVhZHJvb207Ci0gIHB1YmxpYyBzdGF0aWMgRGVmcmFnSGVhZHJvb21GcmFjdGlvbiBkZWZyYWdIZWFkcm9vbUZyYWN0aW9uOwotICBwdWJsaWMgc3RhdGljIERlZnJhZ0ZyZWVIZWFkcm9vbSBkZWZyYWdGcmVlSGVhZHJvb207Ci0gIHB1YmxpYyBzdGF0aWMgRGVmcmFnRnJlZUhlYWRyb29tRnJhY3Rpb24gZGVmcmFnRnJlZUhlYWRyb29tRnJhY3Rpb247Ci0gIHB1YmxpYyBzdGF0aWMgRGVmcmFnTGluZVJldXNlUmF0aW8gZGVmcmFnTGluZVJldXNlUmF0aW87Ci0gIHB1YmxpYyBzdGF0aWMgRGVmcmFnU2ltcGxlU3BpbGxUaHJlc2hvbGQgZGVmcmFnU2ltcGxlU3BpbGxUaHJlc2hvbGQ7Ci0gIHB1YmxpYyBzdGF0aWMgRGVmcmFnU3RyZXNzIGRlZnJhZ1N0cmVzczsKLSAgcHVibGljIHN0YXRpYyBFYWdlckNvbXBsZXRlU3dlZXAgZWFnZXJDb21wbGV0ZVN3ZWVwOwotICBwdWJsaWMgc3RhdGljIEVhZ2VyTW1hcFNwYWNlcyBlYWdlck1tYXBTcGFjZXM7Ci0gIHB1YmxpYyBzdGF0aWMgRml4ZWROdXJzZXJ5IGZpeGVkTnVyc2VyeTsKLSAgcHVibGljIHN0YXRpYyBGcmFnbWVudGF0aW9uU3RhdHMgZnJhZ21lbnRhdGlvblN0YXRzOwotICBwdWJsaWMgc3RhdGljIEZ1bGxIZWFwU3lzdGVtR0MgZnVsbEhlYXBTeXN0ZW1HQzsKLSAgcHVibGljIHN0YXRpYyBHQ3NweVBvcnQgZ2NzcHlQb3J0OwotICBwdWJsaWMgc3RhdGljIEdDc3B5VGlsZVNpemUgZ2NzcHlUaWxlU2l6ZTsKLSAgcHVibGljIHN0YXRpYyBHQ3NweVdhaXQgZ2NzcHlXYWl0OwotICBwdWJsaWMgc3RhdGljIEdDVGltZUNhcCBnY1RpbWVDYXA7Ci0gIHB1YmxpYyBzdGF0aWMgR2VuQ3ljbGVEZXRlY3Rpb24gZ2VuQ3ljbGVEZXRlY3Rpb247Ci0gIHB1YmxpYyBzdGF0aWMgSGFybmVzc0FsbCBoYXJuZXNzQWxsOwotICBwdWJsaWMgc3RhdGljIElnbm9yZVN5c3RlbUdDIGlnbm9yZVN5c3RlbUdDOwotICBwdWJsaWMgc3RhdGljIExpbmVSZXVzZVJhdGlvIGxpbmVSZXVzZVJhdGlvOwotICBwdWJsaWMgc3RhdGljIE1hcmtTd2VlcE1hcmtCaXRzIG1hcmtTd2VlcE1hcmtCaXRzOwotICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhTGltaXQgbWV0YURhdGFMaW1pdDsKLSAgcHVibGljIHN0YXRpYyBOb0ZpbmFsaXplciBub0ZpbmFsaXplcjsKLSAgcHVibGljIHN0YXRpYyBOb1JlZmVyZW5jZVR5cGVzIG5vUmVmZXJlbmNlVHlwZXM7Ci0gIHB1YmxpYyBzdGF0aWMgTnVyc2VyeVNpemUgbnVyc2VyeVNpemU7Ci0gIHB1YmxpYyBzdGF0aWMgUGVyZkV2ZW50cyBwZXJmRXZlbnRzOwotICBwdWJsaWMgc3RhdGljIFByaW50UGhhc2VTdGF0cyBwcmludFBoYXNlU3RhdHM7Ci0gIHB1YmxpYyBzdGF0aWMgUHJvdGVjdE9uUmVsZWFzZSBwcm90ZWN0T25SZWxlYXNlOwotICBwdWJsaWMgc3RhdGljIFNhbml0eUNoZWNrIHNhbml0eUNoZWNrOwotICBwdWJsaWMgc3RhdGljIFN0cmVzc0ZhY3RvciBzdHJlc3NGYWN0b3I7Ci0gIHB1YmxpYyBzdGF0aWMgVHJhY2VSYXRlIHRyYWNlUmF0ZTsKLSAgcHVibGljIHN0YXRpYyBWYXJpYWJsZVNpemVIZWFwIHZhcmlhYmxlU2l6ZUhlYXA7Ci0gIHB1YmxpYyBzdGF0aWMgVmVyYm9zZUZyYWdtZW50YXRpb25TdGF0cyB2ZXJib3NlRnJhZ21lbnRhdGlvblN0YXRzOwotICBwdWJsaWMgc3RhdGljIFZlcmJvc2UgdmVyYm9zZTsKLSAgcHVibGljIHN0YXRpYyBWZXJib3NlVGltaW5nIHZlcmJvc2VUaW1pbmc7Ci0gIHB1YmxpYyBzdGF0aWMgWG1sU3RhdHMgeG1sU3RhdHM7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9QZXJmRXZlbnRzLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9QZXJmRXZlbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMjhhMzAuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvUGVyZkV2ZW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkub3B0aW9uczsKLQotLyoqCi0gKiBQZXJmb3JtYW5jZSBjb3VudGVyIG9wdGlvbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJmRXZlbnRzIGV4dGVuZHMgb3JnLnZtdXRpbC5vcHRpb25zLlN0cmluZ09wdGlvbiB7Ci0gIC8qKgotICAgKiBDcmVhdGUgdGhlIG9wdGlvbi4KLSAgICovCi0gIHB1YmxpYyBQZXJmRXZlbnRzKCkgewotICAgIHN1cGVyKE9wdGlvbnMuc2V0LCAiUGVyZiBFdmVudHMiLAotICAgICAgICAiVXNlIHRoaXMgdG8gc3BlY2lmeSBhIGNvbW1hIHNlcGVyYXRlZCBsaXN0IG9mIHBlcmZvcm1hbmNlIGV2ZW50cyB0byBtZWFzdXJlIiwKLSAgICAgICAgIiIpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9QcmludFBoYXNlU3RhdHMuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL1ByaW50UGhhc2VTdGF0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjU2YWQ5Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL1ByaW50UGhhc2VTdGF0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkub3B0aW9uczsKLQotLyoqCi0gKiBXaGVuIHByaW50aW5nIHN0YXRpc3RpY3MsIHNob3VsZCBzdGF0aXN0aWNzIGZvciBlYWNoCi0gKiBnYy1tdXRhdG9yIHBoYXNlIGJlIHByaW50ZWQ/Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcmludFBoYXNlU3RhdHMgZXh0ZW5kcyBvcmcudm11dGlsLm9wdGlvbnMuQm9vbGVhbk9wdGlvbiB7Ci0gIC8qKgotICAgKiBDcmVhdGUgdGhlIG9wdGlvbi4KLSAgICovCi0gIHB1YmxpYyBQcmludFBoYXNlU3RhdHMoKSB7Ci0gICAgc3VwZXIoT3B0aW9ucy5zZXQsICJQcmludCBQaGFzZSBTdGF0cyIsCi0gICAgICAgICJXaGVuIHByaW50aW5nIHN0YXRpc3RpY3MsIHNob3VsZCBzdGF0aXN0aWNzIGZvciBlYWNoIGdjLW11dGF0b3IgcGhhc2UgYmUgcHJpbnRlZD8iLAotICAgICAgICBmYWxzZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL1Byb3RlY3RPblJlbGVhc2UuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL1Byb3RlY3RPblJlbGVhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ4YmM3MS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9Qcm90ZWN0T25SZWxlYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5vcHRpb25zOwotCi0vKioKLSAqIFNob3VsZCBtZW1vcnkgYmUgcHJvdGVjdGVkIG9uIHJlbGVhc2U/Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm90ZWN0T25SZWxlYXNlIGV4dGVuZHMgb3JnLnZtdXRpbC5vcHRpb25zLkJvb2xlYW5PcHRpb24gewotICAvKioKLSAgICogQ3JlYXRlIHRoZSBvcHRpb24uCi0gICAqLwotICBwdWJsaWMgUHJvdGVjdE9uUmVsZWFzZSgpIHsKLSAgICBzdXBlcihPcHRpb25zLnNldCwgIlByb3RlY3QgT24gUmVsZWFzZSIsCi0gICAgICAgICAgIlNob3VsZCBtZW1vcnkgYmUgcHJvdGVjdGVkIG9uIHJlbGVhc2U/IiwKLSAgICAgICAgICBmYWxzZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL1Nhbml0eUNoZWNrLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9TYW5pdHlDaGVjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTM5YjQ2Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL1Nhbml0eUNoZWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5vcHRpb25zOwotCi0KLS8qKgotICogU2hvdWxkIGEgbWFqb3IgR0MgYmUgcGVyZm9ybWVkIHdoZW4gYSBzeXN0ZW0gR0MgaXMgdHJpZ2dlcmVkPwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2FuaXR5Q2hlY2sgZXh0ZW5kcyBvcmcudm11dGlsLm9wdGlvbnMuQm9vbGVhbk9wdGlvbiB7Ci0gIC8qKgotICAgKiBDcmVhdGUgdGhlIG9wdGlvbi4KLSAgICovCi0gIHB1YmxpYyBTYW5pdHlDaGVjaygpIHsKLSAgICBzdXBlcihPcHRpb25zLnNldCwgIlNhbml0eSBDaGVjayIsCi0gICAgICAgICAgIlBlcmZvcm0gc2FuaXR5IGNoZWNrcyBiZWZvcmUgYW5kIGFmdGVyIGVhY2ggY29sbGVjdGlvbj8iLAotICAgICAgICAgIGZhbHNlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvU3RyZXNzRmFjdG9yLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9TdHJlc3NGYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI3MDVkMC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9TdHJlc3NGYWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnM7Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlBsYW47Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Db25zdGFudHM7Ci0KLS8qKgotICogRm9yY2UgZnJlcXVlbnQgY29sbGVjdGlvbnMgYWZ0ZXIgYW1vdW50cyBvZiBhbGxvY2F0aW9uLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RyZXNzRmFjdG9yIGV4dGVuZHMgb3JnLnZtdXRpbC5vcHRpb25zLlBhZ2VzT3B0aW9uIHsKLSAgLyoqCi0gICAqIENyZWF0ZSB0aGUgb3B0aW9uLCBkZWZhdWx0aW5nIHRvIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHZhbHVlLgotICAgKi8KLSAgcHVibGljIFN0cmVzc0ZhY3RvcigpIHsKLSAgICBzdXBlcihPcHRpb25zLnNldCwgIlN0cmVzcyBGYWN0b3IiLAotICAgICAgICAgICJGb3JjZSBhIGNvbGxlY3Rpb24gYWZ0ZXIgdGhpcyBtdWNoIGFsbG9jYXRpb24iLAotICAgICAgICBJbnRlZ2VyLk1BWF9WQUxVRSA+Pj4gQ29uc3RhbnRzLkxPR19CWVRFU19JTl9QQUdFKTsKLSAgfQotCi0gIC8qKgotICAgKiBFbnN1cmUgdGhhdCB0aGUgdmFsdWUgaXMgc2Vuc2libGUuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKLSAgICBmYWlsSWYodGhpcy52YWx1ZSA8IFBsYW4uREVGQVVMVF9QT0xMX0ZSRVFVRU5DWSwKLSAgICAgICAgIlN0cmVzcyBGYWN0b3IgbXVzdCBiZSBhdCBsZWFzdCBlcXVhbCB0byBwbGFuJ3MgcG9sbCBmcmVxdWVuY3kiKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvVHJhY2VSYXRlLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9UcmFjZVJhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI1NDI2Mi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9UcmFjZVJhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnM7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBUaGUgZ3JhbnVsYXJpdHkgb2YgdGhlIHRyYWNlIGJlaW5nIHByb2R1Y2VkLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVHJhY2VSYXRlIGV4dGVuZHMgb3JnLnZtdXRpbC5vcHRpb25zLkludE9wdGlvbgotICBpbXBsZW1lbnRzIG9yZy5tbXRrLnV0aWxpdHkuQ29uc3RhbnRzIHsKLSAgLyoqCi0gICAqIENyZWF0ZSB0aGUgb3B0aW9uLgotICAgKi8KLSAgcHVibGljIFRyYWNlUmF0ZSgpIHsKLSAgICBzdXBlcihPcHRpb25zLnNldCwgIlRyYWNlIFJhdGUiLAotICAgICAgICAiVGhlIGdyYW51bGFyaXR5IG9mIHRoZSB0cmFjZSBiZWluZyBwcm9kdWNlZC4gIEJ5IGRlZmF1bHQsIHRoZSB0cmFjZSBoYXMgdGhlIG1heGltdW0gcG9zc2libGUgZ3JhbnVsYXJpdHkuIiwKLSAgICAgICAgSW50ZWdlci5NQVhfVkFMVUUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgdmFsdWUuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIHRyYWNlIHJhdGUuCi0gICAqLwotICBAVW5pbnRlcnJ1cHRpYmxlCi0gIHB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7Ci0gICAgcmV0dXJuICh0aGlzLnZhbHVlIDwgQllURVNfSU5fQUREUkVTUykgPyAxIDogKHRoaXMudmFsdWUgPj4gTE9HX0JZVEVTX0lOX0FERFJFU1MpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRyYWNlIHJhdGUgbXVzdCBiZSBwb3NpdGl2ZS4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkgewotICAgIGZhaWxJZih2YWx1ZSA8PSAwLCAiQ2FuIG5vdCBoYXZlIGEgbmVnYXRpdmUgdHJhY2UgcmF0ZSIpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9WYXJpYWJsZVNpemVIZWFwLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9WYXJpYWJsZVNpemVIZWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZDQ2ZWQuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvVmFyaWFibGVTaXplSGVhcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkub3B0aW9uczsKLQotLyoqCi0gKiBTaG91bGQgd2Ugc2hyaW5rL2dyb3cgdGhlIGhlYXAgdG8gYWRqdXN0IHRvIGFwcGxpY2F0aW9uIHdvcmtpbmcgc2V0PwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVmFyaWFibGVTaXplSGVhcCBleHRlbmRzIG9yZy52bXV0aWwub3B0aW9ucy5Cb29sZWFuT3B0aW9uIHsKLSAgLyoqCi0gICAqIENyZWF0ZSB0aGUgb3B0aW9uLgotICAgKi8KLSAgcHVibGljIFZhcmlhYmxlU2l6ZUhlYXAoKSB7Ci0gICAgc3VwZXIoT3B0aW9ucy5zZXQsICJWYXJpYWJsZSBTaXplIEhlYXAiLAotICAgICAgICAiU2hvdWxkIHdlIHNocmluay9ncm93IHRoZSBoZWFwIHRvIGFkanVzdCB0byBhcHBsaWNhdGlvbiB3b3JraW5nIHNldD8iLAotICAgICAgICB0cnVlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvVmVyYm9zZS5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvVmVyYm9zZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTdmZDg1Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL1ZlcmJvc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnM7Ci0KLS8qKgotICogR0MgdmVyYm9zaXR5IGxldmVsLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVmVyYm9zZSBleHRlbmRzIG9yZy52bXV0aWwub3B0aW9ucy5JbnRPcHRpb24gewotICAvKioKLSAgICogQ3JlYXRlIHRoZSBvcHRpb24uCi0gICAqLwotICBwdWJsaWMgVmVyYm9zZSgpIHsKLSAgICBzdXBlcihPcHRpb25zLnNldCwgIlZlcmJvc2UiLAotICAgICAgICAgICJHQyB2ZXJib3NpdHkgbGV2ZWwiLAotICAgICAgICAgIDApOwotICB9Ci0KLSAgLyoqCi0gICAqIE9ubHkgYWNjZXB0IG5vbi1uZWdhdGl2ZSB2YWx1ZXMuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZSgpIHsKLSAgICBmYWlsSWYodGhpcy52YWx1ZSA8IDAsICJVbnJlYXNvbmFibGUgdmVyYm9zaXR5IGxldmVsIik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL1ZlcmJvc2VGcmFnbWVudGF0aW9uU3RhdHMuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL1ZlcmJvc2VGcmFnbWVudGF0aW9uU3RhdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNlY2I4OS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvb3B0aW9ucy9WZXJib3NlRnJhZ21lbnRhdGlvblN0YXRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5vcHRpb25zOwotCi0vKioKLSAqIFNob3VsZCB3ZSBwcmludCB2ZXJib3NlIGZyYWdtZW50YXRpb24gc3RhdGlzdGljcyBmb3IgdGhlIGZyZWUgbGlzdCBhbGxvY2F0b3I/Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWZXJib3NlRnJhZ21lbnRhdGlvblN0YXRzIGV4dGVuZHMgb3JnLnZtdXRpbC5vcHRpb25zLkJvb2xlYW5PcHRpb24gewotICAvKioKLSAgICogQ3JlYXRlIHRoZSBvcHRpb24uCi0gICAqLwotICBwdWJsaWMgVmVyYm9zZUZyYWdtZW50YXRpb25TdGF0cygpIHsKLSAgICBzdXBlcihPcHRpb25zLnNldCwgIlZlcmJvc2UgRnJhZ21lbnRhdGlvbiBTdGF0cyIsCi0gICAgICAgICJTaG91bGQgd2UgcHJpbnQgdmVyYm9zZSBmcmFnbWVudGF0aW9uIHN0YXRpc3RpY3MgZm9yIHRoZSBmcmVlIGxpc3QgYWxsb2NhdG9yPyIsCi0gICAgICAgIGZhbHNlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvVmVyYm9zZVRpbWluZy5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvVmVyYm9zZVRpbWluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODc0NmRmLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL1ZlcmJvc2VUaW1pbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnM7Ci0KLS8qKgotICogU2hvdWxkIHdlIGRpc3BsYXkgZGV0YWlsZWQgYnJlYWtkb3duIG9mIHdoZXJlIEdDIHRpbWUgaXMgc3BlbnQ/Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWZXJib3NlVGltaW5nIGV4dGVuZHMgb3JnLnZtdXRpbC5vcHRpb25zLkJvb2xlYW5PcHRpb24gewotICAvKioKLSAgICogQ3JlYXRlIHRoZSBvcHRpb24uCi0gICAqLwotICBwdWJsaWMgVmVyYm9zZVRpbWluZygpIHsKLSAgICBzdXBlcihPcHRpb25zLnNldCwgIlZlcmJvc2UgVGltaW5nIiwKLSAgICAgICAgIlNob3VsZCB3ZSBkaXNwbGF5IGRldGFpbGVkIGJyZWFrZG93biBvZiB3aGVyZSBHQyB0aW1lIGlzIHNwZW50PyIsCi0gICAgICAgIGZhbHNlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvWG1sU3RhdHMuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9vcHRpb25zL1htbFN0YXRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YWJlYjAuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L29wdGlvbnMvWG1sU3RhdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnM7Ci0KLS8qKgotICogRGlzcGxheSBzdGF0aXN0aWNzIGFuZCBvcHRpb25zIGluIFhNTCByYXRoZXIgdGhhbiBoaW1hbi1yZWFkYWJsZQotICogZm9ybWF0LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWG1sU3RhdHMgZXh0ZW5kcyBvcmcudm11dGlsLm9wdGlvbnMuQm9vbGVhbk9wdGlvbiB7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSB0aGUgb3B0aW9uLgotICAgKi8KLSAgcHVibGljIFhtbFN0YXRzKCkgewotICAgIHN1cGVyKE9wdGlvbnMuc2V0LCAiWG1sIFN0YXRzIiwgIlByaW50IGVuZC1vZi1ydW4gc3RhdGlzdGljcyBpbiBYTUwgZm9ybWF0IiwgZmFsc2UpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9zYW5pdHljaGVja2VyL1Nhbml0eUNoZWNrZXIuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9zYW5pdHljaGVja2VyL1Nhbml0eUNoZWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU4MGRiZS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvc2FuaXR5Y2hlY2tlci9TYW5pdHlDaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkuc2FuaXR5Y2hlY2tlcjsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uUGxhbjsKLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYWNlOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uU2ltcGxlOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhY2VMb2NhbDsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuU3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Mb2c7Ci0KLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHBlcmZvcm1zIHNhbml0eSBjaGVja3MgZm9yIFNpbXBsZSBjb2xsZWN0b3JzLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgZmluYWwgY2xhc3MgU2FuaXR5Q2hlY2tlciBpbXBsZW1lbnRzIENvbnN0YW50cyB7Ci0KLSAgLyogQ291bnRlcnMgKi8KLSAgcHVibGljIHN0YXRpYyBsb25nIHJlZmVyZW5jZUNvdW50OwotICBwdWJsaWMgc3RhdGljIGxvbmcgcm9vdFJlZmVyZW5jZUNvdW50OwotICBwdWJsaWMgc3RhdGljIGxvbmcgZGFuZ2xpbmdSZWZlcmVuY2VDb3VudDsKLSAgcHVibGljIHN0YXRpYyBsb25nIG51bGxSZWZlcmVuY2VDb3VudDsKLSAgcHVibGljIHN0YXRpYyBsb25nIGxpdmVPYmplY3RDb3VudDsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUFEID0gLTI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMSVZFID0gLTE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU1VSRSA9IDA7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9HX1NBTklUWV9EQVRBX1NJWkUgPSAyNDsKLQotICAvKiBUcmFjaW5nICovCi0gIHB1YmxpYyBUcmFjZSByb290VHJhY2U7Ci0gIHB1YmxpYyBUcmFjZSBjaGVja1RyYWNlOwotICBwcml2YXRlIGZpbmFsIFNhbml0eURhdGFUYWJsZSBzYW5pdHlUYWJsZTsKLSAgcHJpdmF0ZSBib29sZWFuIHByZUdDU2FuaXR5OwotCi0gIC8qIExvY2FsLCBidXQgd2Ugb25seSBydW4gdGhlIGNoZWNrIHRyYWNlIHNpbmdsZS10aHJlYWRlZC4gKi8KLSAgZmluYWwgU2FuaXR5VHJhY2VMb2NhbCBjaGVja1RyYWNlTG9jYWw7Ci0KLSAgLyogTGluZWFyIHNjYW5uaW5nICovCi0gIHByaXZhdGUgZmluYWwgU2FuaXR5TGluZWFyU2NhbiBzY2FubmVyID0gbmV3IFNhbml0eUxpbmVhclNjYW4odGhpcyk7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogQ29uc3RhbnRzCi0gICAqLwotICBwdWJsaWMgU2FuaXR5Q2hlY2tlcigpIHsKLSAgICBzYW5pdHlUYWJsZSA9IG5ldyBTYW5pdHlEYXRhVGFibGUoUGxhbi5zYW5pdHlTcGFjZSwgTE9HX1NBTklUWV9EQVRBX1NJWkUpOwotICAgIGNoZWNrVHJhY2UgPSBuZXcgVHJhY2UoUGxhbi5zYW5pdHlTcGFjZSk7Ci0gICAgcm9vdFRyYWNlID0gbmV3IFRyYWNlKFBsYW4uc2FuaXR5U3BhY2UpOwotICAgIGNoZWNrVHJhY2VMb2NhbCA9IG5ldyBTYW5pdHlUcmFjZUxvY2FsKGNoZWNrVHJhY2UsIHRoaXMpOwotICB9Ci0KLSAgLyoqCi0gICAqIFBlcmZvcm0gYW55IHNhbml0eSBjaGVja2luZyBjb2xsZWN0aW9uIHBoYXNlcy4KLSAgICoKLSAgICogQHBhcmFtIHBoYXNlSWQgVGhlIGlkIHRvIHByb2NlcwotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHBoYXNlIHdhcyBoYW5kbGVkLgotICAgKi8KLSAgQE5vSW5saW5lCi0gIHB1YmxpYyBib29sZWFuIGNvbGxlY3Rpb25QaGFzZShpbnQgcGhhc2VJZCkgewotICAgIGlmIChwaGFzZUlkID09IFNpbXBsZS5TQU5JVFlfU0VUX1BSRUdDKSB7Ci0gICAgICBwcmVHQ1Nhbml0eSA9IHRydWU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBTaW1wbGUuU0FOSVRZX1NFVF9QT1NUR0MpIHsKLSAgICAgIHByZUdDU2FuaXR5ID0gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBTaW1wbGUuU0FOSVRZX1BSRVBBUkUpIHsKLSAgICAgIExvZy53cml0ZWxuKCIiKTsKLSAgICAgIExvZy53cml0ZSgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEdDIFNhbml0eSBDaGVja2luZyAiKTsKLSAgICAgIExvZy53cml0ZWxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLSAgICAgIExvZy53cml0ZWxuKHByZUdDU2FuaXR5ID8gIlBlcmZvcm1pbmcgUHJlLUdDIFNhbml0eSBDaGVja3MuLi4iIDogIlBlcmZvcm1pbmcgUG9zdC1HQyBTYW5pdHkgQ2hlY2tzLi4uIik7Ci0KLSAgICAgIC8vIFJlc2V0IGNvdW50ZXJzCi0gICAgICByZWZlcmVuY2VDb3VudCA9IDA7Ci0gICAgICBudWxsUmVmZXJlbmNlQ291bnQgPSAwOwotICAgICAgbGl2ZU9iamVjdENvdW50ID0gMDsKLSAgICAgIGRhbmdsaW5nUmVmZXJlbmNlQ291bnQgPSAwOwotICAgICAgcm9vdFJlZmVyZW5jZUNvdW50ID0gMDsKLQotICAgICAgLy8gQ2xlYXIgZGF0YSBzcGFjZQotICAgICAgc2FuaXR5VGFibGUuYWNxdWlyZVRhYmxlKCk7Ci0KLSAgICAgIC8vIFJvb3QgdHJhY2UKLSAgICAgIHJvb3RUcmFjZS5wcmVwYXJlTm9uQmxvY2tpbmcoKTsKLQotICAgICAgLy8gQ2hlY2tpbmcgdHJhY2UKLSAgICAgIGNoZWNrVHJhY2UucHJlcGFyZU5vbkJsb2NraW5nKCk7Ci0gICAgICBjaGVja1RyYWNlTG9jYWwucHJlcGFyZSgpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYgKHBoYXNlSWQgPT0gU2ltcGxlLlNBTklUWV9ST09UUykgewotICAgICAgVk0uc2Nhbm5pbmcucmVzZXRUaHJlYWRDb3VudGVyKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAocGhhc2VJZCA9PSBTaW1wbGUuU0FOSVRZX0JVSUxEX1RBQkxFKSB7Ci0gICAgICAvLyBUcmFjZSwgY2hlY2tpbmcgZm9yIGRhbmdsaW5nIHBvaW50ZXJzCi0gICAgICBjaGVja1RyYWNlTG9jYWwuY29tcGxldGVUcmFjZSgpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYgKHBoYXNlSWQgPT0gU2ltcGxlLlNBTklUWV9DSEVDS19UQUJMRSkgewotICAgICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSByZWFjaGFibGUgb2JqZWN0cy4KLSAgICAgIEFkZHJlc3MgY3VyciA9IHNhbml0eVRhYmxlLmdldEZpcnN0KCk7Ci0gICAgICB3aGlsZSAoIWN1cnIuaXNaZXJvKCkpIHsKLSAgICAgICAgT2JqZWN0UmVmZXJlbmNlIHJlZiA9IFNhbml0eURhdGFUYWJsZS5nZXRPYmplY3RSZWZlcmVuY2UoY3Vycik7Ci0gICAgICAgIGludCBub3JtYWxSQyA9IFNhbml0eURhdGFUYWJsZS5nZXROb3JtYWxSQyhjdXJyKTsKLSAgICAgICAgaW50IHJvb3RSQyA9IFNhbml0eURhdGFUYWJsZS5nZXRSb290UkMoY3Vycik7Ci0gICAgICAgIGlmICghcHJlR0NTYW5pdHkpIHsKLSAgICAgICAgICBpbnQgZXhwZWN0ZWRSQyA9IFZNLmFjdGl2ZVBsYW4uZ2xvYmFsKCkuc2FuaXR5RXhwZWN0ZWRSQyhyZWYsIHJvb3RSQyk7Ci0gICAgICAgICAgc3dpdGNoIChleHBlY3RlZFJDKSB7Ci0gICAgICAgICAgY2FzZSBTYW5pdHlDaGVja2VyLkFMSVZFOgotICAgICAgICAgIGNhc2UgU2FuaXR5Q2hlY2tlci5VTlNVUkU6Ci0gICAgICAgICAgICAvLyBBbHdheXMgb2suCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFNhbml0eUNoZWNrZXIuREVBRDoKLSAgICAgICAgICAgIC8vIE5ldmVyIG9rLgotICAgICAgICAgICAgTG9nLndyaXRlKCJFUlJPUjogU2FuaXR5UkMgPSAiKTsKLSAgICAgICAgICAgIExvZy53cml0ZShub3JtYWxSQyk7Ci0gICAgICAgICAgICBMb2cud3JpdGUoIiwgU3BhY2VSQyA9IDAgIik7Ci0gICAgICAgICAgICBTYW5pdHlDaGVja2VyLmR1bXBPYmplY3RJbmZvcm1hdGlvbihyZWYpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIEEgbWlzbWF0Y2ggaW4gYW4gUkMgc3BhY2UKLSAgICAgICAgICAgIGlmIChub3JtYWxSQyAhPSBleHBlY3RlZFJDICYmIFZNLmFjdGl2ZVBsYW4uZ2xvYmFsKCkubGFzdENvbGxlY3Rpb25GdWxsSGVhcCgpKSB7Ci0gICAgICAgICAgICAgIExvZy53cml0ZSgiV0FSTklORzogU2FuaXR5UkMgPSAiKTsKLSAgICAgICAgICAgICAgTG9nLndyaXRlKG5vcm1hbFJDKTsKLSAgICAgICAgICAgICAgTG9nLndyaXRlKCIsIFNwYWNlUkMgPSAiKTsKLSAgICAgICAgICAgICAgTG9nLndyaXRlKGV4cGVjdGVkUkMpOwotICAgICAgICAgICAgICBMb2cud3JpdGUoIiAiKTsKLSAgICAgICAgICAgICAgU2FuaXR5Q2hlY2tlci5kdW1wT2JqZWN0SW5mb3JtYXRpb24ocmVmKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGN1cnIgPSBzYW5pdHlUYWJsZS5nZXROZXh0KGN1cnIpOwotICAgICAgfQotCi0gICAgICBpZiAoIXByZUdDU2FuaXR5ICYmIFZNLmFjdGl2ZVBsYW4uZ2xvYmFsKCkubGFzdENvbGxlY3Rpb25GdWxsSGVhcCgpKSB7Ci0gICAgICAgIFZNLmFjdGl2ZVBsYW4uZ2xvYmFsKCkuc2FuaXR5TGluZWFyU2NhbihzY2FubmVyKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmIChwaGFzZUlkID09IFNpbXBsZS5TQU5JVFlfUkVMRUFTRSkgewotICAgICAgY2hlY2tUcmFjZS5yZWxlYXNlKCk7Ci0gICAgICBzYW5pdHlUYWJsZS5yZWxlYXNlVGFibGUoKTsKLSAgICAgIGNoZWNrVHJhY2VMb2NhbC5yZWxlYXNlKCk7Ci0KLSAgICAgIExvZy53cml0ZWxuKCJyb290c1x0b2JqZWN0c1x0cmVmc1x0bnVsbCIpOwotICAgICAgTG9nLndyaXRlKHJvb3RSZWZlcmVuY2VDb3VudCk7TG9nLndyaXRlKCJcdCIpOwotICAgICAgTG9nLndyaXRlKGxpdmVPYmplY3RDb3VudCk7TG9nLndyaXRlKCJcdCIpOwotICAgICAgTG9nLndyaXRlKHJlZmVyZW5jZUNvdW50KTtMb2cud3JpdGUoIlx0Iik7Ci0gICAgICBMb2cud3JpdGVsbihudWxsUmVmZXJlbmNlQ291bnQpOwotCi0gICAgICBMb2cud3JpdGUoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLSAgICAgIExvZy53cml0ZWxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBQcm9jZXNzIGFuIG9iamVjdCBkdXJpbmcgYSBsaW5lYXIgc2NhbiBvZiB0aGUgaGVhcC4gV2UgaGF2ZSBhbHJlYWR5IGNoZWNrZWQKLSAgICogYWxsIG9iamVjdHMgaW4gdGhlIHRhYmxlLiBTbyB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIG9iamVjdHMgdGhhdCBhcmUgbm90IGluCi0gICAqIHRoZSBzYW5pdHkgdGFibGUgaGVyZS4gV2UgYXJlIHRoZXJlZm9yZSBvbmx5IGxvb2tpbmcgZm9yIGxlYWtzIGhlcmUuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCBiZWluZyBzY2FubmVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2NhblByb2Nlc3NPYmplY3QoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIGlmIChzYW5pdHlUYWJsZS5nZXRFbnRyeShvYmplY3QsIGZhbHNlKS5pc1plcm8oKSkgewotICAgICAgLy8gSXMgdGhpcyBhIGxlYWs/Ci0gICAgICBpbnQgZXhwZWN0ZWRSQyA9IFZNLmFjdGl2ZVBsYW4uZ2xvYmFsKCkuc2FuaXR5RXhwZWN0ZWRSQyhvYmplY3QsIDApOwotCi0gICAgICBpZiAoZXhwZWN0ZWRSQyA9PSBTYW5pdHlDaGVja2VyLlVOU1VSRSkgewotICAgICAgICAvLyBQcm9iYWJseSBub3QuCi0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgLy8gUG9zc2libHkKLSAgICAgIExvZy53cml0ZSgiV0FSTklORzogUG9zc2libGUgbGVhaywgU3BhY2VSQyA9ICIpOwotICAgICAgTG9nLndyaXRlKGV4cGVjdGVkUkMpOwotICAgICAgTG9nLndyaXRlKCIgIik7Ci0gICAgICBTYW5pdHlDaGVja2VyLmR1bXBPYmplY3RJbmZvcm1hdGlvbihvYmplY3QpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQcm9jZXNzIGFuIG9iamVjdCBkdXJpbmcgc2FuaXR5IGNoZWNraW5nLCB2YWxpZGF0aW5nIGRhdGEsCi0gICAqIGluY3JlbWVudGluZyBjb3VudGVycyBhbmQgZW5xdWV1aW5nIGlmIHRoaXMgaXMgdGhlIGZpcnN0Ci0gICAqIHZpc2l0IHRvIHRoZSBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBtYXJrLgotICAgKiBAcGFyYW0gcm9vdCBUcnVlIElmIHRoZSBvYmplY3QgaXMgYSByb290LgotICAgKi8KLSAgcHVibGljIHZvaWQgcHJvY2Vzc09iamVjdChUcmFjZUxvY2FsIHRyYWNlLCBPYmplY3RSZWZlcmVuY2Ugb2JqZWN0LCBib29sZWFuIHJvb3QpIHsKLSAgICBTYW5pdHlDaGVja2VyLnJlZmVyZW5jZUNvdW50Kys7Ci0gICAgaWYgKHJvb3QpIFNhbml0eUNoZWNrZXIucm9vdFJlZmVyZW5jZUNvdW50Kys7Ci0KLSAgICBpZiAob2JqZWN0LmlzTnVsbCgpKSB7Ci0gICAgICBTYW5pdHlDaGVja2VyLm51bGxSZWZlcmVuY2VDb3VudCsrOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChQbGFuLlNDQU5fQk9PVF9JTUFHRSAmJiBTcGFjZS5pc0luU3BhY2UoUGxhbi5WTV9TUEFDRSwgb2JqZWN0KSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIEdldCB0aGUgdGFibGUgZW50cnkuCi0gICAgQWRkcmVzcyB0YWJsZUVudHJ5ID0gc2FuaXR5VGFibGUuZ2V0RW50cnkob2JqZWN0LCB0cnVlKTsKLQotICAgIGlmIChTYW5pdHlEYXRhVGFibGUuaW5jUkModGFibGVFbnRyeSwgcm9vdCkpIHsKLSAgICAgIFNhbml0eUNoZWNrZXIubGl2ZU9iamVjdENvdW50Kys7Ci0gICAgICB0cmFjZS5wcm9jZXNzTm9kZShvYmplY3QpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQcmludCBvdXQgb2JqZWN0IGluZm9ybWF0aW9uICh1c2VkIGZvciB3YXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcykKLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGR1bXAgaW5mbyBmb3IuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgZHVtcE9iamVjdEluZm9ybWF0aW9uKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBMb2cud3JpdGUob2JqZWN0KTsKLSAgICBMb2cud3JpdGUoIiBbIik7Ci0gICAgTG9nLndyaXRlKFNwYWNlLmdldFNwYWNlRm9yT2JqZWN0KG9iamVjdCkuZ2V0TmFtZSgpKTsKLSAgICBMb2cud3JpdGUoIl0gIik7Ci0gICAgTG9nLndyaXRlbG4oVk0ub2JqZWN0TW9kZWwuZ2V0VHlwZURlc2NyaXB0b3Iob2JqZWN0KSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9zYW5pdHljaGVja2VyL1Nhbml0eUNoZWNrZXJMb2NhbC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L3Nhbml0eWNoZWNrZXIvU2FuaXR5Q2hlY2tlckxvY2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YjA5MzYuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L3Nhbml0eWNoZWNrZXIvU2FuaXR5Q2hlY2tlckxvY2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5zYW5pdHljaGVja2VyOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5QbGFuOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uU2ltcGxlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHBlcmZvcm1zIHNhbml0eSBjaGVja3MgZm9yIFNpbXBsZSBjb2xsZWN0b3JzLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgZmluYWwgY2xhc3MgU2FuaXR5Q2hlY2tlckxvY2FsIGltcGxlbWVudHMgQ29uc3RhbnRzIHsKLQotICAvKiBUcmFjZSAqLwotICBmaW5hbCBTYW5pdHlSb290VHJhY2VMb2NhbCByb290VHJhY2VMb2NhbDsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBDb25zdGFudHMKLSAgICovCi0gIHB1YmxpYyBTYW5pdHlDaGVja2VyTG9jYWwoKSB7Ci0gICAgcm9vdFRyYWNlTG9jYWwgPSBuZXcgU2FuaXR5Um9vdFRyYWNlTG9jYWwoUGxhbi5zYW5pdHlDaGVja2VyLnJvb3RUcmFjZSk7Ci0gIH0KLQotICAvKioKLSAgICogUGVyZm9ybSBhbnkgc2FuaXR5IGNoZWNraW5nIGNvbGxlY3Rpb24gcGhhc2VzLgotICAgKgotICAgKiBAcGFyYW0gcGhhc2VJZCBUaGUgaWQgdG8gcHJvY2VzCi0gICAqIEBwYXJhbSBwcmltYXJ5IFBlcmZvcm0gbG9jYWwgc2luZ2xlIHRocmVhZGVkIGFjdGlvbnMgb24gdGhpcyB0aHJlYWQKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBwaGFzZSB3YXMgaGFuZGxlZC4KLSAgICovCi0gIEBOb0lubGluZQotICBwdWJsaWMgYm9vbGVhbiBjb2xsZWN0aW9uUGhhc2UoaW50IHBoYXNlSWQsIGJvb2xlYW4gcHJpbWFyeSkgewotICAgIGlmIChwaGFzZUlkID09IFNpbXBsZS5TQU5JVFlfUFJFUEFSRSkgewotICAgICAgcm9vdFRyYWNlTG9jYWwucHJlcGFyZSgpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYgKHBoYXNlSWQgPT0gU2ltcGxlLlNBTklUWV9ST09UUykgewotICAgICAgVk0uc2Nhbm5pbmcuY29tcHV0ZUdsb2JhbFJvb3RzKHJvb3RUcmFjZUxvY2FsKTsKLSAgICAgIFZNLnNjYW5uaW5nLmNvbXB1dGVUaHJlYWRSb290cyhyb290VHJhY2VMb2NhbCk7Ci0gICAgICBWTS5zY2FubmluZy5jb21wdXRlU3RhdGljUm9vdHMocm9vdFRyYWNlTG9jYWwpOwotICAgICAgaWYgKFBsYW4uU0NBTl9CT09UX0lNQUdFKSB7Ci0gICAgICAgIFZNLnNjYW5uaW5nLmNvbXB1dGVCb290SW1hZ2VSb290cyhyb290VHJhY2VMb2NhbCk7Ci0gICAgICB9Ci0gICAgICByb290VHJhY2VMb2NhbC5mbHVzaCgpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYgKHBoYXNlSWQgPT0gU2ltcGxlLlNBTklUWV9DT1BZX1JPT1RTKSB7Ci0gICAgICBpZiAocHJpbWFyeSkgewotICAgICAgICByb290VHJhY2VMb2NhbC5jb3B5Um9vdFZhbHVlc1RvKFBsYW4uc2FuaXR5Q2hlY2tlci5jaGVja1RyYWNlTG9jYWwpOwotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYgKHBoYXNlSWQgPT0gU2ltcGxlLlNBTklUWV9SRUxFQVNFKSB7Ci0gICAgICByb290VHJhY2VMb2NhbC5yZWxlYXNlKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9zYW5pdHljaGVja2VyL1Nhbml0eURhdGFUYWJsZS5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L3Nhbml0eWNoZWNrZXIvU2FuaXR5RGF0YVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNjdmYjEuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L3Nhbml0eWNoZWNrZXIvU2FuaXR5RGF0YVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkuc2FuaXR5Y2hlY2tlcjsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhY2VMb2NhbDsKLWltcG9ydCBvcmcubW10ay5wb2xpY3kuUmF3UGFnZVNwYWNlOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZGVxdWUuKjsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LlNpbXBsZUhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBzaW1wbGUgaGFzaHRhYmxlIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBwZXIKLSAqIG9iamVjdCBpbmZvcm1hdGlvbiBmb3Igc2FuaXR5IGNoZWNraW5nLiA8cD4KLSAqCi0gKiBUaGlzIGNsYXNzIGlzIG5vdCB0aHJlYWQgc2FmZS4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGZpbmFsIGNsYXNzIFNhbml0eURhdGFUYWJsZSBleHRlbmRzIFNpbXBsZUhhc2h0YWJsZSBpbXBsZW1lbnRzIENvbnN0YW50cyB7Ci0KLSAgLyoqIFRoZSBudW1iZXIgb2YgYml0cyBmb3IgdGhlIG5vcm1hbCByZWZlcmVuY2UgY291bnQgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PUk1BTF9SQ19CSVRTID0gMjU7Ci0KLSAgLyoqIFRoZSBtYXNrIGZvciB0aGUgbm9ybWFsIHJlZmVyZW5jZSBjb3VudCAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9STUFMX1JDX01BU0sgPSAoMSA8PCAyNSkgLSAxOwotCi0gIC8qKiBUaGUgc2hpZnQgZm9yIHRoZSByb290IHJlZmVyZW5jZSBjb3VudCAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUk9PVF9SQ19TSElGVCA9IE5PUk1BTF9SQ19CSVRTOwotCi0gIC8qKiBUaGUgaW5jcmVtZW50IHRvIHVzZSBmb3Igbm9ybWFsIGluY3JlbWVudHMgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PUk1BTF9SQ19JTkMgPSAxOwotCi0gIC8qKiBUaGUgaW5jcmVtZW50IHRvIHVzZSBmb3Igcm9vdCBpbmNyZW1lbnRzICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBST09UX1JDX0lOQyA9IDEgPDwgUk9PVF9SQ19TSElGVDsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IGRhdGEgdGFibGUgb2YgYSBzcGVjaWZpZWQgc2l6ZS4KLSAgICoKLSAgICogQHBhcmFtIHJwcyBUaGUgc3BhY2UgdG8gYWNxdWlyZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgZnJvbS4KLSAgICogQHBhcmFtIGxvZ1NpemUgVGhlIGxvZyBvZiB0aGUgbnVtYmVyIG9mIHRhYmxlIGVudHJpZXMuCi0gICAqLwotICBwdWJsaWMgU2FuaXR5RGF0YVRhYmxlKFJhd1BhZ2VTcGFjZSBycHMsIGludCBsb2dTaXplKSB7Ci0gICAgc3VwZXIocnBzLCBsb2dTaXplLCBFeHRlbnQuZnJvbUludFNpZ25FeHRlbmQoQllURVNfSU5fV09SRCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluY3JlbWVudCB0aGUgZGF0YSB3b3JkIGZvciBhbiBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBlbnRyeSBUaGUgdGFibGUgZW50cnkuCi0gICAqIEBwYXJhbSByb290IFRydWUgaWYgdGhpcyBpcyBhIHJvb3QgcmVmZXJlbmNlLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBpcyB0aGUgZmlyc3QgcmVmIHRvIHRoYXQgb2JqZWN0LgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW5jUkMoQWRkcmVzcyBlbnRyeSwgYm9vbGVhbiByb290KSB7Ci0gICAgQWRkcmVzcyBkYXRhID0gU2ltcGxlSGFzaHRhYmxlLmdldFBheWxvYWRBZGRyZXNzKGVudHJ5KTsKLSAgICBpbnQgb2xkID0gZGF0YS5sb2FkSW50KCk7Ci0gICAgZGF0YS5zdG9yZShvbGQgKyAocm9vdCA/IFJPT1RfUkNfSU5DIDogTk9STUFMX1JDX0lOQykpOwotICAgIHJldHVybiAob2xkID09IDApOwotICB9Ci0KLSAgLyoqCi0gICAqIFB1c2ggYW55IGVudHJpZXMgdGhhdCBhcmUgb25seSBpbiB0aGlzIHRhYmxlLCBhbmQgbm90IHRoZQotICAgKiBwYXNzZWQgdGFibGUuIFRoaXMgZG9lcyBub3QgY29tcGFyZSB2YWx1ZXMuCi0gICAqCi0gICAqIEBwYXJhbSBvdGhlciBUaGUgdGFibGUgdG8gdXNlIGZvciBjb21wYXJpc29uLgotICAgKiBAcGFyYW0gZGVxdWUgVGhlIGJ1ZmZlciB0byBwdXNoIHJlc3VsdHMgb250by4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHB1c2hOb3RJbk90aGVyKFNhbml0eURhdGFUYWJsZSBvdGhlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0UmVmZXJlbmNlRGVxdWUgZGVxdWUpIHsKLSAgICBBZGRyZXNzIGVudHJ5ID0gZ2V0Rmlyc3QoKTsKLSAgICB3aGlsZSAoIWVudHJ5LmlzWmVybygpKSB7Ci0gICAgICBXb3JkIGtleSA9IFNpbXBsZUhhc2h0YWJsZS5nZXRLZXkoZW50cnkpOwotICAgICAgaWYgKCFvdGhlci5jb250YWlucyhrZXkpKSB7Ci0gICAgICAgIGRlcXVlLnB1c2goa2V5LnRvQWRkcmVzcygpLnRvT2JqZWN0UmVmZXJlbmNlKCkpOwotICAgICAgfQotICAgICAgZW50cnkgPSBnZXROZXh0KGVudHJ5KTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHaXZlbiBhbiBhZGRyZXNzIG9mIGFuIGVudHJ5LCByZWFkIHRoZSByZWZlcmVuY2UgY291bnQsCi0gICAqIGV4Y2x1ZGluZyByb290IHJlZmVyZW5jZXMuCi0gICAqCi0gICAqIEBwYXJhbSBlbnRyeSBUaGUgZW50cnkKLSAgICogQHJldHVybiBUaGUgcmVmZXJlbmNlIGNvdW50LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Tm9ybWFsUkMoQWRkcmVzcyBlbnRyeSkgewotICAgIHJldHVybiBTaW1wbGVIYXNodGFibGUuZ2V0UGF5bG9hZEFkZHJlc3MoZW50cnkpLmxvYWRJbnQoKSAmIE5PUk1BTF9SQ19NQVNLOwotICB9Ci0KLSAgLyoqCi0gICAqIEdpdmVuIGFuIGFkZHJlc3Mgb2YgYW4gZW50cnksIHJlYWQgdGhlIHJvb3QgcmVmZXJlbmNlIGNvdW50LgotICAgKgotICAgKiBAcGFyYW0gZW50cnkgVGhlIGVudHJ5Ci0gICAqIEByZXR1cm4gVGhlIHJvb3QgcmVmZXJlbmNlIGNvdW50LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Um9vdFJDKEFkZHJlc3MgZW50cnkpIHsKLSAgICByZXR1cm4gU2ltcGxlSGFzaHRhYmxlLmdldFBheWxvYWRBZGRyZXNzKGVudHJ5KS5sb2FkSW50KCkgPj4+IFJPT1RfUkNfU0hJRlQ7Ci0gIH0KLQotICAvKioKLSAgICogR2l2ZW4gYW4gYWRkcmVzcyBvZiBhbiBlbnRyeSwgcmVhZCB0aGUgdG90YWwgcmVmZXJlbmNlIGNvdW50LgotICAgKgotICAgKiBAcGFyYW0gZW50cnkgVGhlIGVudHJ5Ci0gICAqIEByZXR1cm4gVGhlIHRvdGFsIHJlZmVyZW5jZSBjb3VudC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGdldFJDKEFkZHJlc3MgZW50cnkpIHsKLSAgICBpbnQgdmFsID0gU2ltcGxlSGFzaHRhYmxlLmdldFBheWxvYWRBZGRyZXNzKGVudHJ5KS5sb2FkSW50KCk7Ci0gICAgcmV0dXJuICh2YWwgJiBOT1JNQUxfUkNfTUFTSykgKyB2YWwgPj4+IFJPT1RfUkNfU0hJRlQ7Ci0gIH0KLQotICAvKioKLSAgICogR2l2ZW4gYW4gYWRkcmVzcyBvZiBhbiBlbnRyeSwgcmVhZCB0aGUgcmVmZXJlbmNlIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIGVudHJ5IFRoZSBlbnRyeQotICAgKiBAcmV0dXJuIFRoZSBvYmplY3QgcmVmZXJlbmNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBPYmplY3RSZWZlcmVuY2UgZ2V0T2JqZWN0UmVmZXJlbmNlKEFkZHJlc3MgZW50cnkpIHsKLSAgICByZXR1cm4gU2ltcGxlSGFzaHRhYmxlLmdldEtleShlbnRyeSkudG9BZGRyZXNzKCkudG9PYmplY3RSZWZlcmVuY2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiBGb3J3YXJkIGRhdGEgdGFibGUgdXNpbmcgdGhlIHN1cHBsaWVkIHRyYWNlLiBOb3RlIHRoYXQgdGhlIGRhdGEgaXMKLSAgICogbm90IGhhc2hlZCBjb3JyZWN0bHksIHNvIG9ubHkgZW51bWVyYXRpb24gY2FuIGJlIHVzZWQgd2l0aG91dAotICAgKiByZWhhc2hpbmcuCi0gICAqCi0gICAqIEBwYXJhbSB0cmFjZSBUaGUgdHJhY2UgdG8gdXNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgZm9yd2FyZFRhYmxlKFRyYWNlTG9jYWwgdHJhY2UpIHsKLSAgICBBZGRyZXNzIGVudHJ5ID0gZ2V0Rmlyc3QoKTsKLSAgICB3aGlsZSAoIWVudHJ5LmlzWmVybygpKSB7Ci0gICAgICBPYmplY3RSZWZlcmVuY2Ugb2JqID0gZ2V0T2JqZWN0UmVmZXJlbmNlKGVudHJ5KTsKLSAgICAgIFNpbXBsZUhhc2h0YWJsZS5yZXBsYWNlS2V5KGVudHJ5LCB0cmFjZS5nZXRGb3J3YXJkZWRSZWZlcmVuY2Uob2JqKS50b0FkZHJlc3MoKS50b1dvcmQoKSk7Ci0gICAgICBlbnRyeSA9IGdldE5leHQoZW50cnkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYW4gZW50cnkgZm9yIGFuIG9iamVjdC4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGZpbmQgYW4gZW50cnkgZm9yLgotICAgKiBAcGFyYW0gY3JlYXRlIENyZWF0ZSBhbiBlbnRyeSBpZiBub25lIGV4aXN0cz8KLSAgICogQHJldHVybiBUaGUgZW50cnkgYWRkcmVzcy4KLSAgICovCi0gIHB1YmxpYyBBZGRyZXNzIGdldEVudHJ5KE9iamVjdFJlZmVyZW5jZSBvYmplY3QsIGJvb2xlYW4gY3JlYXRlKSB7Ci0gICAgcmV0dXJuIHN1cGVyLmdldEVudHJ5KG9iamVjdC50b0FkZHJlc3MoKS50b1dvcmQoKSwgY3JlYXRlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L3Nhbml0eWNoZWNrZXIvU2FuaXR5TGluZWFyU2Nhbi5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L3Nhbml0eWNoZWNrZXIvU2FuaXR5TGluZWFyU2Nhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjkxZjc3Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9zYW5pdHljaGVja2VyL1Nhbml0eUxpbmVhclNjYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay51dGlsaXR5LnNhbml0eWNoZWNrZXI7Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LmFsbG9jLkxpbmVhclNjYW47Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLk9iamVjdFJlZmVyZW5jZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHBlcmZvcm1zIHNhbml0eSBjaGVja3MgZm9yIFNpbXBsZSBjb2xsZWN0b3JzLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1maW5hbCBjbGFzcyBTYW5pdHlMaW5lYXJTY2FuIGV4dGVuZHMgTGluZWFyU2NhbiB7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBTYW5pdHlDaGVja2VyIHNhbml0eUNoZWNrZXI7Ci0gIHB1YmxpYyBTYW5pdHlMaW5lYXJTY2FuKFNhbml0eUNoZWNrZXIgc2FuaXR5Q2hlY2tlcikgewotICAgIHRoaXMuc2FuaXR5Q2hlY2tlciA9IHNhbml0eUNoZWNrZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzY2FuKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICBzYW5pdHlDaGVja2VyLnNjYW5Qcm9jZXNzT2JqZWN0KG9iamVjdCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9zYW5pdHljaGVja2VyL1Nhbml0eVJvb3RUcmFjZUxvY2FsLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvc2FuaXR5Y2hlY2tlci9TYW5pdHlSb290VHJhY2VMb2NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTJiNTE0Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9zYW5pdHljaGVja2VyL1Nhbml0eVJvb3RUcmFjZUxvY2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkuc2FuaXR5Y2hlY2tlcjsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhY2VMb2NhbDsKLWltcG9ydCBvcmcubW10ay5wbGFuLlRyYWNlOwotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgcGFyYWxsZWwgcm9vdC1nYXRoZXJpbmcgcGFydCBvZiBhIHNhbml0eSBjaGVjay4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGZpbmFsIGNsYXNzIFNhbml0eVJvb3RUcmFjZUxvY2FsIGV4dGVuZHMgVHJhY2VMb2NhbCB7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqLwotICBwdWJsaWMgU2FuaXR5Um9vdFRyYWNlTG9jYWwoVHJhY2UgdHJhY2UpIHsKLSAgICBzdXBlcih0cmFjZSk7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBPYmplY3QgcHJvY2Vzc2luZyBhbmQgdHJhY2luZwotICAgKi8KLQotICAvKioKLSAgICogQ29weSByb290IHZhbHVlcyBhY3Jvc3MgdG8gdGhlICdyZWFsJyBzaW5nbGUtdGhyZWFkZWQgdHJhY2UgdGhhdCB3aWxsIGRvCi0gICAqIHRoZSBzYW5pdHkgY2hlY2tpbmcuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyB2b2lkIGNvcHlSb290VmFsdWVzVG8oVHJhY2VMb2NhbCB0cmFjZSkgewotICAgIHdoaWxlICghcm9vdExvY2F0aW9ucy5pc0VtcHR5KCkpIHsKLSAgICAgIE9iamVjdFJlZmVyZW5jZSBvYmplY3QgPSByb290TG9jYXRpb25zLnBvcCgpLmxvYWRPYmplY3RSZWZlcmVuY2UoKTsKLSAgICAgIGlmICghb2JqZWN0LmlzTnVsbCgpKSB7Ci0gICAgICAgIHRyYWNlLnRyYWNlT2JqZWN0KG9iamVjdCwgdHJ1ZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHdoaWxlICghdmFsdWVzLmlzRW1wdHkoKSkgewotICAgICAgdHJhY2UudHJhY2VPYmplY3QodmFsdWVzLnBvcCgpLCB0cnVlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUHJvY2VzcyBkZWxheWVkIHJvb3RzLiBUaGlzIGRvZXMgbm90IG1ha2Ugc2Vuc2UgZm9yIFNhbml0eVJvb3RUcmFjZUxvY2FsLgotICAgKiBhcmUgZW1wdHkuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyB2b2lkIHByb2Nlc3NSb290cygpIHsKLSAgICBWTS5hc3NlcnRpb25zLmZhaWwoIlNhbml0eVJvb3RUcmFjZUxvY2FsLnByb2Nlc3NSb290cyBjYWxsZWQuIik7Ci0gIH0KLQotICAvKioKLSAgICogRmluaXNoaW5nIHByb2Nlc3NpbmcgYWxsIEdDIHdvcmsuIFRoaXMgZG9lcyBub3QgbWFrZSBzZW5zZSBmb3IgU2FuaXR5Um9vdFRyYWNlTG9jYWwuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyB2b2lkIGNvbXBsZXRlVHJhY2UoKSB7Ci0gICAgVk0uYXNzZXJ0aW9ucy5mYWlsKCJTYW5pdHlSb290VHJhY2VMb2NhbC5jb21wbGV0ZVRyYWNlIGNhbGxlZC4iKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBpcyB0aGUgY29yZSBtZXRob2QgZHVyaW5nIHRoZSB0cmFjZSBvZiB0aGUgb2JqZWN0IGdyYXBoLgotICAgKiBUaGUgcm9sZSBvZiB0aGlzIG1ldGhvZCBpcyB0bzoKLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIHRyYWNlZC4KLSAgICogQHBhcmFtIHJvb3QgSXMgdGhpcyBvYmplY3QgYSByb290PwotICAgKiBAcmV0dXJuIFRoZSBuZXcgcmVmZXJlbmNlIHRvIHRoZSBzYW1lIG9iamVjdCBpbnN0YW5jZS4KLSAgICovCi0gIEBJbmxpbmUKLSAgcHVibGljIE9iamVjdFJlZmVyZW5jZSB0cmFjZU9iamVjdChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0LCBib29sZWFuIHJvb3QpIHsKLSAgICBpZiAoIXJvb3QpIFZNLmFzc2VydGlvbnMuZmFpbCgiU2FuaXR5Um9vdFRyYWNlTG9jYWwudHJhY2VPYmplY3QgY2FsbGVkIGZvciBub24tcm9vdCBvYmplY3QuIik7Ci0gICAgaWYgKCFvYmplY3QuaXNOdWxsKCkpIHsKLSAgICAgIHZhbHVlcy5wdXNoKG9iamVjdCk7Ci0gICAgfQotICAgIHJldHVybiBvYmplY3Q7Ci0gIH0KLQotICAvKioKLSAgICogV2lsbCB0aGlzIG9iamVjdCBtb3ZlIGZyb20gdGhpcyBwb2ludCBvbiwgZHVyaW5nIHRoZSBjdXJyZW50IHRyYWNlID8KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9iamVjdCB3aWxsIG5vdCBtb3ZlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gd2lsbE5vdE1vdmVJbkN1cnJlbnRDb2xsZWN0aW9uKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsKLSAgICAvLyBXZSBuZXZlciBtb3ZlIG9iamVjdHMhCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9zYW5pdHljaGVja2VyL1Nhbml0eVRyYWNlTG9jYWwuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9zYW5pdHljaGVja2VyL1Nhbml0eVRyYWNlTG9jYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyYzhkMS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvc2FuaXR5Y2hlY2tlci9TYW5pdHlUcmFjZUxvY2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5zYW5pdHljaGVja2VyOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5UcmFjZUxvY2FsOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhY2U7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBzaW1wbHkgc2FuaXR5IGNsb3N1cmUuCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBmaW5hbCBjbGFzcyBTYW5pdHlUcmFjZUxvY2FsIGV4dGVuZHMgVHJhY2VMb2NhbCB7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBTYW5pdHlDaGVja2VyIHNhbml0eUNoZWNrZXI7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqLwotICBwdWJsaWMgU2FuaXR5VHJhY2VMb2NhbChUcmFjZSB0cmFjZSwgU2FuaXR5Q2hlY2tlciBzYW5pdHlDaGVja2VyKSB7Ci0gICAgc3VwZXIodHJhY2UpOwotICAgIHRoaXMuc2FuaXR5Q2hlY2tlciA9IHNhbml0eUNoZWNrZXI7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBPYmplY3QgcHJvY2Vzc2luZyBhbmQgdHJhY2luZwotICAgKi8KLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgaXMgdGhlIGNvcmUgbWV0aG9kIGR1cmluZyB0aGUgdHJhY2Ugb2YgdGhlIG9iamVjdCBncmFwaC4KLSAgICogVGhlIHJvbGUgb2YgdGhpcyBtZXRob2QgaXMgdG86Ci0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBiZSB0cmFjZWQuCi0gICAqIEBwYXJhbSByb290IElzIHRoaXMgb2JqZWN0IGEgcm9vdD8KLSAgICogQHJldHVybiBUaGUgbmV3IHJlZmVyZW5jZSB0byB0aGUgc2FtZSBvYmplY3QgaW5zdGFuY2UuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBPYmplY3RSZWZlcmVuY2UgdHJhY2VPYmplY3QoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCwgYm9vbGVhbiByb290KSB7Ci0gICAgc2FuaXR5Q2hlY2tlci5wcm9jZXNzT2JqZWN0KHRoaXMsIG9iamVjdCwgcm9vdCk7Ci0gICAgcmV0dXJuIG9iamVjdDsKLSAgfQotCi0gIC8qKgotICAgKiBXaWxsIHRoaXMgb2JqZWN0IG1vdmUgZnJvbSB0aGlzIHBvaW50IG9uLCBkdXJpbmcgdGhlIGN1cnJlbnQgdHJhY2UgPwotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgb2JqZWN0IHdpbGwgbm90IG1vdmUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiB3aWxsTm90TW92ZUluQ3VycmVudENvbGxlY3Rpb24oT2JqZWN0UmVmZXJlbmNlIG9iamVjdCkgewotICAgIC8vIFdlIG5ldmVyIG1vdmUgb2JqZWN0cyEKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L3N0YXRpc3RpY3MvQm9vbGVhbkNvdW50ZXIuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9zdGF0aXN0aWNzL0Jvb2xlYW5Db3VudGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MTA2M2UuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L3N0YXRpc3RpY3MvQm9vbGVhbkNvdW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5zdGF0aXN0aWNzOwotCi1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Mb2c7Ci0KLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHNpbXBsZSBib29sZWFuIGNvdW50ZXIgKGNvdW50aW5nIG51bWJlciBvZgotICogcGhhc2VzIHdoZXJlIHNvbWUgYm9vbGVhbiBldmVudCBpcyB0cnVlKS4KLSAqLwotQFVuaW50ZXJydXB0aWJsZSBwdWJsaWMgY2xhc3MgQm9vbGVhbkNvdW50ZXIgZXh0ZW5kcyBDb3VudGVyIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbnN0YW5jZSB2YXJpYWJsZXMKLSAgICovCi0KLSAgcHJpdmF0ZSBmaW5hbCBib29sZWFuW10gc3RhdGU7Ci0KLSAgcHJvdGVjdGVkIGludCB0b3RhbCA9IDA7Ci0gIHByaXZhdGUgYm9vbGVhbiBydW5uaW5nID0gZmFsc2U7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5pdGlhbGl6YXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvdW50ZXIKLSAgICovCi0gIHB1YmxpYyBCb29sZWFuQ291bnRlcihTdHJpbmcgbmFtZSkgewotICAgIHRoaXMobmFtZSwgdHJ1ZSwgZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvdW50ZXIKLSAgICogQHBhcmFtIHN0YXJ0IFRydWUgaWYgdGhpcyBjb3VudGVyIGlzIHRvIGJlIGltcGxpY2l0bHkgc3RhcnRlZAotICAgKiB3aGVuIDxjb2RlPnN0YXJ0QWxsKCk8L2NvZGU+IGlzIGNhbGxlZCAob3RoZXJ3aXNlIHRoZSBjb3VudGVyCi0gICAqIG11c3QgYmUgZXhwbGljaXRseSBzdGFydGVkKS4KLSAgICovCi0gIHB1YmxpYyBCb29sZWFuQ291bnRlcihTdHJpbmcgbmFtZSwgYm9vbGVhbiBzdGFydCkgewotICAgIHRoaXMobmFtZSwgc3RhcnQsIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb3VudGVyCi0gICAqIEBwYXJhbSBzdGFydCBUcnVlIGlmIHRoaXMgY291bnRlciBpcyB0byBiZSBpbXBsaWNpdGx5IHN0YXJ0ZWQKLSAgICogd2hlbiA8Y29kZT5zdGFydEFsbCgpPC9jb2RlPiBpcyBjYWxsZWQgKG90aGVyd2lzZSB0aGUgY291bnRlcgotICAgKiBtdXN0IGJlIGV4cGxpY2l0bHkgc3RhcnRlZCkuCi0gICAqIEBwYXJhbSBtZXJnZXBoYXNlcyBUcnVlIGlmIHRoaXMgY291bnRlciBkb2VzIG5vdCBzZXBhcmF0ZWx5Ci0gICAqIHJlcG9ydCBHQyBhbmQgTXV0YXRvciBwaGFzZXMuCi0gICAqLwotICBwdWJsaWMgQm9vbGVhbkNvdW50ZXIoU3RyaW5nIG5hbWUsIGJvb2xlYW4gc3RhcnQsIGJvb2xlYW4gbWVyZ2VwaGFzZXMpIHsKLSAgICBzdXBlcihuYW1lLCBzdGFydCwgbWVyZ2VwaGFzZXMpOwotICAgIHN0YXRlID0gbmV3IGJvb2xlYW5bU3RhdHMuTUFYX1BIQVNFU107Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTdGF0cy5NQVhfUEhBU0VTOyBpKyspCi0gICAgICBzdGF0ZVtpXSA9IGZhbHNlOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQ291bnRlci1zcGVjaWZpYyBtZXRob2RzCi0gICAqLwotCi0gIC8qKgotICAgKiBTZXQgdGhlIGJvb2xlYW4gdG8gdHJ1ZSBmb3IgdGhpcyBwaGFzZSwgaW5jcmVtZW50IHRoZSB0b3RhbC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldCgpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChTdGF0cy5waGFzZSA9PSBTdGF0cy5NQVhfUEhBU0VTIC0xIHx8ICFzdGF0ZVtTdGF0cy5waGFzZV0pOwotICAgIHN0YXRlW1N0YXRzLnBoYXNlXSA9IHRydWU7Ci0gICAgdG90YWwrKzsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEdlbmVyaWMgY291bnRlciBjb250cm9sIG1ldGhvZHM6IHN0YXJ0LCBzdG9wLCBwcmludCBldGMKLSAgICovCi0KLSAgLyoqCi0gICAqIFN0YXJ0IHRoaXMgY291bnRlcgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc3RhcnQoKSB7Ci0gICAgaWYgKCFTdGF0cy5nYXRoZXJpbmdTdGF0cykgcmV0dXJuOwotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KCFydW5uaW5nKTsKLSAgICBydW5uaW5nID0gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBTdG9wIHRoaXMgY291bnRlcgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc3RvcCgpIHsKLSAgICBpZiAoIVN0YXRzLmdhdGhlcmluZ1N0YXRzKSByZXR1cm47Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQocnVubmluZyk7Ci0gICAgcnVubmluZyA9IGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBwaGFzZSBoYXMgY2hhbmdlZCAoZnJvbSBHQyB0byBtdXRhdG9yIG9yIG11dGF0b3IgdG8gR0MpLgotICAgKiBUYWtlIGFjdGlvbiB3aXRoIHJlc3BlY3QgdG8gdGhlIGxhc3QgcGhhc2UgaWYgbmVjZXNzYXJ5LgotICAgKiA8Yj5EbyBub3RoaW5nIGluIHRoaXMgY2FzZS48L2I+Ci0gICAqCi0gICAqIEBwYXJhbSBvbGRQaGFzZSBUaGUgbGFzdCBwaGFzZQotICAgKi8KLSAgdm9pZCBwaGFzZUNoYW5nZShpbnQgb2xkUGhhc2UpIHt9Ci0KLSAgLyoqCi0gICAqIFByaW50IHRoZSB2YWx1ZSBvZiB0aGlzIGNvdW50ZXIgZm9yIHRoZSBnaXZlbiBwaGFzZS4gIFByaW50ICcwJwotICAgKiBmb3IgZmFsc2UsICcxJyBmb3IgdHJ1ZS4KLSAgICoKLSAgICogQHBhcmFtIHBoYXNlIFRoZSBwaGFzZSB0byBiZSBwcmludGVkCi0gICAqLwotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBwcmludENvdW50KGludCBwaGFzZSkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUyAmJiBtZXJnZVBoYXNlcygpKQotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoKHBoYXNlIHwgMSkgPT0gKHBoYXNlICsgMSkpOwotICAgIGlmIChtZXJnZVBoYXNlcygpKQotICAgICAgcHJpbnRWYWx1ZSgoc3RhdGVbcGhhc2VdIHx8IHN0YXRlW3BoYXNlICsgMV0pID8gMSA6IDApOwotICAgIGVsc2UKLSAgICAgIHByaW50VmFsdWUoKHN0YXRlW3BoYXNlXSkgPyAxIDogMCk7Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnQgdGhlIGN1cnJlbnQgdG90YWwgbnVtYmVyIG9mICd0cnVlJyBwaGFzZXMgZm9yIHRoaXMgY291bnRlcgotICAgKi8KLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcHJpbnRUb3RhbCgpIHsKLSAgICBpbnQgdG90YWwgPSAwOwotICAgIGZvciAoaW50IHAgPSAwOyBwIDw9IFN0YXRzLnBoYXNlOyBwKyspIHsKLSAgICAgIHRvdGFsICs9IChzdGF0ZVtwXSkgPyAxIDogMDsKLSAgICB9Ci0gICAgcHJpbnRWYWx1ZSh0b3RhbCk7Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnQgdGhlIGN1cnJlbnQgdG90YWwgbnVtYmVyIG9mICd0cnVlJyBwaGFzZXMgZm9yIGVpdGhlciB0aGUKLSAgICogbXV0YXRvciBvciBHQyBwaGFzZQotICAgKgotICAgKiBAcGFyYW0gbXV0YXRvciBUcnVlIGlmIHRoZSB0b3RhbCBmb3IgdGhlIG11dGF0b3IgcGhhc2VzIGlzIHRvIGJlCi0gICAqIHByaW50ZWQgKG90aGVyd2lzZSB0aGUgdG90YWwgZm9yIHRoZSBHQyBwaGFzZXMgd2lsbCBiZSBwcmludGVkKS4KLSAgICovCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIHByaW50VG90YWwoYm9vbGVhbiBtdXRhdG9yKSB7Ci0gICAgaW50IHRvdGFsID0gMDsKLSAgICBmb3IgKGludCBwID0gKG11dGF0b3IpID8gMCA6IDE7IHAgPD0gU3RhdHMucGhhc2U7IHAgKz0gMikgewotICAgICAgdG90YWwgKz0gKHN0YXRlW3BdKSA/IDEgOiAwOwotICAgIH0KLSAgICBwcmludFZhbHVlKHRvdGFsKTsKLSAgfQotCi0gIC8qKgotICAgKiBQcmludCB0aGUgY3VycmVudCBtaW5pbXVtIHZhbHVlIGZvciBlaXRoZXIgdGhlIG11dGF0b3Igb3IgR0MKLSAgICogcGhhc2UuIDxiPkRvIG5vdGhpbmcgaW4gdGhpcyBjYXNlLjwvYj4KLSAgICoKLSAgICogQHBhcmFtIG11dGF0b3IgVHJ1ZSBpZiB0aGUgbWluaW11bSBmb3IgdGhlIG11dGF0b3IgcGhhc2UgaXMgdG8gYmUKLSAgICogcHJpbnRlZCAob3RoZXJ3aXNlIHRoZSBtaW5pbXVtIGZvciB0aGUgR0MgcGhhc2Ugd2lsbCBiZSBwcmludGVkKS4KLSAgICovCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIHByaW50TWluKGJvb2xlYW4gbXV0YXRvcikge30KLQotICAvKioKLSAgICogUHJpbnQgdGhlIGN1cnJlbnQgbWF4aW11bSB2YWx1ZSBmb3IgZWl0aGVyIHRoZSBtdXRhdG9yIG9yIEdDCi0gICAqIHBoYXNlLiA8Yj5EbyBub3RoaW5nIGluIHRoaXMgY2FzZS48L2I+Ci0gICAqCi0gICAqIEBwYXJhbSBtdXRhdG9yIFRydWUgaWYgdGhlIG1heGltdW0gZm9yIHRoZSBtdXRhdG9yIHBoYXNlIGlzIHRvIGJlCi0gICAqIHByaW50ZWQgKG90aGVyd2lzZSB0aGUgbWF4aW11bSBmb3IgdGhlIEdDIHBoYXNlIHdpbGwgYmUgcHJpbnRlZCkuCi0gICAqLwotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBwcmludE1heChib29sZWFuIG11dGF0b3IpIHt9Ci0KLSAgLyoqCi0gICAqIFByaW50IHRoZSBnaXZlbiB2YWx1ZQotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIHByaW50ZWQKLSAgICovCi0gIHZvaWQgcHJpbnRWYWx1ZShpbnQgdmFsdWUpIHsKLSAgICBMb2cud3JpdGUodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByaW50IHN0YXRpc3RpY3MgZm9yIHRoZSBtb3N0IHJlY2VudCBwaGFzZQotICAgKi8KLSAgcHVibGljIHZvaWQgcHJpbnRMYXN0KCkgewotICAgIGlmIChTdGF0cy5waGFzZSA+IDApIHByaW50Q291bnQoU3RhdHMucGhhc2UgLSAxKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L3N0YXRpc3RpY3MvQ291bnRlci5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L3N0YXRpc3RpY3MvQ291bnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjQzNDI5Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9zdGF0aXN0aWNzL0NvdW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5zdGF0aXN0aWNzOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICoKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgZGVzY3JpYmVzIHRoZSBpbnRlcmZhY2Ugb2YgYSBnZW5lcmljIGNvdW50ZXIuCi0gKi8KLUBVbmludGVycnVwdGlibGUgcHVibGljIGFic3RyYWN0IGNsYXNzIENvdW50ZXIgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluc3RhbmNlIHZhcmlhYmxlcwotICAgKi8KLQotICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gc3RhcnQ7Ci0gIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtZXJnZXBoYXNlczsKLQotICAvKioKLSAgICogQWxsb3cgZm9yIGNvdW50ZXJzIHdob3NlIHZhbHVlcyBhcmUgdG9vIGNvbXBsZXggdG8gYmUgc2ltcGx5IHByaW50ZWQgb3V0LgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY29tcGxleCA9IGZhbHNlOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluaXRpYWxpemF0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb3VudGVyCi0gICAqLwotICBDb3VudGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgdGhpcyhuYW1lLCB0cnVlLCBmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY291bnRlcgotICAgKiBAcGFyYW0gc3RhcnQgVHJ1ZSBpZiB0aGlzIGNvdW50ZXIgaXMgdG8gYmUgaW1wbGljaXRseSBzdGFydGVkCi0gICAqIHdoZW4gPGNvZGU+c3RhcnRBbGwoKTwvY29kZT4gaXMgY2FsbGVkIChvdGhlcndpc2UgdGhlIGNvdW50ZXIKLSAgICogbXVzdCBiZSBleHBsaWNpdGx5IHN0YXJ0ZWQpLgotICAgKi8KLSAgQ291bnRlcihTdHJpbmcgbmFtZSwgYm9vbGVhbiBzdGFydCkgewotICAgIHRoaXMobmFtZSwgc3RhcnQsIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb3VudGVyCi0gICAqIEBwYXJhbSBzdGFydCAgVHJ1ZSBpZiB0aGlzIGNvdW50ZXIgaXMgdG8gYmUgaW1wbGljaXRseSBzdGFydGVkCi0gICAqIHdoZW4gPGNvZGU+c3RhcnRBbGwoKTwvY29kZT4gaXMgY2FsbGVkIChvdGhlcndpc2UgdGhlIGNvdW50ZXIKLSAgICogbXVzdCBiZSBleHBsaWNpdGx5IHN0YXJ0ZWQpLgotICAgKiBAcGFyYW0gbWVyZ2VwaGFzZXMgVHJ1ZSBpZiB0aGlzIGNvdW50ZXIgZG9lcyBub3Qgc2VwYXJhdGVseQotICAgKiByZXBvcnQgR0MgYW5kIE11dGF0b3IgcGhhc2VzLgotICAgKi8KLSAgQ291bnRlcihTdHJpbmcgbmFtZSwgYm9vbGVhbiBzdGFydCwgYm9vbGVhbiBtZXJnZXBoYXNlcykgewotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgdGhpcy5zdGFydCA9IHN0YXJ0OwotICAgIHRoaXMubWVyZ2VwaGFzZXMgPSBtZXJnZXBoYXNlczsKLSAgICBTdGF0cy5uZXdDb3VudGVyKHRoaXMpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQ291bnRlciBjb250cm9sIG1ldGhvZHM6IHN0YXJ0LCBzdG9wLCBwcmludCBldGMKLSAgICovCi0KLSAgLyoqCi0gICAqIFN0YXJ0IHRoaXMgY291bnRlcgotICAgKi8KLSAgYWJzdHJhY3Qgdm9pZCBzdGFydCgpOwotCi0gIC8qKgotICAgKiBTdG9wIHRoaXMgY291bnRlcgotICAgKi8KLSAgYWJzdHJhY3Qgdm9pZCBzdG9wKCk7Ci0KLSAgLyoqCi0gICAqIFRoZSBwaGFzZSBoYXMgY2hhbmdlZCAoZnJvbSBHQyB0byBtdXRhdG9yIG9yIG11dGF0b3IgdG8gR0MpLgotICAgKiBUYWtlIGFjdGlvbiB3aXRoIHJlc3BlY3QgdG8gdGhlIGxhc3QgcGhhc2UgaWYgbmVjZXNzYXJ5LgotICAgKgotICAgKiBAcGFyYW0gb2xkUGhhc2UgVGhlIGxhc3QgcGhhc2UKLSAgICovCi0gIGFic3RyYWN0IHZvaWQgcGhhc2VDaGFuZ2UoaW50IG9sZFBoYXNlKTsKLQotICAvKioKLSAgICogUHJpbnQgdGhlIHZhbHVlIG9mIHRoaXMgY291bnRlciBmb3IgdGhlIGdpdmVuIHBoYXNlCi0gICAqCi0gICAqIEBwYXJhbSBwaGFzZSBUaGUgcGhhc2UgdG8gYmUgcHJpbnRlZAotICAgKi8KLSAgYWJzdHJhY3Qgdm9pZCBwcmludENvdW50KGludCBwaGFzZSk7Ci0KLSAgLyoqCi0gICAqIFByaW50IHRoZSBjdXJyZW50IHRvdGFsIGZvciB0aGlzIGNvdW50ZXIKLSAgICovCi0gIGFic3RyYWN0IHZvaWQgcHJpbnRUb3RhbCgpOwotCi0gIC8qKgotICAgKiBQcmludCB0aGUgY3VycmVudCB0b3RhbCBmb3IgZWl0aGVyIHRoZSBtdXRhdG9yIG9yIEdDIHBoYXNlCi0gICAqCi0gICAqIEBwYXJhbSBtdXRhdG9yIFRydWUgaWYgdGhlIHRvdGFsIGZvciB0aGUgbXV0YXRvciBwaGFzZXMgaXMgdG8gYmUKLSAgICogcHJpbnRlZCAob3RoZXJ3aXNlIHRoZSB0b3RhbCBmb3IgdGhlIEdDIHBoYXNlcyB3aWxsIGJlIHByaW50ZWQpLgotICAgKi8KLSAgYWJzdHJhY3Qgdm9pZCBwcmludFRvdGFsKGJvb2xlYW4gbXV0YXRvcik7Ci0KLSAgLyoqCi0gICAqIFByaW50IHRoZSBjdXJyZW50IG1pbmltdW0gdmFsdWUgZm9yIGVpdGhlciB0aGUgbXV0YXRvciBvciBHQyBwaGFzZQotICAgKgotICAgKiBAcGFyYW0gbXV0YXRvciBUcnVlIGlmIHRoZSBtaW5pbXVtIGZvciB0aGUgbXV0YXRvciBwaGFzZSBpcyB0byBiZQotICAgKiBwcmludGVkIChvdGhlcndpc2UgdGhlIG1pbmltdW0gZm9yIHRoZSBHQyBwaGFzZSB3aWxsIGJlIHByaW50ZWQpLgotICAgKi8KLSAgYWJzdHJhY3Qgdm9pZCBwcmludE1pbihib29sZWFuIG11dGF0b3IpOwotCi0gIC8qKgotICAgKiBQcmludCB0aGUgY3VycmVudCBtYXhpbXVtIHZhbHVlIGZvciBlaXRoZXIgdGhlIG11dGF0b3Igb3IgR0MgcGhhc2UKLSAgICoKLSAgICogQHBhcmFtIG11dGF0b3IgVHJ1ZSBpZiB0aGUgbWF4aW11bSBmb3IgdGhlIG11dGF0b3IgcGhhc2UgaXMgdG8gYmUKLSAgICogcHJpbnRlZCAob3RoZXJ3aXNlIHRoZSBtYXhpbXVtIGZvciB0aGUgR0MgcGhhc2Ugd2lsbCBiZSBwcmludGVkKS4KLSAgICovCi0gIGFic3RyYWN0IHZvaWQgcHJpbnRNYXgoYm9vbGVhbiBtdXRhdG9yKTsKLQotICAvKioKLSAgICogUHJpbnQgc3RhdGlzdGljcyBmb3IgdGhlIG1vc3QgcmVjZW50IHBoYXNlCi0gICAqLwotICBwdWJsaWMgdm9pZCBwcmludExhc3QoKSB7Ci0gICAgaWYgKFN0YXRzLnBoYXNlID4gMCkgcHJpbnRDb3VudChTdGF0cy5waGFzZSAtIDEpOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBBY2Nlc3NvciBtZXRob2RzCi0gICAqLwotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBjb3VudGVyCi0gICAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhpcyBjb3VudGVyCi0gICAqLwotICBTdHJpbmcgZ2V0TmFtZSgpIHsgcmV0dXJuIG5hbWU7IH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSAob3B0aW9uKSBzdWZmaXggdG8gYmUgdXNlZCB3aGVuIHJlcG9ydGluZyB0aGlzIGNvdW50ZXIKLSAgICogQHJldHVybiBUaGUgc3VmZml4Ci0gICAqLwotICBTdHJpbmcgZ2V0Q29sdW1uU3VmZml4KCkgeyByZXR1cm4gIiI7IH0KLQotICAvKioKLSAgICogUmV0dXJuIHRydWUgaWYgdGhpcyBjb3VudGVyIGlzIGltcGxpY2l0bHkgc3RhcnRlZCB3aGVuCi0gICAqIDxjb2RlPnN0YXJ0QWxsKCk8L2NvZGU+IGlzIGNhbGxlZC4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgY291bnRlciBpcyBpbXBsaWNpdGx5IHN0YXJ0ZWQgd2hlbgotICAgKiAgICAgICAgIDxjb2RlPnN0YXJ0QWxsKCk8L2NvZGU+IGlzIGNhbGxlZC4KLSAgICovCi0gIGJvb2xlYW4gZ2V0U3RhcnQoKSB7IHJldHVybiBzdGFydDsgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGNvdW50ZXIgd2lsbCBtZXJnZSBzdGF0cyBmb3IgR0MgYW5kIG11dGF0b3IgcGhhc2VzLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBjb3VudGVyIHdpbGwgbWVyZ2Ugc3RhdHMgZm9yIEdDIGFuZCBtdXRhdG9yIHBoYXNlcy4KLSAgICovCi0gIGJvb2xlYW4gbWVyZ2VQaGFzZXMoKSB7IHJldHVybiBtZXJnZXBoYXNlczsgfQotCi0gIGJvb2xlYW4gaXNDb21wbGV4KCkgeyByZXR1cm4gY29tcGxleDsgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L3N0YXRpc3RpY3MvRXZlbnRDb3VudGVyLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvc3RhdGlzdGljcy9FdmVudENvdW50ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVhYjBkYy4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvc3RhdGlzdGljcy9FdmVudENvdW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5zdGF0aXN0aWNzOwotCi1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Mb2c7Ci0KLWltcG9ydCBvcmcubW10ay52bS5WTTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHNpbXBsZSBldmVudCBjb3VudGVyIChjb3VudGluZyBudW1iZXIKLSAqIGV2ZW50cyB0aGF0IG9jY3VyIGZvciBlYWNoIHBoYXNlKS4KLSAqLwotQFVuaW50ZXJydXB0aWJsZSBwdWJsaWMgY2xhc3MgRXZlbnRDb3VudGVyIGV4dGVuZHMgQ291bnRlciB7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5zdGFuY2UgdmFyaWFibGVzCi0gICAqLwotCi0gIHByaXZhdGUgZmluYWwgbG9uZ1tdIGNvdW50OwotCi0gIHByb3RlY3RlZCBsb25nIHRvdGFsQ291bnQgPSAwOwotICBwcml2YXRlIGJvb2xlYW4gcnVubmluZyA9IGZhbHNlOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluaXRpYWxpemF0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb3VudGVyCi0gICAqLwotICBwdWJsaWMgRXZlbnRDb3VudGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgdGhpcyhuYW1lLCB0cnVlLCBmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY291bnRlcgotICAgKiBAcGFyYW0gc3RhcnQgVHJ1ZSBpZiB0aGlzIGNvdW50ZXIgaXMgdG8gYmUgaW1wbGljaXRseSBzdGFydGVkCi0gICAqIHdoZW4gPGNvZGU+c3RhcnRBbGwoKTwvY29kZT4gaXMgY2FsbGVkIChvdGhlcndpc2UgdGhlIGNvdW50ZXIKLSAgICogbXVzdCBiZSBleHBsaWNpdGx5IHN0YXJ0ZWQpLgotICAgKi8KLSAgcHVibGljIEV2ZW50Q291bnRlcihTdHJpbmcgbmFtZSwgYm9vbGVhbiBzdGFydCkgewotICAgIHRoaXMobmFtZSwgc3RhcnQsIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb3VudGVyCi0gICAqIEBwYXJhbSBzdGFydCBUcnVlIGlmIHRoaXMgY291bnRlciBpcyB0byBiZSBpbXBsaWNpdGx5IHN0YXJ0ZWQKLSAgICogd2hlbiA8Y29kZT5zdGFydEFsbCgpPC9jb2RlPiBpcyBjYWxsZWQgKG90aGVyd2lzZSB0aGUgY291bnRlcgotICAgKiBtdXN0IGJlIGV4cGxpY2l0bHkgc3RhcnRlZCkuCi0gICAqIEBwYXJhbSBtZXJnZXBoYXNlcyBUcnVlIGlmIHRoaXMgY291bnRlciBkb2VzIG5vdCBzZXBhcmF0ZWx5Ci0gICAqIHJlcG9ydCBHQyBhbmQgTXV0YXRvciBwaGFzZXMuCi0gICAqLwotICBwdWJsaWMgRXZlbnRDb3VudGVyKFN0cmluZyBuYW1lLCBib29sZWFuIHN0YXJ0LCBib29sZWFuIG1lcmdlcGhhc2VzKSB7Ci0gICAgc3VwZXIobmFtZSwgc3RhcnQsIG1lcmdlcGhhc2VzKTsKLSAgICBjb3VudCA9IG5ldyBsb25nW1N0YXRzLk1BWF9QSEFTRVNdOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQ291bnRlci1zcGVjaWZpYyBtZXRob2RzCi0gICAqLwotCi0gIC8qKgotICAgKiBJbmNyZW1lbnQgdGhlIGV2ZW50IGNvdW50ZXIKLSAgICovCi0gIHB1YmxpYyB2b2lkIGluYygpIHsKLSAgICBpZiAocnVubmluZykgaW5jKDEpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluY3JlbWVudCB0aGUgZXZlbnQgY291bnRlciBieSA8Y29kZT52YWx1ZTwvY29kZT4KLSAgICoKLSAgICogQHBhcmFtIHZhbHVlIFRoZSBhbW91bnQgYnkgd2hpY2ggdGhlIGNvdW50ZXIgc2hvdWxkIGJlIGluY3JlbWVudGVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgaW5jKGludCB2YWx1ZSkgewotICAgIGlmIChydW5uaW5nKSB0b3RhbENvdW50ICs9IHZhbHVlOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogR2VuZXJpYyBjb3VudGVyIGNvbnRyb2wgbWV0aG9kczogc3RhcnQsIHN0b3AsIHByaW50IGV0YwotICAgKi8KLQotICAvKioKLSAgICogU3RhcnQgdGhpcyBjb3VudGVyCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzdGFydCgpIHsKLSAgICBpZiAoIVN0YXRzLmdhdGhlcmluZ1N0YXRzKSByZXR1cm47Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoIXJ1bm5pbmcpOwotICAgIHJ1bm5pbmcgPSB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0b3AgdGhpcyBjb3VudGVyCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzdG9wKCkgewotICAgIGlmICghU3RhdHMuZ2F0aGVyaW5nU3RhdHMpIHJldHVybjsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChydW5uaW5nKTsKLSAgICBydW5uaW5nID0gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIHBoYXNlIGhhcyBjaGFuZ2VkIChmcm9tIEdDIHRvIG11dGF0b3Igb3IgbXV0YXRvciB0byBHQykuCi0gICAqIFRha2UgYWN0aW9uIHdpdGggcmVzcGVjdCB0byB0aGUgbGFzdCBwaGFzZSBpZiBuZWNlc3NhcnkuCi0gICAqIDxiPkRvIG5vdGhpbmcgaW4gdGhpcyBjYXNlLjwvYj4KLSAgICoKLSAgICogQHBhcmFtIG9sZFBoYXNlIFRoZSBsYXN0IHBoYXNlCi0gICAqLwotICB2b2lkIHBoYXNlQ2hhbmdlKGludCBvbGRQaGFzZSkgewotICAgIGlmIChydW5uaW5nKSB7Ci0gICAgICBjb3VudFtvbGRQaGFzZV0gPSB0b3RhbENvdW50OwotICAgICAgdG90YWxDb3VudCA9IDA7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFByaW50IHRoZSB2YWx1ZSBvZiB0aGlzIGNvdW50ZXIgZm9yIHRoZSBnaXZlbiBwaGFzZS4gIFByaW50ICcwJwotICAgKiBmb3IgZmFsc2UsICcxJyBmb3IgdHJ1ZS4KLSAgICoKLSAgICogQHBhcmFtIHBoYXNlIFRoZSBwaGFzZSB0byBiZSBwcmludGVkCi0gICAqLwotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBwcmludENvdW50KGludCBwaGFzZSkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUyAmJiBtZXJnZVBoYXNlcygpKQotICAgICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQoKHBoYXNlIHwgMSkgPT0gKHBoYXNlICsgMSkpOwotICAgIGlmIChtZXJnZVBoYXNlcygpKQotICAgICAgcHJpbnRWYWx1ZShjb3VudFtwaGFzZV0gKyBjb3VudFtwaGFzZSArIDFdKTsKLSAgICBlbHNlCi0gICAgICBwcmludFZhbHVlKGNvdW50W3BoYXNlXSk7Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnQgdGhlIGN1cnJlbnQgdmFsdWUgZm9yIHRoaXMgY291bnRlciAobWlkLXBoYXNlKQotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgcHJpbnRDdXJyZW50KCkgewotICAgIHByaW50VmFsdWUodG90YWxDb3VudCk7Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnQgdGhlIGN1cnJlbnQgdG90YWwgZm9yIHRoaXMgY291bnRlcgotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgcHJpbnRUb3RhbCgpIHsKLSAgICBsb25nIHRvdGFsID0gMDsKLSAgICBmb3IgKGludCBwID0gMDsgcCA8PSBTdGF0cy5waGFzZTsgcCsrKSB7Ci0gICAgICB0b3RhbCArPSBjb3VudFtwXTsKLSAgICB9Ci0gICAgcHJpbnRWYWx1ZSh0b3RhbCk7Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnQgdGhlIGN1cnJlbnQgdG90YWwgZm9yIGVpdGhlciB0aGUgbXV0YXRvciBvciBHQyBwaGFzZQotICAgKgotICAgKiBAcGFyYW0gbXV0YXRvciBUcnVlIGlmIHRoZSB0b3RhbCBmb3IgdGhlIG11dGF0b3IgcGhhc2VzIGlzIHRvIGJlCi0gICAqIHByaW50ZWQgKG90aGVyd2lzZSB0aGUgdG90YWwgZm9yIHRoZSBHQyBwaGFzZXMgd2lsbCBiZSBwcmludGVkKS4KLSAgICovCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIHByaW50VG90YWwoYm9vbGVhbiBtdXRhdG9yKSB7Ci0gICAgbG9uZyB0b3RhbCA9IDA7Ci0gICAgZm9yIChpbnQgcCA9IChtdXRhdG9yKSA/IDAgOiAxOyBwIDw9IFN0YXRzLnBoYXNlOyBwICs9IDIpIHsKLSAgICAgIHRvdGFsICs9IGNvdW50W3BdOwotICAgIH0KLSAgICBwcmludFZhbHVlKHRvdGFsKTsKLSAgfQotCi0gIC8qKgotICAgKiBQcmludCB0aGUgY3VycmVudCBtaW5pbXVtIHZhbHVlIGZvciBlaXRoZXIgdGhlIG11dGF0b3Igb3IgR0MKLSAgICogcGhhc2UuCi0gICAqCi0gICAqIEBwYXJhbSBtdXRhdG9yIFRydWUgaWYgdGhlIG1pbmltdW0gZm9yIHRoZSBtdXRhdG9yIHBoYXNlIGlzIHRvIGJlCi0gICAqIHByaW50ZWQgKG90aGVyd2lzZSB0aGUgbWluaW11bSBmb3IgdGhlIEdDIHBoYXNlIHdpbGwgYmUgcHJpbnRlZCkuCi0gICAqLwotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBwcmludE1pbihib29sZWFuIG11dGF0b3IpIHsKLSAgICBpbnQgcCA9IChtdXRhdG9yKSA/IDAgOiAxOwotICAgIGxvbmcgbWluID0gY291bnRbcF07Ci0gICAgZm9yICg7IHAgPCBTdGF0cy5waGFzZTsgcCArPSAyKSB7Ci0gICAgICBpZiAoY291bnRbcF0gPCBtaW4pIG1pbiA9IGNvdW50W3BdOwotICAgIH0KLSAgICBwcmludFZhbHVlKG1pbik7Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnQgdGhlIGN1cnJlbnQgbWF4aW11bSB2YWx1ZSBmb3IgZWl0aGVyIHRoZSBtdXRhdG9yIG9yIEdDCi0gICAqIHBoYXNlLgotICAgKgotICAgKiBAcGFyYW0gbXV0YXRvciBUcnVlIGlmIHRoZSBtYXhpbXVtIGZvciB0aGUgbXV0YXRvciBwaGFzZSBpcyB0byBiZQotICAgKiBwcmludGVkIChvdGhlcndpc2UgdGhlIG1heGltdW0gZm9yIHRoZSBHQyBwaGFzZSB3aWxsIGJlIHByaW50ZWQpLgotICAgKi8KLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcHJpbnRNYXgoYm9vbGVhbiBtdXRhdG9yKSB7Ci0gICAgaW50IHAgPSAobXV0YXRvcikgPyAwIDogMTsKLSAgICBsb25nIG1heCA9IGNvdW50W3BdOwotICAgIGZvciAoOyBwIDwgU3RhdHMucGhhc2U7IHAgKz0gMikgewotICAgICAgaWYgKGNvdW50W3BdID4gbWF4KSBtYXggPSBjb3VudFtwXTsKLSAgICB9Ci0gICAgcHJpbnRWYWx1ZShtYXgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByaW50IHRoZSBnaXZlbiB2YWx1ZQotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIHByaW50ZWQKLSAgICovCi0gIHZvaWQgcHJpbnRWYWx1ZShsb25nIHZhbHVlKSB7Ci0gICAgTG9nLndyaXRlKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBQcmludCBzdGF0aXN0aWNzIGZvciB0aGUgbW9zdCByZWNlbnQgcGhhc2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIHByaW50TGFzdCgpIHsKLSAgICBpZiAoU3RhdHMucGhhc2UgPiAwKSBwcmludENvdW50KFN0YXRzLnBoYXNlIC0gMSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9zdGF0aXN0aWNzL0xvbmdDb3VudGVyLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvc3RhdGlzdGljcy9Mb25nQ291bnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmIwOTZhLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9zdGF0aXN0aWNzL0xvbmdDb3VudGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkuc3RhdGlzdGljczsKLQotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuTG9nOwotCi1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIGltcGxlbWVudHMgYSBzaW1wbGUgY291bnRlciAoY291bnRpbmcgc29tZQotICogaW50ZWdlciAobG9uZykgdmFsdWUgZm9yIGVhY2ggcGhhc2UpLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMb25nQ291bnRlciBleHRlbmRzIENvdW50ZXIgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluc3RhbmNlIHZhcmlhYmxlcwotICAgKi8KLQotICBwcml2YXRlIGZpbmFsIGxvbmdbXSBjb3VudDsKLQotICBwcml2YXRlIGxvbmcgc3RhcnRWYWx1ZSA9IDA7Ci0gIHByb3RlY3RlZCBsb25nIHRvdGFsQ291bnQgPSAwOwotICBwcml2YXRlIGJvb2xlYW4gcnVubmluZyA9IGZhbHNlOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluaXRpYWxpemF0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb3VudGVyCi0gICAqLwotICBMb25nQ291bnRlcihTdHJpbmcgbmFtZSkgewotICAgIHRoaXMobmFtZSwgdHJ1ZSwgZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvdW50ZXIKLSAgICogQHBhcmFtIHN0YXJ0IFRydWUgaWYgdGhpcyBjb3VudGVyIGlzIHRvIGJlIGltcGxpY2l0bHkgc3RhcnRlZAotICAgKiB3aGVuIDxjb2RlPnN0YXJ0QWxsKCk8L2NvZGU+IGlzIGNhbGxlZCAob3RoZXJ3aXNlIHRoZSBjb3VudGVyCi0gICAqIG11c3QgYmUgZXhwbGljaXRseSBzdGFydGVkKS4KLSAgICovCi0gIExvbmdDb3VudGVyKFN0cmluZyBuYW1lLCBib29sZWFuIHN0YXJ0KSB7Ci0gICAgdGhpcyhuYW1lLCBzdGFydCwgZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvdW50ZXIKLSAgICogQHBhcmFtIHN0YXJ0IFRydWUgaWYgdGhpcyBjb3VudGVyIGlzIHRvIGJlIGltcGxpY2l0bHkgc3RhcnRlZAotICAgKiB3aGVuIDxjb2RlPnN0YXJ0QWxsKCk8L2NvZGU+IGlzIGNhbGxlZCAob3RoZXJ3aXNlIHRoZSBjb3VudGVyCi0gICAqIG11c3QgYmUgZXhwbGljaXRseSBzdGFydGVkKS4KLSAgICogQHBhcmFtIG1lcmdlcGhhc2VzIFRydWUgaWYgdGhpcyBjb3VudGVyIGRvZXMgbm90IHNlcGFyYXRlbHkKLSAgICogcmVwb3J0IEdDIGFuZCBNdXRhdG9yIHBoYXNlcy4KLSAgICovCi0gIExvbmdDb3VudGVyKFN0cmluZyBuYW1lLCBib29sZWFuIHN0YXJ0LCBib29sZWFuIG1lcmdlcGhhc2VzKSB7Ci0gICAgc3VwZXIobmFtZSwgc3RhcnQsIG1lcmdlcGhhc2VzKTsKLSAgICBjb3VudCA9IG5ldyBsb25nW1N0YXRzLk1BWF9QSEFTRVNdOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQ291bnRlci1zcGVjaWZpYyBtZXRob2RzCi0gICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgbG9uZyBnZXRDdXJyZW50VmFsdWUoKTsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBHZW5lcmljIGNvdW50ZXIgY29udHJvbCBtZXRob2RzOiBzdGFydCwgc3RvcCwgcHJpbnQgZXRjCi0gICAqLwotCi0gIC8qKgotICAgKiBTdGFydCB0aGlzIGNvdW50ZXIKLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgIGlmICghU3RhdHMuZ2F0aGVyaW5nU3RhdHMpIHJldHVybjsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCghcnVubmluZyk7Ci0gICAgcnVubmluZyA9IHRydWU7Ci0gICAgc3RhcnRWYWx1ZSA9IGdldEN1cnJlbnRWYWx1ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0b3AgdGhpcyBjb3VudGVyCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdG9wKCkgewotICAgIGlmICghU3RhdHMuZ2F0aGVyaW5nU3RhdHMpIHJldHVybjsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydChydW5uaW5nKTsKLSAgICBydW5uaW5nID0gZmFsc2U7Ci0gICAgbG9uZyBkZWx0YSA9IGdldEN1cnJlbnRWYWx1ZSgpIC0gc3RhcnRWYWx1ZTsKLSAgICBjb3VudFtTdGF0cy5waGFzZV0gKz0gZGVsdGE7Ci0gICAgdG90YWxDb3VudCArPSBkZWx0YTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgcGhhc2UgaGFzIGNoYW5nZWQgKGZyb20gR0MgdG8gbXV0YXRvciBvciBtdXRhdG9yIHRvIEdDKS4KLSAgICogVGFrZSBhY3Rpb24gd2l0aCByZXNwZWN0IHRvIHRoZSBsYXN0IHBoYXNlIGlmIG5lY2Vzc2FyeS4KLSAgICogPGI+RG8gbm90aGluZyBpbiB0aGlzIGNhc2UuPC9iPgotICAgKgotICAgKiBAcGFyYW0gb2xkUGhhc2UgVGhlIGxhc3QgcGhhc2UKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHBoYXNlQ2hhbmdlKGludCBvbGRQaGFzZSkgewotICAgIGlmIChydW5uaW5nKSB7Ci0gICAgICBsb25nIG5vdyA9IGdldEN1cnJlbnRWYWx1ZSgpOwotICAgICAgbG9uZyBkZWx0YSA9IG5vdyAtIHN0YXJ0VmFsdWU7Ci0gICAgICBjb3VudFtvbGRQaGFzZV0gKz0gZGVsdGE7Ci0gICAgICB0b3RhbENvdW50ICs9IGRlbHRhOwotICAgICAgc3RhcnRWYWx1ZSA9IG5vdzsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnQgdGhlIHZhbHVlIG9mIHRoaXMgY291bnRlciBmb3IgdGhlIGdpdmVuIHBoYXNlLiAgUHJpbnQgJzAnCi0gICAqIGZvciBmYWxzZSwgJzEnIGZvciB0cnVlLgotICAgKgotICAgKiBAcGFyYW0gcGhhc2UgVGhlIHBoYXNlIHRvIGJlIHByaW50ZWQKLSAgICovCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIHByaW50Q291bnQoaW50IHBoYXNlKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TICYmIG1lcmdlUGhhc2VzKCkpCi0gICAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpIFZNLmFzc2VydGlvbnMuX2Fzc2VydCgocGhhc2UgfCAxKSA9PSAocGhhc2UgKyAxKSk7Ci0gICAgaWYgKG1lcmdlUGhhc2VzKCkpCi0gICAgICBwcmludFZhbHVlKGNvdW50W3BoYXNlXSArIGNvdW50W3BoYXNlICsgMV0pOwotICAgIGVsc2UKLSAgICAgIHByaW50VmFsdWUoY291bnRbcGhhc2VdKTsKLSAgfQotCi0gIC8qKgotICAgKiBQcmludCB0aGUgY3VycmVudCB0b3RhbCBmb3IgdGhpcyBjb3VudGVyCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCBwcmludFRvdGFsKCkgewotICAgIHByaW50VmFsdWUodG90YWxDb3VudCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHRvdGFsIGFzIGF0IHRoZSBsYXN0cyBwaGFzZQotICAgKgotICAgKiBAcmV0dXJuIFRoZSB0b3RhbCBhcyBhdCB0aGUgbGFzdCBwaGFzZQotICAgKi8KLSAgbG9uZyBnZXRMYXN0VG90YWwoKSB7Ci0gICAgcmV0dXJuIHRvdGFsQ291bnQ7Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnQgdGhlIGN1cnJlbnQgdG90YWwgZm9yIGVpdGhlciB0aGUgbXV0YXRvciBvciBHQyBwaGFzZQotICAgKgotICAgKiBAcGFyYW0gbXV0YXRvciBUcnVlIGlmIHRoZSB0b3RhbCBmb3IgdGhlIG11dGF0b3IgcGhhc2VzIGlzIHRvIGJlCi0gICAqIHByaW50ZWQgKG90aGVyd2lzZSB0aGUgdG90YWwgZm9yIHRoZSBHQyBwaGFzZXMgd2lsbCBiZSBwcmludGVkKS4KLSAgICovCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIHByaW50VG90YWwoYm9vbGVhbiBtdXRhdG9yKSB7Ci0gICAgbG9uZyB0b3RhbCA9IDA7Ci0gICAgZm9yIChpbnQgcCA9IChtdXRhdG9yKSA/IDAgOiAxOyBwIDw9IFN0YXRzLnBoYXNlOyBwICs9IDIpIHsKLSAgICAgIHRvdGFsICs9IGNvdW50W3BdOwotICAgIH0KLSAgICBwcmludFZhbHVlKHRvdGFsKTsKLSAgfQotCi0gIC8qKgotICAgKiBQcmludCB0aGUgY3VycmVudCBtaW5pbXVtIHZhbHVlIGZvciBlaXRoZXIgdGhlIG11dGF0b3Igb3IgR0MKLSAgICogcGhhc2UuCi0gICAqCi0gICAqIEBwYXJhbSBtdXRhdG9yIFRydWUgaWYgdGhlIG1pbmltdW0gZm9yIHRoZSBtdXRhdG9yIHBoYXNlIGlzIHRvIGJlCi0gICAqIHByaW50ZWQgKG90aGVyd2lzZSB0aGUgbWluaW11bSBmb3IgdGhlIEdDIHBoYXNlIHdpbGwgYmUgcHJpbnRlZCkuCi0gICAqLwotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBwcmludE1pbihib29sZWFuIG11dGF0b3IpIHsKLSAgICBpbnQgcCA9IChtdXRhdG9yKSA/IDAgOiAxOwotICAgIGxvbmcgbWluID0gY291bnRbcF07Ci0gICAgZm9yICg7IHAgPCBTdGF0cy5waGFzZTsgcCArPSAyKSB7Ci0gICAgICBpZiAoY291bnRbcF0gPCBtaW4pIG1pbiA9IGNvdW50W3BdOwotICAgIH0KLSAgICBwcmludFZhbHVlKG1pbik7Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnQgdGhlIGN1cnJlbnQgbWF4aW11bSB2YWx1ZSBmb3IgZWl0aGVyIHRoZSBtdXRhdG9yIG9yIEdDCi0gICAqIHBoYXNlLgotICAgKgotICAgKiBAcGFyYW0gbXV0YXRvciBUcnVlIGlmIHRoZSBtYXhpbXVtIGZvciB0aGUgbXV0YXRvciBwaGFzZSBpcyB0byBiZQotICAgKiBwcmludGVkIChvdGhlcndpc2UgdGhlIG1heGltdW0gZm9yIHRoZSBHQyBwaGFzZSB3aWxsIGJlIHByaW50ZWQpLgotICAgKi8KLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcHJpbnRNYXgoYm9vbGVhbiBtdXRhdG9yKSB7Ci0gICAgaW50IHAgPSAobXV0YXRvcikgPyAwIDogMTsKLSAgICBsb25nIG1heCA9IGNvdW50W3BdOwotICAgIGZvciAoOyBwIDwgU3RhdHMucGhhc2U7IHAgKz0gMikgewotICAgICAgaWYgKGNvdW50W3BdID4gbWF4KSBtYXggPSBjb3VudFtwXTsKLSAgICB9Ci0gICAgcHJpbnRWYWx1ZShtYXgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByaW50IHRoZSBnaXZlbiB2YWx1ZQotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIHByaW50ZWQKLSAgICovCi0gIHZvaWQgcHJpbnRWYWx1ZShsb25nIHZhbHVlKSB7Ci0gICAgTG9nLndyaXRlKHZhbHVlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L3N0YXRpc3RpY3MvUGVyZkV2ZW50LmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvc3RhdGlzdGljcy9QZXJmRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZlZDFlMi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvc3RhdGlzdGljcy9QZXJmRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5zdGF0aXN0aWNzOwotCi1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Mb2c7Ci1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLlVuaW50ZXJydXB0aWJsZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBwZXJmIGV2ZW50LCBzdWNoIGFzIGNhY2hlIG1pc3NlcywgZXRjLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgZmluYWwgY2xhc3MgUGVyZkV2ZW50IGV4dGVuZHMgTG9uZ0NvdW50ZXIgewotICAvKiogVHJ1ZSBpZiB0aGUgY291bnRlciBkaWQgbm90IHJ1biBkdWUgdG8gY29udGVudGlvbiBmb3IgYSBwaHlzaWNhbCBjb3VudGVyICovCi0gIHByaXZhdGUgYm9vbGVhbiBjb250ZW5kZWQ7Ci0KLSAgLyoqIFRydWUgaWYgdGhlIGNvdW50ZXIgZGlkIG5vdCBydW4gYWxsIG9mIHRoZSB0aW1lIGFuZCBoYXMgYmVlbiBzY2FsZWQgYXBwcm9wcmlhdGVseSAqLwotICBwcml2YXRlIGJvb2xlYW4gc2NhbGVkOwotCi0gIC8qKiBUcnVlIGlmIHRoZSBjb3VudGVyIG92ZXJmbG93ZWQgKi8KLSAgcHJpdmF0ZSBib29sZWFuIG92ZXJmbG93ZWQ7Ci0KLSAgLyoqIFRoZSBpbmRleCBvZiB0aGUgY291bnRlciBpbiB0aGUgbmF0aXZlIGFycmF5ICovCi0gIHByaXZhdGUgaW50IGluZGV4OwotCi0gIC8qKiBUaGUgcHJldmlvdXNseSByZWFkIHZhbHVlIG9mIHRoZSBjb3VudGVyICh1c2VkIHRvIGRldGVjdCBvdmVyZmxvdykgKi8KLSAgcHJpdmF0ZSBsb25nIHByZXZpb3VzVmFsdWU7Ci0KLSAgLyoqIEEgYnVmZmVyIHBhc3NlZCB0byB0aGUgbmF0aXZlIGNvZGUgd2hlbiByZWFkaW5nIHZhbHVlcywgcmV0dXJucyB0aGUgdHVwbGUgUkFXX0NPVU5ULCBUSU1FX0VOQUJMRUQsIFRJTUVfUlVOTklORyAqLwotICBwcml2YXRlIGZpbmFsIGxvbmdbXSByZWFkQnVmZmVyID0gbmV3IGxvbmdbM107Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSQVdfQ09VTlQgPSAwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRV9FTkFCTEVEID0gMTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJTUVfUlVOTklORyA9IDI7Ci0KLSAgLyoqIFRocmVlIDY0IGJpdCB2YWx1ZXMgaXMgMjQgYnl0ZXMgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJZVEVTX1RPX1JFQUQgPSAyNDsKLQotICAvKiogVHJ1ZSBpZiBhbnkgZGF0YSB3YXMgc2NhbGVkICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkYXRhV2FzU2NhbGVkID0gZmFsc2U7Ci0KLSAgcHVibGljIFBlcmZFdmVudChpbnQgaW5kZXgsIFN0cmluZyBuYW1lKSB7Ci0gICAgc3VwZXIobmFtZSwgdHJ1ZSwgZmFsc2UpOwotICAgIHRoaXMuaW5kZXggPSBpbmRleDsKLSAgfQotCi0gIC8qKgotICAgKiBDb3VudGVycyBhcmUgNjQgYml0IHVuc2lnbmVkIGluIHRoZSBrZXJuZWwgYnV0IG9ubHkgNjMgYml0cyBhcmUgYXZhaWxhYmxlIGluIEphdmEKLSAgICovCi0gIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgbG9uZyBnZXRDdXJyZW50VmFsdWUoKSB7Ci0gICAgVk0uc3RhdGlzdGljcy5wZXJmRXZlbnRSZWFkKGluZGV4LCByZWFkQnVmZmVyKTsKLSAgICBpZiAocmVhZEJ1ZmZlcltSQVdfQ09VTlRdIDwgMCB8fCByZWFkQnVmZmVyW1RJTUVfRU5BQkxFRF0gPCAwIHx8IHJlYWRCdWZmZXJbVElNRV9SVU5OSU5HXSA8IDApIHsKLSAgICAgIC8vIE5lZ2F0aXZlIGltcGxpZXMgdGhleSBoYXZlIGV4Y2VlZGVkIDYzIGJpdHMuCi0gICAgICBvdmVyZmxvd2VkID0gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKHJlYWRCdWZmZXJbVElNRV9FTkFCTEVEXSA9PSAwKSB7Ci0gICAgICAvLyBDb3VudGVyIG5ldmVyIHJ1biAoYXNzdW1lIGNvbnRlbnRpb24pCi0gICAgICBjb250ZW5kZWQgPSB0cnVlOwotICAgIH0KLSAgICAvLyBXYXMgdGhlIGNvdW50ZXIgc2NhbGVkPwotICAgIGlmIChyZWFkQnVmZmVyW1RJTUVfRU5BQkxFRF0gIT0gcmVhZEJ1ZmZlcltUSU1FX1JVTk5JTkddKSB7Ci0gICAgICBzY2FsZWQgPSB0cnVlOwotICAgICAgZGF0YVdhc1NjYWxlZCA9IHRydWU7Ci0gICAgICBkb3VibGUgc2NhbGVGYWN0b3I7Ci0gICAgICBpZiAocmVhZEJ1ZmZlcltUSU1FX1JVTk5JTkddID09IDApIHsKLSAgICAgICAgc2NhbGVGYWN0b3IgPSAwOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc2NhbGVGYWN0b3IgPSByZWFkQnVmZmVyW1RJTUVfRU5BQkxFRF0gLyByZWFkQnVmZmVyW1RJTUVfUlVOTklOR107Ci0gICAgICB9Ci0gICAgICByZWFkQnVmZmVyW1JBV19DT1VOVF0gPSAobG9uZykgKHJlYWRCdWZmZXJbUkFXX0NPVU5UXSAqIHNjYWxlRmFjdG9yKTsKLSAgICB9Ci0gICAgaWYgKHJlYWRCdWZmZXJbUkFXX0NPVU5UXSA8IHByZXZpb3VzVmFsdWUpIHsKLSAgICAgIC8vIHZhbHVlIHNob3VsZCBtb25vdG9uaWNhbGx5IGluY3JlYXNlCi0gICAgICBvdmVyZmxvd2VkID0gdHJ1ZTsKLSAgICB9Ci0gICAgcHJldmlvdXNWYWx1ZSA9IHJlYWRCdWZmZXJbUkFXX0NPVU5UXTsKLSAgICByZXR1cm4gcmVhZEJ1ZmZlcltSQVdfQ09VTlRdOwotICB9Ci0KLSAgLyoqCi0gICAqIFByaW50IHRoZSBnaXZlbiB2YWx1ZQotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIHByaW50ZWQKLSAgICovCi0gIEBPdmVycmlkZQotICB2b2lkIHByaW50VmFsdWUobG9uZyB2YWx1ZSkgewotICAgIGlmIChvdmVyZmxvd2VkKSB7Ci0gICAgICBMb2cud3JpdGUoIk9WRVJGTE9XRUQiKTsKLSAgICB9IGVsc2UgaWYgKGNvbnRlbmRlZCkgewotICAgICAgTG9nLndyaXRlKCJDT05URU5ERUQiKTsKLSAgICB9IGVsc2UgewotICAgICAgTG9nLndyaXRlKHZhbHVlKTsKLSAgICAgIGlmIChzY2FsZWQpIHsKLSAgICAgICAgTG9nLndyaXRlKCIgKFNDQUxFRCkiKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldENvbHVtblN1ZmZpeCgpIHsKLSAgICByZXR1cm4KLSAgICAgIG92ZXJmbG93ZWQgPyAib3ZlcmZsb3dlZCIgOgotICAgICAgY29udGVuZGVkID8gImNvbnRlbmRlZCIgOgotICAgICAgc2NhbGVkID8gIi5zY2FsZWQiIDoKLSAgICAgICIiOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9zdGF0aXN0aWNzL1NpemVDb3VudGVyLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3V0aWxpdHkvc3RhdGlzdGljcy9TaXplQ291bnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTMxYzI1Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9zdGF0aXN0aWNzL1NpemVDb3VudGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkuc3RhdGlzdGljczsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHNpbXBsZSBjb3VudGVyIG9mIGV2ZW50cyBvZiBkaWZmZXJlbnQgc2l6ZXMKLSAqIChlZyBvYmplY3QgYWxsb2NhdGlvbnMsIHdoZXJlIHRvdGFsIG51bWJlciBvZiBvYmplY3RzIGFuZCB0b3RhbAotICogdm9sdW1lIG9mIG9iamVjdHMgd291bGQgYmUgY291bnRlZCkuCi0gKgotICogVGhlIGNvdW50ZXIgaXMgdHJpdmlhbGx5IGNvbXBvc2VkIGZyb20gdHdvIGV2ZW50IGNvdW50ZXJzIChvbmUgZm9yCi0gKiBjb3VudGluZyB0aGUgbnVtYmVyIG9mIGV2ZW50cywgdGhlIG90aGVyIGZvciBjb3VudGluZyB0aGUgdm9sdW1lKS4KLSAqLwotQFVuaW50ZXJydXB0aWJsZSBwdWJsaWMgY2xhc3MgU2l6ZUNvdW50ZXIgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluc3RhbmNlIHZhcmlhYmxlcwotICAgKi8KLSAgcHJpdmF0ZSBFdmVudENvdW50ZXIgdW5pdHM7Ci0gIHByaXZhdGUgRXZlbnRDb3VudGVyIHZvbHVtZTsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbml0aWFsaXphdGlvbgotICAgKi8KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY291bnRlcgotICAgKi8KLSAgcHVibGljIFNpemVDb3VudGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgdGhpcyhuYW1lLCB0cnVlLCBmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY291bnRlcgotICAgKiBAcGFyYW0gc3RhcnQgVHJ1ZSBpZiB0aGlzIGNvdW50ZXIgaXMgdG8gYmUgaW1wbGljaXRseSBzdGFydGVkCi0gICAqIHdoZW4gPGNvZGU+c3RhcnRBbGwoKTwvY29kZT4gaXMgY2FsbGVkIChvdGhlcndpc2UgdGhlIGNvdW50ZXIKLSAgICogbXVzdCBiZSBleHBsaWNpdGx5IHN0YXJ0ZWQpLgotICAgKi8KLSAgcHVibGljIFNpemVDb3VudGVyKFN0cmluZyBuYW1lLCBib29sZWFuIHN0YXJ0KSB7Ci0gICAgdGhpcyhuYW1lLCBzdGFydCwgZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvdW50ZXIKLSAgICogQHBhcmFtIHN0YXJ0IFRydWUgaWYgdGhpcyBjb3VudGVyIGlzIHRvIGJlIGltcGxpY2l0bHkgc3RhcnRlZAotICAgKiB3aGVuIDxjb2RlPnN0YXJ0QWxsKCk8L2NvZGU+IGlzIGNhbGxlZCAob3RoZXJ3aXNlIHRoZSBjb3VudGVyCi0gICAqIG11c3QgYmUgZXhwbGljaXRseSBzdGFydGVkKS4KLSAgICogQHBhcmFtIG1lcmdlcGhhc2VzIFRydWUgaWYgdGhpcyBjb3VudGVyIGRvZXMgbm90IHNlcGFyYXRlbHkKLSAgICogcmVwb3J0IEdDIGFuZCBNdXRhdG9yIHBoYXNlcy4KLSAgICovCi0gIHB1YmxpYyBTaXplQ291bnRlcihTdHJpbmcgbmFtZSwgYm9vbGVhbiBzdGFydCwgYm9vbGVhbiBtZXJnZXBoYXNlcykgewotICAgIHVuaXRzID0gbmV3IEV2ZW50Q291bnRlcihuYW1lLCBzdGFydCwgbWVyZ2VwaGFzZXMpOwotICAgIHZvbHVtZSA9IG5ldyBFdmVudENvdW50ZXIobmFtZSArICJWb2x1bWUiLCBzdGFydCwgbWVyZ2VwaGFzZXMpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQ291bnRlci1zcGVjaWZpYyBtZXRob2RzCi0gICAqLwotCi0gIC8qKgotICAgKiBJbmNyZW1lbnQgdGhlIGV2ZW50IGNvdW50ZXIgYnkgPGNvZGU+dmFsdWU8L2NvZGU+Ci0gICAqCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgYW1vdW50IGJ5IHdoaWNoIHRoZSBjb3VudGVyIHNob3VsZCBiZSBpbmNyZW1lbnRlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGluYyhpbnQgdmFsdWUpIHsKLSAgICB1bml0cy5pbmMoKTsKLSAgICB2b2x1bWUuaW5jKHZhbHVlKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEdlbmVyaWMgY291bnRlciBjb250cm9sIG1ldGhvZHM6IHN0YXJ0LCBzdG9wLCBwcmludCBldGMKLSAgICovCi0KLSAgLyoqCi0gICAqIFN0YXJ0IHRoaXMgY291bnRlcgotICAgKi8KLSAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgdW5pdHMuc3RhcnQoKTsKLSAgICB2b2x1bWUuc3RhcnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBTdG9wIHRoaXMgY291bnRlcgotICAgKi8KLSAgcHVibGljIHZvaWQgc3RvcCgpIHsKLSAgICB1bml0cy5zdG9wKCk7Ci0gICAgdm9sdW1lLnN0b3AoKTsKLSAgfQotCi0gIC8qKgotICAgKiBQcmludCBjdXJyZW50IChtaWQtcGhhc2UpIHVuaXRzCi0gICAqLwotICBwdWJsaWMgdm9pZCBwcmludEN1cnJlbnRVbml0cygpIHsKLSAgICB1bml0cy5wcmludEN1cnJlbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBQcmludCAobWlkLXBoYXNlKSB2b2x1bWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHByaW50Q3VycmVudFZvbHVtZSgpIHsKLSAgICB2b2x1bWUucHJpbnRDdXJyZW50KCk7Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnQgdW5pdHMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHByaW50VW5pdHMoKSB7Ci0gICAgdW5pdHMucHJpbnRUb3RhbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByaW50IHZvbHVtZQotICAgKi8KLSAgcHVibGljIHZvaWQgcHJpbnRWb2x1bWUoKSB7Ci0gICAgdm9sdW1lLnByaW50VG90YWwoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L3N0YXRpc3RpY3MvU3RhdHMuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9zdGF0aXN0aWNzL1N0YXRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYTc5NGYuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L3N0YXRpc3RpY3MvU3RhdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5zdGF0aXN0aWNzOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5QbGFuOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuTG9nOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkub3B0aW9ucy5PcHRpb25zOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkub3B0aW9ucy5QcmludFBoYXNlU3RhdHM7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5vcHRpb25zLlhtbFN0YXRzOwotCi1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYmFzaWMgc3RhdGlzdGljcyBmdW5jdGlvbmFsaXR5Ci0gKi8KLUBVbmludGVycnVwdGlibGUgcHVibGljIGNsYXNzIFN0YXRzIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDbGFzcyB2YXJpYWJsZXMKLSAgICovCi0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIEdBVEhFUl9NQVJLX0NPTlNfU1RBVFMgPSBmYWxzZTsKLQotICAvKiogTWF4aW11bSBudW1iZXIgb2YgZ2MvbXV0YXRvciBwaGFzZXMgdGhhdCBjYW4gYmUgY291bnRlZCAqLwotICBzdGF0aWMgZmluYWwgaW50IE1BWF9QSEFTRVMgPSAxIDw8IDEyOwotICAvKiogTWF4aW11bSBudW1iZXIgb2YgY291bnRlcnMgdGhhdCBjYW4gYmUgaW4gb3BlcmF0aW9uICovCi0gIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NPVU5URVJTID0gMTAwOwotCi0gIHByaXZhdGUgc3RhdGljIGludCBjb3VudGVycyA9IDA7Ci0gIHByaXZhdGUgc3RhdGljIENvdW50ZXJbXSBjb3VudGVyOwotICBzdGF0aWMgaW50IHBoYXNlID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgaW50IGdjQ291bnQgPSAwOwotICBzdGF0aWMgYm9vbGVhbiBnYXRoZXJpbmdTdGF0cyA9IGZhbHNlOwotICBzdGF0aWMgYm9vbGVhbiBleGNlZWRlZFBoYXNlTGltaXQgPSBmYWxzZTsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbml0aWFsaXphdGlvbgotICAgKi8KLQotICAvKioKLSAgICogQ2xhc3MgaW5pdGlhbGl6ZXIuICBUaGlzIGlzIGV4ZWN1dGVkIDxpPnByaW9yPC9pPiB0byBib290c3RyYXAKLSAgICogKGkuZS4gYXQgImJ1aWxkIiB0aW1lKS4gIFRoaXMgaXMgd2hlcmUga2V5IDxpPmdsb2JhbDwvaT4KLSAgICogaW5zdGFuY2VzIGFyZSBhbGxvY2F0ZWQuICBUaGVzZSBpbnN0YW5jZXMgd2lsbCBiZSBpbmNvcnBvcmF0ZWQKLSAgICogaW50byB0aGUgYm9vdCBpbWFnZSBieSB0aGUgYnVpbGQgcHJvY2Vzcy4KLSAgICovCi0gIHN0YXRpYyB7Ci0gICAgY291bnRlciA9IG5ldyBDb3VudGVyW01BWF9DT1VOVEVSU107Ci0gICAgT3B0aW9ucy5wcmludFBoYXNlU3RhdHMgPSBuZXcgUHJpbnRQaGFzZVN0YXRzKCk7Ci0gICAgT3B0aW9ucy54bWxTdGF0cyA9IG5ldyBYbWxTdGF0cygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIG5ldyBjb3VudGVyIHRvIHRoZSBzZXQgb2YgbWFuYWdlZCBjb3VudGVycy4KLSAgICoKLSAgICogQHBhcmFtIGN0ciBUaGUgY291bnRlciB0byBiZSBhZGRlZC4KLSAgICovCi0gIEBJbnRlcnJ1cHRpYmxlCi0gIHN0YXRpYyB2b2lkIG5ld0NvdW50ZXIoQ291bnRlciBjdHIpIHsKLSAgICBpZiAoY291bnRlcnMgPCAoTUFYX0NPVU5URVJTIC0gMSkpIHsKLSAgICAgIGNvdW50ZXJbY291bnRlcnMrK10gPSBjdHI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIExvZy53cml0ZWxuKCJXYXJuaW5nOiBudW1iZXIgb2Ygc3RhdHMgY291bnRlcnMgZXhjZWVkcyBtYXhpbXVtIik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXJ0IGEgbmV3IEdDIHBoYXNlLiAgVGhpcyBtZWFucyBub3RpZnlpbmcgZWFjaCBjb3VudGVyIG9mIHRoZQotICAgKiBwaGFzZSBjaGFuZ2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc3RhcnRHQygpIHsKLSAgICBnY0NvdW50Kys7Ci0gICAgaWYgKCFnYXRoZXJpbmdTdGF0cykgcmV0dXJuOwotICAgIGlmIChwaGFzZSA8IE1BWF9QSEFTRVMgLSAxKSB7Ci0gICAgICBmb3IgKGludCBjID0gMDsgYyA8IGNvdW50ZXJzOyBjKyspIHsKLSAgICAgICAgY291bnRlcltjXS5waGFzZUNoYW5nZShwaGFzZSk7Ci0gICAgICB9Ci0gICAgICBwaGFzZSsrOwotICAgIH0gZWxzZSBpZiAoIWV4Y2VlZGVkUGhhc2VMaW1pdCkgewotICAgICAgTG9nLndyaXRlbG4oIldhcm5pbmc6IG51bWJlciBvZiBHQyBwaGFzZXMgZXhjZWVkcyBNQVhfUEhBU0VTIik7Ci0gICAgICBleGNlZWRlZFBoYXNlTGltaXQgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBFbmQgYSBHQyBwaGFzZS4gIFRoaXMgbWVhbnMgbm90aWZ5aW5nIGVhY2ggY291bnRlciBvZiB0aGUgcGhhc2UKLSAgICogY2hhbmdlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGVuZEdDKCkgewotICAgIGlmICghZ2F0aGVyaW5nU3RhdHMpIHJldHVybjsKLSAgICBpZiAocGhhc2UgPCBNQVhfUEhBU0VTIC0gMSkgewotICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBjb3VudGVyczsgYysrKSB7Ci0gICAgICAgIGNvdW50ZXJbY10ucGhhc2VDaGFuZ2UocGhhc2UpOwotICAgICAgfQotICAgICAgcGhhc2UrKzsKLSAgICB9IGVsc2UgaWYgKCFleGNlZWRlZFBoYXNlTGltaXQpIHsKLSAgICAgIExvZy53cml0ZWxuKCJXYXJuaW5nOiBudW1iZXIgb2YgR0MgcGhhc2VzIGV4Y2VlZHMgTUFYX1BIQVNFUyIpOwotICAgICAgZXhjZWVkZWRQaGFzZUxpbWl0ID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU3RhcnQgYWxsIGltcGxpY2l0bHkgc3RhcnRlZCBjb3VudGVycyAoaS5lLiB0aG9zZSBmb3Igd2hvbQotICAgKiA8Y29kZT5zdGFydCA9PSB0cnVlPC9jb2RlPikuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc3RhcnRBbGwoKSB7Ci0gICAgaWYgKGdhdGhlcmluZ1N0YXRzKSB7Ci0gICAgICBMb2cud3JpdGVsbigiRXJyb3I6IGNhbGxpbmcgU3RhdHMuc3RhcnRBbGwoKSB3aGlsZSBzdGF0cyBydW5uaW5nIik7Ci0gICAgICBMb2cud3JpdGVsbigiICAgICAgIHZlcmJvc2l0eSA+IDAgYW5kIHRoZSBoYXJuZXNzIG1lY2hhbmlzbSBtYXkgYmUgY29uZmxpY2l0bmciKTsKLSAgICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KGZhbHNlKTsKLSAgICB9Ci0gICAgZ2F0aGVyaW5nU3RhdHMgPSB0cnVlOwotICAgIGZvciAoaW50IGMgPSAwOyBjIDwgY291bnRlcnM7IGMrKykgewotICAgICAgaWYgKGNvdW50ZXJbY10uZ2V0U3RhcnQoKSkKLSAgICAgICAgY291bnRlcltjXS5zdGFydCgpOwotICAgIH0KLQotICAgIGlmIChPcHRpb25zLnhtbFN0YXRzLmdldFZhbHVlKCkpIHsKLSAgICAgIFhtbC5iZWdpbigpOwotICAgICAgWG1sLm9wZW5UYWcoIm1tdGstc3RhdHMiKTsKLSAgICAgIFhtbC5lbmQoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU3RvcCBhbGwgY291bnRlcnMKLSAgICovCi0gIEBJbnRlcnJ1cHRpYmxlCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzdG9wQWxsKCkgewotICAgIHN0b3BBbGxDb3VudGVycygpOwotICAgIFN0YXRzLnByaW50U3RhdHMoKTsKLSAgICBpZiAoT3B0aW9ucy54bWxTdGF0cy5nZXRWYWx1ZSgpKSB7Ci0gICAgICBYbWwuYmVnaW4oKTsKLSAgICAgIFhtbC5jbG9zZVRhZygibW10ay1zdGF0cyIpOwotICAgICAgWG1sLmVuZCgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTdG9wIGFsbCBjb3VudGVycwotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzdG9wQWxsQ291bnRlcnMoKSB7Ci0gICAgZm9yIChpbnQgYyA9IDA7IGMgPCBjb3VudGVyczsgYysrKSB7Ci0gICAgICBpZiAoY291bnRlcltjXS5nZXRTdGFydCgpKQotICAgICAgICBjb3VudGVyW2NdLnN0b3AoKTsKLSAgICB9Ci0gICAgZ2F0aGVyaW5nU3RhdHMgPSBmYWxzZTsKLSAgfQotCi0gIEBJbnRlcnJ1cHRpYmxlCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFN0YXRzKCkgewotICAgIGlmIChleGNlZWRlZFBoYXNlTGltaXQpIHsKLSAgICAgIExvZy53cml0ZWxuKCJXYXJuaW5nOiBudW1iZXIgb2YgR0MgcGhhc2VzIGV4Y2VlZHMgTUFYX1BIQVNFUy4gIFN0YXRpc3RpY3MgYXJlIHRydW5jYXRlZC4iKTsKLSAgICB9Ci0gICAgaWYgKE9wdGlvbnMueG1sU3RhdHMuZ2V0VmFsdWUoKSkKLSAgICAgIHByaW50U3RhdHNYbWwoKTsKLSAgICBlbHNlCi0gICAgICBwcmludFN0YXRzUGxhaW4oKTsKLSAgfQotCi0gIC8qKgotICAgKiBQcmludCBvdXQgc3RhdGlzdGljcwotICAgKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50U3RhdHNQbGFpbigpIHsKLSAgICBpZiAoT3B0aW9ucy5wcmludFBoYXNlU3RhdHMuZ2V0VmFsdWUoKSkKLSAgICAgIHByaW50UGhhc2VzKCk7Ci0gICAgcHJpbnRUb3RhbHMoKTsKLSAgfQotCi0gIC8qKgotICAgKiBQcmludCBvdXQgc3RhdGlzdGljcyB0b3RhbHMKLSAgICovCi0gIEBJbnRlcnJ1cHRpYmxlCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFRvdGFscygpIHsKLSAgICBMb2cud3JpdGVsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBNTVRrIFN0YXRpc3RpY3MgVG90YWxzID09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLSAgICBwcmludENvbHVtbk5hbWVzKCk7Ci0gICAgTG9nLndyaXRlKHBoYXNlLzIpOyBMb2cud3JpdGUoIlx0Iik7Ci0gICAgZm9yIChpbnQgYyA9IDA7IGMgPCBjb3VudGVyczsgYysrKSB7Ci0gICAgICBpZiAoY291bnRlcltjXS5tZXJnZVBoYXNlcygpKSB7Ci0gICAgICAgIGNvdW50ZXJbY10ucHJpbnRUb3RhbCgpOyBMb2cud3JpdGUoIlx0Iik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb3VudGVyW2NdLnByaW50VG90YWwodHJ1ZSk7IExvZy53cml0ZSgiXHQiKTsKLSAgICAgICAgY291bnRlcltjXS5wcmludFRvdGFsKGZhbHNlKTsgTG9nLndyaXRlKCJcdCIpOwotICAgICAgfQotICAgIH0KLSAgICBMb2cud3JpdGVsbigpOwotICAgIExvZy53cml0ZSgiVG90YWwgdGltZTogIik7Ci0gICAgUGxhbi50b3RhbFRpbWUucHJpbnRUb3RhbCgpOyBMb2cud3JpdGVsbigiIG1zIik7Ci0gICAgTG9nLndyaXRlbG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgTU1UayBTdGF0aXN0aWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnQgb3V0IHN0YXRpc3RpY3MgZm9yIGVhY2ggbXV0YXRvci9nYyBwaGFzZQotICAgKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50UGhhc2VzKCkgewotICAgIExvZy53cml0ZWxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0gTU1UayBTdGF0aXN0aWNzIFBlciBHQy9NdXRhdG9yIFBoYXNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgIHByaW50Q29sdW1uTmFtZXMoKTsKLSAgICBmb3IgKGludCBwID0gMDsgcCA8PSBwaGFzZTsgcCArPSAyKSB7Ci0gICAgICBMb2cud3JpdGUoKHAvMikrMSk7IExvZy53cml0ZSgiXHQiKTsKLSAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgY291bnRlcnM7IGMrKykgewotICAgICAgICBpZiAoY291bnRlcltjXS5tZXJnZVBoYXNlcygpKSB7Ci0gICAgICAgICAgY291bnRlcltjXS5wcmludENvdW50KHApOyBMb2cud3JpdGUoIlx0Iik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgY291bnRlcltjXS5wcmludENvdW50KHApOyBMb2cud3JpdGUoIlx0Iik7Ci0gICAgICAgICAgY291bnRlcltjXS5wcmludENvdW50KHArMSk7IExvZy53cml0ZSgiXHQiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgTG9nLndyaXRlbG4oKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnQgb3V0IHN0YXRpc3RpY3MgY29sdW1uIG5hbWVzCi0gICAqLwotICBASW50ZXJydXB0aWJsZQotICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50Q29sdW1uTmFtZXMoKSB7Ci0gICAgTG9nLndyaXRlKCJHQ1x0Iik7Ci0gICAgZm9yIChpbnQgYyA9IDA7IGMgPCBjb3VudGVyczsgYysrKSB7Ci0gICAgICBpZiAoY291bnRlcltjXS5tZXJnZVBoYXNlcygpKSB7Ci0gICAgICAgIExvZy53cml0ZShjb3VudGVyW2NdLmdldE5hbWUoKSk7Ci0gICAgICAgIExvZy53cml0ZShjb3VudGVyW2NdLmdldENvbHVtblN1ZmZpeCgpKTsKLSAgICAgICAgTG9nLndyaXRlKCJcdCIpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgTG9nLndyaXRlKGNvdW50ZXJbY10uZ2V0TmFtZSgpKTsKLSAgICAgICAgTG9nLndyaXRlKGNvdW50ZXJbY10uZ2V0Q29sdW1uU3VmZml4KCkpOwotICAgICAgICBMb2cud3JpdGUoIi5tdVx0Iik7Ci0gICAgICAgIExvZy53cml0ZShjb3VudGVyW2NdLmdldE5hbWUoKSk7Ci0gICAgICAgIExvZy53cml0ZShjb3VudGVyW2NdLmdldENvbHVtblN1ZmZpeCgpKTsKLSAgICAgICAgTG9nLndyaXRlKCIuZ2NcdCIpOwotICAgICAgfQotICAgIH0KLSAgICBMb2cud3JpdGVsbigpOwotICB9Ci0KLSAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiAgICAgICAgICAgICAgU3RhdGlzdGljcyBvdXRwdXQgaW4geG1sIGZvcm1hdAotICovCi0KLSAgLyoqCi0gICAqIFByaW50IGNvbW1hbmQtbGluZSBvcHRpb25zIGFuZCBzdGF0aXN0aWNzIGluIFhNTCBmb3JtYXQKLSAgICovCi0gIEBJbnRlcnJ1cHRpYmxlCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFN0YXRzWG1sKCkgewotICAgIFhtbC5iZWdpbigpOwotICAgIE9wdGlvbnMuc2V0LmxvZ1htbCgpOwotICAgIFZNLmNvbmZpZy5wcmludENvbmZpZ1htbCgpOwotICAgIGlmIChPcHRpb25zLnByaW50UGhhc2VTdGF0cy5nZXRWYWx1ZSgpKQotICAgICAgcHJpbnRQaGFzZXNYbWwoKTsKLSAgICBwcmludFRvdGFsc1htbCgpOwotICAgIFhtbC5lbmQoKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgb3BlblN0YXRYbWwoU3RyaW5nIG5hbWUpIHsKLSAgICBYbWwub3Blbk1pbm9yVGFnKCJzdGF0Iik7Ci0gICAgWG1sLmF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjbG9zZVN0YXRYbWwoKSB7Ci0gICAgWG1sLmNsb3NlTWlub3JUYWcoKTsKLSAgfQotCi0gIGVudW0gUGhhc2UgewotICAgIE1VVEFUT1IoIm11IiksIEdDKCJnYyIpLCBDT01CSU5FRCgiYWxsIik7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotICAgIFBoYXNlKFN0cmluZyBuYW1lKSB7Ci0gICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gbmFtZTsgfQotICB9Ci0KLSAgLyoqCi0gICAqIFByaW50IG91dCBzdGF0aXN0aWNzIHRvdGFscyBpbiBYbWwgZm9ybWF0Ci0gICAqLwotICBASW50ZXJydXB0aWJsZQotICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRUb3RhbHNYbWwoKSB7Ci0gICAgWG1sLm9wZW5UYWcoIm1tdGstc3RhdHMtdG90YWxzIik7Ci0gICAgWG1sLnNpbmdsZVZhbHVlKCJnYyIsIHBoYXNlLzIpOwotICAgIGZvciAoaW50IGMgPSAwOyBjIDwgY291bnRlcnM7IGMrKykgewotICAgICBpZiAoIWNvdW50ZXJbY10uaXNDb21wbGV4KCkpCi0gICAgICBpZiAoY291bnRlcltjXS5tZXJnZVBoYXNlcygpKSB7Ci0gICAgICAgIHByaW50VG90YWxYbWwoY291bnRlcltjXSxQaGFzZS5DT01CSU5FRCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwcmludFRvdGFsWG1sKGNvdW50ZXJbY10sUGhhc2UuTVVUQVRPUik7Ci0gICAgICAgIHByaW50VG90YWxYbWwoY291bnRlcltjXSxQaGFzZS5HQyk7Ci0gICAgICB9Ci0gICAgfQotICAgIFhtbC5zaW5nbGVWYWx1ZSgidG90YWwtdGltZSIsUGxhbi50b3RhbFRpbWUuZ2V0VG90YWxNaWxsaXMoKSwibXMiKTsKLSAgICBYbWwuY2xvc2VUYWcoIm1tdGstc3RhdHMtdG90YWxzIik7Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnQgYSBzaW5nbGUgdG90YWwgaW4gYW4geG1sIHRhZwotICAgKgotICAgKiBAcGFyYW0gYyBUaGUgY291bnRlcgotICAgKiBAcGFyYW0gcGhhc2UgVGhlIHBoYXNlCi0gICAqLwotICBASW50ZXJydXB0aWJsZQotICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50VG90YWxYbWwoQ291bnRlciBjLCBQaGFzZSBwaGFzZSkgewotICAgIG9wZW5TdGF0WG1sKGMuZ2V0TmFtZSgpKTsKLSAgICBYbWwuYXR0cmlidXRlKCJzdWZmaXgiLCBjLmdldENvbHVtblN1ZmZpeCgpKTsKLSAgICBYbWwub3BlbkF0dHJpYnV0ZSgidmFsdWUiKTsKLSAgICBpZiAocGhhc2UgPT0gUGhhc2UuQ09NQklORUQpIHsKLSAgICAgIGMucHJpbnRUb3RhbCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBjLnByaW50VG90YWwocGhhc2UgPT0gUGhhc2UuTVVUQVRPUik7Ci0gICAgICBYbWwuY2xvc2VBdHRyaWJ1dGUoKTsKLSAgICAgIFhtbC5vcGVuQXR0cmlidXRlKCJwaGFzZSIpOwotICAgICAgTG9nLndyaXRlKHBoYXNlLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICBYbWwuY2xvc2VBdHRyaWJ1dGUoKTsKLSAgICBjbG9zZVN0YXRYbWwoKTsKLSAgfQotCi0gIC8qKgotICAgKiBQcmludCBhIHNpbmdsZSBwaGFzZSBjb3VudGVyIGluIGFuIHhtbCB0YWcKLSAgICoKLSAgICogQHBhcmFtIGMgVGhlIGNvdW50ZXIKLSAgICogQHBhcmFtIHAgVGhlIHBoYXNlIG51bWJlcgotICAgKiBAcGFyYW0gcGhhc2UgVGhlIHBoYXNlIChudWxsLCAibXUiIG9yICJnYyIpCi0gICAqLwotICBASW50ZXJydXB0aWJsZQotICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50UGhhc2VTdGF0WG1sKENvdW50ZXIgYywgaW50IHAsIFBoYXNlIHBoYXNlKSB7Ci0gICAgb3BlblN0YXRYbWwoYy5nZXROYW1lKCkpOwotICAgIFhtbC5hdHRyaWJ1dGUoInN1ZmZpeCIsIGMuZ2V0Q29sdW1uU3VmZml4KCkpOwotICAgIFhtbC5vcGVuQXR0cmlidXRlKCJ2YWx1ZSIpOwotICAgIGlmIChwaGFzZSA9PSBQaGFzZS5DT01CSU5FRCkgewotICAgICAgYy5wcmludENvdW50KHApOwotICAgIH0gZWxzZSB7Ci0gICAgICBjLnByaW50Q291bnQocCk7Ci0gICAgICBYbWwuY2xvc2VBdHRyaWJ1dGUoKTsKLSAgICAgIFhtbC5vcGVuQXR0cmlidXRlKCJwaGFzZSIpOwotICAgICAgTG9nLndyaXRlKHBoYXNlLm5hbWUpOwotICAgfQotICAgIFhtbC5jbG9zZUF0dHJpYnV0ZSgpOwotICAgIGNsb3NlU3RhdFhtbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByaW50IG91dCBzdGF0aXN0aWNzIGZvciBlYWNoIG11dGF0b3IvZ2MgcGhhc2UgaW4gWG1sIGZvcm1hdAotICAgKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50UGhhc2VzWG1sKCkgewotICAgIFhtbC5vcGVuVGFnKCJtbXRrLXN0YXRzLXBlci1nYyIpOwotICAgIGZvciAoaW50IHAgPSAwOyBwIDw9IHBoYXNlOyBwICs9IDIpIHsKLSAgICAgIFhtbC5vcGVuVGFnKCJwaGFzZSIsZmFsc2UpOwotICAgICAgWG1sLmF0dHJpYnV0ZSgiZ2MiLChwLzIpKzEpOwotICAgICAgWG1sLmNsb3NlTWlub3JUYWcoKTsKLSAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgY291bnRlcnM7IGMrKykgewotICAgICAgIGlmICghY291bnRlcltjXS5pc0NvbXBsZXgoKSkKLSAgICAgICAgaWYgKGNvdW50ZXJbY10ubWVyZ2VQaGFzZXMoKSkgewotICAgICAgICAgIHByaW50UGhhc2VTdGF0WG1sKGNvdW50ZXJbY10scCxQaGFzZS5DT01CSU5FRCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcHJpbnRQaGFzZVN0YXRYbWwoY291bnRlcltjXSxwLFBoYXNlLk1VVEFUT1IpOwotICAgICAgICAgIHByaW50UGhhc2VTdGF0WG1sKGNvdW50ZXJbY10scCxQaGFzZS5HQyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIFhtbC5jbG9zZVRhZygicGhhc2UiKTsKLSAgICB9Ci0gICAgWG1sLmNsb3NlVGFnKCJtbXRrLXN0YXRzLXBlci1nYyIpOwotICB9Ci0KLSAgLyoqIEByZXR1cm4gVGhlIEdDIGNvdW50IChpbmNsdXNpdmUgb2YgYW55IGluLXByb2dyZXNzIEdDKSAqLwotICBwdWJsaWMgc3RhdGljIGludCBnY0NvdW50KCkgeyByZXR1cm4gZ2NDb3VudDsgfQotCi0gIC8qKiBAcmV0dXJuIFRydWUgaWYgY3VycmVudGx5IGdhdGhlcmluZyBzdGF0cyAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2F0aGVyaW5nU3RhdHMoKSB7IHJldHVybiBnYXRoZXJpbmdTdGF0czsgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L3N0YXRpc3RpY3MvVGltZXIuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9zdGF0aXN0aWNzL1RpbWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOTJjMDcuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L3N0YXRpc3RpY3MvVGltZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudXRpbGl0eS5zdGF0aXN0aWNzOwotCi1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Mb2c7Ci1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBzaW1wbGUgdGltZXIuCi0gKi8KLUBVbmludGVycnVwdGlibGUgcHVibGljIGNsYXNzIFRpbWVyIGV4dGVuZHMgTG9uZ0NvdW50ZXIgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluaXRpYWxpemF0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb3VudGVyCi0gICAqLwotICBwdWJsaWMgVGltZXIoU3RyaW5nIG5hbWUpIHsKLSAgICB0aGlzKG5hbWUsIHRydWUsIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb3VudGVyCi0gICAqIEBwYXJhbSBzdGFydCBUcnVlIGlmIHRoaXMgY291bnRlciBpcyB0byBiZSBpbXBsaWNpdGx5IHN0YXJ0ZWQKLSAgICogd2hlbiA8Y29kZT5zdGFydEFsbCgpPC9jb2RlPiBpcyBjYWxsZWQgKG90aGVyd2lzZSB0aGUgY291bnRlcgotICAgKiBtdXN0IGJlIGV4cGxpY2l0bHkgc3RhcnRlZCkuCi0gICAqLwotICBwdWJsaWMgVGltZXIoU3RyaW5nIG5hbWUsIGJvb2xlYW4gc3RhcnQpIHsKLSAgICB0aGlzKG5hbWUsIHN0YXJ0LCBmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY291bnRlcgotICAgKiBAcGFyYW0gc3RhcnQgVHJ1ZSBpZiB0aGlzIGNvdW50ZXIgaXMgdG8gYmUgaW1wbGljaXRseSBzdGFydGVkCi0gICAqIHdoZW4gPGNvZGU+c3RhcnRBbGwoKTwvY29kZT4gaXMgY2FsbGVkIChvdGhlcndpc2UgdGhlIGNvdW50ZXIKLSAgICogbXVzdCBiZSBleHBsaWNpdGx5IHN0YXJ0ZWQpLgotICAgKiBAcGFyYW0gbWVyZ2VwaGFzZXMgVHJ1ZSBpZiB0aGlzIGNvdW50ZXIgZG9lcyBub3Qgc2VwYXJhdGVseQotICAgKiByZXBvcnQgR0MgYW5kIE11dGF0b3IgcGhhc2VzLgotICAgKi8KLSAgcHVibGljIFRpbWVyKFN0cmluZyBuYW1lLCBib29sZWFuIHN0YXJ0LCBib29sZWFuIG1lcmdlcGhhc2VzKSB7Ci0gICAgc3VwZXIobmFtZSwgc3RhcnQsIG1lcmdlcGhhc2VzKTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvdW50ZXItc3BlY2lmaWMgbWV0aG9kcwotICAgKi8KLQotICAvKioKLSAgICogR2V0IHRoZSBjdXJyZW50IHZhbHVlIGZvciB0aGlzIHRpbWVyCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgdmFsdWUgZm9yIHRoaXMgdGltZXIKLSAgICovCi0gIEBJbmxpbmUKLSAgcHJvdGVjdGVkIGZpbmFsIGxvbmcgZ2V0Q3VycmVudFZhbHVlKCkgewotICAgIHJldHVybiBWTS5zdGF0aXN0aWNzLm5hbm9UaW1lKCk7Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnQgdGhlIHRvdGFsIGluIG1pY3Jvc2Vjb25kcwotICAgKi8KLSAgZmluYWwgdm9pZCBwcmludFRvdGFsTWljcm8oKSB7Ci0gICAgcHJpbnRNaWNybyh0b3RhbENvdW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBQcmludCB0aGUgdG90YWwgaW4gbWlsbGlzZWNvbmRzCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCBwcmludFRvdGFsTWlsbGlzKCkgewotICAgIHByaW50TWlsbGlzKHRvdGFsQ291bnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByaW50IHRoZSB0b3RhbCBpbiBzZWNvbmRzCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCBwcmludFRvdGFsU2VjcygpIHsKLSAgICBwcmludFNlY3ModG90YWxDb3VudCk7Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnQgYSB2YWx1ZSAoaW4gbWlsbGlzZWNvbmRzKQotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIHByaW50ZWQKLSAgICovCi0gIGZpbmFsIHZvaWQgcHJpbnRWYWx1ZShsb25nIHZhbHVlKSB7Ci0gICAgcHJpbnRNaWxsaXModmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByaW50IGEgdmFsdWUgaW4gbWljcm9zZWNvbmRzCi0gICAqCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgcHJpbnRlZAotICAgKi8KLSAgZmluYWwgdm9pZCBwcmludE1pY3JvKGxvbmcgdmFsdWUpIHsKLSAgICBMb2cud3JpdGUoMTAwMCAqIFZNLnN0YXRpc3RpY3MubmFub3NUb01pbGxpcyh2YWx1ZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByaW50IGEgdmFsdWUgaW4gbWlsbGlzZWNvbmRzCi0gICAqCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgcHJpbnRlZAotICAgKi8KLSAgZmluYWwgdm9pZCBwcmludE1pbGxpcyhsb25nIHZhbHVlKSB7Ci0gICAgTG9nLndyaXRlKFZNLnN0YXRpc3RpY3MubmFub3NUb01pbGxpcyh2YWx1ZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByaW50IGEgdmFsdWUgaW4gc2Vjb25kcwotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIHByaW50ZWQKLSAgICovCi0gIGZpbmFsIHZvaWQgcHJpbnRTZWNzKGxvbmcgdmFsdWUpIHsKLSAgICBMb2cud3JpdGUoVk0uc3RhdGlzdGljcy5uYW5vc1RvU2Vjcyh2YWx1ZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgdGltZXIgaW4gbWlsbGlzZWNvbmRzCi0gICAqLwotICBmaW5hbCBkb3VibGUgZ2V0VG90YWxNaWxsaXMoKSB7Ci0gICAgcmV0dXJuIFZNLnN0YXRpc3RpY3MubmFub3NUb01pbGxpcyh0b3RhbENvdW50KTsKLSAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdXRpbGl0eS9zdGF0aXN0aWNzL1htbC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L3N0YXRpc3RpY3MvWG1sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOWNhMzkuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay91dGlsaXR5L3N0YXRpc3RpY3MvWG1sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnV0aWxpdHkuc3RhdGlzdGljczsKLQotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuTG9nOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS5VbmludGVycnVwdGlibGU7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC5Xb3JkOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIHdyaXRpbmcgc3RhdGlzdGljcyBvdXQgaW4gWE1MIGZvcm1hdC4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGNsYXNzIFhtbCB7Ci0gIC8qKgotICAgKiBNYXJrIHRoZSBzdGFydCBvZiBYTUwgb3V0cHV0Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgYmVnaW4oKSB7Ci0gICAgTG9nLndyaXRlbG4oIjx4bWwtYmVnaW4vPiA8IS0tIEV2ZXJ5dGhpbmcgdW50aWwgeG1sLWVuZCBpcyBub3cgdmFsaWQgeG1sIC0tPiIpOwotICB9Ci0KLSAgLyoqCi0gICAqIE1hcmsgdGhlIGVuZCBvZiBYTUwgb3V0cHV0Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgZW5kKCkgewotICAgIExvZy53cml0ZWxuKCI8eG1sLWVuZC8+IDwhLS0gTm9uLXhtbCBkYXRhIGZvbGxvd3MgLi4uIC0tPiIpOwotICB9Ci0KLSAgLyoqCi0gICAqIENsb3NlIHRoZSBpbm5lcm1vc3QgWE1MIHRhZyBhbmQgcG9wIGl0IGZyb20gdGhlIHN0YWNrLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlVGFnKFN0cmluZyBuYW1lKSB7Ci0gICAgTG9nLndyaXRlKCI8LyIpOyBMb2cud3JpdGUobmFtZSk7IExvZy53cml0ZWxuKCI+Iik7Ci0gIH0KLQotICAvKioKLSAgICogT3BlbiBhbiBYTUwgdGFnLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBUYWcgbmFtZQotICAgKiBAcGFyYW0gZW5kVGFnIFNob3VsZCB0aGUgdGFnIGJlIGNsb3NlZCwgb3IgbGVmdCBvcGVuIGZvcgotICAgKiAgICAgICAgICAgICAgIGFkZGluZyBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMKLSAgICovCi0gIHN0YXRpYyB2b2lkIG9wZW5UYWcoU3RyaW5nIG5hbWUsIGJvb2xlYW4gZW5kVGFnKSB7Ci0gICAgb3Blbk1pbm9yVGFnKG5hbWUpOwotICAgIGlmIChlbmRUYWcpCi0gICAgICBjbG9zZVRhZyhmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogT3BlbiBhIHNpbXBsZSBYTUwgZW50aXR5LgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBlbnRpdHkKLSAgICovCi0gIHN0YXRpYyB2b2lkIG9wZW5UYWcoU3RyaW5nIG5hbWUpIHsgb3BlblRhZyhuYW1lLHRydWUpOyB9Ci0KLSAgLyoqCi0gICAqIE91dHB1dCBhICJzdGF0IiBlbnRpdHksIHdpdGggYSBnaXZlbiBuYW1lLCA8Y29kZT5kb3VibGU8L2NvZGU+dmFsdWUgYW5kIG9wdGlvbmFsbHksIHVuaXRzLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBlbnRpdHkKLSAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgZW50aXR5Ci0gICAqIEBwYXJhbSB1bml0cyBUaGUgdW5pdHMsIG9yIG51bGwgZm9yIG5vIHVuaXRzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNpbmdsZVZhbHVlKFN0cmluZyBuYW1lLCBkb3VibGUgdmFsdWUsIFN0cmluZyB1bml0cykgewotICAgIG9wZW5NaW5vclRhZygic3RhdCIpOwotICAgIGF0dHJpYnV0ZSgibmFtZSIsbmFtZSk7Ci0gICAgYXR0cmlidXRlKCJ2YWx1ZSIsdmFsdWUpOwotICAgIGlmICh1bml0cyAhPSBudWxsKSBhdHRyaWJ1dGUoInVuaXRzIix1bml0cyk7Ci0gICAgY2xvc2VNaW5vclRhZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlbmllbmNlIHZlcnNpb24gb2Ygc2luZ2xlVmFsdWUgd2hlcmUgdW5pdHMgYXJlIG5vdCBzcGVjaWZpZWQuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGVudGl0eQotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBlbnRpdHkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzaW5nbGVWYWx1ZShTdHJpbmcgbmFtZSwgZG91YmxlIHZhbHVlKSB7Ci0gICAgc2luZ2xlVmFsdWUobmFtZSx2YWx1ZSxudWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiBPdXRwdXQgYSAiY29uZmlnIiBlbnRpdHksIHdpdGggYSBnaXZlbiBuYW1lIGFuZCA8Y29kZT5ib29sZWFuPC9jb2RlPnZhbHVlLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBlbnRpdHkKLSAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgZW50aXR5Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgY29uZmlnSXRlbShTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgewotICAgIG9wZW5NaW5vclRhZygiY29uZiIpOwotICAgIGF0dHJpYnV0ZSgibmFtZSIsbmFtZSk7Ci0gICAgYXR0cmlidXRlKCJ2YWx1ZSIsdmFsdWUpOwotICAgIGNsb3NlTWlub3JUYWcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBPdXRwdXQgYSAiY29uZmlnIiBlbnRpdHksIHdpdGggYSBnaXZlbiBuYW1lIGFuZCA8Y29kZT5TdHJpbmc8L2NvZGU+dmFsdWUuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGVudGl0eQotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBlbnRpdHkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBjb25maWdJdGVtKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICBvcGVuTWlub3JUYWcoImNvbmYiKTsKLSAgICBhdHRyaWJ1dGUoIm5hbWUiLG5hbWUpOwotICAgIGF0dHJpYnV0ZSgidmFsdWUiLHZhbHVlKTsKLSAgICBjbG9zZU1pbm9yVGFnKCk7Ci0gIH0KLQotICAvKioKLSAgICogT3V0cHV0IGEgInN0YXQiIGVudGl0eSwgd2l0aCBhIGdpdmVuIG5hbWUsIDxjb2RlPmxvbmc8L2NvZGU+IHZhbHVlIGFuZAotICAgKiBvcHRpb25hbGx5LCB1bml0cy4KLSAgICoKLSAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgZW50aXR5Ci0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGVudGl0eQotICAgKiBAcGFyYW0gdW5pdHMgVGhlIHVuaXRzLCBvciBudWxsIGZvciBubyB1bml0cy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzaW5nbGVWYWx1ZShTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSwgU3RyaW5nIHVuaXRzKSB7Ci0gICAgb3Blbk1pbm9yVGFnKCJzdGF0Iik7Ci0gICAgYXR0cmlidXRlKCJuYW1lIixuYW1lKTsKLSAgICBhdHRyaWJ1dGUoInZhbHVlIix2YWx1ZSk7Ci0gICAgaWYgKHVuaXRzICE9IG51bGwpIGF0dHJpYnV0ZSgidW5pdHMiLHVuaXRzKTsKLSAgICBjbG9zZU1pbm9yVGFnKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVuaWVuY2UgdmVyc2lvbiBvZiBzaW5nbGVWYWx1ZSB3aGVyZSB1bml0cyBhcmUgbm90IHNwZWNpZmllZC4KLSAgICoKLSAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgZW50aXR5Ci0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGVudGl0eQotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNpbmdsZVZhbHVlKFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKSB7Ci0gICAgc2luZ2xlVmFsdWUobmFtZSx2YWx1ZSxudWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYSB3b3JkLXZhbHVlZCBhdHRyaWJ1dGUgdG8gYW4gb3BlbiBYTUwgdGFnLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBlbnRpdHkKLSAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgZW50aXR5Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgYXR0cmlidXRlKFN0cmluZyBuYW1lLCBXb3JkIHZhbHVlKSB7Ci0gICAgb3BlbkF0dHJpYnV0ZShuYW1lKTsgTG9nLndyaXRlKHZhbHVlKTsgY2xvc2VBdHRyaWJ1dGUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYSBieXRlW10tdmFsdWVkIGF0dHJpYnV0ZSB0byBhbiBvcGVuIFhNTCB0YWcuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGVudGl0eQotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBlbnRpdHkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIGJ5dGVbXSB2YWx1ZSkgewotICAgIG9wZW5BdHRyaWJ1dGUobmFtZSk7IExvZy53cml0ZSh2YWx1ZSk7IGNsb3NlQXR0cmlidXRlKCk7Ci0gIH0KLQotICAvKioKLSAgICogQWRkIGEgU3RyaW5nLXZhbHVlZCBhdHRyaWJ1dGUgdG8gYW4gb3BlbiBYTUwgdGFnLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBlbnRpdHkKLSAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgZW50aXR5Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgYXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICBvcGVuQXR0cmlidXRlKG5hbWUpOyBMb2cud3JpdGUodmFsdWUpOyBjbG9zZUF0dHJpYnV0ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIGJvb2xlYW4tdmFsdWVkIGF0dHJpYnV0ZSB0byBhbiBvcGVuIFhNTCB0YWcuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGVudGl0eQotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBlbnRpdHkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpIHsKLSAgICBvcGVuQXR0cmlidXRlKG5hbWUpOyBMb2cud3JpdGUodmFsdWUpOyBjbG9zZUF0dHJpYnV0ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIGRvdWJsZS12YWx1ZWQgYXR0cmlidXRlIHRvIGFuIG9wZW4gWE1MIHRhZy4KLSAgICoKLSAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgZW50aXR5Ci0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGVudGl0eQotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgZG91YmxlIHZhbHVlKSB7Ci0gICAgb3BlbkF0dHJpYnV0ZShuYW1lKTsgTG9nLndyaXRlKHZhbHVlKTsgY2xvc2VBdHRyaWJ1dGUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYSBsb25nLXZhbHVlZCBhdHRyaWJ1dGUgdG8gYW4gb3BlbiBYTUwgdGFnLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBlbnRpdHkKLSAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgZW50aXR5Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgYXR0cmlidXRlKFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKSB7Ci0gICAgb3BlbkF0dHJpYnV0ZShuYW1lKTsgTG9nLndyaXRlKHZhbHVlKTsgY2xvc2VBdHRyaWJ1dGUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYW4gaW50LXZhbHVlZCBhdHRyaWJ1dGUgdG8gYW4gb3BlbiBYTUwgdGFnLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBlbnRpdHkKLSAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgZW50aXR5Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgYXR0cmlidXRlKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKLSAgICBvcGVuQXR0cmlidXRlKG5hbWUpOyBMb2cud3JpdGUodmFsdWUpOyBjbG9zZUF0dHJpYnV0ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENsb3NlIGFuIGF0dHJpYnV0ZSAoYWN0dWFsbHkgYSBzaW1wbGUgY2xvc2UtcXVvdGUpCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VBdHRyaWJ1dGUoKSB7Ci0gICAgTG9nLndyaXRlKCJcIiIpOwotICB9Ci0KLSAgLyoqCi0gICAqIE9wZW4gYW4gYXR0cmlidXRlICh3cml0ZSAie25hbWV9PVwiKQotICAgKgotICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBlbnRpdHkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7Ci0gICAgTG9nLndyaXRlKCIgIik7IExvZy53cml0ZShuYW1lKTsgTG9nLndyaXRlKCI9XCIiKTsKLSAgfQotCi0gIC8qKgotICAgKiBTdGFydCBhIHRhZwotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0VGFnKCkgewotICAgIExvZy53cml0ZSgiPCIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEVuZCBhIHRhZywgb3B0aW9uYWxseSBjbG9zaW5nIGl0IChpZiBpdCBpcyBhIHNpbXBsZSBlbnRpdHkpCi0gICAqCi0gICAqIEBwYXJhbSBjbG9zZSBJZiB0cnVlLCBjbG9zZSB0aGUgdGFnIHdpdGggIi8+IiByYXRoZXIgdGhhbiAiPiIKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZVRhZyhib29sZWFuIGNsb3NlKSB7Ci0gICAgY2xvc2VUYWcoY2xvc2UsdHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogRW5kIGEgdGFnLCBvcHRpb25hbGx5IGNsb3NpbmcgaXQgKGlmIGl0IGlzIGEgc2ltcGxlIGVudGl0eSksCi0gICAqIGFuZCBvcHRpb25hbGx5IHByaW50aW5nIGVuZC1vZi1saW5lCi0gICAqCi0gICAqIEBwYXJhbSBjbG9zZSBJZiB0cnVlLCBjbG9zZSB0aGUgdGFnIHdpdGggIi8+IiByYXRoZXIgdGhhbiAiPiIKLSAgICogQHBhcmFtIGVuZExpbmUgSWYgdHJ1ZSBlbmQgdGhlIGN1cnJlbnQgbGluZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZVRhZyhib29sZWFuIGNsb3NlLCBib29sZWFuIGVuZExpbmUpIHsKLSAgICBpZiAoY2xvc2UpIExvZy53cml0ZSgiLyIpOwotICAgIExvZy53cml0ZSgiPiIpOwotICAgIGlmIChlbmRMaW5lKSBMb2cud3JpdGVsbigpOwotICB9Ci0KLSAgLyoqCi0gICAqIENsb3NlIGEgdGFnIHdpdGggYSAiLz4iCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VNaW5vclRhZygpIHsKLSAgICBjbG9zZVRhZyh0cnVlLHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIE9wZW4gYSB0YWcgd2l0aG91dCBwdXNoaW5nIGl0IG9uIHRoZSB0YWcgc3RhY2sgLSBtdXN0IGVuZCB0aGlzCi0gICAqIHdpdGggYSBjYWxsIHRvIGNsb3NlTWlub3JUYWcoKQotICAgKgotICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBlbnRpdHkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuTWlub3JUYWcoU3RyaW5nIG5hbWUpIHsKLSAgICBMb2cud3JpdGUoIjwiKTsgTG9nLndyaXRlKG5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIE9wZW4gYW4gWE1MIGNvbW1lbnQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuQ29tbWVudCgpIHsKLSAgICBMb2cud3JpdGUoIjwhLS0gIik7Ci0gIH0KLQotICAvKioKLSAgICogQ2xvc2UgYW4gWE1MIGNvbW1lbnQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZUNvbW1lbnQoKSB7Ci0gICAgTG9nLndyaXRlKCIgLS0+Iik7Ci0gIH0KLQotICAvKioKLSAgICogQWRkIGEgY29tbWVudCwgYnJhY2tldGluZyBpdCB3aXRoIG9wZW4tIGFuZCBjbG9zZS1jb21tZW50IHRhZ3MuCi0gICAqCi0gICAqIEBwYXJhbSBjb21tZW50IFRoZSBjb21tZW50LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGNvbW1lbnQoU3RyaW5nIGNvbW1lbnQpIHsKLSAgICBvcGVuQ29tbWVudCgpOwotICAgIExvZy53cml0ZShjb21tZW50KTsKLSAgICBjbG9zZUNvbW1lbnQoKTsKLSAgICBMb2cud3JpdGVsbigpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vQWN0aXZlUGxhbi5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay92bS9BY3RpdmVQbGFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YzEwN2IuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay92bS9BY3RpdmVQbGFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudm07Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLlBsYW47Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5Db2xsZWN0b3JDb250ZXh0OwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uTXV0YXRvckNvbnRleHQ7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5QbGFuQ29uc3RyYWludHM7Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkxvZzsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFN0dWIgdG8gZ2l2ZSBhY2Nlc3MgdG8gcGxhbiBsb2NhbCwgY29uc3RyYWludCBhbmQgZ2xvYmFsIGluc3RhbmNlcwotICovCi1AVW5pbnRlcnJ1cHRpYmxlIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBY3RpdmVQbGFuIHsKLQotICAvKiogQHJldHVybiBUaGUgYWN0aXZlIFBsYW4gaW5zdGFuY2UuICovCi0gIHB1YmxpYyBhYnN0cmFjdCBQbGFuIGdsb2JhbCgpOwotCi0gIC8qKiBAcmV0dXJuIFRoZSBhY3RpdmUgUGxhbkNvbnN0cmFpbnRzIGluc3RhbmNlLiAqLwotICBwdWJsaWMgYWJzdHJhY3QgUGxhbkNvbnN0cmFpbnRzIGNvbnN0cmFpbnRzKCk7Ci0KLSAgLyoqIEByZXR1cm4gVGhlIGFjdGl2ZSA8Y29kZT5Db2xsZWN0b3JDb250ZXh0PC9jb2RlPiBpbnN0YW5jZS4gKi8KLSAgcHVibGljIGFic3RyYWN0IENvbGxlY3RvckNvbnRleHQgY29sbGVjdG9yKCk7Ci0KLSAgLyoqIEByZXR1cm4gVGhlIGFjdGl2ZSA8Y29kZT5NdXRhdG9yQ29udGV4dDwvY29kZT4gaW5zdGFuY2UuICovCi0gIHB1YmxpYyBhYnN0cmFjdCBNdXRhdG9yQ29udGV4dCBtdXRhdG9yKCk7Ci0KLSAgLyoqIEByZXR1cm4gVGhlIGxvZyBmb3IgdGhlIGFjdGl2ZSB0aHJlYWQgKi8KLSAgcHVibGljIGFic3RyYWN0IExvZyBsb2coKTsKLQotICAvKiogQHJldHVybiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29sbGVjdG9yIHRocmVhZHMgdGhhdCBtYXkgcGFydGljaXBhdGUgaW4gcGFyYWxsZWwgR0MuICovCi0gIHB1YmxpYyBhYnN0cmFjdCBpbnQgY29sbGVjdG9yQ291bnQoKTsKLQotICAvKiogUmVzZXQgdGhlIG11dGF0b3IgaXRlcmF0b3IgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVzZXRNdXRhdG9ySXRlcmF0b3IoKTsKLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBuZXh0IDxjb2RlPk11dGF0b3JDb250ZXh0PC9jb2RlPiBpbiBhCi0gICAqIHN5bmNocm9uaXplZCBpdGVyYXRpb24gb2YgYWxsIG11dGF0b3JzLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBuZXh0IDxjb2RlPk11dGF0b3JDb250ZXh0PC9jb2RlPiBpbiBhCi0gICAqICBzeW5jaHJvbml6ZWQgaXRlcmF0aW9uIG9mIGFsbCBtdXRhdG9ycywgb3IKLSAgICogIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gYWxsIG11dGF0b3JzIGhhdmUgYmVlbiBkb25lLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IE11dGF0b3JDb250ZXh0IGdldE5leHRNdXRhdG9yKCk7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3ZtL0Fzc2VydC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay92bS9Bc3NlcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJhZDEwYy4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3ZtL0Fzc2VydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnZtOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLlVuaW50ZXJydXB0aWJsZTsKLQotQFVuaW50ZXJydXB0aWJsZSBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXNzZXJ0IHsKLSAgLyoqCi0gICAqIExvZ3MgYSBtZXNzYWdlIGFuZCB0cmFjZWJhY2ssIHRoZW4gZXhpdHMuCi0gICAqCi0gICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBzdHJpbmcgdG8gbG9nCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmYWlsKFN0cmluZyBtZXNzYWdlKTsKLQotICAvKioKLSAgICogQ2hlY2tzIHRoYXQgdGhlIGdpdmVuIGNvbmRpdGlvbiBpcyB0cnVlLiAgSWYgaXQgaXMgbm90LCB0aGlzCi0gICAqIG1ldGhvZCBkb2VzIGEgdHJhY2ViYWNrIGFuZCBleGl0cy4gIEFsbCBjYWxscyB0byB0aGlzIG1ldGhvZAotICAgKiBtdXN0IGJlIGd1YXJkZWQgYnkgPGNvZGU+Vk0uVkVSSUZZX0FTU0VSVElPTlM8L2NvZGU+LgotICAgKgotICAgKiBAcGFyYW0gY29uZCB0aGUgY29uZGl0aW9uIHRvIGJlIGNoZWNrZWQKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIF9hc3NlcnQoYm9vbGVhbiBjb25kKTsKLQotICAvKioKLSAgICogQ2hlY2tzIHRoYXQgdGhlIGdpdmVuIGNvbmRpdGlvbiBpcyB0cnVlLiAgSWYgaXQgaXMgbm90LCB0aGlzCi0gICAqIG1ldGhvZCBwcmludHMgYSBtZXNzYWdlLCBkb2VzIGEgdHJhY2ViYWNrIGFuZCBleGl0cy4gQWxsIGNhbGxzCi0gICAqIHRvIHRoaXMgbWV0aG9kIG11c3QgYmUgZ3VhcmRlZCBieSA8Y29kZT5WTS5WRVJJRllfQVNTRVJUSU9OUzwvY29kZT4uCi0gICAqCi0gICAqIEBwYXJhbSBjb25kIHRoZSBjb25kaXRpb24gdG8gYmUgY2hlY2tlZAotICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBwcmludAotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgX2Fzc2VydChib29sZWFuIGNvbmQsIFN0cmluZyBtZXNzYWdlKTsKLQotICAvKioKLSAgICogUHJpbnQgYSBzdGFjayB0cmFjZQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgZHVtcFN0YWNrKCk7Ci0KLSAgLyoqCi0gICAqIENoZWNrcyBpZiB0aGUgdmlydHVhbCBtYWNoaW5lIGlzIHJ1bm5pbmcuICBUaGlzIHZhbHVlIGNoYW5nZXMsIHNvCi0gICAqIHRoZSBjYWxsLXRocm91Z2ggdG8gdGhlIFZNIG11c3QgYmUgYSBtZXRob2QuICBJbiBKaWtlcyBSVk0sIGp1c3QKLSAgICogcmV0dXJucyBWTS5ydW5uaW5nVk0uCi0gICAqCi0gICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHZpcnR1YWwgbWFjaGluZSBpcyBydW5uaW5nCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBydW5uaW5nVk0oKTsKLQotICAvKgotICAgKiBOT1RFOiBUaGUgZm9sbG93aW5nIG1ldGhvZHMgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzIG9mIHRoaXMKLSAgICogY2xhc3MsIGJ1dCBhcmUgaW50ZXJuYWwgdG8gdGhlIFZNPC0+TU0gaW50ZXJmYWNlIGdsdWUsIHNvIGFyZSBuZXZlcgotICAgKiBjYWxsZWQgYnkgTU1UayB1c2Vycy4KLSAgICovCi0gICAvKiogQHJldHVybiB0cnVlIGlmIGFzc2VydGlvbnMgc2hvdWxkIGJlIHZlcmlmaWVkICovCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGdldFZlcmlmeUFzc2VydGlvbnNDb25zdGFudCgpOwotCi0gIC8qCi0gICAqIE5PVEU6IFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGJ5IGFueXRoaW5nIG90aGVyIHRoYW4gdGhlCi0gICAqIHJlZmxlY3RpdmUgbWVjaGFuaXNtcyBpbiBvcmcubW10ay52bS5WTSwgYW5kIGlzIG5vdCBpbXBsZW1lbnRlZCBieQotICAgKiBzdWJjbGFzc2VzLgotICAgKgotICAgKiBUaGlzIGhhY2sgZXhpc3RzIG9ubHkgdG8gYWxsb3cgdXMgdG8gZGVjbGFyZSBnZXRWZXJpZnlBc3NlcnRpb25zKCkgYXMKLSAgICogYSBwcm90ZWN0ZWQgbWV0aG9kLgotICAgKi8KLSAgc3RhdGljIGJvb2xlYW4gdmVyaWZ5QXNzZXJ0aW9uc1RyYXBkb29yKEFzc2VydCBhKSB7Ci0gICAgcmV0dXJuIGEuZ2V0VmVyaWZ5QXNzZXJ0aW9uc0NvbnN0YW50KCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vQmFycmllcnMuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vQmFycmllcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI1YzhkYS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3ZtL0JhcnJpZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjEgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnZtOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLlVuaW50ZXJydXB0aWJsZTsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXJyaWVycyB7Ci0gIC8qKgotICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgd3JpdGUgb2YgYSBib29sZWFuIHdyaXRlIGJhcnJpZXIuCi0gICAqCi0gICAqIEBwYXJhbSByZWYgVGhlIG9iamVjdCB0aGF0IGhhcyB0aGUgYm9vbGVhbiBmaWVsZAotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgdGhlIHNsb3Qgd2lsbCBiZSB1cGRhdGVkIHRvCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgT3BhcXVlLCBWTS1zcGVjaWZpYywgbWV0YS1kYXRhIGlkZW50aWZ5aW5nIHRoZSBzbG90Ci0gICAqIEBwYXJhbSBtZXRhRGF0YUIgT3BhcXVlLCBWTS1zcGVjaWZpYywgbWV0YS1kYXRhIGlkZW50aWZ5aW5nIHRoZSBzbG90Ci0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB3cml0ZSBpcyBvY2N1cnJpbmcKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGJvb2xlYW5Xcml0ZShPYmplY3RSZWZlcmVuY2UgcmVmLCBib29sZWFuIHZhbHVlLCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKTsKLQotICAvKioKLSAgICogUGVyZm9ybSB0aGUgYWN0dWFsIHJlYWQgb2YgYSBib29sZWFuIHJlYWQgYmFycmllci4KLSAgICoKLSAgICogQHBhcmFtIHJlZiBUaGUgb2JqZWN0IHRoYXQgaGFzIHRoZSBib29sZWFuIGZpZWxkCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgT3BhcXVlLCBWTS1zcGVjaWZpYywgbWV0YS1kYXRhIGlkZW50aWZ5aW5nIHRoZSBzbG90Ci0gICAqIEBwYXJhbSBtZXRhRGF0YUIgT3BhcXVlLCBWTS1zcGVjaWZpYywgbWV0YS1kYXRhIGlkZW50aWZ5aW5nIHRoZSBzbG90Ci0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB3cml0ZSBpcyBvY2N1cnJpbmcKLSAgICogQHJldHVybiB0aGUgcmVhZCB2YWx1ZQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gYm9vbGVhblJlYWQoT2JqZWN0UmVmZXJlbmNlIHJlZiwgV29yZCBtZXRhRGF0YUEsIFdvcmQgbWV0YURhdGFCLCBpbnQgbW9kZSk7Ci0KLSAgLyoqCi0gICAqIFBlcmZvcm0gdGhlIGFjdHVhbCB3cml0ZSBvZiBhIGJ5dGUgd3JpdGUgYmFycmllci4KLSAgICoKLSAgICogQHBhcmFtIHJlZiBUaGUgb2JqZWN0IHRoYXQgaGFzIHRoZSBieXRlIGZpZWxkCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGUgc2xvdCB3aWxsIGJlIHVwZGF0ZWQgdG8KLSAgICogQHBhcmFtIG1ldGFEYXRhQSBPcGFxdWUsIFZNLXNwZWNpZmljLCBtZXRhLWRhdGEgaWRlbnRpZnlpbmcgdGhlIHNsb3QKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBPcGFxdWUsIFZNLXNwZWNpZmljLCBtZXRhLWRhdGEgaWRlbnRpZnlpbmcgdGhlIHNsb3QKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHdyaXRlIGlzIG9jY3VycmluZwotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgYnl0ZVdyaXRlKE9iamVjdFJlZmVyZW5jZSByZWYsIGJ5dGUgdmFsdWUsIFdvcmQgbWV0YURhdGFBLCBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpOwotCi0gIC8qKgotICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgcmVhZCBvZiBhIGJ5dGUgcmVhZCBiYXJyaWVyLgotICAgKgotICAgKiBAcGFyYW0gcmVmIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIGJ5dGUgZmllbGQKLSAgICogQHBhcmFtIG1ldGFEYXRhQSBPcGFxdWUsIFZNLXNwZWNpZmljLCBtZXRhLWRhdGEgaWRlbnRpZnlpbmcgdGhlIHNsb3QKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBPcGFxdWUsIFZNLXNwZWNpZmljLCBtZXRhLWRhdGEgaWRlbnRpZnlpbmcgdGhlIHNsb3QKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHdyaXRlIGlzIG9jY3VycmluZwotICAgKiBAcmV0dXJuIHRoZSByZWFkIHZhbHVlCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgYnl0ZSBieXRlUmVhZChPYmplY3RSZWZlcmVuY2UgcmVmLCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKTsKLQotICAvKioKLSAgICogUGVyZm9ybSB0aGUgYWN0dWFsIHdyaXRlIG9mIGEgY2hhciB3cml0ZSBiYXJyaWVyLgotICAgKgotICAgKiBAcGFyYW0gcmVmIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIGNoYXIgZmllbGQKLSAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHRoZSBzbG90IHdpbGwgYmUgdXBkYXRlZCB0bwotICAgKiBAcGFyYW0gbWV0YURhdGFBIE9wYXF1ZSwgVk0tc3BlY2lmaWMsIG1ldGEtZGF0YSBpZGVudGlmeWluZyB0aGUgc2xvdAotICAgKiBAcGFyYW0gbWV0YURhdGFCIE9wYXF1ZSwgVk0tc3BlY2lmaWMsIG1ldGEtZGF0YSBpZGVudGlmeWluZyB0aGUgc2xvdAotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgd3JpdGUgaXMgb2NjdXJyaW5nCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjaGFyV3JpdGUoT2JqZWN0UmVmZXJlbmNlIHJlZiwgY2hhciB2YWx1ZSwgV29yZCBtZXRhRGF0YUEsIFdvcmQgbWV0YURhdGFCLCBpbnQgbW9kZSk7Ci0KLSAgLyoqCi0gICAqIFBlcmZvcm0gdGhlIGFjdHVhbCByZWFkIG9mIGEgY2hhciByZWFkIGJhcnJpZXIuCi0gICAqCi0gICAqIEBwYXJhbSByZWYgVGhlIG9iamVjdCB0aGF0IGhhcyB0aGUgY2hhciBmaWVsZAotICAgKiBAcGFyYW0gbWV0YURhdGFBIE9wYXF1ZSwgVk0tc3BlY2lmaWMsIG1ldGEtZGF0YSBpZGVudGlmeWluZyB0aGUgc2xvdAotICAgKiBAcGFyYW0gbWV0YURhdGFCIE9wYXF1ZSwgVk0tc3BlY2lmaWMsIG1ldGEtZGF0YSBpZGVudGlmeWluZyB0aGUgc2xvdAotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgd3JpdGUgaXMgb2NjdXJyaW5nCi0gICAqIEByZXR1cm4gdGhlIHJlYWQgdmFsdWUKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBjaGFyIGNoYXJSZWFkKE9iamVjdFJlZmVyZW5jZSByZWYsIFdvcmQgbWV0YURhdGFBLCBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpOwotCi0gIC8qKgotICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgd3JpdGUgb2YgYSBzaG9ydCB3cml0ZSBiYXJyaWVyLgotICAgKgotICAgKiBAcGFyYW0gcmVmIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIHNob3J0IGZpZWxkCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGUgc2xvdCB3aWxsIGJlIHVwZGF0ZWQgdG8KLSAgICogQHBhcmFtIG1ldGFEYXRhQSBPcGFxdWUsIFZNLXNwZWNpZmljLCBtZXRhLWRhdGEgaWRlbnRpZnlpbmcgdGhlIHNsb3QKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBPcGFxdWUsIFZNLXNwZWNpZmljLCBtZXRhLWRhdGEgaWRlbnRpZnlpbmcgdGhlIHNsb3QKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHdyaXRlIGlzIG9jY3VycmluZwotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgc2hvcnRXcml0ZShPYmplY3RSZWZlcmVuY2UgcmVmLCBzaG9ydCB2YWx1ZSwgV29yZCBtZXRhRGF0YUEsIFdvcmQgbWV0YURhdGFCLCBpbnQgbW9kZSk7Ci0KLSAgLyoqCi0gICAqIFBlcmZvcm0gdGhlIGFjdHVhbCByZWFkIG9mIGEgc2hvcnQgcmVhZCBiYXJyaWVyLgotICAgKgotICAgKiBAcGFyYW0gcmVmIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIHNob3J0IGZpZWxkCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgT3BhcXVlLCBWTS1zcGVjaWZpYywgbWV0YS1kYXRhIGlkZW50aWZ5aW5nIHRoZSBzbG90Ci0gICAqIEBwYXJhbSBtZXRhRGF0YUIgT3BhcXVlLCBWTS1zcGVjaWZpYywgbWV0YS1kYXRhIGlkZW50aWZ5aW5nIHRoZSBzbG90Ci0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB3cml0ZSBpcyBvY2N1cnJpbmcKLSAgICogQHJldHVybiB0aGUgcmVhZCB2YWx1ZQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHNob3J0IHNob3J0UmVhZChPYmplY3RSZWZlcmVuY2UgcmVmLCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKTsKLQotICAvKioKLSAgICogUGVyZm9ybSB0aGUgYWN0dWFsIHdyaXRlIG9mIGEgaW50IHdyaXRlIGJhcnJpZXIuCi0gICAqCi0gICAqIEBwYXJhbSByZWYgVGhlIG9iamVjdCB0aGF0IGhhcyB0aGUgaW50IGZpZWxkCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGUgc2xvdCB3aWxsIGJlIHVwZGF0ZWQgdG8KLSAgICogQHBhcmFtIG1ldGFEYXRhQSBPcGFxdWUsIFZNLXNwZWNpZmljLCBtZXRhLWRhdGEgaWRlbnRpZnlpbmcgdGhlIHNsb3QKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBPcGFxdWUsIFZNLXNwZWNpZmljLCBtZXRhLWRhdGEgaWRlbnRpZnlpbmcgdGhlIHNsb3QKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHdyaXRlIGlzIG9jY3VycmluZwotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgaW50V3JpdGUoT2JqZWN0UmVmZXJlbmNlIHJlZiwgaW50IHZhbHVlLCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKTsKLQotICAvKioKLSAgICogUGVyZm9ybSB0aGUgYWN0dWFsIHJlYWQgb2YgYSBpbnQgcmVhZCBiYXJyaWVyLgotICAgKgotICAgKiBAcGFyYW0gcmVmIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIGludCBmaWVsZAotICAgKiBAcGFyYW0gbWV0YURhdGFBIE9wYXF1ZSwgVk0tc3BlY2lmaWMsIG1ldGEtZGF0YSBpZGVudGlmeWluZyB0aGUgc2xvdAotICAgKiBAcGFyYW0gbWV0YURhdGFCIE9wYXF1ZSwgVk0tc3BlY2lmaWMsIG1ldGEtZGF0YSBpZGVudGlmeWluZyB0aGUgc2xvdAotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgd3JpdGUgaXMgb2NjdXJyaW5nCi0gICAqIEByZXR1cm4gdGhlIHJlYWQgdmFsdWUKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBpbnQgaW50UmVhZChPYmplY3RSZWZlcmVuY2UgcmVmLCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKTsKLQotICAvKioKLSAgICogQXR0ZW1wdCBhbiBhdG9taWMgY29tcGFyZSBhbmQgZXhjaGFuZ2UgaW4gYSB3cml0ZSBiYXJyaWVyIHNlcXVlbmNlLgotICAgKgotICAgKiBAcGFyYW0gb2JqcmVmIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIGludCBmaWVsZAotICAgKiBAcGFyYW0gb2xkIFRoZSBvbGQgaW50IHRvIGJlIHN3YXBwZWQgb3V0Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGludAotICAgKiBAcGFyYW0gbWV0YURhdGFBIE9wYXF1ZSwgVk0tc3BlY2lmaWMsIG1ldGEtZGF0YSBpZGVudGlmeWluZyB0aGUgc2xvdAotICAgKiBAcGFyYW0gbWV0YURhdGFCIE9wYXF1ZSwgVk0tc3BlY2lmaWMsIG1ldGEtZGF0YSBpZGVudGlmeWluZyB0aGUgc2xvdAotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgd3JpdGUgaXMgb2NjdXJyaW5nCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY29tcGFyZSBhbmQgc3dhcCB3YXMgc3VjY2Vzc2Z1bAotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaW50VHJ5Q29tcGFyZUFuZFN3YXAoT2JqZWN0UmVmZXJlbmNlIG9ianJlZiwgaW50IG9sZCwgaW50IHZhbHVlLCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKTsKLQotCi0gIC8qKgotICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgd3JpdGUgb2YgYSBsb25nIHdyaXRlIGJhcnJpZXIuCi0gICAqCi0gICAqIEBwYXJhbSByZWYgVGhlIG9iamVjdCB0aGF0IGhhcyB0aGUgbG9uZyBmaWVsZAotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgdGhlIHNsb3Qgd2lsbCBiZSB1cGRhdGVkIHRvCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgT3BhcXVlLCBWTS1zcGVjaWZpYywgbWV0YS1kYXRhIGlkZW50aWZ5aW5nIHRoZSBzbG90Ci0gICAqIEBwYXJhbSBtZXRhRGF0YUIgT3BhcXVlLCBWTS1zcGVjaWZpYywgbWV0YS1kYXRhIGlkZW50aWZ5aW5nIHRoZSBzbG90Ci0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB3cml0ZSBpcyBvY2N1cnJpbmcKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGxvbmdXcml0ZShPYmplY3RSZWZlcmVuY2UgcmVmLCBsb25nIHZhbHVlLCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKTsKLQotICAvKioKLSAgICogUGVyZm9ybSB0aGUgYWN0dWFsIHJlYWQgb2YgYSBsb25nIHJlYWQgYmFycmllci4KLSAgICoKLSAgICogQHBhcmFtIHJlZiBUaGUgb2JqZWN0IHRoYXQgaGFzIHRoZSBsb25nIGZpZWxkCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgT3BhcXVlLCBWTS1zcGVjaWZpYywgbWV0YS1kYXRhIGlkZW50aWZ5aW5nIHRoZSBzbG90Ci0gICAqIEBwYXJhbSBtZXRhRGF0YUIgT3BhcXVlLCBWTS1zcGVjaWZpYywgbWV0YS1kYXRhIGlkZW50aWZ5aW5nIHRoZSBzbG90Ci0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB3cml0ZSBpcyBvY2N1cnJpbmcKLSAgICogQHJldHVybiB0aGUgcmVhZCB2YWx1ZQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGxvbmcgbG9uZ1JlYWQoT2JqZWN0UmVmZXJlbmNlIHJlZiwgV29yZCBtZXRhRGF0YUEsIFdvcmQgbWV0YURhdGFCLCBpbnQgbW9kZSk7Ci0KLSAgLyoqCi0gICAqIEF0dGVtcHQgYW4gYXRvbWljIGNvbXBhcmUgYW5kIGV4Y2hhbmdlIGluIGEgd3JpdGUgYmFycmllciBzZXF1ZW5jZS4KLSAgICoKLSAgICogQHBhcmFtIG9ianJlZiBUaGUgb2JqZWN0IHRoYXQgaGFzIHRoZSBsb25nIGZpZWxkCi0gICAqIEBwYXJhbSBvbGQgVGhlIG9sZCBsb25nIHRvIGJlIHN3YXBwZWQgb3V0Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGxvbmcKLSAgICogQHBhcmFtIG1ldGFEYXRhQSBPcGFxdWUsIFZNLXNwZWNpZmljLCBtZXRhLWRhdGEgaWRlbnRpZnlpbmcgdGhlIHNsb3QKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBPcGFxdWUsIFZNLXNwZWNpZmljLCBtZXRhLWRhdGEgaWRlbnRpZnlpbmcgdGhlIHNsb3QKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHdyaXRlIGlzIG9jY3VycmluZwotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNvbXBhcmUgYW5kIHN3YXAgd2FzIHN1Y2Nlc3NmdWwKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGxvbmdUcnlDb21wYXJlQW5kU3dhcChPYmplY3RSZWZlcmVuY2Ugb2JqcmVmLCBsb25nIG9sZCwgbG9uZyB2YWx1ZSwgV29yZCBtZXRhRGF0YUEsIFdvcmQgbWV0YURhdGFCLCBpbnQgbW9kZSk7Ci0KLSAgLyoqCi0gICAqIFBlcmZvcm0gdGhlIGFjdHVhbCB3cml0ZSBvZiBhIGZsb2F0IHdyaXRlIGJhcnJpZXIuCi0gICAqCi0gICAqIEBwYXJhbSByZWYgVGhlIG9iamVjdCB0aGF0IGhhcyB0aGUgZmxvYXQgZmllbGQKLSAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHRoZSBzbG90IHdpbGwgYmUgdXBkYXRlZCB0bwotICAgKiBAcGFyYW0gbWV0YURhdGFBIE9wYXF1ZSwgVk0tc3BlY2lmaWMsIG1ldGEtZGF0YSBpZGVudGlmeWluZyB0aGUgc2xvdAotICAgKiBAcGFyYW0gbWV0YURhdGFCIE9wYXF1ZSwgVk0tc3BlY2lmaWMsIG1ldGEtZGF0YSBpZGVudGlmeWluZyB0aGUgc2xvdAotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgd3JpdGUgaXMgb2NjdXJyaW5nCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmbG9hdFdyaXRlKE9iamVjdFJlZmVyZW5jZSByZWYsIGZsb2F0IHZhbHVlLCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKTsKLQotICAvKioKLSAgICogUGVyZm9ybSB0aGUgYWN0dWFsIHJlYWQgb2YgYSBmbG9hdCByZWFkIGJhcnJpZXIuCi0gICAqCi0gICAqIEBwYXJhbSByZWYgVGhlIG9iamVjdCB0aGF0IGhhcyB0aGUgZmxvYXQgZmllbGQKLSAgICogQHBhcmFtIG1ldGFEYXRhQSBPcGFxdWUsIFZNLXNwZWNpZmljLCBtZXRhLWRhdGEgaWRlbnRpZnlpbmcgdGhlIHNsb3QKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBPcGFxdWUsIFZNLXNwZWNpZmljLCBtZXRhLWRhdGEgaWRlbnRpZnlpbmcgdGhlIHNsb3QKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHdyaXRlIGlzIG9jY3VycmluZwotICAgKiBAcmV0dXJuIHRoZSByZWFkIHZhbHVlCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgZmxvYXQgZmxvYXRSZWFkKE9iamVjdFJlZmVyZW5jZSByZWYsIFdvcmQgbWV0YURhdGFBLCBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpOwotCi0gIC8qKgotICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgd3JpdGUgb2YgYSBkb3VibGUgd3JpdGUgYmFycmllci4KLSAgICoKLSAgICogQHBhcmFtIHJlZiBUaGUgb2JqZWN0IHRoYXQgaGFzIHRoZSBkb3VibGUgZmllbGQKLSAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHRoZSBzbG90IHdpbGwgYmUgdXBkYXRlZCB0bwotICAgKiBAcGFyYW0gbWV0YURhdGFBIE9wYXF1ZSwgVk0tc3BlY2lmaWMsIG1ldGEtZGF0YSBpZGVudGlmeWluZyB0aGUgc2xvdAotICAgKiBAcGFyYW0gbWV0YURhdGFCIE9wYXF1ZSwgVk0tc3BlY2lmaWMsIG1ldGEtZGF0YSBpZGVudGlmeWluZyB0aGUgc2xvdAotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgd3JpdGUgaXMgb2NjdXJyaW5nCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkb3VibGVXcml0ZShPYmplY3RSZWZlcmVuY2UgcmVmLCBkb3VibGUgdmFsdWUsIFdvcmQgbWV0YURhdGFBLCBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpOwotCi0gIC8qKgotICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgcmVhZCBvZiBhIGRvdWJsZSByZWFkIGJhcnJpZXIuCi0gICAqCi0gICAqIEBwYXJhbSByZWYgVGhlIG9iamVjdCB0aGF0IGhhcyB0aGUgZG91YmxlIGZpZWxkCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgT3BhcXVlLCBWTS1zcGVjaWZpYywgbWV0YS1kYXRhIGlkZW50aWZ5aW5nIHRoZSBzbG90Ci0gICAqIEBwYXJhbSBtZXRhRGF0YUIgT3BhcXVlLCBWTS1zcGVjaWZpYywgbWV0YS1kYXRhIGlkZW50aWZ5aW5nIHRoZSBzbG90Ci0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB3cml0ZSBpcyBvY2N1cnJpbmcKLSAgICogQHJldHVybiB0aGUgcmVhZCB2YWx1ZQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGRvdWJsZSBkb3VibGVSZWFkKE9iamVjdFJlZmVyZW5jZSByZWYsIFdvcmQgbWV0YURhdGFBLCBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpOwotCi0gIC8qKgotICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgd3JpdGUgb2YgYW4gb2JqZWN0IHJlZmVyZW5jZSB3cml0ZSBiYXJyaWVyLgotICAgKgotICAgKiBAcGFyYW0gcmVmIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIHJlZmVyZW5jZSBmaWVsZAotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgdGhlIHNsb3Qgd2lsbCBiZSB1cGRhdGVkIHRvCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgT3BhcXVlLCBWTS1zcGVjaWZpYywgbWV0YS1kYXRhIGlkZW50aWZ5aW5nIHRoZSBzbG90Ci0gICAqIEBwYXJhbSBtZXRhRGF0YUIgT3BhcXVlLCBWTS1zcGVjaWZpYywgbWV0YS1kYXRhIGlkZW50aWZ5aW5nIHRoZSBzbG90Ci0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB3cml0ZSBpcyBvY2N1cnJpbmcKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG9iamVjdFJlZmVyZW5jZVdyaXRlKE9iamVjdFJlZmVyZW5jZSByZWYsIE9iamVjdFJlZmVyZW5jZSB2YWx1ZSwgV29yZCBtZXRhRGF0YUEsIFdvcmQgbWV0YURhdGFCLCBpbnQgbW9kZSk7Ci0KLSAgLyoqCi0gICAqIFBlcmZvcm0gdGhlIGFjdHVhbCByZWFkIG9mIGEgcmVhZCBiYXJyaWVyLgotICAgKgotICAgKiBAcGFyYW0gcmVmIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIHJlZmVyZW5jZSBmaWVsZAotICAgKiBAcGFyYW0gbWV0YURhdGFBIE9wYXF1ZSwgVk0tc3BlY2lmaWMsIG1ldGEtZGF0YSBpZGVudGlmeWluZyB0aGUgc2xvdAotICAgKiBAcGFyYW0gbWV0YURhdGFCIE9wYXF1ZSwgVk0tc3BlY2lmaWMsIG1ldGEtZGF0YSBpZGVudGlmeWluZyB0aGUgc2xvdAotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgd3JpdGUgaXMgb2NjdXJyaW5nCi0gICAqIEByZXR1cm4gdGhlIHJlYWQgdmFsdWUKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBPYmplY3RSZWZlcmVuY2Ugb2JqZWN0UmVmZXJlbmNlUmVhZChPYmplY3RSZWZlcmVuY2UgcmVmLCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKTsKLQotICAvKioKLSAgICogUGVyZm9ybSB0aGUgYWN0dWFsIHdyaXRlIG9mIHRoZSBub24taGVhcCB3cml0ZSBiYXJyaWVyLiAgVGhpcyBpcwotICAgKiB1c2VkIHdoZW4gdGhlIHN0b3JlIGlzIG5vdCB0byBhbiBvYmplY3QsIGJ1dCB0byBhIG5vbi1oZWFwIGxvY2F0aW9uCi0gICAqIHN1Y2ggYXMgc3RhdGljcyBvciB0aGUgc3RhY2suCi0gICAqCi0gICAqIEBwYXJhbSBzbG90IFRoZSBhZGRyZXNzIHRoYXQgY29udGFpbnMgdGhlIHJlZmVyZW5jZSBmaWVsZAotICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB2YWx1ZSB0aGF0IHRoZSBzbG90IHdpbGwgYmUgdXBkYXRlZCB0bwotICAgKiBAcGFyYW0gbWV0YURhdGFBIE9wYXF1ZSwgVk0tc3BlY2lmaWMsIG1ldGEtZGF0YSBpZGVudGlmeWluZyB0aGUgc2xvdAotICAgKiBAcGFyYW0gbWV0YURhdGFCIE9wYXF1ZSwgVk0tc3BlY2lmaWMsIG1ldGEtZGF0YSBpZGVudGlmeWluZyB0aGUgc2xvdAotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgb2JqZWN0UmVmZXJlbmNlTm9uSGVhcFdyaXRlKEFkZHJlc3Mgc2xvdCwgT2JqZWN0UmVmZXJlbmNlIHRhcmdldCwgV29yZCBtZXRhRGF0YUEsIFdvcmQgbWV0YURhdGFCKTsKLQotICAvKioKLSAgICogQXRvbWljYWxseSB3cml0ZSBhIHJlZmVyZW5jZSBmaWVsZCBvZiBhbiBvYmplY3Qgb3IgYXJyYXkgYW5kIHJldHVybgotICAgKiB0aGUgb2xkIHZhbHVlIG9mIHRoZSByZWZlcmVuY2UgZmllbGQuCi0gICAqCi0gICAqIEBwYXJhbSByZWYgVGhlIG9iamVjdCB0aGF0IGhhcyB0aGUgcmVmZXJlbmNlIGZpZWxkCi0gICAqIEBwYXJhbSB0YXJnZXQgVGhlIHZhbHVlIHRoYXQgdGhlIHNsb3Qgd2lsbCBiZSB1cGRhdGVkIHRvCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgT3BhcXVlLCBWTS1zcGVjaWZpYywgbWV0YS1kYXRhIGlkZW50aWZ5aW5nIHRoZSBzbG90Ci0gICAqIEBwYXJhbSBtZXRhRGF0YUIgT3BhcXVlLCBWTS1zcGVjaWZpYywgbWV0YS1kYXRhIGlkZW50aWZ5aW5nIHRoZSBzbG90Ci0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB3cml0ZSBpcyBvY2N1cnJpbmcKLSAgICogQHJldHVybiBUaGUgdmFsdWUgdGhhdCB3YXMgcmVwbGFjZWQgYnkgdGhlIHdyaXRlLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IE9iamVjdFJlZmVyZW5jZSBvYmplY3RSZWZlcmVuY2VBdG9taWNXcml0ZShPYmplY3RSZWZlcmVuY2UgcmVmLCBPYmplY3RSZWZlcmVuY2UgdGFyZ2V0LCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKTsKLQotICAvKioKLSAgICogQXR0ZW1wdCBhbiBhdG9taWMgY29tcGFyZSBhbmQgZXhjaGFuZ2UgaW4gYSB3cml0ZSBiYXJyaWVyIHNlcXVlbmNlLgotICAgKgotICAgKiBAcGFyYW0gcmVmIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIHJlZmVyZW5jZSBmaWVsZAotICAgKiBAcGFyYW0gb2xkIFRoZSBvbGQgcmVmZXJlbmNlIHRvIGJlIHN3YXBwZWQgb3V0Ci0gICAqIEBwYXJhbSB0YXJnZXQgVGhlIHZhbHVlIHRoYXQgdGhlIHNsb3Qgd2lsbCBiZSB1cGRhdGVkIHRvCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgT3BhcXVlLCBWTS1zcGVjaWZpYywgbWV0YS1kYXRhIGlkZW50aWZ5aW5nIHRoZSBzbG90Ci0gICAqIEBwYXJhbSBtZXRhRGF0YUIgT3BhcXVlLCBWTS1zcGVjaWZpYywgbWV0YS1kYXRhIGlkZW50aWZ5aW5nIHRoZSBzbG90Ci0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB3cml0ZSBpcyBvY2N1cnJpbmcKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBjb21wYXJlIGFuZCBzd2FwIHdhcyBzdWNjZXNzZnVsCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBvYmplY3RSZWZlcmVuY2VUcnlDb21wYXJlQW5kU3dhcChPYmplY3RSZWZlcmVuY2UgcmVmLCBPYmplY3RSZWZlcmVuY2Ugb2xkLCBPYmplY3RSZWZlcmVuY2UgdGFyZ2V0LCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKTsKLQotICAvKioKLSAgICogUGVyZm9ybSB0aGUgYWN0dWFsIHdyaXRlIG9mIHRoZSB3cml0ZSBiYXJyaWVyLCB3cml0aW5nIHRoZSB2YWx1ZSBhcyBhIHJhdyBXb3JkLgotICAgKgotICAgKiBAcGFyYW0gcmVmIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIFdvcmQgZmllbGQKLSAgICogQHBhcmFtIHRhcmdldCBUaGUgdmFsdWUgdGhhdCB0aGUgc2xvdCB3aWxsIGJlIHVwZGF0ZWQgdG8KLSAgICogQHBhcmFtIG1ldGFEYXRhQSBPcGFxdWUsIFZNLXNwZWNpZmljLCBtZXRhLWRhdGEgaWRlbnRpZnlpbmcgdGhlIHNsb3QKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBPcGFxdWUsIFZNLXNwZWNpZmljLCBtZXRhLWRhdGEgaWRlbnRpZnlpbmcgdGhlIHNsb3QKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHdyaXRlIGlzIG9jY3VycmluZwotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgd29yZFdyaXRlKE9iamVjdFJlZmVyZW5jZSByZWYsIFdvcmQgdGFyZ2V0LCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKTsKLQotICAvKioKLSAgICogQXRvbWljYWxseSB3cml0ZSBhIFdvcmQgZmllbGQgb2YgYW4gb2JqZWN0IG9yIGFycmF5IGFuZCByZXR1cm4KLSAgICogdGhlIG9sZCB2YWx1ZSBvZiB0aGUgV29yZCBmaWVsZC4KLSAgICoKLSAgICogQHBhcmFtIHJlZiBUaGUgb2JqZWN0IHRoYXQgaGFzIHRoZSBXb3JkIGZpZWxkCi0gICAqIEBwYXJhbSB0YXJnZXQgVGhlIHZhbHVlIHRoYXQgdGhlIHNsb3Qgd2lsbCBiZSB1cGRhdGVkIHRvCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgT3BhcXVlLCBWTS1zcGVjaWZpYywgbWV0YS1kYXRhIGlkZW50aWZ5aW5nIHRoZSBzbG90Ci0gICAqIEBwYXJhbSBtZXRhRGF0YUIgT3BhcXVlLCBWTS1zcGVjaWZpYywgbWV0YS1kYXRhIGlkZW50aWZ5aW5nIHRoZSBzbG90Ci0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB3cml0ZSBpcyBvY2N1cnJpbmcKLSAgICogQHJldHVybiBUaGUgcmF3IHZhbHVlIHRoYXQgd2FzIHJlcGxhY2VkIGJ5IHRoZSB3cml0ZS4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBXb3JkIHdvcmRBdG9taWNXcml0ZShPYmplY3RSZWZlcmVuY2UgcmVmLCBXb3JkIHJhd1RhcmdldCwgV29yZCBtZXRhRGF0YUEsIFdvcmQgbWV0YURhdGFCLCBpbnQgbW9kZSk7Ci0KLSAgLyoqCi0gICAqIEF0dGVtcHQgYW4gYXRvbWljIGNvbXBhcmUgYW5kIGV4Y2hhbmdlIGluIGEgd3JpdGUgYmFycmllciBzZXF1ZW5jZS4KLSAgICoKLSAgICogQHBhcmFtIHJlZiBUaGUgb2JqZWN0IHRoYXQgaGFzIHRoZSBXb3JkIGZpZWxkCi0gICAqIEBwYXJhbSBvbGQgVGhlIG9sZCBXb3JkIHRvIGJlIHN3YXBwZWQgb3V0Ci0gICAqIEBwYXJhbSB0YXJnZXQgVGhlIHZhbHVlIHRoYXQgdGhlIHNsb3Qgd2lsbCBiZSB1cGRhdGVkIHRvCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgT3BhcXVlLCBWTS1zcGVjaWZpYywgbWV0YS1kYXRhIGlkZW50aWZ5aW5nIHRoZSBzbG90Ci0gICAqIEBwYXJhbSBtZXRhRGF0YUIgT3BhcXVlLCBWTS1zcGVjaWZpYywgbWV0YS1kYXRhIGlkZW50aWZ5aW5nIHRoZSBzbG90Ci0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB3cml0ZSBpcyBvY2N1cnJpbmcKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBjb21wYXJlIGFuZCBzd2FwIHdhcyBzdWNjZXNzZnVsCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiB3b3JkVHJ5Q29tcGFyZUFuZFN3YXAoT2JqZWN0UmVmZXJlbmNlIHJlZiwgV29yZCBvbGQsIFdvcmQgdGFyZ2V0LCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKTsKLQotICAvKioKLSAgICogUGVyZm9ybSB0aGUgYWN0dWFsIHJlYWQgb2YgdGhlIHJlYWQgYmFycmllciwgcmV0dXJuaW5nIHRoZSB2YWx1ZSBhcyBhIHJhdyBXb3JkLgotICAgKgotICAgKiBAcGFyYW0gcmVmIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIFdvcmQgZmllbGQKLSAgICogQHBhcmFtIG1ldGFEYXRhQSBPcGFxdWUsIFZNLXNwZWNpZmljLCBtZXRhLWRhdGEgaWRlbnRpZnlpbmcgdGhlIHNsb3QKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBPcGFxdWUsIFZNLXNwZWNpZmljLCBtZXRhLWRhdGEgaWRlbnRpZnlpbmcgdGhlIHNsb3QKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHdyaXRlIGlzIG9jY3VycmluZwotICAgKiBAcmV0dXJuIHRoZSByZWFkIHZhbHVlCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgV29yZCB3b3JkUmVhZChPYmplY3RSZWZlcmVuY2UgcmVmLCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKTsKLQotICAvKioKLSAgICogUGVyZm9ybSB0aGUgYWN0dWFsIHdyaXRlIG9mIHRoZSB3cml0ZSBiYXJyaWVyLCB3cml0aW5nIHRoZSB2YWx1ZSBhcyBhIHJhdyBBZGRyZXNzLgotICAgKgotICAgKiBAcGFyYW0gcmVmIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIEFkZHJlc3MgZmllbGQKLSAgICogQHBhcmFtIHRhcmdldCBUaGUgdmFsdWUgdGhhdCB0aGUgc2xvdCB3aWxsIGJlIHVwZGF0ZWQgdG8KLSAgICogQHBhcmFtIG1ldGFEYXRhQSBPcGFxdWUsIFZNLXNwZWNpZmljLCBtZXRhLWRhdGEgaWRlbnRpZnlpbmcgdGhlIHNsb3QKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBPcGFxdWUsIFZNLXNwZWNpZmljLCBtZXRhLWRhdGEgaWRlbnRpZnlpbmcgdGhlIHNsb3QKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHdyaXRlIGlzIG9jY3VycmluZwotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgYWRkcmVzc1dyaXRlKE9iamVjdFJlZmVyZW5jZSByZWYsIEFkZHJlc3MgdGFyZ2V0LCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKTsKLQotICAvKioKLSAgICogUGVyZm9ybSB0aGUgYWN0dWFsIHJlYWQgb2YgdGhlIHJlYWQgYmFycmllciwgcmV0dXJuaW5nIHRoZSB2YWx1ZSBhcyBhIHJhdyBBZGRyZXNzLgotICAgKgotICAgKiBAcGFyYW0gcmVmIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIEFkZHJlc3MgZmllbGQKLSAgICogQHBhcmFtIG1ldGFEYXRhQSBPcGFxdWUsIFZNLXNwZWNpZmljLCBtZXRhLWRhdGEgaWRlbnRpZnlpbmcgdGhlIHNsb3QKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBPcGFxdWUsIFZNLXNwZWNpZmljLCBtZXRhLWRhdGEgaWRlbnRpZnlpbmcgdGhlIHNsb3QKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHdyaXRlIGlzIG9jY3VycmluZwotICAgKiBAcmV0dXJuIHRoZSByZWFkIHZhbHVlCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgQWRkcmVzcyBhZGRyZXNzUmVhZChPYmplY3RSZWZlcmVuY2UgcmVmLCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKTsKLQotICAvKioKLSAgICogQXR0ZW1wdCBhbiBhdG9taWMgY29tcGFyZSBhbmQgZXhjaGFuZ2UgaW4gYSB3cml0ZSBiYXJyaWVyIHNlcXVlbmNlLgotICAgKgotICAgKiBAcGFyYW0gcmVmIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIEFkZHJlc3MgZmllbGQKLSAgICogQHBhcmFtIG9sZCBUaGUgb2xkIGFkZHJlc3MgdG8gYmUgc3dhcHBlZCBvdXQKLSAgICogQHBhcmFtIHRhcmdldCBUaGUgdmFsdWUgdGhhdCB0aGUgc2xvdCB3aWxsIGJlIHVwZGF0ZWQgdG8KLSAgICogQHBhcmFtIG1ldGFEYXRhQSBPcGFxdWUsIFZNLXNwZWNpZmljLCBtZXRhLWRhdGEgaWRlbnRpZnlpbmcgdGhlIHNsb3QKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBPcGFxdWUsIFZNLXNwZWNpZmljLCBtZXRhLWRhdGEgaWRlbnRpZnlpbmcgdGhlIHNsb3QKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHdyaXRlIGlzIG9jY3VycmluZwotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNvbXBhcmUgYW5kIHN3YXAgd2FzIHN1Y2Nlc3NmdWwKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGFkZHJlc3NUcnlDb21wYXJlQW5kU3dhcChPYmplY3RSZWZlcmVuY2UgcmVmLCBBZGRyZXNzIG9sZCwgQWRkcmVzcyB0YXJnZXQsIFdvcmQgbWV0YURhdGFBLCBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpOwotCi0gIC8qKgotICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgd3JpdGUgb2YgdGhlIHdyaXRlIGJhcnJpZXIsIHdyaXRpbmcgdGhlIHZhbHVlIGFzIGEgcmF3IE9mZnNldC4KLSAgICoKLSAgICogQHBhcmFtIHJlZiBUaGUgb2JqZWN0IHRoYXQgaGFzIHRoZSBPZmZzZXQgZmllbGQKLSAgICogQHBhcmFtIHRhcmdldCBUaGUgdmFsdWUgdGhhdCB0aGUgc2xvdCB3aWxsIGJlIHVwZGF0ZWQgdG8KLSAgICogQHBhcmFtIG1ldGFEYXRhQSBPcGFxdWUsIFZNLXNwZWNpZmljLCBtZXRhLWRhdGEgaWRlbnRpZnlpbmcgdGhlIHNsb3QKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBPcGFxdWUsIFZNLXNwZWNpZmljLCBtZXRhLWRhdGEgaWRlbnRpZnlpbmcgdGhlIHNsb3QKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHdyaXRlIGlzIG9jY3VycmluZwotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgb2Zmc2V0V3JpdGUoT2JqZWN0UmVmZXJlbmNlIHJlZiwgT2Zmc2V0IHRhcmdldCwgV29yZCBtZXRhRGF0YUEsIFdvcmQgbWV0YURhdGFCLCBpbnQgbW9kZSk7Ci0KLSAgLyoqCi0gICAqIFBlcmZvcm0gdGhlIGFjdHVhbCByZWFkIG9mIHRoZSByZWFkIGJhcnJpZXIsIHJldHVybmluZyB0aGUgdmFsdWUgYXMgYSByYXcgT2Zmc2V0LgotICAgKgotICAgKiBAcGFyYW0gcmVmIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIE9mZnNldCBmaWVsZAotICAgKiBAcGFyYW0gbWV0YURhdGFBIE9wYXF1ZSwgVk0tc3BlY2lmaWMsIG1ldGEtZGF0YSBpZGVudGlmeWluZyB0aGUgc2xvdAotICAgKiBAcGFyYW0gbWV0YURhdGFCIE9wYXF1ZSwgVk0tc3BlY2lmaWMsIG1ldGEtZGF0YSBpZGVudGlmeWluZyB0aGUgc2xvdAotICAgKiBAcGFyYW0gbW9kZSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgd3JpdGUgaXMgb2NjdXJyaW5nCi0gICAqIEByZXR1cm4gdGhlIHJlYWQgdmFsdWUKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBPZmZzZXQgb2Zmc2V0UmVhZChPYmplY3RSZWZlcmVuY2UgcmVmLCBXb3JkIG1ldGFEYXRhQSwgV29yZCBtZXRhRGF0YUIsIGludCBtb2RlKTsKLQotICAvKioKLSAgICogUGVyZm9ybSB0aGUgYWN0dWFsIHdyaXRlIG9mIHRoZSB3cml0ZSBiYXJyaWVyLCB3cml0aW5nIHRoZSB2YWx1ZSBhcyBhIHJhdyBFeHRlbnQuCi0gICAqCi0gICAqIEBwYXJhbSByZWYgVGhlIG9iamVjdCB0aGF0IGhhcyB0aGUgRXh0ZW50IGZpZWxkCi0gICAqIEBwYXJhbSB0YXJnZXQgVGhlIHZhbHVlIHRoYXQgdGhlIHNsb3Qgd2lsbCBiZSB1cGRhdGVkIHRvCi0gICAqIEBwYXJhbSBtZXRhRGF0YUEgT3BhcXVlLCBWTS1zcGVjaWZpYywgbWV0YS1kYXRhIGlkZW50aWZ5aW5nIHRoZSBzbG90Ci0gICAqIEBwYXJhbSBtZXRhRGF0YUIgT3BhcXVlLCBWTS1zcGVjaWZpYywgbWV0YS1kYXRhIGlkZW50aWZ5aW5nIHRoZSBzbG90Ci0gICAqIEBwYXJhbSBtb2RlIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB3cml0ZSBpcyBvY2N1cnJpbmcKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGV4dGVudFdyaXRlKE9iamVjdFJlZmVyZW5jZSByZWYsIEV4dGVudCB0YXJnZXQsIFdvcmQgbWV0YURhdGFBLCBXb3JkIG1ldGFEYXRhQiwgaW50IG1vZGUpOwotCi0gIC8qKgotICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgcmVhZCBvZiB0aGUgcmVhZCBiYXJyaWVyLCByZXR1cm5pbmcgdGhlIHZhbHVlIGFzIGEgcmF3IEV4dGVudC4KLSAgICoKLSAgICogQHBhcmFtIHJlZiBUaGUgb2JqZWN0IHRoYXQgaGFzIHRoZSBFeHRlbnQgZmllbGQKLSAgICogQHBhcmFtIG1ldGFEYXRhQSBPcGFxdWUsIFZNLXNwZWNpZmljLCBtZXRhLWRhdGEgaWRlbnRpZnlpbmcgdGhlIHNsb3QKLSAgICogQHBhcmFtIG1ldGFEYXRhQiBPcGFxdWUsIFZNLXNwZWNpZmljLCBtZXRhLWRhdGEgaWRlbnRpZnlpbmcgdGhlIHNsb3QKLSAgICogQHBhcmFtIG1vZGUgVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHdyaXRlIGlzIG9jY3VycmluZwotICAgKiBAcmV0dXJuIHRoZSByZWFkIHZhbHVlCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgRXh0ZW50IGV4dGVudFJlYWQoT2JqZWN0UmVmZXJlbmNlIHJlZiwgV29yZCBtZXRhRGF0YUEsIFdvcmQgbWV0YURhdGFCLCBpbnQgbW9kZSk7Ci0KLSAgLyoqCi0gICAqIFNldHMgYW4gZWxlbWVudCBvZiBhbiBvYmplY3QgYXJyYXkgd2l0aG91dCBpbnZva2luZyBhbnkgd3JpdGUKLSAgICogYmFycmllci4gIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgTWFwIGNsYXNzIHRvIGVuc3VyZQotICAgKiBwb3RlbnRpYWxseS1hbGxvY2F0aW9uLXRyaWdnZXJpbmcgd3JpdGUgYmFycmllcnMgZG8gbm90IG9jY3VyIGluCi0gICAqIGFsbG9jYXRpb24gc2xvdyBwYXRoIGNvZGUuCi0gICAqCi0gICAqIEBwYXJhbSBkc3QgdGhlIGRlc3RpbmF0aW9uIGFycmF5Ci0gICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gc2V0Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIGZvciB0aGUgZWxlbWVudAotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgb2JqZWN0QXJyYXlTdG9yZU5vR0NCYXJyaWVyKE9iamVjdCBbXSBkc3QsIGludCBpbmRleCwgT2JqZWN0IHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vQnVpbGRUaW1lQ29uZmlnLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3ZtL0J1aWxkVGltZUNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWFhNDhjLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vQnVpbGRUaW1lQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudm07Ci0KLS8qKgotICogQnVpbGQtdGltZSBjb25maWd1cmF0aW9uIGNvbnN0YW50cyBmb3IgTU1Uay4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJ1aWxkVGltZUNvbmZpZyB7Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgTU1UayBwbGFuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFBsYW5OYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIHByb3BlcnR5IG9mIHR5cGUgU3RyaW5nCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotICAgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U3RyaW5nUHJvcGVydHkoU3RyaW5nIG5hbWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBwcm9wZXJ0eSBvZiB0eXBlIFN0cmluZywgd2l0aCBkZWZhdWx0LgotICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLSAgICogQHBhcmFtIGRmbHQgRGVmYXVsdCB2YWx1ZQotICAgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U3RyaW5nUHJvcGVydHkoU3RyaW5nIG5hbWUsIFN0cmluZyBkZmx0KTsKLQotICAvKioKLSAgICogUmV0dXJuIGEgcHJvcGVydHkgb2YgdHlwZSBpbnQKLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0gICAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGludCBnZXRJbnRQcm9wZXJ0eShTdHJpbmcgbmFtZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIHByb3BlcnR5IG9mIHR5cGUgU3RyaW5nLCB3aXRoIGRlZmF1bHQuCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotICAgKiBAcGFyYW0gZGZsdCBEZWZhdWx0IHZhbHVlCi0gICAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGludCBnZXRJbnRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgaW50IGRmbHQpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBwcm9wZXJ0eSBvZiB0eXBlIGJvb2xlYW4KLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0gICAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZ2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZyBuYW1lKTsKLQotICAvKioKLSAgICogUmV0dXJuIGEgcHJvcGVydHkgb2YgdHlwZSBib29sZWFuLCB3aXRoIGRlZmF1bHQuCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotICAgKiBAcGFyYW0gZGZsdCBEZWZhdWx0IHZhbHVlCi0gICAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZ2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZyBuYW1lLCBib29sZWFuIGRmbHQpOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay92bS9Db2xsZWN0aW9uLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3ZtL0NvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM0ODRmZi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3ZtL0NvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudm07Ci0KLWltcG9ydCBvcmcubW10ay5wbGFuLkNvbGxlY3RvckNvbnRleHQ7Ci1pbXBvcnQgb3JnLm1tdGsucGxhbi5NdXRhdG9yQ29udGV4dDsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi1AVW5pbnRlcnJ1cHRpYmxlIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb2xsZWN0aW9uIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDbGFzcyB2YXJpYWJsZXMKLSAgICovCi0KLSAgLyoqCi0gICAqIEFuIHVua25vd24gR0MgdHJpZ2dlciByZWFzb24uIFNpZ25hbHMgYSBsb2dpYyBidWcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTktOT1dOX0dDX1RSSUdHRVIgPSAwOwotCi0gIC8qKgotICAgKiBDb25jdXJyZW50IGNvbGxlY3Rpb24gcGhhc2UgdHJpZ2dlci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkFMX1BIQVNFX0dDX1RSSUdHRVIgPSAxOwotCi0gIC8qKgotICAgKiBFeHRlcm5hbGx5IHRyaWdnZXJlZCBnYXJiYWdlIGNvbGxlY3Rpb24gKGVnIGNhbGwgdG8gU3lzdGVtLmdjKCkpCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFRFUk5BTF9HQ19UUklHR0VSID0gMjsKLQotICAvKioKLSAgICogUmVzb3VyY2UgdHJpZ2dlcmVkIGdhcmJhZ2UgY29sbGVjdGlvbi4gIEZvciBleGFtcGxlLCBhbgotICAgKiBhbGxvY2F0aW9uIHJlcXVlc3Qgd291bGQgdGFrZSB0aGUgbnVtYmVyIG9mIHBhZ2VzIGluIHVzZSBiZXlvbmQKLSAgICogdGhlIG51bWJlciBhdmFpbGFibGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNPVVJDRV9HQ19UUklHR0VSID0gMzsKLQotICAvKioKLSAgICogSW50ZXJuYWxseSB0cmlnZ2VyZWQgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgRm9yIGV4YW1wbGUsIHRoZSBtZW1vcnkKLSAgICogbWFuYWdlciBhdHRlbXB0aW5nIGFub3RoZXIgY29sbGVjdGlvbiBhZnRlciB0aGUgZmlyc3QgZmFpbGVkIHRvCi0gICAqIGZyZWUgc3BhY2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5BTF9HQ19UUklHR0VSID0gNDsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBnYXJiYWdlIGNvbGxlY3Rpb24gdHJpZ2dlciByZWFzb25zLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJJR0dFUl9SRUFTT05TID0gNTsKLQotICAvKiogU2hvcnQgZGVzY3JpcHRpb25zIG9mIHRoZSBnYXJiYWdlIGNvbGxlY3Rpb24gdHJpZ2dlciByZWFzb25zLiAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHRyaWdnZXJSZWFzb25zID0gewotICAgICJ1bmtub3duIiwKLSAgICAiY29uY3VycmVudCBwaGFzZSIsCi0gICAgImV4dGVybmFsIHJlcXVlc3QiLAotICAgICJyZXNvdXJjZSBleGhhdXN0aW9uIiwKLSAgICAiaW50ZXJuYWwgcmVxdWVzdCIKLSAgfTsKLQotICAvKioKLSAgICogVHJpZ2dlcnMgYSBjb2xsZWN0aW9uLgotICAgKgotICAgKiBAcGFyYW0gd2h5IHRoZSByZWFzb24gd2h5IGEgY29sbGVjdGlvbiB3YXMgdHJpZ2dlcmVkLiAgMCB0bwotICAgKiAgICAgICAgICA8Y29kZT5UUklHR0VSX1JFQVNPTlMgLSAxPC9jb2RlPi4KLSAgICovCi0gIEBVbnByZWVtcHRpYmxlCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHRyaWdnZXJDb2xsZWN0aW9uKGludCB3aHkpOwotCi0gIC8qKgotICAgKiBKb2lucyBhbiBhbHJlYWR5IHJlcXVlc3RlZCBjb2xsZWN0aW9uLgotICAgKi8KLSAgQFVucHJlZW1wdGlibGUKLSAgcHVibGljIGFic3RyYWN0IHZvaWQgam9pbkNvbGxlY3Rpb24oKTsKLQotICAvKioKLSAgICogVHJpZ2dlciBhbiBhc3luY2hyb25vdXMgY29sbGVjdGlvbiwgY2hlY2tpbmcgZm9yIG1lbW9yeQotICAgKiBleGhhdXN0aW9uIGZpcnN0LgotICAgKgotICAgKiBAcGFyYW0gd2h5IHRoZSByZWFzb24gd2h5IGEgY29sbGVjdGlvbiB3YXMgdHJpZ2dlcmVkLiAgMCB0bwotICAgKiAgICAgICAgICA8Y29kZT5UUklHR0VSX1JFQVNPTlMgLSAxPC9jb2RlPi4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHRyaWdnZXJBc3luY0NvbGxlY3Rpb24oaW50IHdoeSk7Ci0KLSAgLyoqCi0gICAqIFRoZSBtYXhpbXVtIG51bWJlciBjb2xsZWN0aW9uIGF0dGVtcHRzIGFjcm9zcyB0aHJlYWRzLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGludCBtYXhpbXVtQ29sbGVjdGlvbkF0dGVtcHQoKTsKLQotICAvKioKLSAgICogUmVwb3J0IHRoYXQgdGhlIGFsbG9jYXRpb24gaGFzIHN1Y2NlZWRlZC4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlcG9ydEFsbG9jYXRpb25TdWNjZXNzKCk7Ci0KLSAgLyoqCi0gICAqIFJlcG9ydCB0aGF0IGEgcGh5c2ljYWwgYWxsb2NhdGlvbiBoYXMgZmFpbGVkLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVwb3J0UGh5c2ljYWxBbGxvY2F0aW9uRmFpbGVkKCk7Ci0KLSAgLyoqCi0gICAqIERvZXMgdGhlIFZNIGNvbnNpZGVyIHRoaXMgYW4gZW1lcmdlbmN5IGFsbG9jdGlvbiwgd2hlcmUgdGhlIG5vcm1hbAotICAgKiBoZWFwIHNpemUgcnVsZXMgY2FuIGJlIGlnbm9yZWQuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0VtZXJnZW5jeUFsbG9jYXRpb24oKTsKLQotICAvKioKLSAgICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBjb2xsZWN0aW9uIGN5Y2xlIGhhcyBmdWxseSBjb21wbGV0ZWQgKHRoaXMgaXMKLSAgICogdXNlZCB0byBlbnN1cmUgYSBHQyBpcyBub3QgaW4gdGhlIHByb2Nlc3Mgb2YgY29tcGxldGluZywgdG8KLSAgICogYXZvaWQsIGZvciBleGFtcGxlLCBhbiBhc3luYyBHQyBiZWluZyB0cmlnZ2VyZWQgb24gdGhlIHN3aXRjaAotICAgKiBmcm9tIEdDIHRvIG11dGF0b3IgdGhyZWFkIGJlZm9yZSBhbGwgR0MgdGhyZWFkcyBoYXZlIHN3aXRjaGVkLgotICAgKgotICAgKiBAcmV0dXJuIFRydWUgaWYgR0MgaXMgbm90IGluIHByb2dyZXNzLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gbm9UaHJlYWRzSW5HQygpOwotCi0gIC8qKgotICAgKiBQcmVwYXJlIGEgbXV0YXRvciBmb3IgY29sbGVjdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIG0gdGhlIG11dGF0b3IgdG8gcHJlcGFyZQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgcHJlcGFyZU11dGF0b3IoTXV0YXRvckNvbnRleHQgbSk7Ci0KLSAgLyoqCi0gICAqIFByZXBhcmUgYSBjb2xsZWN0b3IgZm9yIGEgY29sbGVjdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIGMgdGhlIGNvbGxlY3RvciB0byBwcmVwYXJlCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwcmVwYXJlQ29sbGVjdG9yKENvbGxlY3RvckNvbnRleHQgYyk7Ci0KLSAgLyoqCi0gICAqIFJlbmRlenZvdXMgd2l0aCBhbGwgb3RoZXIgcHJvY2Vzc29ycywgcmV0dXJuaW5nIHRoZSByYW5rCi0gICAqICh0aGF0IGlzLCB0aGUgb3JkZXIgdGhpcyBwcm9jZXNzb3IgYXJyaXZlZCBhdCB0aGUgYmFycmllcikuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgaW50IHJlbmRlenZvdXMoaW50IHdoZXJlKTsKLQotICAvKiogQHJldHVybiBUaGUgbnVtYmVyIG9mIGFjdGl2ZSBjb2xsZWN0b3IgdGhyZWFkcyAqLwotICBwdWJsaWMgYWJzdHJhY3QgaW50IGFjdGl2ZUdDVGhyZWFkcygpOwotCi0gIC8qKgotICAgKiBAcmV0dXJuIFRoZSBvcmRpbmFsIElEIG9mIHRoZSBydW5uaW5nIGNvbGxlY3RvciB0aHJlYWQgdy5yLnQuCi0gICAqIHRoZSBzZXQgb2YgYWN0aXZlIGNvbGxlY3RvciB0aHJlYWRzICh6ZXJvIGJhc2VkKQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGludCBhY3RpdmVHQ1RocmVhZE9yZGluYWwoKTsKLQotICAvKioKLSAgICogUmVxdWVzdCBlYWNoIG11dGF0b3IgZmx1c2ggcmVtZW1iZXJlZCBzZXRzLiBUaGlzIG1ldGhvZAotICAgKiB3aWxsIHRyaWdnZXIgdGhlIGZsdXNoIGFuZCB0aGVuIHlpZWxkIHVudGlsIGFsbCBwcm9jZXNzb3JzIGhhdmUKLSAgICogZmx1c2hlZC4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlcXVlc3RNdXRhdG9yRmx1c2goKTsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vQ29uZmlnLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3ZtL0NvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWFlOGM1Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudm07Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkxvZzsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5LnN0YXRpc3RpY3MuWG1sOwotCi1wdWJsaWMgY2xhc3MgQ29uZmlnIHsKLSAgLyogVGhlIG5hbWUgb2YgdGhlIGFjdGl2ZSBwbGFuICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEFDVElWRV9QTEFOOwotCi0gIC8qKiBNYXJrIGJpdCBpbiB0aGUgaGVhZGVyIG9yIG9uIHRoZSBzaWRlID8gKi8KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gSEVBREVSX01BUktfQklUUzsKLQotICBDb25maWcoQnVpbGRUaW1lQ29uZmlnIGNvbmZpZykgewotICAgIEFDVElWRV9QTEFOICAgICAgICAgICAgPSBjb25maWcuZ2V0UGxhbk5hbWUoKTsKLSAgICBIRUFERVJfTUFSS19CSVRTICAgICAgICA9IGNvbmZpZy5nZXRCb29sZWFuUHJvcGVydHkoIm1tdGsuaGVhZGVyTWFya0JpdCIsdHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcmludENvbmZpZygpIHsKLSAgICBMb2cud3JpdGVsbigiPT09PT09PT09PT09PT09PSBNTVRrIENvbmZpZ3VyYXRpb24gPT09PT09PT09PT09PT09PSIpOwotICAgIExvZy53cml0ZSgicGxhbiA9ICIpOyBMb2cud3JpdGVsbihBQ1RJVkVfUExBTik7Ci0gICAgTG9nLndyaXRlKCJIRUFERVJfTUFSS19CSVRTID0gIik7ICBMb2cud3JpdGVsbihIRUFERVJfTUFSS19CSVRTKTsKLSAgICBMb2cud3JpdGVsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcHJpbnRDb25maWdYbWwoKSB7Ci0gICAgTG9nLndyaXRlbG4oIjxjb25maWc+Iik7Ci0gICAgWG1sLmNvbmZpZ0l0ZW0oInBsYW4iLEFDVElWRV9QTEFOKTsKLSAgICBYbWwuY29uZmlnSXRlbSgiaGVhZGVyLW1hcmstYml0IixIRUFERVJfTUFSS19CSVRTKTsKLSAgICBMb2cud3JpdGVsbigiPC9jb25maWc+Iik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vRGVidWcuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vRGVidWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE1M2Q3ZS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3ZtL0RlYnVnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnZtOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5UcmFjZUxvY2FsOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS5VbmludGVycnVwdGlibGU7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC5BZGRyZXNzOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuT2JqZWN0UmVmZXJlbmNlOwotCi0vKioKLSAqCi0gKi8KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZWJ1ZyB7Ci0gIC8qKgotICAgKiBHbG9iYWwgc3dpdGNoIGZvciBkZWJ1Z2dpbmcgLSBpZiBmYWxzZSB0aGUgb3RoZXIgbWV0aG9kcyBvZiB0aGlzCi0gICAqIGNsYXNzIGFyZSBuZXZlciBjYWxsZWQuCi0gICAqIEByZXR1cm4gV2hldGhlciBkZWJ1Z2dpbmcgaXMgZW5hYmxlZAotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNFbmFibGVkKCk7Ci0KLSAgLyoqCi0gICAqIEEgbW9kYnVmIChvYmplY3QgcmVtZW1iZXJpbmcgYmFycmllcikgZW50cnkgaGFzIGJlZW4KLSAgICogdHJhY2VkIGR1cmluZyBjb2xsZWN0aW9uLgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBtb2RidWYgZW50cnkKLSAgICovCi0gIHB1YmxpYyB2b2lkIG1vZGJ1ZkVudHJ5KE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsgfQotCi0gIC8qKgotICAgKiBBIHJlbXNldCAoc2xvdCByZW1lbWJlcmluZyBiYXJyaWVyKSBlbnRyeSBoYXMgYmVlbgotICAgKiB0cmFjZWQgZHVyaW5nIGNvbGxlY3Rpb24uCi0gICAqIEBwYXJhbSBzbG90IFRoZSByZW1zZXQgZW50cnkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlbXNldEVudHJ5KEFkZHJlc3Mgc2xvdCkgeyB9Ci0KLSAgLyoqCi0gICAqIEFuIGFycmF5IHJlbXNldCBlbnRyeSBoYXMgYmVlbiB0cmFjZWQgZHVyaW5nIGNvbGxlY3Rpb24uICBJbXBsaWNpdGx5Ci0gICAqIHRoZSBzbG90cyBmcm9tIHN0YXJ0IChpbmNsdXNpdmUpIHRocm91Z2ggdG8gZ3VhcmQgKG5vbi1pbmNsdXNpdmUpCi0gICAqIGFyZSB0cmFjZWQgYXMgcmVtc2V0IGVudHJpZXMKLSAgICogQHBhcmFtIHN0YXJ0IFRoZSBlbnRyeSBzdGFydCBhZGRyZXNzCi0gICAqIEBwYXJhbSBndWFyZCBUaGUgZ3VhcmQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFycmF5UmVtc2V0RW50cnkoQWRkcmVzcyBzdGFydCwgQWRkcmVzcyBndWFyZCkgeyB9Ci0KLSAgLyoqCi0gICAqIEEgZ2xvYmFsIEdDIGNvbGxlY3Rpb24gcGhhc2UKLSAgICogQHBhcmFtIHBoYXNlSWQgVGhlIHBoYXNlIElECi0gICAqIEBwYXJhbSBiZWZvcmUgdHJ1ZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHBoYXNlLCBmYWxzZSBhdCB0aGUgZW5kCi0gICAqLwotICBwdWJsaWMgdm9pZCBnbG9iYWxQaGFzZShzaG9ydCBwaGFzZUlkLCBib29sZWFuIGJlZm9yZSkgeyB9Ci0KLSAgLyoqCi0gICAqIEEgcGVyLWNvbGxlY3RvciBHQyBjb2xsZWN0aW9uIHBoYXNlCi0gICAqIEBwYXJhbSBwaGFzZUlkIFRoZSBwaGFzZSBJRAotICAgKiBAcGFyYW0gb3JkaW5hbCBUaGUgY29sbGVjdG9yIElEICh3aXRoaW4gdGhpcyBjb2xsZWN0aW9uKQotICAgKiBAcGFyYW0gYmVmb3JlIHRydWUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwaGFzZSwgZmFsc2UgYXQgdGhlIGVuZAotICAgKi8KLSAgcHVibGljIHZvaWQgY29sbGVjdG9yUGhhc2Uoc2hvcnQgcGhhc2VJZCwgaW50IG9yZGluYWwsIGJvb2xlYW4gYmVmb3JlKSB7IH0KLQotICAvKioKLSAgICogQSBwZXItbXV0YXRvciBHQyBjb2xsZWN0aW9uIHBoYXNlCi0gICAqIEBwYXJhbSBwaGFzZUlkIFRoZSBwaGFzZSBJRAotICAgKiBAcGFyYW0gb3JkaW5hbCBUaGUgbXV0YXRvciBJRAotICAgKiBAcGFyYW0gYmVmb3JlIHRydWUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwaGFzZSwgZmFsc2UgYXQgdGhlIGVuZAotICAgKi8KLSAgcHVibGljIHZvaWQgbXV0YXRvclBoYXNlKHNob3J0IHBoYXNlSWQsIGludCBvcmRpbmFsLCBib29sZWFuIGJlZm9yZSkgeyB9Ci0KLSAgLyoqCi0gICAqIFRyYWNlIGFuIG9iamVjdCBkdXJpbmcgR0MKLSAgICoKLSAgICogKioqIE5vbi1zdGFuZGFyZCwgcmVxdWlyZXMgcGx1bWJpbmcgaW50byBhIGNvbGxlY3RvciBkdXJpbmcgZGVidWdnaW5nICoqKgotICAgKgotICAgKiBAcGFyYW0gdHJhY2UgVGhlIHRyYWNlIGJlaW5nIHBlcmZvcm1lZAotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYWNlT2JqZWN0KFRyYWNlTG9jYWwgdHJhY2UsIE9iamVjdFJlZmVyZW5jZSBvYmplY3QpIHsgfQotCi0gIC8qKgotICAgKiBBbiBlbnRyeSBoYXMgYmVlbiBpbnNlcnRlZCBhdCB0aGUgaGVhZCBvZiBhIHF1ZXVlCi0gICAqCi0gICAqICoqKiBOb24tc3RhbmRhcmQsIHJlcXVpcmVzIHBsdW1iaW5nIGludG8gYSBjb2xsZWN0b3IgZHVyaW5nIGRlYnVnZ2luZyAqKioKLSAgICoKLSAgICogQHBhcmFtIHF1ZXVlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcXVldWUKLSAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZQotICAgKi8KLSAgcHVibGljIHZvaWQgcXVldWVIZWFkSW5zZXJ0KFN0cmluZyBxdWV1ZU5hbWUsIEFkZHJlc3MgdmFsdWUpIHsKLSAgfQotCi0gIC8qKgotICAgKiBBbiBlbnRyeSBoYXMgYmVlbiBpbnNlcnRlZCBhdCB0aGUgaGVhZCBvZiBhIHF1ZXVlCi0gICAqCi0gICAqICoqKiBOb24tc3RhbmRhcmQsIHJlcXVpcmVzIHBsdW1iaW5nIGludG8gYSBjb2xsZWN0b3IgZHVyaW5nIGRlYnVnZ2luZyAqKioKLSAgICoKLSAgICogQHBhcmFtIHF1ZXVlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcXVldWUKLSAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZQotICAgKi8KLSAgcHVibGljIHZvaWQgcXVldWVUYWlsSW5zZXJ0KFN0cmluZyBxdWV1ZU5hbWUsIEFkZHJlc3MgdmFsdWUpIHsKLSAgfQotCi0gIC8qKgotICAgKiBBbiBlbnRyeSBoYXMgYmVlbiBpbnNlcnRlZCBhdCB0aGUgaGVhZCBvZiBhIHF1ZXVlCi0gICAqCi0gICAqICoqKiBOb24tc3RhbmRhcmQsIHJlcXVpcmVzIHBsdW1iaW5nIGludG8gYSBjb2xsZWN0b3IgZHVyaW5nIGRlYnVnZ2luZyAqKioKLSAgICoKLSAgICogQHBhcmFtIHF1ZXVlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcXVldWUKLSAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZQotICAgKi8KLSAgcHVibGljIHZvaWQgcXVldWVIZWFkUmVtb3ZlKFN0cmluZyBxdWV1ZU5hbWUsIEFkZHJlc3MgdmFsdWUpIHsgfQotCi0gIC8qKgotICAgKiBBbiBlbnRyeSBoYXMgYmVlbiBpbnNlcnRlZCBhdCB0aGUgaGVhZCBvZiBhIHF1ZXVlCi0gICAqCi0gICAqICoqKiBOb24tc3RhbmRhcmQsIHJlcXVpcmVzIHBsdW1iaW5nIGludG8gYSBjb2xsZWN0b3IgZHVyaW5nIGRlYnVnZ2luZyAqKioKLSAgICoKLSAgICogQHBhcmFtIHF1ZXVlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcXVldWUKLSAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZQotICAgKi8KLSAgcHVibGljIHZvaWQgcXVldWVUYWlsUmVtb3ZlKFN0cmluZyBxdWV1ZU5hbWUsIEFkZHJlc3MgdmFsdWUpIHsgfQotCi0gIC8qCi0gICAqIE5PVEU6IFRoZXNlIG1ldGhvZHMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYnkgYW55dGhpbmcgb3RoZXIgdGhhbiB0aGUKLSAgICogcmVmbGVjdGl2ZSBtZWNoYW5pc21zIGluIG9yZy5tbXRrLnZtLlZNLCBhbmQgYXJlIG5vdCBpbXBsZW1lbnRlZCBieQotICAgKiBzdWJjbGFzc2VzLgotICAgKgotICAgKiBUaGlzIGhhY2sgZXhpc3RzIG9ubHkgdG8gYWxsb3cgdXMgdG8gZGVjbGFyZSB0aGUgcmVzcGVjdGl2ZQotICAgKiBtZXRob2RzIGFzIHByb3RlY3RlZC4KLSAgICovCi0gIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzRW5hYmxlZFRyYXBkb29yKERlYnVnIGQpIHsKLSAgICByZXR1cm4gZC5pc0VuYWJsZWQoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3ZtL0ZhY3RvcnkuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTI3NmFmLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay52bTsKLQotaW1wb3J0IG9yZy52bXV0aWwub3B0aW9ucy5PcHRpb25TZXQ7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5nY3NweS5Db2xvcjsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lmdjc3B5LmRyaXZlcnMuQWJzdHJhY3REcml2ZXI7Ci1pbXBvcnQgb3JnLm1tdGsudm0uZ2NzcHkuQnl0ZVN0cmVhbTsKLWltcG9ydCBvcmcubW10ay52bS5nY3NweS5JbnRTdHJlYW07Ci1pbXBvcnQgb3JnLm1tdGsudm0uZ2NzcHkuU2VydmVySW50ZXJwcmV0ZXI7Ci1pbXBvcnQgb3JnLm1tdGsudm0uZ2NzcHkuU2VydmVyU3BhY2U7Ci1pbXBvcnQgb3JnLm1tdGsudm0uZ2NzcHkuU2hvcnRTdHJlYW07Ci1pbXBvcnQgb3JnLm1tdGsudm0uZ2NzcHkuVXRpbDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGRlZmluZXMgZmFjdG9yeSBtZXRob2RzIGZvciBWTS1zcGVjaWZpYyB0eXBlcyB3aGljaCBtdXN0Ci0gKiBiZSBpbnN0YW50aWF0ZWQgd2l0aGluIE1NVGsuICBTaW5jZSB0aGUgY29uY3JldGUgdHlwZSBpcyBkZWZpbmVkIGF0Ci0gKiBidWlsZCB0aW1lLCB3ZSBsZWF2ZSBpdCB0byBhIGNvbmNyZXRlIHZtLXNwZWNpZmljIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MKLSAqIHRvIHBlcmZvcm0gdGhlIG9iamVjdCBpbnN0YW50aWF0aW9uLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmFjdG9yeSB7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBvciByZXRyaWV2ZSB0aGUgT3B0aW9uU2V0IHVzZWQgZm9yIE1NVGsgb3B0aW9ucy4KLSAgICoKLSAgICogQHJldHVybiBBIGNvbmNyZXRlIFZNLXNwZWNpZmljIE9wdGlvblNldCBpbnN0YW5jZQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IE9wdGlvblNldCBnZXRPcHRpb25TZXQoKTsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IEFjdGl2ZVBsYW4gaW5zdGFuY2UgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFZNLXNwZWNpZmljCi0gICAqIGNvbmNyZXRlIEFjdGl2ZVBsYW4gc3ViLWNsYXNzLgotICAgKgotICAgKiBAc2VlIEFjdGl2ZVBsYW4KLSAgICogQHJldHVybiBBIGNvbmNyZXRlIFZNLXNwZWNpZmljIEFjdGl2ZVBsYW4gaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgQWN0aXZlUGxhbiBuZXdBY3RpdmVQbGFuKCk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBBc3NlcnQgaW5zdGFuY2UgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFZNLXNwZWNpZmljCi0gICAqIGNvbmNyZXRlIEFzc2VydCBzdWItY2xhc3MuCi0gICAqCi0gICAqIEBzZWUgQXNzZXJ0Ci0gICAqIEByZXR1cm4gQSBjb25jcmV0ZSBWTS1zcGVjaWZpYyBBc3NlcnQgaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgQXNzZXJ0IG5ld0Fzc2VydCgpOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgQmFycmllcnMgaW5zdGFuY2UgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFZNLXNwZWNpZmljCi0gICAqIGNvbmNyZXRlIEJhcnJpZXJzIHN1Yi1jbGFzcy4KLSAgICoKLSAgICogQHNlZSBCYXJyaWVycwotICAgKiBAcmV0dXJuIEEgY29uY3JldGUgVk0tc3BlY2lmaWMgQmFycmllcnMgaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgQmFycmllcnMgbmV3QmFycmllcnMoKTsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IENvbGxlY3Rpb24gaW5zdGFuY2UgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFZNLXNwZWNpZmljCi0gICAqIGNvbmNyZXRlIENvbGxlY3Rpb24gc3ViLWNsYXNzLgotICAgKgotICAgKiBAc2VlIENvbGxlY3Rpb24KLSAgICogQHJldHVybiBBIGNvbmNyZXRlIFZNLXNwZWNpZmljIENvbGxlY3Rpb24gaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgQ29sbGVjdGlvbiBuZXdDb2xsZWN0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBDb25maWcgaW5zdGFuY2UgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFZNLXNwZWNpZmljCi0gICAqIGNvbmNyZXRlIENvbmZpZyBzdWItY2xhc3MuCi0gICAqCi0gICAqIEBzZWUgQ29sbGVjdGlvbgotICAgKiBAcmV0dXJuIEEgY29uY3JldGUgVk0tc3BlY2lmaWMgQ29sbGVjdGlvbiBpbnN0YW5jZS4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBCdWlsZFRpbWVDb25maWcgbmV3QnVpbGRUaW1lQ29uZmlnKCk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBMb2NrIGluc3RhbmNlIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBWTS1zcGVjaWZpYwotICAgKiBjb25jcmV0ZSBMb2NrIHN1Yi1jbGFzcy4KLSAgICoKLSAgICogQHNlZSBMb2NrCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBzdHJpbmcgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbG9jayBpbnN0YW5jZQotICAgKiBAcmV0dXJuIEEgY29uY3JldGUgVk0tc3BlY2lmaWMgTG9jayBpbnN0YW5jZS4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBMb2NrIG5ld0xvY2soU3RyaW5nIG5hbWUpOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgTWVtb3J5IGluc3RhbmNlIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBWTS1zcGVjaWZpYwotICAgKiBjb25jcmV0ZSBNZW1vcnkgc3ViLWNsYXNzLgotICAgKgotICAgKiBAc2VlIE1lbW9yeQotICAgKiBAcmV0dXJuIEEgY29uY3JldGUgVk0tc3BlY2lmaWMgTWVtb3J5IGluc3RhbmNlLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IE1lbW9yeSBuZXdNZW1vcnkoKTsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IE9iamVjdE1vZGVsIGluc3RhbmNlIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBWTS1zcGVjaWZpYwotICAgKiBjb25jcmV0ZSBPYmplY3RNb2RlbCBzdWItY2xhc3MuCi0gICAqCi0gICAqIEBzZWUgT2JqZWN0TW9kZWwKLSAgICogQHJldHVybiBBIGNvbmNyZXRlIFZNLXNwZWNpZmljIE9iamVjdE1vZGVsIGluc3RhbmNlLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IE9iamVjdE1vZGVsIG5ld09iamVjdE1vZGVsKCk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBSZWZlcmVuY2VQcm9jZXNzb3IgaW5zdGFuY2UgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFZNLXNwZWNpZmljCi0gICAqIGNvbmNyZXRlIFJlZmVyZW5jZVByb2Nlc3NvciBzdWItY2xhc3MuCi0gICAqCi0gICAqIEBzZWUgUmVmZXJlbmNlUHJvY2Vzc29yCi0gICAqIEByZXR1cm4gQSBjb25jcmV0ZSBWTS1zcGVjaWZpYyBSZWZlcmVuY2VQcm9jZXNzb3IgaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgUmVmZXJlbmNlUHJvY2Vzc29yIG5ld1JlZmVyZW5jZVByb2Nlc3NvcihSZWZlcmVuY2VQcm9jZXNzb3IuU2VtYW50aWNzIHNlbWFudGljcyk7Ci0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IEZpbmFsaXpibGVQcm9jZXNzb3IgaW5zdGFuY2UgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFZNLXNwZWNpZmljCi0gICAqIGNvbmNyZXRlIEZpbmFsaXphYmxlUHJvY2Vzc29yIHN1Yi1jbGFzcy4KLSAgICoKLSAgICogQHNlZSBGaW5hbGl6YWJsZVByb2Nlc3NvcgotICAgKiBAcmV0dXJuIEEgY29uY3JldGUgVk0tc3BlY2lmaWMgRmluYWxpemFibGVQcm9jZXNzb3IgaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgRmluYWxpemFibGVQcm9jZXNzb3IgbmV3RmluYWxpemFibGVQcm9jZXNzb3IoKTsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IFNjYW5uaW5nIGluc3RhbmNlIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBWTS1zcGVjaWZpYwotICAgKiBjb25jcmV0ZSBTY2FubmluZyBzdWItY2xhc3MuCi0gICAqCi0gICAqIEBzZWUgU2Nhbm5pbmcKLSAgICogQHJldHVybiBBIGNvbmNyZXRlIFZNLXNwZWNpZmljIFNjYW5uaW5nIGluc3RhbmNlLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IFNjYW5uaW5nIG5ld1NjYW5uaW5nKCk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBTdGF0aXN0aWNzIGluc3RhbmNlIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBWTS1zcGVjaWZpYwotICAgKiBjb25jcmV0ZSBTdGF0aXN0aWNzIHN1Yi1jbGFzcy4KLSAgICoKLSAgICogQHNlZSBTdGF0aXN0aWNzCi0gICAqIEByZXR1cm4gQSBjb25jcmV0ZSBWTS1zcGVjaWZpYyBTdGF0aXN0aWNzIGluc3RhbmNlLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IFN0YXRpc3RpY3MgbmV3U3RhdGlzdGljcygpOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgU3RyaW5ncyBpbnN0YW5jZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgVk0tc3BlY2lmaWMKLSAgICogY29uY3JldGUgU3RyaW5ncyBzdWItY2xhc3MuCi0gICAqCi0gICAqIEBzZWUgU3RyaW5ncwotICAgKiBAcmV0dXJuIEEgY29uY3JldGUgVk0tc3BlY2lmaWMgU3RyaW5ncyBpbnN0YW5jZS4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdzIG5ld1N0cmluZ3MoKTsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IFN5bmNocm9uaXplZENvdW50ZXIgaW5zdGFuY2UgdXNpbmcgdGhlIGFwcHJvcHJpYXRlCi0gICAqIFZNLXNwZWNpZmljIGNvbmNyZXRlIFN5bmNocm9uaXplZENvdW50ZXIgc3ViLWNsYXNzLgotICAgKgotICAgKiBAc2VlIFN5bmNocm9uaXplZENvdW50ZXIKLSAgICoKLSAgICogQHJldHVybiBBIGNvbmNyZXRlIFZNLXNwZWNpZmljIFN5bmNocm9uaXplZENvdW50ZXIgaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgU3luY2hyb25pemVkQ291bnRlciBuZXdTeW5jaHJvbml6ZWRDb3VudGVyKCk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBUcmFjZUludGVyZmFjZSBpbnN0YW5jZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgVk0tc3BlY2lmaWMKLSAgICogY29uY3JldGUgVHJhY2VJbnRlcmZhY2Ugc3ViLWNsYXNzLgotICAgKgotICAgKiBAc2VlIFRyYWNlSW50ZXJmYWNlCi0gICAqIEByZXR1cm4gQSBjb25jcmV0ZSBWTS1zcGVjaWZpYyBUcmFjZUludGVyZmFjZSBpbnN0YW5jZS4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBUcmFjZUludGVyZmFjZSBuZXdUcmFjZUludGVyZmFjZSgpOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgTU1Ua19FdmVudHMgaW5zdGFuY2UgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFZNLXNwZWNpZmljCi0gICAqIGNvbmNyZXRlIE1NVGtfRXZlbnRzIHN1Yi1jbGFzcy4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBNTVRrX0V2ZW50cyBuZXdFdmVudHMoKTsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IGRlYnVnIG9iamVjdAotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IERlYnVnIG5ld0RlYnVnKCk7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogR0NzcHkgbWV0aG9kcwotICAgKi8KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IFV0aWwgaW5zdGFuY2UgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFZNLXNwZWNpZmljCi0gICAqIGNvbmNyZXRlIFV0aWwgc3ViLWNsYXNzLgotICAgKgotICAgKiBAc2VlIFV0aWwKLSAgICogQHJldHVybiBBIGNvbmNyZXRlIFZNLXNwZWNpZmljIFV0aWwgaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgVXRpbCBuZXdHQ3NweVV0aWwoKTsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IFNlcnZlckludGVycHJldGVyIGluc3RhbmNlIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBWTS1zcGVjaWZpYwotICAgKiBjb25jcmV0ZSBTZXJ2ZXJJbnRlcnByZXRlciBzdWItY2xhc3MuCi0gICAqCi0gICAqIEBzZWUgU2VydmVySW50ZXJwcmV0ZXIKLSAgICogQHJldHVybiBBIGNvbmNyZXRlIFZNLXNwZWNpZmljIFNlcnZlckludGVycHJldGVyIGluc3RhbmNlLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IFNlcnZlckludGVycHJldGVyIG5ld0dDc3B5U2VydmVySW50ZXJwcmV0ZXIoKTsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IFNlcnZlclNwYWNlIGluc3RhbmNlIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBWTS1zcGVjaWZpYwotICAgKiBjb25jcmV0ZSBTZXJ2ZXJTcGFjZSBzdWItY2xhc3MuCi0gICAqCi0gICAqIEBwYXJhbSBzZXJ2ZXJJbnRlcnByZXRlciBUaGUgc2VydmVyIHRoYXQgb3ducyB0aGlzIHNwYWNlCi0gICAqIEBwYXJhbSBzZXJ2ZXJOYW1lIFRoZSBzZXJ2ZXIncyBuYW1lCi0gICAqIEBwYXJhbSBkcml2ZXJOYW1lIFRoZSBzcGFjZSBkcml2ZXIncyBuYW1lCi0gICAqIEBwYXJhbSB0aXRsZSBUaXRsZSBmb3IgdGhlIHNwYWNlCi0gICAqIEBwYXJhbSBibG9ja0luZm8gQSBsYWJlbCBmb3IgZWFjaCBibG9jawotICAgKiBAcGFyYW0gdGlsZU51bSBNYXggbnVtYmVyIG9mIHRpbGVzIGluIHRoaXMgc3BhY2UKLSAgICogQHBhcmFtIHVudXNlZCBBIGxhYmVsIGZvciB1bnVzZWQgYmxvY2tzCi0gICAqIEBwYXJhbSBtYWluU3BhY2UgV2hldGhlciB0aGlzIHNwYWNlIGlzIHRoZSBtYWluIHNwYWNlCi0gICAqCi0gICAqIEBzZWUgU2VydmVyU3BhY2UKLSAgICogQHJldHVybiBBIGNvbmNyZXRlIFZNLXNwZWNpZmljIFNlcnZlclNwYWNlIGluc3RhbmNlLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IFNlcnZlclNwYWNlIG5ld0dDc3B5U2VydmVyU3BhY2UoCi0gICAgICBTZXJ2ZXJJbnRlcnByZXRlciBzZXJ2ZXJJbnRlcnByZXRlciwKLSAgICAgIFN0cmluZyBzZXJ2ZXJOYW1lLAotICAgICAgU3RyaW5nIGRyaXZlck5hbWUsCi0gICAgICBTdHJpbmcgdGl0bGUsCi0gICAgICBTdHJpbmcgYmxvY2tJbmZvLAotICAgICAgaW50IHRpbGVOdW0sCi0gICAgICBTdHJpbmcgdW51c2VkLAotICAgICAgYm9vbGVhbiBtYWluU3BhY2UpOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgSW50U3RyZWFtIGluc3RhbmNlIHVzaW5nIHRoZSBhcHByb3ByaWF0ZQotICAgKiBWTS1zcGVjaWZpYyBjb25jcmV0ZSBJbnRTdHJlYW0gc3ViLWNsYXNzLgotICAgKgotICAgKiBAcGFyYW0gZHJpdmVyICAgICAgICBUaGUgZHJpdmVyIHRoYXQgb3ducyB0aGlzIFN0cmVhbQotICAgKiBAcGFyYW0gbmFtZSAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHN0cmVhbSAoZS5nLiAiVXNlZCBzcGFjZSIpCi0gICAqIEBwYXJhbSBtaW5WYWx1ZSAgICAgICBUaGUgbWluaW11bSB2YWx1ZSBmb3IgYW55IGl0ZW0gaW4gdGhpcyBzdHJlYW0uCi0gICAqICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgbGVzcyB0aGFuIHRoaXMgd2lsbCBiZSByZXByZXNlbnRlZCBhcyAibWluVmFsdWUtIgotICAgKiBAcGFyYW0gbWF4VmFsdWUgICAgICAgVGhlIG1heGltdW0gdmFsdWUgZm9yIGFueSBpdGVtIGluIHRoaXMgc3RyZWFtLgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGdyZWF0ZXIgdGhhbiB0aGlzIHdpbGwgYmUgcmVwcmVzZW50ZWQgYXMgIm1heFZhbHVlKyIKLSAgICogQHBhcmFtIHplcm9WYWx1ZSAgICAgIFRoZSB6ZXJvIHZhbHVlIGZvciB0aGlzIHN0cmVhbQotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlICAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgc3RyZWFtCi0gICAqIEBwYXJhbSBzdHJpbmdQcmUgICAgICBBIHN0cmluZyB0byBwcmVmaXggdmFsdWVzIChlLmcuICJVc2VkOiAiKQotICAgKiBAcGFyYW0gc3RyaW5nUG9zdCAgICAgQSBzdHJpbmcgdG8gc3VmZml4IHZhbHVlcyAoZS5nLiAiIGJ5dGVzLiIpCi0gICAqIEBwYXJhbSBwcmVzZW50YXRpb24gICBIb3cgYSBzdHJlYW0gdmFsdWUgaXMgdG8gYmUgcHJlc2VudGVkLgotICAgKiBAcGFyYW0gcGFpbnRTdHlsZSAgICAgSG93IHRoZSB2YWx1ZSBpcyB0byBiZSBwYWludGVkLgotICAgKiBAcGFyYW0gaW5kZXhNYXhTdHJlYW0gVGhlIGluZGV4IG9mIHRoZSBtYXhpbXVtIHN0cmVhbSBpZiB0aGUgcHJlc2VudGF0aW9uIGlzICpfVkFSLgotICAgKiBAcGFyYW0gY29sb3VyICAgICAgICAgVGhlIGRlZmF1bHQgY29sb3VyIGZvciB0aWxlcyBvZiB0aGlzIHN0cmVhbQotICAgKiBAc2VlIEludFN0cmVhbQotICAgKgotICAgKiBAcmV0dXJuIEEgY29uY3JldGUgVk0tc3BlY2lmaWMgSW50U3RyZWFtIGluc3RhbmNlLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IEludFN0cmVhbSBuZXdHQ3NweUludFN0cmVhbSgKLSAgICAgIEFic3RyYWN0RHJpdmVyIGRyaXZlciwKLSAgICAgIFN0cmluZyBuYW1lLAotICAgICAgaW50IG1pblZhbHVlLAotICAgICAgaW50IG1heFZhbHVlLAotICAgICAgaW50IHplcm9WYWx1ZSwKLSAgICAgIGludCBkZWZhdWx0VmFsdWUsCi0gICAgICBTdHJpbmcgc3RyaW5nUHJlLAotICAgICAgU3RyaW5nIHN0cmluZ1Bvc3QsCi0gICAgICBpbnQgcHJlc2VudGF0aW9uLAotICAgICAgaW50IHBhaW50U3R5bGUsCi0gICAgICBpbnQgaW5kZXhNYXhTdHJlYW0sCi0gICAgICBDb2xvciBjb2xvdXIsCi0gICAgICBib29sZWFuIHN1bW1hcnkpOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgQnl0ZVN0cmVhbSBpbnN0YW5jZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUKLSAgICogVk0tc3BlY2lmaWMgY29uY3JldGUgQnl0ZVN0cmVhbSBzdWItY2xhc3MuCi0gICAqCi0gICAqIEBwYXJhbSBkcml2ZXIgICAgICAgIFRoZSBkcml2ZXIgdGhhdCBvd25zIHRoaXMgU3RyZWFtCi0gICAqIEBwYXJhbSBuYW1lICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgc3RyZWFtIChlLmcuICJVc2VkIHNwYWNlIikKLSAgICogQHBhcmFtIG1pblZhbHVlICAgICAgIFRoZSBtaW5pbXVtIHZhbHVlIGZvciBhbnkgaXRlbSBpbiB0aGlzIHN0cmVhbS4KLSAgICogICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBsZXNzIHRoYW4gdGhpcyB3aWxsIGJlIHJlcHJlc2VudGVkIGFzICJtaW5WYWx1ZS0iCi0gICAqIEBwYXJhbSBtYXhWYWx1ZSAgICAgICBUaGUgbWF4aW11bSB2YWx1ZSBmb3IgYW55IGl0ZW0gaW4gdGhpcyBzdHJlYW0uCi0gICAqICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgZ3JlYXRlciB0aGFuIHRoaXMgd2lsbCBiZSByZXByZXNlbnRlZCBhcyAibWF4VmFsdWUrIgotICAgKiBAcGFyYW0gemVyb1ZhbHVlICAgICAgVGhlIHplcm8gdmFsdWUgZm9yIHRoaXMgc3RyZWFtCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBzdHJlYW0KLSAgICogQHBhcmFtIHN0cmluZ1ByZSAgICAgIEEgc3RyaW5nIHRvIHByZWZpeCB2YWx1ZXMgKGUuZy4gIlVzZWQ6ICIpCi0gICAqIEBwYXJhbSBzdHJpbmdQb3N0ICAgICBBIHN0cmluZyB0byBzdWZmaXggdmFsdWVzIChlLmcuICIgYnl0ZXMuIikKLSAgICogQHBhcmFtIHByZXNlbnRhdGlvbiAgIEhvdyBhIHN0cmVhbSB2YWx1ZSBpcyB0byBiZSBwcmVzZW50ZWQuCi0gICAqIEBwYXJhbSBwYWludFN0eWxlICAgICBIb3cgdGhlIHZhbHVlIGlzIHRvIGJlIHBhaW50ZWQuCi0gICAqIEBwYXJhbSBpbmRleE1heFN0cmVhbSBUaGUgaW5kZXggb2YgdGhlIG1heGltdW0gc3RyZWFtIGlmIHRoZSBwcmVzZW50YXRpb24gaXMgKl9WQVIuCi0gICAqIEBwYXJhbSBjb2xvdXIgICAgICAgICBUaGUgZGVmYXVsdCBjb2xvdXIgZm9yIHRpbGVzIG9mIHRoaXMgc3RyZWFtCi0gICAqIEBzZWUgSW50U3RyZWFtCi0gICAqCi0gICAqIEByZXR1cm4gQSBjb25jcmV0ZSBWTS1zcGVjaWZpYyBCeXRlU3RyZWFtIGluc3RhbmNlLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IEJ5dGVTdHJlYW0gbmV3R0NzcHlCeXRlU3RyZWFtKAotICAgICAgQWJzdHJhY3REcml2ZXIgZHJpdmVyLAotICAgICAgU3RyaW5nIG5hbWUsCi0gICAgICBieXRlIG1pblZhbHVlLAotICAgICAgYnl0ZSBtYXhWYWx1ZSwKLSAgICAgIGJ5dGUgemVyb1ZhbHVlLAotICAgICAgYnl0ZSBkZWZhdWx0VmFsdWUsCi0gICAgICBTdHJpbmcgc3RyaW5nUHJlLAotICAgICAgU3RyaW5nIHN0cmluZ1Bvc3QsCi0gICAgICBpbnQgcHJlc2VudGF0aW9uLAotICAgICAgaW50IHBhaW50U3R5bGUsCi0gICAgICBpbnQgaW5kZXhNYXhTdHJlYW0sCi0gICAgICBDb2xvciBjb2xvdXIsCi0gICAgICBib29sZWFuIHN1bW1hcnkpOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgU2hvcnRTdHJlYW0gaW5zdGFuY2UgdXNpbmcgdGhlIGFwcHJvcHJpYXRlCi0gICAqIFZNLXNwZWNpZmljIGNvbmNyZXRlIFNob3J0U3RyZWFtIHN1Yi1jbGFzcy4KLSAgICoKLSAgICogQHBhcmFtIGRyaXZlciAgICAgICAgVGhlIGRyaXZlciB0aGF0IG93bnMgdGhpcyBTdHJlYW0KLSAgICogQHBhcmFtIG5hbWUgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBzdHJlYW0gKGUuZy4gIlVzZWQgc3BhY2UiKQotICAgKiBAcGFyYW0gbWluVmFsdWUgICAgICAgVGhlIG1pbmltdW0gdmFsdWUgZm9yIGFueSBpdGVtIGluIHRoaXMgc3RyZWFtLgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGxlc3MgdGhhbiB0aGlzIHdpbGwgYmUgcmVwcmVzZW50ZWQgYXMgIm1pblZhbHVlLSIKLSAgICogQHBhcmFtIG1heFZhbHVlICAgICAgIFRoZSBtYXhpbXVtIHZhbHVlIGZvciBhbnkgaXRlbSBpbiB0aGlzIHN0cmVhbS4KLSAgICogICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBncmVhdGVyIHRoYW4gdGhpcyB3aWxsIGJlIHJlcHJlc2VudGVkIGFzICJtYXhWYWx1ZSsiCi0gICAqIEBwYXJhbSB6ZXJvVmFsdWUgICAgICBUaGUgemVybyB2YWx1ZSBmb3IgdGhpcyBzdHJlYW0KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAgIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIHN0cmVhbQotICAgKiBAcGFyYW0gc3RyaW5nUHJlICAgICAgQSBzdHJpbmcgdG8gcHJlZml4IHZhbHVlcyAoZS5nLiAiVXNlZDogIikKLSAgICogQHBhcmFtIHN0cmluZ1Bvc3QgICAgIEEgc3RyaW5nIHRvIHN1ZmZpeCB2YWx1ZXMgKGUuZy4gIiBieXRlcy4iKQotICAgKiBAcGFyYW0gcHJlc2VudGF0aW9uICAgSG93IGEgc3RyZWFtIHZhbHVlIGlzIHRvIGJlIHByZXNlbnRlZC4KLSAgICogQHBhcmFtIHBhaW50U3R5bGUgICAgIEhvdyB0aGUgdmFsdWUgaXMgdG8gYmUgcGFpbnRlZC4KLSAgICogQHBhcmFtIGluZGV4TWF4U3RyZWFtIFRoZSBpbmRleCBvZiB0aGUgbWF4aW11bSBzdHJlYW0gaWYgdGhlIHByZXNlbnRhdGlvbiBpcyAqX1ZBUi4KLSAgICogQHBhcmFtIGNvbG91ciAgICAgICAgIFRoZSBkZWZhdWx0IGNvbG91ciBmb3IgdGlsZXMgb2YgdGhpcyBzdHJlYW0KLSAgICogQHNlZSBJbnRTdHJlYW0KLSAgICoKLSAgICogQHJldHVybiBBIGNvbmNyZXRlIFZNLXNwZWNpZmljIFNob3J0U3RyZWFtIGluc3RhbmNlLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IFNob3J0U3RyZWFtIG5ld0dDc3B5U2hvcnRTdHJlYW0oCi0gICAgICBBYnN0cmFjdERyaXZlciBkcml2ZXIsCi0gICAgICBTdHJpbmcgbmFtZSwKLSAgICAgIHNob3J0IG1pblZhbHVlLAotICAgICAgc2hvcnQgbWF4VmFsdWUsCi0gICAgICBzaG9ydCB6ZXJvVmFsdWUsCi0gICAgICBzaG9ydCBkZWZhdWx0VmFsdWUsCi0gICAgICBTdHJpbmcgc3RyaW5nUHJlLAotICAgICAgU3RyaW5nIHN0cmluZ1Bvc3QsCi0gICAgICBpbnQgcHJlc2VudGF0aW9uLAotICAgICAgaW50IHBhaW50U3R5bGUsCi0gICAgICBpbnQgaW5kZXhNYXhTdHJlYW0sCi0gICAgICBDb2xvciBjb2xvdXIsCi0gICAgICBib29sZWFuIHN1bW1hcnkpOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay92bS9GaW5hbGl6YWJsZVByb2Nlc3Nvci5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay92bS9GaW5hbGl6YWJsZVByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmYwYjI5Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vRmluYWxpemFibGVQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay52bTsKLQotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhY2VMb2NhbDsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuVW5pbnRlcnJ1cHRpYmxlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyBmaW5hbGl6YWJsZSBvYmplY3RzLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmluYWxpemFibGVQcm9jZXNzb3IgewotCi0gIC8qKgotICAgKiBDbGVhciB0aGUgY29udGVudHMgb2YgdGhlIHRhYmxlLiBUaGlzIGlzIGNhbGxlZCB3aGVuIGZpbmFsaXphdGlvbiBpcwotICAgKiBkaXNhYmxlZCB0byBtYWtlIGl0IGVhc2llciBmb3IgVk1zIHRvIGNoYW5nZSB0aGlzIHNldHRpbmcgYXQgcnVudGltZS4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsZWFyKCk7Ci0KLSAgLyoqCi0gICAqIFNjYW4gdGhyb3VnaCB0aGUgbGlzdCBvZiByZWZlcmVuY2VzLgotICAgKgotICAgKiBAcGFyYW0gdHJhY2UgdGhlIHRocmVhZCBsb2NhbCB0cmFjZSBlbGVtZW50LgotICAgKiBAcGFyYW0gbnVyc2VyeSB0cnVlIGlmIGl0IGlzIHNhZmUgdG8gb25seSBzY2FuIG5ldyByZWZlcmVuY2VzLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgc2NhbihUcmFjZUxvY2FsIHRyYWNlLCBib29sZWFuIG51cnNlcnkpOwotCi0gIC8qKgotICAgKiBJdGVyYXRlIG92ZXIgYW5kIGZvcndhcmQgZW50cmllcyBpbiB0aGUgdGFibGUuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmb3J3YXJkKFRyYWNlTG9jYWwgdHJhY2UsIGJvb2xlYW4gbnVyc2VyeSk7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3ZtL0xvY2suamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vTG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGQ2NWQ5Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vTG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnZtOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLlVuaW50ZXJydXB0aWJsZTsKLQotLyoqCi0gKiBTaW1wbGUsIGZhaXIgbG9ja3Mgd2l0aCBkZWFkbG9jayBkZXRlY3Rpb24uCi0gKi8KLUBVbmludGVycnVwdGlibGUgcHVibGljIGFic3RyYWN0IGNsYXNzIExvY2sgewotCi0gIC8qKgotICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhpcyBsb2NrIGluc3RhbmNlCi0gICAqCi0gICAqIEBwYXJhbSBzdHIgVGhlIG5hbWUgb2YgdGhlIGxvY2sgKGZvciBlcnJvciBvdXRwdXQpLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TmFtZShTdHJpbmcgc3RyKTsKLQotCi0gIC8qKgotICAgKiBUcnkgdG8gYWNxdWlyZSBhIGxvY2sgYW5kIHNwaW4td2FpdCB1bnRpbCBhY3F1aXJlZC4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFjcXVpcmUoKTsKLQotICAvKioKLSAgICogUGVyZm9ybSBzYW5pdHkgY2hlY2tzIG9uIHRoZSBsb2NrLiBGb3IgZGVidWdnaW5nLgotICAgKgotICAgKiBAcGFyYW0gdyBJZGVudGlmaWVzIHRoZSBjb2RlIGxvY2F0aW9uIGluIHRoZSBkZWJ1Z2dpbmcgb3V0cHV0LgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgY2hlY2soaW50IHcpOwotCi0gIC8qKgotICAgKiBSZWxlYXNlIHRoZSBsb2NrIGJ5IGluY3JlbWVudGluZyBzZXJ2aW5nIGNvdW50ZXIuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWxlYXNlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vTU1Ua19FdmVudHMuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vTU1Ua19FdmVudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRmNDJmZC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3ZtL01NVGtfRXZlbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLQotcGFja2FnZSBvcmcubW10ay52bTsKLQotaW1wb3J0IG9yZy5tbXRrLnBvbGljeS5TcGFjZTsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuVW5pbnRlcnJ1cHRpYmxlOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuQWRkcmVzczsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLkV4dGVudDsKLQotLyoqCi0gKiBFdmVudCBnZW5lcmF0aW9uIGludGVyZmFjZSBmb3IgTU1Uay4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGFic3RyYWN0IGNsYXNzIE1NVGtfRXZlbnRzIHsKLSAgcHVibGljIGFic3RyYWN0IHZvaWQgdHJhY2VQYWdlQWNxdWlyZWQoU3BhY2Ugc3BhY2UsIEFkZHJlc3Mgc3RhcnRBZGRyZXNzLCBpbnQgbnVtUGFnZXMpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHRyYWNlUGFnZVJlbGVhc2VkKFNwYWNlIHNwYWNlLCBBZGRyZXNzIHN0YXJ0QWRkcmVzcywgaW50IG51bVBhZ2VzKTsKLQotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBoZWFwU2l6ZUNoYW5nZWQoRXh0ZW50IGhlYXBTaXplKTsKLQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay92bS9NZW1vcnkuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vTWVtb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4M2VlY2MuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay92bS9NZW1vcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudm07Ci0KLWltcG9ydCBvcmcubW10ay5wb2xpY3kuSW1tb3J0YWxTcGFjZTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotQFVuaW50ZXJydXB0aWJsZSBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWVtb3J5IHsKLQotICAvKioKLSAgICogQWxsb3dzIGZvciB0aGUgVk0gdG8gcmVzZXJ2ZSBzcGFjZSBiZXR3ZWVuIEhFQVBfU1RBUlQoKQotICAgKiBhbmQgQVZBSUxBQkxFX1NUQVJUKCkgZm9yIGl0cyBvd24gcHVycG9zZXMuICBNTVRrIHNob3VsZAotICAgKiBleHBlY3QgdG8gZW5jb3VudGVyIG9iamVjdHMgaW4gdGhpcyByYW5nZSwgYnV0IG1heSBub3QKLSAgICogYWxsb2NhdGUgaW4gdGhpcyByYW5nZS4KLSAgICoKLSAgICogTU1UayBleHBlY3RzIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgYmV0d2VlbiBBVkFJTEFCTEVfU1RBUlQoKQotICAgKiBhbmQgQVZBSUxBQkxFX0VORCgpIHRvIGJlIGNvbnRpZ3VvdXMgYW5kIHVubWFwcGVkLgotICAgKiBBbGxvd3MgZm9yIHRoZSBWTSB0byByZXNlcnZlIHNwYWNlIGJldHdlZW4gSEVBUF9FTkQoKQotICAgKiBhbmQgQVZBSUxBQkxFX0VORCgpIGZvciBpdHMgb3duIHB1cnBvc2VzLiAgTU1UayBzaG91bGQKLSAgICogZXhwZWN0IHRvIGVuY291bnRlciBvYmplY3RzIGluIHRoaXMgcmFuZ2UsIGJ1dCBtYXkgbm90Ci0gICAqIGFsbG9jYXRlIGluIHRoaXMgcmFuZ2UuCi0gICAqCi0gICAqIE1NVGsgZXhwZWN0cyB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlIGJldHdlZW4gQVZBSUxBQkxFX1NUQVJUKCkKLSAgICogYW5kIEFWQUlMQUJMRV9FTkQoKSB0byBiZSBjb250aWd1b3VzIGFuZCB1bm1hcHBlZC4KLSAgICoKLSAgICogQHJldHVybiBUaGUgaGlnaCBib3VuZCBvZiB0aGUgbWVtb3J5IHRoYXQgTU1UayBjYW4gYWxsb2NhdGUuCi0gICAqLwotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHNwYWNlIGFzc29jaWF0ZWQgd2l0aC9yZXNlcnZlZCBmb3IgdGhlIFZNLiAgSW4gdGhlCi0gICAqIGNhc2Ugb2YgSmlrZXMgUlZNIHRoaXMgaXMgdGhlIGJvb3QgaW1hZ2Ugc3BhY2UuPHA+Ci0gICAqCi0gICAqIEByZXR1cm4gVGhlIHNwYWNlIG1hbmFnZWQgYnkgdGhlIHZpcnR1YWwgbWFjaGluZS4KLSAgICovCi0gIEBJbnRlcnJ1cHRpYmxlCi0gIHB1YmxpYyBhYnN0cmFjdCBJbW1vcnRhbFNwYWNlIGdldFZNU3BhY2UoKTsKLQotICAvKiogR2xvYmFsIHByZXBhcmF0aW9uIGZvciBhIGNvbGxlY3Rpb24uICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGdsb2JhbFByZXBhcmVWTVNwYWNlKCk7Ci0KLSAgLyoqIFBlci1jb2xsZWN0b3IgcHJlcGFyYXRpb24gZm9yIGEgY29sbGVjdGlvbi4gKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgY29sbGVjdG9yUHJlcGFyZVZNU3BhY2UoKTsKLQotICAvKiogUGVyLWNvbGxlY3RvciBwb3N0LWNvbGxlY3Rpb24gd29yay4gKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgY29sbGVjdG9yUmVsZWFzZVZNU3BhY2UoKTsKLQotICAvKiogR2xvYmFsIHBvc3QtY29sbGVjdGlvbiB3b3JrLiAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBnbG9iYWxSZWxlYXNlVk1TcGFjZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSByYW5nZSBvZiBhZGRyZXNzZXMgYXNzb2NpYXRlZCB3aXRoIGEgaGVhcC4KLSAgICoKLSAgICogQHBhcmFtIGlkIHRoZSBoZWFwIGlkZW50aWZpZXIKLSAgICogQHBhcmFtIHN0YXJ0IHRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgaGVhcAotICAgKiBAcGFyYW0gZW5kIHRoZSBhZGRyZXNzIG9mIHRoZSBlbmQgb2YgdGhlIGhlYXAKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEhlYXBSYW5nZShpbnQgaWQsIEFkZHJlc3Mgc3RhcnQsIEFkZHJlc3MgZW5kKTsKLQotICAvKioKLSAgICogRGVtYW5kIHplcm8gbW1hcHMgYW4gYXJlYSBvZiB2aXJ0dWFsIG1lbW9yeS4KLSAgICoKLSAgICogQHBhcmFtIHN0YXJ0IHRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgYXJlYSB0byBiZSBtYXBwZWQKLSAgICogQHBhcmFtIHNpemUgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgYXJlYSB0byBiZSBtYXBwZWQKLSAgICogQHJldHVybiAwIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSB0aGUgc3lzdGVtIGVycm5vCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgaW50IGR6bW1hcChBZGRyZXNzIHN0YXJ0LCBpbnQgc2l6ZSk7Ci0KLSAgLyoqCi0gICAqIFByb3RlY3RzIGFjY2VzcyB0byBhbiBhcmVhIG9mIHZpcnR1YWwgbWVtb3J5LgotICAgKgotICAgKiBAcGFyYW0gc3RhcnQgdGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBhcmVhIHRvIGJlIG1hcHBlZAotICAgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBhcmVhIHRvIGJlIG1hcHBlZAotICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZQotICAgKiA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG1wcm90ZWN0KEFkZHJlc3Mgc3RhcnQsIGludCBzaXplKTsKLQotICAvKioKLSAgICogQWxsb3dzIGFjY2VzcyB0byBhbiBhcmVhIG9mIHZpcnR1YWwgbWVtb3J5LgotICAgKgotICAgKiBAcGFyYW0gc3RhcnQgdGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBhcmVhIHRvIGJlIG1hcHBlZAotICAgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBhcmVhIHRvIGJlIG1hcHBlZAotICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZQotICAgKiA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG11bnByb3RlY3QoQWRkcmVzcyBzdGFydCwgaW50IHNpemUpOwotCi0gIC8qKgotICAgKiBaZXJvIGEgcmVnaW9uIG9mIG1lbW9yeS4KLSAgICogQHBhcmFtIHN0YXJ0IFN0YXJ0IG9mIGFkZHJlc3MgcmFuZ2UgKGluY2x1c2l2ZSkKLSAgICogQHBhcmFtIGxlbiBMZW5ndGggaW4gYnl0ZXMgb2YgcmFuZ2UgdG8gemVybwotICAgKiBSZXR1cm5lZDogbm90aGluZwotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgemVybyhBZGRyZXNzIHN0YXJ0LCBFeHRlbnQgbGVuKTsKLQotICAvKioKLSAgICogWmVybyBhIHJhbmdlIG9mIHBhZ2VzIG9mIG1lbW9yeS4KLSAgICogQHBhcmFtIHN0YXJ0IFN0YXJ0IG9mIGFkZHJlc3MgcmFuZ2UgKG11c3QgYmUgYSBwYWdlIGFkZHJlc3MpCi0gICAqIEBwYXJhbSBsZW4gTGVuZ3RoIGluIGJ5dGVzIG9mIHJhbmdlIChtdXN0IGJlIG11bHRpcGxlIG9mIHBhZ2Ugc2l6ZSkKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHplcm9QYWdlcyhBZGRyZXNzIHN0YXJ0LCBpbnQgbGVuKTsKLQotICAvKioKLSAgICogTG9ncyB0aGUgY29udGVudHMgb2YgYW4gYWRkcmVzcyBhbmQgdGhlIHN1cnJvdW5kaW5nIG1lbW9yeSB0byB0aGUKLSAgICogZXJyb3Igb3V0cHV0LgotICAgKgotICAgKiBAcGFyYW0gc3RhcnQgdGhlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSB0byBiZSBkdW1wZWQKLSAgICogQHBhcmFtIGJlZm9yZUJ5dGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYmVmb3JlIHRoZSBhZGRyZXNzIHRvIGJlCi0gICAqIGluY2x1ZGVkCi0gICAqIEBwYXJhbSBhZnRlckJ5dGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWZ0ZXIgdGhlIGFkZHJlc3MgdG8gYmUKLSAgICogaW5jbHVkZWQKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGR1bXBNZW1vcnkoQWRkcmVzcyBzdGFydCwgaW50IGJlZm9yZUJ5dGVzLAotICAgICAgaW50IGFmdGVyQnl0ZXMpOwotCi0gIC8qKgotICAgKiBXYWl0IGZvciBwcmVjZWVkaW5nIGNhY2hlIGZsdXNoL2ludmFsaWRhdGUgaW5zdHJ1Y3Rpb25zIHRvIGNvbXBsZXRlCi0gICAqIG9uIGFsbCBwcm9jZXNzb3JzLiAgRW5zdXJlcyB0aGF0IGFsbCBtZW1vcnkgd3JpdGVzIGJlZm9yZSB0aGlzCi0gICAqIHBvaW50IGFyZSB2aXNpYmxlIHRvIGFsbCBwcm9jZXNzb3JzLgotICAgKi8KLSAgQElubGluZQotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzeW5jKCk7Ci0KLSAgLyoqCi0gICAqIFdhaXQgZm9yIGFsbCBwcmVjZWVkaW5nIGluc3RydWN0aW9ucyB0byBjb21wbGV0ZSBhbmQgZGlzY2FyZCBhbnkKLSAgICogcHJlZmV0Y2hlZCBpbnN0cnVjdGlvbnMgb24gdGhpcyBwcm9jZXNzb3IuICBBbHNvIHByZXZlbnRzIHRoZQotICAgKiBjb21waWxlciBmcm9tIHBlcmZvcm1pbmcgY29kZSBtb3Rpb24gYWNyb3NzIHRoaXMgcG9pbnQuCi0gICAqLwotICBASW5saW5lCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGlzeW5jKCk7Ci0KLSAgLyoKLSAgICogTk9URTogVGhlIGZvbGxvd2luZyBtZXRob2RzIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyBvZiB0aGlzCi0gICAqIGNsYXNzLCBidXQgYXJlIGludGVybmFsIHRvIHRoZSBWTTwtPk1NIGludGVyZmFjZSBnbHVlLCBzbyBhcmUgbmV2ZXIKLSAgICogY2FsbGVkIGJ5IE1NVGsgdXNlcnMuCi0gICAqLwotICAvKiogQHJldHVybiBUaGUgbG93ZXN0IGFkZHJlc3MgaW4gdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSBrbm93biB0byBNTVRrICovCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBBZGRyZXNzIGdldEhlYXBTdGFydENvbnN0YW50KCk7Ci0gIC8qKiBAcmV0dXJuIFRoZSBoaWdoZXN0IGFkZHJlc3MgaW4gdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSBrbm93biB0byBNTVRrICovCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBBZGRyZXNzIGdldEhlYXBFbmRDb25zdGFudCgpOwotICAvKiogQHJldHVybiBUaGUgbG93ZXN0IGFkZHJlc3MgaW4gdGhlIGNvbnRpZ3VvdXMgYWRkcmVzcyBzcGFjZSBhdmFpbGFibGUgdG8gTU1UayAgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IEFkZHJlc3MgZ2V0QXZhaWxhYmxlU3RhcnRDb25zdGFudCgpOwotICAvKiogQHJldHVybiBUaGUgaGlnaGVzdCBhZGRyZXNzIGluIHRoZSBjb250aWd1b3VzIGFkZHJlc3Mgc3BhY2UgYXZhaWxhYmxlIHRvIE1NVGsgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IEFkZHJlc3MgZ2V0QXZhaWxhYmxlRW5kQ29uc3RhbnQoKTsKLSAgLyoqIEByZXR1cm4gVGhlIGxvZyBiYXNlIHR3byBvZiB0aGUgc2l6ZSBvZiBhbiBhZGRyZXNzICovCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBieXRlIGdldExvZ0J5dGVzSW5BZGRyZXNzQ29uc3RhbnQoKTsKLSAgLyoqIEByZXR1cm4gVGhlIGxvZyBiYXNlIHR3byBvZiB0aGUgc2l6ZSBvZiBhIHdvcmQgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IGJ5dGUgZ2V0TG9nQnl0ZXNJbldvcmRDb25zdGFudCgpOwotICAvKiogQHJldHVybiBUaGUgbG9nIGJhc2UgdHdvIG9mIHRoZSBzaXplIG9mIGFuIE9TIHBhZ2UgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IGJ5dGUgZ2V0TG9nQnl0ZXNJblBhZ2VDb25zdGFudCgpOwotICAvKiogQHJldHVybiBUaGUgbG9nIGJhc2UgdHdvIG9mIHRoZSBtaW5pbXVtIGFsbG9jYXRpb24gYWxpZ25tZW50ICovCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBieXRlIGdldExvZ01pbkFsaWdubWVudENvbnN0YW50KCk7Ci0gIC8qKiBAcmV0dXJuIFRoZSBsb2cgYmFzZSB0d28gb2YgKE1BWF9BTElHTk1FTlQvTUlOX0FMSUdOTUVOVCkgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IGJ5dGUgZ2V0TWF4QWxpZ25tZW50U2hpZnRDb25zdGFudCgpOwotICAvKiogQHJldHVybiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgb2YgcGFkZGluZyB0byBwcmVwZW5kIHRvIGFuIG9iamVjdCAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IGdldE1heEJ5dGVzUGFkZGluZ0NvbnN0YW50KCk7Ci0gIC8qKiBAcmV0dXJuIFRoZSB2YWx1ZSB0byBzdG9yZSBpbiBhbGlnbm1lbnQgaG9sZXMgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IGludCBnZXRBbGlnbm1lbnRWYWx1ZUNvbnN0YW50KCk7Ci0KLSAgLyoKLSAgICogTk9URTogVGhlc2UgbWV0aG9kcyBzaG91bGQgbm90IGJlIGNhbGxlZCBieSBhbnl0aGluZyBvdGhlciB0aGFuIHRoZQotICAgKiByZWZsZWN0aXZlIG1lY2hhbmlzbXMgaW4gb3JnLm1tdGsudm0uVk0sIGFuZCBhcmUgbm90IGltcGxlbWVudGVkIGJ5Ci0gICAqIHN1YmNsYXNzZXMuIFRoaXMgaGFjayBleGlzdHMgb25seSB0byBhbGxvdyB1cyB0byBkZWNsYXJlIHRoZSByZXNwZWN0aXZlCi0gICAqIG1ldGhvZHMgYXMgcHJvdGVjdGVkLgotICAgKi8KLSAgc3RhdGljIEFkZHJlc3MgaGVhcFN0YXJ0VHJhcGRvb3IoTWVtb3J5IG0pIHsKLSAgICByZXR1cm4gbS5nZXRIZWFwU3RhcnRDb25zdGFudCgpOwotICB9Ci0gIHN0YXRpYyBBZGRyZXNzIGhlYXBFbmRUcmFwZG9vcihNZW1vcnkgbSkgewotICAgIHJldHVybiBtLmdldEhlYXBFbmRDb25zdGFudCgpOwotICB9Ci0gIHN0YXRpYyBBZGRyZXNzIGF2YWlsYWJsZVN0YXJ0VHJhcGRvb3IoTWVtb3J5IG0pIHsKLSAgICByZXR1cm4gbS5nZXRBdmFpbGFibGVTdGFydENvbnN0YW50KCk7Ci0gIH0KLSAgc3RhdGljIEFkZHJlc3MgYXZhaWxhYmxlRW5kVHJhcGRvb3IoTWVtb3J5IG0pIHsKLSAgICByZXR1cm4gbS5nZXRBdmFpbGFibGVFbmRDb25zdGFudCgpOwotICB9Ci0gIHN0YXRpYyBieXRlIGxvZ0J5dGVzSW5BZGRyZXNzVHJhcGRvb3IoTWVtb3J5IG0pIHsKLSAgICByZXR1cm4gbS5nZXRMb2dCeXRlc0luQWRkcmVzc0NvbnN0YW50KCk7Ci0gIH0KLSAgc3RhdGljIGJ5dGUgbG9nQnl0ZXNJbldvcmRUcmFwZG9vcihNZW1vcnkgbSkgewotICAgIHJldHVybiBtLmdldExvZ0J5dGVzSW5Xb3JkQ29uc3RhbnQoKTsKLSAgfQotICBzdGF0aWMgYnl0ZSBsb2dCeXRlc0luUGFnZVRyYXBkb29yKE1lbW9yeSBtKSB7Ci0gICAgcmV0dXJuIG0uZ2V0TG9nQnl0ZXNJblBhZ2VDb25zdGFudCgpOwotICB9Ci0gIHN0YXRpYyBieXRlIGxvZ01pbkFsaWdubWVudFRyYXBkb29yKE1lbW9yeSBtKSB7Ci0gICAgcmV0dXJuIG0uZ2V0TG9nTWluQWxpZ25tZW50Q29uc3RhbnQoKTsKLSAgfQotICBzdGF0aWMgYnl0ZSBtYXhBbGlnbm1lbnRTaGlmdFRyYXBkb29yKE1lbW9yeSBtKSB7Ci0gICAgcmV0dXJuIG0uZ2V0TWF4QWxpZ25tZW50U2hpZnRDb25zdGFudCgpOwotICB9Ci0gIHN0YXRpYyBpbnQgbWF4Qnl0ZXNQYWRkaW5nVHJhcGRvb3IoTWVtb3J5IG0pIHsKLSAgICByZXR1cm4gbS5nZXRNYXhCeXRlc1BhZGRpbmdDb25zdGFudCgpOwotICB9Ci0gIHN0YXRpYyBpbnQgYWxpZ25tZW50VmFsdWVUcmFwZG9vcihNZW1vcnkgbSkgewotICAgIHJldHVybiBtLmdldEFsaWdubWVudFZhbHVlQ29uc3RhbnQoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay92bS9PYmplY3RNb2RlbC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay92bS9PYmplY3RNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTA0MTYwLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vT2JqZWN0TW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudm07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuVW5pbnRlcnJ1cHRpYmxlOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotQFVuaW50ZXJydXB0aWJsZSBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgT2JqZWN0TW9kZWwgewotICAvKioKLSAgICogQ29weSBhbiBvYmplY3QgdXNpbmcgYSBwbGFuJ3MgYWxsb2NDb3B5IHRvIGdldCBzcGFjZSBhbmQgaW5zdGFsbAotICAgKiB0aGUgZm9yd2FyZGluZyBwb2ludGVyLiAgT24gZW50cnksIDxjb2RlPmZyb208L2NvZGU+IG11c3QgaGF2ZQotICAgKiBiZWVuIHJlc2VydmVkIGZvciBjb3B5aW5nIGJ5IHRoZSBjYWxsZXIuICBUaGlzIG1ldGhvZCBjYWxscyB0aGUKLSAgICogcGxhbidzIDxjb2RlPmdldFN0YXR1c0ZvckNvcHkoKTwvY29kZT4gbWV0aG9kIHRvIGVzdGFibGlzaCBhIG5ldwotICAgKiBzdGF0dXMgd29yZCBmb3IgdGhlIGNvcGllZCBvYmplY3QgYW5kIDxjb2RlPnBvc3RDb3B5KCk8L2NvZGU+IHRvCi0gICAqIGFsbG93IHRoZSBwbGFuIHRvIHBlcmZvcm0gYW55IHBvc3QgY29weSBhY3Rpb25zLgotICAgKgotICAgKiBAcGFyYW0gZnJvbSB0aGUgYWRkcmVzcyBvZiB0aGUgb2JqZWN0IHRvIGJlIGNvcGllZAotICAgKiBAcGFyYW0gYWxsb2NhdG9yIFRoZSBhbGxvY2F0b3IgdG8gdXNlLgotICAgKiBAcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBuZXcgb2JqZWN0Ci0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0UmVmZXJlbmNlIGNvcHkoT2JqZWN0UmVmZXJlbmNlIGZyb20sIGludCBhbGxvY2F0b3IpOwotCi0gIC8qKgotICAgKiBDb3B5IGFuIG9iamVjdCB0byBiZSBwb2ludGVyIHRvIGJ5IHRoZSB0byBhZGRyZXNzLiBUaGlzIGlzIHJlcXVpcmVkCi0gICAqIGZvciBkZWxheWVkLWNvcHkgY29sbGVjdG9ycyBzdWNoIGFzIGNvbXBhY3RpbmcgY29sbGVjdG9ycy4gRHVyaW5nIHRoZQotICAgKiBjb2xsZWN0aW9uLCBNTVRrIHJlc2VydmVzIGEgcmVnaW9uIGluIHRoZSBoZWFwIGZvciBhbiBvYmplY3QgYXMgcGVyCi0gICAqIHJlcXVpcmVtZW50cyBmb3VuZCBmcm9tIE9iamVjdE1vZGVsIGFuZCB0aGVuIGFza3MgT2JqZWN0TW9kZWwgdG8KLSAgICogZGV0ZXJtaW5lIHdoYXQgdGhlIG9iamVjdCdzIHJlZmVyZW5jZSB3aWxsIGJlIHBvc3QtY29weS4KLSAgICoKLSAgICogQHBhcmFtIGZyb20gdGhlIGFkZHJlc3Mgb2YgdGhlIG9iamVjdCB0byBiZSBjb3BpZWQKLSAgICogQHBhcmFtIHRvIFRoZSB0YXJnZXQgbG9jYXRpb24uCi0gICAqIEBwYXJhbSByZWdpb24gVGhlIHN0YXJ0IG9mIHRoZSByZWdpb24gdGhhdCB3YXMgcmVzZXJ2ZWQgZm9yIHRoaXMgb2JqZWN0Ci0gICAqIEByZXR1cm4gQWRkcmVzcyBUaGUgYWRkcmVzcyBwYXN0IHRoZSBlbmQgb2YgdGhlIGNvcGllZCBvYmplY3QKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBBZGRyZXNzIGNvcHlUbyhPYmplY3RSZWZlcmVuY2UgZnJvbSwgT2JqZWN0UmVmZXJlbmNlIHRvLCBBZGRyZXNzIHJlZ2lvbik7Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgcmVmZXJlbmNlIHRoYXQgYW4gb2JqZWN0IHdpbGwgYmUgcmVmZXJlZCB0byBhZnRlciBpdCBpcyBjb3BpZWQKLSAgICogdG8gdGhlIHNwZWNpZmllZCByZWdpb24uIFVzZWQgaW4gZGVsYXllZC1jb3B5IGNvbGxlY3RvcnMgc3VjaCBhcyBjb21wYWN0aW5nCi0gICAqIGNvbGxlY3RvcnMuCi0gICAqCi0gICAqIEBwYXJhbSBmcm9tIFRoZSBvYmplY3QgdG8gYmUgY29waWVkLgotICAgKiBAcGFyYW0gdG8gVGhlIHJlZ2lvbiB0byBiZSBjb3BpZWQgdG8uCi0gICAqIEByZXR1cm4gVGhlIHJlc3VsdGluZyByZWZlcmVuY2UuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0UmVmZXJlbmNlIGdldFJlZmVyZW5jZVdoZW5Db3BpZWRUbyhPYmplY3RSZWZlcmVuY2UgZnJvbSwgQWRkcmVzcyB0byk7Ci0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBzaXplIHJlcXVpcmVkIHRvIGNvcHkgYW4gb2JqZWN0Ci0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB3aG9zZSBzaXplIGlzIHRvIGJlIHF1ZXJpZWQKLSAgICogQHJldHVybiBUaGUgc2l6ZSByZXF1aXJlZCB0byBjb3B5IDxjb2RlPm9iajwvY29kZT4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0U2l6ZVdoZW5Db3BpZWQoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50IGZvciBhIGNvcHkgb2YgdGhpcyBvYmplY3QKLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHdob3NlIHNpemUgaXMgdG8gYmUgcXVlcmllZAotICAgKiBAcmV0dXJuIFRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIGEgY29weSBvZiA8Y29kZT5vYmo8L2NvZGU+Ci0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEFsaWduV2hlbkNvcGllZChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KTsKLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBhbGlnbm1lbnQgb2Zmc2V0IHJlcXVpcmVtZW50cyBmb3IgYSBjb3B5IG9mIHRoaXMgb2JqZWN0Ci0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB3aG9zZSBzaXplIGlzIHRvIGJlIHF1ZXJpZWQKLSAgICogQHJldHVybiBUaGUgYWxpZ25tZW50IG9mZnNldCByZXF1aXJlZCBmb3IgYSBjb3B5IG9mIDxjb2RlPm9iajwvY29kZT4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0QWxpZ25PZmZzZXRXaGVuQ29waWVkKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpOwotCi0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgc2l6ZSB1c2VkIGJ5IGFuIG9iamVjdAotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3Qgd2hvc2Ugc2l6ZSBpcyB0byBiZSBxdWVyaWVkCi0gICAqIEByZXR1cm4gVGhlIHNpemUgb2YgPGNvZGU+b2JqPC9jb2RlPgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGludCBnZXRDdXJyZW50U2l6ZShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KTsKLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBuZXh0IG9iamVjdCBpbiB0aGUgaGVhcCB1bmRlciBjb250aWd1b3VzIGFsbG9jYXRpb24KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBPYmplY3RSZWZlcmVuY2UgZ2V0TmV4dE9iamVjdChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KTsKLQotICAvKioKLSAgICogUmV0dXJuIGFuIG9iamVjdCByZWZlcmVuY2UgZnJvbSBrbm93bGVkZ2Ugb2YgdGhlIGxvdyBvcmRlciB3b3JkCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0UmVmZXJlbmNlIGdldE9iamVjdEZyb21TdGFydEFkZHJlc3MoQWRkcmVzcyBzdGFydCk7Ci0gIC8qKgotICAgKiBHZXRzIGEgcG9pbnRlciB0byB0aGUgYWRkcmVzcyBqdXN0IHBhc3QgdGhlIGVuZCBvZiB0aGUgb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3R5LgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IEFkZHJlc3MgZ2V0T2JqZWN0RW5kQWRkcmVzcyhPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KTsKLQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHR5cGUgZGVzY3JpcHRvciBmb3IgYW4gb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gcmVmIGFkZHJlc3Mgb2YgdGhlIG9iamVjdAotICAgKiBAcmV0dXJuIGJ5dGUgYXJyYXkgd2l0aCB0aGUgdHlwZSBkZXNjcmlwdG9yCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIGdldFR5cGVEZXNjcmlwdG9yKE9iamVjdFJlZmVyZW5jZSByZWYpOwotCi0gIC8qKgotICAgKiBJcyB0aGUgcGFzc2VkIG9iamVjdCBhbiBhcnJheT8KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBhZGRyZXNzIG9mIHRoZSBvYmplY3QKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQXJyYXkoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCk7Ci0KLSAgLyoqCi0gICAqIElzIHRoZSBwYXNzZWQgb2JqZWN0IGEgcHJpbWl0aXZlIGFycmF5PwotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IGFkZHJlc3Mgb2YgdGhlIG9iamVjdAotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNQcmltaXRpdmVBcnJheShPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KTsKLQotICAvKioKLSAgICogR2V0IHRoZSBsZW5ndGggb2YgYW4gYXJyYXkgb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IGFkZHJlc3Mgb2YgdGhlIG9iamVjdAotICAgKiBAcmV0dXJuIFRoZSBhcnJheSBsZW5ndGgsIGluIGVsZW1lbnRzCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEFycmF5TGVuZ3RoKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpOwotCi0gIC8qKgotICAgKiBBdHRlbXB0cyB0byBzZXQgdGhlIGJpdHMgYXZhaWxhYmxlIGZvciBtZW1vcnkgbWFuYWdlciB1c2UgaW4gYW4KLSAgICogb2JqZWN0LiAgVGhlIGF0dGVtcHQgd2lsbCBvbmx5IGJlIHN1Y2Nlc3NmdWwgaWYgdGhlIGN1cnJlbnQgdmFsdWUKLSAgICogb2YgdGhlIGJpdHMgbWF0Y2hlcyA8Y29kZT5vbGRWYWw8L2NvZGU+LiAgVGhlIGNvbXBhcmlzb24gd2l0aCB0aGUKLSAgICogY3VycmVudCB2YWx1ZSBhbmQgc2V0dGluZyBhcmUgYXRvbWljIHdpdGggcmVzcGVjdCB0byBvdGhlcgotICAgKiBhbGxvY2F0b3JzLgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSBhZGRyZXNzIG9mIHRoZSBvYmplY3QKLSAgICogQHBhcmFtIG9sZFZhbCB0aGUgcmVxdWlyZWQgY3VycmVudCB2YWx1ZSBvZiB0aGUgYml0cwotICAgKiBAcGFyYW0gbmV3VmFsIHRoZSBkZXNpcmVkIG5ldyB2YWx1ZSBvZiB0aGUgYml0cwotICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBiaXRzIHdlcmUgc2V0LAotICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBhdHRlbXB0QXZhaWxhYmxlQml0cyhPYmplY3RSZWZlcmVuY2Ugb2JqZWN0LAotICAgICAgV29yZCBvbGRWYWwsIFdvcmQgbmV3VmFsKTsKLQotICAvKioKLSAgICogR2V0cyB0aGUgdmFsdWUgb2YgYml0cyBhdmFpbGFibGUgZm9yIG1lbW9yeSBtYW5hZ2VyIHVzZSBpbiBhbgotICAgKiBvYmplY3QsIGluIHByZXBhcmF0aW9uIGZvciBzZXR0aW5nIHRob3NlIGJpdHMuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgdGhlIGFkZHJlc3Mgb2YgdGhlIG9iamVjdAotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgYml0cwotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IFdvcmQgcHJlcGFyZUF2YWlsYWJsZUJpdHMoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGJ5dGUgYXZhaWxhYmxlIGZvciBtZW1vcnkgbWFuYWdlciB1c2UgaW4gYW4gb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSBhZGRyZXNzIG9mIHRoZSBvYmplY3QKLSAgICogQHBhcmFtIHZhbCB0aGUgbmV3IHZhbHVlIG9mIHRoZSBieXRlCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUF2YWlsYWJsZUJ5dGUoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCwgYnl0ZSB2YWwpOwotICAvKioKLSAgICogUmVhZCB0aGUgYnl0ZSBhdmFpbGFibGUgZm9yIG1lbW9yeSBtYW5hZ2VyIHVzZSBpbiBhbiBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgdGhlIGFkZHJlc3Mgb2YgdGhlIG9iamVjdAotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgYnl0ZQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGJ5dGUgcmVhZEF2YWlsYWJsZUJ5dGUoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGJpdHMgYXZhaWxhYmxlIGZvciBtZW1vcnkgbWFuYWdlciB1c2UgaW4gYW4gb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSBhZGRyZXNzIG9mIHRoZSBvYmplY3QKLSAgICogQHBhcmFtIHZhbCB0aGUgbmV3IHZhbHVlIG9mIHRoZSBiaXRzCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUF2YWlsYWJsZUJpdHNXb3JkKE9iamVjdFJlZmVyZW5jZSBvYmplY3QsIFdvcmQgdmFsKTsKLSAgLyoqCi0gICAqIFJlYWQgdGhlIGJpdHMgYXZhaWxhYmxlIGZvciBtZW1vcnkgbWFuYWdlciB1c2UgaW4gYW4gb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSBhZGRyZXNzIG9mIHRoZSBvYmplY3QKLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGJpdHMKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBXb3JkIHJlYWRBdmFpbGFibGVCaXRzV29yZChPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KTsKLQotICAvKioKLSAgICogR2V0cyB0aGUgb2Zmc2V0IG9mIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBoZWFkZXIgZnJvbSB0aGUgb2JqZWN0Ci0gICAqIHJlZmVyZW5jZSBhZGRyZXNzLiAgWFhYIFRoZSBvYmplY3QgbW9kZWwgLyBtZW1vcnkgbWFuYWdlcgotICAgKiBpbnRlcmZhY2Ugc2hvdWxkIGJlIGltcHJvdmVkIHNvIHRoYXQgdGhlIG1lbW9yeSBtYW5hZ2VyIGRvZXMgbm90Ci0gICAqIG5lZWQgdG8ga25vdyB0aGlzLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBvZmZzZXQsIHJlbGF0aXZlIHRoZSBvYmplY3QgcmVmZXJlbmNlIGFkZHJlc3MKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBPZmZzZXQgR0NfSEVBREVSX09GRlNFVCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsb3dlc3QgYWRkcmVzcyBvZiB0aGUgc3RvcmFnZSBhc3NvY2lhdGVkIHdpdGggYW4gb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSByZWZlcmVuY2UgYWRkcmVzcyBvZiB0aGUgb2JqZWN0Ci0gICAqIEByZXR1cm4gdGhlIGxvd2VzdCBhZGRyZXNzIG9mIHRoZSBvYmplY3QKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBBZGRyZXNzIG9iamVjdFN0YXJ0UmVmKE9iamVjdFJlZmVyZW5jZSBvYmplY3QpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGFkZHJlc3MgZ3VhcmFudGVlZCB0byBiZSBpbnNpZGUgdGhlIHN0b3JhZ2UgYXNzb2NhdGllZAotICAgKiB3aXRoIGFuZCBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHJlZmVyZW5jZSBhZGRyZXNzIG9mIHRoZSBvYmplY3QKLSAgICogQHJldHVybiBhbiBhZGRyZXNzIGluc2lkZSB0aGUgb2JqZWN0Ci0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgQWRkcmVzcyByZWZUb0FkZHJlc3MoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCk7Ci0KLSAgLyoqCi0gICAqIENoZWNrcyBpZiBhIHJlZmVyZW5jZSBvZiB0aGUgZ2l2ZW4gdHlwZSBpbiBhbm90aGVyIG9iamVjdCBpcwotICAgKiBpbmhlcmVudGx5IGFjeWNsaWMuICBUaGUgdHlwZSBpcyBnaXZlbiBhcyBhIFRJQi4KLSAgICoKLSAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIHJlZmVyZW5jZSBvZiB0aGUgdHlwZSBpcwotICAgKiBpbmhlcmVudGx5IGFjeWNsaWMKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQWN5Y2xpYyhPYmplY3RSZWZlcmVuY2UgdHlwZVJlZik7Ci0KLSAgLyoqCi0gICAqIER1bXAgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBhbiBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB3aG9zZSBpbmZvcm1hdGlvbiBpcyB0byBiZSBkdW1wZWQKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGR1bXBPYmplY3QoT2JqZWN0UmVmZXJlbmNlIG9iamVjdCk7Ci0KLSAgLyoKLSAgICogTk9URTogVGhlIGZvbGxvd2luZyBtZXRob2RzIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyBvZiB0aGlzCi0gICAqIGNsYXNzLCBidXQgYXJlIGludGVybmFsIHRvIHRoZSBWTTwtPk1NIGludGVyZmFjZSBnbHVlLCBzbyBhcmUgbmV2ZXIKLSAgICogY2FsbGVkIGJ5IE1NVGsgdXNlcnMuCi0gICAqLwotICAvKiogQHJldHVybiBUaGUgb2Zmc2V0IGZyb20gYXJyYXkgcmVmZXJlbmNlIHRvIGVsZW1lbnQgemVybyAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgT2Zmc2V0IGdldEFycmF5QmFzZU9mZnNldCgpOwotCi0gIC8qCi0gICAqIE5PVEU6IFRoZXNlIG1ldGhvZHMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYnkgYW55dGhpbmcgb3RoZXIgdGhhbiB0aGUKLSAgICogcmVmbGVjdGl2ZSBtZWNoYW5pc21zIGluIG9yZy5tbXRrLnZtLlZNLCBhbmQgYXJlIG5vdCBpbXBsZW1lbnRlZCBieQotICAgKiBzdWJjbGFzc2VzLgotICAgKgotICAgKiBUaGlzIGhhY2sgZXhpc3RzIG9ubHkgdG8gYWxsb3cgdXMgdG8gZGVjbGFyZSB0aGUgcmVzcGVjdGl2ZQotICAgKiBtZXRob2RzIGFzIHByb3RlY3RlZC4KLSAgICovCi0gIHN0YXRpYyBPZmZzZXQgYXJyYXlCYXNlT2Zmc2V0VHJhcGRvb3IoT2JqZWN0TW9kZWwgbykgewotICAgIHJldHVybiBvLmdldEFycmF5QmFzZU9mZnNldCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3ZtL1JlZmVyZW5jZVByb2Nlc3Nvci5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay92bS9SZWZlcmVuY2VQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNjMjU1ZS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3ZtL1JlZmVyZW5jZVByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnZtOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5UcmFjZUxvY2FsOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS5VbmludGVycnVwdGlibGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBtYW5hZ2VzIFNvZnRSZWZlcmVuY2VzLCBXZWFrUmVmZXJlbmNlcywgYW5kCi0gKiBQaGFudG9tUmVmZXJlbmNlcy4KLSAqLwotQFVuaW50ZXJydXB0aWJsZQotcHVibGljIGFic3RyYWN0IGNsYXNzIFJlZmVyZW5jZVByb2Nlc3NvciB7Ci0KLSAgcHVibGljIGVudW0gU2VtYW50aWNzIHsgU09GVCwgV0VBSywgUEhBTlRPTSB9Ci0KLSAgLyoqCi0gICAqIENsZWFyIHRoZSBjb250ZW50cyBvZiB0aGUgdGFibGUuIFRoaXMgaXMgY2FsbGVkIHdoZW4gcmVmZXJlbmNlIHR5cGVzIGFyZQotICAgKiBkaXNhYmxlZCB0byBtYWtlIGl0IGVhc2llciBmb3IgVk1zIHRvIGNoYW5nZSB0aGlzIHNldHRpbmcgYXQgcnVudGltZS4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsZWFyKCk7Ci0KLSAgLyoqCi0gICAqIFNjYW4gdGhyb3VnaCB0aGUgbGlzdCBvZiByZWZlcmVuY2VzLgotICAgKgotICAgKiBAcGFyYW0gdHJhY2UgdGhlIHRocmVhZCBsb2NhbCB0cmFjZSBlbGVtZW50LgotICAgKiBAcGFyYW0gbnVyc2VyeSB0cnVlIGlmIGl0IGlzIHNhZmUgdG8gb25seSBzY2FuIG5ldyByZWZlcmVuY2VzLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgc2NhbihUcmFjZUxvY2FsIHRyYWNlLCBib29sZWFuIG51cnNlcnkpOwotCi0gIC8qKgotICAgKiBJdGVyYXRlIG92ZXIgYWxsIHJlZmVyZW5jZXMgYW5kIGZvcndhcmQuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmb3J3YXJkKFRyYWNlTG9jYWwgdHJhY2UsIGJvb2xlYW4gbnVyc2VyeSk7Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiByZWZlcmVuY2VzIG9iamVjdHMgb24gdGhlIHF1ZXVlCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgaW50IGNvdW50V2FpdGluZ1JlZmVyZW5jZXMoKTsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vU2Nhbm5pbmcuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vU2Nhbm5pbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDExOWRiNS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3ZtL1NjYW5uaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnZtOwotCi1pbXBvcnQgb3JnLm1tdGsucGxhbi5UcmFjZUxvY2FsOwotaW1wb3J0IG9yZy5tbXRrLnBsYW4uVHJhbnNpdGl2ZUNsb3N1cmU7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Db25zdGFudHM7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuVW5pbnRlcnJ1cHRpYmxlOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLQotQFVuaW50ZXJydXB0aWJsZSBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2Nhbm5pbmcgaW1wbGVtZW50cyBDb25zdGFudHMgewotICAvKioKLSAgICogRGVsZWdhdGVkIHNjYW5uaW5nIG9mIGEgb2JqZWN0LCBwcm9jZXNzaW5nIGVhY2ggcG9pbnRlciBmaWVsZAotICAgKiBlbmNvdW50ZXJlZC4KLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIHNjYW5uZWQuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzY2FuT2JqZWN0KFRyYW5zaXRpdmVDbG9zdXJlIHRyYWNlLCBPYmplY3RSZWZlcmVuY2Ugb2JqZWN0KTsKLQotICAvKioKLSAgICogSW52b2tlIGEgc3BlY2lhbGl6ZWQgc2NhbiBtZXRob2QuIE5vdGUgdGhhdCB0aGVzZSBtZXRob2RzIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZAotICAgKiBleHBsaWNpdGx5IHRocm91Z2ggUGxhbiBhbmQgUGxhbkNvbnN0cmFpbnRzLgotICAgKgotICAgKiBAcGFyYW0gaWQgVGhlIHNwZWNpYWxpemVkIG1ldGhvZCBpZAotICAgKiBAcGFyYW0gdHJhY2UgVGhlIHRyYWNlIHRoZSBtZXRob2QgaGFzIGJlZW4gc3BlY2lhbGl6ZWQgZm9yCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBiZSBzY2FubmVkCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzcGVjaWFsaXplZFNjYW5PYmplY3QoaW50IGlkLCBUcmFuc2l0aXZlQ2xvc3VyZSB0cmFjZSwgT2JqZWN0UmVmZXJlbmNlIG9iamVjdCk7Ci0KLSAgLyoqCi0gICAqIERlbGVnYXRlZCBwcmVjb3B5aW5nIG9mIGEgb2JqZWN0J3MgY2hpbGRyZW4sIHByb2Nlc3NpbmcgZWFjaCBwb2ludGVyIGZpZWxkCi0gICAqIGVuY291bnRlcmVkLgotICAgKgotICAgKiBAcGFyYW0gdHJhY2UgVGhlIHRyYWNlIG9iamVjdCB0byB1c2UgZm9yIHByZWNvcHlpbmcuCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBiZSBzY2FubmVkLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgcHJlY29weUNoaWxkcmVuKFRyYWNlTG9jYWwgdHJhY2UsIE9iamVjdFJlZmVyZW5jZSBvYmplY3QpOwotCi0gIC8qKgotICAgKiBQcmVwYXJlcyBmb3IgdXNpbmcgdGhlIDxjb2RlPmNvbXB1dGVBbGxSb290czwvY29kZT4gbWV0aG9kLiAgVGhlCi0gICAqIHRocmVhZCBjb3VudGVyIGFsbG93cyBtdWx0aXBsZSBHQyB0aHJlYWRzIHRvIGNvLW9wZXJhdGl2ZWx5Ci0gICAqIGl0ZXJhdGUgdGhyb3VnaCB0aGUgdGhyZWFkIGRhdGEgc3RydWN0dXJlIChpZiBsb2FkIGJhbGFuY2luZwotICAgKiBwYXJhbGxlbCBHQyB0aHJlYWRzIHdlcmUgbm90IGltcG9ydGFudCwgdGhlIHRocmVhZCBjb3VudGVyIGNvdWxkCi0gICAqIHNpbXBseSBiZSByZXBsYWNlZCBieSBhIGZvciBsb29wKS4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlc2V0VGhyZWFkQ291bnRlcigpOwotCi0gIC8qKgotICAgKiBQcmUtY29weSBhbGwgcG90ZW50aWFsbHkgbW92YWJsZSBpbnN0YW5jZXMgdXNlZCBpbiB0aGUgY291cnNlIG9mCi0gICAqIEdDLiAgVGhpcyBpbmNsdWRlcyB0aGUgdGhyZWFkIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSBHQyB0aHJlYWRzCi0gICAqIHRoZW1zZWx2ZXMuICBJdCBpcyBjcnVjaWFsIHRoYXQgdGhlc2UgaW5zdGFuY2VzIGFyZSBmb3J3YXJkZWQKLSAgICogPGk+cHJpb3I8L2k+IHRvIHRoZSBHQyBwcm9wZXIuICBTaW5jZSB0aGVzZSBpbnN0YW5jZXMgPGk+YXJlCi0gICAqIG5vdDwvaT4gZW5xdWV1ZWQgZm9yIHNjYW5uaW5nLCBpdCBpcyBpbXBvcnRhbnQgdGhhdCB3aGVuIHJvb3RzCi0gICAqIGFyZSBjb21wdXRlZCB0aGUgc2FtZSBpbnN0YW5jZXMgYXJlIGV4cGxpY2l0bHkgc2Nhbm5lZCBhbmQKLSAgICogaW5jbHVkZWQgaW4gdGhlIHNldCBvZiByb290cy4gIFRoZSBleGlzdGVuY2Ugb2YgdGhpcyBtZXRob2QKLSAgICogYWxsb3dzIHRoZSBhY3Rpb25zIG9mIGNhbGN1bGF0aW5nIHJvb3RzIGFuZCBmb3J3YXJkaW5nIEdDCi0gICAqIGluc3RhbmNlcyB0byBiZSBkZWNvdXBsZWQuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwcmVDb3B5R0NJbnN0YW5jZXMoVHJhY2VMb2NhbCB0cmFjZSk7Ci0KLSAgLyoqCi0gICAqIENvbXB1dGVzIHN0YXRpYyByb290cy4gIFRoaXMgbWV0aG9kIGVzdGFibGlzaGVzIGFsbCBzdWNoIHJvb3RzIGZvcgotICAgKiBjb2xsZWN0aW9uIGFuZCBwbGFjZXMgdGhlbSBpbiB0aGUgcm9vdCBsb2NhdGlvbnMgcXVldWUuICBUaGlzIG1ldGhvZAotICAgKiBzaG91bGQgbm90IGhhdmUgc2lkZSBlZmZlY3RzIChzdWNoIGFzIGNvcHlpbmcgb3IgZm9yd2FyZGluZyBvZgotICAgKiBvYmplY3RzKS4gIFRoZXJlIGFyZSBhIG51bWJlciBvZiBpbXBvcnRhbnQgcHJlY29uZGl0aW9uczoKLSAgICoKLSAgICogPHVsPgotICAgKiA8bGk+IEFsbCBvYmplY3RzIHVzZWQgaW4gdGhlIGNvdXJzZSBvZiBHQyAoc3VjaCBhcyB0aGUgR0MgdGhyZWFkCi0gICAqIG9iamVjdHMpIG5lZWQgdG8gYmUgInByZS1jb3BpZWQiIHByaW9yIHRvIGNhbGxpbmcgdGhpcyBtZXRob2QuCi0gICAqIDxsaT4gVGhlIDxjb2RlPnRocmVhZENvdW50ZXI8L2NvZGU+IG11c3QgYmUgcmVzZXQgc28gdGhhdCBsb2FkCi0gICAqIGJhbGFuY2luZyBwYXJhbGxlbCBHQyBjYW4gc2hhcmUgdGhlIHdvcmsgb2Ygc2Nhbm5pbmcgdGhyZWFkcy4KLSAgICogPC91bD4KLSAgICoKLSAgICogQHBhcmFtIHRyYWNlIFRoZSB0cmFjZSB0byB1c2UgZm9yIGNvbXB1dGluZyByb290cy4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNvbXB1dGVTdGF0aWNSb290cyhUcmFjZUxvY2FsIHRyYWNlKTsKLQotICAvKioKLSAgICogQ29tcHV0ZXMgZ2xvYmFsIHJvb3RzLiAgVGhpcyBtZXRob2QgZXN0YWJsaXNoZXMgYWxsIHN1Y2ggcm9vdHMgZm9yCi0gICAqIGNvbGxlY3Rpb24gYW5kIHBsYWNlcyB0aGVtIGluIHRoZSByb290IGxvY2F0aW9ucyBxdWV1ZS4gIFRoaXMgbWV0aG9kCi0gICAqIHNob3VsZCBub3QgaGF2ZSBzaWRlIGVmZmVjdHMgKHN1Y2ggYXMgY29weWluZyBvciBmb3J3YXJkaW5nIG9mCi0gICAqIG9iamVjdHMpLiAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGltcG9ydGFudCBwcmVjb25kaXRpb25zOgotICAgKgotICAgKiA8dWw+Ci0gICAqIDxsaT4gQWxsIG9iamVjdHMgdXNlZCBpbiB0aGUgY291cnNlIG9mIEdDIChzdWNoIGFzIHRoZSBHQyB0aHJlYWQKLSAgICogb2JqZWN0cykgbmVlZCB0byBiZSAicHJlLWNvcGllZCIgcHJpb3IgdG8gY2FsbGluZyB0aGlzIG1ldGhvZC4KLSAgICogPGxpPiBUaGUgPGNvZGU+dGhyZWFkQ291bnRlcjwvY29kZT4gbXVzdCBiZSByZXNldCBzbyB0aGF0IGxvYWQKLSAgICogYmFsYW5jaW5nIHBhcmFsbGVsIEdDIGNhbiBzaGFyZSB0aGUgd29yayBvZiBzY2FubmluZyB0aHJlYWRzLgotICAgKiA8L3VsPgotICAgKgotICAgKiBAcGFyYW0gdHJhY2UgVGhlIHRyYWNlIHRvIHVzZSBmb3IgY29tcHV0aW5nIHJvb3RzLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgY29tcHV0ZUdsb2JhbFJvb3RzKFRyYWNlTG9jYWwgdHJhY2UpOwotCi0gIC8qKgotICAgKiBDb21wdXRlcyByb290cyBwb2ludGVkIHRvIGJ5IHRocmVhZHMsIHRoZWlyIGFzc29jaWF0ZWQgcmVnaXN0ZXJzCi0gICAqIGFuZCBzdGFja3MuICBUaGlzIG1ldGhvZCBwbGFjZXMgdGhlc2Ugcm9vdHMgaW4gdGhlIHJvb3QgdmFsdWVzLAotICAgKiByb290IGxvY2F0aW9ucyBhbmQgaW50ZXJpb3Igcm9vdCBsb2NhdGlvbnMgcXVldWVzLiAgVGhpcyBtZXRob2QKLSAgICogc2hvdWxkIG5vdCBoYXZlIHNpZGUgZWZmZWN0cyAoc3VjaCBhcyBjb3B5aW5nIG9yIGZvcndhcmRpbmcgb2YKLSAgICogb2JqZWN0cykuICBUaGVyZSBhcmUgYSBudW1iZXIgb2YgaW1wb3J0YW50IHByZWNvbmRpdGlvbnM6Ci0gICAqCi0gICAqIDx1bD4KLSAgICogPGxpPiBBbGwgb2JqZWN0cyB1c2VkIGluIHRoZSBjb3Vyc2Ugb2YgR0MgKHN1Y2ggYXMgdGhlIEdDIHRocmVhZAotICAgKiBvYmplY3RzKSBuZWVkIHRvIGJlICJwcmUtY29waWVkIiBwcmlvciB0byBjYWxsaW5nIHRoaXMgbWV0aG9kLgotICAgKiA8bGk+IFRoZSA8Y29kZT50aHJlYWRDb3VudGVyPC9jb2RlPiBtdXN0IGJlIHJlc2V0IHNvIHRoYXQgbG9hZAotICAgKiBiYWxhbmNpbmcgcGFyYWxsZWwgR0MgY2FuIHNoYXJlIHRoZSB3b3JrIG9mIHNjYW5uaW5nIHRocmVhZHMuCi0gICAqIDwvdWw+Ci0gICAqCi0gICAqIEBwYXJhbSB0cmFjZSBUaGUgdHJhY2UgdG8gdXNlIGZvciBjb21wdXRpbmcgcm9vdHMuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjb21wdXRlVGhyZWFkUm9vdHMoVHJhY2VMb2NhbCB0cmFjZSk7Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgYWxsIHJvb3RzIG91dCBvZiB0aGUgVk0ncyBib290IGltYWdlIChpZiBhbnkpLiAgVGhpcyBtZXRob2QgaXMgYSBuby1vcAotICAgKiBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgVk0gZG9lcyBub3QgbWFpbnRhaW4gYW4gTU1Uay12aXNpYmxlIEphdmEgc3BhY2UuICAgSG93ZXZlciwKLSAgICogd2hlbiB0aGUgVk0gZG9lcyBtYWludGFpbiBhIHNwYWNlIChzdWNoIGFzIGEgYm9vdCBpbWFnZSkgd2hpY2ggaXMgdmlzaWJsZSB0byBNTVRrLAotICAgKiB0aGF0IHNwYWNlIGNvdWxkIGVpdGhlciBiZSBzY2FubmVkIGJ5IE1NVGsgYXMgcGFydCBvZiBpdHMgdHJhbnNpdGl2ZSBjbG9zdXJlIG92ZXIKLSAgICogdGhlIHdob2xlIGhlYXAsIG9yIGFzIGEgKGNvbnNpZGVyYWJsZSkgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLCBNTVRrIGNvdWxkIGF2b2lkCi0gICAqIHNjYW5uaW5nIHRoZSBzcGFjZSBpZiBpdCBpcyBhd2FyZSBvZiBhbGwgcG9pbnRlcnMgb3V0IG9mIHRoYXQgc3BhY2UuICBUaGlzIG1ldGhvZAotICAgKiBpcyB1c2VkIHRvIGVzdGFibGlzaCB0aGUgcm9vdCBzZXQgb3V0IG9mIHRoZSBzY2FubmFibGUgc3BhY2UgaW4gdGhlIGNhc2Ugd2hlcmUKLSAgICogc3VjaCBhIHNwYWNlIGV4aXN0cy4KLSAgICoKLSAgICogQHBhcmFtIHRyYWNlIFRoZSB0cmFjZSBvYmplY3QgdG8gdXNlIHRvIHJlcG9ydCByb290IGxvY2F0aW9ucy4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNvbXB1dGVCb290SW1hZ2VSb290cyhUcmFjZUxvY2FsIHRyYWNlKTsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vU3RhdGlzdGljcy5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay92bS9TdGF0aXN0aWNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiM2FlMjMuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay92bS9TdGF0aXN0aWNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudm07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuSW50ZXJydXB0aWJsZTsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuVW5pbnRlcnJ1cHRpYmxlOwotCi0KLUBVbmludGVycnVwdGlibGUKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdGF0aXN0aWNzIHsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjb2xsZWN0aW9ucyB0aGF0IGhhdmUgb2NjdXJyZWQuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBjb2xsZWN0aW9ucyB0aGF0IGhhdmUgb2NjdXJyZWQuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldENvbGxlY3Rpb25Db3VudCgpOwotCi0gIC8qKgotICAgKiBSZWFkIGN5Y2xlIGNvdW50ZXIKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBsb25nIG5hbm9UaW1lKCk7Ci0KLSAgLyoqCi0gICAqIENvbnZlcnQgbmFub3NlY29uZHMgdG8gbWlsbGlzZWNvbmRzCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIG5hbm9zVG9NaWxsaXMobG9uZyBjKTsKLQotICAvKioKLSAgICogQ29udmVydCBuYW5vc2Vjb25kcyB0byBzZWNvbmRzCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIG5hbm9zVG9TZWNzKGxvbmcgYyk7Ci0KLSAgLyoqCi0gICAqIENvbnZlcnQgbWlsbGlzZWNvbmRzIHRvIG5hbm9zZWNvbmRzCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgbG9uZyBtaWxsaXNUb05hbm9zKGRvdWJsZSB0KTsKLQotICAvKioKLSAgICogQ29udmVydCBzZWNvbmRzIHRvIG5hbm9zZWNvbmRzCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgbG9uZyBzZWNzVG9OYW5vcyhkb3VibGUgdCk7Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGhlIGN5Y2xlIGNvdW50ZXIKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBsb25nIGN5Y2xlcygpOwotCi0gIC8qKgotICAgKiBJbml0aWFsaXplIHBlcmZvcm1hbmNlIGV2ZW50cwotICAgKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHVibGljIGFic3RyYWN0IHZvaWQgcGVyZkV2ZW50SW5pdChTdHJpbmcgZXZlbnRzKTsKLQotICAvKioKLSAgICogUmVhZCBhIHBlcmZvcm1hbmNlIGV2ZW50IHZhbHVlCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwZXJmRXZlbnRSZWFkKGludCBjb3VudGVyLCBsb25nW10gdmFsdWVzKTsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vU3RyaW5ncy5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay92bS9TdHJpbmdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZmEwMzMuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay92bS9TdHJpbmdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudm07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuVW5pbnRlcnJ1cHRpYmxlOwotCi0KLUBVbmludGVycnVwdGlibGUgcHVibGljIGFic3RyYWN0IGNsYXNzIFN0cmluZ3MgewotICAvKioKLSAgICogTG9nIGEgbWVzc2FnZS4KLSAgICoKLSAgICogQHBhcmFtIGMgY2hhcmFjdGVyIGFycmF5IHdpdGggbWVzc2FnZSBzdGFydGluZyBhdCBpbmRleCAwCi0gICAqIEBwYXJhbSBsZW4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gbWVzc2FnZQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGUoY2hhciBbXSBjLCBpbnQgbGVuKTsKLQotICAvKioKLSAgICogTG9nIGEgdGhyZWFkIGlkZW50aWZpZXIgYW5kIGEgbWVzc2FnZS4KLSAgICoKLSAgICogQHBhcmFtIGMgY2hhcmFjdGVyIGFycmF5IHdpdGggbWVzc2FnZSBzdGFydGluZyBhdCBpbmRleCAwCi0gICAqIEBwYXJhbSBsZW4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gbWVzc2FnZQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVUaHJlYWRJZChjaGFyIFtdIGMsIGludCBsZW4pOwotCi0gIC8qKgotICAgKiBDb3BpZXMgY2hhcmFjdGVycyBmcm9tIHRoZSBzdHJpbmcgaW50byB0aGUgY2hhcmFjdGVyIGFycmF5LgotICAgKiBUaHJlYWQgc3dpdGNoaW5nIGlzIGRpc2FibGVkIGR1cmluZyB0aGlzIG1ldGhvZCdzIGV4ZWN1dGlvbi4KLSAgICogPHA+Ci0gICAqIDxiPlRPRE86PC9iPiBUaGVyZSBhcmUgc3BlY2lhbCBtZW1vcnkgbWFuYWdlbWVudCBzZW1hbnRpY3MgaGVyZSB0aGF0Ci0gICAqIHNvbWVvbmUgc2hvdWxkIGRvY3VtZW50LgotICAgKgotICAgKiBAcGFyYW0gc3JjIHRoZSBzb3VyY2Ugc3RyaW5nCi0gICAqIEBwYXJhbSBkc3QgdGhlIGRlc3RpbmF0aW9uIGFycmF5Ci0gICAqIEBwYXJhbSBkc3RCZWdpbiB0aGUgc3RhcnQgb2Zmc2V0IGluIHRoZSBkZXNpbmF0aW9uIGFycmF5Ci0gICAqIEBwYXJhbSBkc3RFbmQgdGhlIGluZGV4IGFmdGVyIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUKLSAgICogZGVzdGluYXRpb24gdG8gY29weSB0bwotICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBjb3BpZWQuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgaW50IGNvcHlTdHJpbmdUb0NoYXJzKFN0cmluZyBzcmMsIGNoYXIgW10gZHN0LAotICAgICAgaW50IGRzdEJlZ2luLCBpbnQgZHN0RW5kKTsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vU3luY2hyb25pemVkQ291bnRlci5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay92bS9TeW5jaHJvbml6ZWRDb3VudGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMjcyYTguLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay92bS9TeW5jaHJvbml6ZWRDb3VudGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudm07Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuVW5pbnRlcnJ1cHRpYmxlOwotCi0KLS8qKgotICogQSBjb3VudGVyIHRoYXQgc3VwcG9ydHMgYXRvbWljIGluY3JlbWVudCBhbmQgcmVzZXQuCi0gKi8KLUBVbmludGVycnVwdGlibGUgcHVibGljIGFic3RyYWN0IGNsYXNzIFN5bmNocm9uaXplZENvdW50ZXIgewotCi0gIC8qKgotICAgKiBSZXNldCB0aGUgY291bnRlciB0byAwLCByZXR1cm5pbmcgaXRzIHByZXZpb3VzIHZhbHVlLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgY291bnRlciwgcHJpb3IgdG8gcmVzZXQuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgaW50IHJlc2V0KCk7Ci0KLSAgLyoqCi0gICAqIEFkZHMgMSB0byB0aGUgY291bnRlci4KLSAgICoKLSAgICogQHJldHVybiB0aGUgdmFsdWUgYmVmb3JlIHRoZSBhZGQKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBpbnQgaW5jcmVtZW50KCk7Ci0KLSAgLyoqCi0gICAqIFBlZWsgYXQgdGhlIGNvdW50ZXIKLSAgICoKLSAgICogQHJldHVybiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgY291bnRlci4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBpbnQgcGVlaygpOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay92bS9UcmFjZUludGVyZmFjZS5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay92bS9UcmFjZUludGVyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmRhM2NiLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vVHJhY2VJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay52bTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBDbGFzcyB0aGF0IHN1cHBvcnRzIHNjYW5uaW5nIE9iamVjdHMgb3IgQXJyYXlzIGZvciByZWZlcmVuY2VzCi0gKiBkdXJpbmcgdHJhY2luZywgaGFuZGxpbmcgdGhvc2UgcmVmZXJlbmNlcywgYW5kIGNvbXB1dGluZyBkZWF0aCB0aW1lcwotICovCi1AVW5pbnRlcnJ1cHRpYmxlIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmFjZUludGVyZmFjZSB7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogUHVibGljIE1ldGhvZHMKLSAgICovCi0KLSAgLyoqCi0gICAqIFJldHVybnMgaWYgdGhlIFZNIGlzIHJlYWR5IGZvciBhIGdhcmJhZ2UgY29sbGVjdGlvbi4KLSAgICoKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBWTSBpcyByZWFkeSBmb3IgR0MsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdjRW5hYmxlZCgpOwotCi0gIC8qKgotICAgKiBUaGlzIGFkanVzdHMgdGhlIG9mZnNldCBpbnRvIGFuIG9iamVjdCB0byByZWZsZWN0IHdoYXQgaXQgd291bGQgbG9vayBsaWtlCi0gICAqIGlmIHRoZSBmaWVsZHMgd2VyZSBsYWlkIG91dCBpbiBtZW1vcnkgc3BhY2UgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIG9iamVjdAotICAgKiBwb2ludGVyLgotICAgKgotICAgKiBAcGFyYW0gaXNTY2FsYXIgSWYgdGhpcyBpcyBhIHBvaW50ZXIgc3RvcmUgdG8gYSBzY2FsYXIgb2JqZWN0Ci0gICAqIEBwYXJhbSBzcmMgVGhlIGFkZHJlc3Mgb2YgdGhlIHNvdXJjZSBvYmplY3QKLSAgICogQHBhcmFtIHNsb3QgVGhlIGFkZHJlc3Mgd2l0aGluIDxjb2RlPnNyYzwvY29kZT4gaW50byB3aGljaAotICAgKiB0aGUgdXBkYXRlIHdpbGwgYmUgc3RvcmVkCi0gICAqIEByZXR1cm4gVGhlIGVhc3kgdG8gdW5kZXJzdGFuZCBvZmZzZXQgb2YgdGhlIHNsb3QKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBPZmZzZXQgYWRqdXN0U2xvdE9mZnNldChib29sZWFuIGlzU2NhbGFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFJlZmVyZW5jZSBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBzbG90KTsKLQotICAvKioKLSAgICogVGhpcyBza2lwcyBvdmVyIHRoZSBmcmFtZXMgYWRkZWQgYnkgdGhlIHRyYWNpbmcgYWxnb3JpdGhtLCBvdXRwdXRzCi0gICAqIGluZm9ybWF0aW9uIGlkZW50aWZ5aW5nIHRoZSBtZXRob2QgdGhlIGNvbnRhaW50cyB0aGUgIm5ldyIgY2FsbCB0cmlnZ2VyaW5nCi0gICAqIHRoZSBhbGxvY2F0aW9uLCBhbmQgcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3Qgbm9uLXRyYWNlLCBub24tYWxsb2MKLSAgICogc3RhY2sgZnJhbWUuCi0gICAqCi0gICAqQHBhcmFtIHR5cGVSZWYgVGhlIHR5cGUgcmVmZXJlbmNlICh0aWIpIG9mIHRoZSBvYmplY3QganVzdCBhbGxvY2F0ZWQKLSAgICogQHJldHVybiBUaGUgZnJhbWUgcG9pbnRlciBhZGRyZXNzIGZvciB0aGUgbWV0aG9kIHRoYXQgYWxsb2NhdGVkIHRoZSBvYmplY3QKLSAgICovCi0gIEBJbnRlcnJ1cHRpYmxlCi0gIHB1YmxpYyBhYnN0cmFjdCBBZGRyZXNzIHNraXBPd25GcmFtZXNBbmREdW1wKE9iamVjdFJlZmVyZW5jZSB0eXBlUmVmKTsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogV3JhcHBlciBtZXRob2RzCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVEZWF0aFRpbWUoT2JqZWN0UmVmZXJlbmNlIG9iaik7Ci0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldERlYXRoVGltZShPYmplY3RSZWZlcmVuY2UgcmVmLCBXb3JkIHRpbWVfKTsKLSAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TGluayhPYmplY3RSZWZlcmVuY2UgcmVmLCBPYmplY3RSZWZlcmVuY2UgbGluayk7Ci0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHVwZGF0ZVRpbWUoV29yZCB0aW1lXyk7Ci0gIHB1YmxpYyBhYnN0cmFjdCBXb3JkIGdldE9JRChPYmplY3RSZWZlcmVuY2UgcmVmKTsKLSAgcHVibGljIGFic3RyYWN0IFdvcmQgZ2V0RGVhdGhUaW1lKE9iamVjdFJlZmVyZW5jZSByZWYpOwotICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0UmVmZXJlbmNlIGdldExpbmsoT2JqZWN0UmVmZXJlbmNlIHJlZik7Ci0gIHB1YmxpYyBhYnN0cmFjdCBBZGRyZXNzIGdldEJvb3RJbWFnZUxpbmsoKTsKLSAgcHVibGljIGFic3RyYWN0IFdvcmQgZ2V0T0lEKCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE9JRChXb3JkIG9pZCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0SGVhZGVyU2l6ZSgpOwotICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEhlYWRlckVuZE9mZnNldCgpOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay92bS9WTS5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay92bS9WTS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjVjNjA5Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vVk0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NiArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudm07Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lm9wdGlvbnMuT3B0aW9uczsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lmdjc3B5LkNvbG9yOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZ2NzcHkuZHJpdmVycy5BYnN0cmFjdERyaXZlcjsKLWltcG9ydCBvcmcubW10ay52bS5nY3NweS5CeXRlU3RyZWFtOwotaW1wb3J0IG9yZy5tbXRrLnZtLmdjc3B5LkludFN0cmVhbTsKLWltcG9ydCBvcmcubW10ay52bS5nY3NweS5TZXJ2ZXJJbnRlcnByZXRlcjsKLWltcG9ydCBvcmcubW10ay52bS5nY3NweS5TZXJ2ZXJTcGFjZTsKLWltcG9ydCBvcmcubW10ay52bS5nY3NweS5TaG9ydFN0cmVhbTsKLWltcG9ydCBvcmcubW10ay52bS5nY3NweS5VdGlsOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS5VbnRyYWNlZDsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLkFkZHJlc3M7Ci1pbXBvcnQgb3JnLnZtbWFnaWMudW5ib3hlZC5PZmZzZXQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgYWxsIFZNLXNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgcmVxdWlyZWQKLSAqIGJ5IE1NVGsuPHA+Ci0gKgotICogVGhlIGNsYXNzIGhhcyB0aHJlZSBtYWpvciBlbGVtZW50cy4gIEZpcnN0IGl0IGRlZmluZXMgVk0tc3BlY2lmaWMKLSAqIGNvbnN0YW50cyB3aGljaCBhcmUgdXNlZCB0aHJvdWdob3V0IE1NVGssIHNlY29uZCwgaXQgZGVjbGFyZXMKLSAqIHNpbmdsZXRvbiBpbnN0YW5jZXMgb2YgZWFjaCBvZiB0aGUgYWJzdHJhY3QgY2xhc3NlcyBpbiB0aGlzCi0gKiBwYWNrYWdlLCBhbmQgdGhpcmQsIGl0IHByb3ZpZGVzIGZhY3RvcnkgbWV0aG9kcyBmb3IgVk0tc3BlY2lmaWMKLSAqIGluc3RhbmNlcyB3aGljaCBhcmUgbmVlZGVkIGJ5IE1NVGsgKHN1Y2ggYXMgPGNvZGU+TG9jazwvY29kZT4pLjxwPgotICoKLSAqIEJvdGggdGhlIGNvbnN0YW50cyBhbmQgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZXMgYXJlIGluaXRpYWxpemVkIHRvCi0gKiBWTS1zcGVjaWZpYyB2YWx1ZXMgYXQgYnVpbGQgdGltZSB1c2luZyByZWZsZWN0aW9uIGFuZCBhIFZNLXNwZWNpZmljCi0gKiBmYWN0b3J5IGNsYXNzLiBUaGUgc3lzdGVtIHByb3BlcnR5IDxjb2RlPm1tdGsuaG9zdGp2bTwvY29kZT4gaXMKLSAqIGludGVycm9nYXRlZCBhdCBidWlsZCB0aW1lIHRvIGVzdGFibGlzaCBjb25jcmV0ZSBpbnN0YW50YXRpb25zIG9mCi0gKiB0aGUgYWJzdHJhY3QgY2xhc3NlcyBpbiB0aGlzIHBhY2thZ2UuIEJ5IDxiPmNvbnZlbnRpb248L2I+LAotICogPGNvZGU+bW10ay5ob3N0anZtPC9jb2RlPiB3aWxsIGlkZW50aWZ5IGEgVk0tcHJvdmlkZWQgcGFja2FnZSB3aGljaAotICogaW5jbHVkZXMgY29uY3JldGUgaW5zdGFuY2VzIG9mIGVhY2ggb2YgdGhlIGFic3RyYWN0IGNsYXNzZXMsIHdpdGgKLSAqIGVhY2ggY29uY3JldGUgY2xhc3MgaGF2aW5nIHRoZSBzYW1lIGJhc2UgY2xhc3MgbmFtZSAoYnV0IGRpZmZlcmVudAotICogcGFja2FnZSBuYW1lKSBhcyB0aGUgYWJzdHJhY3QgY2xhc3NlcyBkZWZpbmVkIGhlcmUuICBUaGUgY2xhc3MKLSAqIGluaXRpYWxpemVyIGZvciB0aGlzIGNsYXNzIHRoZW4gdXNlcyB0aGUgc3lzdGVtIHByb3BlcnR5Ci0gKiA8Y29kZT5tbXRrLmhvc3Rqdm08L2NvZGU+IHRvIGxvYWQgdGhlIFZNLXNwZWNpZmljIGNvbmNyZXRlIGNsYXNzZXMKLSAqIGFuZCBpbml0aWFsaXplIHRoZSBjb25zdGFudHMgYW5kIHNpbmdsZXRvbnMgZGVmaW5lZCBoZXJlLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVk0gewotICAvKgotICAgKiBWTS1zcGVjaWZpYyBjb25zdGFudCB2YWx1ZXMKLSAgICovCi0gIC8qKiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhc3NlcnRpb25zIHNob3VsZCBiZSB2ZXJpZmllZCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gVkVSSUZZX0FTU0VSVElPTlM7Ci0gIC8qKiBUaGUgbG93ZXN0IGFkZHJlc3MgaW4gdmlydHVhbCBtZW1vcnkga25vd24gdG8gTU1UayAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEFkZHJlc3MgSEVBUF9TVEFSVDsKLSAgLyoqIFRoZSBoaWdoZXN0IGFkZHJlc3MgaW4gdmlydHVhbCBtZW1vcnkga25vd24gdG8gTU1UayAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEFkZHJlc3MgSEVBUF9FTkQ7Ci0gIC8qKiBUaGUgbG93ZXN0IGFkZHJlc3MgaW4gdGhlIGNvbnRpZ3VvdXNseSBhdmFpbGFibGUgbWVtb3J5IGF2YWlsYWJsZSB0byBNTVRrICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQWRkcmVzcyBBVkFJTEFCTEVfU1RBUlQ7Ci0gIC8qKiBUaGUgaGlnaGVzdCBhZGRyZXNzIGluIHRoZSBjb250aWd1b3VzbHkgYXZhaWxhYmxlIG1lbW9yeSBhdmFpbGFibGUgdG8gTU1UayAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEFkZHJlc3MgQVZBSUxBQkxFX0VORDsKLSAgLyoqIFRoZSBsb2cgYmFzZSB0d28gb2YgdGhlIHNpemUgb2YgYW4gYWRkcmVzcyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTE9HX0JZVEVTX0lOX0FERFJFU1M7Ci0gIC8qKiBUaGUgbG9nIGJhc2UgdHdvIG9mIHRoZSBzaXplIG9mIGEgd29yZCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTE9HX0JZVEVTX0lOX1dPUkQ7Ci0gIC8qKiBUaGUgbG9nIGJhc2UgdHdvIG9mIHRoZSBzaXplIG9mIGFuIE9TIHBhZ2UgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIExPR19CWVRFU19JTl9QQUdFOwotICAvKiogVGhlIGxvZyBiYXNlIHR3byBvZiB0aGUgbWluaW11bSBhbGxvY2F0aW9uIGFsaWdubWVudCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTE9HX01JTl9BTElHTk1FTlQ7Ci0gIC8qKiBUaGUgbG9nIGJhc2UgdHdvIG9mIChNQVhfQUxJR05NRU5UL01JTl9BTElHTk1FTlQpICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBNQVhfQUxJR05NRU5UX1NISUZUOwotICAvKiogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIG9mIHBhZGRpbmcgdG8gcHJlcGVuZCB0byBhbiBvYmplY3QgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0JZVEVTX1BBRERJTkc7Ci0gIC8qKiBUaGUgdmFsdWUgdG8gc3RvcmUgaW4gYWxpZ25tZW50IGhvbGVzICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMSUdOTUVOVF9WQUxVRTsKLSAgLyoqIFRoZSBvZmZzZXQgZnJvbSBhbiBhcnJheSByZWZlcmVuY2UgdG8gZWxlbWVudCB6ZXJvICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgT2Zmc2V0IEFSUkFZX0JBU0VfT0ZGU0VUOwotICAvKiogR2xvYmFsIGRlYnVnZ2luZyBzd2l0Y2ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCi0gIC8qCi0gICAqIFZNLXNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgY2FwdHVyZWQgaW4gYSBzZXJpZXMgb2Ygc2luZ2xldG9uIGNsYXNzcwotICAgKi8KLSAgQFVudHJhY2VkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQWN0aXZlUGxhbiBhY3RpdmVQbGFuOwotICBAVW50cmFjZWQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBBc3NlcnQgYXNzZXJ0aW9uczsKLSAgQFVudHJhY2VkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQmFycmllcnMgYmFycmllcnM7Ci0gIEBVbnRyYWNlZAotICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gY29sbGVjdGlvbjsKLSAgQFVudHJhY2VkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29uZmlnIGNvbmZpZzsKLSAgQFVudHJhY2VkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgTWVtb3J5IG1lbW9yeTsKLSAgQFVudHJhY2VkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0TW9kZWwgb2JqZWN0TW9kZWw7Ci0gIEBVbnRyYWNlZAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFJlZmVyZW5jZVByb2Nlc3NvciB3ZWFrUmVmZXJlbmNlczsKLSAgQFVudHJhY2VkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgUmVmZXJlbmNlUHJvY2Vzc29yIHNvZnRSZWZlcmVuY2VzOwotICBAVW50cmFjZWQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBSZWZlcmVuY2VQcm9jZXNzb3IgcGhhbnRvbVJlZmVyZW5jZXM7Ci0gIEBVbnRyYWNlZAotICBwdWJsaWMgc3RhdGljIGZpbmFsIEZpbmFsaXphYmxlUHJvY2Vzc29yIGZpbmFsaXphYmxlUHJvY2Vzc29yOwotICBAVW50cmFjZWQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2FubmluZyBzY2FubmluZzsKLSAgQFVudHJhY2VkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RhdGlzdGljcyBzdGF0aXN0aWNzOwotICBAVW50cmFjZWQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdzIHN0cmluZ3M7Ci0gIEBVbnRyYWNlZAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFRyYWNlSW50ZXJmYWNlIHRyYWNlSW50ZXJmYWNlOwotICBAVW50cmFjZWQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBNTVRrX0V2ZW50cyBldmVudHM7Ci0gIEBVbnRyYWNlZAotICBwdWJsaWMgc3RhdGljIGZpbmFsIERlYnVnIGRlYnVnZ2luZzsKLQotICAvKgotICAgKiBUaGUgcmVtYWluZGVyIGlzIGRvZXMgdGhlIHN0YXRpYyBpbml0aWFsaXphdGlvbiBvZiB0aGUKLSAgICogYWJvdmUsIHJlZmxlY3RpdmVseSBiaW5kaW5nIHRvIHRoZSBhcHByb3ByaWF0ZSBob3N0IGp2bQotICAgKiBjbGFzc2VzLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmFjdG9yeSBmYWN0b3J5OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdm1GYWN0b3J5OwotCi0gIC8qKgotICAgKiBUaGlzIGNsYXNzIGluaXRpYWxpemVyIGVzdGFibGlzaGVzIGEgVk0tc3BlY2lmaWMgZmFjdG9yeSBjbGFzcwotICAgKiB1c2luZyByZWZsZWN0aW9uLCBhbmQgdGhlbiB1c2VzIHRoYXQgdG8gY3JlYXRlIFZNLXNwZWNpZmljIGNvbmNyZXRlCi0gICAqIGluc3RhbmNlcyBvZiBhbGwgb2YgdGhlIHZtIGNsYXNzZXMsIGluaXRpYWxpemluZyB0aGUgc2luZ2x0b25zIGluCi0gICAqIHRoaXMgY2xhc3MuICBGaW5hbGx5IHRoZSBjb25zdGFudHMgZGVjbGFyZWQgaW4gdGhpcyBjbGFzcyBhcmUKLSAgICogaW5pdGlhbGl6ZWQgdXNpbmcgdGhlIFZNLXNwZWNpZmljIHNpbmdsZXRvbnMuCi0gICAqLwotICBzdGF0aWMgewotICAgIC8qIElkZW50aWZ5IHRoZSBWTS1zcGVjaWZpYyBmYWN0b3J5IHVzaW5nIHJlZmxlY3Rpb24gKi8KLSAgICB2bUZhY3RvcnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm1tdGsuaG9zdGp2bSIpOwotICAgIEZhY3RvcnkgeGZhID0gbnVsbDsKLSAgICB0cnkgewotICAgICAgeGZhID0gKEZhY3RvcnkpIENsYXNzLmZvck5hbWUodm1GYWN0b3J5KS5uZXdJbnN0YW5jZSgpOwotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgU3lzdGVtLmV4aXQoLTEpOyAgICAgLy8gd2UgbXVzdCAqbm90KiBnbyBvbiBpZiB0aGUgYWJvdmUgaGFzIGZhaWxlZAotICAgIH0KLSAgICBmYWN0b3J5ID0geGZhOwotCi0gICAgLyogTm93IGluc3RhbnRpYXRlIHRoZSBzaW5nbGV0b25zIHVzaW5nIHRoZSBmYWN0b3J5ICovCi0gICAgYWN0aXZlUGxhbiA9IGZhY3RvcnkubmV3QWN0aXZlUGxhbigpOwotICAgIGFzc2VydGlvbnMgPSBmYWN0b3J5Lm5ld0Fzc2VydCgpOwotICAgIGJhcnJpZXJzID0gZmFjdG9yeS5uZXdCYXJyaWVycygpOwotICAgIGNvbGxlY3Rpb24gPSBmYWN0b3J5Lm5ld0NvbGxlY3Rpb24oKTsKLSAgICBtZW1vcnkgPSBmYWN0b3J5Lm5ld01lbW9yeSgpOwotICAgIG9iamVjdE1vZGVsID0gZmFjdG9yeS5uZXdPYmplY3RNb2RlbCgpOwotICAgIE9wdGlvbnMuc2V0ID0gZmFjdG9yeS5nZXRPcHRpb25TZXQoKTsKLSAgICB3ZWFrUmVmZXJlbmNlcyA9IGZhY3RvcnkubmV3UmVmZXJlbmNlUHJvY2Vzc29yKFJlZmVyZW5jZVByb2Nlc3Nvci5TZW1hbnRpY3MuV0VBSyk7Ci0gICAgc29mdFJlZmVyZW5jZXMgPSBmYWN0b3J5Lm5ld1JlZmVyZW5jZVByb2Nlc3NvcihSZWZlcmVuY2VQcm9jZXNzb3IuU2VtYW50aWNzLlNPRlQpOwotICAgIHBoYW50b21SZWZlcmVuY2VzID0gZmFjdG9yeS5uZXdSZWZlcmVuY2VQcm9jZXNzb3IoUmVmZXJlbmNlUHJvY2Vzc29yLlNlbWFudGljcy5QSEFOVE9NKTsKLSAgICBmaW5hbGl6YWJsZVByb2Nlc3NvciA9IGZhY3RvcnkubmV3RmluYWxpemFibGVQcm9jZXNzb3IoKTsKLSAgICBzY2FubmluZyA9IGZhY3RvcnkubmV3U2Nhbm5pbmcoKTsKLSAgICBzdGF0aXN0aWNzID0gZmFjdG9yeS5uZXdTdGF0aXN0aWNzKCk7Ci0gICAgc3RyaW5ncyA9IGZhY3RvcnkubmV3U3RyaW5ncygpOwotICAgIHRyYWNlSW50ZXJmYWNlID0gZmFjdG9yeS5uZXdUcmFjZUludGVyZmFjZSgpOwotICAgIGV2ZW50cyA9IGZhY3RvcnkubmV3RXZlbnRzKCk7Ci0gICAgZGVidWdnaW5nID0gZmFjdG9yeS5uZXdEZWJ1ZygpOwotICAgIGNvbmZpZyA9IG5ldyBDb25maWcoZmFjdG9yeS5uZXdCdWlsZFRpbWVDb25maWcoKSk7Ci0KLSAgICAvKiBOb3cgaW5pdGlhbGl6ZSB0aGUgY29uc3RhbnRzIHVzaW5nIHRoZSB2bS1zcGVjaWZpYyBzaW5nbGV0b25zICovCi0gICAgVkVSSUZZX0FTU0VSVElPTlMgPSBBc3NlcnQudmVyaWZ5QXNzZXJ0aW9uc1RyYXBkb29yKGFzc2VydGlvbnMpOwotICAgIEhFQVBfU1RBUlQgPSBNZW1vcnkuaGVhcFN0YXJ0VHJhcGRvb3IobWVtb3J5KTsKLSAgICBIRUFQX0VORCA9IE1lbW9yeS5oZWFwRW5kVHJhcGRvb3IobWVtb3J5KTsKLSAgICBBVkFJTEFCTEVfU1RBUlQgPSBNZW1vcnkuYXZhaWxhYmxlU3RhcnRUcmFwZG9vcihtZW1vcnkpOwotICAgIEFWQUlMQUJMRV9FTkQgPSBNZW1vcnkuYXZhaWxhYmxlRW5kVHJhcGRvb3IobWVtb3J5KTsKLSAgICBMT0dfQllURVNfSU5fQUREUkVTUyA9IE1lbW9yeS5sb2dCeXRlc0luQWRkcmVzc1RyYXBkb29yKG1lbW9yeSk7Ci0gICAgTE9HX0JZVEVTX0lOX1dPUkQgPSBNZW1vcnkubG9nQnl0ZXNJbldvcmRUcmFwZG9vcihtZW1vcnkpOwotICAgIExPR19CWVRFU19JTl9QQUdFID0gTWVtb3J5LmxvZ0J5dGVzSW5QYWdlVHJhcGRvb3IobWVtb3J5KTsKLSAgICBMT0dfTUlOX0FMSUdOTUVOVCA9IE1lbW9yeS5sb2dNaW5BbGlnbm1lbnRUcmFwZG9vcihtZW1vcnkpOwotICAgIE1BWF9BTElHTk1FTlRfU0hJRlQgPSBNZW1vcnkubWF4QWxpZ25tZW50U2hpZnRUcmFwZG9vcihtZW1vcnkpOwotICAgIE1BWF9CWVRFU19QQURESU5HID0gTWVtb3J5Lm1heEJ5dGVzUGFkZGluZ1RyYXBkb29yKG1lbW9yeSk7Ci0gICAgQUxJR05NRU5UX1ZBTFVFID0gTWVtb3J5LmFsaWdubWVudFZhbHVlVHJhcGRvb3IobWVtb3J5KTsKLSAgICBBUlJBWV9CQVNFX09GRlNFVCA9IE9iamVjdE1vZGVsLmFycmF5QmFzZU9mZnNldFRyYXBkb29yKG9iamVjdE1vZGVsKTsKLSAgICBERUJVRyA9IERlYnVnLmlzRW5hYmxlZFRyYXBkb29yKGRlYnVnZ2luZyk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IExvY2sgaW5zdGFuY2UgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFZNLXNwZWNpZmljCi0gICAqIGNvbmNyZXRlIExvY2sgc3ViLWNsYXNzLgotICAgKgotICAgKiBAc2VlIExvY2sKLSAgICoKLSAgICogQHBhcmFtIG5hbWUgVGhlIHN0cmluZyB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBsb2NrIGluc3RhbmNlCi0gICAqIEByZXR1cm4gQSBjb25jcmV0ZSBWTS1zcGVjaWZpYyBMb2NrIGluc3RhbmNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBMb2NrIG5ld0xvY2soU3RyaW5nIG5hbWUpIHsKLSAgICByZXR1cm4gZmFjdG9yeS5uZXdMb2NrKG5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBTeW5jaHJvbml6ZWRDb3VudGVyIGluc3RhbmNlIHVzaW5nIHRoZSBhcHByb3ByaWF0ZQotICAgKiBWTS1zcGVjaWZpYyBjb25jcmV0ZSBTeW5jaHJvbml6ZWRDb3VudGVyIHN1Yi1jbGFzcy4KLSAgICoKLSAgICogQHNlZSBTeW5jaHJvbml6ZWRDb3VudGVyCi0gICAqCi0gICAqIEByZXR1cm4gQSBjb25jcmV0ZSBWTS1zcGVjaWZpYyBTeW5jaHJvbml6ZWRDb3VudGVyIGluc3RhbmNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTeW5jaHJvbml6ZWRDb3VudGVyIG5ld1N5bmNocm9uaXplZENvdW50ZXIoKSB7Ci0gICAgcmV0dXJuIGZhY3RvcnkubmV3U3luY2hyb25pemVkQ291bnRlcigpOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogR0NzcHkgbWV0aG9kcwotICAgKi8KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IFV0aWwgaW5zdGFuY2UgdXNpbmcgdGhlIGFwcHJvcHJpYXRlCi0gICAqIFZNLXNwZWNpZmljIGNvbmNyZXRlIFV0aWwgc3ViLWNsYXNzLgotICAgKgotICAgKiBAc2VlIFV0aWwKLSAgICoKLSAgICogQHJldHVybiBBIGNvbmNyZXRlIFZNLXNwZWNpZmljIFV0aWwgaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFV0aWwgbmV3R0NzcHlVdGlsKCkgewotICAgIHJldHVybiBmYWN0b3J5Lm5ld0dDc3B5VXRpbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBTZXJ2ZXJJbnRlcnByZXRlciBpbnN0YW5jZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUKLSAgICogVk0tc3BlY2lmaWMgY29uY3JldGUgU2VydmVySW50ZXJwcmV0ZXIgc3ViLWNsYXNzLgotICAgKgotICAgKiBAc2VlIFNlcnZlckludGVycHJldGVyCi0gICAqCi0gICAqIEByZXR1cm4gQSBjb25jcmV0ZSBWTS1zcGVjaWZpYyBTZXJ2ZXJJbnRlcnByZXRlciBpbnN0YW5jZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU2VydmVySW50ZXJwcmV0ZXIgbmV3R0NzcHlTZXJ2ZXJJbnRlcnByZXRlcigpIHsKLSAgICByZXR1cm4gZmFjdG9yeS5uZXdHQ3NweVNlcnZlckludGVycHJldGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IFNlcnZlckludGVycHJldGVyIGluc3RhbmNlIHVzaW5nIHRoZSBhcHByb3ByaWF0ZQotICAgKiBWTS1zcGVjaWZpYyBjb25jcmV0ZSBTZXJ2ZXJJbnRlcnByZXRlciBzdWItY2xhc3MuCi0gICAqCi0gICAqIEBzZWUgU2VydmVySW50ZXJwcmV0ZXIKLSAgICoKLSAgICogQHJldHVybiBBIGNvbmNyZXRlIFZNLXNwZWNpZmljIFNlcnZlckludGVycHJldGVyIGluc3RhbmNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTZXJ2ZXJTcGFjZSBuZXdHQ3NweVNlcnZlclNwYWNlKAotICAgICAgU2VydmVySW50ZXJwcmV0ZXIgc2VydmVySW50ZXJwcmV0ZXIsCi0gICAgICBTdHJpbmcgc2VydmVyTmFtZSwKLSAgICAgIFN0cmluZyBkcml2ZXJOYW1lLAotICAgICAgU3RyaW5nIHRpdGxlLAotICAgICAgU3RyaW5nIGJsb2NrSW5mbywKLSAgICAgIGludCB0aWxlTnVtLAotICAgICAgU3RyaW5nIHVudXNlZCwKLSAgICAgIGJvb2xlYW4gbWFpblNwYWNlKSB7Ci0gICAgcmV0dXJuIGZhY3RvcnkubmV3R0NzcHlTZXJ2ZXJTcGFjZShzZXJ2ZXJJbnRlcnByZXRlciwgc2VydmVyTmFtZSwgZHJpdmVyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLCBibG9ja0luZm8sIHRpbGVOdW0sIHVudXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5TcGFjZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IEJ5dGVTdHJlYW0gaW5zdGFuY2UgdXNpbmcgdGhlIGFwcHJvcHJpYXRlCi0gICAqIFZNLXNwZWNpZmljIGNvbmNyZXRlIEJ5dGVTdHJlYW0gc3ViLWNsYXNzLgotICAgKgotICAgKiBAcGFyYW0gZHJpdmVyICAgICAgICBUaGUgZHJpdmVyIHRoYXQgb3ducyB0aGlzIFN0cmVhbQotICAgKiBAcGFyYW0gbmFtZSAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHN0cmVhbSAoZS5nLiAiVXNlZCBzcGFjZSIpCi0gICAqIEBwYXJhbSBtaW5WYWx1ZSAgICAgICBUaGUgbWluaW11bSB2YWx1ZSBmb3IgYW55IGl0ZW0gaW4gdGhpcyBzdHJlYW0uCi0gICAqICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgbGVzcyB0aGFuIHRoaXMgd2lsbCBiZSByZXByZXNlbnRlZCBhcyAibWluVmFsdWUtIgotICAgKiBAcGFyYW0gbWF4VmFsdWUgICAgICAgVGhlIG1heGltdW0gdmFsdWUgZm9yIGFueSBpdGVtIGluIHRoaXMgc3RyZWFtLgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGdyZWF0ZXIgdGhhbiB0aGlzIHdpbGwgYmUgcmVwcmVzZW50ZWQgYXMgIm1heFZhbHVlKyIKLSAgICogQHBhcmFtIHplcm9WYWx1ZSAgICAgIFRoZSB6ZXJvIHZhbHVlIGZvciB0aGlzIHN0cmVhbQotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlICAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgc3RyZWFtCi0gICAqIEBwYXJhbSBzdHJpbmdQcmUgICAgICBBIHN0cmluZyB0byBwcmVmaXggdmFsdWVzIChlLmcuICJVc2VkOiAiKQotICAgKiBAcGFyYW0gc3RyaW5nUG9zdCAgICAgQSBzdHJpbmcgdG8gc3VmZml4IHZhbHVlcyAoZS5nLiAiIGJ5dGVzLiIpCi0gICAqIEBwYXJhbSBwcmVzZW50YXRpb24gICBIb3cgYSBzdHJlYW0gdmFsdWUgaXMgdG8gYmUgcHJlc2VudGVkLgotICAgKiBAcGFyYW0gcGFpbnRTdHlsZSAgICAgSG93IHRoZSB2YWx1ZSBpcyB0byBiZSBwYWludGVkLgotICAgKiBAcGFyYW0gaW5kZXhNYXhTdHJlYW0gVGhlIGluZGV4IG9mIHRoZSBtYXhpbXVtIHN0cmVhbSBpZiB0aGUgcHJlc2VudGF0aW9uIGlzICpfVkFSLgotICAgKiBAcGFyYW0gY29sb3VyICAgICAgICAgVGhlIGRlZmF1bHQgY29sb3VyIGZvciB0aWxlcyBvZiB0aGlzIHN0cmVhbQotICAgKiBAc2VlIEludFN0cmVhbQotICAgKgotICAgKiBAcmV0dXJuIEEgY29uY3JldGUgVk0tc3BlY2lmaWMgQnl0ZVN0cmVhbSBpbnN0YW5jZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmVhbSBuZXdHQ3NweUJ5dGVTdHJlYW0oCi0gICAgICBBYnN0cmFjdERyaXZlciBkcml2ZXIsCi0gICAgICBTdHJpbmcgbmFtZSwKLSAgICAgIGJ5dGUgbWluVmFsdWUsCi0gICAgICBieXRlIG1heFZhbHVlLAotICAgICAgYnl0ZSB6ZXJvVmFsdWUsCi0gICAgICBieXRlIGRlZmF1bHRWYWx1ZSwKLSAgICAgIFN0cmluZyBzdHJpbmdQcmUsCi0gICAgICBTdHJpbmcgc3RyaW5nUG9zdCwKLSAgICAgIGludCBwcmVzZW50YXRpb24sCi0gICAgICBpbnQgcGFpbnRTdHlsZSwKLSAgICAgIGludCBpbmRleE1heFN0cmVhbSwKLSAgICAgIENvbG9yIGNvbG91ciwKLSAgICAgIGJvb2xlYW4gc3VtbWFyeSkgewotICAgIHJldHVybiBmYWN0b3J5Lm5ld0dDc3B5Qnl0ZVN0cmVhbShkcml2ZXIsIG5hbWUsIG1pblZhbHVlLCAgbWF4VmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemVyb1ZhbHVlLCBkZWZhdWx0VmFsdWUsIHN0cmluZ1ByZSwgc3RyaW5nUG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb24sIHBhaW50U3R5bGUsIGluZGV4TWF4U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciwgc3VtbWFyeSk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IEludFN0cmVhbSBpbnN0YW5jZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUKLSAgICogVk0tc3BlY2lmaWMgY29uY3JldGUgSW50U3RyZWFtIHN1Yi1jbGFzcy4KLSAgICoKLSAgICogQHBhcmFtIGRyaXZlciAgICAgICAgVGhlIGRyaXZlciB0aGF0IG93bnMgdGhpcyBTdHJlYW0KLSAgICogQHBhcmFtIG5hbWUgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBzdHJlYW0gKGUuZy4gIlVzZWQgc3BhY2UiKQotICAgKiBAcGFyYW0gbWluVmFsdWUgICAgICAgVGhlIG1pbmltdW0gdmFsdWUgZm9yIGFueSBpdGVtIGluIHRoaXMgc3RyZWFtLgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGxlc3MgdGhhbiB0aGlzIHdpbGwgYmUgcmVwcmVzZW50ZWQgYXMgIm1pblZhbHVlLSIKLSAgICogQHBhcmFtIG1heFZhbHVlICAgICAgIFRoZSBtYXhpbXVtIHZhbHVlIGZvciBhbnkgaXRlbSBpbiB0aGlzIHN0cmVhbS4KLSAgICogICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBncmVhdGVyIHRoYW4gdGhpcyB3aWxsIGJlIHJlcHJlc2VudGVkIGFzICJtYXhWYWx1ZSsiCi0gICAqIEBwYXJhbSB6ZXJvVmFsdWUgICAgICBUaGUgemVybyB2YWx1ZSBmb3IgdGhpcyBzdHJlYW0KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAgIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIHN0cmVhbQotICAgKiBAcGFyYW0gc3RyaW5nUHJlICAgICAgQSBzdHJpbmcgdG8gcHJlZml4IHZhbHVlcyAoZS5nLiAiVXNlZDogIikKLSAgICogQHBhcmFtIHN0cmluZ1Bvc3QgICAgIEEgc3RyaW5nIHRvIHN1ZmZpeCB2YWx1ZXMgKGUuZy4gIiBieXRlcy4iKQotICAgKiBAcGFyYW0gcHJlc2VudGF0aW9uICAgSG93IGEgc3RyZWFtIHZhbHVlIGlzIHRvIGJlIHByZXNlbnRlZC4KLSAgICogQHBhcmFtIHBhaW50U3R5bGUgICAgIEhvdyB0aGUgdmFsdWUgaXMgdG8gYmUgcGFpbnRlZC4KLSAgICogQHBhcmFtIGluZGV4TWF4U3RyZWFtIFRoZSBpbmRleCBvZiB0aGUgbWF4aW11bSBzdHJlYW0gaWYgdGhlIHByZXNlbnRhdGlvbiBpcyAqX1ZBUi4KLSAgICogQHBhcmFtIGNvbG91ciAgICAgICAgIFRoZSBkZWZhdWx0IGNvbG91ciBmb3IgdGlsZXMgb2YgdGhpcyBzdHJlYW0KLSAgICogQHNlZSBJbnRTdHJlYW0KLSAgICoKLSAgICogQHJldHVybiBBIGNvbmNyZXRlIFZNLXNwZWNpZmljIEludFN0cmVhbSBpbnN0YW5jZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgSW50U3RyZWFtIG5ld0dDc3B5SW50U3RyZWFtKAotICAgICAgQWJzdHJhY3REcml2ZXIgZHJpdmVyLAotICAgICAgU3RyaW5nIG5hbWUsCi0gICAgICBpbnQgbWluVmFsdWUsCi0gICAgICBpbnQgbWF4VmFsdWUsCi0gICAgICBpbnQgemVyb1ZhbHVlLAotICAgICAgaW50IGRlZmF1bHRWYWx1ZSwKLSAgICAgIFN0cmluZyBzdHJpbmdQcmUsCi0gICAgICBTdHJpbmcgc3RyaW5nUG9zdCwKLSAgICAgIGludCBwcmVzZW50YXRpb24sCi0gICAgICBpbnQgcGFpbnRTdHlsZSwKLSAgICAgIGludCBpbmRleE1heFN0cmVhbSwKLSAgICAgIENvbG9yIGNvbG91ciwKLSAgICAgIGJvb2xlYW4gc3VtbWFyeSkgewotICAgIHJldHVybiBmYWN0b3J5Lm5ld0dDc3B5SW50U3RyZWFtKGRyaXZlciwgbmFtZSwgbWluVmFsdWUsICBtYXhWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvVmFsdWUsIGRlZmF1bHRWYWx1ZSwgc3RyaW5nUHJlLCBzdHJpbmdQb3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbiwgcGFpbnRTdHlsZSwgaW5kZXhNYXhTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyLCBzdW1tYXJ5KTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgU2hvcnRTdHJlYW0gaW5zdGFuY2UgdXNpbmcgdGhlIGFwcHJvcHJpYXRlCi0gICAqIFZNLXNwZWNpZmljIGNvbmNyZXRlIFNob3J0U3RyZWFtIHN1Yi1jbGFzcy4KLSAgICoKLSAgICogQHBhcmFtIGRyaXZlciAgICAgICAgVGhlIGRyaXZlciB0aGF0IG93bnMgdGhpcyBTdHJlYW0KLSAgICogQHBhcmFtIG5hbWUgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBzdHJlYW0gKGUuZy4gIlVzZWQgc3BhY2UiKQotICAgKiBAcGFyYW0gbWluVmFsdWUgICAgICAgVGhlIG1pbmltdW0gdmFsdWUgZm9yIGFueSBpdGVtIGluIHRoaXMgc3RyZWFtLgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGxlc3MgdGhhbiB0aGlzIHdpbGwgYmUgcmVwcmVzZW50ZWQgYXMgIm1pblZhbHVlLSIKLSAgICogQHBhcmFtIG1heFZhbHVlICAgICAgIFRoZSBtYXhpbXVtIHZhbHVlIGZvciBhbnkgaXRlbSBpbiB0aGlzIHN0cmVhbS4KLSAgICogICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBncmVhdGVyIHRoYW4gdGhpcyB3aWxsIGJlIHJlcHJlc2VudGVkIGFzICJtYXhWYWx1ZSsiCi0gICAqIEBwYXJhbSB6ZXJvVmFsdWUgICAgICBUaGUgemVybyB2YWx1ZSBmb3IgdGhpcyBzdHJlYW0KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAgIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIHN0cmVhbQotICAgKiBAcGFyYW0gc3RyaW5nUHJlICAgICAgQSBzdHJpbmcgdG8gcHJlZml4IHZhbHVlcyAoZS5nLiAiVXNlZDogIikKLSAgICogQHBhcmFtIHN0cmluZ1Bvc3QgICAgIEEgc3RyaW5nIHRvIHN1ZmZpeCB2YWx1ZXMgKGUuZy4gIiBieXRlcy4iKQotICAgKiBAcGFyYW0gcHJlc2VudGF0aW9uICAgSG93IGEgc3RyZWFtIHZhbHVlIGlzIHRvIGJlIHByZXNlbnRlZC4KLSAgICogQHBhcmFtIHBhaW50U3R5bGUgICAgIEhvdyB0aGUgdmFsdWUgaXMgdG8gYmUgcGFpbnRlZC4KLSAgICogQHBhcmFtIGluZGV4TWF4U3RyZWFtIFRoZSBpbmRleCBvZiB0aGUgbWF4aW11bSBzdHJlYW0gaWYgdGhlIHByZXNlbnRhdGlvbiBpcyAqX1ZBUi4KLSAgICogQHBhcmFtIGNvbG91ciAgICAgICAgIFRoZSBkZWZhdWx0IGNvbG91ciBmb3IgdGlsZXMgb2YgdGhpcyBzdHJlYW0KLSAgICogQHNlZSBJbnRTdHJlYW0KLSAgICoKLSAgICogQHJldHVybiBBIGNvbmNyZXRlIFZNLXNwZWNpZmljIEludFN0cmVhbSBpbnN0YW5jZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU2hvcnRTdHJlYW0gbmV3R0NzcHlTaG9ydFN0cmVhbSgKLSAgICAgIEFic3RyYWN0RHJpdmVyIGRyaXZlciwKLSAgICAgIFN0cmluZyBuYW1lLAotICAgICAgc2hvcnQgbWluVmFsdWUsCi0gICAgICBzaG9ydCBtYXhWYWx1ZSwKLSAgICAgIHNob3J0IHplcm9WYWx1ZSwKLSAgICAgIHNob3J0IGRlZmF1bHRWYWx1ZSwKLSAgICAgIFN0cmluZyBzdHJpbmdQcmUsCi0gICAgICBTdHJpbmcgc3RyaW5nUG9zdCwKLSAgICAgIGludCBwcmVzZW50YXRpb24sCi0gICAgICBpbnQgcGFpbnRTdHlsZSwKLSAgICAgIGludCBpbmRleE1heFN0cmVhbSwKLSAgICAgIENvbG9yIGNvbG91ciwKLSAgICAgIGJvb2xlYW4gc3VtbWFyeSkgewotICAgIHJldHVybiBmYWN0b3J5Lm5ld0dDc3B5U2hvcnRTdHJlYW0oZHJpdmVyLCBuYW1lLCBtaW5WYWx1ZSwgIG1heFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHplcm9WYWx1ZSwgZGVmYXVsdFZhbHVlLCBzdHJpbmdQcmUsIHN0cmluZ1Bvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uLCBwYWludFN0eWxlLCBpbmRleE1heFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIsIHN1bW1hcnkpOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3ZtL2djc3B5L0J5dGVTdHJlYW0uamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vZ2NzcHkvQnl0ZVN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTJiMzJkLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vZ2NzcHkvQnl0ZVN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay52bS5nY3NweTsKLQotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuTG9nOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZ2NzcHkuQ29sb3I7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5nY3NweS5HQ3NweTsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lmdjc3B5LlN0cmVhbUNvbnN0YW50czsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lmdjc3B5LmRyaXZlcnMuQWJzdHJhY3REcml2ZXI7Ci1pbXBvcnQgb3JnLm1tdGsudm0uVk07Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogU2V0IHVwIGEgR0NzcHkgU3RyZWFtIHdpdGggZGF0YSB0eXBlIEJZVEVfVFlQRQotICovCi0KLUBVbmludGVycnVwdGlibGUgcHVibGljIGFic3RyYWN0IGNsYXNzIEJ5dGVTdHJlYW0gZXh0ZW5kcyBTdHJlYW0gewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluc3RhbmNlIHZhcmlhYmxlcwotICAgKi8KLSAgcHJpdmF0ZSBieXRlW10gZGF0YTsgICAgICAgICAgLy8gVGhlIHN0cmVhbSBkYXRhCi0gIHByaXZhdGUgYnl0ZSBkZWZhdWx0VmFsdWU7ICAgIC8vIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgZGF0YSBpdGVtcwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogSW5pdGlhbGl6YXRpb24KLSAgICovCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdCBhIG5ldyBHQ3NweSBzdHJlYW0gb2YgQllURV9UWVBFCi0gICAqIEBwYXJhbSBkcml2ZXIgICAgICAgICAgVGhlIGRyaXZlciB0aGF0IG93bnMgdGhpcyBTdHJlYW0KLSAgICogQHBhcmFtIG5hbWUgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBzdHJlYW0gKGUuZy4gIlVzZWQgc3BhY2UiKQotICAgKiBAcGFyYW0gbWluVmFsdWUgICAgICAgVGhlIG1pbmltdW0gdmFsdWUgZm9yIGFueSBpdGVtIGluIHRoaXMgc3RyZWFtLgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGxlc3MgdGhhbiB0aGlzIHdpbGwgYmUgcmVwcmVzZW50ZWQgYXMgIm1pblZhbHVlLSIKLSAgICogQHBhcmFtIG1heFZhbHVlICAgICAgIFRoZSBtYXhpbXVtIHZhbHVlIGZvciBhbnkgaXRlbSBpbiB0aGlzIHN0cmVhbS4KLSAgICogICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBncmVhdGVyIHRoYW4gdGhpcyB3aWxsIGJlIHJlcHJlc2VudGVkIGFzICJtYXhWYWx1ZSsiCi0gICAqIEBwYXJhbSB6ZXJvVmFsdWUgICAgICBUaGUgemVybyB2YWx1ZSBmb3IgdGhpcyBzdHJlYW0KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAgIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIHN0cmVhbQotICAgKiBAcGFyYW0gc3RyaW5nUHJlICAgICAgQSBzdHJpbmcgdG8gcHJlZml4IHZhbHVlcyAoZS5nLiAiVXNlZDogIikKLSAgICogQHBhcmFtIHN0cmluZ1Bvc3QgICAgIEEgc3RyaW5nIHRvIHN1ZmZpeCB2YWx1ZXMgKGUuZy4gIiBieXRlcy4iKQotICAgKiBAcGFyYW0gcHJlc2VudGF0aW9uICAgSG93IGEgc3RyZWFtIHZhbHVlIGlzIHRvIGJlIHByZXNlbnRlZC4KLSAgICogQHBhcmFtIHBhaW50U3R5bGUgICAgIEhvdyB0aGUgdmFsdWUgaXMgdG8gYmUgcGFpbnRlZC4KLSAgICogQHBhcmFtIGluZGV4TWF4U3RyZWFtIFRoZSBpbmRleCBvZiB0aGUgbWF4aW11bSBzdHJlYW0gaWYgdGhlIHByZXNlbnRhdGlvbiBpcyAqX1ZBUi4KLSAgICogQHBhcmFtIGNvbG91ciAgICAgICAgIFRoZSBkZWZhdWx0IGNvbG91ciBmb3IgdGlsZXMgb2YgdGhpcyBzdHJlYW0KLSAgICovCi0gIHB1YmxpYyBCeXRlU3RyZWFtKAotICAgICAgICAgQWJzdHJhY3REcml2ZXIgZHJpdmVyLAotICAgICAgICAgU3RyaW5nIG5hbWUsCi0gICAgICAgICBieXRlIG1pblZhbHVlLAotICAgICAgICAgYnl0ZSBtYXhWYWx1ZSwKLSAgICAgICAgIGJ5dGUgemVyb1ZhbHVlLAotICAgICAgICAgYnl0ZSBkZWZhdWx0VmFsdWUsCi0gICAgICAgICBTdHJpbmcgc3RyaW5nUHJlLAotICAgICAgICAgU3RyaW5nIHN0cmluZ1Bvc3QsCi0gICAgICAgICBpbnQgcHJlc2VudGF0aW9uLAotICAgICAgICAgaW50IHBhaW50U3R5bGUsCi0gICAgICAgICBpbnQgaW5kZXhNYXhTdHJlYW0sCi0gICAgICAgICBDb2xvciBjb2xvdXIsCi0gICAgICAgICBib29sZWFuIHN1bW1hcnkpIHsKLQotICAgIHN1cGVyKGRyaXZlciwgU3RyZWFtQ29uc3RhbnRzLkJZVEVfVFlQRSwgbmFtZSwKLSAgICAgICAgICBtaW5WYWx1ZSwgbWF4VmFsdWUsIHplcm9WYWx1ZSwgZGVmYXVsdFZhbHVlLAotICAgICAgICAgIHN0cmluZ1ByZSwgc3RyaW5nUG9zdCwgcHJlc2VudGF0aW9uLCBwYWludFN0eWxlLAotICAgICAgICAgIGluZGV4TWF4U3RyZWFtLCBjb2xvdXIsIHN1bW1hcnkpOwotCi0gICAgZGF0YSA9IChieXRlW10pR0NzcHkudXRpbC5jcmVhdGVEYXRhQXJyYXkobmV3IGJ5dGVbMF0sIGRyaXZlci5nZXRNYXhUaWxlTnVtKCkpOwotICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlc2V0IGFsbCBkYXRhIGluIHRoaXMgc3RyZWFtIHRvIGRlZmF1bHQgdmFsdWVzLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzZXREYXRhKCkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykKLSAgICAgIGRhdGFbaV0gPSBkZWZhdWx0VmFsdWU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBEaXN0cmlidXRlIGEgdmFsdWUgYWNyb3NzIGEgc2VxdWVuY2Ugb2YgdGlsZXMuIFRoaXMgaGFuZGxlcyB0aGUgY2FzZQotICAgKiB3aGVuIHdoZW4gYW4gb2JqZWN0IHNwYW5zIHR3byBvciBtb3JlIHRpbGVzIGFuZCBpdHMgdmFsdWUgaXMgdG8gYmUKLSAgICogYXR0cmlidXRlZCB0byBlYWNoIHRpbGUgcHJvcG9ydGlvbmFsbHkuCi0gICAqCi0gICAqIEBwYXJhbSBzdGFydCB0aGUgaW5kZXggb2YgdGhlIHN0YXJ0aW5nIHRpbGUKLSAgICogQHBhcmFtIHJlbWFpbmRlciB0aGUgdmFsdWUgbGVmdCBpbiB0aGUgc3RhcnRpbmcgdGlsZQotICAgKiBAcGFyYW0gYmxvY2tTaXplIHRoZSBzaXplIG9mIGVhY2ggdGlsZQotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGRpc3RyaWJ1dGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRpc3RyaWJ1dGUoaW50IHN0YXJ0LCBieXRlIHJlbWFpbmRlciwgaW50IGJsb2NrU2l6ZSwgYnl0ZSB2YWx1ZSkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KHJlbWFpbmRlciA8PSBibG9ja1NpemUpOwotICAgIGlmICh2YWx1ZSA8PSByZW1haW5kZXIpIHsgIC8vIGZpdHMgaW4gdGhpcyB0aWxlCi0gICAgICBkYXRhW3N0YXJ0XSArPSB2YWx1ZTsKLSAgICAgIC8vY2hlY2tzcGFjZShzdGFydCwgdmFsdWUsICJzY2FuT2JqZWN0IGZpdHMgaW4gZmlyc3QgdGlsZSIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBkYXRhW3N0YXJ0XSArPSByZW1haW5kZXI7Ci0gICAgICAvL2NoZWNrc3BhY2Uoc3RhcnQsIHJlbWFpbmRlciwgInNjYW5PYmplY3QgcmVtYWluZGVyIHB1dCBpbiBmaXJzdCB0aWxlIik7Ci0gICAgICB2YWx1ZSAtPSByZW1haW5kZXI7Ci0gICAgICBzdGFydCsrOwotICAgICAgd2hpbGUgKHZhbHVlID49IGJsb2NrU2l6ZSkgewotICAgICAgICBkYXRhW3N0YXJ0XSArPSBibG9ja1NpemU7Ci0gICAgICAgIC8vY2hlY2tzcGFjZShzdGFydCwgYmxvY2tTaXplLCAic2Nhbk9iamVjdCBzdWJzZXF1ZW50IHRpbGUiKTsKLSAgICAgICAgdmFsdWUgLT0gYmxvY2tTaXplOwotICAgICAgICBzdGFydCsrOwotICAgICAgfQotICAgICAgZGF0YVtzdGFydF0gKz0gdmFsdWU7Ci0gICAgICAvL2NoZWNrc3BhY2Uoc3RhcnQsIHZhbHVlLCAic2Nhbk9iamVjdCBsYXN0IHRpbGUiKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSW5jcmVtZW50IHRoZSB2YWx1ZSBvZiBhIHRpbGUuCi0gICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXgKLSAgICogQHBhcmFtIHZhbHVlIHRoZSBpbmNyZW1lbnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGluY3JlbWVudChpbnQgaW5kZXgsIGJ5dGUgdmFsdWUpIHsgZGF0YVtpbmRleF0gKz0gdmFsdWU7IH0KLQotICAvKioKLSAgICogU2VuZCB0aGUgZGF0YSBhbmQgc3VtbWFyeSBmb3IgdGhpcyBzdHJlYW0uCi0gICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQKLSAgICogQHBhcmFtIG51bVRpbGVzIFRoZSBudW1iZXIgb2YgdGlsZXMgdG8gc2VuZCAod2hpY2ggbWF5IGJlIGxlc3MgdGhhbiBtYXhUaWxlTnVtKQotICAgKiBAc2VlICNCeXRlU3RyZWFtCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZW5kKGludCBldmVudCwgaW50IG51bVRpbGVzKSB7Ci0gICAgaWYgKERFQlVHKSB7Ci0gICAgICBMb2cud3JpdGUoInNlbmRpbmcgIik7IExvZy53cml0ZShudW1UaWxlcyk7IExvZy53cml0ZWxuKCIgaW50IHZhbHVlcyIpOwotICAgIH0KLSAgICBzZXJ2ZXJTcGFjZS5zdHJlYW0oc3RyZWFtSWQsIG51bVRpbGVzKTsKLSAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbnVtVGlsZXM7IGluZGV4KyspCi0gICAgICBzZXJ2ZXJTcGFjZS5zdHJlYW1CeXRlVmFsdWUoZGF0YVtpbmRleF0pOwotICAgIHNlcnZlclNwYWNlLnN0cmVhbUVuZCgpOwotICAgIHNlbmRTdW1tYXJ5KCk7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay92bS9nY3NweS9JbnRTdHJlYW0uamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vZ2NzcHkvSW50U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNWZlNDIuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay92bS9nY3NweS9JbnRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudm0uZ2NzcHk7Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkxvZzsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lmdjc3B5LkNvbG9yOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZ2NzcHkuR0NzcHk7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5nY3NweS5TdHJlYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5nY3NweS5kcml2ZXJzLkFic3RyYWN0RHJpdmVyOwotaW1wb3J0IG9yZy5tbXRrLnZtLlZNOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotCi0vKioKLSAqIFNldCB1cCBhIEdDc3B5IFN0cmVhbSB3aXRoIGRhdGEgdHlwZSBJTlRfVFlQRS4KLSAqLwotQFVuaW50ZXJydXB0aWJsZSBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW50U3RyZWFtIGV4dGVuZHMgU3RyZWFtIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBJbnN0YW5jZSB2YXJpYWJsZXMKLSAgICovCi0gIHByaXZhdGUgaW50W10gZGF0YTsgICAgICAgICAgIC8vIFRoZSBzdHJlYW0gZGF0YQotICBwcml2YXRlIGludCBkZWZhdWx0VmFsdWU7ICAgICAvLyBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGRhdGEgaXRlbXMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluaXRpYWxpemF0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYSBuZXcgR0NzcHkgc3RyZWFtIG9mIElOVF9UWVBFCi0gICAqIEBwYXJhbSBkcml2ZXIgICAgICAgICAgVGhlIGRyaXZlciB0aGF0IG93bnMgdGhpcyBTdHJlYW0KLSAgICogQHBhcmFtIG5hbWUgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBzdHJlYW0gKGUuZy4gIlVzZWQgc3BhY2UiKQotICAgKiBAcGFyYW0gbWluVmFsdWUgICAgICAgVGhlIG1pbmltdW0gdmFsdWUgZm9yIGFueSBpdGVtIGluIHRoaXMgc3RyZWFtLgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGxlc3MgdGhhbiB0aGlzIHdpbGwgYmUgcmVwcmVzZW50ZWQgYXMgIm1pblZhbHVlLSIKLSAgICogQHBhcmFtIG1heFZhbHVlICAgICAgIFRoZSBtYXhpbXVtIHZhbHVlIGZvciBhbnkgaXRlbSBpbiB0aGlzIHN0cmVhbS4KLSAgICogICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBncmVhdGVyIHRoYW4gdGhpcyB3aWxsIGJlIHJlcHJlc2VudGVkIGFzICJtYXhWYWx1ZSsiCi0gICAqIEBwYXJhbSB6ZXJvVmFsdWUgICAgICBUaGUgemVybyB2YWx1ZSBmb3IgdGhpcyBzdHJlYW0KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAgIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIHN0cmVhbQotICAgKiBAcGFyYW0gc3RyaW5nUHJlICAgICAgQSBzdHJpbmcgdG8gcHJlZml4IHZhbHVlcyAoZS5nLiAiVXNlZDogIikKLSAgICogQHBhcmFtIHN0cmluZ1Bvc3QgICAgIEEgc3RyaW5nIHRvIHN1ZmZpeCB2YWx1ZXMgKGUuZy4gIiBieXRlcy4iKQotICAgKiBAcGFyYW0gcHJlc2VudGF0aW9uICAgSG93IGEgc3RyZWFtIHZhbHVlIGlzIHRvIGJlIHByZXNlbnRlZC4KLSAgICogQHBhcmFtIHBhaW50U3R5bGUgICAgIEhvdyB0aGUgdmFsdWUgaXMgdG8gYmUgcGFpbnRlZC4KLSAgICogQHBhcmFtIGluZGV4TWF4U3RyZWFtIFRoZSBpbmRleCBvZiB0aGUgbWF4aW11bSBzdHJlYW0gaWYgdGhlIHByZXNlbnRhdGlvbiBpcyAqX1ZBUi4KLSAgICogQHBhcmFtIGNvbG91ciAgICAgICAgIFRoZSBkZWZhdWx0IGNvbG91ciBmb3IgdGlsZXMgb2YgdGhpcyBzdHJlYW0KLSAgICovCi0gIHB1YmxpYyBJbnRTdHJlYW0oCi0gICAgICAgICBBYnN0cmFjdERyaXZlciBkcml2ZXIsCi0gICAgICAgICBTdHJpbmcgbmFtZSwKLSAgICAgICAgIGludCBtaW5WYWx1ZSwKLSAgICAgICAgIGludCBtYXhWYWx1ZSwKLSAgICAgICAgIGludCB6ZXJvVmFsdWUsCi0gICAgICAgICBpbnQgZGVmYXVsdFZhbHVlLAotICAgICAgICAgU3RyaW5nIHN0cmluZ1ByZSwKLSAgICAgICAgIFN0cmluZyBzdHJpbmdQb3N0LAotICAgICAgICAgaW50IHByZXNlbnRhdGlvbiwKLSAgICAgICAgIGludCBwYWludFN0eWxlLAotICAgICAgICAgaW50IGluZGV4TWF4U3RyZWFtLAotICAgICAgICAgQ29sb3IgY29sb3VyLAotICAgICAgICAgYm9vbGVhbiBzdW1tYXJ5KSB7Ci0KLSAgICBzdXBlcihkcml2ZXIsIFN0cmVhbUNvbnN0YW50cy5JTlRfVFlQRSwgbmFtZSwKLSAgICAgICAgICBtaW5WYWx1ZSwgbWF4VmFsdWUsIHplcm9WYWx1ZSwgZGVmYXVsdFZhbHVlLAotICAgICAgICAgIHN0cmluZ1ByZSwgc3RyaW5nUG9zdCwgcHJlc2VudGF0aW9uLCBwYWludFN0eWxlLAotICAgICAgICAgIGluZGV4TWF4U3RyZWFtLCBjb2xvdXIsIHN1bW1hcnkpOwotCi0gICAgZGF0YSA9IChpbnRbXSlHQ3NweS51dGlsLmNyZWF0ZURhdGFBcnJheShuZXcgaW50WzBdLCBkcml2ZXIuZ2V0TWF4VGlsZU51bSgpKTsKLSAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXNldCBhbGwgZGF0YSBpbiB0aGlzIHN0cmVhbSB0byBkZWZhdWx0IHZhbHVlcy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc2V0RGF0YSgpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspCi0gICAgICBkYXRhW2ldID0gZGVmYXVsdFZhbHVlOwotICB9Ci0KLQotICAvKioKLSAgICogRGlzdHJpYnV0ZSBhIHZhbHVlIGFjcm9zcyBhIHNlcXVlbmNlIG9mIHRpbGVzLiBUaGlzIGhhbmRsZXMgdGhlIGNhc2UKLSAgICogd2hlbiB3aGVuIGFuIG9iamVjdCBzcGFucyB0d28gb3IgbW9yZSB0aWxlcyBhbmQgaXRzIHZhbHVlIGlzIHRvIGJlCi0gICAqIGF0dHJpYnV0ZWQgdG8gZWFjaCB0aWxlIHByb3BvcnRpb25hbGx5LgotICAgKgotICAgKiBAcGFyYW0gc3RhcnQgdGhlIGluZGV4IG9mIHRoZSBzdGFydGluZyB0aWxlCi0gICAqIEBwYXJhbSByZW1haW5kZXIgdGhlIHZhbHVlIGxlZnQgaW4gdGhlIHN0YXJ0aW5nIHRpbGUKLSAgICogQHBhcmFtIGJsb2NrU2l6ZSB0aGUgc2l6ZSBvZiBlYWNoIHRpbGUKLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBkaXN0cmlidXRlCi0gICAqLwotICBwdWJsaWMgdm9pZCBkaXN0cmlidXRlKGludCBzdGFydCwgaW50IHJlbWFpbmRlciwgaW50IGJsb2NrU2l6ZSwgaW50IHZhbHVlKSB7Ci0gICAgaWYgKFZNLlZFUklGWV9BU1NFUlRJT05TKSBWTS5hc3NlcnRpb25zLl9hc3NlcnQocmVtYWluZGVyIDw9IGJsb2NrU2l6ZSk7Ci0gICAgaWYgKHZhbHVlIDw9IHJlbWFpbmRlcikgeyAgLy8gZml0cyBpbiB0aGlzIHRpbGUKLSAgICAgIGRhdGFbc3RhcnRdICs9IHZhbHVlOwotICAgICAgLy9jaGVja3NwYWNlKHN0YXJ0LCB2YWx1ZSwgInNjYW5PYmplY3QgZml0cyBpbiBmaXJzdCB0aWxlIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGRhdGFbc3RhcnRdICs9IHJlbWFpbmRlcjsKLSAgICAgIC8vY2hlY2tzcGFjZShzdGFydCwgcmVtYWluZGVyLCAic2Nhbk9iamVjdCByZW1haW5kZXIgcHV0IGluIGZpcnN0IHRpbGUiKTsKLSAgICAgIHZhbHVlIC09IHJlbWFpbmRlcjsKLSAgICAgIHN0YXJ0Kys7Ci0gICAgICB3aGlsZSAodmFsdWUgPj0gYmxvY2tTaXplKSB7Ci0gICAgICAgIGRhdGFbc3RhcnRdICs9IGJsb2NrU2l6ZTsKLSAgICAgICAgLy9jaGVja3NwYWNlKHN0YXJ0LCBibG9ja1NpemUsICJzY2FuT2JqZWN0IHN1YnNlcXVlbnQgdGlsZSIpOwotICAgICAgICB2YWx1ZSAtPSBibG9ja1NpemU7Ci0gICAgICAgIHN0YXJ0Kys7Ci0gICAgICB9Ci0gICAgICBkYXRhW3N0YXJ0XSArPSB2YWx1ZTsKLSAgICAgIC8vY2hlY2tzcGFjZShzdGFydCwgdmFsdWUsICJzY2FuT2JqZWN0IGxhc3QgdGlsZSIpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBJbmNyZW1lbnQgdGhlIHZhbHVlIG9mIGEgdGlsZS4KLSAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleAotICAgKiBAcGFyYW0gdmFsdWUgdGhlIGluY3JlbWVudAotICAgKi8KLSAgcHVibGljIHZvaWQgaW5jcmVtZW50KGludCBpbmRleCwgaW50IHZhbHVlKSB7IGRhdGFbaW5kZXhdICs9IHZhbHVlOyB9Ci0KLSAgLyoqCi0gICAqIFNlbmQgdGhlIGRhdGEgYW5kIHN1bW1hcnkgZm9yIHRoaXMgc3RyZWFtLgotICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50Ci0gICAqIEBwYXJhbSBudW1UaWxlcyBUaGUgbnVtYmVyIG9mIHRpbGVzIHRvIHNlbmQgKHdoaWNoIG1heSBiZSBsZXNzIHRoYW4gbWF4VGlsZU51bSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNlbmQoaW50IGV2ZW50LCBpbnQgbnVtVGlsZXMpIHsKLSAgICBpZiAoREVCVUcpIHsKLSAgICAgIExvZy53cml0ZSgic2VuZGluZyAiKTsgTG9nLndyaXRlKG51bVRpbGVzKTsgTG9nLndyaXRlbG4oIiBpbnQgdmFsdWVzIik7Ci0gICAgfQotCi0gICAgc2VydmVyU3BhY2Uuc3RyZWFtKHN0cmVhbUlkLCBudW1UaWxlcyk7Ci0gICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG51bVRpbGVzOyBpbmRleCsrKQotICAgICAgc2VydmVyU3BhY2Uuc3RyZWFtSW50VmFsdWUoZGF0YVtpbmRleF0pOwotICAgIHNlcnZlclNwYWNlLnN0cmVhbUVuZCgpOwotCi0gICAgc2VuZFN1bW1hcnkoKTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3ZtL2djc3B5L1NlcnZlckludGVycHJldGVyLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3ZtL2djc3B5L1NlcnZlckludGVycHJldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5YmY3ZTEuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay92bS9nY3NweS9TZXJ2ZXJJbnRlcnByZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcubW10ay52bS5nY3NweTsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS4qOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuQWRkcmVzczsKLQotLyoqCi0gKiBBYnN0cmFjdCBjbGFzcyBmb3IgdGhlIEdDc3B5IHNlcnZlciBpbnRlcnByZXRlcgotICoKLSAqIEltcGxlbWVudGluZyBjbGFzc2VzIHdpbGwgbW9zdGx5IGZvcndhcmQgY2FsbHMgdG8gdGhlIEMgZ2NzcHkgbGlicmFyeS4KLSAqLwotQFVuaW50ZXJydXB0aWJsZSBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VydmVySW50ZXJwcmV0ZXIgewotCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1BWF9MRU4gPSA2NCAqIDEwMjQ7IC8vIEJ1ZmZlciBzaXplCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1BWF9TUEFDRVMgPSAzMjsgICAgIC8vIE1heGltdW0gbnVtYmVyIG9mIHNwYWNlcwotICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaW5pdGlhbGlzZWQgPSBmYWxzZTsKLQotICBwcm90ZWN0ZWQgU2VydmVyU3BhY2VbXSBzcGFjZXM7ICAgICAgICAgICAgICAgICAvLyBUaGUgc2VydmVyJ3Mgc3BhY2VzCi0gIHByb3RlY3RlZCBBZGRyZXNzIHNlcnZlcjsgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgcG9pbnRlciB0byB0aGUgYyBzZXJ2ZXIsIGdjc3B5X21haW5fc2VydmVyX3Qgc2VydmVyCi0KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBTZXJ2ZXJJbnRlcnByZXRlciBzaW5nbGV0b24uCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzZXJ2ZXIKLSAgICogQHBhcmFtIHBvcnQgVGhlIG51bWJlciBvZiB0aGUgcG9ydCBvbiB3aGljaCB0byBjb21tdW5pY2F0ZQotICAgKiBAcGFyYW0gdmVyYm9zZSBXaGV0aGVyIHRoZSBzZXJ2ZXIgaXMgdG8gcnVuIHZlcmJvc2VseQotICAgKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHVibGljIGFic3RyYWN0IHZvaWQgaW5pdChTdHJpbmcgbmFtZSwgaW50IHBvcnQsIGJvb2xlYW4gdmVyYm9zZSk7Ci0KLSAgLyoqCi0gICAqIEFkZCBhbiBldmVudCB0byB0aGUgU2VydmVySW50ZXJwcmV0ZXIuCi0gICAqIEBwYXJhbSBudW0gdGhlIGV2ZW50IG51bWJlcgotICAgKiBAcGFyYW0gbmFtZSB0aGUgZXZlbnQgbmFtZQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgYWRkRXZlbnQoaW50IG51bSwgU3RyaW5nIG5hbWUpOwotCi0gIC8qKgotICAgKiBTZXQgdGhlIGdlbmVyYWwgaW5mbyBmb3IgdGhlIFNlcnZlckludGVycHJldGVyLgotICAgKiBAcGFyYW0gaW5mbyB0aGUgaW5mb3JtYXRpb24KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEdlbmVyYWxJbmZvKFN0cmluZyBpbmZvKTsKLQotICAvKioKLSAgICogR2V0IGEgcG9pbnRlciB0byB0aGUgQyBzZXJ2ZXIsIGdjc3B5X21haW5fc2VydmVyX3QuCi0gICAqIFRoaXMgYWRkcmVzcyBpcyB1c2VkIGluIGFsbGwgY2FsbHMgdG8gdGhlIHNlcnZlciBpbiB0aGUgQyBsaWJyYXJ5LgotICAgKiBAcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBzZXJ2ZXIKLSAgICovCi0gIHB1YmxpYyBBZGRyZXNzIGdldFNlcnZlckFkZHJlc3MoKSB7IHJldHVybiBzZXJ2ZXI7IH0KLQotICAvKioKLSAgICogQWRkIGEgR0NzcHkgU2VydmVyU3BhY2UgdG8gdGhlIFNlcnZlckludGVycHJldGVyLgotICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgdW5pcXVlIHNwYWNlIElEIGZvciB0aGUgU2VydmVyU3BhY2UKLSAgICogKGFnYWluIHVzZWQgaW4gY2FsbHMgdG8gdGhlIEMgbGlicmFyeSkuCi0gICAqCi0gICAqIEBwYXJhbSBzcGFjZSB0aGUgU2VydmVyU3BhY2UgdG8gYWRkCi0gICAqIEByZXR1cm4gYSB1bmlxdWUgaWQgZm9yIHRoaXMgc3BhY2UKLSAgICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIG9uIGF0dGVtcHQgdG8gYWRkIG1vcmUgdGhhbgotICAgKiBNQVhfU1BBQ0VTIHNwYWNlcwotICAgKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHVibGljIGludCBhZGRTcGFjZShTZXJ2ZXJTcGFjZSBzcGFjZSkgewotICAgIGludCBpZCA9IDA7Ci0gICAgd2hpbGUgKGlkIDwgTUFYX1NQQUNFUykgewotICAgICAgaWYgKHNwYWNlc1tpZF0gPT0gbnVsbCkgewotICAgICAgICBzcGFjZXNbaWRdID0gc3BhY2U7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICAgIH0KLSAgICAgIGlkKys7Ci0gICAgfQotICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKAotICAgICAgICAiVG9vIG1hbnkgc3BhY2VzIHRvIGFkZCB0byBpbnRlcnByZXRlci5cblNldCBNQVhfU1BBQ0VTIHRvIGhpZ2hlciB2YWx1ZSBpbiBTZXJ2ZXJJbnRlcnByZXRlci4iKTsKLSAgfQotCi0gIC8qKgotICAgKiBTdGFydCB0aGUgc2VydmVyLCBydW5uaW5nIGl0cyBtYWluIGxvb3AgaW4gYSBwdGhyZWFkLgotICAgKiBAcGFyYW0gd2FpdCBXaGV0aGVyIHRvIHdhaXQgZm9yIHRoZSBjbGllbnQgdG8gY29ubmVjdAotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnRTZXJ2ZXIoYm9vbGVhbiB3YWl0KTsKLQotICAvKioKLSAgICogQXJlIHdlIGNvbm5lY3RlZCB0byBhIEdDc3B5IGNsaWVudD8KLSAgICogQHBhcmFtIGV2ZW50IFRoZSBjdXJyZW50IGV2ZW50Ci0gICAqIEByZXR1cm4gdHJ1ZSBpZiB3ZSBhcmUgY29ubmVjdGVkCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0Nvbm5lY3RlZChpbnQgZXZlbnQpOwotCi0gIC8qKgotICAgKiBTdGFydCBjb21wZW5zYXRpb24gdGltZXIgc28gdGhhdCB0aW1lIHNwZW50IGdhdGhlcmluZyBkYXRhIGlzCi0gICAqIG5vdCBjb25mdXNlZCB3aXRoIHRoZSB0aW1lIHNwZW50IGluIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIFZNLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnRDb21wZW5zYXRpb25UaW1lcigpOwotCi0gIC8qKgotICAgKiBTdG9wIGNvbXBlbnNhdGlvbiB0aW1lciBzbyB0aGF0IHRpbWUgc3BlbnQgZ2F0aGVyaW5nIGRhdGEgaXMKLSAgICogbm90IGNvbmZ1c2VkIHdpdGggdGhlIHRpbWUgc3BlbnQgaW4gdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgVk0ucgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgc3RvcENvbXBlbnNhdGlvblRpbWVyKCk7Ci0KLSAgLyoqCi0gICAqIEluZGljYXRlIHRoYXQgd2UgYXJlIGF0IGEgc2VydmVyIHNhZmUgcG9pbnQgKGUuZy4gdGhlIGVuZCBvZiBhIEdDKS4KLSAgICogVGhpcyBpcyBhIHBvaW50IGF0IHdoaWNoIHRoZSBzZXJ2ZXIgY2FuIHBhdXNlLCBwbGF5IG9uZSwgZXRjLgotICAgKiBAcGFyYW0gZXZlbnQgVGhlIGN1cnJlbnQgZXZlbnQKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNlcnZlclNhZmVwb2ludChpbnQgZXZlbnQpOwotCi0gIC8qKgotICAgKiBEaXNjb3ZlciB0aGUgc21hbGxlc3QgaGVhZGVyIHNpemUgZm9yIG9iamVjdHMuCi0gICAqIEByZXR1cm4gdGhlIHNpemUgaW4gYnl0ZXMKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBpbnQgY29tcHV0ZUhlYWRlclNpemUoKTsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vZ2NzcHkvU2VydmVyU3BhY2UuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vZ2NzcHkvU2VydmVyU3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMxN2Y4MS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3ZtL2djc3B5L1NlcnZlclNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnZtLmdjc3B5OwotCi1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Mb2c7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5nY3NweS5kcml2ZXJzLkFic3RyYWN0RHJpdmVyOwotaW1wb3J0IG9yZy52bW1hZ2ljLnVuYm94ZWQuKjsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBBYnN0cmFjdCBjbGFzcyBmb3IgdGhlIEdDc3B5IFNwYWNlIGFic3RyYWN0aW9uLgotICoKLSAqIEltcGxlbWVudGluZyBjbGFzc2VzIHdpbGwgbGFyZ2VseSBmb3J3YXJkIGNhbGxzIHRvIHRoZSBnY3NweSBDIGxpYnJhcnkuCi0gKi8KLUBVbmludGVycnVwdGlibGUgcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcnZlclNwYWNlIHsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBDbGFzcyB2YXJpYWJsZXMKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVU5VU0VEX1NUUklORyA9ICJOT1QgVVNFRCI7ICAgICAgIC8vIFRoZSAidW51c2VkIiBzdHJpbmcKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogSW5zdGFuY2UgdmFyaWFibGVzCi0gICovCi0gIHByb3RlY3RlZCBpbnQgc3BhY2VJZDsgICAgICAgICAvLyB0aGUgc3BhY2UncyBJRAotICBwcm90ZWN0ZWQgQWRkcmVzcyBkcml2ZXI7ICAgICAgLy8gYSBwb2ludGVyIHRvIHRoZSBDIGRyaXZlciwgZ2NzcHlfZ2NfZHJpdmVydCAqZHJpdmVyOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotCi0gIC8qKgotICAgKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBuYXRpdmUgZHJpdmVyCi0gICAqIEByZXR1cm4gVGhlIGFkZHJlc3Mgb2YgdGhlIEMgZHJpdmVyLCBnY3NweV9nY19kcml2ZXJ0ICosIHVzZWQgaW4gYWxsIGNhbGxzCi0gICAqIHRvIHRoZSBDIGxpYnJhcnkuCi0gICAqLwotICBBZGRyZXNzIGdldERyaXZlckFkZHJlc3MoKSB7Ci0gICAgcmV0dXJuIGRyaXZlcjsKLSAgfQotCi0gIC8qKgotICAgKiBUZWxsIHRoZSBuYXRpdmUgZHJpdmVyIHRoZSB0aWxlIG5hbWUuCi0gICAqIEBwYXJhbSBpIHRoZSBudW1iZXIgb2YgdGhlIHRpbGUKLSAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIHRoZSB0aWxlCi0gICAqIEBwYXJhbSBlbmQgdGhlIGVuZCBhZGRyZXNzCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUaWxlbmFtZShpbnQgaSwgQWRkcmVzcyBzdGFydCwgQWRkcmVzcyBlbmQpOwotCi0gIC8qKgotICAgKiBUZWxsIHRoZSBuYXRpdmUgZHJpdmVyIHRoZSB0aWxlIG5hbWUuCi0gICAqIEBwYXJhbSBpIHRoZSBudW1iZXIgb2YgdGhlIHRpbGUKLSAgICogQHBhcmFtIGZvcm1hdCB0aGUgbmFtZSBvZiB0aGUgdGlsZSwgYSBmb3JtYXQgc3RyaW5nCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgZm9yIHRoZSBmb3JtYXQgc3RyaW5nCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUaWxlbmFtZShpbnQgaSwgQWRkcmVzcyBmb3JtYXQsIGxvbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBUZWxsIHRoZSBuYXRpdmUgZHJpdmVyIHRoZSB0aWxlIG5hbWVzLgotICAgKiBAcGFyYW0gaSB0aGUgbnVtYmVyIG9mIHRoZSB0aWxlCi0gICAqIEBwYXJhbSBmb3JtYXQgVGhlIG5hbWUsIGluY2x1ZGluZyBmb3JtYXQgdGFncwotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIGZvciB0aGUgZm9ybWF0IHN0cmluZwotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGlsZW5hbWUoaW50IGksIFN0cmluZyBmb3JtYXQsIGxvbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBUZWxsIHRoZSBDIGRyaXZlciB0byByZXNpemUKLSAgICogQHBhcmFtIHNpemUgdGhlIG5ldyBkcml2ZXIgc2l6ZQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVzaXplKGludCBzaXplKTsKLQotICAvKioKLSAgICogU3RhcnQgYSB0cmFuc21pc3Npb24KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0Q29tbXVuaWNhdGlvbigpOwotCi0gIC8qKgotICAgKiBBZGQgYSBzdHJlYW0gdG8gdGhlIG5hdGl2ZSBkcml2ZXIKLSAgICogQHBhcmFtIGlkIHRoZSBzdHJlYW0ncyBJRAotICAgKiBAcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBDIGdjc3B5X2djX3N0cmVhbV90Ci0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgQWRkcmVzcyBhZGRTdHJlYW0oaW50IGlkKTsKLQotICAvKioKLSAgICogU3RhcnQgdHJhbnNtaXR0aW5nIGEgc3RyZWFtLgotICAgKiBAcGFyYW0gaWQgVGhlIHN0cmVhbSdzIElECi0gICAqIEBwYXJhbSBsZW4gVGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgc3RyZWFtCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdHJlYW0oaW50IGlkLCBpbnQgbGVuKTsKLQotICAvKioKLSAgICogU2VuZCBhIGJ5dGUKLSAgICogQHBhcmFtIHZhbHVlIFRoZSBieXRlCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdHJlYW1CeXRlVmFsdWUoYnl0ZSB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFNlbmQgYSBzaG9ydAotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHNob3J0Ci0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdHJlYW1TaG9ydFZhbHVlKHNob3J0IHZhbHVlKTsKLQotICAvKioKLSAgICogU2VuZCBhbiBpbnQKLSAgICogQHBhcmFtIHZhbHVlIFRoZSBpbnQKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0cmVhbUludFZhbHVlKGludCB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIEVuZCBvZiB0aGlzIHN0cmVhbQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgc3RyZWFtRW5kKCk7Ci0KLSAgLyoqCi0gICAqIFN0YXJ0IHRvIHNlbmQgYSBzdW1tYXJ5Ci0gICAqIEBwYXJhbSBpZCBUaGUgc3RyZWFtJ3MgSUQKLSAgICogQHBhcmFtIGxlbiBUaGUgbnVtYmVyIG9mIGl0ZW1zIHRvIGJlIHNlbnQKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHN1bW1hcnkoaW50IGlkLCBpbnQgbGVuKTsKLQotICAvKioKLSAgICogU2VuZCBhIHN1bW1hcnkgdmFsdWUKLSAgICogQHBhcmFtIHZhbCBUaGUgdmFsdWUKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHN1bW1hcnlWYWx1ZShpbnQgdmFsKTsKLQotICAvKioKLSAgICogRW5kIHRoZSBzdW1tYXJ5Ci0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdW1tYXJ5RW5kKCk7Ci0KLSAgLyoqCi0gICAqIFNlbmQgYWxsIHRoZSBjb250cm9sIGluZm8gZm9yIHRoZSBzcGFjZQotICAgKiBAcGFyYW0gc3BhY2UgVGhlIEdDc3B5IGRyaXZlciBmb3IgdGhpcyBzcGFjZQotICAgKiBAcGFyYW0gdGlsZU51bSBUaGUgbnVtYmVyIG9mIHRpbGVzCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZW5kQ29udHJvbHMoQWJzdHJhY3REcml2ZXIgc3BhY2UsIGludCB0aWxlTnVtKTsKLQotICAvKioKLSAgICogU2VuZCBpbmZvIGZvciB0aGlzIHNwYWNlCi0gICAqIEBwYXJhbSBpbmZvIEEgcG9pbnRlciB0byB0aGUgaW5mb3JtYXRpb24gKGhlbGQgYXMgQyBzdHJpbmcpCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzcGFjZUluZm8oQWRkcmVzcyBpbmZvKTsKLQotICAvKioKLSAgICogRW5kIHRoZSB0cmFuc21pc3Npb24gKGZvciB0aGlzIGV2ZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgZW5kQ29tbXVuaWNhdGlvbigpIHsKLSAgICBpZiAoREVCVUcpIExvZy53cml0ZSgiZW5kQ29tbVxuIik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vZ2NzcHkvU2hvcnRTdHJlYW0uamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vZ2NzcHkvU2hvcnRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg1Mzg5MS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3ZtL2djc3B5L1Nob3J0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy5tbXRrLnZtLmdjc3B5OwotCi1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5Mb2c7Ci1pbXBvcnQgb3JnLm1tdGsudXRpbGl0eS5nY3NweS5Db2xvcjsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lmdjc3B5LkdDc3B5OwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZ2NzcHkuU3RyZWFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZ2NzcHkuZHJpdmVycy5BYnN0cmFjdERyaXZlcjsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLQotLyoqCi0gKiBTZXQgdXAgYSBHQ3NweSBTdHJlYW0gd2l0aCBkYXRhIHR5cGUgU0hPUlRfVFlQRS4KLSAqLwotQFVuaW50ZXJydXB0aWJsZSBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2hvcnRTdHJlYW0gZXh0ZW5kcyBTdHJlYW0gewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluc3RhbmNlIHZhcmlhYmxlcwotICAgKi8KLSAgcHJpdmF0ZSBzaG9ydFtdIGRhdGE7ICAgICAgICAgLy8gVGhlIHN0cmVhbSBkYXRhCi0gIHByaXZhdGUgc2hvcnQgZGVmYXVsdFZhbHVlOyAgIC8vIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgZGF0YSBpdGVtcwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEluaXRpYWxpemF0aW9uCi0gICAqLwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYSBuZXcgR0NzcHkgc3RyZWFtIG9mIFNIT1JUX1RZUEUKLSAgICogQHBhcmFtIGRyaXZlciAgICAgICAgICBUaGUgZHJpdmVyIHRoYXQgb3ducyB0aGlzIFN0cmVhbQotICAgKiBAcGFyYW0gbmFtZSAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHN0cmVhbSAoZS5nLiAiVXNlZCBzcGFjZSIpCi0gICAqIEBwYXJhbSBtaW5WYWx1ZSAgICAgICBUaGUgbWluaW11bSB2YWx1ZSBmb3IgYW55IGl0ZW0gaW4gdGhpcyBzdHJlYW0uCi0gICAqICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgbGVzcyB0aGFuIHRoaXMgd2lsbCBiZSByZXByZXNlbnRlZCBhcyAibWluVmFsdWUtIgotICAgKiBAcGFyYW0gbWF4VmFsdWUgICAgICAgVGhlIG1heGltdW0gdmFsdWUgZm9yIGFueSBpdGVtIGluIHRoaXMgc3RyZWFtLgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGdyZWF0ZXIgdGhhbiB0aGlzIHdpbGwgYmUgcmVwcmVzZW50ZWQgYXMgIm1heFZhbHVlKyIKLSAgICogQHBhcmFtIHplcm9WYWx1ZSAgICAgIFRoZSB6ZXJvIHZhbHVlIGZvciB0aGlzIHN0cmVhbQotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlICAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgc3RyZWFtCi0gICAqIEBwYXJhbSBzdHJpbmdQcmUgICAgICBBIHN0cmluZyB0byBwcmVmaXggdmFsdWVzIChlLmcuICJVc2VkOiAiKQotICAgKiBAcGFyYW0gc3RyaW5nUG9zdCAgICAgQSBzdHJpbmcgdG8gc3VmZml4IHZhbHVlcyAoZS5nLiAiIGJ5dGVzLiIpCi0gICAqIEBwYXJhbSBwcmVzZW50YXRpb24gICBIb3cgYSBzdHJlYW0gdmFsdWUgaXMgdG8gYmUgcHJlc2VudGVkLgotICAgKiBAcGFyYW0gcGFpbnRTdHlsZSAgICAgSG93IHRoZSB2YWx1ZSBpcyB0byBiZSBwYWludGVkLgotICAgKiBAcGFyYW0gaW5kZXhNYXhTdHJlYW0gVGhlIGluZGV4IG9mIHRoZSBtYXhpbXVtIHN0cmVhbSBpZiB0aGUgcHJlc2VudGF0aW9uIGlzICpfVkFSLgotICAgKiBAcGFyYW0gY29sb3VyICAgICAgICAgVGhlIGRlZmF1bHQgY29sb3VyIGZvciB0aWxlcyBvZiB0aGlzIHN0cmVhbQotICAgKi8KLSAgcHVibGljIFNob3J0U3RyZWFtKAotICAgICAgICAgQWJzdHJhY3REcml2ZXIgZHJpdmVyLAotICAgICAgICAgU3RyaW5nIG5hbWUsCi0gICAgICAgICBzaG9ydCBtaW5WYWx1ZSwKLSAgICAgICAgIHNob3J0IG1heFZhbHVlLAotICAgICAgICAgc2hvcnQgemVyb1ZhbHVlLAotICAgICAgICAgc2hvcnQgZGVmYXVsdFZhbHVlLAotICAgICAgICAgU3RyaW5nIHN0cmluZ1ByZSwKLSAgICAgICAgIFN0cmluZyBzdHJpbmdQb3N0LAotICAgICAgICAgaW50IHByZXNlbnRhdGlvbiwKLSAgICAgICAgIGludCBwYWludFN0eWxlLAotICAgICAgICAgaW50IGluZGV4TWF4U3RyZWFtLAotICAgICAgICAgQ29sb3IgY29sb3VyLAotICAgICAgICAgYm9vbGVhbiBzdW1tYXJ5KSB7Ci0KLSAgICBzdXBlcihkcml2ZXIsIFN0cmVhbUNvbnN0YW50cy5TSE9SVF9UWVBFLCBuYW1lLAotICAgICAgICAgIG1pblZhbHVlLCBtYXhWYWx1ZSwgemVyb1ZhbHVlLCBkZWZhdWx0VmFsdWUsCi0gICAgICAgICAgc3RyaW5nUHJlLCBzdHJpbmdQb3N0LCBwcmVzZW50YXRpb24sIHBhaW50U3R5bGUsCi0gICAgICAgICAgaW5kZXhNYXhTdHJlYW0sIGNvbG91ciwgc3VtbWFyeSk7Ci0KLSAgICBkYXRhID0gKHNob3J0W10pR0NzcHkudXRpbC5jcmVhdGVEYXRhQXJyYXkobmV3IHNob3J0WzBdLCBkcml2ZXIuZ2V0TWF4VGlsZU51bSgpKTsKLSAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXNldCBhbGwgZGF0YSBpbiB0aGlzIHN0cmVhbSB0byBkZWZhdWx0IHZhbHVlcy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc2V0RGF0YSgpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspCi0gICAgICBkYXRhW2ldID0gZGVmYXVsdFZhbHVlOwotICB9Ci0KLQotICAvKioKLSAgICogRGlzdHJpYnV0ZSBhIHZhbHVlIGFjcm9zcyBhIHNlcXVlbmNlIG9mIHRpbGVzLiBUaGlzIGhhbmRsZXMgdGhlIGNhc2UKLSAgICogd2hlbiB3aGVuIGFuIG9iamVjdCBzcGFucyB0d28gb3IgbW9yZSB0aWxlcyBhbmQgaXRzIHZhbHVlIGlzIHRvIGJlCi0gICAqIGF0dHJpYnV0ZWQgdG8gZWFjaCB0aWxlIHByb3BvcnRpb25hbGx5LgotICAgKgotICAgKiBAcGFyYW0gc3RhcnQgdGhlIGluZGV4IG9mIHRoZSBzdGFydGluZyB0aWxlCi0gICAqIEBwYXJhbSByZW1haW5kZXIgdGhlIHZhbHVlIGxlZnQgaW4gdGhlIHN0YXJ0aW5nIHRpbGUKLSAgICogQHBhcmFtIGJsb2NrU2l6ZSB0aGUgc2l6ZSBvZiBlYWNoIHRpbGUKLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBkaXN0cmlidXRlCi0gICAqLwotICBwdWJsaWMgdm9pZCBkaXN0cmlidXRlKGludCBzdGFydCwgc2hvcnQgcmVtYWluZGVyLCBpbnQgYmxvY2tTaXplLCBzaG9ydCB2YWx1ZSkgewotICAgIGlmIChWTS5WRVJJRllfQVNTRVJUSU9OUykgVk0uYXNzZXJ0aW9ucy5fYXNzZXJ0KHJlbWFpbmRlciA8PSBibG9ja1NpemUpOwotICAgIGlmICh2YWx1ZSA8PSByZW1haW5kZXIpIHsgIC8vIGZpdHMgaW4gdGhpcyB0aWxlCi0gICAgICBkYXRhW3N0YXJ0XSArPSB2YWx1ZTsKLSAgICAgIC8vY2hlY2tzcGFjZShzdGFydCwgdmFsdWUsICJzY2FuT2JqZWN0IGZpdHMgaW4gZmlyc3QgdGlsZSIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBkYXRhW3N0YXJ0XSArPSByZW1haW5kZXI7Ci0gICAgICAvL2NoZWNrc3BhY2Uoc3RhcnQsIHJlbWFpbmRlciwgInNjYW5PYmplY3QgcmVtYWluZGVyIHB1dCBpbiBmaXJzdCB0aWxlIik7Ci0gICAgICB2YWx1ZSAtPSByZW1haW5kZXI7Ci0gICAgICBzdGFydCsrOwotICAgICAgd2hpbGUgKHZhbHVlID49IGJsb2NrU2l6ZSkgewotICAgICAgICBkYXRhW3N0YXJ0XSArPSBibG9ja1NpemU7Ci0gICAgICAgIC8vY2hlY2tzcGFjZShzdGFydCwgYmxvY2tTaXplLCAic2Nhbk9iamVjdCBzdWJzZXF1ZW50IHRpbGUiKTsKLSAgICAgICAgdmFsdWUgLT0gYmxvY2tTaXplOwotICAgICAgICBzdGFydCsrOwotICAgICAgfQotICAgICAgZGF0YVtzdGFydF0gKz0gdmFsdWU7Ci0gICAgICAvL2NoZWNrc3BhY2Uoc3RhcnQsIHZhbHVlLCAic2Nhbk9iamVjdCBsYXN0IHRpbGUiKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSW5jcmVtZW50IHRoZSB2YWx1ZSBvZiBhIHRpbGUuCi0gICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXgKLSAgICogQHBhcmFtIHZhbHVlIHRoZSBpbmNyZW1lbnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGluY3JlbWVudChpbnQgaW5kZXgsIHNob3J0IHZhbHVlKSB7IGRhdGFbaW5kZXhdICs9IHZhbHVlOyB9Ci0KLSAgLyoqCi0gICAqIFNlbmQgdGhlIGRhdGEgYW5kIHN1bW1hcnkgZm9yIHRoaXMgc3RyZWFtLgotICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50Ci0gICAqIEBwYXJhbSBudW1UaWxlcyBUaGUgbnVtYmVyIG9mIHRpbGVzIHRvIHNlbmQgKHdoaWNoIG1heSBiZSBsZXNzIHRoYW4gbWF4VGlsZU51bSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNlbmQoaW50IGV2ZW50LCBpbnQgbnVtVGlsZXMpIHsKLSAgICBpZiAoREVCVUcpIHsKLSAgICAgIExvZy53cml0ZSgic2VuZGluZyAiKTsgTG9nLndyaXRlKG51bVRpbGVzKTsgTG9nLndyaXRlbG4oIiBpbnQgdmFsdWVzIik7Ci0gICAgfQotICAgIHNlcnZlclNwYWNlLnN0cmVhbShzdHJlYW1JZCwgbnVtVGlsZXMpOwotICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBudW1UaWxlczsgaW5kZXgrKykKLSAgICAgIHNlcnZlclNwYWNlLnN0cmVhbVNob3J0VmFsdWUoZGF0YVtpbmRleF0pOwotICAgIHNlcnZlclNwYWNlLnN0cmVhbUVuZCgpOwotCi0gICAgLy8gc2VuZCB0aGUgc3VtbWFyeQotICAgIHNlbmRTdW1tYXJ5KCk7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay92bS9nY3NweS9TdHJlYW0uamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL21tdGsvdm0vZ2NzcHkvU3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZWIwYjcuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay92bS9nY3NweS9TdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudm0uZ2NzcHk7Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkxvZzsKLWltcG9ydCBvcmcubW10ay51dGlsaXR5Lmdjc3B5LkNvbG9yOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZ2NzcHkuU3RyZWFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5tbXRrLnV0aWxpdHkuZ2NzcHkuZHJpdmVycy5BYnN0cmFjdERyaXZlcjsKLWltcG9ydCBvcmcubW10ay52bS5WTTsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuKjsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLkFkZHJlc3M7Ci0KLS8qKgotICoKLSAqIEFic3RyYWN0IGNsYXNzIGZvciBhIEdDc3B5IFN0cmVhbS4KLSAqIEltcGxlbWVudGluZyBjbGFzc2VzIHdpbGwgbW9zdGx5IGZvcndhcmQgY2FsbHMKLSAqIHRvIHRoZSBnY3NweSBDIGxpYnJhcnkKLSAqLwotCi1AVW5pbnRlcnJ1cHRpYmxlIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdHJlYW0gewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBJbnN0YW5jZSB2YXJpYWJsZXMKLSAgKi8KLQotICAvKioKLSAgICogVGhlIGFkZHJlc3Mgb2YgdGhlIEMgc3RyZWFtLCBnY3NweV9nY19zdHJlYW1fdCAqc3RyZWFtLCB1c2VkIGluIGFsbCBjYWxscwotICAgKiB0byB0aGUgQyBsaWJyYXJ5Ci0gICAqLwotICBwcm90ZWN0ZWQgQWRkcmVzcyBzdHJlYW07Ci0KLSAgLyoqIFRoZSBvd25pbmcgR0NzcHkgc3BhY2UgKi8KLSAgcHJvdGVjdGVkIFNlcnZlclNwYWNlIHNlcnZlclNwYWNlOwotCi0gIC8qKiBUaGUgc3RyZWFtJ3MgSUQgKi8KLSAgcHJvdGVjdGVkIGludCBzdHJlYW1JZDsKLQotICAvKioKLSAgICogQSBzdW1tYXJ5IGhhcyAxIG9yIDIgdmFsdWVzIGRlcGVuZGluZyBvbiBwcmVzZW50YXRpb24gc3R5bGUKLSAgICogKFBFUkNFTlQqIHN0eWxlcyByZXF1aXJlIDIgdmFsdWVzKS4KLSAgICovCi0gIHByb3RlY3RlZCBpbnQgc3VtbWFyeUxlbjsKLQotICAvKiogVGhlIGZpcnN0IHN1bW1hcnkgdmFsdWUgKi8KLSAgcHJvdGVjdGVkIGludCBzdW1tYXJ5MDsKLQotICAvKiogVGhlIHNlY29uZCBzdW1tYXJ5IHZhbHVlIChpZiBhbnkpICovCi0gIHByb3RlY3RlZCBpbnQgc3VtbWFyeTE7Ci0KLSAgcHJpdmF0ZSBpbnQgbWluOyAvLyBUaGUgbWluaW11bSB2YWx1ZSBmb3IgdGlsZXMKLQotICBwcml2YXRlIGludCBtYXg7IC8vIFRoZSBtYXhpbXVtIHZhbHVlIGZvciB0aWxlcwotCi0gIC8qKiB1c2Ugc3VtbWFyaWVzPyAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBzdW1tYXJ5RW5hYmxlZDsKLQotICAvKiogdGhlIHByZXNlbnRhdGlvbiBzdHlsZSAqLwotICBwcm90ZWN0ZWQgaW50IHByZXNlbnRhdGlvbjsKLQotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotICAvKioKLSAgICogQ29uc3RydWN0IGEgbmV3IEdDc3B5IHN0cmVhbS4KLSAgICoKLSAgICogQHBhcmFtIGRyaXZlciBUaGUgQWJzdHJhY3REcml2ZXIgdGhhdCBvd25zIHRoaXMgU3RyZWFtCi0gICAqIEBwYXJhbSBkYXRhVHlwZSBUaGUgc3RyZWFtJ3MgZGF0YSB0eXBlLCBvbmUgb2YgQllURV9UWVBFLCBTSE9SVF9UWVBFIG9yIElOVF9UWVBFCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzdHJlYW0gKGUuZy4gIlVzZWQgc3BhY2UiKQotICAgKiBAcGFyYW0gbWluVmFsdWUgVGhlIG1pbmltdW0gdmFsdWUgZm9yIGFueSBpdGVtIGluIHRoaXMgc3RyZWFtLiBWYWx1ZXMgbGVzcyB0aGFuCi0gICAqICAgICAgICAgICAgICAgICB0aGlzIHdpbGwgYmUgcmVwcmVzZW50ZWQgYXMgIm1pblZhbHVlLSIKLSAgICogQHBhcmFtIG1heFZhbHVlIFRoZSBtYXhpbXVtIHZhbHVlIGZvciBhbnkgaXRlbSBpbiB0aGlzIHN0cmVhbS4gVmFsdWVzIGdyZWF0ZXIgdGhhbgotICAgKiAgICAgICAgICAgICAgICAgdGhpcyB3aWxsIGJlIHJlcHJlc2VudGVkIGFzICJtYXhWYWx1ZSsiCi0gICAqIEBwYXJhbSB6ZXJvVmFsdWUgVGhlIHplcm8gdmFsdWUgZm9yIHRoaXMgc3RyZWFtCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgc3RyZWFtCi0gICAqIEBwYXJhbSBzdHJpbmdQcmUgQSBzdHJpbmcgdG8gcHJlZml4IHZhbHVlcyAoZS5nLiAiVXNlZDogIikKLSAgICogQHBhcmFtIHN0cmluZ1Bvc3QgQSBzdHJpbmcgdG8gc3VmZml4IHZhbHVlcyAoZS5nLiAiIGJ5dGVzLiIpCi0gICAqIEBwYXJhbSBwcmVzZW50YXRpb24gSG93IGEgc3RyZWFtIHZhbHVlIGlzIHRvIGJlIHByZXNlbnRlZC4KLSAgICogQHBhcmFtIHBhaW50U3R5bGUgSG93IHRoZSB2YWx1ZSBpcyB0byBiZSBwYWludGVkLgotICAgKiBAcGFyYW0gaW5kZXhNYXhTdHJlYW0gVGhlIGluZGV4IGZvciB0aGUgbWF4aW11bSBzdHJlYW0gaWYgdGhlIHByZXNlbnRhdGlvbiBpcyAqX1ZBUi4KLSAgICogQHBhcmFtIGNvbG91ciBUaGUgZGVmYXVsdCBjb2xvdXIgZm9yIHRpbGVzIG9mIHRoaXMgc3RyZWFtCi0gICAqIEBwYXJhbSBzdW1tYXJ5IElzIGEgc3VtbWFyeSBlbmFibGVkPwotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmVhbSgKLSAgICAgIEFic3RyYWN0RHJpdmVyIGRyaXZlciwKLSAgICAgIGludCBkYXRhVHlwZSwKLSAgICAgIFN0cmluZyBuYW1lLAotICAgICAgaW50IG1pblZhbHVlLAotICAgICAgaW50IG1heFZhbHVlLAotICAgICAgaW50IHplcm9WYWx1ZSwKLSAgICAgIGludCBkZWZhdWx0VmFsdWUsCi0gICAgICBTdHJpbmcgc3RyaW5nUHJlLAotICAgICAgU3RyaW5nIHN0cmluZ1Bvc3QsCi0gICAgICBpbnQgcHJlc2VudGF0aW9uLAotICAgICAgaW50IHBhaW50U3R5bGUsCi0gICAgICBpbnQgaW5kZXhNYXhTdHJlYW0sCi0gICAgICBDb2xvciBjb2xvdXIsCi0gICAgICBib29sZWFuIHN1bW1hcnkpIHsKLQotICAgIHNlcnZlclNwYWNlID0gZHJpdmVyLmdldFNlcnZlclNwYWNlKCk7Ci0gICAgc3VtbWFyeUVuYWJsZWQgPSBzdW1tYXJ5OwotICAgIHRoaXMucHJlc2VudGF0aW9uID0gcHJlc2VudGF0aW9uOwotICAgIGlmIChzdW1tYXJ5KQotICAgICAgc2V0dXBTdW1tYXJ5KHByZXNlbnRhdGlvbik7Ci0gICAgbWluID0gbWluVmFsdWU7Ci0gICAgbWF4ID0gbWF4VmFsdWU7Ci0KLSAgICBkcml2ZXIuYWRkU3RyZWFtKHRoaXMpOwotICAgIGlmIChERUJVRykgewotICAgICAgTG9nLndyaXRlKCJBZGRpbmcgc3RyZWFtICIpOwotICAgICAgTG9nLndyaXRlKG5hbWUpOwotICAgICAgTG9nLndyaXRlbG4oIiBpZD0iLCBzdHJlYW1JZCk7Ci0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogU2V0IHRoZSBzdHJlYW0gYWRkcmVzcyBhbmQgaWQgKGNhbGxlZCBieSBBYnN0cmFjdERyaXZlci5hZGRTdHJlYW0pLgotICAgKiBAcGFyYW0gaWQgdGhlIGlkCi0gICAqIEBwYXJhbSBzdHIgdGhlIGFkZHJlc3Mgb2YgdGhlIGdjc3B5IEMgZ2NzcHlfZ2Nfc3RyZWFtX3QgKnN0cmVhbQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U3RyZWFtKGludCBpZCwgQWRkcmVzcyBzdHIpIHsKLSAgICBzdHJlYW1JZCA9IGlkOwotICAgIHN0cmVhbSA9IHN0cjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG1pbmltdW0gdmFsdWUgZXhwZWN0ZWQgZm9yIHRoaXMgc3RyZWFtLgotICAgKiBAcmV0dXJuIHRoZSBtaW5pbXVtIHZhbHVlCi0gICAqLwotICBwdWJsaWMgaW50IGdldE1pblZhbHVlKCkgeyByZXR1cm4gbWluOyB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbWF4aW11bSB2YWx1ZSBleHBlY3RlZCBmb3IgdGhpcyBzdHJlYW0uCi0gICAqIEByZXR1cm4gdGhlIG1heGltdW0gdmFsdWUKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TWF4VmFsdWUoKSB7IHJldHVybiBtYXg7IH0KLQotICAvKioKLSAgICogU2V0dXAgdGhlIHN1bW1hcnkgYXJyYXkuCi0gICAqIEBwYXJhbSBwcmVzZW50YXRpb24gdGhlIHByZXNlbnRhdGlvbiBzdHlsZQotICAgKi8KLSAgQEludGVycnVwdGlibGUKLSAgcHJpdmF0ZSB2b2lkIHNldHVwU3VtbWFyeShpbnQgcHJlc2VudGF0aW9uKSB7Ci0gICAgc3dpdGNoIChwcmVzZW50YXRpb24pIHsKLSAgICAgIGNhc2UgU3RyZWFtQ29uc3RhbnRzLlBSRVNFTlRBVElPTl9QTEFJTjoKLSAgICAgIGNhc2UgU3RyZWFtQ29uc3RhbnRzLlBSRVNFTlRBVElPTl9QTFVTOgotICAgICAgY2FzZSBTdHJlYW1Db25zdGFudHMuUFJFU0VOVEFUSU9OX01BWF9WQVI6Ci0gICAgICBjYXNlIFN0cmVhbUNvbnN0YW50cy5QUkVTRU5UQVRJT05fRU5VTToKLSAgICAgICAgc3VtbWFyeUxlbiA9IDE7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTdHJlYW1Db25zdGFudHMuUFJFU0VOVEFUSU9OX1BFUkNFTlQ6Ci0gICAgICBjYXNlIFN0cmVhbUNvbnN0YW50cy5QUkVTRU5UQVRJT05fUEVSQ0VOVF9WQVI6Ci0gICAgICAgIHN1bW1hcnlMZW4gPSAyOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIFZNLmFzc2VydGlvbnMuX2Fzc2VydChmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgc3VtbWFyeSB2YWx1ZSBmb3IgcHJlc2VudGF0aW9uIHN0eWxlcyB3aXRoIGp1c3Qgb25lIHZhbHVlCi0gICAqIEBwYXJhbSB2YWx1ZTAgdGhlIHZhbHVlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTdW1tYXJ5KGludCB2YWx1ZTApIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpCi0gICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQocHJlc2VudGF0aW9uICE9IFN0cmVhbUNvbnN0YW50cy5QUkVTRU5UQVRJT05fUEVSQ0VOVCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbiAhPSBTdHJlYW1Db25zdGFudHMuUFJFU0VOVEFUSU9OX1BFUkNFTlRfVkFSKTsKLSAgICBzdW1tYXJ5MCA9IHZhbHVlMDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIHN1bW1hcnkgdmFsdWVzIGZvciBwcmVzZW50YXRpb24gc3R5bGVzIHdpdGggdHdvIHZhbHVlcyAoaS5lLgotICAgKiBQUkVTRU5UQVRJT05fUEVSQ0VOVCBhbmQgUFJFU0VOVEFUSU9OX1BFUkNFTlRfVkFSKS4KLSAgICogQHBhcmFtIHZhbHVlMCB0aGUgbnVtZXJhdG9yIHZhbHVlCi0gICAqIEBwYXJhbSB2YWx1ZTEgdGhlIGRlbm9taW5hdG9yIHZhbHVlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTdW1tYXJ5KGludCB2YWx1ZTAsIGludCB2YWx1ZTEpIHsKLSAgICBpZiAoVk0uVkVSSUZZX0FTU0VSVElPTlMpCi0gICAgICBWTS5hc3NlcnRpb25zLl9hc3NlcnQocHJlc2VudGF0aW9uID09IFN0cmVhbUNvbnN0YW50cy5QUkVTRU5UQVRJT05fUEVSQ0VOVCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbiA9PSBTdHJlYW1Db25zdGFudHMuUFJFU0VOVEFUSU9OX1BFUkNFTlRfVkFSKTsKLSAgICBzdW1tYXJ5MCA9IHZhbHVlMDsKLSAgICBzdW1tYXJ5MSA9IHZhbHVlMTsKLSAgfQotCi0gIC8qKgotICAgKiBTZW5kIHRoZSBkYXRhIGZvciB0aGlzIHN0cmVhbS4KLSAgICogQHBhcmFtIGV2ZW50IHRoZSBldmVudC4KLSAgICogQHBhcmFtIG51bVRpbGVzIHRoZSBudW1iZXIgb2YgdGlsZXMgdG8gc2VuZC4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNlbmQoaW50IGV2ZW50LCBpbnQgbnVtVGlsZXMpOwotCi0gIC8qKgotICAgKiBTZW5kIHRoZSBzdW1tYXJ5IGRhdGEgZm9yIHRoaXMgc3RyZWFtLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2VuZFN1bW1hcnkoKSB7Ci0gICAgaWYgKHN1bW1hcnlFbmFibGVkKSB7Ci0gICAgICBzZXJ2ZXJTcGFjZS5zdW1tYXJ5KHN0cmVhbUlkLCBzdW1tYXJ5TGVuKTsKLSAgICAgIHNlcnZlclNwYWNlLnN1bW1hcnlWYWx1ZShzdW1tYXJ5MCk7Ci0gICAgICBpZiAoc3VtbWFyeUxlbiA9PSAyKQotICAgICAgICBzZXJ2ZXJTcGFjZS5zdW1tYXJ5VmFsdWUoc3VtbWFyeTEpOwotICAgICAgc2VydmVyU3BhY2Uuc3VtbWFyeUVuZCgpOwotICAgIH0KLSAgfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvbW10ay92bS9nY3NweS9VdGlsLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3ZtL2djc3B5L1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZjYzQ4OS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy9tbXRrL3ZtL2djc3B5L1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLm1tdGsudm0uZ2NzcHk7Ci0KLWltcG9ydCBvcmcubW10ay51dGlsaXR5LkxvZzsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLio7Ci0KLS8qKgotICogQWJzdHJhY3QgY2xhc3MgdGhhdCBwcm92aWRlcyBnZW5lcmFsbHkgdXNlZnVsCi0gKiBtZXRob2RzLgotICovCi1AVW5pbnRlcnJ1cHRpYmxlIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBVdGlsIHsKLQotICAvKioKLSAgICogQWxsb2NhdGUgYW4gYXJyYXkgb2YgYnl0ZXMgd2l0aCBtYWxsb2MKLSAgICoKLSAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgdG8gYWxsb2NhdGUKLSAgICogQHJldHVybiBUaGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IGFsbG9jYXRlZCBpbiBDIHNwYWNlCi0gICAqIEBzZWUgI2ZyZWUKLSAgKi8KLSAgcHVibGljIGFic3RyYWN0IEFkZHJlc3MgbWFsbG9jKGludCBzaXplKTsKLQotICAvKioKLSAgICogRnJlZSBhbiBhcnJheSBvZiBieXRlcyBwcmV2aW91c2x5IGFsbG9jYXRlZCB3aXRoIG1hbGxvYwotICAgKgotICAgKiBAcGFyYW0gYWRkciBUaGUgYWRkcmVzcyBvZiBzb21lIG1lbW9yeSBwcmV2aW91c2x5IGFsbG9jYXRlZCB3aXRoIG1hbGxvYwotICAgKiBAc2VlICNtYWxsb2MKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGZyZWUoQWRkcmVzcyBhZGRyKTsKLQotICAvKioKLSAgICogRHVtcCBhIHJhbmdlIGluIGZvcm1hdCBbc3RhcnQsZW5kKQotICAgKgotICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByYW5nZQotICAgKiBAcGFyYW0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgZHVtcFJhbmdlKEFkZHJlc3Mgc3RhcnQsIEFkZHJlc3MgZW5kKSB7Ci0gICAgTG9nLndyaXRlKCJbIik7IExvZy53cml0ZShzdGFydCk7Ci0gICAgTG9nLndyaXRlKCIsIik7IExvZy53cml0ZShlbmQpOwotICAgIExvZy53cml0ZSgnKScpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlcnQgYSBTdHJpbmcgdG8gYSAwLXRlcm1pbmF0ZWQgYXJyYXkgb2YgYnl0ZXMKLSAgICoKLSAgICogQHBhcmFtIHN0ciBUaGUgc3RyaW5nIHRvIGNvbnZlcnQKLSAgICogQHJldHVybiBUaGUgYWRkcmVzcyBvZiBhIG51bGwtdGVybWluYXRlZCBhcnJheSBpbiBDLXNwYWNlCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgQWRkcmVzcyBnZXRCeXRlcyhTdHJpbmcgc3RyKTsKLQotICAvKioKLSAgICogUHJldHR5IHByaW50IGEgc2l6ZSwgY29udmVydGluZyBmcm9tIGJ5dGVzIHRvIGtpbG8tIG9yIG1lZ2EtYnl0ZXMgYXMgYXBwcm9wcmlhdGUKLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlciBUaGUgYnVmZmVyIChpbiBDIHNwYWNlKSBpbiB3aGljaCB0byBwbGFjZSB0aGUgZm9ybWF0dGVkIHNpemUKLSAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgaW4gYnl0ZXMKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGZvcm1hdFNpemUoQWRkcmVzcyBidWZmZXIsIGludCBzaXplKTsKLQotICAvKioKLSAgICogUHJldHR5IHByaW50IGEgc2l6ZSwgY29udmVydGluZyBmcm9tIGJ5dGVzIHRvIGtpbG8tIG9yIG1lZ2EtYnl0ZXMgYXMgYXBwcm9wcmlhdGUKLSAgICoKLSAgICogQHBhcmFtIGZvcm1hdCBBIGZvcm1hdCBzdHJpbmcKLSAgICogQHBhcmFtIGJ1ZnNpemUgVGhlIHNpemUgb2YgYSBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIGZvcm1hdHRlZCByZXN1bHQKLSAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgaW4gYnl0ZXMKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBBZGRyZXNzIGZvcm1hdFNpemUoU3RyaW5nIGZvcm1hdCwgaW50IGJ1ZnNpemUsIGludCBzaXplKTsKLQotLy8gIHB1YmxpYyBhYnN0cmFjdCBBZGRyZXNzIGZvcm1hdFNpemUoU3RyaW5nIGZvcm1hdCwgaW50IGJ1ZnNpemUsIGludCBzaXplKTsKLQotICAvKioKLSAgICogUGxhY2UgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBsb25nIGluIGFuIGFycmF5IG9mIGJ5dGVzCi0gICAqIHdpdGhvdXQgaW5jdXJyaW5nIGFsbG9jYXRpb24KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlciBUaGUgYnl0ZSBhcnJheQotICAgKiBAcGFyYW0gdmFsdWUgVGhlIGxvbmcgdG8gY29udmVydAotICAgKiBAcmV0dXJuIFRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW50ZWdlcgotICAgKiAgICAgICAgIC0xIGluZGljYXRlcyBzb21lIHByb2JsZW0gKGUuZyB0aGUgY2hhciBidWZmZXIgd2FzIHRvbyBzbWFsbCkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IG51bVRvQnl0ZXMoYnl0ZVtdIGJ1ZmZlciwgbG9uZyB2YWx1ZSkgewotICAgIHJldHVybiBudW1Ub0J5dGVzKGJ1ZmZlciwgdmFsdWUsIDEwKTsKLSAgfQotCi0gIC8qKgotICAgKiBQbGFjZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGxvbmcgaW4gYW4gYXJyYXkgb2YgYnl0ZXMKLSAgICogd2l0aG91dCBpbmN1cnJpbmcgYWxsb2NhdGlvbgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVyIFRoZSBieXRlIGFycmF5Ci0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgbG9uZyB0byBjb252ZXJ0Ci0gICAqIEBwYXJhbSByYWRpeCB0aGUgYmFzZSB0byB1c2UgZm9yIGNvbnZlcnNpb24KLSAgICogQHJldHVybiBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGludGVnZXIKLSAgICogICAgICAgICAtMSBpbmRpY2F0ZXMgc29tZSBwcm9ibGVtIChlLmcgdGhlIGNoYXIgYnVmZmVyIHdhcyB0b28gc21hbGwpCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBudW1Ub0J5dGVzKGJ5dGVbXSBidWZmZXIsIGxvbmcgdmFsdWUsIGludCByYWRpeCkgewotCi0gICAgaWYgKHJhZGl4IDwgQ2hhcmFjdGVyLk1JTl9SQURJWCB8fCByYWRpeCA+IENoYXJhY3Rlci5NQVhfUkFESVgpCi0gICAgICByYWRpeCA9IDEwOwotCi0gICAgaWYgKHZhbHVlID09IDApIHsKLSAgICAgIGJ1ZmZlclswXSA9IChieXRlKScwJzsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIGJvb2xlYW4gbmVnYXRpdmU7Ci0gICAgbG9uZyBsb25nVmFsdWU7Ci0gICAgaW50IGNvdW50OwotICAgIGlmICghKG5lZ2F0aXZlID0gKHZhbHVlIDwgMCkpKSB7Ci0gICAgICBsb25nVmFsdWUgPSAtdmFsdWU7Ci0gICAgICBjb3VudCA9IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGxvbmdWYWx1ZSA9IHZhbHVlOwotICAgICAgY291bnQgPSAyOwotICAgIH0KLQotICAgIGxvbmcgaiA9IGxvbmdWYWx1ZTsKLSAgICB3aGlsZSAoKGogLz0gcmFkaXgpICE9IDApIGNvdW50Kys7Ci0gICAgaWYgKGNvdW50ID4gYnVmZmVyLmxlbmd0aCkKLSAgICAgIHJldHVybiAtMTsgLy8gb3ZlcmZsb3cKLQotICAgIGludCBpID0gY291bnQ7Ci0gICAgZG8gewotICAgICAgaW50IGNoID0gKGludCkgLShsb25nVmFsdWUgJSByYWRpeCk7Ci0gICAgICBpZiAoY2ggPiA5KQotICAgICAgICBjaCAtPSAoMTAgLSAoaW50KSAnYScpOwotICAgICAgZWxzZQotICAgICAgICBjaCArPSAoaW50KSAnMCc7Ci0gICAgICBidWZmZXIgWy0taV0gPSAoYnl0ZSkgY2g7Ci0gICAgfSB3aGlsZSAoKGxvbmdWYWx1ZSAvPSByYWRpeCkgIT0gMCk7Ci0gICAgaWYgKG5lZ2F0aXZlKSBidWZmZXIgWzBdID0gKGJ5dGUpJy0nOwotCi0gICAgcmV0dXJuIGNvdW50OwotCi0gIH0KLQotICAvKioKLSAgICogc3ByaW50ZihjaGFyICpzdHIsIGNoYXIgKmZvcm1hdCwgY2hhciogdmFsdWUpCi0gICAqCi0gICAqIEBwYXJhbSBzdHIgVGhlIGRlc3RpbmF0aW9uICdzdHJpbmcnIChtZW1vcnkgaW4gQyBzcGFjZSkKLSAgICogQHBhcmFtIGZvcm1hdCBUaGUgZm9ybWF0ICdzdHJpbmcnIChtZW1vcnkgaW4gQyBzcGFjZSkKLSAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSAnc3RyaW5nJyAobWVtb3J5IGluIEMgc3BhY2UpCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQgKGFzIHJldHVybmVkIGJ5IEMncyBzcHJpbnRmCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgaW50IHNwcmludGYoQWRkcmVzcyBzdHIsIEFkZHJlc3MgZm9ybWF0LCBBZGRyZXNzIHZhbHVlKTsKLQotICAvKioKLSAgICogQ3JlYXRlIGFuIGFycmF5IG9mIGEgcGFydGljdWxhciB0eXBlLgotICAgKiBUaGUgZWFzaWVzdCB3YXkgdG8gdXNlIHRoaXMgaXM6Ci0gICAqICAgICBGb29bXSB4ID0gKEZvbyBbXSlTdHJlYW0uY3JlYXRlRGF0YUFycmF5KG5ldyBGb29bMF0sIG51bUVsZW1lbnRzKTsKLSAgICogQHBhcmFtIHRlbXBsIGEgZGF0YSBhcnJheSB0byB1c2UgYXMgYSB0ZW1wbGF0ZQotICAgKiBAcGFyYW0gbnVtRWxlbWVudHMgbnVtYmVyIG9mIGVsZW1lbnRzIGluIG5ldyBhcnJheQotICAgKiBAcmV0dXJuIHRoZSBuZXcgYXJyYXkKLSAgICovCi0gIEBJbnRlcnJ1cHRpYmxlCi0gIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgY3JlYXRlRGF0YUFycmF5KE9iamVjdCB0ZW1wbCwgaW50IG51bUVsZW1lbnRzKTsKLX0KLQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy9JbnRyaW5zaWMuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvSW50cmluc2ljLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNjNlNWUuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy9JbnRyaW5zaWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIChDUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvY3BsMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcudm1tYWdpYzsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkluaGVyaXRlZDsKLQotLyoqCi0gKiBBbiBpbnRyaW5zaWMgbWV0aG9kIGlzIGEgbWV0aG9kIHRoYXQgaXMgYnVpbHQgaW4gKHRoYXQgaXMsIGludHJpbnNpYykgdG8gdGhlIGNvbXBpbGVyCi0gKiByYXRoZXIgdGhhbiBwYXJ0IG9mIGEgY2xhc3MgbGlicmFyeS4gSW50cmluc2ljIG1ldGhvZHMgYXJlIGFuIGVzY2FwZSBoYXRjaCB0byBwcm92aWRlCi0gKiAibWFnaWMiIHRoYXQgaXMgaW5leHByZXNzaWJsZSBpbnQgdGhlIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuIEEgY29tcGlsZXIgaW50cmluc2ljCi0gKiB3aWxsIHVzdWFsbHkgZ2VuZXJhdGUgYSBzcGVjaWZpYyBjb2RlIHNlcXVlbmNlIHRoYXQgaXMgaW5saW5lZCBhbmQgb3B0aW1pemVkIGFzIHBhcnQKLSAqIGJ5IHRoZSBjb21waWxlci4gVW5sZXNzIGFuIGludHJpbnNpYyBtZXRob2QgaXMgZXhwZWN0ZWQgdG8gYmUgZXhlY3V0ZWQgaW4gYSBub24taW50cmluc2ljCi0gKiBhd2FyZSBjb21waWxlciwgdGhlIGJvZHkgb2YgdGhlIG1ldGhvZCBzaG91bGQgYmUgZW1wdHkuCi0gKgotICogPHA+SWYgdGhlIEludHJpbnNpYyBhbm5vdGF0aW9uIGlzIGFwcGxpZWQgdG8gYSBtZXRob2QgdGhlbiB0aGVuIHRoZSBtZXRob2QgaXMgYSBjb21waWxlcgotICogaW50cmluc2ljLiBJZiB0aGUgSW50cmluc2ljIGFubm90YXRpb24gaXMgYXBwbGllZCB0byBhIGNsYXNzIHRoZW4gYWxsIHRoZSBtZXRob2RzIG9mCi0gKiB0aGUgY2xhc3MgQU5EIGFsbCBzdWJjbGFzc2VzIGFyZSBpbnRyaW5zaWMuPC9wPgotICoKLSAqIDxwPk5PVEU6IEF0IHRoZSBjdXJyZW50IHRpbWUgdGhlIEludHJpbnNpYyBhbm5vdGF0aW9uIGlzIG9ubHkgdXNlZCBmb3IgZG9jdW1lbnRhdGlvbgotICogcHVycG9zZXMgYnV0IGluIHRoZSBuZWFyIGZ1dHVyZSBpdCBpcyBleHBlY3RlZCB0aGF0IHRoZSBzZW1hbnRpY3Mgb2YgdGhlIGFubm90YXRpb24gd2lsbAotICogYmUgZW5mb3JjZWQgYnkgdGhlIGNvbXBpbGVyLjwvcD4KLSAqLwotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKLUBUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsRWxlbWVudFR5cGUuTUVUSE9EfSkKLUBJbmhlcml0ZWQKLXB1YmxpYyBAaW50ZXJmYWNlIEludHJpbnNpYyB7IH0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvUHJhZ21hLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL1ByYWdtYS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Nzc0Yjk3Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvUHJhZ21hLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSAoQ1BMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2NwbDEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLnZtbWFnaWM7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Jbmhlcml0ZWQ7Ci0KLS8qKgotICogQSBQcmFnbWEgaXMgYSBtZWNoYW5pc20gZm9yIHN1cHBseWluZyBpbmZvcm1hdGlvbiB0byB0aGUgY29tcGlsZXIgdG8gYWx0ZXIgdGhlIGNvZGUgaXQKLSAqIGdlbmVyYXRlcyBmb3IgYSBtZXRob2QuIEEgUHJhZ21hIGlzIHNpbWlsYXIgdG8gYW4ge0BsaW5rIG9yZy52bW1hZ2ljLkludHJpbnNpY30KLSAqIGJ1dCBpdCBkb2VzIG5vdCBwcm92aWRlIGFueSBiZWhhdmlvdXIgYnV0IHByb3ZpZGVzIGluZm9ybWF0aW9uIHRvIHRoZSBjb21waWxlciB0aGF0IG1vZGlmaWVzCi0gKiBvcHRpbWl6YXRpb25zLCBjYWxsaW5nIGNvbnZlbnRpb25zIGFuZCBhY3RpdmF0aW9uIGZyYW1lIGxheW91dC4KLSAqCi0gKiA8cD5JZiB0aGUgUHJhZ21hIGFubm90YXRpb24gaXMgYXBwbGllZCB0byBhIG1ldGhvZCB0aGVuIHRoZW4gdGhlIG1ldGhvZCBpcyBhIGhhbmRsZWQgc3BlY2lhbGx5Ci0gKiBieSB0aGUgY29tcGlsZXIuIElmIHRoZSBQcmFnbWEgYW5ub3RhdGlvbiBpcyBhcHBsaWVkIHRvIGEgY2xhc3MgdGhlbiB0aGVuIGFsbCB0aGUgbWV0aG9kcyBpbiB0aGF0Ci0gKiBjbGFzcyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgdGhlIGNvbXBpbGVyLjwvcD4KLSAqCi0gKiA8cD5OT1RFOiBBdCB0aGUgY3VycmVudCB0aW1lIHRoZSBQcmFnbWEgYW5ub3RhdGlvbiBpcyBvbmx5IHVzZWQgZm9yIGRvY3VtZW50YXRpb24KLSAqIHB1cnBvc2VzIGJ1dCBpbiB0aGUgbmVhciBmdXR1cmUgaXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgc2VtYW50aWNzIG9mIHRoZSBhbm5vdGF0aW9uIHdpbGwKLSAqIGJlIGVuZm9yY2VkIGJ5IHRoZSBjb21waWxlci48L3A+Ci0gKi8KLUBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCi1AVGFyZ2V0KHtFbGVtZW50VHlwZS5UWVBFLEVsZW1lbnRUeXBlLk1FVEhPRH0pCi1ASW5oZXJpdGVkCi1wdWJsaWMgQGludGVyZmFjZSBQcmFnbWEgeyB9CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL1VuYm94ZWQuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvVW5ib3hlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTNlM2NmLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvVW5ib3hlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgKENQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9jcGwxLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy52bW1hZ2ljOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uSW5oZXJpdGVkOwotCi0vKioKLSAqIFRoZSBVbmJveGVkIGFubm90YXRpb24gbWFya3MgYSB0eXBlIGFzIHVuYm94ZWQuIEJlc2lkZXMgdGhlIHByaW1pdGl2ZSB0eXBlcywgYWxsIEphdmEgdmFsdWVzCi0gKiBhcmUgYm94ZWQgdHlwZXMuIENvbmNlcHR1YWxseSwgdGhleSBhcmUgcmVwcmVzZW50ZWQgYnkgYSBwb2ludGVyIHRvIGEgaGVhcCBvYmplY3QuIEhvd2V2ZXIsCi0gKiBhbiB1bmJveGVkIHR5cGUgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIHZhbHVlIGl0c2VsZi4gQWxsIG1ldGhvZHMgb24gYW4gdW5ib3hlZCB0eXBlIGFyZQotICoge0BsaW5rIEludHJpbnNpY31zLgotICoKLSAqIDxwPkFzIGFuIHVuYm94ZWQgdHlwZSBpcyBub3QgYSByZWd1bGFyIGphdmEgb2JqZWN0IHRoZXJlIGFyZSBhIGZldyBjb25zdHJhaW50cyBvbiB0aGUgd2F5IHVuYm94ZWQKLSAqIHR5cGVzIGFyZSBoYW5kbGVkOzwvcD4KLSAqIDx1bD4KLSAqICAgPGxpPkFsbCBtZXRob2RzIGFyZSB7QGxpbmsgSW50cmluc2ljfSBhbmQgdGh1cyB0aGVyZSBjYW4gYmUgbm8gdmlydHVhbCBtZXRob2RzLjwvbGk+Ci0gKiAgIDxsaT5BbiB1bmJveGVkIHR5cGUgY2FuIG5vdCBiZSBzeW5jaHJvbml6ZWQgb24uPC9saT4KLSAqICAgPGxpPkFuIHVuYm94ZWQgdHlwZSBoYXMgbm8gaGFzaGNvZGUuPC9saT4KLSAqICAgPGxpPkFuIHVuYm94ZWQgdHlwZSBNVVNUIE5PVCBiZSBwYXNzZWQgd2hlcmUgYW4gb2JqZWN0IGlzIGV4cGVjdGVkIG9yIHdoZW4gdHdvIG92ZXJsb2FkZWQgbWV0aG9kcwotICogICAgICAgY2FuIG9ubHkgYmUgZGlzdGluZ3Vpc2hlZCBieSBieSBPYmplY3QgdnMgdW5ib3hlZCBwYXJhbWV0ZXIgdHlwZS48L2xpPgotICogPC91bD4KLSAqCi0gKiA8cD5OT1RFOiBBdCB0aGUgY3VycmVudCB0aW1lIHRoZSBVbmJveGVkIGFubm90YXRpb24gaXMgb25seSB1c2VkIGZvciBkb2N1bWVudGF0aW9uCi0gKiBwdXJwb3NlcyBidXQgaW4gdGhlIG5lYXIgZnV0dXJlIGl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIHNlbWFudGljcyBvZiB0aGUgYW5ub3RhdGlvbiB3aWxsCi0gKiBiZSBlbmZvcmNlZCBieSB0aGUgY29tcGlsZXIuPC9wPgotICovCi1AUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQotQFRhcmdldChFbGVtZW50VHlwZS5UWVBFKQotQEluaGVyaXRlZAotcHVibGljIEBpbnRlcmZhY2UgVW5ib3hlZCB7IH0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL0Jhc2VsaW5lTm9SZWdpc3RlcnMuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL0Jhc2VsaW5lTm9SZWdpc3RlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNiYTY1Yi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9CYXNlbGluZU5vUmVnaXN0ZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSAoQ1BMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2NwbDEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLnZtbWFnaWMucHJhZ21hOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLnZtbWFnaWMuUHJhZ21hOwotCi0vKioKLSAqIFNvbWUgbWV0aG9kcyBzaG91bGRuJ3QgdXNlIHJlZ2lzdGVycyBmb3IgbG9jYWxzIGFuZCBzdGFjayB2YWx1ZXMuCi0gKiBFLmcuIENvbGxlY3RvclRocmVhZCBjYW4ndCByZWxvY2F0ZSByZWZzIGluIHJlZ2lzdGVycyBvZiBpdHMgb3duLgotICovCi1AUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQotQFRhcmdldChFbGVtZW50VHlwZS5NRVRIT0QpCi1AUHJhZ21hCi1wdWJsaWMgQGludGVyZmFjZSBCYXNlbGluZU5vUmVnaXN0ZXJzIHsgfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy9wcmFnbWEvQmFzZWxpbmVTYXZlTFNSZWdpc3RlcnMuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL0Jhc2VsaW5lU2F2ZUxTUmVnaXN0ZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNDY0YzcuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy9wcmFnbWEvQmFzZWxpbmVTYXZlTFNSZWdpc3RlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIChDUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvY3BsMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcudm1tYWdpYy5wcmFnbWE7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBvcmcudm1tYWdpYy5QcmFnbWE7Ci0KLS8qKgotICogTWV0aG9kcyB3aXRoIHRoaXMgcHJhZ21hIHRoYXQgYXJlIEJhc2VsaW5lQ29tcGlsZWQgc2hvdWxkIHNhdmUgaW4gaXRzIHByb2xvZ3VlLCBBTEwgcmVnaXN0ZXJzIHRoYXQKLSAqIGNhbiBiZSB1c2VkIHRvIHN0b3JlIGxvY2FsIGFuZCBzdGFjayByZWdpc3RlcnMgaW4gYW55IEJhc2VsaW5lQ29tcGlsZWQgbWV0aG9kLiBVc2VkIGJ5IE9TUi4KLSAqLwotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKLUBUYXJnZXQoRWxlbWVudFR5cGUuTUVUSE9EKQotQFByYWdtYQotcHVibGljIEBpbnRlcmZhY2UgQmFzZWxpbmVTYXZlTFNSZWdpc3RlcnMgeyB9CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9EeW5hbWljQnJpZGdlLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9EeW5hbWljQnJpZGdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMDM1NDUuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy9wcmFnbWEvRHluYW1pY0JyaWRnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgKENQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9jcGwxLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy52bW1hZ2ljLnByYWdtYTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy52bW1hZ2ljLlByYWdtYTsKLQotLyoqCi0gKiBNZXRob2RzIG9mIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlIGFyZSB0cmVhdGVkIHNwZWNpYWxseQotICogYnkgdGhlIGNvbXBpbGVycy4KLSAqCi0gKiA8cD5JbnN0ZWFkIG9mIHNhdmluZyBqdXN0IHRoZSBub24tdm9sYXRpbGUgcmVnaXN0ZXJzIHVzZWQgYnkgdGhlIG1ldGhvZCBpbnRvCi0gKiB0aGUgcmVnaXN0ZXIgc2F2ZSBhcmVhIG9mIHRoZSBtZXRob2QncyBzdGFja2ZyYW1lLCB0aGUgY29tcGlsZXIgZ2VuZXJhdGVzCi0gKiBjb2RlIHRvIHNhdmUgKmFsbCogR1BSIGFuZCBGUFIgcmVnaXN0ZXJzIGV4Y2VwdCBHUFIwLCBGUFIwLCBKVE9DLCBhbmQgRlAuCi0gKgotICogPHA+TWV0aG9kcyBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIG1heSBub3QgcmV0dXJuLgotICogICAgKGl0IGlzIGFzc3VtZWQgdGhhdCBleGVjdXRpb24gaXMgcmVzdW1lZCB2aWEgYSBjYWxsIHRvIE1hZ2ljLmR5bmFtaWNCcmlkZ2VUbykKLSAqCi0gKiBAc2VlIG9yZy5qaWtlc3J2bS5ydW50aW1lLk1hZ2ljI2R5bmFtaWNCcmlkZ2VUbyhvcmcuamlrZXNydm0uQXJjaGl0ZWN0dXJlU3BlY2lmaWMuQ29kZUFycmF5KQotICovCi1AUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQotQFRhcmdldChFbGVtZW50VHlwZS5UWVBFKQotQFByYWdtYQotcHVibGljIEBpbnRlcmZhY2UgRHluYW1pY0JyaWRnZSB7IH0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL0VudHJ5cG9pbnQuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL0VudHJ5cG9pbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc1NTAyNC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9FbnRyeXBvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSAoQ1BMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2NwbDEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLnZtbWFnaWMucHJhZ21hOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLnZtbWFnaWMuUHJhZ21hOwotCi0vKioKLSAqIFRoZSBlbnRyeXBvaW50IGFubm90YXRpb24gaW5kaWNhdGVzIHRoYXQgdGhlIG1ldGhvZCBvciBmaWVsZCBpcwotICogZGlyZWN0bHkgYWNjZXNzZWQgYnkgdGhlIGNvbXBpbGVyLiBXZSBjYWNoZSByZXNvbHZlZCB2YWx1ZXMgZm9yCi0gKiB0aGVzZSBlbGVtZW50cyBpbiBFbnRyeXBvaW50cy4KLSAqLwotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKLUBUYXJnZXQoe0VsZW1lbnRUeXBlLk1FVEhPRCwgRWxlbWVudFR5cGUuRklFTER9KQotQFByYWdtYQotcHVibGljIEBpbnRlcmZhY2UgRW50cnlwb2ludCB7IH0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL0lubGluZS5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy9wcmFnbWEvSW5saW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMmI2MjcuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy9wcmFnbWEvSW5saW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSAoQ1BMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2NwbDEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLnZtbWFnaWMucHJhZ21hOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLnZtbWFnaWMuUHJhZ21hOwotCi0vKioKLSAqIFRoaXMgcHJhZ21hIGluZGljYXRlcyB0aGF0IGEgcGFydGljdWxhciBtZXRob2Qgc2hvdWxkIGFsd2F5cyBiZSBpbmxpbmVkCi0gKiBieSB0aGUgb3B0aW1pemluZyBjb21waWxlci4KLSAqLwotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKLUBUYXJnZXQoRWxlbWVudFR5cGUuTUVUSE9EKQotQFByYWdtYQotcHVibGljIEBpbnRlcmZhY2UgSW5saW5lIHsKLSAgLyoqCi0gICAqIEVudW1lcmF0aW9uIGRlZmluaW5nIHdoZW4gdG8gaW5saW5lCi0gICAqLwotICBwdWJsaWMgZW51bSBXaGVuIHsKLSAgICAvKioKLSAgICAgKiBBbHdheXMgaW5saW5lLCByZWdhcmRsZXNzIG9mIGFyZ3VtZW50cwotICAgICAqLwotICAgIEFsd2F5cywKLSAgICAvKioKLSAgICAgKiBJbmxpbmUgd2hlbiBhbGwgdGhlIGFyZ3VtZW50cyBhcmUgY29uc3RhbnRzCi0gICAgICovCi0gICAgQWxsQXJndW1lbnRzQXJlQ29uc3RhbnQsCi0gICAgLyoqCi0gICAgICogSW5saW5lIHdoZW4gdGhlIHNwZWNpZmllZCBhcmd1bWVudHMgYXJlIGNvbnN0YW50cwotICAgICAqLwotICAgIEFyZ3VtZW50c0FyZUNvbnN0YW50LAotICAgIC8qKgotICAgICAqIElubGluZSB3aGVuIHRoZSBWTSBpcyBidWlsdCB3aXRob3V0IEFzc2VydGlvbnMgKFZNLlZlcmlmeUFzc2VydGlvbnMgPT0gZmFsc2UpLgotICAgICAqIE5vdGU6IEl0IHdvdWxkIGJlIG5pY2VyIHRvIGhhdmUgdGhlIG1vcmUgZ2VuZXJhbCBFeHByZXNzaW9uSXNUcnVlIGFubm90YXRpb24sCi0gICAgICogYnV0IHRoZSBhcmd1bWVudCBleHByZXNzaW9uIHRvIHRoZSBhbm5vdGF0aW9uIGlzIHJlc3RyaWN0ZWQgdG8gYmUgYSBmYWlybHkKLSAgICAgKiB0cml2aWFsIGNvbnN0YW50LCBhbmQgdGhhdCBpc24ndCBlbm91Z2ggdG8gaGFuZGxlIGhvdyBWTS5WRVJJRllfQVNTRVJUSU9OUwotICAgICAqIGlzIGRlZmluZWQgaW4gTU1Uay4KLSAgICAgKi8KLSAgICBBc3NlcnRpb25zRGlzYWJsZWQKLSAgfQotICAvKioKLSAgICogV2hlbiB0byBpbmxpbmUsIGRlZmF1bHQgV2hlbi5BbHdheXMKLSAgICovCi0gIFdoZW4gdmFsdWUoKSBkZWZhdWx0IFdoZW4uQWx3YXlzOwotICAvKioKLSAgICogQXJndW1lbnRzIHRoYXQgbXVzdCBiZSBjb25zdGFudCB0byBjYXVzZSBpbmxpbmluZy4gTkIgZm9yIHN0YXRpYyBtZXRob2RzIDAKLSAgICogaXMgdGhlIGZpcnN0IGFyZ3VtZW50IHdoaWxzdCBmb3IgdmlydHVhbCBtZXRob2RzIDAgaXMgdGhpcwotICAgKi8KLSAgaW50W10gYXJndW1lbnRzKCkgZGVmYXVsdCB7fTsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL0ludGVycnVwdGlibGUuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL0ludGVycnVwdGlibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE2NTBlMC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9JbnRlcnJ1cHRpYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSAoQ1BMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2NwbDEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLnZtbWFnaWMucHJhZ21hOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLnZtbWFnaWMuUHJhZ21hOwotCi0vKioKLSAqIEJ5IGRlZmF1bHQgYWxsIEphdmEgY29kZSBpcyBpbnRlcnJ1cHRpYmxlLCB0aGF0IGlzIHNjaGVkdWxpbmcgb3IgZ2FyYmFnZQotICogY29sbGVjdGlvbiBtYXkgb2NjdXIgYXQgcG9pbnRzIHdpdGhpbiB0aGUgY29kZS4gQ29kZSBjYW4gYmUgbWFya2VkIGFzCi0gKiB7QGxpbmsgVW5wcmVlbXB0aWJsZX0gb3Ige0BsaW5rIFVuaW50ZXJydXB0aWJsZX0sIHRoYXQgaW5zdHJ1Y3RzIHRoZSBKVk0gdG8KLSAqIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvbiBhbmQgdGhyZWFkIHNjaGVkdWxpbmcuIFRoZSB7QGxpbmsgVW5pbnRlcnJ1cHRpYmxlfQotICogYW5ub3RhdGlvbiBkaXNhbGxvd3MgYW55IG9wZXJhdGlvbiB0aGF0IG1heSBjYXVzZSBnYXJiYWdlIGNvbGxlY3Rpb24gb3IKLSAqIHRocmVhZCBzY2hlZHVsaW5nLCBmb3IgZXhhbXBsZSBtZW1vcnkgYWxsb2NhdGlvbi4gVGhlIHtAbGluayBVbnByZWVtcHRpYmxlfQotICogYW5ub3RhdGlvbiBkb2Vzbid0IGRpc2FsbG93IG9wZXJhdGlvbnMgdGhhdCBjYW4gY2F1c2UgZ2FyYmFnZSBjb2xsZWN0aW9uIG9yCi0gKiBzY2hlZHVsaW5nLCBidXQgaW5zdHJ1Y3RzIHRoZSBKVk0gdG8gYXZvaWQgaW5zZXJ0aW5nIHN1Y2ggb3BlcmF0aW9ucyBkdXJpbmcgYQotICogYmxvY2sgb2YgY29kZS4KLSAqCi0gKiBJbiB0aGUgaW50ZXJuYWxzIG9mIGEgVk0gbW9zdCBjb2RlIHdhbnRzIHRvIGJlIHtAbGluayBVbmludGVycnVwdGlibGV9LgotICogSG93ZXZlciwgY29kZSBpbnZvbHZlZCBpbiBzY2hlZHVsaW5nIGFuZCBsb2NraW5nIHdpbGwgY2F1c2UgY29udGV4dCBzd2l0Y2hlcywKLSAqIGFuZCBjcmVhdGluZyBleGNlcHRpb24gb2JqZWN0cyBtYXkgdHJpZ2dlciBnYXJiYWdlIGNvbGxlY3Rpb24sIHRoaXMgY29kZSBpcwotICogdGhlcmVmb3JlIHtAbGluayBVbnByZWVtcHRpYmxlfS4KLSAqCi0gKiBUaGlzIHByYWdtYSBpcyB1c2VkIHRvIGRlY2xhcmUgdGhhdCBhIHBhcnRpY3VsYXIgbWV0aG9kIGlzIGludGVycnVwdGlibGUuIEl0Ci0gKiBpcyB1c2VkIHRvIG92ZXJyaWRlIHRoZSBjbGFzcy13aWRlIHByYWdtYSB7QGxpbmsgVW5pbnRlcnJ1cHRpYmxlfS4KLSAqLwotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKLUBUYXJnZXQoRWxlbWVudFR5cGUuTUVUSE9EKQotQFByYWdtYQotcHVibGljIEBpbnRlcmZhY2UgSW50ZXJydXB0aWJsZSB7Ci0gIC8qKgotICAgKiBAcmV0dXJuIEV4cGxhbmF0aW9uIG9mIHdoeSBjb2RlIG5lZWRzIHRvIGJlIGludGVycnVwdGlibGUKLSAgICovCi0gIFN0cmluZyB2YWx1ZSgpIGRlZmF1bHQgIiI7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9Mb2dpY2FsbHlVbmludGVycnVwdGlibGUuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL0xvZ2ljYWxseVVuaW50ZXJydXB0aWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDEwYmY0Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL0xvZ2ljYWxseVVuaW50ZXJydXB0aWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgKENQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9jcGwxLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy52bW1hZ2ljLnByYWdtYTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy52bW1hZ2ljLlByYWdtYTsKLQotLyoqCi0gKiBBIHByYWdtYSB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlY2xhcmUgdGhhdCBhIHBhcnRpY3VsYXIgbWV0aG9kIGlzIGxvZ2ljYWxseQotICogdW5pbnRlcnJ1cHRpYmxlIGV2ZW4gdGhvdWdoIGl0IGNvbnRhaW5zIGJ5dGVjb2RlcyB0aGF0IGFyZSBhY3R1YWxseQotICogaW50ZXJydXB0aWJsZS4KLSAqCi0gKiBUaGUgZWZmZWN0IG9mIHRoaXMgcHJhZ21hIGlzIHRvIHN1cHByZXNzIHdhcm5pbmcgbWVzc2FnZXMgYWJvdXQgdmlvbGF0aW9ucyBvZgotICogdW5pbnRlcnJ1cHRpYmxpdHkgd2hlbiBjb21waWxpbmcgYSBtZXRob2QgdGhhdCB0aHJvd3MgdGhpcyBleGNlcHRpb24uIFRoZXJlCi0gKiBhcmUgdHdvIGNhc2VzIGluIHdoaWNoIHVzaW5nIHRoZSBwcmFnbWEgaXMganVzdGlmaWVkLgotICogPHVsPgotICogPGxpPiBVbmludGVycnVwdGliaWxpdHkgaXMgZW5zdXJlZCB2aWEgc29tZSBvdGhlciBtZWNoYW5pc20uIEZvciBleGFtcGxlLCB0aGUKLSAqIG1ldGhvZCBleHBsaWNpdGx5IGRpc2FibGVzIHRocmVhZHN3aXRjaGluZyBhcm91bmQgdGhlIGludGVycnVwdGlibGUgcmVnaW9ucwotICogKFZNLnN5c1dyaXRlIG9uIFN0cmluZykuIE9yIHRoZSBpbnRlcnJ1cHRpYmxlIHJlZ2lvbnMgYXJlIG5vdCByZWFjaGFibGUgd2hlbgotICogdGhlIFZNIGlzIHJ1bm5pbmcgKHZhcmlvdXMgVk0uc3lzV3JpdGUgdGhhdCBjaGVjayBWTS5ydW5uaW5nVk0pLgotICogPGxpPiBUaGUgaW50ZXJydXB0aWJsZSByZWdpb25zIHJlcHJlc2VudCBhbiAnZXJyb3InIGNvbmRpdGlvbiB0aGF0IHdpbGwgbmV2ZXIKLSAqIGJlIGV4ZWN1dGVkIHVubGVzcyB0aGUgVk0gaXMgYWxyZWFkeSBpbiB0aGUgcHJvY2VzcyBvZiByZXBvcnRpbmcgYW4gZXJyb3IsCi0gKiBmb3IgZXhhbXBsZSBSdW50aW1lRW50cnlwb2ludHMucmFpc2VDbGFzc0Nhc3RFeGNlcHRpb24uCi0gKiA8dWw+Ci0gKiBFeHRyZW1lIGNhcmUgbXVzdCBiZSBleGVyY2lzZWQgd2hlbiB1c2luZyB0aGlzIHByYWdtYSBzaW5jZSBpdCBzdXBwcmVzc2VzIHRoZQotICogY2hlY2tpbmcgb2YgdW5pbnRlcnJ1cHRpYmlsaXR5LgotICogPHA+Ci0gKiBVc2Ugb2YgdGhpcyBwcmFnbWEgaXMgYmVpbmcgcGhhc2VkIG91dCBzaW5jZSBpdCBsdW1wcyB0b2dldGhlciB0d28gcG9zc2libGUKLSAqIHNwZWNpYWwgY2FzZXMuIFVzZSBlaXRoZXIge0BsaW5rIFVucHJlZW1wdGlibGV9IG9yCi0gKiB7QGxpbmsgVW5pbnRlcnJ1cHRpYmxlTm9XYXJufSBpbnN0ZWFkLgotICoge0BsaW5rIDxhIGhyZWY9Imh0dHA6Ly9qaXJhLmNvZGVoYXVzLm9yZy9icm93c2UvUlZNLTExNSI+UlZNLTExNTwvYT59IGZvciBtb3JlCi0gKiBjb250ZXh0LgotICogQGRlcHJlY2F0ZWQKLSAqLwotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKLUBUYXJnZXQoRWxlbWVudFR5cGUuTUVUSE9EKQotQFByYWdtYQotcHVibGljIEBpbnRlcmZhY2UgTG9naWNhbGx5VW5pbnRlcnJ1cHRpYmxlIHsgfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy9wcmFnbWEvTmF0aXZlQnJpZGdlLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9OYXRpdmVCcmlkZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU4ODczZS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9OYXRpdmVCcmlkZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIChDUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvY3BsMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcudm1tYWdpYy5wcmFnbWE7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBvcmcudm1tYWdpYy5QcmFnbWE7Ci0KLS8qKgotICogTWV0aG9kcyBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZSBhcmUgdHJlYXRlZCBzcGVjaWFsbHkKLSAqIGJ5IHRoZSBjb21waWxlcnM6Ci0gKiAgLVRoZXkgYXJlIG9ubHkgY2FsbGVkIGZyb20gQyBvciBDKysgcHJvZ3JhbQotICogIC1UaGUgY29tcGlsZXIgd2lsbCBnZW5lcmF0ZSB0aGUgbmVjZXNzYXJ5IHByb2xvZyB0byBpbnNlcnQgYSBnbHVlIHN0YWNrCi0gKiAgIGZyYW1lIHRvIG1hcCBmcm9tIHRoZSBuYXRpdmUgc3RhY2svcmVnaXN0ZXIgY29udmVudGlvbiB0byBSVk0ncyBjb252ZW50aW9uCi0gKiAgLUl0IGlzIGFuIGVycm9yIHRvIGNhbGwgdGhlc2UgbWV0aG9kcyBmcm9tIEphdmEKLSAqLwotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKLUBUYXJnZXQoRWxlbWVudFR5cGUuVFlQRSkKLUBQcmFnbWEKLXB1YmxpYyBAaW50ZXJmYWNlIE5hdGl2ZUJyaWRnZSB7IH0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL05vQm91bmRzQ2hlY2suamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL05vQm91bmRzQ2hlY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY3MmE0MC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9Ob0JvdW5kc0NoZWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSAoQ1BMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2NwbDEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLnZtbWFnaWMucHJhZ21hOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLnZtbWFnaWMuUHJhZ21hOwotCi0vKioKLSAqIFRoaXMgcHJhZ21hIGluZGljYXRlcyB0aGF0IGEgcGFydGljdWxhciBtZXRob2Qgc2hvdWxkIG5ldmVyIGhhdmUgYm91bmRzCi0gKiBjaGVja3MgZ2VuZXJhdGVkLgotICovCi1AUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQotQFRhcmdldChFbGVtZW50VHlwZS5NRVRIT0QpCi1AUHJhZ21hCi1wdWJsaWMgQGludGVyZmFjZSBOb0JvdW5kc0NoZWNrIHsgfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy9wcmFnbWEvTm9Fc2NhcGVzLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9Ob0VzY2FwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU2ZTczYy4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9Ob0VzY2FwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIChDUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvY3BsMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcudm1tYWdpYy5wcmFnbWE7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLQotLyoqCi0gKiBVc2UgdGhpcyBhbm5vdGF0aW9uIHRvIG1hcmsgbWV0aG9kcyB0aGF0IHdvbid0IGNhdXNlIHRoZWlyIHJlZmVyZW5jZSBhcmd1bWVudHMKLSAqIHRvIGVzY2FwZS4gSWYgd2UgY2FuIGNvbnZlcnQgdGhlIG9iamVjdCByZWZlcmVuY2VkIGluIHRvIHJlZ2lzdGVycyB0aGVuIHRoZQotICogbWV0aG9kIG1hcmtlZCB3aXRoIHRoaXMgYW5ub3RhdGlvbiB3aWxsIGJlIHJlbW92ZWQuCi0gKi8KLUBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCi1AVGFyZ2V0KHtFbGVtZW50VHlwZS5NRVRIT0QsIEVsZW1lbnRUeXBlLkNPTlNUUlVDVE9SfSkKLXB1YmxpYyBAaW50ZXJmYWNlIE5vRXNjYXBlcyB7IH0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL05vSW5saW5lLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9Ob0lubGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTRmODM1Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL05vSW5saW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSAoQ1BMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2NwbDEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLnZtbWFnaWMucHJhZ21hOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLnZtbWFnaWMuUHJhZ21hOwotCi0vKioKLSAqIFRoaXMgcHJhZ21hIGluZGljYXRlcyB0aGF0IGEgcGFydGljdWxhciBtZXRob2Qgc2hvdWxkIG5ldmVyIGJlIGlubGluZWQKLSAqIGJ5IHRoZSBvcHRpbWl6aW5nIGNvbXBpbGVyLgotICovCi1AUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQotQFRhcmdldChFbGVtZW50VHlwZS5NRVRIT0QpCi1AUHJhZ21hCi1wdWJsaWMgQGludGVyZmFjZSBOb0lubGluZSB7IH0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL05vTnVsbENoZWNrLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9Ob051bGxDaGVjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2Q5YTEwLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL05vTnVsbENoZWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSAoQ1BMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2NwbDEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLnZtbWFnaWMucHJhZ21hOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLnZtbWFnaWMuUHJhZ21hOwotCi0vKioKLSAqIFRoaXMgcHJhZ21hIGluZGljYXRlcyB0aGF0IGEgcGFydGljdWxhciBtZXRob2Qgc2hvdWxkIG5ldmVyIGhhdmUgbnVsbCBjaGVja3MKLSAqIGdlbmVyYXRlZC4KLSAqLwotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKLUBUYXJnZXQoRWxlbWVudFR5cGUuTUVUSE9EKQotQFByYWdtYQotcHVibGljIEBpbnRlcmZhY2UgTm9OdWxsQ2hlY2sgeyB9CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9Ob09wdENvbXBpbGUuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL05vT3B0Q29tcGlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2QwMDJlLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL05vT3B0Q29tcGlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgKENQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9jcGwxLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy52bW1hZ2ljLnByYWdtYTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy52bW1hZ2ljLlByYWdtYTsKLQotLyoqCi0gKiBUaGlzIHByYWdtYSBpbmRpY2F0ZXMgdGhhdCBhIHBhcnRpY3VsYXIgbWV0aG9kIHNob3VsZCBuZXZlciBiZQotICogY29tcGlsZWQgYnkgdGhlIG9wdGltaXppbmcgY29tcGlsZXIuIEl0IGFsc28gaW1wbGllcyB0aGF0IHRoZQotICogbWV0aG9kIHdpbGwgbmV2ZXIgYmUgaW5saW5lZCBieSB0aGUgb3B0aW1pemluZyBjb21waWxlci4KLSAqLwotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKLUBUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRH0pCi1AUHJhZ21hCi1wdWJsaWMgQGludGVyZmFjZSBOb09wdENvbXBpbGUgeyB9CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9Ob25Nb3ZpbmcuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL05vbk1vdmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDRhMzM0Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL05vbk1vdmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgKENQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9jcGwxLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy52bW1hZ2ljLnByYWdtYTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotCi0vKioKLSAqIFVzZSB0aGlzIGFubm90YXRpb24gdG8gbWFyayB0eXBlcyB0aGF0IG11c3QgbmV2ZXIgbW92ZS4gVGhpcyBpcyBpbnRlbmRlZCBmb3IKLSAqIGEgdmVyeSBzbWFsbCBzZXQgb2YgVk0gaW50ZXJuYWwgdHlwZXMgdGhhdCBhcmUgYWNjZXNzZWQgd2l0aG91dCBrbm93bGVkZ2Ugb2YgdGhlCi0gKiBtZW1vcnkgbWFuYWdlci4gVGhpcyBpbmNsdWRlcyBjb2RlLCB0aGF0IGlzIENBTExlZCBhbmQgZmllbGRzIHRoYXQgYXJlIGxvYWRlZAotICogZGlyZWN0bHkgKHN1Y2ggYXMgVW50cmFjZWQgZmllbGRzKS4KLSAqLwotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKLUBUYXJnZXQoRWxlbWVudFR5cGUuVFlQRSkKLXB1YmxpYyBAaW50ZXJmYWNlIE5vbk1vdmluZyB7IH0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL05vbk1vdmluZ0FsbG9jYXRpb24uamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL05vbk1vdmluZ0FsbG9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNiNDVjOS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9Ob25Nb3ZpbmdBbGxvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSAoQ1BMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2NwbDEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLnZtbWFnaWMucHJhZ21hOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci0KLS8qKgotICogVXNlIHRoaXMgYW5ub3RhdGlvbiB0byBtYXJrIG1ldGhvZHMgZm9yIHdoaWNoIGFsbCBhbGxvY2F0aW9uIG11c3QgbmV2ZXIKLSAqIG1vdmUuIFRoaXMgaXMgaW50ZW5kZWQgZm9yIGEgdmVyeSBzbWFsbCBzZXQgb2YgVk0gaW50ZXJuYWwgbWV0aG9kcyB0aGF0Ci0gKiBzcGVjaWZpY2FsbHkgcmVxdWlyZSB0aGVzZSBzZW1hbnRpY3MuCi0gKi8KLUBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCi1AVGFyZ2V0KEVsZW1lbnRUeXBlLk1FVEhPRCkKLXB1YmxpYyBAaW50ZXJmYWNlIE5vbk1vdmluZ0FsbG9jYXRpb24geyB9CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9QcmVlbXB0aWJsZS5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy9wcmFnbWEvUHJlZW1wdGlibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZkZWQ1Ny4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9QcmVlbXB0aWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgKENQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9jcGwxLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy52bW1hZ2ljLnByYWdtYTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy52bW1hZ2ljLlByYWdtYTsKLQotLyoqCi0gKiBCeSBkZWZhdWx0IGFsbCBKYXZhIGNvZGUgaXMgaW50ZXJydXB0aWJsZSwgdGhhdCBpcyBzY2hlZHVsaW5nIG9yIGdhcmJhZ2UKLSAqIGNvbGxlY3Rpb24gbWF5IG9jY3VyIGF0IHBvaW50cyB3aXRoaW4gdGhlIGNvZGUuIENvZGUgY2FuIGJlIG1hcmtlZCBhcwotICoge0BsaW5rIFVucHJlZW1wdGlibGV9IG9yIHtAbGluayBVbmludGVycnVwdGlibGV9LCB0aGF0IGluc3RydWN0cyB0aGUgSlZNIHRvCi0gKiBhdm9pZCBnYXJiYWdlIGNvbGxlY3Rpb24gYW5kIHRocmVhZCBzY2hlZHVsaW5nLiBUaGUge0BsaW5rIFVuaW50ZXJydXB0aWJsZX0KLSAqIGFubm90YXRpb24gZGlzYWxsb3dzIGFueSBvcGVyYXRpb24gdGhhdCBtYXkgY2F1c2UgZ2FyYmFnZSBjb2xsZWN0aW9uIG9yCi0gKiB0aHJlYWQgc2NoZWR1bGluZywgZm9yIGV4YW1wbGUgbWVtb3J5IGFsbG9jYXRpb24uIFRoZSB7QGxpbmsgVW5wcmVlbXB0aWJsZX0KLSAqIGFubm90YXRpb24gZG9lc24ndCBkaXNhbGxvdyBvcGVyYXRpb25zIHRoYXQgY2FuIGNhdXNlIGdhcmJhZ2UgY29sbGVjdGlvbiBvcgotICogc2NoZWR1bGluZywgYnV0IGluc3RydWN0cyB0aGUgSlZNIHRvIGF2b2lkIGluc2VydGluZyBzdWNoIG9wZXJhdGlvbnMgZHVyaW5nIGEKLSAqIGJsb2NrIG9mIGNvZGUuCi0gKgotICogSW4gdGhlIGludGVybmFscyBvZiBhIFZNIG1vc3QgY29kZSB3YW50cyB0byBiZSB7QGxpbmsgVW5pbnRlcnJ1cHRpYmxlfS4KLSAqIEhvd2V2ZXIsIGNvZGUgaW52b2x2ZWQgaW4gc2NoZWR1bGluZyBhbmQgbG9ja2luZyB3aWxsIGNhdXNlIGNvbnRleHQgc3dpdGNoZXMsCi0gKiBhbmQgY3JlYXRpbmcgZXhjZXB0aW9uIG9iamVjdHMgbWF5IHRyaWdnZXIgZ2FyYmFnZSBjb2xsZWN0aW9uLCB0aGlzIGNvZGUgaXMKLSAqIHRoZXJlZm9yZSB7QGxpbmsgVW5wcmVlbXB0aWJsZX0uCi0gKgotICogVGhpcyBwcmFnbWEgaXMgdXNlZCB0byBkZWNsYXJlIHRoYXQgYSBwYXJ0aWN1bGFyIG1ldGhvZCBpcyBwcmVlbXB0aWJsZS4gSXQKLSAqIGlzIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGNsYXNzLXdpZGUgcHJhZ21hIHtAbGluayBVbnByZWVtcHRpYmxlfS4KLSAqLwotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKLUBUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRH0pCi1AUHJhZ21hCi1wdWJsaWMgQGludGVyZmFjZSBQcmVlbXB0aWJsZSB7Ci0gIC8qKgotICAgKiBAcmV0dXJuIEV4cGxhbmF0aW9uIG9mIHdoeSBjb2RlIG5lZWRzIHRvIGJlIHByZWVtcHRpYmxlCi0gICAqLwotICBTdHJpbmcgdmFsdWUoKSBkZWZhdWx0ICIiOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy9wcmFnbWEvUHVyZS5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy9wcmFnbWEvUHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzAyNzZkLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL1B1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIChDUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvY3BsMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcudm1tYWdpYy5wcmFnbWE7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBvcmcudm1tYWdpYy5QcmFnbWE7Ci0KLS8qKgotICogVGhpcyBwcmFnbWEgaXMgdXNlZCB0byBpbmRpY2F0ZSBhIG1ldGhvZCBoYXMgbm8gc2lkZSBlZmZlY3RzLiBVc2UgdGhpcyBwcmFnbWEKLSAqIHdpdGggY2FyZSBhcyBpdCBjYW4gY2F1c2UgY29tcGlsZSB0aW1lIGludm9jYXRpb24gb2YgdGhlIG1ldGhvZCBpdCBpcyBwbGFjZWQKLSAqIG9uLiBUaGlzIHByYWdtYSBpcyB1c2VkIHRvIGltcGx5IHdlYWsgcHVyaXR5IG9mIGEgbWV0aG9kLCBhbmQgYXMgc3VjaCBjYW5ub3QKLSAqIHJlbW92ZSBjYWxscyB0byBwdXJlIG1ldGhvZHMgLSBhcyB0aGV5IG1heSB0aHJvdyBleGNlcHRpb25zLgotICoge0BsaW5rIDxhIGhyZWY9Imh0dHA6Ly9qaXJhLmNvZGVoYXVzLm9yZy9icm93c2UvUlZNLTUwMyI+UlZNLTUwMzwvYT59LgotICovCi1AUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQotQFRhcmdldCh7RWxlbWVudFR5cGUuTUVUSE9EfSkKLUBQcmFnbWEKLXB1YmxpYyBAaW50ZXJmYWNlIFB1cmUgeyAvKiBhbm5vdGF0aW9uIGhhcyBubyB2YWx1ZSAqLyB9CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9SYXdTdG9yYWdlLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9SYXdTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MWJjMjcuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy9wcmFnbWEvUmF3U3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgKENQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9jcGwxLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy52bW1hZ2ljLnByYWdtYTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy52bW1hZ2ljLlByYWdtYTsKLQotLyoqCi0gKiBXaGVuIGFwcGxpZWQgdG8gY2xhc3MgdGhpcyBhbm5vdGF0aW9uIGluZGljYXRlcyB0aGF0IHRoZSBkYXRhIGNvbXBvbmVudAotICogb2YgdGhpcyBmaWVsZCBjb25zaXN0cyBvZiBhbiBpbnRyaXNpY2FsbHkgbWFuYWdlZCBjaHVuayBvZiByYXcgbWVtb3J5IG9mCi0gKiB0aGUgc3BlY2lmaWVkIHNpemUuIFRoaXMgaXMgdXNlZCBhcyB0aGUgYmFzaWMgYnVpbGRpbmcgYmxvY2sgZm9yIG5hdGl2ZQotICogd2lkdGggdHlwZXMuCi0gKgotICogVG8gY29uc3RydWN0IHR5cGVzIGxhcmdlciB0aGFuIHRob3NlIHBvc3NpYmxlIHdpdGggUmF3U3RvcmFnZSwgc2ltcGx5Ci0gKiBjb25zdHJ1Y3QgYW4gdHlwZSB3aXRoIG11bHRpcGxlIChVbmJveGVkKSBmaWVsZHMuCi0gKi8KLUBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCi1AVGFyZ2V0KHtFbGVtZW50VHlwZS5UWVBFfSkKLUBQcmFnbWEKLXB1YmxpYyBAaW50ZXJmYWNlIFJhd1N0b3JhZ2UgewotICBib29sZWFuIGxlbmd0aEluV29yZHMoKTsKLSAgaW50IGxlbmd0aCgpOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy9wcmFnbWEvUnVudGltZUZpbmFsLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9SdW50aW1lRmluYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU5NGRiMi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9SdW50aW1lRmluYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIChDUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvY3BsMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcudm1tYWdpYy5wcmFnbWE7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBvcmcudm1tYWdpYy5QcmFnbWE7Ci0KLS8qKgotICogVGhpcyBwcmFnbWEgaXMgdXNlZCB0byBpbmRpY2F0ZSBhIGZpZWxkIHdpbGwgYmUgZmluYWwgaW4gdGhlIHJ1bm5pbmcgVk0uIFdlCi0gKiBjYW4ndCBpbmRpY2F0ZSBhbGwgZmllbGRzIGFyZSBmaW5hbCBhcyBzb21lIGFyZSB1c2VkIGluIHRoZSBib290IHN0cmFwCi0gKiBwcm9jZXNzLgotICovCi1AUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQotQFRhcmdldCh7RWxlbWVudFR5cGUuRklFTER9KQotQFByYWdtYQotcHVibGljIEBpbnRlcmZhY2UgUnVudGltZUZpbmFsIHsKLSAgLyoqIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuIEN1cnJlbnRseSBvbmx5IGJvb2xlYW4gdmFsdWVzIGNhbiBiZSBSdW50aW1lRmluYWwuICovCi0gIGJvb2xlYW4gdmFsdWUoKTsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL1J1bnRpbWVQdXJlLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9SdW50aW1lUHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODU2OWNmLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL1J1bnRpbWVQdXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSAoQ1BMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2NwbDEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLnZtbWFnaWMucHJhZ21hOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLnZtbWFnaWMuUHJhZ21hOwotCi0vKioKLSAqIFRoaXMgcHJhZ21hIGlzIGEgdmFyaWFudCBvZiBQdXJlIHRoYXQgaXMgdXNlZCB0byBtYXJrIG1ldGhvZHMgdGhhdCBoYXZlIGEKLSAqIHNwZWNpYWwgYmVoYXZpb3VyIGF0IGJvb3QgaW1hZ2Ugd3JpdGluZyB0aW1lIGFuZCBhcmUgUHVyZSBhdCBydW50aW1lCi0gKi8KLUBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCi1AVGFyZ2V0KHtFbGVtZW50VHlwZS5NRVRIT0R9KQotQFByYWdtYQotcHVibGljIEBpbnRlcmZhY2UgUnVudGltZVB1cmUgewotICAvKiogRW51bWVyYXRpb24gb2YgdGhlIHNwZWNpYWwgYm9vdCBpbWFnZSByZXR1cm4gdmFsdWVzICovCi0gIHB1YmxpYyBlbnVtIFJldHVyblZhbHVlIHsKLSAgICAvKiogdGhlIHJldHVybiB2YWx1ZSBpcyB1bmF2YWlsYWJsZSB1bnRpbCBydW50aW1lKi8KLSAgICBVbmF2YWlsYWJsZQotICB9Ci0gIC8qKiBXaGF0IHZhbHVlIHNob3VsZCBiZSByZXR1cm5lZCAqLwotICBSZXR1cm5WYWx1ZSB2YWx1ZSgpIGRlZmF1bHQgUmV0dXJuVmFsdWUuVW5hdmFpbGFibGU7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9TYXZlVm9sYXRpbGUuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL1NhdmVWb2xhdGlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmQ4ODRkLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL1NhdmVWb2xhdGlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgKENQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9jcGwxLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy52bW1hZ2ljLnByYWdtYTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy52bW1hZ2ljLlByYWdtYTsKLQotLyoqCi0gKiBNZXRob2RzIG9mIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlCi0gKiBhcmUgdHJlYXRlZCBzcGVjaWFsbHkgYnkgdGhlIG1hY2hpbmUgY29kZSBjb21waWxlcjoKLSAqIHRoZSBtZXRob2QgcHJvbG9ndWUgc2F2ZXMgYWxsIHRoZSB2b2xhdGlsZSByZWdpc3RlcnMKLSAqIGFuZCB0aGUgbWV0aG9kIGVwaWxvZ3VlIHJlc3RvcmVzIGFsbCB0aGUgdm9sYXRpbGUgcmVnaXN0ZXJzCi0gKi8KLUBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCi1AVGFyZ2V0KEVsZW1lbnRUeXBlLlRZUEUpCi1AUHJhZ21hCi1wdWJsaWMgQGludGVyZmFjZSBTYXZlVm9sYXRpbGUgeyB9CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9TcGVjaWFsaXplZE1ldGhvZEludm9rZS5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy9wcmFnbWEvU3BlY2lhbGl6ZWRNZXRob2RJbnZva2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUwZGE5OC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9TcGVjaWFsaXplZE1ldGhvZEludm9rZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgKENQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9jcGwxLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy52bW1hZ2ljLnByYWdtYTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy52bW1hZ2ljLlByYWdtYTsKLQotLyoqCi0gKiBUaGlzIHByYWdtYSBpbmRpY2F0ZXMgdGhhdCBhIHBhcnRpY3VsYXIgbWV0aG9kIGlzIGEgc3BlY2lhbGl6ZWQKLSAqIG1ldGhvZCBpbnZvY2F0aW9uIHBvaW50LCBhbmQgY291bGQgYmUgb3B0aW1pemVkIGFzIHN1Y2guCi0gKgotICogQWxsIHN1Y2ggbWV0aG9kcyBtdXN0IGJlIHN0YXRpYy4KLSAqLwotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKLUBUYXJnZXQoRWxlbWVudFR5cGUuTUVUSE9EKQotQFByYWdtYQotcHVibGljIEBpbnRlcmZhY2UgU3BlY2lhbGl6ZWRNZXRob2RJbnZva2UgeyB9CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9TeW5jaHJvbml6ZWRPYmplY3QuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL1N5bmNocm9uaXplZE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjA4NTBmLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL1N5bmNocm9uaXplZE9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgKENQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9jcGwxLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy52bW1hZ2ljLnByYWdtYTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotaW1wb3J0IG9yZy52bW1hZ2ljLlByYWdtYTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBkZXNpZ25hdGVzIGFuIG9iamVjdCB3aGljaCBzaG91bGQgYWx3YXlzIGJlIGFsbG9jYXRlZCBhCi0gKiB0aGluIGxvY2ssIHNpbmNlIGl0IGlzIGxpa2VseSB0byBiZSBzeW5jaHJvbml6ZWQuCi0gKi8KLUBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCi1AVGFyZ2V0KEVsZW1lbnRUeXBlLlRZUEUpCi1AUHJhZ21hCi1wdWJsaWMgQGludGVyZmFjZSBTeW5jaHJvbml6ZWRPYmplY3QgewotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy9wcmFnbWEvU3lzQ2FsbE5hdGl2ZS5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy9wcmFnbWEvU3lzQ2FsbE5hdGl2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTEwYTgxLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL1N5c0NhbGxOYXRpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIChDUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvY3BsMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcudm1tYWdpYy5wcmFnbWE7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBvcmcudm1tYWdpYy5QcmFnbWE7Ci0KLS8qKgotICogQW4gYW5ub3RhdGlvbiBmb3Igc3RhdGljIG5hdGl2ZSBtZXRob2RzIHRvIHNob3cgdGhhdCB0aGV5IHNob3VsZCBiZQotICogY29tcGlsZWQgYXMgc3lzdGVtIGNhbGxzLiBBIHN5c3RlbSBjYWxsIGlzIGEgbGlnaHR3ZWlnaHQgY2FsbCB0byBhCi0gKiBDIGZ1bmN0aW9uIHRoYXQgZG9lc24ndCBzZXQgdXAgdGhlIEpOSSBlbnZpcm9ubWVudCBhbmQgaXMgdGhlcmVmb3JlCi0gKiBjaGVhcGVyIHRoYW4gSk5JLiBUaGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGZ1bmN0aW9uIGlzIHRoZSBhZGRyZXNzCi0gKiBvZiB0aGUgQyBmdW5jdGlvbiB0byBydW4uCi0gKi8KLUBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCi1AVGFyZ2V0KHtFbGVtZW50VHlwZS5NRVRIT0R9KQotQFByYWdtYQotcHVibGljIEBpbnRlcmZhY2UgU3lzQ2FsbE5hdGl2ZSB7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9VbmludGVycnVwdGlibGUuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL1VuaW50ZXJydXB0aWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTY2MjVmLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL1VuaW50ZXJydXB0aWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgKENQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9jcGwxLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy52bW1hZ2ljLnByYWdtYTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy52bW1hZ2ljLlByYWdtYTsKLQotLyoqCi0gKiBCeSBkZWZhdWx0IGFsbCBKYXZhIGNvZGUgaXMgaW50ZXJydXB0aWJsZSwgdGhhdCBpcyBzY2hlZHVsaW5nIG9yIGdhcmJhZ2UKLSAqIGNvbGxlY3Rpb24gbWF5IG9jY3VyIGF0IHBvaW50cyB3aXRoaW4gdGhlIGNvZGUuIENvZGUgY2FuIGJlIG1hcmtlZCBhcwotICoge0BsaW5rIFVucHJlZW1wdGlibGV9IG9yIHtAbGluayBVbmludGVycnVwdGlibGV9LCB0aGF0IGluc3RydWN0cyB0aGUgSlZNIHRvCi0gKiBhdm9pZCBnYXJiYWdlIGNvbGxlY3Rpb24gYW5kIHRocmVhZCBzY2hlZHVsaW5nLiBUaGUge0BsaW5rIFVuaW50ZXJydXB0aWJsZX0KLSAqIGFubm90YXRpb24gZGlzYWxsb3dzIGFueSBvcGVyYXRpb24gdGhhdCBtYXkgY2F1c2UgZ2FyYmFnZSBjb2xsZWN0aW9uIG9yCi0gKiB0aHJlYWQgc2NoZWR1bGluZywgZm9yIGV4YW1wbGUgbWVtb3J5IGFsbG9jYXRpb24uIFRoZSB7QGxpbmsgVW5wcmVlbXB0aWJsZX0KLSAqIGFubm90YXRpb24gZG9lc24ndCBkaXNhbGxvdyBvcGVyYXRpb25zIHRoYXQgY2FuIGNhdXNlIGdhcmJhZ2UgY29sbGVjdGlvbiBvcgotICogc2NoZWR1bGluZywgYnV0IGluc3RydWN0cyB0aGUgSlZNIHRvIGF2b2lkIGluc2VydGluZyBzdWNoIG9wZXJhdGlvbnMgZHVyaW5nIGEKLSAqIGJsb2NrIG9mIGNvZGUuCi0gKgotICogSW4gdGhlIGludGVybmFscyBvZiBhIFZNIG1vc3QgY29kZSB3YW50cyB0byBiZSB7QGxpbmsgVW5pbnRlcnJ1cHRpYmxlfS4KLSAqIEhvd2V2ZXIsIGNvZGUgaW52b2x2ZWQgaW4gc2NoZWR1bGluZyBhbmQgbG9ja2luZyB3aWxsIGNhdXNlIGNvbnRleHQgc3dpdGNoZXMsCi0gKiBhbmQgY3JlYXRpbmcgZXhjZXB0aW9uIG9iamVjdHMgbWF5IHRyaWdnZXIgZ2FyYmFnZSBjb2xsZWN0aW9uLCB0aGlzIGNvZGUgaXMKLSAqIHRoZXJlZm9yZSB7QGxpbmsgVW5wcmVlbXB0aWJsZX0uCi0gKgotICogQW55IG1ldGhvZCB0aGF0IGlzIG1hcmtlZCBhcyB1bmludGVycnVwdGlibGUgaXMgdHJlYXRlZCBzcGVjaWFsbHkgYnkgdGhlCi0gKiBtYWNoaW5lIGNvZGUgY29tcGlsZXI6Ci0gKgotICogKDEpIHRoZSBub3JtYWwgdGhyZWFkIHN3aXRjaCB0ZXN0IHRoYXQgd291bGQgYmUgZW1pdHRlZCBpbiB0aGUgbWV0aG9kCi0gKiBwcm9sb2d1ZSBpcyBvbWl0dGVkLgotICoKLSAqICgyKSB0aGUgc3RhY2sgb3ZlcmZsb3cgdGVzdCB0aGF0IHdvdWxkIGJlIGVtaXR0ZWQgaW4gdGhlIG1ldGhvZCBwcm9sb2d1ZSBpcwotICogb21pdHRlZC4KLSAqCi0gKiAoMykgY2FsbHMgdG8gcHJlZW1wdGlibGUgY29kZSBjYXVzZXMgd2FybmluZ3MuCi0gKgotICogKDQpIGJ5dGVjb2RlcyB0aGF0IGNhbiBjYXVzZSBpbnRlcnJ1cHRpb24gY2F1c2Ugd2FybmluZ3MuCi0gKgotICogKDUpIHVuaW50ZXJydXB0aWJsZSBjb2RlIHdpbGwgYmUgZ2VuZXJhdGVkIGFzc3VtaW5nIG5vIFJ1bnRpbWVFeGNlcHRpb25zIGFyZQotICogcmFpc2VkIGFuZCB3aXRob3V0IGFueSBHQyBtYXBzIChzaW5jZSBieSBkZWZpbml0aW9uIHRoZXJlIGNhbiBiZSBub0dDIGlmCi0gKiBjb250cm9sIGlzIG5vdCBsb3N0KS4KLSAqCi0gKiBUaGlzIGlzIHRoZSBpbnZlcnNlIG9mIHtAbGluayBJbnRlcnJ1cHRpYmxlfS4KLSAqLwotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKLUBUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRH0pCi1AUHJhZ21hCi1wdWJsaWMgQGludGVyZmFjZSBVbmludGVycnVwdGlibGUgewotICAvKioKLSAgICogQHJldHVybiBFeHBsYW5hdGlvbiBvZiB3aHkgY29kZSBuZWVkcyB0byBiZSB1bmludGVycnVwdGlibGUKLSAgICovCi0gIFN0cmluZyB2YWx1ZSgpIGRlZmF1bHQgIiI7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9VbmludGVycnVwdGlibGVOb1dhcm4uamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL1VuaW50ZXJydXB0aWJsZU5vV2Fybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGZiNjgwLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL1VuaW50ZXJydXB0aWJsZU5vV2Fybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgKENQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9jcGwxLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy52bW1hZ2ljLnByYWdtYTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy52bW1hZ2ljLlByYWdtYTsKLQotLyoqCi0gKiBBIHByYWdtYSB0aGF0IGhhcyB0aGUgc2FtZSBkaXJlY3QgZWZmZWN0IGFzIHtAbGluayBVbmludGVycnVwdGlibGV9Ci0gKiBidXQgYWxzbyBzdXBwcmVzc2VzIGNoZWNraW5nIG9mIHVuaW50ZXJydXB0aWJpbGl0eSB2aW9sYXRpb25zIGZvcgotICogdGhlIG1ldGhvZC4gVGhpcyBzaG91bGQgYmUgdXNlZCB3aXRoIGNhcmUgYW5kIGlzIG9ubHkganVzdGlmaWVkCi0gKiBmb3IgY29kZSBvbmx5IGV4ZWN1dGVkIHdoZW4gY3JlYXRpbmcgdGhlIGJvb3QgaW1hZ2UuCi0gKi8KLUBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCi1AVGFyZ2V0KHtFbGVtZW50VHlwZS5UWVBFLCBFbGVtZW50VHlwZS5NRVRIT0R9KQotQFByYWdtYQotcHVibGljIEBpbnRlcmZhY2UgVW5pbnRlcnJ1cHRpYmxlTm9XYXJuIHsKLSAgLyoqCi0gICAqIEByZXR1cm4gRXhwbGFuYXRpb24gb2Ygd2h5IHVuaW50ZXJydXB0aWJsZSB3YXJuaW5ncyBhcmUgZGlzYWJsZWQKLSAgICovCi0gIFN0cmluZyB2YWx1ZSgpIGRlZmF1bHQgIiI7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9VbnByZWVtcHRpYmxlLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9VbnByZWVtcHRpYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5M2RhOWYuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy9wcmFnbWEvVW5wcmVlbXB0aWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgKENQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9jcGwxLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy52bW1hZ2ljLnByYWdtYTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy52bW1hZ2ljLlByYWdtYTsKLQotLyoqCi0gKiBCeSBkZWZhdWx0IGFsbCBKYXZhIGNvZGUgaXMgaW50ZXJydXB0aWJsZSwgdGhhdCBpcyBzY2hlZHVsaW5nIG9yIGdhcmJhZ2UKLSAqIGNvbGxlY3Rpb24gbWF5IG9jY3VyIGF0IHBvaW50cyB3aXRoaW4gdGhlIGNvZGUuIENvZGUgY2FuIGJlIG1hcmtlZCBhcwotICoge0BsaW5rIFVucHJlZW1wdGlibGV9IG9yIHtAbGluayBVbmludGVycnVwdGlibGV9LCB0aGF0IGluc3RydWN0cyB0aGUgSlZNIHRvCi0gKiBhdm9pZCBnYXJiYWdlIGNvbGxlY3Rpb24gYW5kIHRocmVhZCBzY2hlZHVsaW5nLiBUaGUge0BsaW5rIFVuaW50ZXJydXB0aWJsZX0KLSAqIGFubm90YXRpb24gZGlzYWxsb3dzIGFueSBvcGVyYXRpb24gdGhhdCBtYXkgY2F1c2UgZ2FyYmFnZSBjb2xsZWN0aW9uIG9yCi0gKiB0aHJlYWQgc2NoZWR1bGluZywgZm9yIGV4YW1wbGUgbWVtb3J5IGFsbG9jYXRpb24uIFRoZSB7QGxpbmsgVW5wcmVlbXB0aWJsZX0KLSAqIGFubm90YXRpb24gZG9lc24ndCBkaXNhbGxvdyBvcGVyYXRpb25zIHRoYXQgY2FuIGNhdXNlIGdhcmJhZ2UgY29sbGVjdGlvbiBvcgotICogc2NoZWR1bGluZywgYnV0IGluc3RydWN0cyB0aGUgSlZNIHRvIGF2b2lkIGluc2VydGluZyBzdWNoIG9wZXJhdGlvbnMgZHVyaW5nIGEKLSAqIGJsb2NrIG9mIGNvZGUuCi0gKgotICogSW4gdGhlIGludGVybmFscyBvZiBhIFZNIG1vc3QgY29kZSB3YW50cyB0byBiZSB7QGxpbmsgVW5pbnRlcnJ1cHRpYmxlfS4KLSAqIEhvd2V2ZXIsIGNvZGUgaW52b2x2ZWQgaW4gc2NoZWR1bGluZyBhbmQgbG9ja2luZyB3aWxsIGNhdXNlIGNvbnRleHQgc3dpdGNoZXMsCi0gKiBhbmQgY3JlYXRpbmcgZXhjZXB0aW9uIG9iamVjdHMgbWF5IHRyaWdnZXIgZ2FyYmFnZSBjb2xsZWN0aW9uLCB0aGlzIGNvZGUgaXMKLSAqIHRoZXJlZm9yZSB7QGxpbmsgVW5wcmVlbXB0aWJsZX0uCi0gKgotICogQW55IG1ldGhvZCB0aGF0IGlzIG1hcmtlZCBhcyB1bnByZWVtcHRpYmxlIGlzIHRyZWF0ZWQgc3BlY2lhbGx5IGJ5IHRoZQotICogbWFjaGluZSBjb2RlIGNvbXBpbGVyOgotICoKLSAqICgxKSB0aGUgbm9ybWFsIHRocmVhZCBzd2l0Y2ggdGVzdCB0aGF0IHdvdWxkIGJlIGVtaXR0ZWQgaW4gdGhlIG1ldGhvZAotICogcHJvbG9ndWUgaXMgb21pdHRlZC4KLSAqCi0gKiAoMikgdGhlIHN0YWNrIG92ZXJmbG93IHRlc3QgdGhhdCB3b3VsZCBiZSBlbWl0dGVkIGluIHRoZSBtZXRob2QgcHJvbG9ndWUgaXMKLSAqIG9taXR0ZWQuCi0gKgotICogKDMpIGNhbGxzIHRvIHByZWVtcHRpYmxlIGNvZGUgY2F1c2VzIHdhcm5pbmdzLgotICoKLSAqIFRoaXMgaXMgdGhlIGludmVyc2Ugb2Yge0BsaW5rIFByZWVtcHRpYmxlfS4KLSAqLwotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKLUBUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRH0pCi1AUHJhZ21hCi1wdWJsaWMgQGludGVyZmFjZSBVbnByZWVtcHRpYmxlIHsKLSAgLyoqCi0gICAqIEByZXR1cm4gRXhwbGFuYXRpb24gb2Ygd2h5IGNvZGUgbmVlZHMgdG8gYmUgdW5wcmVlbXB0aWJsZQotICAgKi8KLSAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL1VucHJlZW1wdGlibGVOb1dhcm4uamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvcHJhZ21hL1VucHJlZW1wdGlibGVOb1dhcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgxYjIxNC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9VbnByZWVtcHRpYmxlTm9XYXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSAoQ1BMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2NwbDEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLnZtbWFnaWMucHJhZ21hOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLnZtbWFnaWMuUHJhZ21hOwotCi0vKioKLSAqIEEgc3BlY2lhbCBjYXNlIG9mIHtAbGluayBVbnByZWVtcHRpYmxlfSB3aGVyZSB0aGUgY29kZSBtYXkgY2FsbCBvdXQgdG8gb3RoZXIKLSAqIGludGVycnVwdGlibGUgcm91dGluZXMuCi0gKi8KLUBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCi1AVGFyZ2V0KHtFbGVtZW50VHlwZS5UWVBFLCBFbGVtZW50VHlwZS5NRVRIT0R9KQotQFByYWdtYQotcHVibGljIEBpbnRlcmZhY2UgVW5wcmVlbXB0aWJsZU5vV2FybiB7Ci0gIC8qKgotICAgKiBAcmV0dXJuIEV4cGxhbmF0aW9uIG9mIHdoeSBjb2RlIG5lZWRzIHRvIGJlIHVucHJlZW1wdGlibGUKLSAgICovCi0gIFN0cmluZyB2YWx1ZSgpIGRlZmF1bHQgIiI7Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9VbnRyYWNlZC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy9wcmFnbWEvVW50cmFjZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY3MmFlZi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3ByYWdtYS9VbnRyYWNlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgKENQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9jcGwxLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy52bW1hZ2ljLnByYWdtYTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotCi0vKioKLSAqIFVzZSB0aGlzIGFubm90YXRpb24gdG8gbWFyayBmaWVsZHMgdGhhdCBhcmUgcmVhZCB3aXRob3V0IHRoZSBrbm93bGVkZ2Ugb2YgdGhlCi0gKiBtZW1vcnkgbWFuYWdlbWVudCBzeXN0ZW0uIFRoaXMgbWVhbnMgdGhhdCBiYXJyaWVycyBhcmUgbm90IHRyaWdnZXJlZCBhbmQKLSAqIHRoZSByZWZlcmVuY2UgaXMgYWxzbyBub3QgdHJhY2VkIGJ5IHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4KLSAqCi0gKiBBcyBhbm5vdGF0aW9ucyBhcmUgbG9hZGVkIGF0IGNsYXNzIHJlc29sdXRpb24gdGltZSwgZmllbGRzIG1hcmtlZCB3aXRoIHRoaXMKLSAqIGFubm90YXRpb24gbXVzdCBiZSBwcml2YXRlIHNvIHRoYXQgbm8gdW5yZXNvbHZlZCBhY2Nlc3NlcyBhcmUgY29tcGlsZWQgdG8gdGhlbSB3aXRoCi0gKiBiYXJyaWVycy4KLSAqLwotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKLUBUYXJnZXQoRWxlbWVudFR5cGUuRklFTEQpCi1wdWJsaWMgQGludGVyZmFjZSBVbnRyYWNlZCB7IH0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvdW5ib3hlZC9BZGRyZXNzLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3VuYm94ZWQvQWRkcmVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWU4MDIzLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvdW5ib3hlZC9BZGRyZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NTIgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgKENQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9jcGwxLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy52bW1hZ2ljLnVuYm94ZWQ7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5VbmJveGVkOwotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS5SYXdTdG9yYWdlOwotCi0vKioKLSAqIDxiPlN0dWI8L2I+IGltcGxlbWVudGF0aW9uIG9mIGFuIEFkZHJlc3MgdHlwZSwgaW50ZW5kZWQgb25seSB0bwotICogYWxsb3cgdGhlIGNvcmUgb2YgTU1UayB0byBiZSBjb21waWxlZC4gIFRoaXMgPGI+bXVzdDwvYj4gYmUKLSAqIHJlcGxhY2VkIHdpdGggYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBhcHByb3ByaWF0ZSB0byBhIHNwZWNpZmljCi0gKiBWTS4KLSAqCi0gKiBUaGUgYWRkcmVzcyB0eXBlIGlzIHVzZWQgYnkgdGhlIHJ1bnRpbWUgc3lzdGVtIGFuZCBjb2xsZWN0b3IgdG8KLSAqIGRlbm90ZSBtYWNoaW5lIGFkZHJlc3Nlcy4gIFdlIHVzZSBhIHNlcGFyYXRlIHR5cGUgaW5zdGVhZCBvZiB0aGUKLSAqIEphdmEgaW50IHR5cGUgZm9yIGNvZGluZyBjbGFyaXR5LCAgbWFjaGluZS1wb3J0YWJpbGl0eSAoaXQgY2FuIG1hcAotICogdG8gMzIgYml0IGFuZCA2NCBiaXQgaW50ZWdyYWwgdHlwZXMpLCBhbmQgYWNjZXNzIHRvIHVuc2lnbmVkCi0gKiBvcGVyYXRpb25zIChKYXZhIGRvZXMgbm90IGhhdmUgdW5zaWduZWQgaW50IHR5cGVzKS4KLSAqLwotQFVuYm94ZWQKLUBSYXdTdG9yYWdlKGxlbmd0aEluV29yZHMgPSB0cnVlLCBsZW5ndGggPSAxKQotcHVibGljIGZpbmFsIGNsYXNzIEFkZHJlc3MgewotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIFNwZWNpYWwgdmFsdWVzCi0gICAqLwotCi0gIC8qKgotICAgKiBSZXR1cm4gYW4gPGNvZGU+QWRkcmVzczwvY29kZT4gaW5zdGFuY2UgdGhhdCByZWZsZWN0cyB0aGUgdmFsdWUKLSAgICogemVyby4KLSAgICoKLSAgICogQHJldHVybiBBbiBhZGRyZXNzIGluc3RhbmNlIHRoYXQgcmVmbGVjdHMgdGhlIHZhbHVlIHplcm8uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEFkZHJlc3MgemVybygpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpbnN0YW5jZSBpcyB6ZXJvLgotICAgKgotICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaW5zdGFuY2UgaXMgemVyby4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzWmVybygpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIGFuIDxjb2RlPkFkZHJlc3M8L2NvZGU+IGluc3RhbmNlIHRoYXQgcmVmbGVjdHMgdGhlIG1heGltdW0KLSAgICogYWxsb3dhYmxlIDxjb2RlPkFkZHJlc3M8L2NvZGU+IHZhbHVlLgotICAgKgotICAgKiBAcmV0dXJuIEFuIDxjb2RlPkFkZHJlc3M8L2NvZGU+IGluc3RhbmNlIHRoYXQgcmVmbGVjdHMgdGhlCi0gICAqIG1heGltdW0gYWxsb3dhYmxlIDxjb2RlPkFkZHJlc3M8L2NvZGU+IHZhbHVlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBBZGRyZXNzIG1heCgpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpbnN0YW5jZSBpcyB0aGUgbWF4aW11bQotICAgKiBhbGxvd2FibGUgPGNvZGU+QWRkcmVzczwvY29kZT4gdmFsdWUuCi0gICAqCi0gICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpbnN0YW5jZSBpcyB0aGUgbWF4aW11bQotICAgKiBhbGxvd2FibGUgPGNvZGU+QWRkcmVzczwvY29kZT4gdmFsdS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTWF4KCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIENvbnZlcnNpb25zCi0gICAqLwotCi0gIC8qKgotICAgKiBGYWJyaWNhdGUgYW4gPGNvZGU+QWRkcmVzczwvY29kZT4gaW5zdGFuY2UgZnJvbSBhbiBpbnRlZ2VyLCBhZnRlcgotICAgKiBzaWduIGV4dGVuZGluZyB0aGUgaW50ZWdlci4KLSAgICoKLSAgICogQHBhcmFtIGFkZHJlc3MgdGhlIGludGVnZXIgZnJvbSB3aGljaCB0byBjcmVhdGUgYW4gPGNvZGU+QWRkcmVzczwvY29kZT4KLSAgICogICAgICAgICAgaW5zdGFuY2UKLSAgICogQHJldHVybiBBbiBhZGRyZXNzIGluc3RhbmNlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEFkZHJlc3MgZnJvbUludFNpZ25FeHRlbmQoaW50IGFkZHJlc3MpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBGYWJyaWNhdGUgYW4gPGNvZGU+QWRkcmVzczwvY29kZT4gaW5zdGFuY2UgZnJvbSBhbiBpbnRlZ2VyLCBhZnRlcgotICAgKiB6ZXJvIGV4dGVuZGluZyB0aGUgaW50ZWdlci4KLSAgICoKLSAgICogQHBhcmFtIGFkZHJlc3MgdGhlIGludGVnZXIgZnJvbSB3aGljaCB0byBjcmVhdGUgYW4gPGNvZGU+QWRkcmVzczwvY29kZT4KLSAgICogICAgICAgICAgaW5zdGFuY2UKLSAgICogQHJldHVybiBBbiBhZGRyZXNzIGluc3RhbmNlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEFkZHJlc3MgZnJvbUludFplcm9FeHRlbmQoaW50IGFkZHJlc3MpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBGYWJyaWNhdGUgYW4gPGNvZGU+QWRkcmVzczwvY29kZT4gaW5zdGFuY2UgZnJvbSBhbiBpbnRlZ2VyCi0gICAqCi0gICAqIEBwYXJhbSBhZGRyZXNzIHRoZSBpbnRlZ2VyIGZyb20gd2hpY2ggdG8gY3JlYXRlIGFuIDxjb2RlPkFkZHJlc3M8L2NvZGU+Ci0gICAqICAgICAgICAgIGluc3RhbmNlCi0gICAqIEByZXR1cm4gQW4gYWRkcmVzcyBpbnN0YW5jZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBBZGRyZXNzIGZyb21Mb25nKGxvbmcgYWRkcmVzcykgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEZhYnJpY2F0ZSBhbiA8Y29kZT5PYmplY3RSZWZlcmVuY2U8L2NvZGU+IGluc3RhbmNlIGZyb20gYW4KLSAgICogPGNvZGU+QWRkcmVzczwvY29kZT4gaW5zdGFuY2UuICBJdCBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5Ci0gICAqIHRvIGVuc3VyZSB0aGF0IHRoZSA8Y29kZT5BZGRyZXNzPC9jb2RlPiBpcyBzdWl0YWJsZSAoaS5lLiBpdAotICAgKiBwb2ludHMgdG8gdGhlIG9iamVjdCBoZWFkZXIsIG9yIHNhdGlzZmllcyBhbnkgb3RoZXIgVk0tc3BlY2lmaWMKLSAgICogcmVxdWlyZW1lbnQgZm9yIHN1Y2ggYSBjb252ZXJzaW9uKS4KLSAgICoKLSAgICogQHJldHVybiBBbiA8Y29kZT5PYmplY3RSZWZlcmVuY2U8L2NvZGU+IGluc3RhbmNlLgotICAgKi8KLSAgcHVibGljIE9iamVjdFJlZmVyZW5jZSB0b09iamVjdFJlZmVyZW5jZSgpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gYW4gaW50ZWdlciB0aGF0IHJlZmxlY3RzIHRoZSB2YWx1ZSBvZiB0aGlzCi0gICAqIDxjb2RlPkFkZHJlc3M8L2NvZGU+IGluc3RhbmNlLgotICAgKgotICAgKiBAcmV0dXJuIEFuIGludGVnZXIgdGhhdCByZWZsZWN0cyB0aGUgdmFsdWUgb2YgdGhpcwotICAgKiA8Y29kZT5BZGRyZXNzPC9jb2RlPiBpbnN0YW5jZS4KLSAgICovCi0gIHB1YmxpYyBpbnQgdG9JbnQoKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIGFuIGxvbmcgdGhhdCByZWZsZWN0cyB0aGUgdmFsdWUgb2YgdGhpcwotICAgKiA8Y29kZT5BZGRyZXNzPC9jb2RlPiBpbnN0YW5jZS4KLSAgICoKLSAgICogQHJldHVybiBBbiBsb25nIHRoYXQgcmVmbGVjdHMgdGhlIHZhbHVlIG9mIHRoaXMKLSAgICogPGNvZGU+QWRkcmVzczwvY29kZT4gaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgbG9uZyB0b0xvbmcoKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIGEgPGNvZGU+V29yZDwvY29kZT4gaW5zdGFuY2UgdGhhdCByZWZsZWN0cyB0aGUgdmFsdWUgb2YKLSAgICogdGhpcyA8Y29kZT5BZGRyZXNzPC9jb2RlPiBpbnN0YW5jZS4KLSAgICoKLSAgICogQHJldHVybiBBIDxjb2RlPldvcmQ8L2NvZGU+IGluc3RhbmNlIHRoYXQgcmVmbGVjdHMgdGhlIHZhbHVlIG9mCi0gICAqIHRoaXMgPGNvZGU+QWRkcmVzczwvY29kZT4gaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgV29yZCB0b1dvcmQoKSB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBBcml0aGVtdGljIG9wZXJhdG9ycwotICAgKi8KLQotICAvKioKLSAgICogQWRkIGFuIGludGVnZXIgdG8gdGhpcyA8Y29kZT5BZGRyZXNzPC9jb2RlPiwgYW5kIHJldHVybiB0aGUgc3VtLgotICAgKgotICAgKiBAcGFyYW0gIHYgdGhlIHZhbHVlIHRvIGJlIGFkZGVkIHRvIHRoaXMgPGNvZGU+QWRkcmVzczwvY29kZT4KLSAgICogQHJldHVybiBBbiA8Y29kZT5BZGRyZXNzPC9jb2RlPiBpbnN0YW5jZSB0aGF0IHJlZmxlY3RzIHRoZSByZXN1bHQKLSAgICogb2YgdGhlIGFkZGl0aW9uLgotICAgKi8KLSAgcHVibGljIEFkZHJlc3MgcGx1cyhpbnQgdikgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhbiA8Y29kZT5PZmZzZXQ8L2NvZGU+IHRvIHRoaXMgPGNvZGU+QWRkcmVzczwvY29kZT4sIGFuZAotICAgKiByZXR1cm4gdGhlIHN1bS4KLSAgICoKLSAgICogQHBhcmFtIG9mZnNldCB0aGUgPGNvZGU+T2Zmc2V0PC9jb2RlPiB0byBiZSBhZGRlZCB0byB0aGUgYWRkcmVzcwotICAgKiBAcmV0dXJuIEFuIDxjb2RlPkFkZHJlc3M8L2NvZGU+IGluc3RhbmNlIHRoYXQgcmVmbGVjdHMgdGhlIHJlc3VsdAotICAgKiBvZiB0aGUgYWRkaXRpb24uCi0gICAqLwotICBwdWJsaWMgQWRkcmVzcyBwbHVzKE9mZnNldCBvZmZzZXQpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYW4gPGNvZGU+RXh0ZW50PC9jb2RlPiB0byB0aGlzIDxjb2RlPkFkZHJlc3M8L2NvZGU+LCBhbmQKLSAgICogcmV0dXJuIHRoZSBzdW0uCi0gICAqCi0gICAqIEBwYXJhbSBleHRlbnQgdGhlIDxjb2RlPkV4dGVudDwvY29kZT4gdG8gYmUgYWRkZWQgdG8gdGhpcwotICAgKiA8Y29kZT5BZGRyZXNzPC9jb2RlPgotICAgKiBAcmV0dXJuIEFuIDxjb2RlPkFkZHJlc3M8L2NvZGU+IGluc3RhbmNlIHRoYXQgcmVmbGVjdHMgdGhlIHJlc3VsdAotICAgKiBvZiB0aGUgYWRkaXRpb24uCi0gICAqLwotICBwdWJsaWMgQWRkcmVzcyBwbHVzKEV4dGVudCBleHRlbnQpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBTdWJ0cmFjdCBhbiBpbnRlZ2VyIGZyb20gdGhpcyA8Y29kZT5BZGRyZXNzPC9jb2RlPiwgYW5kIHJldHVybgotICAgKiB0aGUgcmVzdWx0LgotICAgKgotICAgKiBAcGFyYW0gdiB0aGUgaW50ZWdlciB0byBiZSBzdWJ0cmFjdGVkIGZyb20gdGhpcwotICAgKiA8Y29kZT5BZGRyZXNzPC9jb2RlPi4KLSAgICogQHJldHVybiBBbiA8Y29kZT5BZGRyZXNzPC9jb2RlPiBpbnN0YW5jZSB0aGF0IHJlZmxlY3RzIHRoZSByZXN1bHQKLSAgICogb2YgdGhlIHN1YnRyYWN0aW9uLgotICAgKi8KLSAgcHVibGljIEFkZHJlc3MgbWludXMoaW50IHYpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBTdWJ0cmFjdCBhbiA8Y29kZT5PZmZzZXQ8L2NvZGU+IGZyb20gdGhpcyA8Y29kZT5BZGRyZXNzPC9jb2RlPiwgYW5kCi0gICAqIHJldHVybiB0aGUgcmVzdWx0LgotICAgKgotICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSA8Y29kZT5PZmZzZXQ8L2NvZGU+IHRvIGJlIHN1YnRyYWN0ZWQgZnJvbSB0aGlzCi0gICAqICAgICAgICAgIDxjb2RlPkFkZHJlc3M8L2NvZGU+LgotICAgKiBAcmV0dXJuIEFuIDxjb2RlPkFkZHJlc3M8L2NvZGU+IGluc3RhbmNlIHRoYXQgcmVmbGVjdHMgdGhlIHJlc3VsdAotICAgKiBvZiB0aGUgc3VidHJhY3Rpb24uCi0gICAqLwotICBwdWJsaWMgQWRkcmVzcyBtaW51cyhPZmZzZXQgb2Zmc2V0KSB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogU3VidHJhY3QgYW4gPGNvZGU+RXh0ZW50PC9jb2RlPiBmcm9tIHRoaXMgPGNvZGU+QWRkcmVzczwvY29kZT4sIGFuZAotICAgKiByZXR1cm4gdGhlIHJlc3VsdC4KLSAgICoKLSAgICogQHBhcmFtIGV4dGVudCB0aGUgPGNvZGU+RXh0ZW50PC9jb2RlPiB0byBiZSBzdWJ0cmFjdGVkIGZyb20gdGhpcwotICAgKiAgICAgICAgICA8Y29kZT5BZGRyZXNzPC9jb2RlPi4KLSAgICogQHJldHVybiBBbiA8Y29kZT5BZGRyZXNzPC9jb2RlPiBpbnN0YW5jZSB0aGF0IHJlZmxlY3RzIHRoZSByZXN1bHQKLSAgICogb2YgdGhlIHN1YnRyYWN0aW9uLgotICAgKi8KLSAgcHVibGljIEFkZHJlc3MgbWludXMoRXh0ZW50IGV4dGVudCkgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gPGNvZGU+QWRkcmVzczwvY29kZT5lcyBhbmQKLSAgICogcmV0dXJuIHRoZSByZXN1bHQuCi0gICAqCi0gICAqIEBwYXJhbSBhZGRyMiB0aGUgPGNvZGU+QWRkcmVzczwvY29kZT4gdG8gYmUgc3VidHJhY3RlZCBmcm9tIHRoaXMKLSAgICogICAgICAgICAgPGNvZGU+QWRkcmVzczwvY29kZT4uCi0gICAqIEByZXR1cm4gQW4gPGNvZGU+T2Zmc2V0PC9jb2RlPiBpbnN0YW5jZSB0aGF0IHJlZmxlY3RzIHRoZSByZXN1bHQKLSAgICogb2YgdGhlIHN1YnRyYWN0aW9uLgotICAgKi8KLSAgcHVibGljIE9mZnNldCBkaWZmKEFkZHJlc3MgYWRkcjIpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEJvb2xlYW4gb3BlcmF0b3JzCi0gICAqLwotCi0gIC8qKgotICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIDxjb2RlPkFkZHJlc3M8L2NvZGU+IGluc3RhbmNlIGlzIDxpPmxlc3MKLSAgICogdGhhbjwvaT4gPGNvZGU+YWRkcjI8L2NvZGU+LgotICAgKgotICAgKiBAcGFyYW0gYWRkcjIgdGhlIDxjb2RlPkFkZHJlc3M8L2NvZGU+IHRvIGJlIGNvbXBhcmVkIHRvIHRoaXMKLSAgICogICAgICAgICAgPGNvZGU+QWRkcmVzczwvY29kZT4uCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIDxjb2RlPkFkZHJlc3M8L2NvZGU+IGluc3RhbmNlIGlzIDxpPmxlc3MKLSAgICogdGhhbjwvaT4gPGNvZGU+YWRkcjI8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gTFQoQWRkcmVzcyBhZGRyMikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIDxjb2RlPkFkZHJlc3M8L2NvZGU+IGluc3RhbmNlIGlzIDxpPmxlc3MKLSAgICogdGhhbiBvciBlcXVhbCB0bzwvaT4gPGNvZGU+YWRkcjI8L2NvZGU+LgotICAgKgotICAgKiBAcGFyYW0gYWRkcjIgdGhlIDxjb2RlPkFkZHJlc3M8L2NvZGU+IHRvIGJlIGNvbXBhcmVkIHRvIHRoaXMKLSAgICogICAgICAgICAgPGNvZGU+QWRkcmVzczwvY29kZT4uCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIDxjb2RlPkFkZHJlc3M8L2NvZGU+IGluc3RhbmNlIGlzIDxpPmxlc3MKLSAgICogdGhhbiBvciBlcXVhbCB0bzwvaT4gPGNvZGU+YWRkcjI8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gTEUoQWRkcmVzcyBhZGRyMikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIDxjb2RlPkFkZHJlc3M8L2NvZGU+IGluc3RhbmNlIGlzIDxpPmdyZWF0ZXIKLSAgICogdGhhbjwvaT4gPGNvZGU+YWRkcjI8L2NvZGU+LgotICAgKgotICAgKiBAcGFyYW0gYWRkcjIgdGhlIDxjb2RlPkFkZHJlc3M8L2NvZGU+IHRvIGJlIGNvbXBhcmVkIHRvIHRoaXMKLSAgICogICAgICAgICAgPGNvZGU+QWRkcmVzczwvY29kZT4uCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIDxjb2RlPkFkZHJlc3M8L2NvZGU+IGluc3RhbmNlIGlzIDxpPmdyZWF0ZXIKLSAgICogdGhhbjwvaT4gPGNvZGU+YWRkcjI8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gR1QoQWRkcmVzcyBhZGRyMikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIDxjb2RlPkFkZHJlc3M8L2NvZGU+IGluc3RhbmNlIGlzIDxpPmdyZWF0ZXIKLSAgICogdGhhbiBvciBlcXVhbCB0bzwvaT4gPGNvZGU+YWRkcjI8L2NvZGU+LgotICAgKgotICAgKiBAcGFyYW0gYWRkcjIgdGhlIDxjb2RlPkFkZHJlc3M8L2NvZGU+IHRvIGJlIGNvbXBhcmVkIHRvIHRoaXMKLSAgICogICAgICAgICAgPGNvZGU+QWRkcmVzczwvY29kZT4uCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIDxjb2RlPkFkZHJlc3M8L2NvZGU+IGluc3RhbmNlIGlzIDxpPmdyZWF0ZXIKLSAgICogdGhhbiBvciBlcXVhbCB0bzwvaT4gPGNvZGU+YWRkcjI8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gR0UoQWRkcmVzcyBhZGRyMikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIDxjb2RlPkFkZHJlc3M8L2NvZGU+IGluc3RhbmNlIGlzIDxpPmVxdWFsCi0gICAqIHRvPC9pPiA8Y29kZT5hZGRyMjwvY29kZT4uCi0gICAqCi0gICAqIEBwYXJhbSBhZGRyMiB0aGUgPGNvZGU+QWRkcmVzczwvY29kZT4gdG8gYmUgY29tcGFyZWQgdG8gdGhpcwotICAgKiAgICAgICAgICA8Y29kZT5BZGRyZXNzPC9jb2RlPi4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgPGNvZGU+QWRkcmVzczwvY29kZT4gaW5zdGFuY2UgaXMgPGk+ZXF1YWwKLSAgICogdG88L2k+IDxjb2RlPmFkZHIyPC9jb2RlPi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIEVRKEFkZHJlc3MgYWRkcjIpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRydWUgaWYgdGhpcyA8Y29kZT5BZGRyZXNzPC9jb2RlPiBpbnN0YW5jZSBpcyA8aT5ub3QgZXF1YWwKLSAgICogdG88L2k+IDxjb2RlPmFkZHIyPC9jb2RlPi4KLSAgICoKLSAgICogQHBhcmFtIGFkZHIyIHRoZSA8Y29kZT5BZGRyZXNzPC9jb2RlPiB0byBiZSBjb21wYXJlZCB0byB0aGlzCi0gICAqICAgICAgICAgIDxjb2RlPkFkZHJlc3M8L2NvZGU+LgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyA8Y29kZT5BZGRyZXNzPC9jb2RlPiBpbnN0YW5jZSBpcyA8aT5ub3QKLSAgICogZXF1YWwgdG88L2k+IDxjb2RlPmFkZHIyPC9jb2RlPi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIE5FKEFkZHJlc3MgYWRkcjIpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBTb2Z0d2FyZSBwcmVmZXRjaCBvcGVyYXRvcnMgZXRjCi0gICAqLwotCi0gIC8qKgotICAgKiBQcmVmZXRjaCBhIGNhY2hlLWxpbmUsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudAotICAgKi8KLSAgcHVibGljIHZvaWQgcHJlZmV0Y2goKSB7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBNZW1vcnkgYWNjZXNzIG9wZXJhdG9ycwotICAgKi8KLQotICAvKioKLSAgICogTG9hZHMgYSByZWZlcmVuY2UgZnJvbSB0aGUgbWVtb3J5IGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlCi0gICAqIGN1cnJlbnQgaW5zdGFuY2UuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIHJlYWQgdmFsdWUKLSAgICovCi0gIHB1YmxpYyBPYmplY3RSZWZlcmVuY2UgbG9hZE9iamVjdFJlZmVyZW5jZSgpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBMb2FkcyBhIHJlZmVyZW5jZSBmcm9tIHRoZSBtZW1vcnkgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUKLSAgICogY3VycmVudCBpbnN0YW5jZS4KLSAgICoKLSAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHRvIHRoZSB2YWx1ZS4KLSAgICogQHJldHVybiB0aGUgcmVhZCB2YWx1ZQotICAgKi8KLSAgcHVibGljIE9iamVjdFJlZmVyZW5jZSBsb2FkT2JqZWN0UmVmZXJlbmNlKE9mZnNldCBvZmZzZXQpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBMb2FkcyBhIGJ5dGUgZnJvbSB0aGUgbWVtb3J5IGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlCi0gICAqIGN1cnJlbnQgaW5zdGFuY2UuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIHJlYWQgdmFsdWUKLSAgICovCi0gIHB1YmxpYyBieXRlIGxvYWRCeXRlKCkgewotICAgIHJldHVybiAoYnl0ZSkgMDsKLSAgfQotCi0gIC8qKgotICAgKiBMb2FkcyBhIGJ5dGUgZnJvbSB0aGUgbWVtb3J5IGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlCi0gICAqIGN1cnJlbnQgaW5zdGFuY2UuCi0gICAqCi0gICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCB0byB0aGUgdmFsdWUuCi0gICAqIEByZXR1cm4gdGhlIHJlYWQgdmFsdWUKLSAgICovCi0gIHB1YmxpYyBieXRlIGxvYWRCeXRlKE9mZnNldCBvZmZzZXQpIHsKLSAgICByZXR1cm4gKGJ5dGUpIDA7Ci0gIH0KLQotICAvKioKLSAgICogTG9hZHMgYSBjaGFyIGZyb20gdGhlIG1lbW9yeSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IHRoZQotICAgKiBjdXJyZW50IGluc3RhbmNlLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSByZWFkIHZhbHVlCi0gICAqLwotICBwdWJsaWMgY2hhciBsb2FkQ2hhcigpIHsKLSAgICByZXR1cm4gKGNoYXIpIDA7Ci0gIH0KLQotICAvKioKLSAgICogTG9hZHMgYSBjaGFyIGZyb20gdGhlIG1lbW9yeSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IHRoZQotICAgKiBjdXJyZW50IGluc3RhbmNlLgotICAgKgotICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdG8gdGhlIHZhbHVlLgotICAgKiBAcmV0dXJuIHRoZSByZWFkIHZhbHVlCi0gICAqLwotICBwdWJsaWMgY2hhciBsb2FkQ2hhcihPZmZzZXQgb2Zmc2V0KSB7Ci0gICAgcmV0dXJuIChjaGFyKSAwOwotICB9Ci0KLSAgLyoqCi0gICAqIExvYWRzIGEgc2hvcnQgZnJvbSB0aGUgbWVtb3J5IGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlCi0gICAqIGN1cnJlbnQgaW5zdGFuY2UuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIHJlYWQgdmFsdWUKLSAgICovCi0gIHB1YmxpYyBzaG9ydCBsb2FkU2hvcnQoKSB7Ci0gICAgcmV0dXJuIChzaG9ydCkgMDsKLSAgfQotCi0gIC8qKgotICAgKiBMb2FkcyBhIHNob3J0IGZyb20gdGhlIG1lbW9yeSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IHRoZQotICAgKiBjdXJyZW50IGluc3RhbmNlLgotICAgKgotICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdG8gdGhlIHZhbHVlLgotICAgKiBAcmV0dXJuIHRoZSByZWFkIHZhbHVlCi0gICAqLwotICBwdWJsaWMgc2hvcnQgbG9hZFNob3J0KE9mZnNldCBvZmZzZXQpIHsKLSAgICByZXR1cm4gKHNob3J0KSAwOwotICB9Ci0KLSAgLyoqCi0gICAqIExvYWRzIGEgZmxvYXQgZnJvbSB0aGUgbWVtb3J5IGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlCi0gICAqIGN1cnJlbnQgaW5zdGFuY2UuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIHJlYWQgdmFsdWUKLSAgICovCi0gIHB1YmxpYyBmbG9hdCBsb2FkRmxvYXQoKSB7Ci0gICAgcmV0dXJuIChmbG9hdCkgMDsKLSAgfQotCi0gIC8qKgotICAgKiBMb2FkcyBhIGZsb2F0IGZyb20gdGhlIG1lbW9yeSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IHRoZQotICAgKiBjdXJyZW50IGluc3RhbmNlLgotICAgKgotICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdG8gdGhlIHZhbHVlLgotICAgKiBAcmV0dXJuIHRoZSByZWFkIHZhbHVlCi0gICAqLwotICBwdWJsaWMgZmxvYXQgbG9hZEZsb2F0KE9mZnNldCBvZmZzZXQpIHsKLSAgICByZXR1cm4gKGZsb2F0KSAwOwotICB9Ci0KLSAgLyoqCi0gICAqIExvYWRzIGFuIGludCBmcm9tIHRoZSBtZW1vcnkgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUKLSAgICogY3VycmVudCBpbnN0YW5jZS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgcmVhZCB2YWx1ZQotICAgKi8KLSAgcHVibGljIGludCBsb2FkSW50KCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLyoqCi0gICAqIExvYWRzIGFuIGludCBmcm9tIHRoZSBtZW1vcnkgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUKLSAgICogY3VycmVudCBpbnN0YW5jZS4KLSAgICoKLSAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHRvIHRoZSB2YWx1ZS4KLSAgICogQHJldHVybiB0aGUgcmVhZCB2YWx1ZQotICAgKi8KLSAgcHVibGljIGludCBsb2FkSW50KE9mZnNldCBvZmZzZXQpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIExvYWRzIGEgbG9uZyBmcm9tIHRoZSBtZW1vcnkgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUKLSAgICogY3VycmVudCBpbnN0YW5jZS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgcmVhZCB2YWx1ZQotICAgKi8KLSAgcHVibGljIGxvbmcgbG9hZExvbmcoKSB7Ci0gICAgcmV0dXJuIDBMOwotICB9Ci0KLSAgLyoqCi0gICAqIExvYWRzIGEgbG9uZyBmcm9tIHRoZSBtZW1vcnkgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUKLSAgICogY3VycmVudCBpbnN0YW5jZS4KLSAgICoKLSAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHRvIHRoZSB2YWx1ZS4KLSAgICogQHJldHVybiB0aGUgcmVhZCB2YWx1ZQotICAgKi8KLSAgcHVibGljIGxvbmcgbG9hZExvbmcoT2Zmc2V0IG9mZnNldCkgewotICAgIHJldHVybiAwTDsKLSAgfQotCi0gIC8qKgotICAgKiBMb2FkcyBhIGRvdWJsZSBmcm9tIHRoZSBtZW1vcnkgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUKLSAgICogY3VycmVudCBpbnN0YW5jZS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgcmVhZCB2YWx1ZQotICAgKi8KLSAgcHVibGljIGRvdWJsZSBsb2FkRG91YmxlKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLyoqCi0gICAqIExvYWRzIGEgZG91YmxlIGZyb20gdGhlIG1lbW9yeSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IHRoZQotICAgKiBjdXJyZW50IGluc3RhbmNlLgotICAgKgotICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdG8gdGhlIHZhbHVlLgotICAgKiBAcmV0dXJuIHRoZSByZWFkIHZhbHVlCi0gICAqLwotICBwdWJsaWMgZG91YmxlIGxvYWREb3VibGUoT2Zmc2V0IG9mZnNldCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLQotICAvKioKLSAgICogTG9hZHMgYW4gYWRkcmVzcyB2YWx1ZSBmcm9tIHRoZSBtZW1vcnkgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUKLSAgICogY3VycmVudCBpbnN0YW5jZS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgcmVhZCBhZGRyZXNzIHZhbHVlLgotICAgKi8KLSAgcHVibGljIEFkZHJlc3MgbG9hZEFkZHJlc3MoKSB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogTG9hZHMgYW4gYWRkcmVzcyB2YWx1ZSBmcm9tIHRoZSBtZW1vcnkgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUKLSAgICogY3VycmVudCBpbnN0YW5jZS4KLSAgICoKLSAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHRvIHRoZSB2YWx1ZS4KLSAgICogQHJldHVybiB0aGUgcmVhZCBhZGRyZXNzIHZhbHVlLgotICAgKi8KLSAgcHVibGljIEFkZHJlc3MgbG9hZEFkZHJlc3MoT2Zmc2V0IG9mZnNldCkgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIExvYWRzIGEgd29yZCB2YWx1ZSBmcm9tIHRoZSBtZW1vcnkgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUKLSAgICogY3VycmVudCBpbnN0YW5jZS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgcmVhZCB3b3JkIHZhbHVlLgotICAgKi8KLSAgcHVibGljIFdvcmQgbG9hZFdvcmQoKSB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogTG9hZHMgYSB3b3JkIHZhbHVlIGZyb20gdGhlIG1lbW9yeSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IHRoZQotICAgKiBjdXJyZW50IGluc3RhbmNlLgotICAgKgotICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdG8gdGhlIHZhbHVlLgotICAgKiBAcmV0dXJuIHRoZSByZWFkIHdvcmQgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgV29yZCBsb2FkV29yZChPZmZzZXQgb2Zmc2V0KSB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogU3RvcmVzIHRoZSBhZGRyZXNzIHZhbHVlIGluIHRoZSBtZW1vcnkgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUKLSAgICogY3VycmVudCBpbnN0YW5jZS4KLSAgICoKLSAgICogQHBhcmFtIHZhbHVlIFRoZSBhZGRyZXNzIHZhbHVlIHRvIHN0b3JlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc3RvcmUoT2JqZWN0UmVmZXJlbmNlIHZhbHVlKSB7Ci0gIH0KLQotICAvKioKLSAgICogU3RvcmVzIHRoZSBvYmplY3QgcmVmZXJlbmNlIHZhbHVlIGluIHRoZSBtZW1vcnkgbG9jYXRpb24gcG9pbnRlZAotICAgKiB0byBieSB0aGUgY3VycmVudCBpbnN0YW5jZS4KLSAgICoKLSAgICogQHBhcmFtIHZhbHVlIFRoZSBvYmplY3QgcmVmZXJlbmNlIHZhbHVlIHRvIHN0b3JlLgotICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdG8gdGhlIHZhbHVlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc3RvcmUoT2JqZWN0UmVmZXJlbmNlIHZhbHVlLCBPZmZzZXQgb2Zmc2V0KSB7Ci0gIH0KLQotICAvKioKLSAgICogU3RvcmVzIHRoZSBhZGRyZXNzIHZhbHVlIGluIHRoZSBtZW1vcnkgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUKLSAgICogY3VycmVudCBpbnN0YW5jZS4KLSAgICoKLSAgICogQHBhcmFtIHZhbHVlIFRoZSBhZGRyZXNzIHZhbHVlIHRvIHN0b3JlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc3RvcmUoQWRkcmVzcyB2YWx1ZSkgewotICB9Ci0KLSAgLyoqCi0gICAqIFN0b3JlcyB0aGUgYWRkcmVzcyB2YWx1ZSBpbiB0aGUgbWVtb3J5IGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlCi0gICAqIGN1cnJlbnQgaW5zdGFuY2UuCi0gICAqCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgYWRkcmVzcyB2YWx1ZSB0byBzdG9yZS4KLSAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHRvIHRoZSB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0b3JlKEFkZHJlc3MgdmFsdWUsIE9mZnNldCBvZmZzZXQpIHsKLSAgfQotCi0gIC8qKgotICAgKiBTdG9yZXMgdGhlIGZsb2F0IHZhbHVlIGluIHRoZSBtZW1vcnkgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUKLSAgICogY3VycmVudCBpbnN0YW5jZS4KLSAgICoKLSAgICogQHBhcmFtIHZhbHVlIFRoZSBmbG9hdCB2YWx1ZSB0byBzdG9yZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0b3JlKGZsb2F0IHZhbHVlKSB7Ci0gIH0KLQotICAvKioKLSAgICogU3RvcmVzIHRoZSBmbG9hdCB2YWx1ZSBpbiB0aGUgbWVtb3J5IGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlCi0gICAqIGN1cnJlbnQgaW5zdGFuY2UuCi0gICAqCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgZmxvYXQgdmFsdWUgdG8gc3RvcmUuCi0gICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCB0byB0aGUgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdG9yZShmbG9hdCB2YWx1ZSwgT2Zmc2V0IG9mZnNldCkgewotICB9Ci0KLSAgLyoqCi0gICAqIFN0b3JlcyB0aGUgd29yZCB2YWx1ZSBpbiB0aGUgbWVtb3J5IGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlCi0gICAqIGN1cnJlbnQgaW5zdGFuY2UuCi0gICAqCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgd29yZCB2YWx1ZSB0byBzdG9yZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0b3JlKFdvcmQgdmFsdWUpIHsKLSAgfQotCi0gIC8qKgotICAgKiBTdG9yZXMgdGhlIHdvcmQgdmFsdWUgaW4gdGhlIG1lbW9yeSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IHRoZQotICAgKiBjdXJyZW50IGluc3RhbmNlLgotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHdvcmQgdmFsdWUgdG8gc3RvcmUuCi0gICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCB0byB0aGUgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdG9yZShXb3JkIHZhbHVlLCBPZmZzZXQgb2Zmc2V0KSB7Ci0gIH0KLQotICAvKioKLSAgICogU3RvcmVzIHRoZSBieXRlIHZhbHVlIGluIHRoZSBtZW1vcnkgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUKLSAgICogY3VycmVudCBpbnN0YW5jZS4KLSAgICoKLSAgICogQHBhcmFtIHZhbHVlIFRoZSBieXRlIHZhbHVlIHRvIHN0b3JlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc3RvcmUoYnl0ZSB2YWx1ZSkgewotICB9Ci0KLSAgLyoqCi0gICAqIFN0b3JlcyB0aGUgYnl0ZSB2YWx1ZSBpbiB0aGUgbWVtb3J5IGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlCi0gICAqIGN1cnJlbnQgaW5zdGFuY2UuCi0gICAqCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgYnl0ZSB2YWx1ZSB0byBzdG9yZS4KLSAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHRvIHRoZSB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0b3JlKGJ5dGUgdmFsdWUsIE9mZnNldCBvZmZzZXQpIHsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFN0b3JlcyBhbiBpbnQgdmFsdWUgaW4gbWVtb3J5IGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlCi0gICAqIGN1cnJlbnQgaW5zdGFuY2UuCi0gICAqCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgaW50IHZhbHVlIHRvIHN0b3JlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc3RvcmUoaW50IHZhbHVlKSB7Ci0gIH0KLQotICAvKioKLSAgICogU3RvcmVzIGFuIGludCB2YWx1ZSBpbiBtZW1vcnkgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUKLSAgICogY3VycmVudCBpbnN0YW5jZS4KLSAgICoKLSAgICogQHBhcmFtIHZhbHVlIFRoZSBpbnQgdmFsdWUgdG8gc3RvcmUuCi0gICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCB0byB0aGUgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdG9yZShpbnQgdmFsdWUsIE9mZnNldCBvZmZzZXQpIHsKLSAgfQotCi0gIC8qKgotICAgKiBTdG9yZXMgYSBkb3VibGUgdmFsdWUgaW4gbWVtb3J5IGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlCi0gICAqIGN1cnJlbnQgaW5zdGFuY2UuCi0gICAqCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgZG91YmxlIHZhbHVlIHRvIHN0b3JlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc3RvcmUoZG91YmxlIHZhbHVlKSB7Ci0gIH0KLQotICAvKioKLSAgICogU3RvcmVzIGEgZG91YmxlIHZhbHVlIGluIG1lbW9yeSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IHRoZQotICAgKiBjdXJyZW50IGluc3RhbmNlLgotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIGRvdWJsZSB2YWx1ZSB0byBzdG9yZS4KLSAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHRvIHRoZSB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0b3JlKGRvdWJsZSB2YWx1ZSwgT2Zmc2V0IG9mZnNldCkgewotICB9Ci0KLQotICAvKioKLSAgICogU3RvcmVzIGEgZG91YmxlIHZhbHVlIGluIG1lbW9yeSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IHRoZQotICAgKiBjdXJyZW50IGluc3RhbmNlLgotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIGRvdWJsZSB2YWx1ZSB0byBzdG9yZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0b3JlKGxvbmcgdmFsdWUpIHsKLSAgfQotCi0gIC8qKgotICAgKiBTdG9yZXMgYSBkb3VibGUgdmFsdWUgaW4gbWVtb3J5IGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlCi0gICAqIGN1cnJlbnQgaW5zdGFuY2UuCi0gICAqCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgZG91YmxlIHZhbHVlIHRvIHN0b3JlLgotICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdG8gdGhlIHZhbHVlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc3RvcmUobG9uZyB2YWx1ZSwgT2Zmc2V0IG9mZnNldCkgewotICB9Ci0KLSAgLyoqCi0gICAqIFN0b3JlcyBhIGNoYXIgdmFsdWUgaW4gdGhlIG1lbW9yeSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IHRoZQotICAgKiBjdXJyZW50IGluc3RhbmNlLgotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIGNoYXIgdmFsdWUgdG8gc3RvcmUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdG9yZShjaGFyIHZhbHVlKSB7Ci0gIH0KLQotICAvKioKLSAgICogU3RvcmVzIGEgY2hhciB2YWx1ZSBpbiB0aGUgbWVtb3J5IGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlCi0gICAqIGN1cnJlbnQgaW5zdGFuY2UuCi0gICAqCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgY2hhciB2YWx1ZSB0byBzdG9yZS4KLSAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHRvIHRoZSB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0b3JlKGNoYXIgdmFsdWUsIE9mZnNldCBvZmZzZXQpIHsKLSAgfQotCi0gIC8qKgotICAgKiBTdG9yZXMgYSBzaG9ydCB2YWx1ZSBpbiB0aGUgbWVtb3J5IGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlCi0gICAqIGN1cnJlbnQgaW5zdGFuY2UuCi0gICAqCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgc2hvcnQgdmFsdWUgdG8gc3RvcmUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdG9yZShzaG9ydCB2YWx1ZSkgewotICB9Ci0KLSAgLyoqCi0gICAqIFN0b3JlcyBhIHNob3J0IHZhbHVlIGluIHRoZSBtZW1vcnkgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUKLSAgICogY3VycmVudCBpbnN0YW5jZS4KLSAgICoKLSAgICogQHBhcmFtIHZhbHVlIHRoZSBzaG9ydCB2YWx1ZSB0byBzdG9yZS4KLSAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHRvIHRoZSB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0b3JlKHNob3J0IHZhbHVlLCBPZmZzZXQgb2Zmc2V0KSB7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBBdG9taWMgbWVtb3J5IGFjY2VzcyBvcGVyYXRvcnMgKGNvbXBhcmUgYW5kIHN3YXApCi0gICAqLwotCi0gIC8qKgotICAgKiBQcmVwYXJlIGZvciBhbiBhdG9taWMgc3RvcmUgb3BlcmF0aW9uLiBUaGlzIG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoCi0gICAqIGEgcmVsYXRlZCBjYWxsIHRvIGF0dGVtcHQuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIG9sZCB2YWx1ZSB0byBiZSBwYXNzZWQgdG8gYW4gYXR0ZW1wdCBjYWxsLgotICAgKi8KLSAgcHVibGljIFdvcmQgcHJlcGFyZVdvcmQoKSB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUHJlcGFyZSBmb3IgYW4gYXRvbWljIHN0b3JlIG9wZXJhdGlvbi4gVGhpcyBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aAotICAgKiBhIHJlbGF0ZWQgY2FsbCB0byBhdHRlbXB0LgotICAgKgotICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdG8gdGhlIHZhbHVlLgotICAgKiBAcmV0dXJuIHRoZSBvbGQgdmFsdWUgdG8gYmUgcGFzc2VkIHRvIGFuIGF0dGVtcHQgY2FsbC4KLSAgICovCi0gIHB1YmxpYyBXb3JkIHByZXBhcmVXb3JkKE9mZnNldCBvZmZzZXQpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBQcmVwYXJlIGZvciBhbiBhdG9taWMgc3RvcmUgb3BlcmF0aW9uLiBUaGlzIG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoCi0gICAqIGEgcmVsYXRlZCBjYWxsIHRvIGF0dGVtcHQuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIG9sZCB2YWx1ZSB0byBiZSBwYXNzZWQgdG8gYW4gYXR0ZW1wdCBjYWxsLgotICAgKi8KLSAgcHVibGljIE9iamVjdFJlZmVyZW5jZSBwcmVwYXJlT2JqZWN0UmVmZXJlbmNlKCkgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFByZXBhcmUgZm9yIGFuIGF0b21pYyBzdG9yZSBvcGVyYXRpb24uIFRoaXMgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGgKLSAgICogYSByZWxhdGVkIGNhbGwgdG8gYXR0ZW1wdC4KLSAgICoKLSAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHRvIHRoZSB2YWx1ZS4KLSAgICogQHJldHVybiB0aGUgb2xkIHZhbHVlIHRvIGJlIHBhc3NlZCB0byBhbiBhdHRlbXB0IGNhbGwuCi0gICAqLwotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlIHByZXBhcmVPYmplY3RSZWZlcmVuY2UoT2Zmc2V0IG9mZnNldCkgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFByZXBhcmUgZm9yIGFuIGF0b21pYyBzdG9yZSBvcGVyYXRpb24uIFRoaXMgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGgKLSAgICogYSByZWxhdGVkIGNhbGwgdG8gYXR0ZW1wdC4KLSAgICoKLSAgICogQHJldHVybiB0aGUgb2xkIHZhbHVlIHRvIGJlIHBhc3NlZCB0byBhbiBhdHRlbXB0IGNhbGwuCi0gICAqLwotICBwdWJsaWMgQWRkcmVzcyBwcmVwYXJlQWRkcmVzcygpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBQcmVwYXJlIGZvciBhbiBhdG9taWMgc3RvcmUgb3BlcmF0aW9uLiBUaGlzIG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoCi0gICAqIGEgcmVsYXRlZCBjYWxsIHRvIGF0dGVtcHQuCi0gICAqCi0gICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCB0byB0aGUgdmFsdWUuCi0gICAqIEByZXR1cm4gdGhlIG9sZCB2YWx1ZSB0byBiZSBwYXNzZWQgdG8gYW4gYXR0ZW1wdCBjYWxsLgotICAgKi8KLSAgcHVibGljIEFkZHJlc3MgcHJlcGFyZUFkZHJlc3MoT2Zmc2V0IG9mZnNldCkgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFByZXBhcmUgZm9yIGFuIGF0b21pYyBzdG9yZSBvcGVyYXRpb24uIFRoaXMgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGgKLSAgICogYSByZWxhdGVkIGNhbGwgdG8gYXR0ZW1wdC4KLSAgICoKLSAgICogQHJldHVybiB0aGUgb2xkIHZhbHVlIHRvIGJlIHBhc3NlZCB0byBhbiBhdHRlbXB0IGNhbGwuCi0gICAqLwotICBwdWJsaWMgaW50IHByZXBhcmVJbnQoKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvKioKLSAgICogUHJlcGFyZSBmb3IgYW4gYXRvbWljIHN0b3JlIG9wZXJhdGlvbi4gVGhpcyBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aAotICAgKiBhIHJlbGF0ZWQgY2FsbCB0byBhdHRlbXB0LgotICAgKgotICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdG8gdGhlIHZhbHVlLgotICAgKiBAcmV0dXJuIHRoZSBvbGQgdmFsdWUgdG8gYmUgcGFzc2VkIHRvIGFuIGF0dGVtcHQgY2FsbC4KLSAgICovCi0gIHB1YmxpYyBpbnQgcHJlcGFyZUludChPZmZzZXQgb2Zmc2V0KSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvKioKLSAgICogQXR0ZW1wdCBhbiBhdG9taWMgc3RvcmUgb3BlcmF0aW9uLiBUaGlzIG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIGEKLSAgICogcmVsYXRlZCBjYWxsIHRvIHByZXBhcmUuCi0gICAqCi0gICAqIEBwYXJhbSBvbGQgdGhlIG9sZCB2YWx1ZS4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYXR0ZW1wdCB3YXMgc3VjY2Vzc2Z1bC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGF0dGVtcHQoaW50IG9sZCwgaW50IHZhbHVlKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEF0dGVtcHQgYW4gYXRvbWljIHN0b3JlIG9wZXJhdGlvbi4gVGhpcyBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBhCi0gICAqIHJlbGF0ZWQgY2FsbCB0byBwcmVwYXJlLgotICAgKgotICAgKiBAcGFyYW0gb2xkIHRoZSBvbGQgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlLgotICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdG8gdGhlIHZhbHVlLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGF0dGVtcHQgd2FzIHN1Y2Nlc3NmdWwuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBhdHRlbXB0KGludCBvbGQsIGludCB2YWx1ZSwgT2Zmc2V0IG9mZnNldCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBBdHRlbXB0IGFuIGF0b21pYyBzdG9yZSBvcGVyYXRpb24uIFRoaXMgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggYQotICAgKiByZWxhdGVkIGNhbGwgdG8gcHJlcGFyZS4KLSAgICoKLSAgICogQHBhcmFtIG9sZCB0aGUgb2xkIHZhbHVlLgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhdHRlbXB0IHdhcyBzdWNjZXNzZnVsLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYXR0ZW1wdChXb3JkIG9sZCwgV29yZCB2YWx1ZSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBBdHRlbXB0IGFuIGF0b21pYyBzdG9yZSBvcGVyYXRpb24uIFRoaXMgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggYQotICAgKiByZWxhdGVkIGNhbGwgdG8gcHJlcGFyZS4KLSAgICoKLSAgICogQHBhcmFtIG9sZCB0aGUgb2xkIHZhbHVlLgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHRvIHRoZSB2YWx1ZS4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhdHRlbXB0IHdhcyBzdWNjZXNzZnVsLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYXR0ZW1wdChXb3JkIG9sZCwgV29yZCB2YWx1ZSwgT2Zmc2V0IG9mZnNldCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBBdHRlbXB0IGFuIGF0b21pYyBzdG9yZSBvcGVyYXRpb24uIFRoaXMgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggYQotICAgKiByZWxhdGVkIGNhbGwgdG8gcHJlcGFyZS4KLSAgICoKLSAgICogQHBhcmFtIG9sZCB0aGUgb2xkIHZhbHVlLgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhdHRlbXB0IHdhcyBzdWNjZXNzZnVsLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYXR0ZW1wdChPYmplY3RSZWZlcmVuY2Ugb2xkLCBPYmplY3RSZWZlcmVuY2UgdmFsdWUpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogQXR0ZW1wdCBhbiBhdG9taWMgc3RvcmUgb3BlcmF0aW9uLiBUaGlzIG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIGEKLSAgICogcmVsYXRlZCBjYWxsIHRvIHByZXBhcmUuCi0gICAqCi0gICAqIEBwYXJhbSBvbGQgdGhlIG9sZCB2YWx1ZS4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUuCi0gICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCB0byB0aGUgdmFsdWUuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYXR0ZW1wdCB3YXMgc3VjY2Vzc2Z1bC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGF0dGVtcHQoT2JqZWN0UmVmZXJlbmNlIG9sZCwgT2JqZWN0UmVmZXJlbmNlIHZhbHVlLAotICAgICAgT2Zmc2V0IG9mZnNldCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBBdHRlbXB0IGFuIGF0b21pYyBzdG9yZSBvcGVyYXRpb24uIFRoaXMgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggYQotICAgKiByZWxhdGVkIGNhbGwgdG8gcHJlcGFyZS4KLSAgICoKLSAgICogQHBhcmFtIG9sZCB0aGUgb2xkIHZhbHVlLgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhdHRlbXB0IHdhcyBzdWNjZXNzZnVsLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYXR0ZW1wdChBZGRyZXNzIG9sZCwgQWRkcmVzcyB2YWx1ZSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBBdHRlbXB0IGFuIGF0b21pYyBzdG9yZSBvcGVyYXRpb24uIFRoaXMgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggYQotICAgKiByZWxhdGVkIGNhbGwgdG8gcHJlcGFyZS4KLSAgICoKLSAgICogQHBhcmFtIG9sZCB0aGUgb2xkIHZhbHVlLgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHRvIHRoZSB2YWx1ZS4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhdHRlbXB0IHdhcyBzdWNjZXNzZnVsLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYXR0ZW1wdChBZGRyZXNzIG9sZCwgQWRkcmVzcyB2YWx1ZSwgT2Zmc2V0IG9mZnNldCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3VuYm94ZWQvQWRkcmVzc0FycmF5LmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3VuYm94ZWQvQWRkcmVzc0FycmF5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYzM1M2QuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy91bmJveGVkL0FkZHJlc3NBcnJheS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgKENQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9jcGwxLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy52bW1hZ2ljLnVuYm94ZWQ7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRyZXNzQXJyYXkgewotCi0gIHByaXZhdGUgZmluYWwgQWRkcmVzc1tdIGRhdGE7Ci0KLSAgcHJpdmF0ZSBBZGRyZXNzQXJyYXkoaW50IHNpemUpIHsKLSAgICBkYXRhID0gbmV3IEFkZHJlc3Nbc2l6ZV07Ci0gICAgQWRkcmVzcyB6ZXJvID0gQWRkcmVzcy56ZXJvKCk7Ci0gICAgZm9yKGludCBpPTA7IGk8c2l6ZTtpKyspIHsKLSAgICAgIGRhdGFbaV0gPSB6ZXJvOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgQWRkcmVzc0FycmF5IGNyZWF0ZShpbnQgc2l6ZSkgewotICAgIHJldHVybiBuZXcgQWRkcmVzc0FycmF5KHNpemUpOwotICB9Ci0KLSAgcHVibGljIEFkZHJlc3MgZ2V0KGludCBpbmRleCkgewotICAgIHJldHVybiBkYXRhW2luZGV4XTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldChpbnQgaW5kZXgsIEFkZHJlc3MgdikgewotICAgIGRhdGFbaW5kZXhdID0gdjsKLSAgfQotCi0gIHB1YmxpYyBpbnQgbGVuZ3RoKCkgewotICAgIHJldHVybiBkYXRhLmxlbmd0aDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy91bmJveGVkL0V4dGVudC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy91bmJveGVkL0V4dGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDU3OTZmLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvdW5ib3hlZC9FeHRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIChDUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvY3BsMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcudm1tYWdpYy51bmJveGVkOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMuVW5ib3hlZDsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuUmF3U3RvcmFnZTsKLQotQFVuYm94ZWQKLUBSYXdTdG9yYWdlKGxlbmd0aEluV29yZHMgPSB0cnVlLCBsZW5ndGggPSAxKQotcHVibGljIGZpbmFsIGNsYXNzIEV4dGVudCB7Ci0gIHB1YmxpYyBzdGF0aWMgRXh0ZW50IGZyb21JbnRTaWduRXh0ZW5kKGludCBhZGRyZXNzKSB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIEV4dGVudCBmcm9tSW50WmVyb0V4dGVuZChpbnQgYWRkcmVzcykgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBFeHRlbnQgemVybygpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgRXh0ZW50IG9uZSgpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgRXh0ZW50IG1heCgpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBpbnQgdG9JbnQoKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgbG9uZyB0b0xvbmcoKSB7Ci0gICAgcmV0dXJuIDBMOwotICB9Ci0KLSAgcHVibGljIFdvcmQgdG9Xb3JkKCkgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIEV4dGVudCBwbHVzKGludCBieXRlU2l6ZSkgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIEV4dGVudCBwbHVzKEV4dGVudCBieXRlU2l6ZSkgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIEV4dGVudCBtaW51cyhpbnQgYnl0ZVNpemUpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBFeHRlbnQgbWludXMoRXh0ZW50IGJ5dGVTaXplKSB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBMVChFeHRlbnQgZXh0ZW50MikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIExFKEV4dGVudCBleHRlbnQyKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gR1QoRXh0ZW50IGV4dGVudDIpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBHRShFeHRlbnQgZXh0ZW50MikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIEVRKEV4dGVudCBleHRlbnQyKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gTkUoRXh0ZW50IGV4dGVudDIpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy91bmJveGVkL0V4dGVudEFycmF5LmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3VuYm94ZWQvRXh0ZW50QXJyYXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFjNjYzYS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3VuYm94ZWQvRXh0ZW50QXJyYXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIChDUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvY3BsMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcudm1tYWdpYy51bmJveGVkOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRXh0ZW50QXJyYXkgewotCi0gIHByaXZhdGUgZmluYWwgRXh0ZW50W10gZGF0YTsKLQotICBwcml2YXRlIEV4dGVudEFycmF5KGludCBzaXplKSB7Ci0gICAgZGF0YSA9IG5ldyBFeHRlbnRbc2l6ZV07Ci0gICAgRXh0ZW50IHplcm8gPSBFeHRlbnQuemVybygpOwotICAgIGZvcihpbnQgaT0wOyBpPHNpemU7aSsrKSB7Ci0gICAgICBkYXRhW2ldID0gemVybzsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIEV4dGVudEFycmF5IGNyZWF0ZShpbnQgc2l6ZSkgewotICAgIHJldHVybiBuZXcgRXh0ZW50QXJyYXkoc2l6ZSk7Ci0gIH0KLQotICBwdWJsaWMgRXh0ZW50IGdldChpbnQgaW5kZXgpIHsKLSAgICByZXR1cm4gZGF0YVtpbmRleF07Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXQoaW50IGluZGV4LCBFeHRlbnQgdikgewotICAgIGRhdGFbaW5kZXhdID0gdjsKLSAgfQotCi0gIHB1YmxpYyBpbnQgbGVuZ3RoKCkgewotICAgIHJldHVybiBkYXRhLmxlbmd0aDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy91bmJveGVkL09iamVjdFJlZmVyZW5jZS5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy91bmJveGVkL09iamVjdFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDAwNzJlLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvdW5ib3hlZC9PYmplY3RSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIChDUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvY3BsMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcudm1tYWdpYy51bmJveGVkOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMuVW5ib3hlZDsKLQotLyoqCi0gKiBUaGUgb2JqZWN0IHJlZmVyZW5jZSB0eXBlIGlzIHVzZWQgYnkgdGhlIHJ1bnRpbWUgc3lzdGVtIGFuZCBjb2xsZWN0b3IgdG8KLSAqIHJlcHJlc2VudCBhIHR5cGUgdGhhdCBob2xkcyBhIHJlZmVyZW5jZSB0byBhIHNpbmdsZSBvYmplY3QuCi0gKiBXZSB1c2UgYSBzZXBhcmF0ZSB0eXBlIGluc3RlYWQgb2YgdGhlIEphdmEgT2JqZWN0IHR5cGUgZm9yIGNvZGluZyBjbGFyaXR5LAotICogdG8gbWFrZSBhIGNsZWFyIGRpc3RpbmN0aW9uIGJldHdlZW4gb2JqZWN0cyB0aGUgVk0gaXMgd3JpdHRlbiBpbiwgYW5kCi0gKiBvYmplY3RzIHRoYXQgdGhlIFZNIGlzIG1hbmFnaW5nLiBObyBvcGVyYXRpb25zIHRoYXQgY2FuIG5vdCBiZSBjb21wbGV0ZWQgaW4KLSAqIHB1cmUgSmF2YSBzaG91bGQgYmUgYWxsb3dlZCBvbiBPYmplY3QuCi0gKi8KLUBVbmJveGVkCi1wdWJsaWMgZmluYWwgY2xhc3MgT2JqZWN0UmVmZXJlbmNlIHsKLQotICAvKioKLSAgICogVGhlIG9iamVjdCBmaWVsZC4KLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICBwcml2YXRlIE9iamVjdCBkYXRhOwotCi0gIC8qKgotICAgKiBDb252ZXJ0IGZyb20gYW4gb2JqZWN0IHRvIGEgcmVmZXJlbmNlLgotICAgKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QKLSAgICogQHJldHVybiBUaGUgY29ycmVzcG9uZGluZyByZWZlcmVuY2UKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgT2JqZWN0UmVmZXJlbmNlIGZyb21PYmplY3QoT2JqZWN0IG9iaikgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIG51bGwgcmVmZXJlbmNlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIE9iamVjdFJlZmVyZW5jZSBudWxsUmVmZXJlbmNlKCkgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlcnQgZnJvbSBhbiByZWZlcmVuY2UgdG8gYW4gb2JqZWN0LiBOb3RlOiB0aGlzIGlzIGEgSmlrZXNSVk0KLSAgICogc3BlY2lmaWMgZXh0ZW5zaW9uIHRvIHZtbWFnaWMuCi0gICAqIEByZXR1cm4gVGhlIG9iamVjdAotICAgKi8KLSAgcHVibGljIE9iamVjdCB0b09iamVjdCgpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYSBoZWFwIGFkZHJlc3MgZm9yIHRoZSBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgQWRkcmVzcyB0b0FkZHJlc3MoKSB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogSXMgdGhpcyBhIG51bGwgcmVmZXJlbmNlPwotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNOdWxsKCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy91bmJveGVkL09iamVjdFJlZmVyZW5jZUFycmF5LmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3VuYm94ZWQvT2JqZWN0UmVmZXJlbmNlQXJyYXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg0NGZiMi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3VuYm94ZWQvT2JqZWN0UmVmZXJlbmNlQXJyYXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIChDUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvY3BsMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcudm1tYWdpYy51bmJveGVkOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgT2JqZWN0UmVmZXJlbmNlQXJyYXkgewotCi0gIHByaXZhdGUgZmluYWwgT2JqZWN0UmVmZXJlbmNlW10gZGF0YTsKLQotICBwcml2YXRlIE9iamVjdFJlZmVyZW5jZUFycmF5KGludCBzaXplKSB7Ci0gICAgZGF0YSA9IG5ldyBPYmplY3RSZWZlcmVuY2Vbc2l6ZV07Ci0gICAgT2JqZWN0UmVmZXJlbmNlIG51bGxSZWYgPSBPYmplY3RSZWZlcmVuY2UubnVsbFJlZmVyZW5jZSgpOwotICAgIGZvcihpbnQgaT0wOyBpPHNpemU7aSsrKSB7Ci0gICAgICBkYXRhW2ldID0gbnVsbFJlZjsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIE9iamVjdFJlZmVyZW5jZUFycmF5IGNyZWF0ZShpbnQgc2l6ZSkgewotICAgIHJldHVybiBuZXcgT2JqZWN0UmVmZXJlbmNlQXJyYXkoc2l6ZSk7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0UmVmZXJlbmNlIGdldChpbnQgaW5kZXgpIHsKLSAgICByZXR1cm4gZGF0YVtpbmRleF07Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXQoaW50IGluZGV4LCBPYmplY3RSZWZlcmVuY2UgdikgewotICAgIGRhdGFbaW5kZXhdID0gdjsKLSAgfQotCi0gIHB1YmxpYyBpbnQgbGVuZ3RoKCkgewotICAgIHJldHVybiBkYXRhLmxlbmd0aDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy91bmJveGVkL09mZnNldC5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy91bmJveGVkL09mZnNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTJjNDdhLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvdW5ib3hlZC9PZmZzZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIChDUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvY3BsMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcudm1tYWdpYy51bmJveGVkOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMuVW5ib3hlZDsKLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuUmF3U3RvcmFnZTsKLQotLyoqCi0gKiBUbyBiZSBjb21tZW50ZWQKLSAqLwotQFVuYm94ZWQKLUBSYXdTdG9yYWdlKGxlbmd0aEluV29yZHMgPSB0cnVlLCBsZW5ndGggPSAxKQotcHVibGljIGZpbmFsIGNsYXNzIE9mZnNldCB7Ci0KLSAgcHVibGljIHN0YXRpYyBPZmZzZXQgZnJvbUludFNpZ25FeHRlbmQoaW50IGFkZHJlc3MpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgT2Zmc2V0IGZyb21JbnRaZXJvRXh0ZW5kKGludCBhZGRyZXNzKSB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIE9mZnNldCB6ZXJvKCkgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBPZmZzZXQgbWF4KCkgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGludCB0b0ludCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBsb25nIHRvTG9uZygpIHsKLSAgICByZXR1cm4gMEw7Ci0gIH0KLQotICBwdWJsaWMgV29yZCB0b1dvcmQoKSB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgT2Zmc2V0IHBsdXMoaW50IGJ5dGVTaXplKSB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgT2Zmc2V0IG1pbnVzKGludCBieXRlU2l6ZSkgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIE9mZnNldCBtaW51cyhPZmZzZXQgb2ZmMikgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gRVEoT2Zmc2V0IG9mZjIpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBORShPZmZzZXQgb2ZmMikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNMVChPZmZzZXQgb2ZmMikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNMRShPZmZzZXQgb2ZmMikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNHVChPZmZzZXQgb2ZmMikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNHRShPZmZzZXQgb2ZmMikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzWmVybygpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc01heCgpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy91bmJveGVkL09mZnNldEFycmF5LmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3VuYm94ZWQvT2Zmc2V0QXJyYXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NhYTUxYi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bW1hZ2ljL3VuYm94ZWQvT2Zmc2V0QXJyYXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIChDUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvY3BsMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcudm1tYWdpYy51bmJveGVkOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgT2Zmc2V0QXJyYXkgewotCi0gIHByaXZhdGUgZmluYWwgT2Zmc2V0W10gZGF0YTsKLQotICBwcml2YXRlIE9mZnNldEFycmF5KGludCBzaXplKSB7Ci0gICAgZGF0YSA9IG5ldyBPZmZzZXRbc2l6ZV07Ci0gICAgT2Zmc2V0IHplcm8gPSBPZmZzZXQuemVybygpOwotICAgIGZvcihpbnQgaT0wOyBpPHNpemU7aSsrKSB7Ci0gICAgICBkYXRhW2ldID0gemVybzsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIE9mZnNldEFycmF5IGNyZWF0ZShpbnQgc2l6ZSkgewotICAgIHJldHVybiBuZXcgT2Zmc2V0QXJyYXkoc2l6ZSk7Ci0gIH0KLQotICBwdWJsaWMgT2Zmc2V0IGdldChpbnQgaW5kZXgpIHsKLSAgICByZXR1cm4gZGF0YVtpbmRleF07Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXQoaW50IGluZGV4LCBPZmZzZXQgdikgewotICAgIGRhdGFbaW5kZXhdID0gdjsKLSAgfQotCi0gIHB1YmxpYyBpbnQgbGVuZ3RoKCkgewotICAgIHJldHVybiBkYXRhLmxlbmd0aDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy91bmJveGVkL1dvcmQuamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvdW5ib3hlZC9Xb3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZjBjZWYuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy91bmJveGVkL1dvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSAoQ1BMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2NwbDEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLnZtbWFnaWMudW5ib3hlZDsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLlVuYm94ZWQ7Ci1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLlJhd1N0b3JhZ2U7Ci0KLS8qKgotICogKE1pc3Rha2VzIGluKSBjb21tZW50cyBieSBSb2JpbiBHYXJuZXIKLSAqIEBzZWUgQWRkcmVzcwotICovCi1AVW5ib3hlZAotQFJhd1N0b3JhZ2UobGVuZ3RoSW5Xb3JkcyA9IHRydWUsIGxlbmd0aCA9IDEpCi1wdWJsaWMgZmluYWwgY2xhc3MgV29yZCB7Ci0KLSAgLyoqCi0gICAqIENvbnZlcnQgYW4gaW50byB0byBhIHdvcmQuICBPbiA2NC1iaXQgbWFjaGluZXMsIHNpZ24tZXh0ZW5kIHRoZQotICAgKiBoaWdoIG9yZGVyIGJpdC4KLSAgICoKLSAgICogQHBhcmFtIHZhbAotICAgKiBAcmV0dXJuIEEgd29yZCBpbnN0YW5jZSB3aG9zZSB2YWx1ZSBpcyB2YWwsIHNpZ24tZXh0ZW5kZWQgb24gNjQgYml0IG1hY2hpbmVzCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFdvcmQgZnJvbUludFNpZ25FeHRlbmQoaW50IHZhbCkgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlcnQgYW4gaW50IHRvIGEgd29yZC4gIE9uIDY0LWJpdCBtYWNoaW5lcywgemVyby1leHRlbmQgdGhlCi0gICAqIGhpZ2ggb3JkZXIgYml0LgotICAgKgotICAgKiBAcGFyYW0gdmFsCi0gICAqIEByZXR1cm4gQSB3b3JkIGluc3RhbmNlIHdob3NlIHZhbHVlIGlzIHZhbCwgemVyby1leHRlbmRlZCBvbiA2NCBiaXQgbWFjaGluZXMKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgV29yZCBmcm9tSW50WmVyb0V4dGVuZChpbnQgdmFsKSB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVydCBhIGxvbmcgdG8gYSB3b3JkLiAgT24gNjQtYml0IHRoaXMgaXMgYSBuby1vcC4KLSAgICogVE9ETyBkb2N1bWVudCBiZWhhdmlvdXIgb24gMzItYml0LiAgVHJ1bmNhdGUgPwotICAgKgotICAgKiBAcGFyYW0gdmFsCi0gICAqIEByZXR1cm4gQSB3b3JkIGluc3RhbmNlIHdob3NlIHZhbHVlIGlzIHZhbCBvbiAzMiBiaXQgbWFjaGluZSB0aGlzIHRydW5jYXRlcyB0aGUgdXBwZXIgMzIgYml0cy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgV29yZCBmcm9tTG9uZyhsb25nIHZhbCkgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBXb3JkIGNvbnN0YW50IDAuCi0gICAqIEVxdWl2YWxlbnQgdG8gV29yZC5mcm9tSW50U2lnbkV4dGVuZCgwKSwgYnV0IG1vcmUgcmVhZGFibGUuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIFdvcmQgY29uc3RhbnQgMC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgV29yZCB6ZXJvKCkgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBXb3JkIGNvbnN0YW50IDEuCi0gICAqIEVxdWl2YWxlbnQgdG8gV29yZC5mcm9tSW50U2lnbkV4dGVuZCgxKSwgYnV0IG1vcmUgcmVhZGFibGUuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIFdvcmQgY29uc3RhbnQgMS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgV29yZCBvbmUoKSB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1heGltdW0gcmVwcmVzZW50YWJsZSBXb3JkIHZhbHVlLiAgV29yZHMgYXJlIHVuc2lnbmVkLCBzbyB0aGlzIGlzCi0gICAqIGEgd29yZCBmdWxsIG9mIDFzLCAzMi82NC1iaXQgc2FmZS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgbWF4aW11bSByZXByZXNlbnRhYmxlIFdvcmQgdmFsdWUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgV29yZCBtYXgoKSB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogVHlwZS1jYXN0IHRvIGFuIGludCwgdHJ1bmNhdGluZyBvbiA2NC1iaXQgcGxhdGZvcm1zLgotICAgKgotICAgKiBAcmV0dXJuIGFuIGludCwgd2l0aCB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgd29yZCBvbiAzMiBiaXQgcGxhdGZvcm1zOyB0cnVuY2F0ZXMgb24gNjQgYml0IHBsYXRmb3Jtcy4KLSAgICovCi0gIHB1YmxpYyBpbnQgdG9JbnQoKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvKioKLSAgICogVHlwZS1jYXN0IHRvIGEgbG9uZywgemVyby1leHRlbmRpbmcgb24gYSAzMi1iaXQgcGxhdGZvcm0uCi0gICAqIEByZXR1cm4gYSBsb25nLCB3aXRoIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSB3b3JkICh6ZXJvIGV4dGVuZHMgb24gMzIgYml0IHBsYXRmb3JtcykuCi0gICAqLwotICBwdWJsaWMgbG9uZyB0b0xvbmcoKSB7Ci0gICAgcmV0dXJuIDBMOwotICB9Ci0KLSAgLyoqIFR5cGUtY2FzdCB0byBhbiBhZGRyZXNzLiAqLwotICBwdWJsaWMgQWRkcmVzcyB0b0FkZHJlc3MoKSB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKiogVHlwZS1jYXN0IHRvIGFuIG9mZnNldCAqLwotICBwdWJsaWMgT2Zmc2V0IHRvT2Zmc2V0KCkgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqIFR5cGUtY2FzdCB0byBhbiBleHRlbnQgKi8KLSAgcHVibGljIEV4dGVudCB0b0V4dGVudCgpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgdHdvIHdvcmRzCi0gICAqCi0gICAqIEBwYXJhbSB3MgotICAgKiBAcmV0dXJuIFRoZSB3b3JkIHdob3NlIHZhbHVlIGlzIHRoaXMrdzIKLSAgICovCi0gIHB1YmxpYyBXb3JkIHBsdXMoV29yZCB3MikgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhbiBvZmZzZXQgdG8gYSB3b3JkCi0gICAqIEBwYXJhbSB3MgotICAgKiBAcmV0dXJuIFRoZSB3b3JkIHdob3NlIHZhbHVlIGlzIHRoaXMrdzIKLSAgICovCi0gIHB1YmxpYyBXb3JkIHBsdXMoT2Zmc2V0IHcyKSB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQWRkIGFuIGV4dGVudCB0byBhIHdvcmQKLSAgICogQHBhcmFtIHcyCi0gICAqIEByZXR1cm4gVGhlIHdvcmQgd2hvc2UgdmFsdWUgaXMgdGhpcyt3MgotICAgKi8KLSAgcHVibGljIFdvcmQgcGx1cyhFeHRlbnQgdzIpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBTdWJ0cmFjdCB0d28gd29yZHMKLSAgICogQHBhcmFtIHcyCi0gICAqIEByZXR1cm4gVGhlIHdvcmQgd2hvc2UgdmFsdWUgaXMgdGhpcy13MgotICAgKi8KLSAgcHVibGljIFdvcmQgbWludXMoV29yZCB3MikgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFN1YnRyYWN0IGFuIG9mZnNldCBmcm9tIGEgd29yZAotICAgKiBAcGFyYW0gdzIKLSAgICogQHJldHVybiBUaGUgd29yZCB3aG9zZSB2YWx1ZSBpcyB0aGlzLXcyCi0gICAqLwotICBwdWJsaWMgV29yZCBtaW51cyhPZmZzZXQgdzIpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBTdWJ0cmFjdCBhbiBleHRlbnQgZnJvbSBhIHdvcmQuCi0gICAqIEBwYXJhbSB3MgotICAgKiBAcmV0dXJuIFRoZSB3b3JkIHdob3NlIHZhbHVlIGlzIHRoaXMtdzIKLSAgICovCi0gIHB1YmxpYyBXb3JkIG1pbnVzKEV4dGVudCB3MikgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3QgZm9yIHplcm8uICBFcXVpdmFsZW50IHRvIC5FUShXb3JkLnplcm8oKSkKLSAgICogQHJldHVybiByZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGVxdWFsIHRvIFdvcmQuemVybygpLCBmYWxzZSBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzWmVybygpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogVGVzdCBmb3IgemVyby4gIEVxdWl2YWxlbnQgdG8gLkVRKFdvcmQubWF4KCkpCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGVxdWFsIHRvIFdvcmQubWF4KCksIGZhbHNlIG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNNYXgoKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIExlc3MtdGhhbiBjb21wYXJpc29uCi0gICAqIEBwYXJhbSBhZGRyMgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyA8Y29kZT5Xb3JkPC9jb2RlPiBpbnN0YW5jZSBpcyA8aT5sZXNzIHRoYW48L2k+IDxjb2RlPmFkZHIyPC9jb2RlPgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gTFQoV29yZCBhZGRyMikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBMZXNzLXRoYW4gb3IgZXF1YWwgY29tcGFyaXNvbgotICAgKiBAcGFyYW0gdzIKLSAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgPGNvZGU+V29yZDwvY29kZT4gaW5zdGFuY2UgaXMgPGk+bGVzcyB0aGFuIG9yIGVxdWFsIHRvPC9pPiA8Y29kZT53MjwvY29kZT4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIExFKFdvcmQgdzIpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogR3JlYXRlci10aGFuIGNvbXBhcmlzb24KLSAgICogQHBhcmFtIHcyCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIDxjb2RlPldvcmQ8L2NvZGU+IGluc3RhbmNlIGlzIDxpPmdyZWF0ZXIgdGhhbjwvaT4gPGNvZGU+dzI8L2NvZGU+Ci0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBHVChXb3JkIHcyKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdyZWF0ZXItdGhhbiBvciBlcXVhbCBjb21wYXJpc29uCi0gICAqIEBwYXJhbSB3MgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyA8Y29kZT5Xb3JkPC9jb2RlPiBpbnN0YW5jZSBpcyA8aT5ncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG88L2k+IDxjb2RlPncyPC9jb2RlPgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gR0UoV29yZCB3MikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBFcXVhbGl0eSBjb21wYXJpc29uCi0gICAqIEBwYXJhbSB3MgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyA8Y29kZT5Xb3JkPC9jb2RlPiBpbnN0YW5jZSBpcyA8aT5lcXVhbCB0bzwvaT4gPGNvZGU+dzI8L2NvZGU+Ci0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBFUShXb3JkIHcyKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIE5vdC1lcXVhbCBjb21wYXJpc29uCi0gICAqIEBwYXJhbSB3MgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyA8Y29kZT5Xb3JkPC9jb2RlPiBpbnN0YW5jZSBpcyA8aT5ub3QgZXF1YWwgdG88L2k+IDxjb2RlPncyPC9jb2RlPgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gTkUoV29yZCB3MikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBCaXQtd2lzZSBhbmQgb2YgdHdvIHdvcmRzLgotICAgKiBAcGFyYW0gdzIKLSAgICogQHJldHVybiBUaGUgd29yZCB3aG9zZSB2YWx1ZSBpcyB0aGUgYml0d2lzZSBhbmQgb2YgdGhpcyBhbmQgdzIKLSAgICovCi0gIHB1YmxpYyBXb3JkIGFuZChXb3JkIHcyKSB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQml0LXdpc2Ugb3Igb2YgdHdvIHdvcmRzLgotICAgKiBAcGFyYW0gdzIKLSAgICogQHJldHVybiBUaGUgd29yZCB3aG9zZSB2YWx1ZSBpcyB0aGUgYml0d2lzZSBub3Qgb2YgdGhpcyBhbmQgdzIKLSAgICovCi0gIHB1YmxpYyBXb3JkIG9yKFdvcmQgdzIpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBCaXQtd2lzZSBjb21wbGVtZW50IG9mIGEgd29yZC4KLSAgICogQHJldHVybiB0aGUgYml0d2lzZSBjb21wbGVtZW50IG9mIHRoaXMKLSAgICovCi0gIHB1YmxpYyBXb3JkIG5vdCgpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBCaXQtd2lzZSBleGNsdXNpdmUgb3Igb2YgdHdvIHdvcmRzLgotICAgKiBAcGFyYW0gdzIKLSAgICogQHJldHVybiBUaGUgd29yZCB3aG9zZSB2YWx1ZSBpcyB0aGUgYml0d2lzZSB4b3Igb2YgdGhpcyBhbmQgdzIKLSAgICovCi0gIHB1YmxpYyBXb3JkIHhvcihXb3JkIHcyKSB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogTGVmdC1zaGlmdCBhIHdvcmQuIFNoaWZ0cyBvZiBhIHNpemUgZ3JlYXRlciB0aGFuIHRoZSBXb3JkIGFyZSB1bmRlZmluZWQgYW5kCi0gICAqIGhhdmUgYW4gYXJjaGl0ZWN0dXJlIGFuZCBjb21waWxlciBzcGVjaWZpYyBiZWhhdmlvdXIuIE9uIEludGVsIHRoZSBzaGlmdAotICAgKiBhbW91bnQgaWdub3JlcyB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXRzLCBmb3IgZXhhbXBsZSBmb3IgYSAzMmJpdCBXb3JkIDEKLSAgICogJmx0OyZsdDsgMzIgPT0gMSwgdGhlIHJlc3VsdCB3aWxsIGJlIDAgb24gUG93ZXJQQy4gU2hpZnRzIG1heSBvciBtYXkgbm90IGJlCi0gICAqIGNvbWJpbmVkIGJ5IHRoZSBjb21waWxlciwgdGhpcyB5aWVsZHMgZGlmZmVyaW5nIGJlaGF2aW91ciwgZm9yIGV4YW1wbGUgZm9yIGEKLSAgICogMzJiaXQgV29yZCAxICZsdDsmbHQ7MzIgbWF5IG9yIG1heSBub3QgZXF1YWwgMSAmbHQ7Jmx0OyAxNiAmbHQ7Jmx0OyAxNi4KLSAgICoKLSAgICogQHBhcmFtIGFtdCB0aGUgYW1vdW50IHRvIHNoaWZ0IGJ5Ci0gICAqIEByZXR1cm4gbmV3IFdvcmQgc2hpZnRlZCBieSB0aGUgZ2l2ZW4gYW1vdW50Ci0gICAqLwotICBwdWJsaWMgV29yZCBsc2goaW50IGFtdCkgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIExvZ2ljYWwgcmlnaHQtc2hpZnQgYSB3b3JkLiBTaGlmdHMgb2YgYSBzaXplIGdyZWF0ZXIgdGhhbiB0aGUgV29yZCBhcmUgdW5kZWZpbmVkIGFuZAotICAgKiBoYXZlIGFuIGFyY2hpdGVjdHVyZSBhbmQgY29tcGlsZXIgc3BlY2lmaWMgYmVoYXZpb3VyIHNlZSBhbHNvIHtAbGluayAjbHNoKGludCl9LgotICAgKgotICAgKiBAcGFyYW0gYW10IHRoZSBhbW91bnQgdG8gc2hpZnQgYnkKLSAgICogQHJldHVybiBuZXcgV29yZCBzaGlmdGVkIGJ5IHRoZSBnaXZlbiBhbW91bnQKLSAgICovCi0gIHB1YmxpYyBXb3JkIHJzaGwoaW50IGFtdCkgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEFyaXRobWV0aWMgcmlnaHQtc2hpZnQgYSB3b3JkLiBTaGlmdHMgb2YgYSBzaXplIGdyZWF0ZXIgdGhhbiB0aGUgV29yZCBhcmUgdW5kZWZpbmVkIGFuZAotICAgKiBoYXZlIGFuIGFyY2hpdGVjdHVyZSBhbmQgY29tcGlsZXIgc3BlY2lmaWMgYmVoYXZpb3VyIHNlZSBhbHNvIHtAbGluayAjbHNoKGludCl9LgotICAgKiBBcml0aG1ldGljIHJpZ2h0LXNoaWZ0IGEgd29yZC4gIEVxdWl2YWxlbnQgdG8gdGhlIGludGVnZXIgPGNvZGU+Jmd0OyZndDs8L2NvZGU+IG9wZXJhdG9yCi0gICAqCi0gICAqIEBwYXJhbSBhbXQgdGhlIGFtb3VudCB0byBzaGlmdCBieQotICAgKiBAcmV0dXJuIG5ldyBXb3JkIHNoaWZ0ZWQgYnkgdGhlIGdpdmVuIGFtb3VudAotICAgKi8KLSAgcHVibGljIFdvcmQgcnNoYShpbnQgYW10KSB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy91bmJveGVkL1dvcmRBcnJheS5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm1tYWdpYy91bmJveGVkL1dvcmRBcnJheS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWUxNTY2Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtbWFnaWMvdW5ib3hlZC9Xb3JkQXJyYXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIChDUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvY3BsMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcudm1tYWdpYy51bmJveGVkOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgV29yZEFycmF5IHsKLQotICBwcml2YXRlIGZpbmFsIFdvcmRbXSBkYXRhOwotCi0gIHByaXZhdGUgV29yZEFycmF5KGludCBzaXplKSB7Ci0gICAgZGF0YSA9IG5ldyBXb3JkW3NpemVdOwotICAgIFdvcmQgemVybyA9IFdvcmQuemVybygpOwotICAgIGZvcihpbnQgaT0wOyBpPHNpemU7aSsrKSB7Ci0gICAgICBkYXRhW2ldID0gemVybzsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFdvcmRBcnJheSBjcmVhdGUoaW50IHNpemUpIHsKLSAgICByZXR1cm4gbmV3IFdvcmRBcnJheShzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBXb3JkIGdldChpbnQgaW5kZXgpIHsKLSAgICByZXR1cm4gZGF0YVtpbmRleF07Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXQoaW50IGluZGV4LCBXb3JkIHYpIHsKLSAgICBkYXRhW2luZGV4XSA9IHY7Ci0gIH0KLQotICBwdWJsaWMgaW50IGxlbmd0aCgpIHsKLSAgICByZXR1cm4gZGF0YS5sZW5ndGg7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtdXRpbC9vcHRpb25zL0FkZHJlc3NPcHRpb24uamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtdXRpbC9vcHRpb25zL0FkZHJlc3NPcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMzMjlmNi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bXV0aWwvb3B0aW9ucy9BZGRyZXNzT3B0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSAoQ1BMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2NwbDEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLnZtdXRpbC5vcHRpb25zOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLlVuaW50ZXJydXB0aWJsZTsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLkFkZHJlc3M7Ci0KLS8qKgotICogQW4gb3B0aW9uIHdpdGggYSBzaW1wbGUgaW50ZWdlciB2YWx1ZS4KLSAqLwotcHVibGljIGNsYXNzIEFkZHJlc3NPcHRpb24gZXh0ZW5kcyBPcHRpb24gewotICAvLyB2YWx1ZXMKLSAgcHJvdGVjdGVkIEFkZHJlc3MgZGVmYXVsdFZhbHVlOwotICBwcm90ZWN0ZWQgQWRkcmVzcyB2YWx1ZTsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IGludCBvcHRpb24uCi0gICAqCi0gICAqIEBwYXJhbSBzZXQgVGhlIG9wdGlvbiBzZXQgdGhpcyBvcHRpb24gYmVsb25ncyB0by4KLSAgICogQHBhcmFtIG5hbWUgVGhlIHNwYWNlIHNlcGFyYXRlZCBuYW1lIGZvciB0aGUgb3B0aW9uLgotICAgKiBAcGFyYW0gZGVzYyBUaGUgcHVycG9zZSBvZiB0aGUgb3B0aW9uCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG9wdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCBBZGRyZXNzT3B0aW9uKE9wdGlvblNldCBzZXQsIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzYywgQWRkcmVzcyBkZWZhdWx0VmFsdWUpIHsKLSAgICBzdXBlcihzZXQsIEFERFJFU1NfT1BUSU9OLCBuYW1lLCBkZXNjKTsKLSAgICB0aGlzLnZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgb3B0aW9uLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBvcHRpb24gdmFsdWUuCi0gICAqLwotICBAVW5pbnRlcnJ1cHRpYmxlCi0gIHB1YmxpYyBBZGRyZXNzIGdldFZhbHVlKCkgewotICAgIHJldHVybiB0aGlzLnZhbHVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG9wdGlvbi4KLSAgICoKLSAgICogQHJldHVybiBUaGUgZGVmYXVsdCB2YWx1ZS4KLSAgICovCi0gIEBVbmludGVycnVwdGlibGUKLSAgcHVibGljIEFkZHJlc3MgZ2V0RGVmYXVsdFZhbHVlKCkgewotICAgIHJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBVcGRhdGUgdGhlIHZhbHVlIG9mIHRoZSBvcHRpb24sIGVjaG9pbmcgdGhlIGNoYW5nZSBpZiB0aGUgZWNob09wdGlvbnMKLSAgICogb3B0aW9uIGlzIHNldC4gVGhpcyBtZXRob2QgYWxzbyBjYWxscyB0aGUgdmFsaWRhdGUgbWV0aG9kIHRvIGFsbG93Ci0gICAqIHN1YmNsYXNzZXMgdG8gcGVyZm9ybSBhbnkgcmVxdWlyZWQgdmFsaWRhdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSBvcHRpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShpbnQgdmFsdWUpIHsKLSAgICB0aGlzLnZhbHVlID0gQWRkcmVzcy5mcm9tSW50WmVyb0V4dGVuZCh2YWx1ZSk7Ci0gICAgdmFsaWRhdGUoKTsKLSAgICBzZXQubG9nQ2hhbmdlKHRoaXMpOwotICB9Ci0KLSAgLyoqCi0gICAqIE1vZGlmeSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgb3B0aW9uLgotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyBkZWZhdWx0IHZhbHVlIGZvciB0aGUgb3B0aW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlKEFkZHJlc3MgdmFsdWUpIHsKLSAgICB0aGlzLnZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWUgPSB2YWx1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm11dGlsL29wdGlvbnMvQm9vbGVhbk9wdGlvbi5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm11dGlsL29wdGlvbnMvQm9vbGVhbk9wdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWI0ZGRlLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtdXRpbC9vcHRpb25zL0Jvb2xlYW5PcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIChDUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvY3BsMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcudm11dGlsLm9wdGlvbnM7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuVW5pbnRlcnJ1cHRpYmxlOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGJvb2xlYW4gb3B0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIEJvb2xlYW5PcHRpb24gZXh0ZW5kcyBPcHRpb24gewotICAvLyB2YWx1ZXMKLSAgcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdFZhbHVlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWx1ZTsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IGJvb2xlYW4gb3B0aW9uLgotICAgKgotICAgKiBAcGFyYW0gc2V0IFRoZSBvcHRpb24gc2V0IHRoaXMgb3B0aW9uIGJlbG9uZ3MgdG8uCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBzcGFjZSBzZXBhcmF0ZWQgbmFtZSBmb3IgdGhlIG9wdGlvbi4KLSAgICogQHBhcmFtIGRlc2MgVGhlIHB1cnBvc2Ugb2YgdGhlIG9wdGlvbgotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBvcHRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgQm9vbGVhbk9wdGlvbihPcHRpb25TZXQgc2V0LCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0gICAgc3VwZXIoc2V0LCBCT09MRUFOX09QVElPTiwgbmFtZSwgZGVzYyk7Ci0gICAgdGhpcy52YWx1ZSA9IHRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIG9wdGlvbi4KLSAgICoKLSAgICogQHJldHVybiBUaGUgb3B0aW9uIHZhbHVlLgotICAgKi8KLSAgQFVuaW50ZXJydXB0aWJsZQotICBwdWJsaWMgYm9vbGVhbiBnZXRWYWx1ZSgpIHsKLSAgICByZXR1cm4gdGhpcy52YWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBvcHRpb24uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGRlZmF1bHQgdmFsdWUuCi0gICAqLwotICBAVW5pbnRlcnJ1cHRpYmxlCi0gIHB1YmxpYyBib29sZWFuIGdldERlZmF1bHRWYWx1ZSgpIHsKLSAgICByZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWU7Ci0gIH0KLQotICAvKioKLSAgICogVXBkYXRlIHRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uLCBlY2hvaW5nIHRoZSBjaGFuZ2UgaWYgdGhlIGVjaG9PcHRpb25zCi0gICAqIG9wdGlvbiBpcyBzZXQuIFRoaXMgbWV0aG9kIGFsc28gY2FsbHMgdGhlIHZhbGlkYXRlIG1ldGhvZCB0byBhbGxvdwotICAgKiBzdWJjbGFzc2VzIHRvIHBlcmZvcm0gYW55IHJlcXVpcmVkIHZhbGlkYXRpb24uCi0gICAqCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIGZvciB0aGUgb3B0aW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VmFsdWUoYm9vbGVhbiB2YWx1ZSkgewotICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB2YWxpZGF0ZSgpOwotICAgIHNldC5sb2dDaGFuZ2UodGhpcyk7Ci0gIH0KLQotICAvKioKLSAgICogTW9kaWZ5IHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBvcHRpb24uCi0gICAqCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBvcHRpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0VmFsdWUoYm9vbGVhbiB2YWx1ZSkgewotICAgIHRoaXMudmFsdWUgPSB0aGlzLmRlZmF1bHRWYWx1ZSA9IHZhbHVlOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bXV0aWwvb3B0aW9ucy9FbnVtT3B0aW9uLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bXV0aWwvb3B0aW9ucy9FbnVtT3B0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMDZiMTguLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm11dGlsL29wdGlvbnMvRW51bU9wdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIChDUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvY3BsMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcudm11dGlsLm9wdGlvbnM7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuVW5pbnRlcnJ1cHRpYmxlOwotCi0vKioKLSAqIEFuIG9wdGlvbiB0aGF0IGlzIGEgc2VsZWN0aW9uIG9mIHNldmVyYWwgc3RyaW5ncy4gVGhlIG1hcHBpbmcKLSAqIGJldHdlZW4gc3RyaW5ncyBhbmQgaW50ZWdlcnMgaXMgZGV0ZXJtaW5lZCB1c2luZyBpbmRleGVzIGludG8KLSAqIGEgc3RyaW5nIGFycmF5LgotICoKLSAqIEVudW1lcmF0aW9ucyBhcmUgY2FzZSBzZW5zaXRpdmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnVtT3B0aW9uIGV4dGVuZHMgT3B0aW9uIHsKLSAgLy8gdmFsdWVzCi0gIHByb3RlY3RlZCBpbnQgZGVmYXVsdFZhbHVlOwotICBwcm90ZWN0ZWQgaW50IHZhbHVlOwotICBwcm90ZWN0ZWQgU3RyaW5nW10gdmFsdWVzOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgZW51bWVyYXRpb24gb3B0aW9uLgotICAgKgotICAgKiBAcGFyYW0gc2V0IFRoZSBvcHRpb24gc2V0IHRoaXMgb3B0aW9uIGJlbG9uZ3MgdG8uCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBzcGFjZSBzZXBhcmF0ZWQgbmFtZSBmb3IgdGhlIG9wdGlvbi4KLSAgICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBwdXJwb3NlIG9mIHRoZSBvcHRpb24uCi0gICAqIEBwYXJhbSB2YWx1ZXMgQSBtYXBwaW5nIG9mIGludCB0byBzdHJpbmcgZm9yIHRoZSBlbnVtLgotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBvcHRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgRW51bU9wdGlvbihPcHRpb25TZXQgc2V0LCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uLCBTdHJpbmdbXSB2YWx1ZXMsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLSAgICBzdXBlcihzZXQsIEVOVU1fT1BUSU9OLCBuYW1lLCBkZXNjcmlwdGlvbik7Ci0gICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXM7Ci0gICAgdGhpcy52YWx1ZSA9IHRoaXMuZGVmYXVsdFZhbHVlID0gZmluZFZhbHVlKGRlZmF1bHRWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogU2VhcmNoIGZvciBhIHN0cmluZyBpbiB0aGUgZW51bWVyYXRpb24uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGluZGV4IG9mIHRoZSBwYXNzZWQgc3RyaW5nLgotICAgKi8KLSAgcHJpdmF0ZSBpbnQgZmluZFZhbHVlKFN0cmluZyBzdHJpbmcpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotICAgICAgaWYgKHZhbHVlc1tpXS5lcXVhbHMoc3RyaW5nKSkgewotICAgICAgICByZXR1cm4gaTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZmFpbCgiSW52YWxpZCBFbnVtZXJhdGlvbiBWYWx1ZSIpOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBvcHRpb24uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG9wdGlvbiB2YWx1ZS4KLSAgICovCi0gIEBVbmludGVycnVwdGlibGUKLSAgcHVibGljIGludCBnZXRWYWx1ZSgpIHsKLSAgICByZXR1cm4gdGhpcy52YWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHRoZSBzdHJpbmcgZm9yIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBvcHRpb24uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG9wdGlvbiB2YWx1ZS4KLSAgICovCi0gIEBVbmludGVycnVwdGlibGUKLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZVN0cmluZygpIHsKLSAgICByZXR1cm4gdGhpcy52YWx1ZXNbdGhpcy52YWx1ZV07Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgb3B0aW9uLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBkZWZhdWx0IHZhbHVlLgotICAgKi8KLSAgQFVuaW50ZXJydXB0aWJsZQotICBwdWJsaWMgaW50IGdldERlZmF1bHRWYWx1ZSgpIHsKLSAgICByZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWU7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCB0aGUgc3RyaW5nIGZvciB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgb3B0aW9uLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBkZWZhdWx0IHZhbHVlLgotICAgKi8KLSAgQFVuaW50ZXJydXB0aWJsZQotICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZVN0cmluZygpIHsKLSAgICByZXR1cm4gdGhpcy52YWx1ZXNbdGhpcy5kZWZhdWx0VmFsdWVdOwotICB9Ci0KLSAgLyoqCi0gICAqIFVwZGF0ZSB0aGUgdmFsdWUgb2YgdGhlIG9wdGlvbiwgZWNob2luZyB0aGUgY2hhbmdlIGlmIHRoZSBlY2hvT3B0aW9ucwotICAgKiBvcHRpb24gaXMgc2V0LiBUaGlzIG1ldGhvZCBhbHNvIGNhbGxzIHRoZSB2YWxpZGF0ZSBtZXRob2QgdG8gYWxsb3cKLSAgICogc3ViY2xhc3NlcyB0byBwZXJmb3JtIGFueSByZXF1aXJlZCB2YWxpZGF0aW9uLgotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIG9wdGlvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFZhbHVlKGludCB2YWx1ZSkgewotICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB2YWxpZGF0ZSgpOwotICAgIHNldC5sb2dDaGFuZ2UodGhpcyk7Ci0gIH0KLQotICAvKioKLSAgICogTG9vayB1cCB0aGUgdmFsdWUgZm9yIGEgc3RyaW5nIGFuZCB1cGRhdGUgdGhlIHZhbHVlIG9mIHRoZSBvcHRpb24KLSAgICogYWNjb3JkaW5nbHksIGVjaG9pbmcgdGhlIGNoYW5nZSBpZiB0aGUgZWNob09wdGlvbnMgb3B0aW9uIGlzIHNldC4KLSAgICogVGhpcyBtZXRob2QgYWxzbyBjYWxscyB0aGUgdmFsaWRhdGUgbWV0aG9kIHRvIGFsbG93IHN1YmNsYXNzZXMgdG8KLSAgICogcGVyZm9ybSBhbnkgcmVxdWlyZWQgdmFsaWRhdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSBvcHRpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICBzZXRWYWx1ZShmaW5kVmFsdWUodmFsdWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiBNb2RpZnkgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG9wdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIG9wdGlvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERlZmF1bHRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICB0aGlzLnZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWUgPSBmaW5kVmFsdWUodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgYXJyYXkgb2YgYWxsb3dlZCBlbnVtZXJhdGlvbiB2YWx1ZXMuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIHZhbHVlcyBhcnJheS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7Ci0gICAgcmV0dXJuIHRoaXMudmFsdWVzOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bXV0aWwvb3B0aW9ucy9GbG9hdE9wdGlvbi5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm11dGlsL29wdGlvbnMvRmxvYXRPcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE1MjE1NC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bXV0aWwvb3B0aW9ucy9GbG9hdE9wdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSmlrZXMgUlZNIHByb2plY3QgKGh0dHA6Ly9qaWtlc3J2bS5vcmcpLgotICoKLSAqICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgKENQTCk7Ci0gKiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSAqICBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9jcGwxLjAucGhwCi0gKgotICogIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICovCi1wYWNrYWdlIG9yZy52bXV0aWwub3B0aW9uczsKLQotaW1wb3J0IG9yZy52bW1hZ2ljLnByYWdtYS5VbmludGVycnVwdGlibGU7Ci0KLS8qKgotICogQW4gb3B0aW9uIHRoYXQgaGFzIGEgc2ltcGxlIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgdmFsdWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBGbG9hdE9wdGlvbiBleHRlbmRzIE9wdGlvbiB7Ci0gIC8vIHZhbHVlcwotICBwcm90ZWN0ZWQgZmxvYXQgZGVmYXVsdFZhbHVlOwotICBwcm90ZWN0ZWQgZmxvYXQgdmFsdWU7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBmbG9hdCBvcHRpb24uCi0gICAqCi0gICAqIEBwYXJhbSBzZXQgVGhlIG9wdGlvbiBzZXQgdGhpcyBvcHRpb24gYmVsb25ncyB0by4KLSAgICogQHBhcmFtIG5hbWUgVGhlIHNwYWNlIHNlcGFyYXRlZCBuYW1lIGZvciB0aGUgb3B0aW9uLgotICAgKiBAcGFyYW0gZGVzYyBUaGUgcHVycG9zZSBvZiB0aGUgb3B0aW9uCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG9wdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCBGbG9hdE9wdGlvbihPcHRpb25TZXQgc2V0LCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MsIGZsb2F0IGRlZmF1bHRWYWx1ZSkgewotICAgIHN1cGVyKHNldCwgRkxPQVRfT1BUSU9OLCBuYW1lLCBkZXNjKTsKLSAgICB0aGlzLnZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgb3B0aW9uLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBvcHRpb24gdmFsdWUuCi0gICAqLwotICBAVW5pbnRlcnJ1cHRpYmxlCi0gIHB1YmxpYyBmbG9hdCBnZXRWYWx1ZSgpIHsKLSAgICByZXR1cm4gdGhpcy52YWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBvcHRpb24KLSAgICoKLSAgICogQHJldHVybiBUaGUgZGVmYXVsdCB2YWx1ZS4KLSAgICovCi0gIEBVbmludGVycnVwdGlibGUKLSAgcHVibGljIGZsb2F0IGdldERlZmF1bHRWYWx1ZSgpIHsKLSAgICByZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWU7Ci0gIH0KLQotICAvKioKLSAgICogVXBkYXRlIHRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uLCBlY2hvaW5nIHRoZSBjaGFuZ2UgaWYgdGhlIGVjaG9PcHRpb25zCi0gICAqIG9wdGlvbiBpcyBzZXQuIFRoaXMgbWV0aG9kIGFsc28gY2FsbHMgdGhlIHZhbGlkYXRlIG1ldGhvZCB0byBhbGxvdwotICAgKiBzdWJjbGFzc2VzIHRvIHBlcmZvcm0gYW55IHJlcXVpcmVkIHZhbGlkYXRpb24uCi0gICAqCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIGZvciB0aGUgb3B0aW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VmFsdWUoZmxvYXQgdmFsdWUpIHsKLSAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgdmFsaWRhdGUoKTsKLSAgICBzZXQubG9nQ2hhbmdlKHRoaXMpOwotICB9Ci0KLSAgLyoqCi0gICAqIE1vZGlmeSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgb3B0aW9uLgotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyBkZWZhdWx0IHZhbHVlIGZvciB0aGUgb3B0aW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlKGZsb2F0IHZhbHVlKSB7Ci0gICAgdGhpcy52YWx1ZSA9IHRoaXMuZGVmYXVsdFZhbHVlID0gdmFsdWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtdXRpbC9vcHRpb25zL0ludE9wdGlvbi5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm11dGlsL29wdGlvbnMvSW50T3B0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMDIwNDIuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm11dGlsL29wdGlvbnMvSW50T3B0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSAoQ1BMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2NwbDEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLnZtdXRpbC5vcHRpb25zOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLlVuaW50ZXJydXB0aWJsZTsKLQotLyoqCi0gKiBBbiBvcHRpb24gd2l0aCBhIHNpbXBsZSBpbnRlZ2VyIHZhbHVlLgotICovCi1wdWJsaWMgY2xhc3MgSW50T3B0aW9uIGV4dGVuZHMgT3B0aW9uIHsKLSAgLy8gdmFsdWVzCi0gIHByb3RlY3RlZCBpbnQgZGVmYXVsdFZhbHVlOwotICBwcm90ZWN0ZWQgaW50IHZhbHVlOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgaW50IG9wdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIHNldCBUaGUgb3B0aW9uIHNldCB0aGlzIG9wdGlvbiBiZWxvbmdzIHRvLgotICAgKiBAcGFyYW0gbmFtZSBUaGUgc3BhY2Ugc2VwYXJhdGVkIG5hbWUgZm9yIHRoZSBvcHRpb24uCi0gICAqIEBwYXJhbSBkZXNjIFRoZSBwdXJwb3NlIG9mIHRoZSBvcHRpb24KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgb3B0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIEludE9wdGlvbihPcHRpb25TZXQgc2V0LCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MsIGludCBkZWZhdWx0VmFsdWUpIHsKLSAgICBzdXBlcihzZXQsIElOVF9PUFRJT04sIG5hbWUsIGRlc2MpOwotICAgIHRoaXMudmFsdWUgPSB0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBvcHRpb24uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG9wdGlvbiB2YWx1ZS4KLSAgICovCi0gIEBVbmludGVycnVwdGlibGUKLSAgcHVibGljIGludCBnZXRWYWx1ZSgpIHsKLSAgICByZXR1cm4gdGhpcy52YWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBvcHRpb24uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGRlZmF1bHQgdmFsdWUuCi0gICAqLwotICBAVW5pbnRlcnJ1cHRpYmxlCi0gIHB1YmxpYyBpbnQgZ2V0RGVmYXVsdFZhbHVlKCkgewotICAgIHJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBVcGRhdGUgdGhlIHZhbHVlIG9mIHRoZSBvcHRpb24sIGVjaG9pbmcgdGhlIGNoYW5nZSBpZiB0aGUgZWNob09wdGlvbnMKLSAgICogb3B0aW9uIGlzIHNldC4gVGhpcyBtZXRob2QgYWxzbyBjYWxscyB0aGUgdmFsaWRhdGUgbWV0aG9kIHRvIGFsbG93Ci0gICAqIHN1YmNsYXNzZXMgdG8gcGVyZm9ybSBhbnkgcmVxdWlyZWQgdmFsaWRhdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSBvcHRpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShpbnQgdmFsdWUpIHsKLSAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgdmFsaWRhdGUoKTsKLSAgICBzZXQubG9nQ2hhbmdlKHRoaXMpOwotICB9Ci0KLSAgLyoqCi0gICAqIE1vZGlmeSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgb3B0aW9uLgotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyBkZWZhdWx0IHZhbHVlIGZvciB0aGUgb3B0aW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlKGludCB2YWx1ZSkgewotICAgIHRoaXMudmFsdWUgPSB0aGlzLmRlZmF1bHRWYWx1ZSA9IHZhbHVlOwotICB9Ci19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bXV0aWwvb3B0aW9ucy9NaWNyb3NlY29uZHNPcHRpb24uamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtdXRpbC9vcHRpb25zL01pY3Jvc2Vjb25kc09wdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDEzZGIyLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtdXRpbC9vcHRpb25zL01pY3Jvc2Vjb25kc09wdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEppa2VzIFJWTSBwcm9qZWN0IChodHRwOi8vamlrZXNydm0ub3JnKS4KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIChDUEwpOwotICogIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91Ci0gKiAgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvY3BsMS4wLnBocAotICoKLSAqICBTZWUgdGhlIENPUFlSSUdIVC50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqLwotcGFja2FnZSBvcmcudm11dGlsLm9wdGlvbnM7Ci0KLWltcG9ydCBvcmcudm1tYWdpYy5wcmFnbWEuVW5pbnRlcnJ1cHRpYmxlOwotCi0vKioKLSAqIEEgdGltZSBvcHRpb24gdGhhdCBzdG9yZXMgdmFsdWVzIGF0IGEgbWljcm9zZWNvbmQgZ3JhbnVsYXJpdHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWNyb3NlY29uZHNPcHRpb24gZXh0ZW5kcyBPcHRpb24gewotICAvLyB2YWx1ZXMKLSAgcHJvdGVjdGVkIGludCBkZWZhdWx0VmFsdWU7Ci0gIHByb3RlY3RlZCBpbnQgdmFsdWU7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBtaWNyb3NlY29uZCBvcHRpb24uCi0gICAqCi0gICAqIEBwYXJhbSBzZXQgVGhlIG9wdGlvbiBzZXQgdGhpcyBvcHRpb24gYmVsb25ncyB0by4KLSAgICogQHBhcmFtIG5hbWUgVGhlIHNwYWNlIHNlcGFyYXRlZCBuYW1lIGZvciB0aGUgb3B0aW9uLgotICAgKiBAcGFyYW0gZGVzYyBUaGUgcHVycG9zZSBvZiB0aGUgb3B0aW9uCi0gICAqIEBwYXJhbSBkZWZhdWx0VXMgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG9wdGlvbiAodXNlYykuCi0gICAqLwotICBwcm90ZWN0ZWQgTWljcm9zZWNvbmRzT3B0aW9uKE9wdGlvblNldCBzZXQsIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzYywgaW50IGRlZmF1bHRVcykgewotICAgIHN1cGVyKHNldCwgTUlDUk9TRUNPTkRTX09QVElPTiwgbmFtZSwgZGVzYyk7Ci0gICAgdGhpcy52YWx1ZSA9IHRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIG9wdGlvbiBpbiBtaWNyb3NlY29uZHMuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG9wdGlvbiB2YWx1ZS4KLSAgICovCi0gIEBVbmludGVycnVwdGlibGUKLSAgcHVibGljIGludCBnZXRNaWNyb3NlY29uZHMoKSB7Ci0gICAgcmV0dXJuIHRoaXMudmFsdWU7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgb3B0aW9uIGluIG1pbGxpc2Vjb25kcy4KLSAgICoKLSAgICogQHJldHVybiBUaGUgb3B0aW9uIHZhbHVlLgotICAgKi8KLSAgQFVuaW50ZXJydXB0aWJsZQotICBwdWJsaWMgaW50IGdldE1pbGxpc2Vjb25kcygpIHsKLSAgICByZXR1cm4gdGhpcy52YWx1ZSAvIDEwMDA7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgb3B0aW9uIGluIG1pY3Jvc2Vjb25kcy4KLSAgICoKLSAgICogQHJldHVybiBUaGUgZGVmYXVsdCB2YWx1ZS4KLSAgICovCi0gIEBVbmludGVycnVwdGlibGUKLSAgcHVibGljIGludCBnZXREZWZhdWx0TWljcm9zZWNvbmRzKCkgewotICAgIHJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBvcHRpb24gaW4gbWlsbGlzZWNvbmRzLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBkZWZhdWx0IHZhbHVlLgotICAgKi8KLSAgQFVuaW50ZXJydXB0aWJsZQotICBwdWJsaWMgaW50IGdldERlZmF1bHRNaWxsaXNlY29uZHMoKSB7Ci0gICAgcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlIC8gMTAwMDsKLSAgfQotCi0gIC8qKgotICAgKiBVcGRhdGUgdGhlIHZhbHVlIG9mIHRoZSBvcHRpb24sIGVjaG9pbmcgdGhlIGNoYW5nZSBpZiB0aGUgZWNob09wdGlvbnMKLSAgICogb3B0aW9uIGlzIHNldC4gQW4gZXJyb3Igb2NjdXJzIGlmIHRoZSB2YWx1ZSBpcyBuZWdhdGl2ZSwgYW5kIHRoZW4gdGhlCi0gICAqIHZhbGlkYXRlIG1ldGhvZCBpcyBjYWxsZWQgdG8gYWxsb3cgc3ViY2xhc3NlcyB0byBwZXJmb3JtIGFueSBhZGRpdGlvbmFsCi0gICAqIHZhbGlkYXRpb24uCi0gICAqCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIGZvciB0aGUgb3B0aW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWljcm9zZWNvbmRzKGludCB2YWx1ZSkgewotICAgIGZhaWxJZih2YWx1ZSA8IDAsICJVbnJlYXNvbmFibGUgIiArIHRoaXMuZ2V0TmFtZSgpICsgIiB2YWx1ZSIpOwotICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB2YWxpZGF0ZSgpOwotICAgIHNldC5sb2dDaGFuZ2UodGhpcyk7Ci0gIH0KLQotICAvKioKLSAgICogTW9kaWZ5IHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBvcHRpb24uCi0gICAqCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBvcHRpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0TWljcm9zZW5kcyhpbnQgdmFsdWUpIHsKLSAgICB0aGlzLnZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWUgPSB2YWx1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm11dGlsL29wdGlvbnMvT3B0aW9uLmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bXV0aWwvb3B0aW9ucy9PcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAzMzljZS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bXV0aWwvb3B0aW9ucy9PcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSAoQ1BMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2NwbDEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLnZtdXRpbC5vcHRpb25zOwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgb3B0aW9ucy4gVGhpcyBjbGFzcyBhbHNvIGhhcwotICogdGhlIHN0YXRpYyBpbnRlcmZhY2VzIHRvIGFjY2VzcyB0aGUgb3B0aW9ucyBzeXN0ZW0gdG8gc2V0Ci0gKiBvcHRpb24gdmFsdWVzLgotICoKLSAqIEFsbCBvcHRpb25zIHdpdGhpbiB0aGUgc3lzdGVtIHNob3VsZCBoYXZlIGEgdW5pcXVlIG5hbWUuIE5vCi0gKiB0d28gb3B0aW9ucyBzaGFsbCBoYXZlIGEgbmFtZSB0aGF0IGlzIHRoZSBzYW1lIHdoZW4gYSBjYXNlCi0gKiBpbnNlbnNpdGl2ZSBjb21wYXJpc29uIGJldHdlZW4gdGhlIG5hbWVzIHdpdGggc3BhY2VzIHJlbW92ZWQKLSAqIGlzIHBlcmZvcm1lZC4gT25seSBiYXNpYyBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgc3BhY2VzCi0gKiBhcmUgYWxsb3dlZC4KLSAqCi0gKiBUaGUgVk0gaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSBhIG9uZSB3YXkgbWFwcGluZyBmdW5jdGlvbiB0aGF0Ci0gKiB0YWtlcyB0aGUgbmFtZSBhbmQgY3JlYXRlcyBhIFZNIHN0eWxlIG5hbWUsIHN1Y2ggYXMgbWFwcGluZwotICogIk5vIEZpbmFsaXplciIgdG8gbm9GaW5hbGl6ZXIuIFRoZSBWTSBtYXkgbm90IHJlbW92ZSBhbnkgbGV0dGVycwotICogd2hlbiBwZXJmb3JtaW5nIHRoaXMgbWFwcGluZyBidXQgbWF5IHJlbW92ZSBzcGFjZXMgYW5kIGNoYW5nZQotICogdGhlIGNhc2Ugb2YgYW55IGNoYXJhY3Rlci4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE9wdGlvbiB7Ci0gIC8vIE9wdGlvbiB0eXBlcwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT09MRUFOX09QVElPTiA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUUklOR19PUFRJT04gPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlVNX09QVElPTiA9IDM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVF9PUFRJT04gPSA0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQUdFU19PUFRJT04gPSA2OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSUNST1NFQ09ORFNfT1BUSU9OID0gNzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxPQVRfT1BUSU9OID0gODsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREUkVTU19PUFRJT04gPSA5OwotCi0gIC8qKgotICAgKiBUaGUgcG9zc2libGUgb3V0cHV0IGZvcm1hdHMKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQURBQkxFID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkFXID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MID0gMjsKLQotICAvLyBQZXIgb3B0aW9uIHZhbHVlcwotICBwcml2YXRlIGludCB0eXBlOwotICBwcml2YXRlIFN0cmluZyBuYW1lOwotICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLSAgcHJpdmF0ZSBTdHJpbmcga2V5OwotICBwcml2YXRlIE9wdGlvbiBuZXh0OwotCi0gIHByb3RlY3RlZCBPcHRpb25TZXQgc2V0OwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYSBuZXcgb3B0aW9uLiBUaGlzIGFsc28gY2FsbHMgdGhlIFZNIHRvIG1hcCB0aGUgb3B0aW9uJ3MKLSAgICogbmFtZSBpbnRvIGEgdW5pcXVlIG9wdGlvbiBrZXkgYW5kIGxpbmtzIGl0IG9udG8gdGhlIG9wdGlvbiBsaXN0LgotICAgKgotICAgKiBAcGFyYW0gc2V0IFRoZSBvcHRpb24gc2V0IHRoaXMgb3B0aW9uIGJlbG9uZ3MgdG8uCi0gICAqIEBwYXJhbSB0eXBlIFRoZSBvcHRpb24gdHlwZSBhcyBkZWZpbmVkIGluIHRoaXMgY2xhc3MuCi0gICAqIEBwYXJhbSBuYW1lIFRoZSB1bmlxdWUgbmFtZSBvZiB0aGUgb3B0aW9uLgotICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gQSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgb3B0aW9uIGFuZCBwdXJwb3NlLgotICAgKi8KLSAgcHJvdGVjdGVkIE9wdGlvbihPcHRpb25TZXQgc2V0LCBpbnQgdHlwZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbikgewotICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gICAgdGhpcy5zZXQgPSBzZXQ7Ci0gICAgdGhpcy5rZXkgPSBzZXQucmVnaXN0ZXIodGhpcywgbmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBWTSBkZXRlcm1pbmVkIGtleSBmb3IgYW4gb3B0aW9uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGtleS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotICAgIHJldHVybiB0aGlzLmtleTsKLSAgfQotCi0gIC8qKgotICAgKiBVcGRhdGUgdGhlIG5leHQgcG9pbnRlciBpbiB0aGUgT3B0aW9uIGNoYWluLgotICAgKi8KLSAgdm9pZCBzZXROZXh0KE9wdGlvbiBvKSB7Ci0gICAgbmV4dCA9IG87Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBuZXh0IG9wdGlvbiBpbiB0aGUgbGlua2VkIGxpc3QuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG5leHQgb3B0aW9uIG9yIG51bGwgaWYgdGhpcyBpcyB0aGUgbGFzdCBvcHRpb24uCi0gICAqLwotICBwdWJsaWMgT3B0aW9uIGdldE5leHQoKSB7Ci0gICAgcmV0dXJuIHRoaXMubmV4dDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG5hbWUgZm9yIHRoZSBvcHRpb24uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG9wdGlvbiBuYW1lLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgIHJldHVybiB0aGlzLm5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBvcHRpb24gZGVzY3JpcHRpb24uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG9wdGlvbiBkZXNjcmlwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBvcHRpb24uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG9wdGlvbiB0eXBlLgotICAgKi8KLSAgcHVibGljIGludCBnZXRUeXBlKCkgewotICAgIHJldHVybiB0aGlzLnR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBpcyBhIHZhbGlkYXRpb24gbWV0aG9kIHRoYXQgY2FuIGJlIGltcGxlbWVudGVkIGJ5IGxlYWYgb3B0aW9uCi0gICAqIGNsYXNzZXMgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIHZhbGlkYXRpb24uIFRoaXMgc2hvdWxkIG5vdCBiZSBpbXBsZW1lbnRlZAotICAgKiBhdCBvdGhlciBsZXZlbHMgd2l0aGluIHRoZSBoZWlyYXJjaHkgdG8gYXZvaWQgY29uZnVzaW9uLiBUaGUgdmFsaWRhdGUKLSAgICogbWV0aG9kIHdvcmtzIGFnYWluc3QgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIG9wdGlvbiAocG9zdC1zZXQpLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoKSB7fQotCi0gIC8qKgotICAgKiBBIGZhdGFsIGVycm9yIG9jY3VycmVkIGR1cmluZyB0aGUgc2V0dGluZyBvZiBhbiBvcHRpb24uIFRoaXMgbWV0aG9kCi0gICAqIGNhbGxzIGludG8gdGhlIFZNIGFuZCBpcyByZXF1aXJlZCB0byBjYXVzZSB0aGUgc3lzdGVtIHRvIHN0b3AuCi0gICAqCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmFpbHVyZS4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGZhaWwoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICBzZXQuZmFpbCh0aGlzLCBtZXNzYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiBGYWlsIGlmIGEgc3BlY2lmaWVkIGNvbmRpdGlvbiBpcyBtZXQuCi0gICAqCi0gICAqIEBwYXJhbSBjb25kaXRpb24gVGhlIGNvbmRpdGlvbiB0aGF0IGluZGljYXRlcyBmYWlsdXJlLgotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGZhaWx1cmUuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBmYWlsSWYoYm9vbGVhbiBjb25kaXRpb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgaWYgKGNvbmRpdGlvbikgc2V0LmZhaWwodGhpcywgbWVzc2FnZSk7Ci0gIH0KLQotICAvKioKLSAgICogQSBub24tZmF0YWwgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHRoZSBzZXR0aW5nIG9mIGFuIG9wdGlvbi4gVGhpcyBtZXRob2QKLSAgICogY2FsbHMgaW50byB0aGUgVk0gYW5kIHNoYWxsIG5vdCBjYXVzZSB0aGUgc3lzdGVtIHRvIHN0b3AuCi0gICAqCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2FybmluZy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHdhcm4oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICBzZXQud2Fybih0aGlzLCBtZXNzYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiBXYXJuIGlmIGEgc3BlY2lmaWVkIGNvbmRpdGlvbiBpcyBtZXQuCi0gICAqCi0gICAqIEBwYXJhbSBjb25kaXRpb24gVGhlIGNvbmRpdGlvbiB0aGF0IGluZGljYXRlcyB3YXJuaW5nLgotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIHdhcm5pbmcuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB3YXJuSWYoYm9vbGVhbiBjb25kaXRpb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgaWYgKGNvbmRpdGlvbikgc2V0Lndhcm4odGhpcywgbWVzc2FnZSk7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm11dGlsL29wdGlvbnMvT3B0aW9uU2V0LmphdmEgYi92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bXV0aWwvb3B0aW9ucy9PcHRpb25TZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYyMThjNi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL2phdmEvc3JjL29yZy92bXV0aWwvb3B0aW9ucy9PcHRpb25TZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSAoQ1BMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2NwbDEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLnZtdXRpbC5vcHRpb25zOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLlVuaW50ZXJydXB0aWJsZTsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLio7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCBvcHRpb24gc2V0cy4KLSAqCi0gKiBDb25jcmV0ZSBpbnN0YW50aWF0aW9ucyBvZiB0aGlzIGNsYXNzIGluY2x1ZGUgbG9naWMKLSAqCi0gKiBBbGwgb3B0aW9ucyB3aXRoaW4gdGhlIHN5c3RlbSBzaG91bGQgaGF2ZSBhIHVuaXF1ZSBuYW1lLiBObwotICogdHdvIG9wdGlvbnMgc2hhbGwgaGF2ZSBhIG5hbWUgdGhhdCBpcyB0aGUgc2FtZSB3aGVuIGEgY2FzZQotICogaW5zZW5zaXRpdmUgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBuYW1lcyB3aXRoIHNwYWNlcyByZW1vdmVkCi0gKiBpcyBwZXJmb3JtZWQuIE9ubHkgYmFzaWMgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYW5kIHNwYWNlcwotICogYXJlIGFsbG93ZWQuCi0gKgotICogVGhlIFZNIGlzIHJlcXVpcmVkIHRvIHByb3ZpZGUgYSBvbmUgd2F5IG1hcHBpbmcgZnVuY3Rpb24gdGhhdAotICogdGFrZXMgdGhlIG5hbWUgYW5kIGNyZWF0ZXMgYSBWTSBzdHlsZSBuYW1lLCBzdWNoIGFzIG1hcHBpbmcKLSAqICJObyBGaW5hbGl6ZXIiIHRvIG5vRmluYWxpemVyLiBUaGUgVk0gbWF5IG5vdCByZW1vdmUgYW55IGxldHRlcnMKLSAqIHdoZW4gcGVyZm9ybWluZyB0aGlzIG1hcHBpbmcgYnV0IG1heSByZW1vdmUgc3BhY2VzIGFuZCBjaGFuZ2UKLSAqIHRoZSBjYXNlIG9mIGFueSBjaGFyYWN0ZXIuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBPcHRpb25TZXQgewotICBwcml2YXRlIE9wdGlvbiBoZWFkOwotICBwcml2YXRlIE9wdGlvbiB0YWlsOwotICBwcml2YXRlIGJvb2xlYW4gbG9nZ2luZ0NoYW5nZXM7Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemUgdGhlIG9wdGlvbiBzZXQgc28gdGhhdCBvcHRpb25zIGNhbiBiZSBjcmVhdGVkLgotICAgKi8KLSAgcHJvdGVjdGVkIE9wdGlvblNldCgpIHsKLSAgICBoZWFkID0gbnVsbDsKLSAgICB0YWlsID0gbnVsbDsKLSAgICBsb2dnaW5nQ2hhbmdlcyA9IGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlZ2lzdGVyIHRoZSBvcHRpb24gdG8gdGhpcyBzZXQsIGNvbXB1dGluZyBpdHMga2V5IGluIHRoZSBwcm9jZXNzLgotICAgKgotICAgKiBAcGFyYW0gbyBUaGUgb3B0aW9uIHRvIHJlZ2lzdGVyLgotICAgKi8KLSAgZmluYWwgU3RyaW5nIHJlZ2lzdGVyKE9wdGlvbiBvLCBTdHJpbmcgbmFtZSkgewotICAgIGlmICh0YWlsID09IG51bGwpIHsKLSAgICAgIHRhaWwgPSBoZWFkID0gbzsKLSAgICB9IGVsc2UgewotICAgICAgdGFpbC5zZXROZXh0KG8pOwotICAgICAgdGFpbCA9IG87Ci0gICAgfQotICAgIHJldHVybiBjb21wdXRlS2V5KG5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFVzaW5nIHRoZSBWTSBkZXRlcm1pbmVkIGtleSwgbG9vayB1cCB0aGUgY29ycmVzcG9uZGluZyBvcHRpb24sCi0gICAqIG9yIHJldHVybiBudWxsIGlmIGFuIG9wdGlvbiBjYW4gbm90IGJlIGZvdW5kLgotICAgKgotICAgKiBAcGFyYW0ga2V5IFRoZSAodW5pcXVlKSBvcHRpb24ga2V5LgotICAgKiBAcmV0dXJuIFRoZSBvcHRpb24sIG9yIG51bGwuCi0gICAqLwotICBwdWJsaWMgZmluYWwgT3B0aW9uIGdldE9wdGlvbihTdHJpbmcga2V5KSB7Ci0gICAgT3B0aW9uIG8gPSBnZXRGaXJzdCgpOwotICAgIHdoaWxlIChvICE9IG51bGwpIHsKLSAgICAgIGlmIChvLmdldEtleSgpLmVxdWFscyhrZXkpKSB7Ci0gICAgICAgIHJldHVybiBvOwotICAgICAgfQotICAgICAgbyA9IG8uZ2V0TmV4dCgpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGZpcnN0IG9wdGlvbi4gVGhpcyBjYW4gYmUgdXNlZCB3aXRoIHRoZSBnZXROZXh0IG1ldGhvZCB0bwotICAgKiBpdGVyYXRlIHRocm91Z2ggdGhlIG9wdGlvbnMuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGZpcnN0IG9wdGlvbiwgb3IgbnVsbCBpZiBubyBvcHRpb25zIGV4aXN0LgotICAgKi8KLSAgcHVibGljIGZpbmFsIE9wdGlvbiBnZXRGaXJzdCgpIHsKLSAgICByZXR1cm4gaGVhZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGxvZ0NoYW5nZShPcHRpb24gbykgewotICAgIGlmIChsb2dnaW5nQ2hhbmdlcykgewotICAgICAgbG9nU3RyaW5nKCJPcHRpb24gVXBkYXRlOiAiKTsKLSAgICAgIGxvZyhvKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogTG9nIHRoZSBvcHRpb24gdmFsdWUgaW4gcGxhaW4gdGV4dC4KLSAgICoKLSAgICogQHBhcmFtIG8gVGhlIG9wdGlvbiB0byBsb2cuCi0gICAqLwotICBwdWJsaWMgdm9pZCBsb2coT3B0aW9uIG8pIHsKLSAgICBsb2dTdHJpbmcoIk9wdGlvbiAnIik7Ci0gICAgbG9nU3RyaW5nKG8uZ2V0S2V5KCkpOwotICAgIGxvZ1N0cmluZygiJyA9ICIpOwotICAgIGxvZ1ZhbHVlKG8sIGZhbHNlKTsKLSAgICBsb2dOZXdMaW5lKCk7Ci0gIH0KLQotICAvKioKLSAgICogTG9nIHRoZSBvcHRpb24gdmFsdWUgaW4gWG1sLgotICAgKgotICAgKiBAcGFyYW0gbyBUaGUgb3B0aW9uIHRvIGxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZ1htbChPcHRpb24gbykgewotICAgIGxvZ1N0cmluZygiPG9wdGlvbiBuYW1lPVwiIik7Ci0gICAgbG9nU3RyaW5nKG8uZ2V0S2V5KCkpOwotICAgIGxvZ1N0cmluZygiXCIgdmFsdWU9XCIiKTsKLSAgICBsb2dWYWx1ZShvLCB0cnVlKTsKLSAgICBsb2dTdHJpbmcoIlwiLz4iKTsKLSAgICBsb2dOZXdMaW5lKCk7Ci0gIH0KLQotICAvKioKLSAgICogTG9nIHRoZSBvcHRpb24gdmFsdWVzIGluIFhtbC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZ1htbCgpIHsKLSAgICBsb2dTdHJpbmcoIjxvcHRpb25zPiIpOwotICAgIGxvZ05ld0xpbmUoKTsKLQotICAgIGZvcihPcHRpb24gbyA9IGdldEZpcnN0KCk7IG8gIT0gbnVsbDsgbyA9IG8uZ2V0TmV4dCgpKSB7Ci0gICAgICBsb2dYbWwobyk7Ci0gICAgfQotCi0gICAgbG9nU3RyaW5nKCI8L29wdGlvbnM+Iik7Ci0gICAgbG9nTmV3TGluZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZvcm1hdCBhbmQgbG9nIGFuIG9wdGlvbiB2YWx1ZS4KLSAgICoKLSAgICogQHBhcmFtIG8gVGhlIG9wdGlvbi4KLSAgICogQHBhcmFtIGZvclhtbCBJcyB0aGlzIHBhcnQgb2YgeG1sIG91dHB1dD8KLSAgICovCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGxvZ1ZhbHVlKE9wdGlvbiBvLCBib29sZWFuIGZvclhtbCk7Ci0KLSAgLyoqCi0gICAqIExvZyBhIHN0cmluZy4KLSAgICovCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGxvZ1N0cmluZyhTdHJpbmcgcyk7Ci0KLSAgLyoqCi0gICAqIFByaW50IGEgbmV3IGxpbmUuCi0gICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBsb2dOZXdMaW5lKCk7Ci0KLSAgLyoqCi0gICAqIERldGVybWluZSB0aGUgVk0gc3BlY2lmaWMga2V5IGZvciBhIGdpdmVuIG9wdGlvbiBuYW1lLiBPcHRpb24gbmFtZXMgYXJlCi0gICAqIHNwYWNlIGRlbGltaXRlZCB3aXRoIGNhcGl0YWxpc2VkIHdvcmRzIChlLmcuICJHQyBWZXJib3NpdHkgTGV2ZWwiKS4KLSAgICoKLSAgICogQHBhcmFtIG5hbWUgVGhlIG9wdGlvbiBuYW1lLgotICAgKiBAcmV0dXJuIFRoZSBWTSBzcGVjaWZpYyBrZXkuCi0gICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGNvbXB1dGVLZXkoU3RyaW5nIG5hbWUpOwotCi0gIC8qKgotICAgKiBBIG5vbi1mYXRhbCBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIHNldHRpbmcgb2YgYW4gb3B0aW9uLiBUaGlzIG1ldGhvZAotICAgKiBjYWxscyBpbnRvIHRoZSBWTSBhbmQgc2hhbGwgbm90IGNhdXNlIHRoZSBzeXN0ZW0gdG8gc3RvcC4KLSAgICoKLSAgICogQHBhcmFtIG8gVGhlIHJlc3BvbnNpYmxlIG9wdGlvbi4KLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXJuaW5nLgotICAgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgd2FybihPcHRpb24gbywgU3RyaW5nIG1lc3NhZ2UpOwotCi0gIC8qKgotICAgKiBBIGZhdGFsIGVycm9yIG9jY3VycmVkIGR1cmluZyB0aGUgc2V0dGluZyBvZiBhbiBvcHRpb24uIFRoaXMgbWV0aG9kCi0gICAqIGNhbGxzIGludG8gdGhlIFZNIGFuZCBpcyByZXF1aXJlZCB0byBjYXVzZSB0aGUgc3lzdGVtIHRvIHN0b3AuCi0gICAqCi0gICAqIEBwYXJhbSBvIFRoZSByZXNwb25zaWJsZSBvcHRpb24uCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmFpbHVyZS4KLSAgICovCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZhaWwoT3B0aW9uIG8sIFN0cmluZyBtZXNzYWdlKTsKLQotICAvKioKLSAgICogQ29udmVydCBieXRlcyBpbnRvIHBhZ2VzLCByb3VuZGluZyB1cCBpZiBuZWNlc3NhcnkuCi0gICAqCi0gICAqIEBwYXJhbSBieXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzLgotICAgKiBAcmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIG51bWJlciBvZiBwYWdlcy4KLSAgICovCi0gIEBVbmludGVycnVwdGlibGUKLSAgcHJvdGVjdGVkIGFic3RyYWN0IGludCBieXRlc1RvUGFnZXMoRXh0ZW50IGJ5dGVzKTsKLQotICAvKioKLSAgICogQ29udmVydCBmcm9tIHBhZ2VzIGludG8gYnl0ZXMuCi0gICAqIEBwYXJhbSBwYWdlcyB0aGUgbnVtYmVyIG9mIHBhZ2VzLgotICAgKiBAcmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIG51bWJlciBvZiBieXRlcy4KLSAgICovCi0gIEBVbmludGVycnVwdGlibGUKLSAgcHJvdGVjdGVkIGFic3RyYWN0IEV4dGVudCBwYWdlc1RvQnl0ZXMoaW50IHBhZ2VzKTsKLX0KLQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm11dGlsL29wdGlvbnMvUGFnZXNPcHRpb24uamF2YSBiL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtdXRpbC9vcHRpb25zL1BhZ2VzT3B0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNzkwYjUuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm11dGlsL29wdGlvbnMvUGFnZXNPcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSAoQ1BMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2NwbDEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLnZtdXRpbC5vcHRpb25zOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLlVuaW50ZXJydXB0aWJsZTsKLWltcG9ydCBvcmcudm1tYWdpYy51bmJveGVkLkV4dGVudDsKLQotLyoqCi0gKiBBIG1lbW9yeSBvcHRpb24gdGhhdCBzdG9yZXMgdmFsdWVzIGFzIGEgd2hvbGUgbnVtYmVyIG9mIHBhZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgUGFnZXNPcHRpb24gZXh0ZW5kcyBPcHRpb24gewotICAvLyB2YWx1ZXMKLSAgcHJvdGVjdGVkIGludCBkZWZhdWx0VmFsdWU7Ci0gIHByb3RlY3RlZCBpbnQgdmFsdWU7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBwYWdlcyBvcHRpb24uCi0gICAqCi0gICAqIEBwYXJhbSBzZXQgVGhlIG9wdGlvbiBzZXQgdGhpcyBvcHRpb24gYmVsb25ncyB0by4KLSAgICogQHBhcmFtIG5hbWUgVGhlIHNwYWNlIHNlcGFyYXRlZCBuYW1lIGZvciB0aGUgb3B0aW9uLgotICAgKiBAcGFyYW0gZGVzYyBUaGUgcHVycG9zZSBvZiB0aGUgb3B0aW9uCi0gICAqIEBwYXJhbSBkZWZhdWx0UGFnZXMgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG9wdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCBQYWdlc09wdGlvbihPcHRpb25TZXQgc2V0LCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MsIGludCBkZWZhdWx0UGFnZXMpIHsKLSAgICBzdXBlcihzZXQsIFBBR0VTX09QVElPTiwgbmFtZSwgZGVzYyk7Ci0gICAgdGhpcy52YWx1ZSA9IHRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFBhZ2VzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIG9wdGlvbiBpbiBwYWdlcy4KLSAgICoKLSAgICogQHJldHVybiBUaGUgb3B0aW9uIHZhbHVlLgotICAgKi8KLSAgQFVuaW50ZXJydXB0aWJsZQotICBwdWJsaWMgaW50IGdldFBhZ2VzKCkgewotICAgIHJldHVybiB0aGlzLnZhbHVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIG9wdGlvbiBpbiBieXRlcy4KLSAgICoKLSAgICogQHJldHVybiBUaGUgb3B0aW9uIHZhbHVlLgotICAgKi8KLSAgQFVuaW50ZXJydXB0aWJsZQotICBwdWJsaWMgRXh0ZW50IGdldEJ5dGVzKCkgewotICAgIHJldHVybiBzZXQucGFnZXNUb0J5dGVzKHRoaXMudmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG9wdGlvbiBpbiBieXRlcy4KLSAgICoKLSAgICogQHJldHVybiBUaGUgZGVmYXVsdCB2YWx1ZS4KLSAgICovCi0gIEBVbmludGVycnVwdGlibGUKLSAgcHVibGljIEV4dGVudCBnZXREZWZhdWx0Qnl0ZXMoKSB7Ci0gICAgcmV0dXJuIHNldC5wYWdlc1RvQnl0ZXModGhpcy5kZWZhdWx0VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG9wdGlvbiBpbiBwYWdlcy4KLSAgICoKLSAgICogQHJldHVybiBUaGUgZGVmYXVsdCB2YWx1ZS4KLSAgICovCi0gIEBVbmludGVycnVwdGlibGUKLSAgcHVibGljIGludCBnZXREZWZhdWx0UGFnZXMoKSB7Ci0gICAgcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFVwZGF0ZSB0aGUgdmFsdWUgb2YgdGhlIG9wdGlvbiwgZWNob2luZyB0aGUgY2hhbmdlIGlmIGxvZ0NoYW5nZXMgaXMgc2V0LgotICAgKiBBIHdhcm5pbmcgaXMgcmFpc2VkIGlmIHRoZSB2YWx1ZSBpcyBub3QgYSB3aG9sZSBtdWx0aXBsZSBvZiBwYWdlcywgYW5kCi0gICAqIHRoZW4gdGhlIHZhbGlkYXRlIG1ldGhvZCBpcyBjYWxsZWQgdG8gYWxsb3cgc3ViY2xhc3NlcyB0byBwZXJmb3JtIGFueQotICAgKiBhZGRpdGlvbmFsIHZhbGlkYXRpb24uCi0gICAqCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIGZvciB0aGUgb3B0aW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Qnl0ZXMoRXh0ZW50IHZhbHVlKSB7Ci0gICAgaW50IHBhZ2VzID0gc2V0LmJ5dGVzVG9QYWdlcyh2YWx1ZSk7Ci0gICAgd2FybklmKHZhbHVlLk5FKHNldC5wYWdlc1RvQnl0ZXMocGFnZXMpKSwgIlZhbHVlIHJvdW5kZWQgdXAgdG8gYSB3aG9sZSBudW1iZXIgb2YgcGFnZXMiKTsKLSAgICBzZXRQYWdlcyhwYWdlcyk7Ci0gIH0KLQotICAvKioKLSAgICogVXBkYXRlIHRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uLCBlY2hvaW5nIHRoZSBjaGFuZ2UgaWYgbG9nQ2hhbmdlcyBpcyBzZXQuCi0gICAqIFRoZSB2YWxpZGF0ZSBtZXRob2QgaXMgY2FsbGVkIHRvIGFsbG93IHN1YmNsYXNzZXMgdG8gcGVyZm9ybSBhbnkgYWRkaXRpb25hbAotICAgKiB2YWxpZGF0aW9uLgotICAgKgotICAgKiBAcGFyYW0gcGFnZXMgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIG9wdGlvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFBhZ2VzKGludCBwYWdlcykgewotICAgIHRoaXMudmFsdWUgPSBwYWdlczsKLSAgICB2YWxpZGF0ZSgpOwotICAgIHNldC5sb2dDaGFuZ2UodGhpcyk7Ci0gIH0KLQotICAvKioKLSAgICogTW9kaWZ5IHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBvcHRpb24uCi0gICAqCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBvcHRpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0UGFnZXMoaW50IHZhbHVlKSB7Ci0gICAgdGhpcy52YWx1ZSA9IHRoaXMuZGVmYXVsdFZhbHVlID0gdmFsdWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS9zcmMvb3JnL3ZtdXRpbC9vcHRpb25zL1N0cmluZ09wdGlvbi5qYXZhIGIvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm11dGlsL29wdGlvbnMvU3RyaW5nT3B0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNThhZWUuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3NyYy9vcmcvdm11dGlsL29wdGlvbnMvU3RyaW5nT3B0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBKaWtlcyBSVk0gcHJvamVjdCAoaHR0cDovL2ppa2VzcnZtLm9yZykuCi0gKgotICogIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSAoQ1BMKTsKLSAqICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdQotICogIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2NwbDEuMC5waHAKLSAqCi0gKiAgU2VlIHRoZSBDT1BZUklHSFQudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKi8KLXBhY2thZ2Ugb3JnLnZtdXRpbC5vcHRpb25zOwotCi1pbXBvcnQgb3JnLnZtbWFnaWMucHJhZ21hLlVuaW50ZXJydXB0aWJsZTsKLQotLyoqCi0gKiBBbiBvcHRpb24gdGhhdCBoYXMgYSBzaW1wbGUgc3RyaW5nIHZhbHVlLgotICovCi1wdWJsaWMgY2xhc3MgU3RyaW5nT3B0aW9uIGV4dGVuZHMgT3B0aW9uIHsKLSAgLy8gdmFsdWVzCi0gIHByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFZhbHVlOwotICBwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgc3RyaW5nIG9wdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIHNldCBUaGUgb3B0aW9uIHNldCB0aGlzIG9wdGlvbiBiZWxvbmdzIHRvLgotICAgKiBAcGFyYW0gbmFtZSBUaGUgc3BhY2Ugc2VwYXJhdGVkIG5hbWUgZm9yIHRoZSBvcHRpb24uCi0gICAqIEBwYXJhbSBkZXNjIFRoZSBwdXJwb3NlIG9mIHRoZSBvcHRpb24KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgb3B0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZ09wdGlvbihPcHRpb25TZXQgc2V0LCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLSAgICBzdXBlcihzZXQsIFNUUklOR19PUFRJT04sIG5hbWUsIGRlc2MpOwotICAgIHRoaXMudmFsdWUgPSB0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBvcHRpb24uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG9wdGlvbiB2YWx1ZS4KLSAgICovCi0gIEBVbmludGVycnVwdGlibGUKLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLSAgICByZXR1cm4gdGhpcy52YWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBvcHRpb24KLSAgICoKLSAgICogQHJldHVybiBUaGUgZGVmYXVsdCB2YWx1ZS4KLSAgICovCi0gIEBVbmludGVycnVwdGlibGUKLSAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0gICAgcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFVwZGF0ZSB0aGUgdmFsdWUgb2YgdGhlIG9wdGlvbiwgZWNob2luZyB0aGUgY2hhbmdlIGlmIHRoZSBlY2hvT3B0aW9ucwotICAgKiBvcHRpb24gaXMgc2V0LiBUaGlzIG1ldGhvZCBhbHNvIGNhbGxzIHRoZSB2YWxpZGF0ZSBtZXRob2QgdG8gYWxsb3cKLSAgICogc3ViY2xhc3NlcyB0byBwZXJmb3JtIGFueSByZXF1aXJlZCB2YWxpZGF0aW9uLgotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIG9wdGlvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB2YWxpZGF0ZSgpOwotICAgIHNldC5sb2dDaGFuZ2UodGhpcyk7Ci0gIH0KLQotICAvKioKLSAgICogTW9kaWZ5IHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBvcHRpb24uCi0gICAqCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBvcHRpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgdGhpcy52YWx1ZSA9IHRoaXMuZGVmYXVsdFZhbHVlID0gdmFsdWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvamF2YS92bWtpdC5wcm9wZXJ0aWVzIGIvdm1raXQvbW10ay9qYXZhL3Zta2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMDIxYTEuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9qYXZhL3Zta2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpOwotIyAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UKLSMgIG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9lY2xpcHNlLTEuMC5waHAKLSMKLSMgIFNlZSB0aGUgQ09QWVJJR0hULnR4dCBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBpbmZvcm1hdGlvbgotIyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0jCi1tbXRrLmhlYWRlck1hcmtCaXQgPSB0cnVlCmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL21hZ2ljL0xvd2VySmF2YVJULmNwcCBiL3Zta2l0L21tdGsvbWFnaWMvTG93ZXJKYXZhUlQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTI0ZDVmLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvbWFnaWMvTG93ZXJKYXZhUlQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8vPT09LS0gTG93ZXJKYXZhUlQuY3BwIC0gUmVtb3ZlIHJlZmVyZW5jZXMgdG8gUlQgY2xhc3NlcyBhbmQgZnVuY3Rpb25zICAtLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgImxsdm0vQ29uc3RhbnRzLmgiCi0jaW5jbHVkZSAibGx2bS9GdW5jdGlvbi5oIgotI2luY2x1ZGUgImxsdm0vSW5zdHJ1Y3Rpb25zLmgiCi0jaW5jbHVkZSAibGx2bS9MTFZNQ29udGV4dC5oIgotI2luY2x1ZGUgImxsdm0vTW9kdWxlLmgiCi0jaW5jbHVkZSAibGx2bS9QYXNzLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NhbGxTaXRlLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBsbHZtOwotCi1uYW1lc3BhY2UgewotCi0gIGNsYXNzIExvd2VySmF2YVJUIDogcHVibGljIE1vZHVsZVBhc3MgewotICBwdWJsaWM6Ci0gICAgc3RhdGljIGNoYXIgSUQ7Ci0gICAgTG93ZXJKYXZhUlQoKSA6IE1vZHVsZVBhc3MoSUQpIHsgfQotCi0gICAgdmlydHVhbCBib29sIHJ1bk9uTW9kdWxlKE1vZHVsZSAmTSk7Ci0gIHByaXZhdGU6Ci0gIH07Ci0gIGNoYXIgTG93ZXJKYXZhUlQ6OklEID0gMDsKLSAgc3RhdGljIFJlZ2lzdGVyUGFzczxMb3dlckphdmFSVD4gWCgiTG93ZXJKYXZhUlQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZW1vdmUgcmVmZXJlbmNlcyB0byBSVCIpOwotCi1ib29sIExvd2VySmF2YVJUOjpydW5Pbk1vZHVsZShNb2R1bGUmIE0pIHsKLSAgYm9vbCBDaGFuZ2VkID0gdHJ1ZTsKLQotICBmb3IgKE1vZHVsZTo6aXRlcmF0b3IgSSA9IE0uYmVnaW4oKSwgRSA9IE0uZW5kKCk7IEkgIT0gRTspIHsKLSAgICBGdW5jdGlvbiYgR1YgPSAqSTsKLSAgICArK0k7Ci0gICAgaWYgKCFzdHJuY21wKEdWLmdldE5hbWUoKS5kYXRhKCksICJKbkpWTV9qYXZhIiwgMTApIHx8Ci0gICAgICAgICFzdHJuY21wKEdWLmdldE5hbWUoKS5kYXRhKCksICJqYXZhIiwgNCkpIHsKLSAgICAgIGlmICghc3RyY21wKEdWLmdldE5hbWUoKS5kYXRhKCksICJKbkpWTV9qYXZhX2xhbmdfU3RyaW5nX2NoYXJBdF9fSSIpKSB7Ci0gIAkgICAgRnVuY3Rpb24qIEYgPSBNLmdldEZ1bmN0aW9uKCJNTVRrQ2hhckF0Iik7Ci0gICAgICAgIGlmICghRikgCi0gICAgICAgICAgRiA9IEZ1bmN0aW9uOjpDcmVhdGUoR1YuZ2V0RnVuY3Rpb25UeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSwgIk1NVGtDaGFyQXQiLCAmTSk7Ci0gICAgICAJCi0gICAgICAgIEdWLnJlcGxhY2VBbGxVc2VzV2l0aChGKTsKLSAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChHVi5nZXROYW1lKCkuZGF0YSgpLCAiSm5KVk1famF2YV9sYW5nX09iamVjdF9nZXRDbGFzc19fIikpIHsKLSAgCSAgICBGdW5jdGlvbiogRiA9IE0uZ2V0RnVuY3Rpb24oIk1NVGtHZXRDbGFzcyIpOwotCSAgICAgIGlmICghRikgCi0gICAgICAgICAgRiA9IEZ1bmN0aW9uOjpDcmVhdGUoR1YuZ2V0RnVuY3Rpb25UeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSwgIk1NVGtHZXRDbGFzcyIsICZNKTsKLSAgICAgIAlHVi5yZXBsYWNlQWxsVXNlc1dpdGgoRik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBHVi5yZXBsYWNlQWxsVXNlc1dpdGgoQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShHVi5nZXRUeXBlKCkpKTsKLSAgICAgIH0KLSAgICAgIEdWLmVyYXNlRnJvbVBhcmVudCgpOwotICAgIH0KLSAgfQotCi0gIGZvciAoTW9kdWxlOjpnbG9iYWxfaXRlcmF0b3IgSSA9IE0uZ2xvYmFsX2JlZ2luKCksIEUgPSBNLmdsb2JhbF9lbmQoKTsKLSAgICAgICBJICE9IEU7KSB7Ci0gICAgR2xvYmFsVmFsdWUmIEdWID0gKkk7Ci0gICAgKytJOwotICAgIGlmICghc3RybmNtcChHVi5nZXROYW1lKCkuZGF0YSgpLCAiSm5KVk1famF2YSIsIDEwKSB8fAotICAgICAgICAhc3RybmNtcChHVi5nZXROYW1lKCkuZGF0YSgpLCAiamF2YSIsIDQpIHx8Ci0gICAgICAgICFzdHJuY21wKEdWLmdldE5hbWUoKS5kYXRhKCksICJKbkpWTV9nbnUiLCA5KSB8fAotICAgICAgICAhc3RybmNtcChHVi5nZXROYW1lKCkuZGF0YSgpLCAiZ251IiwgMykpIHsKLSAgICAgIEdWLnJlcGxhY2VBbGxVc2VzV2l0aChDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEdWLmdldFR5cGUoKSkpOwotICAgICAgR1YuZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgfQotICB9Ci0gCi0gIC8vIFJlcGxhY2UgZ2NtYWxsb2Mgd2l0aCB0aGUgYWxsb2NhdG9yIG9mIE1NVGsgb2JqZWN0cyBpbiBWTUtpdAotICBGdW5jdGlvbiogRiA9IE0uZ2V0RnVuY3Rpb24oImdjbWFsbG9jIik7Ci0gIEZ1bmN0aW9uKiBNYSA9IE0uZ2V0RnVuY3Rpb24oIkFsbG9jYXRlTWFnaWNBcnJheSIpOwotCi0gIEZ1bmN0aW9uKiBOZXdGdW5jdGlvbiA9IAotICAgIEZ1bmN0aW9uOjpDcmVhdGUoRi0+Z2V0RnVuY3Rpb25UeXBlKCksIEdsb2JhbFZhbHVlOjpFeHRlcm5hbExpbmthZ2UsCi0gICAgICAgICAgICAgICAgICAgICAiTU1Ua011dGF0b3JBbGxvY2F0ZSIsICZNKTsKLQotICBGLT5yZXBsYWNlQWxsVXNlc1dpdGgoTmV3RnVuY3Rpb24pOwotICBGLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgCi0gIE1hLT5yZXBsYWNlQWxsVXNlc1dpdGgoTmV3RnVuY3Rpb24pOwotICBNYS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0KLSAgcmV0dXJuIENoYW5nZWQ7Ci19Ci0KLQotTW9kdWxlUGFzcyogY3JlYXRlTG93ZXJKYXZhUlQoKSB7Ci0gIHJldHVybiBuZXcgTG93ZXJKYXZhUlQoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9tYWdpYy9Mb3dlck1hZ2ljLmNwcCBiL3Zta2l0L21tdGsvbWFnaWMvTG93ZXJNYWdpYy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MmJhYWIuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9tYWdpYy9Mb3dlck1hZ2ljLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyNjcgKzAsMCBAQAotLy89PT0tLS0tLSBMb3dlckNvbnN0YW50Q2FsbHMuY3BwIC0gQ2hhbmdlcyBhcnJheUxlbmd0aCBjYWxscyAgLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpuSlZNCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJsbHZtL0NvbnN0YW50cy5oIgotI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKLSNpbmNsdWRlICJsbHZtL0luc3RydWN0aW9ucy5oIgotI2luY2x1ZGUgImxsdm0vTExWTUNvbnRleHQuaCIKLSNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgotI2luY2x1ZGUgImxsdm0vUGFzcy5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYWxsU2l0ZS5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgotCi0jaW5jbHVkZSA8Y3N0ZGlvPgotCi11c2luZyBuYW1lc3BhY2UgbGx2bTsKLQotbmFtZXNwYWNlIHZtbWFnaWMgewotCi0gIGNsYXNzIExvd2VyTWFnaWMgOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKLSAgcHVibGljOgotICAgIHN0YXRpYyBjaGFyIElEOwotICAgIExvd2VyTWFnaWMoKSA6IEZ1bmN0aW9uUGFzcyhJRCkgeyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRik7Ci0gIHByaXZhdGU6Ci0gIH07Ci0gIGNoYXIgTG93ZXJNYWdpYzo6SUQgPSAwOwotICBzdGF0aWMgUmVnaXN0ZXJQYXNzPExvd2VyTWFnaWM+IFgoIkxvd2VyTWFnaWMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxvd2VyIG1hZ2ljIGNhbGxzIik7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzQ2xhc3MgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzXyI7Ci1zdGF0aWMgY29uc3QgY2hhciogQWRkcmVzc1plcm9NZXRob2QgPSAwOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NJc1plcm9NZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogQWRkcmVzc01heE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzSXNNYXhNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogQWRkcmVzc0Zyb21JbnRTaWduRXh0ZW5kTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NGcm9tSW50WmVyb0V4dGVuZE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzRnJvbUxvbmdNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogQWRkcmVzc1RvT2JqZWN0UmVmZXJlbmNlTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NUb0ludE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzVG9Mb25nTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NUb1dvcmRNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogQWRkcmVzc1BsdXNJbnRNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogQWRkcmVzc1BsdXNPZmZzZXRNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogQWRkcmVzc1BsdXNFeHRlbnRNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogQWRkcmVzc01pbnVzSW50TWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NNaW51c09mZnNldE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzTWludXNFeHRlbnRNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogQWRkcmVzc0RpZmZNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogQWRkcmVzc0xUTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NMRU1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzR1RNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogQWRkcmVzc0dFTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NFUU1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzTkVNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogQWRkcmVzc1ByZWZldGNoTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NMb2FkT2JqZWN0UmVmZXJlbmNlTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NMb2FkT2JqZWN0UmVmZXJlbmNlQXRPZmZzZXRNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogQWRkcmVzc0xvYWRCeXRlTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NMb2FkQnl0ZUF0T2Zmc2V0TWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NMb2FkQ2hhck1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzTG9hZENoYXJBdE9mZnNldE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzTG9hZFNob3J0TWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NMb2FkU2hvcnRBdE9mZnNldE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzTG9hZEZsb2F0TWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NMb2FkRmxvYXRBdE9mZnNldE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzTG9hZEludE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzTG9hZEludEF0T2Zmc2V0TWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NMb2FkTG9uZ01ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzTG9hZExvbmdBdE9mZnNldE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzTG9hZERvdWJsZU1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzTG9hZERvdWJsZUF0T2Zmc2V0TWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NMb2FkQWRkcmVzc01ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzTG9hZEFkZHJlc3NBdE9mZnNldE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzTG9hZFdvcmRNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogQWRkcmVzc0xvYWRXb3JkQXRPZmZzZXRNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogQWRkcmVzc1N0b3JlT2JqZWN0UmVmZXJlbmNlTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NTdG9yZU9iamVjdFJlZmVyZW5jZUF0T2Zmc2V0TWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NTdG9yZUFkZHJlc3NNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogQWRkcmVzc1N0b3JlQWRkcmVzc0F0T2Zmc2V0TWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NTdG9yZUZsb2F0TWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NTdG9yZUZsb2F0QXRPZmZzZXRNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogQWRkcmVzc1N0b3JlV29yZE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzU3RvcmVXb3JkQXRPZmZzZXRNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogQWRkcmVzc1N0b3JlQnl0ZU1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzU3RvcmVCeXRlQXRPZmZzZXRNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogQWRkcmVzc1N0b3JlSW50TWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NTdG9yZUludEF0T2Zmc2V0TWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NTdG9yZURvdWJsZU1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzU3RvcmVEb3VibGVBdE9mZnNldE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzU3RvcmVMb25nTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NTdG9yZUxvbmdBdE9mZnNldE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzU3RvcmVDaGFyTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NTdG9yZUNoYXJBdE9mZnNldE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzU3RvcmVTaG9ydE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzU3RvcmVTaG9ydEF0T2Zmc2V0TWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NQcmVwYXJlV29yZE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzUHJlcGFyZVdvcmRBdE9mZnNldE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzUHJlcGFyZU9iamVjdFJlZmVyZW5jZU1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzUHJlcGFyZU9iamVjdFJlZmVyZW5jZUF0T2Zmc2V0TWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NQcmVwYXJlQWRkcmVzc01ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzUHJlcGFyZUFkZHJlc3NBdE9mZnNldE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzUHJlcGFyZUludE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzUHJlcGFyZUludEF0T2Zmc2V0TWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NBdHRlbXB0SW50TWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NBdHRlbXB0SW50QXRPZmZzZXRNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogQWRkcmVzc0F0dGVtcHRXb3JkTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NBdHRlbXB0V29yZEF0T2Zmc2V0TWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NBdHRlbXB0T2JqZWN0UmVmZXJlbmNlTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NBdHRlbXB0T2JqZWN0UmVmZXJlbmNlQXRPZmZzZXRNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogQWRkcmVzc0F0dGVtcHRBZGRyZXNzTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NBdHRlbXB0QWRkcmVzc0F0T2Zmc2V0TWV0aG9kOwotCi1zdGF0aWMgY29uc3QgY2hhciogRXh0ZW50Q2xhc3MgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9FeHRlbnRfIjsKLXN0YXRpYyBjb25zdCBjaGFyKiBFeHRlbnRUb1dvcmRNZXRob2QgPSAwOwotc3RhdGljIGNvbnN0IGNoYXIqIEV4dGVudEZyb21JbnRTaWduRXh0ZW5kTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEV4dGVudEZyb21JbnRaZXJvRXh0ZW5kTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEV4dGVudFplcm9NZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogRXh0ZW50T25lTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEV4dGVudE1heE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBFeHRlbnRUb0ludE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBFeHRlbnRUb0xvbmdNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogRXh0ZW50UGx1c0ludE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBFeHRlbnRQbHVzRXh0ZW50TWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEV4dGVudE1pbnVzSW50TWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEV4dGVudE1pbnVzRXh0ZW50TWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEV4dGVudExUTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEV4dGVudExFTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEV4dGVudEdUTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEV4dGVudEdFTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEV4dGVudEVRTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIEV4dGVudE5FTWV0aG9kOwotCi1zdGF0aWMgY29uc3QgY2hhciogT2JqZWN0UmVmZXJlbmNlQ2xhc3MgPSAKLSAgIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlXyI7Ci1zdGF0aWMgY29uc3QgY2hhciogT2JqZWN0UmVmZXJlbmNlRnJvbU9iamVjdE1ldGhvZCA9IDA7Ci1zdGF0aWMgY29uc3QgY2hhciogT2JqZWN0UmVmZXJlbmNlTnVsbFJlZmVyZW5jZU1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBPYmplY3RSZWZlcmVuY2VUb09iamVjdE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBPYmplY3RSZWZlcmVuY2VUb0FkZHJlc3NNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogT2JqZWN0UmVmZXJlbmNlSXNOdWxsTWV0aG9kOwotCi1zdGF0aWMgY29uc3QgY2hhciogT2Zmc2V0Q2xhc3MgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9PZmZzZXRfIjsKLXN0YXRpYyBjb25zdCBjaGFyKiBPZmZzZXRGcm9tSW50U2lnbkV4dGVuZE1ldGhvZCA9IDA7Ci1zdGF0aWMgY29uc3QgY2hhciogT2Zmc2V0RnJvbUludFplcm9FeHRlbmRNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogT2Zmc2V0WmVyb01ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBPZmZzZXRNYXhNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogT2Zmc2V0VG9JbnRNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogT2Zmc2V0VG9Mb25nTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIE9mZnNldFRvV29yZE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBPZmZzZXRQbHVzSW50TWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIE9mZnNldE1pbnVzSW50TWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIE9mZnNldE1pbnVzT2Zmc2V0TWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIE9mZnNldEVRTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIE9mZnNldE5FTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIE9mZnNldFNMVE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBPZmZzZXRTTEVNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogT2Zmc2V0U0dUTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIE9mZnNldFNHRU1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBPZmZzZXRJc1plcm9NZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogT2Zmc2V0SXNNYXhNZXRob2Q7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBXb3JkQ2xhc3MgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9Xb3JkXyI7Ci1zdGF0aWMgY29uc3QgY2hhciogV29yZEZyb21JbnRTaWduRXh0ZW5kTWV0aG9kID0gMDsKLXN0YXRpYyBjb25zdCBjaGFyKiBXb3JkRnJvbUludFplcm9FeHRlbmRNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogV29yZEZyb21Mb25nTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIFdvcmRaZXJvTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIFdvcmRPbmVNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogV29yZE1heE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBXb3JkVG9JbnRNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogV29yZFRvTG9uZ01ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBXb3JkVG9BZGRyZXNzTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIFdvcmRUb09mZnNldE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBXb3JkVG9FeHRlbnRNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogV29yZFBsdXNXb3JkTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIFdvcmRQbHVzT2Zmc2V0TWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIFdvcmRQbHVzRXh0ZW50TWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIFdvcmRNaW51c1dvcmRNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogV29yZE1pbnVzT2Zmc2V0TWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIFdvcmRNaW51c0V4dGVudE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBXb3JkSXNaZXJvTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIFdvcmRJc01heE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBXb3JkTFRNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogV29yZExFTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIFdvcmRHVE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBXb3JkR0VNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogV29yZEVRTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIFdvcmRORU1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBXb3JkQW5kTWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIFdvcmRPck1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBXb3JkTm90TWV0aG9kOwotc3RhdGljIGNvbnN0IGNoYXIqIFdvcmRYb3JNZXRob2Q7Ci1zdGF0aWMgY29uc3QgY2hhciogV29yZExzaE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBXb3JkUnNobE1ldGhvZDsKLXN0YXRpYyBjb25zdCBjaGFyKiBXb3JkUnNoYU1ldGhvZDsKLQotc3RhdGljIEZ1bmN0aW9uKiBDQVNQdHI7Ci1zdGF0aWMgRnVuY3Rpb24qIENBU0ludDsKLQotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NBcnJheUNsYXNzID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc0FycmF5XyI7Ci1zdGF0aWMgY29uc3QgY2hhciogRXh0ZW50QXJyYXlDbGFzcyA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX0V4dGVudEFycmF5XyI7Ci1zdGF0aWMgY29uc3QgY2hhciogT2JqZWN0UmVmZXJlbmNlQXJyYXlDbGFzcyA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZUFycmF5XyI7Ci1zdGF0aWMgY29uc3QgY2hhciogT2Zmc2V0QXJyYXlDbGFzcyA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX09mZnNldEFycmF5XyI7Ci1zdGF0aWMgY29uc3QgY2hhciogV29yZEFycmF5Q2xhc3MgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9Xb3JkQXJyYXlfIjsKLQotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NBcnJheUNyZWF0ZU1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX0FkZHJlc3NBcnJheV9jcmVhdGVfX0kiOwotc3RhdGljIGNvbnN0IGNoYXIqIEV4dGVudEFycmF5Q3JlYXRlTWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfRXh0ZW50QXJyYXlfY3JlYXRlX19JIjsKLXN0YXRpYyBjb25zdCBjaGFyKiBPYmplY3RSZWZlcmVuY2VBcnJheUNyZWF0ZU1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZUFycmF5X2NyZWF0ZV9fSSI7Ci1zdGF0aWMgY29uc3QgY2hhciogT2Zmc2V0QXJyYXlDcmVhdGVNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9PZmZzZXRBcnJheV9jcmVhdGVfX0kiOwotc3RhdGljIGNvbnN0IGNoYXIqIFdvcmRBcnJheUNyZWF0ZU1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX1dvcmRBcnJheV9jcmVhdGVfX0kiOwotCi1zdGF0aWMgY29uc3QgY2hhciogQWRkcmVzc0FycmF5R2V0TWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc0FycmF5X2dldF9fSSI7Ci1zdGF0aWMgY29uc3QgY2hhciogRXh0ZW50QXJyYXlHZXRNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9FeHRlbnRBcnJheV9nZXRfX0kiOwotc3RhdGljIGNvbnN0IGNoYXIqIE9iamVjdFJlZmVyZW5jZUFycmF5R2V0TWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlQXJyYXlfZ2V0X19JIjsKLXN0YXRpYyBjb25zdCBjaGFyKiBPZmZzZXRBcnJheUdldE1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX09mZnNldEFycmF5X2dldF9fSSI7Ci1zdGF0aWMgY29uc3QgY2hhciogV29yZEFycmF5R2V0TWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfV29yZEFycmF5X2dldF9fSSI7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBBZGRyZXNzQXJyYXlTZXRNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzQXJyYXlfc2V0X19JTG9yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc18yIjsKLXN0YXRpYyBjb25zdCBjaGFyKiBFeHRlbnRBcnJheVNldE1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX0V4dGVudEFycmF5X3NldF9fSUxvcmdfdm1tYWdpY191bmJveGVkX0V4dGVudF8yIjsKLXN0YXRpYyBjb25zdCBjaGFyKiBPYmplY3RSZWZlcmVuY2VBcnJheVNldE1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZUFycmF5X3NldF9fSUxvcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZV8yIjsKLXN0YXRpYyBjb25zdCBjaGFyKiBPZmZzZXRBcnJheVNldE1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX09mZnNldEFycmF5X3NldF9fSUxvcmdfdm1tYWdpY191bmJveGVkX09mZnNldF8yIjsKLXN0YXRpYyBjb25zdCBjaGFyKiBXb3JkQXJyYXlTZXRNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9Xb3JkQXJyYXlfc2V0X19JTG9yZ192bW1hZ2ljX3VuYm94ZWRfV29yZF8yIjsKLQotc3RhdGljIGNvbnN0IGNoYXIqIEFkZHJlc3NBcnJheUxlbmd0aE1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX0FkZHJlc3NBcnJheV9sZW5naHRfXyI7Ci1zdGF0aWMgY29uc3QgY2hhciogRXh0ZW50QXJyYXlMZW5ndGhNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9FeHRlbnRBcnJheV9sZW5ndGhfXyI7Ci1zdGF0aWMgY29uc3QgY2hhciogT2JqZWN0UmVmZXJlbmNlQXJyYXlMZW5ndGhNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9PYmplY3RSZWZlcmVuY2VBcnJheV9sZW5ndGhfXyI7Ci1zdGF0aWMgY29uc3QgY2hhciogT2Zmc2V0QXJyYXlMZW5ndGhNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9PZmZzZXRBcnJheV9sZW5ndGhfXyI7Ci1zdGF0aWMgY29uc3QgY2hhciogV29yZEFycmF5TGVuZ3RoTWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfV29yZEFycmF5X2xlbmd0aF9fIjsKLQotCi0KLXN0YXRpYyB2b2lkIGluaXRpYWxpc2VGdW5jdGlvbnMoTW9kdWxlKiBNKSB7Ci0gIGlmICghQWRkcmVzc1plcm9NZXRob2QpIHsKLSAgICBBZGRyZXNzWmVyb01ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX0FkZHJlc3NfemVyb19fIjsKLSAgICBBZGRyZXNzTWF4TWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc19tYXhfXyI7Ci0gICAgQWRkcmVzc1N0b3JlT2JqZWN0UmVmZXJlbmNlTWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc19zdG9yZV9fTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlXzIiOwotICAgIEFkZHJlc3NMb2FkT2JqZWN0UmVmZXJlbmNlTWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc19sb2FkT2JqZWN0UmVmZXJlbmNlX18iOwotICAgIEFkZHJlc3NMb2FkQWRkcmVzc01ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX0FkZHJlc3NfbG9hZEFkZHJlc3NfXyI7Ci0gICAgQWRkcmVzc0xvYWRXb3JkTWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc19sb2FkV29yZF9fIjsKLSAgICBBZGRyZXNzRGlmZk1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX0FkZHJlc3NfZGlmZl9fTG9yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc18yIjsKLSAgICBBZGRyZXNzUGx1c09mZnNldE1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX0FkZHJlc3NfcGx1c19fTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2Zmc2V0XzIiOwotICAgIEFkZHJlc3NTdG9yZUFkZHJlc3NNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzX3N0b3JlX19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzXzIiOwotICAgIEFkZHJlc3NQbHVzSW50TWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc19wbHVzX19JIjsKLSAgICBBZGRyZXNzTFRNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzX0xUX19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzXzIiOwotICAgIEFkZHJlc3NHRU1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX0FkZHJlc3NfR0VfX0xvcmdfdm1tYWdpY191bmJveGVkX0FkZHJlc3NfMiI7Ci0gICAgQWRkcmVzc1N0b3JlV29yZE1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX0FkZHJlc3Nfc3RvcmVfX0xvcmdfdm1tYWdpY191bmJveGVkX1dvcmRfMiI7Ci0gICAgQWRkcmVzc1RvT2JqZWN0UmVmZXJlbmNlTWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc190b09iamVjdFJlZmVyZW5jZV9fIjsKLSAgICBBZGRyZXNzVG9Xb3JkTWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc190b1dvcmRfXyI7Ci0gICAgQWRkcmVzc1ByZXBhcmVXb3JkTWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc19wcmVwYXJlV29yZF9fIjsKLSAgICBBZGRyZXNzQXR0ZW1wdFdvcmRBdE9mZnNldE1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX0FkZHJlc3NfYXR0ZW1wdF9fTG9yZ192bW1hZ2ljX3VuYm94ZWRfV29yZF8yTG9yZ192bW1hZ2ljX3VuYm94ZWRfV29yZF8yTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2Zmc2V0XzIiOwotICAgIEFkZHJlc3NQcmVwYXJlV29yZEF0T2Zmc2V0TWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc19wcmVwYXJlV29yZF9fTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2Zmc2V0XzIiOwotICAgIEFkZHJlc3NMb2FkV29yZEF0T2Zmc2V0TWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc19sb2FkV29yZF9fTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2Zmc2V0XzIiOwotICAgIEFkZHJlc3NTdG9yZVdvcmRBdE9mZnNldE1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX0FkZHJlc3Nfc3RvcmVfX0xvcmdfdm1tYWdpY191bmJveGVkX1dvcmRfMkxvcmdfdm1tYWdpY191bmJveGVkX09mZnNldF8yIjsKLSAgICBBZGRyZXNzUGx1c0V4dGVudE1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX0FkZHJlc3NfcGx1c19fTG9yZ192bW1hZ2ljX3VuYm94ZWRfRXh0ZW50XzIiOwotICAgIEFkZHJlc3NJc1plcm9NZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzX2lzWmVyb19fIjsKLSAgICBBZGRyZXNzU3RvcmVBZGRyZXNzQXRPZmZzZXRNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzX3N0b3JlX19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzXzJMb3JnX3ZtbWFnaWNfdW5ib3hlZF9PZmZzZXRfMiI7Ci0gICAgQWRkcmVzc0dUTWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc19HVF9fTG9yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc18yIjsKLSAgICBBZGRyZXNzTG9hZEFkZHJlc3NBdE9mZnNldE1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX0FkZHJlc3NfbG9hZEFkZHJlc3NfX0xvcmdfdm1tYWdpY191bmJveGVkX09mZnNldF8yIjsKLSAgICBBZGRyZXNzRVFNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzX0VRX19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzXzIiOwotICAgIEFkZHJlc3NMb2FkT2JqZWN0UmVmZXJlbmNlQXRPZmZzZXRNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzX2xvYWRPYmplY3RSZWZlcmVuY2VfX0xvcmdfdm1tYWdpY191bmJveGVkX09mZnNldF8yIjsKLSAgICBBZGRyZXNzTEVNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzX0xFX19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzXzIiOwotICAgIEFkZHJlc3NBdHRlbXB0V29yZE1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX0FkZHJlc3NfYXR0ZW1wdF9fTG9yZ192bW1hZ2ljX3VuYm94ZWRfV29yZF8yTG9yZ192bW1hZ2ljX3VuYm94ZWRfV29yZF8yIjsKLSAgICBBZGRyZXNzTkVNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzX05FX19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzXzIiOwotICAgIEFkZHJlc3NUb0xvbmdNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzX3RvTG9uZ19fIjsKLSAgICBBZGRyZXNzTWludXNFeHRlbnRNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzX21pbnVzX19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9FeHRlbnRfMiI7Ci0gICAgQWRkcmVzc0xvYWRTaG9ydEF0T2Zmc2V0TWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc19sb2FkU2hvcnRfX0xvcmdfdm1tYWdpY191bmJveGVkX09mZnNldF8yIjsKLSAgICBBZGRyZXNzU3RvcmVTaG9ydEF0T2Zmc2V0TWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc19zdG9yZV9fU0xvcmdfdm1tYWdpY191bmJveGVkX09mZnNldF8yIjsKLSAgICBBZGRyZXNzTG9hZFNob3J0TWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc19sb2FkU2hvcnRfXyI7Ci0gICAgQWRkcmVzc1N0b3JlU2hvcnRNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzX3N0b3JlX19TIjsKLSAgICBBZGRyZXNzTG9hZEJ5dGVNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzX2xvYWRCeXRlX18iOwotICAgIEFkZHJlc3NMb2FkSW50TWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc19sb2FkSW50X18iOwotICAgIEFkZHJlc3NTdG9yZUludE1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX0FkZHJlc3Nfc3RvcmVfX0kiOwotICAgIEFkZHJlc3NTdG9yZUJ5dGVNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzX3N0b3JlX19CIjsKLSAgICBBZGRyZXNzTG9hZEJ5dGVBdE9mZnNldE1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX0FkZHJlc3NfbG9hZEJ5dGVfX0xvcmdfdm1tYWdpY191bmJveGVkX09mZnNldF8yIjsKLSAgICBBZGRyZXNzTWludXNJbnRNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzX21pbnVzX19JIjsKLSAgICBBZGRyZXNzTG9hZEludEF0T2Zmc2V0TWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc19sb2FkSW50X19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9PZmZzZXRfMiI7Ci0gICAgQWRkcmVzc1N0b3JlQnl0ZUF0T2Zmc2V0TWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc19zdG9yZV9fQkxvcmdfdm1tYWdpY191bmJveGVkX09mZnNldF8yIjsKLSAgICBBZGRyZXNzRnJvbUludFplcm9FeHRlbmRNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzX2Zyb21JbnRaZXJvRXh0ZW5kX19JIjsKLSAgICBBZGRyZXNzVG9JbnRNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzX3RvSW50X18iOwotICAgIAotICAgIEV4dGVudFRvV29yZE1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX0V4dGVudF90b1dvcmRfXyI7Ci0gICAgRXh0ZW50TWludXNFeHRlbnRNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9FeHRlbnRfbWludXNfX0xvcmdfdm1tYWdpY191bmJveGVkX0V4dGVudF8yIjsKLSAgICBFeHRlbnRQbHVzRXh0ZW50TWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfRXh0ZW50X3BsdXNfX0xvcmdfdm1tYWdpY191bmJveGVkX0V4dGVudF8yIjsKLSAgICBFeHRlbnRQbHVzSW50TWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfRXh0ZW50X3BsdXNfX0kiOwotICAgIEV4dGVudE1pbnVzSW50TWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfRXh0ZW50X21pbnVzX19JIjsKLSAgICBFeHRlbnRGcm9tSW50WmVyb0V4dGVuZE1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX0V4dGVudF9mcm9tSW50WmVyb0V4dGVuZF9fSSI7Ci0gICAgRXh0ZW50RnJvbUludFNpZ25FeHRlbmRNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9FeHRlbnRfZnJvbUludFNpZ25FeHRlbmRfX0kiOwotICAgIEV4dGVudE9uZU1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX0V4dGVudF9vbmVfXyI7Ci0gICAgRXh0ZW50TkVNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9FeHRlbnRfTkVfX0xvcmdfdm1tYWdpY191bmJveGVkX0V4dGVudF8yIjsKLSAgICBFeHRlbnRaZXJvTWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfRXh0ZW50X3plcm9fXyI7Ci0gICAgRXh0ZW50VG9Mb25nTWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfRXh0ZW50X3RvTG9uZ19fIjsKLSAgICBFeHRlbnRUb0ludE1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX0V4dGVudF90b0ludF9fIjsKLSAgICBFeHRlbnRFUU1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX0V4dGVudF9FUV9fTG9yZ192bW1hZ2ljX3VuYm94ZWRfRXh0ZW50XzIiOwotICAgIEV4dGVudEdUTWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfRXh0ZW50X0dUX19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9FeHRlbnRfMiI7Ci0gICAgRXh0ZW50TFRNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9FeHRlbnRfTFRfX0xvcmdfdm1tYWdpY191bmJveGVkX0V4dGVudF8yIjsKLSAgICBFeHRlbnRNYXhNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9FeHRlbnRfbWF4X18iOwotCi0gICAgT2JqZWN0UmVmZXJlbmNlRnJvbU9iamVjdE1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZV9mcm9tT2JqZWN0X19MamF2YV9sYW5nX09iamVjdF8yIjsKLSAgICBPYmplY3RSZWZlcmVuY2VUb09iamVjdE1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZV90b09iamVjdF9fIjsKLSAgICBPYmplY3RSZWZlcmVuY2VOdWxsUmVmZXJlbmNlTWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlX251bGxSZWZlcmVuY2VfXyI7Ci0gICAgT2JqZWN0UmVmZXJlbmNlVG9BZGRyZXNzTWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlX3RvQWRkcmVzc19fIjsKLSAgICBPYmplY3RSZWZlcmVuY2VJc051bGxNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9PYmplY3RSZWZlcmVuY2VfaXNOdWxsX18iOwotCi0gICAgV29yZE9yTWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfV29yZF9vcl9fTG9yZ192bW1hZ2ljX3VuYm94ZWRfV29yZF8yIjsKLSAgICBXb3JkUnNobE1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX1dvcmRfcnNobF9fSSI7Ci0gICAgV29yZFRvSW50TWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfV29yZF90b0ludF9fIjsKLSAgICBXb3JkTm90TWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfV29yZF9ub3RfXyI7Ci0gICAgV29yZFplcm9NZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9Xb3JkX3plcm9fXyI7Ci0gICAgV29yZE9uZU1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX1dvcmRfb25lX18iOwotICAgIFdvcmRBbmRNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9Xb3JkX2FuZF9fTG9yZ192bW1hZ2ljX3VuYm94ZWRfV29yZF8yIjsKLSAgICBXb3JkVG9BZGRyZXNzTWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfV29yZF90b0FkZHJlc3NfXyI7Ci0gICAgV29yZExzaE1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX1dvcmRfbHNoX19JIjsKLSAgICBXb3JkTWludXNXb3JkTWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfV29yZF9taW51c19fTG9yZ192bW1hZ2ljX3VuYm94ZWRfV29yZF8yIjsKLSAgICBXb3JkTFRNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9Xb3JkX0xUX19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9Xb3JkXzIiOwotICAgIFdvcmRQbHVzV29yZE1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX1dvcmRfcGx1c19fTG9yZ192bW1hZ2ljX3VuYm94ZWRfV29yZF8yIjsKLSAgICBXb3JkTEVNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9Xb3JkX0xFX19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9Xb3JkXzIiOwotICAgIFdvcmRHRU1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX1dvcmRfR0VfX0xvcmdfdm1tYWdpY191bmJveGVkX1dvcmRfMiI7Ci0gICAgV29yZEVRTWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfV29yZF9FUV9fTG9yZ192bW1hZ2ljX3VuYm94ZWRfV29yZF8yIjsKLSAgICBXb3JkTkVNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9Xb3JkX05FX19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9Xb3JkXzIiOwotICAgIFdvcmRGcm9tSW50U2lnbkV4dGVuZE1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX1dvcmRfZnJvbUludFNpZ25FeHRlbmRfX0kiOwotICAgIFdvcmRJc1plcm9NZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9Xb3JkX2lzWmVyb19fIjsKLSAgICBXb3JkWG9yTWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfV29yZF94b3JfX0xvcmdfdm1tYWdpY191bmJveGVkX1dvcmRfMiI7Ci0gICAgV29yZEZyb21JbnRaZXJvRXh0ZW5kTWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfV29yZF9mcm9tSW50WmVyb0V4dGVuZF9fSSI7Ci0gICAgV29yZFRvRXh0ZW50TWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfV29yZF90b0V4dGVudF9fIjsKLSAgICBXb3JkTWludXNFeHRlbnRNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9Xb3JkX21pbnVzX19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9FeHRlbnRfMiI7Ci0gICAgV29yZFRvTG9uZ01ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX1dvcmRfdG9Mb25nX18iOwotICAgIFdvcmRNYXhNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9Xb3JkX21heF9fIjsKLSAgICBXb3JkVG9PZmZzZXRNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9Xb3JkX3RvT2Zmc2V0X18iOwotICAgIFdvcmRHVE1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX1dvcmRfR1RfX0xvcmdfdm1tYWdpY191bmJveGVkX1dvcmRfMiI7Ci0KLQotICAgIE9mZnNldFNMVE1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX09mZnNldF9zTFRfX0xvcmdfdm1tYWdpY191bmJveGVkX09mZnNldF8yIjsKLSAgICBPZmZzZXRGcm9tSW50U2lnbkV4dGVuZE1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX09mZnNldF9mcm9tSW50U2lnbkV4dGVuZF9fSSI7Ci0gICAgT2Zmc2V0U0dUTWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfT2Zmc2V0X3NHVF9fTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2Zmc2V0XzIiOwotICAgIE9mZnNldFBsdXNJbnRNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9PZmZzZXRfcGx1c19fSSI7Ci0gICAgT2Zmc2V0WmVyb01ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX09mZnNldF96ZXJvX18iOwotICAgIE9mZnNldFRvV29yZE1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX09mZnNldF90b1dvcmRfXyI7Ci0gICAgT2Zmc2V0RnJvbUludFplcm9FeHRlbmRNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9PZmZzZXRfZnJvbUludFplcm9FeHRlbmRfX0kiOwotICAgIE9mZnNldFNHRU1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX09mZnNldF9zR0VfX0xvcmdfdm1tYWdpY191bmJveGVkX09mZnNldF8yIjsKLSAgICBPZmZzZXRUb0ludE1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX09mZnNldF90b0ludF9fIjsKLSAgICBPZmZzZXRUb0xvbmdNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9PZmZzZXRfdG9Mb25nX18iOwotICAgIE9mZnNldElzWmVyb01ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX09mZnNldF9pc1plcm9fXyI7Ci0gICAgT2Zmc2V0TWludXNJbnRNZXRob2QgPSAiSm5KVk1fb3JnX3ZtbWFnaWNfdW5ib3hlZF9PZmZzZXRfbWludXNfX0kiOwotICAgIE9mZnNldFNMRU1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX09mZnNldF9zTEVfX0xvcmdfdm1tYWdpY191bmJveGVkX09mZnNldF8yIjsKLSAgICBPZmZzZXRFUU1ldGhvZCA9ICJKbkpWTV9vcmdfdm1tYWdpY191bmJveGVkX09mZnNldF9FUV9fTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2Zmc2V0XzIiOwotICAgIE9mZnNldE1pbnVzT2Zmc2V0TWV0aG9kID0gIkpuSlZNX29yZ192bW1hZ2ljX3VuYm94ZWRfT2Zmc2V0X21pbnVzX19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9PZmZzZXRfMiI7Ci0gIH0KLX0KLQotCi1zdGF0aWMgYm9vbCByZW1vdmVQb3RlbnRpYWxOdWxsQ2hlY2soQmFzaWNCbG9jayogQ3VyLCBWYWx1ZSogT2JqKSB7Ci0gIEJhc2ljQmxvY2sqIEJCID0gQ3VyLT5nZXRVbmlxdWVQcmVkZWNlc3NvcigpOwotICBMTFZNQ29udGV4dCYgQ29udGV4dCA9IEN1ci0+Z2V0UGFyZW50KCktPmdldENvbnRleHQoKTsKLSAgaWYgKEJCKSB7Ci0gICAgSW5zdHJ1Y3Rpb24qIFQgPSBCQi0+Z2V0VGVybWluYXRvcigpOwotICAgIGlmIChkeW5fY2FzdDxCcmFuY2hJbnN0PihUKSAmJiBUICE9IEJCLT5iZWdpbigpKSB7Ci0gICAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciBCSUUgPSBCQi0+ZW5kKCk7Ci0gICAgICAtLUJJRTsgLy8gVGVybWluYXRvcgotICAgICAgLS1CSUU7IC8vIE51bGwgdGVzdAotICAgICAgaWYgKElDbXBJbnN0KiBJRSA9IGR5bl9jYXN0PElDbXBJbnN0PihCSUUpKSB7Ci0gICAgICAgIGlmIChJRS0+Z2V0UHJlZGljYXRlKCkgPT0gSUNtcEluc3Q6OklDTVBfRVEgJiYKLSAgICAgICAgICAgIElFLT5nZXRPcGVyYW5kKDApID09IE9iaiAmJgotICAgICAgICAgICAgSUUtPmdldE9wZXJhbmQoMSkgPT0gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShPYmotPmdldFR5cGUoKSkpIHsKLSAgICAgICAgICBCSUUtPnJlcGxhY2VBbGxVc2VzV2l0aChDb25zdGFudEludDo6Z2V0RmFsc2UoQ29udGV4dCkpOwotICAgICAgICAgIEJJRS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIExvd2VyTWFnaWM6OnJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24mIEYpIHsKLSAgTW9kdWxlKiBnbG9iYWxNb2R1bGUgPSBGLmdldFBhcmVudCgpOwotICBMTFZNQ29udGV4dCYgQ29udGV4dCA9IGdsb2JhbE1vZHVsZS0+Z2V0Q29udGV4dCgpOwotICBib29sIENoYW5nZWQgPSBmYWxzZTsKLSAgY29uc3QgbGx2bTo6VHlwZSogcG9pbnRlclNpemVUeXBlID0gCi0gICAgZ2xvYmFsTW9kdWxlLT5nZXRQb2ludGVyU2l6ZSgpID09IGxsdm06Ok1vZHVsZTo6UG9pbnRlcjMyID8KLSAgICAgIFR5cGU6OmdldEludDMyVHkoQ29udGV4dCkgOiBUeXBlOjpnZXRJbnQ2NFR5KENvbnRleHQpOwotIAotICAgQ29uc3RhbnQqIGNvbnN0YW50UHRyTG9nU2l6ZSA9IAotICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwgc2l6ZW9mKHZvaWQqKSA9PSA4ID8gMyA6IDIpOwotCi0gIGNvbnN0IGxsdm06OlR5cGUqIHB0clR5cGUgPSBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFR5cGU6OmdldEludDhUeShDb250ZXh0KSk7Ci0gIGNvbnN0IGxsdm06OlR5cGUqIHB0clNpemVUeXBlID0gUG9pbnRlclR5cGU6OmdldFVucXVhbChwb2ludGVyU2l6ZVR5cGUpOwotCi0KLSAgaW5pdGlhbGlzZUZ1bmN0aW9ucyhnbG9iYWxNb2R1bGUpOwotCi0gIEZ1bmN0aW9uKiBNTWFsbG9jID0gZ2xvYmFsTW9kdWxlLT5nZXRGdW5jdGlvbigiQWxsb2NhdGVNYWdpY0FycmF5Iik7Ci0gIGlmICghTU1hbGxvYykgewotICAgIHN0ZDo6dmVjdG9yPGNvbnN0IFR5cGUqPkZ1bmNUeUFyZ3M7Ci0gICAgRnVuY1R5QXJncy5wdXNoX2JhY2soVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSk7Ci0gICAgRnVuY1R5QXJncy5wdXNoX2JhY2socHRyVHlwZSk7Ci0gICAgRnVuY3Rpb25UeXBlKiBGdW5jVHkgPSBGdW5jdGlvblR5cGU6OmdldChwdHJUeXBlLCBGdW5jVHlBcmdzLCBmYWxzZSk7Ci0KLQotICAgIE1NYWxsb2MgPSBGdW5jdGlvbjo6Q3JlYXRlKEZ1bmNUeSwgR2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSwgIkFsbG9jYXRlTWFnaWNBcnJheSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsTW9kdWxlKTsKLSAgfQotCi0KLSAgaWYgKCFDQVNQdHIgfHwgQ0FTUHRyLT5nZXRQYXJlbnQoKSAhPSBnbG9iYWxNb2R1bGUpIHsKLSAgICBpZiAocG9pbnRlclNpemVUeXBlID09IFR5cGU6OmdldEludDMyVHkoQ29udGV4dCkpIHsKLSAgICAgIENBU1B0ciA9IGdsb2JhbE1vZHVsZS0+Z2V0RnVuY3Rpb24oImxsdm0uYXRvbWljLmNtcC5zd2FwLmkzMi5wMGkzMiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBDQVNQdHIgPSBnbG9iYWxNb2R1bGUtPmdldEZ1bmN0aW9uKCJsbHZtLmF0b21pYy5jbXAuc3dhcC5pNjQucDBpNjQiKTsKLSAgICB9Ci0gICAgQ0FTSW50ID0gZ2xvYmFsTW9kdWxlLT5nZXRGdW5jdGlvbigibGx2bS5hdG9taWMuY21wLnN3YXAuaTMyLnAwaTMyIik7Ci0gIH0KLQotICBmb3IgKEZ1bmN0aW9uOjppdGVyYXRvciBCSSA9IEYuYmVnaW4oKSwgQkUgPSBGLmVuZCgpOyBCSSAhPSBCRTsgQkkrKykgeyAKLSAgICBCYXNpY0Jsb2NrICpDdXIgPSBCSTsgCi0gICAgZm9yIChCYXNpY0Jsb2NrOjppdGVyYXRvciBJSSA9IEN1ci0+YmVnaW4oKSwgSUUgPSBDdXItPmVuZCgpOyBJSSAhPSBJRTspIHsKLSAgICAgIEluc3RydWN0aW9uICpJID0gSUk7Ci0gICAgICBJSSsrOwotICAgICAgaWYgKEktPmdldE9wY29kZSgpICE9IEluc3RydWN0aW9uOjpDYWxsICYmCi0gICAgICAgICAgSS0+Z2V0T3Bjb2RlKCkgIT0gSW5zdHJ1Y3Rpb246Okludm9rZSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgQ2FsbFNpdGUgQ2FsbChJKTsKLSAgICAgIEluc3RydWN0aW9uKiBDSSA9IEk7Ci0gICAgICAgIFZhbHVlKiBWID0gQ2FsbC5nZXRDYWxsZWRWYWx1ZSgpOwotICAgICAgICBpZiAoRnVuY3Rpb24qIEZDdXIgPSBkeW5fY2FzdDxGdW5jdGlvbj4oVikpIHsKLSAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lID0gRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKTsKLSAgICAgICAgICB1bnNpZ25lZCBsZW4gPSBGQ3VyLT5nZXROYW1lKCkuc2l6ZSgpOwotICAgICAgICAgIGlmIChsZW4gPiBzdHJsZW4oQWRkcmVzc0NsYXNzKSAmJiAKLSAgICAgICAgICAgICAgIW1lbWNtcChBZGRyZXNzQ2xhc3MsIG5hbWUsIHN0cmxlbihBZGRyZXNzQ2xhc3MpKSkgewotICAgICAgICAgICAgCi0gICAgICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgbnVsbCBjaGVjawotICAgICAgICAgICAgaWYgKENhbGwuYXJnX2JlZ2luKCkgIT0gQ2FsbC5hcmdfZW5kKCkpIHsKLSAgICAgICAgICAgICAgcmVtb3ZlUG90ZW50aWFsTnVsbENoZWNrKEN1ciwgQ2FsbC5nZXRBcmd1bWVudCgwKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIEFkZHJlc3NaZXJvTWV0aG9kKSkgewotICAgICAgICAgICAgICBDb25zdGFudCogTiA9IENvbnN0YW50OjpnZXROdWxsVmFsdWUoRkN1ci0+Z2V0UmV0dXJuVHlwZSgpKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChOKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIEFkZHJlc3NNYXhNZXRob2QpKSB7Ci0gICAgICAgICAgICAgIENvbnN0YW50SW50KiBNID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQ2NFR5KENvbnRleHQpLCAodWludDY0X3QpLTEpOwotICAgICAgICAgICAgICBDb25zdGFudCogTiA9IENvbnN0YW50RXhwcjo6Z2V0SW50VG9QdHIoTSwgRkN1ci0+Z2V0UmV0dXJuVHlwZSgpKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChOKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIEFkZHJlc3NTdG9yZU9iamVjdFJlZmVyZW5jZU1ldGhvZCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBBZGRyZXNzU3RvcmVBZGRyZXNzTWV0aG9kKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIEFkZHJlc3NTdG9yZVNob3J0TWV0aG9kKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIEFkZHJlc3NTdG9yZUJ5dGVNZXRob2QpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgQWRkcmVzc1N0b3JlSW50TWV0aG9kKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIEFkZHJlc3NTdG9yZVdvcmRNZXRob2QpKSB7Ci0gICAgICAgICAgICAgIFZhbHVlKiBBZGRyID0gQ2FsbC5nZXRBcmd1bWVudCgwKTsKLSAgICAgICAgICAgICAgVmFsdWUqIE9iaiA9IENhbGwuZ2V0QXJndW1lbnQoMSk7Ci0gICAgICAgICAgICAgIGNvbnN0IGxsdm06OlR5cGUqIFR5ID0gUG9pbnRlclR5cGU6OmdldFVucXVhbChPYmotPmdldFR5cGUoKSk7Ci0gICAgICAgICAgICAgIEFkZHIgPSBuZXcgQml0Q2FzdEluc3QoQWRkciwgVHksICIiLCBDSSk7Ci0gICAgICAgICAgICAgIG5ldyBTdG9yZUluc3QoT2JqLCBBZGRyLCBDSSk7Ci0gICAgICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBBZGRyZXNzTG9hZE9iamVjdFJlZmVyZW5jZU1ldGhvZCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBBZGRyZXNzTG9hZEFkZHJlc3NNZXRob2QpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgQWRkcmVzc0xvYWRXb3JkTWV0aG9kKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIEFkZHJlc3NMb2FkU2hvcnRNZXRob2QpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgQWRkcmVzc0xvYWRCeXRlTWV0aG9kKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIEFkZHJlc3NMb2FkSW50TWV0aG9kKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIEFkZHJlc3NQcmVwYXJlV29yZE1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgVmFsdWUqIEFkZHIgPSBDYWxsLmdldEFyZ3VtZW50KDApOwotICAgICAgICAgICAgICBjb25zdCBUeXBlKiBUeSA9IFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoRkN1ci0+Z2V0UmV0dXJuVHlwZSgpKTsKLSAgICAgICAgICAgICAgQWRkciA9IG5ldyBCaXRDYXN0SW5zdChBZGRyLCBUeSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgVmFsdWUqIExEID0gbmV3IExvYWRJbnN0KEFkZHIsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgoTEQpOwotICAgICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgQWRkcmVzc0RpZmZNZXRob2QpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgQWRkcmVzc01pbnVzRXh0ZW50TWV0aG9kKSkgewotICAgICAgICAgICAgICBWYWx1ZSogVmFsMSA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwyID0gQ2FsbC5nZXRBcmd1bWVudCgxKTsKLSAgICAgICAgICAgICAgVmFsMSA9IG5ldyBQdHJUb0ludEluc3QoVmFsMSwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWwyID0gbmV3IFB0clRvSW50SW5zdChWYWwyLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbHVlKiByZXMgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU3ViKFZhbDEsIFZhbDIsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIHJlcyA9IG5ldyBJbnRUb1B0ckluc3QocmVzLCBGQ3VyLT5nZXRSZXR1cm5UeXBlKCksICIiLCBDSSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgocmVzKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIEFkZHJlc3NQbHVzT2Zmc2V0TWV0aG9kKSkgewotICAgICAgICAgICAgICBWYWx1ZSogVmFsMSA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwyID0gQ2FsbC5nZXRBcmd1bWVudCgxKTsKLSAgICAgICAgICAgICAgVmFsMSA9IG5ldyBQdHJUb0ludEluc3QoVmFsMSwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWwyID0gbmV3IFB0clRvSW50SW5zdChWYWwyLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbHVlKiByZXMgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQWRkKFZhbDEsIFZhbDIsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIHJlcyA9IG5ldyBJbnRUb1B0ckluc3QocmVzLCBGQ3VyLT5nZXRSZXR1cm5UeXBlKCksICIiLCBDSSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgocmVzKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIEFkZHJlc3NQbHVzSW50TWV0aG9kKSkgewotICAgICAgICAgICAgICBWYWx1ZSogVmFsMSA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwyID0gQ2FsbC5nZXRBcmd1bWVudCgxKTsKLSAgICAgICAgICAgICAgVmFsMSA9IG5ldyBQdHJUb0ludEluc3QoVmFsMSwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBpZiAoVmFsMi0+Z2V0VHlwZSgpICE9IHBvaW50ZXJTaXplVHlwZSkKLSAgICAgICAgICAgICAgICBWYWwyID0gbmV3IFpFeHRJbnN0KFZhbDIsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgVmFsdWUqIHJlcyA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBZGQoVmFsMSwgVmFsMiwgIiIsIENJKTsKLSAgICAgICAgICAgICAgcmVzID0gbmV3IEludFRvUHRySW5zdChyZXMsIEZDdXItPmdldFJldHVyblR5cGUoKSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChyZXMpOwotICAgICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgQWRkcmVzc01pbnVzSW50TWV0aG9kKSkgewotICAgICAgICAgICAgICBWYWx1ZSogVmFsMSA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwyID0gQ2FsbC5nZXRBcmd1bWVudCgxKTsKLSAgICAgICAgICAgICAgVmFsMSA9IG5ldyBQdHJUb0ludEluc3QoVmFsMSwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBpZiAoVmFsMi0+Z2V0VHlwZSgpICE9IHBvaW50ZXJTaXplVHlwZSkKLSAgICAgICAgICAgICAgICBWYWwyID0gbmV3IFpFeHRJbnN0KFZhbDIsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgVmFsdWUqIHJlcyA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVTdWIoVmFsMSwgVmFsMiwgIiIsIENJKTsKLSAgICAgICAgICAgICAgcmVzID0gbmV3IEludFRvUHRySW5zdChyZXMsIEZDdXItPmdldFJldHVyblR5cGUoKSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChyZXMpOwotICAgICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgQWRkcmVzc0xUTWV0aG9kKSkgewotICAgICAgICAgICAgICBWYWx1ZSogVmFsMSA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwyID0gQ2FsbC5nZXRBcmd1bWVudCgxKTsKLSAgICAgICAgICAgICAgVmFsMSA9IG5ldyBQdHJUb0ludEluc3QoVmFsMSwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWwyID0gbmV3IFB0clRvSW50SW5zdChWYWwyLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbHVlKiByZXMgPSBuZXcgSUNtcEluc3QoQ0ksIElDbXBJbnN0OjpJQ01QX1VMVCwgVmFsMSwgVmFsMiwgIiIpOwotICAgICAgICAgICAgICByZXMgPSBuZXcgWkV4dEluc3QocmVzLCBGQ3VyLT5nZXRSZXR1cm5UeXBlKCksICIiLCBDSSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgocmVzKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIEFkZHJlc3NHVE1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbDEgPSBDYWxsLmdldEFyZ3VtZW50KDApOwotICAgICAgICAgICAgICBWYWx1ZSogVmFsMiA9IENhbGwuZ2V0QXJndW1lbnQoMSk7Ci0gICAgICAgICAgICAgIFZhbDEgPSBuZXcgUHRyVG9JbnRJbnN0KFZhbDEsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgVmFsMiA9IG5ldyBQdHJUb0ludEluc3QoVmFsMiwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWx1ZSogcmVzID0gbmV3IElDbXBJbnN0KENJLCBJQ21wSW5zdDo6SUNNUF9VR1QsIFZhbDEsIFZhbDIsICIiKTsKLSAgICAgICAgICAgICAgcmVzID0gbmV3IFpFeHRJbnN0KHJlcywgRkN1ci0+Z2V0UmV0dXJuVHlwZSgpLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBDSS0+cmVwbGFjZUFsbFVzZXNXaXRoKHJlcyk7Ci0gICAgICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBBZGRyZXNzRVFNZXRob2QpKSB7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwxID0gQ2FsbC5nZXRBcmd1bWVudCgwKTsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbDIgPSBDYWxsLmdldEFyZ3VtZW50KDEpOwotICAgICAgICAgICAgICBWYWwxID0gbmV3IFB0clRvSW50SW5zdChWYWwxLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbDIgPSBuZXcgUHRyVG9JbnRJbnN0KFZhbDIsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgVmFsdWUqIHJlcyA9IG5ldyBJQ21wSW5zdChDSSwgSUNtcEluc3Q6OklDTVBfRVEsIFZhbDEsIFZhbDIsICIiKTsKLSAgICAgICAgICAgICAgcmVzID0gbmV3IFpFeHRJbnN0KHJlcywgRkN1ci0+Z2V0UmV0dXJuVHlwZSgpLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBDSS0+cmVwbGFjZUFsbFVzZXNXaXRoKHJlcyk7Ci0gICAgICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBBZGRyZXNzTkVNZXRob2QpKSB7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwxID0gQ2FsbC5nZXRBcmd1bWVudCgwKTsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbDIgPSBDYWxsLmdldEFyZ3VtZW50KDEpOwotICAgICAgICAgICAgICBWYWwxID0gbmV3IFB0clRvSW50SW5zdChWYWwxLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbDIgPSBuZXcgUHRyVG9JbnRJbnN0KFZhbDIsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgVmFsdWUqIHJlcyA9IG5ldyBJQ21wSW5zdChDSSwgSUNtcEluc3Q6OklDTVBfTkUsIFZhbDEsIFZhbDIsICIiKTsKLSAgICAgICAgICAgICAgcmVzID0gbmV3IFpFeHRJbnN0KHJlcywgRkN1ci0+Z2V0UmV0dXJuVHlwZSgpLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBDSS0+cmVwbGFjZUFsbFVzZXNXaXRoKHJlcyk7Ci0gICAgICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBBZGRyZXNzTEVNZXRob2QpKSB7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwxID0gQ2FsbC5nZXRBcmd1bWVudCgwKTsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbDIgPSBDYWxsLmdldEFyZ3VtZW50KDEpOwotICAgICAgICAgICAgICBWYWwxID0gbmV3IFB0clRvSW50SW5zdChWYWwxLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbDIgPSBuZXcgUHRyVG9JbnRJbnN0KFZhbDIsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgVmFsdWUqIHJlcyA9IG5ldyBJQ21wSW5zdChDSSwgSUNtcEluc3Q6OklDTVBfVUxFLCBWYWwxLCBWYWwyLCAiIik7Ci0gICAgICAgICAgICAgIHJlcyA9IG5ldyBaRXh0SW5zdChyZXMsIEZDdXItPmdldFJldHVyblR5cGUoKSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChyZXMpOwotICAgICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgQWRkcmVzc0dFTWV0aG9kKSkgewotICAgICAgICAgICAgICBWYWx1ZSogVmFsMSA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwyID0gQ2FsbC5nZXRBcmd1bWVudCgxKTsKLSAgICAgICAgICAgICAgVmFsMSA9IG5ldyBQdHJUb0ludEluc3QoVmFsMSwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWwyID0gbmV3IFB0clRvSW50SW5zdChWYWwyLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbHVlKiByZXMgPSBuZXcgSUNtcEluc3QoQ0ksIElDbXBJbnN0OjpJQ01QX1VHRSwgVmFsMSwgVmFsMiwgIiIpOwotICAgICAgICAgICAgICByZXMgPSBuZXcgWkV4dEluc3QocmVzLCBGQ3VyLT5nZXRSZXR1cm5UeXBlKCksICIiLCBDSSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgocmVzKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIEFkZHJlc3NUb09iamVjdFJlZmVyZW5jZU1ldGhvZCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBBZGRyZXNzVG9Xb3JkTWV0aG9kKSkgewotICAgICAgICAgICAgICBWYWx1ZSogVmFsID0gQ2FsbC5nZXRBcmd1bWVudCgwKTsKLSAgICAgICAgICAgICAgVmFsID0gbmV3IEJpdENhc3RJbnN0KFZhbCwgRkN1ci0+Z2V0UmV0dXJuVHlwZSgpLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBDSS0+cmVwbGFjZUFsbFVzZXNXaXRoKFZhbCk7Ci0gICAgICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBBZGRyZXNzQXR0ZW1wdFdvcmRBdE9mZnNldE1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgVmFsdWUqIFB0ciA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIFZhbHVlKiBPbGQgPSBDYWxsLmdldEFyZ3VtZW50KDEpOwotICAgICAgICAgICAgICBWYWx1ZSogVmFsID0gQ2FsbC5nZXRBcmd1bWVudCgyKTsKLSAgICAgICAgICAgICAgVmFsdWUqIE9mZnNldCA9IENhbGwuZ2V0QXJndW1lbnQoMyk7Ci0KLSAgICAgICAgICAgICAgUHRyID0gbmV3IFB0clRvSW50SW5zdChQdHIsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgT2Zmc2V0ID0gbmV3IFB0clRvSW50SW5zdChPZmZzZXQsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgUHRyID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFkZChQdHIsIE9mZnNldCwgIiIsIENJKTsKLSAgICAgICAgICAgICAgY29uc3QgVHlwZSogVHkgPSBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKHBvaW50ZXJTaXplVHlwZSk7Ci0gICAgICAgICAgICAgIFB0ciA9IG5ldyBJbnRUb1B0ckluc3QoUHRyLCBUeSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgT2xkID0gbmV3IFB0clRvSW50SW5zdChPbGQsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgVmFsID0gbmV3IFB0clRvSW50SW5zdChWYWwsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIFZhbHVlKiBBcmdzWzNdID0geyBQdHIsIE9sZCwgVmFsIH07Ci0gICAgICAgICAgICAgIFZhbHVlKiByZXMgPSBDYWxsSW5zdDo6Q3JlYXRlKENBU1B0ciwgQXJncywgQXJncyArIDMsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIHJlcyA9IG5ldyBJQ21wSW5zdChDSSwgSUNtcEluc3Q6OklDTVBfRVEsIHJlcywgT2xkLCAiIik7Ci0gICAgICAgICAgICAgIHJlcyA9IG5ldyBaRXh0SW5zdChyZXMsIEZDdXItPmdldFJldHVyblR5cGUoKSwgIiIsIENJKTsKLQotICAgICAgICAgICAgICBDSS0+cmVwbGFjZUFsbFVzZXNXaXRoKHJlcyk7Ci0gICAgICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBBZGRyZXNzQXR0ZW1wdFdvcmRNZXRob2QpKSB7Ci0gICAgICAgICAgICAgIFZhbHVlKiBQdHIgPSBDYWxsLmdldEFyZ3VtZW50KDApOwotICAgICAgICAgICAgICBWYWx1ZSogT2xkID0gQ2FsbC5nZXRBcmd1bWVudCgxKTsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbCA9IENhbGwuZ2V0QXJndW1lbnQoMik7Ci0KLSAgICAgICAgICAgICAgY29uc3QgVHlwZSogVHkgPSBQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKHBvaW50ZXJTaXplVHlwZSk7Ci0gICAgICAgICAgICAgIFB0ciA9IG5ldyBCaXRDYXN0SW5zdChQdHIsIFR5LCAiIiwgQ0kpOwotICAgICAgICAgICAgICBPbGQgPSBuZXcgUHRyVG9JbnRJbnN0KE9sZCwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWwgPSBuZXcgUHRyVG9JbnRJbnN0KFZhbCwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgVmFsdWUqIEFyZ3NbM10gPSB7IFB0ciwgT2xkLCBWYWwgfTsKLSAgICAgICAgICAgICAgVmFsdWUqIHJlcyA9IENhbGxJbnN0OjpDcmVhdGUoQ0FTUHRyLCBBcmdzLCBBcmdzICsgMywgIiIsIENJKTsKLSAgICAgICAgICAgICAgcmVzID0gbmV3IElDbXBJbnN0KENJLCBJQ21wSW5zdDo6SUNNUF9FUSwgcmVzLCBPbGQsICIiKTsKLSAgICAgICAgICAgICAgcmVzID0gbmV3IFpFeHRJbnN0KHJlcywgRkN1ci0+Z2V0UmV0dXJuVHlwZSgpLCAiIiwgQ0kpOwotCi0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgocmVzKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIEFkZHJlc3NQcmVwYXJlV29yZEF0T2Zmc2V0TWV0aG9kKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIEFkZHJlc3NMb2FkV29yZEF0T2Zmc2V0TWV0aG9kKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIEFkZHJlc3NMb2FkQWRkcmVzc0F0T2Zmc2V0TWV0aG9kKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIEFkZHJlc3NMb2FkT2JqZWN0UmVmZXJlbmNlQXRPZmZzZXRNZXRob2QpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgQWRkcmVzc0xvYWRCeXRlQXRPZmZzZXRNZXRob2QpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgQWRkcmVzc0xvYWRJbnRBdE9mZnNldE1ldGhvZCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBBZGRyZXNzTG9hZFNob3J0QXRPZmZzZXRNZXRob2QpKSB7Ci0gICAgICAgICAgICAgIFZhbHVlKiBQdHIgPSBDYWxsLmdldEFyZ3VtZW50KDApOwotICAgICAgICAgICAgICBWYWx1ZSogT2Zmc2V0ID0gQ2FsbC5nZXRBcmd1bWVudCgxKTsKLQotICAgICAgICAgICAgICBQdHIgPSBuZXcgUHRyVG9JbnRJbnN0KFB0ciwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBPZmZzZXQgPSBuZXcgUHRyVG9JbnRJbnN0KE9mZnNldCwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBQdHIgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQWRkKFB0ciwgT2Zmc2V0LCAiIiwgQ0kpOwotICAgICAgICAgICAgICBjb25zdCBUeXBlKiBUeSA9IFBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoRkN1ci0+Z2V0UmV0dXJuVHlwZSgpKTsKLSAgICAgICAgICAgICAgUHRyID0gbmV3IEludFRvUHRySW5zdChQdHIsIFR5LCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWx1ZSogcmVzID0gbmV3IExvYWRJbnN0KFB0ciwgIiIsIENJKTsKLQotICAgICAgICAgICAgICBDSS0+cmVwbGFjZUFsbFVzZXNXaXRoKHJlcyk7Ci0gICAgICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBBZGRyZXNzU3RvcmVXb3JkQXRPZmZzZXRNZXRob2QpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgQWRkcmVzc1N0b3JlQWRkcmVzc0F0T2Zmc2V0TWV0aG9kKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIEFkZHJlc3NTdG9yZUJ5dGVBdE9mZnNldE1ldGhvZCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBBZGRyZXNzU3RvcmVTaG9ydEF0T2Zmc2V0TWV0aG9kKSkgewotICAgICAgICAgICAgICBWYWx1ZSogUHRyID0gQ2FsbC5nZXRBcmd1bWVudCgwKTsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbCA9IENhbGwuZ2V0QXJndW1lbnQoMSk7Ci0gICAgICAgICAgICAgIFZhbHVlKiBPZmZzZXQgPSBDYWxsLmdldEFyZ3VtZW50KDIpOwotCi0gICAgICAgICAgICAgIFB0ciA9IG5ldyBQdHJUb0ludEluc3QoUHRyLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIE9mZnNldCA9IG5ldyBQdHJUb0ludEluc3QoT2Zmc2V0LCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFB0ciA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBZGQoUHRyLCBPZmZzZXQsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIGNvbnN0IFR5cGUqIFR5ID0gUG9pbnRlclR5cGU6OmdldFVucXVhbChWYWwtPmdldFR5cGUoKSk7Ci0gICAgICAgICAgICAgIFB0ciA9IG5ldyBJbnRUb1B0ckluc3QoUHRyLCBUeSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgbmV3IFN0b3JlSW5zdChWYWwsIFB0ciwgQ0kpOwotCi0gICAgICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBBZGRyZXNzUGx1c0V4dGVudE1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbDEgPSBDYWxsLmdldEFyZ3VtZW50KDApOwotICAgICAgICAgICAgICBWYWx1ZSogVmFsMiA9IENhbGwuZ2V0QXJndW1lbnQoMSk7Ci0gICAgICAgICAgICAgIFZhbDEgPSBuZXcgUHRyVG9JbnRJbnN0KFZhbDEsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgVmFsMiA9IG5ldyBQdHJUb0ludEluc3QoVmFsMiwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWx1ZSogcmVzID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFkZChWYWwxLCBWYWwyLCAiIiwgQ0kpOwotICAgICAgICAgICAgICByZXMgPSBuZXcgSW50VG9QdHJJbnN0KHJlcywgRkN1ci0+Z2V0UmV0dXJuVHlwZSgpLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBDSS0+cmVwbGFjZUFsbFVzZXNXaXRoKHJlcyk7Ci0gICAgICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBBZGRyZXNzSXNaZXJvTWV0aG9kKSkgewotICAgICAgICAgICAgICBWYWx1ZSogVmFsID0gQ2FsbC5nZXRBcmd1bWVudCgwKTsKLSAgICAgICAgICAgICAgQ29uc3RhbnQqIE4gPSBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFZhbC0+Z2V0VHlwZSgpKTsKLSAgICAgICAgICAgICAgVmFsdWUqIFJlcyA9IG5ldyBJQ21wSW5zdChDSSwgSUNtcEluc3Q6OklDTVBfRVEsIFZhbCwgTiwgIiIpOwotICAgICAgICAgICAgICBSZXMgPSBuZXcgWkV4dEluc3QoUmVzLCBGQ3VyLT5nZXRSZXR1cm5UeXBlKCksICIiLCBDSSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgoUmVzKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIEFkZHJlc3NUb0xvbmdNZXRob2QpKSB7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwgPSBDYWxsLmdldEFyZ3VtZW50KDApOwotICAgICAgICAgICAgICBWYWwgPSBuZXcgUHRyVG9JbnRJbnN0KFZhbCwgVHlwZTo6Z2V0SW50NjRUeShDb250ZXh0KSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChWYWwpOwotICAgICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgQWRkcmVzc0Zyb21JbnRaZXJvRXh0ZW5kTWV0aG9kKSkgewotICAgICAgICAgICAgICBWYWx1ZSogVmFsID0gQ2FsbC5nZXRBcmd1bWVudCgwKTsKLSAgICAgICAgICAgICAgaWYgKHBvaW50ZXJTaXplVHlwZSAhPSBUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpKQotICAgICAgICAgICAgICAgIFZhbCA9IG5ldyBaRXh0SW5zdChWYWwsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgVmFsID0gbmV3IEludFRvUHRySW5zdChWYWwsIEZDdXItPmdldFJldHVyblR5cGUoKSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChWYWwpOwotICAgICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgQWRkcmVzc1RvSW50TWV0aG9kKSkgewotICAgICAgICAgICAgICBWYWx1ZSogVmFsID0gQ2FsbC5nZXRBcmd1bWVudCgwKTsKLSAgICAgICAgICAgICAgVmFsID0gbmV3IFB0clRvSW50SW5zdChWYWwsIFR5cGU6OmdldEludDMyVHkoQ29udGV4dCksICIiLCBDSSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgoVmFsKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWUgJXNcbiIsIG5hbWUpOwotICAgICAgICAgICAgICBhYm9ydCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgfSBlbHNlIGlmIChsZW4gPiBzdHJsZW4oRXh0ZW50Q2xhc3MpICYmIAotICAgICAgICAgICAgICAhbWVtY21wKEV4dGVudENsYXNzLCBuYW1lLCBzdHJsZW4oRXh0ZW50Q2xhc3MpKSkgewotICAgICAgICAgICAgCi0gICAgICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgbnVsbCBjaGVjawotICAgICAgICAgICAgaWYgKENhbGwuYXJnX2JlZ2luKCkgIT0gQ2FsbC5hcmdfZW5kKCkpIHsKLSAgICAgICAgICAgICAgcmVtb3ZlUG90ZW50aWFsTnVsbENoZWNrKEN1ciwgQ2FsbC5nZXRBcmd1bWVudCgwKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIEV4dGVudFRvV29yZE1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChDYWxsLmdldEFyZ3VtZW50KDApKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIEV4dGVudE1pbnVzRXh0ZW50TWV0aG9kKSkgewotICAgICAgICAgICAgICBWYWx1ZSogVmFsMSA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwyID0gQ2FsbC5nZXRBcmd1bWVudCgxKTsKLSAgICAgICAgICAgICAgVmFsMSA9IG5ldyBQdHJUb0ludEluc3QoVmFsMSwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWwyID0gbmV3IFB0clRvSW50SW5zdChWYWwyLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbHVlKiByZXMgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU3ViKFZhbDEsIFZhbDIsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIHJlcyA9IG5ldyBJbnRUb1B0ckluc3QocmVzLCBGQ3VyLT5nZXRSZXR1cm5UeXBlKCksICIiLCBDSSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgocmVzKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIEV4dGVudFBsdXNFeHRlbnRNZXRob2QpKSB7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwxID0gQ2FsbC5nZXRBcmd1bWVudCgwKTsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbDIgPSBDYWxsLmdldEFyZ3VtZW50KDEpOwotICAgICAgICAgICAgICBWYWwxID0gbmV3IFB0clRvSW50SW5zdChWYWwxLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbDIgPSBuZXcgUHRyVG9JbnRJbnN0KFZhbDIsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgVmFsdWUqIHJlcyA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBZGQoVmFsMSwgVmFsMiwgIiIsIENJKTsKLSAgICAgICAgICAgICAgcmVzID0gbmV3IEludFRvUHRySW5zdChyZXMsIEZDdXItPmdldFJldHVyblR5cGUoKSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChyZXMpOwotICAgICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgRXh0ZW50UGx1c0ludE1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbDEgPSBDYWxsLmdldEFyZ3VtZW50KDApOwotICAgICAgICAgICAgICBWYWx1ZSogVmFsMiA9IENhbGwuZ2V0QXJndW1lbnQoMSk7Ci0gICAgICAgICAgICAgIFZhbDEgPSBuZXcgUHRyVG9JbnRJbnN0KFZhbDEsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgaWYgKFZhbDItPmdldFR5cGUoKSAhPSBwb2ludGVyU2l6ZVR5cGUpCi0gICAgICAgICAgICAgICAgVmFsMiA9IG5ldyBaRXh0SW5zdChWYWwyLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbHVlKiByZXMgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQWRkKFZhbDEsIFZhbDIsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIHJlcyA9IG5ldyBJbnRUb1B0ckluc3QocmVzLCBGQ3VyLT5nZXRSZXR1cm5UeXBlKCksICIiLCBDSSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgocmVzKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIEV4dGVudE1pbnVzSW50TWV0aG9kKSkgewotICAgICAgICAgICAgICBWYWx1ZSogVmFsMSA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwyID0gQ2FsbC5nZXRBcmd1bWVudCgxKTsKLSAgICAgICAgICAgICAgVmFsMSA9IG5ldyBQdHJUb0ludEluc3QoVmFsMSwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBpZiAoVmFsMi0+Z2V0VHlwZSgpICE9IHBvaW50ZXJTaXplVHlwZSkKLSAgICAgICAgICAgICAgICBWYWwyID0gbmV3IFpFeHRJbnN0KFZhbDIsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgVmFsdWUqIHJlcyA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVTdWIoVmFsMSwgVmFsMiwgIiIsIENJKTsKLSAgICAgICAgICAgICAgcmVzID0gbmV3IEludFRvUHRySW5zdChyZXMsIEZDdXItPmdldFJldHVyblR5cGUoKSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChyZXMpOwotICAgICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgRXh0ZW50RnJvbUludFplcm9FeHRlbmRNZXRob2QpKSB7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwgPSBDYWxsLmdldEFyZ3VtZW50KDApOwotICAgICAgICAgICAgICBpZiAocG9pbnRlclNpemVUeXBlICE9IFR5cGU6OmdldEludDMyVHkoQ29udGV4dCkpCi0gICAgICAgICAgICAgICAgVmFsID0gbmV3IFpFeHRJbnN0KFZhbCwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWwgPSBuZXcgSW50VG9QdHJJbnN0KFZhbCwgRkN1ci0+Z2V0UmV0dXJuVHlwZSgpLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBDSS0+cmVwbGFjZUFsbFVzZXNXaXRoKFZhbCk7Ci0gICAgICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBFeHRlbnRGcm9tSW50U2lnbkV4dGVuZE1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbCA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIGlmIChwb2ludGVyU2l6ZVR5cGUgIT0gVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSkKLSAgICAgICAgICAgICAgICBWYWwgPSBuZXcgU0V4dEluc3QoVmFsLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbCA9IG5ldyBJbnRUb1B0ckluc3QoVmFsLCBGQ3VyLT5nZXRSZXR1cm5UeXBlKCksICIiLCBDSSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgoVmFsKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIEV4dGVudE9uZU1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgQ29uc3RhbnQqIE4gPSBDb25zdGFudEludDo6Z2V0KHBvaW50ZXJTaXplVHlwZSwgMSk7Ci0gICAgICAgICAgICAgIE4gPSBDb25zdGFudEV4cHI6OmdldEludFRvUHRyKE4sIEZDdXItPmdldFJldHVyblR5cGUoKSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgoTik7Ci0gICAgICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBFeHRlbnRORU1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbDEgPSBDYWxsLmdldEFyZ3VtZW50KDApOwotICAgICAgICAgICAgICBWYWx1ZSogVmFsMiA9IENhbGwuZ2V0QXJndW1lbnQoMSk7Ci0gICAgICAgICAgICAgIFZhbDEgPSBuZXcgUHRyVG9JbnRJbnN0KFZhbDEsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgVmFsMiA9IG5ldyBQdHJUb0ludEluc3QoVmFsMiwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWx1ZSogcmVzID0gbmV3IElDbXBJbnN0KENJLCBJQ21wSW5zdDo6SUNNUF9ORSwgVmFsMSwgVmFsMiwgIiIpOwotICAgICAgICAgICAgICByZXMgPSBuZXcgWkV4dEluc3QocmVzLCBGQ3VyLT5nZXRSZXR1cm5UeXBlKCksICIiLCBDSSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgocmVzKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIEV4dGVudEVRTWV0aG9kKSkgewotICAgICAgICAgICAgICBWYWx1ZSogVmFsMSA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwyID0gQ2FsbC5nZXRBcmd1bWVudCgxKTsKLSAgICAgICAgICAgICAgVmFsMSA9IG5ldyBQdHJUb0ludEluc3QoVmFsMSwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWwyID0gbmV3IFB0clRvSW50SW5zdChWYWwyLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbHVlKiByZXMgPSBuZXcgSUNtcEluc3QoQ0ksIElDbXBJbnN0OjpJQ01QX0VRLCBWYWwxLCBWYWwyLCAiIik7Ci0gICAgICAgICAgICAgIHJlcyA9IG5ldyBaRXh0SW5zdChyZXMsIEZDdXItPmdldFJldHVyblR5cGUoKSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChyZXMpOwotICAgICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgRXh0ZW50R1RNZXRob2QpKSB7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwxID0gQ2FsbC5nZXRBcmd1bWVudCgwKTsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbDIgPSBDYWxsLmdldEFyZ3VtZW50KDEpOwotICAgICAgICAgICAgICBWYWwxID0gbmV3IFB0clRvSW50SW5zdChWYWwxLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbDIgPSBuZXcgUHRyVG9JbnRJbnN0KFZhbDIsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgVmFsdWUqIHJlcyA9IG5ldyBJQ21wSW5zdChDSSwgSUNtcEluc3Q6OklDTVBfVUdULCBWYWwxLCBWYWwyLCAiIik7Ci0gICAgICAgICAgICAgIHJlcyA9IG5ldyBaRXh0SW5zdChyZXMsIEZDdXItPmdldFJldHVyblR5cGUoKSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChyZXMpOwotICAgICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgRXh0ZW50TFRNZXRob2QpKSB7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwxID0gQ2FsbC5nZXRBcmd1bWVudCgwKTsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbDIgPSBDYWxsLmdldEFyZ3VtZW50KDEpOwotICAgICAgICAgICAgICBWYWwxID0gbmV3IFB0clRvSW50SW5zdChWYWwxLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbDIgPSBuZXcgUHRyVG9JbnRJbnN0KFZhbDIsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgVmFsdWUqIHJlcyA9IG5ldyBJQ21wSW5zdChDSSwgSUNtcEluc3Q6OklDTVBfVUxULCBWYWwxLCBWYWwyLCAiIik7Ci0gICAgICAgICAgICAgIHJlcyA9IG5ldyBaRXh0SW5zdChyZXMsIEZDdXItPmdldFJldHVyblR5cGUoKSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChyZXMpOwotICAgICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgRXh0ZW50WmVyb01ldGhvZCkpIHsKLSAgICAgICAgICAgICAgQ29uc3RhbnQqIE4gPSBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEZDdXItPmdldFJldHVyblR5cGUoKSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgoTik7Ci0gICAgICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBFeHRlbnRUb0xvbmdNZXRob2QpKSB7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwgPSBDYWxsLmdldEFyZ3VtZW50KDApOwotICAgICAgICAgICAgICBWYWwgPSBuZXcgUHRyVG9JbnRJbnN0KFZhbCwgVHlwZTo6Z2V0SW50NjRUeShDb250ZXh0KSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChWYWwpOwotICAgICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgRXh0ZW50VG9JbnRNZXRob2QpKSB7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwgPSBDYWxsLmdldEFyZ3VtZW50KDApOwotICAgICAgICAgICAgICBWYWwgPSBuZXcgUHRyVG9JbnRJbnN0KFZhbCwgVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChWYWwpOwotICAgICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgRXh0ZW50TWF4TWV0aG9kKSkgewotICAgICAgICAgICAgICBDb25zdGFudEludCogTSA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50NjRUeShDb250ZXh0KSwgKHVpbnQ2NF90KS0xKTsKLSAgICAgICAgICAgICAgQ29uc3RhbnQqIE4gPSBDb25zdGFudEV4cHI6OmdldEludFRvUHRyKE0sIEZDdXItPmdldFJldHVyblR5cGUoKSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgoTik7Ci0gICAgICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lICVzXG4iLCBuYW1lKTsKLSAgICAgICAgICAgICAgYWJvcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgaWYgKGxlbiA+IHN0cmxlbihPZmZzZXRDbGFzcykgJiYgCi0gICAgICAgICAgICAgICFtZW1jbXAoT2Zmc2V0Q2xhc3MsIG5hbWUsIHN0cmxlbihPZmZzZXRDbGFzcykpKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIENoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBudWxsIGNoZWNrCi0gICAgICAgICAgICBpZiAoQ2FsbC5hcmdfYmVnaW4oKSAhPSBDYWxsLmFyZ19lbmQoKSkgewotICAgICAgICAgICAgICByZW1vdmVQb3RlbnRpYWxOdWxsQ2hlY2soQ3VyLCBDYWxsLmdldEFyZ3VtZW50KDApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgT2Zmc2V0U0xUTWV0aG9kKSkgewotICAgICAgICAgICAgICBWYWx1ZSogVmFsMSA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwyID0gQ2FsbC5nZXRBcmd1bWVudCgxKTsKLSAgICAgICAgICAgICAgVmFsMSA9IG5ldyBQdHJUb0ludEluc3QoVmFsMSwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWwyID0gbmV3IFB0clRvSW50SW5zdChWYWwyLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbHVlKiByZXMgPSBuZXcgSUNtcEluc3QoQ0ksIElDbXBJbnN0OjpJQ01QX1NMVCwgVmFsMSwgVmFsMiwgIiIpOwotICAgICAgICAgICAgICByZXMgPSBuZXcgWkV4dEluc3QocmVzLCBGQ3VyLT5nZXRSZXR1cm5UeXBlKCksICIiLCBDSSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgocmVzKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIE9mZnNldFRvV29yZE1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbCA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIFZhbCA9IG5ldyBCaXRDYXN0SW5zdChWYWwsIEZDdXItPmdldFJldHVyblR5cGUoKSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChWYWwpOwotICAgICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgT2Zmc2V0WmVyb01ldGhvZCkpIHsKLSAgICAgICAgICAgICAgQ29uc3RhbnQqIE4gPSBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEZDdXItPmdldFJldHVyblR5cGUoKSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgoTik7Ci0gICAgICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBPZmZzZXRTR1RNZXRob2QpKSB7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwxID0gQ2FsbC5nZXRBcmd1bWVudCgwKTsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbDIgPSBDYWxsLmdldEFyZ3VtZW50KDEpOwotICAgICAgICAgICAgICBWYWwxID0gbmV3IFB0clRvSW50SW5zdChWYWwxLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbDIgPSBuZXcgUHRyVG9JbnRJbnN0KFZhbDIsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgVmFsdWUqIHJlcyA9IG5ldyBJQ21wSW5zdChDSSwgSUNtcEluc3Q6OklDTVBfU0dULCBWYWwxLCBWYWwyLCAiIik7Ci0gICAgICAgICAgICAgIHJlcyA9IG5ldyBaRXh0SW5zdChyZXMsIEZDdXItPmdldFJldHVyblR5cGUoKSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChyZXMpOwotICAgICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgT2Zmc2V0U0dFTWV0aG9kKSkgewotICAgICAgICAgICAgICBWYWx1ZSogVmFsMSA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwyID0gQ2FsbC5nZXRBcmd1bWVudCgxKTsKLSAgICAgICAgICAgICAgVmFsMSA9IG5ldyBQdHJUb0ludEluc3QoVmFsMSwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWwyID0gbmV3IFB0clRvSW50SW5zdChWYWwyLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbHVlKiByZXMgPSBuZXcgSUNtcEluc3QoQ0ksIElDbXBJbnN0OjpJQ01QX1NHRSwgVmFsMSwgVmFsMiwgIiIpOwotICAgICAgICAgICAgICByZXMgPSBuZXcgWkV4dEluc3QocmVzLCBGQ3VyLT5nZXRSZXR1cm5UeXBlKCksICIiLCBDSSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgocmVzKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIE9mZnNldFNMRU1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbDEgPSBDYWxsLmdldEFyZ3VtZW50KDApOwotICAgICAgICAgICAgICBWYWx1ZSogVmFsMiA9IENhbGwuZ2V0QXJndW1lbnQoMSk7Ci0gICAgICAgICAgICAgIFZhbDEgPSBuZXcgUHRyVG9JbnRJbnN0KFZhbDEsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgVmFsMiA9IG5ldyBQdHJUb0ludEluc3QoVmFsMiwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWx1ZSogcmVzID0gbmV3IElDbXBJbnN0KENJLCBJQ21wSW5zdDo6SUNNUF9TTEUsIFZhbDEsIFZhbDIsICIiKTsKLSAgICAgICAgICAgICAgcmVzID0gbmV3IFpFeHRJbnN0KHJlcywgRkN1ci0+Z2V0UmV0dXJuVHlwZSgpLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBDSS0+cmVwbGFjZUFsbFVzZXNXaXRoKHJlcyk7Ci0gICAgICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBPZmZzZXRFUU1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbDEgPSBDYWxsLmdldEFyZ3VtZW50KDApOwotICAgICAgICAgICAgICBWYWx1ZSogVmFsMiA9IENhbGwuZ2V0QXJndW1lbnQoMSk7Ci0gICAgICAgICAgICAgIFZhbDEgPSBuZXcgUHRyVG9JbnRJbnN0KFZhbDEsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgVmFsMiA9IG5ldyBQdHJUb0ludEluc3QoVmFsMiwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWx1ZSogcmVzID0gbmV3IElDbXBJbnN0KENJLCBJQ21wSW5zdDo6SUNNUF9FUSwgVmFsMSwgVmFsMiwgIiIpOwotICAgICAgICAgICAgICByZXMgPSBuZXcgWkV4dEluc3QocmVzLCBGQ3VyLT5nZXRSZXR1cm5UeXBlKCksICIiLCBDSSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgocmVzKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIE9mZnNldEZyb21JbnRTaWduRXh0ZW5kTWV0aG9kKSkgewotICAgICAgICAgICAgICBWYWx1ZSogVmFsID0gQ2FsbC5nZXRBcmd1bWVudCgwKTsKLSAgICAgICAgICAgICAgaWYgKHBvaW50ZXJTaXplVHlwZSAhPSBUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpKQotICAgICAgICAgICAgICAgIFZhbCA9IG5ldyBTRXh0SW5zdChWYWwsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgVmFsID0gbmV3IEludFRvUHRySW5zdChWYWwsIEZDdXItPmdldFJldHVyblR5cGUoKSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChWYWwpOwotICAgICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgT2Zmc2V0RnJvbUludFplcm9FeHRlbmRNZXRob2QpKSB7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwgPSBDYWxsLmdldEFyZ3VtZW50KDApOwotICAgICAgICAgICAgICBpZiAocG9pbnRlclNpemVUeXBlICE9IFR5cGU6OmdldEludDMyVHkoQ29udGV4dCkpCi0gICAgICAgICAgICAgICAgVmFsID0gbmV3IFpFeHRJbnN0KFZhbCwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWwgPSBuZXcgSW50VG9QdHJJbnN0KFZhbCwgRkN1ci0+Z2V0UmV0dXJuVHlwZSgpLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBDSS0+cmVwbGFjZUFsbFVzZXNXaXRoKFZhbCk7Ci0gICAgICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBPZmZzZXRQbHVzSW50TWV0aG9kKSkgewotICAgICAgICAgICAgICBWYWx1ZSogVmFsMSA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwyID0gQ2FsbC5nZXRBcmd1bWVudCgxKTsKLSAgICAgICAgICAgICAgVmFsMSA9IG5ldyBQdHJUb0ludEluc3QoVmFsMSwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBpZiAoVmFsMi0+Z2V0VHlwZSgpICE9IHBvaW50ZXJTaXplVHlwZSkKLSAgICAgICAgICAgICAgICBWYWwyID0gbmV3IFpFeHRJbnN0KFZhbDIsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgVmFsdWUqIHJlcyA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBZGQoVmFsMSwgVmFsMiwgIiIsIENJKTsKLSAgICAgICAgICAgICAgcmVzID0gbmV3IEludFRvUHRySW5zdChyZXMsIEZDdXItPmdldFJldHVyblR5cGUoKSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChyZXMpOwotICAgICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgT2Zmc2V0VG9JbnRNZXRob2QpKSB7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwgPSBDYWxsLmdldEFyZ3VtZW50KDApOwotICAgICAgICAgICAgICBWYWwgPSBuZXcgUHRyVG9JbnRJbnN0KFZhbCwgVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChWYWwpOwotICAgICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgT2Zmc2V0VG9Mb25nTWV0aG9kKSkgewotICAgICAgICAgICAgICBWYWx1ZSogVmFsID0gQ2FsbC5nZXRBcmd1bWVudCgwKTsKLSAgICAgICAgICAgICAgVmFsID0gbmV3IFB0clRvSW50SW5zdChWYWwsIFR5cGU6OmdldEludDY0VHkoQ29udGV4dCksICIiLCBDSSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgoVmFsKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIE9mZnNldElzWmVyb01ldGhvZCkpIHsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbCA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIENvbnN0YW50KiBOID0gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShWYWwtPmdldFR5cGUoKSk7Ci0gICAgICAgICAgICAgIFZhbHVlKiBSZXMgPSBuZXcgSUNtcEluc3QoQ0ksIElDbXBJbnN0OjpJQ01QX0VRLCBWYWwsIE4sICIiKTsKLSAgICAgICAgICAgICAgUmVzID0gbmV3IFpFeHRJbnN0KFJlcywgRkN1ci0+Z2V0UmV0dXJuVHlwZSgpLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBDSS0+cmVwbGFjZUFsbFVzZXNXaXRoKFJlcyk7Ci0gICAgICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBPZmZzZXRNaW51c0ludE1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbDEgPSBDYWxsLmdldEFyZ3VtZW50KDApOwotICAgICAgICAgICAgICBWYWx1ZSogVmFsMiA9IENhbGwuZ2V0QXJndW1lbnQoMSk7Ci0gICAgICAgICAgICAgIFZhbDEgPSBuZXcgUHRyVG9JbnRJbnN0KFZhbDEsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgaWYgKFZhbDItPmdldFR5cGUoKSAhPSBwb2ludGVyU2l6ZVR5cGUpCi0gICAgICAgICAgICAgICAgVmFsMiA9IG5ldyBaRXh0SW5zdChWYWwyLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbHVlKiByZXMgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU3ViKFZhbDEsIFZhbDIsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIHJlcyA9IG5ldyBJbnRUb1B0ckluc3QocmVzLCBGQ3VyLT5nZXRSZXR1cm5UeXBlKCksICIiLCBDSSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgocmVzKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIE9mZnNldE1pbnVzT2Zmc2V0TWV0aG9kKSkgewotICAgICAgICAgICAgICBWYWx1ZSogVmFsMSA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwyID0gQ2FsbC5nZXRBcmd1bWVudCgxKTsKLSAgICAgICAgICAgICAgVmFsMSA9IG5ldyBQdHJUb0ludEluc3QoVmFsMSwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWwyID0gbmV3IFB0clRvSW50SW5zdChWYWwyLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbHVlKiByZXMgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU3ViKFZhbDEsIFZhbDIsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIHJlcyA9IG5ldyBJbnRUb1B0ckluc3QocmVzLCBGQ3VyLT5nZXRSZXR1cm5UeXBlKCksICIiLCBDSSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgocmVzKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbXBsZW1lbnQgbWUgJXNcbiIsIG5hbWUpOwotICAgICAgICAgICAgICBhYm9ydCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSBpZiAobGVuID4gc3RybGVuKE9iamVjdFJlZmVyZW5jZUNsYXNzKSAmJiAKLSAgICAgICAgICAgICFtZW1jbXAoT2JqZWN0UmVmZXJlbmNlQ2xhc3MsIG5hbWUsIHN0cmxlbihPYmplY3RSZWZlcmVuY2VDbGFzcykpKSB7Ci0gICAgICAgICAgIAotICAgICAgICAgICAgQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG51bGwgY2hlY2sKLSAgICAgICAgICAgIGlmIChDYWxsLmFyZ19iZWdpbigpICE9IENhbGwuYXJnX2VuZCgpKSB7Ci0gICAgICAgICAgICAgIHJlbW92ZVBvdGVudGlhbE51bGxDaGVjayhDdXIsIENhbGwuZ2V0QXJndW1lbnQoMCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBPYmplY3RSZWZlcmVuY2VOdWxsUmVmZXJlbmNlTWV0aG9kKSkgewotICAgICAgICAgICAgICBDb25zdGFudCogTiA9IENvbnN0YW50OjpnZXROdWxsVmFsdWUoRkN1ci0+Z2V0UmV0dXJuVHlwZSgpKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChOKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIE9iamVjdFJlZmVyZW5jZUZyb21PYmplY3RNZXRob2QpKSB7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwgPSBDYWxsLmdldEFyZ3VtZW50KDApOwotICAgICAgICAgICAgICBWYWwgPSBuZXcgQml0Q2FzdEluc3QoVmFsLCBGQ3VyLT5nZXRSZXR1cm5UeXBlKCksICIiLCBDSSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgoVmFsKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIE9iamVjdFJlZmVyZW5jZVRvQWRkcmVzc01ldGhvZCkpIHsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbCA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIFZhbCA9IG5ldyBCaXRDYXN0SW5zdChWYWwsIEZDdXItPmdldFJldHVyblR5cGUoKSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChWYWwpOwotICAgICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgT2JqZWN0UmVmZXJlbmNlVG9PYmplY3RNZXRob2QpKSB7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwgPSBDYWxsLmdldEFyZ3VtZW50KDApOwotICAgICAgICAgICAgICBWYWwgPSBuZXcgQml0Q2FzdEluc3QoVmFsLCBGQ3VyLT5nZXRSZXR1cm5UeXBlKCksICIiLCBDSSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgoVmFsKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIE9iamVjdFJlZmVyZW5jZUlzTnVsbE1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbCA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIENvbnN0YW50KiBOID0gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShWYWwtPmdldFR5cGUoKSk7Ci0gICAgICAgICAgICAgIFZhbHVlKiBSZXMgPSBuZXcgSUNtcEluc3QoQ0ksIElDbXBJbnN0OjpJQ01QX0VRLCBWYWwsIE4sICIiKTsKLSAgICAgICAgICAgICAgUmVzID0gbmV3IFpFeHRJbnN0KFJlcywgRkN1ci0+Z2V0UmV0dXJuVHlwZSgpLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBDSS0+cmVwbGFjZUFsbFVzZXNXaXRoKFJlcyk7Ci0gICAgICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lICVzXG4iLCBuYW1lKTsKLSAgICAgICAgICAgICAgYWJvcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgaWYgKGxlbiA+IHN0cmxlbihXb3JkQ2xhc3MpICYmIAotICAgICAgICAgICAgICAhbWVtY21wKFdvcmRDbGFzcywgbmFtZSwgc3RybGVuKFdvcmRDbGFzcykpKSB7Ci0gICAgICAgICAgIAotICAgICAgICAgICAgQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG51bGwgY2hlY2sKLSAgICAgICAgICAgIGlmIChDYWxsLmFyZ19iZWdpbigpICE9IENhbGwuYXJnX2VuZCgpKSB7Ci0gICAgICAgICAgICAgIHJlbW92ZVBvdGVudGlhbE51bGxDaGVjayhDdXIsIENhbGwuZ2V0QXJndW1lbnQoMCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgV29yZE9yTWV0aG9kKSkgewotICAgICAgICAgICAgICBWYWx1ZSogVmFsMSA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwyID0gQ2FsbC5nZXRBcmd1bWVudCgxKTsKLSAgICAgICAgICAgICAgVmFsMSA9IG5ldyBQdHJUb0ludEluc3QoVmFsMSwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWwyID0gbmV3IFB0clRvSW50SW5zdChWYWwyLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbHVlKiBSZXMgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlT3IoVmFsMSwgVmFsMiwgIiIsIENJKTsKLSAgICAgICAgICAgICAgUmVzID0gbmV3IEludFRvUHRySW5zdChSZXMsIEZDdXItPmdldFJldHVyblR5cGUoKSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChSZXMpOwotICAgICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgV29yZEFuZE1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbDEgPSBDYWxsLmdldEFyZ3VtZW50KDApOwotICAgICAgICAgICAgICBWYWx1ZSogVmFsMiA9IENhbGwuZ2V0QXJndW1lbnQoMSk7Ci0gICAgICAgICAgICAgIFZhbDEgPSBuZXcgUHRyVG9JbnRJbnN0KFZhbDEsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgVmFsMiA9IG5ldyBQdHJUb0ludEluc3QoVmFsMiwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWx1ZSogUmVzID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFuZChWYWwxLCBWYWwyLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBSZXMgPSBuZXcgSW50VG9QdHJJbnN0KFJlcywgRkN1ci0+Z2V0UmV0dXJuVHlwZSgpLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBDSS0+cmVwbGFjZUFsbFVzZXNXaXRoKFJlcyk7Ci0gICAgICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBXb3JkWG9yTWV0aG9kKSkgewotICAgICAgICAgICAgICBWYWx1ZSogVmFsMSA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwyID0gQ2FsbC5nZXRBcmd1bWVudCgxKTsKLSAgICAgICAgICAgICAgVmFsMSA9IG5ldyBQdHJUb0ludEluc3QoVmFsMSwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWwyID0gbmV3IFB0clRvSW50SW5zdChWYWwyLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbHVlKiBSZXMgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlWG9yKFZhbDEsIFZhbDIsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFJlcyA9IG5ldyBJbnRUb1B0ckluc3QoUmVzLCBGQ3VyLT5nZXRSZXR1cm5UeXBlKCksICIiLCBDSSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgoUmVzKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIFdvcmRSc2hsTWV0aG9kKSkgewotICAgICAgICAgICAgICBWYWx1ZSogVmFsMSA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwyID0gQ2FsbC5nZXRBcmd1bWVudCgxKTsKLSAgICAgICAgICAgICAgVmFsMSA9IG5ldyBQdHJUb0ludEluc3QoVmFsMSwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBpZiAoVmFsMi0+Z2V0VHlwZSgpICE9IHBvaW50ZXJTaXplVHlwZSkKLSAgICAgICAgICAgICAgICBWYWwyID0gbmV3IFpFeHRJbnN0KFZhbDIsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgVmFsdWUqIFJlcyA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVMU2hyKFZhbDEsIFZhbDIsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFJlcyA9IG5ldyBJbnRUb1B0ckluc3QoUmVzLCBGQ3VyLT5nZXRSZXR1cm5UeXBlKCksICIiLCBDSSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgoUmVzKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIFdvcmRMc2hNZXRob2QpKSB7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwxID0gQ2FsbC5nZXRBcmd1bWVudCgwKTsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbDIgPSBDYWxsLmdldEFyZ3VtZW50KDEpOwotICAgICAgICAgICAgICBWYWwxID0gbmV3IFB0clRvSW50SW5zdChWYWwxLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIGlmIChWYWwyLT5nZXRUeXBlKCkgIT0gcG9pbnRlclNpemVUeXBlKQotICAgICAgICAgICAgICAgIFZhbDIgPSBuZXcgWkV4dEluc3QoVmFsMiwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWx1ZSogUmVzID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVNobChWYWwxLCBWYWwyLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBSZXMgPSBuZXcgSW50VG9QdHJJbnN0KFJlcywgRkN1ci0+Z2V0UmV0dXJuVHlwZSgpLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBDSS0+cmVwbGFjZUFsbFVzZXNXaXRoKFJlcyk7Ci0gICAgICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBXb3JkVG9JbnRNZXRob2QpKSB7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwgPSBDYWxsLmdldEFyZ3VtZW50KDApOwotICAgICAgICAgICAgICBWYWwgPSBuZXcgUHRyVG9JbnRJbnN0KFZhbCwgVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChWYWwpOwotICAgICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgV29yZE5vdE1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbCA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIFZhbCA9IG5ldyBQdHJUb0ludEluc3QoVmFsLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIENvbnN0YW50KiBNMSA9IENvbnN0YW50SW50OjpnZXQocG9pbnRlclNpemVUeXBlLCAtMSk7Ci0gICAgICAgICAgICAgIFZhbHVlKiBSZXMgPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlWG9yKFZhbCwgTTEsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFJlcyA9IG5ldyBJbnRUb1B0ckluc3QoUmVzLCBGQ3VyLT5nZXRSZXR1cm5UeXBlKCksICIiLCBDSSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgoUmVzKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIFdvcmRaZXJvTWV0aG9kKSkgewotICAgICAgICAgICAgICBDb25zdGFudCogTiA9IENvbnN0YW50OjpnZXROdWxsVmFsdWUoRkN1ci0+Z2V0UmV0dXJuVHlwZSgpKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChOKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIFdvcmRPbmVNZXRob2QpKSB7Ci0gICAgICAgICAgICAgIENvbnN0YW50KiBOID0gQ29uc3RhbnRJbnQ6OmdldChwb2ludGVyU2l6ZVR5cGUsIDEpOwotICAgICAgICAgICAgICBOID0gQ29uc3RhbnRFeHByOjpnZXRJbnRUb1B0cihOLCBGQ3VyLT5nZXRSZXR1cm5UeXBlKCkpOwotICAgICAgICAgICAgICBDSS0+cmVwbGFjZUFsbFVzZXNXaXRoKE4pOwotICAgICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgV29yZFRvQWRkcmVzc01ldGhvZCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBXb3JkVG9PZmZzZXRNZXRob2QpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgV29yZFRvRXh0ZW50TWV0aG9kKSkgewotICAgICAgICAgICAgICBWYWx1ZSogVmFsID0gQ2FsbC5nZXRBcmd1bWVudCgwKTsKLSAgICAgICAgICAgICAgVmFsID0gbmV3IEJpdENhc3RJbnN0KFZhbCwgRkN1ci0+Z2V0UmV0dXJuVHlwZSgpLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBDSS0+cmVwbGFjZUFsbFVzZXNXaXRoKFZhbCk7Ci0gICAgICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBXb3JkTWludXNXb3JkTWV0aG9kKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIFdvcmRNaW51c0V4dGVudE1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbDEgPSBDYWxsLmdldEFyZ3VtZW50KDApOwotICAgICAgICAgICAgICBWYWx1ZSogVmFsMiA9IENhbGwuZ2V0QXJndW1lbnQoMSk7Ci0gICAgICAgICAgICAgIFZhbDEgPSBuZXcgUHRyVG9JbnRJbnN0KFZhbDEsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgVmFsMiA9IG5ldyBQdHJUb0ludEluc3QoVmFsMiwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWx1ZSogcmVzID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVN1YihWYWwxLCBWYWwyLCAiIiwgQ0kpOwotICAgICAgICAgICAgICByZXMgPSBuZXcgSW50VG9QdHJJbnN0KHJlcywgRkN1ci0+Z2V0UmV0dXJuVHlwZSgpLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBDSS0+cmVwbGFjZUFsbFVzZXNXaXRoKHJlcyk7Ci0gICAgICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBXb3JkUGx1c1dvcmRNZXRob2QpKSB7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwxID0gQ2FsbC5nZXRBcmd1bWVudCgwKTsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbDIgPSBDYWxsLmdldEFyZ3VtZW50KDEpOwotICAgICAgICAgICAgICBWYWwxID0gbmV3IFB0clRvSW50SW5zdChWYWwxLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbDIgPSBuZXcgUHRyVG9JbnRJbnN0KFZhbDIsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgVmFsdWUqIHJlcyA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBZGQoVmFsMSwgVmFsMiwgIiIsIENJKTsKLSAgICAgICAgICAgICAgcmVzID0gbmV3IEludFRvUHRySW5zdChyZXMsIEZDdXItPmdldFJldHVyblR5cGUoKSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChyZXMpOwotICAgICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgV29yZExUTWV0aG9kKSkgewotICAgICAgICAgICAgICBWYWx1ZSogVmFsMSA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwyID0gQ2FsbC5nZXRBcmd1bWVudCgxKTsKLSAgICAgICAgICAgICAgVmFsMSA9IG5ldyBQdHJUb0ludEluc3QoVmFsMSwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWwyID0gbmV3IFB0clRvSW50SW5zdChWYWwyLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbHVlKiByZXMgPSBuZXcgSUNtcEluc3QoQ0ksIElDbXBJbnN0OjpJQ01QX1VMVCwgVmFsMSwgVmFsMiwgIiIpOwotICAgICAgICAgICAgICByZXMgPSBuZXcgWkV4dEluc3QocmVzLCBGQ3VyLT5nZXRSZXR1cm5UeXBlKCksICIiLCBDSSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgocmVzKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIFdvcmRMRU1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbDEgPSBDYWxsLmdldEFyZ3VtZW50KDApOwotICAgICAgICAgICAgICBWYWx1ZSogVmFsMiA9IENhbGwuZ2V0QXJndW1lbnQoMSk7Ci0gICAgICAgICAgICAgIFZhbDEgPSBuZXcgUHRyVG9JbnRJbnN0KFZhbDEsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgVmFsMiA9IG5ldyBQdHJUb0ludEluc3QoVmFsMiwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWx1ZSogcmVzID0gbmV3IElDbXBJbnN0KENJLCBJQ21wSW5zdDo6SUNNUF9VTEUsIFZhbDEsIFZhbDIsICIiKTsKLSAgICAgICAgICAgICAgcmVzID0gbmV3IFpFeHRJbnN0KHJlcywgRkN1ci0+Z2V0UmV0dXJuVHlwZSgpLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBDSS0+cmVwbGFjZUFsbFVzZXNXaXRoKHJlcyk7Ci0gICAgICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBXb3JkR0VNZXRob2QpKSB7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwxID0gQ2FsbC5nZXRBcmd1bWVudCgwKTsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbDIgPSBDYWxsLmdldEFyZ3VtZW50KDEpOwotICAgICAgICAgICAgICBWYWwxID0gbmV3IFB0clRvSW50SW5zdChWYWwxLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbDIgPSBuZXcgUHRyVG9JbnRJbnN0KFZhbDIsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgVmFsdWUqIHJlcyA9IG5ldyBJQ21wSW5zdChDSSwgSUNtcEluc3Q6OklDTVBfVUdFLCBWYWwxLCBWYWwyLCAiIik7Ci0gICAgICAgICAgICAgIHJlcyA9IG5ldyBaRXh0SW5zdChyZXMsIEZDdXItPmdldFJldHVyblR5cGUoKSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChyZXMpOwotICAgICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgV29yZEVRTWV0aG9kKSkgewotICAgICAgICAgICAgICBWYWx1ZSogVmFsMSA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwyID0gQ2FsbC5nZXRBcmd1bWVudCgxKTsKLSAgICAgICAgICAgICAgVmFsMSA9IG5ldyBQdHJUb0ludEluc3QoVmFsMSwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWwyID0gbmV3IFB0clRvSW50SW5zdChWYWwyLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbHVlKiByZXMgPSBuZXcgSUNtcEluc3QoQ0ksIElDbXBJbnN0OjpJQ01QX0VRLCBWYWwxLCBWYWwyLCAiIik7Ci0gICAgICAgICAgICAgIHJlcyA9IG5ldyBaRXh0SW5zdChyZXMsIEZDdXItPmdldFJldHVyblR5cGUoKSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChyZXMpOwotICAgICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgV29yZEdUTWV0aG9kKSkgewotICAgICAgICAgICAgICBWYWx1ZSogVmFsMSA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwyID0gQ2FsbC5nZXRBcmd1bWVudCgxKTsKLSAgICAgICAgICAgICAgVmFsMSA9IG5ldyBQdHJUb0ludEluc3QoVmFsMSwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWwyID0gbmV3IFB0clRvSW50SW5zdChWYWwyLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbHVlKiByZXMgPSBuZXcgSUNtcEluc3QoQ0ksIElDbXBJbnN0OjpJQ01QX1VHVCwgVmFsMSwgVmFsMiwgIiIpOwotICAgICAgICAgICAgICByZXMgPSBuZXcgWkV4dEluc3QocmVzLCBGQ3VyLT5nZXRSZXR1cm5UeXBlKCksICIiLCBDSSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgocmVzKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIFdvcmRORU1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbDEgPSBDYWxsLmdldEFyZ3VtZW50KDApOwotICAgICAgICAgICAgICBWYWx1ZSogVmFsMiA9IENhbGwuZ2V0QXJndW1lbnQoMSk7Ci0gICAgICAgICAgICAgIFZhbDEgPSBuZXcgUHRyVG9JbnRJbnN0KFZhbDEsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgVmFsMiA9IG5ldyBQdHJUb0ludEluc3QoVmFsMiwgcG9pbnRlclNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWx1ZSogcmVzID0gbmV3IElDbXBJbnN0KENJLCBJQ21wSW5zdDo6SUNNUF9ORSwgVmFsMSwgVmFsMiwgIiIpOwotICAgICAgICAgICAgICByZXMgPSBuZXcgWkV4dEluc3QocmVzLCBGQ3VyLT5nZXRSZXR1cm5UeXBlKCksICIiLCBDSSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgocmVzKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIFdvcmRGcm9tSW50U2lnbkV4dGVuZE1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbCA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIGlmIChwb2ludGVyU2l6ZVR5cGUgIT0gVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSkKLSAgICAgICAgICAgICAgICBWYWwgPSBuZXcgU0V4dEluc3QoVmFsLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbCA9IG5ldyBJbnRUb1B0ckluc3QoVmFsLCBGQ3VyLT5nZXRSZXR1cm5UeXBlKCksICIiLCBDSSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgoVmFsKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIFdvcmRGcm9tSW50WmVyb0V4dGVuZE1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbCA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIGlmIChwb2ludGVyU2l6ZVR5cGUgIT0gVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSkKLSAgICAgICAgICAgICAgICBWYWwgPSBuZXcgWkV4dEluc3QoVmFsLCBwb2ludGVyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbCA9IG5ldyBJbnRUb1B0ckluc3QoVmFsLCBGQ3VyLT5nZXRSZXR1cm5UeXBlKCksICIiLCBDSSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgoVmFsKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIFdvcmRJc1plcm9NZXRob2QpKSB7Ci0gICAgICAgICAgICAgIFZhbHVlKiBWYWwgPSBDYWxsLmdldEFyZ3VtZW50KDApOwotICAgICAgICAgICAgICBDb25zdGFudCogTiA9IENvbnN0YW50OjpnZXROdWxsVmFsdWUoVmFsLT5nZXRUeXBlKCkpOwotICAgICAgICAgICAgICBWYWx1ZSogUmVzID0gbmV3IElDbXBJbnN0KENJLCBJQ21wSW5zdDo6SUNNUF9FUSwgVmFsLCBOLCAiIik7Ci0gICAgICAgICAgICAgIFJlcyA9IG5ldyBaRXh0SW5zdChSZXMsIEZDdXItPmdldFJldHVyblR5cGUoKSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChSZXMpOwotICAgICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgV29yZFRvTG9uZ01ldGhvZCkpIHsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbCA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIFZhbCA9IG5ldyBQdHJUb0ludEluc3QoVmFsLCBUeXBlOjpnZXRJbnQ2NFR5KENvbnRleHQpLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBDSS0+cmVwbGFjZUFsbFVzZXNXaXRoKFZhbCk7Ci0gICAgICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBXb3JkTWF4TWV0aG9kKSkgewotICAgICAgICAgICAgICBDb25zdGFudEludCogTSA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50NjRUeShDb250ZXh0KSwgKHVpbnQ2NF90KS0xKTsKLSAgICAgICAgICAgICAgQ29uc3RhbnQqIE4gPSBDb25zdGFudEV4cHI6OmdldEludFRvUHRyKE0sIEZDdXItPmdldFJldHVyblR5cGUoKSk7Ci0gICAgICAgICAgICAgIENJLT5yZXBsYWNlQWxsVXNlc1dpdGgoTik7Ci0gICAgICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW1wbGVtZW50IG1lICVzXG4iLCBuYW1lKTsKLSAgICAgICAgICAgICAgYWJvcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgaWYgKAotICAgICAgICAgICAgICAobGVuID4gc3RybGVuKEFkZHJlc3NBcnJheUNsYXNzKSAmJiAKLSAgICAgICAgICAgICAgICFtZW1jbXAoQWRkcmVzc0FycmF5Q2xhc3MsIG5hbWUsIHN0cmxlbihBZGRyZXNzQXJyYXlDbGFzcykpKSB8fAotICAgICAgICAgICAgICAobGVuID4gc3RybGVuKE9mZnNldEFycmF5Q2xhc3MpICYmIAotICAgICAgICAgICAgICAgIW1lbWNtcChPZmZzZXRBcnJheUNsYXNzLCBuYW1lLCBzdHJsZW4oT2Zmc2V0QXJyYXlDbGFzcykpKSB8fAotICAgICAgICAgICAgICAobGVuID4gc3RybGVuKFdvcmRBcnJheUNsYXNzKSAmJiAKLSAgICAgICAgICAgICAgICFtZW1jbXAoV29yZEFycmF5Q2xhc3MsIG5hbWUsIHN0cmxlbihXb3JkQXJyYXlDbGFzcykpKSB8fAotICAgICAgICAgICAgICAobGVuID4gc3RybGVuKE9iamVjdFJlZmVyZW5jZUFycmF5Q2xhc3MpICYmIAotICAgICAgICAgICAgICAgIW1lbWNtcChPYmplY3RSZWZlcmVuY2VBcnJheUNsYXNzLCBuYW1lLCBzdHJsZW4oT2JqZWN0UmVmZXJlbmNlQXJyYXlDbGFzcykpKSB8fAotICAgICAgICAgICAgICAobGVuID4gc3RybGVuKEV4dGVudEFycmF5Q2xhc3MpICYmIAotICAgICAgICAgICAgICAgIW1lbWNtcChFeHRlbnRBcnJheUNsYXNzLCBuYW1lLCBzdHJsZW4oRXh0ZW50QXJyYXlDbGFzcykpKSkgewotICAgICAgICAgICAgQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIEFkZHJlc3NBcnJheUNyZWF0ZU1ldGhvZCkgfHwKLSAgICAgICAgICAgICAgICAhc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIE9mZnNldEFycmF5Q3JlYXRlTWV0aG9kKSB8fAotICAgICAgICAgICAgICAgICFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgV29yZEFycmF5Q3JlYXRlTWV0aG9kKSB8fAotICAgICAgICAgICAgICAgICFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgRXh0ZW50QXJyYXlDcmVhdGVNZXRob2QpIHx8Ci0gICAgICAgICAgICAgICAgIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBPYmplY3RSZWZlcmVuY2VBcnJheUNyZWF0ZU1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgVmFsdWUqIFZhbCA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIENvbnN0YW50SW50KiBPbmUgPSBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoQ29udGV4dCksICh1aW50NjRfdCkxKTsKLSAgICAgICAgICAgICAgVmFsdWUqIExlbmd0aCA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBZGQoVmFsLCBPbmUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIExlbmd0aCA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVTaGwoTGVuZ3RoLCBjb25zdGFudFB0ckxvZ1NpemUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbCA9IG5ldyBJbnRUb1B0ckluc3QoVmFsLCBwdHJUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWx1ZSogYXJnc1syXSA9IHsgTGVuZ3RoLCBWYWwgfTsKLSAgICAgICAgICAgICAgVmFsdWUqIHJlcyA9IENhbGxJbnN0OjpDcmVhdGUoTU1hbGxvYywgYXJncywgYXJncyArIDIsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIHJlcyA9IG5ldyBCaXRDYXN0SW5zdChyZXMsIEZDdXItPmdldFJldHVyblR5cGUoKSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChyZXMpOwotICAgICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBBZGRyZXNzQXJyYXlHZXRNZXRob2QpIHx8Ci0gICAgICAgICAgICAgICAgIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBPZmZzZXRBcnJheUdldE1ldGhvZCkgfHwKLSAgICAgICAgICAgICAgICAhc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIFdvcmRBcnJheUdldE1ldGhvZCkgfHwKLSAgICAgICAgICAgICAgICAhc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIEV4dGVudEFycmF5R2V0TWV0aG9kKSB8fAotICAgICAgICAgICAgICAgICFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgT2JqZWN0UmVmZXJlbmNlQXJyYXlHZXRNZXRob2QpKSB7Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBWYWx1ZSogQXJyYXkgPSBDYWxsLmdldEFyZ3VtZW50KDApOwotICAgICAgICAgICAgICBWYWx1ZSogSW5kZXggPSBDYWxsLmdldEFyZ3VtZW50KDEpOwotICAgICAgICAgICAgICBDb25zdGFudEludCogT25lID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLCAodWludDY0X3QpMSk7Ci0gICAgICAgICAgICAgIEluZGV4ID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUFkZChJbmRleCwgT25lLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBBcnJheSA9IG5ldyBCaXRDYXN0SW5zdChBcnJheSwgcHRyU2l6ZVR5cGUsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIFZhbHVlKiByZXMgPSBHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlKEFycmF5LCBJbmRleCwgIiIsIENJKTsKLSAgICAgICAgICAgICAgcmVzID0gbmV3IExvYWRJbnN0KHJlcywgIiIsIENJKTsKLSAgICAgICAgICAgICAgcmVzID0gbmV3IEludFRvUHRySW5zdChyZXMsIEZDdXItPmdldFJldHVyblR5cGUoKSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgQ0ktPnJlcGxhY2VBbGxVc2VzV2l0aChyZXMpOwotICAgICAgICAgICAgICBDSS0+ZXJhc2VGcm9tUGFyZW50KCk7IAotICAgICAgICAgICAgCi0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgQWRkcmVzc0FycmF5U2V0TWV0aG9kKSB8fAotICAgICAgICAgICAgICAgICFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgT2Zmc2V0QXJyYXlTZXRNZXRob2QpIHx8Ci0gICAgICAgICAgICAgICAgIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBXb3JkQXJyYXlTZXRNZXRob2QpIHx8Ci0gICAgICAgICAgICAgICAgIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBFeHRlbnRBcnJheVNldE1ldGhvZCkgfHwKLSAgICAgICAgICAgICAgICAhc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIE9iamVjdFJlZmVyZW5jZUFycmF5U2V0TWV0aG9kKSkgewotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgVmFsdWUqIEFycmF5ID0gQ2FsbC5nZXRBcmd1bWVudCgwKTsKLSAgICAgICAgICAgICAgVmFsdWUqIEluZGV4ID0gQ2FsbC5nZXRBcmd1bWVudCgxKTsKLSAgICAgICAgICAgICAgVmFsdWUqIEVsZW1lbnQgPSBDYWxsLmdldEFyZ3VtZW50KDIpOwotICAgICAgICAgICAgICBDb25zdGFudEludCogT25lID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLCAodWludDY0X3QpMSk7Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBJbmRleCA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBZGQoSW5kZXgsIE9uZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgQXJyYXkgPSBuZXcgQml0Q2FzdEluc3QoQXJyYXksIHB0clNpemVUeXBlLCAiIiwgQ0kpOwotICAgICAgICAgICAgICBWYWx1ZSogcHRyID0gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShBcnJheSwgSW5kZXgsICIiLCBDSSk7Ci0gICAgICAgICAgICAgIEVsZW1lbnQgPSBuZXcgUHRyVG9JbnRJbnN0KEVsZW1lbnQsIHBvaW50ZXJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgbmV3IFN0b3JlSW5zdChFbGVtZW50LCBwdHIsIENJKTsKLSAgICAgICAgICAgICAgQ0ktPmVyYXNlRnJvbVBhcmVudCgpOyAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIEFkZHJlc3NBcnJheUxlbmd0aE1ldGhvZCkgfHwKLSAgICAgICAgICAgICAgICAhc3RyY21wKEZDdXItPmdldE5hbWUoKS5kYXRhKCksIE9mZnNldEFycmF5TGVuZ3RoTWV0aG9kKSB8fAotICAgICAgICAgICAgICAgICFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgV29yZEFycmF5TGVuZ3RoTWV0aG9kKSB8fAotICAgICAgICAgICAgICAgICFzdHJjbXAoRkN1ci0+Z2V0TmFtZSgpLmRhdGEoKSwgRXh0ZW50QXJyYXlMZW5ndGhNZXRob2QpIHx8Ci0gICAgICAgICAgICAgICAgIXN0cmNtcChGQ3VyLT5nZXROYW1lKCkuZGF0YSgpLCBPYmplY3RSZWZlcmVuY2VBcnJheUxlbmd0aE1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIFZhbHVlKiBBcnJheSA9IENhbGwuZ2V0QXJndW1lbnQoMCk7Ci0gICAgICAgICAgICAgIEFycmF5ID0gbmV3IEJpdENhc3RJbnN0KEFycmF5LCBwdHJTaXplVHlwZSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgVmFsdWUqIExlbmd0aCA9IG5ldyBMb2FkSW5zdChBcnJheSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgaWYgKExlbmd0aC0+Z2V0VHlwZSgpICE9IFR5cGU6OmdldEludDMyVHkoQ29udGV4dCkpIHsKLSAgICAgICAgICAgICAgICBMZW5ndGggPSBuZXcgVHJ1bmNJbnN0KExlbmd0aCwgVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwgIiIsIENJKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBDSS0+cmVwbGFjZUFsbFVzZXNXaXRoKExlbmd0aCk7Ci0gICAgICAgICAgICAgIENJLT5lcmFzZUZyb21QYXJlbnQoKTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBDaGFuZ2VkOwotfQotCi0KLUZ1bmN0aW9uUGFzcyogY3JlYXRlTG93ZXJNYWdpY1Bhc3MoKSB7Ci0gIHJldHVybiBuZXcgTG93ZXJNYWdpYygpOwotfQotCi19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL21hZ2ljL01ha2VmaWxlIGIvdm1raXQvbW10ay9tYWdpYy9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYzMDc1Zi4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL21hZ2ljL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyM9PT0tIG1tdGsvbWFnaWMvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKLSMKLSMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQotIwotIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLSMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotIwotIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKLQotTEVWRUwgPSAuLi8uLgotTElCUkFSWU5BTUUgPSBNTVRLTWFnaWMKLUxPQURBQkxFX01PRFVMRSA9IDEKLVVTRURMSUJTID0KLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KLQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9tbXRrLWFsbG9jL01ha2VmaWxlIGIvdm1raXQvbW10ay9tbXRrLWFsbG9jL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2U3YTg0Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvbW10ay1hbGxvYy9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjPT09LSBtbXRrL21tdGstajMvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCi0jCi0jICAgICAgICAgICAgICAgICAgICAgVGhlIHZta2l0IHByb2plY3QKLSMKLSMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0jIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLSMKLSMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCi0KLUxFVkVMID0gLi4vLi4KLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb25maWcKLQotaWZlcSAoJChXSVRIX0xMVk1fR0NDKSwgMSkKLSAgTU9EVUxFX05BTUUgPSBNTVRLQWxsb2MKLWVsc2UKLSAgTElCUkFSWU5BTUUgPSBNTVRLQWxsb2MKLWVuZGlmCi0KLUxPQURBQkxFX01PRFVMRSA9IDEKLVVTRURMSUJTID0KLQotQ1hYLkZsYWdzICs9IC1JJChQUk9KX1NSQ19ESVIpLy4uLy4uL2xpYi9KMy9WTUNvcmUKLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KLQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9tbXRrLWFsbG9jL1NlbGVjdGVkLmNwcCBiL3Zta2l0L21tdGsvbW10ay1hbGxvYy9TZWxlY3RlZC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNTBiZGUuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9tbXRrLWFsbG9jL1NlbGVjdGVkLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vLz09PS0tLS0tLS0tIFNlbGVjdGVkLmNwcCAtIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTZWxlY3RlZCBjbGFzcyAgLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgIk11dGF0b3JUaHJlYWQuaCIKLSNpbmNsdWRlICJtdm0vR0MuaCIKLQotI2luY2x1ZGUgIm12bS9WaXJ0dWFsTWFjaGluZS5oIgotI2luY2x1ZGUgIm12bS9WTUtpdC5oIgotCi0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxzZXQ+Ci0KLSNpbmNsdWRlICJkZWJ1Zy5oIgotCi11c2luZyBuYW1lc3BhY2UgbXZtOwotCi1pbnQgQ29sbGVjdG9yOjp2ZXJib3NlID0gMDsKLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19tbXRrX0NvbGxlY3Rpb25fdHJpZ2dlckNvbGxlY3Rpb25fX0kodWludHB0cl90LCBpbnQzMl90KSBBTFdBWVNfSU5MSU5FOwotCi1leHRlcm4gIkMiIGludHB0cl90IEpuSlZNX29yZ19qM19iaW5kaW5nc19CaW5kaW5nc19hbGxvY2F0ZU11dGF0b3JfX0koaW50MzJfdCkgQUxXQVlTX0lOTElORTsKLWV4dGVybiAiQyIgdm9pZCBKbkpWTV9vcmdfajNfYmluZGluZ3NfQmluZGluZ3NfZnJlZU11dGF0b3JfX0xvcmdfbW10a19wbGFuX011dGF0b3JDb250ZXh0XzIoaW50cHRyX3QpIEFMV0FZU19JTkxJTkU7Ci1leHRlcm4gIkMiIHZvaWQgSm5KVk1fb3JnX2ozX2JpbmRpbmdzX0JpbmRpbmdzX2Jvb3RfX0xvcmdfdm1tYWdpY191bmJveGVkX0V4dGVudF8yTG9yZ192bW1hZ2ljX3VuYm94ZWRfRXh0ZW50XzIoaW50cHRyX3QsIGludHB0cl90KSBBTFdBWVNfSU5MSU5FOwotCi1leHRlcm4gIkMiIHZvaWQgSm5KVk1fb3JnX2ozX2JpbmRpbmdzX0JpbmRpbmdzX3Byb2Nlc3NFZGdlX19Mb3JnX21tdGtfcGxhbl9UcmFuc2l0aXZlQ2xvc3VyZV8yTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlXzJMb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzXzIoCi0gICAgdWludHB0cl90IGNsb3N1cmUsIHZvaWQqIHNvdXJjZSwgdm9pZCogc2xvdCkgQUxXQVlTX0lOTElORTsKLQotZXh0ZXJuICJDIiB2b2lkIEpuSlZNX29yZ19qM19iaW5kaW5nc19CaW5kaW5nc19yZXBvcnREZWxheWVkUm9vdEVkZ2VfX0xvcmdfbW10a19wbGFuX1RyYWNlTG9jYWxfMkxvcmdfdm1tYWdpY191bmJveGVkX0FkZHJlc3NfMigKLSAgICB1aW50cHRyX3QgVHJhY2VMb2NhbCwgdm9pZCoqIHNsb3QpIEFMV0FZU19JTkxJTkU7Ci1leHRlcm4gIkMiIHZvaWQgSm5KVk1fb3JnX2ozX2JpbmRpbmdzX0JpbmRpbmdzX3Byb2Nlc3NSb290RWRnZV9fTG9yZ19tbXRrX3BsYW5fVHJhY2VMb2NhbF8yTG9yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc18yWigKLSAgICB1aW50cHRyX3QgVHJhY2VMb2NhbCwgdm9pZCogc2xvdCwgdWludDhfdCB1bnRyYWNlZCkgQUxXQVlTX0lOTElORTsKLWV4dGVybiAiQyIgZ2MqIEpuSlZNX29yZ19qM19iaW5kaW5nc19CaW5kaW5nc19yZXRhaW5Gb3JGaW5hbGl6ZV9fTG9yZ19tbXRrX3BsYW5fVHJhY2VMb2NhbF8yTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlXzIoCi0gICAgdWludHB0cl90IFRyYWNlTG9jYWwsIHZvaWQqIG9iaikgQUxXQVlTX0lOTElORTsKLWV4dGVybiAiQyIgZ2MqIEpuSlZNX29yZ19qM19iaW5kaW5nc19CaW5kaW5nc19yZXRhaW5SZWZlcmVudF9fTG9yZ19tbXRrX3BsYW5fVHJhY2VMb2NhbF8yTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlXzIoCi0gICAgdWludHB0cl90IFRyYWNlTG9jYWwsIHZvaWQqIG9iaikgQUxXQVlTX0lOTElORTsKLWV4dGVybiAiQyIgZ2MqIEpuSlZNX29yZ19qM19iaW5kaW5nc19CaW5kaW5nc19nZXRGb3J3YXJkZWRSZWZlcmVuY2VfX0xvcmdfbW10a19wbGFuX1RyYWNlTG9jYWxfMkxvcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZV8yKAotICAgIHVpbnRwdHJfdCBUcmFjZUxvY2FsLCB2b2lkKiBvYmopIEFMV0FZU19JTkxJTkU7Ci1leHRlcm4gIkMiIGdjKiBKbkpWTV9vcmdfajNfYmluZGluZ3NfQmluZGluZ3NfZ2V0Rm9yd2FyZGVkUmVmZXJlbnRfX0xvcmdfbW10a19wbGFuX1RyYWNlTG9jYWxfMkxvcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZV8yKAotICAgIHVpbnRwdHJfdCBUcmFjZUxvY2FsLCB2b2lkKiBvYmopIEFMV0FZU19JTkxJTkU7Ci1leHRlcm4gIkMiIGdjKiBKbkpWTV9vcmdfajNfYmluZGluZ3NfQmluZGluZ3NfZ2V0Rm9yd2FyZGVkRmluYWxpemFibGVfX0xvcmdfbW10a19wbGFuX1RyYWNlTG9jYWxfMkxvcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZV8yKAotICAgIHVpbnRwdHJfdCBUcmFjZUxvY2FsLCB2b2lkKiBvYmopIEFMV0FZU19JTkxJTkU7Ci1leHRlcm4gIkMiIHVpbnQ4X3QgSm5KVk1fb3JnX2ozX2JpbmRpbmdzX0JpbmRpbmdzX2lzTGl2ZV9fTG9yZ19tbXRrX3BsYW5fVHJhY2VMb2NhbF8yTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlXzIoCi0gICAgdWludHB0cl90IFRyYWNlTG9jYWwsIHZvaWQqIG9iaikgQUxXQVlTX0lOTElORTsKLQotZXh0ZXJuICJDIiB2b2lkKiBKbkpWTV9vcmdfajNfYmluZGluZ3NfQmluZGluZ3NfZ2NtYWxsb2NfX0lMb3JnX3ZtbWFnaWNfdW5ib3hlZF9PYmplY3RSZWZlcmVuY2VfMigKLSAgICBpbnQgc3osIHZvaWQqIFZUKSBBTFdBWVNfSU5MSU5FOwotCi1leHRlcm4gIkMiIHZvaWQqIGdjbWFsbG9jKHVpbnQzMl90IHN6LCB2b2lkKiBWVCkgewotICBzeiA9IGxsdm06OlJvdW5kVXBUb0FsaWdubWVudChzeiwgc2l6ZW9mKHZvaWQqKSk7Ci0gIHJldHVybiAoZ2MqKUpuSlZNX29yZ19qM19iaW5kaW5nc19CaW5kaW5nc19nY21hbGxvY19fSUxvcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZV8yKHN6LCBWVCk7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBhZGRGaW5hbGl6YXRpb25DYW5kaWRhdGUodm9pZCogb2JqKSBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSk7Ci0KLWV4dGVybiAiQyIgdm9pZCBhZGRGaW5hbGl6YXRpb25DYW5kaWRhdGUodm9pZCogb2JqKSB7Ci0gIGxsdm1fZ2Nyb290KG9iaiwgMCk7Ci0gIG12bTo6VGhyZWFkOjpnZXQoKS0+dm1raXQtPmFkZEZpbmFsaXphdGlvbkNhbmRpZGF0ZSgoZ2MqKW9iaik7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCogZ2NtYWxsb2NVbnJlc29sdmVkKHVpbnQzMl90IHN6LCBWaXJ0dWFsVGFibGUqIFZUKSB7Ci0gIGdjKiByZXMgPSAwOwotICBsbHZtX2djcm9vdChyZXMsIDApOwotICByZXMgPSAoZ2MqKWdjbWFsbG9jKHN6LCBWVCk7Ci0gIGlmIChWVC0+ZGVzdHJ1Y3RvcikgYWRkRmluYWxpemF0aW9uQ2FuZGlkYXRlKHJlcyk7Ci0gIHJldHVybiByZXM7Ci19Ci0KLXZvaWQgTXV0YXRvclRocmVhZDo6aW5pdChUaHJlYWQqIF90aCkgewotICBNdXRhdG9yVGhyZWFkKiB0aCA9IChNdXRhdG9yVGhyZWFkKilfdGg7Ci0gIHRoLT5NdXRhdG9yQ29udGV4dCA9Ci0gICAgSm5KVk1fb3JnX2ozX2JpbmRpbmdzX0JpbmRpbmdzX2FsbG9jYXRlTXV0YXRvcl9fSSgoaW50MzJfdClfdGgtPmdldFRocmVhZElEKCkpOwotICB0aC0+cmVhbFJvdXRpbmUoX3RoKTsKLSAgdWludHB0cl90IGNvbnRleHQgPSB0aC0+TXV0YXRvckNvbnRleHQ7Ci0gIHRoLT5NdXRhdG9yQ29udGV4dCA9IDA7Ci0gIEpuSlZNX29yZ19qM19iaW5kaW5nc19CaW5kaW5nc19mcmVlTXV0YXRvcl9fTG9yZ19tbXRrX3BsYW5fTXV0YXRvckNvbnRleHRfMihjb250ZXh0KTsKLX0KLQotYm9vbCBDb2xsZWN0b3I6OmlzTGl2ZShnYyogcHRyLCB1aW50cHRyX3QgY2xvc3VyZSkgewotICByZXR1cm4gSm5KVk1fb3JnX2ozX2JpbmRpbmdzX0JpbmRpbmdzX2lzTGl2ZV9fTG9yZ19tbXRrX3BsYW5fVHJhY2VMb2NhbF8yTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlXzIoY2xvc3VyZSwgcHRyKTsKLX0KLQotdm9pZCBDb2xsZWN0b3I6OnNjYW5PYmplY3Qodm9pZCoqIHB0ciwgdWludHB0cl90IGNsb3N1cmUpIHsKLSAgaWYgKCgqcHRyKSAhPSBOVUxMKSB7Ci0gICAgYXNzZXJ0KCgoZ2MqKSgqcHRyKSktPmdldFZpcnR1YWxUYWJsZSgpKTsKLSAgfQotICBKbkpWTV9vcmdfajNfYmluZGluZ3NfQmluZGluZ3NfcmVwb3J0RGVsYXllZFJvb3RFZGdlX19Mb3JnX21tdGtfcGxhbl9UcmFjZUxvY2FsXzJMb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzXzIoY2xvc3VyZSwgcHRyKTsKLX0KLSAKLXZvaWQgQ29sbGVjdG9yOjptYXJrQW5kVHJhY2Uodm9pZCogc291cmNlLCB2b2lkKiBwdHIsIHVpbnRwdHJfdCBjbG9zdXJlKSB7Ci0gIHZvaWQqKiBwdHJfID0gKHZvaWQqKilwdHI7Ci0gIGlmICgoKnB0cl8pICE9IE5VTEwpIHsKLSAgICBhc3NlcnQoKChnYyopKCpwdHJfKSktPmdldFZpcnR1YWxUYWJsZSgpKTsKLSAgfQotICBpZiAoKCoodm9pZCoqKXB0cikgIT0gTlVMTCkgYXNzZXJ0KCgoZ2MqKSgqKHZvaWQqKilwdHIpKS0+Z2V0VmlydHVhbFRhYmxlKCkpOwotICBKbkpWTV9vcmdfajNfYmluZGluZ3NfQmluZGluZ3NfcHJvY2Vzc0VkZ2VfX0xvcmdfbW10a19wbGFuX1RyYW5zaXRpdmVDbG9zdXJlXzJMb3JnX3ZtbWFnaWNfdW5ib3hlZF9PYmplY3RSZWZlcmVuY2VfMkxvcmdfdm1tYWdpY191bmJveGVkX0FkZHJlc3NfMihjbG9zdXJlLCBzb3VyY2UsIHB0cik7Ci19Ci0gIAotdm9pZCBDb2xsZWN0b3I6Om1hcmtBbmRUcmFjZVJvb3Qodm9pZCogcHRyLCB1aW50cHRyX3QgY2xvc3VyZSkgewotICB2b2lkKiogcHRyXyA9ICh2b2lkKiopcHRyOwotICBpZiAoKCpwdHJfKSAhPSBOVUxMKSB7Ci0gICAgYXNzZXJ0KCgoZ2MqKSgqcHRyXykpLT5nZXRWaXJ0dWFsVGFibGUoKSk7Ci0gIH0KLSAgSm5KVk1fb3JnX2ozX2JpbmRpbmdzX0JpbmRpbmdzX3Byb2Nlc3NSb290RWRnZV9fTG9yZ19tbXRrX3BsYW5fVHJhY2VMb2NhbF8yTG9yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc18yWihjbG9zdXJlLCBwdHIsIHRydWUpOwotfQotCi1nYyogQ29sbGVjdG9yOjpyZXRhaW5Gb3JGaW5hbGl6ZShnYyogdmFsLCB1aW50cHRyX3QgY2xvc3VyZSkgewotICByZXR1cm4gSm5KVk1fb3JnX2ozX2JpbmRpbmdzX0JpbmRpbmdzX3JldGFpbkZvckZpbmFsaXplX19Mb3JnX21tdGtfcGxhbl9UcmFjZUxvY2FsXzJMb3JnX3ZtbWFnaWNfdW5ib3hlZF9PYmplY3RSZWZlcmVuY2VfMihjbG9zdXJlLCB2YWwpOwotfQotICAKLWdjKiBDb2xsZWN0b3I6OnJldGFpblJlZmVyZW50KGdjKiB2YWwsIHVpbnRwdHJfdCBjbG9zdXJlKSB7Ci0gIHJldHVybiBKbkpWTV9vcmdfajNfYmluZGluZ3NfQmluZGluZ3NfcmV0YWluUmVmZXJlbnRfX0xvcmdfbW10a19wbGFuX1RyYWNlTG9jYWxfMkxvcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZV8yKGNsb3N1cmUsIHZhbCk7Ci19Ci0gIAotZ2MqIENvbGxlY3Rvcjo6Z2V0Rm9yd2FyZGVkRmluYWxpemFibGUoZ2MqIHZhbCwgdWludHB0cl90IGNsb3N1cmUpIHsKLSAgcmV0dXJuIEpuSlZNX29yZ19qM19iaW5kaW5nc19CaW5kaW5nc19nZXRGb3J3YXJkZWRGaW5hbGl6YWJsZV9fTG9yZ19tbXRrX3BsYW5fVHJhY2VMb2NhbF8yTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlXzIoY2xvc3VyZSwgdmFsKTsKLX0KLSAgCi1nYyogQ29sbGVjdG9yOjpnZXRGb3J3YXJkZWRSZWZlcmVuY2UoZ2MqIHZhbCwgdWludHB0cl90IGNsb3N1cmUpIHsKLSAgcmV0dXJuIEpuSlZNX29yZ19qM19iaW5kaW5nc19CaW5kaW5nc19nZXRGb3J3YXJkZWRSZWZlcmVuY2VfX0xvcmdfbW10a19wbGFuX1RyYWNlTG9jYWxfMkxvcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZV8yKGNsb3N1cmUsIHZhbCk7Ci19Ci0gIAotZ2MqIENvbGxlY3Rvcjo6Z2V0Rm9yd2FyZGVkUmVmZXJlbnQoZ2MqIHZhbCwgdWludHB0cl90IGNsb3N1cmUpIHsKLSAgcmV0dXJuIEpuSlZNX29yZ19qM19iaW5kaW5nc19CaW5kaW5nc19nZXRGb3J3YXJkZWRSZWZlcmVudF9fTG9yZ19tbXRrX3BsYW5fVHJhY2VMb2NhbF8yTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlXzIoY2xvc3VyZSwgdmFsKTsKLX0KLQotdm9pZCBDb2xsZWN0b3I6OmNvbGxlY3QoKSB7Ci0gIEphdmFfb3JnX2ozX21tdGtfQ29sbGVjdGlvbl90cmlnZ2VyQ29sbGVjdGlvbl9fSShOVUxMLCAyKTsKLX0KLQotdm9pZCBDb2xsZWN0b3I6OmluaXRpYWxpc2UoKSB7Ci0gIC8vIEFsbG9jYXRlIHRoZSBtZW1vcnkgZm9yIE1NVGsgcmlnaHQgbm93LCB0byBhdm9pZCBjb25mbGljdHMgd2l0aAotICAvLyBvdGhlciBhbGxvY2F0b3JzLgotI2lmIGRlZmluZWQgKF9fTUFDSF9fKQotICB1aW50MzIgZmxhZ3MgPSBNQVBfUFJJVkFURSB8IE1BUF9BTk9OIHwgTUFQX0ZJWEVEOwotI2Vsc2UKLSAgdWludDMyIGZsYWdzID0gTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTIHwgTUFQX0ZJWEVEOwotI2VuZGlmCi0gIHZvaWQqIGJhc2VBZGRyID0gbW1hcCgodm9pZCopMHgzMDAwMDAwMCwgMHgzMDAwMDAwMCwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCAtMSwgMCk7Ci0gIGlmIChiYXNlQWRkciA9PSBNQVBfRkFJTEVEKSB7Ci0gICAgcGVycm9yKCJtbWFwIik7Ci0gICAgYWJvcnQoKTsKLSAgfQotICAKLSAgSm5KVk1fb3JnX2ozX2JpbmRpbmdzX0JpbmRpbmdzX2Jvb3RfX0xvcmdfdm1tYWdpY191bmJveGVkX0V4dGVudF8yTG9yZ192bW1hZ2ljX3VuYm94ZWRfRXh0ZW50XzIoMTI4ICogMTAyNCAqIDEwMjQsIDEwMjQgKiAxMDI0ICogMTAyNCk7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCogTU1Ua011dGF0b3JBbGxvY2F0ZSh1aW50MzJfdCBzaXplLCBWaXJ0dWFsVGFibGUqIFZUKSB7Ci0gIHZvaWQqIHZhbCA9IE11dGF0b3JUaHJlYWQ6OmdldCgpLT5BbGxvY2F0b3IuQWxsb2NhdGUoc2l6ZSk7Ci0gICgodm9pZCoqKXZhbClbMF0gPSBWVDsKLSAgcmV0dXJuIHZhbDsKLX0KLQotLy9UT0RPOiBSZW1vdmUgdGhlc2UuCi1zdGQ6OnNldDxnYyo+IF9fSW50ZXJuYWxTZXRfXzsKLXZvaWQqIENvbGxlY3Rvcjo6YmVnT2YoZ2MqIG9iaikgewotICBhYm9ydCgpOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9tbXRrLWozL0FjdGl2ZVBsYW4uY3BwIGIvdm1raXQvbW10ay9tbXRrLWozL0FjdGl2ZVBsYW4uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDc2NWVlLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvbW10ay1qMy9BY3RpdmVQbGFuLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vPT09LS0tLS0tIEFjdGl2ZVBsYW4uY3BwIC0gSW1wbGVtZW50YXRpb24gb2YgdGhlIEFjdGl2ZVBsYW4gY2xhc3MgIC0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJtdm0vVmlydHVhbE1hY2hpbmUuaCIKLSNpbmNsdWRlICJtdm0vVk1LaXQuaCIKLSNpbmNsdWRlICJNTVRrT2JqZWN0LmgiCi0jaW5jbHVkZSAiTXV0YXRvclRocmVhZC5oIgotCi1uYW1lc3BhY2UgbW10ayB7Ci0KLWV4dGVybiAiQyIgTU1Ua09iamVjdCogSmF2YV9vcmdfajNfbW10a19BY3RpdmVQbGFuX2dldE5leHRNdXRhdG9yX18oTU1Ua0FjdGl2ZVBsYW4qIEEpIHsKLSAgYXNzZXJ0KEEgJiYgIk5vIGFjdGl2ZSBwbGFuIik7Ci0KLQltdm06OkNpcmN1bGFyQmFzZTxtdm06OlRocmVhZD4qIG11dCA9IEEtPmN1cnJlbnQ7Ci0KLQlpZighbXV0KQotCQltdXQgPSAmbXZtOjpUaHJlYWQ6OmdldCgpLT52bWtpdC0+cnVubmluZ1RocmVhZHM7Ci0KLQltdXQgPSBtdXQtPm5leHQoKTsKLQotCWlmKG11dCA9PSAmbXZtOjpUaHJlYWQ6OmdldCgpLT52bWtpdC0+cnVubmluZ1RocmVhZHMpIHsKLQkJQS0+Y3VycmVudCA9IE5VTEw7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkKLQlBLT5jdXJyZW50ID0gKG12bTo6TXV0YXRvclRocmVhZCopbXV0OwotCi0gIGlmIChBLT5jdXJyZW50LT5NdXRhdG9yQ29udGV4dCA9PSAwKSB7Ci0gICAgcmV0dXJuIEphdmFfb3JnX2ozX21tdGtfQWN0aXZlUGxhbl9nZXROZXh0TXV0YXRvcl9fKEEpOwotICB9Ci0gIHJldHVybiAoTU1Ua09iamVjdCopQS0+Y3VycmVudC0+TXV0YXRvckNvbnRleHQ7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19tbXRrX0FjdGl2ZVBsYW5fcmVzZXRNdXRhdG9ySXRlcmF0b3JfXyhNTVRrQWN0aXZlUGxhbiogQSkgewotICBBLT5jdXJyZW50ID0gTlVMTDsKLX0KLQotZXh0ZXJuICJDIiB2b2lkIEphdmFfb3JnX2ozX21tdGtfQWN0aXZlUGxhbl9jb2xsZWN0b3JDb3VudF9fIChNTVRrQWN0aXZlUGxhbiogQSkgewotICBVTklNUExFTUVOVEVEKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvbW10ay1qMy9Bc3NlcnQuY3BwIGIvdm1raXQvbW10ay9tbXRrLWozL0Fzc2VydC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MmMxYzkuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9tbXRrLWozL0Fzc2VydC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tIEFzc2VydC5jcHAgLSBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgQXNzZXJ0IGNsYXNzICAtLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAiTU1Ua09iamVjdC5oIgotCi1uYW1lc3BhY2UgbW10ayB7Ci0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19tbXRrX0Fzc2VydF9kdW1wU3RhY2tfXyAoTU1Ua09iamVjdCogc2VsZikgeyBVTklNUExFTUVOVEVEKCk7IH0KLQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9tbXRrLWozL0NvbGxlY3Rpb24uY3BwIGIvdm1raXQvbW10ay9tbXRrLWozL0NvbGxlY3Rpb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2M1ZGY4Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvbW10ay1qMy9Db2xsZWN0aW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vLz09PS0tLS0tLS0gQ29sbGVjdGlvbi5jcHAgLSBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ29sbGVjdGlvbiBjbGFzcyAgLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAibXZtL1ZpcnR1YWxNYWNoaW5lLmgiCi0jaW5jbHVkZSAibXZtL1ZNS2l0LmgiCi0jaW5jbHVkZSAiTU1Ua09iamVjdC5oIgotI2luY2x1ZGUgIm12bS9HQy5oIgotCi1uYW1lc3BhY2UgbW10ayB7Ci0KLWV4dGVybiAiQyIgdm9pZCBKbkpWTV9vcmdfbW10a19wbGFuX1BsYW5fc2V0Q29sbGVjdGlvblRyaWdnZXJlZF9fKCk7Ci1leHRlcm4gIkMiIHZvaWQgSm5KVk1fb3JnX2ozX2NvbmZpZ19TZWxlY3RlZF8wMDAyNENvbGxlY3Rvcl9zdGF0aWNDb2xsZWN0X18oKTsKLWV4dGVybiAiQyIgdm9pZCBKbkpWTV9vcmdfbW10a19wbGFuX1BsYW5fY29sbGVjdGlvbkNvbXBsZXRlX18oKTsKLWV4dGVybiAiQyIgdWludDhfdCBKbkpWTV9vcmdfbW10a191dGlsaXR5X2hlYXBfSGVhcEdyb3d0aE1hbmFnZXJfY29uc2lkZXJIZWFwU2l6ZV9fKCk7Ci1leHRlcm4gIkMiIHZvaWQgSm5KVk1fb3JnX21tdGtfdXRpbGl0eV9oZWFwX0hlYXBHcm93dGhNYW5hZ2VyX3Jlc2V0X18oKTsKLWV4dGVybiAiQyIgaW50NjRfdCBKYXZhX29yZ19qM19tbXRrX1N0YXRpc3RpY3NfbmFub1RpbWVfXyAoKTsKLWV4dGVybiAiQyIgdm9pZCBKbkpWTV9vcmdfbW10a191dGlsaXR5X2hlYXBfSGVhcEdyb3d0aE1hbmFnZXJfcmVjb3JkR0NUaW1lX19EKGRvdWJsZSk7Ci0KLWV4dGVybiAiQyIgYm9vbCBKYXZhX29yZ19qM19tbXRrX0NvbGxlY3Rpb25faXNFbWVyZ2VuY3lBbGxvY2F0aW9uX18gKE1NVGtPYmplY3QqIEMpIHsKLSAgLy8gVE9ETzogZW1lcmdlbmN5IHdoZW4gT09NLgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19tbXRrX0NvbGxlY3Rpb25fcmVwb3J0QWxsb2NhdGlvblN1Y2Nlc3NfXyAoTU1Ua09iamVjdCogQykgewotICAvLyBUT0RPOiBjbGVhciBpbnRlcm5hbCBkYXRhLgotfQotCi1leHRlcm4gIkMiIHZvaWQgSmF2YV9vcmdfajNfbW10a19Db2xsZWN0aW9uX3RyaWdnZXJDb2xsZWN0aW9uX19JIChNTVRrT2JqZWN0KiBDLCBpbnQgd2h5KSB7Ci0gIG12bTo6VGhyZWFkKiB0aCA9IG12bTo6VGhyZWFkOjpnZXQoKTsKLQotICBpZiAodGgtPnZta2l0LT5zdGFydENvbGxlY3Rpb24oKSkgewotCi0gICAgSm5KVk1fb3JnX21tdGtfcGxhbl9QbGFuX3NldENvbGxlY3Rpb25UcmlnZ2VyZWRfXygpOwotCi0gICAgLy8gUmVjb3JkIHRoZSBzdGFydGluZyB0aW1lCi0gICAgaW50NjRfdCBzdGFydFRpbWUgPSBKYXZhX29yZ19qM19tbXRrX1N0YXRpc3RpY3NfbmFub1RpbWVfXygpOwotCi0gICAgLy8gQ29sbGVjdCEKLSAgICBKbkpWTV9vcmdfajNfY29uZmlnX1NlbGVjdGVkXzAwMDI0Q29sbGVjdG9yX3N0YXRpY0NvbGxlY3RfXygpOwotCi0gICAgLy8gUmVjb3JkIHRoZSB0aW1lIHRvIEdDLgotICAgIGludDY0X3QgZWxhcHNlZFRpbWUgPSBKYXZhX29yZ19qM19tbXRrX1N0YXRpc3RpY3NfbmFub1RpbWVfXygpIC0gc3RhcnRUaW1lOwotCi0gICAgSm5KVk1fb3JnX21tdGtfdXRpbGl0eV9oZWFwX0hlYXBHcm93dGhNYW5hZ2VyX3JlY29yZEdDVGltZV9fRCgoKGRvdWJsZSllbGFwc2VkVGltZSkgLyAxMDAwMDAwKTsKLQotICAgIC8vIDIgbWVhbnMgY2FsbGVkIGJ5IFN5c3RlbS5nYygpOwotICAgIGlmICh3aHkgIT0gMikKLSAgICAgIEpuSlZNX29yZ19tbXRrX3V0aWxpdHlfaGVhcF9IZWFwR3Jvd3RoTWFuYWdlcl9jb25zaWRlckhlYXBTaXplX18oKTsKLQotICAgIEpuSlZNX29yZ19tbXRrX3V0aWxpdHlfaGVhcF9IZWFwR3Jvd3RoTWFuYWdlcl9yZXNldF9fKCk7Ci0KLSAgICBKbkpWTV9vcmdfbW10a19wbGFuX1BsYW5fY29sbGVjdGlvbkNvbXBsZXRlX18oKTsKLSAgICAKLSAgICBpZiAobXZtOjpDb2xsZWN0b3I6OnZlcmJvc2UgPiAwKSB7Ci0gICAgICBzdGF0aWMgaW50IGNvbGxlY3Rpb25OdW0gPSAxOwotICAgICAgaWYgKHdoeSA9PSAyKSBmcHJpbnRmKHN0ZGVyciwgIltGb3JjZWRdICIpOwotICAgICAgZnByaW50ZihzdGRlcnIsICJDb2xsZWN0aW9uICVkIGZpbmlzaGVkIGluICVsbGQgbXMuXG4iLCBjb2xsZWN0aW9uTnVtKyssCi0gICAgICAgICAgICAgIGVsYXBzZWRUaW1lIC8gMTAwMDAwMCk7Ci0gICAgfQotCi0gICAgdGgtPnZta2l0LT5lbmRDb2xsZWN0aW9uKCk7Ci0gIH0KLQotfQotCi1leHRlcm4gIkMiIHZvaWQgSmF2YV9vcmdfajNfbW10a19Db2xsZWN0aW9uX2pvaW5Db2xsZWN0aW9uX18gKE1NVGtPYmplY3QqIEMpIHsKLSAgbXZtOjpUaHJlYWQqIHRoID0gbXZtOjpUaHJlYWQ6OmdldCgpOwotICBhc3NlcnQodGgtPmluUlYgJiYgIkpvaW5pbmcgY29sbGVjdGlvbiB3aXRob3V0IGEgcmVuZGV6dm91cyIpOwotICB0aC0+dm1raXQtPnJlbmRlenZvdXMuam9pbigpOwotfQotCi1leHRlcm4gIkMiIGludCBKYXZhX29yZ19qM19tbXRrX0NvbGxlY3Rpb25fcmVuZGV6dm91c19fSSAoTU1Ua09iamVjdCogQywgaW50IHdoZXJlKSB7Ci0gIHJldHVybiAxOwotfQotCi1leHRlcm4gIkMiIGludCBKYXZhX29yZ19qM19tbXRrX0NvbGxlY3Rpb25fbWF4aW11bUNvbGxlY3Rpb25BdHRlbXB0X18gKE1NVGtPYmplY3QqIEMpIHsKLSAgcmV0dXJuIDA7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19tbXRrX0NvbGxlY3Rpb25fcHJlcGFyZUNvbGxlY3Rvcl9fTG9yZ19tbXRrX3BsYW5fQ29sbGVjdG9yQ29udGV4dF8yIChNTVRrT2JqZWN0KiBDLCBNTVRrT2JqZWN0KiBDQykgewotICAvLyBOb3RoaW5nIHRvIGRvLgotfQotCi1leHRlcm4gIkMiIHZvaWQgSmF2YV9vcmdfajNfbW10a19Db2xsZWN0aW9uX3ByZXBhcmVNdXRhdG9yX19Mb3JnX21tdGtfcGxhbl9NdXRhdG9yQ29udGV4dF8yIChNTVRrT2JqZWN0KiBDLCBNTVRrT2JqZWN0KiBNQykgewotfQotCi0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19tbXRrX0NvbGxlY3Rpb25fcmVwb3J0UGh5c2ljYWxBbGxvY2F0aW9uRmFpbGVkX18gKE1NVGtPYmplY3QqIEMpIHsgVU5JTVBMRU1FTlRFRCgpOyB9Ci1leHRlcm4gIkMiIHZvaWQgSmF2YV9vcmdfajNfbW10a19Db2xsZWN0aW9uX3RyaWdnZXJBc3luY0NvbGxlY3Rpb25fX0kgKE1NVGtPYmplY3QqIEMsIHNpbnQzMiB2YWwpIHsgVU5JTVBMRU1FTlRFRCgpOyB9Ci1leHRlcm4gIkMiIHZvaWQgSmF2YV9vcmdfajNfbW10a19Db2xsZWN0aW9uX25vVGhyZWFkc0luR0NfXyAoTU1Ua09iamVjdCogQykgeyBVTklNUExFTUVOVEVEKCk7IH0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19tbXRrX0NvbGxlY3Rpb25fYWN0aXZlR0NUaHJlYWRzX18gKE1NVGtPYmplY3QqIEMpIHsgVU5JTVBMRU1FTlRFRCgpOyB9Ci1leHRlcm4gIkMiIHZvaWQgSmF2YV9vcmdfajNfbW10a19Db2xsZWN0aW9uX2FjdGl2ZUdDVGhyZWFkT3JkaW5hbF9fIChNTVRrT2JqZWN0KiBDKSB7IFVOSU1QTEVNRU5URUQoKTsgfQotZXh0ZXJuICJDIiB2b2lkIEphdmFfb3JnX2ozX21tdGtfQ29sbGVjdGlvbl9yZXF1ZXN0TXV0YXRvckZsdXNoX18gKE1NVGtPYmplY3QqIEMpIHsgVU5JTVBMRU1FTlRFRCgpOyB9Ci0KLX0gLy8gbmFtZXNwYWNlIG1tdGsKZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvbW10ay1qMy9GaW5hbGl6YWJsZVByb2Nlc3Nvci5jcHAgYi92bWtpdC9tbXRrL21tdGstajMvRmluYWxpemFibGVQcm9jZXNzb3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTk3ZjEwLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvbW10ay1qMy9GaW5hbGl6YWJsZVByb2Nlc3Nvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vLz09PS0gRmluYWxpemFibGVQcm9jZXNzb3IuY3BwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy89PT0tIEltcGxlbWVudGF0aW9uIG9mIHRoZSBGaW5hbGl6YWJsZVByb2Nlc3NvciBjbGFzcyAgLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgIm12bS9WaXJ0dWFsTWFjaGluZS5oIgotI2luY2x1ZGUgIm12bS9WTUtpdC5oIgotI2luY2x1ZGUgIk1NVGtPYmplY3QuaCIKLQotbmFtZXNwYWNlIG1tdGsgewotCi1leHRlcm4gIkMiIHZvaWQgSmF2YV9vcmdfajNfbW10a19GaW5hbGl6YWJsZVByb2Nlc3Nvcl9jbGVhcl9fIChNTVRrT2JqZWN0KiBQKSB7Ci0gIFVOSU1QTEVNRU5URUQoKTsKLX0KLQotZXh0ZXJuICJDIiB2b2lkCi1KYXZhX29yZ19qM19tbXRrX0ZpbmFsaXphYmxlUHJvY2Vzc29yX2ZvcndhcmRfX0xvcmdfbW10a19wbGFuX1RyYWNlTG9jYWxfMlogKE1NVGtPYmplY3QqIFAsIHVpbnRwdHJfdCBUTCwgdWludDhfdCBudXJzZXJ5KSB7Ci0gIFVOSU1QTEVNRU5URUQoKTsKLX0KLQotZXh0ZXJuICJDIiB2b2lkCi1KYXZhX29yZ19qM19tbXRrX0ZpbmFsaXphYmxlUHJvY2Vzc29yX3NjYW5fX0xvcmdfbW10a19wbGFuX1RyYWNlTG9jYWxfMlogKE1NVGtPYmplY3QqIEZQLCBNTVRrT2JqZWN0KiBUTCwgdWludDhfdCBudXJzZXJ5KSB7Ci0gIG12bTo6VGhyZWFkKiB0aCA9IG12bTo6VGhyZWFkOjpnZXQoKTsKLSAgdGgtPnZta2l0LT5zY2FuRmluYWxpemF0aW9uUXVldWUocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KFRMKSk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvbW10ay1qMy9Mb2NrLmNwcCBiL3Zta2l0L21tdGsvbW10ay1qMy9Mb2NrLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JkMTY5Ny4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL21tdGstajMvTG9jay5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tIExvY2suY3BwIC0gSW1wbGVtZW50YXRpb24gb2YgdGhlIExvY2sgY2xhc3MgIC0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgImRlYnVnLmgiCi0KLSNpbmNsdWRlICJNTVRrT2JqZWN0LmgiCi0KLW5hbWVzcGFjZSBtbXRrIHsKLQotZXh0ZXJuICJDIiB2b2lkIEphdmFfb3JnX2ozX21tdGtfTG9ja19hY3F1aXJlX18oTU1Ua0xvY2sqIGwpIHsKLSAgZm9yICh1aW50MzIgY291bnQgPSAwOyBjb3VudCA8IDEwMDA7ICsrY291bnQpIHsKLSAgICB1aW50MzIgcmVzID0gX19zeW5jX3ZhbF9jb21wYXJlX2FuZF9zd2FwKCYobC0+c3RhdGUpLCAwLCAxKTsgCi0gICAgaWYgKCFyZXMpIHJldHVybjsKLSAgfSAgIAotICAgIAotICB3aGlsZSAoX19zeW5jX3ZhbF9jb21wYXJlX2FuZF9zd2FwKCYobC0+c3RhdGUpLCAwLCAxKSkgewotICAgIHNjaGVkX3lpZWxkKCk7Ci0gIH0KLX0KLQotZXh0ZXJuICJDIiB2b2lkIEphdmFfb3JnX2ozX21tdGtfTG9ja19yZWxlYXNlX18oTU1Ua0xvY2sqIGwpIHsKLSAgbC0+c3RhdGUgPSAwOwotfQotCi0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19tbXRrX0xvY2tfY2hlY2tfX0kgKE1NVGtMb2NrKiBsLCBpbnQgaSkgewotICBVTklNUExFTUVOVEVEKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvbW10ay1qMy9NTVRrT2JqZWN0LmggYi92bWtpdC9tbXRrL21tdGstajMvTU1Ua09iamVjdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWNiYTVkLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvbW10ay1qMy9NTVRrT2JqZWN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tIE1NVGtPYmplY3QuaCAtIEludGVybmFsIG9iamVjdCB0eXBlIGZvciBNTVRrICAtLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2lmbmRlZiBNTVRLX09CSkVDVF9ICi0jZGVmaW5lIE1NVEtfT0JKRUNUX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgIk11dGF0b3JUaHJlYWQuaCIKLSNpbmNsdWRlICJtdm0vR0MuaCIKLQotbmFtZXNwYWNlIG1tdGsgewotCi1jbGFzcyBNTVRrT2JqZWN0OwotCi1zdHJ1Y3QgTU1Ua0NsYXNzIHsKLSAgTU1Ua09iamVjdCogZGVsZWdhdGVlOwotfTsKLQotc3RydWN0IE1NVGtWaXJ0dWFsVGFibGUgOiBwdWJsaWMgbXZtOjpWaXJ0dWFsVGFibGUgewotICBNTVRrQ2xhc3MqIGNsOwotfTsKLQotc3RydWN0IE1NVGtPYmplY3QgewotICBNTVRrVmlydHVhbFRhYmxlKiB2aXJ0dWFsVGFibGU7Ci0gIHVpbnRwdHJfdCBoZWFkZXI7Ci19OwotCi1zdHJ1Y3QgTU1Ua0FycmF5IDogcHVibGljIE1NVGtPYmplY3QgewotICB1aW50cHRyX3Qgc2l6ZTsKLSAgdWludDE2X3QgZWxlbWVudHNbMV07Ci19OwotCi1zdHJ1Y3QgTU1Ua1N0cmluZyA6IHB1YmxpYyBNTVRrT2JqZWN0IHsKLSAgTU1Ua0FycmF5KiB2YWx1ZTsKLSAgaW50MzJfdCBjb3VudDsKLSAgaW50MzJfdCBjYWNoZWRIYXNoQ29kZTsKLSAgaW50MzJfdCBvZmZzZXQ7Ci19OwotCi1zdHJ1Y3QgTU1Ua0xvY2sgOiBwdWJsaWMgTU1Ua09iamVjdCB7Ci0gIHVpbnQzMl90IHN0YXRlOwotICBNTVRrU3RyaW5nKiBuYW1lOwotfTsKLQotc3RydWN0IE1NVGtBY3RpdmVQbGFuIDogcHVibGljIE1NVGtPYmplY3QgewotICBtdm06Ok11dGF0b3JUaHJlYWQqIGN1cnJlbnQ7Ci19OwotCi1zdHJ1Y3QgTU1Ua1JlZmVyZW5jZVByb2Nlc3NvciA6IHB1YmxpYyBNTVRrT2JqZWN0IHsKLSAgTU1Ua09iamVjdCogc2VtYW50aWNzOwotICBpbnQzMl90IG9yZGluYWw7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBtbXRrCi0KLSNlbmRpZiAvLyBNTVRLX09CSkVDVF9ICmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL21tdGstajMvTU1Ua19FdmVudHMuY3BwIGIvdm1raXQvbW10ay9tbXRrLWozL01NVGtfRXZlbnRzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI0NzJkZS4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL21tdGstajMvTU1Ua19FdmVudHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLy89PT0tLS0tLSBNTVRrX0V2ZW50cy5jcHAgLSBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTU1Ua19FdmVudHMgY2xhc3MgIC0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJNTVRrT2JqZWN0LmgiCi0KLW5hbWVzcGFjZSBtbXRrIHsKLQotZXh0ZXJuICJDIiB2b2lkIEphdmFfb3JnX2ozX21tdGtfTU1Ua18xRXZlbnRzX3RyYWNlUGFnZUFjcXVpcmVkX19Mb3JnX21tdGtfcG9saWN5X1NwYWNlXzJMb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzXzJJKAotICAgIE1NVGtPYmplY3QqIGV2ZW50LCBNTVRrT2JqZWN0KiBzcGFjZSwgdWludHB0cl90IGFkZHJlc3MsIGludCBudW1QYWdlcykgewotI2lmIDAKLSAgZnByaW50ZihzdGRlcnIsICJQYWdlcyBhY3F1aXJlZCBieSB0aHJlYWQgJXAgZnJvbSBzcGFjZSAlcCBhdCAleCAoJWQpXG4iLCAodm9pZCopbXZtOjpUaHJlYWQ6OmdldCgpLCAodm9pZCopc3BhY2UsIGFkZHJlc3MsIG51bVBhZ2VzKTsKLSNlbmRpZgotfQotCi1leHRlcm4gIkMiIHZvaWQgSmF2YV9vcmdfajNfbW10a19NTVRrXzFFdmVudHNfdHJhY2VQYWdlUmVsZWFzZWRfX0xvcmdfbW10a19wb2xpY3lfU3BhY2VfMkxvcmdfdm1tYWdpY191bmJveGVkX0FkZHJlc3NfMkkoCi0gICAgTU1Ua09iamVjdCogZXZlbnQsIE1NVGtPYmplY3QqIHNwYWNlLCB1aW50cHRyX3QgYWRkcmVzcywgaW50IG51bVBhZ2VzKSB7Ci0jaWYgMAotICBmcHJpbnRmKHN0ZGVyciwgIlBhZ2VzIHJlbGVhc2VkIGJ5IHRocmVhZCAlcCBmcm9tIHNwYWNlICVwIGF0ICV4ICglZClcbiIsICh2b2lkKiltdm06OlRocmVhZDo6Z2V0KCksICh2b2lkKilzcGFjZSwgYWRkcmVzcywgbnVtUGFnZXMpOwotI2VuZGlmCi19Ci0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19tbXRrX01NVGtfMUV2ZW50c19oZWFwU2l6ZUNoYW5nZWRfX0xvcmdfdm1tYWdpY191bmJveGVkX0V4dGVudF8yKAotICAgIE1NVGtPYmplY3QqIGV2ZW50LCB1aW50cHRyX3QgaGVhcFNpemUpIHsKLSNpZiAwCi0gIGZwcmludGYoc3RkZXJyLCAiTmV3IGhlYXAgc2l6ZSA6ICVkXG4iLCAoaW50KWhlYXBTaXplKTsKLSNlbmRpZgotfQotCi19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL21tdGstajMvTWFrZWZpbGUgYi92bWtpdC9tbXRrL21tdGstajMvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYjdlYTguLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9tbXRrLWozL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyM9PT0tIG1tdGsvbW10ay1qMy9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKLSMKLSMgICAgICAgICAgICAgICAgICAgICBUaGUgdm1raXQgcHJvamVjdAotIwotIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLSMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotIwotIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKLQotTEVWRUwgPSAuLi8uLgotCi1pbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbmZpZwotCi1pZmVxICgkKFdJVEhfTExWTV9HQ0MpLCAxKQotICBNT0RVTEVfTkFNRSA9IE1NVEtSdW50aW1lCi1lbHNlCi0gIExJQlJBUllOQU1FID0gTU1US1J1bnRpbWUKLWVuZGlmCi0KLUxPQURBQkxFX01PRFVMRSA9IDEKLVVTRURMSUJTID0KLQotQ1hYLkZsYWdzICs9IC1JJChQUk9KX1NSQ19ESVIpLy4uLy4uL2xpYi9KMy9WTUNvcmUKLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KLQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9tbXRrLWozL01lbW9yeS5jcHAgYi92bWtpdC9tbXRrL21tdGstajMvTWVtb3J5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlYjg4ZC4uMDAwMDAwMAotLS0gYS92bWtpdC9tbXRrL21tdGstajMvTWVtb3J5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0tIE1lbW9yeS5jcHAgLSBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTWVtb3J5IGNsYXNzICAtLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJtdm0vVmlydHVhbE1hY2hpbmUuaCIKLSNpbmNsdWRlICJNTVRrT2JqZWN0LmgiCi0KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi1uYW1lc3BhY2UgbW10ayB7Ci0KLWV4dGVybiAiQyIgdWludHB0cl90IEphdmFfb3JnX2ozX21tdGtfTWVtb3J5X2dldEhlYXBTdGFydENvbnN0YW50X18gKE1NVGtPYmplY3QqIE0pIHsKLSAgcmV0dXJuICh1aW50cHRyX3QpMHgzMDAwMDAwMDsKLX0KLQotZXh0ZXJuICJDIiB1aW50cHRyX3QgSmF2YV9vcmdfajNfbW10a19NZW1vcnlfZ2V0SGVhcEVuZENvbnN0YW50X18gKE1NVGtPYmplY3QqIE0pIHsKLSAgcmV0dXJuICh1aW50cHRyX3QpMHg2MDAwMDAwMDsKLX0KLQotZXh0ZXJuICJDIiB1aW50cHRyX3QgSmF2YV9vcmdfajNfbW10a19NZW1vcnlfZ2V0QXZhaWxhYmxlU3RhcnRDb25zdGFudF9fIChNTVRrT2JqZWN0KiBNKSB7Ci0gIHJldHVybiAodWludHB0cl90KTB4MzAwMDAwMDA7Ci19Ci0KLWV4dGVybiAiQyIgdWludHB0cl90IEphdmFfb3JnX2ozX21tdGtfTWVtb3J5X2dldEF2YWlsYWJsZUVuZENvbnN0YW50X18gKE1NVGtPYmplY3QqIE0pIHsKLSAgcmV0dXJuICh1aW50cHRyX3QpMHg2MDAwMDAwMDsKLX0KLQotZXh0ZXJuICJDIiBzaW50MzIKLUphdmFfb3JnX2ozX21tdGtfTWVtb3J5X2R6bW1hcF9fTG9yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc18ySShNTVRrT2JqZWN0KiBNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbnQzMiBzaXplKSB7Ci0gIC8vIEFscmVhZHkgbW1hcHBlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCi0gIHJldHVybiAwOwotfQotCi1leHRlcm4gIkMiIHVpbnQ4X3QKLUphdmFfb3JnX2ozX21tdGtfTWVtb3J5X21wcm90ZWN0X19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzXzJJIChNTVRrT2JqZWN0KiBNLCB1aW50cHRyX3QgYWRkcmVzcywgc2ludDMyIHNpemUpIHsKLSAgaW50IHZhbCA9IG1wcm90ZWN0KCh2b2lkKilhZGRyZXNzLCBzaXplLCBQUk9UX05PTkUpOwotICByZXR1cm4gKHZhbCA9PSAwKTsKLX0KLQotZXh0ZXJuICJDIiB1aW50OF90Ci1KYXZhX29yZ19qM19tbXRrX01lbW9yeV9tdW5wcm90ZWN0X19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzXzJJIChNTVRrT2JqZWN0KiBNLCB1aW50cHRyX3QgYWRkcmVzcywgc2ludDMyIHNpemUpIHsKLSAgaW50IHZhbCA9IG1wcm90ZWN0KCh2b2lkKilhZGRyZXNzLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKTsKLSAgcmV0dXJuICh2YWwgPT0gMCk7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZAotSmF2YV9vcmdfajNfbW10a19NZW1vcnlfemVyb19fTG9yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc18yTG9yZ192bW1hZ2ljX3VuYm94ZWRfRXh0ZW50XzIoTU1Ua09iamVjdCogTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgbGVuKSB7Ci0gIG1lbXNldChhZGRyLCAwLCBsZW4pOwotfQotCi1leHRlcm4gIkMiIHZvaWQKLUphdmFfb3JnX2ozX21tdGtfTWVtb3J5X3plcm9QYWdlc19fTG9yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc18ySSAoTU1Ua09iamVjdCogTSwgdWludHB0cl90IGFkZHJlc3MsIHNpbnQzMiBzaXplKSB7Ci0gIFVOSU1QTEVNRU5URUQoKTsKLX0KLQotZXh0ZXJuICJDIiB2b2lkCi1KYXZhX29yZ19qM19tbXRrX01lbW9yeV9kdW1wTWVtb3J5X19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzXzJJSSAoTU1Ua09iamVjdCogTSwgdWludHB0cl90IGFkZHJlc3MsIHNpbnQzMiBiZWZvcmUsIHNpbnQzMiBhZnRlcikgewotICBVTklNUExFTUVOVEVEKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvbW10ay1qMy9PYmplY3RNb2RlbC5jcHAgYi92bWtpdC9tbXRrL21tdGstajMvT2JqZWN0TW9kZWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWU1YzY3Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvbW10ay1qMy9PYmplY3RNb2RlbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLy89PT0tLS0tIE9iamVjdE1vZGVsLmNwcCAtIEltcGxlbWVudGF0aW9uIG9mIHRoZSBPYmplY3RNb2RlbCBjbGFzcyAgLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJtdm0vVmlydHVhbE1hY2hpbmUuaCIKLSNpbmNsdWRlICJNTVRrT2JqZWN0LmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKLQotbmFtZXNwYWNlIG1tdGsgewotCi1leHRlcm4gIkMiIGludHB0cl90IEphdmFfb3JnX2ozX21tdGtfT2JqZWN0TW9kZWxfZ2V0QXJyYXlCYXNlT2Zmc2V0X18gKE1NVGtPYmplY3QqIE9NKSB7Ci0gIHJldHVybiBzaXplb2YoTU1Ua09iamVjdCkgKyBzaXplb2Yoc3NpemVfdCk7Ci19Ci0KLWV4dGVybiAiQyIgaW50cHRyX3QgSmF2YV9vcmdfajNfbW10a19PYmplY3RNb2RlbF9HQ18xSEVBREVSXzFPRkZTRVRfXyAoTU1Ua09iamVjdCogT00pIHsKLSAgcmV0dXJuIHNpemVvZih2b2lkKik7Ci19Ci0KLWV4dGVybiAiQyIgdWludHB0cl90IEphdmFfb3JnX2ozX21tdGtfT2JqZWN0TW9kZWxfcmVhZEF2YWlsYWJsZUJpdHNXb3JkX19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9PYmplY3RSZWZlcmVuY2VfMiAoTU1Ua09iamVjdCogT00sIG12bTo6Z2MqIG9iaikgewotICByZXR1cm4gb2JqLT5oZWFkZXI7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19tbXRrX09iamVjdE1vZGVsX3dyaXRlQXZhaWxhYmxlQml0c1dvcmRfX0xvcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZV8yTG9yZ192bW1hZ2ljX3VuYm94ZWRfV29yZF8yICgKLSAgICBNTVRrT2JqZWN0KiBPTSwgbXZtOjpnYyogb2JqLCB1aW50cHRyX3QgdmFsKSB7Ci0gIG9iai0+aGVhZGVyID0gdmFsOwotfQotCi1leHRlcm4gIkMiIG12bTo6Z2MqIEphdmFfb3JnX2ozX21tdGtfT2JqZWN0TW9kZWxfb2JqZWN0U3RhcnRSZWZfX0xvcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZV8yIChNTVRrT2JqZWN0KiBPTSwgbXZtOjpnYyogb2JqKSB7Ci0gIHJldHVybiBvYmo7Ci19Ci0KLWV4dGVybiAiQyIgbXZtOjpnYyogSmF2YV9vcmdfajNfbW10a19PYmplY3RNb2RlbF9yZWZUb0FkZHJlc3NfX0xvcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZV8yIChNTVRrT2JqZWN0KiBPTSwgbXZtOjpnYyogb2JqKSB7Ci0gIHJldHVybiBvYmo7Ci19Ci0KLWV4dGVybiAiQyIgdWludDhfdCBKYXZhX29yZ19qM19tbXRrX09iamVjdE1vZGVsX3JlYWRBdmFpbGFibGVCeXRlX19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9PYmplY3RSZWZlcmVuY2VfMiAoTU1Ua09iamVjdCogT00sIG12bTo6Z2MqIG9iaikgewotI2lmIGRlZmluZWQoX19QUENfXykKLSAgcmV0dXJuICgodWludDhfdCopb2JqKVs3XTsKLSNlbHNlCi0gIHJldHVybiAoKHVpbnQ4X3QqKW9iailbNF07Ci0jZW5kaWYKLX0KLQotZXh0ZXJuICJDIiB2b2lkIEphdmFfb3JnX2ozX21tdGtfT2JqZWN0TW9kZWxfd3JpdGVBdmFpbGFibGVCeXRlX19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9PYmplY3RSZWZlcmVuY2VfMkIgKE1NVGtPYmplY3QqIE9NLCBtdm06OmdjKiBvYmosIHVpbnQ4X3QgdmFsKSB7Ci0jaWYgZGVmaW5lZChfX1BQQ19fKQotICAoKHVpbnQ4X3QqKW9iailbN10gPSB2YWw7Ci0jZWxzZQotICAoKHVpbnQ4X3QqKW9iailbNF0gPSB2YWw7Ci0jZW5kaWYKLX0KLQotZXh0ZXJuICJDIiBtdm06OmdjKiBKYXZhX29yZ19qM19tbXRrX09iamVjdE1vZGVsX2dldE9iamVjdEZyb21TdGFydEFkZHJlc3NfX0xvcmdfdm1tYWdpY191bmJveGVkX0FkZHJlc3NfMiAoTU1Ua09iamVjdCogT00sIG12bTo6Z2MqIG9iaikgewotICByZXR1cm4gb2JqOwotfQotCi1leHRlcm4gIkMiIHVpbnRwdHJfdCBKYXZhX29yZ19qM19tbXRrX09iamVjdE1vZGVsX3ByZXBhcmVBdmFpbGFibGVCaXRzX19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9PYmplY3RSZWZlcmVuY2VfMiAoTU1Ua09iamVjdCogT00sIG12bTo6Z2MqIG9iaikgewotICByZXR1cm4gb2JqLT5oZWFkZXI7Ci19Ci0KLWV4dGVybiAiQyIgdWludDhfdAotSmF2YV9vcmdfajNfbW10a19PYmplY3RNb2RlbF9hdHRlbXB0QXZhaWxhYmxlQml0c19fTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlXzJMb3JnX3ZtbWFnaWNfdW5ib3hlZF9Xb3JkXzJMb3JnX3ZtbWFnaWNfdW5ib3hlZF9Xb3JkXzIoCi0gICAgTU1Ua09iamVjdCogT00sIG12bTo6Z2MqIG9iaiwgaW50cHRyX3Qgb2xkVmFsdWUsIGludHB0cl90IG5ld1ZhbHVlKSB7IAotICBpbnRwdHJfdCB2YWwgPSBfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAoJihvYmotPmhlYWRlciksIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0gIHJldHVybiAodmFsID09IG9sZFZhbHVlKTsKLX0KLQotZXh0ZXJuICJDIiB2b2lkIEphdmFfb3JnX2ozX2JpbmRpbmdzX0JpbmRpbmdzX21lbWNweV9fTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlXzJMb3JnX3ZtbWFnaWNfdW5ib3hlZF9PYmplY3RSZWZlcmVuY2VfMkkoCi0gICAgdm9pZCogcmVzLCB2b2lkKiBzcmMsIGludCBzaXplKSBBTFdBWVNfSU5MSU5FOwotCi1leHRlcm4gIkMiIHZvaWQgSmF2YV9vcmdfajNfYmluZGluZ3NfQmluZGluZ3NfbWVtY3B5X19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9PYmplY3RSZWZlcmVuY2VfMkxvcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZV8ySSgKLSAgICB2b2lkKiByZXMsIHZvaWQqIHNyYywgaW50IHNpemUpIHsKLSAgbWVtY3B5KHJlcywgc3JjLCBzaXplKTsKLX0KLQotZXh0ZXJuICJDIiB1aW50cHRyX3QgSm5KVk1fb3JnX2ozX2JpbmRpbmdzX0JpbmRpbmdzX2NvcHlfX0xvcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZV8yTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlXzJJSSgKLSAgICAgICAgICAgICAgICAgbXZtOjpnYyogb2JqLCBtdm06OlZpcnR1YWxUYWJsZSogVlQsIGludCBzaXplLCBpbnQgYWxsb2NhdG9yKSBBTFdBWVNfSU5MSU5FOwotCi1leHRlcm4gIkMiIHVpbnRwdHJfdCBKYXZhX29yZ19qM19tbXRrX09iamVjdE1vZGVsX2NvcHlfX0xvcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZV8ySSAoCi0gICAgTU1Ua09iamVjdCogT00sIG12bTo6Z2MqIHNyYywgaW50IGFsbG9jYXRvcikgQUxXQVlTX0lOTElORTsKLQotZXh0ZXJuICJDIiB1aW50cHRyX3QgSmF2YV9vcmdfajNfbW10a19PYmplY3RNb2RlbF9jb3B5X19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9PYmplY3RSZWZlcmVuY2VfMkkgKAotICAgIE1NVGtPYmplY3QqIE9NLCBtdm06OmdjKiBzcmMsIGludCBhbGxvY2F0b3IpIHsKLSAgc2l6ZV90IHNpemUgPSBzcmMtPmdldFZpcnR1YWxUYWJsZSgpLT52bS0+Z2V0T2JqZWN0U2l6ZShzcmMpOwotICBzaXplID0gbGx2bTo6Um91bmRVcFRvQWxpZ25tZW50KHNpemUsIHNpemVvZih2b2lkKikpOwotICB1aW50cHRyX3QgcmVzID0gSm5KVk1fb3JnX2ozX2JpbmRpbmdzX0JpbmRpbmdzX2NvcHlfX0xvcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZV8yTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlXzJJSSgKLSAgICAgIHNyYywgc3JjLT5nZXRWaXJ0dWFsVGFibGUoKSwgc2l6ZSwgYWxsb2NhdG9yKTsKLSAgYXNzZXJ0KCgoKHVpbnRwdHJfdCopcmVzKVsxXSAmIH5tdm06OkdDQml0TWFzaykgPT0gKCgodWludHB0cl90KilzcmMpWzFdICYgfm12bTo6R0NCaXRNYXNrKSk7Ci0gIHJldHVybiByZXM7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19tbXRrX09iamVjdE1vZGVsX2NvcHlUb19fTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlXzJMb3JnX3ZtbWFnaWNfdW5ib3hlZF9PYmplY3RSZWZlcmVuY2VfMkxvcmdfdm1tYWdpY191bmJveGVkX0FkZHJlc3NfMiAoCi0gICAgTU1Ua09iamVjdCogT00sIHVpbnRwdHJfdCBmcm9tLCB1aW50cHRyX3QgdG8sIHVpbnRwdHJfdCByZWdpb24pIHsgVU5JTVBMRU1FTlRFRCgpOyB9Ci0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19tbXRrX09iamVjdE1vZGVsX2dldFJlZmVyZW5jZVdoZW5Db3BpZWRUb19fTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlXzJMb3JnX3ZtbWFnaWNfdW5ib3hlZF9BZGRyZXNzXzIgKAotICAgIE1NVGtPYmplY3QqIE9NLCB1aW50cHRyX3QgZnJvbSwgdWludHB0cl90IHRvKSB7IFVOSU1QTEVNRU5URUQoKTsgfQotCi1leHRlcm4gIkMiIHZvaWQgSmF2YV9vcmdfajNfbW10a19PYmplY3RNb2RlbF9nZXRPYmplY3RFbmRBZGRyZXNzX19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9PYmplY3RSZWZlcmVuY2VfMiAoCi0gICAgTU1Ua09iamVjdCogT00sIHVpbnRwdHJfdCBvYmplY3QpIHsgVU5JTVBMRU1FTlRFRCgpOyB9Ci0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19tbXRrX09iamVjdE1vZGVsX2dldFNpemVXaGVuQ29waWVkX19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9PYmplY3RSZWZlcmVuY2VfMiAoCi0gICAgTU1Ua09iamVjdCogT00sIHVpbnRwdHJfdCBvYmplY3QpIHsgVU5JTVBMRU1FTlRFRCgpOyB9Ci0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19tbXRrX09iamVjdE1vZGVsX2dldEFsaWduV2hlbkNvcGllZF9fTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlXzIgKAotICAgIE1NVGtPYmplY3QqIE9NLCB1aW50cHRyX3Qgb2JqZWN0KSB7IFVOSU1QTEVNRU5URUQoKTsgfQotCi1leHRlcm4gIkMiIHZvaWQgSmF2YV9vcmdfajNfbW10a19PYmplY3RNb2RlbF9nZXRBbGlnbk9mZnNldFdoZW5Db3BpZWRfX0xvcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZV8yICgKLSAgICBNTVRrT2JqZWN0KiBPTSwgdWludHB0cl90IG9iamVjdCkgeyBVTklNUExFTUVOVEVEKCk7IH0KLQotZXh0ZXJuICJDIiB2b2lkIEphdmFfb3JnX2ozX21tdGtfT2JqZWN0TW9kZWxfZ2V0Q3VycmVudFNpemVfX0xvcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZV8yICgKLSAgICBNTVRrT2JqZWN0KiBPTSwgdWludHB0cl90IG9iamVjdCkgeyBVTklNUExFTUVOVEVEKCk7IH0KLQotZXh0ZXJuICJDIiB2b2lkIEphdmFfb3JnX2ozX21tdGtfT2JqZWN0TW9kZWxfZ2V0TmV4dE9iamVjdF9fTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlXzIgKAotICAgIE1NVGtPYmplY3QqIE9NLCB1aW50cHRyX3Qgb2JqZWN0KSB7IFVOSU1QTEVNRU5URUQoKTsgfQotCi0KLWNsYXNzIEZha2VCeXRlQXJyYXkgOiBwdWJsaWMgTU1Ua09iamVjdCB7Ci0gcHVibGljOgotICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUsIGludCBsZW5ndGgpIHsKLSAgICByZXR1cm4gbmV3IGNoYXJbc2l6ZSArIGxlbmd0aF07Ci0gIH0KLQotICBGYWtlQnl0ZUFycmF5KGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgICBsZW5ndGggPSBzdHJsZW4obmFtZSk7Ci0gICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgZWxlbWVudHNbaV0gPSBuYW1lW2ldOwotICAgIH0KLSAgfQotIHByaXZhdGU6Ci0gIHNpemVfdCBsZW5ndGg7Ci0gIHVpbnQ4X3QgZWxlbWVudHNbMV07Ci19OwotCi1leHRlcm4gIkMiIEZha2VCeXRlQXJyYXkqIEphdmFfb3JnX2ozX21tdGtfT2JqZWN0TW9kZWxfZ2V0VHlwZURlc2NyaXB0b3JfX0xvcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZV8yICgKLSAgICBNTVRrT2JqZWN0KiBPTSwgbXZtOjpnYyogc3JjKSB7Ci0gIGNvbnN0IGNoYXIqIG5hbWUgPSBzcmMtPmdldFZpcnR1YWxUYWJsZSgpLT52bS0+Z2V0T2JqZWN0VHlwZU5hbWUoc3JjKTsKLSAgLy8gVGhpcyBjb2RlIGlzIG9ubHkgdXNlZCBmb3IgZGVidWdnaW5nIG9uIGEgZmF0YWwgZXJyb3IuIEl0IGlzIGZpbmUgdG8KLSAgLy8gYWxsb2NhdGUgaW4gdGhlIEMrKyBoZWFwLgotICByZXR1cm4gbmV3IChzdHJsZW4obmFtZSkpIEZha2VCeXRlQXJyYXkobmFtZSk7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19tbXRrX09iamVjdE1vZGVsX2dldEFycmF5TGVuZ3RoX19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9PYmplY3RSZWZlcmVuY2VfMiAoCi0gICAgTU1Ua09iamVjdCogT00sIHVpbnRwdHJfdCBvYmplY3QpIHsgVU5JTVBMRU1FTlRFRCgpOyB9Ci0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19tbXRrX09iamVjdE1vZGVsX2lzQXJyYXlfX0xvcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZV8yICgKLSAgICBNTVRrT2JqZWN0KiBPTSwgdWludHB0cl90IG9iamVjdCkgeyBVTklNUExFTUVOVEVEKCk7IH0KLQotZXh0ZXJuICJDIiB2b2lkIEphdmFfb3JnX2ozX21tdGtfT2JqZWN0TW9kZWxfaXNQcmltaXRpdmVBcnJheV9fTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlXzIgKAotICAgIE1NVGtPYmplY3QqIE9NLCB1aW50cHRyX3Qgb2JqZWN0KSB7IFVOSU1QTEVNRU5URUQoKTsgfQotCi1leHRlcm4gIkMiIHZvaWQgSmF2YV9vcmdfajNfbW10a19PYmplY3RNb2RlbF9pc0FjeWNsaWNfX0xvcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZV8yICgKLSAgICBNTVRrT2JqZWN0KiBPTSwgdWludHB0cl90IG9iamVjdCkgeyBVTklNUExFTUVOVEVEKCk7IH0KLQotZXh0ZXJuICJDIiB2b2lkIEphdmFfb3JnX2ozX21tdGtfT2JqZWN0TW9kZWxfZHVtcE9iamVjdF9fTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlXzIgKAotICAgIE1NVGtPYmplY3QqIE9NLCB1aW50cHRyX3Qgb2JqZWN0KSB7IFVOSU1QTEVNRU5URUQoKTsgfQotCi19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL21tdGstajMvUmVmZXJlbmNlUHJvY2Vzc29yLmNwcCBiL3Zta2l0L21tdGsvbW10ay1qMy9SZWZlcmVuY2VQcm9jZXNzb3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDZiYzMwLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvbW10ay1qMy9SZWZlcmVuY2VQcm9jZXNzb3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy89PT0tLS0tLS0tLSBSZWZlcmVuY2VQcm9jZXNzb3IuY3BwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vPT09LS0tLS0tLS0gSW1wbGVtZW50YXRpb24gb2YgdGhlIFNlbGVjdGVkIGNsYXNzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJtdm0vVmlydHVhbE1hY2hpbmUuaCIKLSNpbmNsdWRlICJtdm0vVk1LaXQuaCIKLSNpbmNsdWRlICJtdm0vU3lzdGVtVGhyZWFkcy5oIgotI2luY2x1ZGUgIk1NVGtPYmplY3QuaCIKLQotbmFtZXNwYWNlIG1tdGsgewotCi1leHRlcm4gIkMiIHZvaWQgSmF2YV9vcmdfajNfbW10a19SZWZlcmVuY2VQcm9jZXNzb3Jfc2Nhbl9fTG9yZ19tbXRrX3BsYW5fVHJhY2VMb2NhbF8yWiAoTU1Ua1JlZmVyZW5jZVByb2Nlc3NvciogUlAsIHVpbnRwdHJfdCBUTCwgdWludDhfdCBudXJzZXJ5KSB7Ci0gIG12bTo6VGhyZWFkKiB0aCA9IG12bTo6VGhyZWFkOjpnZXQoKTsKLSAgdWludDMyX3QgdmFsID0gUlAtPm9yZGluYWw7Ci0KLSAgaWYgKHZhbCA9PSAwKSB7Ci0gICAgdGgtPnZta2l0LT5zY2FuU29mdFJlZmVyZW5jZXNRdWV1ZShUTCk7Ci0gIH0gZWxzZSBpZiAodmFsID09IDEpIHsKLSAgICB0aC0+dm1raXQtPnNjYW5XZWFrUmVmZXJlbmNlc1F1ZXVlKFRMKTsKLSAgfSBlbHNlIHsKLSAgICBhc3NlcnQodmFsID09IDIpOwotICAgIHRoLT52bWtpdC0+c2NhblBoYW50b21SZWZlcmVuY2VzUXVldWUoVEwpOwotICB9Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19tbXRrX1JlZmVyZW5jZVByb2Nlc3Nvcl9mb3J3YXJkX19Mb3JnX21tdGtfcGxhbl9UcmFjZUxvY2FsXzJaIChNTVRrUmVmZXJlbmNlUHJvY2Vzc29yKiBSUCwgdWludHB0cl90IFRMLCB1aW50OF90IG51cnNlcnkpIHsgVU5JTVBMRU1FTlRFRCgpOyB9Ci1leHRlcm4gIkMiIHZvaWQgSmF2YV9vcmdfajNfbW10a19SZWZlcmVuY2VQcm9jZXNzb3JfY2xlYXJfXyAoTU1Ua1JlZmVyZW5jZVByb2Nlc3NvciogUlApIHsgVU5JTVBMRU1FTlRFRCgpOyB9Ci1leHRlcm4gIkMiIHZvaWQgSmF2YV9vcmdfajNfbW10a19SZWZlcmVuY2VQcm9jZXNzb3JfY291bnRXYWl0aW5nUmVmZXJlbmNlc19fIChNTVRrUmVmZXJlbmNlUHJvY2Vzc29yKiBSUCkgeyBVTklNUExFTUVOVEVEKCk7IH0KLQotfQpkaWZmIC0tZ2l0IGEvdm1raXQvbW10ay9tbXRrLWozL1J1bnRpbWVIZWxwZXJzLmNwcCBiL3Zta2l0L21tdGsvbW10ay1qMy9SdW50aW1lSGVscGVycy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5Y2Y2YzUuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9tbXRrLWozL1J1bnRpbWVIZWxwZXJzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vPT09LS0gUnVudGltZUhlbHBlcnMuY3BwIC0gSW1wbGVtZW50IHJ0LmphciBmdW5jdGlvbnMgbmVlZGVkIGJ5IE1NVGsgIC0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSAiTU1Ua09iamVjdC5oIgotCi1uYW1lc3BhY2UgbW10ayB7Ci0KLWV4dGVybiAiQyIgdWludDE2X3QgTU1Ua0NoYXJBdChNTVRrU3RyaW5nKiBzdHIsIHVpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBzdHItPnZhbHVlLT5lbGVtZW50c1tpbmRleF07Ci19Ci0KLWV4dGVybiAiQyIgTU1Ua09iamVjdCogTU1Ua0dldENsYXNzKE1NVGtPYmplY3QqIG9iaikgewotICByZXR1cm4gb2JqLT52aXJ0dWFsVGFibGUtPmNsLT5kZWxlZ2F0ZWU7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvbW10ay1qMy9TY2FubmluZy5jcHAgYi92bWtpdC9tbXRrL21tdGstajMvU2Nhbm5pbmcuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTA0ZjY1Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvbW10ay1qMy9TY2FubmluZy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vLz09PS0tLS0tLS0tIFNjYW5uaW5nLmNwcCAtIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTY2FubmluZyBjbGFzcyAgLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAibXZtL1ZpcnR1YWxNYWNoaW5lLmgiCi0jaW5jbHVkZSAiTU1Ua09iamVjdC5oIgotI2luY2x1ZGUgIm12bS9HQy5oIgotI2luY2x1ZGUgIm12bS9WTUtpdC5oIgotCi1uYW1lc3BhY2UgbW10ayB7Ci0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19tbXRrX1NjYW5uaW5nX2NvbXB1dGVUaHJlYWRSb290c19fTG9yZ19tbXRrX3BsYW5fVHJhY2VMb2NhbF8yIChNTVRrT2JqZWN0KiBTY2FubmluZywgTU1Ua09iamVjdCogVEwpIHsKLSAgLy8gV2hlbiBlbnRlcmluZyB0aGlzIGZ1bmN0aW9uLCBhbGwgdGhyZWFkcyBhcmUgd2FpdGluZyBvbiB0aGUgcmVuZGV6dm91cyB0bwotICAvLyBmaW5pc2guCi0gIG12bTo6Vk1LaXQqIHZta2l0ID0gbXZtOjpUaHJlYWQ6OmdldCgpLT52bWtpdDsKLSAgbXZtOjpUaHJlYWQqIHRjdXI7Ci0gIAotCWZvcih0Y3VyPXZta2l0LT5ydW5uaW5nVGhyZWFkcy5uZXh0KCk7IHRjdXIhPSZ2bWtpdC0+cnVubmluZ1RocmVhZHM7IHRjdXI9dGN1ci0+bmV4dCgpKSB7Ci0gICAgdGN1ci0+c2NhblN0YWNrKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihUTCkpOwotICB9Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19tbXRrX1NjYW5uaW5nX2NvbXB1dGVHbG9iYWxSb290c19fTG9yZ19tbXRrX3BsYW5fVHJhY2VMb2NhbF8yIChNTVRrT2JqZWN0KiBTY2FubmluZywgTU1Ua09iamVjdCogVEwpIHsgCi0gIG12bTo6VGhyZWFkOjpnZXQoKS0+dm1raXQtPnRyYWNlcihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oVEwpKTsKLQotCW12bTo6Vk1LaXQqIHZta2l0ID0gbXZtOjpUaHJlYWQ6OmdldCgpLT52bWtpdDsKLSAgbXZtOjpUaHJlYWQqIHRjdXI7Ci0gIAotCWZvcih0Y3VyPXZta2l0LT5ydW5uaW5nVGhyZWFkcy5uZXh0KCk7IHRjdXIhPSZ2bWtpdC0+cnVubmluZ1RocmVhZHM7IHRjdXI9dGN1ci0+bmV4dCgpKSB7Ci0gICAgdGN1ci0+dHJhY2VyKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihUTCkpOwotICB9Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19tbXRrX1NjYW5uaW5nX2NvbXB1dGVTdGF0aWNSb290c19fTG9yZ19tbXRrX3BsYW5fVHJhY2VMb2NhbF8yIChNTVRrT2JqZWN0KiBTY2FubmluZywgTU1Ua09iamVjdCogVEwpIHsKLSAgLy8gTm90aGluZyB0byBkby4KLX0KLQotZXh0ZXJuICJDIiB2b2lkIEphdmFfb3JnX2ozX21tdGtfU2Nhbm5pbmdfcmVzZXRUaHJlYWRDb3VudGVyX18gKE1NVGtPYmplY3QqIFNjYW5uaW5nKSB7Ci0gIC8vIE5vdGhpbmcgdG8gZG8uCi19Ci0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19tbXRrX1NjYW5uaW5nX3NwZWNpYWxpemVkU2Nhbk9iamVjdF9fSUxvcmdfbW10a19wbGFuX1RyYW5zaXRpdmVDbG9zdXJlXzJMb3JnX3ZtbWFnaWNfdW5ib3hlZF9PYmplY3RSZWZlcmVuY2VfMiAoTU1Ua09iamVjdCogU2Nhbm5pbmcsIHVpbnQzMl90IGlkLCBNTVRrT2JqZWN0KiBUQywgbXZtOjpnYyogb2JqKSBBTFdBWVNfSU5MSU5FOwotCi1leHRlcm4gIkMiIHZvaWQgSmF2YV9vcmdfajNfbW10a19TY2FubmluZ19zcGVjaWFsaXplZFNjYW5PYmplY3RfX0lMb3JnX21tdGtfcGxhbl9UcmFuc2l0aXZlQ2xvc3VyZV8yTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlXzIgKE1NVGtPYmplY3QqIFNjYW5uaW5nLCB1aW50MzJfdCBpZCwgTU1Ua09iamVjdCogVEMsIG12bTo6Z2MqIG9iaikgewotICBhc3NlcnQob2JqICYmICJObyBvYmplY3QgdG8gdHJhY2UiKTsKLSAgYXNzZXJ0KG9iai0+Z2V0VmlydHVhbFRhYmxlKCkgJiYgIk5vIHZpcnR1YWwgdGFibGUiKTsKLSAgYXNzZXJ0KG9iai0+Z2V0VmlydHVhbFRhYmxlKCktPnRyYWNlciAmJiAiTm8gdHJhY2VyIGluIFZUIik7Ci0gIG9iai0+dHJhY2VyKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihUQykpOwotfQotCi1leHRlcm4gIkMiIHZvaWQgSmF2YV9vcmdfajNfbW10a19TY2FubmluZ19wcmVDb3B5R0NJbnN0YW5jZXNfX0xvcmdfbW10a19wbGFuX1RyYWNlTG9jYWxfMiAoTU1Ua09iamVjdCogU2Nhbm5pbmcsIE1NVGtPYmplY3QqIFRMKSB7Ci0gIC8vIE5vdGhpbmcgdG8gZG8sIHRoZXJlIGFyZSBubyBHQyBvYmplY3RzIG9uIHdoaWNoIHRoZSBHQyBkZXBlbmRzLgotfQotCi1leHRlcm4gIkMiIHZvaWQgSmF2YV9vcmdfajNfbW10a19TY2FubmluZ19zY2FuT2JqZWN0X19Mb3JnX21tdGtfcGxhbl9UcmFuc2l0aXZlQ2xvc3VyZV8yTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlXzIgKAotICAgIE1NVGtPYmplY3QqIFNjYW5uaW5nLCB1aW50cHRyX3QgVEMsIG12bTo6Z2MqIG9iaikgewotICBhc3NlcnQob2JqICYmICJObyBvYmplY3QgdG8gdHJhY2UiKTsKLSAgYXNzZXJ0KG9iai0+Z2V0VmlydHVhbFRhYmxlKCkgJiYgIk5vIHZpcnR1YWwgdGFibGUiKTsKLSAgYXNzZXJ0KG9iai0+Z2V0VmlydHVhbFRhYmxlKCktPnRyYWNlciAmJiAiTm8gdHJhY2VyIGluIFZUIik7Ci0gIG9iai0+dHJhY2VyKFRDKTsKLX0KLQotZXh0ZXJuICJDIiB2b2lkIEphdmFfb3JnX2ozX21tdGtfU2Nhbm5pbmdfcHJlY29weUNoaWxkcmVuX19Mb3JnX21tdGtfcGxhbl9UcmFjZUxvY2FsXzJMb3JnX3ZtbWFnaWNfdW5ib3hlZF9PYmplY3RSZWZlcmVuY2VfMiAoCi0gICAgTU1Ua09iamVjdCogU2Nhbm5pbmcsIE1NVGtPYmplY3QgVEwsIHVpbnRwdHJfdCByZWYpIHsgVU5JTVBMRU1FTlRFRCgpOyB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvbW10ay1qMy9TZWxlY3RlZC5jcHAgYi92bWtpdC9tbXRrL21tdGstajMvU2VsZWN0ZWQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjU3ZTEwLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvbW10ay1qMy9TZWxlY3RlZC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vLz09PS0tLS0tLS0tIFNlbGVjdGVkLmNwcCAtIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTZWxlY3RlZCBjbGFzcyAgLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgIk11dGF0b3JUaHJlYWQuaCIKLSNpbmNsdWRlICJNTVRrT2JqZWN0LmgiCi0KLW5hbWVzcGFjZSBtbXRrIHsKLQotZXh0ZXJuICJDIiBNTVRrT2JqZWN0KiBKYXZhX29yZ19qM19jb25maWdfU2VsZWN0ZWRfMDAwMjRNdXRhdG9yX2dldF9fKCkgewotICByZXR1cm4gKE1NVGtPYmplY3QqKW12bTo6TXV0YXRvclRocmVhZDo6Z2V0KCktPk11dGF0b3JDb250ZXh0OwotfQotCi19CmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL21tdGstajMvU3RhdGlzdGljcy5jcHAgYi92bWtpdC9tbXRrL21tdGstajMvU3RhdGlzdGljcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNmQ2OTkuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9tbXRrLWozL1N0YXRpc3RpY3MuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy89PT0tLS0tLSBTdGF0aXN0aWNzLmNwcCAtIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdGF0aXN0aWNzIGNsYXNzICAtLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJNTVRrT2JqZWN0LmgiCi0KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPGN0aW1lPgotCi1uYW1lc3BhY2UgbW10ayB7Ci0KLWV4dGVybiAiQyIgaW50NjRfdCBKYXZhX29yZ19qM19tbXRrX1N0YXRpc3RpY3NfY3ljbGVzX18gKE1NVGtPYmplY3QqIFMpIHsKLSAgcmV0dXJuIDA7Ci19Ci0KLWV4dGVybiAiQyIgaW50NjRfdCBKYXZhX29yZ19qM19tbXRrX1N0YXRpc3RpY3NfbmFub1RpbWVfXyAoTU1Ua09iamVjdCogUykgewotICBpbnQ2NF90IHJlc3VsdDsKLSAgc3RydWN0IHRpbWV2YWwgdHA7IAotCi0gIGludCByZXMgPSBnZXR0aW1lb2ZkYXkgKCZ0cCwgTlVMTCk7Ci0gIGFzc2VydChyZXMgIT0gLTEgJiYgImZhaWxlZCBnZXR0aW1lb2ZkYXkuIik7Ci0KLSAgcmVzdWx0ID0gKGludDY0X3QpIHRwLnR2X3NlYzsKLSAgcmVzdWx0ICo9IChpbnQ2NF90KTEwMDAwMDBMOwotICByZXN1bHQgKz0gKGludDY0X3QpdHAudHZfdXNlYzsKLSAgcmVzdWx0ICo9IChpbnQ2NF90KTEwMDA7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1leHRlcm4gIkMiIGludDMyX3QgSmF2YV9vcmdfajNfbW10a19TdGF0aXN0aWNzX2dldENvbGxlY3Rpb25Db3VudF9fIChNTVRrT2JqZWN0KiBTKSB7Ci0gIHJldHVybiAwOwotfQotCi1leHRlcm4gIkMiIHZvaWQgSmF2YV9vcmdfajNfbW10a19TdGF0aXN0aWNzX3BlcmZFdmVudEluaXRfX0xqYXZhX2xhbmdfU3RyaW5nXzIoTU1Ua09iamVjdCogUywgTU1Ua09iamVjdCogU3RyKSB7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19tbXRrX1N0YXRpc3RpY3NfcGVyZkV2ZW50UmVhZF9fSV8zSihNTVRrT2JqZWN0KiBTLCBpbnQgaWQsIGludDY0X3QqIHZhbHVlcykgewotfQotCi19IC8vIG5hbWVzcGFjZSBtbXRrCmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL21tdGstajMvU3RyaW5ncy5jcHAgYi92bWtpdC9tbXRrL21tdGstajMvU3RyaW5ncy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MWViZmYuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9tbXRrLWozL1N0cmluZ3MuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0gU3RyaW5ncy5jcHAgLSBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RyaW5ncyBjbGFzcyAgLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9UaHJlYWQuaCIKLQotI2luY2x1ZGUgIk1NVGtPYmplY3QuaCIKLQotbmFtZXNwYWNlIG1tdGsgewotCi1leHRlcm4gIkMiIHZvaWQgSmF2YV9vcmdfajNfbW10a19TdHJpbmdzX3dyaXRlX19fM0NJKE1NVGtPYmplY3QqIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1Ua0FycmF5KiBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbnQzMiBsZW4pIHsKLSAgZm9yIChzaW50MzIgaSA9IDA7IGkgPCBsZW47ICsraSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiJWMiLCBtc2ctPmVsZW1lbnRzW2ldKTsKLSAgfQotfQotCi1leHRlcm4gIkMiIHZvaWQgSmF2YV9vcmdfajNfbW10a19TdHJpbmdzX3dyaXRlVGhyZWFkSWRfX18zQ0koTU1Ua09iamVjdCogc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1NVGtBcnJheSogbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbnQzMiBsZW4pIHsKLSAgZnByaW50ZihzdGRlcnIsICJbJXBdICIsICh2b2lkKiltdm06OlRocmVhZDo6Z2V0KCkpOwotICAKLSAgZm9yIChzaW50MzIgaSA9IDA7IGkgPCBsZW47ICsraSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiJWMiLCBtc2ctPmVsZW1lbnRzW2ldKTsKLSAgfQotfQotCi0KLWV4dGVybiAiQyIgc2ludDMyCi1KYXZhX29yZ19qM19tbXRrX1N0cmluZ3NfY29weVN0cmluZ1RvQ2hhcnNfX0xqYXZhX2xhbmdfU3RyaW5nXzJfM0NJSSgKLSAgICBNTVRrT2JqZWN0KiBvYmosIE1NVGtTdHJpbmcqIHN0ciwgTU1Ua0FycmF5KiBkc3QsIHVpbnQzMiBkc3RCZWdpbiwKLSAgICB1aW50MzIgZHN0RW5kKSB7Ci0KLSAgc2ludDMyIGxlbiA9IHN0ci0+Y291bnQ7Ci0gIHNpbnQzMiBuID0gKGRzdEJlZ2luICsgbGVuIDw9IGRzdEVuZCkgPyBsZW4gOiAoZHN0RW5kIC0gZHN0QmVnaW4pOwotCi0gIGZvciAoc2ludDMyIGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgZHN0LT5lbGVtZW50c1tkc3RCZWdpbiArIGldID0gc3RyLT52YWx1ZS0+ZWxlbWVudHNbc3RyLT5vZmZzZXQgKyBpXTsKLSAgfQotICAKLSAgcmV0dXJuIG47Ci0gCi19Ci0KLX0gLy8gZW5kIG5hbWVzcGFjZSBtbXRrCmRpZmYgLS1naXQgYS92bWtpdC9tbXRrL21tdGstajMvU3luY2hyb25pemVkQ291bnRlci5jcHAgYi92bWtpdC9tbXRrL21tdGstajMvU3luY2hyb25pemVkQ291bnRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwOTg2YmQuLjAwMDAwMDAKLS0tIGEvdm1raXQvbW10ay9tbXRrLWozL1N5bmNocm9uaXplZENvdW50ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLy89PT0tLS0tLS0tLSBTeW5jaHJvbml6ZWRDb3VudGVyLmNwcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vPT09LS0tLS0tLS0gSW1wbGVtZW50YXRpb24gb2YgdGhlIFN5bmNocm9uaXplZENvdW50ZXIgY2xhc3MgIC0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSAiTU1Ua09iamVjdC5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0KLW5hbWVzcGFjZSBtbXRrIHsKLQotZXh0ZXJuICJDIiB2b2lkIEphdmFfb3JnX2ozX21tdGtfU3luY2hyb25pemVkQ291bnRlcl9yZXNldF9fIChNTVRrT2JqZWN0KiBzZWxmKSB7IFVOSU1QTEVNRU5URUQoKTsgfQotZXh0ZXJuICJDIiB2b2lkIEphdmFfb3JnX2ozX21tdGtfU3luY2hyb25pemVkQ291bnRlcl9pbmNyZW1lbnRfXyAoTU1Ua09iamVjdCogc2VsZikgeyBVTklNUExFTUVOVEVEKCk7IH0KLQotfSAvLyBlbmQgbmFtZXNwYWNlIG1tdGsKZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvbW10ay1qMy9UcmFjZUludGVyZmFjZS5jcHAgYi92bWtpdC9tbXRrL21tdGstajMvVHJhY2VJbnRlcmZhY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODZkYjc2Li4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvbW10ay1qMy9UcmFjZUludGVyZmFjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLz09PS0tIFRyYWNlSW50ZXJmYWNlLmNwcCAtIEltcGxlbWVudGF0aW9uIG9mIHRoZSBUcmFjZUludGVyZmFjZSBjbGFzcyAgLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAiTU1Ua09iamVjdC5oIgotCi1uYW1lc3BhY2UgbW10ayB7Ci0KLWV4dGVybiAiQyIgYm9vbCBKYXZhX29yZ19qM19tbXRrX1RyYWNlSW50ZXJmYWNlX2djRW5hYmxlZF9fIChNTVRrT2JqZWN0KiBUSSkgeyBVTklNUExFTUVOVEVEKCk7IH0KLQotZXh0ZXJuICJDIiB2b2lkIEphdmFfb3JnX2ozX21tdGtfVHJhY2VJbnRlcmZhY2VfYWRqdXN0U2xvdE9mZnNldF9fWkxvcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZV8yTG9yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc18yICgKLSAgICBNTVRrT2JqZWN0KiBUSSwgYm9vbCBzY2FsYXIsIHVpbnRwdHJfdCBzcmMsIHVpbnRwdHJfdCBzbG90KSB7IFVOSU1QTEVNRU5URUQoKTsgfQotCi1leHRlcm4gIkMiIHZvaWQgSmF2YV9vcmdfajNfbW10a19UcmFjZUludGVyZmFjZV9za2lwT3duRnJhbWVzQW5kRHVtcF9fTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlXzIgKAotICAgIE1NVGtPYmplY3QqIFRJLCB1aW50cHRyX3QgdHlwZVJlZikgeyBVTklNUExFTUVOVEVEKCk7IH0KLQotZXh0ZXJuICJDIiB2b2lkIEphdmFfb3JnX2ozX21tdGtfVHJhY2VJbnRlcmZhY2VfdXBkYXRlRGVhdGhUaW1lX19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9PYmplY3RSZWZlcmVuY2VfMiAoCi0gICAgTU1Ua09iamVjdCogVEksIHVpbnRwdHJfdCBvYmopIHsgVU5JTVBMRU1FTlRFRCgpOyB9Ci0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19tbXRrX1RyYWNlSW50ZXJmYWNlX3NldERlYXRoVGltZV9fTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlXzJMb3JnX3ZtbWFnaWNfdW5ib3hlZF9Xb3JkXzIgKAotICAgIE1NVGtPYmplY3QqIFRJLCB1aW50cHRyX3QgcmVmLCB1aW50cHRyX3QgdGltZSkgeyBVTklNUExFTUVOVEVEKCk7IH0KLQotZXh0ZXJuICJDIiB2b2lkIEphdmFfb3JnX2ozX21tdGtfVHJhY2VJbnRlcmZhY2Vfc2V0TGlua19fTG9yZ192bW1hZ2ljX3VuYm94ZWRfT2JqZWN0UmVmZXJlbmNlXzJMb3JnX3ZtbWFnaWNfdW5ib3hlZF9PYmplY3RSZWZlcmVuY2VfMiAoCi0gICAgTU1Ua09iamVjdCogVEksIHVpbnRwdHJfdCByZWYsIHVpbnRwdHJfdCBsaW5rKSB7IFVOSU1QTEVNRU5URUQoKTsgfQotCi1leHRlcm4gIkMiIHZvaWQgSmF2YV9vcmdfajNfbW10a19UcmFjZUludGVyZmFjZV91cGRhdGVUaW1lX19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9Xb3JkXzIgKAotICAgIE1NVGtPYmplY3QqIFRJLCB1aW50cHRyX3Qgb2JqKSB7IFVOSU1QTEVNRU5URUQoKTsgfQotCi1leHRlcm4gIkMiIHZvaWQgSmF2YV9vcmdfajNfbW10a19UcmFjZUludGVyZmFjZV9nZXRPSURfX0xvcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZV8yICgKLSAgICBNTVRrT2JqZWN0KiBUSSwgdWludHB0cl90IHJlZikgeyBVTklNUExFTUVOVEVEKCk7IH0KLQotZXh0ZXJuICJDIiB1aW50cHRyX3QgSmF2YV9vcmdfajNfbW10a19UcmFjZUludGVyZmFjZV9nZXREZWF0aFRpbWVfX0xvcmdfdm1tYWdpY191bmJveGVkX09iamVjdFJlZmVyZW5jZV8yICgKLSAgICBNTVRrT2JqZWN0KiBUSSwgdWludHB0cl90IHJlZikgeyBVTklNUExFTUVOVEVEKCk7IH0KLQotZXh0ZXJuICJDIiB1aW50cHRyX3QgSmF2YV9vcmdfajNfbW10a19UcmFjZUludGVyZmFjZV9nZXRMaW5rX19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9PYmplY3RSZWZlcmVuY2VfMiAoCi0gICAgTU1Ua09iamVjdCogVEksIHVpbnRwdHJfdCByZWYpIHsgVU5JTVBMRU1FTlRFRCgpOyB9Ci0KLWV4dGVybiAiQyIgdWludHB0cl90IEphdmFfb3JnX2ozX21tdGtfVHJhY2VJbnRlcmZhY2VfZ2V0Qm9vdEltYWdlTGlua19fICgKLSAgICBNTVRrT2JqZWN0KiBUSSkgeyBVTklNUExFTUVOVEVEKCk7IH0KLQotZXh0ZXJuICJDIiB1aW50cHRyX3QgSmF2YV9vcmdfajNfbW10a19UcmFjZUludGVyZmFjZV9nZXRPSURfXyAoCi0gICAgTU1Ua09iamVjdCogVEkpIHsgVU5JTVBMRU1FTlRFRCgpOyB9Ci0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19tbXRrX1RyYWNlSW50ZXJmYWNlX3NldE9JRF9fTG9yZ192bW1hZ2ljX3VuYm94ZWRfV29yZF8yICgKLSAgICBNTVRrT2JqZWN0KiBUSSwgdWludHB0cl90IG9pZCkgeyBVTklNUExFTUVOVEVEKCk7IH0KLQotZXh0ZXJuICJDIiBzaW50MzIgSmF2YV9vcmdfajNfbW10a19UcmFjZUludGVyZmFjZV9nZXRIZWFkZXJTaXplX18gKE1NVGtPYmplY3QqIFRJKSB7IFVOSU1QTEVNRU5URUQoKTsgfQotZXh0ZXJuICJDIiBzaW50MzIgSmF2YV9vcmdfajNfbW10a19UcmFjZUludGVyZmFjZV9nZXRIZWFkZXJFbmRPZmZzZXRfXyAoTU1Ua09iamVjdCogVEkpIHsgVU5JTVBMRU1FTlRFRCgpOyB9Ci0KLX0gLy8gbmFtZXNwYWNlIG1tdGsKZGlmZiAtLWdpdCBhL3Zta2l0L21tdGsvbW10ay1qMy9WTS5jcHAgYi92bWtpdC9tbXRrL21tdGstajMvVk0uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTBiN2EyLi4wMDAwMDAwCi0tLSBhL3Zta2l0L21tdGsvbW10ay1qMy9WTS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLS0tIFZNLmNwcCAtIEltcGxlbWVudGF0aW9uIG9mIHRoZSBWTSBjbGFzcyAgLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAiTU1Ua09iamVjdC5oIgotCi1uYW1lc3BhY2UgbW10ayB7Ci0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19ydW50aW1lX1ZNX3N5c1dyaXRlX19Mb3JnX3ZtbWFnaWNfdW5ib3hlZF9FeHRlbnRfMiAodWludHB0cl90IGUpIHsgVU5JTVBMRU1FTlRFRCgpOyB9Ci1leHRlcm4gIkMiIHZvaWQgSmF2YV9vcmdfajNfcnVudGltZV9WTV9zeXNXcml0ZV9fTG9yZ192bW1hZ2ljX3VuYm94ZWRfQWRkcmVzc18yICh1aW50cHRyX3QgYSkgeyBVTklNUExFTUVOVEVEKCk7IH0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19ydW50aW1lX1ZNX3N5c1dyaXRlX19GIChmbG9hdCBmKSB7IFVOSU1QTEVNRU5URUQoKTsgfQotZXh0ZXJuICJDIiB2b2lkIEphdmFfb3JnX2ozX3J1bnRpbWVfVk1fc3lzV3JpdGVfX0kgKGludCBpKSB7IFVOSU1QTEVNRU5URUQoKTsgfQotZXh0ZXJuICJDIiB2b2lkIEphdmFfb3JnX2ozX3J1bnRpbWVfVk1fc3lzV3JpdGVfX0xqYXZhX2xhbmdfU3RyaW5nXzIgKE1NVGtTdHJpbmcqIG1zZykgeyBVTklNUExFTUVOVEVEKCk7IH0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19ydW50aW1lX1ZNX3N5c1dyaXRlbG5fXyAoKSB7IFVOSU1QTEVNRU5URUQoKTsgfQotZXh0ZXJuICJDIiB2b2lkIEphdmFfb3JnX2ozX3J1bnRpbWVfVk1fc3lzV3JpdGVsbl9fTGphdmFfbGFuZ19TdHJpbmdfMiAoTU1Ua1N0cmluZyogbXNnKSB7IFVOSU1QTEVNRU5URUQoKTsgfQotCi1leHRlcm4gIkMiIHZvaWQgSmF2YV9vcmdfajNfcnVudGltZV9WTV9fMWFzc2VydF9fWkxqYXZhX2xhbmdfU3RyaW5nXzIgKGJvb2wgY29uZCwgTU1Ua1N0cmluZyogbXNnKSB7Ci0gIEFCT1JUKCk7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19ydW50aW1lX1ZNX3N5c0V4aXRfX0kgKGludCBpKSB7Ci0gIEFCT1JUKCk7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBKYXZhX29yZ19qM19ydW50aW1lX1ZNX3N5c0ZhaWxfX0xqYXZhX2xhbmdfU3RyaW5nXzIgKE1NVGtTdHJpbmcqIG1zZykgewotICAvLyBKdXN0IGNhbGwgYWJvcnQgYmVjYXVzZSBnY21hbGxvYyBjYWxscyB0aGlzIGZ1bmN0aW9uLiBJZiBpdCB3ZXJlIHRvCi0gIC8vIGNhbGwgcHJpbnRmLCBNTVRrSW5saW5lLmluYyBjb3VsZCBub3QgYmUgSklULWNvbXBpbGVkLgotICBhYm9ydCgpOwotfQotCi1leHRlcm4gIkMiIHZvaWQgSmF2YV9vcmdfajNfcnVudGltZV9WTV9fMWFzc2VydF9fWiAodWludDhfdCBjb25kKSB7Ci0gIEFTU0VSVChjb25kKTsKLX0KLQotZXh0ZXJuICJDIiBib29sIEphdmFfb3JnX2ozX3J1bnRpbWVfVk1fYnVpbGRGb3I2NEFkZHJfXyAoKSB7IAotI2lmIChfX1dPUkRTSVpFPT02NCkKLSAgcmV0dXJuIHRydWU7Ci0jZWxzZQotICByZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLX0KLQotZXh0ZXJuICJDIiBib29sIEphdmFfb3JnX2ozX3J1bnRpbWVfVk1fYnVpbGRGb3JJQTMyX18gKCkgeyAKLSNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKGkzODYpIHx8IGRlZmluZWQoX01fSVg4NikKLSAgcmV0dXJuIHRydWU7Ci0jZWxzZQotICByZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLX0KLQotZXh0ZXJuICJDIiBib29sIEphdmFfb3JnX2ozX3J1bnRpbWVfVk1fdmVyaWZ5QXNzZXJ0aW9uc19fICgpIHsKLSAgLy8gTm90ZSB0aGF0IERFQlVHIGlzIGRlZmluZWQgaW4gbWFrZSBFTkFCTEVfT1BUSU1JWkVEPTEuCi0gIC8vIFlvdSBtdXN0IHByb3ZpZGUgRElTQUJMRV9BU1NFUlRJT05TPTEgdG8gbm90IGhhdmUgREVCVUcgZGVmaW5lZC4KLSAgLy8gVG8gZ2VuZXJhdGUgTU1Ua0lubGluZS5pbmMsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZS4KLSNpZiAwCi0gIHJldHVybiB0cnVlOwotI2Vsc2UKLSAgcmV0dXJuIGZhbHNlOwotI2VuZGlmCi19Ci0KLX0gLy8gbmFtZXNwYWNlIG1tdGsKZGlmZiAtLWdpdCBhL3Zta2l0L3BhdGNoZXMvdm1raXQtbGx2bS1wcGMucGF0Y2ggYi92bWtpdC9wYXRjaGVzL3Zta2l0LWxsdm0tcHBjLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWYwY2FkLi4wMDAwMDAwCi0tLSBhL3Zta2l0L3BhdGNoZXMvdm1raXQtbGx2bS1wcGMucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotSW5kZXg6IFBQQ0luc3RySW5mby50ZAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tIFBQQ0luc3RySW5mby50ZAkocmV2aXNpb24gNTAwMDYpCi0rKysgUFBDSW5zdHJJbmZvLnRkCSh3b3JraW5nIGNvcHkpCi1AQCAtMTIxMiw2ICsxMjEyLDggQEAKLSAgICAgICAgICAgKEJMX0VMRiB0ZXh0ZXJuYWxzeW06JGRzdCk+OwotIAotIC8vIEhpIGFuZCBMbyBmb3IgRGFyd2luIEdsb2JhbCBBZGRyZXNzZXMuCi0rZGVmIDogUGF0PChQUENoaSB0ZXh0ZXJuYWxzeW06JGluLCAwKSwgKExJUyB0ZXh0ZXJuYWxzeW06JGluKT47Ci0rZGVmIDogUGF0PChQUENsbyB0ZXh0ZXJuYWxzeW06JGluLCAwKSwgKExJIHRleHRlcm5hbHN5bTokaW4pPjsKLSBkZWYgOiBQYXQ8KFBQQ2hpIHRnbG9iYWxhZGRyOiRpbiwgMCksIChMSVMgdGdsb2JhbGFkZHI6JGluKT47Ci0gZGVmIDogUGF0PChQUENsbyB0Z2xvYmFsYWRkcjokaW4sIDApLCAoTEkgdGdsb2JhbGFkZHI6JGluKT47Ci0gZGVmIDogUGF0PChQUENoaSB0Y29uc3Rwb29sOiRpbiwgMCksIChMSVMgdGNvbnN0cG9vbDokaW4pPjsKLUluZGV4OiBQUENKSVRJbmZvLmNwcAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tIFBQQ0pJVEluZm8uY3BwCShyZXZpc2lvbiA1MDAwNikKLSsrKyBQUENKSVRJbmZvLmNwcAkod29ya2luZyBjb3B5KQotQEAgLTEzLDEyICsxMywxNiBAQAotIAotICNkZWZpbmUgREVCVUdfVFlQRSAiaml0IgotICNpbmNsdWRlICJQUENKSVRJbmZvLmgiCi0rI2luY2x1ZGUgIlBQQ1JlZ2lzdGVySW5mby5oIgotICNpbmNsdWRlICJQUENSZWxvY2F0aW9ucy5oIgotICNpbmNsdWRlICJQUENUYXJnZXRNYWNoaW5lLmgiCi0gI2luY2x1ZGUgImxsdm0vRnVuY3Rpb24uaCIKLSAjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVDb2RlRW1pdHRlci5oIgotICNpbmNsdWRlICJsbHZtL0NvbmZpZy9hbGxvY2EuaCIKLSsjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvRXhlY3V0aW9uRW5naW5lLmgiCi0gI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgotKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRHdhcmYuaCIKLSsjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgotICNpbmNsdWRlIDxzZXQ+Ci0gdXNpbmcgbmFtZXNwYWNlIGxsdm07Ci0gCi1AQCAtNTMsMjQgKzU3LDI3IEBACi0gICBpZiAoT2Zmc2V0ID49IC0oMSA8PCAyMykgJiYgT2Zmc2V0IDwgKDEgPDwgMjMpKSB7ICAgLy8gSW4gcmFuZ2U/Ci0gICAgIEF0SVswXSA9IEJVSUxEX0IoT2Zmc2V0LCBpc0NhbGwpOyAgICAgLy8gYi9ibCB0YXJnZXQKLSAgIH0gZWxzZSBpZiAoIWlzNjRCaXQpIHsKLS0gICAgQXRJWzBdID0gQlVJTERfTElTKDEyLCBUbyA+PiAxNik7ICAgICAvLyBsaXMgcjEyLCBoaTE2KGFkZHJlc3MpCi0rICAgIEF0SVswXSA9IEJVSUxEX0IoMCwgZmFsc2UpOyAgICAgICAgICAgLy8gdGhyZWFkIHNhZmV0eQotICAgICBBdElbMV0gPSBCVUlMRF9PUkkoMTIsIDEyLCBUbyk7ICAgICAgIC8vIG9yaSByMTIsIHIxMiwgbG8xNihhZGRyZXNzKQotICAgICBBdElbMl0gPSBCVUlMRF9NVENUUigxMik7ICAgICAgICAgICAgIC8vIG10Y3RyIHIxMgotICAgICBBdElbM10gPSBCVUlMRF9CQ1RSKGlzQ2FsbCk7ICAgICAgICAgIC8vIGJjdHIvYmN0cmwKLSsgICAgQXRJWzBdID0gQlVJTERfTElTKDEyLCBUbyA+PiAxNik7ICAgICAvLyBsaXMgcjEyLCBoaTE2KGFkZHJlc3MpCi0gICB9IGVsc2UgewotLSAgICBBdElbMF0gPSBCVUlMRF9MSVMoMTIsIFRvID4+IDQ4KTsgICAgICAvLyBsaXMgcjEyLCBoaTE2KGFkZHJlc3MpCi0rICAgIEF0SVswXSA9IEJVSUxEX0IoMCwgZmFsc2UpOyAgICAgICAgICAgIC8vIHRocmVhZCBzYWZldHkKLSAgICAgQXRJWzFdID0gQlVJTERfT1JJKDEyLCAxMiwgVG8gPj4gMzIpOyAgLy8gb3JpIHIxMiwgcjEyLCBsbzE2KGFkZHJlc3MpCi0gICAgIEF0SVsyXSA9IEJVSUxEX1NMREkoMTIsIDEyLCAzMik7ICAgICAgIC8vIHNsZGkgcjEyLCByMTIsIDMyCi0gICAgIEF0SVszXSA9IEJVSUxEX09SSVMoMTIsIDEyLCBUbyA+PiAxNik7IC8vIG9yaXMgcjEyLCByMTIsIGhpMTYoYWRkcmVzcykKLSAgICAgQXRJWzRdID0gQlVJTERfT1JJKDEyLCAxMiwgVG8pOyAgICAgICAgLy8gb3JpIHIxMiwgcjEyLCBsbzE2KGFkZHJlc3MpCi0gICAgIEF0SVs1XSA9IEJVSUxEX01UQ1RSKDEyKTsgICAgICAgICAgICAgIC8vIG10Y3RyIHIxMgotICAgICBBdElbNl0gPSBCVUlMRF9CQ1RSKGlzQ2FsbCk7ICAgICAgICAgICAvLyBiY3RyL2JjdHJsCi0rICAgIEF0SVswXSA9IEJVSUxEX0xJUygxMiwgVG8gPj4gNDgpOyAgICAgIC8vIGxpcyByMTIsIGhpMTYoYWRkcmVzcykKLSAgIH0KLSB9Ci0gCi0gZXh0ZXJuICJDIiB2b2lkIFBQQzMyQ29tcGlsYXRpb25DYWxsYmFjaygpOwotIGV4dGVybiAiQyIgdm9pZCBQUEM2NENvbXBpbGF0aW9uQ2FsbGJhY2soKTsKLSAKLSsKLSAjaWYgKGRlZmluZWQoX19QT1dFUlBDX18pIHx8IGRlZmluZWQgKF9fcHBjX18pIHx8IGRlZmluZWQoX1BPV0VSKSkgJiYgXAotICAgICAhZGVmaW5lZChfX3BwYzY0X18pCi0gLy8gQ29tcGlsYXRpb25DYWxsYmFjayBzdHViIC0gV2UgY2FuJ3QgdXNlIGEgQyBmdW5jdGlvbiB3aXRoIGlubGluZSBhc3NlbWJseSBpbgotQEAgLTE0NCw2ICsxNTEsOSBAQAotIC8vIGl0LCBiZWNhdXNlIHdlIHRoZSBwcm9sb2cvZXBpbG9nIGluc2VydGVkIGJ5IEdDQyB3b24ndCB3b3JrIGZvciB1cy4gIEluc3RlYWQsCi0gLy8gd3JpdGUgb3VyIG93biB3cmFwcGVyLCB3aGljaCBkb2VzIHRoaW5ncyBvdXIgd2F5LCBzbyB3ZSBoYXZlIGNvbXBsZXRlIGNvbnRyb2wKLSAvLyBvdmVyIHJlZ2lzdGVyIHNhdmluZyBhbmQgcmVzdG9yaW5nLgotKwotKyMgZGVmaW5lIENGSSh4KSB4Ci0rCi0gYXNtKAotICAgICAiLnRleHRcbiIKLSAgICAgIi5hbGlnbiAyXG4iCi1AQCAtMTU2LDE5ICsxNjYsMjkgQEAKLSAgICAgLy8gRklYTUUgTGF5b3V0Ci0gICAgIC8vICAgOCBkb3VibGUgcmVnaXN0ZXJzICAgICAgIC0gIDY0IGJ5dGVzCi0gICAgIC8vICAgOCBpbnQgcmVnaXN0ZXJzICAgICAgICAgIC0gIDMyIGJ5dGVzCi0rICAgIENGSSgiLmNmaV9zdGFydHByb2NcbiIpICAgIAotKyAgICAic3R3dSAxLCAtMTA0KDEpXG4iCi0rICAgIENGSSgiLmNmaV9hZGp1c3RfY2ZhX29mZnNldCAxMDRcbiIpCi0gICAgICJtZmxyIDBcbiIKLS0gICAgInN0dyAwLCAgNCgxKVxuIgotLSAgICAic3R3dSAxLCAtMTA0KDEpXG4iCi0rICAgICJzdHcgMCwgIDEwOCgxKVxuIgotKyAgICBDRkkoIi5jZmlfb2Zmc2V0IGxyLCA0XG4iKQotICAgICAvLyBTYXZlIGFsbCBpbnQgYXJnIHJlZ2lzdGVycwotLSAgICAic3R3IDEwLCAxMDAoMSlcbiIgICAic3R3IDksICA5NigxKVxuIgotLSAgICAic3R3IDgsICA5MigxKVxuIiAgICAic3R3IDcsICA4OCgxKVxuIgotLSAgICAic3R3IDYsICA4NCgxKVxuIiAgICAic3R3IDUsICA4MCgxKVxuIgotLSAgICAic3R3IDQsICA3NigxKVxuIiAgICAic3R3IDMsICA3MigxKVxuIgotKyAgICAic3R3IDEwLCAxMDAoMSlcbiIgICAKLSsgICAgInN0dyA5LCAgOTYoMSlcbiIKLSsgICAgInN0dyA4LCAgOTIoMSlcbiIgICAgCi0rICAgICJzdHcgNywgIDg4KDEpXG4iCi0rICAgICJzdHcgNiwgIDg0KDEpXG4iICAgIAotKyAgICAic3R3IDUsICA4MCgxKVxuIgotKyAgICAic3R3IDQsICA3NigxKVxuIiAgICAKLSsgICAgInN0dyAzLCAgNzIoMSlcbiIKLSAgICAgLy8gU2F2ZSBhbGwgY2FsbC1jbG9iYmVyZWQgRlAgcmVncy4KLSAgICAgInN0ZmQgOCwgIDY0KDEpXG4iCi0tICAgICJzdGZkIDcsICA1NigxKVxuIiAgICJzdGZkIDYsICA0OCgxKVxuIgotLSAgICAic3RmZCA1LCAgNDAoMSlcbiIgICAic3RmZCA0LCAgMzIoMSlcbiIKLS0gICAgInN0ZmQgMywgIDI0KDEpXG4iICAgInN0ZmQgMiwgIDE2KDEpXG4iCi0rICAgICJzdGZkIDcsICA1NigxKVxuIiAgIAotKyAgICAic3RmZCA2LCAgNDgoMSlcbiIKLSsgICAgInN0ZmQgNSwgIDQwKDEpXG4iICAgCi0rICAgICJzdGZkIDQsICAzMigxKVxuIgotKyAgICAic3RmZCAzLCAgMjQoMSlcbiIgICAKLSsgICAgInN0ZmQgMiwgIDE2KDEpXG4iCi0gICAgICJzdGZkIDEsICA4KDEpXG4iCi0gICAgIC8vIEFyZ3VtZW50cyB0byBDb21waWxhdGlvbiBDYWxsYmFjazoKLSAgICAgLy8gcjMgLSBvdXIgbHIgKGFkZHJlc3Mgb2YgdGhlIGNhbGwgaW5zdHJ1Y3Rpb24gaW4gc3R1YiBwbHVzIDQpCi1AQCAtMTgxLDIxICsyMDEsMjkgQEAKLSAgICAgImJsIFBQQ0NvbXBpbGF0aW9uQ2FsbGJhY2tDXG4iCi0gICAgICJtdGN0ciAzXG4iCi0gICAgIC8vIFJlc3RvcmUgYWxsIGludCBhcmcgcmVnaXN0ZXJzCi0tICAgICJsd3ogMTAsIDEwMCgxKVxuIiAgICJsd3ogOSwgIDk2KDEpXG4iCi0tICAgICJsd3ogOCwgIDkyKDEpXG4iICAgICJsd3ogNywgIDg4KDEpXG4iCi0tICAgICJsd3ogNiwgIDg0KDEpXG4iICAgICJsd3ogNSwgIDgwKDEpXG4iCi0tICAgICJsd3ogNCwgIDc2KDEpXG4iICAgICJsd3ogMywgIDcyKDEpXG4iCi0rICAgICJsd3ogMTAsIDEwMCgxKVxuIiAgIAotKyAgICAibHd6IDksICA5NigxKVxuIgotKyAgICAibHd6IDgsICA5MigxKVxuIiAgICAKLSsgICAgImx3eiA3LCAgODgoMSlcbiIKLSsgICAgImx3eiA2LCAgODQoMSlcbiIgICAgCi0rICAgICJsd3ogNSwgIDgwKDEpXG4iCi0rICAgICJsd3ogNCwgIDc2KDEpXG4iICAgIAotKyAgICAibHd6IDMsICA3MigxKVxuIgotICAgICAvLyBSZXN0b3JlIGFsbCBGUCBhcmcgcmVnaXN0ZXJzCi0gICAgICJsZmQgOCwgIDY0KDEpXG4iCi0tICAgICJsZmQgNywgIDU2KDEpXG4iICAgICJsZmQgNiwgIDQ4KDEpXG4iCi0tICAgICJsZmQgNSwgIDQwKDEpXG4iICAgICJsZmQgNCwgIDMyKDEpXG4iCi0tICAgICJsZmQgMywgIDI0KDEpXG4iICAgICJsZmQgMiwgIDE2KDEpXG4iCi0rICAgICJsZmQgNywgIDU2KDEpXG4iICAgIAotKyAgICAibGZkIDYsICA0OCgxKVxuIgotKyAgICAibGZkIDUsICA0MCgxKVxuIiAgICAKLSsgICAgImxmZCA0LCAgMzIoMSlcbiIKLSsgICAgImxmZCAzLCAgMjQoMSlcbiIgICAgCi0rICAgICJsZmQgMiwgIDE2KDEpXG4iCi0gICAgICJsZmQgMSwgIDgoMSlcbiIKLSAgICAgLy8gUG9wIDMgZnJhbWVzIG9mZiB0aGUgc3RhY2sgYW5kIGJyYW5jaCB0byB0YXJnZXQKLSAgICAgImx3eiAgMSwgMTA0KDEpXG4iCi0gICAgICJsd3ogIDAsIDQoMSlcbiIKLSAgICAgIm10bHIgMFxuIgotICAgICAiYmN0clxuIgotKyAgICBDRkkoIi5jZmlfZW5kcHJvY1xuIikgICAgCi0gICAgICk7Ci0gI2Vsc2UKLSB2b2lkIFBQQzMyQ29tcGlsYXRpb25DYWxsYmFjaygpIHsKLUBAIC0zMjUsNiArMzUzLDMxIEBACi0gICByZXR1cm4gaXM2NEJpdCA/IFBQQzY0Q29tcGlsYXRpb25DYWxsYmFjayA6IFBQQzMyQ29tcGlsYXRpb25DYWxsYmFjazsKLSB9Ci0gCi0rc3RhdGljIGNvbnN0IGNoYXIqIEdldENvbW1vbkZyYW1lMzIoKSB7Ci0rICAgIC8qCi0rICAgIC8vIFNpemUgb2YgY29tbW9uIGZyYW1lCi0rICAgIE1DRS5lbWl0V29yZEJFKDE2KTsKLSsgICAgLy8gQ29tbW9uIGZyYW1lCi0rICAgIE1DRS5lbWl0V29yZEJFKDApOwotKyAgICBNQ0UuZW1pdEJ5dGUoMSk7Ci0rICAgIE1DRS5lbWl0Qnl0ZSgneicpOwotKyAgICBNQ0UuZW1pdEJ5dGUoJ1InKTsKLSsgICAgTUNFLmVtaXRCeXRlKDApOwotKyAgICBNQ0UuZW1pdEJ5dGUoMSk7Ci0rICAgIE1DRS5lbWl0Qnl0ZSgtNCAmIDB4N2YpOwotKyAgICBNQ0UuZW1pdEJ5dGUoMHg0MSk7Ci0rICAgIE1DRS5lbWl0Qnl0ZSgxKTsKLSsgICAgTUNFLmVtaXRCeXRlKDE2KTsKLSsgICAgTUNFLmVtaXRCeXRlKDB4Yyk7Ci0rICAgIE1DRS5lbWl0Qnl0ZSgxKTsKLSsgICAgTUNFLmVtaXRCeXRlKDApOyovCi0rICBzdGF0aWMgY29uc3QgY2hhciBDRltdID0gewotKyAgICAwLCAwLCAwLCAxNiwgMCwgMCwgMCwgMCwgMSwgJ3onLCAnUicsIDAsIDEsIC00ICYgMHg3ZiwgCi0rICAgIDB4NDEsIDEsIDE2LCAweGMsIDEsIDAKLSsgIH07Ci0rICByZXR1cm4gQ0Y7Ci0rfQotKwotICNpZiAoZGVmaW5lZChfX1BPV0VSUENfXykgfHwgZGVmaW5lZCAoX19wcGNfXykgfHwgZGVmaW5lZChfUE9XRVIpKSAmJiBcCi0gZGVmaW5lZChfX0FQUExFX18pCi0gZXh0ZXJuICJDIiB2b2lkIHN5c19pY2FjaGVfaW52YWxpZGF0ZShjb25zdCB2b2lkICpBZGRyLCBzaXplX3QgbGVuKTsKLUBAIC0zNTgsMjEgKzQxMSwyNiBAQAotICAgICBTeW5jSUNhY2hlKCh2b2lkKilBZGRyLCA3KjQpOwotICAgICByZXR1cm4gTUNFLmZpbmlzaEZ1bmN0aW9uU3R1YihGKTsKLSAgIH0KLS0KLS0gIE1DRS5zdGFydEZ1bmN0aW9uU3R1YihGLCAxMCo0KTsKLSsgIAotKyAgaWYgKEV4Y2VwdGlvbkhhbmRsaW5nICYmICFpczY0Qml0KSB7Ci0rICAgIE1DRS5zdGFydEZ1bmN0aW9uU3R1YihGLCAxMCo0ICsgNDQpOwotKyAgfSBlbHNlIHsKLSsgICAgTUNFLnN0YXJ0RnVuY3Rpb25TdHViKEYsIDEwKjQpOwotKyAgfQotKyAgCi0gICBpbnRwdHJfdCBBZGRyID0gKGludHB0cl90KU1DRS5nZXRDdXJyZW50UENWYWx1ZSgpOwotICAgaWYgKGlzNjRCaXQpIHsKLSsgICAgTUNFLmVtaXRXb3JkQkUoMHg3ZDY4MDJhNik7ICAgICAvLyBtZmxyIHIxMQotKyAgICBNQ0UuZW1pdFdvcmRCRSgweGY5NjEwMDEwKTsgICAgIC8vIHN0ZCByMTEsIDE2KHIxKQotICAgICBNQ0UuZW1pdFdvcmRCRSgweGY4MjFmZmIxKTsgICAgIC8vIHN0ZHUgcjEsLTgwKHIxKQotKyAgfSBlbHNlIGlmIChUTS5nZXRTdWJ0YXJnZXRJbXBsKCktPmlzTWFjaG9BQkkoKSl7Ci0gICAgIE1DRS5lbWl0V29yZEJFKDB4N2Q2ODAyYTYpOyAgICAgLy8gbWZsciByMTEKLS0gICAgTUNFLmVtaXRXb3JkQkUoMHhmOTYxMDA2MCk7ICAgICAvLyBzdGQgcjExLCA5NihyMSkKLS0gIH0gZWxzZSBpZiAoVE0uZ2V0U3VidGFyZ2V0SW1wbCgpLT5pc01hY2hvQUJJKCkpewotKyAgICBNQ0UuZW1pdFdvcmRCRSgweDkxNjEwMDA4KTsgICAgIC8vIHN0dyByMTEsIDgocjEpCi0gICAgIE1DRS5lbWl0V29yZEJFKDB4OTQyMWZmZTApOyAgICAgLy8gc3R3dSByMSwtMzIocjEpCi0rICB9IGVsc2UgewotICAgICBNQ0UuZW1pdFdvcmRCRSgweDdkNjgwMmE2KTsgICAgIC8vIG1mbHIgcjExCi0tICAgIE1DRS5lbWl0V29yZEJFKDB4OTE2MTAwMjgpOyAgICAgLy8gc3R3IHIxMSwgNDAocjEpCi0tICB9IGVsc2UgewotKyAgICBNQ0UuZW1pdFdvcmRCRSgweDkxNjEwMDA0KTsgICAgIC8vIHN0dyByMTEsIDQocjEpCi0gICAgIE1DRS5lbWl0V29yZEJFKDB4OTQyMWZmZTApOyAgICAgLy8gc3R3dSByMSwtMzIocjEpCi0tICAgIE1DRS5lbWl0V29yZEJFKDB4N2Q2ODAyYTYpOyAgICAgLy8gbWZsciByMTEKLS0gICAgTUNFLmVtaXRXb3JkQkUoMHg5MTYxMDAyNCk7ICAgICAvLyBzdHcgcjExLCAzNihyMSkKLSAgIH0KLSAgIGludHB0cl90IEJyYW5jaEFkZHIgPSAoaW50cHRyX3QpTUNFLmdldEN1cnJlbnRQQ1ZhbHVlKCk7Ci0gICBNQ0UuZW1pdFdvcmRCRSgwKTsKLUBAIC0zODQsNiArNDQyLDQyIEBACi0gICBNQ0UuZW1pdFdvcmRCRSgwKTsKLSAgIEVtaXRCcmFuY2hUb0F0KEJyYW5jaEFkZHIsIChpbnRwdHJfdClGbiwgdHJ1ZSwgaXM2NEJpdCk7Ci0gICBTeW5jSUNhY2hlKCh2b2lkKilBZGRyLCAxMCo0KTsKLSsgIGludHB0cl90IEVuZEFkZHIgPSAoaW50cHRyX3QpTUNFLmdldEN1cnJlbnRQQ1ZhbHVlKCk7Ci0rICAKLSsgIGlmIChFeGNlcHRpb25IYW5kbGluZyAmJiAhaXM2NEJpdCkgewotKyAgICAvLyBTaXplIG9mIEVoIHNlY3Rpb24KLSsgICAgTUNFLmVtaXRXb3JkQkUoMzIpOwotKyAgICAvLyBFaCBzZWN0aW9uCi0rICAgIE1DRS5lbWl0V29yZEJFKE1DRS5nZXRDdXJyZW50UENWYWx1ZSgpIC0gKGludHB0cl90KUdldENvbW1vbkZyYW1lMzIoKSk7Ci0rICAgIE1DRS5lbWl0V29yZEJFKEFkZHIgLSBNQ0UuZ2V0Q3VycmVudFBDVmFsdWUoKSk7Ci0rICAgIE1DRS5lbWl0V29yZEJFKEVuZEFkZHIgLSBBZGRyKTsKLSsgICAgTUNFLmVtaXRCeXRlKDApOwotKyAgICBNQ0UuZW1pdEJ5dGUoZHdhcmY6OkRXX0NGQV9hZHZhbmNlX2xvYzQpOwotKyAgICBNQ0UuZW1pdFdvcmRCRSg4KTsKLSsgICAgTUNFLmVtaXRCeXRlKGR3YXJmOjpEV19DRkFfZGVmX2NmYV9vZmZzZXQpOwotKyAgICBNQ0UuZW1pdEJ5dGUoMzIpOwotKyAgICBNQ0UuZW1pdEJ5dGUoZHdhcmY6OkRXX0NGQV9vZmZzZXRfZXh0ZW5kZWRfc2YpOwotKyAgICBNQ0UuZW1pdEJ5dGUoVE0uZ2V0UmVnaXN0ZXJJbmZvKCktPmdldER3YXJmUmVnTnVtKFBQQzo6TFIsIHRydWUpKTsKLSsgICAgaWYgKFRNLmdldFN1YnRhcmdldEltcGwoKS0+aXNNYWNob0FCSSgpKXsKLSsgICAgICBNQ0UuZW1pdEJ5dGUoLTIgJiAweDdmKTsKLSsgICAgfSBlbHNlIHsKLSsgICAgICBNQ0UuZW1pdEJ5dGUoLTEgJiAweDdmKTsKLSsgICAgfQotKyAgICBNQ0UuZW1pdEJ5dGUoZHdhcmY6OkRXX0NGQV9hZHZhbmNlX2xvYzQpOwotKyAgICBNQ0UuZW1pdFdvcmRCRSg0KTsKLSsgICAgTUNFLmVtaXRCeXRlKGR3YXJmOjpEV19DRkFfZGVmX2NmYV9yZWdpc3Rlcik7Ci0rICAgIE1DRS5lbWl0Qnl0ZSgxKTsKLSsgICAgLy8gQWxpZ25tZW50Ci0rICAgIE1DRS5lbWl0Qnl0ZSgwKTsKLSsgICAgTUNFLmVtaXRCeXRlKDApOwotKyAgICAKLSsgICAgLy8gVHdvIHplcm8gZm9yIHRoZSB1bndpbmQgcnVudGltZQotKyAgICBNQ0UuZW1pdFdvcmRCRSgwKTsKLSsgICAgTUNFLmVtaXRXb3JkQkUoMCk7Ci0rICAgIAotKyAgICBTeW5jSUNhY2hlKCh2b2lkKilFbmRBZGRyLCA0NCk7Ci0rICAgIEV4ZWN1dGlvbkVuZ2luZTo6UmVnaXN0ZXJUYWJsZSgodm9pZCopRW5kQWRkcik7Ci0rICB9Ci0gICByZXR1cm4gTUNFLmZpbmlzaEZ1bmN0aW9uU3R1YihGKTsKLSB9Ci0gCi1JbmRleDogUFBDSVNlbExvd2VyaW5nLmNwcAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tIFBQQ0lTZWxMb3dlcmluZy5jcHAJKHJldmlzaW9uIDUwMDA2KQotKysrIFBQQ0lTZWxMb3dlcmluZy5jcHAJKHdvcmtpbmcgY29weSkKLUBAIC0xNzUsMTAgKzE3NSwxMiBAQAotICAgLy8gV2Ugd2FudCB0byBsZWdhbGl6ZSBHbG9iYWxBZGRyZXNzIGFuZCBDb25zdGFudFBvb2wgbm9kZXMgaW50byB0aGUgCi0gICAvLyBhcHByb3ByaWF0ZSBpbnN0cnVjdGlvbnMgdG8gbWF0ZXJpYWxpemUgdGhlIGFkZHJlc3MuCi0gICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpHbG9iYWxBZGRyZXNzLCBNVlQ6OmkzMiwgQ3VzdG9tKTsKLSsgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkV4dGVybmFsU3ltYm9sICAsIE1WVDo6aTMyICAsIEN1c3RvbSk7Ci0gICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpHbG9iYWxUTFNBZGRyZXNzLCBNVlQ6OmkzMiwgQ3VzdG9tKTsKLSAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNvbnN0YW50UG9vbCwgIE1WVDo6aTMyLCBDdXN0b20pOwotICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6SnVtcFRhYmxlLCAgICAgTVZUOjppMzIsIEN1c3RvbSk7Ci0gICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpHbG9iYWxBZGRyZXNzLCBNVlQ6Omk2NCwgQ3VzdG9tKTsKLSsgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkV4dGVybmFsU3ltYm9sICAsIE1WVDo6aTY0ICAsIEN1c3RvbSk7Ci0gICBzZXRPcGVyYXRpb25BY3Rpb24oSVNEOjpHbG9iYWxUTFNBZGRyZXNzLCBNVlQ6Omk2NCwgQ3VzdG9tKTsKLSAgIHNldE9wZXJhdGlvbkFjdGlvbihJU0Q6OkNvbnN0YW50UG9vbCwgIE1WVDo6aTY0LCBDdXN0b20pOwotICAgc2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6SnVtcFRhYmxlLCAgICAgTVZUOjppNjQsIEN1c3RvbSk7Ci1AQCAtNzQ1LDYgKzc0NywzNiBAQAotICAgcmV0dXJuIGlzSW50UzE2SW1tZWRpYXRlKE9wLlZhbCwgSW1tKTsKLSB9Ci0gCi0rIHN0YXRpYyBTRE9wZXJhbmQgTG93ZXJFeHRlcm5hbFN5bWJvbChTRE9wZXJhbmQgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSB7Ci0rICAgTVZUOjpWYWx1ZVR5cGUgUHRyVlQgPSBPcC5nZXRWYWx1ZVR5cGUoKTsKLSsgICBFeHRlcm5hbFN5bWJvbFNETm9kZSAqR1NEQiA9IGR5bl9jYXN0PEV4dGVybmFsU3ltYm9sU0ROb2RlPihPcCk7Ci0rICAgU0RPcGVyYW5kIEdBID0gREFHLmdldFRhcmdldEV4dGVybmFsU3ltYm9sKEdTREItPmdldFN5bWJvbCgpLCBQdHJWVCk7Ci0rICAgU0RPcGVyYW5kIFplcm8gPSBEQUcuZ2V0Q29uc3RhbnQoMCwgUHRyVlQpOwotKyAgICAgIAotKyAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNID0gREFHLmdldFRhcmdldCgpOwotKyAKLSsgICBTRE9wZXJhbmQgSGkgPSBEQUcuZ2V0Tm9kZShQUENJU0Q6OkhpLCBQdHJWVCwgR0EsIFplcm8pOwotKyAgIFNET3BlcmFuZCBMbyA9IERBRy5nZXROb2RlKFBQQ0lTRDo6TG8sIFB0clZULCBHQSwgWmVybyk7Ci0rIAotKyAgIC8vIElmIHRoaXMgaXMgYSBub24tZGFyd2luIHBsYXRmb3JtLCB3ZSBkb24ndCBzdXBwb3J0IG5vbi1zdGF0aWMgcmVsbyBtb2RlbHMKLSsgICAvLyB5ZXQuCi0rICAgaWYgKFRNLmdldFJlbG9jYXRpb25Nb2RlbCgpID09IFJlbG9jOjpTdGF0aWMgfHwgCi0rICAgICAgICFUTS5nZXRTdWJ0YXJnZXQ8UFBDU3VidGFyZ2V0PigpLmlzRGFyd2luKCkpIHsKLSsgICAgIC8vIEdlbmVyYXRlIG5vbi1waWMgY29kZSB0aGF0IGhhcyBkaXJlY3QgYWNjZXNzZXMgdG8gZ2xvYmFscy4KLSsgICAgIC8vIFRoZSBhZGRyZXNzIG9mIHRoZSBnbG9iYWwgaXMganVzdCAoaGkoJmcpK2xvKCZnKSkuCi0rICAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpBREQsIFB0clZULCBIaSwgTG8pOwotKyAgIH0gIAotKyAgICAgIAotKyAgIGlmIChUTS5nZXRSZWxvY2F0aW9uTW9kZWwoKSA9PSBSZWxvYzo6UElDXykgewotKyAgICAgLy8gV2l0aCBQSUMsIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBpcyBhY3R1YWxseSAiR1IraGkoJkcpIi4KLSsgICAgIEhpID0gREFHLmdldE5vZGUoSVNEOjpBREQsIFB0clZULAotKyAgICAgICAgICAgICAgICAgICAgICBEQUcuZ2V0Tm9kZShQUENJU0Q6Okdsb2JhbEJhc2VSZWcsIFB0clZUKSwgSGkpOwotKyAgIH0gIAotKyAgICAgIAotKyAgIExvID0gREFHLmdldE5vZGUoSVNEOjpBREQsIFB0clZULCBIaSwgTG8pOwotKyAgICAgIAotKyAgIHJldHVybiBMbzsKLSsgfQotIAotIC8vLyBTZWxlY3RBZGRyZXNzUmVnUmVnIC0gR2l2ZW4gdGhlIHNwZWNpZmllZCBhZGRyZXNzZWQsIGNoZWNrIHRvIHNlZSBpZiBpdAotIC8vLyBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYW4gaW5kZXhlZCBbcityXSBvcGVyYXRpb24uICBSZXR1cm5zIGZhbHNlIGlmIGl0Ci1AQCAtMjEzMCwxMSArMjE2MiwxMSBAQAotICAgLy8gSWYgdGhlIGNhbGxlZSBpcyBhIEdsb2JhbEFkZHJlc3MvRXh0ZXJuYWxTeW1ib2wgbm9kZSAocXVpdGUgY29tbW9uLCBldmVyeQotICAgLy8gZGlyZWN0IGNhbGwgaXMpIHR1cm4gaXQgaW50byBhIFRhcmdldEdsb2JhbEFkZHJlc3MvVGFyZ2V0RXh0ZXJuYWxTeW1ib2wKLSAgIC8vIG5vZGUgc28gdGhhdCBsZWdhbGl6ZSBkb2Vzbid0IGhhY2sgaXQuCi0tICBpZiAoR2xvYmFsQWRkcmVzc1NETm9kZSAqRyA9IGR5bl9jYXN0PEdsb2JhbEFkZHJlc3NTRE5vZGU+KENhbGxlZSkpCi0tICAgIENhbGxlZSA9IERBRy5nZXRUYXJnZXRHbG9iYWxBZGRyZXNzKEctPmdldEdsb2JhbCgpLCBDYWxsZWUuZ2V0VmFsdWVUeXBlKCkpOwotLSAgZWxzZSBpZiAoRXh0ZXJuYWxTeW1ib2xTRE5vZGUgKlMgPSBkeW5fY2FzdDxFeHRlcm5hbFN5bWJvbFNETm9kZT4oQ2FsbGVlKSkKLS0gICAgQ2FsbGVlID0gREFHLmdldFRhcmdldEV4dGVybmFsU3ltYm9sKFMtPmdldFN5bWJvbCgpLCBDYWxsZWUuZ2V0VmFsdWVUeXBlKCkpOwotLSAgZWxzZSBpZiAoU0ROb2RlICpEZXN0ID0gaXNCTEFDb21wYXRpYmxlQWRkcmVzcyhDYWxsZWUsIERBRykpCi0rICAvL2lmIChHbG9iYWxBZGRyZXNzU0ROb2RlICpHID0gZHluX2Nhc3Q8R2xvYmFsQWRkcmVzc1NETm9kZT4oQ2FsbGVlKSkKLSsgIC8vICBDYWxsZWUgPSBEQUcuZ2V0VGFyZ2V0R2xvYmFsQWRkcmVzcyhHLT5nZXRHbG9iYWwoKSwgQ2FsbGVlLmdldFZhbHVlVHlwZSgpKTsKLSsgIC8vaWYgKEV4dGVybmFsU3ltYm9sU0ROb2RlICpTID0gZHluX2Nhc3Q8RXh0ZXJuYWxTeW1ib2xTRE5vZGU+KENhbGxlZSkpCi0rICAvLyAgQ2FsbGVlID0gREFHLmdldFRhcmdldEV4dGVybmFsU3ltYm9sKFMtPmdldFN5bWJvbCgpLCBDYWxsZWUuZ2V0VmFsdWVUeXBlKCkpOwotKyAgaWYgKFNETm9kZSAqRGVzdCA9IGlzQkxBQ29tcGF0aWJsZUFkZHJlc3MoQ2FsbGVlLCBEQUcpKQotICAgICAvLyBJZiB0aGlzIGlzIGFuIGFic29sdXRlIGRlc3RpbmF0aW9uIGFkZHJlc3MsIHVzZSB0aGUgbXVuZ2VkIHZhbHVlLgotICAgICBDYWxsZWUgPSBTRE9wZXJhbmQoRGVzdCwgMCk7Ci0gICBlbHNlIHsKLUBAIC0zNTA2LDYgKzM1MzgsNyBAQAotICAgZGVmYXVsdDogYXNzZXJ0KDAgJiYgIldhc24ndCBleHBlY3RpbmcgdG8gYmUgYWJsZSB0byBsb3dlciB0aGlzISIpOyAKLSAgIGNhc2UgSVNEOjpDb25zdGFudFBvb2w6ICAgICAgIHJldHVybiBMb3dlckNvbnN0YW50UG9vbChPcCwgREFHKTsKLSAgIGNhc2UgSVNEOjpHbG9iYWxBZGRyZXNzOiAgICAgIHJldHVybiBMb3dlckdsb2JhbEFkZHJlc3MoT3AsIERBRyk7Ci0rICBjYXNlIElTRDo6RXh0ZXJuYWxTeW1ib2w6ICAgICByZXR1cm4gTG93ZXJFeHRlcm5hbFN5bWJvbChPcCwgREFHKTsKLSAgIGNhc2UgSVNEOjpHbG9iYWxUTFNBZGRyZXNzOiAgIHJldHVybiBMb3dlckdsb2JhbFRMU0FkZHJlc3MoT3AsIERBRyk7Ci0gICBjYXNlIElTRDo6SnVtcFRhYmxlOiAgICAgICAgICByZXR1cm4gTG93ZXJKdW1wVGFibGUoT3AsIERBRyk7Ci0gICBjYXNlIElTRDo6U0VUQ0M6ICAgICAgICAgICAgICByZXR1cm4gTG93ZXJTRVRDQyhPcCwgREFHKTsKZGlmZiAtLWdpdCBhL3Zta2l0L3BhdGNoZXMvdm1raXQtbGx2bS14ODYucGF0Y2ggYi92bWtpdC9wYXRjaGVzL3Zta2l0LWxsdm0teDg2LnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTUxM2MzLi4wMDAwMDAwCi0tLSBhL3Zta2l0L3BhdGNoZXMvdm1raXQtbGx2bS14ODYucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi1JbmRleDogWDg2U3VidGFyZ2V0LmNwcAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tIFg4NlN1YnRhcmdldC5jcHAJKHJldmlzaW9uIDUwMDA4KQotKysrIFg4NlN1YnRhcmdldC5jcHAJKHdvcmtpbmcgY29weSkKLUBAIC0xMjcsNyArMTI3LDcgQEAKLSAgICAgcmV0dXJuOwotIAotICAgWDg2OjpHZXRDcHVJREFuZEluZm8oMHgxLCAmRUFYLCAmRUJYLCAmRUNYLCAmRURYKTsKLS0gIAotKyNpZiAwIAotICAgaWYgKChFRFggPj4gMjMpICYgMHgxKSBYODZTU0VMZXZlbCA9IE1NWDsKLSAgIGlmICgoRURYID4+IDI1KSAmIDB4MSkgWDg2U1NFTGV2ZWwgPSBTU0UxOwotICAgaWYgKChFRFggPj4gMjYpICYgMHgxKSBYODZTU0VMZXZlbCA9IFNTRTI7Ci1AQCAtMTM1LDcgKzEzNSw5IEBACi0gICBpZiAoKEVDWCA+PiA5KSAgJiAweDEpIFg4NlNTRUxldmVsID0gU1NTRTM7Ci0gICBpZiAoKEVDWCA+PiAxOSkgJiAweDEpIFg4NlNTRUxldmVsID0gU1NFNDE7Ci0gICBpZiAoKEVDWCA+PiAyMCkgJiAweDEpIFg4NlNTRUxldmVsID0gU1NFNDI7Ci0tCi0rI2Vsc2UKLSsgIFg4NlNTRUxldmVsID0gTU1YOwotKyNlbmRpZgotICAgaWYgKG1lbWNtcCh0ZXh0LmMsICJHZW51aW5lSW50ZWwiLCAxMikgPT0gMCB8fAotICAgICAgIG1lbWNtcCh0ZXh0LmMsICJBdXRoZW50aWNBTUQiLCAxMikgPT0gMCkgewotICAgICBYODY6OkdldENwdUlEQW5kSW5mbygweDgwMDAwMDAxLCAmRUFYLCAmRUJYLCAmRUNYLCAmRURYKTsKLUluZGV4OiBYODZKSVRJbmZvLmNwcAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tIFg4NkpJVEluZm8uY3BwCShyZXZpc2lvbiA1MDAwOCkKLSsrKyBYODZKSVRJbmZvLmNwcAkod29ya2luZyBjb3B5KQotQEAgLTYwLDcgKzYwLDcgQEAKLSAvLyBGSVhNRTogRGlzYWJsZSB0aGlzIHVudGlsIHdlIHJlYWxseSB3YW50IHRvIHVzZSBpdC4gQWxzbywgd2Ugd2lsbAotIC8vICAgICAgICBuZWVkIHRvIGFkZCBzb21lIHdvcmthcm91bmRzIGZvciBjb21waWxlcnMsIHdoaWNoIHN1cHBvcnQKLSAvLyAgICAgICAgb25seSBzdWJzZXQgb2YgdGhlc2UgZGlyZWN0aXZlcy4KLS0jIGRlZmluZSBDRkkoeCkKLSsjIGRlZmluZSBDRkkoeCkgeAotICNlbmRpZgotIAotIC8vIFByb3ZpZGUgYSB3cmFwcGVyIGZvciBYODZDb21waWxhdGlvbkNhbGxiYWNrMiB0aGF0IHNhdmVzIG5vbi10cmFkaXRpb25hbApkaWZmIC0tZ2l0IGEvdm1raXQvdG9vbHMvTWFrZWZpbGUgYi92bWtpdC90b29scy9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Y2OTJiMy4uMDAwMDAwMAotLS0gYS92bWtpdC90b29scy9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMjPT09LSB0b29scy9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCi0jIAotIyAgICAgICAgICAgICAgICAgICAgIFRoZSB2bWtpdCBwcm9qZWN0Ci0jCi0jIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0jIAotIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKLUxFVkVMID0gLi4KLQotUEFSQUxMRUxfRElSUyArPSB2bWtpdAotCi1pbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbmZpZwotCi1pZmVxICgkKFdJVEhfSjMpLCAxKQotICBQQVJBTExFTF9ESVJTICs9IGozCi0gIFBBUkFMTEVMX0RJUlMgKz0gdm1qYwotICBQQVJBTExFTF9ESVJTICs9IGxsY2oKLWVuZGlmCi0KLWlmZXEgKCQoV0lUSF9OM19NT05PKSwgMSkgCi0gIFBBUkFMTEVMX0RJUlMgKz0gbjMtbW9ubwotZW5kaWYKLQotaWZlcSAoJChXSVRIX04zX1BORVRMSUIpLCAxKSAKLSAgUEFSQUxMRUxfRElSUyArPSBuMy1wbmV0bGliCi1lbmRpZgotCi1pZmVxICgkKFdJVEhfUDMpLCAxKSAKLSAgUEFSQUxMRUxfRElSUyArPSBwMwotZW5kaWYKLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KLQpkaWZmIC0tZ2l0IGEvdm1raXQvdG9vbHMvajMvTWFpbi5jcHAgYi92bWtpdC90b29scy9qMy9NYWluLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU2OTllMS4uMDAwMDAwMAotLS0gYS92bWtpdC90b29scy9qMy9NYWluLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0tLSBNYWluLmNwcCAtIFNpbXBsZSBleGVjdXRpb24gb2YgSjMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgIm12bS9HQy5oIgotI2luY2x1ZGUgIm12bS9KSVQuaCIKLSNpbmNsdWRlICJtdm0vVk1LaXQuaCIKLSNpbmNsdWRlICJtdm0vVmlydHVhbE1hY2hpbmUuaCIKLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9UaHJlYWQuaCIKLQotI2luY2x1ZGUgImozL0phdmFKSVRDb21waWxlci5oIgotI2luY2x1ZGUgIi4uLy4uL2xpYi9KMy9WTUNvcmUvSm5qdm1DbGFzc0xvYWRlci5oIgotI2luY2x1ZGUgIi4uLy4uL2xpYi9KMy9WTUNvcmUvSm5qdm0uaCIKLQotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYW5hZ2VkU3RhdGljLmgiCi0KLWV4dGVybiBsbHZtOjpjbDo6b3B0PGJvb2w+IFN0YW5kYXJkQ29tcGlsZU9wdHM7Ci0KLXVzaW5nIG5hbWVzcGFjZSBqMzsKLXVzaW5nIG5hbWVzcGFjZSBtdm07Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndiwgY2hhciAqKmVudnApIHsKLSAgbGx2bTo6bGx2bV9zaHV0ZG93bl9vYmogWDsgIAotCi0gIC8vIEluaXRpYWxpemUgYmFzZSBjb21wb25lbnRzLiAgCi0gIG12bTo6QnVtcFB0ckFsbG9jYXRvciBBbGxvY2F0b3I7Ci0JbXZtOjpWTUtpdCogdm1raXQgPSBuZXcoQWxsb2NhdG9yLCAiVk1LaXQiKSBtdm06OlZNS2l0KEFsbG9jYXRvcik7Ci0gIAotICAvLyBUZWxsIHRoZSBjb21waWxlciB0byBydW4gYWxsIG9wdGltaXphdGlvbnMuCi0gIFN0YW5kYXJkQ29tcGlsZU9wdHMgPSB0cnVlOwotIAotICAvLyBDcmVhdGUgdGhlIGFsbG9jYXRvciB0aGF0IHdpbGwgYWxsb2NhdGUgdGhlIGJvb3RzdHJhcCBsb2FkZXIgYW5kIHRoZSBKVk0uCi0gIEphdmFKSVRDb21waWxlciogQ29tcCA9IEphdmFKSVRDb21waWxlcjo6Q3JlYXRlQ29tcGlsZXIoIkpJVE1vZHVsZSIpOwotICBKbmp2bSogdm0gPSBuZXcoQWxsb2NhdG9yLCAiVk0iKSBKbmp2bShBbGxvY2F0b3IsIHZta2l0LCBDb21wLCB0cnVlKTsKLSAKLSAgLy8gUnVuIHRoZSBhcHBsaWNhdGlvbi4gCi0gIHZtLT5ydW5BcHBsaWNhdGlvbihhcmdjLCBhcmd2KTsKLSAgdm1raXQtPndhaXROb25EYWVtb25UaHJlYWRzKCk7Ci0gIGV4aXQoMCk7Ci0KLSAgLy8gRGVzdHJveSBldmVyeW9uZS4KLSAgLy8gdm0tPn5Kbmp2bSgpOwotICAvLyBsb2FkZXItPn5Kbmp2bUJvb3RzdHJhcExvYWRlcigpOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvdG9vbHMvajMvTWFrZWZpbGUgYi92bWtpdC90b29scy9qMy9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGE4Njg3Yi4uMDAwMDAwMAotLS0gYS92bWtpdC90b29scy9qMy9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMjPT09LSB0b29scy9qbmp2bS9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCi0jIAotIyAgICAgICAgICAgICAgICAgICAgIFRoZSB2bWtpdCBwcm9qZWN0Ci0jCi0jIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0jIAotIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKLUxFVkVMID0gLi4vLi4KLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb25maWcKLQotVE9PTE5BTUUgPSBqMwotCi1pZmVxICgkKFdJVEhfTExWTV9HQ0MpLCAxKQotCi0gIE1PRFVMRVNOQU1FID0gajMKLSAgVVNFRE1PRFVMRVMgPSBKMy5iYyBDbGFzc3BhdGguYmMgSjNDb21waWxlci5iYyBBbGxvY2F0b3IuYmMgQ29tbW9uVGhyZWFkLmJjIFwKLQkJTXZtLmJjIE12bUNvbXBpbGVyLmJjCi0KLSAgaWZlcSAoJChHQ19NTVRLKSwgMSkKLSAgICBVU0VETU9EVUxFUyArPSBGaW5hbE1NVGsuYmMgSW5saW5lTU1Uay5iYwotICBlbHNlCi0gICAgVVNFRE1PRFVMRVMgKz0gJChHQ0xJQikuYmMKLSAgZW5kaWYKLQotICBCVUlMVF9TT1VSQ0VTID0gajMucwotICBTT1VSQ0VTID0gajMucyAkKG5vdGRpciAkKHdpbGRjYXJkICQoUFJPSl9TUkNfRElSKS8qLmNwcCkpCi0KLWVsc2UKLQotVVNFRExJQlMgPSBKMy5hIENsYXNzcGF0aC5hIEozLmEgSjNDb21waWxlci5hIEFsbG9jYXRvci5hIFwKLQkgICBNdm0uYSBNdm1Db21waWxlci5hICQoR0NMSUIpLmEgQWxsb2NhdG9yLmEgQ29tbW9uVGhyZWFkLmEKLQotZW5kaWYKLQotTElOS19DT01QT05FTlRTID0gaml0IG5hdGl2ZWNvZGVnZW4gc2NhbGFyb3B0cyBpbnN0cnVtZW50YXRpb24gaXBhIGlwbyBiaXRyZWFkZXIgYXNtcGFyc2VyIGxpbmtlcgotCi0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCmRpZmYgLS1naXQgYS92bWtpdC90b29scy9sbGNqL0xpbmtQYXRocy5oLmluIGIvdm1raXQvdG9vbHMvbGxjai9MaW5rUGF0aHMuaC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI2NzEwNy4uMDAwMDAwMAotLS0gYS92bWtpdC90b29scy9sbGNqL0xpbmtQYXRocy5oLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLy89PT0tLS0tIExpbmtQYXRocy5oIC0gTGlicmFyeSBwYXRocyBmb3IgZ2VuZXJhdGluZyBleGVjdXRhYmxlcyAtLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZNS2l0Ci0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotCi0jZGVmaW5lIExMVk1MaWJzICItTEBMTFZNX09CSkAvUmVsZWFzZS9saWIiCi0jZGVmaW5lIFZNS0lUTGliczEgIi1MQGFic190b3Bfb2JqZGlyQC9SZWxlYXNlL2xpYiIKLSNkZWZpbmUgVk1LSVRMaWJzMiAiLUxAYWJzX3RvcF9zcmNkaXJAL1JlbGVhc2UvbGliIgotI2RlZmluZSBWTUtJVExpYnMzICItTEBQUk9KX0lOU1RBTExfUk9PVEAvbGliIgpkaWZmIC0tZ2l0IGEvdm1raXQvdG9vbHMvbGxjai9NYWtlZmlsZSBiL3Zta2l0L3Rvb2xzL2xsY2ovTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhiNWQ5Y2EuLjAwMDAwMDAKLS0tIGEvdm1raXQvdG9vbHMvbGxjai9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjPT09LSB0b29scy9sbGNqL01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCi0jIAotIyAgICAgICAgICAgICAgICAgICAgIFRoZSB2bWtpdCBwcm9qZWN0Ci0jCi0jIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0jIAotIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKLUxFVkVMID0gLi4vLi4KLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb25maWcKLQotVE9PTE5BTUUgPSBsbGNqCi1MSU5LX0NPTVBPTkVOVFMgPSBzdXBwb3J0Ci0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCmRpZmYgLS1naXQgYS92bWtpdC90b29scy9sbGNqL2xsY2ouY3BwIGIvdm1raXQvdG9vbHMvbGxjai9sbGNqLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE2MWY2Ny4uMDAwMDAwMAotLS0gYS92bWtpdC90b29scy9sbGNqL2xsY2ouY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0tLSBsbGNqLmNwcCAtIEphdmEgYWhlYWQgb2YgdGltZSBjb21waWxlciAtLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWFuYWdlZFN0YXRpYy5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9QYXRoLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L1Byb2dyYW0uaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU2lnbmFscy5oIgotCi0jaW5jbHVkZSAiTGlua1BhdGhzLmgiCi0KLSNpbmNsdWRlIDxjc3RkaW8+Ci0jaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlIDxjc3RyaW5nPgotCi11c2luZyBuYW1lc3BhY2UgbGx2bTsKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gIGxsdm1fc2h1dGRvd25fb2JqIFg7ICAvLyBDYWxsIGxsdm1fc2h1dGRvd24oKSBvbiBleGl0LgotCi0gIGJvb2wgU2F2ZVRlbXBzID0gZmFsc2U7Ci0gIGNoYXIqIG9wdCA9IDA7Ci0gIAotICBjb25zdCBjaGFyKiogdm1qY0FyZ3YgPSBuZXcgY29uc3QgY2hhcipbYXJnYyArIDVdOwotICBpbnQgdm1qY0FyZ2MgPSAxOwotICBjb25zdCBjaGFyKiogZ2NjQXJndiA9IG5ldyBjb25zdCBjaGFyKlthcmdjICsgMzJdOwotICBpbnQgZ2NjQXJnYyA9IDE7Ci0gCi0gIGJvb2wgcnVuR0NDID0gdHJ1ZTsKLSAgY2hhciogY2xhc3NOYW1lID0gMDsKLSAgYm9vbCBzaGFyZWQgPSBmYWxzZTsKLSAgYm9vbCB3aXRoSklUID0gZmFsc2U7Ci0KLSAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyArK2kpIHsKLSAgICBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXNoYXJlZCIpKSB7Ci0gICAgICBnY2NBcmd2W2djY0FyZ2MrK10gPSBhcmd2W2ldOwotICAgICAgc2hhcmVkID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi13aXRoLWppdCIpIHx8Ci0gICAgICAgICAgICAgICAhc3RyY21wKGFyZ3ZbaV0sICItLXdpdGgtaml0IikpIHsKLSAgICAgIHdpdGhKSVQgPSB0cnVlOwotICAgICAgdm1qY0FyZ3Zbdm1qY0FyZ2MrK10gPSBhcmd2W2ldOwotICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLU8xIikgfHwgIXN0cmNtcChhcmd2W2ldLCAiLU8yIikgfHwKLSAgICAgICAgICAgICAgICFzdHJjbXAoYXJndltpXSwgIi1PMyIpKSB7Ci0gICAgICBvcHQgPSBhcmd2W2ldOwotICAgICAgdm1qY0FyZ3Zbdm1qY0FyZ2MrK10gPSAoY29uc3QgY2hhciopIi1zdGQtY29tcGlsZS1vcHRzIjsKLSAgICB9IGVsc2UgaWYgKGFyZ3ZbaV1bMF0gPT0gJy0nICYmIGFyZ3ZbaV1bMV0gPT0gJ1MnKSB7Ci0gICAgICBydW5HQ0MgPSBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKGFyZ3ZbaV1bMF0gPT0gJy0nICYmIGFyZ3ZbaV1bMV0gPT0gJ2MnKSB7Ci0gICAgICBnY2NBcmd2W2djY0FyZ2MrK10gPSBhcmd2W2ldOwotICAgIH0gZWxzZSBpZiAoYXJndltpXVswXSA9PSAnLScgJiYgYXJndltpXVsxXSA9PSAnbCcpIHsKLSAgICAgIGdjY0FyZ3ZbZ2NjQXJnYysrXSA9IGFyZ3ZbaV07Ci0gICAgfSBlbHNlIGlmIChhcmd2W2ldWzBdID09ICctJyAmJiBhcmd2W2ldWzFdID09ICdMJykgewotICAgICAgZ2NjQXJndltnY2NBcmdjKytdID0gYXJndltpXTsKLSAgICB9IGVsc2UgaWYgKGFyZ3ZbaV1bMF0gPT0gJy0nICYmIGFyZ3ZbaV1bMV0gPT0gJ1cnKSB7Ci0gICAgICBnY2NBcmd2W2djY0FyZ2MrK10gPSBhcmd2W2ldOwotICAgIH0gZWxzZSBpZiAoYXJndltpXVswXSA9PSAnLScgJiYgYXJndltpXVsxXSA9PSAnZycpIHsKLSAgICAgIGdjY0FyZ3ZbZ2NjQXJnYysrXSA9IGFyZ3ZbaV07Ci0gICAgfSBlbHNlIGlmIChhcmd2W2ldWzBdID09ICctJyAmJiBhcmd2W2ldWzFdID09ICdwJyAmJiBhcmd2W2ldWzJdID09ICdnJykgewotICAgICAgZ2NjQXJndltnY2NBcmdjKytdID0gYXJndltpXTsKLSAgICB9IGVsc2UgaWYgKGFyZ3ZbaV1bMF0gPT0gJy0nICYmIGFyZ3ZbaV1bMV0gPT0gJ28nKSB7Ci0gICAgICBnY2NBcmd2W2djY0FyZ2MrK10gPSBhcmd2W2krK107Ci0gICAgICBnY2NBcmd2W2djY0FyZ2MrK10gPSBhcmd2W2ldOwotICAgIH0gZWxzZSBpZiAoYXJndltpXVswXSAhPSAnLScpIHsKLSAgICAgIGNoYXIqIG5hbWUgPSBhcmd2W2ldOwotICAgICAgaW50IGxlbiA9IHN0cmxlbihuYW1lKTsKLSAgICAgIGlmIChsZW4gPiA0ICYmICghc3RyY21wKCZuYW1lW2xlbiAtIDRdLCAiLmphciIpIHx8IAotICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAoJm5hbWVbbGVuIC0gNF0sICIuemlwIikpKSB7Ci0gICAgICAgIHZtamNBcmd2W3ZtamNBcmdjKytdID0gbmFtZTsKLSAgICAgICAgY2hhciogc2xhc2ggPSBzdHJyY2hyKG5hbWUsICcvJyk7Ci0gICAgICAgIGlmIChzbGFzaCkgewotICAgICAgICAgIG5hbWUgPSBzbGFzaDsKLSAgICAgICAgICBsZW4gPSBzdHJsZW4obmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2xhc3NOYW1lID0gc3RyZHVwKG5hbWUpOwotICAgICAgICBjbGFzc05hbWVbbGVuIC0gNF0gPSAwOwotICAgICAgfSBlbHNlIGlmIChsZW4gPiA2ICYmICFzdHJjbXAoJm5hbWVbbGVuIC0gNl0sICIuY2xhc3MiKSkgewotICAgICAgICB2bWpjQXJndlt2bWpjQXJnYysrXSA9IG5hbWU7Ci0gICAgICAgIGNoYXIqIHNsYXNoID0gc3RycmNocihuYW1lLCAnLycpOwotICAgICAgICBpZiAoc2xhc2gpIHsKLSAgICAgICAgICBuYW1lID0gc2xhc2g7Ci0gICAgICAgICAgbGVuID0gc3RybGVuKG5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGNsYXNzTmFtZSA9IHN0cmR1cChuYW1lKTsKLSAgICAgICAgY2xhc3NOYW1lW2xlbiAtIDZdID0gMDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGdjY0FyZ3ZbZ2NjQXJnYysrXSA9IG5hbWU7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItLWhlbHAiKSkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogbGxjaiBbb3B0aW9uc10gZmlsZSAuLi5cbiIKLSAgICAgICAgICAgICAgICAgICAgICAiVGhlIEphdmEgdG8gbmF0aXZlIGNvbXBpbGVyLiBSdW4gdm1qYyAtLWhlbHAgZm9yIG1vcmUgIgotICAgICAgICAgICAgICAgICAgICAgICJpbmZvcm1hdGlvbiBvbiB0aGUgcmVhbCBBT1QgY29tcGlsZXIuXG4iKTsKLSAgICAgIGRlbGV0ZSBnY2NBcmd2OwotICAgICAgZGVsZXRlIHZtamNBcmd2OwotICAgICAgaWYgKGNsYXNzTmFtZSkgZnJlZShjbGFzc05hbWUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHZtamNBcmd2W3ZtamNBcmdjKytdID0gYXJndltpXTsKLSAgICB9Ci0gIH0gCi0KLSAgdm1qY0FyZ3Zbdm1qY0FyZ2NdID0gMDsKLSAgZ2NjQXJndltnY2NBcmdjXSA9IDA7Ci0KLSAgc3RkOjpzdHJpbmcgZXJyTXNnOwotIAotICBjb25zdCBzeXM6OlBhdGgmIHRlbXBEaXIgPSBTYXZlVGVtcHMKLSAgICAgID8gc3lzOjpQYXRoKHN5czo6UGF0aDo6R2V0Q3VycmVudERpcmVjdG9yeSgpKQotICAgICAgOiBzeXM6OlBhdGgoc3lzOjpQYXRoOjpHZXRUZW1wb3JhcnlEaXJlY3RvcnkoKSk7Ci0KLSAgc3lzOjpQYXRoIE91dCA9IHRlbXBEaXI7Ci0gIGludCByZXMgPSAwOwotICBzeXM6OlBhdGggUHJvZzsKLSAgCi0gIGlmICghY2xhc3NOYW1lKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJObyBKYXZhIGZpbGUgc3BlY2lmaWVkLi4uLiBBYm9ydFxuIik7Ci0gICAgZ290byBjbGVhbnVwOwotICB9Ci0gIAotICBQcm9nID0gc3lzOjpQcm9ncmFtOjpGaW5kUHJvZ3JhbUJ5TmFtZSgidm1qYyIpOwotCi0gIGlmIChQcm9nLmlzRW1wdHkoKSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiQ2FuJ3QgZmluZCB2bWpjLi4uLiBBYm9ydFxuIik7Ci0gICAgZ290byBjbGVhbnVwOwotICB9Ci0gIAotICBPdXQuYXBwZW5kQ29tcG9uZW50KGNsYXNzTmFtZSk7Ci0gIE91dC5hcHBlbmRTdWZmaXgoImJjIik7Ci0gIAotICB2bWpjQXJndlswXSA9IFByb2cuY19zdHIoKTsKLSAgdm1qY0FyZ3Zbdm1qY0FyZ2MrK10gPSAiLWYiOwotICB2bWpjQXJndlt2bWpjQXJnYysrXSA9ICItbyI7Ci0gIHZtamNBcmd2W3ZtamNBcmdjKytdID0gT3V0LmNfc3RyKCk7Ci0KLSAgcmVzID0gc3lzOjpQcm9ncmFtOjpFeGVjdXRlQW5kV2FpdChQcm9nLCB2bWpjQXJndik7Ci0KLSAgaWYgKCFyZXMgJiYgb3B0KSB7Ci0gICAgc3lzOjpQYXRoIE9wdE91dCA9IHRlbXBEaXI7Ci0gICAgT3B0T3V0LmFwcGVuZENvbXBvbmVudCgibGx2bW9wdCIpOwotICAgIE9wdE91dC5hcHBlbmRTdWZmaXgoImJjIik7Ci0gICAgCi0gICAgc3lzOjpQYXRoIFByb2cgPSBzeXM6OlByb2dyYW06OkZpbmRQcm9ncmFtQnlOYW1lKCJvcHQiKTsKLSAgCi0gICAgaWYgKFByb2cuaXNFbXB0eSgpKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IGZpbmQgb3B0Li4uLiBBYm9ydFxuIik7Ci0gICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotICAgIAotICAgIGNvbnN0IGNoYXIqIG9wdEFyZ3ZbN107Ci0gICAgb3B0QXJndlswXSA9IFByb2cuY19zdHIoKTsKLSAgICBvcHRBcmd2WzFdID0gT3V0LmNfc3RyKCk7Ci0gICAgb3B0QXJndlsyXSA9ICItZiI7Ci0gICAgb3B0QXJndlszXSA9ICItbyI7Ci0gICAgb3B0QXJndls0XSA9IE9wdE91dC5jX3N0cigpOwotICAgIGlmIChvcHQpIHsKLSAgICAgIG9wdEFyZ3ZbNV0gPSBvcHQ7Ci0gICAgICBvcHRBcmd2WzZdID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgb3B0QXJndls1XSA9IDA7Ci0gICAgfQotICAKLSAgICByZXMgPSBzeXM6OlByb2dyYW06OkV4ZWN1dGVBbmRXYWl0KFByb2csIG9wdEFyZ3YpOwotICAgIE91dCA9IE9wdE91dDsKLSAgfQotCi0gIGlmICghcmVzKSB7Ci0gICAgc3lzOjpQYXRoIExsY091dDsKLSAgICAKLSAgICBpZiAocnVuR0NDKQotICAgICAgTGxjT3V0PSB0ZW1wRGlyOwotICAgIGVsc2UKLSAgICAgIExsY091dCA9IHN5czo6UGF0aChzeXM6OlBhdGg6OkdldEN1cnJlbnREaXJlY3RvcnkoKSk7Ci0KLSAgICBMbGNPdXQuYXBwZW5kQ29tcG9uZW50KGNsYXNzTmFtZSk7Ci0gICAgTGxjT3V0LmFwcGVuZFN1ZmZpeCgicyIpOwotICAgCi0gICAgc3lzOjpQYXRoIFByb2cgPSBzeXM6OlByb2dyYW06OkZpbmRQcm9ncmFtQnlOYW1lKCJsbGMiKTsKLSAgCi0gICAgaWYgKFByb2cuaXNFbXB0eSgpKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IGZpbmQgbGxjLi4uLiBBYm9ydFxuIik7Ci0gICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotICAgIAotICAgIGNvbnN0IGNoYXIqIGxsY0FyZ3ZbOF07Ci0gICAgaW50IGkgPSAwOwotICAgIGxsY0FyZ3ZbaSsrXSA9IFByb2cuY19zdHIoKTsKLSAgICBsbGNBcmd2W2krK10gPSBPdXQuY19zdHIoKTsKLSAgICBpZiAoc2hhcmVkKSBsbGNBcmd2W2krK10gPSAiLXJlbG9jYXRpb24tbW9kZWw9cGljIjsKLSAgICBsbGNBcmd2W2krK10gPSAiLWRpc2FibGUtZnAtZWxpbSI7Ci0gICAgbGxjQXJndltpKytdID0gIi1mIjsKLSAgICBsbGNBcmd2W2krK10gPSAiLW8iOwotICAgIGxsY0FyZ3ZbaSsrXSA9IExsY091dC5jX3N0cigpOwotICAgIGxsY0FyZ3ZbaSsrXSA9IDA7Ci0gIAotICAgIHJlcyA9IHN5czo6UHJvZ3JhbTo6RXhlY3V0ZUFuZFdhaXQoUHJvZywgbGxjQXJndik7Ci0gICAgT3V0ID0gTGxjT3V0OwotICB9Ci0KLSAgaWYgKCFyZXMgJiYgcnVuR0NDKSB7Ci0gICAgc3lzOjpQYXRoIFByb2cgPSBzeXM6OlByb2dyYW06OkZpbmRQcm9ncmFtQnlOYW1lKCJnKysiKTsKLSAgCi0gICAgaWYgKFByb2cuaXNFbXB0eSgpKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IGZpbmQgZ2NjLi4uLiBBYm9ydFxuIik7Ci0gICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotCi0gICAgZ2NjQXJndlswXSA9IFByb2cuY19zdHIoKTsKLSAgICBnY2NBcmd2W2djY0FyZ2MrK10gPSBPdXQuY19zdHIoKTsKLSAgICBnY2NBcmd2W2djY0FyZ2MrK10gPSBMTFZNTGliczsKLSAgICBnY2NBcmd2W2djY0FyZ2MrK10gPSBWTUtJVExpYnMxOwotICAgIGdjY0FyZ3ZbZ2NjQXJnYysrXSA9IFZNS0lUTGliczI7Ci0gICAgZ2NjQXJndltnY2NBcmdjKytdID0gVk1LSVRMaWJzMzsKLSAgICBnY2NBcmd2W2djY0FyZ2MrK10gPSAiLXB0aHJlYWQiOwotI2lmZGVmIFVTRV9HQ19CT0VITQotICAgIGdjY0FyZ3ZbZ2NjQXJnYysrXSA9ICItbGdjIjsKLSNlbmRpZgotICAgIGdjY0FyZ3ZbZ2NjQXJnYysrXSA9ICItbG0iOwotICAgIGdjY0FyZ3ZbZ2NjQXJnYysrXSA9ICItbGRsIjsKLSAgICBnY2NBcmd2W2djY0FyZ2MrK10gPSAiLWx6IjsKLSAgICBnY2NBcmd2W2djY0FyZ2MrK10gPSAiLWxKMyI7Ci0gICAgZ2NjQXJndltnY2NBcmdjKytdID0gIi1sQ2xhc3NwYXRoIjsKLSAgICBnY2NBcmd2W2djY0FyZ2MrK10gPSAiLWxKMyI7Ci0gICAgZ2NjQXJndltnY2NBcmdjKytdID0gIi1sQ2xhc3NwYXRoIjsKLSAgICBpZiAod2l0aEpJVCkgewotICAgICAgZ2NjQXJndltnY2NBcmdjKytdID0gIi1sSjNDb21waWxlciI7Ci0gICAgfQotICAgIGdjY0FyZ3ZbZ2NjQXJnYysrXSA9ICItbEFsbG9jYXRvciI7Ci0gICAgZ2NjQXJndltnY2NBcmdjKytdID0gIi1sQ29tbW9uVGhyZWFkIjsKLSAgICBnY2NBcmd2W2djY0FyZ2MrK10gPSAiLWxNdm0iOwotICAgIGdjY0FyZ3ZbZ2NjQXJnYysrXSA9ICItbE12bUNvbXBpbGVyIjsKLSAgICBnY2NBcmd2W2djY0FyZ2MrK10gPSAiLWxHQ01tYXAyIjsKLSAgICBnY2NBcmd2W2djY0FyZ2MrK10gPSAiLWx2bWpjIjsKLSAgICBnY2NBcmd2W2djY0FyZ2MrK10gPSAiLWxMTFZNU3VwcG9ydCI7Ci0gICAgZ2NjQXJndltnY2NBcmdjKytdID0gIi1sTExWTVN5c3RlbSI7Ci0jaWYgIWRlZmluZWQoX19NQUNIX18pCi0gICAgZ2NjQXJndltnY2NBcmdjKytdID0gIi1yZHluYW1pYyI7Ci0jZW5kaWYKLSAgICBnY2NBcmd2W2djY0FyZ2MrK10gPSAwOwotCi0gICAgcmVzID0gc3lzOjpQcm9ncmFtOjpFeGVjdXRlQW5kV2FpdChQcm9nLCBnY2NBcmd2KTsKLSAgICAKLSAgfQotCi1jbGVhbnVwOgotICBpZiAoIVNhdmVUZW1wcykgCi0gICAgdGVtcERpci5lcmFzZUZyb21EaXNrKHRydWUpOwotICAKLSAgZGVsZXRlIGdjY0FyZ3Y7Ci0gIGRlbGV0ZSB2bWpjQXJndjsKLSAgZnJlZShjbGFzc05hbWUpOwotCi0gIHJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS92bWtpdC90b29scy9uMy1tb25vL01haW4uY3BwIGIvdm1raXQvdG9vbHMvbjMtbW9uby9NYWluLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJkZDRhNC4uMDAwMDAwMAotLS0gYS92bWtpdC90b29scy9uMy1tb25vL01haW4uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0gTWFpbi5jcHAgLSBTaW1wbGUgZXhlY3V0aW9uIG9mIEpuSlZNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBKbkpWTQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgIm12bS9HQy5oIgotI2luY2x1ZGUgIm12bS9KSVQuaCIKLSNpbmNsdWRlICJtdm0vT2JqZWN0LmgiCi0jaW5jbHVkZSAibXZtL1ZpcnR1YWxNYWNoaW5lLmgiCi0jaW5jbHVkZSAibXZtL1RocmVhZHMvVGhyZWFkLmgiCi0KLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWFuYWdlZFN0YXRpYy5oIgotCi11c2luZyBuYW1lc3BhY2UgbXZtOwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKSB7Ci0gIGxsdm06Omxsdm1fc2h1dGRvd25fb2JqIFg7ICAKLSAgICAKLSAgTXZtTW9kdWxlOjppbml0aWFsaXNlKCk7Ci0gIENvbGxlY3Rvcjo6aW5pdGlhbGlzZSgpOwotCi0gIFZpcnR1YWxNYWNoaW5lOjppbml0aWFsaXNlQ0xJVk0oKTsKLSAgVmlydHVhbE1hY2hpbmUqIHZtID0gVmlydHVhbE1hY2hpbmU6OmNyZWF0ZUNMSVZNKCk7Ci0gIHZtLT5ydW5BcHBsaWNhdGlvbihhcmdjLCBhcmd2KTsKLSAgdm0tPndhaXRGb3JFeGl0KCk7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS92bWtpdC90b29scy9uMy1tb25vL01ha2VmaWxlIGIvdm1raXQvdG9vbHMvbjMtbW9uby9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWZmN2YxNC4uMDAwMDAwMAotLS0gYS92bWtpdC90b29scy9uMy1tb25vL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIyM9PT0tIHRvb2xzL24zL01vbm8vTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKLSMgCi0jICAgICAgICAgICAgICAgICAgICAgVGhlIHZta2l0IHByb2plY3QKLSMKLSMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0jIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLSMgCi0jIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIwotTEVWRUwgPSAuLi8uLgotCi1pbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbmZpZwotCi1UT09MTkFNRSA9IG4zLW1vbm8KLUxJTktfQ09NUE9ORU5UUyA9IGppdCBuYXRpdmVjb2RlZ2VuIHNjYWxhcm9wdHMgaW5zdHJ1bWVudGF0aW9uIGlwYSBpcG8gYml0cmVhZGVyIGFzbXBhcnNlciBsaW5rZXIKLQotCi1pZmVxICgkKFdJVEhfTExWTV9HQ0MpLCAxKQotICBNT0RVTEVTTkFNRSA9IHZta2l0Ci0gIFVTRURNT0RVTEVTID0gTW9uby5iYyBBbGxvY2F0b3IuYmMgQ29tbW9uVGhyZWFkLmJjIE12bS5iYyBcCi0JCU12bUNvbXBpbGVyLmJjIE4zLmJjICQoR0NMSUIpLmJjCi0gIEJVSUxUX1NPVVJDRVMgPSB2bWtpdC5zCi0gIFNPVVJDRVMgPSB2bWtpdC5zICQobm90ZGlyICQod2lsZGNhcmQgJChQUk9KX1NSQ19ESVIpLyouY3BwKSkKLWVsc2UKLQotICBVU0VETElCUyA9IE4zLmEgTW9uby5hIEFsbG9jYXRvci5hIE12bS5hIE12bUNvbXBpbGVyLmEgXAotICAgCSAgICAgJChHQ0xJQikuYSBDb21tb25UaHJlYWQuYQotZW5kaWYKLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KLQotQ1hYLkZsYWdzICs9IGBwa2ctY29uZmlnIC0tY2ZsYWdzIGdsaWItMi4wIGd0aHJlYWQtMi4wYAotTElCUyArPSBgcGtnLWNvbmZpZyAtLWxpYnMgZ2xpYi0yLjAgZ3RocmVhZC0yLjBgCi1DWFguRmxhZ3MgKz0gYHBrZy1jb25maWcgLS1jZmxhZ3MgZ21vZHVsZS0yLjBgCi1MSUJTICs9IGBwa2ctY29uZmlnIC0tbGlicyBnbW9kdWxlLTIuMGAKLQpkaWZmIC0tZ2l0IGEvdm1raXQvdG9vbHMvbjMtcG5ldGxpYi9NYWluLmNwcCBiL3Zta2l0L3Rvb2xzL24zLXBuZXRsaWIvTWFpbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZGQ0YTQuLjAwMDAwMDAKLS0tIGEvdm1raXQvdG9vbHMvbjMtcG5ldGxpYi9NYWluLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vPT09LS0tLS0tLS0tIE1haW4uY3BwIC0gU2ltcGxlIGV4ZWN1dGlvbiBvZiBKbkpWTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgSm5KVk0KLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgUGllcnJlIGV0IE1hcmllIEN1cmllIAotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJtdm0vR0MuaCIKLSNpbmNsdWRlICJtdm0vSklULmgiCi0jaW5jbHVkZSAibXZtL09iamVjdC5oIgotI2luY2x1ZGUgIm12bS9WaXJ0dWFsTWFjaGluZS5oIgotI2luY2x1ZGUgIm12bS9UaHJlYWRzL1RocmVhZC5oIgotCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hbmFnZWRTdGF0aWMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIG12bTsKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCkgewotICBsbHZtOjpsbHZtX3NodXRkb3duX29iaiBYOyAgCi0gICAgCi0gIE12bU1vZHVsZTo6aW5pdGlhbGlzZSgpOwotICBDb2xsZWN0b3I6OmluaXRpYWxpc2UoKTsKLQotICBWaXJ0dWFsTWFjaGluZTo6aW5pdGlhbGlzZUNMSVZNKCk7Ci0gIFZpcnR1YWxNYWNoaW5lKiB2bSA9IFZpcnR1YWxNYWNoaW5lOjpjcmVhdGVDTElWTSgpOwotICB2bS0+cnVuQXBwbGljYXRpb24oYXJnYywgYXJndik7Ci0gIHZtLT53YWl0Rm9yRXhpdCgpOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdm1raXQvdG9vbHMvbjMtcG5ldGxpYi9NYWtlZmlsZSBiL3Zta2l0L3Rvb2xzL24zLXBuZXRsaWIvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY5ZTQ0NTcuLjAwMDAwMDAKLS0tIGEvdm1raXQvdG9vbHMvbjMtcG5ldGxpYi9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMjPT09LSB0b29scy9uMy9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCi0jIAotIyAgICAgICAgICAgICAgICAgICAgIFRoZSB2bWtpdCBwcm9qZWN0Ci0jCi0jIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0jIAotIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKLUxFVkVMID0gLi4vLi4KLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb25maWcKLQotVE9PTE5BTUUgPSBuMy1wbmV0bGliCi1MSU5LX0NPTVBPTkVOVFMgPSBqaXQgbmF0aXZlY29kZWdlbiBzY2FsYXJvcHRzIGluc3RydW1lbnRhdGlvbiBpcGEgaXBvIGJpdHJlYWRlciBhc21wYXJzZXIgbGlua2VyCi0KLWlmZXEgKCQoV0lUSF9MTFZNX0dDQyksIDEpCi0gIE1PRFVMRVNOQU1FID0gdm1raXQKLSAgVVNFRE1PRFVMRVMgPSBOMy5iYyBQTmV0TGliLmJjIEFsbG9jYXRvci5iYyBDb21tb25UaHJlYWQuYmMgTXZtLmJjIFwKLQkJTXZtQ29tcGlsZXIuYmMgJChHQ0xJQikuYmMKLSAgQlVJTFRfU09VUkNFUyA9IHZta2l0LnMKLSAgU09VUkNFUyA9IHZta2l0LnMgJChub3RkaXIgJCh3aWxkY2FyZCAkKFBST0pfU1JDX0RJUikvKi5jcHApKQotZWxzZQotICBVU0VETElCUyA9IE4zLmEgUE5ldExpYi5hIEFsbG9jYXRvci5hIE12bS5hIE12bUNvbXBpbGVyLmEgXAotCQkgICAgICQoR0NMSUIpLmEgQ29tbW9uVGhyZWFkLmEKLWVuZGlmCi0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCi0KLQotTElCUyArPSAkKFBORVRMSUIpL2VuZ2luZS9saWJJTEVuZ2luZS5hICQoUE5FVExJQikvaW1hZ2UvbGliSUxJbWFnZS5hICQoUE5FVExJQikvc3VwcG9ydC9saWJJTFN1cHBvcnQuYSBcCi0JJChQTkVUTElCKS9saWJmZmkvLmxpYnMvbGliZmZpLmEgJChQTkVUTElCKS8vZHVtcGFzbS9saWJJTER1bXBBc20uYQotCmRpZmYgLS1naXQgYS92bWtpdC90b29scy9wMy9NYWluLmNwcCBiL3Zta2l0L3Rvb2xzL3AzL01haW4uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTlmNzY1Li4wMDAwMDAwCi0tLSBhL3Zta2l0L3Rvb2xzL3AzL01haW4uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotI2luY2x1ZGUgIm12bS9WTUtpdC5oIgotI2luY2x1ZGUgIi4uLy4uL2xpYi9wMy9WTUNvcmUvUDMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIHAzOwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLSAgLy8gSW5pdGlhbGl6ZSBiYXNlIGNvbXBvbmVudHMuICAKLSAgbXZtOjpCdW1wUHRyQWxsb2NhdG9yIEFsbG9jYXRvcjsKLQltdm06OlZNS2l0KiB2bWtpdCA9IG5ldyhBbGxvY2F0b3IsICJWTUtpdCIpIG12bTo6Vk1LaXQoQWxsb2NhdG9yKTsKLSAKLSAgLy8gQ3JlYXRlIHRoZSBhbGxvY2F0b3IgdGhhdCB3aWxsIGFsbG9jYXRlIHRoZSBib290c3RyYXAgbG9hZGVyIGFuZCB0aGUgSlZNLgotCXAzOjpQMyogdm0gPSBuZXcoQWxsb2NhdG9yLCAiVk0iKSBQMyhBbGxvY2F0b3IsIHZta2l0KTsKLSAKLSAgLy8gUnVuIHRoZSBhcHBsaWNhdGlvbi4gCi0gIHZtLT5ydW5BcHBsaWNhdGlvbihhcmdjLCBhcmd2KTsKLSAgdm1raXQtPndhaXROb25EYWVtb25UaHJlYWRzKCk7Ci0gIGV4aXQoMCk7Ci19Ci0KZGlmZiAtLWdpdCBhL3Zta2l0L3Rvb2xzL3AzL01ha2VmaWxlIGIvdm1raXQvdG9vbHMvcDMvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMGYwODYuLjAwMDAwMDAKLS0tIGEvdm1raXQvdG9vbHMvcDMvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jIz09PS0gdG9vbHMvcDMvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIwotIyAKLSMgICAgICAgICAgICAgICAgICAgICBUaGUgdm1raXQgcHJvamVjdAotIwotIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLSMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotIyAKLSMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCi1MRVZFTCA9IC4uLy4uCi0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29uZmlnCi0KLVRPT0xOQU1FID0gcDMKLQotaWZlcSAoJChXSVRIX0xMVk1fR0NDKSwgMSkKLQotICBNT0RVTEVTTkFNRSA9IHAzCi0gIFVTRURNT0RVTEVTID0gUDMuYmMgSjMuYmMgQ2xhc3NwYXRoLmJjIEozQ29tcGlsZXIuYmMgQWxsb2NhdG9yLmJjIENvbW1vblRocmVhZC5iYyBcCi0JCU12bS5iYyBNdm1Db21waWxlci5iYwotCi0gIGlmZXEgKCQoR0NfTU1USyksIDEpCi0gICAgVVNFRE1PRFVMRVMgKz0gRmluYWxNTVRrLmJjIElubGluZU1NVGsuYmMKLSAgZWxzZQotICAgIFVTRURNT0RVTEVTICs9ICQoR0NMSUIpLmJjCi0gIGVuZGlmCi0KLSAgQlVJTFRfU09VUkNFUyA9IHAzLnMKLSAgU09VUkNFUyA9IHAzLnMgJChub3RkaXIgJCh3aWxkY2FyZCAkKFBST0pfU1JDX0RJUikvKi5jcHApKQotCi1lbHNlCi0KLVVTRURMSUJTID0gUDMuYSBKMy5hIENsYXNzcGF0aC5hIEozLmEgSjNDb21waWxlci5hIEFsbG9jYXRvci5hIFwKLQkgICBNdm0uYSBNdm1Db21waWxlci5hICQoR0NMSUIpLmEgQWxsb2NhdG9yLmEgQ29tbW9uVGhyZWFkLmEKLQotZW5kaWYKLQotTElOS19DT01QT05FTlRTID0gaml0IG5hdGl2ZWNvZGVnZW4gc2NhbGFyb3B0cyBpbnN0cnVtZW50YXRpb24gaXBhIGlwbyBiaXRyZWFkZXIgYXNtcGFyc2VyIGxpbmtlcgotCi0KLWluY2x1ZGUgJChMRVZFTCkvTWFrZWZpbGUuY29tbW9uCmRpZmYgLS1naXQgYS92bWtpdC90b29scy90ZXN0QWxsb2NhdG9yL01haW4uY3BwIGIvdm1raXQvdG9vbHMvdGVzdEFsbG9jYXRvci9NYWluLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM5NjQ4MC4uMDAwMDAwMAotLS0gYS92bWtpdC90b29scy90ZXN0QWxsb2NhdG9yL01haW4uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tIG1haW4uY2MgLSBNdm0gYWxsb2NhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdm0KLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSAiZ2NhbGxvYy5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotCi0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci12b2lkIHNldF9zdGFja19zaXplKHVpbnQgTWJzKQotewotICAgIGNvbnN0IHJsaW1fdCBrU3RhY2tTaXplID0gTWJzICogMTAyNCAqIDEwMjQ7Ci0gICAgc3RydWN0IHJsaW1pdCBybDsKLSAgICBpbnQgcmVzdWx0OwotCi0gICAgcmVzdWx0ID0gZ2V0cmxpbWl0KFJMSU1JVF9TVEFDSywgJnJsKTsKLSAgICBpZiAocmVzdWx0ID09IDApCi0gICAgewotICAgICAgICBpZiAocmwucmxpbV9jdXIgPCBrU3RhY2tTaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICBybC5ybGltX2N1ciA9IGtTdGFja1NpemU7Ci0gICAgICAgICAgICByZXN1bHQgPSBzZXRybGltaXQoUkxJTUlUX1NUQUNLLCAmcmwpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSAwKQotICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNldHJsaW1pdCByZXR1cm5lZCByZXN1bHQgPSAlZFxuIiwgcmVzdWx0KTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzZXRybGltaXQgT0tcbiIpOwotICAgICAgICB9Ci0gICAgfQotfQotCi11bnNpZ25lZCBpbnQgcmFuZCh1bnNpZ25lZCBpbnQgbWluLCB1bnNpZ25lZCBpbnQgbWF4KSB7Ci0JcmV0dXJuICh1bnNpZ25lZCBpbnQpbmVhcmJ5aW50KCgoKGRvdWJsZSkobWF4IC0gbWluKSkqOjpyYW5kKCkpLyhSQU5EX01BWCArIDEuMCkpICsgbWluOwotfQotCi12b2lkIHRpcmUoc2l6ZV90IG4sIHNpemVfdCAqdmFscywgc2l6ZV90ICpyZWFsbG9jcywgc2l6ZV90ICpmcmVlcykgewotCWZvcihzaXplX3QgaT0wOyBpPG47IGkrKykgewotCQlpZihyYW5kKDAsIDIwKSkKLQkJCXZhbHNbaV0gPSByYW5kKDEsIDI1Nik7Ci0JCWVsc2UKLQkJCXZhbHNbaV0gPSByYW5kKDI1NiwgNjU1MzYpOwotCQlpZighcmFuZCgwLCAxMCkpIC8qIHVuIGNoYW5jZSBzdXIgMTAgZGUgculhbGxvdWVyICovCi0JCQlpZihyYW5kKDAsIDIwKSkKLQkJCQlyZWFsbG9jc1tpXSA9IHJhbmQoMSwgMjU2KTsKLQkJCWVsc2UKLQkJCQlyZWFsbG9jc1tpXSA9IHJhbmQoMjU2LCA2NTUzNik7Ci0JCWVsc2UKLQkJCXJlYWxsb2NzW2ldID0gMDsKLQkJaWYocmFuZCgwLCAxMCkpIC8qIHVuIGNoYW5jZSBzdXIgMTAgZGUgbmUgcGFzIGxpYulyZXIgKi8KLQkJCWZyZWVzW2ldID0gMTsKLQkJZWxzZQotCQkJZnJlZXNbaV0gPSAwOwotCX0KLX0KLQotdm9pZCBwcmludE1lc3VyZShzaXplX3Qgbiwgc2l6ZV90ICp2YWxzLCBzaXplX3QgKnJlYWxsb2NzLCBzaXplX3QgKmZyZWVzLCBzdHJ1Y3QgdGltZXZhbCAqc3RhcnQsIHN0cnVjdCB0aW1ldmFsICplbmQpIHsKLQlzaXplX3QgICB0b3RBbGxvY2F0ZWQgPSAwOwotCXNpemVfdCAgIGN1ckFsbG9jYXRlZCA9IDA7Ci0Jc2l6ZV90ICAgbmEgPSAwOwotCXNpemVfdCAgIG5yID0gMDsKLQlzaXplX3QgICBuZiA9IDA7Ci0Jc2l6ZV90ICAgbm8gPSAwOwotCi0JZm9yKHNpemVfdCBpPTA7IGk8bjsgaSsrKSB7Ci0JCXNpemVfdCBoZXJlID0gdmFsc1tpXSArIHJlYWxsb2NzW2ldOwotCQlpZihyZWFsbG9jc1tpXSkgewotCQkJbmErKzsKLQkJCW5yKys7Ci0JCX0KLQkJbmErKzsKLQkJdG90QWxsb2NhdGVkICs9IGhlcmU7Ci0JCWlmKCFmcmVlc1tpXSkgewotCQkJY3VyQWxsb2NhdGVkICs9IGhlcmU7Ci0JCQlubysrOwotCQl9IGVsc2UKLQkJCW5mKys7Ci0JfQotCi0JcHJpbnRmKCI7ICVsdSBhbGxvY2F0aW9ucyAoJWx1IHJlYWxsb2NhdGlvbnMsICVsdSBmcmVlLCAlbHUgY2h1bmtzKVxuIiwgbmEsIG5yLCBuZiwgbm8pOwotCXByaW50ZigiOyAgIEFsbG9jYXRlZDogJWx1IGJ5dGVzLCBjdXJyZW50ICVsdSBieXRlc1xuIiwgdG90QWxsb2NhdGVkLCBjdXJBbGxvY2F0ZWQpOwotCQotCXN0cnVjdCB0aW1ldmFsIGRpZmY7Ci0JdGltZXJzdWIoZW5kLCBzdGFydCwgJmRpZmYpOwotCWRvdWJsZSBmID0gKGRvdWJsZSlkaWZmLnR2X3NlYyArICgoZG91YmxlKWRpZmYudHZfdXNlYyAvIDEwMDAwMDAuMCk7Ci0JcHJpbnRmKCI7ICAgdGltZSBjb25zdW1lZDogJWZzXG4iLCBmKTsKLX0KLQotdm9pZCBtZXN1cmVBbGxvY2F0ZXVyKCkgewotCXNpemVfdCBuID0gNTEyKjEwMjQ7IC8vNTEySyA0Ynl0ZXM9PTJNYiwgdGltZXMzPTZNYjsgZm9yIHg4Nl82NDoxMk1iCi0Jc2l6ZV90KiB2YWxzID0gKHNpemVfdCopYWxsb2NhKHNpemVvZihzaXplX3QpICogbik7Ci0Jc2l6ZV90KiByZWFsbG9jcyA9IChzaXplX3QqKWFsbG9jYShzaXplb2Yoc2l6ZV90KSAqIG4pOwotCXNpemVfdCogZnJlZXMgPSAoc2l6ZV90KilhbGxvY2Eoc2l6ZW9mKHNpemVfdCkgKiBuKTsKLQotCXByaW50ZigiVGlyZSB1bmUgc2VxdWVuY2UgZCdhbGxvY2F0aW9ucyBhbGzpYXRvaXJlXG4iKTsKLQl0aXJlKG4sIHZhbHMsIHJlYWxsb2NzLCBmcmVlcyk7Ci0KLQlwcmludGYoInRlc3RcbiIpOwotCXN0cnVjdCB0aW1ldmFsIHN0YXJ0OwotCXN0cnVjdCB0aW1ldmFsIGVuZDsKLQlHQ0FsbG9jYXRvciAqYSA9IG5ldyBHQ0FsbG9jYXRvcigpOwotCi0JZ2V0dGltZW9mZGF5KCZzdGFydCwgMCk7Ci0JZm9yKHNpemVfdCBpPTA7IGk8bjsgaSsrKSB7Ci0JCXZvaWQgKnAgPSBhLT5hbGxvYyh2YWxzW2ldKTsKLQkJaWYocmVhbGxvY3NbaV0pCi0JCQlwID0gYS0+cmVhbGxvYyhwLCByZWFsbG9jc1tpXSk7Ci0JCWlmKGZyZWVzW2ldKQotCQkJYS0+ZnJlZShwKTsKLQl9Ci0JZ2V0dGltZW9mZGF5KCZlbmQsIDApOwotCWRlbGV0ZSBhOwotCi0JcHJpbnRNZXN1cmUobiwgdmFscywgcmVhbGxvY3MsIGZyZWVzLCAmc3RhcnQsICZlbmQpOwotCXByaW50ZigiUHJlc3MgYSBrZXkuLi5cbiIpOwotCWdldGNoYXIoKTsKLQotCWdldHRpbWVvZmRheSgmc3RhcnQsIDApOwotCWZvcihzaXplX3QgaT0wOyBpPG47IGkrKykgewotCQl2b2lkICpwID0gbWFsbG9jKHZhbHNbaV0pOwotCQkoKGNoYXIgKilwKVswXSA9IDE7Ci0JCWlmKHJlYWxsb2NzW2ldKQotCQkJcCA9IHJlYWxsb2MocCwgcmVhbGxvY3NbaV0pOwotCQlpZihmcmVlc1tpXSkKLQkJCWZyZWUocCk7Ci0JfQotCWdldHRpbWVvZmRheSgmZW5kLCAwKTsKLQlwcmludE1lc3VyZShuLCB2YWxzLCByZWFsbG9jcywgZnJlZXMsICZzdGFydCwgJmVuZCk7Ci0JcHJpbnRmKCJQcmVzcyBhIGtleS4uLlxuIik7Ci0JZ2V0Y2hhcigpOwotCi19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewotCWlmKCBzaXplb2Yoc2l6ZV90KSA+IDQpIC8vYm9ndXMgY2hlY2sgZm9yIDY0Yml0cwotCSAgc2V0X3N0YWNrX3NpemUoMTYpOyAvL3VwZGF0ZSBtaW4gc3RhY2sgc2l6ZSB0byAxNiBNQiBmb3IgbWVzdXJlQWxsb2NhdGV1cigpCi0JbWVzdXJlQWxsb2NhdGV1cigpOwotCi0JR0NIYXNoOjpkZXN0cm95KCk7Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS92bWtpdC90b29scy90ZXN0QWxsb2NhdG9yL01ha2VmaWxlIGIvdm1raXQvdG9vbHMvdGVzdEFsbG9jYXRvci9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjllYjdiZS4uMDAwMDAwMAotLS0gYS92bWtpdC90b29scy90ZXN0QWxsb2NhdG9yL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyM9PT0tIHRvb2xzL3Rlc3RBbGxvY2F0b3IvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKLSMgCi0jICAgICAgICAgICAgICAgICAgICAgVGhlIHZta2l0IHByb2plY3QKLSMKLSMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0jIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLSMgCi0jIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIwotTEVWRUwgPSAuLi8uLgotCi1UT09MTkFNRSA9IHRlc3RBbGxvY2F0b3IKLVVTRURMSUJTID0gQWxsb2NhdG9yLmEKLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KLQotQ1hYLkZsYWdzICs9IC1JJChMRVZFTCkvbGliL012bS9BbGxvY2F0b3IKZGlmZiAtLWdpdCBhL3Zta2l0L3Rvb2xzL3Rlc3RDb2xsZWN0b3IvTWFpbi5jcHAgYi92bWtpdC90b29scy90ZXN0Q29sbGVjdG9yL01haW4uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTg4NzhhLi4wMDAwMDAwCi0tLSBhL3Zta2l0L3Rvb2xzL3Rlc3RDb2xsZWN0b3IvTWFpbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLS0tLS0gbWFpbi5jYyAtIE12bSBHYXJiYWdlIENvbGxlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXZtCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlIAotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJtdm0vR0MuaCIKLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9UaHJlYWQuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotCi12b2lkIGRlc3RyKGdjICptZSwgc2l6ZV90IHN6KSB7Ci0gCXByaW50ZigiRGVzdHJveSAlcFxuIiwgKHZvaWQqKW1lKTsKLX0KLQotdm9pZCB0cmFjZShnYyAqbWUsIHNpemVfdCBzeikgewotCS8vIHByaW50ZigiVHJhY2UgJXBcbiIsICh2b2lkKiltZSk7Ci19Ci0KLXZvaWQgbWFya2VyKHZvaWQqKSB7Ci0JLy8gcHJpbnRmKCJNYXJrZXIuLi5cbiIpOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLSAgbXZtOjpDb2xsZWN0b3I6OmluaXRpYWxpc2UoKTsKLSNpZmRlZiBNVUxUSVBMRV9HQwotICBtdm06OlRocmVhZDo6Z2V0KCktPkdDLT5kZXN0cm95KCk7Ci0jZWxzZQotICBtdm06OkNvbGxlY3Rvcjo6ZGVzdHJveSgpOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS92bWtpdC90b29scy90ZXN0Q29sbGVjdG9yL01ha2VmaWxlIGIvdm1raXQvdG9vbHMvdGVzdENvbGxlY3Rvci9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzYzOTRmNi4uMDAwMDAwMAotLS0gYS92bWtpdC90b29scy90ZXN0Q29sbGVjdG9yL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyM9PT0tIHRvb2xzL3Rlc3RDb2xsZWN0b3IvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKLSMgCi0jICAgICAgICAgICAgICAgICAgICAgVGhlIHZta2l0IHByb2plY3QKLSMKLSMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0jIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLSMgCi0jIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIwotTEVWRUwgPSAuLi8uLgotCi1UT09MTkFNRSA9IHRlc3RDb2xsZWN0b3IKLVVTRURMSUJTPUdDTW1hcDIuYSBDb21tb25UaHJlYWQuYSBBbGxvY2F0b3IuYSBHQ01tYXAyLmEgTXZtLmEgR0NNbWFwMi5hCi0KLUxJTktfQ09NUE9ORU5UUyA9IHN1cHBvcnQKLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KLQotQ1hYLkZsYWdzICs9IC1JJChMRVZFTCkvbGliL012bS9BbGxvY2F0b3IgLUkkKExFVkVMKS9saWIvTXZtL0dDTW1hcDIKZGlmZiAtLWdpdCBhL3Zta2l0L3Rvb2xzL3ZtamMvTWFrZWZpbGUgYi92bWtpdC90b29scy92bWpjL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZTM1NjUxLi4wMDAwMDAwCi0tLSBhL3Zta2l0L3Rvb2xzL3ZtamMvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIz09PS0gdG9vbHMvdm1qYy9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCi0jIAotIyAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0jCi0jIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0jIAotIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKLUxFVkVMID0gLi4vLi4KLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb25maWcKLQotRVhUUkFfRElTVCA9IGxpYnZtamMKLQotVE9PTE5BTUUgPSB2bWpjCi0KLQotaWZlcSAoJChXSVRIX0xMVk1fR0NDKSwgMSkKLSAgTU9EVUxFU05BTUUgPSB2bWtpdAotICBVU0VETU9EVUxFUyA9IEozLmJjIENsYXNzcGF0aC5iYyBKM0NvbXBpbGVyLmJjIEFsbG9jYXRvci5iYyBcCi0JCUNvbW1vblRocmVhZC5iYyBNdm0uYmMgTXZtQ29tcGlsZXIuYmMgJChHQ0xJQikuYmMKLQotICBCVUlMVF9TT1VSQ0VTID0gdm1raXQucwotICBTT1VSQ0VTID0gdm1raXQucyAkKG5vdGRpciAkKHdpbGRjYXJkICQoUFJPSl9TUkNfRElSKS8qLmNwcCkpCi0KLWVsc2UKLQotICBVU0VETElCUyA9IEozLmEgQ2xhc3NwYXRoLmEgSjMuYSBKM0NvbXBpbGVyLmEgQWxsb2NhdG9yLmEgXAotCSAgICAgTXZtLmEgTXZtQ29tcGlsZXIuYSAkKEdDTElCKS5hIEFsbG9jYXRvci5hIENvbW1vblRocmVhZC5hCi1lbmRpZgotCi1MSU5LX0NPTVBPTkVOVFMgPSBqaXQgbmF0aXZlY29kZWdlbiBzY2FsYXJvcHRzIGluc3RydW1lbnRhdGlvbiBpcGEgaXBvIGJpdHdyaXRlciBiaXRyZWFkZXIgYXNtcGFyc2VyIGxpbmtlcgotCi1pbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgpkaWZmIC0tZ2l0IGEvdm1raXQvdG9vbHMvdm1qYy9saWJ2bWpjL01ha2VmaWxlIGIvdm1raXQvdG9vbHMvdm1qYy9saWJ2bWpjL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZTUxNmI5Li4wMDAwMDAwCi0tLSBhL3Zta2l0L3Rvb2xzL3ZtamMvbGlidm1qYy9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjPT09LSB0b29scy92bWpjL2xpYnZtamMvTWFrZWZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCi0jIAotIyAgICAgICAgICAgICAgICAgICAgIFRoZSBWTUtpdCBwcm9qZWN0Ci0jCi0jIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0jIAotIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKLUxFVkVMID0gLi4vLi4vLi4KLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb25maWcKLQotTElCUkFSWU5BTUUgPSBsaWJ2bWpjCi1MT0FEQUJMRV9NT0RVTEUgPSAxCi1WTUpDX0FTU0VNQkxZID0gMQotQlVJTFRfU09VUkNFUyA9IGdsaWJqLnppcC5zCi0KLVNPVVJDRVMgPSBnbGliai56aXAucwotCi1pbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbW1vbgpkaWZmIC0tZ2l0IGEvdm1raXQvdG9vbHMvdm1qYy92bWpjLmNwcCBiL3Zta2l0L3Rvb2xzL3ZtamMvdm1qYy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NGZjMDIuLjAwMDAwMDAKLS0tIGEvdm1raXQvdG9vbHMvdm1qYy92bWpjLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tIHZtamMuY3BwIC0gSmF2YSBzdGF0aWMgY29tcGlsZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vIFRoaXMgdXRpbGl0eSBtYXkgYmUgaW52b2tlZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lcjoKLS8vICB2bWpjIFtvcHRpb25zXSB4IC0gUmVhZCBKYXZhIGJ5dGVjb2RlIGZyb20gdGhlIHguY2xhc3MgZmlsZSwgd3JpdGUgbGx2bQotLy8gICAgICAgICAgICAgICAgICAgICBieXRlY29kZSB0byB0aGUgeC5iYyBmaWxlLgotLy8gIE9wdGlvbnM6Ci0vLyAgICAgIC0taGVscCAgIC0gT3V0cHV0IGluZm9ybWF0aW9uIGFib3V0IGNvbW1hbmQgbGluZSBzd2l0Y2hlcwotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJsbHZtL0xpbmtBbGxQYXNzZXMuaCIKLSNpbmNsdWRlICJsbHZtL0xpbmtBbGxWTUNvcmUuaCIKLSNpbmNsdWRlICJsbHZtL01vZHVsZS5oIgotI2luY2x1ZGUgImxsdm0vUGFzc01hbmFnZXIuaCIKLSNpbmNsdWRlICJsbHZtL0Fzc2VtYmx5L1ByaW50TW9kdWxlUGFzcy5oIgotI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9MaW5rQWxsQ29kZWdlbkNvbXBvbmVudHMuaCIKLSNpbmNsdWRlICJsbHZtL0JpdGNvZGUvUmVhZGVyV3JpdGVyLmgiCi0jaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvRXhlY3V0aW9uRW5naW5lLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hbmFnZWRTdGF0aWMuaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L1Bhc3NOYW1lUGFyc2VyLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L1BsdWdpbkxvYWRlci5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9SZWdpc3RyeVBhcnNlci5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TeXN0ZW1VdGlscy5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TaWduYWxzLmgiCi0jaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgotI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKLQotCi0jaW5jbHVkZSAibXZtL0dDLmgiCi0jaW5jbHVkZSAibXZtL0pJVC5oIgotI2luY2x1ZGUgIm12bS9WTUtpdC5oIgotI2luY2x1ZGUgIm12bS9WaXJ0dWFsTWFjaGluZS5oIgotI2luY2x1ZGUgIm12bS9UaHJlYWRzL1RocmVhZC5oIgotCi0jaW5jbHVkZSAiajMvSmF2YUFPVENvbXBpbGVyLmgiCi0KLSNpbmNsdWRlICIuLi8uLi9saWIvSjMvVk1Db3JlL0puanZtQ2xhc3NMb2FkZXIuaCIKLSNpbmNsdWRlICIuLi8uLi9saWIvSjMvVk1Db3JlL0puanZtLmgiCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLXVzaW5nIG5hbWVzcGFjZSBqMzsKLXVzaW5nIG5hbWVzcGFjZSBsbHZtOwotCi1zdGF0aWMgY2w6Om9wdDxzdGQ6OnN0cmluZz4KLUlucHV0RmlsZW5hbWUoY2w6OlBvc2l0aW9uYWwsIGNsOjpkZXNjKCI8aW5wdXQgSmF2YSBieXRlY29kZT4iKSwgY2w6OmluaXQoIi0iKSk7Ci0KLXN0YXRpYyBjbDo6b3B0PHN0ZDo6c3RyaW5nPgotT3V0cHV0RmlsZW5hbWUoIm8iLCBjbDo6ZGVzYygiT3ZlcnJpZGUgb3V0cHV0IGZpbGVuYW1lIiksCi0gICAgICAgICAgICAgICBjbDo6dmFsdWVfZGVzYygiZmlsZW5hbWUiKSk7Ci0KLXN0YXRpYyBjbDo6b3B0PGJvb2w+Ci1Gb3JjZSgiZiIsIGNsOjpkZXNjKCJPdmVyd3JpdGUgb3V0cHV0IGZpbGVzIikpOwotCi1zdGF0aWMgY2w6Om9wdDxzdGQ6OnN0cmluZz4KLU1haW5DbGFzcygibWFpbiIsIGNsOjpkZXNjKCJTcGVjaWZ5IG1haW4gY2xhc3MiKSk7Ci0KLXN0YXRpYyBjbDo6b3B0PGJvb2w+Ci1XaXRoSklUKCJ3aXRoLWppdCIsIGNsOjpkZXNjKCJHZW5lcmF0ZSBtYWluIGZ1bmN0aW9uIHdpdGggSklUIHN1cHBvcnQiKSk7Ci0KLXN0YXRpYyBjbDo6b3B0PGJvb2w+Ci1EaXNhYmxlT3V0cHV0KCJkaXNhYmxlLW91dHB1dCIsIGNsOjpkZXNjKCJEaXNhYmxlIG91dHB1dCIpLCBjbDo6aW5pdChmYWxzZSkpOwotCi1zdGF0aWMgY2w6Om9wdDxzdGQ6OnN0cmluZz4KLVRhcmdldFRyaXBsZSgibXRyaXBsZSIsIGNsOjpkZXNjKCJPdmVycmlkZSB0YXJnZXQgdHJpcGxlIGZvciBtb2R1bGUiKSk7Ci0KLXN0YXRpYyBjbDo6b3B0PGJvb2w+Ci1EaXNhYmxlRXhjZXB0aW9ucygiZGlzYWJsZS1leGNlcHRpb25zIiwKLSAgICAgICAgICAgICAgY2w6OmRlc2MoIkRpc2FibGUgSmF2YSBleGNlcHRpb25zIikpOwotCi1zdGF0aWMgY2w6Om9wdDxib29sPgotRGlzYWJsZUNvb3BlcmF0aXZlR0MoImRpc2FibGUtY29vcGVyYXRpdmVnYyIsCi0gICAgICAgICAgICAgIGNsOjpkZXNjKCJEaXNhYmxlIGNvb3BlcmF0aXZlIGdhcmJhZ2UgY29sbGVjdGlvbiIpKTsKLQotCi1zdGF0aWMgY2w6Om9wdDxib29sPgotRGlzYWJsZVN0dWJzKCJkaXNhYmxlLXN0dWJzIiwKLSAgICAgICAgICAgICAgY2w6OmRlc2MoIkRpc2FibGUgSmF2YSBzdHVicyIpKTsKLQotc3RhdGljIGNsOjpvcHQ8Ym9vbD4KLUFzc3VtZUNvbXBpbGVkKCJhc3N1bWUtY29tcGlsZWQiLAotICAgICAgICAgICAgICBjbDo6ZGVzYygiQXNzdW1lIGV4dGVybmFsIEphdmEgY2xhc3NlcyBhcmUgY29tcGlsZWQiKSk7Ci0KLXN0YXRpYyBjbDo6b3B0PGJvb2w+IAotUHJpbnRTdGF0cygicHJpbnQtYW90LXN0YXRzIiwgCi0gICAgICAgICAgIGNsOjpkZXNjKCJQcmludCBzdGF0cyBieSB0aGUgQU9UIGNvbXBpbGVyIikpOwotCi0KLXN0YXRpYyBjbDo6bGlzdDxzdGQ6OnN0cmluZz4gCi1Qcm9wZXJ0aWVzKCJEIiwgY2w6OmRlc2MoIlNldCBhIHByb3BlcnR5IiksIGNsOjpQcmVmaXgsIGNsOjpaZXJvT3JNb3JlKTsKLQotc3RhdGljIGNsOjpsaXN0PHN0ZDo6c3RyaW5nPiAKLVdpdGhDbGluaXQoIndpdGgtY2xpbml0IiwgY2w6OmRlc2MoIkNsYXNzZXMgdG8gY2xpbml0IiksIGNsOjpaZXJvT3JNb3JlLAotICAgICAgICAgICBjbDo6Q29tbWFTZXBhcmF0ZWQpOwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLSAgbGx2bV9zaHV0ZG93bl9vYmogWDsgIC8vIENhbGwgbGx2bV9zaHV0ZG93bigpIG9uIGV4aXQuCi0gIGNsOjpQYXJzZUNvbW1hbmRMaW5lT3B0aW9ucyhhcmdjLCBhcmd2LCAidm1raXQgLmNsYXNzIC0+IC5sbCBjb21waWxlclxuIik7Ci0gIHN5czo6UHJpbnRTdGFja1RyYWNlT25FcnJvclNpZ25hbCgpOwotCi0gIHN0ZDo6c3RyaW5nIEVycm9yTWVzc2FnZTsKLQotICAgIAotICBpZiAoSW5wdXRGaWxlbmFtZSA9PSAiLSIpIHsKLSAgICBjbDo6UHJpbnRIZWxwTWVzc2FnZSgpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gRGlzYWJsZSBjcm9zcy1jb21waWxpbmcgZm9yIG5vdy4KLSAgaWYgKGZhbHNlKSB7Ci0gICAgTW9kdWxlKiBUaGVNb2R1bGUgPSBuZXcgTW9kdWxlKCJib290c3RyYXAgbW9kdWxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihuZXcgbGx2bTo6TExWTUNvbnRleHQoKSkpOwotICAgIGlmICghVGFyZ2V0VHJpcGxlLmVtcHR5KCkpCi0gICAgICBUaGVNb2R1bGUtPnNldFRhcmdldFRyaXBsZShUYXJnZXRUcmlwbGUpOwotICAgIGVsc2UKLSAgICAgIFRoZU1vZHVsZS0+c2V0VGFyZ2V0VHJpcGxlKG12bTo6TXZtTW9kdWxlOjpnZXRIb3N0VHJpcGxlKCkpOwotCi0jaWYgMAotICAgIC8vIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGFuIGFyY2hpdGVjdHVyZSB0byBjb21waWxlIGZvci4KLSAgICBjb25zdCBUYXJnZXQgKlRoZVRhcmdldCA9IDA7Ci0gICAgaWYgKCFNQXJjaC5lbXB0eSgpKSB7Ci0gICAgICBmb3IgKFRhcmdldFJlZ2lzdHJ5OjppdGVyYXRvciBpdCA9IFRhcmdldFJlZ2lzdHJ5OjpiZWdpbigpLAotICAgICAgICAgICBpZSA9IFRhcmdldFJlZ2lzdHJ5OjplbmQoKTsgaXQgIT0gaWU7ICsraXQpIHsKLSAgICAgICAgaWYgKE1BcmNoID09IGl0LT5nZXROYW1lKCkpIHsKLSAgICAgICAgICBUaGVUYXJnZXQgPSAmKml0OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICghVGhlVGFyZ2V0KSB7Ci0gICAgICAgIGVycnMoKSA8PCBhcmd2WzBdIDw8ICI6IGVycm9yOiBpbnZhbGlkIHRhcmdldCAnIiA8PCBNQXJjaCA8PCAiJy5cbiI7Ci0gICAgICAgIHJldHVybiAxOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBzdGQ6OnN0cmluZyBFcnI7Ci0gICAgICBUaGVUYXJnZXQgPQotICAgICAgICBUYXJnZXRSZWdpc3RyeTo6Z2V0Q2xvc2VzdFN0YXRpY1RhcmdldEZvck1vZHVsZSgqVGhlTW9kdWxlLCBFcnIpOwotICAgICAgaWYgKFRoZVRhcmdldCA9PSAwKSB7Ci0gICAgICAgIGVycnMoKSA8PCBhcmd2WzBdIDw8ICI6IGVycm9yIGF1dG8tc2VsZWN0aW5nIHRhcmdldCBmb3IgbW9kdWxlICciCi0gICAgICAgICAgICAgICA8PCBFcnIgPDwgIicuICBQbGVhc2UgdXNlIHRoZSAtbWFyY2ggb3B0aW9uIHRvIGV4cGxpY2l0bHkgIgotICAgICAgICAgICAgICAgPDwgInBpY2sgYSB0YXJnZXQuXG4iOwotICAgICAgICByZXR1cm4gMTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZyBGZWF0dXJlc1N0cjsKLSAgICBzdGQ6OmF1dG9fcHRyPFRhcmdldE1hY2hpbmU+Ci0gICAgICB0YXJnZXQoVGhlVGFyZ2V0LT5jcmVhdGVUYXJnZXRNYWNoaW5lKCpUaGVNb2R1bGUsIEZlYXR1cmVzU3RyKSk7Ci0gICAgYXNzZXJ0KHRhcmdldC5nZXQoKSAmJiAiQ291bGQgbm90IGFsbG9jYXRlIHRhcmdldCBtYWNoaW5lISIpOwotICAgIFRhcmdldE1hY2hpbmUgJlRhcmdldCA9ICp0YXJnZXQuZ2V0KCk7Ci0KLSAgICAvLyBJbnN0YWxsIGluZm9ybWF0aW9uIGFib3V0IHRhcmdldCBkYXRhbGF5b3V0IHN0dWZmIGludG8gdGhlIG1vZHVsZSBmb3IKLSAgICAvLyBvcHRpbWl6ZXIgdXNlLgotICAgIFRoZU1vZHVsZS0+c2V0RGF0YUxheW91dChUYXJnZXQuZ2V0VGFyZ2V0RGF0YSgpLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RyaW5nUmVwcmVzZW50YXRpb24oKSk7Ci0KLQotICAgIG12bTo6Vk1LaXQ6OmluaXRpYWxpc2UoQ29kZUdlbk9wdDo6RGVmYXVsdCwgVGhlTW9kdWxlLCAmVGFyZ2V0KTsKLSNlbmRpZgotICB9Ci0KLSAgbXZtOjpCdW1wUHRyQWxsb2NhdG9yIGFsbG9jYXRvcjsKLQltdm06OlZNS2l0KiB2bWtpdCA9IG5ldyhhbGxvY2F0b3IsICJWTUtpdCIpIG12bTo6Vk1LaXQoYWxsb2NhdG9yKTsKLQotICBKYXZhQU9UQ29tcGlsZXIqIENvbXAgPSBuZXcgSmF2YUFPVENvbXBpbGVyKCJBT1QiKTsKLQotICBpZiAoRGlzYWJsZUV4Y2VwdGlvbnMpIENvbXAtPmRpc2FibGVFeGNlcHRpb25zKCk7Ci0gIGlmIChEaXNhYmxlU3R1YnMpIENvbXAtPmdlbmVyYXRlU3R1YnMgPSBmYWxzZTsKLSAgaWYgKEFzc3VtZUNvbXBpbGVkKSBDb21wLT5hc3N1bWVDb21waWxlZCA9IHRydWU7Ci0gIGlmIChEaXNhYmxlQ29vcGVyYXRpdmVHQykgQ29tcC0+ZGlzYWJsZUNvb3BlcmF0aXZlR0MoKTsKLQkKLSAgSm5qdm0qIHZtID0gbmV3KGFsbG9jYXRvciwgIkJvb3RzdHJhcCBsb2FkZXIiKSBKbmp2bShhbGxvY2F0b3IsIHZta2l0LCBDb21wLCBmYWxzZSk7Ci0gIAotICBmb3IgKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaSA9IFByb3BlcnRpZXMuYmVnaW4oKSwKLSAgICAgICBlID0gUHJvcGVydGllcy5lbmQoKTsgaSAhPSBlOyArK2kpIHsKLQotICAgIGNoYXIqIGtleSA9IG5ldyBjaGFyIFsoKmkpLnNpemUoKSsxXTsKLSAgICBzdHJjcHkoa2V5LCAoKmkpLmNfc3RyKCkpOwotICAgIGNoYXIqIHZhbHVlID0gc3RyY2hyKGtleSwgJz0nKTsKLSAgICBpZiAoIXZhbHVlKSB7Ci0gICAgICBkZWxldGVbXSBrZXk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHZhbHVlWzBdID0gMDsKLSAgICAgIHZtLT5hZGRQcm9wZXJ0eShrZXksICZ2YWx1ZVsxXSk7Ci0gICAgfQotICB9Ci0KLSAgQ29tcC0+Y2xpbml0cyA9ICZXaXRoQ2xpbml0OwotICBDb21wLT5jb21waWxlRmlsZSh2bSwgSW5wdXRGaWxlbmFtZS5jX3N0cigpKTsKLQotICBpZiAoIU1haW5DbGFzcy5lbXB0eSgpKSB7Ci0gICAgQ29tcC0+Z2VuZXJhdGVNYWluKE1haW5DbGFzcy5jX3N0cigpLCBXaXRoSklUKTsKLSAgfQotCi0gIGlmIChQcmludFN0YXRzKQotICAgIENvbXAtPnByaW50U3RhdHMoKTsKLQotICAvLyBJbmZlciB0aGUgb3V0cHV0IGZpbGVuYW1lIGlmIG5lZWRlZC4KLSAgaWYgKE91dHB1dEZpbGVuYW1lLmVtcHR5KCkpIHsKLSAgICBpZiAoSW5wdXRGaWxlbmFtZSA9PSAiLSIpIHsKLSAgICAgIE91dHB1dEZpbGVuYW1lID0gIi0iOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdGQ6OnN0cmluZyBJRk4gPSBJbnB1dEZpbGVuYW1lOwotICAgICAgaW50IExlbiA9IElGTi5sZW5ndGgoKTsKLSAgICAgIGlmIChJRk5bTGVuLTNdID09ICcuJyAmJiBJRk5bTGVuLTJdID09ICdsJyAmJiBJRk5bTGVuLTFdID09ICdsJykgewotICAgICAgICAvLyBTb3VyY2UgZW5kcyBpbiAubGwKLSAgICAgICAgT3V0cHV0RmlsZW5hbWUgPSBzdGQ6OnN0cmluZyhJRk4uYmVnaW4oKSwgSUZOLmVuZCgpLTMpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgT3V0cHV0RmlsZW5hbWUgPSBJRk47ICAgLy8gQXBwZW5kIGEgLmJjIHRvIGl0Ci0gICAgICB9ICAgCi0gICAgICBPdXRwdXRGaWxlbmFtZSArPSAiLmJjIjsKLSAgICB9ICAgCi0gIH0KLSAgCi0gIHN0ZDo6c3RyaW5nIEVycm9ySW5mbzsKLSAgc3RkOjphdXRvX3B0cjxyYXdfb3N0cmVhbT4gT3V0IAotICAgIChuZXcgcmF3X2ZkX29zdHJlYW0oT3V0cHV0RmlsZW5hbWUuY19zdHIoKSwgRXJyb3JJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgcmF3X2ZkX29zdHJlYW06OkZfQmluYXJ5KSk7Ci0gIGlmICghRXJyb3JJbmZvLmVtcHR5KCkpIHsKLSAgICBlcnJzKCkgPDwgRXJyb3JJbmZvIDw8ICdcbic7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgCi0gIAotICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgT3V0IGZpbGUgZ2V0cyB1bmxpbmtlZCBmcm9tIHRoZSBkaXNrIGlmIHdlIGdldCBhCi0gIC8vIFNJR0lOVC4KLSAgaWYgKE91dHB1dEZpbGVuYW1lICE9ICItIikKLSAgICBzeXM6OlJlbW92ZUZpbGVPblNpZ25hbChzeXM6OlBhdGgoT3V0cHV0RmlsZW5hbWUpKTsKLQotICBpZiAoIURpc2FibGVPdXRwdXQpCi0gICAgaWYgKEZvcmNlIHx8ICFDaGVja0JpdGNvZGVPdXRwdXRUb0NvbnNvbGUoKk91dCwgdHJ1ZSkpCi0gICAgICBXcml0ZUJpdGNvZGVUb0ZpbGUoQ29tcC0+Z2V0TExWTU1vZHVsZSgpLCAqT3V0KTsKLQotICByZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvdm1raXQvdG9vbHMvdm1raXQvQ29tbWFuZExpbmUuY3BwIGIvdm1raXQvdG9vbHMvdm1raXQvQ29tbWFuZExpbmUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2ZjNGQxLi4wMDAwMDAwCi0tLSBhL3Zta2l0L3Rvb2xzL3Zta2l0L0NvbW1hbmRMaW5lLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vLz09PS0tLS0tLS0gQ29tbWFuZExpbmUuY3BwIC0gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLSNpZiAwCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxkbGZjbi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJDb21tYW5kTGluZS5oIgotI2luY2x1ZGUgIm12bS9HQy5oIgotI2luY2x1ZGUgIm12bS9UaHJlYWRzL1RocmVhZC5oIgotCi11c2luZyBuYW1lc3BhY2UgbXZtOwotCi10eXBlZGVmIHN0cnVjdCB0aHJlYWRfYXJnX3QgewotICBpbnQgYXJnYzsKLSAgY2hhcioqIGFyZ3Y7Ci0gIGNyZWF0ZV92bV90IGZ1bmM7Ci19IHRocmVhZF9hcmdfdDsKLQotCi0KLUNvbW1hbmRMaW5lOjpDb21tYW5kTGluZSgpIHsKLSAgcmVzZXRTdHJpbmcoKTsKLSAgcmVzZXRBcmd2KCk7Ci19Ci0KLXZvaWQgQ29tbWFuZExpbmU6OmFwcGVuZENoYXIoY2hhciBjKSB7Ci0gIGFzc2VydChfeXl0ZXh0KTsKLSAgX3l5dGV4dFtfeXlsZW4rK109IGM7Ci0gIGlmIChfeXlsZW4gPT0gX3l5bGVuTWF4KSB7Ci0gICAgX3l5bGVuTWF4ICo9IDI7Ci0gICAgX3l5dGV4dD0gKGNoYXIgKilyZWFsbG9jKF95eXRleHQsIF95eWxlbk1heCk7Ci0gIH0KLX0KLQotdm9pZCBDb21tYW5kTGluZTo6YXBwZW5kU3RyaW5nKGNoYXIqIHN0cikgewotICBhc3NlcnQoYXJndik7Ci0gIGFwcGVuZENoYXIoMCk7Ci0gIGFyZ3ZbYXJnYysrXSA9IHN0cjsKLSAgaWYgKGFyZ2MgPT0gYXJnY01heCkgewotICAgIGFyZ2NNYXggKj0gMjsKLSAgICBhcmd2ID0gKGNoYXIgKiopcmVhbGxvYyhhcmd2LCBhcmdjTWF4ICogc2l6ZW9mKGNoYXIqKSk7Ci0gIH0KLX0KLQotdm9pZCBDb21tYW5kTGluZTo6cmVzZXRTdHJpbmcoKSB7Ci0gIF95eXRleHQgPSAoY2hhciAqKW1hbGxvYyhfeXlsZW5NYXg9IDMyKTsKLSAgX3l5bGVuID0gMDsKLX0KLQotdm9pZCBDb21tYW5kTGluZTo6cmVzZXRBcmd2KCkgewotICBhcmd2ID0gKGNoYXIgKiopbWFsbG9jKHNpemVvZihjaGFyKikgKiAoYXJnY01heD0gMTApKTsKLSAgYXJnYyA9IDA7Ci19Ci0KLQotdm9pZCBDb21tYW5kTGluZTo6c3RhcnQoKSB7Ci0gIHByaW50ZigiPiAiKTsKLSAgX3l5Q2hhciA9IGdldGMoc3RkaW4pOwotICAKLSAgd2hpbGUgKHRydWUpIHsKLSAgICBzd2l0Y2goX3l5Q2hhcikgewotICAgICAgY2FzZSAnICcgOiAKLSAgICAgICAgZG8geyBfeXlDaGFyID0gZ2V0YyhzdGRpbik7IH0gd2hpbGUgKF95eUNoYXIgPT0gJyAnKTsKLSAgICAgICAgaWYgKF95eWxlbiAhPSAwKSB7Ci0gICAgICAgICAgYXBwZW5kU3RyaW5nKF95eXRleHQpOwotICAgICAgICAgIHJlc2V0U3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICAgIGNhc2UgJ1xuJyA6Ci0gICAgICAgIGlmIChfeXlsZW4gIT0gMCkgewotICAgICAgICAgIGFwcGVuZFN0cmluZyhfeXl0ZXh0KTsKLSAgICAgICAgICByZXNldFN0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhcmdjID4gMSkgewotICAgICAgICAgIGV4ZWN1dGVJbnN0cigpOwotICAgICAgICAgIHJlc2V0QXJndigpOwotICAgICAgICAgIHByaW50ZigiPiAiKTsKLSAgICAgICAgfQotICAgICAgICBfeXlDaGFyID0gZ2V0YyhzdGRpbik7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEVPRiA6Ci0gICAgICAgIHByaW50ZigiXG4iKTsKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgYXBwZW5kQ2hhcihfeXlDaGFyKTsKLSAgICAgICAgX3l5Q2hhciA9IGdldGMoc3RkaW4pOwotICAgIH0KLSAgfSAKLX0KLQotI2lmIDAKLWV4dGVybiAiQyIgaW50IHN0YXJ0QXBwKHRocmVhZF9hcmdfdCogYXJnKSB7Ci0gIGludCBhcmdjID0gYXJnLT5hcmdjOwotICBjaGFyKiogYXJndiA9IGFyZy0+YXJndjsKLSAgY3JlYXRlX3ZtX3QgZnVuYyA9IGFyZy0+ZnVuYzsKLSAgZnJlZShhcmcpOwotI2lmbmRlZiBNVUxUSVBMRV9HQwotICBDb2xsZWN0b3I6OmluamVjdF9teV90aHJlYWQoJmFyZ2MpOwotICBWaXJ0dWFsTWFjaGluZSogVk0gPSBmdW5jKCk7Ci0gIFZNLT5ydW5BcHBsaWNhdGlvbihhcmdjLCBhcmd2KTsKLSAgQ29sbGVjdG9yOjpyZW1vdmVfbXlfdGhyZWFkKCk7Ci0gIENvbGxlY3Rvcjo6Y29sbGVjdCgpOwotI2Vsc2UKLSAgQ29sbGVjdG9yKiBHQyA9IENvbGxlY3Rvcjo6YWxsb2NhdGUoKTsKLSAgR0MtPmluamVjdF9teV90aHJlYWQoJmFyZ2MpOwotICBmdW5jKGFyZ2MsIGFyZ3YpOwotICBHQy0+cmVtb3ZlX215X3RocmVhZCgpOwotICBHQy0+Y29sbGVjdCgpOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotI2VuZGlmCi0KLXZvaWQgQ29tbWFuZExpbmU6OmV4ZWN1dGVJbnN0cigpIHsKLSAgaWYgKCFzdHJjbXAoYXJndlswXSwgImxvYWQiKSkgewotI2lmIGRlZmluZWQoX19BUFBMRV9fKQotICAgIGNoYXIqIGJ1ZiA9IChjaGFyKilhbGxvY2Eoc2l6ZW9mKGFyZ3ZbMV0pICsgNyk7Ci0gICAgc3ByaW50ZihidWYsICIlcy5keWxpYiIsIGFyZ3ZbMV0pOwotI2Vsc2UKLSAgICBjaGFyKiBidWYgPSAoY2hhciopYWxsb2NhKHNpemVvZihhcmd2WzFdKSArIDQpOwotICAgIHNwcmludGYoYnVmLCAiJXMuc28iLCBhcmd2WzFdKTsKLSNlbmRpZgotICAgIHZvaWQqIGhhbmRsZSA9IGRsb3BlbihidWYsIFJUTERfTEFaWSB8IFJUTERfR0xPQkFMKTsKLSAgICBpZiAoaGFuZGxlID09IDApIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiXHQgVW5hYmxlIHRvIGxvYWQgJXNcbiIsIGFyZ3ZbMV0pOwotICAgICAgcHJpbnRmKCJcdCBlcnJvciA9ICVzXG4iLCBkbGVycm9yKCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBib290X3QgZnVuYyA9IChib290X3QpKGludHB0cl90KWRsc3ltKGhhbmRsZSwgImluaXRpYWxpc2VWaXJ0dWFsTWFjaGluZSIpOwotICAgIAotICAgIGlmIChmdW5jID09IDApIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiXHQgVW5hYmxlIHRvIGZpbmQgJXMgYm9vdCBtZXRob2RcbiIsIGFyZ3ZbMV0pOwotICAgICAgZGxjbG9zZShoYW5kbGUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmdW5jKCk7Ci0gICAgCi0gICAgY3JlYXRlX3ZtX3Qgdm1sZXQgPSAoY3JlYXRlX3ZtX3QpKGludHB0cl90KWRsc3ltKGhhbmRsZSwgImNyZWF0ZVZpcnR1YWxNYWNoaW5lIik7Ci0KLSAgICB2bWxldHNbYXJndlsxXV0gPSB2bWxldDsKLQotICB9IGVsc2UgewotICAgIGNyZWF0ZV92bV90IGZ1bmMgPSB2bWxldHNbYXJndlswXV07Ci0gICAgbXZtOjpPYmplY3QqIENVID0gY29tcGlsZXJzW2FyZ3ZbMF1dOwotICAgIGlmICghZnVuYykgewotICAgICAgZnByaW50ZihzdGRlcnIsICJcdCBVbmtub3duIHZtICVzXG4iLCBhcmd2WzBdKTsKLSAgICB9IGVsc2UgewotI2lmIDAKLSAgICAgIHRocmVhZF9hcmdfdCogdGhyZWFkX2FyZyA9ICh0aHJlYWRfYXJnX3QqKW1hbGxvYyhzaXplb2YgKHRocmVhZF9hcmdfdCkpOwotICAgICAgdGhyZWFkX2FyZy0+YXJnYyA9IGFyZ2M7Ci0gICAgICB0aHJlYWRfYXJnLT5hcmd2ID0gYXJndjsKLSAgICAgIHRocmVhZF9hcmctPmZ1bmMgPSBmdW5jOwotICAgICAgaW50IHRpZCA9IDA7Ci0gICAgICBUaHJlYWQ6OnN0YXJ0KCZ0aWQsIChpbnQgKCopKHZvaWQgKikpc3RhcnRBcHAsIHRocmVhZF9hcmcpOwotI2Vsc2UKLSAgICAgIFZpcnR1YWxNYWNoaW5lKiBWTSA9IGZ1bmMoQ1UpOwotICAgICAgVk0tPnJ1bkFwcGxpY2F0aW9uKGFyZ2MsIGFyZ3YpOwotI2VuZGlmCi0gICAgfQotICB9Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdm1raXQvdG9vbHMvdm1raXQvQ29tbWFuZExpbmUuaCBiL3Zta2l0L3Rvb2xzL3Zta2l0L0NvbW1hbmRMaW5lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzU2YTguLjAwMDAwMDAKLS0tIGEvdm1raXQvdG9vbHMvdm1raXQvQ29tbWFuZExpbmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8vPT09LS0tLS0tLS0tIENvbW1hbmRMaW5lLmggLSBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICBUaGUgVk1LaXQgcHJvamVjdAotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIENPTU1BTkRfTElORV9ICi0jZGVmaW5lIENPTU1BTkRfTElORV9ICi0KLSNpbmNsdWRlIDxtYXA+Ci0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgIm12bS9PYmplY3QuaCIKLSNpbmNsdWRlICJtdm0vVmlydHVhbE1hY2hpbmUuaCIKLQotI2lmIGRlZmluZWQoX19BUFBMRV9fKQotI2RlZmluZSBKTkpWTV9MSUIgIkpuanZtLmR5bGliIgotI2RlZmluZSBDTEFTU1BBVEhfTElCICJDbGFzc3BhdGguZHlsaWIiCi0jZGVmaW5lIE4zX0xJQiAiTjMuZHlsaWIiCi0jZGVmaW5lIFBORVRfTElCICJQbmV0bGliLmR5bGliIgotI2Vsc2UKLSNkZWZpbmUgSk5KVk1fTElCICJKbmp2bS5zbyIKLSNkZWZpbmUgQ0xBU1NQQVRIX0xJQiAiQ2xhc3NwYXRoLnNvIgotI2RlZmluZSBOM19MSUIgIk4zLnNvIgotI2RlZmluZSBQTkVUX0xJQiAiUG5ldGxpYi5zbyIKLSNlbmRpZgotCi10eXBlZGVmIGludCAoKmJvb3RfdCkoKTsKLXR5cGVkZWYgbXZtOjpWaXJ0dWFsTWFjaGluZSogKCpjcmVhdGVfdm1fdCkobXZtOjpPYmplY3QqKTsKLQotbmFtZXNwYWNlIG12bSB7Ci0KLQotc3RydWN0IGx0c3RyCi17Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gc3RyY21wKHMxLCBzMikgPCAwOwotICB9Ci19OwotCi1jbGFzcyBDb21tYW5kTGluZSB7Ci1wdWJsaWM6Ci0gIGNoYXIqKiBhcmd2OwotICB1bnNpZ25lZCBhcmdjOwotICB1bnNpZ25lZCBhcmdjTWF4OwotCi0gIGNoYXIqIF95eXRleHQ7Ci0gIHVuc2lnbmVkIF95eWxlbjsKLSAgdW5zaWduZWQgX3l5bGVuTWF4OwotICBjaGFyIF95eUNoYXI7Ci0gIAotICBzdGQ6Om1hcDxjb25zdCBjaGFyKiwgY3JlYXRlX3ZtX3QsIGx0c3RyPiB2bWxldHM7Ci0gIHN0ZDo6bWFwPGNvbnN0IGNoYXIqLCBtdm06Ok9iamVjdCosIGx0c3RyPiBjb21waWxlcnM7Ci0KLSAgQ29tbWFuZExpbmUoKTsKLSAgCi0gIHZvaWQgYXBwZW5kQ2hhcihjaGFyIGMpOwotICB2b2lkIGFwcGVuZFN0cmluZyhjaGFyKiBzdHIpOwotCi0gIHZvaWQgc3RhcnQoKTsKLSAgdm9pZCBleGVjdXRlSW5zdHIoKTsKLQotICB2b2lkIHJlc2V0QXJndigpOwotICB2b2lkIHJlc2V0U3RyaW5nKCk7Ci0KLX07Ci0KLX0gLy8gZW5kIG5hbWVzcGFjZSBtdm0KLQotI2VuZGlmIC8vIENPTU1BTkRfTElORV9ICmRpZmYgLS1naXQgYS92bWtpdC90b29scy92bWtpdC9MYXVuY2hlci5jcHAgYi92bWtpdC90b29scy92bWtpdC9MYXVuY2hlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZjZkMzIuLjAwMDAwMDAKLS0tIGEvdm1raXQvdG9vbHMvdm1raXQvTGF1bmNoZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0gTGF1bmNoZXIuY3BwIC0gTGF1bmNoIGNvbW1hbmQgbGluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgUGllcnJlIGV0IE1hcmllIEN1cmllIAotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJsbHZtL0xpbmtBbGxQYXNzZXMuaCIKLSNpbmNsdWRlICJsbHZtL0xpbmtBbGxWTUNvcmUuaCIKLSNpbmNsdWRlICJsbHZtL1Bhc3NNYW5hZ2VyLmgiCi0jaW5jbHVkZSAibGx2bS9Db2RlR2VuL0xpbmtBbGxDb2RlZ2VuQ29tcG9uZW50cy5oIgotLy8jaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hbmFnZWRTdGF0aWMuaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUGFzc05hbWVQYXJzZXIuaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUGx1Z2luTG9hZGVyLmgiCi0jaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0RGF0YS5oIgotCi0KLSNpbmNsdWRlICJtdm0vR0MuaCIKLSNpbmNsdWRlICJtdm0vQ29uZmlnL2NvbmZpZy5oIgotI2luY2x1ZGUgIm12bS9KSVQuaCIKLSNpbmNsdWRlICJtdm0vVk1LaXQuaCIKLSNpbmNsdWRlICJtdm0vVmlydHVhbE1hY2hpbmUuaCIKLSNpbmNsdWRlICJtdm0vVGhyZWFkcy9UaHJlYWQuaCIKLQotI2luY2x1ZGUgImozL0phdmFKSVRDb21waWxlci5oIgotI2luY2x1ZGUgIi4uLy4uL2xpYi9KMy9WTUNvcmUvSm5qdm1DbGFzc0xvYWRlci5oIgotI2luY2x1ZGUgIi4uLy4uL2xpYi9KMy9WTUNvcmUvSm5qdm0uaCIKLQotLy8jaW5jbHVkZSAiQ29tbWFuZExpbmUuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGozOwotdXNpbmcgbmFtZXNwYWNlIGxsdm07Ci0KLWVudW0gVk1UeXBlIHsKLSAgUnVuSmF2YQotfTsKLQotc3RhdGljIGxsdm06OmNsOjpvcHQ8Vk1UeXBlPiBWTVRvUnVuKGxsdm06OmNsOjpkZXNjKCJDaG9vc2UgVk0gdG8gcnVuOiIpLAotICBsbHZtOjpjbDo6dmFsdWVzKAotICAgIGNsRW51bVZhbE4oUnVuSmF2YSAsICJqYXZhIiwgIlJ1biB0aGUgSlZNIiksCi0gICBjbEVudW1WYWxFbmQpKTsKLQotc3RhdGljIGxsdm06OmNsOjpvcHQ8Ym9vbD4gRmFzdCgiZmFzdCIsIAotICAgICAgICAgICAgICAgICAgICAgY2w6OmRlc2MoIkdlbmVyYXRlIGNvZGUgcXVpY2tseSwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvdGVudGlhbGx5IHNhY3JpZmljaW5nIGNvZGUgcXVhbGl0eSIpLAotICAgICAgICAgICAgICAgICAgICAgY2w6OmluaXQoZmFsc2UpKTsKLQotaW50IGZvdW5kKGNoYXIqKiBhcmd2LCBpbnQgYXJnYywgY29uc3QgY2hhciogbmFtZSkgewotICBpbnQgaSA9IDE7Ci0gIGZvciAoOyBpIDwgYXJnYzsgaSsrKSB7Ci0gICAgaWYgKCEoc3RyY21wKG5hbWUsIGFyZ3ZbaV0pKSkgcmV0dXJuIGkgKyAxOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgbGx2bTo6bGx2bV9zaHV0ZG93bl9vYmogWDsKLSAgaW50IHBvcyA9IGZvdW5kKGFyZ3YsIGFyZ2MsICItamF2YSIpOwotICBpZiAocG9zKSB7Ci0gICAgbGx2bTo6Y2w6OlBhcnNlQ29tbWFuZExpbmVPcHRpb25zKHBvcywgYXJndik7Ci0gIH0gZWxzZSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJPbmx5IC1qYXZhIGlzIHN1cHBvcnRlZFxuIik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgCi0JbXZtOjpCdW1wUHRyQWxsb2NhdG9yIEFsbG9jYXRvcjsKLQotICBtdm06OlZNS2l0Ojppbml0aWFsaXNlKEZhc3QgPyBDb2RlR2VuT3B0OjpOb25lIDogQ29kZUdlbk9wdDo6QWdncmVzc2l2ZSk7Ci0JbXZtOjpWTUtpdCogdm1raXQgPSBuZXcoQWxsb2NhdG9yLCAiVk1LaXQiKSBtdm06OlZNS2l0KEFsbG9jYXRvcik7Ci0KLSAgaWYgKFZNVG9SdW4gPT0gUnVuSmF2YSkgewotICAgIEphdmFKSVRDb21waWxlciogQ29tcCA9IEphdmFKSVRDb21waWxlcjo6Q3JlYXRlQ29tcGlsZXIoIkpJVE1vZHVsZSIpOwotICAgIEpuanZtKiB2bSA9IG5ldyhBbGxvY2F0b3IsICJWTSIpIEpuanZtKEFsbG9jYXRvciwgdm1raXQsIENvbXAsIHRydWUpOwotICAgIHZtLT5ydW5BcHBsaWNhdGlvbihhcmdjLCBhcmd2KTsKLSAgfQotCi0Jdm1raXQtPndhaXROb25EYWVtb25UaHJlYWRzKCk7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS92bWtpdC90b29scy92bWtpdC9NYWtlZmlsZSBiL3Zta2l0L3Rvb2xzL3Zta2l0L01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNjkzZGIwLi4wMDAwMDAwCi0tLSBhL3Zta2l0L3Rvb2xzL3Zta2l0L01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotIyM9PT0tIHRvb2xzL3Zta2l0L01ha2VmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKLSMgCi0jICAgICAgICAgICAgICAgICAgICAgVGhlIFZNS2l0IHByb2plY3QKLSMKLSMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0jIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLSMgCi0jIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIwotTEVWRUwgPSAuLi8uLgotCi1pbmNsdWRlICQoTEVWRUwpL01ha2VmaWxlLmNvbmZpZwotCi1UT09MTkFNRSA9IHZta2l0Ci0KLQotaWZlcSAoJChXSVRIX0xMVk1fR0NDKSwgMSkKLQotICBNT0RVTEVTTkFNRSA9IHZta2l0Ci0KLSAgaWZlcSAoJChXSVRIX0ozKSwgMSkKLSAgICBVU0VETU9EVUxFUyArPSBKMy5iYyBDbGFzc3BhdGguYmMgSjNDb21waWxlci5iYwotICBlbmRpZgotCi0gIGlmZXEgKCQoV0lUSF9OM19QTkVUTElCKSwgMSkKLSAgICBVU0VETU9EVUxFUyArPSBOMy5iYyBQTmV0TGliLmJjCi0gIGVuZGlmCi0KLSAgVVNFRE1PRFVMRVMgKz0gQWxsb2NhdG9yLmJjIENvbW1vblRocmVhZC5iYyBNdm0uYmMgTXZtQ29tcGlsZXIuYmMKLQotICBpZmVxICgkKEdDX01NVEspLCAxKQotICAgIFVTRURNT0RVTEVTICs9IEZpbmFsTU1Uay5iYyBJbmxpbmVNTVRrLmJjCi0gIGVsc2UKLSAgICBVU0VETU9EVUxFUyArPSAkKEdDTElCKS5iYwotICBlbmRpZgotCi0gIEJVSUxUX1NPVVJDRVMgPSB2bWtpdC5zCi0gIFNPVVJDRVMgPSB2bWtpdC5zICQobm90ZGlyICQod2lsZGNhcmQgJChQUk9KX1NSQ19ESVIpLyouY3BwKSkKLQotCi1lbHNlCi0KLSAgVVNFRExJQlMgKz0gQWxsb2NhdG9yLmEgTXZtLmEgTXZtQ29tcGlsZXIuYSAkKEdDTElCKS5hIENvbW1vblRocmVhZC5hCi0KLSAgaWZlcSAoJChXSVRIX0ozKSwgMSkKLSAgICBVU0VETElCUyArPSBKMy5hIENsYXNzcGF0aC5hIEozLmEgSjNDb21waWxlci5hCi0gIGVuZGlmCi0KLSAgaWZlcSAoJChXSVRIX04zX1BORVRMSUIpLCAxKQotICAgIFVTRURMSUJTICs9IE4zLmEgUE5ldExpYi5hCi0gIGVuZGlmCi0KLSAgVVNFRExJQlMgKz0gQWxsb2NhdG9yLmEgTXZtLmEgTXZtQ29tcGlsZXIuYSAkKEdDTElCKS5hIENvbW1vblRocmVhZC5hCi0KLWVuZGlmCi0KLUxJTktfQ09NUE9ORU5UUyA9IGppdCBuYXRpdmVjb2RlZ2VuIHNjYWxhcm9wdHMgaW5zdHJ1bWVudGF0aW9uIGlwYSBpcG8gYml0cmVhZGVyIGFzbXBhcnNlciBsaW5rZXIKLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KLQotaWZlcSAoJChXSVRIX04zX1BORVRMSUIpLCAxKQotTElCUyArPSAkKFBORVRMSUIpL2VuZ2luZS9saWJJTEVuZ2luZS5hICQoUE5FVExJQikvaW1hZ2UvbGliSUxJbWFnZS5hICQoUE5FVExJQikvc3VwcG9ydC9saWJJTFN1cHBvcnQuYSBcCi0gICAgICAgICQoUE5FVExJQikvbGliZmZpLy5saWJzL2xpYmZmaS5hICQoUE5FVExJQikvL2R1bXBhc20vbGliSUxEdW1wQXNtLmEKLWVuZGlmCi0KLQpkaWZmIC0tZ2l0IGEvdm1raXQvdG9vbHMvdnRvZmZzZXQvTWFrZWZpbGUgYi92bWtpdC90b29scy92dG9mZnNldC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFhMzBmYy4uMDAwMDAwMAotLS0gYS92bWtpdC90b29scy92dG9mZnNldC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjPT09LSB0b29scy92dG9mZnNldC9NYWtlZmlsZSAtLS0tLS0tKS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIE1ha2VmaWxlIC0qLT09PSMjCi0jIAotIyAgICAgICAgICAgICAgICAgICAgIFRoZSB2bWtpdCBwcm9qZWN0Ci0jCi0jIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0jIAotIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKLUxFVkVMID0gLi4vLi4KLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb25maWcKLQotVE9PTE5BTUUgPSB2dG9mZnNldAotVVNFRExJQlMgPSBNdm0gQ29tbW9uVGhyZWFkIEFsbG9jYXRvciAkKEdDTElCKQotTElOS19DT01QT05FTlRTID0gaml0IG5hdGl2ZWNvZGVnZW4gc2NhbGFyb3B0cyBpbnN0cnVtZW50YXRpb24gaXBhIGlwbyBiaXR3cml0ZXIKLQotaW5jbHVkZSAkKExFVkVMKS9NYWtlZmlsZS5jb21tb24KZGlmZiAtLWdpdCBhL3Zta2l0L3Rvb2xzL3Z0b2Zmc2V0L1ZUT2Zmc2V0LmNwcCBiL3Zta2l0L3Rvb2xzL3Z0b2Zmc2V0L1ZUT2Zmc2V0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU0NmQyMC4uMDAwMDAwMAotLS0gYS92bWtpdC90b29scy92dG9mZnNldC9WVE9mZnNldC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLy89PT0tLSBWVE9mZnNldC5jcHAgLSBDYWxjdWxhdGVzIGNvbXBpbGVyIGRlcGVuZGFudCBWVCBvZmZzZXRzIC0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBNaWNybyBWaXJ0dWFsIE1hY2hpbmUKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSA8ZGxmY24uaD4KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAibXZtL0dDLmgiCi0jaW5jbHVkZSAibXZtL1ByaW50QnVmZmVyLmgiCi0jaW5jbHVkZSAibXZtL1RocmVhZHMvVGhyZWFkLmgiCi0jaW5jbHVkZSAibXZtL1NpZ3NlZ3YuaCIKLQotY2xhc3MgVG90byA6IHB1YmxpYyBtdm06Ok9iamVjdCB7Ci1wdWJsaWM6Ci0gIAotICBzdGF0aWMgVmlydHVhbFRhYmxlKiBWVDsKLSAgdmlydHVhbCB2b2lkIHByaW50KG12bTo6UHJpbnRCdWZmZXIqIGJ1ZikgY29uc3QgewotICAgIHByaW50ZigiaW4gcHJpbnQhXG4iKTsKLSAgfQotICB2aXJ0dWFsIGludHB0cl90IGhhc2hDb2RlKCkgewotICAgIHByaW50ZigiaW4gaGFzaGNvZGUhXG4iKTsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCB0cmFjZXIoKSB7Ci0gICAgcHJpbnRmKCJpbiB0cmFjZXJcbiIpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIGRlc3Ryb3llcihzaXplX3Qgc3opIHsKLSAgICBwcmludGYoImluIGRlc3Ryb3khXG4iKTsKLSAgfQotCi0gIH5Ub3RvKCkgewotICAgIHByaW50ZigiaW4gZGVsZXRlIFRvdG8hXG4iKTsKLSAgfQotfTsKLQotY2xhc3MgVGF0YSA6IHB1YmxpYyBUb3RvIHsKLSAgcHVibGljOgotICBzdGF0aWMgVmlydHVhbFRhYmxlKiBWVDsKLSAgflRhdGEoKSB7Ci0gICAgcHJpbnRmKCJpbiBkZWxldGUgVGF0YSFcbiIpOwotICB9Ci19OwotCi1WaXJ0dWFsVGFibGUqIFRvdG86OlZUID0gMDsKLXR5cGVkZWYgdm9pZCAoKnRvdG9fdCkoVG90byogdCk7Ci0KLVZpcnR1YWxUYWJsZSogVGF0YTo6VlQgPSAwOwotdHlwZWRlZiB2b2lkICgqdGF0YV90KShUYXRhKiB0KTsKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCkgewotICBpbnQgYmFzZTsKLSAgCi0gIG12bTo6T2JqZWN0Ojppbml0aWFsaXNlKCk7Ci0gIAotICAvKnZvaWQqIGhhbmRsZSA9IHN5c19kbG9wZW4oImxpYkxpc3Auc28iLCBSVExEX0xBWlkgfCBSVExEX0dMT0JBTCk7Ci0gIGJvb3QgZnVuYyA9IChib290KXN5c19kbHN5bShoYW5kbGUsICJib290Iik7Ci0gIGZ1bmMoYXJnYywgYXJndiwgZW52cCk7Ki8KLSAgeyAKLSAgVG90byB0OwotICBUb3RvOjpWVCA9KCh2b2lkKiopKHZvaWQqKSZ0KVswXTsKLSAgdG90b190KiBwdHIgPSAodG90b190KilUb3RvOjpWVDsKLSAgcHJpbnRmKCJwdHJbMF0gPSAlZCwgcHRyWzFdPSAlZCwgcHRyWzJdID0gJWQgcHRyWzNdID0gJWQgcHRyWzRdID0gJWQgcHRyWzVdID0gJWRcbiIsIHB0clswXSwgcHRyWzFdLCBwdHJbMl0sIHB0clszXSwgcHRyWzRdLCBwdHJbNV0pOwotICBwcmludGYoIjAgPSBcbiIpOwotICBwdHJbMF0oJnQpOwotICAvL3B0clsxXSgmdCk7IC8vIG9wZXJhdG9yIGRlbGV0ZQotICBwcmludGYoIjIgPSBcbiIpOwotICBwdHJbMl0oJnQpOwotICBwcmludGYoIjMgPSBcbiIpOwotICBwdHJbM10oJnQpOwotICBwcmludGYoIjQgPSBcbiIpOwotICBwdHJbNF0oJnQpOwotICBwcmludGYoIjUgPSBcbiIpOwotICBwdHJbNV0oJnQpOwotfQotewotICBUYXRhIHQ7Ci0gIFRhdGE6OlZUID0oKHZvaWQqKikodm9pZCopJnQpWzBdOwotICB0YXRhX3QqIHB0ciA9ICh0YXRhX3QqKVRhdGE6OlZUOwotICBwcmludGYoInB0clswXSA9ICVkLCBwdHJbMV09ICVkLCBwdHJbMl0gPSAlZCBwdHJbM10gPSAlZCBwdHJbNF0gPSAlZCBwdHJbNV0gPSAlZFxuIiwgcHRyWzBdLCBwdHJbMV0sIHB0clsyXSwgcHRyWzNdLCBwdHJbNF0sIHB0cls1XSk7Ci0gIHB0clswXSgmdCk7Ci0gIHByaW50ZigiRW5kXG4iKTsKLSAgLy9wdHJbMV0oJnQpOyAvLyBvcGVyYXRvciBkZWxldGUKLSAgcHRyWzJdKCZ0KTsKLSAgcHRyWzNdKCZ0KTsKLSAgcHRyWzRdKCZ0KTsKLSAgcHRyWzVdKCZ0KTsKLX0KLVRhdGEqIHQgPSBnY19uZXcoVGF0YSkoKTsKLSAgbXZtOjpUaHJlYWQ6OmV4aXQoMCk7Ci0gICAKLSAgcmV0dXJuIDA7IAotfQpkaWZmIC0tZ2l0IGEvdm1raXQvd3d3L09wZW5Qcm9qZWN0cy5odG1sIGIvdm1raXQvd3d3L09wZW5Qcm9qZWN0cy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWE4MzFjLi4wMDAwMDAwCi0tLSBhL3Zta2l0L3d3dy9PcGVuUHJvamVjdHMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIgDQotICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4NCi08IS0tIE1hdGVyaWFsIHVzZWQgZnJvbTogSFRNTCA0LjAxIHNwZWNzOiBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNDAxLyAtLT4NCi08aHRtbD4NCi08aGVhZD4NCi0gIDxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+DQotICA8dGl0bGU+IlZNS2l0IiBKVk0gYW5kIC5OZXQgcnVudGltZXMgZm9yIExMVk08L3RpdGxlPg0KLSAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ibWVudS5jc3MiIC8+DQotICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJjb250ZW50LmNzcyIgLz4NCi08L2hlYWQ+DQotPGJvZHk+DQotDQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9Im1lbnUuaHRtbC5pbmNsIi0tPg0KLQ0KLTxkaXYgaWQ9ImNvbnRlbnQiPg0KLQ0KLTxoMT5PcGVuIFZNS2l0IFByb2plY3RzPC9oMT4NCi0NCi08cD5IZXJlIGFyZSBhIGZldyB0YXNrcyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIG5ld2NvbWVycyB0byB3b3JrIG9uLCBkZXBlbmRpbmcNCi1vbiB3aGF0IHlvdXIgaW50ZXJlc3RzIGFyZS4gVGhpcyBsaXN0IGlzIHByb3ZpZGVkIHRvIGdlbmVyYXRlIGlkZWFzLCBpdCBpcyBub3QNCi1pbnRlbmRlZCB0byBiZSBjb21wcmVoZW5zaXZlLiBQbGVhc2UgYXNrIG9uIGxsdm0tZGV2IGZvciBtb3JlIHNwZWNpZmljcy4gPC9wPg0KLQ0KLTx1bD4NCi0NCi08bGk+PGI+UG9ydCBWTUtpdCdzIEpWTSB0byBIYXJtb255IG9yIE9wZW5KREs8L2I+Og0KLVZNS2l0IGN1cnJlbnRseSB1c2VzIEdOVSBDbGFzc3BhdGggZm9yIHRoZSBzdGFuZGFyZCBKYXZhIGNsYXNzZXMuIEludGVyZmFjaW5nDQotd2l0aCBhbm90aGVyIGxpYnJhcnkgc3VjaCBhcyBBcGFjaGUgSGFybW9ueSAoaHR0cDovL2hhcm1vbnkuYXBhY2hlLm9yZykgb3INCi1TdW4ncyBPcGVuSkRLIChodHRwOi8vb3Blbmpkay5qYXZhLm5ldCkgbWF5IGhlbHAgaW1wcm92aW5nIHN1cHBvcnQgZm9yIGxhdGVzdA0KLWJlbmNobWFya3MgKGh0dHA6Ly93d3cuc3BlYy5vcmcvanZtMjAwOCkuPC9saT4NCi08L3VsPg0KLQ0KLTxwPg0KLU9uIHRoZSBMTFZNIHNpZGUsIGhlcmUgYXJlIGEgZmV3IGludGVyZXN0aW5nIHByb2plY3RzIHRoYXQgd291bGQgaGVscCBWTUtpdDoNCi08L3A+DQotDQotPHVsPg0KLTxsaT48Yj5BZGFwdGl2ZSBPcHRpbWl6YXRpb24gU3lzdGVtPC9iPjoNCi1CZWluZyBhYmxlIHRvIGFkYXB0aXZlbHkgb3B0aW1pemUgSklULWNvbXBpbGVkIGNvZGUgd291bGQgZHJhbWFzdGljYWxseSBoZWxwDQotdGhlIHN0YXJ0dXAgdGltZSBvZiBWTUtpdC4gQWxsIHRoZSBub24tYWRhcHRpdmUgYml0cyBhcmUgYWxyZWFkeSB0aGVyZSBpbiBMTFZNOg0KLWJhc2VsaW5lIGNvbXBpbGVyICh3aXRoIHRoZSAtZmFzdCBjb21tYW5kIGxpbmUgYW5kIHRoZSBzaW1wbGUgcmVnaXN0ZXINCi1hbGxvY2F0b3IpLCBvcHRpbWl6ZWQgY29tcGlsZXIgKHdpdGggdGhlIGxpbmVhciBzY2FuIHJlZ2lzdGVyIGFsbG9jYXRvciksIGFuZA0KLWEgZnVsbCBzZXQgb2Ygb3B0aW1pemF0aW9ucyBjaGFuZ2VhYmxlIGF0IHJ1bnRpbWUuIFdoYXQncyBsZWZ0IGlzIGEgc3lzdGVtIHRoYXQNCi1keW5hbWljYWxseSBsb29rdXAgdGhlIGhvdG5lc3Mgb2YgbWV0aG9kcyBhbmQgcmUtY29tcGlsZSB3aXRoIG9wdGltaXphdGlvbnMgdGhlDQotbWV0aG9kcyB0aGF0IGFyZSBvZnRlbiBleGVjdXRlZC4NCi08L2xpPg0KLQ0KLTxsaT48Yj5UeXBlLWJhc2VkIGFsaWFzLWFuYWx5c2lzPC9iPjoNCi1TYWZlIGxhbmd1YWdlcyBzdWNoIGFzIG9uZXMgc3VwcG9ydGVkIGJ5IFZNS2l0IChKYXZhLCBDIykgYmVuZWZpdCBhIGxvdCBmcm9tDQotYSB0eXBlIGJhc2VkIGFsaWFzIGFuYWx5c2lzLiBMTFZNIGN1cnJlbnRseSBsYWNrcyBmdWxsIHN1cHBvcnQgb2YgdGhpcyBmZWF0dXJlDQotZm9yIHNhZmUgbGFuZ3VhZ2VzLg0KLTwvbGk+DQotDQotPGxpPjxiPk1pc2NlYWxsZW5vdXMgSmF2YS1yZWxhdGVkIG9wdGltaXphdGlvbnM8L2I+Og0KLVJlbW92YWwgb2YgYXJyYXkgYm91bmRzIGNoZWNrcywgbnVsbCBwb2ludGVyIGNoZWNrcywgZGV2aXJ0dWFsaXphdGlvbiwNCi1pbmxpbmluZywgZXRjLg0KLTwvbGk+DQotPC91bD4NCi0NCi0NCi08L2Rpdj4NCi08L2JvZHk+DQotPC9odG1sPg0KLQ0KZGlmZiAtLWdpdCBhL3Zta2l0L3d3dy9Vc2Vyc01hbnVhbC5odG1sIGIvdm1raXQvd3d3L1VzZXJzTWFudWFsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2OTFiNDUuLjAwMDAwMDAKLS0tIGEvdm1raXQvd3d3L1VzZXJzTWFudWFsLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iCi0gICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cmljdC5kdGQiPgotPGh0bWw+Ci08aGVhZD4KLSAgPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KLSAgPHRpdGxlPlZNS2l0IC0gR2V0dGluZyBTdGFydGVkPC90aXRsZT4KLSAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ibWVudS5jc3MiIC8+Ci0gIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImNvbnRlbnQuY3NzIiAvPgotPC9oZWFkPgotPGJvZHk+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJtZW51Lmh0bWwuaW5jbCItLT4KLQotPGRpdiBpZD0iY29udGVudCI+Ci0KLTxoMT5WTUtpdCBVc2VyJ3MgTWFudWFsPC9oMT4KLQotPHVsPgotICA8bGk+PGEgaHJlZj0iL3VzZV9hb3QuaHRtbCI+SmF2YSBBaGVhZCBvZiBUaW1lIChBT1QpIENvbXBpbGF0aW9uPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSIvdXNlX21tdGsuaHRtbCI+Vk1LaXQgYW5kIE1NVGs8L2E+PC9saT4KLTwvbGk+Ci0KZGlmZiAtLWdpdCBhL3Zta2l0L3d3dy9jb250ZW50LmNzcyBiL3Zta2l0L3d3dy9jb250ZW50LmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhOTRlOS4uMDAwMDAwMAotLS0gYS92bWtpdC93d3cvY29udGVudC5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1odG1sIHsgbWFyZ2luOiAwcHg7IH0gYm9keSB7IG1hcmdpbjogOHB4OyB9Ci0KLWh0bWwsIGJvZHkgewotICBwYWRkaW5nOjBweDsKLSAgZm9udC1zaXplOjE0cHg7IGZvbnQtZmFtaWx5OiJMdWNpZGEgR3JhbmRlIiwgIkx1Y2lkYSBTYW5zIFVuaWNvZGUiLCBBcmlhbCwgVmVyZGFuYSwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOyBjb2xvcjogIzIyMjsKLSAgbGluZS1oZWlnaHQ6MS41OwotfQotCi1oMSwgaDIsIGgzLCB0dCB7IGNvbG9yOiAjMDAwIH0KLQotaDEgeyBwYWRkaW5nLXRvcDowcHg7IG1hcmdpbi10b3A6MHB4O30KLWgyIHsgY29sb3I6IzMzMzMzMzsgcGFkZGluZy10b3A6MC41ZW07IH0KLWgzIHsgcGFkZGluZy10b3A6IDAuNWVtOyBtYXJnaW4tYm90dG9tOiAtMC4yNWVtOyBjb2xvcjojMmQ1OGI3fQotbGkgeyBwYWRkaW5nLWJvdHRvbTogMC41ZW07IH0KLXVsIHsgcGFkZGluZy1sZWZ0OjEuNWVtOyB9Ci0KLS8qIFNsaWRlcyAqLwotSU1HLmltZ19zbGlkZSB7Ci0gICAgZGlzcGxheTogYmxvY2s7Ci0gICAgbWFyZ2luLWxlZnQ6IGF1dG87Ci0gICAgbWFyZ2luLXJpZ2h0OiBhdXRvCi19Ci0KLS5pdGVtVGl0bGUgeyBjb2xvcjojMmQ1OGI3IH0KLQotLyogVGFibGVzICovCi10ciB7IHZlcnRpY2FsLWFsaWduOnRvcCB9CmRpZmYgLS1naXQgYS92bWtpdC93d3cvZ2V0X2ludm9sdmVkLmh0bWwgYi92bWtpdC93d3cvZ2V0X2ludm9sdmVkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYzI2ZGUuLjAwMDAwMDAKLS0tIGEvdm1raXQvd3d3L2dldF9pbnZvbHZlZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIg0KLSAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI+DQotPGh0bWw+DQotPGhlYWQ+DQotICA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPg0KLSAgPHRpdGxlPlZNS2l0IC0gR2V0IEludm9sdmVkPC90aXRsZT4NCi0gIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9Im1lbnUuY3NzIiAvPg0KLSAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iY29udGVudC5jc3MiIC8+DQotPC9oZWFkPg0KLTxib2R5Pg0KLQ0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJtZW51Lmh0bWwuaW5jbCItLT4NCi0NCi08ZGl2IGlkPSJjb250ZW50Ij4NCi0NCi08aDE+R2V0dGluZyBJbnZvbHZlZCB3aXRoIHRoZSB2bWtpdCBQcm9qZWN0PC9oMT4NCi0NCi08cD5PbmNlIHlvdSBoYXZlIDxhIGhyZWY9ImdldF9zdGFydGVkLmh0bWwiPmNoZWNrZWQgb3V0IGFuZCBidWlsdDwvYT4gdm1raXQgYW5kDQotcGxheWVkIGFyb3VuZCB3aXRoIGl0LCB5b3UgbWlnaHQgYmUgd29uZGVyaW5nIHdoYXQgeW91IGNhbiBkbyB0byBtYWtlIGl0IGJldHRlcg0KLWFuZCBjb250cmlidXRlIHRvIGl0cyBkZXZlbG9wbWVudC4gIEFsdGVybmF0aXZlbHksIG1heWJlIHlvdSBqdXN0IHdhbnQgdG8gZm9sbG93DQotdGhlIGRldmVsb3BtZW50IG9mIHRoZSBwcm9qZWN0IHRvIHNlZSBpdCBwcm9ncmVzcy4NCi08L3A+DQotDQotPGgyPkZvbGxvdyB3aGF0J3MgZ29pbmcgb248L2gyPg0KLQ0KLTxwPlZNS2l0IGlzIGEgc3VicHJvamVjdCBvZiB0aGUgPGEgaHJlZj0iaHR0cDovL2xsdm0ub3JnIj5MTFZNIFByb2plY3Q8L2E+LCBhbmQNCi11c2VzIGxsdm0gZGV2IG1haWxpbmcgbGlzdCBmb3IgZGV2ZWxvcG1lbnQgcXVlc3Rpb24gYW5kIHRoZSB2bWtpdC1jb21taXRzDQotbWFpbGluZyBsaXN0IGZvciBwYXRjaGVzOjwvcD4NCi0NCi08dWw+DQotPGxpPjxhIGhyZWY9Imh0dHA6Ly9saXN0cy5jcy51aXVjLmVkdS9tYWlsbWFuL2xpc3RpbmZvL3Zta2l0LWNvbW1pdHMiPnZta2l0LWNvbW1pdHMNCi08L2E+IC0gVGhpcyBsaXN0IGlzIGZvciBwYXRjaCBzdWJtaXNzaW9uL2Rpc2N1c3Npb24uPC9saT4NCi0NCi08bGk+PGEgaHJlZj0iaHR0cDovL2xpc3RzLmNzLnVpdWMuZWR1L21haWxtYW4vbGlzdGluZm8vbGx2bWRldiI+bGx2bWRldjwvYT4gLSANCi1UaGlzIGxpc3QgaXMgZm9yIGV2ZXJ5dGhpbmcgZWxzZSBsbHZtL3Zta2l0IHJlbGF0ZWQgKHF1ZXN0aW9ucyBhbmQgYW5zd2VycywgYnVnDQotcmVwb3J0cywgZXRjKS48L2xpPg0KLQ0KLTwvdWw+DQotDQotPHA+VGhlIGJlc3Qgd2F5IHRvIHRhbGsgd2l0aCBvdGhlciBkZXZlbG9wZXJzIG9uIHRoZSBwcm9qZWN0IGlzIHRocm91Z2ggdGhlIDxhDQotaHJlZj0iaHR0cDovL2xpc3RzLmNzLnVpdWMuZWR1L21haWxtYW4vbGlzdGluZm8vbGx2bWRldiI+bGx2bS1kZXYgbWFpbGluZw0KLWxpc3Q8L2E+LiAgPC9wPg0KLQ0KLQ0KLTxwPllvdSBjYW4gYWxzbyB2aXNpdCB0aGUgPGEgaHJlZj0iaHR0cDovL3Zta2l0Lmxsdm0ub3JnL09wZW5Qcm9qZWN0cy5odG1sIj4NCi1PcGVuIFByb2plY3RzPC9hPiBwYWdlIGZvciBhIGxpc3Qgb2YgaW50ZXJlc3RpbmcgdGhpbmdzIHRvIHdvcmsgb24gaW4gVk1LaXQuPC9wPg0KLQ0KLTwvZGl2Pg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvdm1raXQvd3d3L2dldF9zdGFydGVkLmh0bWwgYi92bWtpdC93d3cvZ2V0X3N0YXJ0ZWQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlhMjQ2Zi4uMDAwMDAwMAotLS0gYS92bWtpdC93d3cvZ2V0X3N0YXJ0ZWQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iCi0gICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cmljdC5kdGQiPgotPGh0bWw+Ci08aGVhZD4KLSAgPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KLSAgPHRpdGxlPlZNS2l0IC0gR2V0dGluZyBTdGFydGVkPC90aXRsZT4KLSAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ibWVudS5jc3MiIC8+Ci0gIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImNvbnRlbnQuY3NzIiAvPgotPC9oZWFkPgotPGJvZHk+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJtZW51Lmh0bWwuaW5jbCItLT4KLQotPGRpdiBpZD0iY29udGVudCI+Ci0KLTxoMT5HZXR0aW5nIFN0YXJ0ZWQ6IEJ1aWxkaW5nIGFuZCBSdW5uaW5nIFZNS2l0PC9oMT4KLQotCi08cD5UaGlzIHBhZ2UgZ2l2ZXMgeW91IHRoZSBzaG9ydGVzdCBwYXRoIHRvIGNoZWNraW5nIG91dCB2bWtpdCBhbmQgZGVtb3MgYSBmZXcKLW9wdGlvbnMuICBUaGlzIHNob3VsZCBnZXQgeW91IHVwIGFuZCBydW5uaW5nIHdpdGggdGhlIG1pbmltdW0gb2YgbXVzcyBhbmQgZnVzcy4KLUlmIHlvdSBsaWtlIHdoYXQgeW91IHNlZSwgcGxlYXNlIGNvbnNpZGVyIDxhIGhyZWY9ImdldF9pbnZvbHZlZC5odG1sIj5nZXR0aW5nCi1pbnZvbHZlZDwvYT4gd2l0aCB0aGUgdm1raXQgY29tbXVuaXR5LjwvcD4KLQotCi08aDI+QSB3b3JkIG9mIHdhcm5pbmc8L2gyPgotCi08cD5XaGlsZSB0aGlzIHdvcmsgYWltcyB0byBwcm92aWRlIGEgZnVsbHkgZnVuY3Rpb25hbCBKVk0sIGl0Ci1pcyA8ZW0+c3RpbGwgZWFybHkgd29yazwvZW0+IGFuZCBpcyB1bmRlciBoZWF2eSBkZXZlbG9wbWVudC4gCi08cD5Tb21lIG9mIHRoZSBjb21tb24gbWlzc2luZyBwaWVjZXMgaW4gdm1raXQvbGx2bSBhcmU6PC9wPgotCi08b2w+Ci0gIDxsaT4gTWl4ZWQgaW50ZXJwcmV0YXRpb24vY29tcGlsYXRpb24uPC9saT4KLSAgPGxpPiBBZGFwdGl2ZSBvcHRpbWl6YXRpb24uPC9saT4KLTwvb2w+Ci0KLTxoMiBpZD0iYnVpbGQiPkJ1aWxkaW5nIHZta2l0IC8gd29ya2luZyB3aXRoIHRoZSBjb2RlPC9oMj4KLQotPHA+SWYgeW91IHdvdWxkIGxpa2UgdG8gY2hlY2sgb3V0IGFuZCBidWlsZCB0aGUgcHJvamVjdCwgdGhlIGN1cnJlbnQgc2NoZW1lCi1pczo8L3A+Ci0KLTxvbD4KLSAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cubGx2bS5vcmcvZG9jcy9HZXR0aW5nU3RhcnRlZC5odG1sI2NoZWNrb3V0Ij5DaGVja291dAotICAgYW5kIGJ1aWxkIExMVk08L2E+IGZyb20gU1ZOIGhlYWQ6PC9saT4KLQotICA8dWw+Ci0gICAgPGxpPjx0dD5zdm4gY28gaHR0cDovL2xsdm0ub3JnL3N2bi9sbHZtLXByb2plY3QvbGx2bS90cnVuayBsbHZtPC90dD48L2xpPgotICAgIDxsaT48dHQ+Y2QgbGx2bTwvdHQ+PC9saT4KLSAgICA8bGk+PHR0Pi4vY29uZmlndXJlOyBtYWtlPC90dD48L2xpPgotICA8L3VsPgotCi0gIAotICA8bGk+PGEgaHJlZj0iZnRwOi8vZnRwLmdudS5vcmcvZ251L2NsYXNzcGF0aC9jbGFzc3BhdGgtMC45Ny4yLnRhci5neiI+RG93bmxvYWQKLSAgIEdOVSBDbGFzc3BhdGggMC45Ny4yPC9hPjo8L2xpPgotCi0gIDx1bD4KLSAgICA8bGk+PHR0PnRhciB6eHZmIGNsYXNzcGF0aC0wLjk3LjIudGFyLmd6PC90dD48L2xpPgotICAgIDxsaT48dHQ+Y2QgY2xhc3NwYXRoLTAuOTcuMjwvdHQ+PC9saT4KLSAgICA8bGk+PHR0Pi4vY29uZmlndXJlIC0tZGlzYWJsZS1wbHVnaW4gLS1kaXNhYmxlLWV4YW1wbGVzIC0tZGlzYWJsZS1XZXJyb3I7IG1ha2U8L3R0PjwvbGk+Ci0gICAgPGxpPjx0dD5jZCBsaWI8L2xpPjwvdHQ+Ci0gICAgPGxpPjx0dD5JZiB5b3UgYXJlIHJ1bm5pbmcgb24gTGludXg6PC9saT48L3R0PgotICAgIDx1bD4KLSAgICAgIDxsaT48dHQ+bG4gLXMgLi4vbmF0aXZlL2puaS9ndGstcGVlci8ubGlicy9saWJndGtwZWVyLnNvOzwvbGk+PC90dD4KLSAgICAgIDxsaT48dHQ+bG4gLXMgLi4vbmF0aXZlL2puaS9nY29uZi1wZWVyLy5saWJzL2xpYmdjb25mcGVlci5zbzs8L2xpPjwvdHQ+Ci0gICAgICA8bGk+PHR0PmxuIC1zIC4uL25hdGl2ZS9qbmkvamF2YS1pby8ubGlicy9saWJqYXZhaW8uc287PC9saT48L3R0PgotICAgICAgPGxpPjx0dD5sbiAtcyAuLi9uYXRpdmUvam5pL2phdmEtbGFuZy8ubGlicy9saWJqYXZhbGFuZ3JlZmxlY3Quc287PC9saT48L3R0PgotICAgICAgPGxpPjx0dD5sbiAtcyAuLi9uYXRpdmUvam5pL2phdmEtbGFuZy8ubGlicy9saWJqYXZhbGFuZy5zbzs8L2xpPjwvdHQ+Ci0gICAgICA8bGk+PHR0PmxuIC1zIC4uL25hdGl2ZS9qbmkvamF2YS1uZXQvLmxpYnMvbGliamF2YW5ldC5zbzs8L2xpPjwvdHQ+Ci0gICAgICA8bGk+PHR0PmxuIC1zIC4uL25hdGl2ZS9qbmkvamF2YS1uaW8vLmxpYnMvbGliamF2YW5pby5zbzs8L2xpPjwvdHQ+Ci0gICAgICA8bGk+PHR0PmxuIC1zIC4uL25hdGl2ZS9qbmkvamF2YS11dGlsLy5saWJzL2xpYmphdmF1dGlsLnNvOzwvbGk+PC90dD4KLSAgICA8L3VsPgotICAgIDxsaT48dHQ+SWYgeW91IGFyZSBydW5uaW5nIG9uIE1hY09TOjwvbGk+PC90dD4KLSAgICA8dWw+Ci0gICAgICA8bGk+PHR0PmxuIC1zIC4uL25hdGl2ZS9qbmkvZ3RrLXBlZXIvLmxpYnMvbGliZ3RrcGVlci5keWxpYjs8L2xpPjwvdHQ+Ci0gICAgICA8bGk+PHR0PmxuIC1zIC4uL25hdGl2ZS9qbmkvZ2NvbmYtcGVlci8ubGlicy9saWJnY29uZnBlZXIuZHlsaWI7PC9saT48L3R0PgotICAgICAgPGxpPjx0dD5sbiAtcyAuLi9uYXRpdmUvam5pL2phdmEtaW8vLmxpYnMvbGliamF2YWlvLmR5bGliOzwvbGk+PC90dD4KLSAgICAgIDxsaT48dHQ+bG4gLXMgLi4vbmF0aXZlL2puaS9qYXZhLWxhbmcvLmxpYnMvbGliamF2YWxhbmdyZWZsZWN0LmR5bGliOzwvbGk+PC90dD4KLSAgICAgIDxsaT48dHQ+bG4gLXMgLi4vbmF0aXZlL2puaS9qYXZhLWxhbmcvLmxpYnMvbGliamF2YWxhbmcuZHlsaWI7PC9saT48L3R0PgotICAgICAgPGxpPjx0dD5sbiAtcyAuLi9uYXRpdmUvam5pL2phdmEtbmV0Ly5saWJzL2xpYmphdmFuZXQuZHlsaWI7PC9saT48L3R0PgotICAgICAgPGxpPjx0dD5sbiAtcyAuLi9uYXRpdmUvam5pL2phdmEtbmlvLy5saWJzL2xpYmphdmFuaW8uZHlsaWI7PC9saT48L3R0PgotICAgICAgPGxpPjx0dD5sbiAtcyAuLi9uYXRpdmUvam5pL2phdmEtdXRpbC8ubGlicy9saWJqYXZhdXRpbC5keWxpYjs8L2xpPjwvdHQ+Ci0gICAgPC91bD4KLSAgPC91bD4KLSAgCi0gIDxsaT5DaGVja291dCB2bWtpdDo8L2xpPgotICA8dWw+Ci0gICAgIDxsaT48dHQ+c3ZuIGNvIGh0dHA6Ly9sbHZtLm9yZy9zdm4vbGx2bS1wcm9qZWN0L3Zta2l0L3RydW5rIHZta2l0PC90dD48L2xpPgotCi0gIDwvdWw+Ci0gIDxsaT5Db25maWd1cmUgdm1raXQ6PC9saT4KLSAgPHVsPgotICA8bGk+PHR0Pi4vY29uZmlndXJlIDwvdHQ+PC9saT4KLSAgPGRsPgotICAgIDxkdD48dHQ+LS13aXRoLWxsdm1zcmM9Jmx0O2RpcmVjdG9yeSZndDs8L3R0PjwvZHQ+Ci0gICAgPGRkPlRlbGwgdm1raXQgd2hlcmUgdGhlIExMVk0gc291cmNlIHRyZWUgaXMgbG9jYXRlZC48L2RkPgotICAgIDxkdD48YnIvPjx0dD4tLXdpdGgtbGx2bW9iaj0mbHQ7ZGlyZWN0b3J5Jmd0OzwvdHQ+PC9kdD4KLSAgICA8ZGQ+VGVsbCB2bWtpdCB3aGVyZSB0aGUgTExWTSBvYmplY3QgdHJlZSBpcyBsb2NhdGVkLjwvZGQ+Ci0gICAgPGR0Pjxici8+PHR0Pi0td2l0aC1nbnUtY2xhc3NwYXRoLWdsaWJqPSZsdDtmaWxlIG9yIGRpcmVjdG9yeSZndDs8L3R0PjwvZHQ+Ci0gICAgPGRkPlRlbGwgdm1raXQgd2hlcmUgR05VIENsYXNzcGF0aCBnbGliai56aXAgaXMgbG9jYXRlZC48L2RkPgotICAgIDxkdD48YnIvPjx0dD4tLXdpdGgtZ251LWNsYXNzcGF0aC1saWJzPSZsdDtkaXJlY3RvcnkmZ3Q7PC90dD48L2R0PgotICAgIDxkZD5UZWxsIHZta2l0IHdoZXJlIEdOVSBDbGFzc3BhdGggbGlicyBhcmUgbG9jYXRlZC48L2RkPgotICA8L2RsPgotCi0gIDwvdWw+Ci0KLSAgPGxpPkJ1aWxkIHZta2l0OjwvbGk+Ci0gIDx1bD4KLSAgICA8bGk+PHR0PmNkIHZta2l0PC90dD48L2xpPgotICAgIDxsaT48dHQ+bWFrZTwvdHQ+ICh0aGlzIHdpbGwgZ2l2ZSB5b3UgYSBkZWJ1ZyBidWlsZCk8L2xpPgotICA8L3VsPgotCi0gIDxsaT5UcnkgaXQgb3V0OiAoYXNzdW1pbmcgdm1raXQvRGVidWcvYmluIGlzIGluIHlvdXIgcGF0aCk8L2xpPgotICA8dWw+Ci0gICAgPGxpPjx0dD5qMyAtLWhlbHA8L3R0PjwvbGk+Ci0gICAgPGxpPjx0dD5qMyBIZWxsb1dvcmxkPC90dD48L2xpPgotICA8L3VsPgotPC9vbD4KLQotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS92bWtpdC93d3cvaW5kZXguaHRtbCBiL3Zta2l0L3d3dy9pbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmU0YjYyLi4wMDAwMDAwCi0tLSBhL3Zta2l0L3d3dy9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIgDQotICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4NCi08IS0tIE1hdGVyaWFsIHVzZWQgZnJvbTogSFRNTCA0LjAxIHNwZWNzOiBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNDAxLyAtLT4NCi08aHRtbD4NCi08aGVhZD4NCi0gIDxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+DQotICA8dGl0bGU+Vk1LaXQ6IGEgc3Vic3RyYXRlIGZvciB2aXJ0dWFsIG1hY2hpbmVzPC90aXRsZT4NCi0gIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9Im1lbnUuY3NzIiAvPg0KLSAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iY29udGVudC5jc3MiIC8+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJtZW51Lmh0bWwuaW5jbCItLT4NCi08ZGl2IGlkPSJjb250ZW50Ij4NCi0gIDwhLS0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4NCi0gIDxoMT5WTUtpdDogYSBzdWJzdHJhdGUgZm9yIHZpcnR1YWwgbWFjaGluZXM8L2gxPg0KLSAgPCEtLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tPg0KLSAgDQotICA8cD5UaGUgVk1LaXQgcHJvamVjdCBpcyBhIGZyYW1ld29yayBmb3IgYnVpbGRpbmcgdmlydHVhbCBtYWNoaW5lcy4gSXQgdXNlcw0KLSAgPGEgaHJlZj0iaHR0cDovL2xsdm0ub3JnIj5MTFZNPC9hPiBmb3IgY29tcGlsaW5nIGFuZCBvcHRpbWl6aW5nIGhpZ2gtbGV2ZWwNCi0gIGxhbmd1YWdlcyB0byBtYWNoaW5lIGNvZGUsIGFuZCA8YSBocmVmPSJodHRwOi8vamlrZXNydm0ub3JnL01NVGsiPk1NVGs8L2E+DQotICB0byBtYW5hZ2UgbWVtb3J5LiBKMyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBhIEpWTSB3aXRoIFZNS2l0Lg0KLSAgWW91IGNhbiA8YSBocmVmPSJnZXRfc3RhcnRlZC5odG1sIj5nZXQgYW5kIGJ1aWxkPC9hPiB0aGUgc291cmNlIG9mIEozDQotICB0b2RheS48L3A+DQotICANCi0gIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4NCi0gIDxoMiBpZD0iZ29hbHMiPkZlYXR1cmVzPC9oMj4NCi0gIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4NCi0gIA0KLSAgPHA+Vk1LaXQgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBmZWF0dXJlczo8L3A+DQotICANCi0gIDxwPjxiPkVuZC1Vc2VyIEZlYXR1cmVzPC9hPjwvYj46PC9wPg0KLSAgDQotICA8dWw+DQotICA8bGk+UHJlY2lzZSBnYXJiYWdlIGNvbGxlY3Rpb24uPC9saT4NCi0gIDxsaT5KdXN0LWluLVRpbWUgYW5kIEFoZWFkLW9mLVRpbWUgY29tcGlsYXRpb24uPC9saT4NCi0gIDxsaT5Qb3J0YWJsZSBvbiBtYW55IGFyY2hpdGVjdHVyZXMgKHg4NiwgeDY0LCBwcGMzMiwgcHBjNjQsIGFybSkuPC9saT4NCi0gIDwvdWw+DQotDQotICA8cD48Yj5EZXZlbG9wZXIgRmVhdHVyZXM8L2E+PC9iPjo8L3A+DQotDQotICA8dWw+DQotICAgIDxsaT5SZWxhdGl2ZWx5IHNtYWxsIGNvZGUgYmFzZSAofiAyMGsgbG9jIHBlciBWTSk8L2xpPg0KLSAgICA8bGk+SW5mcmFzdHJ1Y3R1cmUgZm9yIHJ1bm5pbmcgbXVsdGlwbGUgVk0vYXBwbGljYXRpb25zIGluIGEgc2luZ2xlDQotICAgICAgICBwcm9jZXNzPC9saT4NCi0gICAgPGxpPkluZnJhc3RydWN0dXJlIGZvciB2aXJ0dWFsIG1hY2hpbmUgcmVzZWFyY2ggYW5kIGRldmVsb3BtZW50PC9saT4NCi0gIDwvdWw+DQotDQotICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+DQotICA8aDI+V2h5PzwvaDI+DQotICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+DQotICANCi0gIDxwPlRoZSBkZXZlbG9wbWVudCBvZiBWTUtpdCB3YXMgc3RhcnRlZCBvdXQgb2YgYSBuZWVkIHRvIGZhY3Rvcml6ZSB2aXJ0dWFsDQotICAgICBtYWNoaW5lIGRldmVsb3BtZW50LiBUaGUgSlZNIGFuZCBDTEkgdmlydHVhbCBtYWNoaW5lIGhhdmUgbWFueSANCi0gICAgIHNpbWlsYXJpdGllcywgYnV0IGFyZSB0b28gaGlnaC1sZXZlbCB0byBiZSB0aGUgYmFzaXMgb2YgYSAidW5pdmVyc2FsIg0KLSAgICAgdmlydHVhbCBtYWNoaW5lLiBUaGUgTExWTSBJUiBvbiB0aGUgb3Bwb3NpdGUgaXMgbG93LWxldmVsIGVub3VnaCB0byBiZSANCi0gICAgIGFibGUgdG8gZXhlY3V0ZSB0aGVzZSBWTXMuIFZNS2l0IGlzIGEgcHJvb2Ygb2YgY29uY2VwdCBpbXBsZW1lbnRhdGlvbg0KLSAgICAgdG93YXJkcyB0aGF0IGRpcmVjdGlvbi48L3A+DQotICAgICANCi0gIDxwPlBhcGVyIG9uIHRoZSBkZXNpZ24gb2YgVk1LaXQ6DQotICA8dWw+DQotICAgIDxsaT48YSBocmVmPSJwdWJsaWNhdGlvbnMvdm1raXQuaHRtbCI+Vk1LaXQ6IGEgU3Vic3RyYXRlIGZvciBNYW5hZ2VkIFJ1bnRpbWUgRW52aXJvbm1lbnRzPC9hPg0KLSAgICA8L2xpPg0KLSAgPC91bD4NCi0gICAgIA0KLSAgPHA+VGhlIFBoRCB0aGVzaXMgdGhhdCBpbml0aWF0ZWQgVk1LaXQ6DQotICA8dWw+DQotICAgIDxsaT48YSBocmVmPSJwdWJsaWNhdGlvbnMvdGhlc2lzLmh0bWwiPk5pY29sYXMgR2VvZmZyYXkncyBQaEQgdGhlc2lzPC9hPg0KLSAgICA8L2xpPg0KLSAgPC91bD4NCi0gICAgIA0KLSAgPHA+QW4gaW50cm9kdWN0aW9uIHRvIFZNS2l0IGNhbiBiZSBmb3VuZCBpbiB0aGUgZm9sbG93aW5nIHZpZGVvIGxlY3R1cmVzOg0KLSAgPHVsPg0KLSAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2xsdm0ub3JnL2Rldm10Zy8yMDA5LTEwL0dlb2ZmcmF5X0dhcmJhZ2VDb2xsZWN0aW9uVk1LaXQtNzAwa2Jwcy5tb3YiPg0KLSAgICAgICAgUHJlc2VudGF0aW9uIG9mIFZNS2l0L01NVGsgYXQgdGhlIDIwMDkgTExWTSBEZXZlbG9wZXIncyBNZWV0aW5nPC9hPg0KLSAgICA8L2xpPg0KLSAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2xsdm0ub3JnL2Rldm10Zy8yMDA4LTA4L0dlb2ZmcmF5X1ZNS2l0UHJvamVjdF9Mby4zZ3AiPg0KLSAgICAgICAgUHJlc2VudGF0aW9uIG9mIFZNS2l0IGF0IHRoZSAyMDA4IExMVk0gRGV2ZWxvcGVyJ3MgTWVldGluZzwvYT4NCi0gICAgPC9saT4NCi0gIDwvdWw+IA0KLSAgPC9wPg0KLSAgICAgDQotICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+DQotICA8aDI+Q3VycmVudCBTdGF0dXM8L2gyPg0KLSAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPg0KLSAgDQotICA8cD5WTUtpdCBjdXJyZW50bHkgaGFzIGEgZGVjZW50IGltcGxlbWVudGF0aW9uIG9mIGEgSlZNLiBJdCBleGVjdXRlcw0KLSAgICAgbGFyZ2UgcHJvamVjdHMgKGUuZy4gT1NHaSBGZWxpeCwgVG9tY2F0LCBFY2xpcHNlKSBhbmQgdGhlDQotICAgICA8YSBocmVmPSJodHRwOi8vZGFjYXBvYmVuY2gub3JnIj5EYUNhcG8gYmVuY2htYXJrczwvYT4uDQotICA8L3A+DQotICAgICANCi0gIDxwPlRoZSBKVk0gaGFzIGJlZW4gdGVzdGVkIG9uIExpbnV4L3g2NCwgTGludXgveDg2LCBMaW51eC9wcGMzMiwgTWFjT1NYL3g2NCwNCi0gICAgIE1hY09TWC94ODYsIE1hY09TWC9wcGMzMi4gVGhlIEpWTSBtYXkgd29yayBvbiBwcGM2NC4gU3VwcG9ydCBmb3INCi0gICAgIFdpbmRvd3MgaGFzIG5vdCBiZWVuIGludmVzdGlnYXRlZC4NCi0gIDwvcD4NCi0NCi0gIA0KLSAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPg0KLSAgPGgyPkdldCBpdCBhbmQgZ2V0IGludm9sdmVkITwvaDI+DQotICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+DQotICANCi0gIDxwPlN0YXJ0IGJ5IDxhIGhyZWY9ImdldF9zdGFydGVkLmh0bWwiPmdldHRpbmcgdGhlIGNvZGUsIGJ1aWxkaW5nIGl0LCBhbmQNCi0gICAgIHBsYXlpbmcgd2l0aCBpdDwvYT4uICBUaGlzIHdpbGwgc2hvdyB5b3UgdGhlIHNvcnRzIG9mIHRoaW5ncyB3ZSBjYW4gZG8NCi0gICAgIHRvZGF5LjwvcD4NCi0gIA0KLSAgPHA+T25jZSB5b3UndmUgZG9uZSB0aGF0LCBwbGVhc2UgY29uc2lkZXIgPGEgaHJlZj0iZ2V0X2ludm9sdmVkLmh0bWwiPmdldHRpbmcNCi0gICAgIGludm9sdmVkIGluIHRoZSBWTUtpdCBjb21tdW5pdHk8L2E+LiBDdXJyZW50bHksIFZNS2l0IGlzIHRpZ2h0bHkNCi0gICAgIGludGVncmF0ZWQgaW50byB0aGUgTExWTSBjb21tdW5pdHkuIFlvdSBjYW4gc2lnbiB1cCBmb3IgdGhlIExMVk0gbWFpbGluZw0KLSAgICAgbGlzdCB0byBhc2sgYW5kIGxlYXJuIGFib3V0IGhvdyB0aGUgcHJvamVjdCB3b3Jrcy48L3A+DQotPC9kaXY+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS92bWtpdC93d3cvbWVudS5jc3MgYi92bWtpdC93d3cvbWVudS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZjJhZGIuLjAwMDAwMDAKLS0tIGEvdm1raXQvd3d3L21lbnUuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKi8KLS8qIHBhZ2UgbGF5b3V0ICovCi0vKioqKioqKioqKioqKioqLwotCi1odG1sLGJvZHkgewotICAgIHBhZGRpbmc6MHB4OyAgCi0gICAgZm9udC1zaXplOjE0cHg7IGZvbnQtZmFtaWx5OiJMdWNpZGEgR3JhbmRlIiwgIkx1Y2lkYSBTYW5zIFVuaWNvZGUiLCBBcmlhbCwgVmVyZGFuYSwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOyBjb2xvcjogIzIyMjsKLSAgICBsaW5lLWhlaWdodDoxLjU7Ci0gICAgbWFyZ2luLWxlZnQ6IDEwcHg7Ci19Ci0KLQotW2lkPW1lbnVdIHsKLQlwb3NpdGlvbjpmaXhlZDsKLQl3aWR0aDoyNWV4OwotfQotW2lkPWNvbnRlbnRdIHsKLQkvKiAqKioqKiAgRURJVCBUSElTIFZBTFVFIElGIENPTlRFTlQgT1ZFUkxBUFMgTUVOVSAqKioqKiAqLwotCXBvc2l0aW9uOmFic29sdXRlOwotICBsZWZ0OjI5ZXg7Ci0JcGFkZGluZy1yaWdodDo0ZXg7Ci19Ci0KLS8qKioqKioqKioqKioqKi8KLS8qIG1lbnUgc3R5bGUgKi8KLS8qKioqKioqKioqKioqKi8KLQotI21lbnUgLnN1Ym1lbnUgewotCXBhZGRpbmctdG9wOjFlbTsKLQlkaXNwbGF5OmJsb2NrOwotfQotCi0jbWVudSBsYWJlbCB7Ci0JZGlzcGxheTpibG9jazsKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci0JYmFja2dyb3VuZC1jb2xvcjogcmdiKDE5MiwxOTIsMTkyKTsKLX0KLSNtZW51IGEgewotCXBhZGRpbmc6MCAuMmVtOwotCWRpc3BsYXk6YmxvY2s7Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotCWJhY2tncm91bmQtY29sb3I6IHJnYigyMzUsMjM1LDIzNSk7Ci19Ci0jbWVudSBhOnZpc2l0ZWQgewotCWNvbG9yOnJnYigxMDAsNTAsMTAwKTsKLX0KZGlmZiAtLWdpdCBhL3Zta2l0L3d3dy9tZW51Lmh0bWwuaW5jbCBiL3Zta2l0L3d3dy9tZW51Lmh0bWwuaW5jbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ3NzMzZC4uMDAwMDAwMAotLS0gYS92bWtpdC93d3cvbWVudS5odG1sLmluY2wKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08ZGl2IGlkPSJtZW51Ij4KLSAgPGRpdj4KLSAgICA8YSBocmVmPSJodHRwOi8vbGx2bS5vcmcvIj5MTFZNIEhvbWU8L2E+Ci0gIDwvZGl2PgotICAKLSAgPGRpdiBjbGFzcz0ic3VibWVudSI+Ci0gICAgPGxhYmVsPlZNS2l0IEluZm88L2xhYmVsPgotICAgIDxhIGhyZWY9Ii9pbmRleC5odG1sIj5BYm91dDwvYT4KLSAgICA8YSBocmVmPSIvZ2V0X3N0YXJ0ZWQuaHRtbCI+R2V0Jm5ic3A7U3RhcnRlZDwvYT4KLSAgICA8YSBocmVmPSIvZ2V0X2ludm9sdmVkLmh0bWwiPkdldCZuYnNwO0ludm9sdmVkPC9hPgotICAgIDxhIGhyZWY9Ii9Vc2Vyc01hbnVhbC5odG1sIj5Vc2VycyZuYnNwO01hbnVhbDwvYT4KLSAgICA8YSBocmVmPSIvT3BlblByb2plY3RzLmh0bWwiPk9wZW4mbmJzcDtQcm9qZWN0czwvYT4KLSAgICA8YSBocmVmPSIvcHVicy5odG1sIj5QdWJsaWNhdGlvbnM8L2E+Ci0gICAgPGEgaHJlZj0iL3JlbGVhc2VzL2luZGV4Lmh0bWwiPlJlbGVhc2VzPC9hPgotICA8L2Rpdj4KLSAgCi0gIDxkaXYgY2xhc3M9InN1Ym1lbnUiPgotICAgIDxsYWJlbD5RdWljayBMaW5rczwvbGFiZWw+Ci0gICAgPGEgaHJlZj0iaHR0cDovL2xpc3RzLmNzLnVpdWMuZWR1L21haWxtYW4vbGlzdGluZm8vbGx2bWRldiI+bGx2bS1kZXY8L2E+Ci0gICAgPGEgaHJlZj0iaHR0cDovL2xpc3RzLmNzLnVpdWMuZWR1L21haWxtYW4vbGlzdGluZm8vdm1raXQtY29tbWl0cyI+dm1raXQtY29tbWl0czwvYT4KLSAgICA8YSBocmVmPSJodHRwOi8vbGx2bS5vcmcvYnVncy8iPkJ1ZyBSZXBvcnRzPC9hPgotICAgIDxhIGhyZWY9Imh0dHA6Ly9sbHZtLm9yZy92aWV3dmMvbGx2bS1wcm9qZWN0L3Zta2l0L3RydW5rLyI+QnJvd3NlIFNvdXJjZTwvYT4KLSAgPC9kaXY+Ci0gIAotICA8ZGl2IGNsYXNzPSJzdWJtZW51Ij4KLSAgICA8bGFiZWw+RXZlbnRzPC9sYWJlbD4KLSAgICA8YSBocmVmPSJodHRwOi8vbGx2bS5vcmcvZGV2bXRnLyI+TExWTS9DbGFuZyBEZXZlbG9wZXIgTWVldGluZ3M8L2E+Ci0gIDwvZGl2PgotCi08L2Rpdj4KZGlmZiAtLWdpdCBhL3Zta2l0L3d3dy9wdWJsaWNhdGlvbnMvbGFkeXZtLmh0bWwgYi92bWtpdC93d3cvcHVibGljYXRpb25zL2xhZHl2bS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTMxODVhLi4wMDAwMDAwCi0tLSBhL3Zta2l0L3d3dy9wdWJsaWNhdGlvbnMvbGFkeXZtLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9sbHZtLm9yZy9sbHZtLmNzcyIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iIC8+Ci0gIDx0aXRsZT5BIExhenkgRGV2ZWxvcGVyIEFwcHJvYWNoOiBCdWlsZGluZyBhIEpWTSB3aXRoIFRoaXJkIFBhcnR5IFNvZnR3YXJlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08ZGl2IGNsYXNzPSJwdWJfdGl0bGUiPgotICBBIExhenkgRGV2ZWxvcGVyIEFwcHJvYWNoOiBCdWlsZGluZyBhIEpWTSB3aXRoIFRoaXJkIFBhcnR5IFNvZnR3YXJlCi08L2Rpdj4KLTxkaXYgY2xhc3M9InB1Yl9hdXRob3IiPgotICBOaWNvbGFzIEdlb2ZmcmF5LCBHYWVsIFRob21hcywgQ2hhcmxlcyBDbGVtZW50IGFuZCBCZXJ0aWwgRm9sbGlvdAotPC9kaXY+Ci0KLTxoMj5BYnN0cmFjdDo8L2gyPgotPGJsb2NrcXVvdGU+Ci1UaGUgZGV2ZWxvcG1lbnQgb2YgYSBjb21wbGV0ZSBKYXZhIFZpcnR1YWwgTWFjaGluZSAoSlZNKQotaW1wbGVtZW50YXRpb24gaXMgYSB0ZWRpb3VzIHByb2Nlc3Mgd2hpY2ggaW52b2x2ZXMga25vd2xlZGdlIGluIGRpZmZlcmVudAotYXJlYXM6IGdhcmJhZ2UgY29sbGVjdGlvbiwganVzdCBpbiB0aW1lIGNvbXBpbGF0aW9uLCBpbnRlcnByZXRhdGlvbiwgZmlsZQotcGFyc2luZywgZGF0YSBzdHJ1Y3R1cmVzLCBldGMuIFRoZSByZXN1bHQgaXMgdGhhdCBkZXZlbG9waW5nIGl0cyBvd24gdmlydHVhbCAKLW1hY2hpbmUgcmVxdWlyZXMgYSBjb25zaWRlcmFibGUgYW1vdW50IG9mIG1hbi95ZWFyLiBJbiB0aGlzIHBhcGVyIHdlIHNob3cgdGhhdAotb25lIGNhbiBpbXBsZW1lbnQgYSBKVk0gd2l0aCB0aGlyZCBwYXJ0eSBzb2Z0d2FyZSBhbmQgd2l0aCBwZXJmb3JtYW5jZQotY29tcGFyYWJsZSB0byBpbmR1c3RyaWFsIGFuZCB0b3Agb3Blbi1zb3VyY2UgSlZNcy4gT3VyIHByb29mLW9mLWNvbmNlcHQgCi1pbXBsZW1lbnRhdGlvbiB1c2VzIGV4aXN0aW5nIHZlcnNpb25zIG9mIGEgZ2FyYmFnZSBjb2xsZWN0b3IsIGEganVzdCBpbgotdGltZSBjb21waWxlciwgYW5kIHRoZSBiYXNlIGxpYnJhcnksIGFuZCBpcyByb2J1c3QgZW5vdWdoIHRvCi1leGVjdXRlIGNvbXBsZXggSmF2YSBhcHBsaWNhdGlvbnMgc3VjaCBhcyB0aGUgT1NHaSBGZWxpeAotaW1wbGVtZW50YXRpb24gYW5kIHRoZSBUb21jYXQgc2VydmxldCBjb250YWluZXIuCi0KLTwvYmxvY2txdW90ZT4KLQotPGgyPkJpYnRleDo8L2gyPgotPHByZT4KLUBpbnByb2NlZWRpbmdze2dlb2ZmcmF5MDhsYWR5dm0sCi0gICAgICAgIGF1dGhvciA9IHtOLiBHZW9mZnJheSAgYW5kIEcuIFRob21hcyBhbmQgQy4gQ2xcJ2VtZW50IGFuZCBCLiBGb2xsaW90fSwKLSAgICAgICAgdGl0bGUgPSB7IEEgTGF6eSBEZXZlbG9wZXIgQXBwcm9hY2g6IEJ1aWxkaW5nIGEgSlZNIHdpdGggVGhpcmQgUGFydHkgU29mdHdhcmUgfSwgCi0gICAgICAgIGJvb2t0aXRsZSA9IHt7SW50ZXJuYXRpb25hbCBDb25mZXJlbmNlIG9uIFByaW5jaXBsZXMgYW5kIFByYWN0aWNlIG9mIFByb2dyYW1taW5nIEluIEphdmEgKFBQUEogMjAwOCkgIH19LCAKLSAgICAgICAgeWVhciA9IHsyMDA4fSwKLSAgICAgICAgYWRkcmVzcyA9IHtNb2RlbmEsIEl0YWx5fSwKLSAgICAgICAgbW9udGggPSB7U2VwdGVtYmVyfSwKLX0KLTwvcHJlPgotCi08aDI+RG93bmxvYWQ6PC9oMj4KLTx1bD4KLSAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9wYWdlc3BlcnNvLXN5c3RlbWUubGlwNi5mci9OaWNvbGFzLkdlb2ZmcmF5L2ZpbGVzL3BwcGotMDgucGRmIj5BIExhenkgRGV2ZWxvcGVyIEFwcHJvYWNoOiBCdWlsZGluZyBhIEpWTSB3aXRoIFRoaXJkIFBhcnR5IFNvZnR3YXJlPC9hPiAoUERGKTwvbGk+Ci08L3VsPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS92bWtpdC93d3cvcHVibGljYXRpb25zL29zZ2lfZHNuLmh0bWwgYi92bWtpdC93d3cvcHVibGljYXRpb25zL29zZ2lfZHNuLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMGIxOWUuLjAwMDAwMDAKLS0tIGEvdm1raXQvd3d3L3B1YmxpY2F0aW9ucy9vc2dpX2Rzbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgLz4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vbGx2bS5vcmcvbGx2bS5jc3MiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIiAvPgotICA8dGl0bGU+SS1KVk06IGEgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgZm9yIENvbXBvbmVudCBJc29sYXRpb24gaW4gT1NHaTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGRpdiBjbGFzcz0icHViX3RpdGxlIj4KLSAgSS1KVk06IGEgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgZm9yIENvbXBvbmVudCBJc29sYXRpb24gaW4gT1NHaQotPC9kaXY+Ci08ZGl2IGNsYXNzPSJwdWJfYXV0aG9yIj4KLSAgTmljb2xhcyBHZW9mZnJheSwgR2FlbCBUaG9tYXMsIEdpbGxlcyBNdWxsZXIsIFBpZXJyZSBQYXJyZW5kLCBTdGVwaGFuZSBGcmVub3QsIEJlcnRpbCBGb2xsaW90Ci08L2Rpdj4KLQotPGgyPkFic3RyYWN0OjwvaDI+Ci08YmxvY2txdW90ZT4KLVRoZSBPU0dpIGZyYW1ld29yayBpcyBhIEphdmEtYmFzZWQsIGNlbnRyYWxpemVkLCBjb21wb25lbnQgb3JpZW50ZWQKLXBsYXRmb3JtLiBJdCBpcyBiZWluZyB3aWRlbHkgYWRvcHRlZCBhcyBhbiBleGVjdXRpb24gZW52aXJvbm1lbnQgZm9yIAotdGhlIGRldmVsb3BtZW50IG9mIGV4dGVuc2libGUgYXBwbGljYXRpb25zLiBIb3dldmVyLCBjdXJyZW50IEphdmEKLVZpcnR1YWwgTWFjaGluZXMgYXJlIHVuYWJsZSB0byBpc29sYXRlIGNvbXBvbmVudHMgZnJvbSBlYWNoIG90aGVyLgotRm9yIGluc3RhbmNlLCBhIG1hbGljaW91cyBjb21wb25lbnQgY2FuIGZyZWV6ZSB0aGUgY29tcGxldGUgcGxhdGZvcm0KLWJ5IGFsbG9jYXRpbmcgdG9vIG11Y2ggbWVtb3J5IG9yIGFsdGVyIHRoZSBiZWhhdmlvciBvZiBvdGhlciBjb21wb25lbnRzIGJ5Ci1tb2RpZnlpbmcgc2hhcmVkIHZhcmlhYmxlcy4KLQotVGhpcyBwYXBlciBwcmVzZW50cyBJLUpWTSwgYSBKYXZhIFZpcnR1YWwgTWFjaGluZSB0aGF0IHByb3ZpZGVzIGEKLWxpZ2h0d2VpZ2h0IGFwcHJvYWNoIHRvIGlzb2xhdGlvbiB3aGlsZSBwcmVzZXJ2aW5nIGNvbXBhdGliaWxpdHkgd2l0aAotbGVnYWN5IE9TR2kgYXBwbGljYXRpb25zLiBPdXIgZXZhbHVhdGlvbiBvZiBJLUpWTSBzaG93cyB0aGF0IGl0IHNvbHZlcwotdGhlIDgga25vd24gT1NHaSB2dWxuZXJhYmlsaXRpZXMgdGhhdCBhcmUgZHVlIHRvIHRoZSBKYXZhIFZpcnR1YWwKLU1hY2hpbmUgYW5kIHRoYXQgdGhlIG92ZXJoZWFkIG9mIEktSlZNIGNvbXBhcmVkIHRvIHRoZSBKVk0gb24gd2hpY2gKLWl0IGlzIGJhc2VkIGlzIGJlbG93IDIwJS4KLTwvYmxvY2txdW90ZT4KLQotPGgyPkJpYnRleDo8L2gyPgotPHByZT4KLUBpbnByb2NlZWRpbmdze2dlb2ZmcmF5MDlpanZtLAotICBhdXRob3IgPSB7Ti4gR2VvZmZyYXkgYW5kIEcuIFRob21hcyBhbmQgRy4gTXVsbGVyIGFuZCBQLiBQYXJyZW5kIGFuZCBTLiBGclwnZW5vdCBhbmQgQi4gRm9sbGlvdH0sCi0gIHRpdGxlID0ge3tJLUpWTTogYSBKYXZhIFZpcnR1YWwgTWFjaGluZSBmb3IgQ29tcG9uZW50IElzb2xhdGlvbiBpbiBPU0dpfX0sCi0gIGJvb2t0aXRsZSA9IHtJbnRlcm5hdGlvbmFsIENvbmZlcmVuY2Ugb24gRGVwZW5kYWJsZSBTeXN0ZW1zIGFuZCBOZXR3b3JrcyAoRFNOIDIwMDkpfSwKLSAgcHVibGlzaGVyID0ge0lFRUUgQ29tcHV0ZXIgU29jaWV0eX0sCi0gIHBkZiA9IHtmaWxlcy9panZtLnBkZn0sCi0gIHllYXIgPSB7MjAwOX0sCi0gIG1vbnRoID0ge0p1bmV9LAotICBhZGRyZXNzID0ge0VzdG9yaWwsIFBvcnR1Z2FsfQotfQotPC9wcmU+Ci0KLTxoMj5Eb3dubG9hZDo8L2gyPgotPHVsPgotICA8bGk+PGEgaHJlZj0iaHR0cDovL3BhZ2VzcGVyc28tc3lzdGVtZS5saXA2LmZyL05pY29sYXMuR2VvZmZyYXkvZmlsZXMvaWp2bS5wZGYiPkktSlZNOiBhIEphdmEgVmlydHVhbCBNYWNoaW5lIGZvciBDb21wb25lbnQgSXNvbGF0aW9uIGluIE9TR2k8L2E+IChQREYpPC9saT4KLTwvdWw+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Zta2l0L3d3dy9wdWJsaWNhdGlvbnMvb3NnaV9paWVzLmh0bWwgYi92bWtpdC93d3cvcHVibGljYXRpb25zL29zZ2lfaWllcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2MyZWRiLi4wMDAwMDAwCi0tLSBhL3Zta2l0L3d3dy9wdWJsaWNhdGlvbnMvb3NnaV9paWVzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9sbHZtLm9yZy9sbHZtLmNzcyIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iIC8+Ci0gIDx0aXRsZT5Ub3dhcmRzIGEgbmV3IElzb2xhdGlvbiBBYnN0cmFjdGlvbiBmb3IgT1NHaTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGRpdiBjbGFzcz0icHViX3RpdGxlIj4KLSAgVG93YXJkcyBhIG5ldyBJc29sYXRpb24gQWJzdHJhY3Rpb24gZm9yIE9TR2kKLTwvZGl2PgotPGRpdiBjbGFzcz0icHViX2F1dGhvciI+Ci0gIE5pY29sYXMgR2VvZmZyYXksIEdhZWwgVGhvbWFzLCBDaGFybGVzIENsZW1lbnQgYW5kIEJlcnRpbCBGb2xsaW90Ci08L2Rpdj4KLQotPGgyPkFic3RyYWN0OjwvaDI+Ci08YmxvY2txdW90ZT4KLVRoZSBPcGVuIFNlcnZpY2UgR2F0ZXdheSBJbml0aWF0aXZlIChPU0dpKSBzcGVjaWZpY2F0aW9uIGRlZmluZXMgYSBkeW5hbWljIEphdmEtYmFzZWQgc2VydmljZSBvcmllbnRlZCBhcmNoaXRlY3R1cmUgZm9yIG5ldHdvcmtlZCBlbnZpcm9ubWVudHMgc3VjaAotYXMgaG9tZSBzZXJ2aWNlIGdhdGV3YXlzLiBUbyBwcm92aWRlIGlzb2xhdGlvbiBiZXR3ZWVuIGRpZmZlcmVudCBzZXJ2aWNlcywgaXQgcmVsaWVzIG9uIHRoZSBKYXZhIGNsYXNzIGxvYWRpbmcgbWVjaGFuaXNtLgotV2hpbGUgY2xhc3MgbG9hZGVycyBoYXZlIG1hbnkgYWR2YW50YWdlcyBiZXNpZGUgaXNvbGF0aW9uLCB0aGV5IGFyZSBwb29yIGluIHByb3RlY3RpbmcgdGhlIHN5c3RlbSBhZ2FpbnN0Ci1tYWxpY2lvdXMgb3IgYnVnZ3kgc2VydmljZXMuIEluIHRoaXMgcGFwZXIsCi13ZSBwcm9wb3NlIGEgbmV3IGFwcHJvYWNoIGZvciBzZXJ2aWNlIGlzb2xhdGlvbi4gSXQgaXMgYmFzZWQgb24gdGhlIEphdmEgaXNvbGF0ZSB0ZWNobm9sb2d5LCB3aXRob3V0IGEKLXRhc2stb3JpZW50ZWQgYXJjaGl0ZWN0dXJlLiBPdXIgYXBwcm9hY2ggaXMgbW9yZSB0YWlsb3JlZCB0byBzZXJ2aWNlLW9yaWVudGVkIGFyY2hpdGVjdHVyZXMgYW5kIGluIHBhcnRpY3VsYXIKLW9mZmVycyBhIGNvbXBsZXRlIGlzb2xhdGlvbiBhYnN0cmFjdGlvbiB0byB0aGUgT1NHaSBwbGF0Zm9ybS4gSXQgaXMgY3VycmVudGx5IHVuZGVyIGRldmVsb3BtZW50LCBoZW5jZQotd2UgZG8gbm90IHByb3ZpZGUgaW4gdGhpcyBwYXBlciBhbnkgdGVjaG5pY2FsIGRldGFpbHMgbm9yIHJlc3VsdHMuCi0KLTwvYmxvY2txdW90ZT4KLQotPGgyPkJpYnRleDo8L2gyPgotPHByZT4KLUBpbnByb2NlZWRpbmdze2dlb2ZmcmF5MDhpc29sYXRpb25vc2dpLAotICBhdXRob3IgPSB7Ti4gR2VvZmZyYXkgYW5kIEcuIFRob21hcyBhbmQgQy4gQ2xcJ2VtZW50IGFuZCBCLiBGb2xsaW90fSwKLSAgdGl0bGUgPSB7e1Rvd2FyZHMgYSBuZXcgSXNvbGF0aW9uIEFic3RyYWN0aW9uIGZvciBPU0dpfX0sCi0gIGJvb2t0aXRsZSA9IHtQcm9jZWVkaW5ncyBvZiB0aGUgRmlyc3QgV29ya3Nob3Agb24gSXNvbGF0aW9uIGFuZCBJbnRlZ3JhdGlvbiBpbiBFbWJlZGRlZCBTeXN0ZW1zIChJSUVTIDIwMDgpfSwKLSAgeWVhciA9IHsyMDA4fSwKLSAgcGFnZXMgPSB7NDEtNDV9LAotICBhZGRyZXNzID0ge0dsYXNnb3csIFNjb3RsYW5kLCBVS30sCi0gIG1vbnRoID0ge0FwcmlsfSwKLX0KLTwvcHJlPgotCi08aDI+RG93bmxvYWQ6PC9oMj4KLTx1bD4KLSAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9wYWdlc3BlcnNvLXN5c3RlbWUubGlwNi5mci9OaWNvbGFzLkdlb2ZmcmF5L2ZpbGVzL2lpZXMtMDgucGRmIj5Ub3dhcmRzIGEgbmV3IElzb2xhdGlvbiBBYnN0cmFjdGlvbiBmb3IgT1NHaTwvYT4gKFBERik8L2xpPgotPC91bD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdm1raXQvd3d3L3B1YmxpY2F0aW9ucy90aGVzaXMuaHRtbCBiL3Zta2l0L3d3dy9wdWJsaWNhdGlvbnMvdGhlc2lzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZjczMmIuLjAwMDAwMDAKLS0tIGEvdm1raXQvd3d3L3B1YmxpY2F0aW9ucy90aGVzaXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIC8+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2xsdm0ub3JnL2xsdm0uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiIgLz4KLSAgPHRpdGxlPkZvc3RlcmluZyBTeXN0ZW1zIFJlc2VhcmNoIHdpdGggTWFuYWdlZCBSdW50aW1lczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGRpdiBjbGFzcz0icHViX3RpdGxlIj4KLSAgRm9zdGVyaW5nIFN5c3RlbXMgUmVzZWFyY2ggd2l0aCBNYW5hZ2VkIFJ1bnRpbWVzCi08L2Rpdj4KLTxkaXYgY2xhc3M9InB1Yl9hdXRob3IiPgotICBOaWNvbGFzIEdlb2ZmcmF5Ci08L2Rpdj4KLQotPGgyPkFic3RyYWN0OjwvaDI+Ci08YmxvY2txdW90ZT4KLU1hbnkgc3lzdGVtcyByZXNlYXJjaCBwcm9qZWN0cyBub3cgdGFyZ2V0IG1hbmFnZWQgcnVudGltZSBlbnZpcm9ubWVudHMgKE1SRSkKLWJlY2F1c2UgdGhleSBwcm92aWRlIGJldHRlciBwcm9kdWN0aXZpdHkgYW5kIHNhZmV0eSBjb21wYXJlZCB0byBuYXRpdmUKLWVudmlyb25tZW50cy4gU3RpbGwsIGRldmVsb3BpbmcgYW5kIG9wdGltaXppbmcgYW4gTVJFIGlzIGEgdGVkaW91cwotdGFzayB0aGF0IHJlcXVpcmVzIG1hbnkgeWVhcnMgb2YgZGV2ZWxvcG1lbnQuIEFsdGhvdWdoIE1SRXMgc2hhcmUgc29tZSBjb21tb24KLWZ1bmN0aW9uYWxpdGllcywgc3VjaCBhcyBhIEp1c3QgSW4gVGltZSBDb21waWxlciBvciBhIEdhcmJhZ2UgQ29sbGVjdG9yLCB0aGlzCi1vcHBvcnR1bml0eSBmb3Igc2hhcmluZyBoYXMgbm90IGJlZW4geWV0IGV4cGxvaXRlZCBpbiBpbXBsZW1lbnRpbmcgTVJFcy4KLVRoaXMgdGhlc2lzIGRlc2NyaWJlcyBhbmQgZXZhbHVhdGVzIFZNS2l0LCBhIGZpcnN0IGF0dGVtcHQgdG8gYnVpbGQgYSBjb21tb24KLXN1YnN0cmF0ZSB0aGF0IGVhc2VzIHRoZSBkZXZlbG9wbWVudCBhbmQgZXhwZXJpbWVudGF0aW9uIG9mIGhpZ2gtbGV2ZWwgTVJFcyBhbmQgCi1zeXN0ZW1zIG1lY2hhbmlzbXMuIFZNS2l0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB1c2VkIHRvIGJ1aWxkIHR3byBNUkVzLAotYSBKYXZhIFZpcnR1YWwgTWFjaGluZSBhbmQgYSBDb21tb24gTGFuZ3VhZ2UgUnVudGltZSwgYXMgd2VsbCBhcyBhIGEgbmV3IHN5c3RlbQotbWVjaGFuaXNtIHRoYXQgcHJvdmlkZXMgYmV0dGVyIHNlY3VyaXR5IGluIHRoZSBjb250ZXh0IG9mIHNlcnZpY2Utb3JpZW50ZWQKLWFyY2hpdGVjdHVyZXMuCi0KLVdlIGRlc2NyaWJlIHRoZSBsZXNzb25zIGxlYXJudCBpbiBpbXBsZW1lbnRpbmcgc3VjaCBhIGNvbW1vbgotaW5mcmFzdHJ1Y3R1cmUgZnJvbSBhIHBlcmZvcm1hbmNlIGFuZCBhbiBlYXNlIG9mIGRldmVsb3BtZW50IHN0YW5kcG9pbnQuCi1UaGUgcGVyZm9ybWFuY2Ugb2YgVk1LaXQgYXJlIHJlYXNvbmFibGUgY29tcGFyZWQgdG8gaW5kdXN0cmlhbCBNUkVzLCBhbmQgCi10aGUgaGlnaC1sZXZlbCBNUkVzIGFyZSBvbmx5IDIwLDAwMCBsaW5lcyBvZiBjb2RlLiBPdXIgbmV3IHN5c3RlbQotbWVjaGFuaXNtIG9ubHkgcmVxdWlyZXMgdGhlIGFkZGl0aW9uIG9mIDYwMCBsaW5lcyBvZiBjb2RlIGluIFZNS2l0LCBhbmQgCi1pcyBhIHNpZ25pZmljYW50IHN0ZXAgdG93YXJkcyBiZXR0ZXIgZGVwZW5kYWJsZSBzeXN0ZW1zLgotCi08L2Jsb2NrcXVvdGU+Ci0KLTxoMj5CaWJ0ZXg6PC9oMj4KLTxwcmU+Ci1AUGhkVGhlc2lze2dlb2ZmcmF5OnBoZCwKLSAgICAgICAgYXV0aG9yID0ge04uIEdlb2ZmcmF5fSwKLSAgICAgICAgdGl0bGUgPSB7IEZvc3RlcmluZyBTeXN0ZW1zIFJlc2VhcmNoIHdpdGggTWFuYWdlZCBSdW50aW1lcyB9LAotICAgICAgICBzY2hvb2xkID0ge1VuaXZlcnNpdFwnZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWV9LAotICAgICAgICB5ZWFyID0gezIwMDl9LAotICAgICAgICBhZGRyZXNzID0ge1BhcmlzLCBGcmFuY2V9LAotICAgICAgICBtb250aCA9IHtTZXB0ZW1iZXJ9LAotfQotPC9wcmU+Ci0KLTxoMj5Eb3dubG9hZDo8L2gyPgotPHVsPgotICA8bGk+PGEgaHJlZj0iaHR0cDovL3BhZ2VzcGVyc28tc3lzdGVtZS5saXA2LmZyL05pY29sYXMuR2VvZmZyYXkvdGhlc2UtZ2VvZmZyYXkucGRmIj5Gb3N0ZXJpbmcgU3lzdGVtcyBSZXNlYXJjaCB3aXRoIE1hbmFnZWQgUnVudGltZXM8L2E+IChQREYpPC9saT4KLTwvdWw+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Zta2l0L3d3dy9wdWJsaWNhdGlvbnMvdm1raXQuaHRtbCBiL3Zta2l0L3d3dy9wdWJsaWNhdGlvbnMvdm1raXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU1ZWIwZS4uMDAwMDAwMAotLS0gYS92bWtpdC93d3cvcHVibGljYXRpb25zL3Zta2l0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9sbHZtLm9yZy9sbHZtLmNzcyIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iIC8+Ci0gIDx0aXRsZT5WTUtpdDogYSBTdWJzdHJhdGUgZm9yIE1hbmFnZWQgUnVudGltZSBFbnZpcm9tZW50czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGRpdiBjbGFzcz0icHViX3RpdGxlIj4KLSAgVk1LaXQ6IGEgU3Vic3RyYXRlIGZvciBNYW5hZ2VkIFJ1bnRpbWUgRW52aXJvbm1lbnRzCi08L2Rpdj4KLTxkaXYgY2xhc3M9InB1Yl9hdXRob3IiPgotICBOaWNvbGFzIEdlb2ZmcmF5LCBHYWVsIFRob21hcywgSnVsaWEgTGF3YWxsLCBHaWxsZXMgTXVsbGVyIGFuZCBCZXJ0aWwgRm9sbGlvdAotPC9kaXY+Ci0KLTxoMj5BYnN0cmFjdDo8L2gyPgotPGJsb2NrcXVvdGU+Ci1NYW5hZ2VkIFJ1bnRpbWUgRW52aXJvbm1lbnRzIChNUkVzKSwgc3VjaCBhcyB0aGUgSlZNIGFuZCB0aGUgQ0xJLCBmb3JtIGFuCi1hdHRyYWN0aXZlIGVudmlyb25tZW50IGZvciBwcm9ncmFtIGV4ZWN1dGlvbiwgYnkgcHJvdmlkaW5nIHBvcnRhYmlsaXR5IGFuZCAKLXNhZmV0eSwgdmlhIHRoZSB1c2Ugb2YgYSBieXRlY29kZSBsYW5ndWFnZSBhbmQgYXV0b21hdGljIG1lbW9yeSBtYW5hZ2VtZW50LAotYXMgd2VsbCBhcyBnb29kIHBlcmZvcm1hbmNlLCB2aWEganVzdC1pbi10aW1lIChKSVQpIGNvbXBpbGF0aW9uLgotTmV2ZXJ0aGVsZXNzLCBkZXZlbG9waW5nIGEgZnVsbHkgZmVhdHVyZWQgTVJFLCBpbmNsdWRpbmcgZS5nLgotYSBnYXJiYWdlIGNvbGxlY3RvciBhbmQgSklUIGNvbXBpbGVyLCBpcyBhIGhlcmN1bGVhbgotdGFzay4gIEFzIGEgcmVzdWx0LCBuZXcgbGFuZ3VhZ2VzIGNhbm5vdCBlYXNpbHkgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIAotYmVuZWZpdHMgb2YgTVJFcywgYW5kIGl0IGlzIGRpZmZpY3VsdCB0byBleHBlcmltZW50IHdpdGgKLWV4dGVuc2lvbnMgb2YgZXhpc3RpbmcgTVJFIGJhc2VkIGxhbmd1YWdlcy4KLQotVGhpcyBwYXBlciBkZXNjcmliZXMgYW5kIGV2YWx1YXRlcyBWTUtpdCwgYSBmaXJzdCBhdHRlbXB0IHRvIGJ1aWxkIGEgY29tbW9uCi1zdWJzdHJhdGUgdGhhdCBlYXNlcyB0aGUgZGV2ZWxvcG1lbnQgb2YgaGlnaC1sZXZlbCBNUkVzLiAgV2UgaGF2ZSBzdWNjZXNzZnVsbHkKLXVzZWQgVk1LaXQgdG8gYnVpbGQgdHdvIE1SRXM6IGEgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgYW5kIGEgQ29tbW9uCi1MYW5ndWFnZSBSdW50aW1lLiAgV2UgcHJvdmlkZSBhbiBleHRlbnNpdmUgc3R1ZHkgb2YgdGhlIGxlc3NvbnMgbGVhcm5lZCBpbgotZGV2ZWxvcGluZyB0aGlzIGluZnJhc3RydWN0dXJlLCBhbmQgYXNzZXNzIHRoZSBlYXNlIG9mIGltcGxlbWVudGluZyBuZXcgCi1NUkVzIG9yIE1SRSBleHRlbnNpb25zIGFuZCB0aGUgcmVzdWx0aW5nIHBlcmZvcm1hbmNlLiAgSW4gIAotcGFydGljdWxhciwgaXQgdG9vayBvbmUgb2YgdGhlIGF1dGhvcnMgb25seSBvbmUgbW9udGggdG8gZGV2ZWxvcCBhIENvbW1vbgotTGFuZ3VhZ2UgUnVudGltZSB1c2luZyBWTUtpdC4gVk1LaXQgZnVydGhlcm1vcmUgaGFzIHBlcmZvcm1hbmNlIGNvbXBhcmFibGUKLXRvIHRoZSB3ZWxsIGVzdGFibGlzaGVkIG9wZW4gc291cmNlIE1SRXMgQ2FjYW8sIEFwYWNoZSBIYXJtb255IGFuZCBNb25vLCBhbmQgaXMKLTEuMiB0byAzIHRpbWVzIHNsb3dlciB0aGFuIEppa2VzUlZNIG9uIG1vc3Qgb2YgdGhlIERhQ2FwbwotYmVuY2htYXJrcy4KLQotPC9ibG9ja3F1b3RlPgotCi08aDI+QmlidGV4OjwvaDI+Ci08cHJlPgotQGlucHJvY2VlZGluZ3N7Z2VvZmZyYXkxMHZta2l0LAotICBhdXRob3IgPSB7Ti4gR2VvZmZyYXkgYW5kIEcuIFRob21hcyBhbmQgSi5MYXdhbGwgYW5kIEcuIE11bGxlciBhbmQgQi4gRm9sbGlvdH0sCi0gIHRpdGxlID0ge3tWTUtpdDogYSBTdWJzdHJhdGUgZm9yIE1hbmFnZWQgUnVudGltZSBFbnZpcm9ubWVudHN9fSwKLSAgYm9va3RpdGxlID0ge1ZpcnR1YWwgRXhlY3V0aW9uIEVudmlyb25tZW50IENvbmZlcmVuY2UgKFZFRSAyMDEwKX0sCi0gIHB1Ymxpc2hlciA9IHtBQ00gUHJlc3N9LAotICB5ZWFyID0gezIwMTB9LAotICBtb250aCA9IHtNYXJjaH0sCi0gIGFkZHJlc3MgPSB7UGl0dHNidXJnaCwgVVNBfQotfQotPC9wcmU+Ci0KLTxoMj5Eb3dubG9hZDo8L2gyPgotPHVsPgotICA8bGk+PGEgaHJlZj0iaHR0cDovL2xsdm0ub3JnL3B1YnMvMjAxMC0wMy1WRUUtVk1LaXQucGRmIj5WTUtpdDogYSBTdWJzdHJhdGUgZm9yIE1hbmFnZWQgUnVudGltZSBFbnZpcm9ubWVudHM8L2E+IChQREYpPC9saT4KLTwvdWw+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Zta2l0L3d3dy9wdWJzLmh0bWwgYi92bWtpdC93d3cvcHVicy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjkyYTE3Li4wMDAwMDAwCi0tLSBhL3Zta2l0L3d3dy9wdWJzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iCi0gICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cmljdC5kdGQiPgotPGh0bWw+Ci08aGVhZD4KLSAgPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KLSAgPHRpdGxlPlZNS2l0IC0gR2V0dGluZyBTdGFydGVkPC90aXRsZT4KLSAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ibWVudS5jc3MiIC8+Ci0gIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImNvbnRlbnQuY3NzIiAvPgotPC9oZWFkPgotPGJvZHk+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJtZW51Lmh0bWwuaW5jbCItLT4KLQotPGRpdiBpZD0iY29udGVudCI+Ci0KLTxoMT5WTUtpdCByZWxhdGVkIHB1YmxpY2F0aW9uczwvaDE+Ci0KLQotPGgyPjIwMTA8L2gyPgotPG9sPgotICA8bGk+PGEgaHJlZj0icHVibGljYXRpb25zL3Zta2l0Lmh0bWwiPlZNS2l0OiBhIFN1YnN0cmF0ZSBmb3IgTWFuYWdlZCBSdW50aW1lIEVudmlyb25tZW50czwvYT48YnIvPgotICAgICAgIE5pY29sYXMgR2VvZmZyYXksIEdhZWwgVGhvbWFzLCBKdWxpYSBMYXdhbGwsIEdpbGxlcyBNdWxsZXIsIEJlcnRpbCBGb2xsaW90PGJyPgotICAgICAgIFByb2MuIG9mIHRoZSBWaXJ0dWFsIEV4ZWN1dGlvbiBFbnZpcm9ubWVudHMgQ29uZmVyZW5jZSAoVkVFJzEwKSwgUGl0dHNidXJnaCwgVVNBLCBNYXIuIDIwMTA8L2xpPgotPC9vbD4KLTxoMj4yMDA5PC9oMj4KLTxvbD4KLSAgPGxpPjxhIGhyZWY9InB1YmxpY2F0aW9ucy90aGVzaXMuaHRtbCI+Rm9zdGVyaW5nIFN5c3RlbXMgUmVzZWFyY2ggd2l0aCBNYW5hZ2VkIFJ1bnRpbWVzPC9hPjxici8+Ci0gICAgICAgTmljb2xhcyBHZW9mZnJheTxicj4KLSAgICAgICBQaEQgVGhlc2lzLCBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSwgUGFyaXMsIEZyYW5jZSwgU2VwLiAyMDA5PC9saT4KLSAgPGxpPjxhIGhyZWY9InB1YmxpY2F0aW9ucy9vc2dpX2Rzbi5odG1sIj5JLUpWTTogYSBKYXZhIFZpcnR1YWwgTWFjaGluZSBmb3IgQ29tcG9uZW50IElzb2xhdGlvbiBpbiBPU0dpPC9hPjxici8+Ci0gICAgICAgTmljb2xhcyBHZW9mZnJheSwgR2FlbCBUaG9tYXMsIEdpbGxlcyBNdWxsZXIsIFBpZXJyZSBQYXJyZW5kLCBTdGVwaGFuZSBGcmVub3QsIEJlcnRpbCBGb2xsaW90PGJyPgotICAgICAgIFByb2MuIG9mIHRoZSBEZXBlbmRhYmxlIFN5c3RlbXMgYW5kIE5ldHdvcmsgQ29uZmVyZW5jZSAoRFNOJzA5KSwgRXN0b3JpbCwgUG9ydHVnYWwsIEp1bi4gMjAwOTwvbGk+Ci08L29sPgotPGgyPjIwMDg8L2gyPgotPG9sPgotICA8bGk+PGEgaHJlZj0icHVibGljYXRpb25zL2xhZHl2bS5odG1sIj5BIExhenkgRGV2ZWxvcGVyIEFwcHJvYWNoOiBCdWlsZGluZyBhIEpWTSB3aXRoIFRoaXJkIFBhcnR5IFNvZnR3YXJlPC9hPjxici8+Ci0gICAgICAgTmljb2xhcyBHZW9mZnJheSwgR2FlbCBUaG9tYXMsIENoYXJsZXMgQ2xlbWVudCwgQmVydGlsIEZvbGxpb3Q8YnI+Ci0gICAgICAgUHJvYy4gb2YgdGhlIFByaW5jaXBsZXMgYW5kIFByYWN0aWNlIG9mIFByb2dyYW1taW5nIGluIEphdmEgKFBQUEonMDgpLCBNb2RlbmEsIEl0YWx5IFNlcC4gMjAwODwvbGk+Ci0gIDxsaT48YSBocmVmPSJwdWJsaWNhdGlvbnMvb3NnaV9kc24uaHRtbCI+VG93YXJkcyBhIG5ldyBJc29sYXRpb24gQWJzdHJhY3Rpb24gZm9yIE9TR2k8L2E+PGJyLz4KLSAgICAgICBOaWNvbGFzIEdlb2ZmcmF5LCBHYWVsIFRob21hcywgQ2hhcmxlcyBDbGVtZW50LCBCZXJ0aWwgRm9sbGlvdDxicj4KLSAgICAgICBQcm9jLiBvZiB0aGUgSXNvbGF0aW9uIGFuZCBJbnRlZ3JhdGlvbiBpbiBFbWJlZGRlZCBTeXN0ZW1zIChJSUVTJzA4KSwgR2xhc2dvdywgU2NvdGxhbmQsIEFwci4gMjAwODwvbGk+Ci08L29sPgotCi08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Zta2l0L3d3dy9yZWxlYXNlcy9pbmRleC5odG1sIGIvdm1raXQvd3d3L3JlbGVhc2VzL2luZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZDk0NzMuLjAwMDAwMDAKLS0tIGEvdm1raXQvd3d3L3JlbGVhc2VzL2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iIA0KLSAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI+DQotPCEtLSBNYXRlcmlhbCB1c2VkIGZyb206IEhUTUwgNC4wMSBzcGVjczogaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQwMS8gLS0+DQotPGh0bWw+DQotPGhlYWQ+DQotICA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPg0KLSAgPHRpdGxlPiJ2bWtpdCIgSlZNIGFuZCAuTmV0IHJ1bnRpbWVzIGZvciBMTFZNPC90aXRsZT4NCi0gIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL21lbnUuY3NzIiAvPg0KLSAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vY29udGVudC5jc3MiIC8+DQotPC9oZWFkPg0KLTxib2R5Pg0KLQ0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSIuLi9tZW51Lmh0bWwuaW5jbCItLT4NCi0NCi0NCi08ZGl2IGlkPSJjb250ZW50Ij4NCi0gIDwhLS0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4NCi0gIDxoMT5WTUtpdCBSZWxlYXNlczwvaDE+DQotICA8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0+DQotICANCi0gIDxwPlRoZSBWTUtpdCBwcm9qZWN0IHdhcyBwdWJsaWNseSByZWxlYXNlZCBpbiB0aGUgdGltZSBvZiBMTFZNIDIuMy4gU2luY2UgDQotICAgICBMTFZNIDIuNCwgVk1LaXQgZm9sbG93cyBlYWNoIExMVk0gcmVsZWFzZS4gVGhlIGZpcnN0IHJlbGVhc2Ugb2YgVk1LaXQgaXMNCi0gICAgIHZlcnNpb24gMC4yNC48L3A+DQotICANCi0gIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4NCi0gIDxoMiBpZD0iZGxzIj5Eb3dubG9hZHM8L2gyPg0KLSAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPg0KLSAgDQotICA8dWw+DQotICAgIDxsaT48YSBocmVmPSJodHRwOi8vbGx2bS5vcmcvdmlld3ZjL2xsdm0tcHJvamVjdC92bWtpdC9icmFuY2hlcy9yZWxlYXNlXzAyOC93d3cvcmVsZWFzZXMvdm1raXQtMC4yOC50YXIuYnoyP3JldmlzaW9uPTExNjI5OSI+DQotICAgICAgVk1LaXQgcmVsZWFzZSAwLjI4IDwvYT4gKA0KLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL2xsdm0ub3JnL3JlbGVhc2VzLzIuOC9kb2NzL1JlbGVhc2VOb3Rlcy5odG1sI3Zta2l0Ij4NCi0gICAgICAgICAgICAgIFJlbGVhc2Ugbm90ZXMgPC9hPikNCi0gICAgPC9saT4NCi0gICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9sbHZtLm9yZy9yZWxlYXNlcy8yLjcvdm1raXQtMC4yNy50YXIuYnoyIj4NCi0gICAgICBWTUtpdCByZWxlYXNlIDAuMjcgPC9hPiAoDQotICAgICAgICA8YSBocmVmPSJodHRwOi8vbGx2bS5vcmcvcmVsZWFzZXMvMi43L2RvY3MvUmVsZWFzZU5vdGVzLmh0bWwjdm1raXQiPg0KLSAgICAgICAgICAgICAgUmVsZWFzZSBub3RlcyA8L2E+KQ0KLSAgICA8L2xpPg0KLSAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2xsdm0ub3JnL3JlbGVhc2VzLzIuNi92bWtpdC0wLjI2LnRhci5iejIiPg0KLSAgICAgIFZNS2l0IHJlbGVhc2UgMC4yNiA8L2E+ICgNCi0gICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9sbHZtLm9yZy9yZWxlYXNlcy8yLjYvZG9jcy9SZWxlYXNlTm90ZXMuaHRtbCN2bWtpdCI+DQotICAgICAgICAgICAgICBSZWxlYXNlIG5vdGVzIDwvYT4pDQotICAgIDwvbGk+DQotICAgIDxsaT48YSBocmVmPSJodHRwOi8vbGx2bS5vcmcvcmVsZWFzZXMvMi41L3Zta2l0LTAuMjUudGFyLmJ6MiI+DQotICAgICAgVk1LaXQgcmVsZWFzZSAwLjI1IDwvYT4gKA0KLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL2xsdm0ub3JnL3JlbGVhc2VzLzIuNS9kb2NzL1JlbGVhc2VOb3Rlcy5odG1sI3Zta2l0Ij4NCi0gICAgICAgICAgICAgIFJlbGVhc2Ugbm90ZXMgPC9hPikNCi0gICAgPC9saT4NCi0gICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9sbHZtLm9yZy9yZWxlYXNlcy8yLjQvdm1raXQtMC4yNC50YXIuYnoyIj4NCi0gICAgICBWTUtpdCByZWxlYXNlIDAuMjQgPC9hPiAoDQotICAgICAgICA8YSBocmVmPSJodHRwOi8vbGx2bS5vcmcvcmVsZWFzZXMvMi40L2RvY3MvUmVsZWFzZU5vdGVzLmh0bWwjdm1raXQiPg0KLSAgICAgICAgICAgICAgUmVsZWFzZSBub3RlcyA8L2E+KQ0KLSAgICA8L2xpPg0KLSAgPC91bD4NCi0gIA0KLTwvZGl2Pg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvdm1raXQvd3d3L3VzZV9hb3QuaHRtbCBiL3Zta2l0L3d3dy91c2VfYW90Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYzc3NDcuLjAwMDAwMDAKLS0tIGEvdm1raXQvd3d3L3VzZV9hb3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIKLSAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI+Ci08aHRtbD4KLTxoZWFkPgotICA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotICA8dGl0bGU+Vk1LaXQgLSBHZXR0aW5nIFN0YXJ0ZWQ8L3RpdGxlPgotICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJtZW51LmNzcyIgLz4KLSAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iY29udGVudC5jc3MiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9Im1lbnUuaHRtbC5pbmNsIi0tPgotCi08ZGl2IGlkPSJjb250ZW50Ij4KLQotPGgxPkdldHRpbmcgU3RhcnRlZDogSmF2YSBBaGVhZCBvZiBUaW1lIGNvbXBpbGF0aW9uIHdpdGggVk1LaXQ8L2gxPgotCi0KLTxwPlRoaXMgcGFnZSBnaXZlcyB5b3UgdGhlIGluc3RydWN0aW9ucyBvbiBob3cgdG8gdXNlIHRoZSBKYXZhIGFoZWFkIG9mIHRpbWUKLWNvbXBpbGVyIG9mIFZNS2l0LjwvcD4KLQotCi08b2w+Ci0gIDxsaT48YSBocmVmPSIvZ2V0X3N0YXJ0ZWQuaHRtbCI+Q2hlY2tvdXQKLSAgIGFuZCBidWlsZCBWTUtpdDwvYT4gZnJvbSBTVk4gaGVhZC48L2xpPgotCi0gPGxpPkNvbXBpbGUgaW50byBhIGR5bmFtaWMgbGlicmFyeSB0aGUgY29yZSBKYXZhIGxpYnMgKGUuZy4gR05VIENsYXNzcGF0aCk6Ci0gPC9saT4KLQotICA8dWw+Ci0gICAgPGxpPjx0dD5jZCB0b29scy92bWpjL2xpYnZtamM8L3R0PjwvbGk+Ci0gICAgPGxpPjx0dD5tYWtlIEVOQUJMRV9PUFRJTUlaRUQ9MSAoZ28gZ2V0IGNvZmZlZSk8L3R0PjwvbGk+Ci0gIDwvdWw+Ci0gIAotICA8bGk+VXBkYXRlIFBBVEggdG8gaW5jbHVkZSBMTFZNIGFuZCBWTUtpdCBiaW5hcmllcyAocmVwbGFjZSAqX09CSiB3aXRoIHlvdXIKLSAgICAgIGRpcmVjdG9yeSk6PC9saT4KLSAgIDx1bD4KLSAgICAgPGxpPjx0dD5leHBvcnQgUEFUSD0kKExMVk1fT0JKKS9SZWxlYXNlL2JpbjokKFZNS0lUX09CSikvUmVsZWFzZS9iaW4KLSAgICAgPC90dD48L2xpPgotICAgPC91bD4KLSAgIAotICAgPGxpPlVwZGF0ZSBMRF9MSUJSQVJZX1BBVEggdG8gaW5jbHVkZSB0aGUgZHluYW1pYyBsaWJyYXJ5IHByZXZpb3VzbHkKLSAgICAgICBjb21waWxlZCAocmVwbGFjZSBWTUtJVF9PQkogd2l0aCB5b3VyIGRpcmVjdG9yeSk6PC9saT4KLSAgIDx1bD4KLSAgICAgPGxpPjx0dD5leHBvcnQgTERfTElCUkFSWV9QQVRIPSQoVk1LSVRfT0JKKS9SZWxlYXNlL2xpYgotICAgICA8L3R0PjwvbGk+Ci0gICA8L3VsPgotICAKLSAgIDxsaT5Vc2UgdGhlIDx0dD5sbGNqPC90dD4gdG9vbCBvbiBhIGNsYXNzIG9yIGEgamFyIGZpbGU6PC9saT4KLSAgIDx1bD4KLSAgICAgPGxpPjx0dD5sbGNqIC1TIEZvby5jbGFzcyAoZW1pdCBieXRlY29kZSk8L3R0PjwvbGk+Ci0gICAgIDxsaT48dHQ+bGxjaiAtLW1haW49Rm9vIEZvby5jbGFzcyAoZ2VuZXJhdGUgYW4gZXhlY3V0YWJsZSk8L3R0PjwvbGk+Ci0gICAgIDxsaT48dHQ+bGxjaiAtYyBGb28uY2xhc3MgKGdlbmVyYXRlIGFuIG9iamVjdCBmaWxlKTwvdHQ+PC9saT4KLSAgIDwvdWw+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdm1raXQvd3d3L3VzZV9tbXRrLmh0bWwgYi92bWtpdC93d3cvdXNlX21tdGsuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkOGJkMi4uMDAwMDAwMAotLS0gYS92bWtpdC93d3cvdXNlX21tdGsuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIKLSAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI+Ci08aHRtbD4KLTxoZWFkPgotICA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotICA8dGl0bGU+Vk1LaXQgLSBHZXR0aW5nIFN0YXJ0ZWQ8L3RpdGxlPgotICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJtZW51LmNzcyIgLz4KLSAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iY29udGVudC5jc3MiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9Im1lbnUuaHRtbC5pbmNsIi0tPgotCi08ZGl2IGlkPSJjb250ZW50Ij4KLQotPGgxPkdldHRpbmcgU3RhcnRlZDogVk1LaXQgYW5kIE1NVGs8L2gxPgotCi0KLTxwPlRoaXMgcGFnZSBnaXZlcyB5b3UgdGhlIGluc3RydWN0aW9ucyBvbiBob3cgdG8gYnVpbGQgVk1LaXQgd2l0aCBhIE1NVGsgZ2FyYmFnZSBjb2xsZWN0b3IuPC9wPgotCi0KLTxvbD4KLSAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cubGx2bS5vcmcvZG9jcy9HQ0NGRUJ1aWxkSW5zdHJzLmh0bWwiPkNoZWNrb3V0Ci0gICAgYW5kIGJ1aWxkIExMVk0tR0NDPC9hPiBmcm9tIFNWTiBoZWFkLjwvbGk+Ci0gIDxsaT4gVXBkYXRlIFBBVEggdG8gaW5jbHVkZSB0aGUgPHR0Pmxsdm0tZ2NjPC90dD4gYmluYXJ5LiA8L2xpPgotICA8bGk+IFJlLWNvbmZpZ3VyZSBMTFZNLiA8L2xpPgotICA8bGk+IENvbmZpZ3VyZSBWTUtpdCB3aXRoIHRocmVlIGFkZGl0aW9uYWwgb3B0aW9uczogPHR0Pi0td2l0aC1nYz1tbXRrPC90dD4sIDx0dD4tLXdpdGgtbGx2bWdjYzwvdHQ+LCBhbmQgPHR0Pi0td2l0aC1tbXRrLXBsYW49e21hcmtzd2VlcHxjb3B5bXN9PC90dD4gPC9saT4KLSAgPGxpPiBCdWlsZCBWTUtpdDo8L2xpPgotICA8dWw+Ci0gICAgPGxpPjx0dD5tYWtlIEVOQUJMRV9PUFRJTUlaRUQ9MSA8L3R0PjwvbGk+Ci0gIDwvdWw+Ci0gIDxsaT5SdW4gVk1LaXQ6PC9saT4KLSAgIDx1bD4KLSAgICAgPGxpPjx0dD5SZWxlYXNlL2Jpbi9qMyBGb28gPC90dD48L2xpPgotICAgPC91bD4KLQotPC9vbD4KLQotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+Cg==