From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id EFC8B40891 for ; Sat, 25 Dec 2021 00:08:06 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id AA40A68B050; Sat, 25 Dec 2021 02:08:03 +0200 (EET) Received: from out0.migadu.com (out0.migadu.com [94.23.1.103]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B2F8F68AFF6 for ; Sat, 25 Dec 2021 02:07:57 +0200 (EET) X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zanevaniperen.com; s=key1; t=1640390876; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=OB0cyJrLHKvvzgTRN4lXtmxLqd6AV92D84qpkqbIkdo=; b=XcNrHmJriZvYj7SagRUSoqcb6gGTJDZzFzAZTl+JLUHGMixWQwM+9nEzITDMsELTqXwIWM fpkSh8yLy+kDEg1HaxOgt/Jzh3TyBhAI4AHyl732Ek/lQpOpvMn9+lc8B6I8aJ50NprvNl YZkar1SQAjLr6nFc9KBJTOzzrVlJRzIO/S/KgefuYEjf38jJIgbJ7HrN+8EjuKLnRPna9j 3opWPZQ2+AD0gNwT4pm2fIVTiRzhtPJFNdDAPGZt/NNtihY648xNys942R35LU4uh+gvr2 2EMwT4kawGX0RfbW7POq2m+INCkb4FkuarloHGmpoeUi1ipuZOrz6C5M6ulnqA== From: Zane van Iperen To: ffmpeg-devel@ffmpeg.org Date: Sat, 25 Dec 2021 10:07:50 +1000 Message-ID: <3075570.A1OQHQNYeR@morningstar> In-Reply-To: <20211221184209.6570-1-pal@sandflow.com> References: <20211221184209.6570-1-pal@sandflow.com> MIME-Version: 1.0 X-Migadu-Flow: FLOW_OUT X-Migadu-Auth-User: zanevaniperen.com Subject: Re: [FFmpeg-devel] [PATCH v14 1/2] avformat/imf: Demuxer X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: TG9va3MgbW9zdGx5IGFscmlnaHQsIGp1c3Qgc29tZSBzdHlsZSBuaXRzLiBPbmNlIHRoZXkncmUg Zml4ZWQsIGxndG0uCgpPbiBXZWRuZXNkYXksIDIyIERlY2VtYmVyIDIwMjEgNDo0MjowOCBBTSBB RVNUIHBhbEBzYW5kZmxvdy5jb20gd3JvdGU6Cgo+ICsKPiAraW50IGZmX2ltZl94bWxfcmVhZF91 dWlkKHhtbE5vZGVQdHIgZWxlbWVudCwgdWludDhfdCB1dWlkWzE2XSkKPiArewo+ICsgICAgeG1s Q2hhciAqZWxlbWVudF90ZXh0ID0gTlVMTDsKPiArICAgIGludCBzY2FuZl9yZXQ7Cj4gKyAgICBp bnQgcmV0ID0gMDsKPiArCj4gKyAgICBlbGVtZW50X3RleHQgPSB4bWxOb2RlTGlzdEdldFN0cmlu ZyhlbGVtZW50LT5kb2MsIGVsZW1lbnQtPnhtbENoaWxkcmVuTm9kZSwgMSk7Cj4gKyAgICBzY2Fu Zl9yZXQgPSBzc2NhbmYoZWxlbWVudF90ZXh0LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIEZG X0lNRl9VVUlEX0ZPUk1BVCwKPiArICAgICAgICAgICAgICAgICAgICAgICAmdXVpZFswXSwKPiAr ICAgICAgICAgICAgICAgICAgICAgICAmdXVpZFsxXSwKPiArICAgICAgICAgICAgICAgICAgICAg ICAmdXVpZFsyXSwKPiArICAgICAgICAgICAgICAgICAgICAgICAmdXVpZFszXSwKPiArICAgICAg ICAgICAgICAgICAgICAgICAmdXVpZFs0XSwKPiArICAgICAgICAgICAgICAgICAgICAgICAmdXVp ZFs1XSwKPiArICAgICAgICAgICAgICAgICAgICAgICAmdXVpZFs2XSwKPiArICAgICAgICAgICAg ICAgICAgICAgICAmdXVpZFs3XSwKPiArICAgICAgICAgICAgICAgICAgICAgICAmdXVpZFs4XSwK PiArICAgICAgICAgICAgICAgICAgICAgICAmdXVpZFs5XSwKPiArICAgICAgICAgICAgICAgICAg ICAgICAmdXVpZFsxMF0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgJnV1aWRbMTFdLAo+ICsg ICAgICAgICAgICAgICAgICAgICAgICZ1dWlkWzEyXSwKPiArICAgICAgICAgICAgICAgICAgICAg ICAmdXVpZFsxM10sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgJnV1aWRbMTRdLAo+ICsgICAg ICAgICAgICAgICAgICAgICAgICZ1dWlkWzE1XSk7CgpJJ20gbm90IHRoZSBiaWdnZXN0IGZhbiBv ZiB0aGlzLCBidXQgaWYgeW91J3JlIGRvaW5nIHRoZSBsaWJ1dWlkIHJlZmFjdG9yaW5nIGFmdGVy d2FyZHMsIHRoZW4gSSdtIGluY2xpbmVkCnRvIGxldCBpdCBiZS4KCj4gK3N0YXRpYyBpbnQgZmls bF9iYXNlX3Jlc291cmNlKHhtbE5vZGVQdHIgcmVzb3VyY2VfZWxlbSwgRkZJTUZCYXNlUmVzb3Vy Y2UgKnJlc291cmNlLCBGRklNRkNQTCAqY3BsKQo+ICt7Cj4gKyAgICB4bWxOb2RlUHRyIGVsZW1l bnQgPSBOVUxMOwo+ICsgICAgaW50IHJldCA9IDA7Cj4gKwo+ICsgICAgLyogcmVhZCBFZGl0UmF0 ZSAqLwo+ICsgICAgaWYgKCEoZWxlbWVudCA9IGZmX2ltZl94bWxfZ2V0X2NoaWxkX2VsZW1lbnRf YnlfbmFtZShyZXNvdXJjZV9lbGVtLCAiRWRpdFJhdGUiKSkpIHsKPiArICAgICAgICByZXNvdXJj ZS0+ZWRpdF9yYXRlID0gY3BsLT5lZGl0X3JhdGU7Cj4gKyAgICB9IGVsc2UgaWYgKHJldCA9IGZm X2ltZl94bWxfcmVhZF9yYXRpb25hbChlbGVtZW50LCAmcmVzb3VyY2UtPmVkaXRfcmF0ZSkpIHsK CldoZW4gZG9pbmcgaW5saW5lIGFzc2lnbm1lbnRzLCB1c2UgYW4gZXh0cmEgKCksIGUuZy4gCmlm ICgocmV0ID0gZmZfaW1mX3htbF9yZWFkX3JhdGlvbmFsKGVsZW1lbnQsICZyZXNvdXJjZS0+ZWRp dF9yYXRlKSkpCgo+ICsgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJJbnZhbGlk IEVkaXRSYXRlIGVsZW1lbnQgZm91bmQgaW4gYSBSZXNvdXJjZVxuIik7Cj4gKyAgICAgICAgcmV0 dXJuIHJldDsKPiArICAgIH0KPiArCj4gKyAgICAvKiByZWFkIEVudHJ5UG9pbnQgKi8KPiArICAg IGlmIChlbGVtZW50ID0gZmZfaW1mX3htbF9nZXRfY2hpbGRfZWxlbWVudF9ieV9uYW1lKHJlc291 cmNlX2VsZW0sICJFbnRyeVBvaW50IikpIHsKPiArICAgICAgICBpZiAocmV0ID0gZmZfaW1mX3ht bF9yZWFkX3VpbnQzMihlbGVtZW50LCAmcmVzb3VyY2UtPmVudHJ5X3BvaW50KSkgewoKKCkKCj4g KyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIEVudHJ5UG9p bnQgZWxlbWVudCBmb3VuZCBpbiBhIFJlc291cmNlXG4iKTsKPiArICAgICAgICAgICAgcmV0dXJu IHJldDsKPiArICAgICAgICB9Cj4gKyAgICB9IGVsc2Ugewo+ICsgICAgICAgIHJlc291cmNlLT5l bnRyeV9wb2ludCA9IDA7Cj4gKyAgICB9Cj4gKwo+ICsgICAgLyogcmVhZCBJbnRyaW5zaWNEdXJh dGlvbiAqLwo+ICsgICAgaWYgKCEoZWxlbWVudCA9IGZmX2ltZl94bWxfZ2V0X2NoaWxkX2VsZW1l bnRfYnlfbmFtZShyZXNvdXJjZV9lbGVtLCAiSW50cmluc2ljRHVyYXRpb24iKSkpIHsKPiArICAg ICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiSW50cmluc2ljRHVyYXRpb24gZWxlbWVu dCBtaXNzaW5nIGZyb20gUmVzb3VyY2VcbiIpOwo+ICsgICAgICAgIHJldHVybiBBVkVSUk9SX0lO VkFMSUREQVRBOwo+ICsgICAgfQo+ICsgICAgaWYgKHJldCA9IGZmX2ltZl94bWxfcmVhZF91aW50 MzIoZWxlbWVudCwgJnJlc291cmNlLT5kdXJhdGlvbikpIHsKCigpCgo+ICsgICAgICAgIGF2X2xv ZyhOVUxMLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIEludHJpbnNpY0R1cmF0aW9uIGVsZW1lbnQg Zm91bmQgaW4gYSBSZXNvdXJjZVxuIik7Cj4gKyAgICAgICAgcmV0dXJuIHJldDsKPiArICAgIH0K PiArICAgIHJlc291cmNlLT5kdXJhdGlvbiAtPSByZXNvdXJjZS0+ZW50cnlfcG9pbnQ7Cj4gKwo+ ICsgICAgLyogcmVhZCBTb3VyY2VEdXJhdGlvbiAqLwo+ICsgICAgaWYgKGVsZW1lbnQgPSBmZl9p bWZfeG1sX2dldF9jaGlsZF9lbGVtZW50X2J5X25hbWUocmVzb3VyY2VfZWxlbSwgIlNvdXJjZUR1 cmF0aW9uIikpIHsKCigpCgo+ICsgICAgICAgIGlmIChyZXQgPSBmZl9pbWZfeG1sX3JlYWRfdWlu dDMyKGVsZW1lbnQsICZyZXNvdXJjZS0+ZHVyYXRpb24pKSB7CgooKQoKPiArICAgICAgICAgICAg YXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlNvdXJjZUR1cmF0aW9uIGVsZW1lbnQgbWlzc2lu ZyBmcm9tIFJlc291cmNlXG4iKTsKPiArICAgICAgICAgICAgcmV0dXJuIHJldDsKPiArICAgICAg ICB9Cj4gKyAgICB9Cj4gKwo+ICsgICAgLyogcmVhZCBSZXBlYXRDb3VudCAqLwo+ICsgICAgaWYg KGVsZW1lbnQgPSBmZl9pbWZfeG1sX2dldF9jaGlsZF9lbGVtZW50X2J5X25hbWUocmVzb3VyY2Vf ZWxlbSwgIlJlcGVhdENvdW50IikpCgooKQoKPiArICAgICAgICByZXQgPSBmZl9pbWZfeG1sX3Jl YWRfdWludDMyKGVsZW1lbnQsICZyZXNvdXJjZS0+cmVwZWF0X2NvdW50KTsKPiArCj4gKyAgICBy ZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGZpbGxfdHJhY2tmaWxlX3Jlc291cmNl KHhtbE5vZGVQdHIgdGZfcmVzb3VyY2VfZWxlbSwKPiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBGRklNRlRyYWNrRmlsZVJlc291cmNlICp0Zl9yZXNvdXJjZSwKPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRklNRkNQTCAqY3BsKQo+ICt7Cj4gKyAgICB4 bWxOb2RlUHRyIGVsZW1lbnQgPSBOVUxMOwo+ICsgICAgaW50IHJldCA9IDA7Cj4gKwo+ICsgICAg aWYgKHJldCA9IGZpbGxfYmFzZV9yZXNvdXJjZSh0Zl9yZXNvdXJjZV9lbGVtLCAoRkZJTUZCYXNl UmVzb3VyY2UgKil0Zl9yZXNvdXJjZSwgY3BsKSkKCigpCgo+ICsgICAgICAgIHJldHVybiByZXQ7 Cj4gKwo+ICsgICAgLyogcmVhZCBUcmFja0ZpbGVJZCAqLwo+ICsgICAgaWYgKGVsZW1lbnQgPSBm Zl9pbWZfeG1sX2dldF9jaGlsZF9lbGVtZW50X2J5X25hbWUodGZfcmVzb3VyY2VfZWxlbSwgIlRy YWNrRmlsZUlkIikpIHsKPiArICAgICAgICBpZiAocmV0ID0gZmZfaW1mX3htbF9yZWFkX3V1aWQo ZWxlbWVudCwgdGZfcmVzb3VyY2UtPnRyYWNrX2ZpbGVfdXVpZCkpIHsKCigpCgo+ICsgICAgICAg ICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBUcmFja0ZpbGVJZCBlbGVt ZW50IGZvdW5kIGluIFJlc291cmNlXG4iKTsKPiArICAgICAgICAgICAgcmV0dXJuIHJldDsKPiAr ICAgICAgICB9Cj4gKyAgICB9IGVsc2Ugewo+ICsgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0df RVJST1IsICJUcmFja0ZpbGVJZCBlbGVtZW50IG1pc3NpbmcgZnJvbSBSZXNvdXJjZVxuIik7Cj4g KyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Cj4gKyAgICB9Cj4gKwo+ICsgICAg cmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGludCBmaWxsX21hcmtlcl9yZXNvdXJjZSh4 bWxOb2RlUHRyIG1hcmtlcl9yZXNvdXJjZV9lbGVtLAo+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIEZGSU1GTWFya2VyUmVzb3VyY2UgKm1hcmtlcl9yZXNvdXJjZSwKPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBGRklNRkNQTCAqY3BsKQo+ICt7Cj4gKyAgICB4bWxO b2RlUHRyIGVsZW1lbnQgPSBOVUxMOwo+ICsgICAgaW50IHJldCA9IDA7Cj4gKwo+ICsgICAgaWYg KHJldCA9IGZpbGxfYmFzZV9yZXNvdXJjZShtYXJrZXJfcmVzb3VyY2VfZWxlbSwgKEZGSU1GQmFz ZVJlc291cmNlICopbWFya2VyX3Jlc291cmNlLCBjcGwpKQo+ICsgICAgICAgIHJldHVybiByZXQ7 Cj4gKwo+ICsgICAgLyogcmVhZCBtYXJrZXJzICovCj4gKyAgICBlbGVtZW50ID0geG1sRmlyc3RF bGVtZW50Q2hpbGQobWFya2VyX3Jlc291cmNlX2VsZW0pOwo+ICsgICAgd2hpbGUgKGVsZW1lbnQp IHsKPiArICAgICAgICBpZiAoeG1sU3RyY21wKGVsZW1lbnQtPm5hbWUsICJNYXJrZXIiKSA9PSAw KSB7Cj4gKyAgICAgICAgICAgIHZvaWQgKnRtcDsKPiArCj4gKyAgICAgICAgICAgIGlmIChtYXJr ZXJfcmVzb3VyY2UtPm1hcmtlcl9jb3VudCA9PSBVSU5UMzJfTUFYKQo+ICsgICAgICAgICAgICAg ICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKPiArICAgICAgICAgICAgdG1wID0gYXZfcmVhbGxv Y19hcnJheShtYXJrZXJfcmVzb3VyY2UtPm1hcmtlcnMsCj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgbWFya2VyX3Jlc291cmNlLT5tYXJrZXJfY291bnQgKyAxLAo+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGRklNRk1hcmtlcikpOwo+ICsg ICAgICAgICAgICBpZiAoIXRtcCkKPiArICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVO T01FTSk7Cj4gKyAgICAgICAgICAgIG1hcmtlcl9yZXNvdXJjZS0+bWFya2VycyA9IHRtcDsKPiAr Cj4gKyAgICAgICAgICAgIGltZl9tYXJrZXJfaW5pdCgmbWFya2VyX3Jlc291cmNlLT5tYXJrZXJz W21hcmtlcl9yZXNvdXJjZS0+bWFya2VyX2NvdW50XSk7Cj4gKyAgICAgICAgICAgIHJldCA9IGZp bGxfbWFya2VyKGVsZW1lbnQsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXJr ZXJfcmVzb3VyY2UtPm1hcmtlcnNbbWFya2VyX3Jlc291cmNlLT5tYXJrZXJfY291bnRdKTsKPiAr ICAgICAgICAgICAgbWFya2VyX3Jlc291cmNlLT5tYXJrZXJfY291bnQrKzsKPiArICAgICAgICAg ICAgaWYgKHJldCkKPiArICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gKyAgICAgICAgfQo+ ICsKPiArICAgICAgICBlbGVtZW50ID0geG1sTmV4dEVsZW1lbnRTaWJsaW5nKGVsZW1lbnQpOwo+ ICsgICAgfQo+ICsKPiArICAgIHJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgcHVz aF9tYXJrZXJfc2VxdWVuY2UoeG1sTm9kZVB0ciBtYXJrZXJfc2VxdWVuY2VfZWxlbSwgRkZJTUZD UEwgKmNwbCkKPiArewo+ICsgICAgaW50IHJldCA9IDA7Cj4gKyAgICB1aW50OF90IHV1aWRbMTZd Owo+ICsgICAgeG1sTm9kZVB0ciByZXNvdXJjZV9saXN0X2VsZW0gPSBOVUxMOwo+ICsgICAgeG1s Tm9kZVB0ciByZXNvdXJjZV9lbGVtID0gTlVMTDsKPiArICAgIHhtbE5vZGVQdHIgdHJhY2tfaWRf ZWxlbSA9IE5VTEw7Cj4gKyAgICB1bnNpZ25lZCBsb25nIHJlc291cmNlX2VsZW1fY291bnQ7Cj4g KyAgICB2b2lkICp0bXA7Cj4gKwo+ICsgICAgLyogcmVhZCBUcmFja0lEIGVsZW1lbnQgKi8KPiAr ICAgIGlmICghKHRyYWNrX2lkX2VsZW0gPSBmZl9pbWZfeG1sX2dldF9jaGlsZF9lbGVtZW50X2J5 X25hbWUobWFya2VyX3NlcXVlbmNlX2VsZW0sICJUcmFja0lkIikpKSB7Cj4gKyAgICAgICAgYXZf bG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlRyYWNrSWQgZWxlbWVudCBtaXNzaW5nIGZyb20gU2Vx dWVuY2VcbiIpOwo+ICsgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwo+ICsgICAg fQo+ICsgICAgaWYgKHJldCA9IGZmX2ltZl94bWxfcmVhZF91dWlkKHRyYWNrX2lkX2VsZW0sIHV1 aWQpKSB7CgooKQpPciBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzbid0IGFjdHVhbGx5IHVzZWQsIGp1 c3QgcmVtb3ZlIHRoZSBhc3NpZ25tZW50LgoKPiArICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9H X0VSUk9SLCAiSW52YWxpZCBUcmFja0lkIGVsZW1lbnQgZm91bmQgaW4gU2VxdWVuY2VcbiIpOwo+ ICsgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwo+ICsgICAgfQo+ICsgICAgYXZf bG9nKE5VTEwsCj4gKyAgICAgICAgICAgQVZfTE9HX0RFQlVHLAo+ICsgICAgICAgICAgICJQcm9j ZXNzaW5nIElNRiBDUEwgTWFya2VyIFNlcXVlbmNlIGZvciBWaXJ0dWFsIFRyYWNrICIgRkZfSU1G X1VVSURfRk9STUFUICJcbiIsCj4gKyAgICAgICAgICAgVUlEX0FSRyh1dWlkKSk7Cj4gKwo+ICsg ICAgLyogY3JlYXRlIG1haW4gbWFya2VyIHZpcnR1YWwgdHJhY2sgaWYgaXQgZG9lcyBub3QgZXhp c3QgKi8KPiArICAgIGlmICghY3BsLT5tYWluX21hcmtlcnNfdHJhY2spIHsKPiArICAgICAgICBj cGwtPm1haW5fbWFya2Vyc190cmFjayA9IGF2X21hbGxvYyhzaXplb2YoRkZJTUZNYXJrZXJWaXJ0 dWFsVHJhY2spKTsKPiArICAgICAgICBpZiAoIWNwbC0+bWFpbl9tYXJrZXJzX3RyYWNrKQo+ICsg ICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwo+ICsgICAgICAgIGltZl9tYXJrZXJf dmlydHVhbF90cmFja19pbml0KGNwbC0+bWFpbl9tYXJrZXJzX3RyYWNrKTsKPiArICAgICAgICBt ZW1jcHkoY3BsLT5tYWluX21hcmtlcnNfdHJhY2stPmJhc2UuaWRfdXVpZCwgdXVpZCwgc2l6ZW9m KHV1aWQpKTsKPiArCj4gKyAgICB9IGVsc2UgaWYgKG1lbWNtcChjcGwtPm1haW5fbWFya2Vyc190 cmFjay0+YmFzZS5pZF91dWlkLCB1dWlkLCBzaXplb2YodXVpZCkpICE9IDApIHsKPiArICAgICAg ICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiTXVsdGlwbGUgbWFya2VyIHZpcnR1YWwgdHJh Y2tzIHdlcmUgZm91bmRcbiIpOwo+ICsgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRB Owo+ICsgICAgfQo+ICsKPiArICAgIC8qIHByb2Nlc3MgcmVzb3VyY2VzICovCj4gKyAgICByZXNv dXJjZV9saXN0X2VsZW0gPSBmZl9pbWZfeG1sX2dldF9jaGlsZF9lbGVtZW50X2J5X25hbWUobWFy a2VyX3NlcXVlbmNlX2VsZW0sICJSZXNvdXJjZUxpc3QiKTsKPiArICAgIGlmICghcmVzb3VyY2Vf bGlzdF9lbGVtKQo+ICsgICAgICAgIHJldHVybiAwOwo+ICsKPiArICAgIHJlc291cmNlX2VsZW1f Y291bnQgPSB4bWxDaGlsZEVsZW1lbnRDb3VudChyZXNvdXJjZV9saXN0X2VsZW0pOwo+ICsgICAg aWYgKHJlc291cmNlX2VsZW1fY291bnQgPiBVSU5UMzJfTUFYCj4gKyAgICAgICAgfHwgY3BsLT5t YWluX21hcmtlcnNfdHJhY2stPnJlc291cmNlX2NvdW50ID4gVUlOVDMyX01BWCAtIHJlc291cmNl X2VsZW1fY291bnQpCj4gKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKPiArICAgIHRt cCA9IGF2X3JlYWxsb2NfYXJyYXkoY3BsLT5tYWluX21hcmtlcnNfdHJhY2stPnJlc291cmNlcywK PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BsLT5tYWluX21hcmtlcnNfdHJhY2stPnJl c291cmNlX2NvdW50ICsgcmVzb3VyY2VfZWxlbV9jb3VudCwKPiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgc2l6ZW9mKEZGSU1GTWFya2VyUmVzb3VyY2UpKTsKPiArICAgIGlmICghdG1wKSB7 Cj4gKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBhbGxvY2F0ZSBN YXJrZXIgUmVzb3VyY2VzXG4iKTsKPiArICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwo+ ICsgICAgfQo+ICsgICAgY3BsLT5tYWluX21hcmtlcnNfdHJhY2stPnJlc291cmNlcyA9IHRtcDsK PiArCj4gKyAgICByZXNvdXJjZV9lbGVtID0geG1sRmlyc3RFbGVtZW50Q2hpbGQocmVzb3VyY2Vf bGlzdF9lbGVtKTsKPiArICAgIHdoaWxlIChyZXNvdXJjZV9lbGVtKSB7Cj4gKyAgICAgICAgaW1m X21hcmtlcl9yZXNvdXJjZV9pbml0KCZjcGwtPm1haW5fbWFya2Vyc190cmFjay0+cmVzb3VyY2Vz W2NwbC0+bWFpbl9tYXJrZXJzX3RyYWNrLT5yZXNvdXJjZV9jb3VudF0pOwo+ICsgICAgICAgIHJl dCA9IGZpbGxfbWFya2VyX3Jlc291cmNlKHJlc291cmNlX2VsZW0sCj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgJmNwbC0+bWFpbl9tYXJrZXJzX3RyYWNrLT5yZXNvdXJjZXNb Y3BsLT5tYWluX21hcmtlcnNfdHJhY2stPnJlc291cmNlX2NvdW50XSwKPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBjcGwpOwo+ICsgICAgICAgIGNwbC0+bWFpbl9tYXJrZXJz X3RyYWNrLT5yZXNvdXJjZV9jb3VudCsrOwo+ICsgICAgICAgIGlmIChyZXQpCj4gKyAgICAgICAg ICAgIHJldHVybiByZXQ7Cj4gKwo+ICsgICAgICAgIHJlc291cmNlX2VsZW0gPSB4bWxOZXh0RWxl bWVudFNpYmxpbmcocmVzb3VyY2VfZWxlbSk7Cj4gKyAgICB9Cj4gKwo+ICsgICAgcmV0dXJuIHJl dDsKPiArfQo+ICsKPiArc3RhdGljIGludCBoYXNfc3RlcmVvX3Jlc291cmNlcyh4bWxOb2RlUHRy IGVsZW1lbnQpCj4gK3sKPiArICAgIGlmICh4bWxTdHJjbXAoZWxlbWVudC0+bmFtZSwgIkxlZnQi KSA9PSAwIHx8IHhtbFN0cmNtcChlbGVtZW50LT5uYW1lLCAiUmlnaHQiKSA9PSAwKQo+ICsgICAg ICAgIHJldHVybiAxOwo+ICsKPiArICAgIGVsZW1lbnQgPSB4bWxGaXJzdEVsZW1lbnRDaGlsZChl bGVtZW50KTsKPiArICAgIHdoaWxlIChlbGVtZW50KSB7Cj4gKyAgICAgICAgaWYgKGhhc19zdGVy ZW9fcmVzb3VyY2VzKGVsZW1lbnQpKQo+ICsgICAgICAgICAgICByZXR1cm4gMTsKPiArCj4gKyAg ICAgICAgZWxlbWVudCA9IHhtbE5leHRFbGVtZW50U2libGluZyhlbGVtZW50KTsKPiArICAgIH0K PiArCj4gKyAgICByZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBwdXNoX21haW5fYXVk aW9fc2VxdWVuY2UoeG1sTm9kZVB0ciBhdWRpb19zZXF1ZW5jZV9lbGVtLCBGRklNRkNQTCAqY3Bs KQo+ICt7Cj4gKyAgICBpbnQgcmV0ID0gMDsKPiArICAgIHVpbnQ4X3QgdXVpZFsxNl07Cj4gKyAg ICB4bWxOb2RlUHRyIHJlc291cmNlX2xpc3RfZWxlbSA9IE5VTEw7Cj4gKyAgICB4bWxOb2RlUHRy IHJlc291cmNlX2VsZW0gPSBOVUxMOwo+ICsgICAgeG1sTm9kZVB0ciB0cmFja19pZF9lbGVtID0g TlVMTDsKPiArICAgIHVuc2lnbmVkIGxvbmcgcmVzb3VyY2VfZWxlbV9jb3VudDsKPiArICAgIEZG SU1GVHJhY2tGaWxlVmlydHVhbFRyYWNrICp2dCA9IE5VTEw7Cj4gKyAgICB2b2lkICp0bXA7Cj4g Kwo+ICsgICAgLyogcmVhZCBUcmFja0lEIGVsZW1lbnQgKi8KPiArICAgIGlmICghKHRyYWNrX2lk X2VsZW0gPSBmZl9pbWZfeG1sX2dldF9jaGlsZF9lbGVtZW50X2J5X25hbWUoYXVkaW9fc2VxdWVu Y2VfZWxlbSwgIlRyYWNrSWQiKSkpIHsKPiArICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VS Uk9SLCAiVHJhY2tJZCBlbGVtZW50IG1pc3NpbmcgZnJvbSBhdWRpbyBzZXF1ZW5jZVxuIik7Cj4g KyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Cj4gKyAgICB9Cj4gKyAgICBpZiAo cmV0ID0gZmZfaW1mX3htbF9yZWFkX3V1aWQodHJhY2tfaWRfZWxlbSwgdXVpZCkpIHsKCigpCgo+ ICsgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIFRyYWNrSWQgZWxl bWVudCBmb3VuZCBpbiBhdWRpbyBzZXF1ZW5jZVxuIik7Cj4gKyAgICAgICAgcmV0dXJuIHJldDsK PiArICAgIH0KPiArICAgIGF2X2xvZyhOVUxMLAo+ICsgICAgICAgICAgIEFWX0xPR19ERUJVRywK PiArICAgICAgICAgICAiUHJvY2Vzc2luZyBJTUYgQ1BMIEF1ZGlvIFNlcXVlbmNlIGZvciBWaXJ0 dWFsIFRyYWNrICIgRkZfSU1GX1VVSURfRk9STUFUICJcbiIsCj4gKyAgICAgICAgICAgVUlEX0FS Ryh1dWlkKSk7Cj4gKwo+ICsgICAgLyogZ2V0IHRoZSBtYWluIGF1ZGlvIHZpcnR1YWwgdHJhY2sg Y29ycmVzcG9uZGluZyB0byB0aGUgc2VxdWVuY2UgKi8KPiArICAgIGZvciAodWludDMyX3QgaSA9 IDA7IGkgPCBjcGwtPm1haW5fYXVkaW9fdHJhY2tfY291bnQ7IGkrKykgewo+ICsgICAgICAgIGlm IChtZW1jbXAoY3BsLT5tYWluX2F1ZGlvX3RyYWNrc1tpXS5iYXNlLmlkX3V1aWQsIHV1aWQsIHNp emVvZih1dWlkKSkgPT0gMCkgewo+ICsgICAgICAgICAgICB2dCA9ICZjcGwtPm1haW5fYXVkaW9f dHJhY2tzW2ldOwo+ICsgICAgICAgICAgICBicmVhazsKPiArICAgICAgICB9Cj4gKyAgICB9Cj4g Kwo+ICsgICAgLyogY3JlYXRlIGEgbWFpbiBhdWRpbyB2aXJ0dWFsIHRyYWNrIGlmIG5vbmUgZXhp c3RzIGZvciB0aGUgc2VxdWVuY2UgKi8KPiArICAgIGlmICghdnQpIHsKPiArICAgICAgICBpZiAo Y3BsLT5tYWluX2F1ZGlvX3RyYWNrX2NvdW50ID09IFVJTlQzMl9NQVgpCj4gKyAgICAgICAgICAg IHJldHVybiBBVkVSUk9SKEVOT01FTSk7Cj4gKyAgICAgICAgdG1wID0gYXZfcmVhbGxvY19hcnJh eShjcGwtPm1haW5fYXVkaW9fdHJhY2tzLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgY3BsLT5tYWluX2F1ZGlvX3RyYWNrX2NvdW50ICsgMSwKPiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHNpemVvZihGRklNRlRyYWNrRmlsZVZpcnR1YWxUcmFjaykpOwo+ICsgICAg ICAgIGlmICghdG1wKQo+ICsgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwo+ICsK PiArICAgICAgICBjcGwtPm1haW5fYXVkaW9fdHJhY2tzID0gdG1wOwo+ICsgICAgICAgIHZ0ID0g JmNwbC0+bWFpbl9hdWRpb190cmFja3NbY3BsLT5tYWluX2F1ZGlvX3RyYWNrX2NvdW50XTsKPiAr ICAgICAgICBpbWZfdHJhY2tmaWxlX3ZpcnR1YWxfdHJhY2tfaW5pdCh2dCk7Cj4gKyAgICAgICAg Y3BsLT5tYWluX2F1ZGlvX3RyYWNrX2NvdW50Kys7Cj4gKyAgICAgICAgbWVtY3B5KHZ0LT5iYXNl LmlkX3V1aWQsIHV1aWQsIHNpemVvZih1dWlkKSk7Cj4gKyAgICB9Cj4gKwo+ICsgICAgLyogcHJv Y2VzcyByZXNvdXJjZXMgKi8KPiArICAgIHJlc291cmNlX2xpc3RfZWxlbSA9IGZmX2ltZl94bWxf Z2V0X2NoaWxkX2VsZW1lbnRfYnlfbmFtZShhdWRpb19zZXF1ZW5jZV9lbGVtLCAiUmVzb3VyY2VM aXN0Iik7Cj4gKyAgICBpZiAoIXJlc291cmNlX2xpc3RfZWxlbSkKPiArICAgICAgICByZXR1cm4g MDsKPiArCj4gKyAgICByZXNvdXJjZV9lbGVtX2NvdW50ID0geG1sQ2hpbGRFbGVtZW50Q291bnQo cmVzb3VyY2VfbGlzdF9lbGVtKTsKPiArICAgIGlmIChyZXNvdXJjZV9lbGVtX2NvdW50ID4gVUlO VDMyX01BWAo+ICsgICAgICAgIHx8IHZ0LT5yZXNvdXJjZV9jb3VudCA+IFVJTlQzMl9NQVggLSBy ZXNvdXJjZV9lbGVtX2NvdW50KQo+ICsgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Cj4g KyAgICB0bXAgPSBhdl9mYXN0X3JlYWxsb2ModnQtPnJlc291cmNlcywKPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAmdnQtPnJlc291cmNlc19hbGxvY19zeiwKPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAodnQtPnJlc291cmNlX2NvdW50ICsgcmVzb3VyY2VfZWxlbV9jb3VudCkKPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoRkZJTUZUcmFja0ZpbGVSZXNv dXJjZSkpOwo+ICsgICAgaWYgKCF0bXApIHsKPiArICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9H X0VSUk9SLCAiQ2Fubm90IGFsbG9jYXRlIE1haW4gQXVkaW8gUmVzb3VyY2VzXG4iKTsKPiArICAg ICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwo+ICsgICAgfQo+ICsgICAgdnQtPnJlc291cmNl cyA9IHRtcDsKPiArCj4gKyAgICByZXNvdXJjZV9lbGVtID0geG1sRmlyc3RFbGVtZW50Q2hpbGQo cmVzb3VyY2VfbGlzdF9lbGVtKTsKPiArICAgIHdoaWxlIChyZXNvdXJjZV9lbGVtKSB7Cj4gKyAg ICAgICAgaW1mX3RyYWNrZmlsZV9yZXNvdXJjZV9pbml0KCZ2dC0+cmVzb3VyY2VzW3Z0LT5yZXNv dXJjZV9jb3VudF0pOwo+ICsgICAgICAgIHJldCA9IGZpbGxfdHJhY2tmaWxlX3Jlc291cmNlKHJl c291cmNlX2VsZW0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZ0 LT5yZXNvdXJjZXNbdnQtPnJlc291cmNlX2NvdW50XSwKPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBjcGwpOwo+ICsgICAgICAgIHZ0LT5yZXNvdXJjZV9jb3VudCsrOwo+ ICsgICAgICAgIGlmIChyZXQpIHsKPiArICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19F UlJPUiwgIkludmFsaWQgUmVzb3VyY2VcbiIpOwo+ICsgICAgICAgICAgICBjb250aW51ZTsKPiAr ICAgICAgICB9Cj4gKwo+ICsgICAgICAgIHJlc291cmNlX2VsZW0gPSB4bWxOZXh0RWxlbWVudFNp YmxpbmcocmVzb3VyY2VfZWxlbSk7Cj4gKyAgICB9Cj4gKwo+ICsgICAgcmV0dXJuIHJldDsKPiAr fQo+ICsKPiArc3RhdGljIGludCBwdXNoX21haW5faW1hZ2VfMmRfc2VxdWVuY2UoeG1sTm9kZVB0 ciBpbWFnZV9zZXF1ZW5jZV9lbGVtLCBGRklNRkNQTCAqY3BsKQo+ICt7Cj4gKyAgICBpbnQgcmV0 ID0gMDsKPiArICAgIHVpbnQ4X3QgdXVpZFsxNl07Cj4gKyAgICB4bWxOb2RlUHRyIHJlc291cmNl X2xpc3RfZWxlbSA9IE5VTEw7Cj4gKyAgICB4bWxOb2RlUHRyIHJlc291cmNlX2VsZW0gPSBOVUxM Owo+ICsgICAgeG1sTm9kZVB0ciB0cmFja19pZF9lbGVtID0gTlVMTDsKPiArICAgIHZvaWQgKnRt cDsKPiArICAgIHVuc2lnbmVkIGxvbmcgcmVzb3VyY2VfZWxlbV9jb3VudDsKPiArCj4gKyAgICAv KiBza2lwIHN0ZXJlb3Njb3BpYyByZXNvdXJjZXMgKi8KPiArICAgIGlmIChoYXNfc3RlcmVvX3Jl c291cmNlcyhpbWFnZV9zZXF1ZW5jZV9lbGVtKSkgewo+ICsgICAgICAgIGF2X2xvZyhOVUxMLCBB Vl9MT0dfRVJST1IsICJTdGVyZW9zY29waWMgM0QgaW1hZ2UgdmlydHVhbCB0cmFja3Mgbm90IHN1 cHBvcnRlZFxuIik7Cj4gKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwo+ICsg ICAgfQo+ICsKPiArICAgIC8qIHJlYWQgVHJhY2tJZCBlbGVtZW50Ki8KCk5pdDogTWlzc2luZyBh IHNwYWNlLgoKPiArICAgIGlmICghKHRyYWNrX2lkX2VsZW0gPSBmZl9pbWZfeG1sX2dldF9jaGls ZF9lbGVtZW50X2J5X25hbWUoaW1hZ2Vfc2VxdWVuY2VfZWxlbSwgIlRyYWNrSWQiKSkpIHsKPiAr ICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiVHJhY2tJZCBlbGVtZW50IG1pc3Np bmcgZnJvbSBhdWRpbyBzZXF1ZW5jZVxuIik7Cj4gKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5W QUxJRERBVEE7Cj4gKyAgICB9Cj4gKyAgICBpZiAocmV0ID0gZmZfaW1mX3htbF9yZWFkX3V1aWQo dHJhY2tfaWRfZWxlbSwgdXVpZCkpIHsKPiArICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VS Uk9SLCAiSW52YWxpZCBUcmFja0lkIGVsZW1lbnQgZm91bmQgaW4gYXVkaW8gc2VxdWVuY2VcbiIp Owo+ICsgICAgICAgIHJldHVybiByZXQ7Cj4gKyAgICB9Cj4gKwoKKCkKCj4gKyAgICAvKiBjcmVh dGUgbWFpbiBpbWFnZSB2aXJ0dWFsIHRyYWNrIGlmIG9uZSBkb2VzIG5vdCBleGlzdCAqLwo+ICsg ICAgaWYgKCFjcGwtPm1haW5faW1hZ2VfMmRfdHJhY2spIHsKPiArICAgICAgICBjcGwtPm1haW5f aW1hZ2VfMmRfdHJhY2sgPSBhdl9tYWxsb2Moc2l6ZW9mKEZGSU1GVHJhY2tGaWxlVmlydHVhbFRy YWNrKSk7Cj4gKyAgICAgICAgaWYgKCFjcGwtPm1haW5faW1hZ2VfMmRfdHJhY2spCj4gKyAgICAg ICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Cj4gKyAgICAgICAgaW1mX3RyYWNrZmlsZV92 aXJ0dWFsX3RyYWNrX2luaXQoY3BsLT5tYWluX2ltYWdlXzJkX3RyYWNrKTsKPiArICAgICAgICBt ZW1jcHkoY3BsLT5tYWluX2ltYWdlXzJkX3RyYWNrLT5iYXNlLmlkX3V1aWQsIHV1aWQsIHNpemVv Zih1dWlkKSk7Cj4gKwo+ICsgICAgfSBlbHNlIGlmIChtZW1jbXAoY3BsLT5tYWluX2ltYWdlXzJk X3RyYWNrLT5iYXNlLmlkX3V1aWQsIHV1aWQsIHNpemVvZih1dWlkKSkgIT0gMCkgewo+ICsgICAg ICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJNdWx0aXBsZSBNYWluSW1hZ2UgdmlydHVh bCB0cmFja3MgZm91bmRcbiIpOwo+ICsgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRB Owo+ICsgICAgfQo+ICsgICAgYXZfbG9nKE5VTEwsCj4gKyAgICAgICAgICAgQVZfTE9HX0RFQlVH LAo+ICsgICAgICAgICAgICJQcm9jZXNzaW5nIElNRiBDUEwgTWFpbiBJbWFnZSBTZXF1ZW5jZSBm b3IgVmlydHVhbCBUcmFjayAiIEZGX0lNRl9VVUlEX0ZPUk1BVCAiXG4iLAo+ICsgICAgICAgICAg IFVJRF9BUkcodXVpZCkpOwo+ICsKPiArICAgIC8qIHByb2Nlc3MgcmVzb3VyY2VzICovCj4gKyAg ICByZXNvdXJjZV9saXN0X2VsZW0gPSBmZl9pbWZfeG1sX2dldF9jaGlsZF9lbGVtZW50X2J5X25h bWUoaW1hZ2Vfc2VxdWVuY2VfZWxlbSwgIlJlc291cmNlTGlzdCIpOwo+ICsgICAgaWYgKCFyZXNv dXJjZV9saXN0X2VsZW0pCj4gKyAgICAgICAgcmV0dXJuIDA7Cj4gKwo+ICsgICAgcmVzb3VyY2Vf ZWxlbV9jb3VudCA9IHhtbENoaWxkRWxlbWVudENvdW50KHJlc291cmNlX2xpc3RfZWxlbSk7Cj4g KyAgICBpZiAocmVzb3VyY2VfZWxlbV9jb3VudCA+IFVJTlQzMl9NQVgKPiArICAgICAgICB8fCBj cGwtPm1haW5faW1hZ2VfMmRfdHJhY2stPnJlc291cmNlX2NvdW50ID4gVUlOVDMyX01BWCAtIHJl c291cmNlX2VsZW1fY291bnQKPiArICAgICAgICB8fCAoY3BsLT5tYWluX2ltYWdlXzJkX3RyYWNr LT5yZXNvdXJjZV9jb3VudCArIHJlc291cmNlX2VsZW1fY291bnQpCj4gKyAgICAgICAgICAgID4g SU5UX01BWCAvIHNpemVvZihGRklNRlRyYWNrRmlsZVJlc291cmNlKSkKPiArICAgICAgICByZXR1 cm4gQVZFUlJPUihFTk9NRU0pOwo+ICsgICAgdG1wID0gYXZfZmFzdF9yZWFsbG9jKGNwbC0+bWFp bl9pbWFnZV8yZF90cmFjay0+cmVzb3VyY2VzLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICZjcGwtPm1haW5faW1hZ2VfMmRfdHJhY2stPnJlc291cmNlc19hbGxvY19zeiwKPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAoY3BsLT5tYWluX2ltYWdlXzJkX3RyYWNrLT5yZXNvdXJjZV9j b3VudCArIHJlc291cmNlX2VsZW1fY291bnQpCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICogc2l6ZW9mKEZGSU1GVHJhY2tGaWxlUmVzb3VyY2UpKTsKPiArICAgIGlmICghdG1wKSB7 Cj4gKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBhbGxvY2F0ZSBN YWluIEltYWdlIFJlc291cmNlc1xuIik7Cj4gKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVN KTsKPiArICAgIH0KPiArICAgIGNwbC0+bWFpbl9pbWFnZV8yZF90cmFjay0+cmVzb3VyY2VzID0g dG1wOwo+ICsKPiArICAgIHJlc291cmNlX2VsZW0gPSB4bWxGaXJzdEVsZW1lbnRDaGlsZChyZXNv dXJjZV9saXN0X2VsZW0pOwo+ICsgICAgd2hpbGUgKHJlc291cmNlX2VsZW0pIHsKPiArICAgICAg ICBpbWZfdHJhY2tmaWxlX3Jlc291cmNlX2luaXQoCj4gKyAgICAgICAgICAgICZjcGwtPm1haW5f aW1hZ2VfMmRfdHJhY2stPnJlc291cmNlc1tjcGwtPm1haW5faW1hZ2VfMmRfdHJhY2stPnJlc291 cmNlX2NvdW50XSk7Cj4gKyAgICAgICAgcmV0ID0gZmlsbF90cmFja2ZpbGVfcmVzb3VyY2UocmVz b3VyY2VfZWxlbSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3Bs LT5tYWluX2ltYWdlXzJkX3RyYWNrLT5yZXNvdXJjZXNbY3BsLT5tYWluX2ltYWdlXzJkX3RyYWNr LT5yZXNvdXJjZV9jb3VudF0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgY3BsKTsKPiArICAgICAgICBjcGwtPm1haW5faW1hZ2VfMmRfdHJhY2stPnJlc291cmNlX2Nv dW50Kys7Cj4gKyAgICAgICAgaWYgKHJldCkgewo+ICsgICAgICAgICAgICBhdl9sb2coTlVMTCwg QVZfTE9HX0VSUk9SLCAiSW52YWxpZCBSZXNvdXJjZVxuIik7Cj4gKyAgICAgICAgICAgIGNvbnRp bnVlOwo+ICsgICAgICAgIH0KPiArCj4gKyAgICAgICAgcmVzb3VyY2VfZWxlbSA9IHhtbE5leHRF bGVtZW50U2libGluZyhyZXNvdXJjZV9lbGVtKTsKPiArICAgIH0KPiArCj4gKyAgICByZXR1cm4g MDsKPiArfQo+ICsKPiArc3RhdGljIGludCBmaWxsX3ZpcnR1YWxfdHJhY2tzKHhtbE5vZGVQdHIg Y3BsX2VsZW1lbnQsIEZGSU1GQ1BMICpjcGwpCj4gK3sKPiArICAgIGludCByZXQgPSAwOwo+ICsg ICAgeG1sTm9kZVB0ciBzZWdtZW50X2xpc3RfZWxlbSA9IE5VTEw7Cj4gKyAgICB4bWxOb2RlUHRy IHNlZ21lbnRfZWxlbSA9IE5VTEw7Cj4gKyAgICB4bWxOb2RlUHRyIHNlcXVlbmNlX2xpc3RfZWxl bSA9IE5VTEw7Cj4gKyAgICB4bWxOb2RlUHRyIHNlcXVlbmNlX2VsZW0gPSBOVUxMOwo+ICsKPiAr ICAgIGlmICghKHNlZ21lbnRfbGlzdF9lbGVtID0gZmZfaW1mX3htbF9nZXRfY2hpbGRfZWxlbWVu dF9ieV9uYW1lKGNwbF9lbGVtZW50LCAiU2VnbWVudExpc3QiKSkpIHsKPiArICAgICAgICBhdl9s b2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiU2VnbWVudExpc3QgZWxlbWVudCBtaXNzaW5nXG4iKTsK PiArICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKPiArICAgIH0KPiArCj4gKyAg ICAvKiBwcm9jZXNzIHNlcXVlbmNlcyAqLwo+ICsgICAgc2VnbWVudF9lbGVtID0geG1sRmlyc3RF bGVtZW50Q2hpbGQoc2VnbWVudF9saXN0X2VsZW0pOwo+ICsgICAgd2hpbGUgKHNlZ21lbnRfZWxl bSkgewo+ICsgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICJQcm9jZXNzaW5nIElN RiBDUEwgU2VnbWVudFxuIik7Cj4gKwo+ICsgICAgICAgIHNlcXVlbmNlX2xpc3RfZWxlbSA9IGZm X2ltZl94bWxfZ2V0X2NoaWxkX2VsZW1lbnRfYnlfbmFtZShzZWdtZW50X2VsZW0sICJTZXF1ZW5j ZUxpc3QiKTsKPiArICAgICAgICBpZiAoIXNlZ21lbnRfbGlzdF9lbGVtKQo+ICsgICAgICAgICAg ICBjb250aW51ZTsKPiArCj4gKyAgICAgICAgc2VxdWVuY2VfZWxlbSA9IHhtbEZpcnN0RWxlbWVu dENoaWxkKHNlcXVlbmNlX2xpc3RfZWxlbSk7Cj4gKyAgICAgICAgd2hpbGUgKHNlcXVlbmNlX2Vs ZW0pIHsKPiArICAgICAgICAgICAgaWYgKHhtbFN0cmNtcChzZXF1ZW5jZV9lbGVtLT5uYW1lLCAi TWFya2VyU2VxdWVuY2UiKSA9PSAwKQo+ICsgICAgICAgICAgICAgICAgcmV0ID0gcHVzaF9tYXJr ZXJfc2VxdWVuY2Uoc2VxdWVuY2VfZWxlbSwgY3BsKTsKPiArCj4gKyAgICAgICAgICAgIGVsc2Ug aWYgKHhtbFN0cmNtcChzZXF1ZW5jZV9lbGVtLT5uYW1lLCAiTWFpbkltYWdlU2VxdWVuY2UiKSA9 PSAwKQo+ICsgICAgICAgICAgICAgICAgcmV0ID0gcHVzaF9tYWluX2ltYWdlXzJkX3NlcXVlbmNl KHNlcXVlbmNlX2VsZW0sIGNwbCk7Cj4gKwo+ICsgICAgICAgICAgICBlbHNlIGlmICh4bWxTdHJj bXAoc2VxdWVuY2VfZWxlbS0+bmFtZSwgIk1haW5BdWRpb1NlcXVlbmNlIikgPT0gMCkKPiArICAg ICAgICAgICAgICAgIHJldCA9IHB1c2hfbWFpbl9hdWRpb19zZXF1ZW5jZShzZXF1ZW5jZV9lbGVt LCBjcGwpOwo+ICsKPiArICAgICAgICAgICAgZWxzZQo+ICsgICAgICAgICAgICAgICAgYXZfbG9n KE5VTEwsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgQVZfTE9HX0lORk8sCj4gKyAgICAgICAg ICAgICAgICAgICAgICAgIlRoZSBmb2xsb3dpbmcgU2VxdWVuY2UgaXMgbm90IHN1cHBvcnRlZCBh bmQgaXMgaWdub3JlZDogJXNcbiIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2Vf ZWxlbS0+bmFtZSk7Cj4gKwo+ICsgICAgICAgICAgICAvKiBhYm9ydCBwYXJzaW5nIG9ubHkgaWYg bWVtb3J5IGVycm9yIG9jY3VycmVkICovCj4gKyAgICAgICAgICAgIGlmIChyZXQgPT0gQVZFUlJP UihFTk9NRU0pKQo+ICsgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKPiArCj4gKyAgICAgICAg ICAgIHNlcXVlbmNlX2VsZW0gPSB4bWxOZXh0RWxlbWVudFNpYmxpbmcoc2VxdWVuY2VfZWxlbSk7 Cj4gKyAgICAgICAgfQo+ICsKPiArICAgICAgICBzZWdtZW50X2VsZW0gPSB4bWxOZXh0RWxlbWVu dFNpYmxpbmcoc2VnbWVudF9lbGVtKTsKPiArICAgIH0KPiArCj4gKyAgICByZXR1cm4gcmV0Owo+ ICt9Cj4gKwo+ICtpbnQgZmZfaW1mX3BhcnNlX2NwbF9mcm9tX3htbF9kb20oeG1sRG9jUHRyIGRv YywgRkZJTUZDUEwgKipjcGwpCj4gK3sKPiArICAgIGludCByZXQgPSAwOwo+ICsgICAgeG1sTm9k ZVB0ciBjcGxfZWxlbWVudCA9IE5VTEw7Cj4gKwo+ICsgICAgKmNwbCA9IGZmX2ltZl9jcGxfYWxs b2MoKTsKPiArICAgIGlmICghKmNwbCkgewo+ICsgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVN KTsKPiArICAgICAgICBnb3RvIGNsZWFudXA7Cj4gKyAgICB9Cj4gKwo+ICsgICAgY3BsX2VsZW1l bnQgPSB4bWxEb2NHZXRSb290RWxlbWVudChkb2MpOwo+ICsgICAgaWYgKHhtbFN0cmNtcChjcGxf ZWxlbWVudC0+bmFtZSwgIkNvbXBvc2l0aW9uUGxheWxpc3QiKSkgewo+ICsgICAgICAgIGF2X2xv ZyhOVUxMLCBBVl9MT0dfRVJST1IsICJUaGUgcm9vdCBlbGVtZW50IG9mIHRoZSBDUEwgaXMgbm90 IENvbXBvc2l0aW9uUGxheWxpc3RcbiIpOwo+ICsgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJ RERBVEE7Cj4gKyAgICAgICAgZ290byBjbGVhbnVwOwo+ICsgICAgfQo+ICsKPiArICAgIGlmIChy ZXQgPSBmaWxsX2NvbnRlbnRfdGl0bGUoY3BsX2VsZW1lbnQsICpjcGwpKQo+ICsgICAgICAgIGdv dG8gY2xlYW51cDsKPiArICAgIGlmIChyZXQgPSBmaWxsX2lkKGNwbF9lbGVtZW50LCAqY3BsKSkK PiArICAgICAgICBnb3RvIGNsZWFudXA7Cj4gKyAgICBpZiAocmV0ID0gZmlsbF9lZGl0X3JhdGUo Y3BsX2VsZW1lbnQsICpjcGwpKQo+ICsgICAgICAgIGdvdG8gY2xlYW51cDsKPiArICAgIGlmIChy ZXQgPSBmaWxsX3ZpcnR1YWxfdHJhY2tzKGNwbF9lbGVtZW50LCAqY3BsKSkKPiArICAgICAgICBn b3RvIGNsZWFudXA7Cj4gKwo+ICtjbGVhbnVwOgo+ICsgICAgaWYgKCpjcGwgJiYgcmV0KSB7Cj4g KyAgICAgICAgZmZfaW1mX2NwbF9mcmVlKCpjcGwpOwo+ICsgICAgICAgICpjcGwgPSBOVUxMOwo+ ICsgICAgfQo+ICsgICAgcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaW1mX21h cmtlcl9mcmVlKEZGSU1GTWFya2VyICptYXJrZXIpCj4gK3sKPiArICAgIGlmICghbWFya2VyKQo+ ICsgICAgICAgIHJldHVybjsKPiArICAgIHhtbEZyZWUobWFya2VyLT5sYWJlbF91dGY4KTsKPiAr ICAgIHhtbEZyZWUobWFya2VyLT5zY29wZV91dGY4KTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQg aW1mX21hcmtlcl9yZXNvdXJjZV9mcmVlKEZGSU1GTWFya2VyUmVzb3VyY2UgKnJzcmMpCj4gK3sK PiArICAgIGlmICghcnNyYykKPiArICAgICAgICByZXR1cm47Cj4gKyAgICBmb3IgKHVpbnQzMl90 IGkgPSAwOyBpIDwgcnNyYy0+bWFya2VyX2NvdW50OyBpKyspCj4gKyAgICAgICAgaW1mX21hcmtl cl9mcmVlKCZyc3JjLT5tYXJrZXJzW2ldKTsKPiArICAgIGF2X2ZyZWVwKCZyc3JjLT5tYXJrZXJz KTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaW1mX21hcmtlcl92aXJ0dWFsX3RyYWNrX2ZyZWUo RkZJTUZNYXJrZXJWaXJ0dWFsVHJhY2sgKnZ0KQo+ICt7Cj4gKyAgICBpZiAoIXZ0KQo+ICsgICAg ICAgIHJldHVybjsKPiArICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB2dC0+cmVzb3VyY2Vf Y291bnQ7IGkrKykKPiArICAgICAgICBpbWZfbWFya2VyX3Jlc291cmNlX2ZyZWUoJnZ0LT5yZXNv dXJjZXNbaV0pOwo+ICsgICAgYXZfZnJlZXAoJnZ0LT5yZXNvdXJjZXMpOwo+ICt9Cj4gKwo+ICtz dGF0aWMgdm9pZCBpbWZfdHJhY2tmaWxlX3ZpcnR1YWxfdHJhY2tfZnJlZShGRklNRlRyYWNrRmls ZVZpcnR1YWxUcmFjayAqdnQpCj4gK3sKPiArICAgIGlmICghdnQpCj4gKyAgICAgICAgcmV0dXJu Owo+ICsgICAgYXZfZnJlZXAoJnZ0LT5yZXNvdXJjZXMpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9p ZCBpbWZfY3BsX2luaXQoRkZJTUZDUEwgKmNwbCkKPiArewo+ICsgICAgbWVtc2V0KGNwbC0+aWRf dXVpZCwgMCwgc2l6ZW9mKGNwbC0+aWRfdXVpZCkpOwo+ICsgICAgY3BsLT5jb250ZW50X3RpdGxl X3V0ZjggPSBOVUxMOwo+ICsgICAgY3BsLT5lZGl0X3JhdGUgPSBhdl9tYWtlX3EoMCwgMSk7Cj4g KyAgICBjcGwtPm1haW5fbWFya2Vyc190cmFjayA9IE5VTEw7Cj4gKyAgICBjcGwtPm1haW5faW1h Z2VfMmRfdHJhY2sgPSBOVUxMOwo+ICsgICAgY3BsLT5tYWluX2F1ZGlvX3RyYWNrX2NvdW50ID0g MDsKPiArICAgIGNwbC0+bWFpbl9hdWRpb190cmFja3MgPSBOVUxMOwo+ICt9Cj4gKwo+ICtGRklN RkNQTCAqZmZfaW1mX2NwbF9hbGxvYyh2b2lkKQo+ICt7Cj4gKyAgICBGRklNRkNQTCAqY3BsOwo+ ICsKPiArICAgIGNwbCA9IGF2X21hbGxvYyhzaXplb2YoRkZJTUZDUEwpKTsKPiArICAgIGlmICgh Y3BsKQo+ICsgICAgICAgIHJldHVybiBOVUxMOwo+ICsgICAgaW1mX2NwbF9pbml0KGNwbCk7Cj4g KyAgICByZXR1cm4gY3BsOwo+ICt9Cj4gKwo+ICt2b2lkIGZmX2ltZl9jcGxfZnJlZShGRklNRkNQ TCAqY3BsKQo+ICt7Cj4gKyAgICBpZiAoIWNwbCkKPiArICAgICAgICByZXR1cm47Cj4gKwo+ICsg ICAgeG1sRnJlZShjcGwtPmNvbnRlbnRfdGl0bGVfdXRmOCk7Cj4gKwo+ICsgICAgaW1mX21hcmtl cl92aXJ0dWFsX3RyYWNrX2ZyZWUoY3BsLT5tYWluX21hcmtlcnNfdHJhY2spOwo+ICsKPiArICAg IGlmIChjcGwtPm1haW5fbWFya2Vyc190cmFjaykKPiArICAgICAgICBhdl9mcmVlcCgmY3BsLT5t YWluX21hcmtlcnNfdHJhY2spOwo+ICsKPiArICAgIGltZl90cmFja2ZpbGVfdmlydHVhbF90cmFj a19mcmVlKGNwbC0+bWFpbl9pbWFnZV8yZF90cmFjayk7Cj4gKwo+ICsgICAgaWYgKGNwbC0+bWFp bl9pbWFnZV8yZF90cmFjaykKPiArICAgICAgICBhdl9mcmVlcCgmY3BsLT5tYWluX2ltYWdlXzJk X3RyYWNrKTsKPiArCj4gKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY3BsLT5tYWluX2F1 ZGlvX3RyYWNrX2NvdW50OyBpKyspCj4gKyAgICAgICAgaW1mX3RyYWNrZmlsZV92aXJ0dWFsX3Ry YWNrX2ZyZWUoJmNwbC0+bWFpbl9hdWRpb190cmFja3NbaV0pOwo+ICsKPiArICAgIGlmIChjcGwt Pm1haW5fYXVkaW9fdHJhY2tzKQo+ICsgICAgICAgIGF2X2ZyZWVwKCZjcGwtPm1haW5fYXVkaW9f dHJhY2tzKTsKPiArCj4gKyAgICBhdl9mcmVlcCgmY3BsKTsKPiArfQo+ICsKPiAraW50IGZmX2lt Zl9wYXJzZV9jcGwoQVZJT0NvbnRleHQgKmluLCBGRklNRkNQTCAqKmNwbCkKPiArewo+ICsgICAg QVZCUHJpbnQgYnVmOwo+ICsgICAgeG1sRG9jICpkb2MgPSBOVUxMOwo+ICsgICAgaW50IHJldCA9 IDA7Cj4gKyAgICBpbnQ2NF90IGZpbGVzaXplID0gMDsKPiArCj4gKyAgICBmaWxlc2l6ZSA9IGF2 aW9fc2l6ZShpbik7Cj4gKyAgICBmaWxlc2l6ZSA9IGZpbGVzaXplID4gMCA/IGZpbGVzaXplIDog ODE5MjsKPiArICAgIGF2X2JwcmludF9pbml0KCZidWYsIGZpbGVzaXplICsgMSwgQVZfQlBSSU5U X1NJWkVfVU5MSU1JVEVEKTsKPiArICAgIHJldCA9IGF2aW9fcmVhZF90b19icHJpbnQoaW4sICZi dWYsIFVJTlRfTUFYIC0gMSk7Cj4gKyAgICBpZiAocmV0IDwgMCB8fCAhYXZpb19mZW9mKGluKSB8 fCBidWYubGVuID09IDApIHsKPiArICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAi Q2Fubm90IHJlYWQgSU1GIENQTFxuIik7Cj4gKyAgICAgICAgaWYgKHJldCA9PSAwKQo+ICsgICAg ICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOwo+ICsgICAgfSBlbHNlIHsKPiArICAg ICAgICBMSUJYTUxfVEVTVF9WRVJTSU9OCj4gKwo+ICsgICAgICAgIGZpbGVzaXplID0gYnVmLmxl bjsKPiArICAgICAgICBkb2MgPSB4bWxSZWFkTWVtb3J5KGJ1Zi5zdHIsIGZpbGVzaXplLCBOVUxM LCBOVUxMLCAwKTsKPiArICAgICAgICBpZiAoIWRvYykgewo+ICsgICAgICAgICAgICBhdl9sb2co TlVMTCwKPiArICAgICAgICAgICAgICAgICAgIEFWX0xPR19FUlJPUiwKPiArICAgICAgICAgICAg ICAgICAgICJYTUwgcGFyc2luZyBmYWlsZWQgd2hlbiByZWFkaW5nIHRoZSBJTUYgQ1BMXG4iKTsK PiArICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKPiArICAgICAgICB9Cj4g Kwo+ICsgICAgICAgIGlmIChyZXQgPSBmZl9pbWZfcGFyc2VfY3BsX2Zyb21feG1sX2RvbShkb2Ms IGNwbCkpIHsKCigpCgo+ICsgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAi Q2Fubm90IHBhcnNlIElNRiBDUExcbiIpOwo+ICsgICAgICAgIH0gZWxzZSB7Cj4gKyAgICAgICAg ICAgIGF2X2xvZyhOVUxMLAo+ICsgICAgICAgICAgICAgICAgICAgQVZfTE9HX0lORk8sCj4gKyAg ICAgICAgICAgICAgICAgICAiSU1GIENQTCBDb250ZW50VGl0bGU6ICVzXG4iLAo+ICsgICAgICAg ICAgICAgICAgICAgKCpjcGwpLT5jb250ZW50X3RpdGxlX3V0ZjgpOwo+ICsgICAgICAgICAgICBh dl9sb2coTlVMTCwKPiArICAgICAgICAgICAgICAgICAgIEFWX0xPR19JTkZPLAo+ICsgICAgICAg ICAgICAgICAgICAgIklNRiBDUEwgSWQ6ICIgRkZfSU1GX1VVSURfRk9STUFUICJcbiIsCj4gKyAg ICAgICAgICAgICAgICAgICBVSURfQVJHKCgqY3BsKS0+aWRfdXVpZCkpOwo+ICsgICAgICAgIH0K PiArCj4gKyAgICAgICAgeG1sRnJlZURvYyhkb2MpOwo+ICsgICAgfQo+ICsKPiArICAgIGF2X2Jw cmludF9maW5hbGl6ZSgmYnVmLCBOVUxMKTsKPiArCj4gKyAgICByZXR1cm4gcmV0Owo+ICt9Cj4g ZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2ltZmRlYy5jIGIvbGliYXZmb3JtYXQvaW1mZGVjLmMK PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAwMDAuLjYxNGJmNmFiMWYKPiAt LS0gL2Rldi9udWxsCj4gKysrIGIvbGliYXZmb3JtYXQvaW1mZGVjLmMKPiBAQCAtMCwwICsxLDg5 OSBAQAo+ICsvKgo+ICsgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCj4gKyAqCj4gKyAq IEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IK PiArICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFs IFB1YmxpYwo+ICsgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG b3VuZGF0aW9uOyBlaXRoZXIKPiArICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChh dCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCj4gKyAqCj4gKyAqIEZGbXBlZyBpcyBk aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAo+ICsgKiBidXQg V0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBv Zgo+ICsgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP U0UuICBTZWUgdGhlIEdOVQo+ICsgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig bW9yZSBkZXRhaWxzLgo+ICsgKgo+ICsgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5 IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCj4gKyAqIExpY2Vuc2UgYWxvbmcgd2l0 aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKPiArICogRm91bmRh dGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAw MjExMC0xMzAxIFVTQQo+ICsgKi8KPiArCj4gKy8qCj4gKyAqCj4gKyAqIENvcHlyaWdodCAoYykg U2FuZGZsb3cgQ29uc3VsdGluZyBMTEMKPiArICoKPiArICogUmVkaXN0cmlidXRpb24gYW5kIHVz ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cj4gKyAqIG1vZGlm aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0 aW9ucyBhcmUgbWV0Ogo+ICsgKgo+ICsgKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwo+ICsgKiAgIGxp c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgo+ICsgKiAqIFJl ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w eXJpZ2h0IG5vdGljZSwKPiArICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCj4gKyAqICAgYW5kL29yIG90 aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCj4gKyAqCj4gKyAq IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBD T05UUklCVVRPUlMgIkFTIElTIgo+ICsgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCj4gKyAqIElNUExJRUQg V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB UiBQVVJQT1NFCj4gKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09Q WVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUKPiArICogTElBQkxFIEZPUiBBTlkgRElS RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgo+ICsgKiBD T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D VVJFTUVOVCBPRgo+ICsgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKPiArICogSU5URVJSVVBUSU9OKSBIT1dF VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KPiAr ICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdF TkNFIE9SIE9USEVSV0lTRSkKPiArICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKPiArICogUE9TU0lCSUxJ VFkgT0YgU1VDSCBEQU1BR0UuCj4gKyAqLwo+ICsKPiArLyoqCj4gKyAqIERlbXV4ZXMgYW4gSU1G IENvbXBvc2l0aW9uCj4gKyAqCj4gKyAqIFJlZmVyZW5jZXMKPiArICogT1YgMjA2Ny0wOjIwMTgg LSBTTVBURSBPdmVydmlldyBEb2N1bWVudCAtIEludGVyb3BlcmFibGUgTWFzdGVyIEZvcm1hdAo+ ICsgKiBTVCAyMDY3LTI6MjAyMCAtIFNNUFRFIFN0YW5kYXJkIC0gSW50ZXJvcGVyYWJsZSBNYXN0 ZXIgRm9ybWF0IOKAlCBDb3JlIENvbnN0cmFpbnRzCj4gKyAqIFNUIDIwNjctMzoyMDIwIC0gU01Q VEUgU3RhbmRhcmQgLSBJbnRlcm9wZXJhYmxlIE1hc3RlciBGb3JtYXQg4oCUIENvbXBvc2l0aW9u IFBsYXlsaXN0Cj4gKyAqIFNUIDIwNjctNToyMDIwIC0gU01QVEUgU3RhbmRhcmQgLSBJbnRlcm9w ZXJhYmxlIE1hc3RlciBGb3JtYXQg4oCUIEVzc2VuY2UgQ29tcG9uZW50Cj4gKyAqIFNUIDIwNjct MjA6MjAxNiAtIFNNUFRFIFN0YW5kYXJkIC0gSW50ZXJvcGVyYWJsZSBNYXN0ZXIgRm9ybWF0IOKA lCBBcHBsaWNhdGlvbiAjMgo+ICsgKiBTVCAyMDY3LTIxOjIwMjAgLSBTTVBURSBTdGFuZGFyZCAt IEludGVyb3BlcmFibGUgTWFzdGVyIEZvcm1hdCDigJQgQXBwbGljYXRpb24gIzIgRXh0ZW5kZWQK PiArICogU1QgMjA2Ny0xMDI6MjAxNyAtIFNNUFRFIFN0YW5kYXJkIC0gSW50ZXJvcGVyYWJsZSBN YXN0ZXIgRm9ybWF0IOKAlCBDb21tb24gSW1hZ2UgUGl4ZWwgQ29sb3IgU2NoZW1lcwo+ICsgKiBT VCA0MjktOToyMDA3IC0gU01QVEUgU3RhbmRhcmQgLSBELUNpbmVtYSBQYWNrYWdpbmcg4oCUIEFz c2V0IE1hcHBpbmcgYW5kIEZpbGUgU2VnbWVudGF0aW9uCj4gKyAqCj4gKyAqIEBhdXRob3IgTWFy Yy1BbnRvaW5lIEFybmF1ZAo+ICsgKiBAYXV0aG9yIFZhbGVudGluIE5vZWwKPiArICogQGF1dGhv ciBOaWNob2xhcyBWYW5kZXJ6d2V0Cj4gKyAqIEBmaWxlCj4gKyAqIEBpbmdyb3VwIGxhdnVfaW1m Cj4gKyAqLwo+ICsKPiArI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKPiArI2luY2x1ZGUgImlt Zi5oIgo+ICsjaW5jbHVkZSAiaW50ZXJuYWwuaCIKPiArI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0 cmluZy5oIgo+ICsjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgo+ICsjaW5jbHVkZSAibGli YXZ1dGlsL29wdC5oIgo+ICsjaW5jbHVkZSAibXhmLmgiCj4gKyNpbmNsdWRlICJ1cmwuaCIKPiAr I2luY2x1ZGUgPGludHR5cGVzLmg+Cj4gKyNpbmNsdWRlIDxsaWJ4bWwvcGFyc2VyLmg+Cj4gKwo+ ICsjZGVmaW5lIE1BWF9CUFJJTlRfUkVBRF9TSVpFIChVSU5UX01BWCAtIDEpCj4gKyNkZWZpbmUg REVGQVVMVF9BU1NFVE1BUF9TSVpFIDggKiAxMDI0Cj4gKyNkZWZpbmUgQVZSQVRJT05BTF9GT1JN QVQgIiVkLyVkIgo+ICsjZGVmaW5lIEFWUkFUSU9OQUxfQVJHKHJhdGlvbmFsKSByYXRpb25hbC5u dW0sIHJhdGlvbmFsLmRlbgo+ICsKPiArLyoqCj4gKyAqIElNRiBBc3NldCBsb2NhdG9yCj4gKyAq Lwo+ICt0eXBlZGVmIHN0cnVjdCBJTUZBc3NldExvY2F0b3Igewo+ICsgICAgRkZJTUZVVUlEIHV1 aWQ7Cj4gKyAgICBjaGFyICphYnNvbHV0ZV91cmk7Cj4gK30gSU1GQXNzZXRMb2NhdG9yOwo+ICsK PiArLyoqCj4gKyAqIElNRiBBc3NldCBsb2NhdG9yIG1hcAo+ICsgKiBSZXN1bHRzIGZyb20gdGhl IHBhcnNpbmcgb2Ygb25lIG9yIG1vcmUgQVNTRVRNQVAgWE1MIGZpbGVzCj4gKyAqLwo+ICt0eXBl ZGVmIHN0cnVjdCBJTUZBc3NldExvY2F0b3JNYXAgewo+ICsgICAgdWludDMyX3QgYXNzZXRfY291 bnQ7Cj4gKyAgICBJTUZBc3NldExvY2F0b3IgKmFzc2V0czsKPiArfSBJTUZBc3NldExvY2F0b3JN YXA7Cj4gKwo+ICt0eXBlZGVmIHN0cnVjdCBJTUZWaXJ0dWFsVHJhY2tSZXNvdXJjZVBsYXliYWNr Q3R4IHsKPiArICAgIElNRkFzc2V0TG9jYXRvciAqbG9jYXRvcjsKPiArICAgIEZGSU1GVHJhY2tG aWxlUmVzb3VyY2UgKnJlc291cmNlOwo+ICsgICAgQVZGb3JtYXRDb250ZXh0ICpjdHg7Cj4gK30g SU1GVmlydHVhbFRyYWNrUmVzb3VyY2VQbGF5YmFja0N0eDsKPiArCj4gK3R5cGVkZWYgc3RydWN0 IElNRlZpcnR1YWxUcmFja1BsYXliYWNrQ3R4IHsKPiArICAgIGludDMyX3QgaW5kZXg7ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFjayBpbmRleCBpbiBwbGF5bGlzdCAq Lwo+ICsgICAgQVZSYXRpb25hbCBjdXJyZW50X3RpbWVzdGFtcDsgICAgICAgICAgICAgICAgICAv Kio8IEN1cnJlbnQgdGVtcG9yYWwgcG9zaXRpb24gKi8KPiArICAgIEFWUmF0aW9uYWwgZHVyYXRp b247ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBPdmVyYWxsIGR1cmF0aW9uICovCj4g KyAgICB1aW50MzJfdCByZXNvdXJjZV9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwg TnVtYmVyIG9mIHJlc291cmNlcyAqLwo+ICsgICAgdW5zaWduZWQgaW50IHJlc291cmNlc19hbGxv Y19zejsgICAgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIGJ1ZmZlciBob2xkaW5nIHRoZSBy ZXNvdXJjZSAqLwo+ICsgICAgSU1GVmlydHVhbFRyYWNrUmVzb3VyY2VQbGF5YmFja0N0eCAqcmVz b3VyY2VzOyAvKio8IEJ1ZmZlciBob2xkaW5nIHRoZSByZXNvdXJjZXMgKi8KPiArICAgIHVpbnQz Ml90IGN1cnJlbnRfcmVzb3VyY2VfaW5kZXg7ICAgICAgICAgICAgICAgLyoqPCBDdXJyZW50IHJl c291cmNlICovCj4gKyAgICBpbnQ2NF90IGxhc3RfcHRzOyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIC8qKjwgTGFzdCB0aW1lc3RhbXAgKi8KPiArfSBJTUZWaXJ0dWFsVHJhY2tQbGF5YmFj a0N0eDsKPiArCj4gK3R5cGVkZWYgc3RydWN0IElNRkNvbnRleHQgewo+ICsgICAgY29uc3QgQVZD bGFzcyAqY2xhc3M7Cj4gKyAgICBjb25zdCBjaGFyICpiYXNlX3VybDsKPiArICAgIGNoYXIgKmFz c2V0X21hcF9wYXRoczsKPiArICAgIEFWSU9JbnRlcnJ1cHRDQiAqaW50ZXJydXB0X2NhbGxiYWNr Owo+ICsgICAgQVZEaWN0aW9uYXJ5ICphdmlvX29wdHM7Cj4gKyAgICBGRklNRkNQTCAqY3BsOwo+ ICsgICAgSU1GQXNzZXRMb2NhdG9yTWFwIGFzc2V0X2xvY2F0b3JfbWFwOwo+ICsgICAgdWludDMy X3QgdHJhY2tfY291bnQ7Cj4gKyAgICBJTUZWaXJ0dWFsVHJhY2tQbGF5YmFja0N0eCAqKnRyYWNr czsKPiArfSBJTUZDb250ZXh0Owo+ICsKPiArc3RhdGljIGludCBpbWZfdXJpX2lzX3VybChjb25z dCBjaGFyICpzdHJpbmcpCj4gK3sKPiArICAgIHJldHVybiBzdHJzdHIoc3RyaW5nLCAiOi8vIikg IT0gTlVMTDsKPiArfQo+ICsKPiArc3RhdGljIGludCBpbWZfdXJpX2lzX3VuaXhfYWJzX3BhdGgo Y29uc3QgY2hhciAqc3RyaW5nKQo+ICt7Cj4gKyAgICByZXR1cm4gc3RyaW5nWzBdID09ICcvJzsK PiArfQo+ICsKPiArc3RhdGljIGludCBpbWZfdXJpX2lzX2Rvc19hYnNfcGF0aChjb25zdCBjaGFy ICpzdHJpbmcpCj4gK3sKPiArICAgIC8qIEFic29sdXRlIHBhdGggY2FzZTogYEM6XHBhdGhcdG9c c29td2hlcmVgICovCj4gKyAgICBpZiAoc3RyaW5nWzFdID09ICc6JyAmJiBzdHJpbmdbMl0gPT0g J1xcJykKPiArICAgICAgICByZXR1cm4gMTsKPiArCj4gKyAgICAvKiBBYnNvbHV0ZSBwYXRoIGNh c2U6IGBDOi9wYXRoL3RvL3NvbXdoZXJlYCAqLwo+ICsgICAgaWYgKHN0cmluZ1sxXSA9PSAnOicg JiYgc3RyaW5nWzJdID09ICcvJykKPiArICAgICAgICByZXR1cm4gMTsKPiArCj4gKyAgICAvKiBO ZXR3b3JrIHBhdGggY2FzZTogYFxccGF0aFx0b1xzb213aGVyZWAgKi8KPiArICAgIGlmIChzdHJp bmdbMF0gPT0gJ1xcJyAmJiBzdHJpbmdbMV0gPT0gJ1xcJykKPiArICAgICAgICByZXR1cm4gMTsK PiArCj4gKyAgICByZXR1cm4gMDsKPiArfQo+ICsKPiArLyoqCj4gKyAqIFBhcnNlIGEgQVNTRVRN QVAgWE1MIGZpbGUgdG8gZXh0cmFjdCB0aGUgVVVJRC1VUkkgbWFwcGluZyBvZiBhc3NldHMuCj4g KyAqIEBwYXJhbSBzIHRoZSBjdXJyZW50IGZvcm1hdCBjb250ZXh0LCBpZiBhbnkgKGNhbiBiZSBO VUxMKS4KPiArICogQHBhcmFtIGRvYyB0aGUgWE1MIGRvY3VtZW50IHRvIGJlIHBhcnNlZC4KPiAr ICogQHBhcmFtIGFzc2V0X21hcCBwb2ludGVyIG9uIHRoZSBJTUZBc3NldExvY2F0b3JNYXAgdG8g ZmlsbC4KPiArICogQHBhcmFtIGJhc2VfdXJsIHRoZSB1cmwgb2YgdGhlIGFzc2V0IG1hcCBYTUwg ZmlsZSwgaWYgYW55IChjYW4gYmUgTlVMTCkuCj4gKyAqIEByZXR1cm4gYSBuZWdhdGl2ZSB2YWx1 ZSBpbiBjYXNlIG9mIGVycm9yLCAwIG90aGVyd2lzZS4KPiArICovCj4gK3N0YXRpYyBpbnQgcGFy c2VfaW1mX2Fzc2V0X21hcF9mcm9tX3htbF9kb20oQVZGb3JtYXRDb250ZXh0ICpzLAo+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbERvY1B0ciBkb2MsCj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1GQXNzZXRMb2Nh dG9yTWFwICphc3NldF9tYXAsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgY29uc3QgY2hhciAqYmFzZV91cmwpCj4gK3sKPiArICAgIHhtbE5vZGVQdHIgYXNz ZXRfbWFwX2VsZW1lbnQgPSBOVUxMOwo+ICsgICAgeG1sTm9kZVB0ciBub2RlID0gTlVMTDsKPiAr ICAgIHhtbE5vZGVQdHIgYXNzZXRfZWxlbWVudCA9IE5VTEw7Cj4gKyAgICB1bnNpZ25lZCBsb25n IGVsZW1fY291bnQ7Cj4gKyAgICBjaGFyICp1cmk7Cj4gKyAgICBpbnQgcmV0ID0gMDsKPiArICAg IElNRkFzc2V0TG9jYXRvciAqYXNzZXQgPSBOVUxMOwo+ICsgICAgdm9pZCAqdG1wOwo+ICsKPiAr ICAgIGFzc2V0X21hcF9lbGVtZW50ID0geG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jKTsKPiArCj4g KyAgICBpZiAoIWFzc2V0X21hcF9lbGVtZW50KSB7Cj4gKyAgICAgICAgYXZfbG9nKHMsIEFWX0xP R19FUlJPUiwgIlVuYWJsZSB0byBwYXJzZSBhc3NldCBtYXAgWE1MIC0gbWlzc2luZyByb290IG5v ZGVcbiIpOwo+ICsgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwo+ICsgICAgfQo+ ICsKPiArICAgIGlmIChhc3NldF9tYXBfZWxlbWVudC0+dHlwZSAhPSBYTUxfRUxFTUVOVF9OT0RF IHx8IGF2X3N0cmNhc2VjbXAoYXNzZXRfbWFwX2VsZW1lbnQtPm5hbWUsICJBc3NldE1hcCIpKSB7 Cj4gKyAgICAgICAgYXZfbG9nKHMsCj4gKyAgICAgICAgICAgICAgIEFWX0xPR19FUlJPUiwKPiAr ICAgICAgICAgICAgICAgIlVuYWJsZSB0byBwYXJzZSBhc3NldCBtYXAgWE1MIC0gd3Jvbmcgcm9v dCBub2RlIG5hbWVbJXNdIHR5cGVbJWRdXG4iLAo+ICsgICAgICAgICAgICAgICBhc3NldF9tYXBf ZWxlbWVudC0+bmFtZSwKPiArICAgICAgICAgICAgICAgKGludClhc3NldF9tYXBfZWxlbWVudC0+ dHlwZSk7Cj4gKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Cj4gKyAgICB9Cj4g Kwo+ICsgICAgLyogcGFyc2UgYXNzZXQgbG9jYXRvcnMgKi8KPiArICAgIGlmICghKG5vZGUgPSBm Zl9pbWZfeG1sX2dldF9jaGlsZF9lbGVtZW50X2J5X25hbWUoYXNzZXRfbWFwX2VsZW1lbnQsICJB c3NldExpc3QiKSkpIHsKPiArICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5hYmxl IHRvIHBhcnNlIGFzc2V0IG1hcCBYTUwgLSBtaXNzaW5nIEFzc2V0TGlzdCBub2RlXG4iKTsKPiAr ICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKPiArICAgIH0KPiArICAgIGVsZW1f Y291bnQgPSB4bWxDaGlsZEVsZW1lbnRDb3VudChub2RlKTsKPiArICAgIGlmIChlbGVtX2NvdW50 ID4gVUlOVDMyX01BWAo+ICsgICAgICAgIHx8IGFzc2V0X21hcC0+YXNzZXRfY291bnQgPiBVSU5U MzJfTUFYIC0gZWxlbV9jb3VudCkKPiArICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwo+ ICsgICAgdG1wID0gYXZfcmVhbGxvY19hcnJheShhc3NldF9tYXAtPmFzc2V0cywKPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgZWxlbV9jb3VudCArIGFzc2V0X21hcC0+YXNzZXRfY291bnQs Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihJTUZBc3NldExvY2F0b3IpKTsK PiArICAgIGlmICghdG1wKSB7Cj4gKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwg IkNhbm5vdCBhbGxvY2F0ZSBJTUYgYXNzZXQgbG9jYXRvcnNcbiIpOwo+ICsgICAgICAgIHJldHVy biBBVkVSUk9SKEVOT01FTSk7Cj4gKyAgICB9Cj4gKyAgICBhc3NldF9tYXAtPmFzc2V0cyA9IHRt cDsKPiArCj4gKyAgICBhc3NldF9lbGVtZW50ID0geG1sRmlyc3RFbGVtZW50Q2hpbGQobm9kZSk7 Cj4gKyAgICB3aGlsZSAoYXNzZXRfZWxlbWVudCkgewo+ICsgICAgICAgIGlmIChhdl9zdHJjYXNl Y21wKGFzc2V0X2VsZW1lbnQtPm5hbWUsICJBc3NldCIpICE9IDApCj4gKyAgICAgICAgICAgIGNv bnRpbnVlOwo+ICsKPiArICAgICAgICBhc3NldCA9ICYoYXNzZXRfbWFwLT5hc3NldHNbYXNzZXRf bWFwLT5hc3NldF9jb3VudF0pOwo+ICsKPiArICAgICAgICBpZiAoZmZfaW1mX3htbF9yZWFkX3V1 aWQoZmZfaW1mX3htbF9nZXRfY2hpbGRfZWxlbWVudF9ieV9uYW1lKGFzc2V0X2VsZW1lbnQsICJJ ZCIpLCBhc3NldC0+dXVpZCkpIHsKPiArICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJP UiwgIkNvdWxkIG5vdCBwYXJzZSBVVUlEIGZyb20gYXNzZXQgaW4gYXNzZXQgbWFwLlxuIik7Cj4g KyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwo+ICsgICAgICAgIH0KPiAr Cj4gKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIkZvdW5kIGFzc2V0IGlkOiAiIEZG X0lNRl9VVUlEX0ZPUk1BVCAiXG4iLCBVSURfQVJHKGFzc2V0LT51dWlkKSk7Cj4gKwo+ICsgICAg ICAgIGlmICghKG5vZGUgPSBmZl9pbWZfeG1sX2dldF9jaGlsZF9lbGVtZW50X2J5X25hbWUoYXNz ZXRfZWxlbWVudCwgIkNodW5rTGlzdCIpKSkgewo+ICsgICAgICAgICAgICBhdl9sb2cocywgQVZf TE9HX0VSUk9SLCAiVW5hYmxlIHRvIHBhcnNlIGFzc2V0IG1hcCBYTUwgLSBtaXNzaW5nIENodW5r TGlzdCBub2RlXG4iKTsKPiArICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7 Cj4gKyAgICAgICAgfQo+ICsKPiArICAgICAgICBpZiAoIShub2RlID0gZmZfaW1mX3htbF9nZXRf Y2hpbGRfZWxlbWVudF9ieV9uYW1lKG5vZGUsICJDaHVuayIpKSkgewo+ICsgICAgICAgICAgICBh dl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHBhcnNlIGFzc2V0IG1hcCBYTUwgLSBt aXNzaW5nIENodW5rIG5vZGVcbiIpOwo+ICsgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZB TElEREFUQTsKPiArICAgICAgICB9Cj4gKwo+ICsgICAgICAgIHVyaSA9IHhtbE5vZGVHZXRDb250 ZW50KGZmX2ltZl94bWxfZ2V0X2NoaWxkX2VsZW1lbnRfYnlfbmFtZShub2RlLCAiUGF0aCIpKTsK PiArICAgICAgICBpZiAoIWltZl91cmlfaXNfdXJsKHVyaSkgJiYgIWltZl91cmlfaXNfdW5peF9h YnNfcGF0aCh1cmkpICYmICFpbWZfdXJpX2lzX2Rvc19hYnNfcGF0aCh1cmkpKQo+ICsgICAgICAg ICAgICBhc3NldC0+YWJzb2x1dGVfdXJpID0gYXZfYXBwZW5kX3BhdGhfY29tcG9uZW50KGJhc2Vf dXJsLCB1cmkpOwo+ICsgICAgICAgIGVsc2UKPiArICAgICAgICAgICAgYXNzZXQtPmFic29sdXRl X3VyaSA9IGF2X3N0cmR1cCh1cmkpOwo+ICsgICAgICAgIHhtbEZyZWUodXJpKTsKPiArICAgICAg ICBpZiAoIWFzc2V0LT5hYnNvbHV0ZV91cmkpCj4gKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9S KEVOT01FTSk7Cj4gKwo+ICsgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJGb3VuZCBh c3NldCBhYnNvbHV0ZSBVUkk6ICVzXG4iLCBhc3NldC0+YWJzb2x1dGVfdXJpKTsKPiArCj4gKyAg ICAgICAgYXNzZXRfbWFwLT5hc3NldF9jb3VudCsrOwo+ICsgICAgICAgIGFzc2V0X2VsZW1lbnQg PSB4bWxOZXh0RWxlbWVudFNpYmxpbmcoYXNzZXRfZWxlbWVudCk7Cj4gKyAgICB9Cj4gKwo+ICsg ICAgcmV0dXJuIHJldDsKPiArfQo+ICsKPiArLyoqCj4gKyAqIEluaXRpYWxpemVzIGFuIElNRkFz c2V0TG9jYXRvck1hcCBzdHJ1Y3R1cmUuCj4gKyAqLwo+ICtzdGF0aWMgdm9pZCBpbWZfYXNzZXRf bG9jYXRvcl9tYXBfaW5pdChJTUZBc3NldExvY2F0b3JNYXAgKmFzc2V0X21hcCkKPiArewo+ICsg ICAgYXNzZXRfbWFwLT5hc3NldHMgPSBOVUxMOwo+ICsgICAgYXNzZXRfbWFwLT5hc3NldF9jb3Vu dCA9IDA7Cj4gK30KPiArCj4gKy8qKgo+ICsgKiBGcmVlIGEgSU1GQXNzZXRMb2NhdG9yTWFwIHBv aW50ZXIuCj4gKyAqLwo+ICtzdGF0aWMgdm9pZCBpbWZfYXNzZXRfbG9jYXRvcl9tYXBfZGVpbml0 KElNRkFzc2V0TG9jYXRvck1hcCAqYXNzZXRfbWFwKQo+ICt7Cj4gKyAgICBmb3IgKHVpbnQzMl90 IGkgPSAwOyBpIDwgYXNzZXRfbWFwLT5hc3NldF9jb3VudDsgKytpKQo+ICsgICAgICAgIGF2X2Zy ZWVwKCZhc3NldF9tYXAtPmFzc2V0c1tpXS5hYnNvbHV0ZV91cmkpOwo+ICsKPiArICAgIGF2X2Zy ZWVwKCZhc3NldF9tYXAtPmFzc2V0cyk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgcGFyc2VfYXNz ZXRtYXAoQVZGb3JtYXRDb250ZXh0ICpzLCBjb25zdCBjaGFyICp1cmwpCj4gK3sKPiArICAgIElN RkNvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7Cj4gKyAgICBBVklPQ29udGV4dCAqaW4gPSBOVUxM Owo+ICsgICAgc3RydWN0IEFWQlByaW50IGJ1ZjsKPiArICAgIEFWRGljdGlvbmFyeSAqb3B0cyA9 IE5VTEw7Cj4gKyAgICB4bWxEb2MgKmRvYyA9IE5VTEw7Cj4gKyAgICBjb25zdCBjaGFyICpiYXNl X3VybDsKPiArICAgIGNoYXIgKnRtcF9zdHIgPSBOVUxMOwo+ICsgICAgaW50IHJldDsKPiArICAg IGludDY0X3QgZmlsZXNpemU7Cj4gKwo+ICsgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIkFz c2V0IE1hcCBVUkw6ICVzXG4iLCB1cmwpOwo+ICsKPiArICAgIGF2X2RpY3RfY29weSgmb3B0cywg Yy0+YXZpb19vcHRzLCAwKTsKPiArICAgIHJldCA9IHMtPmlvX29wZW4ocywgJmluLCB1cmwsIEFW SU9fRkxBR19SRUFELCAmb3B0cyk7Cj4gKyAgICBhdl9kaWN0X2ZyZWUoJm9wdHMpOwo+ICsgICAg aWYgKHJldCA8IDApCj4gKyAgICAgICAgcmV0dXJuIHJldDsKPiArCj4gKyAgICBmaWxlc2l6ZSA9 IGF2aW9fc2l6ZShpbik7Cj4gKyAgICBmaWxlc2l6ZSA9IGZpbGVzaXplID4gMCA/IGZpbGVzaXpl IDogREVGQVVMVF9BU1NFVE1BUF9TSVpFOwo+ICsKPiArICAgIGF2X2JwcmludF9pbml0KCZidWYs IGZpbGVzaXplICsgMSwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKPiArCj4gKyAgICByZXQg PSBhdmlvX3JlYWRfdG9fYnByaW50KGluLCAmYnVmLCBNQVhfQlBSSU5UX1JFQURfU0laRSk7Cj4g KyAgICBpZiAocmV0IDwgMCB8fCAhYXZpb19mZW9mKGluKSB8fCBidWYubGVuID09IDApIHsKPiAr ICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHJlYWQgdG8gYXNzZXQg bWFwICclcydcbiIsIHVybCk7Cj4gKyAgICAgICAgaWYgKHJldCA9PSAwKQo+ICsgICAgICAgICAg ICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOwo+ICsgICAgICAgIGdvdG8gY2xlYW5fdXA7Cj4g KyAgICB9Cj4gKwo+ICsgICAgTElCWE1MX1RFU1RfVkVSU0lPTgo+ICsKPiArICAgIHRtcF9zdHIg PSBhdl9zdHJkdXAodXJsKTsKPiArICAgIGlmICghdG1wX3N0cikgewo+ICsgICAgICAgIHJldCA9 IEFWRVJST1IoRU5PTUVNKTsKPiArICAgICAgICBnb3RvIGNsZWFuX3VwOwo+ICsgICAgfQo+ICsg ICAgYmFzZV91cmwgPSBhdl9kaXJuYW1lKHRtcF9zdHIpOwo+ICsKPiArICAgIGZpbGVzaXplID0g YnVmLmxlbjsKPiArICAgIGRvYyA9IHhtbFJlYWRNZW1vcnkoYnVmLnN0ciwgZmlsZXNpemUsIHVy bCwgTlVMTCwgMCk7Cj4gKwo+ICsgICAgcmV0ID0gcGFyc2VfaW1mX2Fzc2V0X21hcF9mcm9tX3ht bF9kb20ocywgZG9jLCAmYy0+YXNzZXRfbG9jYXRvcl9tYXAsIGJhc2VfdXJsKTsKPiArICAgIGlm ICghcmV0KQo+ICsgICAgICAgIGF2X2xvZyhzLAo+ICsgICAgICAgICAgICAgICBBVl9MT0dfREVC VUcsCj4gKyAgICAgICAgICAgICAgICJGb3VuZCAlZCBhc3NldHMgZnJvbSAlc1xuIiwKPiArICAg ICAgICAgICAgICAgYy0+YXNzZXRfbG9jYXRvcl9tYXAuYXNzZXRfY291bnQsCj4gKyAgICAgICAg ICAgICAgIHVybCk7Cj4gKwo+ICsgICAgeG1sRnJlZURvYyhkb2MpOwo+ICsKPiArY2xlYW5fdXA6 Cj4gKyAgICBpZiAodG1wX3N0cikKPiArICAgICAgICBhdl9mcmVlcCgmdG1wX3N0cik7Cj4gKyAg ICBmZl9mb3JtYXRfaW9fY2xvc2UocywgJmluKTsKPiArICAgIGF2X2JwcmludF9maW5hbGl6ZSgm YnVmLCBOVUxMKTsKPiArICAgIHJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBJTUZBc3Nl dExvY2F0b3IgKmZpbmRfYXNzZXRfbWFwX2xvY2F0b3IoSU1GQXNzZXRMb2NhdG9yTWFwICphc3Nl dF9tYXAsIEZGSU1GVVVJRCB1dWlkKQo+ICt7Cj4gKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBp IDwgYXNzZXRfbWFwLT5hc3NldF9jb3VudDsgKytpKSB7Cj4gKyAgICAgICAgaWYgKG1lbWNtcChh c3NldF9tYXAtPmFzc2V0c1tpXS51dWlkLCB1dWlkLCAxNikgPT0gMCkKPiArICAgICAgICAgICAg cmV0dXJuICYoYXNzZXRfbWFwLT5hc3NldHNbaV0pOwo+ICsgICAgfQo+ICsgICAgcmV0dXJuIE5V TEw7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgb3Blbl90cmFja19yZXNvdXJjZV9jb250ZXh0KEFW Rm9ybWF0Q29udGV4dCAqcywKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgSU1GVmlydHVhbFRyYWNrUmVzb3VyY2VQbGF5YmFja0N0eCAqdHJhY2tfcmVzb3VyY2UpCj4g K3sKPiArICAgIElNRkNvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7Cj4gKyAgICBpbnQgcmV0ID0g MDsKPiArICAgIGludDY0X3QgZW50cnlfcG9pbnQ7Cj4gKyAgICBBVkRpY3Rpb25hcnkgKm9wdHMg PSBOVUxMOwo+ICsKPiArICAgIGlmICh0cmFja19yZXNvdXJjZS0+Y3R4KSB7Cj4gKyAgICAgICAg YXZfbG9nKHMsCj4gKyAgICAgICAgICAgICAgIEFWX0xPR19ERUJVRywKPiArICAgICAgICAgICAg ICAgIklucHV0IGNvbnRleHQgYWxyZWFkeSBvcGVuZWQgZm9yICVzLlxuIiwKPiArICAgICAgICAg ICAgICAgdHJhY2tfcmVzb3VyY2UtPmxvY2F0b3ItPmFic29sdXRlX3VyaSk7Cj4gKyAgICAgICAg cmV0dXJuIDA7Cj4gKyAgICB9Cj4gKwo+ICsgICAgdHJhY2tfcmVzb3VyY2UtPmN0eCA9IGF2Zm9y bWF0X2FsbG9jX2NvbnRleHQoKTsKPiArICAgIGlmICghdHJhY2tfcmVzb3VyY2UtPmN0eCkKPiAr ICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwo+ICsKPiArICAgIHRyYWNrX3Jlc291cmNl LT5jdHgtPmlvX29wZW4gPSBzLT5pb19vcGVuOwo+ICsgICAgdHJhY2tfcmVzb3VyY2UtPmN0eC0+ aW9fY2xvc2UgPSBzLT5pb19jbG9zZTsKPiArICAgIHRyYWNrX3Jlc291cmNlLT5jdHgtPmlvX2Ns b3NlMiA9IHMtPmlvX2Nsb3NlMjsKPiArICAgIHRyYWNrX3Jlc291cmNlLT5jdHgtPmZsYWdzIHw9 IHMtPmZsYWdzICYgfkFWRk1UX0ZMQUdfQ1VTVE9NX0lPOwo+ICsKPiArICAgIGlmICgocmV0ID0g ZmZfY29weV93aGl0ZWJsYWNrbGlzdHModHJhY2tfcmVzb3VyY2UtPmN0eCwgcykpIDwgMCkKPiAr ICAgICAgICBnb3RvIGNsZWFudXA7Cj4gKwo+ICsgICAgaWYgKHJldCA9IGF2X29wdF9zZXQodHJh Y2tfcmVzb3VyY2UtPmN0eCwgImZvcm1hdF93aGl0ZWxpc3QiLCAibXhmIiwgMCkpCgooKQoKSSBz dG9wcGVkIGhlcmUsIHRoZXJlJ3MgcHJvYmFibHkgbW9yZS4KCgoKX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZmZtcGVnLWRldmVsIG1haWxpbmcgbGlzdApm Zm1wZWctZGV2ZWxAZmZtcGVnLm9yZwpodHRwczovL2ZmbXBlZy5vcmcvbWFpbG1hbi9saXN0aW5m by9mZm1wZWctZGV2ZWwKClRvIHVuc3Vic2NyaWJlLCB2aXNpdCBsaW5rIGFib3ZlLCBvciBlbWFp bApmZm1wZWctZGV2ZWwtcmVxdWVzdEBmZm1wZWcub3JnIHdpdGggc3ViamVjdCAidW5zdWJzY3Jp YmUiLgo=